import { type FeatureEntity } from '../../DynamicEntities/admin/services/FeatureService'; import type { DynamicEntitiesRef } from '../../DynamicEntities/ui/DynamicEntities'; import type { DynamicEntitiesTemplateConfig } from '../template/MasterDocumentTemplate.types'; /** Sufijo por defecto de cada grano. Espeja los que siembra el backend del host. */ declare const DEFAULT_SUFFIX: { readonly header: "HEADER"; readonly line: "LINE"; }; export type DocumentDynamicGrainKey = keyof typeof DEFAULT_SUFFIX; /** * Un grano ya resuelto: el Feature existe, tiene entidades renderizables y sus * refs se pueden registrar y guardar. */ export interface DocumentDynamicGrain { /** Código del Feature realmente consultado. */ featureCode: string; /** Entidades a pintar, ya filtradas y ordenadas. */ entities: FeatureEntity[]; /** Título del bloque tal como lo declaró el template (crudo). */ label?: string; /** Clave i18n del título declarada por el template. */ labelKey?: string; /** Registra (o desregistra, con `null`) el ref imperativo de una entidad. */ registerRef: (entityCode: string, ref: DynamicEntitiesRef | null) => void; /** * Persiste los valores de TODAS las entidades registradas contra `recordId`. * Nunca lanza: un fallo se reporta por el `onError` del provider y vuelve * como `false`. */ save: (recordId: string) => Promise; /** Olvida los refs registrados. Se llama al cerrar el modal de línea. */ clearRefs: () => void; } export interface DocumentDynamicEntitiesHandle { /** `true` solo si hay provider Y el template declaró al menos un grano. */ enabled: boolean; header: DocumentDynamicGrain | null; line: DocumentDynamicGrain | null; } interface UseDocumentDynamicEntitiesParams { config?: DynamicEntitiesTemplateConfig; /** Clase del documento en curso — la del estado, no la del template. */ documentClass: string; } /** * Resuelve los campos adicionales (EAV) de un documento y orquesta su guardado. * * ## Por qué el Feature se consulta y no se asume * * El template solo dice *que* el documento admite campos adicionales; **cuáles** * son lo decide el administrador en la pantalla de Entidades Dinámicas, y puede * cambiar sin desplegar. Por eso se pide el Feature por código en runtime y se * pinta lo que traiga: un Feature sin entidades ⇒ ningún bloque, exactamente como * un documento que no declara la capacidad. * * ## Degradaciones deliberadas (ninguna rompe el documento) * * - **Sin `DynamicEntitiesProvider`** ⇒ `enabled: false` y todo inerte. Es la * situación de cualquier host que aún no cableó la capacidad, y de todos los * tests y stories que montan el documento suelto. * - **Feature inexistente (404)** ⇒ se trata como "esta clase no tiene campos * adicionales". Es el caso normal de una clase cuyo grano el backend no siembra * (el catálogo está acotado por los flags de la clase), no un error que merezca * un toast al usuario. * - **Cualquier otro fallo** ⇒ se reporta por el `onError` del provider y el * grano queda vacío. El documento sigue guardándose. * * ## Modales, fuera * * De los tres `renderMode` del paquete se pintan `inline` y `tab`. `modal` se * ignora a propósito: el documento ya tiene su propia capa de modales (línea, * acciones, cruce) y abrir otro nivel desde dentro del formulario de captura es * una trampa de foco, no una funcionalidad. */ export declare function useDocumentDynamicEntities({ config, documentClass, }: UseDocumentDynamicEntitiesParams): DocumentDynamicEntitiesHandle; export {}; //# sourceMappingURL=useDocumentDynamicEntities.d.ts.map