feat: Refactor tag and correspondent management to use canonical types and dedicated managers.

This commit is contained in:
2025-12-09 18:56:11 +01:00
parent ce821c1817
commit 3ccc1f6698
34 changed files with 790 additions and 427 deletions
@@ -2,6 +2,8 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react';
import type { ReactNode } from 'react';
import DocumentSummarySection, { DocumentSummarySectionProps } from './DocumentSummarySection';
import { describeDocumentSummary, extractDocumentMetadataPayload, type DocumentSummaryRow } from '../logic/documentSummary';
import type { Tag, Correspondent } from '../../types/documents';
import type { TagId, Identifier } from '../../types/identifiers';
type PanelTab = { id: string; label: string; render: (context?: Record<string, unknown>) => ReactNode };
@@ -14,7 +16,8 @@ type ContentState =
| { status: 'error'; data: null; error: unknown };
export interface DocumentInfoPanelProps {
document: DocumentSummarySectionProps['document'];
tagLookupById?: Map<TagId, Tag>;
correspondentLookupById?: Map<Identifier, Correspondent>;
summaryProps?: Omit<DocumentSummarySectionProps, 'document' | 'layout'>;
metadataItems?: DocumentSummaryRow[];
metadataPayload?: Record<string, unknown>;
@@ -50,6 +53,8 @@ export interface DocumentInfoPanelProps {
const DocumentInfoPanel: React.FC<DocumentInfoPanelProps> = ({
document,
tagLookupById,
correspondentLookupById,
summaryProps = {},
metadataItems: metadataItemsProp,
metadataPayload: metadataPayloadProp,
@@ -76,8 +81,9 @@ const DocumentInfoPanel: React.FC<DocumentInfoPanelProps> = ({
if (Array.isArray(metadataItemsProp) && metadataItemsProp.length) {
return metadataItemsProp;
}
return describeDocumentSummary(document);
}, [metadataItemsProp, document]);
return describeDocumentSummary(document, { tagLookupById, correspondentLookupById });
}, [metadataItemsProp, document, tagLookupById, correspondentLookupById]);
const metadataPayload = useMemo(() => {
if (metadataPayloadProp !== undefined) {
@@ -107,9 +113,10 @@ const DocumentInfoPanel: React.FC<DocumentInfoPanelProps> = ({
<DocumentSummarySection
document={document}
layout={summaryLayout}
correspondentLookupById={correspondentLookupById}
{...summaryProps}
/>
), [document, summaryLayout, summaryProps]);
), [document, summaryLayout, summaryProps, correspondentLookupById]);
const renderDetailsSection = useCallback(() => (
<section className={`${base}__section`}>