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 <noreply@anthropic.com>
This commit is contained in:
AI Assistant
2026-03-10 21:58:06 +02:00
parent 4ac4a48cad
commit 31565b418a
3 changed files with 34 additions and 7 deletions
@@ -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<Step>("category");
@@ -61,8 +64,8 @@ export function DeadlineAddDialog({
const [cuDurationMonths, setCuDurationMonths] = useState<number | null>(null);
const categories = useMemo(
() => getCategoriesForDirection(direction),
[direction],
() => getCategoriesForDirection(direction, documentType),
[direction, documentType],
);
const typesForCategory = useMemo(() => {
@@ -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}
/>
@@ -634,22 +634,37 @@ export const CATEGORY_LABELS: Record<DeadlineCategory, string> = {
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");
}
/**