Fix: columns positions are saved correctly into local storage

This commit is contained in:
Vladimir Khvan 2023-06-05 20:04:29 +05:00
parent 8246466f7d
commit 5d02801e6c
6 changed files with 103 additions and 44 deletions

View File

@ -3,9 +3,8 @@ import TableHeader from "@docspace/components/table-container/TableHeader";
import { inject, observer } from "mobx-react"; import { inject, observer } from "mobx-react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
const TABLE_VERSION = "6"; const TABLE_VERSION = "5";
const TABLE_COLUMNS = `webhooksHistoryTableColumns_ver-${TABLE_VERSION}`; const TABLE_COLUMNS = `webhooksHistoryColumns_ver-${TABLE_VERSION}`;
const COLUMNS_SIZE = `webhooksHistoryColumnsSize_ver-${TABLE_VERSION}`;
const getColumns = (defaultColumns, userId) => { const getColumns = (defaultColumns, userId) => {
const storageColumns = localStorage.getItem(`${TABLE_COLUMNS}=${userId}`); const storageColumns = localStorage.getItem(`${TABLE_COLUMNS}=${userId}`);
@ -27,7 +26,14 @@ const getColumns = (defaultColumns, userId) => {
}; };
const HistoryTableHeader = (props) => { const HistoryTableHeader = (props) => {
const { userId, sectionWidth, tableRef } = props; const {
userId,
sectionWidth,
tableRef,
columnStorageName,
columnInfoPanelStorageName,
setHideColumns,
} = props;
const { t, ready } = useTranslation(["Webhooks", "People"]); const { t, ready } = useTranslation(["Webhooks", "People"]);
const defaultColumns = [ const defaultColumns = [
@ -59,11 +65,7 @@ const HistoryTableHeader = (props) => {
const [columns, setColumns] = useState(getColumns(defaultColumns, userId)); const [columns, setColumns] = useState(getColumns(defaultColumns, userId));
useEffect(() => { function onColumnChange(key, e) {
ready && setColumns(getColumns(defaultColumns, userId));
}, [ready]);
const onColumnChange = (key, e, userId) => {
const columnIndex = columns.findIndex((c) => c.key === key); const columnIndex = columns.findIndex((c) => c.key === key);
if (columnIndex === -1) return; if (columnIndex === -1) return;
@ -76,19 +78,25 @@ const HistoryTableHeader = (props) => {
const tableColumns = columns.map((c) => c.enable && c.key); const tableColumns = columns.map((c) => c.enable && c.key);
localStorage.setItem(`${TABLE_COLUMNS}=${userId}`, tableColumns); localStorage.setItem(`${TABLE_COLUMNS}=${userId}`, tableColumns);
}; }
useEffect(() => {
ready && setColumns(getColumns(defaultColumns, userId));
}, [ready]);
return ( return (
<TableHeader <TableHeader
columns={columns}
checkboxSize="32px" checkboxSize="32px"
containerRef={tableRef} containerRef={tableRef}
columns={columns}
columnStorageName={columnStorageName}
columnInfoPanelStorageName={columnInfoPanelStorageName}
sectionWidth={sectionWidth} sectionWidth={sectionWidth}
checkboxMargin="12px"
showSettings={false} showSettings={false}
useReactWindow useReactWindow
setHideColumns={() => {}} setHideColumns={setHideColumns}
infoPanelVisible={true} infoPanelVisible={false}
columnStorageName={`${COLUMNS_SIZE}=${userId}`}
/> />
); );
}; };

View File

@ -39,7 +39,7 @@ const StyledWrapper = styled.div`
`; `;
const HistoryTableRow = (props) => { const HistoryTableRow = (props) => {
const { item, toggleEventId, isIdChecked, retryWebhookEvent } = props; const { item, toggleEventId, isIdChecked, retryWebhookEvent, hideColumns } = props;
const { t } = useTranslation(["Webhooks", "Common"]); const { t } = useTranslation(["Webhooks", "Common"]);
const navigate = useNavigate(); const navigate = useNavigate();
@ -86,7 +86,7 @@ const HistoryTableRow = (props) => {
return ( return (
<StyledWrapper className={isChecked ? "selected-table-row" : ""} onClick={onChange}> <StyledWrapper className={isChecked ? "selected-table-row" : ""} onClick={onChange}>
<StyledTableRow contextOptions={contextOptions} checked={isChecked}> <StyledTableRow contextOptions={contextOptions} checked={isChecked} hideColumns={hideColumns}>
<TableCell> <TableCell>
<TableCell checked={isChecked} className="noPadding"> <TableCell checked={isChecked} className="noPadding">
<Checkbox onChange={onChange} isChecked={isChecked} /> <Checkbox onChange={onChange} isChecked={isChecked} />

View File

@ -1,4 +1,4 @@
import React, { useRef, useEffect } from "react"; import React, { useState, useRef, useEffect } from "react";
import styled from "styled-components"; import styled from "styled-components";
@ -18,7 +18,7 @@ import { Base } from "@docspace/components/themes";
const TableWrapper = styled(TableContainer)` const TableWrapper = styled(TableContainer)`
margin-top: 0; margin-top: 0;
.table-container_header{ .table-container_header {
position: absolute; position: absolute;
} }
@ -44,6 +44,10 @@ const TableWrapper = styled(TableContainer)`
TableWrapper.defaultProps = { theme: Base }; TableWrapper.defaultProps = { theme: Base };
const TABLE_VERSION = "5";
const COLUMNS_SIZE = `webhooksHistoryColumnsSize_ver-${TABLE_VERSION}`;
const INFO_PANEL_COLUMNS_SIZE = `infoPanelWebhooksHistoryColumnsSize_ver-${TABLE_VERSION}`;
const HistoryTableView = (props) => { const HistoryTableView = (props) => {
const { const {
sectionWidth, sectionWidth,
@ -55,9 +59,11 @@ const HistoryTableView = (props) => {
fetchMoreItems, fetchMoreItems,
formatFilters, formatFilters,
historyFilters, historyFilters,
userId,
} = props; } = props;
const tableRef = useRef(null); const tableRef = useRef(null);
const [hideColumns, setHideColumns] = useState(false);
const { id } = useParams(); const { id } = useParams();
@ -75,6 +81,9 @@ const HistoryTableView = (props) => {
fetchMoreItems({ ...params, configId: id, count: 10 }); fetchMoreItems({ ...params, configId: id, count: 10 });
}; };
const columnStorageName = `${COLUMNS_SIZE}=${userId}`;
const columnInfoPanelStorageName = `${INFO_PANEL_COLUMNS_SIZE}=${userId}`;
return ( return (
<TableWrapper <TableWrapper
forwardedRef={tableRef} forwardedRef={tableRef}
@ -82,26 +91,41 @@ const HistoryTableView = (props) => {
gridTemplateColumns: "300px 100px 400px 24px", gridTemplateColumns: "300px 100px 400px 24px",
}} }}
useReactWindow> useReactWindow>
<HistoryTableHeader sectionWidth={sectionWidth} tableRef={tableRef} /> <HistoryTableHeader
sectionWidth={sectionWidth}
tableRef={tableRef}
columnStorageName={columnStorageName}
columnInfoPanelStorageName={columnInfoPanelStorageName}
setHideColumns={setHideColumns}
/>
<TableBody <TableBody
itemHeight={49} itemHeight={49}
useReactWindow useReactWindow
infoPanelVisible={false}
columnStorageName={columnStorageName}
columnInfoPanelStorageName={columnInfoPanelStorageName}
filesLength={historyItems.length} filesLength={historyItems.length}
fetchMoreFiles={fetchMoreFiles} fetchMoreFiles={fetchMoreFiles}
hasMoreFiles={hasMoreItems} hasMoreFiles={hasMoreItems}
itemCount={totalItems}> itemCount={totalItems}>
{historyItems.map((item) => ( {historyItems.map((item) => (
<HistoryTableRow key={item.id} item={{ ...item, title: item.id }} /> <HistoryTableRow
key={item.id}
item={{ ...item, title: item.id }}
hideColumns={hideColumns}
/>
))} ))}
</TableBody> </TableBody>
</TableWrapper> </TableWrapper>
); );
}; };
export default inject(({ setup, webhooksStore }) => { export default inject(({ setup, webhooksStore, auth }) => {
const { viewAs, setViewAs } = setup; const { viewAs, setViewAs } = setup;
const { historyItems, fetchMoreItems, hasMoreItems, totalItems, formatFilters, historyFilters } = const { historyItems, fetchMoreItems, hasMoreItems, totalItems, formatFilters, historyFilters } =
webhooksStore; webhooksStore;
const { id: userId } = auth.userStore.user;
return { return {
viewAs, viewAs,
setViewAs, setViewAs,
@ -111,5 +135,6 @@ export default inject(({ setup, webhooksStore }) => {
totalItems, totalItems,
formatFilters, formatFilters,
historyFilters, historyFilters,
userId,
}; };
})(observer(HistoryTableView)); })(observer(HistoryTableView));

View File

@ -1,12 +1,11 @@
import React, { useState, useRef } from "react"; import React, { useState } from "react";
import TableHeader from "@docspace/components/table-container/TableHeader"; import TableHeader from "@docspace/components/table-container/TableHeader";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { inject, observer } from "mobx-react"; import { inject, observer } from "mobx-react";
const TABLE_VERSION = "5"; const TABLE_VERSION = "5";
const TABLE_COLUMNS = `webhooksConfigTableColumns_ver-${TABLE_VERSION}`; const TABLE_COLUMNS = `webhooksConfigColumns_ver-${TABLE_VERSION}`;
const COLUMNS_SIZE = `webhooksConfigColumnsSize_ver-${TABLE_VERSION}`;
const getColumns = (defaultColumns, userId) => { const getColumns = (defaultColumns, userId) => {
const storageColumns = localStorage.getItem(`${TABLE_COLUMNS}=${userId}`); const storageColumns = localStorage.getItem(`${TABLE_COLUMNS}=${userId}`);
@ -28,10 +27,17 @@ const getColumns = (defaultColumns, userId) => {
}; };
const WebhookTableHeader = (props) => { const WebhookTableHeader = (props) => {
const { userId, sectionWidth, tableRef } = props; const {
userId,
sectionWidth,
tableRef,
columnStorageName,
columnInfoPanelStorageName,
setHideColumns,
} = props;
const { t } = useTranslation(["Webhooks", "Common"]); const { t } = useTranslation(["Webhooks", "Common"]);
const defaultColumns = useRef([ const defaultColumns = [
{ {
key: "Name", key: "Name",
title: t("Common:Name"), title: t("Common:Name"),
@ -56,11 +62,11 @@ const WebhookTableHeader = (props) => {
resizable: true, resizable: true,
onChange: onColumnChange, onChange: onColumnChange,
}, },
]); ];
const [columns, setColumns] = useState(getColumns(defaultColumns.current, userId)); const [columns, setColumns] = useState(getColumns(defaultColumns, userId));
const onColumnChange = (key, e) => { function onColumnChange(key, e) {
const columnIndex = columns.findIndex((c) => c.key === key); const columnIndex = columns.findIndex((c) => c.key === key);
if (columnIndex === -1) return; if (columnIndex === -1) return;
@ -73,18 +79,21 @@ const WebhookTableHeader = (props) => {
const tableColumns = columns.map((c) => c.enable && c.key); const tableColumns = columns.map((c) => c.enable && c.key);
localStorage.setItem(`${TABLE_COLUMNS}=${userId}`, tableColumns); localStorage.setItem(`${TABLE_COLUMNS}=${userId}`, tableColumns);
}; }
return ( return (
<TableHeader <TableHeader
columns={columns} checkboxSize="48px"
containerRef={tableRef} containerRef={tableRef}
columns={columns}
columnStorageName={columnStorageName}
columnInfoPanelStorageName={columnInfoPanelStorageName}
sectionWidth={sectionWidth} sectionWidth={sectionWidth}
checkboxMargin="12px"
showSettings={false} showSettings={false}
useReactWindow useReactWindow
setHideColumns={() => {}} setHideColumns={setHideColumns}
infoPanelVisible={true} infoPanelVisible={false}
columnStorageName={`${COLUMNS_SIZE}=${userId}`}
/> />
); );
}; };

View File

@ -43,6 +43,7 @@ const WebhooksTableRow = (props) => {
openSettingsModal, openSettingsModal,
openDeleteModal, openDeleteModal,
setCurrentWebhook, setCurrentWebhook,
hideColumns,
} = props; } = props;
const navigate = useNavigate(); const navigate = useNavigate();
@ -111,7 +112,7 @@ const WebhooksTableRow = (props) => {
return ( return (
<> <>
<StyledWrapper onClick={handleRowClick}> <StyledWrapper onClick={handleRowClick}>
<StyledTableRow contextOptions={contextOptions}> <StyledTableRow contextOptions={contextOptions} hideColumns={hideColumns}>
<TableCell> <TableCell>
<Text as="span" fontWeight={600} className="mr-8 textOverflow"> <Text as="span" fontWeight={600} className="mr-8 textOverflow">
{webhook.name}{" "} {webhook.name}{" "}

View File

@ -1,4 +1,4 @@
import React, { useRef, useEffect } from "react"; import React, { useState, useRef, useEffect } from "react";
import { inject, observer } from "mobx-react"; import { inject, observer } from "mobx-react";
import { isMobile } from "react-device-detect"; import { isMobile } from "react-device-detect";
@ -30,6 +30,10 @@ const TableWrapper = styled(TableContainer)`
TableWrapper.defaultProps = { theme: Base }; TableWrapper.defaultProps = { theme: Base };
const TABLE_VERSION = "5";
const COLUMNS_SIZE = `webhooksConfigColumnsSize_ver-${TABLE_VERSION}`;
const INFO_PANEL_COLUMNS_SIZE = `infoPanelWebhooksConfigColumnsSize_ver-${TABLE_VERSION}`;
const WebhooksTableView = (props) => { const WebhooksTableView = (props) => {
const { const {
webhooks, webhooks,
@ -39,9 +43,11 @@ const WebhooksTableView = (props) => {
setViewAs, setViewAs,
openSettingsModal, openSettingsModal,
openDeleteModal, openDeleteModal,
userId,
} = props; } = props;
const tableRef = useRef(null); const tableRef = useRef(null);
const [hideColumns, setHideColumns] = useState(false);
useEffect(() => { useEffect(() => {
if (!sectionWidth) return; if (!sectionWidth) return;
@ -52,17 +58,24 @@ const WebhooksTableView = (props) => {
} }
}, [sectionWidth]); }, [sectionWidth]);
const columnStorageName = `${COLUMNS_SIZE}=${userId}`;
const columnInfoPanelStorageName = `${INFO_PANEL_COLUMNS_SIZE}=${userId}`;
return ( return (
<TableWrapper <TableWrapper forwardedRef={tableRef} useReactWindow>
forwardedRef={tableRef} <WebhookTableHeader
style={{ sectionWidth={sectionWidth}
gridTemplateColumns: "200px 500px 110px 24px", tableRef={tableRef}
}} columnStorageName={columnStorageName}
useReactWindow> columnInfoPanelStorageName={columnInfoPanelStorageName}
<WebhookTableHeader sectionWidth={sectionWidth} tableRef={tableRef} /> setHideColumns={setHideColumns}
/>
<TableBody <TableBody
itemHeight={49} itemHeight={49}
useReactWindow useReactWindow
infoPanelVisible={false}
columnStorageName={columnStorageName}
columnInfoPanelStorageName={columnInfoPanelStorageName}
filesLength={webhooks.length} filesLength={webhooks.length}
fetchMoreFiles={loadWebhooks} fetchMoreFiles={loadWebhooks}
hasMoreFiles={false} hasMoreFiles={false}
@ -74,6 +87,7 @@ const WebhooksTableView = (props) => {
index={index} index={index}
openSettingsModal={openSettingsModal} openSettingsModal={openSettingsModal}
openDeleteModal={openDeleteModal} openDeleteModal={openDeleteModal}
hideColumns={hideColumns}
/> />
))} ))}
</TableBody> </TableBody>
@ -81,15 +95,17 @@ const WebhooksTableView = (props) => {
); );
}; };
export default inject(({ webhooksStore, setup }) => { export default inject(({ webhooksStore, setup, auth }) => {
const { webhooks, loadWebhooks } = webhooksStore; const { webhooks, loadWebhooks } = webhooksStore;
const { viewAs, setViewAs } = setup; const { viewAs, setViewAs } = setup;
const { id: userId } = auth.userStore.user;
return { return {
webhooks, webhooks,
viewAs, viewAs,
setViewAs, setViewAs,
loadWebhooks, loadWebhooks,
userId,
}; };
})(observer(WebhooksTableView)); })(observer(WebhooksTableView));