@prismiq/react 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CustomSQLEditor-DYeId0Gp.d.ts → ChatBubble-ARocmvZD.d.cts} +48 -4
- package/dist/{CustomSQLEditor-BXB4rf1q.d.cts → ChatBubble-BN_CjIpk.d.ts} +48 -4
- package/dist/{DashboardDialog-B3vYC5Gs.d.ts → DashboardDialog-UhUGXx2h.d.ts} +6 -4
- package/dist/{DashboardDialog-LHmrtNQU.d.cts → DashboardDialog-Z-HypxmG.d.cts} +6 -4
- package/dist/{accessibility-2yy5yqRR.d.cts → accessibility-Bu2mNtaB.d.cts} +1 -1
- package/dist/{accessibility-2yy5yqRR.d.ts → accessibility-Bu2mNtaB.d.ts} +1 -1
- package/dist/charts/index.cjs +27 -27
- package/dist/charts/index.d.cts +2 -2
- package/dist/charts/index.d.ts +2 -2
- package/dist/charts/index.js +2 -2
- package/dist/{chunk-NK7HKX2J.cjs → chunk-73TPDGXB.cjs} +7 -7
- package/dist/{chunk-NK7HKX2J.cjs.map → chunk-73TPDGXB.cjs.map} +1 -1
- package/dist/{chunk-FEABEF3J.cjs → chunk-FKXCINUF.cjs} +551 -299
- package/dist/chunk-FKXCINUF.cjs.map +1 -0
- package/dist/{chunk-2H5WTH4K.js → chunk-FQ23KG6G.js} +3 -3
- package/dist/{chunk-2H5WTH4K.js.map → chunk-FQ23KG6G.js.map} +1 -1
- package/dist/{chunk-UPYINBZU.js → chunk-GELI7MDZ.js} +982 -51
- package/dist/chunk-GELI7MDZ.js.map +1 -0
- package/dist/{chunk-WWTT2OJ5.js → chunk-HKZFEXT6.js} +27 -9
- package/dist/chunk-HKZFEXT6.js.map +1 -0
- package/dist/{chunk-MOAEEF5P.js → chunk-JBJ5LEAG.js} +362 -110
- package/dist/chunk-JBJ5LEAG.js.map +1 -0
- package/dist/{chunk-4AVL6GQK.cjs → chunk-KXB2IZI2.cjs} +36 -9
- package/dist/chunk-KXB2IZI2.cjs.map +1 -0
- package/dist/{chunk-EX74SI67.js → chunk-LBE6GIBC.js} +36 -9
- package/dist/chunk-LBE6GIBC.js.map +1 -0
- package/dist/{chunk-NY6TZLST.cjs → chunk-PG7QBH3G.cjs} +988 -53
- package/dist/chunk-PG7QBH3G.cjs.map +1 -0
- package/dist/{chunk-MDXGGZSW.cjs → chunk-ZYVN6XAZ.cjs} +35 -37
- package/dist/chunk-ZYVN6XAZ.cjs.map +1 -0
- package/dist/components/index.cjs +63 -55
- package/dist/components/index.d.cts +2 -2
- package/dist/components/index.d.ts +2 -2
- package/dist/components/index.js +2 -2
- package/dist/dashboard/index.cjs +36 -36
- package/dist/dashboard/index.d.cts +7 -5
- package/dist/dashboard/index.d.ts +7 -5
- package/dist/dashboard/index.js +4 -4
- package/dist/export/index.cjs +7 -7
- package/dist/export/index.d.cts +6 -4
- package/dist/export/index.d.ts +6 -4
- package/dist/export/index.js +1 -1
- package/dist/{index-C-Qcuu4Y.d.cts → index-B8DelfpL.d.cts} +2 -2
- package/dist/{index-rPc7ijt8.d.ts → index-RbfYPQD_.d.ts} +2 -2
- package/dist/index.cjs +150 -134
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +97 -9
- package/dist/index.d.ts +97 -9
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/{types-WrCbOeAV.d.cts → types-ccB9Ps3k.d.cts} +59 -1
- package/dist/{types-WrCbOeAV.d.ts → types-ccB9Ps3k.d.ts} +59 -1
- package/dist/utils/index.cjs +15 -15
- package/dist/utils/index.d.cts +5 -21
- package/dist/utils/index.d.ts +5 -21
- package/dist/utils/index.js +1 -1
- package/package.json +3 -7
- package/dist/chunk-4AVL6GQK.cjs.map +0 -1
- package/dist/chunk-EX74SI67.js.map +0 -1
- package/dist/chunk-FEABEF3J.cjs.map +0 -1
- package/dist/chunk-MDXGGZSW.cjs.map +0 -1
- package/dist/chunk-MOAEEF5P.js.map +0 -1
- package/dist/chunk-NY6TZLST.cjs.map +0 -1
- package/dist/chunk-UPYINBZU.js.map +0 -1
- package/dist/chunk-WWTT2OJ5.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dashboard/dashboardCache.ts","../src/dashboard/DashboardProvider.tsx","../src/dashboard/useDashboard.ts","../src/dashboard/useDashboardFilters.ts","../src/dashboard/useWidget.ts","../src/dashboard/useAutoRefresh.ts","../src/dashboard/useFullscreen.ts","../src/dashboard/useWidgetVisibility.ts","../src/dashboard/DashboardLayout/DashboardLayout.tsx","../src/dashboard/DashboardLayout/EditableDashboardLayout.tsx","../src/dashboard/Widget/WidgetHeader.tsx","../src/dashboard/Widget/WidgetContent.tsx","../src/dashboard/Widget/Widget.tsx","../src/dashboard/Widget/WidgetContainer.tsx","../src/dashboard/Widget/WidgetPlaceholder.tsx","../src/dashboard/Widget/LazyWidget.tsx","../src/dashboard/filters/DateRangeFilter.tsx","../src/dashboard/filters/useDynamicFilterOptions.ts","../src/dashboard/filters/SelectFilter.tsx","../src/dashboard/filters/MultiSelectFilter.tsx","../src/dashboard/filters/TextFilter.tsx","../src/dashboard/filters/FilterBar.tsx","../src/dashboard/Dashboard.tsx","../src/dashboard/DashboardEditor/EditorToolbar.tsx","../src/dashboard/DashboardEditor/WidgetTypeSelector.tsx","../src/dashboard/DashboardEditor/WidgetPreview.tsx","../src/dashboard/DashboardEditor/configs/MetricConfig.tsx","../src/dashboard/DashboardEditor/configs/ChartConfig.tsx","../src/dashboard/DashboardEditor/configs/PieConfig.tsx","../src/dashboard/DashboardEditor/configs/TableConfig.tsx","../src/dashboard/DashboardEditor/configs/HyperlinkSection.tsx","../src/dashboard/DashboardEditor/configs/ReferenceLinesSection.tsx","../src/dashboard/DashboardEditor/configs/TextFormattingSection.tsx","../src/dashboard/DashboardEditor/configs/PivotConfigSection.tsx","../src/dashboard/DashboardEditor/configs/LayoutConstraintsSection.tsx","../src/dashboard/DashboardEditor/configs/CrossFilterSection.tsx","../src/dashboard/DashboardEditor/GuidedDataConfig.tsx","../src/dashboard/DashboardEditor/configs/ValueFormattingSection.tsx","../src/dashboard/DashboardEditor/configs/DisplayConfigSection.tsx","../src/dashboard/DashboardEditor/configs/DateFormattingSection.tsx","../src/dashboard/DashboardEditor/configs/TrendConfigSection.tsx","../src/dashboard/DashboardEditor/WidgetEditorPage.tsx","../src/dashboard/DashboardEditor/DashboardEditor.tsx","../src/dashboard/DashboardEditor/WidgetPalette.tsx","../src/dashboard/DashboardEditor/WidgetEditor.tsx","../src/dashboard/DashboardList/DashboardCard.tsx","../src/dashboard/DashboardList/DashboardList.tsx","../src/dashboard/DashboardList/DashboardDialog.tsx"],"names":["createContext","useAnalytics","useCrossFilterOptional","useRef","useState","useCallback","crossFilters","useEffect","useMemo","useContext","WidthProvider","Responsive","useTheme","jsxs","jsx","useDebouncedLayoutSave","containerStyles","AutoSaveIndicator","formatRelativeTime","Icon","Fragment","parseMarkdownSafe","EmptyState","createDateFormatters","MetricCard","BarChart","LineChart","AreaChart","PieChart","ScatterChart","pivotQueryResult","ResultsTable","Button","CrossFilterProvider","Select","FilterBuilder","AGGREGATIONS","isNumericColumn","parseColumnRef","CollapsibleSection","TableSelector","JoinBuilder","TimeSeriesConfig","CalculatedFieldBuilder","isCategoricalColumn","isDateColumn","DATE_TRUNC_OPTIONS","Checkbox","Input","ColorPaletteSelector","isDateType","QueryBuilder","SavedQueryPicker","generateId","DEFAULT_BATCH_SIZE","useSchema","WIDGET_TYPES","getDefaultConfig","forwardRef","DashboardCard","Dropdown","DropdownItem","DropdownSeparator","headerStyles","titleStyles","DashboardList","Skeleton","errorStyles","DashboardDialog","Dialog","DialogFooter"],"mappings":"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","file":"chunk-FEABEF3J.cjs","sourcesContent":["/**\n * Shared dashboard cache for Dashboard and DashboardEditor components.\n *\n * This module-level cache survives component remounts (including React StrictMode)\n * and allows data sharing between view mode (Dashboard) and edit mode (DashboardEditor).\n */\n\nimport type { Dashboard } from './types';\n\ninterface CacheEntry {\n data: Dashboard;\n timestamp: number;\n}\n\n/** Module-level cache shared across Dashboard and DashboardEditor */\nexport const dashboardCache = new Map<string, CacheEntry>();\n\n/** Cache TTL in milliseconds (5 seconds) */\nexport const CACHE_TTL_MS = 5000;\n\n/** Track in-flight fetches to prevent duplicate network requests */\nexport const inflightFetches = new Map<string, Promise<Dashboard>>();\n","/**\n * Dashboard context provider for managing dashboard state.\n */\n\nimport {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useAnalytics, useCrossFilterOptional, type CrossFilter } from '../context';\nimport type {\n Dashboard,\n DashboardContextValue,\n DashboardProviderProps,\n FilterValue,\n LazyLoadingConfig,\n Widget,\n} from './types';\nimport type { FilterDefinition, QueryDefinition, QueryResult } from '../types';\nimport {\n dashboardCache,\n CACHE_TTL_MS,\n inflightFetches,\n} from './dashboardCache';\n\n/**\n * Dashboard context.\n */\nexport const DashboardContext = createContext<DashboardContextValue | null>(null);\n\n/**\n * Default batch size for loading widgets.\n */\nconst DEFAULT_BATCH_SIZE = 8;\n\n/**\n * Apply dashboard filter values to a widget query.\n */\nfunction applyFiltersToQuery(\n query: QueryDefinition,\n dashboard: Dashboard,\n filterValues: FilterValue[]\n): QueryDefinition {\n // Map filter values by filter ID\n const valueMap = new Map(\n filterValues.map((fv) => [fv.filter_id, fv.value])\n );\n\n // Build filter definitions from dashboard filters\n const additionalFilters: FilterDefinition[] = [];\n\n for (const filter of dashboard.filters) {\n const value = valueMap.get(filter.id);\n if (value === undefined || value === null || value === '') {\n continue;\n }\n\n // Find the table ID that matches this filter\n // If filter specifies a table and it exists in the query, use that table\n // Otherwise apply to first table - backend will validate if column exists\n let tableId = query.tables[0]?.id || 't1';\n if (filter.table) {\n const matchingTable = query.tables.find((t) => t.name === filter.table);\n if (matchingTable) {\n tableId = matchingTable.id;\n }\n }\n\n // Convert filter value to FilterDefinition based on filter type\n switch (filter.type) {\n case 'date_range': {\n const dateValue = value as { start: string; end: string } | string;\n if (typeof dateValue === 'object' && dateValue.start && dateValue.end) {\n additionalFilters.push({\n table_id: tableId,\n column: filter.field,\n operator: 'between',\n value: [dateValue.start, dateValue.end],\n });\n }\n break;\n }\n case 'select':\n additionalFilters.push({\n table_id: tableId,\n column: filter.field,\n operator: 'eq',\n value,\n });\n break;\n case 'multi_select':\n if (Array.isArray(value) && value.length > 0) {\n additionalFilters.push({\n table_id: tableId,\n column: filter.field,\n operator: 'in_',\n value,\n });\n }\n break;\n case 'text':\n additionalFilters.push({\n table_id: tableId,\n column: filter.field,\n operator: 'ilike',\n value: `%${value}%`,\n });\n break;\n case 'number_range': {\n const rangeValue = value as { min: number | null; max: number | null };\n if (rangeValue.min !== null && rangeValue.max !== null) {\n additionalFilters.push({\n table_id: tableId,\n column: filter.field,\n operator: 'between',\n value: [rangeValue.min, rangeValue.max],\n });\n } else if (rangeValue.min !== null) {\n additionalFilters.push({\n table_id: tableId,\n column: filter.field,\n operator: 'gte',\n value: rangeValue.min,\n });\n } else if (rangeValue.max !== null) {\n additionalFilters.push({\n table_id: tableId,\n column: filter.field,\n operator: 'lte',\n value: rangeValue.max,\n });\n }\n break;\n }\n }\n }\n\n // Merge with existing query filters\n return {\n ...query,\n filters: [...(query.filters || []), ...additionalFilters],\n };\n}\n\n/**\n * Apply cross-filters from other widgets to a widget query.\n *\n * Cross-filters are applied only if the widget is not the source of the filter,\n * and if the filter column exists in the widget's query.\n */\nfunction applyCrossFiltersToQuery(\n query: QueryDefinition,\n crossFilters: CrossFilter[],\n widgetId: string\n): QueryDefinition {\n // Skip if no cross-filters\n if (crossFilters.length === 0) return query;\n\n const additionalFilters: FilterDefinition[] = [];\n\n for (const filter of crossFilters) {\n // Don't apply a widget's own filter to itself\n if (filter.sourceWidgetId === widgetId) continue;\n\n // Find the table that contains this column\n // First check if filter specifies a table\n let tableId = query.tables[0]?.id || 't1';\n if (filter.table) {\n const matchingTable = query.tables.find((t) => t.name === filter.table);\n if (matchingTable) {\n tableId = matchingTable.id;\n }\n } else if (filter.tableId) {\n // Use provided table ID if available\n tableId = filter.tableId;\n }\n\n // Build the filter based on value type\n const value = filter.value;\n if (Array.isArray(value) && value.length > 0) {\n additionalFilters.push({\n table_id: tableId,\n column: filter.column,\n operator: 'in_',\n value,\n });\n } else if (value !== null && value !== undefined && value !== '') {\n additionalFilters.push({\n table_id: tableId,\n column: filter.column,\n operator: 'eq',\n value,\n });\n }\n }\n\n // Merge with existing query filters\n if (additionalFilters.length === 0) return query;\n\n return {\n ...query,\n filters: [...(query.filters || []), ...additionalFilters],\n };\n}\n\n/**\n * Default lazy loading configuration.\n */\nconst DEFAULT_LAZY_LOADING: LazyLoadingConfig = {\n enabled: true,\n rootMargin: '200px',\n};\n\n/**\n * Provider component for dashboard state management.\n */\nexport function DashboardProvider({\n dashboardId,\n batchSize = DEFAULT_BATCH_SIZE,\n lazyLoading = DEFAULT_LAZY_LOADING,\n children,\n}: DashboardProviderProps): JSX.Element {\n const { client } = useAnalytics();\n const crossFilterContext = useCrossFilterOptional();\n\n // Lazy loading config with defaults\n const lazyLoadingEnabled = lazyLoading.enabled ?? true;\n\n // Store lazy loading enabled in ref so setDashboardData can access it\n const lazyLoadingEnabledRef = useRef(lazyLoadingEnabled);\n lazyLoadingEnabledRef.current = lazyLoadingEnabled;\n\n // Dashboard state\n const [dashboard, setDashboard] = useState<Dashboard | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Filter values\n const [filterValues, setFilterValues] = useState<FilterValue[]>([]);\n\n // Widget results\n const [widgetResults, setWidgetResults] = useState<Record<string, QueryResult>>({});\n const [widgetErrors, setWidgetErrors] = useState<Record<string, Error>>({});\n const [widgetLoading, setWidgetLoading] = useState<Record<string, boolean>>({});\n\n // Refresh state\n const [widgetRefreshTimes, setWidgetRefreshTimes] = useState<Record<string, number>>({});\n const [refreshingWidgets, setRefreshingWidgets] = useState<Set<string>>(new Set());\n\n // Visibility tracking for lazy loading\n const [visibleWidgets, setVisibleWidgets] = useState<Set<string>>(new Set());\n const [everVisibleWidgets, setEverVisibleWidgets] = useState<Set<string>>(new Set());\n\n // Track request IDs to avoid stale updates\n const requestIdRef = useRef<string>('');\n\n // Store client in ref so effect doesn't re-run when client reference changes\n const clientRef = useRef(client);\n clientRef.current = client;\n\n // Track which dashboard has been loaded to prevent duplicate loads\n const loadedDashboardRef = useRef<string | null>(null);\n\n /**\n * Helper to set dashboard data and initialize filter defaults.\n */\n const setDashboardData = useCallback((data: Dashboard) => {\n setDashboard(data);\n // Initialize filter values with defaults\n const defaults: FilterValue[] = data.filters\n .filter((f) => f.default_value !== undefined)\n .map((f) => ({\n filter_id: f.id,\n value: f.default_value,\n }));\n setFilterValues(defaults);\n\n // When lazy loading is DISABLED: Initialize all widgets with loading state\n // so they show spinners until their queries are executed (instead of showing \"No Data\")\n // When lazy loading is ENABLED: Don't pre-set loading state - let LazyWidget\n // show placeholder until widget becomes visible, then the effect will trigger loading\n if (!lazyLoadingEnabledRef.current) {\n const initialLoadingState: Record<string, boolean> = {};\n data.widgets.forEach((widget) => {\n // Only mark widgets with queries as loading (text widgets don't need it)\n if (widget.query) {\n initialLoadingState[widget.id] = true;\n }\n });\n setWidgetLoading(initialLoadingState);\n }\n }, []);\n\n /**\n * Execute a single widget query.\n *\n * @param widget - Widget to execute query for\n * @param currentDashboard - Current dashboard\n * @param currentFilters - Current filter values\n * @param currentCrossFilters - Current cross-filter values\n * @param bypassCache - If true, bypass cache and force fresh data\n */\n const executeWidgetQuery = useCallback(\n async (\n widget: Widget,\n currentDashboard: Dashboard,\n currentFilters: FilterValue[],\n currentCrossFilters: CrossFilter[],\n bypassCache: boolean = false\n ) => {\n if (!widget.query) {\n // Text widgets don't have queries\n return;\n }\n\n // Mark widget as loading (and refreshing if bypassing cache)\n setWidgetLoading((prev) => ({ ...prev, [widget.id]: true }));\n if (bypassCache) {\n setRefreshingWidgets((prev) => new Set(prev).add(widget.id));\n }\n setWidgetErrors((prev) => {\n const next = { ...prev };\n delete next[widget.id];\n return next;\n });\n\n try {\n // Apply dashboard filters to widget query\n let query = applyFiltersToQuery(\n widget.query,\n currentDashboard,\n currentFilters\n );\n\n // Apply cross-filters from other widgets\n query = applyCrossFiltersToQuery(query, currentCrossFilters, widget.id);\n\n const result = await client.executeQuery(query, bypassCache);\n setWidgetResults((prev) => ({ ...prev, [widget.id]: result }));\n\n // Update refresh time from cache metadata or current time\n const refreshTime = result.cached_at ?? Date.now() / 1000;\n setWidgetRefreshTimes((prev) => ({ ...prev, [widget.id]: refreshTime }));\n } catch (err) {\n setWidgetErrors((prev) => ({\n ...prev,\n [widget.id]: err instanceof Error ? err : new Error('Query failed'),\n }));\n } finally {\n setWidgetLoading((prev) => ({ ...prev, [widget.id]: false }));\n if (bypassCache) {\n setRefreshingWidgets((prev) => {\n const next = new Set(prev);\n next.delete(widget.id);\n return next;\n });\n }\n }\n },\n [client]\n );\n\n /**\n * Execute widget queries in batches.\n */\n const executeWidgetsInBatches = useCallback(\n async (\n widgets: Widget[],\n currentDashboard: Dashboard,\n currentFilters: FilterValue[],\n currentCrossFilters: CrossFilter[],\n bypassCache: boolean = false,\n currentBatchSize: number = batchSize\n ) => {\n // Filter to widgets that have queries\n const widgetsWithQueries = widgets.filter((w) => w.query !== null);\n\n // Process in batches\n for (let i = 0; i < widgetsWithQueries.length; i += currentBatchSize) {\n const batch = widgetsWithQueries.slice(i, i + currentBatchSize);\n\n // Execute batch in parallel\n await Promise.all(\n batch.map((widget) =>\n executeWidgetQuery(\n widget,\n currentDashboard,\n currentFilters,\n currentCrossFilters,\n bypassCache\n )\n )\n );\n }\n },\n [batchSize, executeWidgetQuery]\n );\n\n /**\n * Execute all widget queries (initial load, uses batching).\n */\n const executeAllWidgets = useCallback(\n async (\n currentDashboard: Dashboard,\n currentFilters: FilterValue[],\n currentCrossFilters: CrossFilter[]\n ) => {\n const requestId = Math.random().toString(36).substring(2, 11);\n requestIdRef.current = requestId;\n\n await executeWidgetsInBatches(\n currentDashboard.widgets,\n currentDashboard,\n currentFilters,\n currentCrossFilters,\n false // Don't bypass cache on initial load\n );\n },\n [executeWidgetsInBatches]\n );\n\n /**\n * Refresh the entire dashboard (legacy method, calls refreshAll).\n */\n const refreshDashboard = useCallback(async () => {\n if (!dashboard) return;\n const crossFilters = crossFilterContext?.filters ?? [];\n await executeWidgetsInBatches(\n dashboard.widgets,\n dashboard,\n filterValues,\n crossFilters,\n true, // Bypass cache\n batchSize\n );\n }, [dashboard, filterValues, executeWidgetsInBatches, crossFilterContext?.filters, batchSize]);\n\n /**\n * Refresh all widgets with configurable batch size (bypasses cache).\n */\n const refreshAll = useCallback(\n async (customBatchSize?: number) => {\n if (!dashboard) return;\n const crossFilters = crossFilterContext?.filters ?? [];\n await executeWidgetsInBatches(\n dashboard.widgets,\n dashboard,\n filterValues,\n crossFilters,\n true, // Bypass cache\n customBatchSize ?? batchSize\n );\n },\n [dashboard, filterValues, executeWidgetsInBatches, crossFilterContext?.filters, batchSize]\n );\n\n /**\n * Refresh a single widget (bypasses cache).\n */\n const refreshWidget = useCallback(\n async (widgetId: string) => {\n if (!dashboard) return;\n\n const widget = dashboard.widgets.find((w) => w.id === widgetId);\n if (!widget) return;\n\n const crossFilters = crossFilterContext?.filters ?? [];\n await executeWidgetQuery(\n widget,\n dashboard,\n filterValues,\n crossFilters,\n true // Bypass cache\n );\n },\n [dashboard, filterValues, executeWidgetQuery, crossFilterContext?.filters]\n );\n\n /**\n * Get the oldest widget refresh timestamp.\n */\n const getOldestRefreshTime = useCallback((): number | null => {\n const times = Object.values(widgetRefreshTimes);\n if (times.length === 0) return null;\n return Math.min(...times);\n }, [widgetRefreshTimes]);\n\n /**\n * Set a filter value.\n */\n const setFilterValue = useCallback((filterId: string, value: unknown) => {\n setFilterValues((prev) => {\n const existing = prev.find((fv) => fv.filter_id === filterId);\n if (existing) {\n return prev.map((fv) =>\n fv.filter_id === filterId ? { ...fv, value } : fv\n );\n }\n return [...prev, { filter_id: filterId, value }];\n });\n }, []);\n\n /**\n * Register a widget's visibility state (for lazy loading).\n */\n const registerVisibility = useCallback((widgetId: string, isVisible: boolean) => {\n if (isVisible) {\n setVisibleWidgets((prev) => {\n if (prev.has(widgetId)) return prev;\n return new Set(prev).add(widgetId);\n });\n setEverVisibleWidgets((prev) => {\n if (prev.has(widgetId)) return prev;\n return new Set(prev).add(widgetId);\n });\n } else {\n setVisibleWidgets((prev) => {\n if (!prev.has(widgetId)) return prev;\n const next = new Set(prev);\n next.delete(widgetId);\n return next;\n });\n }\n }, []);\n\n /**\n * Unregister a widget when unmounted (for lazy loading).\n */\n const unregisterVisibility = useCallback((widgetId: string) => {\n setVisibleWidgets((prev) => {\n if (!prev.has(widgetId)) return prev;\n const next = new Set(prev);\n next.delete(widgetId);\n return next;\n });\n }, []);\n\n // Load dashboard on mount - with safeguards to prevent duplicate requests\n useEffect(() => {\n const currentClient = clientRef.current;\n\n if (!dashboardId || !currentClient) {\n return;\n }\n\n // Skip if already loaded this dashboard (instance-level check)\n if (loadedDashboardRef.current === dashboardId) {\n return;\n }\n\n const now = Date.now();\n\n // Check module-level cache first (survives StrictMode remounts)\n const cached = dashboardCache.get(dashboardId);\n if (cached && now - cached.timestamp < CACHE_TTL_MS) {\n setError(null);\n loadedDashboardRef.current = dashboardId;\n setDashboardData(cached.data);\n setIsLoading(false);\n return;\n }\n\n // Track if this effect has been cancelled (dashboardId changed or unmounted)\n let isCancelled = false;\n\n // Check if there's already an in-flight fetch\n const inflightFetch = inflightFetches.get(dashboardId);\n if (inflightFetch) {\n setIsLoading(true);\n setError(null);\n inflightFetch\n .then((data) => {\n if (isCancelled) return;\n loadedDashboardRef.current = dashboardId;\n setDashboardData(data);\n setIsLoading(false);\n })\n .catch((err) => {\n if (isCancelled) return;\n // Don't set loadedDashboardRef on failure - allows retry\n setError(err instanceof Error ? err : new Error('Failed to load dashboard'));\n setIsLoading(false);\n });\n return () => {\n isCancelled = true;\n };\n }\n\n // Start a new fetch\n setIsLoading(true);\n setError(null);\n\n const fetchPromise = (async (): Promise<Dashboard> => {\n const data = await currentClient.get<Dashboard>(`/dashboards/${dashboardId}`);\n // Cache the data at module level (survives StrictMode remounts)\n dashboardCache.set(dashboardId, { data, timestamp: Date.now() });\n return data;\n })();\n\n // Track the in-flight fetch\n inflightFetches.set(dashboardId, fetchPromise);\n\n fetchPromise\n .then((data) => {\n inflightFetches.delete(dashboardId);\n if (isCancelled) return;\n // Only mark as loaded on success - allows retry on failure\n loadedDashboardRef.current = dashboardId;\n setDashboardData(data);\n setIsLoading(false);\n })\n .catch((err) => {\n inflightFetches.delete(dashboardId);\n if (isCancelled) return;\n // Don't set loadedDashboardRef on failure - allows retry\n setError(err instanceof Error ? err : new Error('Failed to load dashboard'));\n setIsLoading(false);\n });\n\n return () => {\n isCancelled = true;\n };\n }, [dashboardId, setDashboardData]);\n\n // Execute widget queries when dashboard loads or filters change\n // Also re-execute when cross-filters change\n const crossFilters = crossFilterContext?.filters ?? [];\n\n // Track previous cross-filters to detect actual changes\n const prevCrossFiltersRef = useRef<string>('');\n const crossFiltersKey = JSON.stringify(crossFilters);\n\n // When lazy loading is DISABLED: execute all widgets on load/filter change (original behavior)\n useEffect(() => {\n if (!lazyLoadingEnabled && dashboard && !isLoading) {\n // Track cross-filters key for debugging/future optimization\n prevCrossFiltersRef.current = crossFiltersKey;\n\n // Execute on initial load or when filters change\n executeAllWidgets(dashboard, filterValues, crossFilters);\n }\n }, [lazyLoadingEnabled, dashboard, filterValues, isLoading, executeAllWidgets, crossFiltersKey, crossFilters]);\n\n // When lazy loading is ENABLED: execute only visible widgets\n useEffect(() => {\n if (!lazyLoadingEnabled || !dashboard || isLoading) return;\n\n // Find widgets that:\n // 1. Are currently visible\n // 2. Have a query (not text widgets)\n // 3. Haven't been loaded yet\n // 4. Aren't currently loading\n const widgetsToLoad = dashboard.widgets.filter((w) =>\n visibleWidgets.has(w.id) &&\n w.query !== null &&\n !widgetResults[w.id] &&\n !widgetLoading[w.id]\n );\n\n if (widgetsToLoad.length > 0) {\n executeWidgetsInBatches(\n widgetsToLoad,\n dashboard,\n filterValues,\n crossFilters,\n false // Don't bypass cache\n );\n }\n }, [\n lazyLoadingEnabled,\n dashboard,\n isLoading,\n visibleWidgets,\n widgetResults,\n widgetLoading,\n filterValues,\n crossFilters,\n executeWidgetsInBatches,\n ]);\n\n // When filters change with lazy loading: re-execute all previously visible widgets\n const filterValuesKey = JSON.stringify(filterValues);\n const prevFilterValuesRef = useRef<string>(filterValuesKey);\n\n useEffect(() => {\n if (!lazyLoadingEnabled || !dashboard || isLoading) return;\n\n // Check if filters actually changed\n if (prevFilterValuesRef.current === filterValuesKey) return;\n prevFilterValuesRef.current = filterValuesKey;\n\n // Re-execute widgets that have been visible (they have data that needs refreshing)\n const widgetsToRefresh = dashboard.widgets.filter((w) =>\n everVisibleWidgets.has(w.id) &&\n w.query !== null &&\n widgetResults[w.id] // Only re-execute if previously loaded\n );\n\n if (widgetsToRefresh.length > 0) {\n executeWidgetsInBatches(\n widgetsToRefresh,\n dashboard,\n filterValues,\n crossFilters,\n false\n );\n }\n }, [\n lazyLoadingEnabled,\n dashboard,\n isLoading,\n filterValuesKey,\n everVisibleWidgets,\n widgetResults,\n filterValues,\n crossFilters,\n executeWidgetsInBatches,\n ]);\n\n // Context value\n const contextValue = useMemo<DashboardContextValue>(\n () => ({\n dashboard,\n isLoading,\n error,\n filterValues,\n widgetResults,\n widgetErrors,\n widgetLoading,\n widgetRefreshTimes,\n refreshingWidgets,\n setFilterValue,\n refreshDashboard,\n refreshWidget,\n refreshAll,\n getOldestRefreshTime,\n // Lazy loading\n registerVisibility,\n unregisterVisibility,\n lazyLoadingEnabled,\n }),\n [\n dashboard,\n isLoading,\n error,\n filterValues,\n widgetResults,\n widgetErrors,\n widgetLoading,\n widgetRefreshTimes,\n refreshingWidgets,\n setFilterValue,\n refreshDashboard,\n refreshWidget,\n refreshAll,\n getOldestRefreshTime,\n registerVisibility,\n unregisterVisibility,\n lazyLoadingEnabled,\n ]\n );\n\n return (\n <DashboardContext.Provider value={contextValue}>\n {children}\n </DashboardContext.Provider>\n );\n}\n","/**\n * Hook to access dashboard context.\n */\n\nimport { useContext } from 'react';\nimport { DashboardContext } from './DashboardProvider';\nimport type { DashboardContextValue } from './types';\n\n/**\n * Hook to access the full dashboard context.\n *\n * Must be used within a DashboardProvider.\n *\n * @returns Dashboard context value\n * @throws Error if used outside DashboardProvider\n *\n * @example\n * ```tsx\n * function DashboardHeader() {\n * const { dashboard, isLoading, refreshDashboard } = useDashboard();\n *\n * if (isLoading) return <Spinner />;\n *\n * return (\n * <header>\n * <h1>{dashboard?.name}</h1>\n * <button onClick={refreshDashboard}>Refresh</button>\n * </header>\n * );\n * }\n * ```\n */\nexport function useDashboard(): DashboardContextValue {\n const context = useContext(DashboardContext);\n\n if (!context) {\n throw new Error('useDashboard must be used within a DashboardProvider');\n }\n\n return context;\n}\n","/**\n * Hook to manage dashboard filter state.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useDashboard } from './useDashboard';\nimport type { DashboardFilter, FilterValue } from './types';\n\n/**\n * Result of the useDashboardFilters hook.\n */\nexport interface UseDashboardFiltersResult {\n /** All dashboard filters. */\n filters: DashboardFilter[];\n /** Current filter values. */\n values: FilterValue[];\n /** Set a filter value. */\n setValue: (filterId: string, value: unknown) => void;\n /** Reset all filters to defaults. */\n resetAll: () => void;\n /** Reset a single filter to its default. */\n resetFilter: (filterId: string) => void;\n /** Get the current value for a filter. */\n getValue: (filterId: string) => unknown;\n}\n\n/**\n * Hook to manage dashboard filter state.\n *\n * Provides convenient methods for working with dashboard filters.\n *\n * @returns Filter management utilities\n *\n * @example\n * ```tsx\n * function FilterControls() {\n * const { filters, values, setValue, resetAll, getValue } = useDashboardFilters();\n *\n * return (\n * <div>\n * {filters.map((filter) => (\n * <FilterInput\n * key={filter.id}\n * filter={filter}\n * value={getValue(filter.id)}\n * onChange={(v) => setValue(filter.id, v)}\n * />\n * ))}\n * <button onClick={resetAll}>Reset</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useDashboardFilters(): UseDashboardFiltersResult {\n const { dashboard, filterValues, setFilterValue } = useDashboard();\n\n // Get all filters from the dashboard\n const filters = useMemo(() => {\n return dashboard?.filters || [];\n }, [dashboard]);\n\n // Get the current value for a filter\n const getValue = useCallback(\n (filterId: string): unknown => {\n const filterValue = filterValues.find((fv) => fv.filter_id === filterId);\n if (filterValue) {\n return filterValue.value;\n }\n\n // Return default value if no current value\n const filter = filters.find((f) => f.id === filterId);\n return filter?.default_value;\n },\n [filterValues, filters]\n );\n\n // Reset all filters to their defaults\n const resetAll = useCallback(() => {\n for (const filter of filters) {\n setFilterValue(filter.id, filter.default_value);\n }\n }, [filters, setFilterValue]);\n\n // Reset a single filter to its default\n const resetFilter = useCallback(\n (filterId: string) => {\n const filter = filters.find((f) => f.id === filterId);\n if (filter) {\n setFilterValue(filterId, filter.default_value);\n }\n },\n [filters, setFilterValue]\n );\n\n return useMemo(\n () => ({\n filters,\n values: filterValues,\n setValue: setFilterValue,\n resetAll,\n resetFilter,\n getValue,\n }),\n [filters, filterValues, setFilterValue, resetAll, resetFilter, getValue]\n );\n}\n","/**\n * Hook to access a single widget's state.\n */\n\nimport { useMemo } from 'react';\nimport { useDashboard } from './useDashboard';\nimport type { Widget } from './types';\nimport type { QueryResult } from '../types';\n\n/**\n * Result of the useWidget hook.\n */\nexport interface UseWidgetResult {\n /** The widget definition. */\n widget: Widget;\n /** Query result for this widget (null if not yet loaded or text widget). */\n result: QueryResult | null;\n /** Whether the widget query is loading. */\n isLoading: boolean;\n /** Error if the query failed. */\n error: Error | null;\n /** Refresh this widget's data. */\n refresh: () => Promise<void>;\n}\n\n/**\n * Hook to access a single widget's state.\n *\n * Provides the widget definition, query result, loading state, and refresh function.\n *\n * @param widgetId - ID of the widget to access\n * @returns Widget state and refresh function\n * @throws Error if widget not found\n *\n * @example\n * ```tsx\n * function WidgetDisplay({ widgetId }: { widgetId: string }) {\n * const { widget, result, isLoading, error, refresh } = useWidget(widgetId);\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * return (\n * <div>\n * <h3>{widget.title}</h3>\n * <Chart type={widget.type} data={result} />\n * <button onClick={refresh}>Refresh</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useWidget(widgetId: string): UseWidgetResult {\n const {\n dashboard,\n widgetResults,\n widgetErrors,\n widgetLoading,\n refreshWidget,\n } = useDashboard();\n\n // Find the widget\n const widget = useMemo(() => {\n const found = dashboard?.widgets.find((w) => w.id === widgetId);\n if (!found) {\n throw new Error(`Widget with id \"${widgetId}\" not found`);\n }\n return found;\n }, [dashboard, widgetId]);\n\n // Get result, error, and loading state\n const result = widgetResults[widgetId] || null;\n const error = widgetErrors[widgetId] || null;\n const isLoading = widgetLoading[widgetId] || false;\n\n // Create refresh function\n const refresh = useMemo(() => {\n return () => refreshWidget(widgetId);\n }, [refreshWidget, widgetId]);\n\n return useMemo(\n () => ({\n widget,\n result,\n isLoading,\n error,\n refresh,\n }),\n [widget, result, isLoading, error, refresh]\n );\n}\n","/**\n * Hook for auto-refreshing dashboard data.\n */\n\nimport { useEffect, useRef, useCallback, useState } from 'react';\n\n/**\n * Options for useAutoRefresh hook.\n */\nexport interface UseAutoRefreshOptions {\n /** Refresh callback to execute. */\n onRefresh: () => Promise<void>;\n /** Interval in milliseconds. Set to 0 to disable. */\n intervalMs: number;\n /** Whether to start paused. */\n startPaused?: boolean;\n}\n\n/**\n * Result of useAutoRefresh hook.\n */\nexport interface UseAutoRefreshResult {\n /** Whether auto-refresh is currently active. */\n isActive: boolean;\n /** Time until next refresh in milliseconds. */\n timeUntilRefresh: number;\n /** Pause auto-refresh. */\n pause: () => void;\n /** Resume auto-refresh. */\n resume: () => void;\n /** Toggle auto-refresh. */\n toggle: () => void;\n /** Trigger an immediate refresh. */\n refreshNow: () => Promise<void>;\n}\n\n/**\n * Hook for auto-refreshing data at a specified interval.\n *\n * @example\n * ```tsx\n * const { isActive, timeUntilRefresh, pause, resume, refreshNow } = useAutoRefresh({\n * onRefresh: async () => {\n * await fetchData();\n * },\n * intervalMs: 30000, // 30 seconds\n * });\n *\n * return (\n * <div>\n * <button onClick={refreshNow}>Refresh Now</button>\n * <button onClick={isActive ? pause : resume}>\n * {isActive ? 'Pause' : 'Resume'}\n * </button>\n * <span>Next refresh in: {Math.round(timeUntilRefresh / 1000)}s</span>\n * </div>\n * );\n * ```\n */\nexport function useAutoRefresh({\n onRefresh,\n intervalMs,\n startPaused = false,\n}: UseAutoRefreshOptions): UseAutoRefreshResult {\n const [isActive, setIsActive] = useState(!startPaused && intervalMs > 0);\n const [timeUntilRefresh, setTimeUntilRefresh] = useState(intervalMs);\n\n const intervalRef = useRef<ReturnType<typeof setInterval>>();\n const countdownRef = useRef<ReturnType<typeof setInterval>>();\n const lastRefreshRef = useRef<number>(Date.now());\n\n // Clear intervals on cleanup\n const clearIntervals = useCallback(() => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = undefined;\n }\n if (countdownRef.current) {\n clearInterval(countdownRef.current);\n countdownRef.current = undefined;\n }\n }, []);\n\n // Execute refresh\n const refreshNow = useCallback(async () => {\n lastRefreshRef.current = Date.now();\n setTimeUntilRefresh(intervalMs);\n await onRefresh();\n }, [onRefresh, intervalMs]);\n\n // Start auto-refresh\n const startAutoRefresh = useCallback(() => {\n if (intervalMs <= 0) return;\n\n clearIntervals();\n\n // Set up main refresh interval\n intervalRef.current = setInterval(() => {\n refreshNow();\n }, intervalMs);\n\n // Set up countdown timer (updates every second)\n countdownRef.current = setInterval(() => {\n const elapsed = Date.now() - lastRefreshRef.current;\n const remaining = Math.max(0, intervalMs - elapsed);\n setTimeUntilRefresh(remaining);\n }, 1000);\n\n setIsActive(true);\n }, [intervalMs, refreshNow, clearIntervals]);\n\n // Stop auto-refresh\n const stopAutoRefresh = useCallback(() => {\n clearIntervals();\n setIsActive(false);\n }, [clearIntervals]);\n\n // Pause\n const pause = useCallback(() => {\n stopAutoRefresh();\n }, [stopAutoRefresh]);\n\n // Resume\n const resume = useCallback(() => {\n lastRefreshRef.current = Date.now();\n setTimeUntilRefresh(intervalMs);\n startAutoRefresh();\n }, [startAutoRefresh, intervalMs]);\n\n // Toggle\n const toggle = useCallback(() => {\n if (isActive) {\n pause();\n } else {\n resume();\n }\n }, [isActive, pause, resume]);\n\n // Initialize on mount\n useEffect(() => {\n if (!startPaused && intervalMs > 0) {\n startAutoRefresh();\n }\n\n return () => {\n clearIntervals();\n };\n }, [intervalMs, startPaused, startAutoRefresh, clearIntervals]);\n\n return {\n isActive,\n timeUntilRefresh,\n pause,\n resume,\n toggle,\n refreshNow,\n };\n}\n","/**\n * Hook for managing fullscreen mode.\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\n\n/**\n * Result of useFullscreen hook.\n */\nexport interface UseFullscreenResult {\n /** Whether fullscreen mode is currently active. */\n isFullscreen: boolean;\n /** Enter fullscreen mode. */\n enterFullscreen: () => Promise<void>;\n /** Exit fullscreen mode. */\n exitFullscreen: () => Promise<void>;\n /** Toggle fullscreen mode. */\n toggleFullscreen: () => Promise<void>;\n /** Ref to attach to the element that should become fullscreen. */\n ref: React.RefObject<HTMLDivElement>;\n}\n\n// Extended element interface for webkit fullscreen\ninterface FullscreenElement extends Element {\n webkitRequestFullscreen?: () => Promise<void>;\n}\n\n// Extended document interface for webkit fullscreen\ninterface FullscreenDocument extends Document {\n webkitExitFullscreen?: () => Promise<void>;\n}\n\n/**\n * Hook for managing fullscreen mode on an element.\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * const { isFullscreen, toggleFullscreen, ref } = useFullscreen();\n *\n * return (\n * <div ref={ref}>\n * <button onClick={toggleFullscreen}>\n * {isFullscreen ? 'Exit Fullscreen' : 'Fullscreen'}\n * </button>\n * <DashboardContent />\n * </div>\n * );\n * }\n * ```\n */\nexport function useFullscreen(): UseFullscreenResult {\n const [isFullscreen, setIsFullscreen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n // Track fullscreen changes from browser events\n useEffect(() => {\n const handleFullscreenChange = () => {\n setIsFullscreen(document.fullscreenElement === ref.current);\n };\n\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n\n // Enter fullscreen\n const enterFullscreen = useCallback(async () => {\n if (!ref.current) return;\n\n try {\n const element = ref.current as FullscreenElement;\n if (element.requestFullscreen) {\n await element.requestFullscreen();\n } else if (element.webkitRequestFullscreen) {\n await element.webkitRequestFullscreen();\n }\n setIsFullscreen(true);\n } catch (error) {\n console.warn('Failed to enter fullscreen:', error);\n }\n }, []);\n\n // Exit fullscreen\n const exitFullscreen = useCallback(async () => {\n try {\n const doc = document as FullscreenDocument;\n if (doc.exitFullscreen) {\n await doc.exitFullscreen();\n } else if (doc.webkitExitFullscreen) {\n await doc.webkitExitFullscreen();\n }\n setIsFullscreen(false);\n } catch (error) {\n console.warn('Failed to exit fullscreen:', error);\n }\n }, []);\n\n // Toggle fullscreen\n const toggleFullscreen = useCallback(async () => {\n if (isFullscreen) {\n await exitFullscreen();\n } else {\n await enterFullscreen();\n }\n }, [isFullscreen, enterFullscreen, exitFullscreen]);\n\n return {\n isFullscreen,\n enterFullscreen,\n exitFullscreen,\n toggleFullscreen,\n ref,\n };\n}\n","/**\n * Hook for tracking widget visibility using Intersection Observer.\n *\n * Used for scroll-based lazy loading of dashboard widgets.\n */\n\nimport { useRef, useState, useEffect } from 'react';\n\n/**\n * Options for the useWidgetVisibility hook.\n */\nexport interface UseWidgetVisibilityOptions {\n /** Root margin for prefetching (default: \"200px\"). */\n rootMargin?: string;\n /** Intersection threshold (default: 0.1 - 10% visible triggers). */\n threshold?: number;\n /** Callback when visibility changes. */\n onVisibilityChange?: (isVisible: boolean) => void;\n}\n\n/**\n * Result of the useWidgetVisibility hook.\n */\nexport interface UseWidgetVisibilityResult {\n /** Ref to attach to the widget container element. */\n ref: React.RefObject<HTMLDivElement>;\n /** Whether the widget is currently visible or approaching viewport. */\n isVisible: boolean;\n /** Whether the widget has ever been visible (stays true once set). */\n hasBeenVisible: boolean;\n}\n\n/**\n * Hook that uses Intersection Observer to track element visibility.\n *\n * Features:\n * - Detects when element enters/exits viewport with configurable margin\n * - Tracks \"hasBeenVisible\" state that stays true once element is seen\n * - Supports prefetching via rootMargin (loads before element is visible)\n *\n * @example\n * ```tsx\n * function LazyWidget({ widget }) {\n * const { ref, isVisible, hasBeenVisible } = useWidgetVisibility({\n * rootMargin: '200px', // Start loading 200px before visible\n * });\n *\n * return (\n * <div ref={ref}>\n * {hasBeenVisible ? <ActualContent /> : <Placeholder />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useWidgetVisibility(\n options: UseWidgetVisibilityOptions = {}\n): UseWidgetVisibilityResult {\n const { rootMargin = '200px', threshold = 0.1, onVisibilityChange } = options;\n\n const ref = useRef<HTMLDivElement>(null);\n const [isVisible, setIsVisible] = useState(false);\n const [hasBeenVisible, setHasBeenVisible] = useState(false);\n\n // Store callback in ref to avoid recreation of observer\n const onVisibilityChangeRef = useRef(onVisibilityChange);\n onVisibilityChangeRef.current = onVisibilityChange;\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n // Check if IntersectionObserver is supported\n if (typeof IntersectionObserver === 'undefined') {\n // Fallback: treat as always visible if no IntersectionObserver\n setIsVisible(true);\n setHasBeenVisible(true);\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (!entry) return;\n\n const visible = entry.isIntersecting;\n setIsVisible(visible);\n\n if (visible) {\n setHasBeenVisible(true);\n }\n\n onVisibilityChangeRef.current?.(visible);\n },\n {\n rootMargin,\n threshold,\n }\n );\n\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [rootMargin, threshold]);\n\n return { ref, isVisible, hasBeenVisible };\n}\n","/**\n * Dashboard grid layout component using react-grid-layout.\n * Supports responsive breakpoints for mobile-friendly layouts.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { Responsive, WidthProvider } from 'react-grid-layout/legacy';\nimport 'react-grid-layout/css/styles.css';\nimport { useTheme } from '../../theme';\nimport type { DashboardLayoutProps, Widget, WidgetPosition } from '../types';\n\n// Layout item type for react-grid-layout\ninterface LayoutItem {\n i: string;\n x: number;\n y: number;\n w: number;\n h: number;\n minW?: number;\n minH?: number;\n maxW?: number;\n maxH?: number;\n static?: boolean;\n}\n\n// Layouts type for responsive grid\ninterface Layouts {\n [breakpoint: string]: LayoutItem[];\n}\n\n// Create responsive grid layout with width provider HOC\nconst ResponsiveGridLayout = WidthProvider(Responsive);\n\n// Responsive breakpoints\nconst BREAKPOINTS = {\n lg: 1200,\n md: 996,\n sm: 768,\n xs: 480,\n xxs: 0,\n};\n\n// Column counts per breakpoint\nconst COLS = {\n lg: 12,\n md: 10,\n sm: 6,\n xs: 4,\n xxs: 2,\n};\n\n/**\n * Convert Widget positions to react-grid-layout Layout format.\n */\nfunction widgetsToLayout(widgets: Widget[]): LayoutItem[] {\n return widgets.map((widget) => ({\n i: widget.id,\n x: widget.position.x,\n y: widget.position.y,\n w: widget.position.w,\n h: widget.position.h,\n minW: widget.position.minW ?? 2,\n minH: widget.position.minH ?? 2,\n maxW: widget.position.maxW,\n maxH: widget.position.maxH,\n }));\n}\n\n/**\n * Generate responsive layouts from base layout.\n * Adjusts positions for smaller screens.\n */\nfunction generateResponsiveLayouts(\n baseLayout: LayoutItem[],\n baseCols: number\n): Layouts {\n const layouts: Layouts = {\n lg: baseLayout,\n };\n\n // For medium screens, scale down positions\n layouts.md = baseLayout.map((item) => ({\n ...item,\n x: Math.floor((item.x / baseCols) * COLS.md),\n w: Math.min(item.w, COLS.md),\n }));\n\n // For small screens, stack items more\n layouts.sm = baseLayout.map((item, index) => ({\n ...item,\n x: (index % 2) * 3,\n y: Math.floor(index / 2) * item.h,\n w: Math.min(item.w, COLS.sm),\n }));\n\n // For extra small screens, full width\n layouts.xs = baseLayout.map((item, index) => ({\n ...item,\n x: 0,\n y: index * item.h,\n w: COLS.xs,\n }));\n\n // For mobile, single column\n layouts.xxs = baseLayout.map((item, index) => ({\n ...item,\n x: 0,\n y: index * item.h,\n w: COLS.xxs,\n }));\n\n return layouts;\n}\n\n/**\n * Convert react-grid-layout Layout to Widget positions.\n */\nfunction layoutToPositions(layout: LayoutItem[]): Record<string, WidgetPosition> {\n const positions: Record<string, WidgetPosition> = {};\n\n for (const item of layout) {\n positions[item.i] = {\n x: item.x,\n y: item.y,\n w: item.w,\n h: item.h,\n minW: item.minW,\n minH: item.minH,\n maxW: item.maxW,\n maxH: item.maxH,\n };\n }\n\n return positions;\n}\n\n/**\n * Dashboard grid layout component.\n *\n * Uses react-grid-layout to provide a responsive, draggable and resizable grid.\n * Supports multiple breakpoints for mobile-friendly layouts.\n *\n * @example\n * ```tsx\n * <DashboardLayout\n * widgets={widgets}\n * layout={dashboardLayout}\n * editable={true}\n * onLayoutChange={(positions) => updatePositions(positions)}\n * renderWidget={(widget) => <Widget widget={widget} />}\n * />\n * ```\n */\nexport function DashboardLayout({\n widgets,\n layout,\n editable = false,\n onLayoutChange,\n renderWidget,\n className = '',\n}: DashboardLayoutProps): JSX.Element {\n const { theme } = useTheme();\n\n // Convert widgets to grid layout\n const baseLayout = useMemo(() => widgetsToLayout(widgets), [widgets]);\n\n // Generate responsive layouts\n const responsiveLayouts = useMemo(\n () => generateResponsiveLayouts(baseLayout, layout.columns || 12),\n [baseLayout, layout.columns]\n );\n\n // Handle layout changes\n // The legacy API passes (currentLayout, allLayouts) but we only need currentLayout\n const handleLayoutChange = useCallback(\n (currentLayout: readonly LayoutItem[]) => {\n if (onLayoutChange) {\n // Convert readonly array to mutable for our internal function\n const positions = layoutToPositions([...currentLayout]);\n onLayoutChange(positions);\n }\n },\n [onLayoutChange]\n );\n\n // Base styles\n const containerStyle: React.CSSProperties = {\n backgroundColor: theme.colors.background,\n minHeight: '100%',\n width: '100%',\n position: 'relative',\n };\n\n const itemStyle: React.CSSProperties = {\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.md,\n boxShadow: theme.shadows.sm,\n // Don't use overflow: hidden - it clips dropdown menus\n display: 'flex',\n flexDirection: 'column',\n };\n\n // Drag handle style (for editable mode)\n const dragHandleStyle: React.CSSProperties = {\n cursor: editable ? 'move' : 'default',\n height: '100%',\n width: '100%',\n };\n\n return (\n <div className={className} style={containerStyle}>\n <ResponsiveGridLayout\n layouts={responsiveLayouts}\n breakpoints={BREAKPOINTS}\n cols={COLS}\n rowHeight={layout.row_height || 60}\n margin={layout.margin || [16, 16]}\n containerPadding={[16, 16]}\n compactType={layout.compact_type || 'vertical'}\n isDraggable={editable}\n isResizable={editable}\n onLayoutChange={handleLayoutChange}\n draggableHandle=\".prismiq-widget-drag-handle\"\n useCSSTransforms={true}\n >\n {widgets.map((widget) => (\n <div key={widget.id} style={itemStyle}>\n <div className=\"prismiq-widget-drag-handle\" style={dragHandleStyle}>\n {renderWidget(widget)}\n </div>\n </div>\n ))}\n </ResponsiveGridLayout>\n\n {/* Inline styles for react-grid-layout */}\n <style>{`\n .react-grid-layout {\n position: relative;\n }\n .react-grid-item {\n transition: all 200ms ease;\n transition-property: left, top, width, height;\n }\n .react-grid-item.cssTransforms {\n transition-property: transform, width, height;\n }\n .react-grid-item.resizing {\n transition: none;\n z-index: 1;\n will-change: width, height;\n }\n .react-grid-item.react-draggable-dragging {\n transition: none;\n z-index: 3;\n will-change: transform;\n box-shadow: ${theme.shadows.lg};\n }\n .react-grid-item.dropping {\n visibility: hidden;\n }\n .react-grid-item > .react-resizable-handle {\n position: absolute;\n width: 20px;\n height: 20px;\n }\n .react-grid-item > .react-resizable-handle::after {\n content: \"\";\n position: absolute;\n right: 3px;\n bottom: 3px;\n width: 8px;\n height: 8px;\n border-right: 2px solid ${theme.colors.border};\n border-bottom: 2px solid ${theme.colors.border};\n }\n .react-grid-item > .react-resizable-handle.react-resizable-handle-se {\n bottom: 0;\n right: 0;\n cursor: se-resize;\n }\n .react-grid-item > .react-resizable-handle.react-resizable-handle-sw {\n bottom: 0;\n left: 0;\n cursor: sw-resize;\n }\n .react-grid-item > .react-resizable-handle.react-resizable-handle-nw {\n top: 0;\n left: 0;\n cursor: nw-resize;\n }\n .react-grid-item > .react-resizable-handle.react-resizable-handle-ne {\n top: 0;\n right: 0;\n cursor: ne-resize;\n }\n .react-grid-item > .react-resizable-handle.react-resizable-handle-w,\n .react-grid-item > .react-resizable-handle.react-resizable-handle-e {\n top: 50%;\n margin-top: -10px;\n cursor: ew-resize;\n }\n .react-grid-item > .react-resizable-handle.react-resizable-handle-w {\n left: 0;\n }\n .react-grid-item > .react-resizable-handle.react-resizable-handle-e {\n right: 0;\n }\n .react-grid-item > .react-resizable-handle.react-resizable-handle-n,\n .react-grid-item > .react-resizable-handle.react-resizable-handle-s {\n left: 50%;\n margin-left: -10px;\n cursor: ns-resize;\n }\n .react-grid-item > .react-resizable-handle.react-resizable-handle-n {\n top: 0;\n }\n .react-grid-item > .react-resizable-handle.react-resizable-handle-s {\n bottom: 0;\n }\n .react-grid-placeholder {\n background: ${theme.colors.primary};\n opacity: 0.2;\n border-radius: ${theme.radius.md};\n transition-duration: 100ms;\n z-index: 2;\n user-select: none;\n }\n\n /* Responsive adjustments */\n @media (max-width: 768px) {\n .react-grid-item > .react-resizable-handle {\n width: 16px;\n height: 16px;\n }\n }\n\n @media (max-width: 480px) {\n .react-grid-item > .react-resizable-handle {\n display: none;\n }\n }\n `}</style>\n </div>\n );\n}\n","/**\n * EditableDashboardLayout component.\n *\n * Wraps DashboardLayout with auto-save functionality for layout changes.\n */\n\nimport { useCallback, useMemo, type ReactNode } from 'react';\n\nimport { AutoSaveIndicator } from '../../components/AutoSaveIndicator';\nimport {\n useDebouncedLayoutSave,\n type SaveStatus,\n} from '../../hooks/useDebouncedLayoutSave';\nimport { useTheme } from '../../theme';\nimport type { Widget, WidgetPosition, DashboardLayout as DashboardLayoutType } from '../types';\nimport type { WidgetPositionUpdate } from '../../types';\nimport { DashboardLayout } from './DashboardLayout';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface EditableDashboardLayoutProps {\n /** Dashboard ID for saving. */\n dashboardId: string;\n /** Widgets to render. */\n widgets: Widget[];\n /** Layout configuration. */\n layout: DashboardLayoutType;\n /** Render function for each widget. */\n renderWidget: (widget: Widget) => ReactNode;\n /** Debounce delay for saves. */\n debounceMs?: number;\n /** Duration to show saved indicator. */\n savedDurationMs?: number;\n /** Callback on successful save. */\n onSave?: () => void;\n /** Callback on save error. */\n onError?: (error: Error) => void;\n /** Callback when layout changes (for optimistic updates). */\n onLayoutChange?: (positions: Record<string, WidgetPosition>) => void;\n /** Additional CSS class. */\n className?: string;\n}\n\nexport interface EditableDashboardLayoutResult {\n /** Current save status. */\n status: SaveStatus;\n /** Last error if any. */\n error: Error | null;\n /** Force save immediately. */\n flush: () => Promise<void>;\n /** Cancel pending save. */\n cancel: () => void;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Editable dashboard layout with auto-save.\n *\n * Wraps DashboardLayout and automatically saves position changes\n * with debouncing and visual feedback.\n *\n * @example\n * ```tsx\n * function EditableDashboard({ id, widgets, layout }: Props) {\n * const renderWidget = useCallback((widget: Widget) => (\n * <WidgetContainer widget={widget} editable />\n * ), []);\n *\n * return (\n * <EditableDashboardLayout\n * dashboardId={id}\n * widgets={widgets}\n * layout={layout}\n * renderWidget={renderWidget}\n * debounceMs={500}\n * />\n * );\n * }\n * ```\n */\nexport function EditableDashboardLayout({\n dashboardId,\n widgets,\n layout,\n renderWidget,\n debounceMs = 500,\n savedDurationMs = 2000,\n onSave,\n onError,\n onLayoutChange,\n className = '',\n}: EditableDashboardLayoutProps): JSX.Element {\n const { theme } = useTheme();\n\n // Auto-save hook\n const { queueUpdate, status, error } = useDebouncedLayoutSave({\n dashboardId,\n debounceMs,\n savedDurationMs,\n onSave,\n onError,\n });\n\n // Handle layout changes from the grid\n const handleLayoutChange = useCallback(\n (positions: Record<string, WidgetPosition>) => {\n // Convert to position update format\n const updates: WidgetPositionUpdate[] = Object.entries(positions).map(\n ([widgetId, position]) => ({\n widget_id: widgetId,\n position: {\n x: position.x,\n y: position.y,\n w: position.w,\n h: position.h,\n },\n })\n );\n\n // Queue the save\n queueUpdate(updates);\n\n // Call optional callback for optimistic updates\n onLayoutChange?.(positions);\n },\n [queueUpdate, onLayoutChange]\n );\n\n // Container styles\n const containerStyles = useMemo(\n (): React.CSSProperties => ({\n position: 'relative',\n height: '100%',\n }),\n []\n );\n\n const statusBarStyles = useMemo(\n (): React.CSSProperties => ({\n position: 'absolute',\n top: theme.spacing.sm,\n right: theme.spacing.sm,\n zIndex: 100,\n }),\n [theme.spacing]\n );\n\n return (\n <div\n className={`prismiq-editable-dashboard-layout ${className}`}\n style={containerStyles}\n data-testid=\"dashboard-container\"\n >\n {/* Auto-save indicator */}\n <div style={statusBarStyles}>\n <AutoSaveIndicator status={status} error={error} />\n </div>\n\n {/* Editable grid layout */}\n <DashboardLayout\n widgets={widgets}\n layout={layout}\n editable={true}\n onLayoutChange={handleLayoutChange}\n renderWidget={renderWidget}\n />\n </div>\n );\n}\n","/**\n * Widget header component with title, refresh button, and actions.\n */\n\nimport { useTheme } from '../../theme';\nimport { Icon } from '../../components/ui';\nimport { formatRelativeTime } from '../../utils';\nimport type { WidgetHeaderProps } from '../types';\n\n/**\n * Widget header with title, refresh timestamp, and optional hyperlink.\n */\nexport function WidgetHeader({\n title,\n hyperlink,\n lastRefreshed,\n isRefreshing,\n onRefresh,\n}: WidgetHeaderProps): JSX.Element {\n const { theme } = useTheme();\n\n const headerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${theme.spacing.sm} ${theme.spacing.md}`,\n borderBottom: `1px solid ${theme.colors.border}`,\n backgroundColor: theme.colors.surface,\n minHeight: '40px',\n };\n\n const titleStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.base,\n fontWeight: 500,\n color: theme.colors.text,\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n flex: 1,\n };\n\n const actionsStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.xs,\n marginLeft: theme.spacing.sm,\n };\n\n const actionButtonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '28px',\n height: '28px',\n padding: 0,\n border: 'none',\n borderRadius: theme.radius.sm,\n backgroundColor: 'transparent',\n color: theme.colors.textMuted,\n cursor: isRefreshing ? 'default' : 'pointer',\n transition: 'background-color 150ms, color 150ms',\n textDecoration: 'none',\n opacity: isRefreshing ? 0.6 : 1,\n };\n\n const timestampStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n whiteSpace: 'nowrap',\n };\n\n const handleRefresh = () => {\n if (!isRefreshing && onRefresh) {\n onRefresh();\n }\n };\n\n return (\n <div style={headerStyle} className=\"prismiq-widget-header\">\n <h3 style={titleStyle}>{title}</h3>\n\n <div style={actionsStyle}>\n {/* Last refreshed timestamp */}\n {lastRefreshed !== undefined && (\n <span style={timestampStyle} title={`Last refreshed: ${new Date(lastRefreshed * 1000).toLocaleString()}`}>\n {formatRelativeTime(lastRefreshed)}\n </span>\n )}\n\n {/* Refresh button */}\n {onRefresh && (\n <button\n onClick={handleRefresh}\n disabled={isRefreshing}\n style={actionButtonStyle}\n className=\"prismiq-widget-action-button\"\n aria-label={isRefreshing ? 'Refreshing...' : 'Refresh widget'}\n title={isRefreshing ? 'Refreshing...' : 'Refresh widget'}\n >\n <Icon\n name=\"sync\"\n size={16}\n className={isRefreshing ? 'prismiq-spin' : undefined}\n />\n </button>\n )}\n\n {/* Hyperlink button */}\n {hyperlink && (\n <a\n href={hyperlink.url}\n target={hyperlink.target ?? '_blank'}\n rel=\"noopener noreferrer\"\n title={hyperlink.title ?? 'Open link'}\n style={actionButtonStyle}\n className=\"prismiq-widget-action-button\"\n aria-label={hyperlink.title ?? 'Open link'}\n >\n <Icon name=\"link\" size={16} />\n </a>\n )}\n </div>\n\n <style>{`\n .prismiq-widget-action-button:hover:not(:disabled) {\n background-color: ${theme.colors.surfaceHover};\n color: ${theme.colors.text};\n }\n .prismiq-widget-action-button:disabled {\n cursor: default;\n }\n @keyframes prismiq-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n }\n .prismiq-spin {\n animation: prismiq-spin 1s linear infinite;\n }\n `}</style>\n </div>\n );\n}\n","/**\n * Widget content renderer that displays the appropriate chart or component.\n */\n\nimport { useMemo, useCallback } from 'react';\nimport { useTheme } from '../../theme';\nimport {\n MetricCard,\n BarChart,\n LineChart,\n AreaChart,\n PieChart,\n ScatterChart,\n} from '../../charts';\nimport { ResultsTable } from '../../components';\nimport { useCrossFilterOptional } from '../../context';\nimport { createDateFormatters, pivotQueryResult, parseMarkdownSafe } from '../../utils';\nimport type { Widget, WidgetConfig } from '../types';\nimport type { QueryResult, DateTruncInterval } from '../../types';\nimport type { ChartDataPoint, ChartClickParams, CrossFilterConfig } from '../../charts/types';\n\n/**\n * Map date_trunc granularity to a display format string.\n * Uses formats compatible with createDateFormatter.\n */\nconst DATE_TRUNC_FORMAT_MAP: Record<DateTruncInterval, string> = {\n year: 'yyyy',\n quarter: 'QQ yyyy',\n month: 'yyyy-MM',\n week: 'yyyy-MM-dd',\n day: 'yyyy-MM-dd',\n};\n\n/**\n * Props for WidgetContent.\n */\nexport interface WidgetContentProps {\n /** Widget to render. */\n widget: Widget;\n /** Query result data. */\n result: QueryResult | null;\n /** Whether data is loading. */\n isLoading?: boolean;\n /** Error if query failed. */\n error?: Error | null;\n /** Whether widget is being force-refreshed (shows spinner overlay). */\n isRefreshing?: boolean;\n}\n\n/**\n * Render text/markdown content.\n */\nfunction TextContent({ config }: { config: WidgetConfig }): JSX.Element {\n const { theme } = useTheme();\n\n // Map alignment config to CSS text-align\n const textAlignMap: Record<string, React.CSSProperties['textAlign']> = {\n Left: 'left',\n Center: 'center',\n Right: 'right',\n };\n const textAlign = textAlignMap[config.alignment as string] ?? 'left';\n\n // Map fontSize config to theme font sizes\n const fontSizeMap: Record<string, string> = {\n Small: theme.fontSizes.sm,\n Normal: theme.fontSizes.base,\n Large: theme.fontSizes.lg,\n XLarge: theme.fontSizes.xl,\n };\n const fontSize = fontSizeMap[config.fontSize as string] ?? theme.fontSizes.base;\n\n const contentStyle: React.CSSProperties = {\n padding: theme.spacing.md,\n fontSize,\n color: theme.colors.text,\n lineHeight: 1.6,\n textAlign,\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n height: '100%',\n };\n\n // If no text content, render nothing (title is shown in widget header)\n if (!config.content) {\n return <></>;\n }\n\n // Render markdown if enabled\n if (config.markdown) {\n const codeStyle = `background: ${theme.colors.surface}; padding: 0.1em 0.3em; border-radius: 3px; font-family: ${theme.fonts.mono};`;\n return (\n <div\n style={contentStyle}\n dangerouslySetInnerHTML={{ __html: parseMarkdownSafe(config.content, codeStyle) }}\n />\n );\n }\n\n // Plain text with line breaks\n return (\n <div style={contentStyle}>\n {config.content.split('\\n').map((line, i) => (\n <p key={i} style={{ margin: `${theme.spacing.xs} 0` }}>\n {line}\n </p>\n ))}\n </div>\n );\n}\n\n/**\n * Render loading state.\n */\nfunction LoadingState(): JSX.Element {\n const { theme } = useTheme();\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n minHeight: '100px',\n color: theme.colors.textMuted,\n };\n\n const spinnerStyle: React.CSSProperties = {\n width: '32px',\n height: '32px',\n border: `3px solid ${theme.colors.border}`,\n borderTopColor: theme.colors.primary,\n borderRadius: '50%',\n animation: 'prismiq-widget-spin 1s linear infinite',\n };\n\n return (\n <div style={containerStyle}>\n <div style={spinnerStyle} />\n <style>{`\n @keyframes prismiq-widget-spin {\n to { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n );\n}\n\n/**\n * Render error state.\n */\nfunction ErrorState({ error }: { error: Error }): JSX.Element {\n const { theme } = useTheme();\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n minHeight: '100px',\n padding: theme.spacing.md,\n textAlign: 'center',\n };\n\n const iconStyle: React.CSSProperties = {\n fontSize: '24px',\n marginBottom: theme.spacing.sm,\n color: theme.colors.error,\n };\n\n const messageStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n color: theme.colors.error,\n };\n\n return (\n <div style={containerStyle}>\n <div style={iconStyle}>!</div>\n <div style={messageStyle}>{error.message}</div>\n </div>\n );\n}\n\n/**\n * Render empty state.\n */\nfunction EmptyState(): JSX.Element {\n const { theme } = useTheme();\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n minHeight: '100px',\n color: theme.colors.textMuted,\n fontSize: theme.fontSizes.sm,\n };\n\n return <div style={containerStyle}>No data</div>;\n}\n\n/**\n * Convert QueryResult to ChartDataPoint array.\n */\nfunction resultToDataPoints(result: QueryResult): ChartDataPoint[] {\n return result.rows.map((row) => {\n const record: ChartDataPoint = {};\n result.columns.forEach((col, i) => {\n const value = row[i];\n // Only include string, number, or null values\n if (typeof value === 'string' || typeof value === 'number' || value === null) {\n record[col] = value;\n } else if (value !== undefined) {\n record[col] = String(value);\n }\n });\n return record;\n });\n}\n\n/**\n * Spinner overlay shown during loading/refresh.\n * Uses theme-aware colors for proper dark/light mode support.\n */\nfunction RefreshOverlay(): JSX.Element {\n const { theme } = useTheme();\n\n const overlayStyle: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n // Use theme surface color with opacity for theme-aware overlay\n backgroundColor: `${theme.colors.surface}e6`, // e6 = ~90% opacity in hex\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 10,\n };\n\n const spinnerStyle: React.CSSProperties = {\n width: '32px',\n height: '32px',\n border: `3px solid ${theme.colors.border}`,\n borderTopColor: theme.colors.primary,\n borderRadius: '50%',\n animation: 'prismiq-widget-spin 1s linear infinite',\n };\n\n return (\n <div style={overlayStyle}>\n <div style={spinnerStyle} />\n <style>{`\n @keyframes prismiq-widget-spin {\n to { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n );\n}\n\n/**\n * Widget content renderer.\n *\n * Renders the appropriate visualization based on widget type.\n */\nexport function WidgetContent({\n widget,\n result,\n isLoading = false,\n error,\n isRefreshing = false,\n}: WidgetContentProps): JSX.Element {\n const { theme } = useTheme();\n\n // Get cross-filter context (may be null if not wrapped in CrossFilterProvider)\n const crossFilterContext = useCrossFilterOptional();\n\n // Convert result rows to chart data format - must be called unconditionally (Rules of Hooks)\n const data = useMemo(() => (result ? resultToDataPoints(result) : []), [result]);\n\n // Determine if cross-filtering is enabled for this widget\n // By default, enable cross-filtering for chart types that support click interaction\n const chartTypesWithCrossFilter = ['bar_chart', 'pie_chart', 'line_chart', 'area_chart'];\n const defaultCrossFilterEnabled = chartTypesWithCrossFilter.includes(widget.type);\n const crossFilterEnabled = widget.config.cross_filter?.enabled ?? defaultCrossFilterEnabled;\n const crossFilterColumn = widget.config.cross_filter?.column ?? widget.config.x_axis;\n\n // Build cross-filter config for chart components\n const crossFilterConfig: CrossFilterConfig | undefined = useMemo(() => {\n if (!crossFilterEnabled || !crossFilterContext) return undefined;\n return {\n enabled: true,\n widgetId: widget.id,\n column: crossFilterColumn,\n };\n }, [crossFilterEnabled, crossFilterContext, widget.id, crossFilterColumn]);\n\n // Get selected value for this widget (from cross-filters applied by other widgets)\n const selectedValue = useMemo((): string | number | null => {\n if (!crossFilterContext) return null;\n // Find any filter that applies to this widget's filter column\n const applicableFilter = crossFilterContext.filters.find(\n (f) => f.sourceWidgetId !== widget.id && f.column === crossFilterColumn\n );\n if (!applicableFilter) return null;\n // If value is an array, use first value for single selection\n const value = applicableFilter.value;\n if (Array.isArray(value)) {\n return value[0] ?? null;\n }\n return value;\n }, [crossFilterContext, widget.id, crossFilterColumn]);\n\n // Handle chart click for cross-filtering\n const handleChartClick = useCallback(\n (params: ChartClickParams) => {\n if (!crossFilterContext || !crossFilterEnabled) return;\n\n crossFilterContext.toggleFilter({\n sourceWidgetId: widget.id,\n column: crossFilterColumn ?? '',\n value: params.name,\n });\n },\n [crossFilterContext, crossFilterEnabled, widget.id, crossFilterColumn]\n );\n\n // Create date formatters for table widgets (must be called unconditionally per Rules of Hooks)\n const dateFormatters = useMemo(() => {\n if (widget.type === 'table' && widget.config.dateFormats) {\n return createDateFormatters(widget.config.dateFormats);\n }\n return undefined;\n }, [widget.type, widget.config.dateFormats]);\n\n // Auto-derive xAxisFormat from query's date_trunc when no explicit dateFormats configured\n const derivedXAxisFormat = useMemo((): string | undefined => {\n if (!widget.query) return undefined;\n // Find the x-axis column (first non-aggregated column, or the configured x_axis)\n const xAxisCol = widget.config.x_axis ?? widget.query.columns[0]?.column;\n if (!xAxisCol) return undefined;\n\n const col = widget.query.columns.find(\n (c) => c.column === xAxisCol && c.date_trunc\n );\n if (!col?.date_trunc) return undefined;\n\n return DATE_TRUNC_FORMAT_MAP[col.date_trunc];\n }, [widget.query, widget.config.x_axis]);\n\n // Container style\n const containerStyle: React.CSSProperties = {\n flex: 1,\n overflow: 'auto',\n position: 'relative',\n };\n\n // Handle loading state - show spinner, hide old data\n // Same behavior for initial load and filter changes\n if (isLoading) {\n return (\n <div style={containerStyle}>\n <LoadingState />\n </div>\n );\n }\n\n // Wrapper for content (only shows refresh overlay for manual refresh)\n const wrapWithContainer = (content: JSX.Element): JSX.Element => {\n if (isRefreshing && result) {\n return (\n <div style={containerStyle}>\n <RefreshOverlay />\n {content}\n </div>\n );\n }\n return <div style={containerStyle}>{content}</div>;\n };\n\n // Handle error state\n if (error) {\n return (\n <div style={containerStyle}>\n <ErrorState error={error} />\n </div>\n );\n }\n\n // Handle text widgets (no query result needed)\n if (widget.type === 'text') {\n return (\n <div style={containerStyle}>\n <TextContent config={widget.config} />\n </div>\n );\n }\n\n // Handle empty result\n if (!result || result.row_count === 0) {\n return (\n <div style={containerStyle}>\n <EmptyState />\n </div>\n );\n }\n\n // Extract chart configuration from widget config\n const xAxis = widget.config.x_axis ?? result.columns[0] ?? '';\n const yAxisConfig = widget.config.y_axis ?? [result.columns[1] ?? result.columns[0] ?? ''];\n const yAxis: string[] = yAxisConfig.filter((y): y is string => y !== undefined);\n const showLegend = widget.config.show_legend ?? true;\n const showDataLabels = widget.config.show_data_labels ?? false;\n const colors = widget.config.colors ?? theme.chart.colors;\n\n // Render based on widget type\n switch (widget.type) {\n case 'metric': {\n const value = result.rows[0]?.[0];\n const comparisonValue = widget.config.trend_comparison\n ? result.rows[0]?.[result.columns.indexOf(widget.config.trend_comparison)]\n : undefined;\n\n return wrapWithContainer(\n <MetricCard\n title=\"\"\n value={typeof value === 'number' ? value : Number(value) || 0}\n format={widget.config.format ?? 'number'}\n currencySymbol={widget.config.currencySymbol}\n decimals={widget.config.decimalDigits}\n compactNotation={widget.config.compactNotation}\n centered={true}\n trend={\n comparisonValue !== undefined\n ? {\n value: Number(comparisonValue) || 0,\n direction:\n Number(comparisonValue) > 0\n ? 'up'\n : Number(comparisonValue) < 0\n ? 'down'\n : 'flat',\n }\n : undefined\n }\n />\n );\n }\n\n case 'bar_chart':\n return wrapWithContainer(\n <BarChart\n data={data}\n xAxis={xAxis}\n yAxis={yAxis}\n orientation={widget.config.orientation ?? 'vertical'}\n stacked={widget.config.stacked}\n showLegend={showLegend}\n showDataLabels={showDataLabels}\n colors={colors}\n xAxisFormat={widget.config.dateFormats?.[xAxis] ?? derivedXAxisFormat}\n yAxisFormat={widget.config.valueFormat ?? 'number'}\n currencySymbol={widget.config.currencySymbol}\n compactNotation={widget.config.compactNotation}\n decimalDigits={widget.config.decimalDigits}\n referenceLines={widget.config.referenceLines}\n height=\"100%\"\n crossFilter={crossFilterConfig}\n selectedValue={selectedValue}\n onDataPointClick={crossFilterEnabled ? handleChartClick : undefined}\n />\n );\n\n case 'line_chart':\n return wrapWithContainer(\n <LineChart\n data={data}\n xAxis={xAxis}\n yAxis={yAxis}\n seriesColumn={widget.config.series_column}\n maxSeries={widget.config.max_series}\n showLegend={showLegend}\n showDataLabels={showDataLabels}\n colors={colors}\n xAxisFormat={widget.config.dateFormats?.[xAxis] ?? derivedXAxisFormat}\n referenceLines={widget.config.referenceLines}\n height=\"100%\"\n crossFilter={crossFilterConfig}\n selectedValue={selectedValue}\n onDataPointClick={crossFilterEnabled ? handleChartClick : undefined}\n />\n );\n\n case 'area_chart':\n return wrapWithContainer(\n <AreaChart\n data={data}\n xAxis={xAxis}\n yAxis={yAxis}\n stacked={widget.config.stacked}\n showLegend={showLegend}\n colors={colors}\n xAxisFormat={widget.config.dateFormats?.[xAxis] ?? derivedXAxisFormat}\n height=\"100%\"\n crossFilter={crossFilterConfig}\n selectedValue={selectedValue}\n onDataPointClick={crossFilterEnabled ? handleChartClick : undefined}\n />\n );\n\n case 'pie_chart':\n return wrapWithContainer(\n <PieChart\n data={data}\n labelColumn={xAxis}\n valueColumn={yAxis[0] ?? ''}\n showLegend={showLegend}\n showLabels={showDataLabels}\n colors={colors}\n labelFormat={widget.config.dateFormats?.[xAxis] ?? derivedXAxisFormat}\n height=\"100%\"\n crossFilter={crossFilterConfig}\n selectedValue={selectedValue}\n onDataPointClick={crossFilterEnabled ? handleChartClick : undefined}\n />\n );\n\n case 'scatter_chart':\n return wrapWithContainer(\n <ScatterChart\n data={data}\n xAxis={xAxis}\n yAxis={yAxis[0] ?? ''}\n height=\"100%\"\n />\n );\n\n case 'table': {\n // Check if this is a pivot table\n let tableResult = result;\n\n if (widget.config.pivot_column && widget.config.value_column) {\n // Get dimension columns (all columns except pivot and value)\n const dimensionColumns = result.columns.filter(\n (col) => col !== widget.config.pivot_column && col !== widget.config.value_column\n );\n\n // Pivot the data\n tableResult = pivotQueryResult(result, {\n pivotColumn: widget.config.pivot_column,\n valueColumn: widget.config.value_column,\n dimensionColumns,\n });\n }\n\n // For tables, use a non-scrolling container so the table handles its own scrolling\n // This allows the sticky header to work properly\n const tableContainerStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden', // Don't scroll here - let ResultsTable handle it\n position: 'relative',\n };\n\n const tableContent = (\n <ResultsTable\n result={tableResult}\n pageSize={widget.config.page_size ?? 10}\n sortable={widget.config.sortable ?? true}\n formatters={dateFormatters}\n />\n );\n\n // Handle refresh overlay for tables (manual refresh only)\n // Note: isLoading is handled earlier and shows LoadingState\n if (isRefreshing) {\n return (\n <div style={tableContainerStyle}>\n <RefreshOverlay />\n {tableContent}\n </div>\n );\n }\n\n return <div style={tableContainerStyle}>{tableContent}</div>;\n }\n\n default:\n return wrapWithContainer(<EmptyState />);\n }\n}\n","/**\n * Widget container component.\n */\n\nimport { useTheme } from '../../theme';\nimport { WidgetHeader } from './WidgetHeader';\nimport { WidgetContent } from './WidgetContent';\nimport type { WidgetProps } from '../types';\n\n/**\n * Widget container with header and content.\n *\n * @example\n * ```tsx\n * <Widget\n * widget={widget}\n * result={queryResult}\n * isLoading={false}\n * lastRefreshed={1706123456}\n * isRefreshing={false}\n * onRefresh={() => refreshWidget(widget.id)}\n * />\n * ```\n */\nexport function Widget({\n widget,\n result,\n isLoading = false,\n error,\n className = '',\n lastRefreshed,\n isRefreshing = false,\n onRefresh,\n}: WidgetProps): JSX.Element {\n const { theme } = useTheme();\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.md,\n };\n\n return (\n <div className={`prismiq-widget ${className}`} style={containerStyle}>\n <WidgetHeader\n title={widget.title}\n hyperlink={widget.hyperlink}\n lastRefreshed={lastRefreshed}\n isRefreshing={isRefreshing}\n onRefresh={onRefresh}\n />\n <WidgetContent\n widget={widget}\n result={result}\n isLoading={isLoading}\n error={error}\n isRefreshing={isRefreshing}\n />\n </div>\n );\n}\n","/**\n * WidgetContainer component.\n *\n * Wraps a widget with drag handle and edit controls for editable mode.\n */\n\nimport { useState, type ReactNode } from 'react';\n\nimport { Button } from '../../components/ui/Button';\nimport { Icon } from '../../components/ui/Icon';\nimport { useTheme } from '../../theme';\nimport type { Widget } from '../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface WidgetContainerProps {\n /** Widget data. */\n widget: Widget;\n /** Dashboard ID. */\n dashboardId: string;\n /** Whether the widget is editable. */\n editable?: boolean;\n /** Callback when edit is clicked. */\n onEdit?: (widget: Widget) => void;\n /** Callback when delete is clicked. */\n onDelete?: (widgetId: string) => void;\n /** Callback when duplicate is clicked. */\n onDuplicate?: (widgetId: string) => void;\n /** Widget content to render. */\n children: ReactNode;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Container for widgets with edit controls.\n *\n * Shows drag handle and action buttons on hover in editable mode.\n *\n * @example\n * ```tsx\n * <WidgetContainer\n * widget={widget}\n * dashboardId={dashboardId}\n * editable={true}\n * onEdit={(w) => openEditor(w)}\n * onDelete={(id) => deleteWidget(id)}\n * >\n * <WidgetContent widget={widget} result={result} />\n * </WidgetContainer>\n * ```\n */\nexport function WidgetContainer({\n widget,\n dashboardId: _dashboardId,\n editable = false,\n onEdit,\n onDelete,\n onDuplicate,\n children,\n}: WidgetContainerProps): JSX.Element {\n const { theme } = useTheme();\n const [isHovered, setIsHovered] = useState(false);\n\n // Container styles\n const containerStyles: React.CSSProperties = {\n position: 'relative',\n height: '100%',\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.md,\n border: `1px solid ${theme.colors.border}`,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n };\n\n // Drag handle styles\n const dragHandleStyles: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '24px',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.colors.surfaceHover,\n cursor: 'grab',\n opacity: isHovered && editable ? 1 : 0,\n transition: 'opacity 0.2s',\n zIndex: 10,\n fontSize: '12px',\n color: theme.colors.textMuted,\n userSelect: 'none',\n };\n\n // Edit overlay styles\n const overlayStyles: React.CSSProperties = {\n position: 'absolute',\n top: theme.spacing.sm,\n right: theme.spacing.sm,\n display: 'flex',\n gap: theme.spacing.xs,\n zIndex: 20,\n opacity: isHovered && editable ? 1 : 0,\n transition: 'opacity 0.2s',\n };\n\n // Content wrapper styles (adds padding when drag handle is visible)\n const contentStyles: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n paddingLeft: editable && isHovered ? '24px' : 0,\n transition: 'padding-left 0.2s',\n };\n\n return (\n <div\n className={`prismiq-widget-container ${editable ? 'editable' : ''}`}\n style={containerStyles}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n data-testid={`widget-container-${widget.id}`}\n >\n {/* Drag handle for react-grid-layout */}\n {editable && (\n <div\n className=\"prismiq-widget-drag-handle\"\n style={dragHandleStyles}\n title=\"Drag to move\"\n >\n <span style={{ transform: 'rotate(90deg)' }}>⋮⋮</span>\n </div>\n )}\n\n {/* Widget content */}\n <div style={contentStyles}>{children}</div>\n\n {/* Edit controls overlay */}\n {editable && (\n <div style={overlayStyles}>\n {onDuplicate && (\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={(e) => {\n e.stopPropagation();\n onDuplicate(widget.id);\n }}\n title=\"Duplicate\"\n data-testid=\"duplicate-widget-button\"\n >\n <Icon name=\"copy\" size={14} />\n </Button>\n )}\n {onEdit && (\n <Button\n size=\"sm\"\n variant=\"secondary\"\n onClick={(e) => {\n e.stopPropagation();\n onEdit(widget);\n }}\n title=\"Edit\"\n data-testid=\"edit-widget-button\"\n >\n <Icon name=\"edit\" size={14} />\n </Button>\n )}\n {onDelete && (\n <Button\n size=\"sm\"\n variant=\"danger\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete(widget.id);\n }}\n title=\"Delete\"\n data-testid=\"delete-widget-button\"\n >\n <Icon name=\"trash\" size={14} />\n </Button>\n )}\n </div>\n )}\n\n {/* Inline styles for active drag state */}\n <style>\n {`\n .prismiq-widget-container.editable .prismiq-widget-drag-handle:active {\n cursor: grabbing;\n }\n `}\n </style>\n </div>\n );\n}\n","/**\n * Placeholder component shown for widgets before they become visible.\n *\n * Displays a lightweight skeleton matching the widget's visual structure.\n */\n\nimport { useTheme } from '../../theme';\nimport type { Widget } from '../types';\n\n/**\n * Props for WidgetPlaceholder.\n */\nexport interface WidgetPlaceholderProps {\n /** Widget to show placeholder for. */\n widget: Widget;\n}\n\n/**\n * Skeleton placeholder for widgets not yet visible.\n *\n * Shows widget title and a loading skeleton to indicate content will load\n * when the user scrolls to this position.\n */\nexport function WidgetPlaceholder({ widget }: Readonly<WidgetPlaceholderProps>): JSX.Element {\n const { theme } = useTheme();\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.md,\n };\n\n const headerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${theme.spacing.sm} ${theme.spacing.md}`,\n borderBottom: `1px solid ${theme.colors.border}`,\n minHeight: '40px',\n };\n\n const titleStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n fontWeight: 500,\n color: theme.colors.text,\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n };\n\n const contentStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: theme.spacing.md,\n };\n\n const skeletonContainerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: theme.spacing.sm,\n };\n\n const skeletonBarStyle: React.CSSProperties = {\n height: '8px',\n backgroundColor: theme.colors.border,\n borderRadius: theme.radius.sm,\n animation: 'prismiq-skeleton-pulse 1.5s ease-in-out infinite',\n };\n\n const hintStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n marginTop: theme.spacing.sm,\n };\n\n return (\n <div className=\"prismiq-widget-placeholder\" style={containerStyle}>\n <div style={headerStyle}>\n <h3 style={titleStyle}>{widget.title}</h3>\n </div>\n <div style={contentStyle}>\n <div style={skeletonContainerStyle}>\n <div style={{ ...skeletonBarStyle, width: '120px' }} />\n <div style={{ ...skeletonBarStyle, width: '80px' }} />\n <div style={{ ...skeletonBarStyle, width: '100px' }} />\n <span style={hintStyle}>Scroll to load</span>\n </div>\n </div>\n <style>{`\n @keyframes prismiq-skeleton-pulse {\n 0%, 100% { opacity: 0.4; }\n 50% { opacity: 1; }\n }\n `}</style>\n </div>\n );\n}\n","/**\n * Lazy-loading wrapper for dashboard widgets.\n *\n * Uses Intersection Observer to detect when widgets enter the viewport,\n * then triggers data loading through the DashboardProvider.\n */\n\nimport { useEffect, type ReactNode } from 'react';\nimport { useWidgetVisibility } from '../useWidgetVisibility';\nimport { useDashboard } from '../useDashboard';\nimport { WidgetPlaceholder } from './WidgetPlaceholder';\nimport type { Widget } from '../types';\n\n/**\n * Props for LazyWidget.\n */\nexport interface LazyWidgetProps {\n /** Widget to render. */\n widget: Widget;\n /** Render function for the actual widget content. */\n renderWidget: (widget: Widget) => ReactNode;\n /** Root margin for prefetching (default: \"200px\"). */\n rootMargin?: string;\n}\n\n/**\n * Lazy-loading wrapper component for widgets.\n *\n * Features:\n * - Tracks visibility using Intersection Observer\n * - Reports visibility to DashboardProvider for data loading\n * - Shows placeholder until widget becomes visible\n * - Keeps widget rendered once it has been visible (no re-loading on scroll)\n *\n * @example\n * ```tsx\n * <LazyWidget\n * widget={widget}\n * rootMargin=\"200px\"\n * renderWidget={(w) => (\n * <Widget widget={w} result={results[w.id]} isLoading={loading[w.id]} />\n * )}\n * />\n * ```\n */\nexport function LazyWidget({\n widget,\n renderWidget,\n rootMargin = '200px',\n}: Readonly<LazyWidgetProps>): JSX.Element {\n const { registerVisibility, unregisterVisibility, lazyLoadingEnabled } = useDashboard();\n\n const { ref, isVisible, hasBeenVisible } = useWidgetVisibility({\n rootMargin,\n threshold: 0.1,\n });\n\n // Report visibility changes to DashboardProvider\n useEffect(() => {\n if (lazyLoadingEnabled) {\n registerVisibility(widget.id, isVisible);\n }\n }, [widget.id, isVisible, registerVisibility, lazyLoadingEnabled]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (lazyLoadingEnabled) {\n unregisterVisibility(widget.id);\n }\n };\n }, [widget.id, unregisterVisibility, lazyLoadingEnabled]);\n\n // Determine what to render:\n // - If lazy loading is disabled, always render the widget\n // - If widget has been visible (or is a text widget with no query), render it\n // - Otherwise show placeholder\n const shouldRenderContent =\n !lazyLoadingEnabled || hasBeenVisible || widget.type === 'text';\n\n const containerStyle: React.CSSProperties = {\n height: '100%',\n width: '100%',\n };\n\n return (\n <div ref={ref} style={containerStyle}>\n {shouldRenderContent ? renderWidget(widget) : <WidgetPlaceholder widget={widget} />}\n </div>\n );\n}\n","/**\n * Date range filter component.\n */\n\nimport { useCallback } from 'react';\nimport { useTheme } from '../../theme';\nimport type { DateRangeFilterProps, DateRangeValue } from '../types';\n\n/**\n * Date range filter with start/end date inputs.\n */\nexport function DateRangeFilter({\n filter,\n value,\n onChange,\n}: DateRangeFilterProps): JSX.Element {\n const { theme } = useTheme();\n\n // Parse value\n const dateValue = typeof value === 'object' && value\n ? value\n : { start: '', end: '' };\n\n const handleStartChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue: DateRangeValue = {\n start: e.target.value,\n end: dateValue.end,\n };\n onChange(newValue);\n },\n [dateValue.end, onChange]\n );\n\n const handleEndChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue: DateRangeValue = {\n start: dateValue.start,\n end: e.target.value,\n };\n onChange(newValue);\n },\n [dateValue.start, onChange]\n );\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.xs,\n };\n\n const inputStyle: React.CSSProperties = {\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n fontSize: theme.fontSizes.sm,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.sm,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n fontFamily: theme.fonts.sans,\n minWidth: '130px',\n };\n\n const separatorStyle: React.CSSProperties = {\n color: theme.colors.textMuted,\n };\n\n return (\n <div style={containerStyle}>\n <input\n type=\"date\"\n value={dateValue.start}\n onChange={handleStartChange}\n style={inputStyle}\n aria-label={`${filter.label} start date`}\n />\n <span style={separatorStyle}>to</span>\n <input\n type=\"date\"\n value={dateValue.end}\n onChange={handleEndChange}\n style={inputStyle}\n aria-label={`${filter.label} end date`}\n />\n </div>\n );\n}\n","/**\n * Hook for fetching dynamic filter options from the database.\n */\n\nimport { useState, useEffect, useRef } from 'react';\nimport { useAnalytics } from '../../context';\nimport type { FilterOption, DashboardFilter } from '../types';\n\n/**\n * State returned by useDynamicFilterOptions hook.\n */\nexport interface DynamicFilterOptionsState {\n /** Whether options are loading. */\n isLoading: boolean;\n /** Loaded options. */\n options: FilterOption[];\n /** Error if fetch failed. */\n error: Error | null;\n}\n\n/**\n * Hook to fetch dynamic filter options from the database.\n *\n * When a filter has `dynamic: true`, this hook fetches distinct values\n * from the specified table and column using getColumnSample API.\n *\n * @param filter - The filter definition.\n * @param limit - Maximum number of options to fetch (default: 100).\n * @returns Loading state, options, and any error.\n *\n * @example\n * ```tsx\n * function DynamicSelectFilter({ filter }: { filter: DashboardFilter }) {\n * const { isLoading, options, error } = useDynamicFilterOptions(filter);\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * return (\n * <select>\n * {options.map(opt => (\n * <option key={opt.value} value={opt.value}>{opt.label}</option>\n * ))}\n * </select>\n * );\n * }\n * ```\n */\nexport function useDynamicFilterOptions(\n filter: DashboardFilter,\n limit: number = 100\n): DynamicFilterOptionsState {\n const { client } = useAnalytics();\n const [isLoading, setIsLoading] = useState(false);\n const [options, setOptions] = useState<FilterOption[]>([]);\n const [error, setError] = useState<Error | null>(null);\n const fetchedRef = useRef(false);\n\n useEffect(() => {\n // Skip if not dynamic or already has static options\n if (!filter.dynamic || (filter.options && filter.options.length > 0)) {\n if (filter.options) {\n setOptions(filter.options);\n }\n return;\n }\n\n // Skip if missing required fields\n if (!filter.table || !filter.field) {\n console.warn(\n `Dynamic filter \"${filter.id}\" requires both table and field to be set`\n );\n return;\n }\n\n // Avoid double fetching\n if (fetchedRef.current) return;\n fetchedRef.current = true;\n\n const fetchOptions = async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const values = await client.getColumnSample(\n filter.table!,\n filter.field,\n limit\n );\n\n // Convert values to FilterOption format\n const fetchedOptions: FilterOption[] = values\n .filter((v) => v !== null && v !== undefined)\n .map((v) => {\n const stringValue = String(v);\n return {\n value: stringValue,\n label: stringValue,\n };\n });\n\n setOptions(fetchedOptions);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to load options'));\n // Fall back to static options if available\n if (filter.options) {\n setOptions(filter.options);\n }\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchOptions();\n }, [client, filter, limit]);\n\n return { isLoading, options, error };\n}\n","/**\n * Select filter component with dynamic option loading.\n */\n\nimport { useCallback } from 'react';\nimport { useTheme } from '../../theme';\nimport { useDynamicFilterOptions } from './useDynamicFilterOptions';\nimport type { SelectFilterProps } from '../types';\n\n/**\n * Single select dropdown filter.\n *\n * Supports dynamic option loading when filter.dynamic is true.\n */\nexport function SelectFilter({\n filter,\n value,\n onChange,\n}: SelectFilterProps): JSX.Element {\n const { theme } = useTheme();\n\n // Load dynamic options if filter.dynamic is true\n const { isLoading, options } = useDynamicFilterOptions(filter);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newValue = e.target.value || null;\n onChange(newValue);\n },\n [onChange]\n );\n\n const selectStyle: React.CSSProperties = {\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n paddingRight: theme.spacing.lg,\n fontSize: theme.fontSizes.sm,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.sm,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n fontFamily: theme.fonts.sans,\n minWidth: '150px',\n appearance: 'none' as const,\n backgroundImage: `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23666' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E\")`,\n backgroundRepeat: 'no-repeat',\n backgroundPosition: 'right 8px center',\n cursor: isLoading ? 'wait' : 'pointer',\n opacity: isLoading ? 0.7 : 1,\n };\n\n return (\n <select\n value={value ?? ''}\n onChange={handleChange}\n style={selectStyle}\n aria-label={filter.label}\n disabled={isLoading}\n >\n <option value=\"\">{isLoading ? 'Loading...' : 'All'}</option>\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n );\n}\n","/**\n * Multi-select filter component with dynamic option loading.\n *\n * Features:\n * - \"All\" option at top (visually selects/deselects all options)\n * - Deferred apply (changes only apply on \"Apply\" button click)\n * - Search functionality\n * - Item count display\n * - \"clear all\" link\n */\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useTheme } from '../../theme';\nimport { Icon } from '../../components/ui';\nimport { useDynamicFilterOptions } from './useDynamicFilterOptions';\nimport type { MultiSelectFilterProps } from '../types';\n\n/**\n * Multi-select dropdown filter with deferred apply.\n *\n * Supports dynamic option loading when filter.dynamic is true.\n *\n * Note: External value [] means \"no filter\" (show all data).\n * Internally, we track actual selections. When all options are selected,\n * we send [] to the backend (no filter needed).\n */\nexport function MultiSelectFilter({\n filter,\n value,\n onChange,\n}: MultiSelectFilterProps): JSX.Element {\n const { theme } = useTheme();\n const [isOpen, setIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n // Local state for pending selections (before Apply)\n // Stores actual selected option values\n const [pendingValue, setPendingValue] = useState<string[]>([]);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Load dynamic options if filter.dynamic is true\n const { isLoading, options } = useDynamicFilterOptions(filter);\n\n // Sync pending value when external value or options change\n // External [] means \"all\" → set pendingValue to all option values\n // External [specific values] → use those values\n useEffect(() => {\n if (options.length === 0) return; // Wait for options to load\n\n if (value.length === 0) {\n // External \"all\" (no filter) → select all options internally\n setPendingValue(options.map((o) => o.value));\n } else {\n setPendingValue(value);\n }\n }, [value, options]);\n\n // Reset search when dropdown closes\n useEffect(() => {\n if (!isOpen) {\n setSearchQuery('');\n }\n }, [isOpen]);\n\n // Helper to get the \"all selected\" state for current options\n const getAllSelectedValue = useCallback(() => {\n return options.map((o) => o.value);\n }, [options]);\n\n // Close when clicking outside (without applying)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n // Reset pending to current value (discard changes)\n if (value.length === 0) {\n // External \"all\" → reset to all options selected\n setPendingValue(getAllSelectedValue());\n } else {\n setPendingValue(value);\n }\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [value, getAllSelectedValue]);\n\n // Filter options based on search query\n const filteredOptions = useMemo(() => {\n if (!searchQuery.trim()) return options;\n const query = searchQuery.toLowerCase();\n return options.filter(\n (opt) =>\n opt.label.toLowerCase().includes(query) ||\n opt.value.toLowerCase().includes(query)\n );\n }, [options, searchQuery]);\n\n // Check if \"All\" is selected (all options are in pendingValue)\n const isAllSelected = options.length > 0 && pendingValue.length === options.length;\n\n const handleToggle = useCallback(() => {\n setIsOpen((prev) => !prev);\n }, []);\n\n // Toggle all selection\n const handleAllClick = useCallback(() => {\n if (isAllSelected) {\n // Deselect all\n setPendingValue([]);\n } else {\n // Select all\n setPendingValue(options.map((o) => o.value));\n }\n }, [isAllSelected, options]);\n\n const handleOptionClick = useCallback((optionValue: string) => {\n setPendingValue((prev) => {\n if (prev.includes(optionValue)) {\n return prev.filter((v) => v !== optionValue);\n }\n return [...prev, optionValue];\n });\n }, []);\n\n // Clear all selections (deselect everything)\n const handleClearAll = useCallback(() => {\n setPendingValue([]);\n }, []);\n\n const handleApply = useCallback(() => {\n // If all options are selected, send [] to backend (no filter)\n // Otherwise send the actual selection\n const valueToSend = pendingValue.length === options.length ? [] : pendingValue;\n onChange(valueToSend);\n setIsOpen(false);\n }, [onChange, pendingValue, options.length]);\n\n // Styles\n const containerStyle: React.CSSProperties = {\n position: 'relative',\n display: 'inline-block',\n minWidth: '180px',\n };\n\n const buttonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing.sm,\n width: '100%',\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n fontSize: theme.fontSizes.sm,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.sm,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n fontFamily: theme.fonts.sans,\n cursor: 'pointer',\n };\n\n const dropdownStyle: React.CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n minWidth: '250px',\n marginTop: theme.spacing.xs,\n backgroundColor: theme.colors.background,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.sm,\n boxShadow: theme.shadows.md,\n zIndex: 1000,\n };\n\n const headerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: theme.spacing.sm,\n borderBottom: `1px solid ${theme.colors.border}`,\n };\n\n const searchContainerStyle: React.CSSProperties = {\n padding: theme.spacing.sm,\n borderBottom: `1px solid ${theme.colors.border}`,\n };\n\n const searchInputStyle: React.CSSProperties = {\n width: '100%',\n padding: theme.spacing.xs,\n fontSize: theme.fontSizes.sm,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.sm,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n fontFamily: theme.fonts.sans,\n outline: 'none',\n };\n\n const optionsContainerStyle: React.CSSProperties = {\n maxHeight: '200px',\n overflowY: 'auto',\n padding: theme.spacing.xs,\n };\n\n const optionStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.sm,\n padding: theme.spacing.xs,\n fontSize: theme.fontSizes.sm,\n color: theme.colors.text,\n cursor: 'pointer',\n borderRadius: theme.radius.sm,\n };\n\n const checkboxStyle: React.CSSProperties = {\n width: '18px',\n height: '18px',\n border: `2px solid ${theme.colors.border}`,\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.colors.background,\n flexShrink: 0,\n };\n\n const footerStyle: React.CSSProperties = {\n padding: theme.spacing.sm,\n borderTop: `1px solid ${theme.colors.border}`,\n };\n\n const applyButtonStyle: React.CSSProperties = {\n width: '100%',\n padding: `${theme.spacing.sm} ${theme.spacing.md}`,\n fontSize: theme.fontSizes.sm,\n fontWeight: 500,\n color: '#fff',\n backgroundColor: theme.colors.primary,\n border: 'none',\n borderRadius: theme.radius.sm,\n cursor: 'pointer',\n fontFamily: theme.fonts.sans,\n };\n\n const clearAllStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n color: theme.colors.primary,\n cursor: 'pointer',\n background: 'none',\n border: 'none',\n padding: 0,\n fontFamily: theme.fonts.sans,\n };\n\n const countStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n color: theme.colors.textMuted,\n };\n\n // Display text for button\n // External value [] means \"All\", otherwise show count or single value\n const displayText = isLoading\n ? 'Loading...'\n : value.length === 0\n ? 'All'\n : value.length === 1\n ? options.find((o) => o.value === value[0])?.label ?? value[0]\n : `${value.length} selected`;\n\n return (\n <div ref={containerRef} style={containerStyle}>\n <button\n type=\"button\"\n onClick={handleToggle}\n style={{\n ...buttonStyle,\n cursor: isLoading ? 'wait' : 'pointer',\n opacity: isLoading ? 0.7 : 1,\n }}\n aria-label={filter.label}\n aria-expanded={isOpen}\n disabled={isLoading}\n >\n <span>{displayText}</span>\n <Icon name={isOpen ? 'chevron-up' : 'chevron-down'} size={14} />\n </button>\n\n {isOpen && !isLoading && (\n <div style={dropdownStyle}>\n {/* Header with label and clear all */}\n <div style={headerStyle}>\n <span style={countStyle}>{options.length} items</span>\n <button\n type=\"button\"\n style={clearAllStyle}\n onClick={handleClearAll}\n >\n clear all\n </button>\n </div>\n\n {/* Search input */}\n <div style={searchContainerStyle}>\n <input\n type=\"text\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n style={searchInputStyle}\n autoFocus\n />\n </div>\n\n {/* Options list */}\n <div style={optionsContainerStyle}>\n {/* \"All\" option */}\n <div\n onClick={handleAllClick}\n style={{\n ...optionStyle,\n backgroundColor: isAllSelected ? theme.colors.surfaceHover : 'transparent',\n }}\n >\n <div\n style={{\n ...checkboxStyle,\n backgroundColor: isAllSelected ? theme.colors.primary : theme.colors.background,\n borderColor: isAllSelected ? theme.colors.primary : theme.colors.border,\n }}\n >\n {isAllSelected && (\n <Icon name=\"check\" size={12} style={{ color: '#fff' }} />\n )}\n </div>\n <span>All</span>\n </div>\n\n {/* Individual options */}\n {filteredOptions.map((option) => {\n const isSelected = pendingValue.includes(option.value);\n return (\n <div\n key={option.value}\n onClick={() => handleOptionClick(option.value)}\n style={{\n ...optionStyle,\n backgroundColor: isSelected ? theme.colors.surfaceHover : 'transparent',\n }}\n >\n <div\n style={{\n ...checkboxStyle,\n backgroundColor: isSelected ? theme.colors.primary : theme.colors.background,\n borderColor: isSelected ? theme.colors.primary : theme.colors.border,\n }}\n >\n {isSelected && (\n <Icon name=\"check\" size={12} style={{ color: '#fff' }} />\n )}\n </div>\n <span>{option.label}</span>\n </div>\n );\n })}\n\n {filteredOptions.length === 0 && (\n <div style={{ ...optionStyle, color: theme.colors.textMuted, cursor: 'default' }}>\n No results found\n </div>\n )}\n </div>\n\n {/* Footer with Apply button */}\n <div style={footerStyle}>\n <button\n type=\"button\"\n style={applyButtonStyle}\n onClick={handleApply}\n >\n Apply\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * Text filter component with debouncing.\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { useTheme } from '../../theme';\nimport { Icon } from '../../components/ui';\nimport type { TextFilterProps } from '../types';\n\n/**\n * Text input filter with debounced updates.\n */\nexport function TextFilter({\n filter,\n value,\n onChange,\n debounceMs = 300,\n}: TextFilterProps): JSX.Element {\n const { theme } = useTheme();\n const [localValue, setLocalValue] = useState(value);\n const debounceRef = useRef<ReturnType<typeof setTimeout>>();\n\n // Sync local value when prop changes\n useEffect(() => {\n setLocalValue(value);\n }, [value]);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setLocalValue(newValue);\n\n // Debounce the onChange call\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n debounceRef.current = setTimeout(() => {\n onChange(newValue);\n }, debounceMs);\n },\n [onChange, debounceMs]\n );\n\n const handleClear = useCallback(() => {\n setLocalValue('');\n onChange('');\n }, [onChange]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n };\n }, []);\n\n const containerStyle: React.CSSProperties = {\n position: 'relative',\n display: 'inline-flex',\n alignItems: 'center',\n };\n\n const inputStyle: React.CSSProperties = {\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n paddingLeft: theme.spacing.lg,\n paddingRight: localValue ? theme.spacing.lg : theme.spacing.sm,\n fontSize: theme.fontSizes.sm,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.sm,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n fontFamily: theme.fonts.sans,\n minWidth: '150px',\n };\n\n const iconStyle: React.CSSProperties = {\n position: 'absolute',\n left: theme.spacing.sm,\n color: theme.colors.textMuted,\n pointerEvents: 'none' as const,\n };\n\n const clearButtonStyle: React.CSSProperties = {\n position: 'absolute',\n right: theme.spacing.xs,\n padding: theme.spacing.xs,\n border: 'none',\n backgroundColor: 'transparent',\n color: theme.colors.textMuted,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n };\n\n return (\n <div style={containerStyle}>\n <Icon name=\"search\" size={14} style={iconStyle} />\n <input\n type=\"text\"\n value={localValue}\n onChange={handleChange}\n placeholder={filter.label}\n style={inputStyle}\n aria-label={filter.label}\n />\n {localValue && (\n <button\n type=\"button\"\n onClick={handleClear}\n style={clearButtonStyle}\n aria-label=\"Clear filter\"\n >\n <Icon name=\"x\" size={14} />\n </button>\n )}\n </div>\n );\n}\n","/**\n * Filter bar component for dashboard filters.\n */\n\nimport { useCallback } from 'react';\nimport { useTheme } from '../../theme';\nimport { Button } from '../../components/ui';\nimport { DateRangeFilter } from './DateRangeFilter';\nimport { SelectFilter } from './SelectFilter';\nimport { MultiSelectFilter } from './MultiSelectFilter';\nimport { TextFilter } from './TextFilter';\nimport type { FilterBarProps, DashboardFilter, FilterValue, DateRangeValue } from '../types';\n\n/**\n * Get filter value from values array.\n */\nfunction getFilterValue(filterId: string, values: FilterValue[]): unknown {\n const filterValue = values.find((fv) => fv.filter_id === filterId);\n return filterValue?.value;\n}\n\n/**\n * FilterBar component displays all dashboard filters.\n */\nexport function FilterBar({\n filters,\n values,\n onChange,\n onReset,\n className = '',\n}: FilterBarProps): JSX.Element | null {\n const { theme } = useTheme();\n\n const handleReset = useCallback(() => {\n onReset?.();\n }, [onReset]);\n\n if (filters.length === 0) {\n return null;\n }\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: theme.spacing.md,\n padding: theme.spacing.md,\n borderBottom: `1px solid ${theme.colors.border}`,\n backgroundColor: theme.colors.surface,\n };\n\n const filterGroupStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.xs,\n };\n\n const labelStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n fontWeight: 500,\n color: theme.colors.textMuted,\n textTransform: 'uppercase' as const,\n letterSpacing: '0.05em',\n };\n\n const actionsStyle: React.CSSProperties = {\n marginLeft: 'auto',\n display: 'flex',\n alignItems: 'flex-end',\n };\n\n return (\n <div className={`prismiq-filter-bar ${className}`} style={containerStyle}>\n {filters.map((filter) => (\n <div key={filter.id} style={filterGroupStyle}>\n <label style={labelStyle}>{filter.label}</label>\n {renderFilter(filter, values, onChange)}\n </div>\n ))}\n\n {onReset && (\n <div style={actionsStyle}>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleReset}>\n Reset\n </Button>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Render the appropriate filter component based on type.\n */\nfunction renderFilter(\n filter: DashboardFilter,\n values: FilterValue[],\n onChange: (filterId: string, value: unknown) => void\n): JSX.Element {\n const value = getFilterValue(filter.id, values);\n\n switch (filter.type) {\n case 'date_range':\n return (\n <DateRangeFilter\n filter={filter}\n value={(value as DateRangeValue | string | null) ?? null}\n onChange={(v) => onChange(filter.id, v)}\n />\n );\n\n case 'select':\n return (\n <SelectFilter\n filter={filter}\n value={(value as string | null) ?? null}\n onChange={(v) => onChange(filter.id, v)}\n />\n );\n\n case 'multi_select':\n return (\n <MultiSelectFilter\n filter={filter}\n value={(value as string[]) ?? []}\n onChange={(v) => onChange(filter.id, v)}\n />\n );\n\n case 'text':\n return (\n <TextFilter\n filter={filter}\n value={(value as string) ?? ''}\n onChange={(v) => onChange(filter.id, v)}\n />\n );\n\n case 'number_range':\n // Fallback to text filter for now\n return (\n <TextFilter\n filter={filter}\n value={(value as string) ?? ''}\n onChange={(v) => onChange(filter.id, v)}\n />\n );\n\n default:\n return <div>Unknown filter type</div>;\n }\n}\n","/**\n * Main Dashboard component for embedding.\n */\n\nimport { useCallback } from 'react';\nimport { useTheme } from '../theme';\nimport { CrossFilterProvider, useCrossFilterOptional } from '../context';\nimport { Button } from '../components/ui';\nimport { DashboardProvider } from './DashboardProvider';\nimport { useDashboard } from './useDashboard';\nimport { useDashboardFilters } from './useDashboardFilters';\nimport { DashboardLayout } from './DashboardLayout';\nimport { Widget, LazyWidget } from './Widget';\nimport { FilterBar } from './filters';\nimport type { DashboardProps, Widget as WidgetType } from './types';\n\n/**\n * Props for internal DashboardContent component.\n */\ninterface DashboardContentProps {\n showFilters?: boolean;\n showTitle?: boolean;\n className?: string;\n lazyLoadingRootMargin?: string;\n}\n\n/**\n * Internal dashboard content component.\n */\nfunction DashboardContent({\n showFilters = true,\n showTitle = true,\n className = '',\n lazyLoadingRootMargin = '200px',\n}: Readonly<DashboardContentProps>): JSX.Element {\n const { theme } = useTheme();\n const {\n dashboard,\n isLoading,\n error,\n widgetResults,\n widgetErrors,\n widgetLoading,\n widgetRefreshTimes,\n refreshingWidgets,\n refreshWidget,\n } = useDashboard();\n\n const { filters, values, setValue, resetAll } = useDashboardFilters();\n\n // Get cross-filter context\n const crossFilterContext = useCrossFilterOptional();\n\n // Render widget function for DashboardLayout\n // Wraps each widget with LazyWidget for scroll-based loading\n const renderWidget = useCallback(\n (widget: WidgetType) => (\n <LazyWidget\n widget={widget}\n rootMargin={lazyLoadingRootMargin}\n renderWidget={(w) => (\n <Widget\n widget={w}\n result={widgetResults[w.id] ?? null}\n isLoading={widgetLoading[w.id] ?? false}\n error={widgetErrors[w.id]}\n lastRefreshed={widgetRefreshTimes[w.id]}\n isRefreshing={refreshingWidgets.has(w.id)}\n onRefresh={() => refreshWidget(w.id)}\n />\n )}\n />\n ),\n [widgetResults, widgetLoading, widgetErrors, widgetRefreshTimes, refreshingWidgets, refreshWidget, lazyLoadingRootMargin]\n );\n\n // Container styles\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: theme.colors.background,\n fontFamily: theme.fonts.sans,\n };\n\n const headerStyle: React.CSSProperties = {\n padding: theme.spacing.md,\n borderBottom: `1px solid ${theme.colors.border}`,\n backgroundColor: theme.colors.surface,\n };\n\n const titleStyle: React.CSSProperties = {\n margin: 0,\n fontSize: theme.fontSizes['2xl'],\n fontWeight: 600,\n color: theme.colors.text,\n };\n\n const descriptionStyle: React.CSSProperties = {\n marginTop: theme.spacing.xs,\n fontSize: theme.fontSizes.sm,\n color: theme.colors.textMuted,\n };\n\n // Cross-filter indicator styles\n const crossFilterBarStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.sm,\n padding: `${theme.spacing.sm} ${theme.spacing.md}`,\n backgroundColor: `${theme.colors.primary}15`,\n borderBottom: `1px solid ${theme.colors.border}`,\n fontSize: theme.fontSizes.sm,\n color: theme.colors.text,\n };\n\n const crossFilterLabelStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.xs,\n fontWeight: 500,\n };\n\n const crossFilterValueStyle: React.CSSProperties = {\n backgroundColor: theme.colors.primary,\n color: '#fff',\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n borderRadius: theme.radius.sm,\n fontSize: theme.fontSizes.xs,\n };\n\n const contentStyle: React.CSSProperties = {\n flex: 1,\n overflow: 'auto',\n };\n\n const loadingStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n color: theme.colors.textMuted,\n };\n\n const errorStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n padding: theme.spacing.xl,\n textAlign: 'center',\n };\n\n const spinnerStyle: React.CSSProperties = {\n width: '40px',\n height: '40px',\n border: `3px solid ${theme.colors.border}`,\n borderTopColor: theme.colors.primary,\n borderRadius: '50%',\n animation: 'prismiq-dashboard-spin 1s linear infinite',\n };\n\n // Loading state\n if (isLoading) {\n return (\n <div className={`prismiq-dashboard ${className}`} style={containerStyle}>\n <div style={loadingStyle}>\n <div style={spinnerStyle} />\n </div>\n <style>{`\n @keyframes prismiq-dashboard-spin {\n to { transform: rotate(360deg); }\n }\n `}</style>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className={`prismiq-dashboard ${className}`} style={containerStyle}>\n <div style={errorStyle}>\n <div style={{ fontSize: '48px', marginBottom: theme.spacing.md }}>!</div>\n <div style={{ fontSize: theme.fontSizes.lg, color: theme.colors.error }}>\n Failed to load dashboard\n </div>\n <div style={{ fontSize: theme.fontSizes.sm, color: theme.colors.textMuted }}>\n {error.message}\n </div>\n </div>\n </div>\n );\n }\n\n // No dashboard loaded\n if (!dashboard) {\n return (\n <div className={`prismiq-dashboard ${className}`} style={containerStyle}>\n <div style={loadingStyle}>Dashboard not found</div>\n </div>\n );\n }\n\n return (\n <div className={`prismiq-dashboard ${className}`} style={containerStyle}>\n {showTitle && (\n <div style={headerStyle}>\n <h1 style={titleStyle}>{dashboard.name}</h1>\n {dashboard.description && (\n <p style={descriptionStyle}>{dashboard.description}</p>\n )}\n </div>\n )}\n\n {showFilters && filters.length > 0 && (\n <FilterBar\n filters={filters}\n values={values}\n onChange={setValue}\n onReset={resetAll}\n />\n )}\n\n {/* Cross-filter indicator bar */}\n {crossFilterContext?.hasActiveFilters && (\n <div style={crossFilterBarStyle}>\n <span style={crossFilterLabelStyle}>\n <span>🔗</span>\n <span>Cross-filter active:</span>\n </span>\n {crossFilterContext.filters.map((filter) => (\n <span key={filter.sourceWidgetId} style={crossFilterValueStyle}>\n {filter.column}: {String(filter.value)}\n </span>\n ))}\n <div style={{ flex: 1 }} />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => crossFilterContext.clearFilters()}\n >\n Clear filters\n </Button>\n </div>\n )}\n\n <div style={contentStyle}>\n <DashboardLayout\n widgets={dashboard.widgets}\n layout={dashboard.layout}\n editable={false}\n renderWidget={renderWidget}\n />\n </div>\n </div>\n );\n}\n\n/**\n * Dashboard component for embedding.\n *\n * @example\n * ```tsx\n * <AnalyticsProvider endpoint=\"https://api.example.com\">\n * <Dashboard\n * id=\"my-dashboard\"\n * showFilters={true}\n * refreshInterval={60000}\n * />\n * </AnalyticsProvider>\n * ```\n */\nexport function Dashboard({\n id,\n showFilters = true,\n showTitle = true,\n refreshInterval,\n batchSize,\n lazyLoading,\n className = '',\n}: DashboardProps): JSX.Element {\n return (\n <CrossFilterProvider>\n <DashboardProvider\n dashboardId={id}\n refreshInterval={refreshInterval}\n batchSize={batchSize}\n lazyLoading={lazyLoading}\n >\n <DashboardContent\n showFilters={showFilters}\n showTitle={showTitle}\n className={className}\n lazyLoadingRootMargin={lazyLoading?.rootMargin}\n />\n </DashboardProvider>\n </CrossFilterProvider>\n );\n}\n","/**\n * Dashboard editor toolbar component.\n */\n\nimport { useEffect } from 'react';\nimport { useTheme } from '../../theme';\nimport { Button } from '../../components/ui/Button';\nimport { Icon } from '../../components/ui/Icon';\n\n/**\n * Props for EditorToolbar component.\n */\nexport interface EditorToolbarProps {\n /** Dashboard name. */\n dashboardName: string;\n /** Callback when dashboard name changes. */\n onNameChange?: (name: string) => void;\n /** Whether there are unsaved changes. */\n hasChanges: boolean;\n /** Whether save is in progress. */\n isSaving: boolean;\n /** Callback when add widget is clicked. */\n onAddWidget: () => void;\n /** Callback when edit filters is clicked. */\n onEditFilters?: () => void;\n /** Callback when settings is clicked. */\n onSettings?: () => void;\n /** Callback when save is clicked. */\n onSave: () => void;\n /** Callback when cancel is clicked. */\n onCancel: () => void;\n}\n\n/**\n * Editor toolbar with actions for dashboard editing.\n */\nexport function EditorToolbar({\n dashboardName,\n onNameChange,\n hasChanges,\n isSaving,\n onAddWidget,\n onEditFilters,\n onSettings,\n onSave,\n onCancel,\n}: EditorToolbarProps): JSX.Element {\n const { theme } = useTheme();\n\n const toolbarStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${theme.spacing.sm} ${theme.spacing.md}`,\n backgroundColor: theme.colors.surface,\n borderBottom: `1px solid ${theme.colors.border}`,\n };\n\n const leftSectionStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.md,\n };\n\n const titleStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.lg,\n fontWeight: 600,\n color: theme.colors.text,\n margin: 0,\n };\n\n const actionsStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.sm,\n };\n\n const rightSectionStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.sm,\n };\n\n const unsavedStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n color: theme.colors.warning,\n marginRight: theme.spacing.sm,\n };\n\n const titleInputStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.lg,\n fontWeight: 600,\n color: theme.colors.text,\n backgroundColor: 'transparent',\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.sm,\n padding: `${theme.spacing.xs} ${theme.spacing.sm}`,\n outline: 'none',\n minWidth: '200px',\n };\n\n // Inject focus-visible style for the title input so keyboard users see a\n // visible focus indicator even though outline is removed in the inline style.\n useEffect(() => {\n if (typeof document === 'undefined') return;\n const styleId = 'prismiq-dashboard-title-input-focus';\n if (document.getElementById(styleId)) return;\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = `\n .prismiq-dashboard-title-input:focus-visible {\n border-color: var(--prismiq-color-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--prismiq-color-primary) 25%, transparent);\n }\n `;\n document.head.appendChild(style);\n }, []);\n\n return (\n <div style={toolbarStyle} className=\"prismiq-editor-toolbar\">\n <div style={leftSectionStyle}>\n {onNameChange ? (\n <input\n type=\"text\"\n id=\"dashboard-title-input\"\n className=\"prismiq-dashboard-title-input\"\n data-testid=\"dashboard-title-input\"\n aria-label=\"Dashboard title\"\n value={dashboardName}\n onChange={(e) => onNameChange(e.target.value)}\n placeholder=\"Dashboard name\"\n style={titleInputStyle}\n />\n ) : (\n <h2 style={titleStyle}>{dashboardName || 'New Dashboard'}</h2>\n )}\n\n <div style={actionsStyle}>\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={onAddWidget}\n >\n <Icon name=\"plus\" size={16} />\n <span style={{ marginLeft: theme.spacing.xs }}>Add Widget</span>\n </Button>\n\n {onEditFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onEditFilters}\n >\n <Icon name=\"filter\" size={16} />\n <span style={{ marginLeft: theme.spacing.xs }}>Filters</span>\n </Button>\n )}\n\n {onSettings && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onSettings}\n >\n <Icon name=\"settings\" size={16} />\n <span style={{ marginLeft: theme.spacing.xs }}>Settings</span>\n </Button>\n )}\n </div>\n </div>\n\n <div style={rightSectionStyle}>\n {hasChanges && (\n <span style={unsavedStyle}>Unsaved changes</span>\n )}\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onCancel}\n disabled={isSaving}\n >\n Cancel\n </Button>\n\n <Button\n variant=\"primary\"\n size=\"sm\"\n onClick={onSave}\n disabled={!hasChanges || isSaving}\n >\n {isSaving ? 'Saving...' : 'Save'}\n </Button>\n </div>\n </div>\n );\n}\n","/**\n * Widget type selector for the full-page widget editor.\n *\n * Displays available widget types as visual cards that can be selected.\n */\n\nimport { useTheme } from '../../theme';\nimport { Icon } from '../../components/ui/Icon';\nimport type { IconName } from '../../components/ui/Icon';\nimport type { WidgetType } from '../types';\n\n/**\n * Widget type configuration.\n */\ninterface WidgetTypeInfo {\n type: WidgetType;\n label: string;\n description: string;\n icon: IconName;\n}\n\n/**\n * Available widget types.\n */\nconst WIDGET_TYPES: WidgetTypeInfo[] = [\n {\n type: 'metric',\n label: 'Metric',\n description: 'Single value with trend',\n icon: 'info',\n },\n {\n type: 'bar_chart',\n label: 'Bar Chart',\n description: 'Compare categories',\n icon: 'chart-bar',\n },\n {\n type: 'line_chart',\n label: 'Line Chart',\n description: 'Trends over time',\n icon: 'chart-line',\n },\n {\n type: 'area_chart',\n label: 'Area Chart',\n description: 'Cumulative trends',\n icon: 'chart-line',\n },\n {\n type: 'pie_chart',\n label: 'Pie Chart',\n description: 'Proportions',\n icon: 'chart-pie',\n },\n {\n type: 'scatter_chart',\n label: 'Scatter',\n description: 'Correlations',\n icon: 'grid',\n },\n {\n type: 'table',\n label: 'Table',\n description: 'Tabular data',\n icon: 'table',\n },\n {\n type: 'text',\n label: 'Text',\n description: 'Markdown content',\n icon: 'edit',\n },\n];\n\nexport interface WidgetTypeSelectorProps {\n /** Currently selected widget type. */\n value: WidgetType;\n /** Callback when widget type changes. */\n onChange: (type: WidgetType) => void;\n /** Additional CSS class. */\n className?: string;\n}\n\n/**\n * Widget type selector displaying available types as cards.\n */\nexport function WidgetTypeSelector({\n value,\n onChange,\n className = '',\n}: WidgetTypeSelectorProps): JSX.Element {\n const { theme } = useTheme();\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.xs,\n };\n\n const labelStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n fontWeight: 600,\n color: theme.colors.textMuted,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n marginBottom: theme.spacing.xs,\n };\n\n const gridStyle: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: theme.spacing.xs,\n };\n\n const getItemStyle = (isSelected: boolean): React.CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.sm,\n padding: theme.spacing.sm,\n backgroundColor: isSelected ? `${theme.colors.primary}10` : theme.colors.background,\n borderRadius: theme.radius.sm,\n border: `2px solid ${isSelected ? theme.colors.primary : theme.colors.border}`,\n cursor: 'pointer',\n transition: 'all 0.15s ease',\n });\n\n const iconStyle = (isSelected: boolean): React.CSSProperties => ({\n width: '28px',\n height: '28px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: isSelected ? theme.colors.primary : `${theme.colors.primary}15`,\n borderRadius: theme.radius.sm,\n color: isSelected ? '#fff' : theme.colors.primary,\n flexShrink: 0,\n });\n\n const textContainerStyle: React.CSSProperties = {\n minWidth: 0,\n };\n\n const nameLabelStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n fontWeight: 500,\n color: theme.colors.text,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n };\n\n const descStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n };\n\n return (\n <div className={`prismiq-widget-type-selector ${className}`} style={containerStyle}>\n <label style={labelStyle}>Widget Type</label>\n\n <div style={gridStyle}>\n {WIDGET_TYPES.map((widgetType) => {\n const isSelected = value === widgetType.type;\n\n return (\n <button\n key={widgetType.type}\n type=\"button\"\n style={getItemStyle(isSelected)}\n onClick={() => onChange(widgetType.type)}\n onMouseEnter={(e) => {\n if (!isSelected) {\n e.currentTarget.style.borderColor = theme.colors.borderFocus;\n }\n }}\n onMouseLeave={(e) => {\n if (!isSelected) {\n e.currentTarget.style.borderColor = theme.colors.border;\n }\n }}\n >\n <div style={iconStyle(isSelected)}>\n <Icon name={widgetType.icon} size={16} />\n </div>\n <div style={textContainerStyle}>\n <div style={nameLabelStyle}>{widgetType.label}</div>\n <div style={descStyle}>{widgetType.description}</div>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","/**\n * Widget preview component for the full-page widget editor.\n *\n * Renders a live preview of the widget being edited.\n */\n\nimport { useTheme } from '../../theme';\nimport { WidgetContent } from '../Widget/WidgetContent';\nimport type { Widget, WidgetConfig, WidgetType } from '../types';\nimport type { QueryDefinition, QueryResult } from '../../types';\n\nexport interface WidgetPreviewProps {\n /** Widget type. */\n type: WidgetType;\n /** Widget title. */\n title: string;\n /** Widget configuration. */\n config: WidgetConfig;\n /** Query definition (null for text widgets). */\n query: QueryDefinition | null;\n /** Query result data. */\n result: QueryResult | null;\n /** Whether data is loading. */\n isLoading?: boolean;\n /** Error if query failed. */\n error?: Error | null;\n /** Additional CSS class. */\n className?: string;\n}\n\n/**\n * Create a temporary widget object for preview.\n */\nfunction createPreviewWidget(\n type: WidgetType,\n title: string,\n config: WidgetConfig,\n query: QueryDefinition | null\n): Widget {\n return {\n id: 'preview',\n type,\n title,\n config,\n query,\n position: { x: 0, y: 0, w: 6, h: 4 },\n };\n}\n\n/**\n * Live preview of the widget being edited.\n *\n * Shows the actual rendered widget with current configuration and data.\n */\nexport function WidgetPreview({\n type,\n title,\n config,\n query,\n result,\n isLoading = false,\n error,\n className = '',\n}: WidgetPreviewProps): JSX.Element {\n const { theme } = useTheme();\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.md,\n border: `1px solid ${theme.colors.border}`,\n overflow: 'hidden',\n };\n\n const headerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${theme.spacing.sm} ${theme.spacing.md}`,\n borderBottom: `1px solid ${theme.colors.border}`,\n backgroundColor: theme.colors.background,\n };\n\n const titleStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.base,\n fontWeight: 500,\n color: theme.colors.text,\n margin: 0,\n };\n\n const labelStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n };\n\n const contentStyle: React.CSSProperties = {\n flex: 1,\n minHeight: 0,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n };\n\n const emptyStateStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n padding: theme.spacing.xl,\n textAlign: 'center',\n color: theme.colors.textMuted,\n };\n\n // Create a preview widget object\n const previewWidget = createPreviewWidget(type, title, config, query);\n\n // Check if we need to show empty state\n const needsQuery = type !== 'text';\n const showEmptyState = needsQuery && !query && !isLoading;\n\n return (\n <div className={`prismiq-widget-preview ${className}`} style={containerStyle}>\n <div style={headerStyle}>\n <h3 style={titleStyle}>{title || 'Widget Preview'}</h3>\n <span style={labelStyle}>Preview</span>\n </div>\n\n <div style={contentStyle}>\n {showEmptyState ? (\n <div style={emptyStateStyle}>\n <div\n style={{\n fontSize: '32px',\n marginBottom: theme.spacing.sm,\n opacity: 0.5,\n }}\n >\n ?\n </div>\n <div style={{ fontSize: theme.fontSizes.sm, marginBottom: theme.spacing.xs }}>\n No data source configured\n </div>\n <div style={{ fontSize: theme.fontSizes.xs }}>\n Select a saved query or build a new query to see data\n </div>\n </div>\n ) : (\n <WidgetContent\n widget={previewWidget}\n result={result}\n isLoading={isLoading}\n error={error}\n />\n )}\n </div>\n </div>\n );\n}\n","/**\n * Guided configuration for Metric widgets.\n *\n * Provides a simplified interface to configure a single aggregated value:\n * - Select a table\n * - Select an aggregation (COUNT, SUM, AVG, etc.)\n * - Select a column (for SUM, AVG, etc.)\n * - Optional filters\n */\n\nimport { useState, useCallback, useMemo, useEffect } from 'react';\nimport { useTheme } from '../../../theme';\nimport { Select } from '../../../components/ui/Select';\nimport { FilterBuilder } from '../../../components/FilterBuilder';\nimport type {\n DatabaseSchema,\n QueryDefinition,\n AggregationType,\n FilterDefinition,\n ColumnSchema,\n} from '../../../types';\n\nexport interface MetricConfigProps {\n /** Database schema for table/column selection. */\n schema: DatabaseSchema;\n /** Current query (for restoring state). */\n query: QueryDefinition | null;\n /** Callback when query changes. */\n onChange: (query: QueryDefinition) => void;\n}\n\n/**\n * Available aggregations for metrics.\n */\nconst AGGREGATIONS: { value: AggregationType; label: string; needsColumn: boolean }[] = [\n { value: 'count', label: 'Count of rows', needsColumn: false },\n { value: 'count_distinct', label: 'Count distinct', needsColumn: true },\n { value: 'sum', label: 'Sum', needsColumn: true },\n { value: 'avg', label: 'Average', needsColumn: true },\n { value: 'min', label: 'Minimum', needsColumn: true },\n { value: 'max', label: 'Maximum', needsColumn: true },\n];\n\n/**\n * Check if a column is numeric.\n */\nfunction isNumericColumn(col: ColumnSchema): boolean {\n const numericTypes = [\n 'integer',\n 'bigint',\n 'smallint',\n 'decimal',\n 'numeric',\n 'real',\n 'double precision',\n 'float',\n 'int',\n 'int4',\n 'int8',\n 'float4',\n 'float8',\n ];\n return numericTypes.some((t) => col.data_type.toLowerCase().includes(t));\n}\n\n/**\n * Guided metric configuration component.\n */\nexport function MetricConfig({\n schema,\n query,\n onChange,\n}: MetricConfigProps): JSX.Element {\n const { theme } = useTheme();\n\n // Extract state from existing query if present\n const initialTable = query?.tables[0]?.name ?? '';\n const initialAggregation = query?.columns[0]?.aggregation ?? 'count';\n const initialColumn = query?.columns[0]?.column ?? '*';\n\n const [selectedTable, setSelectedTable] = useState(initialTable);\n const [aggregation, setAggregation] = useState<AggregationType>(initialAggregation);\n const [selectedColumn, setSelectedColumn] = useState(initialColumn);\n const [filters, setFilters] = useState<FilterDefinition[]>(query?.filters ?? []);\n\n // Get table options\n const tableOptions = useMemo(() => {\n return schema.tables.map((t) => ({\n value: t.name,\n label: t.name,\n }));\n }, [schema.tables]);\n\n // Get current table schema\n const currentTable = useMemo(() => {\n return schema.tables.find((t) => t.name === selectedTable);\n }, [schema.tables, selectedTable]);\n\n // Get numeric column options for the selected table\n const columnOptions = useMemo(() => {\n if (!currentTable) return [];\n const numericCols = currentTable.columns.filter(isNumericColumn);\n return numericCols.map((c) => ({\n value: c.name,\n label: `${c.name} (${c.data_type})`,\n }));\n }, [currentTable]);\n\n // Check if current aggregation needs a column\n const needsColumn = useMemo(() => {\n return AGGREGATIONS.find((a) => a.value === aggregation)?.needsColumn ?? false;\n }, [aggregation]);\n\n // Build and emit query when config changes\n useEffect(() => {\n if (!selectedTable) return;\n\n const tableId = 't1';\n const tables = [{ id: tableId, name: selectedTable }];\n\n // For COUNT(*), use '*' as column, otherwise use selected column\n const column = needsColumn ? selectedColumn : '*';\n\n // Don't emit if we need a column but don't have one selected\n if (needsColumn && !selectedColumn) return;\n\n const queryDef: QueryDefinition = {\n tables,\n columns: [\n {\n table_id: tableId,\n column,\n aggregation,\n alias: 'value',\n },\n ],\n filters: filters.length > 0 ? filters : undefined,\n };\n\n onChange(queryDef);\n }, [selectedTable, aggregation, selectedColumn, needsColumn, filters, onChange]);\n\n // Handle table change\n const handleTableChange = useCallback((value: string) => {\n setSelectedTable(value);\n setSelectedColumn(''); // Reset column when table changes\n setFilters([]); // Reset filters when table changes\n }, []);\n\n // Styles\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.md,\n };\n\n const fieldStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.xs,\n };\n\n const labelStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n fontWeight: 500,\n color: theme.colors.text,\n };\n\n const helpTextStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n };\n\n return (\n <div style={containerStyle}>\n {/* Table Selection */}\n <div style={fieldStyle}>\n <label style={labelStyle}>From Table</label>\n <Select\n value={selectedTable}\n onChange={handleTableChange}\n options={[{ value: '', label: 'Select a table...' }, ...tableOptions]}\n />\n </div>\n\n {/* Aggregation Selection */}\n <div style={fieldStyle}>\n <label style={labelStyle}>Metric</label>\n <Select\n value={aggregation}\n onChange={(value) => setAggregation(value as AggregationType)}\n options={AGGREGATIONS.map((a) => ({\n value: a.value,\n label: a.label,\n }))}\n />\n <span style={helpTextStyle}>\n {aggregation === 'count'\n ? 'Counts the number of rows'\n : `Calculates the ${aggregation} of a numeric column`}\n </span>\n </div>\n\n {/* Column Selection (only for aggregations that need it) */}\n {needsColumn && selectedTable && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Column</label>\n {columnOptions.length > 0 ? (\n <Select\n value={selectedColumn}\n onChange={setSelectedColumn}\n options={[{ value: '', label: 'Select a column...' }, ...columnOptions]}\n />\n ) : (\n <span style={helpTextStyle}>No numeric columns available in this table</span>\n )}\n </div>\n )}\n\n {/* Optional Filters */}\n {selectedTable && currentTable && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Filters (optional)</label>\n <FilterBuilder\n tables={[{ id: 't1', name: selectedTable }]}\n filters={filters}\n onChange={setFilters}\n schema={schema}\n />\n </div>\n )}\n </div>\n );\n}\n","/**\n * Guided configuration for Chart widgets (Bar, Line, Area).\n *\n * Provides a simplified interface to configure:\n * - Group by (X-Axis) - categorical column for grouping\n * - Measure (Y-Axis) - aggregated numeric column(s)\n * - Optional filters\n */\n\nimport { useState, useCallback, useMemo, useEffect, useRef } from 'react';\nimport { useTheme } from '../../../theme';\nimport { Select } from '../../../components/ui/Select';\nimport { Button } from '../../../components/ui/Button';\nimport { Icon } from '../../../components/ui/Icon';\nimport { CollapsibleSection } from '../../../components/ui/CollapsibleSection';\nimport { FilterBuilder } from '../../../components/FilterBuilder';\nimport { TableSelector } from '../../../components/TableSelector';\nimport { JoinBuilder } from '../../../components/JoinBuilder';\nimport { TimeSeriesConfig } from '../../../components/TimeSeriesConfig';\nimport { CalculatedFieldBuilder } from '../../../components/CalculatedFieldBuilder';\nimport type {\n DatabaseSchema,\n QueryDefinition,\n QueryTable,\n JoinDefinition,\n AggregationType,\n FilterDefinition,\n ColumnSchema,\n DateTruncInterval,\n TimeSeriesConfig as TimeSeriesConfigType,\n CalculatedField,\n} from '../../../types';\nimport { parseColumnRef } from '../../../utils/columnRef';\n\nexport interface ChartConfigProps {\n /** Database schema for table/column selection. */\n schema: DatabaseSchema;\n /** Current query (for restoring state). */\n query: QueryDefinition | null;\n /** Callback when query changes. */\n onChange: (query: QueryDefinition) => void;\n}\n\n/**\n * A measure (aggregated column) definition.\n */\ninterface MeasureConfig {\n /** Column name or table-qualified ref (e.g., \"t1.amount\"). */\n column: string;\n aggregation: AggregationType;\n /** Source table ID for multi-table queries. */\n table_id?: string;\n}\n\n/**\n * Available aggregations for measures.\n */\nconst AGGREGATIONS: { value: AggregationType; label: string }[] = [\n { value: 'sum', label: 'Sum' },\n { value: 'avg', label: 'Average' },\n { value: 'count', label: 'Count' },\n { value: 'count_distinct', label: 'Count distinct' },\n { value: 'min', label: 'Min' },\n { value: 'max', label: 'Max' },\n];\n\n/**\n * Check if a column is numeric.\n */\nfunction isNumericColumn(col: ColumnSchema): boolean {\n const numericTypes = [\n 'integer',\n 'bigint',\n 'smallint',\n 'decimal',\n 'numeric',\n 'real',\n 'double precision',\n 'float',\n 'int',\n 'int4',\n 'int8',\n 'float4',\n 'float8',\n ];\n return numericTypes.some((t) => col.data_type.toLowerCase().includes(t));\n}\n\n/**\n * Check if a column is categorical (good for grouping).\n */\nfunction isCategoricalColumn(col: ColumnSchema): boolean {\n const categoricalTypes = ['character varying', 'varchar', 'text', 'char', 'character'];\n return categoricalTypes.some((t) => col.data_type.toLowerCase().includes(t));\n}\n\n/**\n * Check if a column is a date/timestamp type.\n */\nfunction isDateColumn(col: ColumnSchema): boolean {\n const type = col.data_type.toLowerCase();\n return type.includes('date') || type.includes('time') || type.includes('timestamp');\n}\n\n/**\n * Date truncation options.\n */\nconst DATE_TRUNC_OPTIONS: { value: DateTruncInterval | ''; label: string }[] = [\n { value: '', label: 'No truncation' },\n { value: 'year', label: 'Year' },\n { value: 'quarter', label: 'Quarter' },\n { value: 'month', label: 'Month' },\n { value: 'week', label: 'Week' },\n { value: 'day', label: 'Day' },\n];\n\n/**\n * Guided chart configuration component.\n */\nexport function ChartConfig({\n schema,\n query,\n onChange,\n}: ChartConfigProps): JSX.Element {\n const { theme } = useTheme();\n\n // Extract state from existing query\n const initialTables: QueryTable[] = query?.tables ?? [];\n const groupByCol = query?.columns.find((c) => c.aggregation === 'none');\n const initialGroupBy = groupByCol?.column ?? query?.group_by?.[0]?.column ?? '';\n const initialGroupByTableId = groupByCol?.table_id ?? query?.tables?.[0]?.id ?? 't1';\n const initialDateTrunc = groupByCol?.date_trunc ?? '';\n const initialMeasures: MeasureConfig[] =\n query?.columns\n .filter((c) => c.aggregation !== 'none')\n .map((c) => ({\n // Store as table-qualified ref so parseColumnRef can resolve it correctly\n column: c.table_id ? `${c.table_id}.${c.column}` : c.column,\n aggregation: c.aggregation,\n table_id: c.table_id,\n })) ?? [];\n const initialJoins: JoinDefinition[] = query?.joins ?? [];\n\n const [tables, setTables] = useState<QueryTable[]>(initialTables);\n const [joins, setJoins] = useState<JoinDefinition[]>(initialJoins);\n const [groupByColumn, setGroupByColumn] = useState(initialGroupBy);\n const [groupByTableId, setGroupByTableId] = useState(initialGroupByTableId);\n const [dateTrunc, setDateTrunc] = useState<DateTruncInterval | ''>(initialDateTrunc);\n const [measures, setMeasures] = useState<MeasureConfig[]>(\n initialMeasures.length > 0 ? initialMeasures : [{ column: '', aggregation: 'sum' }]\n );\n const [filters, setFilters] = useState<FilterDefinition[]>(query?.filters ?? []);\n const [timeSeries, setTimeSeries] = useState<TimeSeriesConfigType | undefined>(query?.time_series);\n const [calculatedFields, setCalculatedFields] = useState<CalculatedField[]>(\n query?.calculated_fields ?? []\n );\n const [invalidMeasureWarning, setInvalidMeasureWarning] = useState<string | null>(null);\n\n // Derived state\n const primaryTable = tables[0];\n const selectedTable = primaryTable?.name ?? '';\n\n // Get table options for the primary table dropdown\n const tableOptions = useMemo(() => {\n return schema.tables.map((t) => ({\n value: t.name,\n label: t.name,\n }));\n }, [schema.tables]);\n\n // Get current primary table schema\n const currentTable = useMemo(() => {\n return schema.tables.find((t) => t.name === selectedTable);\n }, [schema.tables, selectedTable]);\n\n // Get categorical columns for grouping (from all selected tables)\n const groupByOptions = useMemo(() => {\n const options: { value: string; label: string; tableId: string }[] = [];\n\n for (const table of tables) {\n const tableSchema = schema.tables.find((t) => t.name === table.name);\n if (!tableSchema) continue;\n\n const cols = tableSchema.columns.filter(\n (c) =>\n isCategoricalColumn(c) ||\n c.data_type.toLowerCase().includes('date') ||\n c.data_type.toLowerCase().includes('timestamp')\n );\n\n for (const col of cols) {\n options.push({\n value: `${table.id}.${col.name}`,\n label: tables.length > 1\n ? `${table.alias ?? table.name}.${col.name} (${col.data_type})`\n : `${col.name} (${col.data_type})`,\n tableId: table.id,\n });\n }\n }\n\n return options;\n }, [tables, schema.tables]);\n\n // Get numeric columns for measures (from all selected tables)\n const measureColumnOptions = useMemo(() => {\n const options: { value: string; label: string }[] = [];\n\n for (const table of tables) {\n const tableSchema = schema.tables.find((t) => t.name === table.name);\n if (!tableSchema) continue;\n\n const numericCols = tableSchema.columns.filter(isNumericColumn);\n\n for (const col of numericCols) {\n options.push({\n value: `${table.id}.${col.name}`,\n label: tables.length > 1\n ? `${table.alias ?? table.name}.${col.name} (${col.data_type})`\n : `${col.name} (${col.data_type})`,\n });\n }\n }\n\n return options;\n }, [tables, schema.tables]);\n\n // Check if selected group by column is a date type\n const groupByColumnSchema = useMemo(() => {\n if (!groupByColumn || !groupByTableId) return null;\n const table = tables.find((t) => t.id === groupByTableId);\n if (!table) return null;\n const tableSchema = schema.tables.find((t) => t.name === table.name);\n if (!tableSchema) return null;\n return tableSchema.columns.find((c) => c.name === groupByColumn) ?? null;\n }, [tables, schema.tables, groupByColumn, groupByTableId]);\n\n const isGroupByDate = groupByColumnSchema ? isDateColumn(groupByColumnSchema) : false;\n\n // Clear time series config when group by column is not a date type\n useEffect(() => {\n if (!isGroupByDate && timeSeries !== undefined) {\n setTimeSeries(undefined);\n }\n }, [isGroupByDate, timeSeries]);\n\n // Build and emit query when config changes\n useEffect(() => {\n if (tables.length === 0 || !groupByColumn) return;\n\n // Check if we have at least one valid measure (count doesn't need a column)\n const validMeasures = measures.filter((m) => m.aggregation === 'count' || m.column);\n if (validMeasures.length === 0) return;\n\n // Build columns: group by column + measure columns\n const columns = [\n // Group by column (no aggregation, with optional date truncation)\n // Alias preserves original column name when date_trunc transforms the SQL output name\n {\n table_id: groupByTableId,\n column: groupByColumn,\n aggregation: 'none' as AggregationType,\n date_trunc: dateTrunc || undefined,\n alias: dateTrunc ? groupByColumn : undefined,\n },\n // Measure columns (with aggregation) - parse table_id.column format\n ...(() => {\n const parsedMeasures: Array<{\n table_id: string;\n column: string;\n aggregation: AggregationType;\n alias?: string;\n }> = [];\n const invalidColumns: string[] = [];\n\n validMeasures.forEach((m, i) => {\n const measureAlias = validMeasures.length > 1 ? `value_${i + 1}` : 'value';\n\n // count uses *, no column needed\n if (m.aggregation === 'count' && (!m.column || m.column.endsWith('.*') || m.column === '*')) {\n parsedMeasures.push({\n table_id: m.table_id ?? tables[0]?.id ?? 't1',\n column: '*',\n aggregation: m.aggregation,\n alias: measureAlias,\n });\n return;\n }\n const parsed = parseColumnRef(m.column, tables[0]?.id ?? 't1');\n if (!parsed) {\n invalidColumns.push(m.column);\n return;\n }\n parsedMeasures.push({\n table_id: parsed.tableId,\n column: parsed.column,\n aggregation: m.aggregation,\n alias: measureAlias,\n });\n });\n\n // Update warning state based on invalid columns\n if (invalidColumns.length > 0) {\n setInvalidMeasureWarning(\n `Measure \"${invalidColumns[0]}\" could not be parsed. Please select a valid column.`\n );\n } else {\n setInvalidMeasureWarning(null);\n }\n\n return parsedMeasures;\n })(),\n ];\n\n // Group by the dimension column\n const groupBy = [{ table_id: groupByTableId, column: groupByColumn }];\n\n const queryDef: QueryDefinition = {\n tables,\n joins: joins.length > 0 ? joins : undefined,\n columns,\n group_by: groupBy,\n filters: filters.length > 0 ? filters : undefined,\n order_by: [{ table_id: groupByTableId, column: groupByColumn, direction: 'ASC' }],\n time_series: timeSeries,\n calculated_fields: calculatedFields.length > 0 ? calculatedFields : undefined,\n };\n\n onChange(queryDef);\n }, [tables, joins, groupByColumn, groupByTableId, dateTrunc, measures, filters, timeSeries, calculatedFields, onChange]);\n\n // Handle primary table change\n const handleTableChange = useCallback((value: string) => {\n if (!value) {\n setTables([]);\n } else {\n setTables([{ id: 't1', name: value }]);\n }\n setJoins([]);\n setGroupByColumn('');\n setGroupByTableId('t1');\n setDateTrunc('');\n setMeasures([{ column: '', aggregation: 'sum' }]);\n setFilters([]);\n }, []);\n\n // Handle tables change (for multi-table selection)\n const handleTablesChange = useCallback((newTables: QueryTable[]) => {\n setTables(newTables);\n // Clear joins that reference removed tables\n const tableIds = new Set(newTables.map((t) => t.id));\n setJoins((prev) =>\n prev.filter((j) => tableIds.has(j.from_table_id) && tableIds.has(j.to_table_id))\n );\n // Clear group by if its table was removed\n if (!tableIds.has(groupByTableId)) {\n setGroupByColumn('');\n setGroupByTableId(newTables[0]?.id ?? 't1');\n }\n }, [groupByTableId]);\n\n // Handle group by column change (now includes table_id)\n const handleGroupByChange = useCallback((value: string) => {\n if (!value) {\n setGroupByColumn('');\n setDateTrunc('');\n return;\n }\n\n const parsed = parseColumnRef(value, groupByTableId);\n if (parsed) {\n setGroupByTableId(parsed.tableId);\n setGroupByColumn(parsed.column);\n\n // Auto-default to 'day' truncation for date/timestamp columns\n const table = tables.find((t) => t.id === parsed.tableId);\n const tableSchema = table ? schema.tables.find((t) => t.name === table.name) : null;\n const colSchema = tableSchema?.columns.find((c) => c.name === parsed.column);\n const isDate = colSchema ? isDateColumn(colSchema) : false;\n setDateTrunc(isDate ? 'day' : '');\n }\n }, [groupByTableId, tables, schema.tables]);\n\n // Stable IDs for measures to avoid key issues with array index\n const measureIdCounter = useRef(0);\n const measureIdsRef = useRef<string[]>([]);\n\n // Ensure we have IDs for all measures\n while (measureIdsRef.current.length < measures.length) {\n measureIdsRef.current.push(`measure-${++measureIdCounter.current}`);\n }\n if (measureIdsRef.current.length > measures.length) {\n measureIdsRef.current = measureIdsRef.current.slice(0, measures.length);\n }\n\n // Handle measure change\n const updateMeasure = useCallback((index: number, updates: Partial<MeasureConfig>) => {\n setMeasures((prev) => prev.map((m, i) => (i === index ? { ...m, ...updates } : m)));\n }, []);\n\n // Add a new measure\n const addMeasure = useCallback(() => {\n measureIdsRef.current.push(`measure-${++measureIdCounter.current}`);\n setMeasures((prev) => [...prev, { column: '', aggregation: 'sum' }]);\n }, []);\n\n // Remove a measure\n const removeMeasure = useCallback((index: number) => {\n measureIdsRef.current = measureIdsRef.current.filter((_, i) => i !== index);\n setMeasures((prev) => prev.filter((_, i) => i !== index));\n }, []);\n\n // Styles\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.md,\n };\n\n const fieldStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.xs,\n };\n\n const labelStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n fontWeight: 500,\n color: theme.colors.text,\n };\n\n const measureRowStyle: React.CSSProperties = {\n display: 'flex',\n gap: theme.spacing.sm,\n alignItems: 'center',\n };\n\n const helpTextStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n };\n\n // Get current group by value in tableId.column format\n const groupByValue = groupByColumn && groupByTableId\n ? `${groupByTableId}.${groupByColumn}`\n : '';\n\n return (\n <div style={containerStyle}>\n {/* Primary Table Selection */}\n <div style={fieldStyle}>\n <label style={labelStyle}>From Table</label>\n <Select\n value={selectedTable}\n onChange={handleTableChange}\n options={[{ value: '', label: 'Select a table...' }, ...tableOptions]}\n />\n </div>\n\n {/* Additional Tables and Joins */}\n {selectedTable && (\n <CollapsibleSection title=\"Join Tables\" defaultOpen={tables.length > 1}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: theme.spacing.md }}>\n <TableSelector\n schema={schema}\n tables={tables}\n onChange={handleTablesChange}\n maxTables={5}\n showRelationships={true}\n />\n\n {/* Show JoinBuilder when 2+ tables selected */}\n {tables.length >= 2 && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Join Conditions</label>\n <JoinBuilder\n schema={schema}\n tables={tables}\n joins={joins}\n onChange={setJoins}\n />\n {joins.length === 0 && tables.length >= 2 && (\n <span style={helpTextStyle}>\n Define how tables relate to each other\n </span>\n )}\n </div>\n )}\n </div>\n </CollapsibleSection>\n )}\n\n {/* Group By (X-Axis) */}\n {selectedTable && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Group By (X-Axis)</label>\n {groupByOptions.length > 0 ? (\n <Select\n value={groupByValue}\n onChange={handleGroupByChange}\n options={[{ value: '', label: 'Select a column...' }, ...groupByOptions]}\n />\n ) : (\n <span style={helpTextStyle}>No categorical columns available</span>\n )}\n <span style={helpTextStyle}>Categories to group data by</span>\n </div>\n )}\n\n {/* Date Truncation (for date columns) */}\n {selectedTable && groupByColumn && isGroupByDate && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Date Granularity</label>\n <Select\n value={dateTrunc}\n onChange={(value) => setDateTrunc(value as DateTruncInterval | '')}\n options={DATE_TRUNC_OPTIONS}\n />\n <span style={helpTextStyle}>Truncate dates to this interval</span>\n </div>\n )}\n\n {/* Time Series Configuration (for date-based charts) */}\n {selectedTable && isGroupByDate && (\n <CollapsibleSection title=\"Time Series Options\" defaultOpen={timeSeries !== undefined}>\n <TimeSeriesConfig\n schema={schema}\n tables={tables}\n config={timeSeries}\n onChange={setTimeSeries}\n selectedDateColumn={\n groupByColumn && groupByTableId\n ? { table_id: groupByTableId, column: groupByColumn }\n : undefined\n }\n />\n </CollapsibleSection>\n )}\n\n {/* Measures (Y-Axis) */}\n {selectedTable && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Measures (Y-Axis)</label>\n {measures.map((measure, index) => (\n <div key={measureIdsRef.current[index]} style={measureRowStyle}>\n <Select\n value={measure.aggregation}\n onChange={(value) => updateMeasure(index, { aggregation: value as AggregationType })}\n options={AGGREGATIONS}\n style={{ width: '120px' }}\n />\n {measure.aggregation !== 'count' && (\n <>\n <span style={{ color: theme.colors.textMuted }}>of</span>\n {measureColumnOptions.length > 0 ? (\n <Select\n value={measure.column}\n onChange={(value) => updateMeasure(index, { column: value })}\n options={[{ value: '', label: 'Select column...' }, ...measureColumnOptions]}\n style={{ flex: 1 }}\n />\n ) : (\n <span style={{ ...helpTextStyle, flex: 1 }}>No numeric columns</span>\n )}\n </>\n )}\n {measures.length > 1 && (\n <Button variant=\"ghost\" size=\"sm\" onClick={() => removeMeasure(index)}>\n <Icon name=\"x\" size={14} />\n </Button>\n )}\n </div>\n ))}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={addMeasure}\n style={{ alignSelf: 'flex-start' }}\n >\n <Icon name=\"plus\" size={14} />\n <span style={{ marginLeft: theme.spacing.xs }}>Add measure</span>\n </Button>\n {invalidMeasureWarning && (\n <span style={{ fontSize: theme.fontSizes.xs, color: theme.colors.warning ?? theme.colors.error }}>\n {invalidMeasureWarning}\n </span>\n )}\n </div>\n )}\n\n {/* Optional Filters */}\n {selectedTable && currentTable && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Filters (optional)</label>\n <FilterBuilder\n tables={tables}\n filters={filters}\n onChange={setFilters}\n schema={schema}\n />\n </div>\n )}\n\n {/* Calculated Fields */}\n {selectedTable && (\n <CollapsibleSection\n title=\"Calculated Fields\"\n defaultOpen={calculatedFields.length > 0}\n >\n <CalculatedFieldBuilder\n fields={calculatedFields}\n onChange={setCalculatedFields}\n tables={tables}\n schema={schema}\n maxFields={5}\n />\n </CollapsibleSection>\n )}\n </div>\n );\n}\n","/**\n * Guided configuration for Pie Chart widgets.\n *\n * Provides a simplified interface to configure:\n * - Label column (slices)\n * - Value (size of each slice)\n * - Optional filters\n */\n\nimport { useState, useCallback, useMemo, useEffect } from 'react';\nimport { useTheme } from '../../../theme';\nimport { Select } from '../../../components/ui/Select';\nimport { FilterBuilder } from '../../../components/FilterBuilder';\nimport type {\n DatabaseSchema,\n QueryDefinition,\n AggregationType,\n FilterDefinition,\n ColumnSchema,\n DateTruncInterval,\n} from '../../../types';\n\nexport interface PieConfigProps {\n /** Database schema for table/column selection. */\n schema: DatabaseSchema;\n /** Current query (for restoring state). */\n query: QueryDefinition | null;\n /** Callback when query changes. */\n onChange: (query: QueryDefinition) => void;\n}\n\n/**\n * Available aggregations for pie values.\n */\nconst AGGREGATIONS: { value: AggregationType; label: string }[] = [\n { value: 'sum', label: 'Sum' },\n { value: 'count', label: 'Count' },\n { value: 'avg', label: 'Average' },\n];\n\n/**\n * Check if a column is numeric.\n */\nfunction isNumericColumn(col: ColumnSchema): boolean {\n const numericTypes = [\n 'integer',\n 'bigint',\n 'smallint',\n 'decimal',\n 'numeric',\n 'real',\n 'double precision',\n 'float',\n 'int',\n 'int4',\n 'int8',\n 'float4',\n 'float8',\n ];\n return numericTypes.some((t) => col.data_type.toLowerCase().includes(t));\n}\n\n/**\n * Check if a column is categorical (good for labels).\n */\nfunction isCategoricalColumn(col: ColumnSchema): boolean {\n const categoricalTypes = ['character varying', 'varchar', 'text', 'char', 'character'];\n return categoricalTypes.some((t) => col.data_type.toLowerCase().includes(t));\n}\n\n/**\n * Check if a column is a date/timestamp type.\n */\nfunction isDateColumn(col: ColumnSchema): boolean {\n const type = col.data_type.toLowerCase();\n return type.includes('date') || type.includes('time') || type.includes('timestamp');\n}\n\n/**\n * Date truncation options.\n */\nconst DATE_TRUNC_OPTIONS: { value: DateTruncInterval | ''; label: string }[] = [\n { value: '', label: 'No truncation' },\n { value: 'year', label: 'Year' },\n { value: 'quarter', label: 'Quarter' },\n { value: 'month', label: 'Month' },\n { value: 'week', label: 'Week' },\n { value: 'day', label: 'Day' },\n];\n\n/**\n * Guided pie chart configuration component.\n */\nexport function PieConfig({\n schema,\n query,\n onChange,\n}: PieConfigProps): JSX.Element {\n const { theme } = useTheme();\n\n // Extract state from existing query\n const initialTable = query?.tables[0]?.name ?? '';\n const labelCol = query?.columns.find((c) => c.aggregation === 'none');\n const initialLabel = labelCol?.column ?? '';\n const initialDateTrunc = labelCol?.date_trunc ?? '';\n const measureCol = query?.columns.find((c) => c.aggregation !== 'none');\n const initialValueColumn = measureCol?.column ?? '';\n const initialAggregation = measureCol?.aggregation ?? 'sum';\n\n const [selectedTable, setSelectedTable] = useState(initialTable);\n const [labelColumn, setLabelColumn] = useState(initialLabel);\n const [dateTrunc, setDateTrunc] = useState<DateTruncInterval | ''>(initialDateTrunc);\n const [valueColumn, setValueColumn] = useState(initialValueColumn);\n const [aggregation, setAggregation] = useState<AggregationType>(initialAggregation);\n const [filters, setFilters] = useState<FilterDefinition[]>(query?.filters ?? []);\n\n // Get table options\n const tableOptions = useMemo(() => {\n return schema.tables.map((t) => ({\n value: t.name,\n label: t.name,\n }));\n }, [schema.tables]);\n\n // Get current table schema\n const currentTable = useMemo(() => {\n return schema.tables.find((t) => t.name === selectedTable);\n }, [schema.tables, selectedTable]);\n\n // Get categorical columns for labels (including date columns)\n const labelOptions = useMemo(() => {\n if (!currentTable) return [];\n const cols = currentTable.columns.filter((c) => isCategoricalColumn(c) || isDateColumn(c));\n return cols.map((c) => ({\n value: c.name,\n label: `${c.name} (${c.data_type})`,\n }));\n }, [currentTable]);\n\n // Check if selected label column is a date type\n const labelColumnSchema = useMemo(() => {\n if (!currentTable || !labelColumn) return null;\n return currentTable.columns.find((c) => c.name === labelColumn) ?? null;\n }, [currentTable, labelColumn]);\n\n const isLabelDate = labelColumnSchema ? isDateColumn(labelColumnSchema) : false;\n\n // Get numeric columns for values\n const valueColumnOptions = useMemo(() => {\n if (!currentTable) return [];\n const numericCols = currentTable.columns.filter(isNumericColumn);\n return numericCols.map((c) => ({\n value: c.name,\n label: `${c.name} (${c.data_type})`,\n }));\n }, [currentTable]);\n\n // Build and emit query when config changes\n useEffect(() => {\n if (!selectedTable || !labelColumn) return;\n\n // For count, we don't need a value column\n const needsValueColumn = aggregation !== 'count';\n if (needsValueColumn && !valueColumn) return;\n\n const tableId = 't1';\n const tables = [{ id: tableId, name: selectedTable }];\n\n // Build columns: label column + value column\n // Alias preserves original column name when date_trunc transforms the SQL output name\n const columns = [\n {\n table_id: tableId,\n column: labelColumn,\n aggregation: 'none' as AggregationType,\n date_trunc: dateTrunc || undefined,\n alias: dateTrunc ? labelColumn : undefined,\n },\n // Value column (with aggregation)\n {\n table_id: tableId,\n column: needsValueColumn ? valueColumn : '*',\n aggregation,\n alias: 'value',\n },\n ];\n\n // Group by the label column\n const groupBy = [{ table_id: tableId, column: labelColumn }];\n\n const queryDef: QueryDefinition = {\n tables,\n columns,\n group_by: groupBy,\n filters: filters.length > 0 ? filters : undefined,\n order_by: [{ table_id: tableId, column: labelColumn, direction: 'ASC' }],\n };\n\n onChange(queryDef);\n }, [selectedTable, labelColumn, dateTrunc, valueColumn, aggregation, filters, onChange]);\n\n // Handle table change\n const handleTableChange = useCallback((value: string) => {\n setSelectedTable(value);\n setLabelColumn('');\n setDateTrunc('');\n setValueColumn('');\n setFilters([]);\n }, []);\n\n // Handle label column change\n const handleLabelChange = useCallback((value: string) => {\n setLabelColumn(value);\n\n // Auto-default to 'day' truncation for date/timestamp columns\n const colSchema = currentTable?.columns.find((c) => c.name === value);\n const isDate = colSchema ? isDateColumn(colSchema) : false;\n setDateTrunc(isDate ? 'day' : '');\n }, [currentTable]);\n\n // Styles\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.md,\n };\n\n const fieldStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.xs,\n };\n\n const labelStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n fontWeight: 500,\n color: theme.colors.text,\n };\n\n const helpTextStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n };\n\n const rowStyle: React.CSSProperties = {\n display: 'flex',\n gap: theme.spacing.sm,\n alignItems: 'center',\n };\n\n return (\n <div style={containerStyle}>\n {/* Table Selection */}\n <div style={fieldStyle}>\n <label style={labelStyle}>From Table</label>\n <Select\n value={selectedTable}\n onChange={handleTableChange}\n options={[{ value: '', label: 'Select a table...' }, ...tableOptions]}\n />\n </div>\n\n {/* Label Column (Slices) */}\n {selectedTable && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Slices (Labels)</label>\n {labelOptions.length > 0 ? (\n <Select\n value={labelColumn}\n onChange={handleLabelChange}\n options={[{ value: '', label: 'Select a column...' }, ...labelOptions]}\n />\n ) : (\n <span style={helpTextStyle}>No categorical columns available</span>\n )}\n <span style={helpTextStyle}>Each unique value becomes a slice</span>\n </div>\n )}\n\n {/* Date Truncation (for date labels) */}\n {selectedTable && labelColumn && isLabelDate && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Date Granularity</label>\n <Select\n value={dateTrunc}\n onChange={(value) => setDateTrunc(value as DateTruncInterval | '')}\n options={DATE_TRUNC_OPTIONS}\n />\n <span style={helpTextStyle}>Truncate dates to this interval</span>\n </div>\n )}\n\n {/* Value */}\n {selectedTable && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Size (Value)</label>\n <div style={rowStyle}>\n <Select\n value={aggregation}\n onChange={(value) => setAggregation(value as AggregationType)}\n options={AGGREGATIONS}\n style={{ width: '120px' }}\n />\n {aggregation !== 'count' && (\n <>\n <span style={{ color: theme.colors.textMuted }}>of</span>\n {valueColumnOptions.length > 0 ? (\n <Select\n value={valueColumn}\n onChange={setValueColumn}\n options={[{ value: '', label: 'Select column...' }, ...valueColumnOptions]}\n style={{ flex: 1 }}\n />\n ) : (\n <span style={{ ...helpTextStyle, flex: 1 }}>No numeric columns</span>\n )}\n </>\n )}\n </div>\n <span style={helpTextStyle}>Determines the size of each slice</span>\n </div>\n )}\n\n {/* Optional Filters */}\n {selectedTable && currentTable && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Filters (optional)</label>\n <FilterBuilder\n tables={[{ id: 't1', name: selectedTable }]}\n filters={filters}\n onChange={setFilters}\n schema={schema}\n />\n </div>\n )}\n </div>\n );\n}\n","/**\n * Guided configuration for Table widgets.\n *\n * Provides a simplified interface to configure:\n * - Table selection\n * - Column selection (which columns to display)\n * - Optional filters\n * - Row limit\n */\n\nimport { useState, useCallback, useMemo, useEffect } from 'react';\nimport { useTheme } from '../../../theme';\nimport { Select } from '../../../components/ui/Select';\nimport { Checkbox } from '../../../components/ui/Checkbox';\nimport { FilterBuilder } from '../../../components/FilterBuilder';\nimport type {\n DatabaseSchema,\n QueryDefinition,\n FilterDefinition,\n AggregationType,\n} from '../../../types';\n\nexport interface TableConfigProps {\n /** Database schema for table/column selection. */\n schema: DatabaseSchema;\n /** Current query (for restoring state). */\n query: QueryDefinition | null;\n /** Callback when query changes. */\n onChange: (query: QueryDefinition) => void;\n}\n\n/**\n * Guided table configuration component.\n */\nexport function TableConfig({\n schema,\n query,\n onChange,\n}: TableConfigProps): JSX.Element {\n const { theme } = useTheme();\n\n // Extract state from existing query\n const initialTable = query?.tables[0]?.name ?? '';\n const initialColumns = query?.columns.map((c) => c.column) ?? [];\n\n const [selectedTable, setSelectedTable] = useState(initialTable);\n const [selectedColumns, setSelectedColumns] = useState<string[]>(initialColumns);\n const [filters, setFilters] = useState<FilterDefinition[]>(query?.filters ?? []);\n const [limit, setLimit] = useState(query?.limit ?? 100);\n\n // Get table options\n const tableOptions = useMemo(() => {\n return schema.tables.map((t) => ({\n value: t.name,\n label: t.name,\n }));\n }, [schema.tables]);\n\n // Get current table schema\n const currentTable = useMemo(() => {\n return schema.tables.find((t) => t.name === selectedTable);\n }, [schema.tables, selectedTable]);\n\n // Build and emit query when config changes\n useEffect(() => {\n if (!selectedTable) return;\n\n const tableId = 't1';\n const tables = [{ id: tableId, name: selectedTable }];\n\n // If no columns selected, select all columns\n const columnsToUse =\n selectedColumns.length > 0 ? selectedColumns : currentTable?.columns.map((c) => c.name) ?? [];\n\n if (columnsToUse.length === 0) return;\n\n const columns = columnsToUse.map((col) => ({\n table_id: tableId,\n column: col,\n aggregation: 'none' as AggregationType,\n }));\n\n const queryDef: QueryDefinition = {\n tables,\n columns,\n filters: filters.length > 0 ? filters : undefined,\n limit,\n };\n\n onChange(queryDef);\n }, [selectedTable, selectedColumns, filters, limit, currentTable, onChange]);\n\n // Handle table change\n const handleTableChange = useCallback((value: string) => {\n setSelectedTable(value);\n setSelectedColumns([]);\n setFilters([]);\n }, []);\n\n // Handle column toggle\n const toggleColumn = useCallback((columnName: string) => {\n setSelectedColumns((prev) =>\n prev.includes(columnName) ? prev.filter((c) => c !== columnName) : [...prev, columnName]\n );\n }, []);\n\n // Select all columns\n const selectAllColumns = useCallback(() => {\n if (currentTable) {\n setSelectedColumns(currentTable.columns.map((c) => c.name));\n }\n }, [currentTable]);\n\n // Clear all columns\n const clearAllColumns = useCallback(() => {\n setSelectedColumns([]);\n }, []);\n\n // Styles\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.md,\n };\n\n const fieldStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.xs,\n };\n\n const labelStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n fontWeight: 500,\n color: theme.colors.text,\n };\n\n const helpTextStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n };\n\n const columnsContainerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.xs,\n padding: theme.spacing.sm,\n backgroundColor: theme.colors.background,\n borderRadius: theme.radius.sm,\n border: `1px solid ${theme.colors.border}`,\n maxHeight: '200px',\n overflowY: 'auto',\n };\n\n const columnActionsStyle: React.CSSProperties = {\n display: 'flex',\n gap: theme.spacing.md,\n fontSize: theme.fontSizes.xs,\n };\n\n const linkStyle: React.CSSProperties = {\n color: theme.colors.primary,\n cursor: 'pointer',\n textDecoration: 'underline',\n };\n\n const rowStyle: React.CSSProperties = {\n display: 'flex',\n gap: theme.spacing.md,\n alignItems: 'center',\n };\n\n return (\n <div style={containerStyle}>\n {/* Table Selection */}\n <div style={fieldStyle}>\n <label style={labelStyle}>From Table</label>\n <Select\n value={selectedTable}\n onChange={handleTableChange}\n options={[{ value: '', label: 'Select a table...' }, ...tableOptions]}\n />\n </div>\n\n {/* Column Selection */}\n {selectedTable && currentTable && (\n <div style={fieldStyle}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <label style={labelStyle}>Columns</label>\n <div style={columnActionsStyle}>\n <span style={linkStyle} onClick={selectAllColumns}>\n Select all\n </span>\n <span style={linkStyle} onClick={clearAllColumns}>\n Clear all\n </span>\n </div>\n </div>\n <div style={columnsContainerStyle}>\n {currentTable.columns.map((col) => (\n <Checkbox\n key={col.name}\n label={`${col.name} (${col.data_type})`}\n checked={selectedColumns.includes(col.name)}\n onChange={() => toggleColumn(col.name)}\n />\n ))}\n </div>\n <span style={helpTextStyle}>\n {selectedColumns.length === 0\n ? 'All columns will be shown'\n : `${selectedColumns.length} column(s) selected`}\n </span>\n </div>\n )}\n\n {/* Row Limit */}\n {selectedTable && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Maximum Rows</label>\n <div style={rowStyle}>\n <Select\n value={String(limit)}\n onChange={(value) => setLimit(parseInt(value, 10))}\n options={[\n { value: '25', label: '25 rows' },\n { value: '50', label: '50 rows' },\n { value: '100', label: '100 rows' },\n { value: '250', label: '250 rows' },\n { value: '500', label: '500 rows' },\n { value: '1000', label: '1000 rows' },\n ]}\n style={{ width: '150px' }}\n />\n </div>\n </div>\n )}\n\n {/* Optional Filters */}\n {selectedTable && currentTable && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Filters (optional)</label>\n <FilterBuilder\n tables={[{ id: 't1', name: selectedTable }]}\n filters={filters}\n onChange={setFilters}\n schema={schema}\n />\n </div>\n )}\n </div>\n );\n}\n","/**\n * HyperlinkSection component for configuring widget hyperlinks.\n *\n * Allows users to add a link that appears as an icon in the widget header.\n */\n\nimport { useState, type CSSProperties } from 'react';\nimport { useTheme } from '../../../theme';\nimport { Input } from '../../../components/ui/Input';\nimport { Select } from '../../../components/ui/Select';\nimport { CollapsibleSection } from '../../../components/ui/CollapsibleSection';\nimport type { WidgetHyperlink } from '../../types';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Validate that a URL uses a safe protocol (http or https).\n * Returns an error message if invalid, or null if valid.\n */\nfunction validateUrl(url: string): string | null {\n if (!url.trim()) return null;\n\n try {\n const parsed = new URL(url);\n if (!['http:', 'https:'].includes(parsed.protocol)) {\n return 'Only http:// and https:// URLs are allowed';\n }\n return null;\n } catch {\n // Not a valid URL format yet - allow partial input while typing\n if (url.includes('://') && !url.startsWith('http://') && !url.startsWith('https://')) {\n return 'Only http:// and https:// URLs are allowed';\n }\n return null;\n }\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface HyperlinkSectionProps {\n /** Current hyperlink configuration. */\n hyperlink: WidgetHyperlink | undefined;\n /** Callback when hyperlink changes. */\n onChange: (hyperlink: WidgetHyperlink | undefined) => void;\n /** Whether the section starts open. */\n defaultOpen?: boolean;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst TARGET_OPTIONS = [\n { value: '_blank', label: 'New Tab' },\n { value: '_self', label: 'Same Tab' },\n];\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Hyperlink configuration section for widgets.\n */\nexport function HyperlinkSection({\n hyperlink,\n onChange,\n defaultOpen = false,\n}: HyperlinkSectionProps): JSX.Element {\n const { theme } = useTheme();\n const [urlError, setUrlError] = useState<string | null>(null);\n\n const fieldStyle: CSSProperties = {\n marginBottom: theme.spacing.md,\n };\n\n const labelStyle: CSSProperties = {\n display: 'block',\n fontSize: theme.fontSizes.sm,\n color: theme.colors.text,\n marginBottom: theme.spacing.xs,\n };\n\n const helpTextStyle: CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n marginTop: theme.spacing.xs,\n };\n\n const errorStyle: CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.error,\n marginTop: theme.spacing.xs,\n };\n\n const handleUrlChange = (url: string) => {\n const trimmedUrl = url.trim();\n const error = validateUrl(trimmedUrl);\n setUrlError(error);\n\n if (!trimmedUrl) {\n onChange(undefined);\n } else if (!error) {\n onChange({\n url: trimmedUrl,\n title: hyperlink?.title,\n target: hyperlink?.target ?? '_blank',\n });\n }\n // If error, don't call onChange - keep previous valid value\n };\n\n const handleTitleChange = (title: string) => {\n if (!hyperlink?.url) return;\n onChange({\n ...hyperlink,\n title: title || undefined,\n });\n };\n\n const handleTargetChange = (target: string) => {\n if (!hyperlink?.url) return;\n onChange({\n ...hyperlink,\n target: target as '_blank' | '_self',\n });\n };\n\n return (\n <CollapsibleSection title=\"Hyperlink\" defaultOpen={defaultOpen}>\n <div style={fieldStyle}>\n <label style={labelStyle}>URL</label>\n <Input\n value={hyperlink?.url || ''}\n onChange={(e) => handleUrlChange(e.target.value)}\n placeholder=\"https://example.com/dashboard\"\n />\n {urlError ? (\n <div style={errorStyle}>{urlError}</div>\n ) : (\n <div style={helpTextStyle}>\n A link icon will appear in the widget header\n </div>\n )}\n </div>\n\n {hyperlink?.url && (\n <>\n <div style={fieldStyle}>\n <label style={labelStyle}>Tooltip Text</label>\n <Input\n value={hyperlink?.title || ''}\n onChange={(e) => handleTitleChange(e.target.value)}\n placeholder=\"Click to view details...\"\n />\n </div>\n\n <div style={fieldStyle}>\n <label style={labelStyle}>Open In</label>\n <Select\n value={hyperlink?.target || '_blank'}\n onChange={handleTargetChange}\n options={TARGET_OPTIONS}\n />\n </div>\n </>\n )}\n </CollapsibleSection>\n );\n}\n","/**\n * ReferenceLinesSection component for configuring chart reference lines.\n *\n * Allows users to add threshold/goal lines to bar, line, and area charts.\n */\n\nimport { useRef, type CSSProperties } from 'react';\nimport { useTheme } from '../../../theme';\nimport { Input } from '../../../components/ui/Input';\nimport { Select } from '../../../components/ui/Select';\nimport { Button } from '../../../components/ui/Button';\nimport { Icon } from '../../../components/ui/Icon';\nimport { CollapsibleSection } from '../../../components/ui/CollapsibleSection';\nimport type { ReferenceLine } from '../../types';\n\nexport interface ReferenceLinesSectionProps {\n /** Current reference lines. */\n lines: ReferenceLine[];\n /** Callback when lines change. */\n onChange: (lines: ReferenceLine[]) => void;\n /** Whether the section starts open. */\n defaultOpen?: boolean;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst LINE_STYLE_OPTIONS = [\n { value: 'solid', label: 'Solid' },\n { value: 'dashed', label: 'Dashed' },\n { value: 'dotted', label: 'Dotted' },\n];\n\nconst DEFAULT_COLORS = ['#ff4d4f', '#faad14', '#52c41a', '#1890ff'];\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Reference lines configuration section for charts.\n */\nexport function ReferenceLinesSection({\n lines,\n onChange,\n defaultOpen = false,\n}: ReferenceLinesSectionProps): JSX.Element {\n const { theme } = useTheme();\n\n // Counter for generating unique IDs\n const idCounter = useRef(0);\n // Map to track stable IDs for each line (keyed by position)\n const lineIdsRef = useRef<string[]>([]);\n\n // Ensure we have IDs for all lines\n while (lineIdsRef.current.length < lines.length) {\n lineIdsRef.current.push(`line-${++idCounter.current}`);\n }\n // Trim excess IDs if lines were removed\n if (lineIdsRef.current.length > lines.length) {\n lineIdsRef.current = lineIdsRef.current.slice(0, lines.length);\n }\n\n const lineRowStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.sm,\n marginBottom: theme.spacing.sm,\n padding: theme.spacing.sm,\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.sm,\n border: `1px solid ${theme.colors.border}`,\n };\n\n const addButtonStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.xs,\n marginTop: theme.spacing.sm,\n };\n\n const colorInputStyle: CSSProperties = {\n width: '32px',\n height: '32px',\n padding: 0,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.sm,\n cursor: 'pointer',\n backgroundColor: 'transparent',\n };\n\n const addLine = () => {\n const newLine: ReferenceLine = {\n value: 0,\n label: '',\n color: DEFAULT_COLORS[lines.length % DEFAULT_COLORS.length],\n lineStyle: 'dashed',\n };\n // Add a new stable ID for the new line\n lineIdsRef.current.push(`line-${++idCounter.current}`);\n onChange([...lines, newLine]);\n };\n\n const updateLine = (index: number, updates: Partial<ReferenceLine>) => {\n onChange(\n lines.map((line, i) => (i === index ? { ...line, ...updates } : line))\n );\n };\n\n const removeLine = (index: number) => {\n // Remove the corresponding stable ID\n lineIdsRef.current = lineIdsRef.current.filter((_, i) => i !== index);\n onChange(lines.filter((_, i) => i !== index));\n };\n\n return (\n <CollapsibleSection\n title=\"Reference Lines\"\n defaultOpen={defaultOpen || lines.length > 0}\n >\n {lines.map((line, index) => (\n <div key={lineIdsRef.current[index]} style={lineRowStyle}>\n <Input\n type=\"number\"\n value={String(line.value)}\n onChange={(e) =>\n updateLine(index, { value: parseFloat(e.target.value) || 0 })\n }\n placeholder=\"Value\"\n style={{ width: '80px' }}\n />\n <Input\n value={line.label ?? ''}\n onChange={(e) =>\n updateLine(index, { label: e.target.value || undefined })\n }\n placeholder=\"Label\"\n style={{ flex: 1 }}\n />\n <input\n type=\"color\"\n value={line.color ?? DEFAULT_COLORS[0]}\n onChange={(e) => updateLine(index, { color: e.target.value })}\n title=\"Line color\"\n style={colorInputStyle}\n />\n <Select\n value={line.lineStyle ?? 'dashed'}\n onChange={(value) =>\n updateLine(index, {\n lineStyle: value as ReferenceLine['lineStyle'],\n })\n }\n options={LINE_STYLE_OPTIONS}\n style={{ width: '90px' }}\n />\n <Button variant=\"ghost\" size=\"sm\" onClick={() => removeLine(index)}>\n <Icon name=\"x\" size={14} />\n </Button>\n </div>\n ))}\n\n <div style={addButtonStyle}>\n <Button variant=\"ghost\" size=\"sm\" onClick={addLine}>\n <Icon name=\"plus\" size={14} />\n <span style={{ marginLeft: theme.spacing.xs }}>\n Add reference line\n </span>\n </Button>\n </div>\n </CollapsibleSection>\n );\n}\n","/**\n * TextFormattingSection component for configuring text widget content and styling.\n *\n * Provides:\n * - Textarea for content with optional markdown preview\n * - Markdown toggle\n * - Text alignment selector\n * - Font size selector\n */\n\nimport { useState } from 'react';\nimport { useTheme } from '../../../theme';\nimport { Select } from '../../../components/ui/Select';\nimport { Checkbox } from '../../../components/ui/Checkbox';\nimport { parseMarkdownSafe } from '../../../utils';\nimport type { WidgetConfig } from '../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TextFormattingSectionProps {\n /** Current config. */\n config: WidgetConfig;\n /** Callback when config changes. */\n onChange: <K extends keyof WidgetConfig>(key: K, value: WidgetConfig[K]) => void;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst ALIGNMENT_OPTIONS = [\n { value: 'Left', label: 'Left' },\n { value: 'Center', label: 'Center' },\n { value: 'Right', label: 'Right' },\n];\n\nconst FONT_SIZE_OPTIONS = [\n { value: 'Small', label: 'Small' },\n { value: 'Normal', label: 'Normal' },\n { value: 'Large', label: 'Large' },\n { value: 'XLarge', label: 'Extra Large' },\n];\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Text formatting configuration for text widgets.\n */\nexport function TextFormattingSection({\n config,\n onChange,\n}: TextFormattingSectionProps): JSX.Element {\n const { theme } = useTheme();\n const [showPreview, setShowPreview] = useState(false);\n\n const fieldStyle: React.CSSProperties = {\n marginBottom: theme.spacing.md,\n };\n\n const labelStyle: React.CSSProperties = {\n display: 'block',\n fontSize: theme.fontSizes.sm,\n color: theme.colors.text,\n marginBottom: theme.spacing.xs,\n };\n\n const rowStyle: React.CSSProperties = {\n display: 'flex',\n gap: theme.spacing.md,\n };\n\n const halfFieldStyle: React.CSSProperties = {\n flex: 1,\n marginBottom: theme.spacing.md,\n };\n\n const headerStyle: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: theme.spacing.xs,\n };\n\n const textareaStyle: React.CSSProperties = {\n width: '100%',\n padding: theme.spacing.sm,\n fontSize: theme.fontSizes.sm,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.sm,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n fontFamily: config.markdown ? theme.fonts.mono : theme.fonts.sans,\n resize: 'vertical',\n minHeight: '120px',\n };\n\n const previewStyle: React.CSSProperties = {\n width: '100%',\n minHeight: '120px',\n padding: theme.spacing.sm,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.sm,\n backgroundColor: theme.colors.surface,\n color: theme.colors.text,\n fontSize: theme.fontSizes.sm,\n lineHeight: 1.6,\n overflow: 'auto',\n };\n\n const previewLabelStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n marginBottom: theme.spacing.xs,\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.xs,\n };\n\n return (\n <>\n {/* Content */}\n <div style={fieldStyle}>\n <div style={headerStyle}>\n <label style={labelStyle}>Content</label>\n {config.markdown && (\n <Checkbox\n label=\"Preview\"\n checked={showPreview}\n onChange={(e) => setShowPreview(e.target.checked)}\n />\n )}\n </div>\n\n {showPreview && config.markdown ? (\n <div style={previewStyle}>\n <div style={previewLabelStyle}>\n <span>Markdown Preview</span>\n </div>\n <div\n dangerouslySetInnerHTML={{\n __html: parseMarkdownSafe(config.content ?? ''),\n }}\n />\n </div>\n ) : (\n <textarea\n value={config.content ?? ''}\n onChange={(e) => onChange('content', e.target.value)}\n rows={8}\n style={textareaStyle}\n placeholder=\"Enter text content...\"\n />\n )}\n </div>\n\n {/* Markdown toggle */}\n <div style={fieldStyle}>\n <Checkbox\n label=\"Enable Markdown\"\n checked={config.markdown ?? false}\n onChange={(e) => onChange('markdown', e.target.checked)}\n />\n </div>\n\n {/* Alignment and Font Size */}\n <div style={rowStyle}>\n <div style={halfFieldStyle}>\n <label style={labelStyle}>Alignment</label>\n <Select\n value={config.alignment ?? 'Left'}\n onChange={(value) =>\n onChange('alignment', value as WidgetConfig['alignment'])\n }\n options={ALIGNMENT_OPTIONS}\n />\n </div>\n <div style={halfFieldStyle}>\n <label style={labelStyle}>Font Size</label>\n <Select\n value={config.fontSize ?? 'Normal'}\n onChange={(value) =>\n onChange('fontSize', value as WidgetConfig['fontSize'])\n }\n options={FONT_SIZE_OPTIONS}\n />\n </div>\n </div>\n </>\n );\n}\n","/**\n * PivotConfigSection component for configuring pivot table mode.\n *\n * Allows users to:\n * - Enable/disable pivot mode\n * - Select pivot column (values become new columns)\n * - Select value column (values to aggregate)\n */\n\nimport { useMemo, type CSSProperties } from 'react';\nimport { useTheme } from '../../../theme';\nimport { Select } from '../../../components/ui/Select';\nimport { Checkbox } from '../../../components/ui/Checkbox';\nimport { CollapsibleSection } from '../../../components/ui/CollapsibleSection';\nimport type { WidgetConfig } from '../../types';\nimport type { QueryDefinition, DatabaseSchema } from '../../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PivotConfigSectionProps {\n /** Current config. */\n config: WidgetConfig;\n /** Callback when config changes. */\n onChange: <K extends keyof WidgetConfig>(key: K, value: WidgetConfig[K]) => void;\n /** Current query (to get column options). */\n query: QueryDefinition | null;\n /** Database schema (to determine column types). */\n schema: DatabaseSchema | null;\n /** Whether the section starts open. */\n defaultOpen?: boolean;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Pivot table configuration section.\n */\nexport function PivotConfigSection({\n config,\n onChange,\n query,\n schema,\n defaultOpen = false,\n}: PivotConfigSectionProps): JSX.Element {\n const { theme } = useTheme();\n\n const isPivotEnabled = !!config.pivot_column;\n\n const fieldStyle: CSSProperties = {\n marginBottom: theme.spacing.md,\n };\n\n const labelStyle: CSSProperties = {\n display: 'block',\n fontSize: theme.fontSizes.sm,\n color: theme.colors.text,\n marginBottom: theme.spacing.xs,\n };\n\n const helpTextStyle: CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n marginTop: theme.spacing.xs,\n };\n\n const previewStyle: CSSProperties = {\n padding: theme.spacing.sm,\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.sm,\n border: `1px solid ${theme.colors.border}`,\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n marginTop: theme.spacing.sm,\n };\n\n // Get column options from query\n const columnOptions = useMemo(() => {\n if (!query?.columns) return [];\n return query.columns.map((col) => ({\n value: col.column,\n label: col.column,\n }));\n }, [query]);\n\n // Get categorical columns for pivot (text-like columns)\n const categoricalColumns = useMemo(() => {\n if (!query?.columns || !schema) return columnOptions;\n\n // Try to filter to categorical/text columns\n const textTypes = ['text', 'varchar', 'character varying', 'char', 'string'];\n const categoricalCols = query.columns.filter((col) => {\n // Find the correct table for this column using table_id\n const queryTable = query.tables.find((t) => t.id === col.table_id);\n const tableSchema = queryTable\n ? schema.tables.find((t) => t.name === queryTable.name)\n : // Fallback: search all tables for the column\n schema.tables.find((t) => t.columns.some((c) => c.name === col.column));\n const colSchema = tableSchema?.columns.find((c) => c.name === col.column);\n\n if (!colSchema) return true; // Include if unknown\n return textTypes.some((t) => colSchema.data_type.toLowerCase().includes(t));\n });\n\n // If no categorical columns found, return all columns\n if (categoricalCols.length === 0) return columnOptions;\n\n return categoricalCols.map((col) => ({\n value: col.column,\n label: col.column,\n }));\n }, [query, schema, columnOptions]);\n\n // Get numeric columns for value\n const numericColumns = useMemo(() => {\n if (!query?.columns || !schema) return columnOptions;\n\n // Filter to numeric columns\n const numericTypes = [\n 'int',\n 'integer',\n 'bigint',\n 'smallint',\n 'numeric',\n 'decimal',\n 'float',\n 'double',\n 'real',\n 'number',\n ];\n const numericCols = query.columns.filter((col) => {\n // Find the correct table for this column using table_id\n const queryTable = query.tables.find((t) => t.id === col.table_id);\n const tableSchema = queryTable\n ? schema.tables.find((t) => t.name === queryTable.name)\n : // Fallback: search all tables for the column\n schema.tables.find((t) => t.columns.some((c) => c.name === col.column));\n const colSchema = tableSchema?.columns.find((c) => c.name === col.column);\n\n if (!colSchema) return true; // Include if unknown\n return numericTypes.some((t) => colSchema.data_type.toLowerCase().includes(t));\n });\n\n // If no numeric columns found, return all columns\n if (numericCols.length === 0) return columnOptions;\n\n return numericCols.map((col) => ({\n value: col.column,\n label: col.column,\n }));\n }, [query, schema, columnOptions]);\n\n const handleEnableChange = (enabled: boolean) => {\n if (!enabled) {\n onChange('pivot_column', undefined);\n onChange('value_column', undefined);\n } else {\n // Set defaults if columns are available\n const defaultPivot = categoricalColumns[0]?.value;\n const defaultValue = numericColumns[0]?.value;\n if (defaultPivot) onChange('pivot_column', defaultPivot);\n if (defaultValue) onChange('value_column', defaultValue);\n }\n };\n\n // Determine dimension columns (all except pivot and value)\n const dimensionColumns = useMemo(() => {\n if (!query?.columns || !config.pivot_column || !config.value_column) return [];\n return query.columns\n .filter(\n (col) =>\n col.column !== config.pivot_column && col.column !== config.value_column\n )\n .map((col) => col.column);\n }, [query, config.pivot_column, config.value_column]);\n\n return (\n <CollapsibleSection\n title=\"Pivot Table\"\n defaultOpen={defaultOpen || isPivotEnabled}\n >\n <div style={fieldStyle}>\n <Checkbox\n label=\"Enable Pivot Mode\"\n checked={isPivotEnabled}\n onChange={(e) => handleEnableChange(e.target.checked)}\n />\n </div>\n\n {isPivotEnabled && (\n <>\n <div style={fieldStyle}>\n <label style={labelStyle}>Pivot Column</label>\n <Select\n value={config.pivot_column ?? ''}\n onChange={(value) => onChange('pivot_column', value || undefined)}\n options={[\n { value: '', label: 'Select column...' },\n ...categoricalColumns,\n ]}\n />\n <div style={helpTextStyle}>\n Unique values in this column become new columns\n </div>\n </div>\n\n <div style={fieldStyle}>\n <label style={labelStyle}>Value Column</label>\n <Select\n value={config.value_column ?? ''}\n onChange={(value) => onChange('value_column', value || undefined)}\n options={[{ value: '', label: 'Select column...' }, ...numericColumns]}\n />\n <div style={helpTextStyle}>\n Values to distribute across the pivot columns\n </div>\n </div>\n\n {config.pivot_column && config.value_column && (\n <div style={previewStyle}>\n <strong>Pivot Preview:</strong>\n <br />\n Rows:{' '}\n {dimensionColumns.length > 0 ? dimensionColumns.join(', ') : '(all rows)'}\n <br />\n Columns: Unique values from <code>{config.pivot_column}</code>\n <br />\n Values: <code>{config.value_column}</code>\n </div>\n )}\n </>\n )}\n </CollapsibleSection>\n );\n}\n","/**\n * LayoutConstraintsSection component for configuring widget size constraints.\n *\n * Allows users to set:\n * - Minimum width (in grid units)\n * - Maximum width (in grid units)\n * - Minimum height (in grid units)\n * - Maximum height (in grid units)\n */\n\nimport type { CSSProperties } from 'react';\nimport { useTheme } from '../../../theme';\nimport { Input } from '../../../components/ui/Input';\nimport { CollapsibleSection } from '../../../components/ui/CollapsibleSection';\nimport type { WidgetPosition } from '../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface LayoutConstraintsSectionProps {\n /** Current widget position. */\n position: WidgetPosition;\n /** Callback when position changes. */\n onChange: (position: WidgetPosition) => void;\n /** Whether the section starts open. */\n defaultOpen?: boolean;\n /** Maximum number of columns in the grid (for width constraints). */\n maxColumns?: number;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Widget size constraints configuration.\n */\nexport function LayoutConstraintsSection({\n position,\n onChange,\n defaultOpen = false,\n maxColumns = 12,\n}: LayoutConstraintsSectionProps): JSX.Element {\n const { theme } = useTheme();\n\n const gridStyle: CSSProperties = {\n display: 'grid',\n gridTemplateColumns: '1fr 1fr',\n gap: theme.spacing.sm,\n };\n\n const fieldStyle: CSSProperties = {\n marginBottom: theme.spacing.sm,\n };\n\n const labelStyle: CSSProperties = {\n display: 'block',\n fontSize: theme.fontSizes.sm,\n color: theme.colors.text,\n marginBottom: theme.spacing.xs,\n };\n\n const helpTextStyle: CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n marginTop: theme.spacing.sm,\n gridColumn: '1 / -1',\n };\n\n const handleChange = (\n field: 'minW' | 'maxW' | 'minH' | 'maxH',\n value: string\n ) => {\n const numValue = value ? parseInt(value, 10) : undefined;\n onChange({\n ...position,\n [field]: numValue,\n });\n };\n\n // Check if any constraints are set\n const hasConstraints =\n position.minW !== undefined ||\n position.maxW !== undefined ||\n position.minH !== undefined ||\n position.maxH !== undefined;\n\n return (\n <CollapsibleSection\n title=\"Size Constraints\"\n defaultOpen={defaultOpen || hasConstraints}\n >\n <div style={gridStyle}>\n <div style={fieldStyle}>\n <label style={labelStyle}>Min Width</label>\n <Input\n type=\"number\"\n value={position.minW !== undefined ? String(position.minW) : ''}\n onChange={(e) => handleChange('minW', e.target.value)}\n placeholder=\"Auto\"\n min={1}\n max={maxColumns}\n />\n </div>\n <div style={fieldStyle}>\n <label style={labelStyle}>Max Width</label>\n <Input\n type=\"number\"\n value={position.maxW !== undefined ? String(position.maxW) : ''}\n onChange={(e) => handleChange('maxW', e.target.value)}\n placeholder=\"Auto\"\n min={1}\n max={maxColumns}\n />\n </div>\n <div style={fieldStyle}>\n <label style={labelStyle}>Min Height</label>\n <Input\n type=\"number\"\n value={position.minH !== undefined ? String(position.minH) : ''}\n onChange={(e) => handleChange('minH', e.target.value)}\n placeholder=\"Auto\"\n min={1}\n />\n </div>\n <div style={fieldStyle}>\n <label style={labelStyle}>Max Height</label>\n <Input\n type=\"number\"\n value={position.maxH !== undefined ? String(position.maxH) : ''}\n onChange={(e) => handleChange('maxH', e.target.value)}\n placeholder=\"Auto\"\n min={1}\n />\n </div>\n <span style={helpTextStyle}>\n Values are in grid units (1-{maxColumns} for width). Leave empty for automatic\n sizing.\n </span>\n </div>\n </CollapsibleSection>\n );\n}\n","/**\n * CrossFilterSection component for configuring widget cross-filtering.\n *\n * Allows users to:\n * - Enable/disable the widget as a cross-filter source\n * - Select which column to use for filtering\n */\n\nimport type { ChangeEvent, CSSProperties } from 'react';\nimport { useMemo } from 'react';\nimport { useTheme } from '../../../theme';\nimport { Select } from '../../../components/ui/Select';\nimport { Checkbox } from '../../../components/ui/Checkbox';\nimport { CollapsibleSection } from '../../../components/ui/CollapsibleSection';\nimport type { WidgetConfig, WidgetCrossFilterConfig } from '../../types';\nimport type { QueryDefinition } from '../../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CrossFilterSectionProps {\n /** Current config. */\n config: WidgetConfig;\n /** Callback when config changes. */\n onChange: <K extends keyof WidgetConfig>(\n key: K,\n value: WidgetConfig[K]\n ) => void;\n /** Current query to get column options. */\n query: QueryDefinition | null;\n /** Whether the section starts open. */\n defaultOpen?: boolean;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Cross-filter configuration section.\n */\nexport function CrossFilterSection({\n config,\n onChange,\n query,\n defaultOpen = false,\n}: CrossFilterSectionProps): JSX.Element {\n const { theme } = useTheme();\n\n const fieldStyle: CSSProperties = {\n marginBottom: theme.spacing.md,\n };\n\n const labelStyle: CSSProperties = {\n display: 'block',\n fontSize: theme.fontSizes.sm,\n color: theme.colors.text,\n marginBottom: theme.spacing.xs,\n };\n\n const helpTextStyle: CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n marginTop: theme.spacing.xs,\n };\n\n // Get column options from query\n const columnOptions = useMemo(() => {\n if (!query?.columns) return [];\n return query.columns.map((col) => ({\n value: col.column,\n label: col.column,\n }));\n }, [query]);\n\n const crossFilterEnabled = config.cross_filter?.enabled ?? false;\n\n const handleEnableChange = (enabled: boolean) => {\n if (!enabled) {\n onChange('cross_filter', undefined);\n } else {\n const newConfig: WidgetCrossFilterConfig = {\n enabled: true,\n column: config.x_axis, // Default to x_axis\n };\n onChange('cross_filter', newConfig);\n }\n };\n\n const handleColumnChange = (column: string) => {\n onChange('cross_filter', {\n ...config.cross_filter,\n enabled: true,\n column: column || undefined,\n });\n };\n\n return (\n <CollapsibleSection\n title=\"Cross-Filtering\"\n defaultOpen={defaultOpen || crossFilterEnabled}\n >\n <div style={fieldStyle}>\n <Checkbox\n label=\"Enable as filter source\"\n checked={crossFilterEnabled}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n handleEnableChange(e.target.checked)\n }\n />\n <div style={helpTextStyle}>\n When enabled, clicking data points will filter other widgets\n </div>\n </div>\n\n {crossFilterEnabled && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Filter Column</label>\n <Select\n value={config.cross_filter?.column ?? config.x_axis ?? ''}\n onChange={handleColumnChange}\n options={[\n { value: '', label: 'Use X-Axis column' },\n ...columnOptions,\n ]}\n />\n <div style={helpTextStyle}>\n The column used to filter other widgets when a data point is clicked\n </div>\n </div>\n )}\n </CollapsibleSection>\n );\n}\n","/**\n * Guided data configuration wrapper.\n *\n * Renders the appropriate guided config component based on widget type.\n */\n\nimport { useTheme } from '../../theme';\nimport { MetricConfig, ChartConfig, PieConfig, TableConfig } from './configs';\nimport type { WidgetType } from '../types';\nimport type { DatabaseSchema, QueryDefinition } from '../../types';\n\nexport interface GuidedDataConfigProps {\n /** Widget type to configure. */\n widgetType: WidgetType;\n /** Database schema for table/column selection. */\n schema: DatabaseSchema;\n /** Current query (for restoring state). */\n query: QueryDefinition | null;\n /** Callback when query changes. */\n onChange: (query: QueryDefinition) => void;\n}\n\n/**\n * Renders widget-specific guided data configuration.\n */\nexport function GuidedDataConfig({\n widgetType,\n schema,\n query,\n onChange,\n}: GuidedDataConfigProps): JSX.Element {\n const { theme } = useTheme();\n\n // Render the appropriate config based on widget type\n switch (widgetType) {\n case 'metric':\n return <MetricConfig schema={schema} query={query} onChange={onChange} />;\n\n case 'bar_chart':\n case 'line_chart':\n case 'area_chart':\n case 'scatter_chart':\n return <ChartConfig schema={schema} query={query} onChange={onChange} />;\n\n case 'pie_chart':\n return <PieConfig schema={schema} query={query} onChange={onChange} />;\n\n case 'table':\n return <TableConfig schema={schema} query={query} onChange={onChange} />;\n\n case 'text':\n // Text widgets don't need data configuration\n return (\n <div\n style={{\n padding: theme.spacing.md,\n color: theme.colors.textMuted,\n textAlign: 'center',\n }}\n >\n Text widgets don't require a data source.\n </div>\n );\n\n default:\n return (\n <div\n style={{\n padding: theme.spacing.md,\n color: theme.colors.textMuted,\n textAlign: 'center',\n }}\n >\n No guided configuration available for this widget type.\n </div>\n );\n }\n}\n","/**\n * ValueFormattingSection component for configuring number formatting.\n *\n * Provides options for:\n * - Value format (number, currency, percent, compact)\n * - Currency symbol\n * - Compact notation (K, M, B, T)\n * - Decimal digits\n */\n\nimport { useTheme } from '../../../theme';\nimport { Select } from '../../../components/ui/Select';\nimport { Input } from '../../../components/ui/Input';\nimport { CollapsibleSection } from '../../../components/ui/CollapsibleSection';\nimport type { WidgetConfig } from '../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ValueFormattingSectionProps {\n /** Current config. */\n config: WidgetConfig;\n /** Callback when config changes. */\n onChange: <K extends keyof WidgetConfig>(key: K, value: WidgetConfig[K]) => void;\n /** Whether to show currency options. */\n showCurrency?: boolean;\n /** Whether to show compact notation options. */\n showCompact?: boolean;\n /** Whether the section starts open. */\n defaultOpen?: boolean;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst FORMAT_OPTIONS = [\n { value: 'number', label: 'Number (1,234.56)' },\n { value: 'currency', label: 'Currency ($1,234.56)' },\n { value: 'percent', label: 'Percentage (12.34%)' },\n { value: 'compact', label: 'Compact (1.2K)' },\n];\n\nconst COMPACT_OPTIONS = [\n { value: '', label: 'None' },\n { value: 'K', label: 'K (Thousands)' },\n { value: 'M', label: 'M (Millions)' },\n { value: 'B', label: 'B (Billions)' },\n { value: 'T', label: 'T (Trillions)' },\n];\n\nconst DECIMAL_OPTIONS = [\n { value: '0', label: '0 decimals' },\n { value: '1', label: '1 decimal' },\n { value: '2', label: '2 decimals' },\n { value: '3', label: '3 decimals' },\n { value: '4', label: '4 decimals' },\n];\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Value formatting configuration section.\n */\nexport function ValueFormattingSection({\n config,\n onChange,\n showCurrency = true,\n showCompact = true,\n defaultOpen = false,\n}: ValueFormattingSectionProps): JSX.Element {\n const { theme } = useTheme();\n\n const fieldStyle: React.CSSProperties = {\n marginBottom: theme.spacing.md,\n };\n\n const labelStyle: React.CSSProperties = {\n display: 'block',\n fontSize: theme.fontSizes.sm,\n color: theme.colors.text,\n marginBottom: theme.spacing.xs,\n };\n\n const isCurrency = config.valueFormat === 'currency' || config.format === 'currency';\n\n return (\n <CollapsibleSection title=\"Value Formatting\" defaultOpen={defaultOpen}>\n <div style={fieldStyle}>\n <label style={labelStyle}>Format</label>\n <Select\n value={config.valueFormat || config.format || 'number'}\n onChange={(value) => {\n const formatValue = value as WidgetConfig['valueFormat'];\n // Set both valueFormat and format to keep them in sync\n // (MetricCard reads from config.format, other components may use valueFormat)\n onChange('valueFormat', formatValue);\n onChange('format', formatValue);\n }}\n options={FORMAT_OPTIONS}\n />\n </div>\n\n {isCurrency && showCurrency && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Currency Symbol</label>\n <Input\n value={config.currencySymbol ?? '$'}\n onChange={(e) => onChange('currencySymbol', e.target.value)}\n placeholder=\"$\"\n style={{ width: '80px' }}\n />\n </div>\n )}\n\n {showCompact && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Compact Notation</label>\n <Select\n value={config.compactNotation || ''}\n onChange={(value) =>\n onChange('compactNotation', value ? (value as WidgetConfig['compactNotation']) : null)\n }\n options={COMPACT_OPTIONS}\n />\n </div>\n )}\n\n <div style={fieldStyle}>\n <label style={labelStyle}>Decimal Places</label>\n <Select\n value={String(config.decimalDigits ?? 2)}\n onChange={(value) => onChange('decimalDigits', parseInt(value, 10))}\n options={DECIMAL_OPTIONS}\n />\n </div>\n </CollapsibleSection>\n );\n}\n","/**\n * DisplayConfigSection component for chart display options.\n *\n * Provides options for:\n * - Color palette\n * - Show legend\n * - Show data labels\n * - Stacked (for bar/area charts)\n * - Orientation (for bar charts)\n */\n\nimport type { ChangeEvent } from 'react';\nimport { useTheme } from '../../../theme';\nimport { Select } from '../../../components/ui/Select';\nimport { Checkbox } from '../../../components/ui/Checkbox';\nimport { CollapsibleSection } from '../../../components/ui/CollapsibleSection';\nimport { ColorPaletteSelector } from '../../../components/ui/ColorPaletteSelector';\nimport type { WidgetConfig, WidgetType } from '../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DisplayConfigSectionProps {\n /** Widget type for context-specific options. */\n widgetType: WidgetType;\n /** Current config. */\n config: WidgetConfig;\n /** Callback when config changes. */\n onChange: <K extends keyof WidgetConfig>(key: K, value: WidgetConfig[K]) => void;\n /** Whether the section starts open. */\n defaultOpen?: boolean;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Display configuration section for charts.\n */\nexport function DisplayConfigSection({\n widgetType,\n config,\n onChange,\n defaultOpen = false,\n}: DisplayConfigSectionProps): JSX.Element {\n const { theme } = useTheme();\n\n const fieldStyle: React.CSSProperties = {\n marginBottom: theme.spacing.md,\n };\n\n const labelStyle: React.CSSProperties = {\n display: 'block',\n fontSize: theme.fontSizes.sm,\n color: theme.colors.text,\n marginBottom: theme.spacing.xs,\n };\n\n const rowStyle: React.CSSProperties = {\n display: 'flex',\n gap: theme.spacing.md,\n flexWrap: 'wrap',\n marginBottom: theme.spacing.md,\n };\n\n const showOrientation = widgetType === 'bar_chart';\n const showStacked = widgetType === 'bar_chart' || widgetType === 'area_chart';\n const showColorPalette = [\n 'bar_chart',\n 'line_chart',\n 'area_chart',\n 'pie_chart',\n 'scatter_chart',\n ].includes(widgetType);\n\n return (\n <CollapsibleSection title=\"Display Options\" defaultOpen={defaultOpen}>\n {/* Color Palette */}\n {showColorPalette && (\n <div style={fieldStyle}>\n <ColorPaletteSelector\n value={config.colors}\n onChange={(colors) => onChange('colors', colors)}\n />\n </div>\n )}\n\n {/* Orientation (bar charts only) */}\n {showOrientation && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Orientation</label>\n <Select\n value={config.orientation || 'vertical'}\n onChange={(value) => onChange('orientation', value as 'vertical' | 'horizontal')}\n options={[\n { value: 'vertical', label: 'Vertical' },\n { value: 'horizontal', label: 'Horizontal' },\n ]}\n />\n </div>\n )}\n\n {/* Checkboxes */}\n <div style={rowStyle}>\n <Checkbox\n label=\"Show Legend\"\n checked={config.show_legend ?? true}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n onChange('show_legend', e.target.checked)\n }\n />\n <Checkbox\n label=\"Data Labels\"\n checked={config.show_data_labels ?? false}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n onChange('show_data_labels', e.target.checked)\n }\n />\n {showStacked && (\n <Checkbox\n label=\"Stacked\"\n checked={config.stacked ?? false}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n onChange('stacked', e.target.checked)\n }\n />\n )}\n </div>\n </CollapsibleSection>\n );\n}\n","/**\n * DateFormattingSection component for configuring date display formats.\n *\n * Allows setting format strings for each date column in the query.\n */\n\nimport { useMemo, useCallback, type CSSProperties } from 'react';\nimport { useTheme } from '../../../theme';\nimport { Select } from '../../../components/ui/Select';\nimport { CollapsibleSection } from '../../../components/ui/CollapsibleSection';\nimport type { WidgetConfig } from '../../types';\nimport type { QueryDefinition, DatabaseSchema, ColumnSchema } from '../../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DateFormattingSectionProps {\n /** Current config. */\n config: WidgetConfig;\n /** Callback when config changes. */\n onChange: <K extends keyof WidgetConfig>(key: K, value: WidgetConfig[K]) => void;\n /** Current query for detecting date columns. */\n query: QueryDefinition | null;\n /** Database schema for column type info. */\n schema: DatabaseSchema | null;\n /** Whether the section starts open. */\n defaultOpen?: boolean;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DATE_FORMAT_PRESETS = [\n { value: '', label: 'Default' },\n { value: 'yyyy-MM-dd', label: '2024-01-15' },\n { value: 'MMM dd, yyyy', label: 'Jan 15, 2024' },\n { value: 'MMMM dd, yyyy', label: 'January 15, 2024' },\n { value: 'dd/MM/yyyy', label: '15/01/2024' },\n { value: 'MM/dd/yyyy', label: '01/15/2024' },\n { value: 'MMM yyyy', label: 'Jan 2024' },\n { value: 'MMMM yyyy', label: 'January 2024' },\n { value: 'yyyy', label: '2024' },\n { value: \"Q'Q' yyyy\", label: 'Q1 2024' },\n { value: 'EEE, MMM dd', label: 'Mon, Jan 15' },\n { value: 'yyyy-MM-dd HH:mm', label: '2024-01-15 14:30' },\n { value: 'MMM dd, HH:mm', label: 'Jan 15, 14:30' },\n];\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Check if a column is a date/timestamp type.\n */\nfunction isDateType(dataType: string): boolean {\n const type = dataType.toLowerCase();\n return type.includes('date') || type.includes('time') || type.includes('timestamp');\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Date formatting configuration section.\n */\nexport function DateFormattingSection({\n config,\n onChange,\n query,\n schema,\n defaultOpen = false,\n}: DateFormattingSectionProps): JSX.Element | null {\n const { theme } = useTheme();\n\n // Find date columns in the current query\n const dateColumns = useMemo(() => {\n if (!query || !schema) return [];\n\n const result: { name: string; alias: string }[] = [];\n\n for (const col of query.columns) {\n const table = query.tables.find((t) => t.id === col.table_id);\n if (!table) continue;\n\n const tableSchema = schema.tables.find((t) => t.name === table.name);\n if (!tableSchema) continue;\n\n const columnSchema = tableSchema.columns.find((c: ColumnSchema) => c.name === col.column);\n if (!columnSchema) continue;\n\n if (isDateType(columnSchema.data_type)) {\n const displayName = col.alias || col.column;\n result.push({ name: col.column, alias: displayName });\n }\n }\n\n return result;\n }, [query, schema]);\n\n // Handle format change for a column\n const handleFormatChange = useCallback(\n (columnName: string, format: string) => {\n const currentFormats = config.dateFormats || {};\n const newFormats = { ...currentFormats };\n\n if (format) {\n newFormats[columnName] = format;\n } else {\n delete newFormats[columnName];\n }\n\n // If no formats left, set to undefined\n const hasFormats = Object.keys(newFormats).length > 0;\n onChange('dateFormats', hasFormats ? newFormats : undefined);\n },\n [config.dateFormats, onChange]\n );\n\n // Don't render if no date columns\n if (dateColumns.length === 0) {\n return null;\n }\n\n const fieldStyle: CSSProperties = {\n marginBottom: theme.spacing.md,\n };\n\n const labelStyle: CSSProperties = {\n display: 'block',\n fontSize: theme.fontSizes.sm,\n color: theme.colors.text,\n marginBottom: theme.spacing.xs,\n };\n\n const columnNameStyle: CSSProperties = {\n fontFamily: theme.fonts.mono,\n fontSize: theme.fontSizes.sm,\n color: theme.colors.textMuted,\n };\n\n return (\n <CollapsibleSection title=\"Date Formatting\" defaultOpen={defaultOpen}>\n {dateColumns.map((col) => (\n <div key={col.name} style={fieldStyle}>\n <label style={labelStyle}>\n <span style={columnNameStyle}>{col.alias}</span>\n </label>\n <Select\n value={config.dateFormats?.[col.name] || ''}\n onChange={(value) => handleFormatChange(col.name, value)}\n options={DATE_FORMAT_PRESETS}\n />\n </div>\n ))}\n </CollapsibleSection>\n );\n}\n","/**\n * TrendConfigSection component for configuring metric trend comparisons.\n *\n * Allows setting:\n * - Show trend indicator toggle\n * - Comparison period (previous period, year, month, week)\n * - Date column to use for comparison\n */\n\nimport { useMemo, type ChangeEvent } from 'react';\nimport { useTheme } from '../../../theme';\nimport { Select } from '../../../components/ui/Select';\nimport { Checkbox } from '../../../components/ui/Checkbox';\nimport { CollapsibleSection } from '../../../components/ui/CollapsibleSection';\nimport type { WidgetConfig } from '../../types';\nimport type { QueryDefinition, DatabaseSchema } from '../../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TrendConfigSectionProps {\n /** Current config. */\n config: WidgetConfig;\n /** Callback when config changes. */\n onChange: <K extends keyof WidgetConfig>(key: K, value: WidgetConfig[K]) => void;\n /** Current query for detecting date columns. */\n query: QueryDefinition | null;\n /** Database schema for column type info. */\n schema: DatabaseSchema | null;\n /** Whether the section starts open. */\n defaultOpen?: boolean;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst TREND_PERIOD_OPTIONS = [\n { value: 'previous_period', label: 'Previous Period' },\n { value: 'previous_year', label: 'Previous Year' },\n { value: 'previous_month', label: 'Previous Month' },\n { value: 'previous_week', label: 'Previous Week' },\n];\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Check if a column is a date/timestamp type.\n */\nfunction isDateType(dataType: string): boolean {\n const type = dataType.toLowerCase();\n return type.includes('date') || type.includes('time') || type.includes('timestamp');\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Trend comparison configuration section.\n */\nexport function TrendConfigSection({\n config,\n onChange,\n query,\n schema,\n defaultOpen = false,\n}: TrendConfigSectionProps): JSX.Element {\n const { theme } = useTheme();\n\n // Find date columns in the current query's tables\n const dateColumnOptions = useMemo(() => {\n if (!query || !schema) return [];\n\n const options: { value: string; label: string }[] = [];\n\n for (const table of query.tables) {\n const tableSchema = schema.tables.find((t) => t.name === table.name);\n if (!tableSchema) continue;\n\n for (const col of tableSchema.columns) {\n if (isDateType(col.data_type)) {\n options.push({\n value: `${table.id}.${col.name}`,\n label: `${table.alias ?? table.name}.${col.name}`,\n });\n }\n }\n }\n\n return options;\n }, [query, schema]);\n\n const fieldStyle: React.CSSProperties = {\n marginBottom: theme.spacing.md,\n };\n\n const labelStyle: React.CSSProperties = {\n display: 'block',\n fontSize: theme.fontSizes.sm,\n color: theme.colors.text,\n marginBottom: theme.spacing.xs,\n };\n\n const helpTextStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n marginTop: theme.spacing.xs,\n };\n\n return (\n <CollapsibleSection title=\"Trend Comparison\" defaultOpen={defaultOpen}>\n <div style={fieldStyle}>\n <Checkbox\n label=\"Show Trend Indicator\"\n checked={config.showTrend ?? false}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n onChange('showTrend', e.target.checked)\n }\n />\n <div style={helpTextStyle}>\n Compare current value to a previous time period\n </div>\n </div>\n\n {config.showTrend && (\n <>\n <div style={fieldStyle}>\n <label style={labelStyle}>Comparison Period</label>\n <Select\n value={config.trendPeriod || 'previous_period'}\n onChange={(value) =>\n onChange('trendPeriod', value as WidgetConfig['trendPeriod'])\n }\n options={TREND_PERIOD_OPTIONS}\n />\n </div>\n\n {dateColumnOptions.length > 0 && (\n <div style={fieldStyle}>\n <label style={labelStyle}>Date Column</label>\n <Select\n value={config.trendDateColumn || ''}\n onChange={(value) => onChange('trendDateColumn', value || undefined)}\n options={[\n { value: '', label: 'Auto-detect' },\n ...dateColumnOptions,\n ]}\n />\n <div style={helpTextStyle}>\n Column used to determine time periods\n </div>\n </div>\n )}\n </>\n )}\n </CollapsibleSection>\n );\n}\n","/**\n * Full-page widget editor for creating and editing widgets.\n *\n * Replaces the modal-based widget editor with a comprehensive full-page layout\n * that provides:\n * - Widget type selection (changeable after creation)\n * - Configuration options based on widget type\n * - Data source: saved query or inline query builder\n * - Live preview with actual data\n */\n\nimport { useState, useCallback, useEffect, useMemo, type ChangeEvent } from 'react';\nimport { useTheme } from '../../theme';\nimport { useAnalytics } from '../../context';\nimport { Button } from '../../components/ui/Button';\nimport { Input } from '../../components/ui/Input';\nimport { Select } from '../../components/ui/Select';\nimport { Checkbox } from '../../components/ui/Checkbox';\nimport { Icon } from '../../components/ui/Icon';\nimport { SavedQueryPicker } from '../../components/SavedQueryPicker';\nimport { QueryBuilder } from '../../components/QueryBuilder';\nimport { WidgetTypeSelector } from './WidgetTypeSelector';\nimport { WidgetPreview } from './WidgetPreview';\nimport { GuidedDataConfig } from './GuidedDataConfig';\nimport { ValueFormattingSection } from './configs/ValueFormattingSection';\nimport { DisplayConfigSection } from './configs/DisplayConfigSection';\nimport { DateFormattingSection } from './configs/DateFormattingSection';\nimport { TrendConfigSection } from './configs/TrendConfigSection';\nimport { HyperlinkSection } from './configs/HyperlinkSection';\nimport { ReferenceLinesSection } from './configs/ReferenceLinesSection';\nimport { TextFormattingSection } from './configs/TextFormattingSection';\nimport { PivotConfigSection } from './configs/PivotConfigSection';\nimport { LayoutConstraintsSection } from './configs/LayoutConstraintsSection';\nimport { CrossFilterSection } from './configs/CrossFilterSection';\nimport type { Widget, WidgetConfig, WidgetType, WidgetHyperlink, WidgetPosition } from '../types';\nimport type {\n DatabaseSchema,\n QueryDefinition,\n QueryResult,\n SavedQuery,\n TableSchema,\n ColumnSchema,\n} from '../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface WidgetEditorPageProps {\n /** Widget being edited, or null for new widget. */\n widget: Widget | null;\n /** Database schema for query building. */\n schema: DatabaseSchema | null;\n /** Callback when save is clicked. */\n onSave: (widget: Widget) => void;\n /** Callback when cancel is clicked. */\n onCancel: () => void;\n}\n\ntype DataSourceMode = 'guided' | 'advanced' | 'saved';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Get default config for a widget type.\n */\nfunction getDefaultConfig(type: WidgetType): WidgetConfig {\n switch (type) {\n case 'metric':\n return { format: 'number' };\n case 'bar_chart':\n return { orientation: 'vertical', show_legend: true };\n case 'line_chart':\n case 'area_chart':\n return { show_legend: true, show_data_labels: false };\n case 'pie_chart':\n return { show_legend: true, show_data_labels: true };\n case 'scatter_chart':\n return { show_legend: true };\n case 'table':\n return { page_size: 10, sortable: true };\n case 'text':\n return { content: '', markdown: true };\n default:\n return {};\n }\n}\n\n/**\n * Generate a unique ID (UUID v4).\n */\nfunction generateId(): string {\n return crypto.randomUUID();\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Full-page widget editor.\n *\n * @example\n * ```tsx\n * <WidgetEditorPage\n * widget={existingWidget}\n * schema={schema}\n * onSave={(widget) => updateDashboard(widget)}\n * onCancel={() => setEditingWidget(null)}\n * />\n * ```\n */\nexport function WidgetEditorPage({\n widget,\n schema,\n onSave,\n onCancel,\n}: WidgetEditorPageProps): JSX.Element {\n const { theme } = useTheme();\n const { client } = useAnalytics();\n\n // Determine if this is a new widget\n const isNew = widget === null;\n\n // Widget state\n const [type, setType] = useState<WidgetType>(widget?.type ?? 'bar_chart');\n const [title, setTitle] = useState(widget?.title ?? 'New Widget');\n const [config, setConfig] = useState<WidgetConfig>(\n widget?.config ?? getDefaultConfig(widget?.type ?? 'bar_chart')\n );\n const [query, setQuery] = useState<QueryDefinition | null>(widget?.query ?? null);\n const [hyperlink, setHyperlink] = useState<WidgetHyperlink | undefined>(widget?.hyperlink);\n const [position, setPosition] = useState<WidgetPosition>(\n widget?.position ?? { x: 0, y: 0, w: 6, h: 4, minW: 2, minH: 2 }\n );\n\n // Data source mode - restore saved mode for existing widgets, default to 'guided' for new ones\n const [dataSourceMode, setDataSourceMode] = useState<DataSourceMode>(\n isNew ? 'guided' : (widget?.dataSourceMode ?? 'guided')\n );\n\n // Preview state\n const [previewResult, setPreviewResult] = useState<QueryResult | null>(null);\n const [previewLoading, setPreviewLoading] = useState(false);\n const [previewError, setPreviewError] = useState<Error | null>(null);\n\n // Update config when type changes (preserve shared settings)\n const handleTypeChange = useCallback(\n (newType: WidgetType) => {\n setType(newType);\n // Merge new default config with existing (preserve x_axis, y_axis, etc.)\n setConfig((prev) => ({\n ...getDefaultConfig(newType),\n x_axis: prev.x_axis,\n y_axis: prev.y_axis,\n }));\n },\n []\n );\n\n // Update config field\n const updateConfig = useCallback(\n <K extends keyof WidgetConfig>(key: K, value: WidgetConfig[K]) => {\n setConfig((prev) => ({ ...prev, [key]: value }));\n },\n []\n );\n\n // Execute query for preview\n const refreshPreview = useCallback(async () => {\n if (!query || !client) {\n setPreviewResult(null);\n return;\n }\n\n setPreviewLoading(true);\n setPreviewError(null);\n\n try {\n const result = await client.executeQuery({ ...query, limit: 100 });\n setPreviewResult(result);\n } catch (err) {\n setPreviewError(err instanceof Error ? err : new Error('Query failed'));\n setPreviewResult(null);\n } finally {\n setPreviewLoading(false);\n }\n }, [query, client]);\n\n // Refresh preview when query changes\n useEffect(() => {\n if (query) {\n void refreshPreview();\n } else {\n setPreviewResult(null);\n setPreviewError(null);\n }\n }, [query, refreshPreview]);\n\n // Handle saved query selection\n const handleSavedQuerySelect = useCallback((savedQuery: SavedQuery) => {\n setQuery(savedQuery.query);\n }, []);\n\n // Handle query builder change\n const handleQueryChange = useCallback((newQuery: QueryDefinition) => {\n setQuery(newQuery);\n }, []);\n\n // Handle clear query\n const handleClearQuery = useCallback(() => {\n setQuery(null);\n setPreviewResult(null);\n setPreviewError(null);\n }, []);\n\n // Handle save\n const handleSave = useCallback(() => {\n const savedWidget: Widget = {\n id: widget?.id ?? generateId(),\n type,\n title,\n config,\n query,\n position,\n hyperlink,\n dataSourceMode,\n };\n onSave(savedWidget);\n }, [widget, type, title, config, query, position, hyperlink, dataSourceMode, onSave]);\n\n // Column select options for config\n const columnSelectOptions = useMemo(() => {\n if (!schema) return [];\n return schema.tables.flatMap((table: TableSchema) =>\n table.columns.map((col: ColumnSchema) => ({\n value: `${table.name}.${col.name}`,\n label: `${table.name}.${col.name}`,\n }))\n );\n }, [schema]);\n\n // Styles\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: theme.colors.background,\n fontFamily: theme.fonts.sans,\n };\n\n const headerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: `${theme.spacing.md} ${theme.spacing.lg}`,\n borderBottom: `1px solid ${theme.colors.border}`,\n backgroundColor: theme.colors.surface,\n };\n\n const headerLeftStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.md,\n };\n\n const backButtonStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.xs,\n padding: theme.spacing.sm,\n backgroundColor: 'transparent',\n border: 'none',\n borderRadius: theme.radius.sm,\n cursor: 'pointer',\n color: theme.colors.text,\n fontSize: theme.fontSizes.sm,\n };\n\n const headerTitleStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.lg,\n fontWeight: 600,\n color: theme.colors.text,\n };\n\n const headerActionsStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.sm,\n };\n\n const bodyStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n minHeight: 0,\n };\n\n const leftPanelStyle: React.CSSProperties = {\n width: '320px',\n flexShrink: 0,\n borderRight: `1px solid ${theme.colors.border}`,\n overflow: 'auto',\n padding: theme.spacing.md,\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing.lg,\n };\n\n const mainPanelStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n };\n\n const previewPanelStyle: React.CSSProperties = {\n height: '300px',\n flexShrink: 0,\n padding: theme.spacing.md,\n borderBottom: `1px solid ${theme.colors.border}`,\n };\n\n const dataSourcePanelStyle: React.CSSProperties = {\n flex: '1 1 auto',\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n overflow: 'hidden',\n };\n\n const dataSourceHeaderStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing.sm,\n padding: theme.spacing.md,\n borderBottom: `1px solid ${theme.colors.border}`,\n };\n\n const tabStyle = (isActive: boolean): React.CSSProperties => ({\n padding: `${theme.spacing.sm} ${theme.spacing.md}`,\n backgroundColor: isActive ? theme.colors.primary : 'transparent',\n color: isActive ? '#fff' : theme.colors.text,\n border: `1px solid ${isActive ? theme.colors.primary : theme.colors.border}`,\n borderRadius: theme.radius.sm,\n cursor: 'pointer',\n fontSize: theme.fontSizes.sm,\n fontWeight: 500,\n transition: 'all 0.15s ease',\n });\n\n const dataSourceContentStyle: React.CSSProperties = {\n flex: '1 1 auto',\n overflow: 'auto',\n padding: theme.spacing.md,\n paddingBottom: '100px', // Extra space to ensure filter buttons are visible\n minHeight: '250px',\n };\n\n const sectionStyle: React.CSSProperties = {\n marginBottom: theme.spacing.md,\n };\n\n const sectionTitleStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n fontWeight: 600,\n color: theme.colors.textMuted,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n marginBottom: theme.spacing.sm,\n };\n\n const fieldStyle: React.CSSProperties = {\n marginBottom: theme.spacing.md,\n };\n\n const labelStyle: React.CSSProperties = {\n display: 'block',\n fontSize: theme.fontSizes.sm,\n color: theme.colors.text,\n marginBottom: theme.spacing.xs,\n };\n\n // Render config fields based on widget type\n const renderConfigFields = () => {\n switch (type) {\n case 'metric':\n return (\n <>\n <ValueFormattingSection\n config={config}\n onChange={updateConfig}\n showCurrency={true}\n showCompact={true}\n defaultOpen={true}\n />\n <TrendConfigSection\n config={config}\n onChange={updateConfig}\n query={query}\n schema={schema}\n defaultOpen={false}\n />\n </>\n );\n\n case 'bar_chart':\n return (\n <>\n <div style={fieldStyle}>\n <label style={labelStyle}>X-Axis Column</label>\n <Select\n value={config.x_axis || ''}\n onChange={(value) => updateConfig('x_axis', value || undefined)}\n options={[{ value: '', label: 'Auto-detect' }, ...columnSelectOptions]}\n />\n </div>\n <DisplayConfigSection\n widgetType={type}\n config={config}\n onChange={updateConfig}\n defaultOpen={true}\n />\n <ValueFormattingSection\n config={config}\n onChange={updateConfig}\n showCurrency={true}\n showCompact={true}\n defaultOpen={false}\n />\n <ReferenceLinesSection\n lines={config.referenceLines ?? []}\n onChange={(lines) => updateConfig('referenceLines', lines.length > 0 ? lines : undefined)}\n defaultOpen={false}\n />\n <CrossFilterSection\n config={config}\n onChange={updateConfig}\n query={query}\n defaultOpen={false}\n />\n <DateFormattingSection\n config={config}\n onChange={updateConfig}\n query={query}\n schema={schema}\n defaultOpen={false}\n />\n </>\n );\n\n case 'line_chart':\n case 'area_chart':\n return (\n <>\n <div style={fieldStyle}>\n <label style={labelStyle}>X-Axis Column</label>\n <Select\n value={config.x_axis || ''}\n onChange={(value) => updateConfig('x_axis', value || undefined)}\n options={[{ value: '', label: 'Auto-detect' }, ...columnSelectOptions]}\n />\n </div>\n <DisplayConfigSection\n widgetType={type}\n config={config}\n onChange={updateConfig}\n defaultOpen={true}\n />\n <ValueFormattingSection\n config={config}\n onChange={updateConfig}\n showCurrency={true}\n showCompact={true}\n defaultOpen={false}\n />\n <ReferenceLinesSection\n lines={config.referenceLines ?? []}\n onChange={(lines) => updateConfig('referenceLines', lines.length > 0 ? lines : undefined)}\n defaultOpen={false}\n />\n <CrossFilterSection\n config={config}\n onChange={updateConfig}\n query={query}\n defaultOpen={false}\n />\n <DateFormattingSection\n config={config}\n onChange={updateConfig}\n query={query}\n schema={schema}\n defaultOpen={false}\n />\n </>\n );\n\n case 'pie_chart':\n return (\n <>\n <DisplayConfigSection\n widgetType={type}\n config={config}\n onChange={updateConfig}\n defaultOpen={true}\n />\n <CrossFilterSection\n config={config}\n onChange={updateConfig}\n query={query}\n defaultOpen={false}\n />\n </>\n );\n\n case 'scatter_chart':\n return (\n <>\n <div style={fieldStyle}>\n <label style={labelStyle}>X-Axis Column</label>\n <Select\n value={config.x_axis || ''}\n onChange={(value) => updateConfig('x_axis', value || undefined)}\n options={[{ value: '', label: 'Auto-detect' }, ...columnSelectOptions]}\n />\n </div>\n <div style={fieldStyle}>\n <label style={labelStyle}>Y-Axis Column</label>\n <Select\n value={config.y_axis?.[0] || ''}\n onChange={(value) => updateConfig('y_axis', value ? [value] : undefined)}\n options={[{ value: '', label: 'Auto-detect' }, ...columnSelectOptions]}\n />\n </div>\n <DisplayConfigSection\n widgetType={type}\n config={config}\n onChange={updateConfig}\n defaultOpen={true}\n />\n <ValueFormattingSection\n config={config}\n onChange={updateConfig}\n showCurrency={true}\n showCompact={true}\n defaultOpen={false}\n />\n </>\n );\n\n case 'table':\n return (\n <>\n <div style={fieldStyle}>\n <label style={labelStyle}>Page Size</label>\n <Select\n value={String(config.page_size || 10)}\n onChange={(value) => updateConfig('page_size', parseInt(value, 10))}\n options={[\n { value: '5', label: '5 rows' },\n { value: '10', label: '10 rows' },\n { value: '25', label: '25 rows' },\n { value: '50', label: '50 rows' },\n ]}\n />\n </div>\n <Checkbox\n label=\"Sortable Columns\"\n checked={config.sortable ?? true}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n updateConfig('sortable', e.target.checked)\n }\n />\n <PivotConfigSection\n config={config}\n onChange={updateConfig}\n query={query}\n schema={schema}\n defaultOpen={false}\n />\n <DateFormattingSection\n config={config}\n onChange={updateConfig}\n query={query}\n schema={schema}\n defaultOpen={false}\n />\n </>\n );\n\n case 'text':\n return <TextFormattingSection config={config} onChange={updateConfig} />;\n\n default:\n return null;\n }\n };\n\n // Render current query summary\n const renderQuerySummary = () => {\n if (!query) return null;\n\n return (\n <div\n style={{\n padding: theme.spacing.md,\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.md,\n border: `1px solid ${theme.colors.border}`,\n marginBottom: theme.spacing.md,\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: theme.spacing.sm,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: theme.spacing.sm }}>\n <Icon name=\"table\" size={16} />\n <span style={{ fontWeight: 500, color: theme.colors.text }}>Query configured</span>\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleClearQuery}>\n <Icon name=\"x\" size={16} />\n </Button>\n </div>\n <div style={{ fontSize: theme.fontSizes.sm, color: theme.colors.textMuted }}>\n {query.tables?.length || 0} table(s), {query.columns?.length || 0} column(s)\n {query.filters && query.filters.length > 0 && `, ${query.filters.length} filter(s)`}\n </div>\n </div>\n );\n };\n\n return (\n <div style={containerStyle} className=\"prismiq-widget-editor-page\">\n {/* Header */}\n <div style={headerStyle}>\n <div style={headerLeftStyle}>\n <button type=\"button\" style={backButtonStyle} onClick={onCancel}>\n <Icon name=\"chevron-left\" size={16} />\n <span>Back</span>\n </button>\n <span style={headerTitleStyle}>{isNew ? 'Add Widget' : 'Edit Widget'}</span>\n </div>\n <div style={headerActionsStyle}>\n <Button variant=\"ghost\" onClick={onCancel}>\n Cancel\n </Button>\n <Button variant=\"primary\" onClick={handleSave}>\n {isNew ? 'Add Widget' : 'Save Changes'}\n </Button>\n </div>\n </div>\n\n {/* Body */}\n <div style={bodyStyle}>\n {/* Left Panel - Type & Config */}\n <div style={leftPanelStyle}>\n {/* Widget Type */}\n <div style={sectionStyle}>\n <WidgetTypeSelector value={type} onChange={handleTypeChange} />\n </div>\n\n {/* Basic Info */}\n <div style={sectionStyle}>\n <h3 style={sectionTitleStyle}>Basic Info</h3>\n <div style={fieldStyle}>\n <label style={labelStyle}>Title</label>\n <Input\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder=\"Widget title\"\n />\n </div>\n </div>\n\n {/* Configuration */}\n <div style={sectionStyle}>\n <h3 style={sectionTitleStyle}>Configuration</h3>\n {renderConfigFields()}\n </div>\n\n {/* Hyperlink */}\n <HyperlinkSection\n hyperlink={hyperlink}\n onChange={setHyperlink}\n defaultOpen={!!hyperlink}\n />\n\n {/* Layout Constraints */}\n <LayoutConstraintsSection\n position={position}\n onChange={setPosition}\n defaultOpen={false}\n />\n </div>\n\n {/* Main Panel - Preview & Data Source */}\n <div style={mainPanelStyle}>\n {/* Preview */}\n <div style={previewPanelStyle}>\n <WidgetPreview\n type={type}\n title={title}\n config={config}\n query={query}\n result={previewResult}\n isLoading={previewLoading}\n error={previewError}\n />\n </div>\n\n {/* Data Source */}\n {type !== 'text' && schema && (\n <div style={dataSourcePanelStyle}>\n <div style={dataSourceHeaderStyle}>\n <span style={{ fontSize: theme.fontSizes.sm, fontWeight: 500, marginRight: 'auto' }}>\n Data Source\n </span>\n <button\n type=\"button\"\n style={tabStyle(dataSourceMode === 'guided')}\n onClick={() => setDataSourceMode('guided')}\n >\n Guided\n </button>\n <button\n type=\"button\"\n style={tabStyle(dataSourceMode === 'advanced')}\n onClick={() => setDataSourceMode('advanced')}\n >\n Advanced\n </button>\n <button\n type=\"button\"\n style={tabStyle(dataSourceMode === 'saved')}\n onClick={() => setDataSourceMode('saved')}\n >\n Saved Query\n </button>\n </div>\n\n <div style={dataSourceContentStyle}>\n {dataSourceMode === 'saved' && renderQuerySummary()}\n\n {dataSourceMode === 'guided' && (\n <GuidedDataConfig\n widgetType={type}\n schema={schema}\n query={query}\n onChange={handleQueryChange}\n />\n )}\n\n {dataSourceMode === 'advanced' && (\n <QueryBuilder\n initialQuery={query ?? undefined}\n onQueryChange={handleQueryChange}\n showSqlPreview={true}\n showResultsTable={false}\n showSavedQueries={false}\n layout=\"horizontal\"\n />\n )}\n\n {dataSourceMode === 'saved' && (\n <SavedQueryPicker\n currentQuery={query}\n onSelect={handleSavedQuerySelect}\n showSave={false}\n />\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","/**\n * Dashboard editor component for creating and editing dashboards.\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { useTheme } from '../../theme';\nimport { useAnalytics } from '../../context';\nimport { useSchema } from '../../hooks';\nimport { DashboardLayout } from '../DashboardLayout';\nimport { Widget, WidgetContainer } from '../Widget';\nimport { EditorToolbar } from './EditorToolbar';\nimport { WidgetEditorPage } from './WidgetEditorPage';\nimport {\n dashboardCache,\n CACHE_TTL_MS,\n inflightFetches,\n} from '../dashboardCache';\nimport type {\n Dashboard,\n Widget as WidgetType,\n WidgetType as WidgetTypeEnum,\n WidgetPosition,\n DashboardEditorProps,\n} from '../types';\nimport type { QueryResult } from '../../types';\n\n/**\n * Generate a unique ID (UUID v4).\n */\nfunction generateId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Get default position for a new widget.\n */\nfunction getDefaultPosition(\n widgets: WidgetType[],\n widgetType: WidgetTypeEnum\n): WidgetPosition {\n // Find the next available Y position\n const maxY = widgets.reduce(\n (max, w) => Math.max(max, w.position.y + w.position.h),\n 0\n );\n\n // Default sizes based on widget type\n const sizes: Record<WidgetTypeEnum, { w: number; h: number }> = {\n metric: { w: 3, h: 2 },\n bar_chart: { w: 6, h: 4 },\n line_chart: { w: 6, h: 4 },\n area_chart: { w: 6, h: 4 },\n pie_chart: { w: 4, h: 4 },\n scatter_chart: { w: 6, h: 4 },\n table: { w: 12, h: 4 },\n text: { w: 4, h: 2 },\n };\n\n const size = sizes[widgetType] || { w: 4, h: 4 };\n\n return {\n x: 0,\n y: maxY,\n w: size.w,\n h: size.h,\n minW: 2,\n minH: 2,\n };\n}\n\n/**\n * Dashboard editor for creating and editing dashboards.\n *\n * @example\n * ```tsx\n * <DashboardEditor\n * dashboardId=\"my-dashboard\"\n * onSave={(dashboard) => console.log('Saved:', dashboard)}\n * onCancel={() => navigate('/dashboards')}\n * />\n * ```\n */\nconst DEFAULT_BATCH_SIZE = 4;\n\nexport function DashboardEditor({\n dashboardId,\n onSave,\n onCancel,\n batchSize = DEFAULT_BATCH_SIZE,\n className = '',\n}: DashboardEditorProps): JSX.Element {\n const { theme } = useTheme();\n const { client } = useAnalytics();\n const { schema } = useSchema();\n\n // Dashboard state\n const [currentDashboardId, setCurrentDashboardId] = useState<string | undefined>(dashboardId);\n\n // Keep currentDashboardId in sync when the prop changes\n useEffect(() => {\n setCurrentDashboardId(dashboardId);\n }, [dashboardId]);\n\n const [dashboard, setDashboard] = useState<Dashboard>({\n id: dashboardId || generateId(),\n name: 'New Dashboard',\n description: '',\n layout: {\n columns: 12,\n row_height: 60,\n margin: [16, 16],\n compact_type: 'vertical',\n },\n widgets: [],\n filters: [],\n is_public: false,\n });\n\n const [isLoading, setIsLoading] = useState(!!dashboardId);\n const [isSaving, setIsSaving] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Widget results (for preview)\n const [widgetResults, setWidgetResults] = useState<\n Record<string, QueryResult>\n >({});\n const [widgetLoading, setWidgetLoading] = useState<Record<string, boolean>>(\n {}\n );\n const [widgetErrors, setWidgetErrors] = useState<Record<string, Error>>({});\n const [widgetRefreshTimes, setWidgetRefreshTimes] = useState<Record<string, number>>({});\n const [refreshingWidgets, setRefreshingWidgets] = useState<Set<string>>(new Set());\n\n // UI state - editingWidget can be 'new' for new widget, a Widget for editing, or null\n const [editingWidget, setEditingWidget] = useState<WidgetType | 'new' | null>(null);\n\n // Track changes explicitly with a dirty flag (more reliable than JSON comparison)\n const [isDirty, setIsDirty] = useState(false);\n\n // Track if initial layout has been set (react-grid-layout fires onLayoutChange on mount)\n // Use a counter instead of boolean to ignore multiple initial layout events\n const initialLayoutCountRef = useRef(0);\n const INITIAL_LAYOUT_IGNORE_COUNT = 3; // Ignore first N layout changes after load\n\n // Store client in ref so effect doesn't re-run when client reference changes\n const clientRef = useRef(client);\n clientRef.current = client;\n\n // Track which dashboard has been loaded to prevent duplicate loads\n const loadedDashboardRef = useRef<string | null>(null);\n\n\n // Helper to execute widget queries - can be called from multiple paths\n // Note: We don't cancel widget query results - they're harmless to set even after unmount\n // and StrictMode would otherwise prevent results from ever being shown\n const executeWidgetQueries = useCallback(async (\n widgets: WidgetType[],\n currentClient: typeof client\n ) => {\n const widgetsWithQueries = widgets.filter((w) => w.query);\n if (widgetsWithQueries.length === 0) return;\n\n for (let i = 0; i < widgetsWithQueries.length; i += batchSize) {\n const batch = widgetsWithQueries.slice(i, i + batchSize);\n\n setWidgetLoading((prev) => {\n const next = { ...prev };\n batch.forEach((w) => { next[w.id] = true; });\n return next;\n });\n\n await Promise.all(\n batch.map(async (widget) => {\n try {\n const result = await currentClient.executeQuery(widget.query!);\n setWidgetResults((prev) => ({ ...prev, [widget.id]: result }));\n setWidgetRefreshTimes((prev) => ({ ...prev, [widget.id]: Math.floor(Date.now() / 1000) }));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Query failed';\n setWidgetErrors((prev) => ({\n ...prev,\n [widget.id]: new Error(`${widget.title}: ${errorMessage}`),\n }));\n } finally {\n setWidgetLoading((prev) => ({ ...prev, [widget.id]: false }));\n }\n })\n );\n }\n }, [batchSize]);\n\n // Load existing dashboard - only re-run when dashboardId changes\n useEffect(() => {\n const currentClient = clientRef.current;\n\n if (!dashboardId || !currentClient) {\n return;\n }\n\n // Skip if already loaded this dashboard (instance-level check)\n if (loadedDashboardRef.current === dashboardId) {\n return;\n }\n\n const now = Date.now();\n\n // Check module-level cache first (survives StrictMode remounts)\n const cached = dashboardCache.get(dashboardId);\n if (cached && now - cached.timestamp < CACHE_TTL_MS) {\n loadedDashboardRef.current = dashboardId;\n setDashboard(cached.data);\n setIsDirty(false);\n initialLayoutCountRef.current = 0;\n setIsLoading(false);\n // Execute widget queries with cached data (no cancellation - results should always be set)\n executeWidgetQueries(cached.data.widgets, currentClient);\n return;\n }\n\n // Check if there's already an in-flight fetch\n const inflightFetch = inflightFetches.get(dashboardId);\n if (inflightFetch) {\n loadedDashboardRef.current = dashboardId;\n setIsLoading(true);\n inflightFetch\n .then((data) => {\n setDashboard(data);\n setIsDirty(false);\n initialLayoutCountRef.current = 0;\n setIsLoading(false);\n executeWidgetQueries(data.widgets, currentClient);\n })\n .catch((err) => {\n console.error(`[DashboardEditor] In-flight fetch error:`, err);\n setError(err instanceof Error ? err : new Error('Failed to load dashboard'));\n setIsLoading(false);\n });\n return;\n }\n\n // Start a new fetch\n loadedDashboardRef.current = dashboardId;\n\n const fetchPromise = (async (): Promise<Dashboard> => {\n setIsLoading(true);\n setError(null);\n\n const data = await currentClient.get<Dashboard>(`/dashboards/${dashboardId}`);\n\n // Cache the data at module level (survives StrictMode remounts)\n dashboardCache.set(dashboardId, { data, timestamp: Date.now() });\n\n return data;\n })();\n\n // Track the in-flight fetch\n inflightFetches.set(dashboardId, fetchPromise);\n\n fetchPromise\n .then((data) => {\n inflightFetches.delete(dashboardId);\n setDashboard(data);\n setIsDirty(false);\n initialLayoutCountRef.current = 0;\n setIsLoading(false);\n executeWidgetQueries(data.widgets, currentClient);\n })\n .catch((err) => {\n inflightFetches.delete(dashboardId);\n setError(err instanceof Error ? err : new Error('Failed to load dashboard'));\n setIsLoading(false);\n });\n }, [dashboardId, batchSize, executeWidgetQueries]); // Removed client - using ref instead\n\n // Execute widget queries for preview\n // Accepts optional widget parameter to avoid stale closure issues when widget was just added\n const refreshWidget = useCallback(\n async (widgetId: string, widgetOverride?: WidgetType) => {\n const widget = widgetOverride ?? dashboard.widgets.find((w) => w.id === widgetId);\n if (!widget?.query || !client) return;\n\n setWidgetLoading((prev) => ({ ...prev, [widgetId]: true }));\n setRefreshingWidgets((prev) => new Set(prev).add(widgetId));\n\n try {\n // Pass bypassCache=true to force fresh data on manual refresh\n const result = await client.executeQuery(widget.query, true);\n setWidgetResults((prev) => ({ ...prev, [widgetId]: result }));\n setWidgetRefreshTimes((prev) => ({ ...prev, [widgetId]: Math.floor(Date.now() / 1000) }));\n setWidgetErrors((prev) => {\n const next = { ...prev };\n delete next[widgetId];\n return next;\n });\n } catch (err) {\n setWidgetErrors((prev) => ({\n ...prev,\n [widgetId]: err instanceof Error ? err : new Error('Query failed'),\n }));\n } finally {\n setWidgetLoading((prev) => ({ ...prev, [widgetId]: false }));\n setRefreshingWidgets((prev) => {\n const next = new Set(prev);\n next.delete(widgetId);\n return next;\n });\n }\n },\n [dashboard.widgets, client]\n );\n\n // Add new widget - opens the full-page editor\n const handleAddWidget = useCallback(() => {\n setEditingWidget('new');\n }, []);\n\n // Update widget\n const updateWidget = useCallback((widgetId: string, updates: Partial<WidgetType>) => {\n setDashboard((prev) => ({\n ...prev,\n widgets: prev.widgets.map((w) =>\n w.id === widgetId ? { ...w, ...updates } : w\n ),\n }));\n setIsDirty(true);\n }, []);\n\n // Handle layout changes\n const handleLayoutChange = useCallback(\n (positions: Record<string, WidgetPosition>) => {\n // Skip initial layout changes fired by react-grid-layout on mount/load\n // react-grid-layout can fire multiple onLayoutChange events during initial render\n if (initialLayoutCountRef.current < INITIAL_LAYOUT_IGNORE_COUNT) {\n initialLayoutCountRef.current++;\n return;\n }\n\n setDashboard((prev) => ({\n ...prev,\n widgets: prev.widgets.map((widget) => ({\n ...widget,\n position: positions[widget.id] || widget.position,\n })),\n }));\n setIsDirty(true);\n },\n []\n );\n\n // Save dashboard\n const handleSave = useCallback(async () => {\n if (!client) return;\n\n setIsSaving(true);\n setError(null);\n try {\n let savedDashboard: Dashboard;\n\n if (currentDashboardId) {\n // Update existing dashboard\n await client.patch(`/dashboards/${currentDashboardId}`, dashboard);\n // Reload to get canonical state — non-fatal if it fails\n try {\n savedDashboard = await client.get<Dashboard>(`/dashboards/${currentDashboardId}`);\n } catch (reloadErr) {\n console.warn('[DashboardEditor] Reload after save failed, using local state:', reloadErr);\n savedDashboard = dashboard;\n }\n // Refresh shared cache so other components see canonical state\n dashboardCache.set(currentDashboardId, {\n data: savedDashboard,\n timestamp: Date.now(),\n });\n inflightFetches.delete(currentDashboardId);\n } else {\n // Create new dashboard - use the response which contains the server-generated ID\n savedDashboard = await client.post<Dashboard>('/dashboards', dashboard);\n // Persist the canonical ID so subsequent saves use PUT/PATCH\n setCurrentDashboardId(savedDashboard.id);\n // Update the shared cache with the canonical response\n dashboardCache.set(savedDashboard.id, {\n data: savedDashboard,\n timestamp: Date.now(),\n });\n // Clear any inflight fetch entry for the new ID\n inflightFetches.delete(savedDashboard.id);\n }\n\n setDashboard(savedDashboard);\n initialLayoutCountRef.current = 0;\n setIsDirty(false);\n onSave?.(savedDashboard);\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to save dashboard'));\n } finally {\n setIsSaving(false);\n }\n }, [client, currentDashboardId, dashboard, onSave]);\n\n // Handle cancel\n const handleCancel = useCallback(() => {\n if (isDirty) {\n const confirmed = window.confirm(\n 'You have unsaved changes. Are you sure you want to cancel?'\n );\n if (!confirmed) return;\n }\n onCancel?.();\n }, [isDirty, onCancel]);\n\n // Handle widget save from editor (new or existing)\n const handleWidgetSave = useCallback((widget: WidgetType) => {\n // Check if this is a new widget or editing existing\n const existingWidget = dashboard.widgets.find((w) => w.id === widget.id);\n\n let savedWidget: WidgetType;\n if (existingWidget) {\n // Update existing widget\n updateWidget(widget.id, widget);\n savedWidget = widget;\n } else {\n // Add new widget with proper position\n const position = getDefaultPosition(dashboard.widgets, widget.type);\n savedWidget = { ...widget, position };\n setDashboard((prev) => ({\n ...prev,\n widgets: [...prev.widgets, savedWidget],\n }));\n }\n\n setIsDirty(true); // Mark as dirty when widget is added/edited\n setEditingWidget(null);\n\n // Refresh widget data if it has a query\n // Pass the widget directly to avoid stale closure issues\n if (savedWidget.query) {\n refreshWidget(savedWidget.id, savedWidget);\n }\n }, [dashboard.widgets, updateWidget, refreshWidget]);\n\n // Handle widget delete\n const handleDeleteWidget = useCallback((widgetId: string) => {\n const confirmed = window.confirm('Are you sure you want to delete this widget?');\n if (!confirmed) return;\n\n setDashboard((prev) => ({\n ...prev,\n widgets: prev.widgets.filter((w) => w.id !== widgetId),\n }));\n\n // Clean up per-widget caches\n setWidgetResults((prev) => { const next = { ...prev }; delete next[widgetId]; return next; });\n setWidgetLoading((prev) => { const next = { ...prev }; delete next[widgetId]; return next; });\n setWidgetErrors((prev) => { const next = { ...prev }; delete next[widgetId]; return next; });\n setWidgetRefreshTimes((prev) => { const next = { ...prev }; delete next[widgetId]; return next; });\n setRefreshingWidgets((prev) => {\n const next = new Set(prev);\n next.delete(widgetId);\n return next;\n });\n\n setIsDirty(true);\n }, []);\n\n // Handle widget duplicate\n const handleDuplicateWidget = useCallback((widgetId: string) => {\n let duplicatedWidget: WidgetType | null = null;\n\n setDashboard((prev) => {\n const widget = prev.widgets.find((w) => w.id === widgetId);\n if (!widget) {\n console.warn(`[DashboardEditor] Cannot duplicate widget: '${widgetId}' not found`);\n return prev;\n }\n\n const newWidget: WidgetType = {\n ...widget,\n id: generateId(),\n title: `${widget.title} (copy)`,\n position: getDefaultPosition(prev.widgets, widget.type),\n };\n duplicatedWidget = newWidget;\n\n return { ...prev, widgets: [...prev.widgets, newWidget] };\n });\n\n if (duplicatedWidget) {\n setIsDirty(true);\n // Execute query for duplicated widget if it has one\n // Pass the widget directly to avoid stale closure issues\n if ((duplicatedWidget as WidgetType).query) {\n refreshWidget((duplicatedWidget as WidgetType).id, duplicatedWidget as WidgetType);\n }\n }\n }, [refreshWidget]);\n\n // Render widget for layout\n const renderWidget = useCallback(\n (widget: WidgetType) => (\n <WidgetContainer\n widget={widget}\n dashboardId={dashboard.id}\n editable={true}\n onEdit={(w) => setEditingWidget(w)}\n onDelete={handleDeleteWidget}\n onDuplicate={handleDuplicateWidget}\n >\n <Widget\n widget={widget}\n result={widgetResults[widget.id] ?? null}\n isLoading={widgetLoading[widget.id] ?? false}\n error={widgetErrors[widget.id]}\n lastRefreshed={widgetRefreshTimes[widget.id]}\n isRefreshing={refreshingWidgets.has(widget.id)}\n onRefresh={() => refreshWidget(widget.id)}\n />\n </WidgetContainer>\n ),\n [dashboard.id, widgetResults, widgetLoading, widgetErrors, widgetRefreshTimes, refreshingWidgets, refreshWidget, handleDeleteWidget, handleDuplicateWidget]\n );\n\n // Styles\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: theme.colors.background,\n fontFamily: theme.fonts.sans,\n };\n\n const contentStyle: React.CSSProperties = {\n flex: 1,\n overflow: 'auto',\n position: 'relative',\n width: '100%',\n };\n\n const loadingStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n color: theme.colors.textMuted,\n };\n\n const errorStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n gap: theme.spacing.md,\n color: theme.colors.error || '#ef4444',\n };\n\n const errorBannerStyle: React.CSSProperties = {\n padding: `${theme.spacing.sm} ${theme.spacing.md}`,\n backgroundColor: theme.colors.error ? `${theme.colors.error}20` : '#fef2f2',\n borderBottom: `1px solid ${theme.colors.error || '#ef4444'}`,\n color: theme.colors.error || '#ef4444',\n fontSize: theme.fontSizes.sm,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n };\n\n const emptyStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n padding: theme.spacing.xl,\n textAlign: 'center',\n };\n\n if (isLoading) {\n return (\n <div className={`prismiq-dashboard-editor ${className}`} style={containerStyle}>\n <div style={loadingStyle}>Loading dashboard...</div>\n </div>\n );\n }\n\n // Show error state for load failures\n if (error && !dashboard.widgets.length) {\n return (\n <div className={`prismiq-dashboard-editor ${className}`} style={containerStyle}>\n <div style={errorStyle}>\n <div style={{ fontSize: theme.fontSizes.lg, fontWeight: 500 }}>\n Failed to load dashboard\n </div>\n <div style={{ color: theme.colors.textMuted }}>\n {error.message}\n </div>\n <button\n onClick={() => {\n setError(null);\n setIsLoading(true);\n // Trigger reload by toggling a dependency\n window.location.reload();\n }}\n style={{\n padding: `${theme.spacing.sm} ${theme.spacing.md}`,\n backgroundColor: theme.colors.primary,\n color: '#fff',\n border: 'none',\n borderRadius: theme.radius.md,\n cursor: 'pointer',\n }}\n >\n Retry\n </button>\n </div>\n </div>\n );\n }\n\n // If editing a widget, show the full-page editor instead\n if (editingWidget !== null) {\n return (\n <WidgetEditorPage\n widget={editingWidget === 'new' ? null : editingWidget}\n schema={schema}\n onSave={handleWidgetSave}\n onCancel={() => setEditingWidget(null)}\n />\n );\n }\n\n return (\n <div className={`prismiq-dashboard-editor ${className}`} style={containerStyle}>\n <EditorToolbar\n dashboardName={dashboard.name}\n onNameChange={(name) => {\n setDashboard((prev) => ({ ...prev, name }));\n setIsDirty(true);\n }}\n hasChanges={isDirty}\n isSaving={isSaving}\n onAddWidget={handleAddWidget}\n onSave={handleSave}\n onCancel={handleCancel}\n />\n\n {error && (\n <div style={errorBannerStyle}>\n <span>{error.message}</span>\n <button\n onClick={() => setError(null)}\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: theme.spacing.xs,\n color: 'inherit',\n }}\n >\n ✕\n </button>\n </div>\n )}\n\n <div style={contentStyle}>\n {dashboard.widgets.length === 0 ? (\n <div style={emptyStyle}>\n <div\n style={{\n fontSize: '48px',\n marginBottom: theme.spacing.md,\n opacity: 0.5,\n }}\n >\n +\n </div>\n <div\n style={{\n fontSize: theme.fontSizes.lg,\n color: theme.colors.text,\n marginBottom: theme.spacing.sm,\n }}\n >\n No widgets yet\n </div>\n <div\n style={{\n fontSize: theme.fontSizes.sm,\n color: theme.colors.textMuted,\n marginBottom: theme.spacing.lg,\n }}\n >\n Click "Add Widget" to get started\n </div>\n </div>\n ) : (\n <DashboardLayout\n widgets={dashboard.widgets}\n layout={dashboard.layout}\n editable={true}\n onLayoutChange={handleLayoutChange}\n renderWidget={renderWidget}\n />\n )}\n </div>\n </div>\n );\n}\n","/**\n * Widget palette for adding new widgets to the dashboard.\n */\n\nimport { useTheme } from '../../theme';\nimport { Icon } from '../../components/ui/Icon';\nimport type { IconName } from '../../components/ui/Icon';\nimport type { WidgetType, WidgetPaletteProps } from '../types';\n\n/**\n * Widget type configuration.\n */\ninterface WidgetTypeInfo {\n type: WidgetType;\n label: string;\n description: string;\n icon: IconName;\n}\n\n/**\n * Available widget types.\n */\nconst WIDGET_TYPES: WidgetTypeInfo[] = [\n {\n type: 'metric',\n label: 'Metric Card',\n description: 'Display a single value with optional trend',\n icon: 'info',\n },\n {\n type: 'bar_chart',\n label: 'Bar Chart',\n description: 'Compare values across categories',\n icon: 'chart-bar',\n },\n {\n type: 'line_chart',\n label: 'Line Chart',\n description: 'Show trends over time',\n icon: 'chart-line',\n },\n {\n type: 'area_chart',\n label: 'Area Chart',\n description: 'Show cumulative trends',\n icon: 'chart-line',\n },\n {\n type: 'pie_chart',\n label: 'Pie Chart',\n description: 'Show proportions of a whole',\n icon: 'chart-pie',\n },\n {\n type: 'scatter_chart',\n label: 'Scatter Chart',\n description: 'Show correlation between two values',\n icon: 'grid',\n },\n {\n type: 'table',\n label: 'Data Table',\n description: 'Display tabular data',\n icon: 'table',\n },\n {\n type: 'text',\n label: 'Text',\n description: 'Add text or markdown content',\n icon: 'edit',\n },\n];\n\n/**\n * Widget palette for selecting widget types to add.\n */\nexport function WidgetPalette({\n onAddWidget,\n}: WidgetPaletteProps): JSX.Element {\n const { theme } = useTheme();\n\n const containerStyle: React.CSSProperties = {\n padding: theme.spacing.md,\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.md,\n boxShadow: theme.shadows.lg,\n maxWidth: '400px',\n };\n\n const titleStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.lg,\n fontWeight: 600,\n color: theme.colors.text,\n marginBottom: theme.spacing.md,\n };\n\n const gridStyle: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: theme.spacing.sm,\n };\n\n const itemStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n padding: theme.spacing.md,\n backgroundColor: theme.colors.background,\n borderRadius: theme.radius.md,\n border: `1px solid ${theme.colors.border}`,\n cursor: 'pointer',\n transition: 'all 0.2s ease',\n };\n\n const itemHoverStyle: React.CSSProperties = {\n borderColor: theme.colors.primary,\n backgroundColor: `${theme.colors.primary}10`,\n };\n\n const iconContainerStyle: React.CSSProperties = {\n width: '40px',\n height: '40px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: `${theme.colors.primary}20`,\n borderRadius: theme.radius.md,\n marginBottom: theme.spacing.sm,\n color: theme.colors.primary,\n };\n\n const labelStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n fontWeight: 500,\n color: theme.colors.text,\n textAlign: 'center',\n };\n\n const descriptionStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.xs,\n color: theme.colors.textMuted,\n textAlign: 'center',\n marginTop: theme.spacing.xs,\n };\n\n return (\n <div style={containerStyle} className=\"prismiq-widget-palette\">\n <h3 style={titleStyle}>Add Widget</h3>\n\n <div style={gridStyle}>\n {WIDGET_TYPES.map((widgetType) => (\n <button\n key={widgetType.type}\n type=\"button\"\n style={itemStyle}\n onClick={() => onAddWidget(widgetType.type)}\n onMouseEnter={(e) => {\n Object.assign(e.currentTarget.style, itemHoverStyle);\n }}\n onMouseLeave={(e) => {\n Object.assign(e.currentTarget.style, itemStyle);\n }}\n >\n <div style={iconContainerStyle}>\n <Icon name={widgetType.icon} size={24} />\n </div>\n <span style={labelStyle}>{widgetType.label}</span>\n <span style={descriptionStyle}>{widgetType.description}</span>\n </button>\n ))}\n </div>\n </div>\n );\n}\n","/**\n * Widget editor modal for configuring widget properties.\n */\n\nimport { useState, useCallback, type ChangeEvent } from 'react';\nimport { useTheme } from '../../theme';\nimport { Button } from '../../components/ui/Button';\nimport { Input } from '../../components/ui/Input';\nimport { Select } from '../../components/ui/Select';\nimport { Checkbox } from '../../components/ui/Checkbox';\nimport { Icon } from '../../components/ui/Icon';\nimport { SavedQueryPicker } from '../../components/SavedQueryPicker';\nimport type { Widget, WidgetConfig, WidgetEditorProps } from '../types';\nimport type { QueryDefinition, TableSchema, ColumnSchema, SavedQuery } from '../../types';\n\n/**\n * Default widget configurations by type.\n */\nfunction getDefaultConfig(type: Widget['type']): WidgetConfig {\n switch (type) {\n case 'metric':\n return { format: 'number' };\n case 'bar_chart':\n return { orientation: 'vertical', show_legend: true };\n case 'line_chart':\n case 'area_chart':\n return { show_legend: true, show_data_labels: false };\n case 'pie_chart':\n return { show_legend: true, show_data_labels: true };\n case 'scatter_chart':\n return { show_legend: true };\n case 'table':\n return { page_size: 10, sortable: true };\n case 'text':\n return { content: '', markdown: true };\n default:\n return {};\n }\n}\n\n/**\n * Widget editor for configuring widget properties.\n */\nexport function WidgetEditor({\n widget,\n schema,\n onSave,\n onCancel,\n}: WidgetEditorProps): JSX.Element {\n const { theme } = useTheme();\n\n // Local state for editing\n const [title, setTitle] = useState(widget.title);\n const [config, setConfig] = useState<WidgetConfig>(\n widget.config || getDefaultConfig(widget.type)\n );\n const [query, setQuery] = useState<QueryDefinition | null>(widget.query);\n const [queryName, setQueryName] = useState<string | null>(null);\n\n // Update config field\n const updateConfig = useCallback(\n <K extends keyof WidgetConfig>(key: K, value: WidgetConfig[K]) => {\n setConfig((prev) => ({ ...prev, [key]: value }));\n },\n []\n );\n\n // Handle saved query selection\n const handleSelectSavedQuery = useCallback((savedQuery: SavedQuery) => {\n setQuery(savedQuery.query);\n setQueryName(savedQuery.name);\n }, []);\n\n // Handle clear query\n const handleClearQuery = useCallback(() => {\n setQuery(null);\n setQueryName(null);\n }, []);\n\n // Handle save\n const handleSave = useCallback(() => {\n const updatedWidget: Widget = {\n ...widget,\n title,\n config,\n query,\n };\n onSave(updatedWidget);\n }, [widget, title, config, query, onSave]);\n\n // Styles\n const overlayStyle: React.CSSProperties = {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 1000,\n };\n\n const modalStyle: React.CSSProperties = {\n backgroundColor: theme.colors.surface,\n borderRadius: theme.radius.lg,\n boxShadow: theme.shadows.lg,\n maxWidth: '600px',\n width: '90%',\n maxHeight: '80vh',\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n };\n\n const headerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: theme.spacing.md,\n borderBottom: `1px solid ${theme.colors.border}`,\n };\n\n const titleStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.lg,\n fontWeight: 600,\n color: theme.colors.text,\n margin: 0,\n };\n\n const bodyStyle: React.CSSProperties = {\n flex: 1,\n padding: theme.spacing.md,\n overflowY: 'auto',\n };\n\n const sectionStyle: React.CSSProperties = {\n marginBottom: theme.spacing.lg,\n };\n\n const sectionTitleStyle: React.CSSProperties = {\n fontSize: theme.fontSizes.sm,\n fontWeight: 600,\n color: theme.colors.textMuted,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n marginBottom: theme.spacing.sm,\n };\n\n const fieldStyle: React.CSSProperties = {\n marginBottom: theme.spacing.md,\n };\n\n const labelStyle: React.CSSProperties = {\n display: 'block',\n fontSize: theme.fontSizes.sm,\n color: theme.colors.text,\n marginBottom: theme.spacing.xs,\n };\n\n const footerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: theme.spacing.sm,\n padding: theme.spacing.md,\n borderTop: `1px solid ${theme.colors.border}`,\n };\n\n const rowStyle: React.CSSProperties = {\n display: 'flex',\n gap: theme.spacing.md,\n };\n\n const columnSelectOptions = schema\n ? schema.tables.flatMap((table: TableSchema) =>\n table.columns.map((col: ColumnSchema) => ({\n value: `${table.name}.${col.name}`,\n label: `${table.name}.${col.name}`,\n }))\n )\n : [];\n\n // Render config fields based on widget type\n const renderConfigFields = () => {\n switch (widget.type) {\n case 'metric':\n return (\n <>\n <div style={fieldStyle}>\n <label style={labelStyle}>Format</label>\n <Select\n value={config.format || 'number'}\n onChange={(value) => updateConfig('format', value as WidgetConfig['format'])}\n options={[\n { value: 'number', label: 'Number' },\n { value: 'currency', label: 'Currency' },\n { value: 'percent', label: 'Percentage' },\n { value: 'compact', label: 'Compact' },\n ]}\n />\n </div>\n <div style={fieldStyle}>\n <label style={labelStyle}>Trend Comparison Field</label>\n <Select\n value={config.trend_comparison || ''}\n onChange={(value) => updateConfig('trend_comparison', value || undefined)}\n options={[\n { value: '', label: 'None' },\n ...columnSelectOptions,\n ]}\n />\n </div>\n </>\n );\n\n case 'bar_chart':\n return (\n <>\n <div style={fieldStyle}>\n <label style={labelStyle}>X-Axis Column</label>\n <Select\n value={config.x_axis || ''}\n onChange={(value) => updateConfig('x_axis', value)}\n options={[{ value: '', label: 'Select column' }, ...columnSelectOptions]}\n />\n </div>\n <div style={fieldStyle}>\n <label style={labelStyle}>Orientation</label>\n <Select\n value={config.orientation || 'vertical'}\n onChange={(value) =>\n updateConfig('orientation', value as 'vertical' | 'horizontal')\n }\n options={[\n { value: 'vertical', label: 'Vertical' },\n { value: 'horizontal', label: 'Horizontal' },\n ]}\n />\n </div>\n <div style={rowStyle}>\n <Checkbox\n label=\"Show Legend\"\n checked={config.show_legend ?? true}\n onChange={(e: ChangeEvent<HTMLInputElement>) => updateConfig('show_legend', e.target.checked)}\n />\n <Checkbox\n label=\"Stacked\"\n checked={config.stacked ?? false}\n onChange={(e: ChangeEvent<HTMLInputElement>) => updateConfig('stacked', e.target.checked)}\n />\n <Checkbox\n label=\"Show Data Labels\"\n checked={config.show_data_labels ?? false}\n onChange={(e: ChangeEvent<HTMLInputElement>) => updateConfig('show_data_labels', e.target.checked)}\n />\n </div>\n </>\n );\n\n case 'line_chart':\n case 'area_chart':\n return (\n <>\n <div style={fieldStyle}>\n <label style={labelStyle}>X-Axis Column</label>\n <Select\n value={config.x_axis || ''}\n onChange={(value) => updateConfig('x_axis', value)}\n options={[{ value: '', label: 'Select column' }, ...columnSelectOptions]}\n />\n </div>\n <div style={rowStyle}>\n <Checkbox\n label=\"Show Legend\"\n checked={config.show_legend ?? true}\n onChange={(e: ChangeEvent<HTMLInputElement>) => updateConfig('show_legend', e.target.checked)}\n />\n <Checkbox\n label=\"Show Data Labels\"\n checked={config.show_data_labels ?? false}\n onChange={(e: ChangeEvent<HTMLInputElement>) => updateConfig('show_data_labels', e.target.checked)}\n />\n </div>\n </>\n );\n\n case 'pie_chart':\n return (\n <>\n <div style={rowStyle}>\n <Checkbox\n label=\"Show Legend\"\n checked={config.show_legend ?? true}\n onChange={(e: ChangeEvent<HTMLInputElement>) => updateConfig('show_legend', e.target.checked)}\n />\n <Checkbox\n label=\"Show Data Labels\"\n checked={config.show_data_labels ?? true}\n onChange={(e: ChangeEvent<HTMLInputElement>) => updateConfig('show_data_labels', e.target.checked)}\n />\n </div>\n </>\n );\n\n case 'table':\n return (\n <>\n <div style={fieldStyle}>\n <label style={labelStyle}>Page Size</label>\n <Select\n value={String(config.page_size || 10)}\n onChange={(value) => updateConfig('page_size', parseInt(value, 10))}\n options={[\n { value: '5', label: '5 rows' },\n { value: '10', label: '10 rows' },\n { value: '25', label: '25 rows' },\n { value: '50', label: '50 rows' },\n { value: '100', label: '100 rows' },\n ]}\n />\n </div>\n <Checkbox\n label=\"Sortable Columns\"\n checked={config.sortable ?? true}\n onChange={(e: ChangeEvent<HTMLInputElement>) => updateConfig('sortable', e.target.checked)}\n />\n </>\n );\n\n case 'text':\n return (\n <>\n <div style={fieldStyle}>\n <label style={labelStyle}>Content</label>\n <textarea\n value={config.content || ''}\n onChange={(e) => updateConfig('content', e.target.value)}\n rows={6}\n style={{\n width: '100%',\n padding: theme.spacing.sm,\n fontSize: theme.fontSizes.sm,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.sm,\n backgroundColor: theme.colors.background,\n color: theme.colors.text,\n fontFamily: config.markdown ? theme.fonts.mono : theme.fonts.sans,\n resize: 'vertical',\n }}\n />\n </div>\n <Checkbox\n label=\"Enable Markdown\"\n checked={config.markdown ?? true}\n onChange={(e: ChangeEvent<HTMLInputElement>) => updateConfig('markdown', e.target.checked)}\n />\n </>\n );\n\n default:\n return null;\n }\n };\n\n return (\n <div style={overlayStyle} onClick={onCancel}>\n <div style={modalStyle} onClick={(e) => e.stopPropagation()}>\n <div style={headerStyle}>\n <h2 style={titleStyle}>Edit Widget</h2>\n <Button variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n <Icon name=\"x\" size={20} />\n </Button>\n </div>\n\n <div style={bodyStyle}>\n {/* Basic Info */}\n <div style={sectionStyle}>\n <h3 style={sectionTitleStyle}>Basic Information</h3>\n <div style={fieldStyle}>\n <label style={labelStyle}>Title</label>\n <Input\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder=\"Widget title\"\n />\n </div>\n </div>\n\n {/* Widget-specific config */}\n <div style={sectionStyle}>\n <h3 style={sectionTitleStyle}>Configuration</h3>\n {renderConfigFields()}\n </div>\n\n {/* Query section */}\n <div style={sectionStyle}>\n <h3 style={sectionTitleStyle}>Data Source</h3>\n {query ? (\n <div\n style={{\n padding: theme.spacing.md,\n backgroundColor: theme.colors.background,\n borderRadius: theme.radius.md,\n border: `1px solid ${theme.colors.border}`,\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: theme.spacing.sm,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: theme.spacing.sm }}>\n <Icon name=\"table\" size={16} />\n <span style={{ fontWeight: 500, color: theme.colors.text }}>\n {queryName || 'Custom Query'}\n </span>\n </div>\n <Button variant=\"ghost\" size=\"sm\" onClick={handleClearQuery}>\n <Icon name=\"x\" size={16} />\n </Button>\n </div>\n <div style={{ fontSize: theme.fontSizes.sm, color: theme.colors.textMuted }}>\n {query.tables?.length || 0} table(s), {query.columns?.length || 0} column(s)\n {query.filters && query.filters.length > 0 && `, ${query.filters.length} filter(s)`}\n </div>\n </div>\n ) : (\n <div\n style={{\n padding: theme.spacing.md,\n backgroundColor: theme.colors.background,\n borderRadius: theme.radius.md,\n border: `1px dashed ${theme.colors.border}`,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: theme.spacing.md,\n }}\n >\n <div style={{ textAlign: 'center', color: theme.colors.textMuted }}>\n <Icon name=\"table\" size={24} style={{ marginBottom: theme.spacing.xs }} />\n <div>Select a saved query to power this widget</div>\n </div>\n <SavedQueryPicker\n currentQuery={null}\n onSelect={handleSelectSavedQuery}\n showSave={false}\n />\n </div>\n )}\n </div>\n </div>\n\n <div style={footerStyle}>\n <Button variant=\"ghost\" onClick={onCancel}>\n Cancel\n </Button>\n <Button variant=\"primary\" onClick={handleSave}>\n Save Widget\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","/**\n * DashboardCard component.\n *\n * Displays a single dashboard in a card format with actions.\n */\n\nimport { type HTMLAttributes, type ReactNode, forwardRef, useState } from 'react';\n\nimport { Button } from '../../components/ui/Button';\nimport { Dropdown, DropdownItem, DropdownSeparator } from '../../components/ui/Dropdown';\nimport { Icon } from '../../components/ui/Icon';\nimport type { Dashboard } from '../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DashboardCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onClick'> {\n /** The dashboard to display. */\n dashboard: Dashboard;\n /** Called when the card is clicked. */\n onClick?: (dashboard: Dashboard) => void;\n /** Called when edit is requested. */\n onEdit?: (dashboard: Dashboard) => void;\n /** Called when delete is requested. */\n onDelete?: (dashboard: Dashboard) => void;\n /** Called when duplicate is requested. */\n onDuplicate?: (dashboard: Dashboard) => void;\n /** Whether the card is selected. */\n selected?: boolean;\n /** Whether actions are disabled. */\n actionsDisabled?: boolean;\n /** Custom action buttons. */\n actions?: ReactNode;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst cardStyles: React.CSSProperties = {\n backgroundColor: 'var(--prismiq-color-surface)',\n border: '1px solid var(--prismiq-color-border)',\n borderRadius: 'var(--prismiq-radius-lg)',\n padding: 'var(--prismiq-spacing-lg)',\n cursor: 'pointer',\n transition: 'border-color 0.15s, box-shadow 0.15s',\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-md)',\n};\n\nconst cardHoverStyles: React.CSSProperties = {\n borderColor: 'var(--prismiq-color-primary)',\n boxShadow: 'var(--prismiq-shadow-md)',\n};\n\nconst cardSelectedStyles: React.CSSProperties = {\n borderColor: 'var(--prismiq-color-primary)',\n boxShadow: '0 0 0 2px var(--prismiq-color-primary-light)',\n};\n\nconst headerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 'var(--prismiq-spacing-md)',\n};\n\nconst titleStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-lg)',\n fontWeight: 600,\n color: 'var(--prismiq-color-text)',\n margin: 0,\n lineHeight: 1.4,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst descriptionStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text-muted)',\n margin: 0,\n lineHeight: 1.5,\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n};\n\nconst metaStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-md)',\n fontSize: 'var(--prismiq-font-size-xs)',\n color: 'var(--prismiq-color-text-muted)',\n};\n\nconst metaItemStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-xs)',\n};\n\nconst badgeStyles: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 8px',\n borderRadius: 'var(--prismiq-radius-full)',\n fontSize: 'var(--prismiq-font-size-xs)',\n fontWeight: 500,\n};\n\nconst publicBadgeStyles: React.CSSProperties = {\n ...badgeStyles,\n backgroundColor: 'var(--prismiq-color-success-light)',\n color: 'var(--prismiq-color-success)',\n};\n\nconst privateBadgeStyles: React.CSSProperties = {\n ...badgeStyles,\n backgroundColor: 'var(--prismiq-color-warning-light)',\n color: 'var(--prismiq-color-warning)',\n};\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Dashboard card component for displaying dashboard summary.\n *\n * @example\n * ```tsx\n * <DashboardCard\n * dashboard={dashboard}\n * onClick={(d) => navigate(`/dashboard/${d.id}`)}\n * onEdit={(d) => openEditDialog(d)}\n * onDelete={(d) => confirmDelete(d)}\n * />\n * ```\n */\nexport const DashboardCard = forwardRef<HTMLDivElement, DashboardCardProps>(\n function DashboardCard(\n {\n dashboard,\n onClick,\n onEdit,\n onDelete,\n onDuplicate,\n selected,\n actionsDisabled,\n actions,\n style,\n ...props\n },\n ref\n ) {\n const [isHovered, setIsHovered] = useState(false);\n\n const handleClick = () => {\n onClick?.(dashboard);\n };\n\n const handleMenuAction = (action: 'edit' | 'duplicate' | 'delete') => {\n switch (action) {\n case 'edit':\n onEdit?.(dashboard);\n break;\n case 'duplicate':\n onDuplicate?.(dashboard);\n break;\n case 'delete':\n onDelete?.(dashboard);\n break;\n }\n };\n\n const combinedStyles: React.CSSProperties = {\n ...cardStyles,\n ...(isHovered && !selected ? cardHoverStyles : {}),\n ...(selected ? cardSelectedStyles : {}),\n ...style,\n };\n\n return (\n <div\n ref={ref}\n role=\"button\"\n tabIndex={0}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleClick();\n }\n }}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={combinedStyles}\n {...props}\n >\n <div style={headerStyles}>\n <h3 style={titleStyles}>{dashboard.name}</h3>\n {actions ? (\n actions\n ) : (\n <Dropdown\n trigger={\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => e.stopPropagation()}\n disabled={actionsDisabled}\n aria-label=\"Dashboard actions\"\n >\n <Icon name=\"more-vertical\" size={16} />\n </Button>\n }\n >\n <DropdownItem onClick={() => handleMenuAction('edit')}>\n <Icon name=\"edit\" size={14} />\n Edit\n </DropdownItem>\n <DropdownItem onClick={() => handleMenuAction('duplicate')}>\n <Icon name=\"copy\" size={14} />\n Duplicate\n </DropdownItem>\n <DropdownSeparator />\n <DropdownItem onClick={() => handleMenuAction('delete')}>\n <Icon name=\"trash\" size={14} />\n Delete\n </DropdownItem>\n </Dropdown>\n )}\n </div>\n\n {dashboard.description && (\n <p style={descriptionStyles}>{dashboard.description}</p>\n )}\n\n <div style={metaStyles}>\n <span style={metaItemStyles}>\n <Icon name=\"grid\" size={12} />\n {dashboard.widgets.length} widget{dashboard.widgets.length !== 1 ? 's' : ''}\n </span>\n <span style={metaItemStyles}>\n <Icon name=\"calendar\" size={12} />\n {formatDate(dashboard.updated_at)}\n </span>\n {dashboard.is_public ? (\n <span style={publicBadgeStyles}>Public</span>\n ) : (\n <span style={privateBadgeStyles}>Private</span>\n )}\n </div>\n </div>\n );\n }\n);\n","/**\n * DashboardList component.\n *\n * Displays a grid of dashboard cards with actions.\n */\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { Button } from '../../components/ui/Button';\nimport { Icon } from '../../components/ui/Icon';\nimport { EmptyState } from '../../components/EmptyState';\nimport { Skeleton } from '../../components/Skeleton';\nimport type { Dashboard } from '../../types';\nimport { DashboardCard, type DashboardCardProps } from './DashboardCard';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DashboardListProps extends HTMLAttributes<HTMLDivElement> {\n /** List of dashboards to display. */\n dashboards: Dashboard[] | null;\n /** Whether the list is loading. */\n isLoading?: boolean;\n /** Error that occurred during fetch. */\n error?: Error | null;\n /** Called when a dashboard card is clicked. */\n onDashboardClick?: (dashboard: Dashboard) => void;\n /** Called when edit is requested for a dashboard. */\n onEdit?: (dashboard: Dashboard) => void;\n /** Called when delete is requested for a dashboard. */\n onDelete?: (dashboard: Dashboard) => void;\n /** Called when duplicate is requested for a dashboard. */\n onDuplicate?: (dashboard: Dashboard) => void;\n /** Called when create new dashboard is requested. */\n onCreate?: () => void;\n /** Number of columns in the grid. */\n columns?: 1 | 2 | 3 | 4;\n /** ID of the currently selected dashboard. */\n selectedId?: string;\n /** Whether actions are disabled. */\n actionsDisabled?: boolean;\n /** Custom empty state content. */\n emptyState?: ReactNode;\n /** Custom card render function. */\n renderCard?: (dashboard: Dashboard, props: DashboardCardProps) => ReactNode;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst containerStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-lg)',\n};\n\nconst headerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 'var(--prismiq-spacing-md)',\n};\n\nconst titleStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-xl)',\n fontWeight: 600,\n color: 'var(--prismiq-color-text)',\n margin: 0,\n};\n\nconst getGridStyles = (columns: number): React.CSSProperties => ({\n display: 'grid',\n gridTemplateColumns: `repeat(${columns}, 1fr)`,\n gap: 'var(--prismiq-spacing-lg)',\n});\n\nconst errorStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-xl)',\n textAlign: 'center',\n color: 'var(--prismiq-color-error)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Dashboard list component for displaying all dashboards.\n *\n * @example\n * ```tsx\n * function DashboardsPage() {\n * const { data, isLoading, error } = useDashboards();\n * const { createDashboard } = useDashboardMutations();\n *\n * return (\n * <DashboardList\n * dashboards={data}\n * isLoading={isLoading}\n * error={error}\n * onDashboardClick={(d) => navigate(`/dashboard/${d.id}`)}\n * onCreate={() => setShowCreateDialog(true)}\n * />\n * );\n * }\n * ```\n */\nexport const DashboardList = forwardRef<HTMLDivElement, DashboardListProps>(\n function DashboardList(\n {\n dashboards,\n isLoading,\n error,\n onDashboardClick,\n onEdit,\n onDelete,\n onDuplicate,\n onCreate,\n columns = 3,\n selectedId,\n actionsDisabled,\n emptyState,\n renderCard,\n style,\n ...props\n },\n ref\n ) {\n // Loading state\n if (isLoading) {\n return (\n <div ref={ref} style={{ ...containerStyles, ...style }} {...props}>\n <div style={headerStyles}>\n <Skeleton width={200} height={32} />\n <Skeleton width={150} height={40} />\n </div>\n <div style={getGridStyles(columns)}>\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} height={150} style={{ borderRadius: 'var(--prismiq-radius-lg)' }} />\n ))}\n </div>\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div ref={ref} style={{ ...containerStyles, ...style }} {...props}>\n <div style={errorStyles}>\n <Icon name=\"alert-circle\" size={48} />\n <p>Failed to load dashboards: {error.message}</p>\n <Button variant=\"secondary\" onClick={() => window.location.reload()}>\n Retry\n </Button>\n </div>\n </div>\n );\n }\n\n // Empty state\n if (!dashboards || dashboards.length === 0) {\n return (\n <div ref={ref} style={{ ...containerStyles, ...style }} {...props}>\n <div style={headerStyles}>\n <h2 style={titleStyles}>Dashboards</h2>\n {onCreate && (\n <Button onClick={onCreate} leftIcon={<Icon name=\"plus\" size={16} />}>\n Create Dashboard\n </Button>\n )}\n </div>\n {emptyState || (\n <EmptyState\n icon={<Icon name=\"layout\" size={64} />}\n title=\"No dashboards yet\"\n description=\"Create your first dashboard to start visualizing your data.\"\n action={\n onCreate\n ? { label: 'Create Dashboard', onClick: onCreate }\n : undefined\n }\n />\n )}\n </div>\n );\n }\n\n // Dashboard grid\n return (\n <div ref={ref} style={{ ...containerStyles, ...style }} {...props}>\n <div style={headerStyles}>\n <h2 style={titleStyles}>\n Dashboards ({dashboards.length})\n </h2>\n {onCreate && (\n <Button onClick={onCreate} leftIcon={<Icon name=\"plus\" size={16} />}>\n Create Dashboard\n </Button>\n )}\n </div>\n <div style={getGridStyles(columns)}>\n {dashboards.map((dashboard) => {\n const cardProps: DashboardCardProps = {\n dashboard,\n onClick: onDashboardClick,\n onEdit,\n onDelete,\n onDuplicate,\n selected: dashboard.id === selectedId,\n actionsDisabled,\n };\n\n if (renderCard) {\n return renderCard(dashboard, cardProps);\n }\n\n return <DashboardCard key={dashboard.id} {...cardProps} />;\n })}\n </div>\n </div>\n );\n }\n);\n","/**\n * DashboardDialog component.\n *\n * Dialog for creating and editing dashboards.\n */\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useState,\n type FormEvent,\n} from 'react';\n\nimport { Button } from '../../components/ui/Button';\nimport { Dialog, DialogFooter } from '../../components/ui/Dialog';\nimport { Input } from '../../components/ui/Input';\nimport { Checkbox } from '../../components/ui/Checkbox';\nimport type { Dashboard, DashboardCreate, DashboardUpdate } from '../../types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface DashboardDialogProps {\n /** Whether the dialog is open. */\n open: boolean;\n /** Called when the dialog should close. */\n onClose: () => void;\n /** Called when the form is submitted. */\n onSubmit: (data: DashboardCreate | DashboardUpdate) => Promise<void>;\n /** Dashboard to edit (null for create mode). */\n dashboard?: Dashboard | null;\n /** Whether the submit action is loading. */\n isLoading?: boolean;\n /** Error message to display. */\n error?: string | null;\n}\n\ninterface FormState {\n name: string;\n description: string;\n isPublic: boolean;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst formStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-lg)',\n};\n\nconst fieldStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n gap: 'var(--prismiq-spacing-xs)',\n};\n\nconst labelStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-sm)',\n fontWeight: 500,\n color: 'var(--prismiq-color-text)',\n};\n\nconst checkboxContainerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 'var(--prismiq-spacing-sm)',\n};\n\nconst checkboxLabelStyles: React.CSSProperties = {\n fontSize: 'var(--prismiq-font-size-sm)',\n color: 'var(--prismiq-color-text)',\n};\n\nconst errorStyles: React.CSSProperties = {\n padding: 'var(--prismiq-spacing-sm) var(--prismiq-spacing-md)',\n backgroundColor: 'var(--prismiq-color-error-light)',\n color: 'var(--prismiq-color-error)',\n borderRadius: 'var(--prismiq-radius-md)',\n fontSize: 'var(--prismiq-font-size-sm)',\n};\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Dialog for creating or editing a dashboard.\n *\n * @example\n * ```tsx\n * function DashboardsPage() {\n * const [dialogOpen, setDialogOpen] = useState(false);\n * const [editingDashboard, setEditingDashboard] = useState<Dashboard | null>(null);\n * const { createDashboard, updateDashboard, state } = useDashboardMutations();\n *\n * const handleSubmit = async (data: DashboardCreate | DashboardUpdate) => {\n * if (editingDashboard) {\n * await updateDashboard(editingDashboard.id, data);\n * } else {\n * await createDashboard(data as DashboardCreate);\n * }\n * setDialogOpen(false);\n * };\n *\n * return (\n * <DashboardDialog\n * open={dialogOpen}\n * onClose={() => setDialogOpen(false)}\n * onSubmit={handleSubmit}\n * dashboard={editingDashboard}\n * isLoading={state.isLoading}\n * error={state.error?.message}\n * />\n * );\n * }\n * ```\n */\nexport const DashboardDialog = forwardRef<HTMLDivElement, DashboardDialogProps>(\n function DashboardDialog(\n { open, onClose, onSubmit, dashboard, isLoading, error },\n _ref\n ) {\n const isEditMode = Boolean(dashboard);\n\n const [formState, setFormState] = useState<FormState>({\n name: '',\n description: '',\n isPublic: false,\n });\n\n const [validationError, setValidationError] = useState<string | null>(null);\n\n // Reset form when dialog opens/closes or dashboard changes\n useEffect(() => {\n if (open) {\n if (dashboard) {\n setFormState({\n name: dashboard.name,\n description: dashboard.description || '',\n isPublic: dashboard.is_public,\n });\n } else {\n setFormState({\n name: '',\n description: '',\n isPublic: false,\n });\n }\n setValidationError(null);\n }\n }, [open, dashboard]);\n\n const handleSubmit = useCallback(\n async (e: FormEvent) => {\n e.preventDefault();\n\n // Validate\n if (!formState.name.trim()) {\n setValidationError('Dashboard name is required');\n return;\n }\n\n setValidationError(null);\n\n const data: DashboardCreate | DashboardUpdate = {\n name: formState.name.trim(),\n description: formState.description.trim() || undefined,\n is_public: formState.isPublic,\n };\n\n try {\n await onSubmit(data);\n } catch {\n // Error is handled by parent via error prop\n }\n },\n [formState, onSubmit]\n );\n\n const displayError = validationError || error;\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n title={isEditMode ? 'Edit Dashboard' : 'Create Dashboard'}\n description={\n isEditMode\n ? 'Update your dashboard settings.'\n : 'Create a new dashboard to visualize your data.'\n }\n width=\"sm\"\n >\n <form onSubmit={handleSubmit} style={formStyles}>\n {displayError && <div style={errorStyles}>{displayError}</div>}\n\n <div style={fieldStyles}>\n <label htmlFor=\"dashboard-name\" style={labelStyles}>\n Name\n </label>\n <Input\n id=\"dashboard-name\"\n value={formState.name}\n onChange={(e) =>\n setFormState((s) => ({ ...s, name: e.target.value }))\n }\n placeholder=\"My Dashboard\"\n autoFocus\n disabled={isLoading}\n />\n </div>\n\n <div style={fieldStyles}>\n <label htmlFor=\"dashboard-description\" style={labelStyles}>\n Description (optional)\n </label>\n <Input\n id=\"dashboard-description\"\n value={formState.description}\n onChange={(e) =>\n setFormState((s) => ({ ...s, description: e.target.value }))\n }\n placeholder=\"A brief description of this dashboard\"\n disabled={isLoading}\n />\n </div>\n\n <div style={checkboxContainerStyles}>\n <Checkbox\n id=\"dashboard-public\"\n checked={formState.isPublic}\n onChange={(e) =>\n setFormState((s) => ({ ...s, isPublic: e.target.checked }))\n }\n disabled={isLoading}\n />\n <label htmlFor=\"dashboard-public\" style={checkboxLabelStyles}>\n Make this dashboard public\n </label>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={onClose}\n disabled={isLoading}\n >\n Cancel\n </Button>\n <Button type=\"submit\" loading={isLoading}>\n {isEditMode ? 'Save Changes' : 'Create Dashboard'}\n </Button>\n </DialogFooter>\n </form>\n </Dialog>\n );\n }\n);\n"]}
|