feat(documents): AggregatedSection + useAggregatedListing

Two TanStack Query hooks fetch the entity-aggregated payload for files
and workflows; AggregatedSection renders one labelled subsection per
owner-source group with a Show all (N) button wired via the onShowAll
callback. Dumb component — parent owns the row rendering + drill-
through navigation (Task 15 composes this into EntityFolderView).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-11 12:26:57 +02:00
parent e5e2e68e5d
commit 03738bfa9a
2 changed files with 175 additions and 0 deletions

View File

@@ -0,0 +1,63 @@
'use client';
import { useQuery } from '@tanstack/react-query';
import { apiFetch } from '@/lib/api/client';
export interface AggregatedFile {
id: string;
filename: string;
mimeType: string | null;
createdAt: string;
folderId: string | null;
clientId: string | null;
companyId: string | null;
yachtId: string | null;
}
export interface AggregatedWorkflow {
id: string;
title: string;
status: string;
documentType: string;
updatedAt: string;
createdAt: string;
}
export interface AggregatedGroup<T> {
label: string;
source: 'direct' | 'client' | 'company' | 'yacht';
files?: T[];
workflows?: T[];
total: number;
}
export function useAggregatedFiles(
entityType: 'client' | 'company' | 'yacht' | undefined,
entityId: string | undefined,
) {
return useQuery<AggregatedGroup<AggregatedFile>[]>({
queryKey: ['files', 'aggregated', entityType, entityId],
queryFn: () =>
apiFetch<{ data: { groups: AggregatedGroup<AggregatedFile>[] } }>(
`/api/v1/files?entityType=${entityType}&entityId=${entityId}`,
).then((r) => r.data.groups),
enabled: Boolean(entityType && entityId),
staleTime: 10_000,
});
}
export function useAggregatedWorkflows(
entityType: 'client' | 'company' | 'yacht' | undefined,
entityId: string | undefined,
) {
return useQuery<AggregatedGroup<AggregatedWorkflow>[]>({
queryKey: ['documents', 'aggregated', entityType, entityId],
queryFn: () =>
apiFetch<{ data: { groups: AggregatedGroup<AggregatedWorkflow>[] } }>(
`/api/v1/documents?entityType=${entityType}&entityId=${entityId}`,
).then((r) => r.data.groups),
enabled: Boolean(entityType && entityId),
staleTime: 10_000,
});
}