drizzle-cube
Version:
Drizzle ORM-first semantic layer with Cube.js compatibility. Type-safe analytics and dashboards with SQL injection protection.
109 lines (108 loc) • 4.82 kB
TypeScript
import { default as React } from 'react';
import { PortletDebugDataEntry } from '../stores/dashboardStore';
import { LayoutItem } from 'react-grid-layout';
import { DashboardConfig, PortletConfig, RowLayout, DashboardFilter, DashboardGridSettings, DashboardLayoutMode } from '../types';
export interface UseDashboardOptions {
/** Dashboard configuration */
config: DashboardConfig;
/** Whether dashboard is editable */
editable?: boolean;
/** Dashboard filters */
dashboardFilters?: DashboardFilter[];
/** Grid settings */
gridSettings: DashboardGridSettings;
/** Allowed layout modes */
allowedModes?: DashboardLayoutMode[];
/** Whether responsive mode allows editing (desktop only) */
isResponsiveEditable?: boolean;
/** Config change handler */
onConfigChange?: (config: DashboardConfig) => void;
/** Save handler */
onSave?: (config: DashboardConfig) => Promise<void> | void;
/** Grid width for row calculations */
gridWidth?: number;
/** Portlet component refs for refresh functionality */
portletComponentRefs?: React.MutableRefObject<Record<string, {
refresh: () => void;
} | null>>;
/** Portlet refresh handler (external) */
onPortletRefresh?: (portletId: string) => void;
}
export interface UseDashboardResult {
/** Whether dashboard is in edit mode */
isEditMode: boolean;
/** Selected filter ID for filter assignment mode */
selectedFilterId: string | null;
/** Whether portlet modal is open */
isPortletModalOpen: boolean;
/** Portlet being edited */
editingPortlet: PortletConfig | null;
/** Whether filter config modal is open */
isFilterConfigModalOpen: boolean;
/** Portlet for filter configuration */
filterConfigPortlet: PortletConfig | null;
/** Portlet ID pending delete confirmation */
deleteConfirmPortletId: string | null;
/** Draft rows during drag operations */
draftRows: RowLayout[] | null;
/** Whether a portlet is being dragged */
isDraggingPortlet: boolean;
/** Last known layout for change detection */
lastKnownLayout: LayoutItem[];
/** Whether component is initialized */
isInitialized: boolean;
/** Debug data per portlet */
debugData: Record<string, PortletDebugDataEntry>;
/** Whether editing is allowed (editable && isEditMode && desktop && !filterMode) */
canEdit: boolean;
/** Whether layout mode can be changed */
canChangeLayoutMode: boolean;
/** Currently selected filter object */
selectedFilter: DashboardFilter | null;
/** Resolved rows for row-based layout */
resolvedRows: RowLayout[];
/** Current layout mode */
layoutMode: DashboardLayoutMode;
/** Allowed layout modes */
allowedModes: DashboardLayoutMode[];
actions: UseDashboardActions;
}
export interface UseDashboardActions {
enterEditMode: () => void;
exitEditMode: () => void;
toggleEditMode: () => void;
selectFilter: (filterId: string | null) => void;
exitFilterSelectionMode: () => void;
openAddPortlet: () => void;
openEditPortlet: (portlet: PortletConfig) => void;
closePortletModal: () => void;
openFilterConfig: (portlet: PortletConfig) => void;
closeFilterConfig: () => void;
setDraftRows: (rows: RowLayout[] | null) => void;
setIsDraggingPortlet: (isDragging: boolean) => void;
setLastKnownLayout: (layout: LayoutItem[]) => void;
setIsInitialized: (initialized: boolean) => void;
setDragState: (state: {
rowIndex: number;
colIndex: number;
portletId: string;
} | null) => void;
clearDragState: () => void;
hasLayoutActuallyChanged: (newLayout: LayoutItem[]) => boolean;
updateRowLayout: (rows: RowLayout[], save?: boolean, portletsOverride?: PortletConfig[]) => Promise<void>;
handleLayoutModeChange: (mode: DashboardLayoutMode) => Promise<void>;
savePortlet: (portletData: PortletConfig | Omit<PortletConfig, 'id' | 'x' | 'y'>) => Promise<string | null>;
deletePortlet: (portletId: string) => Promise<void>;
duplicatePortlet: (portletId: string) => Promise<string | undefined>;
refreshPortlet: (portletId: string) => void;
toggleFilterForPortlet: (portletId: string, filterId: string) => Promise<void>;
selectAllForFilter: (filterId: string) => Promise<void>;
saveFilterConfig: (mapping: string[]) => Promise<void>;
handlePaletteChange: (paletteName: string) => Promise<void>;
openDeleteConfirm: (portletId: string) => void;
closeDeleteConfirm: () => void;
confirmDelete: () => Promise<void>;
setDebugData: (portletId: string, data: PortletDebugDataEntry) => void;
clearDebugData: (portletId?: string) => void;
}
export declare function useDashboard(options: UseDashboardOptions): UseDashboardResult;