import type { Control, FieldValues, UseFormSetValue } from 'react-hook-form'; import type { IMasterDocumentAdapter } from '../../adapter/MasterDocumentAdapter.types'; import type { SerialSupportConfig } from '../../template/MasterDocumentTemplate.types'; import type { SerialPanelProps } from '../SerialPanel'; type ValidateSerialFn = NonNullable; type FetchAvailableSerialsFn = NonNullable; export interface UseSerialPanelParams { /** `layout.detail.serialSupport` del template. Si se omite, el panel queda inactivo. */ serialSupport?: SerialSupportConfig; /** `control` del formulario de la línea (react-hook-form). */ control: Control; /** `setValue` del formulario de la línea (para gestionar el campo virtual `serial_ids`). */ setValue: UseFormSetValue; /** * Solo lectura: el documento está fuera del estado editable. El contenedor * resuelve el criterio (mismo que usa `LineFormModal` para `editableOn`). */ readOnly?: boolean; /** * Transición open→true del modal: re-siembra el estado del panel desde * `initialData` (precarga en edición) y resetea búsqueda/paginación. */ open?: boolean; /** Datos iniciales de la línea (para precargar `serial_ids` en edición). */ initialData?: Record; /** `adapter.validateSerial` — requerido en modo `capture`. */ validateSerial?: ValidateSerialFn; /** `adapter.fetchAvailableSerials` — requerido en modo `select`. */ fetchAvailableSerials?: FetchAvailableSerialsFn; } export interface UseSerialPanelResult { /** `true` cuando el panel debe renderizarse (mode ≠ none y el ítem es serializado). */ isActive: boolean; /** * `true` cuando el gating de Guardar está satisfecho: * `serial_ids.length === M` (o el panel está inactivo / no soportado). */ isComplete: boolean; /** Cantidad requerida `M` (en vivo desde `quantityField`). */ required: number; /** Seriales actualmente registrados en `serial_ids`. */ count: number; /** Clave del campo virtual donde viajan los IDs de seriales. */ serialIdsField: string; /** `true` cuando el adapter no implementa el método requerido por el `mode`. */ unsupported: boolean; /** Mensaje a mostrar cuando `unsupported` es `true`. */ unsupportedMessage: string | null; /** Props listos para ``. `null` si no aplica. */ panelProps: SerialPanelProps | null; } /** * Hook contenedor del soporte nativo de seriales (FASE 2). * * Vive dentro de `LineFormModal`: lee `serialSupport`, observa el form de la * línea (trigger, cantidad, ítem, bodega, lote), gestiona el campo virtual * `serial_ids` y cablea el adapter (`validateSerial` para `capture`, * `fetchAvailableSerials` paginado server-side para `select`). * * Reglas: * - El panel solo se muestra cuando `triggerField` (default `_itemIsSerialized`) * es truthy. Si no, no gatea Guardar (comportamiento idéntico al actual). * - La cantidad requerida `M` se lee en vivo de `quantityField`. * - Al cambiar la CANTIDAD se conservan los seriales (el badge revalida solo). * - Al cambiar el ÍTEM (`itemField`) se limpian los seriales. * - `readOnly` desactiva la edición fuera del estado editable. * - Degrada con un mensaje claro si el adapter no implementa el método del `mode`. * * @see SerialPanel — componente presentacional que recibe `panelProps`. */ export declare function useSerialPanel({ serialSupport, control, setValue, readOnly, open, initialData, validateSerial, fetchAvailableSerials, }: UseSerialPanelParams): UseSerialPanelResult; export {}; //# sourceMappingURL=useSerialPanel.d.ts.map