import type { DocumentNavigationContext } from './SmartMasterDocument'; import type { WizardOption } from '../MasterDocument.types'; /** * Contexto de creación entregado a `onCreateDocument`. * * Coincide con los cuatro argumentos de `adapter.getNewDocument` / * `adapter.createDocument`, así que la ruta destino del host puede resolver el * estado inicial por su cuenta, sin datos adicionales y sin depender de estado * en memoria que un F5 destruiría. */ export interface MasterDocumentPageCreateContext { /** * Clase del documento ya resuelta: la elegida en el paso de clase del wizard cuando el * consumidor pasa `documentClasses`; si no, la prop `documentClass` o * `template.identity.documentClass`. */ documentClass: string; /** Compañía elegida en el wizard. */ companyId: string; /** Centro de operación elegido en el wizard. */ operationCenterId: string; /** Tipo de documento elegido en el wizard. */ documentTypeId: string; } export interface MasterDocumentPageProps { /** Clase del documento. Fallback: template.identity.documentClass */ documentClass?: string; /** * Clases que esta superficie puede crear. Habilita el paso de CLASE en el * wizard, entre compañía y centro de operación. * * Solo tiene sentido cuando una misma página sirve a más de una clase (p.ej. * nota crédito de venta y nota crédito de venta de solo valor): la clase no se * puede derivar del tipo de documento —la relación es N:M— así que pasa a ser * un dato que captura el usuario. **Ausente ⇒ nada cambia**: la clase sigue * siendo la constante de `documentClass` / `template.identity.documentClass`. * * Se espera la lista ya filtrada por permisos de creación del usuario: el kit * no la filtra. Con una sola clase, la página la preselecciona. * * `documentClass` y `documentClasses` son alternativas, no complementos: con este * prop presente, `documentClass` queda inerte. * * ⚠️ Si la lista se resuelve de forma asíncrona, NO montes la página hasta tenerla. * Un array ausente o vacío equivale a "superficie de una sola clase", así que * durante la carga el wizard mostraría tres pasos y crearía el documento con la * clase pineada. El fallo es silencioso: nace un documento de la clase equivocada. * * Cuando está presente, la clase ELEGIDA es la que viaja al filtro de tipos de * documento, a `getNewDocument` y a `createDocument`; y el listado se pide para * TODAS las clases declaradas (`filters.documentClasses`), porque un visor * compartido lista los documentos de ambas. */ documentClasses?: WizardOption[]; /** Compañía del contexto del usuario (obligatorio) */ companyId: string; /** Centro de operación del contexto del usuario (obligatorio) */ operationCenterId: string; /** Si se pasa, arranca directo en el documento (edit/view). Si no, en el listado. */ documentId?: string; /** * Clic sobre una fila del listado. * @default Abre el documento en línea, en modo edición. */ onRowClick?: (row: Record) => void; /** * Acción de fila «Ver detalle». * @default Abre el documento en línea, en modo solo lectura. */ onViewRow?: (row: Record) => void; /** * Acción de fila «Editar». * @default Abre el documento en línea, en modo edición. */ onEditRow?: (row: Record) => void; /** * URL del detalle de una fila, para que «Ver»/«Editar» se pinten como enlace y * el usuario recupere Ctrl/⌘+clic, clic con la rueda y «Abrir en pestaña nueva». * Ver `DocumentListProps.getRowHref`. * * **Sólo hace falta declararlo cuando el HOST gobierna la navegación** (pasa * `onEditRow`/`onViewRow` y navega con su router): ahí únicamente él conoce la * ruta. Constrúyela con el router —`router.buildLocation({...}).href` en * TanStack— y nunca concatenando cadenas, o en modo microfrontend el enlace * saldría sin el basepath y la pestaña nueva caería en una ruta inexistente. * * @default Cuando la navegación la resuelve esta página en línea, calcula el * `href` ella misma a partir de la URL actual (`?doc=`, más `&mode=view` * para «Ver»), que es exactamente la URL que ya escribe al abrir el detalle y * la que restaura al montar. */ getRowHref?: (row: Record, action: 'view' | 'edit') => string | undefined; /** * Confirmación del wizard de creación. * * ⚠️ El documento AÚN NO EXISTE en el backend, así que no hay `documentId` que * entregar. Cuando se delega, `adapter.getNewDocument` NO se invoca: la ruta * destino resuelve el estado inicial con el contexto recibido, de modo que sea * recargable por URL. * * @default Resuelve el estado inicial vía `getNewDocument` y abre el documento nuevo en línea. */ onCreateDocument?: (context: MasterDocumentPageCreateContext) => void; /** * Documento recién creado desde el modal «crear a partir de origen». * * A diferencia de `onCreateDocument`, aquí el documento YA EXISTE en el backend * y llega su id real. * * @default Abre el documento creado en línea, en modo edición. */ onDocumentCreated?: (documentId: string) => void; /** * Navegación a OTRO documento existente pedida desde el detalle abierto en línea: un * nodo del grafo de trazabilidad, o el documento recién generado por un cruce. * * @default Intercepta el pseudo-key `navigate_document:` en su adapter y abre el documento en línea. */ onNavigateToDocument?: (documentId: string, context: DocumentNavigationContext) => void; } /** * MasterDocumentPage — Punto de entrada único por clase de documento. * * Recibe la compañía y centro de operación del contexto del usuario. * El wizard solo pide el tipo de documento — compañía y CO ya están seteados. * * @example * ```tsx * * * * ``` * * @example Delegando la navegación a las rutas del host * ```tsx * // La página no abre el documento en línea: enruta a las pantallas propias del * // host, donde éste puede montar bloques que el kit no conoce. * y TS no interpola `unknown`. * onRowClick={(row) => navigate(`/notas-credito/${String(row.id)}/edit`)} * onViewRow={(row) => navigate(`/notas-credito/${String(row.id)}`)} * onEditRow={(row) => navigate(`/notas-credito/${String(row.id)}/edit`)} * onCreateDocument={(ctx) => navigate(`/notas-credito/nuevo?tipo=${ctx.documentTypeId}`)} * onDocumentCreated={(id) => navigate(`/notas-credito/${id}/edit`)} * onNavigateToDocument={(id, { reason }) => * navigate(reason === 'traceability' ? `/notas-credito/${id}` : `/notas-credito/${id}/edit`)} * /> * ``` */ export declare function MasterDocumentPage({ documentClass, documentClasses, companyId, operationCenterId, documentId, onRowClick, onViewRow, onEditRow, getRowHref, onCreateDocument, onDocumentCreated, onNavigateToDocument, }: MasterDocumentPageProps): import("react/jsx-runtime").JSX.Element; //# sourceMappingURL=MasterDocumentPage.d.ts.map