Add transactional emails (SMTP) and planner features (no-go areas, notes, crash recovery)
Transactional emails: - Add nodemailer SMTP email module with dev-mode console logging - Magic link template and welcome template with HTML + plain text - Wire sendMagicLink into login flow, sendWelcome into registration - Update privacy page and deploy docs for SMTP configuration Planner features: - No-go areas: draw polygons on map (leaflet-geoman), synced via Yjs, passed to BRouter as nogos parameter, route recomputes on change - Session notes: collaborative Y.Text textarea in sidebar tab - Crash recovery: periodic localStorage save of Yjs state, restore on reconnect - Rate limit session creation (10/IP/hour) in /new route Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
05b5f6febf
commit
0a8dd0b766
27 changed files with 1030 additions and 69 deletions
|
|
@ -62,6 +62,35 @@ test.describe("Planner", () => {
|
|||
await expect(page.getByText("Click on the map to add waypoints")).toBeVisible();
|
||||
});
|
||||
|
||||
test("session has sidebar tabs (waypoints and notes)", async ({ page, request }) => {
|
||||
const response = await request.post("/api/sessions", { data: {} });
|
||||
const { url } = await response.json();
|
||||
|
||||
await page.goto(url);
|
||||
await expect(page.locator(".leaflet-container")).toBeVisible({ timeout: 10000 });
|
||||
|
||||
// Waypoints tab is active by default
|
||||
await expect(page.getByRole("button", { name: "Waypoints" })).toBeVisible();
|
||||
await expect(page.getByRole("button", { name: "Notes" })).toBeVisible();
|
||||
|
||||
// Switch to Notes tab
|
||||
await page.getByRole("button", { name: "Notes" }).click();
|
||||
await expect(page.getByPlaceholder("Add notes for this session...")).toBeVisible();
|
||||
|
||||
// Switch back to Waypoints tab
|
||||
await page.getByRole("button", { name: "Waypoints" }).click();
|
||||
await expect(page.getByText("Waypoints (0)")).toBeVisible();
|
||||
});
|
||||
|
||||
test("session has no-go area button", async ({ page, request }) => {
|
||||
const response = await request.post("/api/sessions", { data: {} });
|
||||
const { url } = await response.json();
|
||||
|
||||
await page.goto(url);
|
||||
await expect(page.locator(".leaflet-container")).toBeVisible({ timeout: 10000 });
|
||||
await expect(page.getByTitle("Draw no-go area")).toBeVisible();
|
||||
});
|
||||
|
||||
test("can create session with initial waypoints", async ({ request }) => {
|
||||
const response = await request.post("/api/sessions", {
|
||||
data: {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue