From 7fa5fd83d2f8f7207bb7f252ade2b2953f46b699 Mon Sep 17 00:00:00 2001 From: mbecker20 Date: Fri, 3 May 2024 03:12:49 -0700 Subject: [PATCH] ServerTemplate table --- .../components/resources/builder/index.tsx | 4 +- .../components/resources/builder/table.tsx | 4 +- .../resources/server-template/index.tsx | 82 +++++++++++++++++-- .../resources/server-template/table.tsx | 57 +++++++++++++ frontend/src/lib/hooks.ts | 4 +- 5 files changed, 137 insertions(+), 14 deletions(-) diff --git a/frontend/src/components/resources/builder/index.tsx b/frontend/src/components/resources/builder/index.tsx index 6db12f6ea..08926960d 100644 --- a/frontend/src/components/resources/builder/index.tsx +++ b/frontend/src/components/resources/builder/index.tsx @@ -17,7 +17,7 @@ import { useState } from "react"; import { Link } from "react-router-dom"; import { BuilderConfig } from "./config"; import { DeleteResource, ResourceLink } from "../common"; -import { BuidlerTable } from "./table"; +import { BuilderTable } from "./table"; const useBuilder = (id?: string) => useRead("ListBuilders", {}).data?.find((d) => d.id === id); @@ -97,7 +97,7 @@ export const BuilderComponents: RequiredResourceComponents = { ); }, - Table: BuidlerTable, + Table: BuilderTable, Name: ({ id }: { id: string }) => <>{useBuilder(id)?.name}, name: (id) => useBuilder(id)?.name, diff --git a/frontend/src/components/resources/builder/table.tsx b/frontend/src/components/resources/builder/table.tsx index 64097ba38..3aa86bed0 100644 --- a/frontend/src/components/resources/builder/table.tsx +++ b/frontend/src/components/resources/builder/table.tsx @@ -4,7 +4,7 @@ import { ResourceLink } from "../common"; import { TagsWithBadge } from "@components/tags"; import { BuilderInstanceType } from "."; -export const BuidlerTable = ({ search }: { search?: string }) => { +export const BuilderTable = ({ search }: { search?: string }) => { const tags = useTagsFilter(); const builders = useRead("ListBuilders", {}).data; const searchSplit = search?.split(" ") || []; @@ -31,7 +31,7 @@ export const BuidlerTable = ({ search }: { search?: string }) => { ), }, { - accessorKey: "info.provider", + accessorKey: "info.builder_type", header: ({ column }) => ( ), diff --git a/frontend/src/components/resources/server-template/index.tsx b/frontend/src/components/resources/server-template/index.tsx index 5ed93c6d3..d316f12e1 100644 --- a/frontend/src/components/resources/server-template/index.tsx +++ b/frontend/src/components/resources/server-template/index.tsx @@ -1,8 +1,23 @@ -import { useRead } from "@lib/hooks"; +import { useRead, useWrite } from "@lib/hooks"; import { RequiredResourceComponents } from "@types"; -import { DeleteResource, NewResource } from "../common"; -import { Bot, Cloud } from "lucide-react"; +import { DeleteResource } from "../common"; +import { Bot, Cloud, ServerCog } from "lucide-react"; import { ServerTemplateConfig } from "./config"; +import { Link } from "react-router-dom"; +import { Card, CardDescription, CardHeader, CardTitle } from "@ui/card"; +import { useState } from "react"; +import { Types } from "@monitor/client"; +import { NewLayout } from "@components/layouts"; +import { Input } from "@ui/input"; +import { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectTrigger, + SelectValue, +} from "@ui/select"; +import { ServerTemplateTable } from "./table"; const useServerTemplate = (id?: string) => useRead("ListServerTemplates", {}).data?.find((d) => d.id === id); @@ -10,17 +25,70 @@ const useServerTemplate = (id?: string) => export const ServerTemplateComponents: RequiredResourceComponents = { Dashboard: () => { const count = useRead("ListServerTemplates", {}).data?.length; - return <>{count}; + return ( + + + +
+
+ Server Templates + {count} Total +
+ +
+
+
+ + ); }, - New: () => , + New: () => { + const { mutateAsync } = useWrite("CreateServerTemplate"); + const [name, setName] = useState(""); + const [type, setType] = useState("Aws"); - Table: () =>
, + return ( + + !!type && mutateAsync({ name, config: { type, params: {} } }) + } + enabled={!!name && !!type} + > +
+ Name + setName(e.target.value)} + /> +
+
+ Cloud Provider + +
+
+ ); + }, + + Table: ServerTemplateTable, Name: ({ id }) => <>{useServerTemplate(id)?.name}, name: (id) => useServerTemplate(id)?.name, - Icon: () => <>, + Icon: () => , Status: {}, diff --git a/frontend/src/components/resources/server-template/table.tsx b/frontend/src/components/resources/server-template/table.tsx index e69de29bb..57843d342 100644 --- a/frontend/src/components/resources/server-template/table.tsx +++ b/frontend/src/components/resources/server-template/table.tsx @@ -0,0 +1,57 @@ +import { useRead, useTagsFilter } 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(" ") || []; + return ( + + tags.every((tag) => resource.tags.includes(tag)) && + (searchSplit.length > 0 + ? searchSplit.every((search) => resource.name.includes(search)) + : true) + ) ?? [] + } + columns={[ + { + accessorKey: "name", + header: ({ column }) => ( + + ), + cell: ({ row }) => ( + + ), + }, + { + accessorKey: "info.provider", + header: ({ column }) => ( + + ), + }, + { + accessorKey: "info.instance_type", + header: ({ column }) => ( + + ), + }, + { + header: "Tags", + cell: ({ row }) => { + return ( +
+ +
+ ); + }, + }, + ]} + /> + ); +}; diff --git a/frontend/src/lib/hooks.ts b/frontend/src/lib/hooks.ts index 10e384119..3e606aeb5 100644 --- a/frontend/src/lib/hooks.ts +++ b/frontend/src/lib/hooks.ts @@ -144,12 +144,10 @@ export const useAuth = < // ============== UTILITY ============== -/** - * Actually returns UsableResoure | undefined - */ export const useResourceParamType = () => { const type = useParams().type; if (!type) return undefined; + if (type === "server-templates") return "ServerTemplate"; return (type[0].toUpperCase() + type.slice(1, -1)) as UsableResource; };