From f9269321818a09d8eedb10af0b85a79d6abc39e6 Mon Sep 17 00:00:00 2001 From: mbecker20 Date: Fri, 14 Jun 2024 23:28:08 -0700 Subject: [PATCH] build / deployment env variable / secret selectors --- frontend/src/components/config/util.tsx | 65 +++++++++ .../src/components/resources/build/config.tsx | 128 ++++------------- frontend/src/components/resources/common.tsx | 2 +- .../config/components/environment.tsx | 132 +++++------------- 4 files changed, 129 insertions(+), 198 deletions(-) diff --git a/frontend/src/components/config/util.tsx b/frontend/src/components/config/util.tsx index 0113a4c48..13bb413d0 100644 --- a/frontend/src/components/config/util.tsx +++ b/frontend/src/components/config/util.tsx @@ -639,3 +639,68 @@ const default_registry_config = ( return { type, params: "" }; } }; + +export const SecretSelector = ({ + keys, + onSelect, + type, + disabled, +}: { + keys: string[]; + onSelect: (key: string) => void; + type: "Variable" | "Secret"; + disabled: boolean; +}) => { + const [open, setOpen] = useState(false); + const [search, setSearch] = useState(""); + const filtered = filterBySplit(keys, search, (item) => item).sort((a, b) => { + if (a > b) { + return 1; + } else if (a < b) { + return -1; + } else { + return 0; + } + }); + return ( + + + + + + + + + + {`No ${type}s Found`} + + + + + {filtered.map((key) => ( + { + onSelect(key); + setOpen(false); + }} + className="flex items-center justify-between cursor-pointer" + > +
{key}
+
+ ))} +
+
+
+
+
+ ); +}; \ No newline at end of file diff --git a/frontend/src/components/resources/build/config.tsx b/frontend/src/components/resources/build/config.tsx index 3bd5b15f6..73dd9660b 100644 --- a/frontend/src/components/resources/build/config.tsx +++ b/frontend/src/components/resources/build/config.tsx @@ -5,6 +5,7 @@ import { ConfigItem, ImageRegistryConfig, InputList, + SecretSelector, SystemCommand, } from "@components/config/util"; import { useRead, useWrite } from "@lib/hooks"; @@ -15,7 +16,6 @@ import { Textarea } from "@ui/textarea"; import { PlusCircle } from "lucide-react"; import { ReactNode, RefObject, createRef, useState } from "react"; import { CopyGithubWebhook, LabelsConfig, ResourceSelector } from "../common"; -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@ui/tabs"; export const BuildConfig = ({ id, @@ -324,102 +324,36 @@ const Secrets = ({ if (variables.length === 0 && secrets.length === 0) return; - if (variables.length === 0) { - // ONLY SECRETS - return ( -
-

Secrets

-
- {secrets.map((secret) => ( - - ))} -
-
- ); - } - - if (secrets.length === 0) { - // ONLY VARIABLES - return ( -
-

Variables

-
- {variables.map(({ name }) => ( - - ))} -
-
- ); - } - return ( - - - Variables - Secrets - - -
- {variables.map(({ name }) => ( - - ))} -
-
- -
- {secrets.map((secret) => ( - - ))} -
-
-
+
+ {variables.length > 0 && ( + v.name)} + onSelect={(variable) => + setArgs( + _args.slice(0, argsRef.current?.selectionStart) + + `[[${variable}]]` + + _args.slice(argsRef.current?.selectionStart, undefined) + ) + } + disabled={false} + /> + )} + {secrets.length > 0 && ( + + setArgs( + _args.slice(0, argsRef.current?.selectionStart) + + `[[${secret}]]` + + _args.slice(argsRef.current?.selectionStart, undefined) + ) + } + disabled={false} + /> + )} +
); }; diff --git a/frontend/src/components/resources/common.tsx b/frontend/src/components/resources/common.tsx index 7034028a3..fe110f3e7 100644 --- a/frontend/src/components/resources/common.tsx +++ b/frontend/src/components/resources/common.tsx @@ -402,4 +402,4 @@ export const ServerSelector = ({ align={align} /> -); +); \ No newline at end of file diff --git a/frontend/src/components/resources/deployment/config/components/environment.tsx b/frontend/src/components/resources/deployment/config/components/environment.tsx index a500b352e..a7b49e9c7 100644 --- a/frontend/src/components/resources/deployment/config/components/environment.tsx +++ b/frontend/src/components/resources/deployment/config/components/environment.tsx @@ -1,8 +1,6 @@ -import { ConfigItem } from "@components/config/util"; +import { ConfigItem, SecretSelector } from "@components/config/util"; import { useRead } from "@lib/hooks"; import { Types } from "@monitor/client"; -import { Button } from "@ui/button"; -import { Tabs, TabsContent, TabsList, TabsTrigger } from "@ui/tabs"; import { Textarea } from "@ui/textarea"; import { RefObject, createRef } from "react"; @@ -22,7 +20,7 @@ export const EnvVars = ({ const setEnv = (environment: string) => set({ environment }); return ( - + {!disabled && server && ( )} @@ -65,102 +63,36 @@ const Secrets = ({ if (variables.length === 0 && secrets.length === 0) return; - if (variables.length === 0) { - // ONLY SECRETS - return ( -
-

Secrets

-
- {secrets.map((secret) => ( - - ))} -
-
- ); - } - - if (secrets.length === 0) { - // ONLY VARIABLES - return ( -
-

Variables

-
- {variables.map(({ name }) => ( - - ))} -
-
- ); - } - return ( - - - Variables - Secrets - - -
- {variables.map(({ name }) => ( - - ))} -
-
- -
- {secrets.map((secret) => ( - - ))} -
-
-
+
+ {variables.length > 0 && ( + v.name)} + onSelect={(variable) => + setEnv( + _env.slice(0, envRef.current?.selectionStart) + + `[[${variable}]]` + + _env.slice(envRef.current?.selectionStart, undefined) + ) + } + disabled={false} + /> + )} + {secrets.length > 0 && ( + + setEnv( + _env.slice(0, envRef.current?.selectionStart) + + `[[${secret}]]` + + _env.slice(envRef.current?.selectionStart, undefined) + ) + } + disabled={false} + /> + )} +
); };