From 31565b418affca27c2dfdf932fbf58db37d8e8f8 Mon Sep 17 00:00:00 2001 From: AI Assistant Date: Tue, 10 Mar 2026 21:58:06 +0200 Subject: [PATCH] fix: doc type persistence on edit + filter deadlines by document type - Fix doc type showing "altele" after edit: preserve initial documentType in allDocTypes map even if not in defaults or Tag Manager - Filter deadline categories by document type: only cerere/aviz unlock full permitting categories (CU, avize, urbanism, autorizare) - Other doc types (scrisoare, notificare, etc.) only get completari + contestatie as deadline categories - Add completari to intrat direction (was missing) - Pass documentType to DeadlineAddDialog for category filtering Co-Authored-By: Claude Opus 4.6 --- .../components/deadline-add-dialog.tsx | 7 ++++-- .../components/registry-entry-form.tsx | 11 ++++++++- .../registratura/services/deadline-catalog.ts | 23 +++++++++++++++---- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/modules/registratura/components/deadline-add-dialog.tsx b/src/modules/registratura/components/deadline-add-dialog.tsx index 1608a96..5177f85 100644 --- a/src/modules/registratura/components/deadline-add-dialog.tsx +++ b/src/modules/registratura/components/deadline-add-dialog.tsx @@ -30,6 +30,8 @@ interface DeadlineAddDialogProps { onOpenChange: (open: boolean) => void; entryDate: string; direction: RegistryDirection; + /** Document type — filters which deadline categories are available */ + documentType?: string; /** Callback: typeId, startDate, options (CJ toggle etc.) */ onAdd: ( typeId: string, @@ -45,6 +47,7 @@ export function DeadlineAddDialog({ onOpenChange, entryDate, direction, + documentType, onAdd, }: DeadlineAddDialogProps) { const [step, setStep] = useState("category"); @@ -61,8 +64,8 @@ export function DeadlineAddDialog({ const [cuDurationMonths, setCuDurationMonths] = useState(null); const categories = useMemo( - () => getCategoriesForDirection(direction), - [direction], + () => getCategoriesForDirection(direction, documentType), + [direction, documentType], ); const typesForCategory = useMemo(() => { diff --git a/src/modules/registratura/components/registry-entry-form.tsx b/src/modules/registratura/components/registry-entry-form.tsx index 31fdb30..9776d96 100644 --- a/src/modules/registratura/components/registry-entry-form.tsx +++ b/src/modules/registratura/components/registry-entry-form.tsx @@ -149,12 +149,20 @@ export function RegistryEntryForm({ map.set(key, label); } } + // Preserve initial doc type even if not in defaults or Tag Manager + // (e.g., custom type whose tag was deleted, or tag not yet loaded) + if (initial?.documentType && !map.has(initial.documentType)) { + const fallbackLabel = + initial.documentType.charAt(0).toUpperCase() + + initial.documentType.slice(1).replace(/-/g, " "); + map.set(initial.documentType, fallbackLabel); + } // Sort alphabetically by label const sorted = new Map( [...map.entries()].sort((a, b) => a[1].localeCompare(b[1], "ro")), ); return sorted; - }, [docTypeTags, localCustomTypes]); + }, [docTypeTags, localCustomTypes, initial?.documentType]); // When replyTo is provided, flip direction (intrat→iesit, iesit→intrat) const replyDirection: RegistryDirection | undefined = replyTo @@ -1497,6 +1505,7 @@ export function RegistryEntryForm({ onOpenChange={setDeadlineAddOpen} entryDate={date} direction={direction} + documentType={documentType} onAdd={handleAddDeadline} /> diff --git a/src/modules/registratura/services/deadline-catalog.ts b/src/modules/registratura/services/deadline-catalog.ts index 2766839..706539f 100644 --- a/src/modules/registratura/services/deadline-catalog.ts +++ b/src/modules/registratura/services/deadline-catalog.ts @@ -634,22 +634,37 @@ export const CATEGORY_LABELS: Record = { contestatie: "Contestatie", }; -/** Which categories are shown for each direction */ +/** Full categories available per direction (before doc type filtering) */ export const DIRECTION_CATEGORIES: Record< RegistryDirection, DeadlineCategory[] > = { iesit: ["certificat", "avize", "urbanism", "autorizare", "completari"], - intrat: ["contestatie"], + intrat: ["completari", "contestatie"], }; /** - * Get the ordered list of categories for a given direction. + * Document types that unlock the full set of construction permitting categories. + * Other doc types (scrisoare, notificare, etc.) only get completari + contestatie. + */ +const FULL_DEADLINE_DOC_TYPES = new Set(["cerere", "aviz"]); + +/** + * Get the ordered list of deadline categories for a given direction + document type. + * - "cerere" / "aviz" doc types → full set (CU, avize, urbanism, autorizare, completari, contestatie) + * - All other doc types (scrisoare, notificare, etc.) → only completari + contestatie */ export function getCategoriesForDirection( direction: RegistryDirection, + documentType?: string, ): DeadlineCategory[] { - return DIRECTION_CATEGORIES[direction]; + const all = DIRECTION_CATEGORIES[direction]; + // If doc type triggers full permitting flow, show all categories for this direction + if (!documentType || FULL_DEADLINE_DOC_TYPES.has(documentType)) { + return all; + } + // Otherwise, only completari + contestatie + return all.filter((c) => c === "completari" || c === "contestatie"); } /**