feat(PBI-96/T-1071): DisabledFolderBanner + integratie (P2-fix)

- components/product-docs/disabled-folder-banner.tsx: server-component
  banner met AlertTriangle, status-blocked-tokens, en link naar settings.
  Tekst legt uit: "lezen mag, nieuwe/edit kan niet, delete wél (cleanup)".
- Integratie in folder-page: render banner als !isFolderEnabled; de
  bestaande conditional verbergt de "Nieuwe doc"-knop al.
- Integratie in detail-page: render banner als !isFolderEnabled; de
  bestaande conditional verbergt de Edit-knop al. Delete blijft
  zichtbaar voor cleanup (zoals plan §C.4 voorschrijft).
- ST-D is hiermee compleet — alle 5 UI-tasks gereed. Directe URLs naar
  disabled folders blijven leesbaar (P2-review-fix volledig).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Janpeter Visser 2026-05-16 14:34:03 +02:00
parent a59c35b9ae
commit a892ff83ca
3 changed files with 50 additions and 0 deletions

View file

@ -19,6 +19,7 @@ import { FOLDER_LABELS } from '@/components/product-docs/product-docs-index'
import { ProductDocViewer } from '@/components/product-docs/product-doc-viewer'
import { ProductDocEditor } from '@/components/product-docs/product-doc-editor'
import { DeleteProductDocButton } from '@/components/product-docs/delete-product-doc-button'
import { DisabledFolderBanner } from '@/components/product-docs/disabled-folder-banner'
interface Props {
params: Promise<{ id: string; folder: string; slug: string }>
@ -113,6 +114,8 @@ export default async function ProductDocDetailPage({
)}
</div>
{!isFolderEnabled && <DisabledFolderBanner productId={id} />}
{isEditMode ? (
<ProductDocEditor
docId={doc.id}

View file

@ -19,6 +19,7 @@ import {
type ProductDocListRow,
} from '@/components/product-docs/product-docs-folder-list'
import { NewProductDocDialog } from '@/components/product-docs/new-product-doc-dialog'
import { DisabledFolderBanner } from '@/components/product-docs/disabled-folder-banner'
interface Props {
params: Promise<{ id: string; folder: string }>
@ -91,6 +92,8 @@ export default async function ProductDocsFolderPage({ params }: Props) {
)}
</div>
{!isFolderEnabled && <DisabledFolderBanner productId={id} />}
<ProductDocsFolderList productId={id} folderApi={folderApi} docs={rows} />
</div>
)

View file

@ -0,0 +1,44 @@
// Banner voor pages die naar een disabled folder verwijzen. Server-component.
//
// P2-review-fix uit
// docs/recommendations/product-docs-storage-system-review-2026-05-16.md:
// disabled folder is "verborgen maar leesbaar" — directe URLs blijven werken,
// maar mutaties zijn uitgeschakeld in de UI. Banner maakt de staat zichtbaar.
import Link from 'next/link'
import { AlertTriangle } from 'lucide-react'
import { debugProps } from '@/lib/debug'
interface Props {
productId: string
}
export function DisabledFolderBanner({ productId }: Props) {
return (
<div
className="rounded-md border border-status-blocked/30 bg-status-blocked/10 p-3 flex items-start gap-2"
{...debugProps(
'disabled-folder-banner',
'DisabledFolderBanner',
'components/product-docs/disabled-folder-banner.tsx',
)}
>
<AlertTriangle className="size-4 text-status-blocked shrink-0 mt-0.5" />
<div className="text-xs space-y-1 flex-1">
<p className="font-medium text-status-blocked">Folder uitgeschakeld</p>
<p className="text-muted-foreground">
Deze folder staat uit in de instellingen. Bestaande docs blijven
leesbaar; nieuwe docs kunnen niet worden aangemaakt en bestaande
kunnen niet worden bewerkt. Verwijderen is wel mogelijk voor cleanup.
</p>
<Link
href={`/products/${productId}/docs/settings`}
className="inline-block text-primary hover:underline mt-1"
>
Folder-instellingen openen
</Link>
</div>
</div>
)
}