From cc59fce7bdc11885a02e5133fc4809ea313ea25d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 21 Sep 2026 23:30:57 +0000 Subject: [PATCH] fix(web): Projekte + opens project create, not group form Wire the Projekte sidebar + and empty-state action to NewSpaceDialog with project labels instead of the group creation panel. Keep space wording for the global create menu. Add de locale strings and an e2e regression test. Co-authored-by: cynarAI --- apps/web/e2e/spaces.spec.ts | 15 +++++++++++++++ apps/web/scripts/translations-de.json | 6 ++++++ apps/web/src/lib/i18n-catalog.test.ts | 7 +++++++ apps/web/src/locales/de/messages.po | 27 +++++++++++++++++++++++++-- apps/web/src/locales/en/messages.po | 27 +++++++++++++++++++++++++-- apps/web/src/pages/Shell.tsx | 27 +++++++++++++-------------- apps/web/src/pages/shell/dialogs.tsx | 21 ++++++++++++++++++--- 7 files changed, 109 insertions(+), 21 deletions(-) diff --git a/apps/web/e2e/spaces.spec.ts b/apps/web/e2e/spaces.spec.ts index 7f4abe2..e3b7ec6 100644 --- a/apps/web/e2e/spaces.spec.ts +++ b/apps/web/e2e/spaces.spec.ts @@ -1,6 +1,21 @@ import { expect, test } from "@playwright/test"; import { captureScreenshot, completeOnboarding, openNewSpace, rpc, signup } from "./helpers"; +test("Projekte + opens new project dialog instead of group form", async ({ page }) => { + const stamp = Date.now(); + await signup(page, `proj-create-${stamp}@rakazo.test`, "password12", "Project Create"); + await completeOnboarding(page); + await page.goto("/app"); + await page.waitForURL(/\/app\/[^/]+$/); + + const projekte = page.locator(".sidebar-projekte"); + await projekte.getByRole("button", { name: "Create a project" }).click(); + await expect(page.getByRole("dialog", { name: "New project" })).toBeVisible(); + await expect(page.getByRole("button", { name: "Create project", exact: true })).toBeVisible(); + await expect(page.getByTestId("side-panel")).not.toHaveAttribute("data-panel", "create-group"); + await expect(page.getByText("New group", { exact: true })).toHaveCount(0); +}); + test("spaces stay invisible by default and chat creation requires approval", async ({ page, }, testInfo) => { diff --git a/apps/web/scripts/translations-de.json b/apps/web/scripts/translations-de.json index 0c8ae69..2cd65c1 100644 --- a/apps/web/scripts/translations-de.json +++ b/apps/web/scripts/translations-de.json @@ -476,6 +476,12 @@ "Server name": "Servername", "Server URL": "Server-URL", "Set up voice to call": "Stimme für Anrufe einrichten", + "Create a project": "Projekt erstellen", + "Create project": "Projekt erstellen", + "Could not create project": "Projekt konnte nicht erstellt werden", + "New project": "Neues Projekt", + "No projects yet.": "Noch keine Projekte.", + "Threads by topic · folders": "Threads nach Thema · Ordner", "Settings": "Einstellungen", "Settings: General": "Einstellungen: Allgemein", "Settings: Usage": "Einstellungen: Nutzung", diff --git a/apps/web/src/lib/i18n-catalog.test.ts b/apps/web/src/lib/i18n-catalog.test.ts index 9c66389..686b4db 100644 --- a/apps/web/src/lib/i18n-catalog.test.ts +++ b/apps/web/src/lib/i18n-catalog.test.ts @@ -180,6 +180,13 @@ describe("lingui catalogs", () => { expect(i18n._({ id: "Cancel", message: "Cancel" })).toBe("Abbrechen"); expect(i18n._({ id: "Search", message: "Search" })).toBe("Suchen"); expect(i18n._({ id: "To:", message: "To:" })).toBe("An:"); + expect(i18n._({ id: "Create a project", message: "Create a project" })).toBe( + "Projekt erstellen", + ); + expect(i18n._({ id: "New project", message: "New project" })).toBe("Neues Projekt"); + expect(i18n._({ id: "No projects yet.", message: "No projects yet." })).toBe( + "Noch keine Projekte.", + ); i18n.load("ko", ko as Record); i18n.activate("ko"); diff --git a/apps/web/src/locales/de/messages.po b/apps/web/src/locales/de/messages.po index f95e8d8..531066c 100644 --- a/apps/web/src/locales/de/messages.po +++ b/apps/web/src/locales/de/messages.po @@ -1124,7 +1124,11 @@ msgstr "Gruppe konnte nicht erstellt werden" msgid "Could not create section" msgstr "Abschnitt konnte nicht erstellt werden" -#: src/pages/shell/dialogs.tsx:52 +#: src/pages/shell/dialogs.tsx:59 +msgid "Could not create project" +msgstr "Projekt konnte nicht erstellt werden" + +#: src/pages/shell/dialogs.tsx:60 msgid "Could not create space" msgstr "" @@ -1422,6 +1426,15 @@ msgstr "Neue Gruppe erstellen" msgid "Create new Space" msgstr "Neuen Space erstellen" +#: src/pages/Shell.tsx:3073 +#: src/pages/Shell.tsx:3099 +msgid "Create a project" +msgstr "Projekt erstellen" + +#: src/pages/shell/dialogs.tsx:103 +msgid "Create project" +msgstr "Projekt erstellen" + #: src/pages/RoutineEditor.tsx:122 #: src/pages/RoutineEditor.tsx:123 msgid "Create Routine" @@ -2454,7 +2467,11 @@ msgstr "Neuer Abschnitt" msgid "New skill" msgstr "Neuer Skill" -#: src/pages/shell/dialogs.tsx:68 +#: src/pages/shell/dialogs.tsx:77 +msgid "New project" +msgstr "Neues Projekt" + +#: src/pages/shell/dialogs.tsx:77 msgid "New space" msgstr "" @@ -2522,6 +2539,9 @@ msgstr "Noch keine Nachrichten mit {peerBotName}." msgid "No model catalog is available." msgstr "Kein Modellkatalog verfügbar." +msgid "No projects yet." +msgstr "Noch keine Projekte." + #: src/pages/ModelSettingsOverlay.tsx:453 msgid "No providers found." msgstr "Keine Anbieter gefunden." @@ -3481,6 +3501,9 @@ msgstr "Wird gewechselt…" msgid "System" msgstr "System" +msgid "Threads by topic · folders" +msgstr "Threads nach Thema · Ordner" + #: src/components/teach/TeachComputerOverlay.tsx:205 #: src/components/teach/TeachComputerOverlay.tsx:213 msgid "Teach a task" diff --git a/apps/web/src/locales/en/messages.po b/apps/web/src/locales/en/messages.po index 8267028..4e50962 100644 --- a/apps/web/src/locales/en/messages.po +++ b/apps/web/src/locales/en/messages.po @@ -1124,7 +1124,11 @@ msgstr "Could not create group" msgid "Could not create section" msgstr "Could not create section" -#: src/pages/shell/dialogs.tsx:52 +#: src/pages/shell/dialogs.tsx:59 +msgid "Could not create project" +msgstr "Could not create project" + +#: src/pages/shell/dialogs.tsx:60 msgid "Could not create space" msgstr "Could not create space" @@ -1422,6 +1426,15 @@ msgstr "Create new Group" msgid "Create new Space" msgstr "Create new Space" +#: src/pages/Shell.tsx:3073 +#: src/pages/Shell.tsx:3099 +msgid "Create a project" +msgstr "Create a project" + +#: src/pages/shell/dialogs.tsx:103 +msgid "Create project" +msgstr "Create project" + #: src/pages/RoutineEditor.tsx:122 #: src/pages/RoutineEditor.tsx:123 msgid "Create Routine" @@ -2454,7 +2467,11 @@ msgstr "New section" msgid "New skill" msgstr "New skill" -#: src/pages/shell/dialogs.tsx:68 +#: src/pages/shell/dialogs.tsx:77 +msgid "New project" +msgstr "New project" + +#: src/pages/shell/dialogs.tsx:77 msgid "New space" msgstr "New space" @@ -2523,6 +2540,9 @@ msgid "No model catalog is available." msgstr "No model catalog is available." #: src/pages/ModelSettingsOverlay.tsx:453 +msgid "No projects yet." +msgstr "No projects yet." + msgid "No providers found." msgstr "No providers found." @@ -3483,6 +3503,9 @@ msgstr "System" #: src/components/teach/TeachComputerOverlay.tsx:205 #: src/components/teach/TeachComputerOverlay.tsx:213 +msgid "Threads by topic · folders" +msgstr "Threads by topic · folders" + msgid "Teach a task" msgstr "Teach a task" diff --git a/apps/web/src/pages/Shell.tsx b/apps/web/src/pages/Shell.tsx index 8107538..052f545 100644 --- a/apps/web/src/pages/Shell.tsx +++ b/apps/web/src/pages/Shell.tsx @@ -578,6 +578,11 @@ export function ShellPage() { null, ); const [newSpaceOpen, setNewSpaceOpen] = useState(false); + const [newSpaceDialogVariant, setNewSpaceDialogVariant] = useState<"space" | "project">("space"); + const openNewSpaceDialog = useCallback((variant: "space" | "project") => { + setNewSpaceDialogVariant(variant); + setNewSpaceOpen(true); + }, []); const [pickerInfoTopic, setPickerInfoTopic] = useState<"group" | "space" | null>(null); const [commandPaletteOpen, setCommandPaletteOpen] = useState(false); @@ -2980,7 +2985,7 @@ export function ShellPage() { onCreateSpace={() => { setCreateMenuOpen(false); setMobileSidebarOpen(false); - setNewSpaceOpen(true); + openNewSpaceDialog("space"); }} onShowGroupInfo={() => { setCreateMenuOpen(false); @@ -3060,21 +3065,14 @@ export function ShellPage() {
{t`Projekte`}

- {t`Group conversations · folders`} + {t`Threads by topic · folders`}

-
) : null} @@ -4791,6 +4789,7 @@ export function ShellPage() { {newSpaceOpen ? ( setNewSpaceOpen(false)} onConfirm={async (name) => { const space = await rpc.spaces.create({ name }); diff --git a/apps/web/src/pages/shell/dialogs.tsx b/apps/web/src/pages/shell/dialogs.tsx index 6170b34..2a58a41 100644 --- a/apps/web/src/pages/shell/dialogs.tsx +++ b/apps/web/src/pages/shell/dialogs.tsx @@ -31,9 +31,11 @@ function closeUnlessBusy(busy: boolean, onCancel: () => void) { } export function NewSpaceDialog({ + variant = "space", onCancel, onConfirm, }: { + variant?: "space" | "project"; onCancel: () => void; onConfirm: (name: string) => Promise; }) { @@ -42,6 +44,7 @@ export function NewSpaceDialog({ const [name, setName] = useState(""); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); + const isProject = variant === "project"; const create = () => { const trimmed = name.trim(); @@ -49,7 +52,13 @@ export function NewSpaceDialog({ setSaving(true); setError(null); void onConfirm(trimmed).catch((reason: unknown) => { - setError(reason instanceof Error ? reason.message : t`Could not create space`); + setError( + reason instanceof Error + ? reason.message + : isProject + ? t`Could not create project` + : t`Could not create space`, + ); setSaving(false); }); }; @@ -65,7 +74,7 @@ export function NewSpaceDialog({ className="text-muted-foreground" aria-hidden="true" /> - New space + {isProject ? New project : New space}