diff options
| author | Frank <[email protected]> | 2025-10-10 02:34:06 -0400 |
|---|---|---|
| committer | Frank <[email protected]> | 2025-10-10 02:34:06 -0400 |
| commit | 250393978b7e2351646eff24cfdccc9776f5ed4f (patch) | |
| tree | 60e23120fe03f6e616e301513ebd6e751091e886 | |
| parent | fec70ae9c98e50c964a37f9ff6bdc78d34103ad5 (diff) | |
| download | opencode-250393978b7e2351646eff24cfdccc9776f5ed4f.tar.gz opencode-250393978b7e2351646eff24cfdccc9776f5ed4f.zip | |
wip: style byok
| -rw-r--r-- | packages/console/app/src/routes/workspace/[id]/provider-section.module.css | 39 | ||||
| -rw-r--r-- | packages/console/app/src/routes/workspace/[id]/provider-section.tsx | 86 |
2 files changed, 84 insertions, 41 deletions
diff --git a/packages/console/app/src/routes/workspace/[id]/provider-section.module.css b/packages/console/app/src/routes/workspace/[id]/provider-section.module.css index 5f18862f5..f5cfdd8ff 100644 --- a/packages/console/app/src/routes/workspace/[id]/provider-section.module.css +++ b/packages/console/app/src/routes/workspace/[id]/provider-section.module.css @@ -35,11 +35,6 @@ &[data-slot="provider-status"] { text-align: left; color: var(--color-text); - } - - &[data-slot="provider-toggle"] { - text-align: left; - font-family: var(--font-sans); [data-slot="edit-form"] { display: flex; @@ -76,11 +71,32 @@ line-height: 1.4; } } + } + } - [data-slot="form-actions"] { - display: flex; - gap: var(--space-2); + &[data-slot="provider-action"] { + text-align: left; + font-family: var(--font-sans); + + [data-slot="configured-actions"] { + display: flex; + gap: var(--space-2); + + [data-slot="delete-form"] { + opacity: 0; + pointer-events: none; + transition: opacity 0.2s; } + + &:hover [data-slot="delete-form"] { + opacity: 1; + pointer-events: auto; + } + } + + [data-slot="form-actions"] { + display: flex; + gap: var(--space-2); } } } @@ -90,6 +106,13 @@ opacity: 0.6; } + &:hover { + [data-slot="provider-action"] [data-slot="delete-form"] { + opacity: 1; + pointer-events: auto; + } + } + &:last-child td { border-bottom: none; } diff --git a/packages/console/app/src/routes/workspace/[id]/provider-section.tsx b/packages/console/app/src/routes/workspace/[id]/provider-section.tsx index 856b3a6a2..6b7663e1a 100644 --- a/packages/console/app/src/routes/workspace/[id]/provider-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/provider-section.tsx @@ -12,6 +12,10 @@ const PROVIDERS = [ type Provider = (typeof PROVIDERS)[number] +function maskCredentials(credentials: string) { + return `${credentials.slice(0, 8)}...${credentials.slice(-8)}` +} + const removeProvider = action(async (form: FormData) => { "use server" const provider = form.get("provider")?.toString() @@ -58,7 +62,7 @@ function ProviderRow(props: { provider: Provider }) { let input: HTMLInputElement - const isEnabled = () => providers()?.some((p) => p.provider === props.provider.key) + const providerData = () => providers()?.find((p) => p.provider === props.provider.key) createEffect(() => { if (!saveSubmission.pending && saveSubmission.result && !saveSubmission.result.error) { @@ -80,32 +84,14 @@ function ProviderRow(props: { provider: Provider }) { } return ( - <tr data-slot="provider-row" data-enabled={isEnabled()}> + <tr data-slot="provider-row" data-enabled={providerData()}> <td data-slot="provider-name">{props.provider.name}</td> - <td data-slot="provider-status">{isEnabled() ? "Configured" : "Not Configured"}</td> - <td data-slot="provider-toggle"> + <td data-slot="provider-status"> <Show when={store.editing} - fallback={ - <Show - when={isEnabled()} - fallback={ - <button data-color="ghost" onClick={() => show()}> - Configure - </button> - } - > - <form action={removeProvider} method="post"> - <input type="hidden" name="provider" value={props.provider.key} /> - <input type="hidden" name="workspaceID" value={params.id} /> - <button data-color="ghost" type="submit" disabled={removeSubmission.pending}> - Disable - </button> - </form> - </Show> - } + fallback={<span>{providerData() ? maskCredentials(providerData()!.credentials) : "Not Configured"}</span>} > - <form action={saveProvider} method="post" data-slot="edit-form"> + <form id={`provider-form-${props.provider.key}`} action={saveProvider} method="post" data-slot="edit-form"> <div data-slot="input-wrapper"> <input ref={(r) => (input = r)} @@ -122,17 +108,51 @@ function ProviderRow(props: { provider: Provider }) { </div> <input type="hidden" name="provider" value={props.provider.key} /> <input type="hidden" name="workspaceID" value={params.id} /> - <div data-slot="form-actions"> - <button type="reset" data-color="ghost" onClick={() => hide()}> - Cancel - </button> - <button type="submit" data-color="ghost" disabled={saveSubmission.pending}> - {saveSubmission.pending ? "Saving..." : "Save"} - </button> - </div> </form> </Show> </td> + <td data-slot="provider-action"> + <Show + when={store.editing} + fallback={ + <Show + when={providerData()} + fallback={ + <button data-color="ghost" onClick={() => show()}> + Configure + </button> + } + > + <div data-slot="configured-actions"> + <button data-color="ghost" onClick={() => show()}> + Edit + </button> + <form action={removeProvider} method="post" data-slot="delete-form"> + <input type="hidden" name="provider" value={props.provider.key} /> + <input type="hidden" name="workspaceID" value={params.id} /> + <button data-color="ghost" type="submit" disabled={removeSubmission.pending}> + Delete + </button> + </form> + </div> + </Show> + } + > + <div data-slot="form-actions"> + <button type="reset" data-color="ghost" onClick={() => hide()}> + Cancel + </button> + <button + type="submit" + data-color="ghost" + disabled={saveSubmission.pending} + form={`provider-form-${props.provider.key}`} + > + {saveSubmission.pending ? "Saving..." : "Save"} + </button> + </div> + </Show> + </td> </tr> ) } @@ -149,8 +169,8 @@ export function ProviderSection() { <thead> <tr> <th>Provider</th> - <th>Status</th> - <th>Action</th> + <th>API Key</th> + <th></th> </tr> </thead> <tbody> |
