summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFrank <[email protected]>2025-10-10 19:49:59 -0400
committerFrank <[email protected]>2025-10-10 19:49:59 -0400
commitcc590364e968bec62c62861f2450034e9574f76b (patch)
tree6de70b32cb8870d9abe7bf103040e46e08964556
parentf14cd4a3db12161eab93ce6538528ed882439a50 (diff)
downloadopencode-cc590364e968bec62c62861f2450034e9574f76b.tar.gz
opencode-cc590364e968bec62c62861f2450034e9574f76b.zip
wip: zen
-rw-r--r--packages/console/app/src/routes/workspace-picker.tsx7
-rw-r--r--packages/console/app/src/routes/workspace/[id].tsx6
-rw-r--r--packages/console/core/src/actor.ts2
-rw-r--r--packages/console/core/src/workspace.ts1
4 files changed, 9 insertions, 7 deletions
diff --git a/packages/console/app/src/routes/workspace-picker.tsx b/packages/console/app/src/routes/workspace-picker.tsx
index 51de4cef1..34a544973 100644
--- a/packages/console/app/src/routes/workspace-picker.tsx
+++ b/packages/console/app/src/routes/workspace-picker.tsx
@@ -1,4 +1,4 @@
-import { query, useParams, action, createAsync, redirect } from "@solidjs/router"
+import { query, useParams, action, createAsync, redirect, useSubmission } from "@solidjs/router"
import { For, Show, createEffect, onCleanup } from "solid-js"
import { createStore } from "solid-js/store"
import { withActor } from "~/context/auth.withActor"
@@ -42,6 +42,7 @@ const createWorkspace = action(async (form: FormData) => {
export function WorkspacePicker() {
const params = useParams()
const workspaces = createAsync(() => getWorkspaces())
+ const submission = useSubmission(createWorkspace)
const [store, setStore] = createStore({
showForm: false,
showDropdown: false,
@@ -135,8 +136,8 @@ export function WorkspacePicker() {
<button type="button" data-color="ghost" onClick={() => setStore("showForm", false)}>
Cancel
</button>
- <button type="submit" data-color="primary">
- Create
+ <button type="submit" data-color="primary" disabled={submission.pending}>
+ {submission.pending ? "Creating..." : "Create"}
</button>
</div>
</div>
diff --git a/packages/console/app/src/routes/workspace/[id].tsx b/packages/console/app/src/routes/workspace/[id].tsx
index a28bf93b3..8347cd49c 100644
--- a/packages/console/app/src/routes/workspace/[id].tsx
+++ b/packages/console/app/src/routes/workspace/[id].tsx
@@ -24,10 +24,10 @@ export default function WorkspaceLayout(props: RouteSectionProps) {
<A href={`/workspace/${params.id}/billing`} activeClass="active" data-nav-button>
Billing
</A>
+ <A href={`/workspace/${params.id}/settings`} activeClass="active" data-nav-button>
+ Settings
+ </A>
</Show>
- <A href={`/workspace/${params.id}/settings`} activeClass="active" data-nav-button>
- Settings
- </A>
</div>
</nav>
<div data-component="workspace-content">{props.children}</div>
diff --git a/packages/console/core/src/actor.ts b/packages/console/core/src/actor.ts
index e8d1b7a6b..48f4a6366 100644
--- a/packages/console/core/src/actor.ts
+++ b/packages/console/core/src/actor.ts
@@ -69,7 +69,7 @@ export namespace Actor {
export const assertAdmin = () => {
if (userRole() === "admin") return
- throw new Error(`Expected admin user, got ${userRole()}`)
+ throw new Error(`Action not allowed. Ask your workspace admin to perform this action.`)
}
export function workspace() {
diff --git a/packages/console/core/src/workspace.ts b/packages/console/core/src/workspace.ts
index 7a742e896..655112ae2 100644
--- a/packages/console/core/src/workspace.ts
+++ b/packages/console/core/src/workspace.ts
@@ -52,6 +52,7 @@ export namespace Workspace {
name: z.string().min(1).max(255),
}),
async ({ name }) => {
+ Actor.assertAdmin()
const workspaceID = Actor.workspace()
return await Database.use((tx) =>
tx