MotirBuilding in public
MOTIR · moooon
onMotir
You’re viewing a public project. Anyone can view it — no account needed. Sign in to submit, upvote, or comment on requests.View-only — you can’t edit work items
MOTIR-117

2.5.6 Story E2E — render · expand · filter · inline edit · view-switcher · isolation + a11y

Done
Description

Estimate: 15m · Depends on: 2.5.3, 2.5.4, 2.5.5, 2.5.8, 2.5.12, 2.5.14, 2.5.15, 2.5.16

The Story-closing Playwright spec that drives the real stack through the whole surface, plus the a11y gate. tests/e2e/issue-list-flow.spec.ts: seed a project with a multi-level tree (epic → story → task → sub-task + a bug), then assert — the tree renders project-scoped and nested (indent + identifiers + status pills); expand/collapse shows/hides descendants; filter by kind / status / assignee / text narrows the tree while keeping ancestors; an inline status change (legal) persists + an illegal one is rejected; an inline reassign + unassign persists; the empty state renders for a fresh project; a row click navigates to /issues/[key]; and cross-workspace isolation — a workspace-A user never sees workspace-B issues at /issues.

View-switcher (2.5.8). The spec also drives the [Tree ▾] control: switch Tree → List (the tree flattens, indentation/chevrons gone) and back; the choice round-trips through the URL (?view=) on reload/share; in List, clicking a sortable header re-orders the rows and updates ?sort= (asc↔desc) with the active-sort indicator; the whole-row link still navigates in both views. (Per-row property columns — priority/assignee/reporter/due/estimate — render in both.)

A11y. Add BOTH /issues views (populated Tree AND List) to the STRICT shell-a11y axe sweep — the treegrid semantics from 2.5.2 and the List's sortable-header aria-sort (2.5.8) must hold on the real route. Reuse the shipped E2E helpers (shell-session.ts, workflow.ts) and the create flow to build fixtures.

Acceptance criteria

  • E2E covers: nested render + expand/collapse, filter (kind/status/assignee/text, ancestor-retained), inline status (legal + illegal) and assignee (reassign + unassign), empty state, row→detail navigation, cross-workspace isolation.
  • View-switcher (2.5.8): Tree↔List switch round-trips through ?view= (reload/share-safe); List sort by a column header round-trips through ?sort= (asc↔desc) and re-orders rows; the row link navigates in both views.
  • BOTH /issues views (populated Tree AND List) join the strict shell-a11y sweep with zero violations — treegrid roles/levels (2.5.2) + the List's aria-sort headers (2.5.8) correct.
  • SCALE check — runs against pnpm db:seed:large (2.5.16): on the seeded large project, the spec asserts the List paginates (page 1 shows the page size not all rows; Next/Prev/page-jump change ?page= and the visible range) and the Tree lazy-loads + virtualizes (a collapsed parent's children are NOT in the DOM until expanded; expanding fetches them; "Load more children" appears on a >page-size parent; the DOM row count stays bounded even with deep expansion). This is the verification that the finding-#57 scale work actually holds at real size — not just on a 7-node fixture.
  • Spec drives the real stack (Next + Postgres) via the shipped helpers; deterministic (no fixed sleeps); green on CI.

Context refs

  • tests/e2e/_helpers/shell-session.ts (1.5.6) + workflow.ts (2.2.7) + issue-create-edit-flow.spec.ts (2.3.8) — fixtures + conventions to mirror
  • pnpm db:seed:large (the 2.5.16 dev seed) — the large project the pagination + lazy-load/virtualization scale assertions run against
  • tests/e2e/shell-a11y.spec.ts — the strict sweep to extend (BOTH Tree + List views); the 2.5.3 route + 2.5.2 data-testid hooks
  • 2.5.8 IssueListToolbar / the [Tree ▾] menu + the List view + the ?view=/?sort= URL contract — the switcher behaviour to drive
  • playwright.config.ts webServer block
Status
Done
Type
Sub-task