/** * Tipos base y genéricos para el Dashboard Engine. * Estos tipos NO están acoplados a ningún módulo de negocio específico (Comercial, RRHH, etc.). */ export interface WidgetDefinitionBase { widget_id: string; nombre: string; descripcion: string; categoria: string; tipo: string; icono: string; col_min: number; col_max: number; altura_default: number; cols_default: number; orden_default?: number; activo?: boolean; /** * 🔴 **Quién es el dueño, si lo hay.** El dato ya viajaba —el catálogo lo manda— pero el tipo no * lo admitía, así que quien lo consumiera desde aquí lo veía `undefined` SIEMPRE. * * Importa porque es lo único que distingue un **tablero personal** de un **sembrado**: con * dueño, «privado» se lo reserva a esa persona y el administrador no entra; sin dueño no hay a * quién reservárselo, y lo ven todos los administradores de esa vertical. Declararlo `undefined` * por omisión hacía que el diálogo de acceso rotulara un tablero personal como «solo * administradores» — exactamente al revés. */ propietario_id?: string | null; /** * Lo que ESTE usuario puede hacer con ESTE widget, ya resuelto por el servidor. Opcional: un host * cuyo backend no evalue acceso por instancia no lo manda. * * Vive tambien aqui —y no solo en `WidgetDefinition`— porque el contenedor de la tarjeta recibe * esta vista mas estrecha, y es el que decide si ofrece el boton de acceso. */ permissions?: WidgetVerbFlags; } /** * Los verbos de un widget, con TODOS los campos opcionales. * * ⚠️ **Y es a proposito que sea esta forma y no un `Record`.** Una interfaz sin * indice no es asignable a un Record en TypeScript, asi que declararlo asi rompia la asignacion de * `WidgetDefinition` —cuyos verbos son obligatorios— a esta vista mas estrecha, y con ella media * docena de sitios del motor. Con los campos opcionales la relacion es la correcta en los dos * sentidos: la forma completa satisface a la laxa, y la laxa sirve para leer una bandera. */ export interface WidgetVerbFlags { can_view?: boolean; can_edit?: boolean; can_delete?: boolean; can_share?: boolean; can_publish?: boolean; } export interface UserWidgetPreferenceBase { id: string; widget_id: string; activo: boolean; orden?: number; col_span: number; row_span: number; pos_x: number; pos_y: number; config_json?: Record; } export interface BaseWidgetProps { preference: TPreference; definition: TDefinition; isEditMode: boolean; globalFilters: Record; onConfigChange?: (newConfig: Record) => void; } //# sourceMappingURL=types.d.ts.map