Skip to content

Commit 5ef90bd

Browse files
peers table: refactor filters
1 parent 61e11d3 commit 5ef90bd

File tree

1 file changed

+73
-83
lines changed

1 file changed

+73
-83
lines changed

src/modules/peers/PeersTable.tsx

Lines changed: 73 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,11 @@ import GetStartedTest from "@components/ui/GetStartedTest";
1212
import { NotificationCountBadge } from "@components/ui/NotificationCountBadge";
1313
import {
1414
ColumnDef,
15+
ColumnFiltersState,
1516
RowSelectionState,
1617
SortingState,
18+
Table,
19+
VisibilityState,
1720
} from "@tanstack/react-table";
1821
import { uniqBy } from "lodash";
1922
import { ExternalLinkIcon } from "lucide-react";
@@ -65,6 +68,7 @@ const PeersTableColumns: ColumnDef<Peer>[] = [
6568
{
6669
id: "name",
6770
accessorFn: (peer) => `${peer?.name}${peer?.dns_label}`,
71+
enableHiding: false,
6872
header: ({ column }) => {
6973
return <DataTableHeader column={column}>Name</DataTableHeader>;
7074
},
@@ -83,6 +87,7 @@ const PeersTableColumns: ColumnDef<Peer>[] = [
8387
accessorFn: (peer) => peer.connected,
8488
},
8589
{
90+
id: "ip",
8691
accessorKey: "ip",
8792
sortingFn: "text",
8893
},
@@ -96,18 +101,21 @@ const PeersTableColumns: ColumnDef<Peer>[] = [
96101
},
97102
{
98103
id: "dns_label",
104+
enableHiding: false,
99105
accessorKey: "dns_label",
100106
header: ({ column }) => {
101107
return <DataTableHeader column={column}>Address</DataTableHeader>;
102108
},
103109
cell: ({ row }) => <PeerAddressCell peer={row.original} />,
104110
},
105111
{
112+
id: "group_name_strings",
106113
accessorKey: "group_name_strings",
107114
accessorFn: (peer) => peer.groups?.map((g) => g?.name || "").join(", "),
108115
sortingFn: "text",
109116
},
110117
{
118+
id: "group_names",
111119
accessorKey: "group_names",
112120
accessorFn: (peer) => peer.groups?.map((g) => g?.name || ""),
113121
sortingFn: "text",
@@ -126,6 +134,7 @@ const PeersTableColumns: ColumnDef<Peer>[] = [
126134
),
127135
},
128136
{
137+
id: "last_seen",
129138
accessorKey: "last_seen",
130139
header: ({ column }) => {
131140
return <DataTableHeader column={column}>Last seen</DataTableHeader>;
@@ -150,6 +159,7 @@ const PeersTableColumns: ColumnDef<Peer>[] = [
150159
sortingFn: "text",
151160
},
152161
{
162+
id: "version",
153163
accessorKey: "version",
154164
header: ({ column }) => {
155165
return <DataTableHeader column={column}>Version</DataTableHeader>;
@@ -176,6 +186,7 @@ const PeersTableColumns: ColumnDef<Peer>[] = [
176186
},
177187
{
178188
id: "actions",
189+
enableHiding: false,
179190
accessorKey: "id",
180191
header: "",
181192
cell: ({ row }) => (
@@ -234,6 +245,52 @@ export default function PeersTable({ peers, isLoading, headingTarget }: Props) {
234245
}
235246
};
236247

248+
const filteredColunms = [
249+
"connected",
250+
"approval_required",
251+
"group_name_strings",
252+
"group_names",
253+
];
254+
255+
/**
256+
* This function overrides the given column filters and reuses the previous filters
257+
*
258+
* Table index and selection is also cleared
259+
*/
260+
const overrideTableFilter = (table: Table<Peer>, change: ColumnFiltersState) => {
261+
let filters = [] as ColumnFiltersState;
262+
263+
filteredColunms.forEach((columnId) => {
264+
let columnFilter = change.find((entry) => entry.id == columnId);
265+
if (columnFilter === undefined) {
266+
columnFilter = {
267+
id: columnId,
268+
value: table.getColumn(columnId)?.getFilterValue()
269+
}
270+
}
271+
filters.push(columnFilter);
272+
})
273+
table.setPageIndex(0);
274+
table.setColumnFilters( filters);
275+
resetSelectedRows();
276+
};
277+
278+
const columnVisibility: VisibilityState = {
279+
select: !isUser,
280+
actions: !isUser,
281+
groups: !isUser,
282+
connected: false,
283+
approval_required: false,
284+
285+
// hidden, but usefull for lookup
286+
serial: false,
287+
group_name_strings: false,
288+
group_names: false,
289+
ip: false,
290+
user_name: false,
291+
user_email: false,
292+
};
293+
237294
return (
238295
<>
239296
<PeerMultiSelect
@@ -251,19 +308,7 @@ export default function PeersTable({ peers, isLoading, headingTarget }: Props) {
251308
columns={PeersTableColumns}
252309
data={peers}
253310
searchPlaceholder={"Search by name, IP, Serial, owner or group..."}
254-
columnVisibility={{
255-
select: !isUser,
256-
connected: false,
257-
approval_required: false,
258-
group_name_strings: false,
259-
group_names: false,
260-
ip: false,
261-
serial: false,
262-
user_name: false,
263-
user_email: false,
264-
actions: !isUser,
265-
groups: !isUser,
266-
}}
311+
columnVisibility={columnVisibility}
267312
isLoading={isLoading}
268313
getStartedCard={
269314
<GetStartedTest
@@ -302,29 +347,12 @@ export default function PeersTable({ peers, isLoading, headingTarget }: Props) {
302347
<ButtonGroup.Button
303348
disabled={peers?.length == 0}
304349
onClick={() => {
305-
table.setPageIndex(0);
306-
let groupFilters = table
307-
.getColumn("group_names")
308-
?.getFilterValue();
309-
table.setColumnFilters([
350+
overrideTableFilter( table, [
310351
{
311352
id: "connected",
312353
value: undefined,
313354
},
314-
{
315-
id: "approval_required",
316-
value: undefined,
317-
},
318-
{
319-
id: "group_names",
320-
value: groupFilters ?? [],
321-
},
322-
{
323-
id: "group_names",
324-
value: groupFilters ?? [],
325-
},
326355
]);
327-
resetSelectedRows();
328356
}}
329357
variant={
330358
table.getColumn("connected")?.getFilterValue() == undefined
@@ -336,29 +364,12 @@ export default function PeersTable({ peers, isLoading, headingTarget }: Props) {
336364
</ButtonGroup.Button>
337365
<ButtonGroup.Button
338366
onClick={() => {
339-
table.setPageIndex(0);
340-
let groupFilters = table
341-
.getColumn("group_names")
342-
?.getFilterValue();
343-
table.setColumnFilters([
367+
overrideTableFilter( table, [
344368
{
345369
id: "connected",
346370
value: true,
347371
},
348-
{
349-
id: "approval_required",
350-
value: undefined,
351-
},
352-
{
353-
id: "group_names",
354-
value: groupFilters ?? [],
355-
},
356-
{
357-
id: "group_names",
358-
value: groupFilters ?? [],
359-
},
360372
]);
361-
resetSelectedRows();
362373
}}
363374
disabled={peers?.length == 0}
364375
variant={
@@ -371,25 +382,12 @@ export default function PeersTable({ peers, isLoading, headingTarget }: Props) {
371382
</ButtonGroup.Button>
372383
<ButtonGroup.Button
373384
onClick={() => {
374-
table.setPageIndex(0);
375-
let groupFilters = table
376-
.getColumn("group_names")
377-
?.getFilterValue();
378-
table.setColumnFilters([
385+
overrideTableFilter( table, [
379386
{
380387
id: "connected",
381388
value: false,
382389
},
383-
{
384-
id: "approval_required",
385-
value: undefined,
386-
},
387-
{
388-
id: "group_names",
389-
value: groupFilters ?? [],
390-
},
391390
]);
392-
resetSelectedRows();
393391
}}
394392
disabled={peers?.length == 0}
395393
variant={
@@ -406,29 +404,21 @@ export default function PeersTable({ peers, isLoading, headingTarget }: Props) {
406404
<Button
407405
disabled={peers?.length == 0}
408406
onClick={() => {
409-
table.setPageIndex(0);
410407
let current =
411408
table.getColumn("approval_required")?.getFilterValue() ===
412-
undefined
409+
undefined
413410
? true
414411
: undefined;
415-
416-
table.setColumnFilters([
417-
{
418-
id: "connected",
419-
value: undefined,
420-
},
412+
overrideTableFilter( table, [
421413
{
422414
id: "approval_required",
423415
value: current,
424416
},
425417
]);
426-
427-
resetSelectedRows();
428418
}}
429419
variant={
430420
table.getColumn("approval_required")?.getFilterValue() ===
431-
true
421+
true
432422
? "tertiary"
433423
: "secondary"
434424
}
@@ -448,15 +438,15 @@ export default function PeersTable({ peers, isLoading, headingTarget }: Props) {
448438
.getColumn("group_names")
449439
?.getFilterValue() as string[]) || []
450440
}
451-
onChange={(groups) => {
452-
table.setPageIndex(0);
453-
if (groups.length == 0) {
454-
table.getColumn("group_names")?.setFilterValue(undefined);
455-
return;
456-
} else {
457-
table.getColumn("group_names")?.setFilterValue(groups);
458-
}
459-
resetSelectedRows();
441+
onChange={(anyOfValues) => {
442+
const normalizedAnyOf = ( anyOfValues.length == 0 ) ? undefined : anyOfValues;
443+
overrideTableFilter( table, [
444+
{
445+
id: "group_names",
446+
value: normalizedAnyOf
447+
},
448+
]
449+
);
460450
}}
461451
groups={tableGroups}
462452
/>

0 commit comments

Comments
 (0)