From 0a788b05e5a245e06719c9cef59689514eb9933c Mon Sep 17 00:00:00 2001 From: Khairul Hidayat Date: Sat, 9 Nov 2024 18:57:36 +0000 Subject: [PATCH] feat: add keychains --- frontend/app/(drawer)/_layout.tsx | 1 + frontend/app/(drawer)/keychains.tsx | 3 + frontend/app/_layout.tsx | 11 ++- frontend/app/_providers.tsx | 10 +-- frontend/components/containers/xtermjs.tsx | 1 - frontend/components/ui/grid-view.tsx | 53 +++++++++++ frontend/components/ui/input.tsx | 22 ++++- frontend/components/ui/modal.tsx | 13 +-- frontend/components/ui/pressable.tsx | 1 + frontend/components/ui/select.tsx | 20 ++++- .../hosts/components/credentials-section.tsx | 16 +++- frontend/pages/hosts/components/host-item.tsx | 59 +++++++++++++ .../pages/hosts/components/hosts-list.tsx | 83 ++++-------------- frontend/pages/hosts/components/incus.tsx | 2 +- frontend/pages/hosts/components/pve.tsx | 2 +- frontend/pages/hosts/hooks/query.ts | 10 +-- frontend/pages/hosts/page.tsx | 2 + frontend/pages/keychains/components/form.tsx | 87 +++++++++++++++++++ .../keychains/components/input-fields.tsx | 68 +++++++++++++++ .../pages/keychains/components/key-item.tsx | 56 ++++++++++++ .../pages/keychains/components/key-list.tsx | 60 +++++++++++++ frontend/pages/keychains/hooks/query.ts | 25 ++++++ frontend/pages/keychains/page.tsx | 31 +++++++ frontend/pages/keychains/schema/form.ts | 79 +++++++++++++++++ server/app/hosts/repository.go | 4 +- server/app/hosts/router.go | 2 +- server/app/keychains/repository.go | 10 +++ server/app/keychains/router.go | 65 +++++++++++++- server/app/ws/term.go | 2 + server/lib/pve.go | 3 +- 30 files changed, 699 insertions(+), 102 deletions(-) create mode 100644 frontend/app/(drawer)/keychains.tsx create mode 100644 frontend/components/ui/grid-view.tsx create mode 100644 frontend/pages/hosts/components/host-item.tsx create mode 100644 frontend/pages/keychains/components/form.tsx create mode 100644 frontend/pages/keychains/components/input-fields.tsx create mode 100644 frontend/pages/keychains/components/key-item.tsx create mode 100644 frontend/pages/keychains/components/key-list.tsx create mode 100644 frontend/pages/keychains/hooks/query.ts create mode 100644 frontend/pages/keychains/page.tsx create mode 100644 frontend/pages/keychains/schema/form.ts diff --git a/frontend/app/(drawer)/_layout.tsx b/frontend/app/(drawer)/_layout.tsx index b67685b..fc20c2d 100644 --- a/frontend/app/(drawer)/_layout.tsx +++ b/frontend/app/(drawer)/_layout.tsx @@ -16,6 +16,7 @@ export default function Layout() { }} > + - + diff --git a/frontend/app/_providers.tsx b/frontend/app/_providers.tsx index ae9a3c3..15dc0d3 100644 --- a/frontend/app/_providers.tsx +++ b/frontend/app/_providers.tsx @@ -36,20 +36,16 @@ const Providers = ({ children }: Props) => { }, [theme, colorScheme]); return ( - <> + - - - {children} - - + {children} - + ); }; diff --git a/frontend/components/containers/xtermjs.tsx b/frontend/components/containers/xtermjs.tsx index 353788f..4ad9d3e 100644 --- a/frontend/components/containers/xtermjs.tsx +++ b/frontend/components/containers/xtermjs.tsx @@ -122,7 +122,6 @@ const XTermJs = forwardRef((props, ref) => { } function onOpen() { - console.log("WS Open"); resizeTerminal(); } diff --git a/frontend/components/ui/grid-view.tsx b/frontend/components/ui/grid-view.tsx new file mode 100644 index 0000000..6cc9ed3 --- /dev/null +++ b/frontend/components/ui/grid-view.tsx @@ -0,0 +1,53 @@ +import React, { useMemo } from "react"; +import { GetProps, ScrollView, View, ViewStyle } from "tamagui"; + +type GridItem = { key: string }; + +type GridViewProps = GetProps & { + data?: T[] | null; + renderItem: (item: T, index: number) => React.ReactNode; + columns: { + xs?: number; + sm?: number; + md?: number; + lg?: number; + xl?: number; + }; +}; + +const GridView = ({ + data, + renderItem, + columns, + gap, + ...props +}: GridViewProps) => { + const basisProps = useMemo(() => { + const basis: ViewStyle = { flexBasis: "100%" }; + if (columns.xs) basis.flexBasis = `${100 / columns.xs}%`; + if (columns.sm) basis.$gtXs = { flexBasis: `${100 / columns.sm}%` }; + if (columns.md) basis.$gtSm = { flexBasis: `${100 / columns.md}%` }; + if (columns.lg) basis.$gtMd = { flexBasis: `${100 / columns.lg}%` }; + if (columns.xl) basis.$gtLg = { flexBasis: `${100 / columns.xl}%` }; + return basis; + }, [columns]); + + return ( + + {data?.map((item, idx) => ( + + {renderItem(item, idx)} + + ))} + + ); +}; + +export default GridView; diff --git a/frontend/components/ui/input.tsx b/frontend/components/ui/input.tsx index e4101b0..4b9acec 100644 --- a/frontend/components/ui/input.tsx +++ b/frontend/components/ui/input.tsx @@ -1,6 +1,6 @@ import { Controller, FieldValues } from "react-hook-form"; import { FormFieldBaseProps } from "./utility"; -import { Input, View } from "tamagui"; +import { Input, TextArea } from "tamagui"; import { ComponentPropsWithoutRef } from "react"; import { ErrorMessage } from "./form"; @@ -24,4 +24,24 @@ export const InputField = ({ /> ); +type TextAreaFieldProps = FormFieldBaseProps & + ComponentPropsWithoutRef; + +export const TextAreaField = ({ + form, + name, + ...props +}: TextAreaFieldProps) => ( + ( + <> +