@dlh.io/bideux 0.1.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/LICENSE +202 -0
- package/README.md +90 -0
- package/dist/all.d.ts +14 -0
- package/dist/all.js +15 -0
- package/dist/all.js.map +1 -0
- package/dist/chunk-62IQGXLW.js +11470 -0
- package/dist/chunk-62IQGXLW.js.map +1 -0
- package/dist/chunk-75CRTQK7.js +315 -0
- package/dist/chunk-75CRTQK7.js.map +1 -0
- package/dist/chunk-FVO6E22Z.js +225 -0
- package/dist/chunk-FVO6E22Z.js.map +1 -0
- package/dist/chunk-GRITOB4M.js +337 -0
- package/dist/chunk-GRITOB4M.js.map +1 -0
- package/dist/chunk-HPFHIZWO.js +40 -0
- package/dist/chunk-HPFHIZWO.js.map +1 -0
- package/dist/chunk-IMNUQGHE.js +2864 -0
- package/dist/chunk-IMNUQGHE.js.map +1 -0
- package/dist/chunk-LHD445PJ.js +571 -0
- package/dist/chunk-LHD445PJ.js.map +1 -0
- package/dist/chunk-LPLBBHOW.js +386 -0
- package/dist/chunk-LPLBBHOW.js.map +1 -0
- package/dist/chunk-NGM5R3LW.js +881 -0
- package/dist/chunk-NGM5R3LW.js.map +1 -0
- package/dist/chunk-OMPR32AR.js +1320 -0
- package/dist/chunk-OMPR32AR.js.map +1 -0
- package/dist/chunk-QDQ5VVTC.js +255 -0
- package/dist/chunk-QDQ5VVTC.js.map +1 -0
- package/dist/chunk-RRWZKNDZ.js +1004 -0
- package/dist/chunk-RRWZKNDZ.js.map +1 -0
- package/dist/chunk-SRWIBMEB.js +178 -0
- package/dist/chunk-SRWIBMEB.js.map +1 -0
- package/dist/element/chunk-AOKCBPMV.js +1646 -0
- package/dist/element/chunk-AOKCBPMV.js.map +1 -0
- package/dist/element/chunk-B67SYRQP.js +281 -0
- package/dist/element/chunk-B67SYRQP.js.map +1 -0
- package/dist/element/chunk-FNRVFA2C.js +55 -0
- package/dist/element/chunk-FNRVFA2C.js.map +1 -0
- package/dist/element/chunk-G3C722QP.js +4707 -0
- package/dist/element/chunk-G3C722QP.js.map +1 -0
- package/dist/element/chunk-H5IFOSQP.js +346 -0
- package/dist/element/chunk-H5IFOSQP.js.map +1 -0
- package/dist/element/chunk-LXR3CLCN.js +30 -0
- package/dist/element/chunk-LXR3CLCN.js.map +1 -0
- package/dist/element/chunk-TFV4CJR4.js +183 -0
- package/dist/element/chunk-TFV4CJR4.js.map +1 -0
- package/dist/element/chunk-TXSK3CIN.js +859 -0
- package/dist/element/chunk-TXSK3CIN.js.map +1 -0
- package/dist/element/chunk-WDTTBY3S.js +45 -0
- package/dist/element/chunk-WDTTBY3S.js.map +1 -0
- package/dist/element/chunk-ZI3RYCAR.js +233 -0
- package/dist/element/chunk-ZI3RYCAR.js.map +1 -0
- package/dist/element/element.d.ts +3044 -0
- package/dist/element/element.js +146554 -0
- package/dist/element/element.js.map +1 -0
- package/dist/element/revo-grid.entry-7FHEBN3O.js +4817 -0
- package/dist/element/revo-grid.entry-7FHEBN3O.js.map +1 -0
- package/dist/element/revogr-attribution_7.entry-LSOFVZRA.js +1328 -0
- package/dist/element/revogr-attribution_7.entry-LSOFVZRA.js.map +1 -0
- package/dist/element/revogr-clipboard_3.entry-V74UIBPJ.js +494 -0
- package/dist/element/revogr-clipboard_3.entry-V74UIBPJ.js.map +1 -0
- package/dist/element/revogr-data_4.entry-2UBOKTFN.js +1041 -0
- package/dist/element/revogr-data_4.entry-2UBOKTFN.js.map +1 -0
- package/dist/element/revogr-filter-panel.entry-B24PLQU4.js +552 -0
- package/dist/element/revogr-filter-panel.entry-B24PLQU4.js.map +1 -0
- package/dist/index.d.ts +1041 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +1915 -0
- package/dist/react.js +14 -0
- package/dist/react.js.map +1 -0
- package/dist/renderers/echarts.d.ts +44 -0
- package/dist/renderers/echarts.js +6 -0
- package/dist/renderers/echarts.js.map +1 -0
- package/dist/renderers/index.d.ts +48 -0
- package/dist/renderers/index.js +12 -0
- package/dist/renderers/index.js.map +1 -0
- package/dist/renderers/revogrid.d.ts +76 -0
- package/dist/renderers/revogrid.js +6 -0
- package/dist/renderers/revogrid.js.map +1 -0
- package/dist/renderers/tabulator.d.ts +37 -0
- package/dist/renderers/tabulator.js +6 -0
- package/dist/renderers/tabulator.js.map +1 -0
- package/dist/result-table-CPls-277.d.ts +1885 -0
- package/dist/schema/dashboard.schema.json +4374 -0
- package/dist/schema/semantic-model.schema.json +1200 -0
- package/dist/schema/widget.schema.json +1793 -0
- package/dist/styles.css +156 -0
- package/dist/theme.css +1789 -0
- package/dist/types-CHFSsU_X.d.ts +1007 -0
- package/package.json +119 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../dashboard-renderers/src/types.ts","../../dashboard-renderers/src/pivot-columns.ts","../../dashboard-renderers/src/pivot-view.ts","../../dashboard-renderers/src/pivot-model.ts"],"names":[],"mappings":"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","file":"chunk-LHD445PJ.js","sourcesContent":["import type {\n WidgetInteraction,\n WidgetSpec,\n} from \"@dlh.io/bideux-dashboard-spec\";\nimport type { WidgetInteractionContext } from \"@dlh.io/bideux-dashboard-core\";\n\nexport type { WidgetInteraction, WidgetSpec };\n\nexport type ChartOption = Record<string, unknown>;\nexport type DataRow = Record<string, unknown>;\nexport type WidgetResult = Record<string, unknown>;\n\nexport type WidgetComponent =\n | \"echarts\"\n | \"kpi\"\n | \"filter\"\n | \"select\"\n | \"table\"\n | \"tabulator\"\n | \"pivot_table\"\n | \"text\"\n | \"image\"\n | \"markdown\";\n\nexport interface RendererLabel {\n text?: string;\n position: \"top\" | \"bottom\";\n tooltip?: string;\n tooltipIcon?: \"info\" | \"check\" | \"help\" | \"warning\";\n}\n\nexport interface WidgetTheme {\n padding?: string | number;\n margin?: string | number;\n borderRadius?: string | number;\n background?: string;\n border?: string | boolean;\n shadow?: string | boolean;\n}\n\nexport type WidgetDefaults = Partial<\n Record<WidgetComponent | \"global\", WidgetTheme>\n>;\n\nexport interface RendererFrame {\n widgetId: string;\n component: string;\n theme: WidgetTheme;\n showObjectHeader: boolean;\n label?: RendererLabel;\n interactive: boolean;\n}\n\nexport interface KpiDeltaModel {\n value: number;\n formattedValue: string;\n tone: \"up\" | \"down\" | \"flat\";\n icon: \"up\" | \"down\" | \"neutral\" | \"none\";\n comparedWith?: string;\n tooltip?: string;\n tooltipIcon?: \"info\" | \"check\" | \"help\" | \"warning\";\n color?: string;\n reference?: {\n value: number;\n formattedValue: string;\n };\n}\n\nexport interface KpiValueFormat {\n format: string;\n prefix: string;\n suffix: string;\n compact: boolean;\n decimals?: number;\n}\n\nexport interface KpiRendererModel {\n kind: \"kpi\";\n frame: RendererFrame;\n value: number;\n formattedValue: string;\n settledValue: string;\n /** How the value was formatted, so a host can format intermediate values the same way. */\n valueFormat: KpiValueFormat;\n delta?: KpiDeltaModel;\n note?: string;\n}\n\nexport interface ChartRendererModel {\n kind: \"chart\";\n frame: RendererFrame;\n option: ChartOption;\n axisKey: string;\n structureKey: string;\n loading: boolean;\n}\n\nexport interface TextRendererStyle {\n textAlign: \"left\" | \"center\" | \"right\" | \"justify\";\n verticalAlign: \"top\" | \"middle\" | \"bottom\";\n fontSize?: string | number;\n fontWeight?: string | number;\n color?: string;\n lineHeight?: string | number;\n letterSpacing?: string | number;\n whiteSpace?: \"normal\" | \"nowrap\" | \"pre\" | \"pre-wrap\" | \"pre-line\";\n truncate: boolean;\n custom: Record<string, string | number>;\n}\n\nexport interface TextRendererModel {\n kind: \"text\";\n frame: RendererFrame;\n content: string;\n contentFormat: \"text\" | \"markdown\";\n style: TextRendererStyle;\n}\n\nexport interface MarkdownRendererModel {\n kind: \"markdown\";\n frame: RendererFrame;\n content: string;\n}\n\nexport interface ImageRendererModel {\n kind: \"image\";\n frame: RendererFrame;\n source: string | null;\n alt: string;\n objectFit: \"cover\" | \"contain\";\n}\n\nexport type SortDirection = \"asc\" | \"desc\";\n\nexport interface TableSortState {\n column: string;\n direction: SortDirection;\n}\n\nexport interface TableExportModel {\n csv: boolean;\n excel: boolean;\n filename: string;\n}\n\nexport interface TableColumnModel {\n field: string;\n title: string;\n sortable: boolean;\n sortDirection: SortDirection | null;\n}\n\nexport interface TableCellModel {\n field: string;\n value: unknown;\n text: string;\n}\n\nexport interface TableRowModel {\n key: number;\n data: DataRow;\n cells: TableCellModel[];\n}\n\nexport interface TableRendererModel {\n kind: \"table\";\n frame: RendererFrame;\n columns: TableColumnModel[];\n rows: TableRowModel[];\n allRows: DataRow[];\n page: number;\n pageSize: number;\n pageCount: number;\n totalRows: number;\n sort: TableSortState | null;\n exports: TableExportModel;\n}\n\nexport type GridColumnFormatterModel =\n | {\n kind: \"percent\";\n precision: number;\n params: Record<string, unknown>;\n }\n | {\n kind: \"named\";\n name: string;\n params: Record<string, unknown>;\n };\n\nexport interface GridColumnModel {\n field: string;\n title: string;\n frozen: boolean;\n headerSort: boolean;\n formatter?: GridColumnFormatterModel;\n width?: number | string;\n headerTooltip?: string;\n sorter?: string;\n}\n\nexport interface GridOptionsModel {\n layout: \"fitColumns\" | \"fitData\" | \"fitDataFill\";\n pagination: boolean;\n pageSize?: number;\n groupBy?: string;\n groupStartOpen: boolean;\n sortable: boolean;\n}\n\nexport interface TabulatorRendererModel {\n kind: \"tabulator\";\n frame: RendererFrame;\n columns: GridColumnModel[];\n rows: DataRow[];\n options: GridOptionsModel;\n exports: TableExportModel;\n}\n\nexport type PivotAggregation =\n | \"sum\"\n | \"avg\"\n | \"min\"\n | \"max\"\n | \"count\"\n | \"count_distinct\";\n\nexport interface PivotFieldPayload {\n key: string;\n label: string;\n}\n\nexport interface PivotMeasurePayload {\n key: string;\n label: string;\n agg: PivotAggregation;\n format: \"number\" | \"currency\" | \"percent\" | null;\n decimals: number | null;\n}\n\nexport interface PivotColumnNode {\n key: string;\n label: string;\n column: string | null;\n measure: string | null;\n is_total: boolean;\n is_group_total: boolean;\n children: PivotColumnNode[];\n}\n\nexport type PivotRowKind = \"group\" | \"leaf\" | \"other\" | \"grand_total\";\n\nexport type PivotDirection = \"asc\" | \"desc\";\n\nexport interface PivotRowPayload {\n key: string;\n label: string;\n path: string[];\n depth: number;\n kind: PivotRowKind;\n cells: Record<string, number | null>;\n}\n\nexport interface PivotTablePayload {\n row_fields: PivotFieldPayload[];\n column_fields: PivotFieldPayload[];\n measures: PivotMeasurePayload[];\n column_tree: PivotColumnNode[];\n column_keys: string[];\n column_labels: Record<string, string>;\n rows: PivotRowPayload[];\n total_row: PivotRowPayload | null;\n value_range: Record<string, { min: number; max: number }>;\n empty_value: string;\n subtotals: \"expanded\" | \"collapsed\" | \"none\";\n heatmap_measure: string | null;\n snapshot_expand: number | null;\n snapshot_expand_columns?: number | null;\n sort: {\n column: string | null;\n measure: string | null;\n direction: PivotDirection;\n };\n truncated: {\n row_groups: number;\n row_groups_total: number;\n rolled_up: number;\n columns: number;\n columns_total: number;\n };\n fields: {\n dimensions: PivotFieldPayload[];\n measures: PivotFieldPayload[];\n };\n explore: boolean;\n explored: boolean;\n source?: { records: (string | number | null)[][] };\n}\n\nexport interface PivotDetailColumn {\n key: string;\n label: string;\n}\n\nexport interface PivotDetailResult {\n component: \"pivot_detail\";\n columns: PivotDetailColumn[];\n rows: DataRow[];\n row_count: number;\n truncated: boolean;\n}\n\nexport const PIVOT_META_PROP = \"__pivotMeta\";\n\nexport interface PivotGridRowMeta {\n key: string;\n label: string;\n path: string[];\n depth: number;\n kind: PivotRowKind;\n}\n\nexport interface PivotGridRow {\n [PIVOT_META_PROP]: PivotGridRowMeta;\n [prop: string]: string | number | null | PivotGridRowMeta;\n}\n\nexport interface PivotGridColumn {\n prop: string;\n name: string;\n columnKey: string | null;\n measure: string | null;\n isTotal: boolean;\n isRowField: boolean;\n pinStart: boolean;\n}\n\nexport interface PivotGridColumnGroup {\n name: string;\n key: string;\n foldable: boolean;\n folded: boolean;\n leafCount: number;\n children: PivotGridColumnDefinition[];\n}\n\nexport type PivotGridColumnDefinition = PivotGridColumn | PivotGridColumnGroup;\n\nexport interface PivotSortState {\n column: string;\n direction: PivotDirection;\n}\n\nexport type PivotFilterOp = \"gte\" | \"gt\" | \"eq\" | \"lte\" | \"lt\";\n\nexport interface PivotColumnFilter {\n op: PivotFilterOp;\n value: number;\n}\n\nexport interface PivotViewState {\n collapsed: ReadonlySet<string>;\n collapsedColumns: ReadonlySet<string>;\n search: string;\n filters: Readonly<Record<string, PivotColumnFilter>>;\n sort: PivotSortState | null;\n}\n\nexport interface PivotOpenLevels {\n rows: number | null;\n columns: number | null;\n}\n\nexport interface PivotCellPresentation {\n text: string;\n align: \"left\" | \"right\";\n emphasized: boolean;\n heatmapIntensity: number | null;\n}\n\nexport interface PivotControlsModel {\n searchPlaceholder: string;\n expandable: boolean;\n groupCount: number;\n filterCount: number;\n reordered: boolean;\n canFilter: true;\n canRearrange: false;\n embedded: boolean;\n}\n\nexport interface MissingPivotRendererModel {\n kind: \"pivot\";\n status: \"missing\";\n frame: RendererFrame;\n message: \"This widget did not return a pivot table.\";\n}\n\nexport interface ReadyPivotRendererModel {\n kind: \"pivot\";\n status: \"ready\";\n frame: RendererFrame;\n payload: PivotTablePayload;\n view: PivotViewState;\n columns: PivotGridColumnDefinition[];\n rows: PivotGridRow[];\n totalRow: PivotGridRow | null;\n valueColumns: PivotFieldPayload[];\n columnGroups: PivotFieldPayload[];\n truncation: string | null;\n controls: PivotControlsModel;\n exports: TableExportModel;\n openLevels: PivotOpenLevels;\n}\n\nexport type PivotRendererModel =\n | MissingPivotRendererModel\n | ReadyPivotRendererModel;\n\nexport type PivotCellAction =\n | {\n kind: \"toggle-row-group\";\n key: string;\n }\n | {\n kind: \"interaction\";\n interaction: WidgetInteraction;\n context: WidgetInteractionContext;\n }\n | {\n kind: \"detail\";\n filters: Record<string, string>;\n label: string;\n };\n\nexport interface UnknownRendererModel {\n kind: \"unknown\";\n frame: RendererFrame;\n message: \"Unknown widget type\";\n}\n\nexport interface ExtensionRendererModel {\n kind: \"extension\";\n frame: RendererFrame;\n name: string;\n content: unknown;\n}\n\nexport type BasicRendererModel =\n | KpiRendererModel\n | ChartRendererModel\n | TableRendererModel\n | TabulatorRendererModel\n | PivotRendererModel\n | TextRendererModel\n | MarkdownRendererModel\n | ImageRendererModel\n | UnknownRendererModel\n | ExtensionRendererModel;\n\nexport type WidgetRenderState =\n | {\n kind: \"loading\";\n skeleton: \"kpi\" | \"chart\" | \"content\";\n message: \"Loading widget\";\n }\n | {\n kind: \"error\";\n message: string;\n hint?: string;\n retryable: boolean;\n }\n | {\n kind: \"notice\";\n message: string;\n }\n | {\n kind: \"ready\";\n refreshing: boolean;\n };\n\nexport interface WidgetRenderResolution {\n state: WidgetRenderState;\n answeredOnce: boolean;\n model?: BasicRendererModel;\n}\n\nexport interface RendererContext {\n filters?: Record<string, unknown>;\n filterLabels?: Record<string, string>;\n widgetDefaults?: WidgetDefaults;\n reducedMotion?: boolean;\n answeredOnce?: boolean;\n loading?: boolean;\n retryable?: boolean;\n registry?: RendererRegistry;\n tableSort?: TableSortState | null;\n tablePage?: number;\n pivotView?: PivotViewState;\n capture?: boolean;\n embedded?: boolean;\n /**\n * True when a host frame already draws the card around the renderer, so the\n * renderer keeps only its inner padding and draws no border, shadow, radius\n * or background of its own.\n */\n framed?: boolean;\n /**\n * False when no host exporter can write Excel files, so renderers hide\n * their Excel button and keep CSV.\n */\n excelExport?: boolean;\n}\n\nexport interface RendererExtensionInput {\n widget: WidgetSpec;\n result: WidgetResult;\n frame: RendererFrame;\n context: RendererContext;\n}\n\nexport type RendererExtension = (input: RendererExtensionInput) => unknown;\n\nexport interface RendererRegistry {\n register(name: string, renderer: RendererExtension): void;\n unregister(name: string): void;\n get(name: string): RendererExtension | undefined;\n}\n\nexport type TabularRendererModel =\n | TabulatorRendererModel\n | ReadyPivotRendererModel;\n\nexport interface TabularGridAdapter<TOutput = unknown> {\n readonly name: string;\n project(model: TabularRendererModel): TOutput;\n}\n","import {\n PIVOT_META_PROP,\n type PivotColumnNode,\n type PivotFieldPayload,\n type PivotGridColumnDefinition,\n type PivotGridColumnGroup,\n type PivotGridRow,\n type PivotGridRowMeta,\n type PivotMeasurePayload,\n type PivotRowPayload,\n type PivotTablePayload,\n} from \"./types.js\";\n\nexport function isPivotColumnGroup(\n definition: PivotGridColumnDefinition,\n): definition is PivotGridColumnGroup {\n return \"children\" in definition;\n}\n\nexport function readPivotPayload(\n result: Record<string, unknown> | undefined,\n): PivotTablePayload | null {\n const pivot = result?.pivot;\n if (typeof pivot !== \"object\" || pivot === null || Array.isArray(pivot)) {\n return null;\n }\n const candidate = pivot as Partial<PivotTablePayload>;\n if (!Array.isArray(candidate.rows) || !Array.isArray(candidate.measures)) {\n return null;\n }\n if (\n !Array.isArray(candidate.column_tree) ||\n !Array.isArray(candidate.row_fields)\n ) {\n return null;\n }\n return pivot as PivotTablePayload;\n}\n\nexport function buildPivotColumns(\n payload: PivotTablePayload,\n collapsedColumns: ReadonlySet<string> = new Set<string>(),\n): PivotGridColumnDefinition[] {\n const rowColumns: PivotGridColumnDefinition[] = payload.row_fields.map(\n (field) => ({\n prop: field.key,\n name: field.label,\n columnKey: null,\n measure: null,\n isTotal: false,\n isRowField: true,\n pinStart: true,\n }),\n );\n return [\n ...rowColumns,\n ...payload.column_tree.map((node) =>\n toColumnDefinition(node, collapsedColumns),\n ),\n ];\n}\n\nfunction toColumnDefinition(\n node: PivotColumnNode,\n collapsedColumns: ReadonlySet<string>,\n): PivotGridColumnDefinition {\n if (node.children.length > 0) {\n const children = visibleChildren(node, collapsedColumns);\n return {\n name: node.label,\n key: node.key,\n foldable: node.children.some((child) => child.is_group_total),\n folded: collapsedColumns.has(node.key),\n leafCount: countValueLeaves(node),\n children: children.map((child) =>\n toColumnDefinition(child, collapsedColumns),\n ),\n };\n }\n return {\n prop: node.column ?? node.key,\n name: node.label,\n columnKey: node.column,\n measure: node.measure,\n isTotal: node.is_total,\n isRowField: false,\n pinStart: false,\n };\n}\n\nfunction countValueLeaves(node: PivotColumnNode): number {\n if (node.children.length === 0) {\n return node.is_group_total || node.is_total ? 0 : 1;\n }\n return node.children.reduce((sum, child) => sum + countValueLeaves(child), 0);\n}\n\nfunction visibleChildren(\n node: PivotColumnNode,\n collapsedColumns: ReadonlySet<string>,\n): PivotColumnNode[] {\n if (!collapsedColumns.has(node.key)) return node.children;\n const totals = node.children.filter((child) => child.is_group_total);\n return totals.length > 0 ? totals : node.children;\n}\n\nexport function pivotColumnGroups(\n payload: PivotTablePayload,\n): PivotFieldPayload[] {\n const groups: PivotFieldPayload[] = [];\n const walk = (nodes: PivotColumnNode[], prefix: string[]): void => {\n for (const node of nodes) {\n if (node.children.length === 0) continue;\n const path = [...prefix, node.label];\n if (node.children.some((child) => child.is_group_total)) {\n groups.push({ key: node.key, label: path.join(\" / \") });\n }\n walk(node.children, path);\n }\n };\n walk(payload.column_tree, []);\n return groups;\n}\n\nexport function pivotValueColumns(\n payload: PivotTablePayload,\n collapsedColumns: ReadonlySet<string> = new Set<string>(),\n): PivotFieldPayload[] {\n const columns: PivotFieldPayload[] = [];\n const walk = (nodes: PivotColumnNode[], prefix: string[]): void => {\n for (const node of nodes) {\n const path = [...prefix, node.label];\n if (node.children.length === 0) {\n if (node.column !== null) {\n columns.push({ key: node.column, label: path.join(\" / \") });\n }\n continue;\n }\n walk(visibleChildren(node, collapsedColumns), path);\n }\n };\n walk(payload.column_tree, []);\n return columns;\n}\n\nexport function buildPivotRows(\n payload: PivotTablePayload,\n rows: PivotRowPayload[] = payload.rows,\n): PivotGridRow[] {\n const fields = payload.row_fields.map((field) => field.key);\n const spellOutPath = payload.subtotals === \"none\";\n return rows.map((row) =>\n toGridRow(row, fields, spellOutPath, payload.column_keys),\n );\n}\n\nexport function buildPivotTotalRow(\n payload: PivotTablePayload,\n): PivotGridRow | null {\n if (payload.total_row === null) return null;\n const fields = payload.row_fields.map((field) => field.key);\n return toGridRow(payload.total_row, fields, false, payload.column_keys);\n}\n\nexport function pivotRowFilters(\n payload: PivotTablePayload,\n meta: PivotGridRowMeta,\n): Record<string, string> {\n const filters: Record<string, string> = {};\n payload.row_fields.forEach((field, index) => {\n const value = meta.path[index];\n if (value !== undefined) filters[field.key] = value;\n });\n return filters;\n}\n\nexport function pivotColumnFilters(\n payload: PivotTablePayload,\n prop: string,\n): Record<string, string> | null {\n const walk = (\n nodes: PivotColumnNode[],\n path: string[],\n ): Record<string, string> | null => {\n for (const node of nodes) {\n if (node.children.length === 0) {\n if (node.column !== prop) continue;\n if (node.is_total) return {};\n const filters: Record<string, string> = {};\n payload.column_fields.forEach((field, index) => {\n const value = path[index];\n if (value !== undefined) filters[field.key] = value;\n });\n return filters;\n }\n const found = walk(\n node.children,\n node.is_total ? path : [...path, node.label],\n );\n if (found !== null) return found;\n }\n return null;\n };\n return walk(payload.column_tree, []);\n}\n\nfunction toGridRow(\n row: PivotRowPayload,\n fields: string[],\n spellOutPath: boolean,\n columnKeys: string[],\n): PivotGridRow {\n const meta: PivotGridRowMeta = {\n key: row.key,\n label: row.label,\n path: row.path,\n depth: row.depth,\n kind: row.kind,\n };\n const grid: PivotGridRow = { [PIVOT_META_PROP]: meta };\n fields.forEach((field, index) => {\n if (row.kind === \"grand_total\" || row.kind === \"other\") {\n grid[field] = index === 0 ? row.label : \"\";\n return;\n }\n if (spellOutPath) {\n grid[field] = row.path[index] ?? \"\";\n return;\n }\n grid[field] = index === row.depth ? row.label : \"\";\n });\n for (const key of columnKeys) {\n const value = row.cells[key];\n grid[key] = value === undefined ? null : value;\n }\n return grid;\n}\n\nexport function pivotMeasuresByKey(\n payload: PivotTablePayload,\n): Map<string, PivotMeasurePayload> {\n return new Map(payload.measures.map((measure) => [measure.key, measure]));\n}\n\nexport function pivotRowMeta(\n row: Record<string, unknown> | undefined,\n): PivotGridRowMeta | null {\n const meta = row?.[PIVOT_META_PROP];\n if (typeof meta !== \"object\" || meta === null || Array.isArray(meta)) {\n return null;\n }\n const candidate = meta as Partial<PivotGridRowMeta>;\n if (\n typeof candidate.depth !== \"number\" ||\n typeof candidate.kind !== \"string\"\n ) {\n return null;\n }\n return meta as PivotGridRowMeta;\n}\n\nexport function formatPivotValue(\n value: unknown,\n measure: PivotMeasurePayload | undefined,\n emptyValue: string,\n): string {\n if (value === null || value === undefined || value === \"\") return emptyValue;\n const number = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(number)) return emptyValue;\n const format = measure?.format ?? \"number\";\n const decimals = measure?.decimals ?? undefined;\n if (format === \"currency\") {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: decimals ?? 0,\n maximumFractionDigits: decimals ?? 0,\n }).format(number);\n }\n if (format === \"percent\") {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"percent\",\n minimumFractionDigits: decimals ?? 1,\n maximumFractionDigits: decimals ?? 1,\n }).format(number);\n }\n return new Intl.NumberFormat(\"en-US\", {\n minimumFractionDigits: decimals ?? 0,\n maximumFractionDigits: decimals ?? (Number.isInteger(number) ? 0 : 2),\n }).format(number);\n}\n\nexport function pivotHeatmapIntensity(\n value: unknown,\n range: { min: number; max: number } | undefined,\n): number | null {\n if (range === undefined) return null;\n if (typeof value !== \"number\" || !Number.isFinite(value)) return null;\n const span = range.max - range.min;\n if (span <= 0) return null;\n const ratio = (value - range.min) / span;\n return Math.min(1, Math.max(0, ratio));\n}\n\nexport function pivotTruncationNote(payload: PivotTablePayload): string | null {\n const notes: string[] = [];\n if (payload.truncated.row_groups > 0) {\n const shown =\n payload.truncated.row_groups_total - payload.truncated.row_groups;\n const rolled =\n payload.truncated.rolled_up > 0\n ? `, with ${payload.truncated.rolled_up} in Other`\n : \"\";\n notes.push(\n `${shown} of ${payload.truncated.row_groups_total} row groups${rolled}`,\n );\n }\n if (payload.truncated.columns > 0) {\n const shown = payload.truncated.columns_total - payload.truncated.columns;\n notes.push(`${shown} of ${payload.truncated.columns_total} columns`);\n }\n return notes.length > 0 ? `Showing ${notes.join(\" and \")}.` : null;\n}\n","import type {\n PivotColumnFilter,\n PivotColumnNode,\n PivotDirection,\n PivotRowPayload,\n PivotSortState,\n PivotTablePayload,\n PivotViewState,\n} from \"./types.js\";\n\ninterface PivotNode {\n row: PivotRowPayload;\n children: PivotNode[];\n}\n\nexport function initialPivotViewState(\n payload: PivotTablePayload,\n capture = false,\n): PivotViewState {\n return {\n collapsed: initialCollapsed(payload, capture),\n collapsedColumns: initialCollapsedColumns(payload, capture),\n search: \"\",\n filters: {},\n sort: null,\n };\n}\n\nfunction initialCollapsed(\n payload: PivotTablePayload,\n capture: boolean,\n): Set<string> {\n if (capture && typeof payload.snapshot_expand === \"number\") {\n return new Set(\n payload.rows\n .filter(\n (row) =>\n row.kind === \"group\" && row.depth >= payload.snapshot_expand!,\n )\n .map((row) => row.key),\n );\n }\n return payload.subtotals === \"collapsed\"\n ? new Set(pivotGroupKeys(payload))\n : new Set<string>();\n}\n\nfunction initialCollapsedColumns(\n payload: PivotTablePayload,\n capture: boolean,\n): Set<string> {\n if (!capture || typeof payload.snapshot_expand_columns !== \"number\") {\n return new Set<string>();\n }\n const open = payload.snapshot_expand_columns;\n const folded = new Set<string>();\n const walk = (nodes: PivotColumnNode[], level: number): void => {\n for (const node of nodes) {\n if (node.children.length === 0 || node.is_total) continue;\n if (\n level >= open &&\n node.children.some((child) => child.is_group_total)\n ) {\n folded.add(node.key);\n continue;\n }\n walk(node.children, level + 1);\n }\n };\n walk(payload.column_tree, 0);\n return folded;\n}\n\nexport function pivotOpenRowLevels(\n payload: PivotTablePayload,\n state: PivotViewState,\n): number | null {\n if (state.collapsed.size === 0) return null;\n let shallowest: number | null = null;\n for (const row of payload.rows) {\n if (row.kind !== \"group\" || !state.collapsed.has(row.key)) continue;\n if (shallowest === null || row.depth < shallowest) {\n shallowest = row.depth;\n }\n }\n return shallowest;\n}\n\nexport function pivotOpenColumnLevels(\n payload: PivotTablePayload,\n state: PivotViewState,\n): number | null {\n if (state.collapsedColumns.size === 0) return null;\n let shallowest: number | null = null;\n const walk = (nodes: PivotColumnNode[], level: number): void => {\n for (const node of nodes) {\n if (node.children.length === 0 || node.is_total) continue;\n if (state.collapsedColumns.has(node.key)) {\n if (shallowest === null || level < shallowest) shallowest = level;\n continue;\n }\n walk(node.children, level + 1);\n }\n };\n walk(payload.column_tree, 0);\n return shallowest;\n}\n\nexport function pivotSignature(payload: PivotTablePayload): string {\n return [\n payload.row_fields.map((field) => field.key).join(\",\"),\n payload.column_fields.map((field) => field.key).join(\",\"),\n payload.measures.map((measure) => measure.key).join(\",\"),\n payload.subtotals,\n ].join(\"|\");\n}\n\nexport function pivotGroupKeys(payload: PivotTablePayload): string[] {\n return payload.rows\n .filter((row) => row.kind === \"group\")\n .map((row) => row.key);\n}\n\nexport function pivotHasGroups(payload: PivotTablePayload): boolean {\n return payload.rows.some((row) => row.kind === \"group\");\n}\n\nexport function pivotFilterCount(state: PivotViewState): number {\n return Object.keys(state.filters).length;\n}\n\nexport function setPivotColumnFilter(\n filters: Readonly<Record<string, PivotColumnFilter>>,\n column: string,\n filter: PivotColumnFilter | null,\n): Record<string, PivotColumnFilter> {\n const next = { ...filters };\n if (filter === null) {\n delete next[column];\n } else {\n next[column] = filter;\n }\n return next;\n}\n\nexport function pivotFilterKeeps(\n value: number,\n filter: PivotColumnFilter,\n): boolean {\n switch (filter.op) {\n case \"gte\":\n return value >= filter.value;\n case \"gt\":\n return value > filter.value;\n case \"eq\":\n return value === filter.value;\n case \"lte\":\n return value <= filter.value;\n case \"lt\":\n return value < filter.value;\n }\n}\n\nexport function pivotVisibleRows(\n payload: PivotTablePayload,\n state: PivotViewState,\n): PivotRowPayload[] {\n const tree = pivotTree(payload.rows);\n const sorted =\n state.sort === null ? tree : sortNodes(tree, state.sort, payload);\n const kept = filterNodes(sorted, state);\n const visible: PivotRowPayload[] = [];\n collect(kept, state.collapsed, visible);\n return visible;\n}\n\nexport function pivotSortDirection(\n state: PivotViewState,\n payload: PivotTablePayload,\n column: string,\n): PivotDirection | null {\n if (state.sort !== null) {\n return state.sort.column === column ? state.sort.direction : null;\n }\n return payload.sort.column === column ? payload.sort.direction : null;\n}\n\nexport function nextPivotSort(\n state: PivotViewState,\n payload: PivotTablePayload,\n column: string,\n): PivotSortState | null {\n const first: PivotDirection = payload.column_keys.includes(column)\n ? \"desc\"\n : \"asc\";\n if (state.sort?.column !== column) return { column, direction: first };\n if (state.sort.direction === first) {\n return { column, direction: first === \"asc\" ? \"desc\" : \"asc\" };\n }\n return null;\n}\n\nexport function togglePivotGroup(\n collapsed: ReadonlySet<string>,\n key: string,\n): Set<string> {\n const next = new Set(collapsed);\n if (!next.delete(key)) next.add(key);\n return next;\n}\n\nfunction pivotTree(rows: PivotRowPayload[]): PivotNode[] {\n const roots: PivotNode[] = [];\n const openByDepth = new Map<number, PivotNode>();\n for (const row of rows) {\n const node: PivotNode = { row, children: [] };\n const parent = row.depth > 0 ? openByDepth.get(row.depth - 1) : undefined;\n if (parent === undefined) {\n roots.push(node);\n } else {\n parent.children.push(node);\n }\n if (row.kind === \"group\") openByDepth.set(row.depth, node);\n }\n return roots;\n}\n\nfunction sortNodes(\n nodes: PivotNode[],\n sort: PivotSortState,\n payload: PivotTablePayload,\n): PivotNode[] {\n const isValue = payload.column_keys.includes(sort.column);\n const rank = payload.row_fields.findIndex(\n (field) => field.key === sort.column,\n );\n const ordered = [...nodes].sort((left, right) =>\n isValue\n ? compareValues(\n left.row.cells[sort.column],\n right.row.cells[sort.column],\n sort.direction,\n )\n : compareLabels(left.row, right.row, rank, sort.direction),\n );\n return ordered.map((node) => ({\n row: node.row,\n children: sortNodes(node.children, sort, payload),\n }));\n}\n\nfunction compareValues(\n left: number | null | undefined,\n right: number | null | undefined,\n direction: PivotDirection,\n): number {\n const missing = (value: number | null | undefined) =>\n value === null || value === undefined || !Number.isFinite(value);\n if (missing(left) && missing(right)) return 0;\n if (missing(left)) return 1;\n if (missing(right)) return -1;\n const difference = left! - right!;\n return direction === \"desc\" ? -difference : difference;\n}\n\nfunction compareLabels(\n left: PivotRowPayload,\n right: PivotRowPayload,\n rank: number,\n direction: PivotDirection,\n): number {\n const at = rank >= 0 ? rank : Math.max(left.depth, 0);\n const a = left.path[at] ?? left.label;\n const b = right.path[at] ?? right.label;\n const order = a.localeCompare(b, undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n return direction === \"desc\" ? -order : order;\n}\n\nfunction filterNodes(nodes: PivotNode[], state: PivotViewState): PivotNode[] {\n const query = state.search.trim().toLowerCase();\n const filters = Object.entries(state.filters);\n if (query === \"\" && filters.length === 0) return nodes;\n\n const keep = (node: PivotNode): PivotNode | null => {\n const children = node.children\n .map(keep)\n .filter((child): child is PivotNode => child !== null);\n if (children.length > 0) return { row: node.row, children };\n if (node.row.kind === \"group\") return null;\n if (query !== \"\" && !matchesQuery(node.row, query)) return null;\n for (const [column, filter] of filters) {\n const value = node.row.cells[column];\n if (typeof value !== \"number\" || !pivotFilterKeeps(value, filter)) {\n return null;\n }\n }\n return { row: node.row, children: [] };\n };\n\n return nodes.map(keep).filter((node): node is PivotNode => node !== null);\n}\n\nfunction matchesQuery(row: PivotRowPayload, query: string): boolean {\n return row.path.some((label) => label.toLowerCase().includes(query));\n}\n\nfunction collect(\n nodes: PivotNode[],\n collapsed: ReadonlySet<string>,\n into: PivotRowPayload[],\n): void {\n for (const node of nodes) {\n into.push(node.row);\n if (collapsed.has(node.row.key)) continue;\n collect(node.children, collapsed, into);\n }\n}\n","import { getClickInteraction } from \"@dlh.io/bideux-dashboard-core\";\n\nimport {\n buildPivotColumns,\n buildPivotRows,\n buildPivotTotalRow,\n formatPivotValue,\n pivotColumnFilters,\n pivotColumnGroups,\n pivotHeatmapIntensity,\n pivotMeasuresByKey,\n pivotRowFilters,\n pivotTruncationNote,\n pivotValueColumns,\n readPivotPayload,\n} from \"./pivot-columns.js\";\nimport {\n initialPivotViewState,\n pivotFilterCount,\n pivotGroupKeys,\n pivotHasGroups,\n pivotOpenColumnLevels,\n pivotOpenRowLevels,\n pivotVisibleRows,\n} from \"./pivot-view.js\";\nimport { tableExportModel } from \"./table-model.js\";\nimport { rendererFrame } from \"./theme.js\";\nimport type {\n MissingPivotRendererModel,\n PivotCellAction,\n PivotCellPresentation,\n PivotGridColumn,\n PivotGridRowMeta,\n PivotRendererModel,\n ReadyPivotRendererModel,\n RendererContext,\n WidgetResult,\n WidgetSpec,\n} from \"./types.js\";\n\nexport function buildPivotRendererModel(\n widget: WidgetSpec,\n result: WidgetResult,\n context: RendererContext = {},\n): PivotRendererModel {\n const frame = rendererFrame(\n widget,\n \"pivot_table\",\n context.widgetDefaults,\n context.framed,\n );\n const payload = readPivotPayload(result);\n if (payload === null) {\n const missing: MissingPivotRendererModel = {\n kind: \"pivot\",\n status: \"missing\",\n frame,\n message: \"This widget did not return a pivot table.\",\n };\n return missing;\n }\n\n const view =\n context.pivotView ?? initialPivotViewState(payload, context.capture);\n const visibleRows = pivotVisibleRows(payload, view);\n const ready: ReadyPivotRendererModel = {\n kind: \"pivot\",\n status: \"ready\",\n frame,\n payload,\n view,\n columns: buildPivotColumns(payload, view.collapsedColumns),\n rows: buildPivotRows(payload, visibleRows),\n totalRow: buildPivotTotalRow(payload),\n valueColumns: pivotValueColumns(payload, view.collapsedColumns),\n columnGroups: pivotColumnGroups(payload),\n truncation: pivotTruncationNote(payload),\n controls: {\n searchPlaceholder: \"Search rows\",\n expandable: pivotHasGroups(payload),\n groupCount: pivotGroupKeys(payload).length,\n filterCount: pivotFilterCount(view),\n reordered: view.sort !== null,\n canFilter: true,\n canRearrange: false,\n embedded: context.embedded === true,\n },\n exports: tableExportModel(\n typeof widget.spec.display === \"object\" &&\n widget.spec.display !== null &&\n !Array.isArray(widget.spec.display) &&\n typeof widget.spec.display.pivot_table === \"object\" &&\n widget.spec.display.pivot_table !== null &&\n !Array.isArray(widget.spec.display.pivot_table)\n ? widget.spec.display.pivot_table\n : {},\n widget.metadata.name,\n context.excelExport !== false,\n ),\n openLevels: {\n rows: pivotOpenRowLevels(payload, view),\n columns: pivotOpenColumnLevels(payload, view),\n },\n };\n return ready;\n}\n\nexport function pivotCellPresentation(\n model: ReadyPivotRendererModel,\n row: Record<string, unknown>,\n column: PivotGridColumn,\n): PivotCellPresentation {\n if (column.isRowField) {\n return {\n text: String(row[column.prop] ?? \"\"),\n align: \"left\",\n emphasized: false,\n heatmapIntensity: null,\n };\n }\n const meta = row.__pivotMeta as PivotGridRowMeta | undefined;\n const value = row[column.prop];\n const measure = pivotMeasuresByKey(model.payload).get(column.measure ?? \"\");\n const shade =\n model.payload.heatmap_measure !== null &&\n column.measure === model.payload.heatmap_measure &&\n column.columnKey !== null &&\n !column.isTotal &&\n meta?.kind !== \"group\" &&\n meta?.kind !== \"grand_total\"\n ? pivotHeatmapIntensity(\n value,\n model.payload.value_range[column.measure ?? \"\"],\n )\n : null;\n return {\n text: formatPivotValue(value, measure, model.payload.empty_value),\n align: \"right\",\n emphasized:\n column.isTotal || meta?.kind === \"group\" || meta?.kind === \"grand_total\",\n heatmapIntensity: shade,\n };\n}\n\nexport function pivotCellAction(\n model: ReadyPivotRendererModel,\n widget: WidgetSpec,\n row: PivotGridRowMeta,\n column: PivotGridColumn,\n value: unknown,\n detailAvailable = true,\n): PivotCellAction | null {\n if (column.isRowField && row.kind === \"group\") {\n return { kind: \"toggle-row-group\", key: row.key };\n }\n const columnFilters =\n column.columnKey === null\n ? null\n : pivotColumnFilters(model.payload, column.columnKey);\n const interaction = getClickInteraction(widget);\n if (interaction !== undefined) {\n return {\n kind: \"interaction\",\n interaction,\n context: {\n widgetId: widget.metadata.id,\n data: {\n ...pivotRowFilters(model.payload, row),\n ...(columnFilters ?? {}),\n column: column.columnKey,\n },\n value,\n },\n };\n }\n if (\n !detailAvailable ||\n columnFilters === null ||\n row.kind === \"other\" ||\n row.kind === \"grand_total\"\n ) {\n return null;\n }\n const rowFilters = pivotRowFilters(model.payload, row);\n const labelParts = [...row.path];\n const columnLabel =\n column.columnKey === null\n ? undefined\n : model.payload.column_labels[column.columnKey];\n if (columnLabel !== undefined) labelParts.push(columnLabel);\n return {\n kind: \"detail\",\n filters: { ...rowFilters, ...columnFilters },\n label: labelParts.join(\" / \"),\n };\n}\n"]}
|
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import { defaultTabId, dashboardTabs, readerRendererContext, buildReaderGrid, tabWidgetIds, isPanelledControl } from './chunk-IMNUQGHE.js';
|
|
2
|
+
import { createNativeWidgetRenderer, buildWidgetRendererModel } from './chunk-RRWZKNDZ.js';
|
|
3
|
+
import { observeElementResize } from './chunk-HPFHIZWO.js';
|
|
4
|
+
import { resolveRendererTheme, clearElement, setStyles, createMessage } from './chunk-75CRTQK7.js';
|
|
5
|
+
|
|
6
|
+
// ../dashboard-spec/src/index.ts
|
|
7
|
+
var documentVersion = "1.0";
|
|
8
|
+
var documentKinds = ["dashboard", "semantic_model", "widget"];
|
|
9
|
+
|
|
10
|
+
// ../dashboard-core/src/pivot-expand-values.ts
|
|
11
|
+
var OPEN_ALL = "all";
|
|
12
|
+
var WIDGET_SETTING = "widget";
|
|
13
|
+
function defaultPivotExpand(pivots) {
|
|
14
|
+
const values = {};
|
|
15
|
+
for (const pivot of pivots) {
|
|
16
|
+
values[pivot.id] = { rows: OPEN_ALL, columns: OPEN_ALL };
|
|
17
|
+
}
|
|
18
|
+
return values;
|
|
19
|
+
}
|
|
20
|
+
function currentViewPivotExpand(pivots, readPivotOpenLevels = () => void 0) {
|
|
21
|
+
const values = {};
|
|
22
|
+
for (const pivot of pivots) {
|
|
23
|
+
const open = readPivotOpenLevels(pivot.id);
|
|
24
|
+
values[pivot.id] = {
|
|
25
|
+
rows: axisValue(open?.rows ?? null, pivot.row_levels),
|
|
26
|
+
columns: axisValue(open?.columns ?? null, pivot.column_levels)
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return values;
|
|
30
|
+
}
|
|
31
|
+
function axisValue(levels, levelCount) {
|
|
32
|
+
if (levels === null || levels >= levelCount) return OPEN_ALL;
|
|
33
|
+
return String(Math.max(0, levels));
|
|
34
|
+
}
|
|
35
|
+
function readPivotExpand(stored, pivots) {
|
|
36
|
+
const values = {};
|
|
37
|
+
for (const pivot of pivots) {
|
|
38
|
+
const entry = stored?.[pivot.id];
|
|
39
|
+
if (typeof entry === "number") {
|
|
40
|
+
values[pivot.id] = {
|
|
41
|
+
rows: axisValue(entry, pivot.row_levels),
|
|
42
|
+
columns: WIDGET_SETTING
|
|
43
|
+
};
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
values[pivot.id] = {
|
|
47
|
+
rows: typeof entry?.rows === "number" ? axisValue(entry.rows, pivot.row_levels) : WIDGET_SETTING,
|
|
48
|
+
columns: typeof entry?.columns === "number" ? axisValue(entry.columns, pivot.column_levels) : WIDGET_SETTING
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return values;
|
|
52
|
+
}
|
|
53
|
+
function axisLevels(raw, levelCount) {
|
|
54
|
+
if (raw === void 0 || raw === WIDGET_SETTING) return null;
|
|
55
|
+
if (raw === OPEN_ALL) return levelCount;
|
|
56
|
+
const levels = Number(raw);
|
|
57
|
+
if (!Number.isInteger(levels) || levels < 0) return null;
|
|
58
|
+
return Math.min(levels, levelCount);
|
|
59
|
+
}
|
|
60
|
+
function cleanPivotExpand(values, pivots) {
|
|
61
|
+
const cleaned = {};
|
|
62
|
+
for (const pivot of pivots) {
|
|
63
|
+
const axes = values[pivot.id] ?? { rows: OPEN_ALL, columns: OPEN_ALL };
|
|
64
|
+
const rows = axisLevels(axes.rows, pivot.row_levels);
|
|
65
|
+
const columns = pivot.column_levels > 0 ? axisLevels(axes.columns, pivot.column_levels) : null;
|
|
66
|
+
if (rows === null && columns === null) continue;
|
|
67
|
+
cleaned[pivot.id] = {
|
|
68
|
+
...rows !== null ? { rows } : {},
|
|
69
|
+
...columns !== null ? { columns } : {}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return Object.keys(cleaned).length > 0 ? cleaned : void 0;
|
|
73
|
+
}
|
|
74
|
+
function pivotExpandError(pivots, values) {
|
|
75
|
+
for (const pivot of pivots) {
|
|
76
|
+
const axes = values[pivot.id];
|
|
77
|
+
if (!axes) continue;
|
|
78
|
+
for (const raw of [axes.rows, axes.columns]) {
|
|
79
|
+
if (raw === OPEN_ALL || raw === WIDGET_SETTING) continue;
|
|
80
|
+
const levels = Number(raw);
|
|
81
|
+
if (!Number.isInteger(levels) || levels < 0) {
|
|
82
|
+
return `Levels open for "${pivot.name}" must be a whole number of levels`;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// ../dashboard-renderers/src/grid-adapter.ts
|
|
90
|
+
function projectTabularGrid(model, adapter) {
|
|
91
|
+
return adapter.project(model);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ../dashboard-renderers/src/pivot-registry.ts
|
|
95
|
+
function createPivotOpenLevelsRegistry() {
|
|
96
|
+
const values = /* @__PURE__ */ new Map();
|
|
97
|
+
return {
|
|
98
|
+
publish(widgetId, levels) {
|
|
99
|
+
values.set(widgetId, levels);
|
|
100
|
+
},
|
|
101
|
+
clear(widgetId) {
|
|
102
|
+
values.delete(widgetId);
|
|
103
|
+
},
|
|
104
|
+
read(widgetId) {
|
|
105
|
+
return values.get(widgetId) ?? null;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// ../dashboard-renderers/src/registry.ts
|
|
111
|
+
function createRendererRegistry(initial = {}) {
|
|
112
|
+
const renderers = new Map(Object.entries(initial));
|
|
113
|
+
return {
|
|
114
|
+
register(name, renderer) {
|
|
115
|
+
renderers.set(name, renderer);
|
|
116
|
+
},
|
|
117
|
+
unregister(name) {
|
|
118
|
+
renderers.delete(name);
|
|
119
|
+
},
|
|
120
|
+
get(name) {
|
|
121
|
+
return renderers.get(name);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// ../dashboard-renderer-web/src/widget-factory.ts
|
|
127
|
+
function createNativeWidgetFactory() {
|
|
128
|
+
return (input) => createNativeWidgetRenderer(input);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ../dashboard-renderer-web/src/reader-shell.ts
|
|
132
|
+
var MOUNTED_KINDS = /* @__PURE__ */ new Set(["chart", "table", "pivot"]);
|
|
133
|
+
function rendererKind(widget, result, context) {
|
|
134
|
+
const resolution = buildWidgetRendererModel(widget, result, context);
|
|
135
|
+
return resolution.model?.kind ?? "unknown";
|
|
136
|
+
}
|
|
137
|
+
function pickFactory(renderers, widget, result, context, native) {
|
|
138
|
+
const component = String(widget.spec.component ?? "unknown");
|
|
139
|
+
const byComponent = renderers[component];
|
|
140
|
+
if (byComponent !== void 0) return byComponent;
|
|
141
|
+
const kind = rendererKind(widget, result, context);
|
|
142
|
+
const byKind = renderers[kind];
|
|
143
|
+
if (byKind !== void 0) return byKind;
|
|
144
|
+
if (MOUNTED_KINDS.has(kind)) {
|
|
145
|
+
const fallback = renderers.default;
|
|
146
|
+
if (fallback !== void 0) return fallback;
|
|
147
|
+
}
|
|
148
|
+
return native;
|
|
149
|
+
}
|
|
150
|
+
function tileWidgets(dashboard, widgets, activeTabId) {
|
|
151
|
+
const tabs = dashboardTabs(dashboard);
|
|
152
|
+
if (tabs.length === 0) return widgets;
|
|
153
|
+
const tab = tabs.find((entry) => entry.id === activeTabId) ?? tabs[0];
|
|
154
|
+
if (tab === void 0) return widgets;
|
|
155
|
+
const ids = new Set(tabWidgetIds(tab));
|
|
156
|
+
const out = {};
|
|
157
|
+
for (const [id, widget] of Object.entries(widgets)) {
|
|
158
|
+
if (ids.has(id)) out[id] = widget;
|
|
159
|
+
}
|
|
160
|
+
return out;
|
|
161
|
+
}
|
|
162
|
+
function panelledWidgets(dashboard, widgets) {
|
|
163
|
+
return Object.values(widgets).filter(
|
|
164
|
+
(widget) => isPanelledControl(widget, dashboard)
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
function styleTabButton(button, active, tokens) {
|
|
168
|
+
setStyles(button, {
|
|
169
|
+
padding: "6px 12px",
|
|
170
|
+
border: `1px solid ${tokens.border}`,
|
|
171
|
+
"border-radius": "999px",
|
|
172
|
+
background: active ? tokens.primary : tokens.surface,
|
|
173
|
+
color: active ? tokens.surface : tokens.surfaceForeground,
|
|
174
|
+
"font-family": tokens.fontFamily,
|
|
175
|
+
"font-size": "0.85rem",
|
|
176
|
+
cursor: "pointer"
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function mountDashboardReader(input) {
|
|
180
|
+
const document = input.element.ownerDocument;
|
|
181
|
+
const native = createNativeWidgetFactory();
|
|
182
|
+
let current = input;
|
|
183
|
+
let tokens = resolveRendererTheme(input.theme);
|
|
184
|
+
let active = input.activeTabId ?? defaultTabId(dashboardTabs(input.dashboard));
|
|
185
|
+
let tiles = [];
|
|
186
|
+
let attachment = null;
|
|
187
|
+
let destroyed = false;
|
|
188
|
+
const root = input.element;
|
|
189
|
+
clearElement(root);
|
|
190
|
+
setStyles(root, {
|
|
191
|
+
"box-sizing": "border-box",
|
|
192
|
+
display: "flex",
|
|
193
|
+
"flex-direction": "column",
|
|
194
|
+
gap: "12px",
|
|
195
|
+
width: "100%",
|
|
196
|
+
"font-family": tokens.fontFamily,
|
|
197
|
+
color: tokens.foreground
|
|
198
|
+
});
|
|
199
|
+
root.dataset.bideuxReader = "true";
|
|
200
|
+
const header = document.createElement("header");
|
|
201
|
+
header.dataset.readerPart = "header";
|
|
202
|
+
const title = document.createElement("h1");
|
|
203
|
+
setStyles(title, { margin: "0", "font-size": "1.25rem" });
|
|
204
|
+
title.dataset.readerPart = "title";
|
|
205
|
+
header.append(title);
|
|
206
|
+
const tabBar = document.createElement("nav");
|
|
207
|
+
tabBar.dataset.readerPart = "tabs";
|
|
208
|
+
setStyles(tabBar, { display: "flex", gap: "8px", "flex-wrap": "wrap" });
|
|
209
|
+
const panel = document.createElement("section");
|
|
210
|
+
panel.dataset.readerPart = "filter-panel";
|
|
211
|
+
setStyles(panel, {
|
|
212
|
+
display: "flex",
|
|
213
|
+
gap: "12px",
|
|
214
|
+
"flex-wrap": "wrap",
|
|
215
|
+
"align-items": "flex-end"
|
|
216
|
+
});
|
|
217
|
+
const canvas = document.createElement("div");
|
|
218
|
+
canvas.dataset.readerPart = "canvas";
|
|
219
|
+
setStyles(canvas, { position: "relative", width: "100%" });
|
|
220
|
+
root.append(header, tabBar, panel, canvas);
|
|
221
|
+
const disposeTiles = () => {
|
|
222
|
+
for (const tile of tiles) {
|
|
223
|
+
tile.disposed = true;
|
|
224
|
+
tile.handle?.destroy();
|
|
225
|
+
}
|
|
226
|
+
tiles = [];
|
|
227
|
+
};
|
|
228
|
+
const mountTile = (parent, widget, result, context) => {
|
|
229
|
+
const host = document.createElement("div");
|
|
230
|
+
setStyles(host, { width: "100%", height: "100%", "min-height": "0" });
|
|
231
|
+
host.dataset.widgetHost = widget.metadata.id;
|
|
232
|
+
parent.append(host);
|
|
233
|
+
const component = String(widget.spec.component ?? "unknown");
|
|
234
|
+
const tile = {
|
|
235
|
+
widgetId: widget.metadata.id,
|
|
236
|
+
element: host,
|
|
237
|
+
component,
|
|
238
|
+
disposed: false
|
|
239
|
+
};
|
|
240
|
+
tiles.push(tile);
|
|
241
|
+
const mountInput = {
|
|
242
|
+
element: host,
|
|
243
|
+
widget,
|
|
244
|
+
result,
|
|
245
|
+
context,
|
|
246
|
+
...current.filters === void 0 ? {} : { filterValue: current.filters[widget.metadata.id] },
|
|
247
|
+
...current.callbacks === void 0 ? {} : { callbacks: current.callbacks },
|
|
248
|
+
...current.theme === void 0 ? {} : { theme: current.theme }
|
|
249
|
+
};
|
|
250
|
+
const factory = pickFactory(
|
|
251
|
+
current.renderers ?? {},
|
|
252
|
+
widget,
|
|
253
|
+
result,
|
|
254
|
+
context,
|
|
255
|
+
native
|
|
256
|
+
);
|
|
257
|
+
let handle;
|
|
258
|
+
try {
|
|
259
|
+
handle = factory(mountInput);
|
|
260
|
+
} catch (error) {
|
|
261
|
+
const message = error instanceof Error ? error.message : "Rendering failed";
|
|
262
|
+
clearElement(host);
|
|
263
|
+
host.append(createMessage(document, message, "error", tokens));
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
if (handle instanceof Promise) {
|
|
267
|
+
void handle.then(
|
|
268
|
+
(resolved) => {
|
|
269
|
+
if (tile.disposed) {
|
|
270
|
+
resolved.destroy();
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
tile.handle = resolved;
|
|
274
|
+
},
|
|
275
|
+
(error) => {
|
|
276
|
+
if (tile.disposed) return;
|
|
277
|
+
const message = error instanceof Error ? error.message : "Rendering failed";
|
|
278
|
+
clearElement(host);
|
|
279
|
+
host.append(createMessage(document, message, "error", tokens));
|
|
280
|
+
}
|
|
281
|
+
);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
tile.handle = handle;
|
|
285
|
+
};
|
|
286
|
+
const draw = () => {
|
|
287
|
+
if (destroyed) return;
|
|
288
|
+
tokens = resolveRendererTheme(current.theme);
|
|
289
|
+
const dashboard = current.dashboard;
|
|
290
|
+
const results = current.results ?? {};
|
|
291
|
+
const context = {
|
|
292
|
+
...readerRendererContext(dashboard),
|
|
293
|
+
...current.filters === void 0 ? {} : { filters: current.filters }
|
|
294
|
+
};
|
|
295
|
+
title.textContent = dashboard.metadata.name ?? dashboard.metadata.id;
|
|
296
|
+
const tabs = dashboardTabs(dashboard);
|
|
297
|
+
clearElement(tabBar);
|
|
298
|
+
tabBar.style.display = tabs.length > 1 ? "flex" : "none";
|
|
299
|
+
for (const tab of tabs) {
|
|
300
|
+
const button = document.createElement("button");
|
|
301
|
+
button.type = "button";
|
|
302
|
+
button.textContent = tab.label ?? tab.id;
|
|
303
|
+
button.dataset.readerTab = tab.id;
|
|
304
|
+
const isActive = tab.id === active;
|
|
305
|
+
if (isActive) button.dataset.active = "true";
|
|
306
|
+
styleTabButton(button, isActive, tokens);
|
|
307
|
+
button.addEventListener("click", () => {
|
|
308
|
+
if (active === tab.id) return;
|
|
309
|
+
active = tab.id;
|
|
310
|
+
current.onTabChange?.(tab.id);
|
|
311
|
+
draw();
|
|
312
|
+
});
|
|
313
|
+
tabBar.append(button);
|
|
314
|
+
}
|
|
315
|
+
disposeTiles();
|
|
316
|
+
clearElement(panel);
|
|
317
|
+
clearElement(canvas);
|
|
318
|
+
const visible = tileWidgets(dashboard, current.widgets, active);
|
|
319
|
+
const panelled = panelledWidgets(dashboard, visible);
|
|
320
|
+
panel.style.display = panelled.length === 0 ? "none" : "flex";
|
|
321
|
+
for (const widget of panelled) {
|
|
322
|
+
const slot = document.createElement("div");
|
|
323
|
+
slot.dataset.filterSlot = widget.metadata.id;
|
|
324
|
+
setStyles(slot, { "min-width": "180px" });
|
|
325
|
+
panel.append(slot);
|
|
326
|
+
mountTile(slot, widget, results[widget.metadata.id] ?? {}, context);
|
|
327
|
+
}
|
|
328
|
+
const width = current.viewportWidth ?? (canvas.clientWidth > 0 ? canvas.clientWidth : 1200);
|
|
329
|
+
const grid = buildReaderGrid({ dashboard, widgets: visible, width });
|
|
330
|
+
canvas.dataset.layoutKey = grid.layoutKey;
|
|
331
|
+
canvas.dataset.breakpoint = grid.breakpoint;
|
|
332
|
+
setStyles(canvas, { height: `${grid.height}px` });
|
|
333
|
+
const loading = new Set(current.loadingWidgetIds ?? []);
|
|
334
|
+
for (const tile of grid.tiles) {
|
|
335
|
+
const widget = visible[tile.widgetId];
|
|
336
|
+
if (widget === void 0) continue;
|
|
337
|
+
const cell = document.createElement("div");
|
|
338
|
+
cell.dataset.gridItem = tile.widgetId;
|
|
339
|
+
setStyles(cell, {
|
|
340
|
+
position: "absolute",
|
|
341
|
+
left: `${tile.left}px`,
|
|
342
|
+
top: `${tile.top}px`,
|
|
343
|
+
width: `${tile.width}px`,
|
|
344
|
+
height: `${tile.height}px`
|
|
345
|
+
});
|
|
346
|
+
canvas.append(cell);
|
|
347
|
+
const tileContext = loading.has(tile.widgetId) ? { ...context, loading: true } : context;
|
|
348
|
+
mountTile(cell, widget, results[tile.widgetId] ?? {}, tileContext);
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
draw();
|
|
352
|
+
if (input.viewportWidth === void 0) {
|
|
353
|
+
attachment = observeElementResize(canvas, () => {
|
|
354
|
+
draw();
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
return {
|
|
358
|
+
update(next) {
|
|
359
|
+
if (destroyed) return;
|
|
360
|
+
current = next;
|
|
361
|
+
if (next.activeTabId !== void 0) active = next.activeTabId;
|
|
362
|
+
const tabs = dashboardTabs(next.dashboard);
|
|
363
|
+
if (tabs.length > 0 && !tabs.some((tab) => tab.id === active)) {
|
|
364
|
+
active = defaultTabId(tabs);
|
|
365
|
+
}
|
|
366
|
+
draw();
|
|
367
|
+
},
|
|
368
|
+
activeTabId() {
|
|
369
|
+
return active;
|
|
370
|
+
},
|
|
371
|
+
resize() {
|
|
372
|
+
draw();
|
|
373
|
+
},
|
|
374
|
+
destroy() {
|
|
375
|
+
if (destroyed) return;
|
|
376
|
+
destroyed = true;
|
|
377
|
+
attachment?.disconnect();
|
|
378
|
+
disposeTiles();
|
|
379
|
+
clearElement(root);
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
export { OPEN_ALL, WIDGET_SETTING, cleanPivotExpand, createNativeWidgetFactory, createPivotOpenLevelsRegistry, createRendererRegistry, currentViewPivotExpand, defaultPivotExpand, documentKinds, documentVersion, mountDashboardReader, pivotExpandError, projectTabularGrid, readPivotExpand };
|
|
385
|
+
//# sourceMappingURL=chunk-LPLBBHOW.js.map
|
|
386
|
+
//# sourceMappingURL=chunk-LPLBBHOW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../dashboard-spec/src/index.ts","../../dashboard-core/src/pivot-expand-values.ts","../../dashboard-renderers/src/grid-adapter.ts","../../dashboard-renderers/src/pivot-registry.ts","../../dashboard-renderers/src/registry.ts","../../dashboard-renderer-web/src/widget-factory.ts","../../dashboard-renderer-web/src/reader-shell.ts"],"names":[],"mappings":"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","file":"chunk-LPLBBHOW.js","sourcesContent":["export type {\n BreakpointConfig,\n DashboardConfig,\n DashboardFilterPanelConfig,\n DashboardGridConfig,\n DashboardResponsiveConfig,\n DashboardSectionConfig,\n DashboardSpec,\n DashboardTab,\n FilterLayout,\n WidgetRef,\n} from \"./generated/dashboard\";\nexport type {\n LabelBlock,\n WidgetHeader as WidgetHeaderConfig,\n} from \"./generated/widget\";\nexport type { SemanticModel } from \"./generated/semantic-model\";\nexport type {\n FieldMapping,\n InteractionVariableMapping,\n InteractionVariableSource,\n ResponsiveLayout,\n WidgetInteraction,\n WidgetLayout,\n WidgetSpec,\n} from \"./generated/widget\";\n\nexport const documentVersion = \"1.0\";\nexport const documentKinds = [\"dashboard\", \"semantic_model\", \"widget\"] as const;\n\nexport type DocumentKind = (typeof documentKinds)[number];\n","/**\n * How far each pivot widget opens in a delivery, as form values.\n *\n * A pivot on the page is folded and unfolded by whoever is reading it. A\n * delivered PNG, PDF or CSV has nobody at the keyboard, so how much of the\n * hierarchy the document shows has to be part of the schedule or export\n * itself. Each pivot gets two controls: how many row levels open and how many\n * column header levels open. Everything open is the default; a level count\n * folds what sits past it, and \"widget setting\" falls back to the pivot's own\n * snapshot block. The XLSX and PPTX pivots always carry the whole cross-tab,\n * so none of this touches them. The logic lives here rather than in the form\n * component so it is testable on its own.\n */\n\nimport type {\n DashboardPivotInfo,\n PivotExpandEntry,\n ReadPivotOpenLevels,\n} from \"./types.js\";\n\n/** What one pivot's two controls hold: a level count, or a named choice. */\nexport interface PivotAxisValues {\n rows: string;\n columns: string;\n}\n\n/** What each pivot's controls hold, keyed by widget id. */\nexport type PivotExpandValues = Record<string, PivotAxisValues>;\n\n/** Everything open, which sends the axis's own level count. */\nexport const OPEN_ALL = \"all\";\n/** Fall back to the widget's own snapshot setting for that axis. */\nexport const WIDGET_SETTING = \"widget\";\n\n/** Every pivot fully expanded, which is what a new schedule starts from. */\nexport function defaultPivotExpand(\n pivots: DashboardPivotInfo[],\n): PivotExpandValues {\n const values: PivotExpandValues = {};\n for (const pivot of pivots) {\n values[pivot.id] = { rows: OPEN_ALL, columns: OPEN_ALL };\n }\n return values;\n}\n\n/**\n * Each pivot as it stands open on the dashboard right now, so an export\n * carries the view the reader is looking at. A pivot the page has not drawn\n * this session falls back to fully expanded.\n */\nexport function currentViewPivotExpand(\n pivots: DashboardPivotInfo[],\n readPivotOpenLevels: ReadPivotOpenLevels = () => undefined,\n): PivotExpandValues {\n const values: PivotExpandValues = {};\n for (const pivot of pivots) {\n const open = readPivotOpenLevels(pivot.id);\n values[pivot.id] = {\n rows: axisValue(open?.rows ?? null, pivot.row_levels),\n columns: axisValue(open?.columns ?? null, pivot.column_levels),\n };\n }\n return values;\n}\n\n/** A level count as the string the axis's select holds. */\nfunction axisValue(levels: number | null, levelCount: number): string {\n if (levels === null || levels >= levelCount) return OPEN_ALL;\n return String(Math.max(0, levels));\n}\n\n/**\n * The stored map as the strings the form's controls hold. A stored entry is a\n * bare number of row levels, which is what older schedules wrote, or an\n * object with `rows` and `columns`. A pivot or an axis the map does not name\n * shows \"widget setting\", which is what its absence meant when it was saved.\n */\nexport function readPivotExpand(\n stored: Record<string, PivotExpandEntry> | null | undefined,\n pivots: DashboardPivotInfo[],\n): PivotExpandValues {\n const values: PivotExpandValues = {};\n for (const pivot of pivots) {\n const entry = stored?.[pivot.id];\n if (typeof entry === \"number\") {\n values[pivot.id] = {\n rows: axisValue(entry, pivot.row_levels),\n columns: WIDGET_SETTING,\n };\n continue;\n }\n values[pivot.id] = {\n rows:\n typeof entry?.rows === \"number\"\n ? axisValue(entry.rows, pivot.row_levels)\n : WIDGET_SETTING,\n columns:\n typeof entry?.columns === \"number\"\n ? axisValue(entry.columns, pivot.column_levels)\n : WIDGET_SETTING,\n };\n }\n return values;\n}\n\n/** One control's string as the level count it stands for, or null to omit. */\nfunction axisLevels(\n raw: string | undefined,\n levelCount: number,\n): number | null {\n if (raw === undefined || raw === WIDGET_SETTING) return null;\n if (raw === OPEN_ALL) return levelCount;\n const levels = Number(raw);\n if (!Number.isInteger(levels) || levels < 0) return null;\n return Math.min(levels, levelCount);\n}\n\n/** The controls' values as the map the API stores, or undefined when empty. */\nexport function cleanPivotExpand(\n values: PivotExpandValues,\n pivots: DashboardPivotInfo[],\n): Record<string, { rows?: number; columns?: number }> | undefined {\n const cleaned: Record<string, { rows?: number; columns?: number }> = {};\n for (const pivot of pivots) {\n // A pivot the form never touched is fully expanded, which is also what\n // its controls showed, so the saved schedule matches the form.\n const axes = values[pivot.id] ?? { rows: OPEN_ALL, columns: OPEN_ALL };\n const rows = axisLevels(axes.rows, pivot.row_levels);\n const columns =\n pivot.column_levels > 0\n ? axisLevels(axes.columns, pivot.column_levels)\n : null;\n if (rows === null && columns === null) continue;\n cleaned[pivot.id] = {\n ...(rows !== null ? { rows } : {}),\n ...(columns !== null ? { columns } : {}),\n };\n }\n return Object.keys(cleaned).length > 0 ? cleaned : undefined;\n}\n\n/** The reason these values cannot be saved, or null when they can. */\nexport function pivotExpandError(\n pivots: DashboardPivotInfo[],\n values: PivotExpandValues,\n): string | null {\n for (const pivot of pivots) {\n const axes = values[pivot.id];\n if (!axes) continue;\n for (const raw of [axes.rows, axes.columns]) {\n if (raw === OPEN_ALL || raw === WIDGET_SETTING) continue;\n const levels = Number(raw);\n if (!Number.isInteger(levels) || levels < 0) {\n return `Levels open for \"${pivot.name}\" must be a whole number of levels`;\n }\n }\n }\n return null;\n}\n","import type { TabularGridAdapter, TabularRendererModel } from \"./types.js\";\n\nexport function projectTabularGrid<TOutput>(\n model: TabularRendererModel,\n adapter: TabularGridAdapter<TOutput>,\n): TOutput {\n return adapter.project(model);\n}\n","import type { PivotOpenLevels } from \"./types.js\";\n\nexport interface PivotOpenLevelsRegistry {\n publish(widgetId: string, levels: PivotOpenLevels): void;\n clear(widgetId: string): void;\n read(widgetId: string): PivotOpenLevels | null;\n}\n\nexport function createPivotOpenLevelsRegistry(): PivotOpenLevelsRegistry {\n const values = new Map<string, PivotOpenLevels>();\n return {\n publish(widgetId, levels) {\n values.set(widgetId, levels);\n },\n clear(widgetId) {\n values.delete(widgetId);\n },\n read(widgetId) {\n return values.get(widgetId) ?? null;\n },\n };\n}\n","import type { RendererExtension, RendererRegistry } from \"./types.js\";\n\nexport function createRendererRegistry(\n initial: Readonly<Record<string, RendererExtension>> = {},\n): RendererRegistry {\n const renderers = new Map(Object.entries(initial));\n return {\n register(name, renderer) {\n renderers.set(name, renderer);\n },\n unregister(name) {\n renderers.delete(name);\n },\n get(name) {\n return renderers.get(name);\n },\n };\n}\n","import { createNativeWidgetRenderer } from \"./native-renderer.js\";\nimport type {\n NativeWidgetRenderInput,\n WidgetRendererFactory,\n} from \"./types.js\";\n\n/**\n * The native renderer as a shell factory, so a host wires one entry rather than\n * repeating the lifecycle for every component the browser draws itself.\n */\nexport function createNativeWidgetFactory(): WidgetRendererFactory {\n return (input: NativeWidgetRenderInput) => createNativeWidgetRenderer(input);\n}\n","import {\n buildReaderGrid,\n buildWidgetRendererModel,\n dashboardTabs,\n defaultTabId,\n readerRendererContext,\n tabWidgetIds,\n} from \"@dlh.io/bideux-dashboard-renderers\";\nimport type {\n RendererContext,\n WidgetResult,\n} from \"@dlh.io/bideux-dashboard-renderers\";\nimport { isPanelledControl } from \"@dlh.io/bideux-dashboard-core\";\nimport type { DashboardSpec, WidgetSpec } from \"@dlh.io/bideux-dashboard-spec\";\n\nimport { clearElement, createMessage, setStyles } from \"./dom.js\";\nimport { observeElementResize } from \"./resize-observer.js\";\nimport { resolveRendererTheme } from \"./types.js\";\nimport type {\n NativeWidgetRenderInput,\n RendererHostCallbacks,\n RendererThemeTokens,\n WidgetRendererFactories,\n WidgetRendererFactory,\n WidgetRendererHandle,\n} from \"./types.js\";\nimport { createNativeWidgetFactory } from \"./widget-factory.js\";\n\nexport interface DashboardReaderShellInput {\n /** The element the reader draws into. It is emptied on mount. */\n element: HTMLElement;\n dashboard: DashboardSpec;\n widgets: Record<string, WidgetSpec>;\n results?: Record<string, WidgetResult>;\n /**\n * Factories keyed by widget component or renderer kind. Anything not named\n * here is drawn by the native browser renderer.\n */\n renderers?: WidgetRendererFactories;\n /** Filter values by widget id, which the host owns. */\n filters?: Record<string, unknown>;\n /** Widget ids the reader is still waiting on. */\n loadingWidgetIds?: string[];\n activeTabId?: string;\n theme?: Partial<RendererThemeTokens>;\n callbacks?: RendererHostCallbacks;\n onTabChange?: (tabId: string) => void;\n /** Overrides the measured width, which is how a test fixes a size. */\n viewportWidth?: number;\n}\n\nexport interface DashboardReaderShell {\n /** Redraws with a new document, new results, new filters or a new tab. */\n update(next: DashboardReaderShellInput): void;\n /** The tab the reader is showing. */\n activeTabId(): string | undefined;\n resize(): void;\n destroy(): void;\n}\n\ninterface MountedTile {\n widgetId: string;\n element: HTMLElement;\n handle?: WidgetRendererHandle;\n component: string;\n disposed: boolean;\n}\n\nconst MOUNTED_KINDS = new Set([\"chart\", \"table\", \"pivot\"]);\n\nfunction rendererKind(\n widget: WidgetSpec,\n result: WidgetResult,\n context: RendererContext,\n): string {\n const resolution = buildWidgetRendererModel(widget, result, context);\n return resolution.model?.kind ?? \"unknown\";\n}\n\nfunction pickFactory(\n renderers: WidgetRendererFactories,\n widget: WidgetSpec,\n result: WidgetResult,\n context: RendererContext,\n native: WidgetRendererFactory,\n): WidgetRendererFactory {\n const component = String(widget.spec.component ?? \"unknown\");\n const byComponent = renderers[component];\n if (byComponent !== undefined) return byComponent;\n const kind = rendererKind(widget, result, context);\n const byKind = renderers[kind];\n if (byKind !== undefined) return byKind;\n if (MOUNTED_KINDS.has(kind)) {\n const fallback = renderers.default;\n if (fallback !== undefined) return fallback;\n }\n return native;\n}\n\nfunction tileWidgets(\n dashboard: DashboardSpec,\n widgets: Record<string, WidgetSpec>,\n activeTabId: string | undefined,\n): Record<string, WidgetSpec> {\n const tabs = dashboardTabs(dashboard);\n if (tabs.length === 0) return widgets;\n const tab = tabs.find((entry) => entry.id === activeTabId) ?? tabs[0];\n if (tab === undefined) return widgets;\n const ids = new Set(tabWidgetIds(tab));\n const out: Record<string, WidgetSpec> = {};\n for (const [id, widget] of Object.entries(widgets)) {\n if (ids.has(id)) out[id] = widget;\n }\n return out;\n}\n\nfunction panelledWidgets(\n dashboard: DashboardSpec,\n widgets: Record<string, WidgetSpec>,\n): WidgetSpec[] {\n return Object.values(widgets).filter((widget) =>\n isPanelledControl(widget, dashboard),\n );\n}\n\nfunction styleTabButton(\n button: HTMLButtonElement,\n active: boolean,\n tokens: RendererThemeTokens,\n): void {\n setStyles(button, {\n padding: \"6px 12px\",\n border: `1px solid ${tokens.border}`,\n \"border-radius\": \"999px\",\n background: active ? tokens.primary : tokens.surface,\n color: active ? tokens.surface : tokens.surfaceForeground,\n \"font-family\": tokens.fontFamily,\n \"font-size\": \"0.85rem\",\n cursor: \"pointer\",\n });\n}\n\n/**\n * A whole dashboard reader in the browser, with no UI framework.\n *\n * The shell owns tabs, the filter panel and the grid; every widget is drawn by a\n * renderer factory the host wires, so a plain page, an Angular component and a\n * Next.js page all read a dashboard the same way the React binding does.\n */\nexport function mountDashboardReader(\n input: DashboardReaderShellInput,\n): DashboardReaderShell {\n const document = input.element.ownerDocument;\n const native = createNativeWidgetFactory();\n let current = input;\n let tokens = resolveRendererTheme(input.theme);\n let active =\n input.activeTabId ?? defaultTabId(dashboardTabs(input.dashboard));\n let tiles: MountedTile[] = [];\n let attachment: { disconnect(): void } | null = null;\n let destroyed = false;\n\n const root = input.element;\n clearElement(root);\n setStyles(root, {\n \"box-sizing\": \"border-box\",\n display: \"flex\",\n \"flex-direction\": \"column\",\n gap: \"12px\",\n width: \"100%\",\n \"font-family\": tokens.fontFamily,\n color: tokens.foreground,\n });\n root.dataset.bideuxReader = \"true\";\n\n const header = document.createElement(\"header\");\n header.dataset.readerPart = \"header\";\n const title = document.createElement(\"h1\");\n setStyles(title, { margin: \"0\", \"font-size\": \"1.25rem\" });\n title.dataset.readerPart = \"title\";\n header.append(title);\n const tabBar = document.createElement(\"nav\");\n tabBar.dataset.readerPart = \"tabs\";\n setStyles(tabBar, { display: \"flex\", gap: \"8px\", \"flex-wrap\": \"wrap\" });\n const panel = document.createElement(\"section\");\n panel.dataset.readerPart = \"filter-panel\";\n setStyles(panel, {\n display: \"flex\",\n gap: \"12px\",\n \"flex-wrap\": \"wrap\",\n \"align-items\": \"flex-end\",\n });\n const canvas = document.createElement(\"div\");\n canvas.dataset.readerPart = \"canvas\";\n setStyles(canvas, { position: \"relative\", width: \"100%\" });\n root.append(header, tabBar, panel, canvas);\n\n const disposeTiles = (): void => {\n for (const tile of tiles) {\n tile.disposed = true;\n tile.handle?.destroy();\n }\n tiles = [];\n };\n\n const mountTile = (\n parent: HTMLElement,\n widget: WidgetSpec,\n result: WidgetResult,\n context: RendererContext,\n ): void => {\n const host = document.createElement(\"div\");\n setStyles(host, { width: \"100%\", height: \"100%\", \"min-height\": \"0\" });\n host.dataset.widgetHost = widget.metadata.id;\n parent.append(host);\n const component = String(widget.spec.component ?? \"unknown\");\n const tile: MountedTile = {\n widgetId: widget.metadata.id,\n element: host,\n component,\n disposed: false,\n };\n tiles.push(tile);\n const mountInput: NativeWidgetRenderInput = {\n element: host,\n widget,\n result,\n context,\n ...(current.filters === undefined\n ? {}\n : { filterValue: current.filters[widget.metadata.id] }),\n ...(current.callbacks === undefined\n ? {}\n : { callbacks: current.callbacks }),\n ...(current.theme === undefined ? {} : { theme: current.theme }),\n };\n const factory = pickFactory(\n current.renderers ?? {},\n widget,\n result,\n context,\n native,\n );\n let handle: WidgetRendererHandle | Promise<WidgetRendererHandle>;\n try {\n handle = factory(mountInput);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Rendering failed\";\n clearElement(host);\n host.append(createMessage(document, message, \"error\", tokens));\n return;\n }\n if (handle instanceof Promise) {\n void handle.then(\n (resolved) => {\n if (tile.disposed) {\n resolved.destroy();\n return;\n }\n tile.handle = resolved;\n },\n (error: unknown) => {\n if (tile.disposed) return;\n const message =\n error instanceof Error ? error.message : \"Rendering failed\";\n clearElement(host);\n host.append(createMessage(document, message, \"error\", tokens));\n },\n );\n return;\n }\n tile.handle = handle;\n };\n\n const draw = (): void => {\n if (destroyed) return;\n tokens = resolveRendererTheme(current.theme);\n const dashboard = current.dashboard;\n const results = current.results ?? {};\n const context: RendererContext = {\n ...readerRendererContext(dashboard),\n ...(current.filters === undefined ? {} : { filters: current.filters }),\n };\n title.textContent = dashboard.metadata.name ?? dashboard.metadata.id;\n\n const tabs = dashboardTabs(dashboard);\n clearElement(tabBar);\n tabBar.style.display = tabs.length > 1 ? \"flex\" : \"none\";\n for (const tab of tabs) {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.textContent = tab.label ?? tab.id;\n button.dataset.readerTab = tab.id;\n const isActive = tab.id === active;\n if (isActive) button.dataset.active = \"true\";\n styleTabButton(button, isActive, tokens);\n button.addEventListener(\"click\", () => {\n if (active === tab.id) return;\n active = tab.id;\n current.onTabChange?.(tab.id);\n draw();\n });\n tabBar.append(button);\n }\n\n disposeTiles();\n clearElement(panel);\n clearElement(canvas);\n\n const visible = tileWidgets(dashboard, current.widgets, active);\n const panelled = panelledWidgets(dashboard, visible);\n panel.style.display = panelled.length === 0 ? \"none\" : \"flex\";\n for (const widget of panelled) {\n const slot = document.createElement(\"div\");\n slot.dataset.filterSlot = widget.metadata.id;\n setStyles(slot, { \"min-width\": \"180px\" });\n panel.append(slot);\n mountTile(slot, widget, results[widget.metadata.id] ?? {}, context);\n }\n\n const width =\n current.viewportWidth ??\n (canvas.clientWidth > 0 ? canvas.clientWidth : 1200);\n const grid = buildReaderGrid({ dashboard, widgets: visible, width });\n canvas.dataset.layoutKey = grid.layoutKey;\n canvas.dataset.breakpoint = grid.breakpoint;\n setStyles(canvas, { height: `${grid.height}px` });\n const loading = new Set(current.loadingWidgetIds ?? []);\n for (const tile of grid.tiles) {\n const widget = visible[tile.widgetId];\n if (widget === undefined) continue;\n const cell = document.createElement(\"div\");\n cell.dataset.gridItem = tile.widgetId;\n setStyles(cell, {\n position: \"absolute\",\n left: `${tile.left}px`,\n top: `${tile.top}px`,\n width: `${tile.width}px`,\n height: `${tile.height}px`,\n });\n canvas.append(cell);\n const tileContext: RendererContext = loading.has(tile.widgetId)\n ? { ...context, loading: true }\n : context;\n mountTile(cell, widget, results[tile.widgetId] ?? {}, tileContext);\n }\n };\n\n draw();\n if (input.viewportWidth === undefined) {\n attachment = observeElementResize(canvas, () => {\n draw();\n });\n }\n\n return {\n update(next) {\n if (destroyed) return;\n current = next;\n if (next.activeTabId !== undefined) active = next.activeTabId;\n const tabs = dashboardTabs(next.dashboard);\n if (tabs.length > 0 && !tabs.some((tab) => tab.id === active)) {\n active = defaultTabId(tabs);\n }\n draw();\n },\n activeTabId() {\n return active;\n },\n resize() {\n draw();\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n attachment?.disconnect();\n disposeTiles();\n clearElement(root);\n },\n };\n}\n"]}
|