From 8e2534ebe3d07292f6b28fd84ad99ac6b3c3c457 Mon Sep 17 00:00:00 2001 From: AI Assistant Date: Fri, 13 Mar 2026 21:10:34 +0200 Subject: [PATCH] feat: quick contact dialog from registratura supports name OR company - QuickContactDialog now has Company/Organization field - Either name or company is required (same logic as address book) - Auto-sets type to "institution" when only company is provided - Display name in registry form uses company as fallback Co-Authored-By: Claude Opus 4.6 --- .../components/quick-contact-dialog.tsx | 62 ++++++++++++++----- .../components/registratura-module.tsx | 5 +- .../components/registry-entry-form.tsx | 9 ++- 3 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/modules/registratura/components/quick-contact-dialog.tsx b/src/modules/registratura/components/quick-contact-dialog.tsx index c26b3cd..411c6e7 100644 --- a/src/modules/registratura/components/quick-contact-dialog.tsx +++ b/src/modules/registratura/components/quick-contact-dialog.tsx @@ -13,17 +13,24 @@ import { DialogFooter, } from "@/shared/components/ui/dialog"; +export interface QuickContactData { + name: string; + company: string; + phone: string; + email: string; +} + interface QuickContactDialogProps { open: boolean; onOpenChange: (open: boolean) => void; /** Pre-filled name from the text the user typed */ initialName: string; - onConfirm: (data: { name: string; phone: string; email: string }) => void; + onConfirm: (data: QuickContactData) => void; } /** * Rapid popup for creating a new Address Book contact from Registratura. - * Only requires Name; Phone and Email are optional. + * Requires either Name or Company; Phone and Email are optional. */ export function QuickContactDialog({ open, @@ -32,27 +39,34 @@ export function QuickContactDialog({ onConfirm, }: QuickContactDialogProps) { const [name, setName] = useState(initialName); + const [company, setCompany] = useState(""); const [phone, setPhone] = useState(""); const [email, setEmail] = useState(""); // Sync name with initialName whenever the dialog opens - // (useState(initialName) only works on first mount; controlled open - // bypasses onOpenChange so we need useEffect) useEffect(() => { if (open) { setName(initialName); + setCompany(""); setPhone(""); setEmail(""); } }, [open, initialName]); + const hasIdentifier = name.trim() || company.trim(); + const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); // Stop propagation so the submit doesn't bubble through the React portal // to the outer registry-entry-form, which would close the whole form. e.stopPropagation(); - if (!name.trim()) return; - onConfirm({ name: name.trim(), phone: phone.trim(), email: email.trim() }); + if (!hasIdentifier) return; + onConfirm({ + name: name.trim(), + company: company.trim(), + phone: phone.trim(), + email: email.trim(), + }); }; return ( @@ -65,15 +79,31 @@ export function QuickContactDialog({
-
- - setName(e.target.value)} - className="mt-1" - required - autoFocus - /> + {!hasIdentifier && ( +

+ Completează cel puțin Numele sau Compania/Organizația. +

+ )} +
+
+ + setName(e.target.value)} + className="mt-1" + required={!company.trim()} + autoFocus + /> +
+
+ + setCompany(e.target.value)} + className="mt-1" + required={!name.trim()} + /> +
@@ -104,7 +134,7 @@ export function QuickContactDialog({ > Anulează - diff --git a/src/modules/registratura/components/registratura-module.tsx b/src/modules/registratura/components/registratura-module.tsx index 543d6af..49cb9ab 100644 --- a/src/modules/registratura/components/registratura-module.tsx +++ b/src/modules/registratura/components/registratura-module.tsx @@ -93,6 +93,7 @@ export function RegistraturaModule() { const handleCreateContact = useCallback( async (data: { name: string; + company: string; phone: string; email: string; }): Promise => { @@ -101,8 +102,8 @@ export function RegistraturaModule() { const contact: AddressContact = { id: uuid(), name: data.name, - company: "", - type: "collaborator", + company: data.company, + type: data.company && !data.name ? "institution" : "collaborator", email: data.email, email2: "", phone: data.phone, diff --git a/src/modules/registratura/components/registry-entry-form.tsx b/src/modules/registratura/components/registry-entry-form.tsx index ac0097d..1efc441 100644 --- a/src/modules/registratura/components/registry-entry-form.tsx +++ b/src/modules/registratura/components/registry-entry-form.tsx @@ -100,6 +100,7 @@ interface RegistryEntryFormProps { /** Callback to create a new Address Book contact */ onCreateContact?: (data: { name: string; + company: string; phone: string; email: string; }) => Promise; @@ -513,15 +514,17 @@ export function RegistryEntryForm({ const handleQuickContactConfirm = async (data: { name: string; + company: string; phone: string; email: string; }) => { if (!onCreateContact) return; const contact = await onCreateContact(data); if (contact) { - const displayName = contact.company - ? `${contact.name} (${contact.company})` - : contact.name; + const displayName = + contact.name && contact.company + ? `${contact.name} (${contact.company})` + : contact.name || contact.company; if (quickContactField === "sender") { setSender(displayName); setSenderContactId(contact.id);