feat/PBI-98-products-table #5

Merged
janpeter merged 11 commits from feat/PBI-98-products-table into main 2026-05-16 15:54:03 +02:00
Owner
No description provided.
- components/shared/sort-header.tsx: generic <SortHeader<TKey>> met
  active-state (ArrowUp/ArrowDown) en inactive (ArrowUpDown). Hergebruik
  voor zowel /ideas als /dashboard products-tabel.
- components/ideas/idea-list.tsx: refactor; lokale SortHeader-helper +
  ArrowUp/Down/UpDown imports vervangen door shared import.
- lib/user-settings.ts: nieuwe ProductsTablePrefs schema (search,
  includeArchived, sort enum, sortDir) onder ViewsPrefs.productsTable.
  Alle velden optional → defaults via component-fallbacks.
- __tests__/components/shared/sort-header.test.tsx: 6 tests (label,
  click-callback, active/inactive classes, custom className, svg-icoon).
- 1028 tests groen totaal; geen regressie in Ideas-tests.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- components/dashboard/products-table.tsx: client-component met shadcn
  Table-primitives. Kolommen: Code (CodeBadge) · Naam (+Actief-badge bij
  active product) · #PBI's (rechts, tabular-nums) · Status (alleen badge
  bij archived) · Bijgewerkt (nl-NL date) · Acties (placeholder voor
  T-1088).
- Filter/sort state via useUserSettingsStore.views.productsTable
  (search, includeArchived, sort, sortDir met defaults via fallbacks).
- handleSort wisselt asc↔desc bij dezelfde kolom; nieuwe kolom → asc.
- Rij-klik opent <ProductDialog mode="edit">; acties-cell heeft
  stopPropagation zodat klik op de cel niet dialog opent.
- ProductsTableRow shape = ProductDialogProduct + {archived, pbiCount,
  updated_at}.
- Empty-filter-result toont info-text in tbody; volledig-empty-state
  komt in T-1092.
- 1028 tests blijven groen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- components/dashboard/products-table-toolbar.tsx: client met Input
  search-veld (debounced 200ms via useEffect+setTimeout) en checkbox
  "Inclusief gearchiveerd". State leeft in
  useUserSettingsStore.views.productsTable (server-persisted via setPref).
- Lokale state voor input zodat typen vlot blijft; cleanup-functie in
  useEffect voorkomt update na unmount.
- Archived-toggle schrijft direct (één klik = één call).
- 1028 tests blijven groen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- components/dashboard/product-row-actions.tsx: inline knoppen
  Activeer (via ActivateProductButton) of "Actief"-badge,
  Docs (BookOpen-icon → /docs), Open backlog (ArrowRight-icon →
  /products/[id]). Dropdown (•••) met Archiveer/Herstel toggle.
- Archive: archiveProductAction (redirect /dashboard) of
  restoreProductAction (success + router.refresh).
- Verwijderen-item komt in T-1089 zodra deleteProductAction bestaat.
- DemoTooltip op dropdown-trigger (writes blokkeren); Docs/Backlog
  blijven klikbaar voor demo.
- Wires ProductRowActions in ProductsTable acties-kolom.
- 1028 tests blijven groen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- actions/products.ts: nieuwe owner-only deleteProductAction (demo-403,
  scope-check via user_id, transaction: null active_product_id + delete).
  Cascade-deletes voor PBI/Story/Task/Doc gebeuren via Prisma onDelete:
  Cascade in schema.
- components/dashboard/delete-product-confirm.tsx: controlled AlertDialog
  (open/onOpenChange) zodat dropdown-item kan triggeren. Bevestiging
  roept deleteProductAction; success → toast + router.refresh.
- ProductRowActions: Verwijderen-item toegevoegd in dropdown (na
  Separator), text-destructive styling. Opent DeleteProductConfirm via
  lokale state.
- ProductsTable doorgeeft product.name aan ProductRowActions zodat de
  confirm-dialog de naam kan tonen.
- 1028 tests blijven groen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- app/(app)/dashboard/page.tsx: vervang ProductList-grid door
  ProductsTable + ProductsTableToolbar. Data-fetch met
  include: { _count: { select: { pbis: true } } } — geen N+1 voor
  #PBI's-kolom. Geen archived-searchParam meer; filter zit nu
  client-side in useUserSettingsStore via toolbar.
- max-w-4xl → max-w-6xl voor de bredere tabel.
- Verwijderd:
  - components/dashboard/product-list.tsx (grid, obsolete)
  - __tests__/components/dashboard/product-list.test.tsx
- 1024 tests blijven groen (1028 → 1024 door obsolete ProductList-tests).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Edit-mode-only cross-link in de dialog-footer naar /products/[id]/docs/
settings. Layout: footer is nu flex justify-between met de link links en
de bestaande knoppen (Annuleren + Opslaan) rechts. Create-mode behoudt
right-aligned knoppen via placeholder-span.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- components/dashboard/products-empty-state.tsx: nieuwe component met
  rounded-xl container, NL-tekst, en NewProductButton (verborgen in demo).
- ProductsTable: vroege return ProductsEmptyState bij products.length===0.
- __tests__/components/dashboard/products-empty-state.test.tsx: 4 tests
  (tekst, NewProductButton zichtbaar/verborgen op demo, container-styling).
- __tests__/components/dashboard/product-row-actions.test.tsx: 7 tests
  (Activeer/Actief-badge zichtbaarheid per state, Docs/Backlog aria-labels,
  Meer-acties-knop disabled in demo). Mocks: next/navigation, sonner,
  actions/products + actions/active-product.
- 1035 tests groen totaal.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- docs/specs/functional.md §F-03: vervang oude grid-acceptance door
  twee blokken: 'CRUD via dialog' (incl. cross-link, delete-confirm,
  cascade-delete) en 'tabel /dashboard' (kolommen, sort, search,
  archived-toggle, rij-klik, acties-kolom, demo-policy, empty-state).
  Data-sectie verwijst naar nieuwe enabled_doc_folders en
  users.settings.views.productsTable.
- docs/specs/dialogs/product.md: nieuwe sectie "Cross-link 'Naar
  docs-instellingen' (PBI-98)" beschrijft layout + gedrag. "Bewust NIET
  in v1"-sectie: archiveProductAction → deleteProductAction.
- ST-E hiermee compleet.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- components/products/product-subnav.tsx: verwijderd. Sub-nav-laag
  (Backlog/Sprint/Solo/Docs/Instellingen) bleek overbodig — navigatie
  tussen sub-pages gebeurt al via page-headers en top-nav.
- app/(app)/products/[id]/layout.tsx: terug naar minimale layout
  (SetCurrentProduct + children). showDocs-berekening en import van
  ProductSubNav weg.
- Defensieve guard `(product.enabled_doc_folders ?? []).length > 0`
  in fix/product-layout-enabled-docs-guard branch wordt obsolete door
  deze cleanup — sluit die PR ongemerged na PBI-98 merge.
- 1035 tests blijven groen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat(PBI-98/T-1095): Docs-link op /products/[id] page-header
Some checks are pending
CI / Lint, Typecheck, Test & Build (pull_request) Waiting to run
CI / Detect deploy-relevant changes (pull_request) Blocked by required conditions
CI / Deploy Preview (PR) (pull_request) Blocked by required conditions
CI / Deploy Production (main) (pull_request) Blocked by required conditions
CI / Deploy Manual (workflow_dispatch) (pull_request) Waiting to run
2fc7bec3ad
Voegt een "Docs"-link toe vóór de bestaande "Instellingen"-link in de
product-backlog-page-header (regel 154). Zelfde styling (text-xs
text-muted-foreground hover:text-foreground). Vervangt navigatie die
voorheen via ProductSubNav verliep (T-1094).

Geen wijziging in docs/architecture/product-docs.md nodig — bevat geen
ProductSubNav-mention (grep gaf 0 hits). ST-F hiermee compleet.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/Scrum4Me!5
No description provided.