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