export type { DynamicRelationKind } from './dynamic-relation-helpers'; export { buildCreatePayload, buildPivotAttachPayload, buildPivotRowIndex, buildRelationFilterParams, deriveRelationFormFields, diffSelection, extractSelectedTargetIds, formatRelationCell, objectLabel, pickOptionLabel, relationRowKey, } from './dynamic-relation-helpers'; export interface DynamicRelationStrings { title: string; emptyState: string; addLabel: string; editLabel: string; removeLabel: string; confirmRemoveTitle: string; confirmRemoveDescription: string; cancelLabel: string; saveLabel: string; selectPlaceholder: string; selectSearchPlaceholder: string; selectEmpty: string; /** Placeholder del buscador de la sub-tabla 1:N. */ searchPlaceholder: string; /** Pie de la sub-tabla: "{{loaded}} de {{total}}". */ countLabel: string; } interface CommonProps { /** id del registro padre. */ parentId: string | number; /** * Filtros estáticos extra (igualdad) aplicados ADEMÁS del foreign-key. * Caso polimórfico: una tabla de hijos compartida (attachments, * addresses) scopeada por `foreign_key=owner_id` Y `owner_model=Customer`. * Cada entrada se thread-ea como `f_=eq:` junto al FK en la query * de la lista hija. Aditivo: sin filters el comportamiento es idéntico. */ filters?: Record; /** Hidden columns; el FK siempre se oculta automáticamente. */ hiddenColumns?: string[]; /** * Contexto de sub-tabla de líneas dentro del MODAL de vista de un registro * padre. Cuando es true se aplican las reglas de {@link isColumnVisibleInLineSubtable} * — se ocultan por defecto las columnas de auditoría/sistema (created_by, * timestamps, organization_id) y las scopeadas a `visibility: "table"`, que * son ruido redundante bajo el registro padre. * * Default false: en una página de detalle autónoma (`/m//`) el * panel de relación conserva el comportamiento previo (solo oculta FK, scope * y columnas `hidden`), donde esas columnas SÍ son útiles. */ lineSubtable?: boolean; /** Permisos visibles. Default true. */ canCreate?: boolean; canDelete?: boolean; canEdit?: boolean; /** * Relación de solo lectura. Cuando es true fuerza canCreate/canEdit/canDelete * = false (AND con lo que pase el host: readonly siempre gana), escondiendo el * botón "Agregar", el ícono editar (Pencil) y el de eliminar (Trash2). Tolera * el alias camelCase `readOnly`. */ readonly?: boolean; /** Alias camelCase de `readonly`. */ readOnly?: boolean; /** Strings traducibles. */ strings?: Partial; /** Wrapper className. */ className?: string; /** Callback opcional cuando la selección o la lista cambia. */ onChange?: () => void; } export interface DynamicRelationOneToManyProps extends CommonProps { kind: 'one_to_many'; /** Modelo hijo (lado N) cuyas filas se listan filtradas por `foreignKey == parentId`. */ model: string; /** Foreign key del lado N que apunta al padre. */ foreignKey: string; /** Endpoint override; default `/data/${model}`. */ endpoint?: string; } export interface DynamicRelationManyToManyProps extends CommonProps { kind: 'many_to_many'; /** Tabla pivote (`through`). FK al padre vive acá como `foreignKey`. */ through: string; /** Tabla destino (`references`) sobre la que se hace multi-select. */ references: string; /** FK del pivot al padre. */ foreignKey: string; /** FK del pivot a la tabla destino (default `${references}_id`). */ referencesKey?: string; /** Override del endpoint del pivot; default `/data/${through}`. */ pivotEndpoint?: string; /** Override del endpoint del target; default `/data/${references}`. */ referencesEndpoint?: string; /** * Columna del target que se usa como label en el multi-select. Si no se * pasa, se infiere de la metadata (primer columna no-id, no-hidden). */ displayKey?: string; } export type DynamicRelationProps = DynamicRelationOneToManyProps | DynamicRelationManyToManyProps; export declare function DynamicRelation(props: DynamicRelationProps): import("react").JSX.Element; //# sourceMappingURL=dynamic-relation.d.ts.map