Skip to content

Commit a2ace67

Browse files
authored
feat(TableColumnSetup): support sortable columns (#2908)
1 parent ffb9777 commit a2ace67

File tree

15 files changed

+121
-149
lines changed

15 files changed

+121
-149
lines changed

src/components/PaginatedTable/TableChunk.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ export const TableChunk = typedMemo(function TableChunk<T, F>({
6666
const [autoRefreshInterval] = useAutoRefreshInterval();
6767
const {noBatching} = usePaginatedTableState();
6868

69-
const columnsIds = columns.map((column) => column.name);
69+
//sort ids to prevent refetch if only order was changed
70+
const columnsIds = columns.map((column) => column.name).toSorted();
7071

7172
const queryParams = {
7273
offset: id * chunkSize,

src/containers/Clusters/Clusters.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ export function Clusters() {
211211
items={columnsToSelect}
212212
showStatus
213213
onUpdate={setColumns}
214-
sortable={false}
215214
/>
216215
</Flex>
217216
{clusters?.length ? (

src/containers/Nodes/PaginatedNodes/GroupedNodesComponent.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,6 @@ export function GroupedNodesComponent({
213213
items={columnsToSelect}
214214
showStatus
215215
onUpdate={setColumns}
216-
sortable={false}
217216
/>
218217
}
219218
error={error ? <ResponseError error={error} /> : null}

src/containers/Nodes/PaginatedNodes/NodesComponent.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ export function NodesComponent({
7070
items={columnsToSelect}
7171
showStatus
7272
onUpdate={setColumns}
73-
sortable={false}
7473
/>
7574
}
7675
table={

src/containers/Storage/PaginatedStorageGroups/GroupedStorageGroupsComponent.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,6 @@ export function GroupedStorageGroupsComponent({
183183
items={columnsToSelect}
184184
showStatus
185185
onUpdate={setColumns}
186-
sortable={false}
187186
/>
188187
}
189188
error={error ? <ResponseError error={error} /> : null}

src/containers/Storage/PaginatedStorageGroups/StorageGroupsComponent.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ export function StorageGroupsComponent({
4141
items={columnsToSelect}
4242
showStatus
4343
onUpdate={setColumns}
44-
sortable={false}
4544
/>
4645
}
4746
table={

src/containers/Storage/PaginatedStorageNodes/GroupedStorageNodesComponent.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,6 @@ export function GroupedStorageNodesComponent({
184184
items={columnsToSelect}
185185
showStatus
186186
onUpdate={setColumns}
187-
sortable={false}
188187
/>
189188
}
190189
error={error ? <ResponseError error={error} /> : null}

src/containers/Storage/PaginatedStorageNodes/StorageNodesComponent.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ export function StorageNodesComponent({
4545
items={columnsToSelect}
4646
showStatus
4747
onUpdate={setColumns}
48-
sortable={false}
4948
/>
5049
}
5150
table={

src/containers/Tenant/Diagnostics/Partitions/Partitions.tsx

Lines changed: 7 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,17 @@ import {skipToken} from '@reduxjs/toolkit/query';
44

55
import {ResponseError} from '../../../../components/Errors/ResponseError';
66
import {ResizeableDataTable} from '../../../../components/ResizeableDataTable/ResizeableDataTable';
7+
import {TableColumnSetup} from '../../../../components/TableColumnSetup/TableColumnSetup';
78
import {TableSkeleton} from '../../../../components/TableSkeleton/TableSkeleton';
89
import {TableWithControlsLayout} from '../../../../components/TableWithControlsLayout/TableWithControlsLayout';
910
import {nodesListApi, selectNodesMap} from '../../../../store/reducers/nodesList';
1011
import {partitionsApi, setSelectedConsumer} from '../../../../store/reducers/partitions/partitions';
1112
import {selectConsumersNames, topicApi} from '../../../../store/reducers/topic';
1213
import {cn} from '../../../../utils/cn';
13-
import {DEFAULT_TABLE_SETTINGS, PARTITIONS_HIDDEN_COLUMNS_KEY} from '../../../../utils/constants';
14-
import {
15-
useAutoRefreshInterval,
16-
useSetting,
17-
useTypedDispatch,
18-
useTypedSelector,
19-
} from '../../../../utils/hooks';
20-
21-
import {
22-
PartitionsControls,
23-
PartitionsTableColumnSetup,
24-
} from './PartitionsControls/PartitionsControls';
14+
import {DEFAULT_TABLE_SETTINGS} from '../../../../utils/constants';
15+
import {useAutoRefreshInterval, useTypedDispatch, useTypedSelector} from '../../../../utils/hooks';
16+
17+
import {PartitionsControls} from './PartitionsControls/PartitionsControls';
2518
import {PARTITIONS_COLUMNS_WIDTH_LS_KEY} from './columns';
2619
import i18n from './i18n';
2720
import {addHostToPartitions} from './utils';
@@ -64,9 +57,7 @@ export const Partitions = ({path, database, databaseFullPath}: PartitionsProps)
6457
const nodesLoading = nodesIsFetching && nodesData === undefined;
6558
const nodeHostsMap = useTypedSelector((state) => selectNodesMap(state, database));
6659

67-
const [hiddenColumns, setHiddenColumns] = useSetting<string[]>(PARTITIONS_HIDDEN_COLUMNS_KEY);
68-
69-
const [columns, columnsIdsForSelector] = useGetPartitionsColumns(selectedConsumer);
60+
const {columnsToShow, columnsToSelect, setColumns} = useGetPartitionsColumns(selectedConsumer);
7061

7162
const params = topicLoading
7263
? skipToken
@@ -95,14 +86,6 @@ export const Partitions = ({path, database, databaseFullPath}: PartitionsProps)
9586
}
9687
}, [dispatch, topicLoading, selectedConsumer, consumers]);
9788

98-
const columnsToShow = React.useMemo(() => {
99-
return columns.filter((column) => !hiddenColumns.includes(column.name));
100-
}, [columns, hiddenColumns]);
101-
102-
const hadleTableColumnsSetupChange = (newHiddenColumns: string[]) => {
103-
setHiddenColumns(newHiddenColumns);
104-
};
105-
10689
const handleSelectedConsumerChange = (value?: string) => {
10790
dispatch(setSelectedConsumer(value));
10891
};
@@ -125,13 +108,7 @@ export const Partitions = ({path, database, databaseFullPath}: PartitionsProps)
125108
};
126109

127110
const renderExtraControls = () => {
128-
return (
129-
<PartitionsTableColumnSetup
130-
hiddenColumns={hiddenColumns}
131-
onHiddenColumnsChange={hadleTableColumnsSetupChange}
132-
initialColumnsIds={columnsIdsForSelector}
133-
/>
134-
);
111+
return <TableColumnSetup items={columnsToSelect} showStatus onUpdate={setColumns} />;
135112
};
136113

137114
const renderContent = () => {

src/containers/Tenant/Diagnostics/Partitions/PartitionsControls/PartitionsControls.tsx

Lines changed: 1 addition & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
import React from 'react';
22

3-
import type {SelectOption, TableColumnSetupItem, TableColumnSetupProps} from '@gravity-ui/uikit';
3+
import type {SelectOption} from '@gravity-ui/uikit';
44
import {Select} from '@gravity-ui/uikit';
55
import escapeRegExp from 'lodash/escapeRegExp';
66

77
import {Search} from '../../../../../components/Search/Search';
8-
import {TableColumnSetup} from '../../../../../components/TableColumnSetup/TableColumnSetup';
9-
import type {ValueOf} from '../../../../../types/common';
108
import {b} from '../Partitions';
119
import i18n from '../i18n';
12-
import {PARTITIONS_COLUMNS_IDS, PARTITIONS_COLUMNS_TITLES} from '../utils/constants';
1310
import type {PreparedPartitionDataWithHosts} from '../utils/types';
1411

1512
interface PartitionsControlsProps {
@@ -132,61 +129,3 @@ export const PartitionsControls = ({
132129
</React.Fragment>
133130
);
134131
};
135-
136-
interface PartitionsTableColumnSetupProps {
137-
hiddenColumns: string[];
138-
onHiddenColumnsChange: (newHiddenColumns: string[]) => void;
139-
initialColumnsIds: string[];
140-
}
141-
142-
export function PartitionsTableColumnSetup({
143-
hiddenColumns,
144-
onHiddenColumnsChange,
145-
initialColumnsIds,
146-
}: PartitionsTableColumnSetupProps) {
147-
const columnsToSelect = React.useMemo(() => {
148-
const columns: TableColumnSetupItem[] = [];
149-
for (const id of initialColumnsIds) {
150-
const isId = id === PARTITIONS_COLUMNS_IDS.PARTITION_ID;
151-
const column: TableColumnSetupItem = {
152-
title: PARTITIONS_COLUMNS_TITLES[id as ValueOf<typeof PARTITIONS_COLUMNS_IDS>],
153-
selected: Boolean(!hiddenColumns.includes(id)),
154-
id: id,
155-
required: isId,
156-
sticky: isId ? 'start' : undefined,
157-
};
158-
if (isId) {
159-
columns.unshift(column);
160-
} else {
161-
columns.push(column);
162-
}
163-
}
164-
return columns;
165-
}, [initialColumnsIds, hiddenColumns]);
166-
const handleTableColumnsSetupChange: TableColumnSetupProps['onUpdate'] = (value) => {
167-
const result = [...hiddenColumns];
168-
169-
// Process current set of columns
170-
// This way we do not remove from hidden these columns, that are not displayed currently
171-
// The reasons: set of columns differs for partitions with and without consumers
172-
value.forEach((el) => {
173-
if (!el.selected && !hiddenColumns.includes(el.id)) {
174-
result.push(el.id);
175-
} else if (el.selected && hiddenColumns.includes(el.id)) {
176-
result.splice(hiddenColumns.indexOf(el.id));
177-
}
178-
});
179-
180-
onHiddenColumnsChange(result);
181-
};
182-
return (
183-
<TableColumnSetup
184-
key="TableColumnSetup"
185-
popupWidth={242}
186-
items={columnsToSelect}
187-
showStatus
188-
onUpdate={handleTableColumnsSetupChange}
189-
sortable={false}
190-
/>
191-
);
192-
}

0 commit comments

Comments
 (0)