photon-grid-core 0.0.1
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 +1 -0
- package/README.md +0 -0
- package/cell-selection/active-grid-registry.d.ts +37 -0
- package/cell-selection/active-grid-registry.d.ts.map +1 -0
- package/cell-selection/active-grid-registry.js +25 -0
- package/cell-selection/active-grid-registry.js.map +1 -0
- package/cell-selection/cell-selection-engine.d.ts +336 -0
- package/cell-selection/cell-selection-engine.d.ts.map +1 -0
- package/cell-selection/cell-selection-engine.js +1534 -0
- package/cell-selection/cell-selection-engine.js.map +1 -0
- package/cell-selection/selection-range.d.ts +16 -0
- package/cell-selection/selection-range.d.ts.map +1 -0
- package/cell-selection/selection-range.js +48 -0
- package/cell-selection/selection-range.js.map +1 -0
- package/cell-selection/selection-renderer.d.ts +24 -0
- package/cell-selection/selection-renderer.d.ts.map +1 -0
- package/cell-selection/selection-renderer.js +107 -0
- package/cell-selection/selection-renderer.js.map +1 -0
- package/chart/chart-analyzer/aggregation-analyzer.d.ts +18 -0
- package/chart/chart-analyzer/aggregation-analyzer.d.ts.map +1 -0
- package/chart/chart-analyzer/aggregation-analyzer.js +63 -0
- package/chart/chart-analyzer/aggregation-analyzer.js.map +1 -0
- package/chart/chart-analyzer/bar-analyzer.d.ts +19 -0
- package/chart/chart-analyzer/bar-analyzer.d.ts.map +1 -0
- package/chart/chart-analyzer/bar-analyzer.js +56 -0
- package/chart/chart-analyzer/bar-analyzer.js.map +1 -0
- package/chart/chart-analyzer/bubble-analyzer.d.ts +16 -0
- package/chart/chart-analyzer/bubble-analyzer.d.ts.map +1 -0
- package/chart/chart-analyzer/bubble-analyzer.js +61 -0
- package/chart/chart-analyzer/bubble-analyzer.js.map +1 -0
- package/chart/chart-analyzer/cardinality-analyzer.d.ts +13 -0
- package/chart/chart-analyzer/cardinality-analyzer.d.ts.map +1 -0
- package/chart/chart-analyzer/cardinality-analyzer.js +28 -0
- package/chart/chart-analyzer/cardinality-analyzer.js.map +1 -0
- package/chart/chart-analyzer/dimension-analyzer.d.ts +12 -0
- package/chart/chart-analyzer/dimension-analyzer.d.ts.map +1 -0
- package/chart/chart-analyzer/dimension-analyzer.js +33 -0
- package/chart/chart-analyzer/dimension-analyzer.js.map +1 -0
- package/chart/chart-analyzer/histogram-analyzer.d.ts +11 -0
- package/chart/chart-analyzer/histogram-analyzer.d.ts.map +1 -0
- package/chart/chart-analyzer/histogram-analyzer.js +43 -0
- package/chart/chart-analyzer/histogram-analyzer.js.map +1 -0
- package/chart/chart-analyzer/index.d.ts +58 -0
- package/chart/chart-analyzer/index.d.ts.map +1 -0
- package/chart/chart-analyzer/index.js +130 -0
- package/chart/chart-analyzer/index.js.map +1 -0
- package/chart/chart-analyzer/line-analyzer.d.ts +23 -0
- package/chart/chart-analyzer/line-analyzer.d.ts.map +1 -0
- package/chart/chart-analyzer/line-analyzer.js +61 -0
- package/chart/chart-analyzer/line-analyzer.js.map +1 -0
- package/chart/chart-analyzer/measure-analyzer.d.ts +11 -0
- package/chart/chart-analyzer/measure-analyzer.d.ts.map +1 -0
- package/chart/chart-analyzer/measure-analyzer.js +44 -0
- package/chart/chart-analyzer/measure-analyzer.js.map +1 -0
- package/chart/chart-analyzer/pie-analyzer.d.ts +19 -0
- package/chart/chart-analyzer/pie-analyzer.d.ts.map +1 -0
- package/chart/chart-analyzer/pie-analyzer.js +64 -0
- package/chart/chart-analyzer/pie-analyzer.js.map +1 -0
- package/chart/chart-analyzer/recommendation-engine.d.ts +18 -0
- package/chart/chart-analyzer/recommendation-engine.d.ts.map +1 -0
- package/chart/chart-analyzer/recommendation-engine.js +82 -0
- package/chart/chart-analyzer/recommendation-engine.js.map +1 -0
- package/chart/chart-analyzer/scatter-analyzer.d.ts +16 -0
- package/chart/chart-analyzer/scatter-analyzer.d.ts.map +1 -0
- package/chart/chart-analyzer/scatter-analyzer.js +70 -0
- package/chart/chart-analyzer/scatter-analyzer.js.map +1 -0
- package/chart/chart-analyzer/types.d.ts +52 -0
- package/chart/chart-analyzer/types.d.ts.map +1 -0
- package/chart/chart-analyzer/types.js +10 -0
- package/chart/chart-analyzer/types.js.map +1 -0
- package/chart/chart-analyzer.d.ts +12 -0
- package/chart/chart-analyzer.d.ts.map +1 -0
- package/chart/chart-analyzer.js +77 -0
- package/chart/chart-analyzer.js.map +1 -0
- package/chart/chart-data-transformer.d.ts +26 -0
- package/chart/chart-data-transformer.d.ts.map +1 -0
- package/chart/chart-data-transformer.js +93 -0
- package/chart/chart-data-transformer.js.map +1 -0
- package/chart/chart-engine.d.ts +38 -0
- package/chart/chart-engine.d.ts.map +1 -0
- package/chart/chart-engine.js +96 -0
- package/chart/chart-engine.js.map +1 -0
- package/chart/chart-panel.d.ts +54 -0
- package/chart/chart-panel.d.ts.map +1 -0
- package/chart/chart-panel.js +350 -0
- package/chart/chart-panel.js.map +1 -0
- package/chart/chart-renderer.d.ts +93 -0
- package/chart/chart-renderer.d.ts.map +1 -0
- package/chart/chart-renderer.js +1330 -0
- package/chart/chart-renderer.js.map +1 -0
- package/chart/sparkline/sparkline-renderer.d.ts +269 -0
- package/chart/sparkline/sparkline-renderer.d.ts.map +1 -0
- package/chart/sparkline/sparkline-renderer.js +875 -0
- package/chart/sparkline/sparkline-renderer.js.map +1 -0
- package/chart/sparkline/sparkline.types.d.ts +214 -0
- package/chart/sparkline/sparkline.types.d.ts.map +1 -0
- package/chart/sparkline/sparkline.types.js +8 -0
- package/chart/sparkline/sparkline.types.js.map +1 -0
- package/column-groups/column-group-drag-handler.d.ts +169 -0
- package/column-groups/column-group-drag-handler.d.ts.map +1 -0
- package/column-groups/column-group-drag-handler.js +517 -0
- package/column-groups/column-group-drag-handler.js.map +1 -0
- package/column-groups/column-group-header-builder.d.ts +106 -0
- package/column-groups/column-group-header-builder.d.ts.map +1 -0
- package/column-groups/column-group-header-builder.js +311 -0
- package/column-groups/column-group-header-builder.js.map +1 -0
- package/column-groups/column-group-model.d.ts +248 -0
- package/column-groups/column-group-model.d.ts.map +1 -0
- package/column-groups/column-group-model.js +668 -0
- package/column-groups/column-group-model.js.map +1 -0
- package/column-groups/column-group-state-manager.d.ts +110 -0
- package/column-groups/column-group-state-manager.d.ts.map +1 -0
- package/column-groups/column-group-state-manager.js +153 -0
- package/column-groups/column-group-state-manager.js.map +1 -0
- package/column-groups/column-group.types.d.ts +250 -0
- package/column-groups/column-group.types.d.ts.map +1 -0
- package/column-groups/column-group.types.js +20 -0
- package/column-groups/column-group.types.js.map +1 -0
- package/column-groups/display-group-builder.d.ts +91 -0
- package/column-groups/display-group-builder.d.ts.map +1 -0
- package/column-groups/display-group-builder.js +225 -0
- package/column-groups/display-group-builder.js.map +1 -0
- package/column-groups/display-group-drag-handler.d.ts +205 -0
- package/column-groups/display-group-drag-handler.d.ts.map +1 -0
- package/column-groups/display-group-drag-handler.js +536 -0
- package/column-groups/display-group-drag-handler.js.map +1 -0
- package/column-groups/display-group-engine.d.ts +310 -0
- package/column-groups/display-group-engine.d.ts.map +1 -0
- package/column-groups/display-group-engine.js +549 -0
- package/column-groups/display-group-engine.js.map +1 -0
- package/column-groups/display-group-header-builder.d.ts +94 -0
- package/column-groups/display-group-header-builder.d.ts.map +1 -0
- package/column-groups/display-group-header-builder.js +224 -0
- package/column-groups/display-group-header-builder.js.map +1 -0
- package/column-groups/display-group.types.d.ts +140 -0
- package/column-groups/display-group.types.d.ts.map +1 -0
- package/column-groups/display-group.types.js +2 -0
- package/column-groups/display-group.types.js.map +1 -0
- package/column-groups/index.d.ts +25 -0
- package/column-groups/index.d.ts.map +1 -0
- package/column-groups/index.js +26 -0
- package/column-groups/index.js.map +1 -0
- package/column-groups/logical-group-registry.d.ts +77 -0
- package/column-groups/logical-group-registry.d.ts.map +1 -0
- package/column-groups/logical-group-registry.js +118 -0
- package/column-groups/logical-group-registry.js.map +1 -0
- package/core/column-model.d.ts +30 -0
- package/core/column-model.d.ts.map +1 -0
- package/core/column-model.js +203 -0
- package/core/column-model.js.map +1 -0
- package/core/grid-api.d.ts +187 -0
- package/core/grid-api.d.ts.map +1 -0
- package/core/grid-api.js +569 -0
- package/core/grid-api.js.map +1 -0
- package/core/grid-context.d.ts +61 -0
- package/core/grid-context.d.ts.map +1 -0
- package/core/grid-context.js +2 -0
- package/core/grid-context.js.map +1 -0
- package/core/grid-core.d.ts +49 -0
- package/core/grid-core.d.ts.map +1 -0
- package/core/grid-core.js +675 -0
- package/core/grid-core.js.map +1 -0
- package/core/grid-store.d.ts +62 -0
- package/core/grid-store.d.ts.map +1 -0
- package/core/grid-store.js +104 -0
- package/core/grid-store.js.map +1 -0
- package/core/row-model.d.ts +32 -0
- package/core/row-model.d.ts.map +1 -0
- package/core/row-model.js +150 -0
- package/core/row-model.js.map +1 -0
- package/drag-drop/drag-autoscroll.d.ts +14 -0
- package/drag-drop/drag-autoscroll.d.ts.map +1 -0
- package/drag-drop/drag-autoscroll.js +66 -0
- package/drag-drop/drag-autoscroll.js.map +1 -0
- package/drag-drop/drag-drop-engine.d.ts +55 -0
- package/drag-drop/drag-drop-engine.d.ts.map +1 -0
- package/drag-drop/drag-drop-engine.js +179 -0
- package/drag-drop/drag-drop-engine.js.map +1 -0
- package/drag-drop/drag-preview.d.ts +32 -0
- package/drag-drop/drag-preview.d.ts.map +1 -0
- package/drag-drop/drag-preview.js +74 -0
- package/drag-drop/drag-preview.js.map +1 -0
- package/engines/aggregation/aggregation-engine.d.ts +66 -0
- package/engines/aggregation/aggregation-engine.d.ts.map +1 -0
- package/engines/aggregation/aggregation-engine.js +149 -0
- package/engines/aggregation/aggregation-engine.js.map +1 -0
- package/engines/clipboard/clipboard-engine.d.ts +89 -0
- package/engines/clipboard/clipboard-engine.d.ts.map +1 -0
- package/engines/clipboard/clipboard-engine.js +323 -0
- package/engines/clipboard/clipboard-engine.js.map +1 -0
- package/engines/editing/cell-editor-engine.d.ts +62 -0
- package/engines/editing/cell-editor-engine.d.ts.map +1 -0
- package/engines/editing/cell-editor-engine.js +359 -0
- package/engines/editing/cell-editor-engine.js.map +1 -0
- package/engines/editing/custom-dropdown-editor.d.ts +99 -0
- package/engines/editing/custom-dropdown-editor.d.ts.map +1 -0
- package/engines/editing/custom-dropdown-editor.js +355 -0
- package/engines/editing/custom-dropdown-editor.js.map +1 -0
- package/engines/editing/value-parser.d.ts +12 -0
- package/engines/editing/value-parser.d.ts.map +1 -0
- package/engines/editing/value-parser.js +125 -0
- package/engines/editing/value-parser.js.map +1 -0
- package/engines/export/export-engine.d.ts +16 -0
- package/engines/export/export-engine.d.ts.map +1 -0
- package/engines/export/export-engine.js +99 -0
- package/engines/export/export-engine.js.map +1 -0
- package/engines/filter/filter-condition.d.ts +7 -0
- package/engines/filter/filter-condition.d.ts.map +1 -0
- package/engines/filter/filter-condition.js +126 -0
- package/engines/filter/filter-condition.js.map +1 -0
- package/engines/filter/filter-engine.d.ts +35 -0
- package/engines/filter/filter-engine.d.ts.map +1 -0
- package/engines/filter/filter-engine.js +150 -0
- package/engines/filter/filter-engine.js.map +1 -0
- package/engines/filter/filter-panel.d.ts +103 -0
- package/engines/filter/filter-panel.d.ts.map +1 -0
- package/engines/filter/filter-panel.js +645 -0
- package/engines/filter/filter-panel.js.map +1 -0
- package/engines/grouping/group-node.d.ts +21 -0
- package/engines/grouping/group-node.d.ts.map +1 -0
- package/engines/grouping/group-node.js +96 -0
- package/engines/grouping/group-node.js.map +1 -0
- package/engines/grouping/grouping-engine.d.ts +33 -0
- package/engines/grouping/grouping-engine.d.ts.map +1 -0
- package/engines/grouping/grouping-engine.js +118 -0
- package/engines/grouping/grouping-engine.js.map +1 -0
- package/engines/master-detail/master-detail-engine.d.ts +77 -0
- package/engines/master-detail/master-detail-engine.d.ts.map +1 -0
- package/engines/master-detail/master-detail-engine.js +199 -0
- package/engines/master-detail/master-detail-engine.js.map +1 -0
- package/engines/pagination/pagination-engine.d.ts +33 -0
- package/engines/pagination/pagination-engine.d.ts.map +1 -0
- package/engines/pagination/pagination-engine.js +110 -0
- package/engines/pagination/pagination-engine.js.map +1 -0
- package/engines/selection/row-selection-engine.d.ts +26 -0
- package/engines/selection/row-selection-engine.d.ts.map +1 -0
- package/engines/selection/row-selection-engine.js +145 -0
- package/engines/selection/row-selection-engine.js.map +1 -0
- package/engines/sort/sort-comparator.d.ts +43 -0
- package/engines/sort/sort-comparator.d.ts.map +1 -0
- package/engines/sort/sort-comparator.js +113 -0
- package/engines/sort/sort-comparator.js.map +1 -0
- package/engines/sort/sort-engine.d.ts +67 -0
- package/engines/sort/sort-engine.d.ts.map +1 -0
- package/engines/sort/sort-engine.js +178 -0
- package/engines/sort/sort-engine.js.map +1 -0
- package/engines/summary/summary-engine.d.ts +17 -0
- package/engines/summary/summary-engine.d.ts.map +1 -0
- package/engines/summary/summary-engine.js +72 -0
- package/engines/summary/summary-engine.js.map +1 -0
- package/engines/tree/tree-data-service.d.ts +117 -0
- package/engines/tree/tree-data-service.d.ts.map +1 -0
- package/engines/tree/tree-data-service.js +296 -0
- package/engines/tree/tree-data-service.js.map +1 -0
- package/engines/tree/tree-expansion-service.d.ts +35 -0
- package/engines/tree/tree-expansion-service.d.ts.map +1 -0
- package/engines/tree/tree-expansion-service.js +84 -0
- package/engines/tree/tree-expansion-service.js.map +1 -0
- package/engines/tree/tree-node.d.ts +40 -0
- package/engines/tree/tree-node.d.ts.map +1 -0
- package/engines/tree/tree-node.js +199 -0
- package/engines/tree/tree-node.js.map +1 -0
- package/engines/tree/tree-selection-service.d.ts +35 -0
- package/engines/tree/tree-selection-service.d.ts.map +1 -0
- package/engines/tree/tree-selection-service.js +72 -0
- package/engines/tree/tree-selection-service.js.map +1 -0
- package/engines/undo-redo/undo-redo-engine.d.ts +114 -0
- package/engines/undo-redo/undo-redo-engine.d.ts.map +1 -0
- package/engines/undo-redo/undo-redo-engine.js +165 -0
- package/engines/undo-redo/undo-redo-engine.js.map +1 -0
- package/event-bus/event-bus.d.ts +21 -0
- package/event-bus/event-bus.d.ts.map +1 -0
- package/event-bus/event-bus.js +106 -0
- package/event-bus/event-bus.js.map +1 -0
- package/icons/icon-registry.d.ts +19 -0
- package/icons/icon-registry.d.ts.map +1 -0
- package/icons/icon-registry.js +37 -0
- package/icons/icon-registry.js.map +1 -0
- package/icons/icon-renderer.d.ts +18 -0
- package/icons/icon-renderer.d.ts.map +1 -0
- package/icons/icon-renderer.js +75 -0
- package/icons/icon-renderer.js.map +1 -0
- package/icons/icon-sets/core-icons.d.ts +2 -0
- package/icons/icon-sets/core-icons.d.ts.map +1 -0
- package/icons/icon-sets/core-icons.js +48 -0
- package/icons/icon-sets/core-icons.js.map +1 -0
- package/index.d.ts +72 -0
- package/index.d.ts.map +1 -0
- package/index.js +54 -0
- package/index.js.map +1 -0
- package/package.json +64 -0
- package/photon-ai/builtins/filter.commands.d.ts +4 -0
- package/photon-ai/builtins/filter.commands.d.ts.map +1 -0
- package/photon-ai/builtins/filter.commands.js +189 -0
- package/photon-ai/builtins/filter.commands.js.map +1 -0
- package/photon-ai/builtins/grouping.commands.d.ts +4 -0
- package/photon-ai/builtins/grouping.commands.d.ts.map +1 -0
- package/photon-ai/builtins/grouping.commands.js +115 -0
- package/photon-ai/builtins/grouping.commands.js.map +1 -0
- package/photon-ai/builtins/index.d.ts +10 -0
- package/photon-ai/builtins/index.d.ts.map +1 -0
- package/photon-ai/builtins/index.js +26 -0
- package/photon-ai/builtins/index.js.map +1 -0
- package/photon-ai/builtins/info.commands.d.ts +4 -0
- package/photon-ai/builtins/info.commands.d.ts.map +1 -0
- package/photon-ai/builtins/info.commands.js +201 -0
- package/photon-ai/builtins/info.commands.js.map +1 -0
- package/photon-ai/builtins/move.commands.d.ts +4 -0
- package/photon-ai/builtins/move.commands.d.ts.map +1 -0
- package/photon-ai/builtins/move.commands.js +53 -0
- package/photon-ai/builtins/move.commands.js.map +1 -0
- package/photon-ai/builtins/pin.commands.d.ts +4 -0
- package/photon-ai/builtins/pin.commands.d.ts.map +1 -0
- package/photon-ai/builtins/pin.commands.js +106 -0
- package/photon-ai/builtins/pin.commands.js.map +1 -0
- package/photon-ai/builtins/selection.commands.d.ts +4 -0
- package/photon-ai/builtins/selection.commands.d.ts.map +1 -0
- package/photon-ai/builtins/selection.commands.js +102 -0
- package/photon-ai/builtins/selection.commands.js.map +1 -0
- package/photon-ai/builtins/sort.commands.d.ts +4 -0
- package/photon-ai/builtins/sort.commands.d.ts.map +1 -0
- package/photon-ai/builtins/sort.commands.js +67 -0
- package/photon-ai/builtins/sort.commands.js.map +1 -0
- package/photon-ai/builtins/visibility.commands.d.ts +4 -0
- package/photon-ai/builtins/visibility.commands.d.ts.map +1 -0
- package/photon-ai/builtins/visibility.commands.js +75 -0
- package/photon-ai/builtins/visibility.commands.js.map +1 -0
- package/photon-ai/command-builder.d.ts +21 -0
- package/photon-ai/command-builder.d.ts.map +1 -0
- package/photon-ai/command-builder.js +18 -0
- package/photon-ai/command-builder.js.map +1 -0
- package/photon-ai/command-executor.d.ts +15 -0
- package/photon-ai/command-executor.d.ts.map +1 -0
- package/photon-ai/command-executor.js +26 -0
- package/photon-ai/command-executor.js.map +1 -0
- package/photon-ai/entity-resolver.d.ts +121 -0
- package/photon-ai/entity-resolver.d.ts.map +1 -0
- package/photon-ai/entity-resolver.js +393 -0
- package/photon-ai/entity-resolver.js.map +1 -0
- package/photon-ai/fuzzy-match.d.ts +12 -0
- package/photon-ai/fuzzy-match.d.ts.map +1 -0
- package/photon-ai/fuzzy-match.js +37 -0
- package/photon-ai/fuzzy-match.js.map +1 -0
- package/photon-ai/index.d.ts +15 -0
- package/photon-ai/index.d.ts.map +1 -0
- package/photon-ai/index.js +13 -0
- package/photon-ai/index.js.map +1 -0
- package/photon-ai/intent-parser.d.ts +20 -0
- package/photon-ai/intent-parser.d.ts.map +1 -0
- package/photon-ai/intent-parser.js +52 -0
- package/photon-ai/intent-parser.js.map +1 -0
- package/photon-ai/photon-ai-memory.d.ts +42 -0
- package/photon-ai/photon-ai-memory.d.ts.map +1 -0
- package/photon-ai/photon-ai-memory.js +86 -0
- package/photon-ai/photon-ai-memory.js.map +1 -0
- package/photon-ai/photon-ai-panel.d.ts +54 -0
- package/photon-ai/photon-ai-panel.d.ts.map +1 -0
- package/photon-ai/photon-ai-panel.js +191 -0
- package/photon-ai/photon-ai-panel.js.map +1 -0
- package/photon-ai/photon-ai-registry.d.ts +25 -0
- package/photon-ai/photon-ai-registry.d.ts.map +1 -0
- package/photon-ai/photon-ai-registry.js +41 -0
- package/photon-ai/photon-ai-registry.js.map +1 -0
- package/photon-ai/photon-ai-service.d.ts +71 -0
- package/photon-ai/photon-ai-service.d.ts.map +1 -0
- package/photon-ai/photon-ai-service.js +165 -0
- package/photon-ai/photon-ai-service.js.map +1 -0
- package/photon-ai/photon-ai.types.d.ts +100 -0
- package/photon-ai/photon-ai.types.d.ts.map +1 -0
- package/photon-ai/photon-ai.types.js +2 -0
- package/photon-ai/photon-ai.types.js.map +1 -0
- package/photon-ai/query-splitter.d.ts +22 -0
- package/photon-ai/query-splitter.d.ts.map +1 -0
- package/photon-ai/query-splitter.js +81 -0
- package/photon-ai/query-splitter.js.map +1 -0
- package/photon-ai/text-normalizer.d.ts +33 -0
- package/photon-ai/text-normalizer.d.ts.map +1 -0
- package/photon-ai/text-normalizer.js +132 -0
- package/photon-ai/text-normalizer.js.map +1 -0
- package/renderer/auto-scroller.d.ts +78 -0
- package/renderer/auto-scroller.d.ts.map +1 -0
- package/renderer/auto-scroller.js +141 -0
- package/renderer/auto-scroller.js.map +1 -0
- package/renderer/body-renderer.d.ts +191 -0
- package/renderer/body-renderer.d.ts.map +1 -0
- package/renderer/body-renderer.js +806 -0
- package/renderer/body-renderer.js.map +1 -0
- package/renderer/cell-renderer.d.ts +26 -0
- package/renderer/cell-renderer.d.ts.map +1 -0
- package/renderer/cell-renderer.js +201 -0
- package/renderer/cell-renderer.js.map +1 -0
- package/renderer/column-menu.d.ts +285 -0
- package/renderer/column-menu.d.ts.map +1 -0
- package/renderer/column-menu.js +873 -0
- package/renderer/column-menu.js.map +1 -0
- package/renderer/column-style-manager.d.ts +38 -0
- package/renderer/column-style-manager.d.ts.map +1 -0
- package/renderer/column-style-manager.js +110 -0
- package/renderer/column-style-manager.js.map +1 -0
- package/renderer/detail-row-renderer.d.ts +153 -0
- package/renderer/detail-row-renderer.d.ts.map +1 -0
- package/renderer/detail-row-renderer.js +388 -0
- package/renderer/detail-row-renderer.js.map +1 -0
- package/renderer/dom-utils.d.ts +22 -0
- package/renderer/dom-utils.d.ts.map +1 -0
- package/renderer/dom-utils.js +132 -0
- package/renderer/dom-utils.js.map +1 -0
- package/renderer/footer-renderer.d.ts +25 -0
- package/renderer/footer-renderer.d.ts.map +1 -0
- package/renderer/footer-renderer.js +168 -0
- package/renderer/footer-renderer.js.map +1 -0
- package/renderer/grid-renderer.d.ts +295 -0
- package/renderer/grid-renderer.d.ts.map +1 -0
- package/renderer/grid-renderer.js +1456 -0
- package/renderer/grid-renderer.js.map +1 -0
- package/renderer/group-context-menu.d.ts +79 -0
- package/renderer/group-context-menu.d.ts.map +1 -0
- package/renderer/group-context-menu.js +238 -0
- package/renderer/group-context-menu.js.map +1 -0
- package/renderer/group-drop-zone.d.ts +56 -0
- package/renderer/group-drop-zone.d.ts.map +1 -0
- package/renderer/group-drop-zone.js +376 -0
- package/renderer/group-drop-zone.js.map +1 -0
- package/renderer/header-renderer.d.ts +264 -0
- package/renderer/header-renderer.d.ts.map +1 -0
- package/renderer/header-renderer.js +1321 -0
- package/renderer/header-renderer.js.map +1 -0
- package/renderer/overlay-renderer.d.ts +16 -0
- package/renderer/overlay-renderer.d.ts.map +1 -0
- package/renderer/overlay-renderer.js +64 -0
- package/renderer/overlay-renderer.js.map +1 -0
- package/renderer/renderer-resolver.d.ts +18 -0
- package/renderer/renderer-resolver.d.ts.map +1 -0
- package/renderer/renderer-resolver.js +18 -0
- package/renderer/renderer-resolver.js.map +1 -0
- package/renderer/row-animator.d.ts +72 -0
- package/renderer/row-animator.d.ts.map +1 -0
- package/renderer/row-animator.js +175 -0
- package/renderer/row-animator.js.map +1 -0
- package/renderer/row-drag-renderer.d.ts +58 -0
- package/renderer/row-drag-renderer.d.ts.map +1 -0
- package/renderer/row-drag-renderer.js +395 -0
- package/renderer/row-drag-renderer.js.map +1 -0
- package/renderer/row-offset-search.d.ts +17 -0
- package/renderer/row-offset-search.d.ts.map +1 -0
- package/renderer/row-offset-search.js +31 -0
- package/renderer/row-offset-search.js.map +1 -0
- package/renderer/row-position-sheet.d.ts +11 -0
- package/renderer/row-position-sheet.d.ts.map +1 -0
- package/renderer/row-position-sheet.js +29 -0
- package/renderer/row-position-sheet.js.map +1 -0
- package/renderer/scroll-controller.d.ts +58 -0
- package/renderer/scroll-controller.d.ts.map +1 -0
- package/renderer/scroll-controller.js +200 -0
- package/renderer/scroll-controller.js.map +1 -0
- package/renderer/sticky-row-tracker.d.ts +40 -0
- package/renderer/sticky-row-tracker.d.ts.map +1 -0
- package/renderer/sticky-row-tracker.js +63 -0
- package/renderer/sticky-row-tracker.js.map +1 -0
- package/renderer/tooltip-renderer.d.ts +36 -0
- package/renderer/tooltip-renderer.d.ts.map +1 -0
- package/renderer/tooltip-renderer.js +133 -0
- package/renderer/tooltip-renderer.js.map +1 -0
- package/renderer/tree-cell-renderer.d.ts +37 -0
- package/renderer/tree-cell-renderer.d.ts.map +1 -0
- package/renderer/tree-cell-renderer.js +75 -0
- package/renderer/tree-cell-renderer.js.map +1 -0
- package/renderer/tree-sticky-row-tracker.d.ts +62 -0
- package/renderer/tree-sticky-row-tracker.d.ts.map +1 -0
- package/renderer/tree-sticky-row-tracker.js +120 -0
- package/renderer/tree-sticky-row-tracker.js.map +1 -0
- package/renderer/virtual-scroll-renderer.d.ts +37 -0
- package/renderer/virtual-scroll-renderer.d.ts.map +1 -0
- package/renderer/virtual-scroll-renderer.js +133 -0
- package/renderer/virtual-scroll-renderer.js.map +1 -0
- package/styles/base-styles.d.ts +3 -0
- package/styles/base-styles.d.ts.map +1 -0
- package/styles/base-styles.js +3045 -0
- package/styles/base-styles.js.map +1 -0
- package/styles/themes/theme-alpine.d.ts +2 -0
- package/styles/themes/theme-alpine.d.ts.map +1 -0
- package/styles/themes/theme-alpine.js +120 -0
- package/styles/themes/theme-alpine.js.map +1 -0
- package/styles/themes/theme-balham.d.ts +2 -0
- package/styles/themes/theme-balham.d.ts.map +1 -0
- package/styles/themes/theme-balham.js +120 -0
- package/styles/themes/theme-balham.js.map +1 -0
- package/styles/themes/theme-dark.d.ts +2 -0
- package/styles/themes/theme-dark.d.ts.map +1 -0
- package/styles/themes/theme-dark.js +216 -0
- package/styles/themes/theme-dark.js.map +1 -0
- package/styles/themes/theme-material.d.ts +2 -0
- package/styles/themes/theme-material.d.ts.map +1 -0
- package/styles/themes/theme-material.js +134 -0
- package/styles/themes/theme-material.js.map +1 -0
- package/styles/themes/theme-quartz.d.ts +2 -0
- package/styles/themes/theme-quartz.d.ts.map +1 -0
- package/styles/themes/theme-quartz.js +120 -0
- package/styles/themes/theme-quartz.js.map +1 -0
- package/theme/css-var-injector.d.ts +10 -0
- package/theme/css-var-injector.d.ts.map +1 -0
- package/theme/css-var-injector.js +63 -0
- package/theme/css-var-injector.js.map +1 -0
- package/theme/theme-manager.d.ts +20 -0
- package/theme/theme-manager.d.ts.map +1 -0
- package/theme/theme-manager.js +79 -0
- package/theme/theme-manager.js.map +1 -0
- package/theme/themes/dark-theme.d.ts +3 -0
- package/theme/themes/dark-theme.d.ts.map +1 -0
- package/theme/themes/dark-theme.js +149 -0
- package/theme/themes/dark-theme.js.map +1 -0
- package/theme/themes/light-theme.d.ts +3 -0
- package/theme/themes/light-theme.d.ts.map +1 -0
- package/theme/themes/light-theme.js +149 -0
- package/theme/themes/light-theme.js.map +1 -0
- package/types/column.types.d.ts +195 -0
- package/types/column.types.d.ts.map +1 -0
- package/types/column.types.js +2 -0
- package/types/column.types.js.map +1 -0
- package/types/event.types.d.ts +213 -0
- package/types/event.types.d.ts.map +1 -0
- package/types/event.types.js +67 -0
- package/types/event.types.js.map +1 -0
- package/types/filter.types.d.ts +42 -0
- package/types/filter.types.d.ts.map +1 -0
- package/types/filter.types.js +2 -0
- package/types/filter.types.js.map +1 -0
- package/types/grid.types.d.ts +214 -0
- package/types/grid.types.d.ts.map +1 -0
- package/types/grid.types.js +2 -0
- package/types/grid.types.js.map +1 -0
- package/types/master-detail.types.d.ts +112 -0
- package/types/master-detail.types.d.ts.map +1 -0
- package/types/master-detail.types.js +2 -0
- package/types/master-detail.types.js.map +1 -0
- package/types/photon-ai.types.d.ts +19 -0
- package/types/photon-ai.types.d.ts.map +1 -0
- package/types/photon-ai.types.js +2 -0
- package/types/photon-ai.types.js.map +1 -0
- package/types/renderer.types.d.ts +156 -0
- package/types/renderer.types.d.ts.map +1 -0
- package/types/renderer.types.js +19 -0
- package/types/renderer.types.js.map +1 -0
- package/types/row.types.d.ts +127 -0
- package/types/row.types.d.ts.map +1 -0
- package/types/row.types.js +9 -0
- package/types/row.types.js.map +1 -0
- package/types/theme.types.d.ts +159 -0
- package/types/theme.types.d.ts.map +1 -0
- package/types/theme.types.js +2 -0
- package/types/theme.types.js.map +1 -0
- package/types/tree-data.types.d.ts +94 -0
- package/types/tree-data.types.d.ts.map +1 -0
- package/types/tree-data.types.js +2 -0
- package/types/tree-data.types.js.map +1 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ColumnDef } from '../../types/column.types';
|
|
2
|
+
import type { RowNode } from '../../types/row.types';
|
|
3
|
+
import type { CardinalityInfo } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Counts distinct values for a single column and classifies cardinality.
|
|
6
|
+
* Used by the RecommendationEngine to choose between pie (low cardinality)
|
|
7
|
+
* and bar charts (high cardinality).
|
|
8
|
+
*/
|
|
9
|
+
export declare class CardinalityAnalyzer {
|
|
10
|
+
/** @param topN Max number of top-frequency values to return */
|
|
11
|
+
analyze(column: ColumnDef, rows: RowNode[], topN?: number): CardinalityInfo;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=cardinality-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cardinality-analyzer.d.ts","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/cardinality-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B,gEAAgE;IAChE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,SAAK,GAAG,eAAe;CAqBxE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Counts distinct values for a single column and classifies cardinality.
|
|
3
|
+
* Used by the RecommendationEngine to choose between pie (low cardinality)
|
|
4
|
+
* and bar charts (high cardinality).
|
|
5
|
+
*/
|
|
6
|
+
export class CardinalityAnalyzer {
|
|
7
|
+
/** @param topN Max number of top-frequency values to return */
|
|
8
|
+
analyze(column, rows, topN = 20) {
|
|
9
|
+
const freq = new Map();
|
|
10
|
+
for (const row of rows) {
|
|
11
|
+
if (row.type !== 'data')
|
|
12
|
+
continue;
|
|
13
|
+
const raw = row.data[column.field];
|
|
14
|
+
const key = raw == null ? '' : String(raw);
|
|
15
|
+
freq.set(key, (freq.get(key) ?? 0) + 1);
|
|
16
|
+
}
|
|
17
|
+
const topValues = Array.from(freq.entries())
|
|
18
|
+
.sort((a, b) => b[1] - a[1])
|
|
19
|
+
.slice(0, topN)
|
|
20
|
+
.map(([k]) => k);
|
|
21
|
+
return {
|
|
22
|
+
uniqueCount: freq.size,
|
|
23
|
+
isHighCardinality: freq.size > 20,
|
|
24
|
+
topValues,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=cardinality-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cardinality-analyzer.js","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/cardinality-analyzer.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IAC9B,gEAAgE;IAChE,OAAO,CAAC,MAAiB,EAAE,IAAe,EAAE,IAAI,GAAG,EAAE;QACnD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;QAEvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YAClC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;aACzC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3B,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;aACd,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAEnB,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,IAAI;YACtB,iBAAiB,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE;YACjC,SAAS;SACV,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ColumnDef } from '../../types/column.types';
|
|
2
|
+
import type { RowNode } from '../../types/row.types';
|
|
3
|
+
import type { DimensionInfo } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Identifies categorical/ordinal columns in the selection and computes
|
|
6
|
+
* cardinality metadata needed by downstream analyzers and the
|
|
7
|
+
* RecommendationEngine.
|
|
8
|
+
*/
|
|
9
|
+
export declare class DimensionAnalyzer {
|
|
10
|
+
analyze(columns: ColumnDef[], rows: RowNode[]): DimensionInfo[];
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=dimension-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dimension-analyzer.d.ts","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/dimension-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE;CA2BhE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { DIMENSION_TYPES, DATE_TYPES, MAX_CATEGORIES } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Identifies categorical/ordinal columns in the selection and computes
|
|
4
|
+
* cardinality metadata needed by downstream analyzers and the
|
|
5
|
+
* RecommendationEngine.
|
|
6
|
+
*/
|
|
7
|
+
export class DimensionAnalyzer {
|
|
8
|
+
analyze(columns, rows) {
|
|
9
|
+
const dimCols = columns.filter((c) => DIMENSION_TYPES.has(c.type));
|
|
10
|
+
return dimCols.map((col) => {
|
|
11
|
+
const seen = new Set();
|
|
12
|
+
for (const row of rows) {
|
|
13
|
+
if (row.type !== 'data')
|
|
14
|
+
continue;
|
|
15
|
+
const raw = row.data[col.field];
|
|
16
|
+
seen.add(raw == null ? '' : String(raw));
|
|
17
|
+
}
|
|
18
|
+
const isDate = DATE_TYPES.has(col.type);
|
|
19
|
+
const isBoolean = col.type === 'boolean';
|
|
20
|
+
const isHighCardinality = seen.size > 20;
|
|
21
|
+
const uniqueValues = Array.from(seen).slice(0, MAX_CATEGORIES);
|
|
22
|
+
return {
|
|
23
|
+
column: col,
|
|
24
|
+
role: isDate ? 'date' : isBoolean ? 'boolean' : 'category',
|
|
25
|
+
uniqueValues,
|
|
26
|
+
uniqueCount: seen.size,
|
|
27
|
+
isHighCardinality,
|
|
28
|
+
isDate,
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=dimension-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dimension-analyzer.js","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/dimension-analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGtE;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAC5B,OAAO,CAAC,OAAoB,EAAE,IAAe;QAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAc,CAAC,CAAC,CAAC;QAE7E,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;oBAAE,SAAS;gBAClC,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAChC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAc,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC;YACzC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACzC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YAE/D,OAAO;gBACL,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;gBAC1D,YAAY;gBACZ,WAAW,EAAE,IAAI,CAAC,IAAI;gBACtB,iBAAiB;gBACjB,MAAM;aACP,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MeasureInfo, AnalyzedChart } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Produces a frequency-distribution dataset from a single numeric column.
|
|
4
|
+
* Bin count is determined by Sturges' formula: ceil(log2(n) + 1).
|
|
5
|
+
* The output is consumed by a column-grouped chart in the renderer.
|
|
6
|
+
*/
|
|
7
|
+
export declare class HistogramAnalyzer {
|
|
8
|
+
analyze(measures: MeasureInfo[]): AnalyzedChart | null;
|
|
9
|
+
private fmtRange;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=histogram-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"histogram-analyzer.d.ts","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/histogram-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG1D;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,aAAa,GAAG,IAAI;IA+BtD,OAAO,CAAC,QAAQ;CAOjB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { APEX_COLORS } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Produces a frequency-distribution dataset from a single numeric column.
|
|
4
|
+
* Bin count is determined by Sturges' formula: ceil(log2(n) + 1).
|
|
5
|
+
* The output is consumed by a column-grouped chart in the renderer.
|
|
6
|
+
*/
|
|
7
|
+
export class HistogramAnalyzer {
|
|
8
|
+
analyze(measures) {
|
|
9
|
+
if (!measures.length)
|
|
10
|
+
return null;
|
|
11
|
+
const measure = measures[0];
|
|
12
|
+
const values = measure.allValues.filter((v) => !isNaN(v));
|
|
13
|
+
if (!values.length)
|
|
14
|
+
return null;
|
|
15
|
+
// Sturges' formula, clamped between 5 and 20 bins
|
|
16
|
+
const binCount = Math.min(Math.max(Math.ceil(Math.log2(values.length) + 1), 5), 20);
|
|
17
|
+
const range = measure.max - measure.min || 1;
|
|
18
|
+
const binSize = range / binCount;
|
|
19
|
+
const bins = [];
|
|
20
|
+
for (let i = 0; i < binCount; i++) {
|
|
21
|
+
bins.push({ start: measure.min + i * binSize, end: measure.min + (i + 1) * binSize, count: 0 });
|
|
22
|
+
}
|
|
23
|
+
for (const v of values) {
|
|
24
|
+
const idx = Math.min(Math.floor((v - measure.min) / binSize), binCount - 1);
|
|
25
|
+
if (idx >= 0)
|
|
26
|
+
bins[idx].count++;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
title: `${measure.column.header} Distribution`,
|
|
30
|
+
data: {
|
|
31
|
+
labels: bins.map((b) => this.fmtRange(b.start, b.end)),
|
|
32
|
+
datasets: [{ label: 'Frequency', data: bins.map((b) => b.count), color: APEX_COLORS[0] }],
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
fmtRange(start, end) {
|
|
37
|
+
const f = (n) => n >= 1000000 ? `${(n / 1000000).toFixed(1)}M`
|
|
38
|
+
: n >= 1000 ? `${(n / 1000).toFixed(1)}K`
|
|
39
|
+
: Number.isInteger(n) ? String(n) : n.toFixed(1);
|
|
40
|
+
return `${f(start)}–${f(end)}`;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=histogram-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"histogram-analyzer.js","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/histogram-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { RowNode } from '../../types/row.types';
|
|
2
|
+
import type { ColumnDef } from '../../types/column.types';
|
|
3
|
+
import type { CellRange } from '../../types/grid.types';
|
|
4
|
+
import { CardinalityAnalyzer } from './cardinality-analyzer';
|
|
5
|
+
import type { AnalyzedChart, ChartRecommendation } from './types';
|
|
6
|
+
export type { AnalyzedChart, ChartRecommendation };
|
|
7
|
+
/**
|
|
8
|
+
* Top-level orchestrator that mirrors AG Grid's chart-range analysis pipeline:
|
|
9
|
+
*
|
|
10
|
+
* selection → DimensionAnalyzer + MeasureAnalyzer
|
|
11
|
+
* → RecommendationEngine (best chart type)
|
|
12
|
+
* → chart-specific Analyzer (data shaping)
|
|
13
|
+
* → AnalyzedChart (title + ChartData)
|
|
14
|
+
*
|
|
15
|
+
* Public API
|
|
16
|
+
* ----------
|
|
17
|
+
* analyze(ranges, rows, columns)
|
|
18
|
+
* Returns the best-fit chart data for the current selection, or null when
|
|
19
|
+
* the selection contains no numeric columns.
|
|
20
|
+
*
|
|
21
|
+
* analyzeForType(chartType, ranges, rows, columns)
|
|
22
|
+
* Returns chart data shaped for the explicitly-requested chart type.
|
|
23
|
+
*
|
|
24
|
+
* recommend(ranges, rows, columns)
|
|
25
|
+
* Returns a ranked list of ChartRecommendation objects so a UI can suggest
|
|
26
|
+
* chart types to the user (future use / API extension).
|
|
27
|
+
*/
|
|
28
|
+
export declare class ChartAnalyzer {
|
|
29
|
+
private readonly dimensionAnalyzer;
|
|
30
|
+
private readonly measureAnalyzer;
|
|
31
|
+
readonly cardinalityAnalyzer: CardinalityAnalyzer;
|
|
32
|
+
private readonly aggregationAnalyzer;
|
|
33
|
+
private readonly histogramAnalyzer;
|
|
34
|
+
private readonly scatterAnalyzer;
|
|
35
|
+
private readonly bubbleAnalyzer;
|
|
36
|
+
private readonly pieAnalyzer;
|
|
37
|
+
private readonly barAnalyzer;
|
|
38
|
+
private readonly lineAnalyzer;
|
|
39
|
+
private readonly recommendationEngine;
|
|
40
|
+
/**
|
|
41
|
+
* Analyse a cell selection and return data shaped for the best chart type
|
|
42
|
+
* recommended by the RecommendationEngine, or null if no numeric data.
|
|
43
|
+
*/
|
|
44
|
+
analyze(ranges: CellRange[], rows: RowNode[], columns: ColumnDef[]): AnalyzedChart | null;
|
|
45
|
+
/**
|
|
46
|
+
* Analyse a cell selection and return data shaped for the explicitly
|
|
47
|
+
* requested chart type. Returns null if there are no numeric columns.
|
|
48
|
+
*/
|
|
49
|
+
analyzeForType(chartType: string, ranges: CellRange[], rows: RowNode[], columns: ColumnDef[]): AnalyzedChart | null;
|
|
50
|
+
/**
|
|
51
|
+
* Return a ranked list of chart-type recommendations for the current
|
|
52
|
+
* selection. Useful for a "Recommended charts" panel (not yet in the UI).
|
|
53
|
+
*/
|
|
54
|
+
recommend(ranges: CellRange[], rows: RowNode[], columns: ColumnDef[]): ChartRecommendation[];
|
|
55
|
+
private buildContext;
|
|
56
|
+
private dispatch;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAKxD,OAAO,EAAE,mBAAmB,EAAE,MAAO,wBAAwB,CAAC;AAU9D,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAA8B,MAAM,SAAS,CAAC;AAE9F,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,aAAa;IAExB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA8B;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8B;IAC9D,QAAQ,CAAS,mBAAmB,sBAA8B;IAClE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA8B;IAClE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA8B;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8B;IAC9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8B;IAC7D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA8B;IAC3D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA8B;IAInE;;;OAGG;IACH,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,aAAa,GAAG,IAAI;IAYzF;;;OAGG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,aAAa,GAAG,IAAI;IAUnH;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,mBAAmB,EAAE;IAQ5F,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,QAAQ;CAoCjB"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { normalizeRange } from '../../cell-selection/selection-range';
|
|
2
|
+
import { DimensionAnalyzer } from './dimension-analyzer';
|
|
3
|
+
import { MeasureAnalyzer } from './measure-analyzer';
|
|
4
|
+
import { CardinalityAnalyzer } from './cardinality-analyzer';
|
|
5
|
+
import { AggregationAnalyzer } from './aggregation-analyzer';
|
|
6
|
+
import { HistogramAnalyzer } from './histogram-analyzer';
|
|
7
|
+
import { ScatterAnalyzer } from './scatter-analyzer';
|
|
8
|
+
import { BubbleAnalyzer } from './bubble-analyzer';
|
|
9
|
+
import { PieAnalyzer } from './pie-analyzer';
|
|
10
|
+
import { BarAnalyzer } from './bar-analyzer';
|
|
11
|
+
import { LineAnalyzer } from './line-analyzer';
|
|
12
|
+
import { RecommendationEngine } from './recommendation-engine';
|
|
13
|
+
/**
|
|
14
|
+
* Top-level orchestrator that mirrors AG Grid's chart-range analysis pipeline:
|
|
15
|
+
*
|
|
16
|
+
* selection → DimensionAnalyzer + MeasureAnalyzer
|
|
17
|
+
* → RecommendationEngine (best chart type)
|
|
18
|
+
* → chart-specific Analyzer (data shaping)
|
|
19
|
+
* → AnalyzedChart (title + ChartData)
|
|
20
|
+
*
|
|
21
|
+
* Public API
|
|
22
|
+
* ----------
|
|
23
|
+
* analyze(ranges, rows, columns)
|
|
24
|
+
* Returns the best-fit chart data for the current selection, or null when
|
|
25
|
+
* the selection contains no numeric columns.
|
|
26
|
+
*
|
|
27
|
+
* analyzeForType(chartType, ranges, rows, columns)
|
|
28
|
+
* Returns chart data shaped for the explicitly-requested chart type.
|
|
29
|
+
*
|
|
30
|
+
* recommend(ranges, rows, columns)
|
|
31
|
+
* Returns a ranked list of ChartRecommendation objects so a UI can suggest
|
|
32
|
+
* chart types to the user (future use / API extension).
|
|
33
|
+
*/
|
|
34
|
+
export class ChartAnalyzer {
|
|
35
|
+
constructor() {
|
|
36
|
+
// ── Sub-analyzers ────────────────────────────────────────────────────────
|
|
37
|
+
this.dimensionAnalyzer = new DimensionAnalyzer();
|
|
38
|
+
this.measureAnalyzer = new MeasureAnalyzer();
|
|
39
|
+
this.cardinalityAnalyzer = new CardinalityAnalyzer(); // public for potential external use
|
|
40
|
+
this.aggregationAnalyzer = new AggregationAnalyzer();
|
|
41
|
+
this.histogramAnalyzer = new HistogramAnalyzer();
|
|
42
|
+
this.scatterAnalyzer = new ScatterAnalyzer();
|
|
43
|
+
this.bubbleAnalyzer = new BubbleAnalyzer();
|
|
44
|
+
this.pieAnalyzer = new PieAnalyzer();
|
|
45
|
+
this.barAnalyzer = new BarAnalyzer();
|
|
46
|
+
this.lineAnalyzer = new LineAnalyzer();
|
|
47
|
+
this.recommendationEngine = new RecommendationEngine();
|
|
48
|
+
}
|
|
49
|
+
// ── Public API ───────────────────────────────────────────────────────────
|
|
50
|
+
/**
|
|
51
|
+
* Analyse a cell selection and return data shaped for the best chart type
|
|
52
|
+
* recommended by the RecommendationEngine, or null if no numeric data.
|
|
53
|
+
*/
|
|
54
|
+
analyze(ranges, rows, columns) {
|
|
55
|
+
const ctx = this.buildContext(ranges, rows, columns);
|
|
56
|
+
if (!ctx)
|
|
57
|
+
return null;
|
|
58
|
+
const { dimensions, measures, selectedRows } = ctx;
|
|
59
|
+
if (!measures.length)
|
|
60
|
+
return null;
|
|
61
|
+
const recs = this.recommendationEngine.recommend(dimensions, measures);
|
|
62
|
+
const bestType = recs[0]?.chartType ?? 'column-grouped';
|
|
63
|
+
return this.dispatch(bestType, dimensions, measures, selectedRows);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Analyse a cell selection and return data shaped for the explicitly
|
|
67
|
+
* requested chart type. Returns null if there are no numeric columns.
|
|
68
|
+
*/
|
|
69
|
+
analyzeForType(chartType, ranges, rows, columns) {
|
|
70
|
+
const ctx = this.buildContext(ranges, rows, columns);
|
|
71
|
+
if (!ctx)
|
|
72
|
+
return null;
|
|
73
|
+
const { dimensions, measures, selectedRows } = ctx;
|
|
74
|
+
if (!measures.length)
|
|
75
|
+
return null;
|
|
76
|
+
return this.dispatch(chartType, dimensions, measures, selectedRows);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Return a ranked list of chart-type recommendations for the current
|
|
80
|
+
* selection. Useful for a "Recommended charts" panel (not yet in the UI).
|
|
81
|
+
*/
|
|
82
|
+
recommend(ranges, rows, columns) {
|
|
83
|
+
const ctx = this.buildContext(ranges, rows, columns);
|
|
84
|
+
if (!ctx)
|
|
85
|
+
return [];
|
|
86
|
+
return this.recommendationEngine.recommend(ctx.dimensions, ctx.measures);
|
|
87
|
+
}
|
|
88
|
+
// ── Private helpers ──────────────────────────────────────────────────────
|
|
89
|
+
buildContext(ranges, rows, columns) {
|
|
90
|
+
if (!ranges.length || !rows.length || !columns.length)
|
|
91
|
+
return null;
|
|
92
|
+
const norm = normalizeRange(ranges[0]);
|
|
93
|
+
const selectedCols = columns.slice(norm.startColIndex, norm.endColIndex + 1);
|
|
94
|
+
const selectedRows = rows
|
|
95
|
+
.slice(norm.startRowIndex, norm.endRowIndex + 1)
|
|
96
|
+
.filter((r) => r.type === 'data');
|
|
97
|
+
if (!selectedRows.length || !selectedCols.length)
|
|
98
|
+
return null;
|
|
99
|
+
const dimensions = this.dimensionAnalyzer.analyze(selectedCols, selectedRows);
|
|
100
|
+
const measures = this.measureAnalyzer.analyze(selectedCols, selectedRows);
|
|
101
|
+
return { dimensions, measures, selectedRows, selectedCols };
|
|
102
|
+
}
|
|
103
|
+
dispatch(chartType, dimensions, measures, rows) {
|
|
104
|
+
switch (chartType) {
|
|
105
|
+
case 'pie':
|
|
106
|
+
case 'doughnut':
|
|
107
|
+
return this.pieAnalyzer.analyze(dimensions, measures, rows, this.aggregationAnalyzer);
|
|
108
|
+
case 'scatter':
|
|
109
|
+
return this.scatterAnalyzer.analyze(dimensions, measures, rows);
|
|
110
|
+
case 'bubble':
|
|
111
|
+
return this.bubbleAnalyzer.analyze(dimensions, measures, rows);
|
|
112
|
+
case 'line':
|
|
113
|
+
case 'area':
|
|
114
|
+
return this.lineAnalyzer.analyze(dimensions, measures, rows, this.aggregationAnalyzer);
|
|
115
|
+
case 'column-grouped':
|
|
116
|
+
case 'column-stacked':
|
|
117
|
+
case 'column-100stacked': {
|
|
118
|
+
// Single measure + no dimension → histogram (frequency distribution)
|
|
119
|
+
if (dimensions.length === 0 && measures.length === 1) {
|
|
120
|
+
return this.histogramAnalyzer.analyze(measures);
|
|
121
|
+
}
|
|
122
|
+
return this.barAnalyzer.analyze(dimensions, measures, rows, this.aggregationAnalyzer);
|
|
123
|
+
}
|
|
124
|
+
default:
|
|
125
|
+
// bar-grouped, bar-stacked, bar-100stacked, funnel, polar
|
|
126
|
+
return this.barAnalyzer.analyze(dimensions, measures, rows, this.aggregationAnalyzer);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RowNode } from '../../types/row.types';
|
|
2
|
+
import type { DimensionInfo, MeasureInfo, AnalyzedChart } from './types';
|
|
3
|
+
import type { AggregationAnalyzer } from './aggregation-analyzer';
|
|
4
|
+
/**
|
|
5
|
+
* Builds data for line and area charts.
|
|
6
|
+
*
|
|
7
|
+
* Strategy:
|
|
8
|
+
* • date dimension present → aggregate measures over the date axis;
|
|
9
|
+
* produces a proper time-series with X labels from the date column.
|
|
10
|
+
* • category dimension → same aggregation, labels from the dimension.
|
|
11
|
+
* • no dimension → use row-index labels (1, 2, 3…), each row
|
|
12
|
+
* is a separate data point with no aggregation.
|
|
13
|
+
*
|
|
14
|
+
* Titles:
|
|
15
|
+
* • one measure + date dim → "Revenue over Date"
|
|
16
|
+
* • one measure + category → "Revenue by Category"
|
|
17
|
+
* • multiple measures → "Revenue & Profit"
|
|
18
|
+
*/
|
|
19
|
+
export declare class LineAnalyzer {
|
|
20
|
+
private static readonly MAX_POINTS_NO_DIM;
|
|
21
|
+
analyze(dimensions: DimensionInfo[], measures: MeasureInfo[], rows: RowNode[], agg: AggregationAnalyzer): AnalyzedChart | null;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=line-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-analyzer.d.ts","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/line-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE;;;;;;;;;;;;;;GAcG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAM;IAE/C,OAAO,CACL,UAAU,EAAE,aAAa,EAAE,EAC3B,QAAQ,EAAE,WAAW,EAAE,EACvB,IAAI,EAAE,OAAO,EAAE,EACf,GAAG,EAAE,mBAAmB,GACvB,aAAa,GAAG,IAAI;CAkDxB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { APEX_COLORS } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Builds data for line and area charts.
|
|
4
|
+
*
|
|
5
|
+
* Strategy:
|
|
6
|
+
* • date dimension present → aggregate measures over the date axis;
|
|
7
|
+
* produces a proper time-series with X labels from the date column.
|
|
8
|
+
* • category dimension → same aggregation, labels from the dimension.
|
|
9
|
+
* • no dimension → use row-index labels (1, 2, 3…), each row
|
|
10
|
+
* is a separate data point with no aggregation.
|
|
11
|
+
*
|
|
12
|
+
* Titles:
|
|
13
|
+
* • one measure + date dim → "Revenue over Date"
|
|
14
|
+
* • one measure + category → "Revenue by Category"
|
|
15
|
+
* • multiple measures → "Revenue & Profit"
|
|
16
|
+
*/
|
|
17
|
+
export class LineAnalyzer {
|
|
18
|
+
analyze(dimensions, measures, rows, agg) {
|
|
19
|
+
if (!measures.length)
|
|
20
|
+
return null;
|
|
21
|
+
// Prefer date dimension for a true time-series; fall back to first dimension
|
|
22
|
+
const dim = dimensions.find((d) => d.isDate) ?? dimensions[0] ?? null;
|
|
23
|
+
if (!dim) {
|
|
24
|
+
// Raw row-index series — good for trending visualisation without categories
|
|
25
|
+
const dataRows = rows.filter((r) => r.type === 'data').slice(0, LineAnalyzer.MAX_POINTS_NO_DIM);
|
|
26
|
+
const title = measures.map((m) => m.column.header).join(' & ');
|
|
27
|
+
return {
|
|
28
|
+
title,
|
|
29
|
+
data: {
|
|
30
|
+
labels: dataRows.map((_, i) => String(i + 1)),
|
|
31
|
+
datasets: measures.map((m, i) => ({
|
|
32
|
+
label: m.column.header,
|
|
33
|
+
data: dataRows.map((r) => {
|
|
34
|
+
const v = Number(r.data[m.column.field]);
|
|
35
|
+
return isNaN(v) ? 0 : v;
|
|
36
|
+
}),
|
|
37
|
+
color: APEX_COLORS[i % APEX_COLORS.length],
|
|
38
|
+
})),
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const aggregated = agg.aggregate(dim.column, measures.map((m) => m.column), rows);
|
|
43
|
+
const connector = dim.isDate ? 'over' : 'by';
|
|
44
|
+
const title = measures.length === 1
|
|
45
|
+
? `${measures[0].column.header} ${connector} ${dim.column.header}`
|
|
46
|
+
: measures.map((m) => m.column.header).join(' & ');
|
|
47
|
+
return {
|
|
48
|
+
title,
|
|
49
|
+
data: {
|
|
50
|
+
labels: aggregated.labels,
|
|
51
|
+
datasets: measures.map((m, i) => ({
|
|
52
|
+
label: m.column.header,
|
|
53
|
+
data: aggregated.seriesData.get(m.column.field) ?? [],
|
|
54
|
+
color: APEX_COLORS[i % APEX_COLORS.length],
|
|
55
|
+
})),
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
LineAnalyzer.MAX_POINTS_NO_DIM = 50;
|
|
61
|
+
//# sourceMappingURL=line-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-analyzer.js","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/line-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ColumnDef } from '../../types/column.types';
|
|
2
|
+
import type { RowNode } from '../../types/row.types';
|
|
3
|
+
import type { MeasureInfo } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Identifies numeric columns (number, currency, percentage) and computes
|
|
6
|
+
* descriptive statistics used by chart-specific analyzers.
|
|
7
|
+
*/
|
|
8
|
+
export declare class MeasureAnalyzer {
|
|
9
|
+
analyze(columns: ColumnDef[], rows: RowNode[]): MeasureInfo[];
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=measure-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measure-analyzer.d.ts","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/measure-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE;CAsC9D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { MEASURE_TYPES } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Identifies numeric columns (number, currency, percentage) and computes
|
|
4
|
+
* descriptive statistics used by chart-specific analyzers.
|
|
5
|
+
*/
|
|
6
|
+
export class MeasureAnalyzer {
|
|
7
|
+
analyze(columns, rows) {
|
|
8
|
+
const measCols = columns.filter((c) => MEASURE_TYPES.has(c.type));
|
|
9
|
+
return measCols.map((col) => {
|
|
10
|
+
const allValues = [];
|
|
11
|
+
for (const row of rows) {
|
|
12
|
+
if (row.type !== 'data')
|
|
13
|
+
continue;
|
|
14
|
+
const v = Number(row.data[col.field]);
|
|
15
|
+
if (!isNaN(v))
|
|
16
|
+
allValues.push(v);
|
|
17
|
+
}
|
|
18
|
+
if (!allValues.length) {
|
|
19
|
+
return { column: col, min: 0, max: 0, sum: 0, avg: 0, count: 0, hasNegatives: false, allValues };
|
|
20
|
+
}
|
|
21
|
+
let min = allValues[0];
|
|
22
|
+
let max = allValues[0];
|
|
23
|
+
let sum = 0;
|
|
24
|
+
for (const v of allValues) {
|
|
25
|
+
if (v < min)
|
|
26
|
+
min = v;
|
|
27
|
+
if (v > max)
|
|
28
|
+
max = v;
|
|
29
|
+
sum += v;
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
column: col,
|
|
33
|
+
min,
|
|
34
|
+
max,
|
|
35
|
+
sum,
|
|
36
|
+
avg: sum / allValues.length,
|
|
37
|
+
count: allValues.length,
|
|
38
|
+
hasNegatives: min < 0,
|
|
39
|
+
allValues,
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=measure-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measure-analyzer.js","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/measure-analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC;;;GAGG;AACH,MAAM,OAAO,eAAe;IAC1B,OAAO,CAAC,OAAoB,EAAE,IAAe;QAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAc,CAAC,CAAC,CAAC;QAE5E,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1B,MAAM,SAAS,GAAa,EAAE,CAAC;YAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;oBAAE,SAAS;gBAClC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;gBACtC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnC,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBACtB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YACnG,CAAC;YAED,IAAI,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,GAAG,GAAG,CAAC,CAAC;YAEZ,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,GAAG,GAAG;oBAAE,GAAG,GAAG,CAAC,CAAC;gBACrB,IAAI,CAAC,GAAG,GAAG;oBAAE,GAAG,GAAG,CAAC,CAAC;gBACrB,GAAG,IAAI,CAAC,CAAC;YACX,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,GAAG;gBACX,GAAG;gBACH,GAAG;gBACH,GAAG;gBACH,GAAG,EAAE,GAAG,GAAG,SAAS,CAAC,MAAM;gBAC3B,KAAK,EAAE,SAAS,CAAC,MAAM;gBACvB,YAAY,EAAE,GAAG,GAAG,CAAC;gBACrB,SAAS;aACV,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { RowNode } from '../../types/row.types';
|
|
2
|
+
import type { DimensionInfo, MeasureInfo, AnalyzedChart } from './types';
|
|
3
|
+
import type { AggregationAnalyzer } from './aggregation-analyzer';
|
|
4
|
+
/**
|
|
5
|
+
* Builds pie / doughnut chart data.
|
|
6
|
+
*
|
|
7
|
+
* Strategy:
|
|
8
|
+
* • 1 dimension + 1 measure → aggregate measure by dimension, top-N slices
|
|
9
|
+
* with an "Other (n)" remainder slice when the category count exceeds
|
|
10
|
+
* PIE_MAX_SLICES.
|
|
11
|
+
* • No dimension → treat the first PIE_MAX_SLICES rows as individual slices.
|
|
12
|
+
*
|
|
13
|
+
* Slices are sorted by value (descending) so the largest segment always
|
|
14
|
+
* appears first at the 12-o'clock position in the renderer.
|
|
15
|
+
*/
|
|
16
|
+
export declare class PieAnalyzer {
|
|
17
|
+
analyze(dimensions: DimensionInfo[], measures: MeasureInfo[], rows: RowNode[], agg: AggregationAnalyzer): AnalyzedChart | null;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=pie-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pie-analyzer.d.ts","sourceRoot":"","sources":["../../../src/chart/chart-analyzer/pie-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,qBAAa,WAAW;IACtB,OAAO,CACL,UAAU,EAAE,aAAa,EAAE,EAC3B,QAAQ,EAAE,WAAW,EAAE,EACvB,IAAI,EAAE,OAAO,EAAE,EACf,GAAG,EAAE,mBAAmB,GACvB,aAAa,GAAG,IAAI;CAsDxB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { APEX_COLORS, PIE_MAX_SLICES } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Builds pie / doughnut chart data.
|
|
4
|
+
*
|
|
5
|
+
* Strategy:
|
|
6
|
+
* • 1 dimension + 1 measure → aggregate measure by dimension, top-N slices
|
|
7
|
+
* with an "Other (n)" remainder slice when the category count exceeds
|
|
8
|
+
* PIE_MAX_SLICES.
|
|
9
|
+
* • No dimension → treat the first PIE_MAX_SLICES rows as individual slices.
|
|
10
|
+
*
|
|
11
|
+
* Slices are sorted by value (descending) so the largest segment always
|
|
12
|
+
* appears first at the 12-o'clock position in the renderer.
|
|
13
|
+
*/
|
|
14
|
+
export class PieAnalyzer {
|
|
15
|
+
analyze(dimensions, measures, rows, agg) {
|
|
16
|
+
if (!measures.length)
|
|
17
|
+
return null;
|
|
18
|
+
const dim = dimensions[0] ?? null;
|
|
19
|
+
const measure = measures[0];
|
|
20
|
+
if (!dim) {
|
|
21
|
+
// Dimensionless: show raw values of the first measure
|
|
22
|
+
const sliceRows = rows.filter((r) => r.type === 'data').slice(0, PIE_MAX_SLICES);
|
|
23
|
+
return {
|
|
24
|
+
title: `${measure.column.header} Distribution`,
|
|
25
|
+
data: {
|
|
26
|
+
labels: sliceRows.map((_, i) => `Row ${i + 1}`),
|
|
27
|
+
datasets: [{
|
|
28
|
+
label: measure.column.header,
|
|
29
|
+
data: sliceRows.map((r) => {
|
|
30
|
+
const v = Number(r.data[measure.column.field]);
|
|
31
|
+
return isNaN(v) ? 0 : v;
|
|
32
|
+
}),
|
|
33
|
+
color: APEX_COLORS[0],
|
|
34
|
+
}],
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// Aggregate measure by dimension
|
|
39
|
+
const aggregated = agg.aggregate(dim.column, [measure.column], rows);
|
|
40
|
+
const measureData = aggregated.seriesData.get(measure.column.field) ?? [];
|
|
41
|
+
// Pair labels with values, sort descending
|
|
42
|
+
const pairs = aggregated.labels
|
|
43
|
+
.map((label, i) => ({ label, value: measureData[i] ?? 0 }))
|
|
44
|
+
.sort((a, b) => b.value - a.value);
|
|
45
|
+
let topSlices = pairs.slice(0, PIE_MAX_SLICES);
|
|
46
|
+
const remainder = pairs.slice(PIE_MAX_SLICES);
|
|
47
|
+
if (remainder.length > 0) {
|
|
48
|
+
const otherSum = remainder.reduce((s, p) => s + p.value, 0);
|
|
49
|
+
topSlices.push({ label: `Other (${remainder.length})`, value: otherSum });
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
title: `${measure.column.header} by ${dim.column.header}`,
|
|
53
|
+
data: {
|
|
54
|
+
labels: topSlices.map((s) => s.label),
|
|
55
|
+
datasets: [{
|
|
56
|
+
label: measure.column.header,
|
|
57
|
+
data: topSlices.map((s) => s.value),
|
|
58
|
+
color: APEX_COLORS[0],
|
|
59
|
+
}],
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=pie-analyzer.js.map
|