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}