From eebd44ab9bbd94bdc9ced97e14812543a2aaee95 Mon Sep 17 00:00:00 2001 From: mbecker20 Date: Sat, 11 May 2024 17:42:38 -0700 Subject: [PATCH] common resource filter --- .../components/resources/alerter/table.tsx | 15 +++------------ .../src/components/resources/build/table.tsx | 15 +++------------ .../components/resources/builder/table.tsx | 15 +++------------ .../components/resources/deployment/table.tsx | 19 +++++-------------- .../components/resources/procedure/table.tsx | 15 +++------------ .../src/components/resources/repo/table.tsx | 15 +++------------ .../resources/server-template/table.tsx | 15 +++------------ .../src/components/resources/server/table.tsx | 15 +++------------ frontend/src/lib/hooks.ts | 15 +++++++++++++++ frontend/src/pages/resources.tsx | 16 ++++++++-------- 10 files changed, 49 insertions(+), 106 deletions(-) diff --git a/frontend/src/components/resources/alerter/table.tsx b/frontend/src/components/resources/alerter/table.tsx index 482f494de..a0870cdf2 100644 --- a/frontend/src/components/resources/alerter/table.tsx +++ b/frontend/src/components/resources/alerter/table.tsx @@ -1,24 +1,15 @@ -import { useRead, useTagsFilter } from "@lib/hooks"; +import { useFilterResources, useRead } from "@lib/hooks"; import { DataTable, SortableHeader } from "@ui/data-table"; import { ResourceLink } from "../common"; import { TagsWithBadge } from "@components/tags"; export const AlerterTable = ({ search }: { search?: string }) => { - const tags = useTagsFilter(); const alerters = useRead("ListAlerters", {}).data; - const searchSplit = search?.split(" ") || []; + const filtered = useFilterResources(alerters, search); return ( - tags.every((tag) => resource.tags.includes(tag)) && - (searchSplit.length > 0 - ? searchSplit.every((search) => resource.name.includes(search)) - : true) - ) ?? [] - } + data={filtered} columns={[ { accessorKey: "name", diff --git a/frontend/src/components/resources/build/table.tsx b/frontend/src/components/resources/build/table.tsx index 822f981b1..1fb3fb251 100644 --- a/frontend/src/components/resources/build/table.tsx +++ b/frontend/src/components/resources/build/table.tsx @@ -1,5 +1,5 @@ import { TagsWithBadge } from "@components/tags"; -import { useRead, useTagsFilter } from "@lib/hooks"; +import { useFilterResources, useRead } from "@lib/hooks"; import { DataTable, SortableHeader } from "@ui/data-table"; import { fmt_version } from "@lib/formatting"; import { ResourceLink } from "../common"; @@ -7,20 +7,11 @@ import { BuildComponents } from "."; export const BuildTable = ({ search }: { search?: string }) => { const builds = useRead("ListBuilds", {}).data; - const tags = useTagsFilter(); - const searchSplit = search?.split(" ") || []; + const filtered = useFilterResources(builds, search) return ( - tags.every((tag) => resource.tags.includes(tag)) && - (searchSplit.length > 0 - ? searchSplit.every((search) => resource.name.includes(search)) - : true) - ) ?? [] - } + data={filtered} columns={[ { accessorKey: "name", diff --git a/frontend/src/components/resources/builder/table.tsx b/frontend/src/components/resources/builder/table.tsx index 3aa86bed0..bd6d23226 100644 --- a/frontend/src/components/resources/builder/table.tsx +++ b/frontend/src/components/resources/builder/table.tsx @@ -1,25 +1,16 @@ -import { useRead, useTagsFilter } from "@lib/hooks"; +import { useFilterResources, useRead } from "@lib/hooks"; import { DataTable, SortableHeader } from "@ui/data-table"; import { ResourceLink } from "../common"; import { TagsWithBadge } from "@components/tags"; import { BuilderInstanceType } from "."; export const BuilderTable = ({ search }: { search?: string }) => { - const tags = useTagsFilter(); const builders = useRead("ListBuilders", {}).data; - const searchSplit = search?.split(" ") || []; + const filtered = useFilterResources(builders, search); return ( - tags.every((tag) => resource.tags.includes(tag)) && - (searchSplit.length > 0 - ? searchSplit.every((search) => resource.name.includes(search)) - : true) - ) ?? [] - } + data={filtered} columns={[ { accessorKey: "name", diff --git a/frontend/src/components/resources/deployment/table.tsx b/frontend/src/components/resources/deployment/table.tsx index 8ac76bdf5..6916da41e 100644 --- a/frontend/src/components/resources/deployment/table.tsx +++ b/frontend/src/components/resources/deployment/table.tsx @@ -1,7 +1,7 @@ import { TagsWithBadge } from "@components/tags"; import { Types } from "@monitor/client"; import { DataTable, SortableHeader } from "@ui/data-table"; -import { useRead, useTagsFilter } from "@lib/hooks"; +import { useFilterResources, useRead } from "@lib/hooks"; import { ResourceLink } from "../common"; import { DeploymentComponents } from "."; import { HardDrive } from "lucide-react"; @@ -14,25 +14,16 @@ export const DeploymentTable = ({ deployments: Types.DeploymentListItem[] | undefined; search?: string; }) => { - const tags = useTagsFilter(); - const searchSplit = search?.split(" ") || []; const servers = useRead("ListServers", {}).data; const serverName = useCallback( (id: string) => servers?.find((server) => server.id === id)?.name, [servers] ); + const filtered = useFilterResources(deployments, search); return ( - tags.every((tag) => resource.tags.includes(tag)) && - (searchSplit.length > 0 - ? searchSplit.every((search) => resource.name.includes(search)) - : true) - ) ?? [] - } + data={filtered} columns={[ { accessorKey: "name", @@ -61,14 +52,14 @@ export const DeploymentTable = ({ sortingFn: (a, b) => { const sa = serverName(a.original.info.server_id); const sb = serverName(b.original.info.server_id); - + if (!sa && !sb) return 0; if (!sa) return -1; if (!sb) return 1; if (sa > sb) return 1; else if (sa < sb) return -1; - else return 0 + else return 0; }, header: ({ column }) => ( diff --git a/frontend/src/components/resources/procedure/table.tsx b/frontend/src/components/resources/procedure/table.tsx index 089f0c17b..b8e65e431 100644 --- a/frontend/src/components/resources/procedure/table.tsx +++ b/frontend/src/components/resources/procedure/table.tsx @@ -1,24 +1,15 @@ -import { useRead, useTagsFilter } from "@lib/hooks"; +import { useFilterResources, useRead } from "@lib/hooks"; import { DataTable, SortableHeader } from "@ui/data-table"; import { TagsWithBadge } from "@components/tags"; import { ResourceLink } from "../common"; export const ProcedureTable = ({ search }: { search?: string }) => { - const tags = useTagsFilter(); const procedures = useRead("ListProcedures", {}).data; - const searchSplit = search?.split(" ") || []; + const filtered = useFilterResources(procedures, search); return ( - tags.every((tag) => resource.tags.includes(tag)) && - (searchSplit.length > 0 - ? searchSplit.every((search) => resource.name.includes(search)) - : true) - ) ?? [] - } + data={filtered} columns={[ { accessorKey: "name", diff --git a/frontend/src/components/resources/repo/table.tsx b/frontend/src/components/resources/repo/table.tsx index 159447e30..e4aafc0b8 100644 --- a/frontend/src/components/resources/repo/table.tsx +++ b/frontend/src/components/resources/repo/table.tsx @@ -1,25 +1,16 @@ -import { useRead, useTagsFilter } from "@lib/hooks"; +import { useFilterResources, useRead } from "@lib/hooks"; import { DataTable, SortableHeader } from "@ui/data-table"; import { ResourceLink } from "../common"; import { TagsWithBadge } from "@components/tags"; import { RepoComponents } from "."; export const RepoTable = ({ search }: { search?: string }) => { - const tags = useTagsFilter(); const repos = useRead("ListRepos", {}).data; - const searchSplit = search?.split(" ") || []; + const filtered = useFilterResources(repos, search); return ( - tags.every((tag) => resource.tags.includes(tag)) && - (searchSplit.length > 0 - ? searchSplit.every((search) => resource.name.includes(search)) - : true) - ) ?? [] - } + data={filtered} columns={[ { accessorKey: "name", diff --git a/frontend/src/components/resources/server-template/table.tsx b/frontend/src/components/resources/server-template/table.tsx index 57843d342..14c19ae55 100644 --- a/frontend/src/components/resources/server-template/table.tsx +++ b/frontend/src/components/resources/server-template/table.tsx @@ -1,24 +1,15 @@ -import { useRead, useTagsFilter } from "@lib/hooks"; +import { useFilterResources, useRead } from "@lib/hooks"; import { DataTable, SortableHeader } from "@ui/data-table"; import { ResourceLink } from "../common"; import { TagsWithBadge } from "@components/tags"; export const ServerTemplateTable = ({ search }: { search?: string }) => { - const tags = useTagsFilter(); const server_templates = useRead("ListServerTemplates", {}).data; - const searchSplit = search?.split(" ") || []; + const filtered = useFilterResources(server_templates, search); return ( - tags.every((tag) => resource.tags.includes(tag)) && - (searchSplit.length > 0 - ? searchSplit.every((search) => resource.name.includes(search)) - : true) - ) ?? [] - } + data={filtered} columns={[ { accessorKey: "name", diff --git a/frontend/src/components/resources/server/table.tsx b/frontend/src/components/resources/server/table.tsx index 674ad1622..b56124b39 100644 --- a/frontend/src/components/resources/server/table.tsx +++ b/frontend/src/components/resources/server/table.tsx @@ -1,25 +1,16 @@ import { TagsWithBadge } from "@components/tags"; -import { useRead, useTagsFilter } from "@lib/hooks"; +import { useFilterResources, useRead } from "@lib/hooks"; import { DataTable, SortableHeader } from "@ui/data-table"; import { ServerComponents } from "."; import { ResourceLink } from "../common"; export const ServerTable = ({ search }: { search?: string }) => { const servers = useRead("ListServers", {}).data; - const tags = useTagsFilter(); - const searchSplit = search?.split(" ") || []; + const filtered = useFilterResources(servers, search); return ( - tags.every((tag) => resource.tags.includes(tag)) && - (searchSplit.length > 0 - ? searchSplit.every((search) => resource.name.includes(search)) - : true) - ) ?? [] - } + data={filtered} columns={[ { accessorKey: "name", diff --git a/frontend/src/lib/hooks.ts b/frontend/src/lib/hooks.ts index 3e606aeb5..5bad875fa 100644 --- a/frontend/src/lib/hooks.ts +++ b/frontend/src/lib/hooks.ts @@ -216,3 +216,18 @@ export const useCheckResourceExists = () => { } }; }; + +export const useFilterResources = ( + resources?: Types.ResourceListItem[], + search?: string, +) => { + const tags = useTagsFilter(); + const searchSplit = search?.split(" ") || []; + return resources?.filter( + (resource) => + tags.every((tag) => resource.tags.includes(tag)) && + (searchSplit.length > 0 + ? searchSplit.every((search) => resource.name.includes(search)) + : true) + ) ?? []; +}; \ No newline at end of file diff --git a/frontend/src/pages/resources.tsx b/frontend/src/pages/resources.tsx index 6b3c010a4..279b56114 100644 --- a/frontend/src/pages/resources.tsx +++ b/frontend/src/pages/resources.tsx @@ -18,19 +18,19 @@ export const Resources = () => { actions={
- set(e.target.value)} - placeholder="search..." - className="w-96" - /> +
- + set(e.target.value)} + placeholder="search..." + className="w-96" + />
} > - + ); };