* fix(web): show Starten for empty projects instead of fallback bot When a project space had no group conversations, the sidebar fell back to listing 1:1 bots (e.g. Chief from onboarding) under the project name. Bootstrap also redirected /app to the first bot, making it look like an existing conversation. Only show project group chats in Projekte, render + Starten for empty projects, and open the existing create flow (group or bot) on click. Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(web): keep empty-project Starten view and route flows correctly Rebased onto main. Guard the Hauptthread auto-redirect when the current space is an empty project so the main Starten CTA stays visible. Split project start into create-bot vs create-group flows (main vs sidebar) and feed home-space bots into the group form when starting from a project. Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(web): surface empty-project Starten on Projekte pillar Route bare /app in empty projects to the Projekte view, keep /app on stale bot/group URLs, and show the create-group side panel without an active thread. Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(e2e): scope RPC to selected space and tighten Starten specs Pass x-rakazo-space-id from Playwright RPC helpers so archive/list hit the active project space. Trim the group-create Starten test to the side panel flow and navigate to /app after archiving the last bot. Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * style(e2e): format empty-project-starten spec Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> * fix(e2e): remove project bots so empty spaces stay deletable Archived bots still count as space content and hide the delete-space menu. Use bots/remove in spaces.spec when the test needs a deletable empty project space. Co-authored-by: cynarAI <cynarAI@users.noreply.github.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
74 lines
3.4 KiB
TypeScript
74 lines
3.4 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
|
import { completeOnboarding, rpc, signup, unterhaltungenOnly } from "./helpers";
|
|
|
|
test("empty project shows Starten instead of a fallback bot", async ({ page }) => {
|
|
const stamp = Date.now();
|
|
await signup(page, `empty-project-${stamp}@rakazo.test`, "password12", "Empty Project");
|
|
await completeOnboarding(page);
|
|
await page.goto("/app");
|
|
await page.waitForURL(/\/app\/[^/]+$/);
|
|
|
|
const projekte = page.locator(".sidebar-projekte");
|
|
await projekte.getByTestId("create-project-trigger").click();
|
|
const dialog = page.getByRole("dialog", { name: "New project" });
|
|
await dialog.getByLabel("Name").fill("Launch");
|
|
await dialog.getByRole("button", { name: "Create project", exact: true }).click();
|
|
await page.waitForURL(/\/app(?:\/)?$/);
|
|
|
|
await expect(projekte.getByRole("button", { name: /^Chief/ })).toHaveCount(0);
|
|
await expect(projekte.getByRole("button", { name: "Starten", exact: true })).toBeVisible();
|
|
await expect(page.getByTestId("project-start-main")).toBeVisible();
|
|
|
|
await page.getByTestId("project-start-main").click();
|
|
await expect(page.getByTestId("side-panel")).toHaveAttribute("data-panel", "create");
|
|
});
|
|
|
|
test("Starten in an onboarded project opens the group create flow", async ({ page }) => {
|
|
const stamp = Date.now();
|
|
await signup(page, `project-start-${stamp}@rakazo.test`, "password12", "Project Start");
|
|
await completeOnboarding(page);
|
|
|
|
const projekte = page.locator(".sidebar-projekte");
|
|
await projekte.getByTestId("create-project-trigger").click();
|
|
const dialog = page.getByRole("dialog", { name: "New project" });
|
|
await dialog.getByLabel("Name").fill("Website");
|
|
await dialog.getByRole("button", { name: "Create project", exact: true }).click();
|
|
await page.waitForURL(/\/app(?:\/)?$/);
|
|
await page.goto("/onboarding");
|
|
await completeOnboarding(page);
|
|
|
|
await expect(unterhaltungenOnly(page).getByRole("button", { name: /^Chief/ })).toHaveCount(1);
|
|
await expect(projekte.getByRole("button", { name: /^Chief/ })).toHaveCount(0);
|
|
|
|
await projekte.getByRole("button", { name: "Starten", exact: true }).click();
|
|
await expect(page.getByTestId("side-panel")).toHaveAttribute("data-panel", "create-group");
|
|
await expect(page.getByText("New group", { exact: true })).toBeVisible();
|
|
await expect(
|
|
page.getByTestId("side-panel").getByRole("button", { name: /^Chief/ }),
|
|
).toBeVisible();
|
|
});
|
|
|
|
test("archiving the only bot keeps Starten visible in the project sidebar", async ({ page }) => {
|
|
const stamp = Date.now();
|
|
await signup(page, `project-archive-${stamp}@rakazo.test`, "password12", "Project Archive");
|
|
await completeOnboarding(page);
|
|
|
|
const projekte = page.locator(".sidebar-projekte");
|
|
await projekte.getByTestId("create-project-trigger").click();
|
|
const dialog = page.getByRole("dialog", { name: "New project" });
|
|
await dialog.getByLabel("Name").fill("Side");
|
|
await dialog.getByRole("button", { name: "Create project", exact: true }).click();
|
|
await page.waitForURL(/\/app(?:\/)?$/);
|
|
await page.goto("/onboarding");
|
|
await completeOnboarding(page);
|
|
|
|
const [chief] = await rpc<Array<{ id: string; name: string }>>(page, "bots/list", {});
|
|
expect(chief?.name).toMatch(/^Chief/);
|
|
await rpc(page, "bots/archive", { botId: chief!.id });
|
|
|
|
await page.goto("/app");
|
|
await page.waitForURL(/\/app(?:\/)?$/);
|
|
await expect(projekte.getByRole("button", { name: "Starten", exact: true })).toBeVisible();
|
|
await expect(page.getByTestId("project-start-main")).toBeVisible();
|
|
});
|