From 5ef90bdd33254594c0bf4895c47ec5442eae2419 Mon Sep 17 00:00:00 2001 From: Edouard Vanbelle Date: Wed, 29 Jan 2025 22:46:13 +0100 Subject: [PATCH 1/2] peers table: refactor filters --- src/modules/peers/PeersTable.tsx | 156 +++++++++++++++---------------- 1 file changed, 73 insertions(+), 83 deletions(-) diff --git a/src/modules/peers/PeersTable.tsx b/src/modules/peers/PeersTable.tsx index 06b78cfc..b91f7c97 100644 --- a/src/modules/peers/PeersTable.tsx +++ b/src/modules/peers/PeersTable.tsx @@ -12,8 +12,11 @@ import GetStartedTest from "@components/ui/GetStartedTest"; import { NotificationCountBadge } from "@components/ui/NotificationCountBadge"; import { ColumnDef, + ColumnFiltersState, RowSelectionState, SortingState, + Table, + VisibilityState, } from "@tanstack/react-table"; import { uniqBy } from "lodash"; import { ExternalLinkIcon } from "lucide-react"; @@ -65,6 +68,7 @@ const PeersTableColumns: ColumnDef[] = [ { id: "name", accessorFn: (peer) => `${peer?.name}${peer?.dns_label}`, + enableHiding: false, header: ({ column }) => { return Name; }, @@ -83,6 +87,7 @@ const PeersTableColumns: ColumnDef[] = [ accessorFn: (peer) => peer.connected, }, { + id: "ip", accessorKey: "ip", sortingFn: "text", }, @@ -96,6 +101,7 @@ const PeersTableColumns: ColumnDef[] = [ }, { id: "dns_label", + enableHiding: false, accessorKey: "dns_label", header: ({ column }) => { return Address; @@ -103,11 +109,13 @@ const PeersTableColumns: ColumnDef[] = [ cell: ({ row }) => , }, { + id: "group_name_strings", accessorKey: "group_name_strings", accessorFn: (peer) => peer.groups?.map((g) => g?.name || "").join(", "), sortingFn: "text", }, { + id: "group_names", accessorKey: "group_names", accessorFn: (peer) => peer.groups?.map((g) => g?.name || ""), sortingFn: "text", @@ -126,6 +134,7 @@ const PeersTableColumns: ColumnDef[] = [ ), }, { + id: "last_seen", accessorKey: "last_seen", header: ({ column }) => { return Last seen; @@ -150,6 +159,7 @@ const PeersTableColumns: ColumnDef[] = [ sortingFn: "text", }, { + id: "version", accessorKey: "version", header: ({ column }) => { return Version; @@ -176,6 +186,7 @@ const PeersTableColumns: ColumnDef[] = [ }, { id: "actions", + enableHiding: false, accessorKey: "id", header: "", cell: ({ row }) => ( @@ -234,6 +245,52 @@ export default function PeersTable({ peers, isLoading, headingTarget }: Props) { } }; + const filteredColunms = [ + "connected", + "approval_required", + "group_name_strings", + "group_names", + ]; + + /** + * This function overrides the given column filters and reuses the previous filters + * + * Table index and selection is also cleared + */ + const overrideTableFilter = (table: Table, change: ColumnFiltersState) => { + let filters = [] as ColumnFiltersState; + + filteredColunms.forEach((columnId) => { + let columnFilter = change.find((entry) => entry.id == columnId); + if (columnFilter === undefined) { + columnFilter = { + id: columnId, + value: table.getColumn(columnId)?.getFilterValue() + } + } + filters.push(columnFilter); + }) + table.setPageIndex(0); + table.setColumnFilters( filters); + resetSelectedRows(); + }; + + const columnVisibility: VisibilityState = { + select: !isUser, + actions: !isUser, + groups: !isUser, + connected: false, + approval_required: false, + + // hidden, but usefull for lookup + serial: false, + group_name_strings: false, + group_names: false, + ip: false, + user_name: false, + user_email: false, + }; + return ( <> { - table.setPageIndex(0); - let groupFilters = table - .getColumn("group_names") - ?.getFilterValue(); - table.setColumnFilters([ + overrideTableFilter( table, [ { id: "connected", value: undefined, }, - { - id: "approval_required", - value: undefined, - }, - { - id: "group_names", - value: groupFilters ?? [], - }, - { - id: "group_names", - value: groupFilters ?? [], - }, ]); - resetSelectedRows(); }} variant={ table.getColumn("connected")?.getFilterValue() == undefined @@ -336,29 +364,12 @@ export default function PeersTable({ peers, isLoading, headingTarget }: Props) { { - table.setPageIndex(0); - let groupFilters = table - .getColumn("group_names") - ?.getFilterValue(); - table.setColumnFilters([ + overrideTableFilter( table, [ { id: "connected", value: true, }, - { - id: "approval_required", - value: undefined, - }, - { - id: "group_names", - value: groupFilters ?? [], - }, - { - id: "group_names", - value: groupFilters ?? [], - }, ]); - resetSelectedRows(); }} disabled={peers?.length == 0} variant={ @@ -371,25 +382,12 @@ export default function PeersTable({ peers, isLoading, headingTarget }: Props) { { - table.setPageIndex(0); - let groupFilters = table - .getColumn("group_names") - ?.getFilterValue(); - table.setColumnFilters([ + overrideTableFilter( table, [ { id: "connected", value: false, }, - { - id: "approval_required", - value: undefined, - }, - { - id: "group_names", - value: groupFilters ?? [], - }, ]); - resetSelectedRows(); }} disabled={peers?.length == 0} variant={ @@ -406,29 +404,21 @@ export default function PeersTable({ peers, isLoading, headingTarget }: Props) { )} - - - {!isUser && ( + { + !isUser + && tableGroups.length > 1 // if length == 1, it means only "All" group exists, case not relevant + && ( { + exclusiveValue={ + (table + .getColumn("group_name_strings") + ?.getFilterValue() as string) || undefined + } + onChange={(anyOfValues, exclusiveValue) => { const normalizedAnyOf = ( anyOfValues.length == 0 ) ? undefined : anyOfValues; overrideTableFilter( table, [ { id: "group_names", value: normalizedAnyOf }, + { + id: "group_name_strings", + value: exclusiveValue + } ] ); }} groups={tableGroups} + unassignedCount={unassignedCount} + defaultGroupName={DEFAULT_GROUP_NAME} /> )} + + {