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,675 @@
|
|
|
1
|
+
import { injectBaseStyles } from '../styles/base-styles';
|
|
2
|
+
import { formatValue } from '../engines/editing/value-parser';
|
|
3
|
+
import { resolveColumnRenderer } from '../renderer/renderer-resolver';
|
|
4
|
+
import { CustomDropdownEditor } from '../engines/editing/custom-dropdown-editor';
|
|
5
|
+
import { EventBus } from '../event-bus/event-bus';
|
|
6
|
+
import { GridStore } from './grid-store';
|
|
7
|
+
import { ColumnModel } from './column-model';
|
|
8
|
+
import { RowModel } from './row-model';
|
|
9
|
+
import { SortEngine } from '../engines/sort/sort-engine';
|
|
10
|
+
import { FilterEngine } from '../engines/filter/filter-engine';
|
|
11
|
+
import { PaginationEngine } from '../engines/pagination/pagination-engine';
|
|
12
|
+
import { GroupingEngine } from '../engines/grouping/grouping-engine';
|
|
13
|
+
import { AggregationEngine } from '../engines/aggregation/aggregation-engine';
|
|
14
|
+
import { RowSelectionEngine } from '../engines/selection/row-selection-engine';
|
|
15
|
+
import { CellEditorEngine } from '../engines/editing/cell-editor-engine';
|
|
16
|
+
import { SummaryEngine } from '../engines/summary/summary-engine';
|
|
17
|
+
import { ExportEngine } from '../engines/export/export-engine';
|
|
18
|
+
import { ClipboardEngine } from '../engines/clipboard/clipboard-engine';
|
|
19
|
+
import { DragDropEngine } from '../drag-drop/drag-drop-engine';
|
|
20
|
+
import { CellSelectionEngine } from '../cell-selection/cell-selection-engine';
|
|
21
|
+
import { ThemeManager } from '../theme/theme-manager';
|
|
22
|
+
import { IconRegistry } from '../icons/icon-registry';
|
|
23
|
+
import { IconRenderer } from '../icons/icon-renderer';
|
|
24
|
+
import { ChartEngine } from '../chart/chart-engine';
|
|
25
|
+
import { ChartPanel } from '../chart/chart-panel';
|
|
26
|
+
import { ChartAnalyzer } from '../chart/chart-analyzer';
|
|
27
|
+
import { GridRenderer } from '../renderer/grid-renderer';
|
|
28
|
+
import { GridApi } from './grid-api';
|
|
29
|
+
import { GridEventType } from '../types/event.types';
|
|
30
|
+
import { UndoRedoEngine } from '../engines/undo-redo/undo-redo-engine';
|
|
31
|
+
import { MasterDetailEngine } from '../engines/master-detail/master-detail-engine';
|
|
32
|
+
import { TreeDataService } from '../engines/tree/tree-data-service';
|
|
33
|
+
import { TreeExpansionService } from '../engines/tree/tree-expansion-service';
|
|
34
|
+
import { TreeSelectionService } from '../engines/tree/tree-selection-service';
|
|
35
|
+
import { DisplayGroupEngine } from '../column-groups/display-group-engine';
|
|
36
|
+
import { PhotonAIService } from '../photon-ai/photon-ai-service';
|
|
37
|
+
/** Recursively collects leaf `ColumnDef` entries, skipping group wrappers. */
|
|
38
|
+
function collectLeaves(cols) {
|
|
39
|
+
const result = [];
|
|
40
|
+
for (const col of cols) {
|
|
41
|
+
if (Array.isArray(col.children) && col.children.length > 0) {
|
|
42
|
+
result.push(...collectLeaves(col.children));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
result.push(col);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
export class GridCore {
|
|
51
|
+
constructor(containerEl, options) {
|
|
52
|
+
/** Set during `buildContext` when any top-level `ColumnDef` has `children`. */
|
|
53
|
+
this.columnGroupModel = null;
|
|
54
|
+
this.groupHeaderBuilder = null;
|
|
55
|
+
/** New Display Group Engine — replaces `columnGroupModel` for group rendering. */
|
|
56
|
+
this.displayGroupEngine = null;
|
|
57
|
+
/** Set in `initialize` when `photonAI.enabled` — needs the live `GridApi`, so it cannot be built in `buildContext`. */
|
|
58
|
+
this.photonAIService = null;
|
|
59
|
+
this.ctx = this.buildContext(containerEl, options);
|
|
60
|
+
this.api = new GridApi(this.ctx);
|
|
61
|
+
this.initialize();
|
|
62
|
+
}
|
|
63
|
+
buildContext(containerEl, options) {
|
|
64
|
+
const eventBus = new EventBus();
|
|
65
|
+
const store = new GridStore(eventBus);
|
|
66
|
+
const columnModel = new ColumnModel(store, eventBus);
|
|
67
|
+
const rowModel = new RowModel(store, eventBus);
|
|
68
|
+
const sortEngine = new SortEngine(store, eventBus);
|
|
69
|
+
const filterEngine = new FilterEngine(store, eventBus);
|
|
70
|
+
const paginationEngine = new PaginationEngine(store, eventBus);
|
|
71
|
+
const aggregationEngine = new AggregationEngine();
|
|
72
|
+
const groupingEngine = new GroupingEngine(store, eventBus, aggregationEngine);
|
|
73
|
+
const rowSelectionEngine = new RowSelectionEngine(store, eventBus);
|
|
74
|
+
const cellEditorEngine = new CellEditorEngine(store, eventBus);
|
|
75
|
+
const summaryEngine = new SummaryEngine();
|
|
76
|
+
const exportEngine = new ExportEngine(eventBus);
|
|
77
|
+
const clipboardEngine = new ClipboardEngine();
|
|
78
|
+
const dragDropEngine = new DragDropEngine(eventBus);
|
|
79
|
+
const undoRedoEngine = new UndoRedoEngine();
|
|
80
|
+
const cellSelectionEngine = new CellSelectionEngine(store, eventBus, clipboardEngine, undoRedoEngine);
|
|
81
|
+
const masterDetailEngine = new MasterDetailEngine(store, eventBus, rowModel);
|
|
82
|
+
const treeExpansionService = new TreeExpansionService(store, eventBus);
|
|
83
|
+
const treeDataService = new TreeDataService(store, eventBus, filterEngine, sortEngine, treeExpansionService);
|
|
84
|
+
const treeSelectionService = new TreeSelectionService(rowSelectionEngine, treeDataService);
|
|
85
|
+
const themeManager = new ThemeManager(eventBus);
|
|
86
|
+
const iconRegistry = new IconRegistry();
|
|
87
|
+
const iconRenderer = new IconRenderer(iconRegistry);
|
|
88
|
+
const chartEngine = new ChartEngine(eventBus);
|
|
89
|
+
const renderer = new GridRenderer(containerEl, store, eventBus, columnModel, paginationEngine, iconRenderer, cellSelectionEngine, sortEngine, rowSelectionEngine, groupingEngine, options);
|
|
90
|
+
// ── Column-group wiring ────────────────────────────────────────────────
|
|
91
|
+
// Detect whether any top-level ColumnDef uses the `children` property.
|
|
92
|
+
// When present, create the DisplayGroupEngine and wire it into the renderer.
|
|
93
|
+
// The engine parses the logical group tree once; all subsequent renders use
|
|
94
|
+
// a stateless builder to produce fresh display trees from the current column order.
|
|
95
|
+
const hasGroups = options.columns?.some((c) => Array.isArray(c.children) && c.children.length > 0) ?? false;
|
|
96
|
+
if (hasGroups) {
|
|
97
|
+
const engine = new DisplayGroupEngine(renderer.colStyles, eventBus, columnModel, store, iconRenderer);
|
|
98
|
+
engine.parse(options.columns);
|
|
99
|
+
this.displayGroupEngine = engine;
|
|
100
|
+
renderer.setDisplayGroupEngine(engine);
|
|
101
|
+
}
|
|
102
|
+
// ── Master/Detail wiring ────────────────────────────────────────────────
|
|
103
|
+
// Injects a factory rather than letting the renderer import `GridCore`
|
|
104
|
+
// directly — `GridRenderer` must not depend on `GridCore` at the module
|
|
105
|
+
// level, since `GridCore` already imports `GridRenderer`.
|
|
106
|
+
renderer.setMasterDetailConfig(masterDetailEngine, (el, opts) => new GridCore(el, opts), iconRenderer, themeManager);
|
|
107
|
+
// Any refresh the engine itself requests (async `getDetailData` resolving,
|
|
108
|
+
// or the auto-height measurement correcting a detail row's placeholder
|
|
109
|
+
// height to its real content height) must ALSO be captured for animation —
|
|
110
|
+
// otherwise the sibling-row slide from the initial toggle click is
|
|
111
|
+
// immediately followed by an uncaptured, instantly-snapping correction,
|
|
112
|
+
// which reads as a jerk right after the smooth expand.
|
|
113
|
+
masterDetailEngine.setRefreshCallback(() => {
|
|
114
|
+
const currentRows = store.get('visibleRows');
|
|
115
|
+
if (currentRows.length > 0)
|
|
116
|
+
renderer.captureRowAnimation(currentRows, 'detail');
|
|
117
|
+
this.api.refresh();
|
|
118
|
+
});
|
|
119
|
+
// ── Tree Data wiring ────────────────────────────────────────────────────
|
|
120
|
+
// Async lazy-load resolving, or a drag-to-reparent commit, both need a
|
|
121
|
+
// pipeline refresh — same DI pattern as `masterDetailEngine` above.
|
|
122
|
+
treeDataService.setRefreshCallback(() => this.api.refresh());
|
|
123
|
+
// Drag-to-reparent is only meaningful for mutable hierarchy sources
|
|
124
|
+
// (`parentId`/`childrenField`) — `getDataPath`/`custom` are derived and
|
|
125
|
+
// read-only, so `TreeDataService.moveNode` itself refuses those modes;
|
|
126
|
+
// gating drag detection here too avoids even showing 3-way drop zones
|
|
127
|
+
// for a drag that can never commit.
|
|
128
|
+
renderer.setTreeDragConfig(!!options.treeData?.enabled && (options.treeData.mode === 'parentId' || options.treeData.mode === 'childrenField'), (draggedId, targetId, position) => treeDataService.moveNode(draggedId, targetId, position));
|
|
129
|
+
if (options.treeData?.enabled) {
|
|
130
|
+
renderer.setTreeRenderConfig(options.treeData.toggleColumnId, treeExpansionService);
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
options,
|
|
134
|
+
containerEl,
|
|
135
|
+
eventBus,
|
|
136
|
+
store,
|
|
137
|
+
columnModel,
|
|
138
|
+
rowModel,
|
|
139
|
+
sortEngine,
|
|
140
|
+
filterEngine,
|
|
141
|
+
paginationEngine,
|
|
142
|
+
groupingEngine,
|
|
143
|
+
aggregationEngine,
|
|
144
|
+
rowSelectionEngine,
|
|
145
|
+
cellEditorEngine,
|
|
146
|
+
summaryEngine,
|
|
147
|
+
exportEngine,
|
|
148
|
+
clipboardEngine,
|
|
149
|
+
dragDropEngine,
|
|
150
|
+
cellSelectionEngine,
|
|
151
|
+
themeManager,
|
|
152
|
+
iconRegistry,
|
|
153
|
+
chartEngine,
|
|
154
|
+
undoRedoEngine,
|
|
155
|
+
masterDetailEngine,
|
|
156
|
+
treeDataService,
|
|
157
|
+
treeExpansionService,
|
|
158
|
+
treeSelectionService,
|
|
159
|
+
renderer,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
initialize() {
|
|
163
|
+
injectBaseStyles();
|
|
164
|
+
const options = this.ctx.options;
|
|
165
|
+
const ctx = this.ctx;
|
|
166
|
+
if (options.theme) {
|
|
167
|
+
ctx.themeManager.applyTheme(options.theme, ctx.containerEl);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
ctx.themeManager.applyTheme('light', ctx.containerEl);
|
|
171
|
+
}
|
|
172
|
+
if (options.selection) {
|
|
173
|
+
ctx.rowSelectionEngine.configure(options.selection);
|
|
174
|
+
}
|
|
175
|
+
if (options.editing) {
|
|
176
|
+
ctx.cellEditorEngine.configure(options.editing);
|
|
177
|
+
}
|
|
178
|
+
if (options.pagination) {
|
|
179
|
+
ctx.paginationEngine.configure({
|
|
180
|
+
enabled: options.pagination.enabled ?? false,
|
|
181
|
+
page: options.pagination.page ?? 1,
|
|
182
|
+
pageSize: options.pagination.pageSize ?? 50,
|
|
183
|
+
pageSizeOptions: options.pagination.pageSizeOptions ?? [10, 25, 50, 100],
|
|
184
|
+
serverSide: options.pagination.serverSide ?? false,
|
|
185
|
+
totalRows: options.pagination.totalRows,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
if (options.columns?.length) {
|
|
189
|
+
if (this.displayGroupEngine) {
|
|
190
|
+
// Groups are a header concept — the body operates on leaf columns only.
|
|
191
|
+
ctx.columnModel.initColumns(collectLeaves(options.columns));
|
|
192
|
+
}
|
|
193
|
+
else if (this.columnGroupModel) {
|
|
194
|
+
this.columnGroupModel.init(options.columns);
|
|
195
|
+
ctx.columnModel.initColumns(this.columnGroupModel.getAllLeaves());
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
ctx.columnModel.initColumns(options.columns);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (options.columnState) {
|
|
202
|
+
ctx.columnModel.applyColumnStates(options.columnState);
|
|
203
|
+
}
|
|
204
|
+
if (options.sortConfig?.length) {
|
|
205
|
+
ctx.sortEngine.multiSort(options.sortConfig);
|
|
206
|
+
}
|
|
207
|
+
if (options.filterModel) {
|
|
208
|
+
ctx.filterEngine.setFilterModel(options.filterModel);
|
|
209
|
+
}
|
|
210
|
+
if (options.grouping?.groupedColumns?.length) {
|
|
211
|
+
for (const colId of options.grouping.groupedColumns) {
|
|
212
|
+
ctx.groupingEngine.addGroupColumn(colId);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
ctx.masterDetailEngine.configure(options.masterDetail);
|
|
216
|
+
ctx.treeDataService.configure(options.treeData);
|
|
217
|
+
ctx.cellSelectionEngine.setTreeToggleHandler((row, direction) => this.handleTreeToggleKey(ctx, row, direction));
|
|
218
|
+
ctx.renderer.mount();
|
|
219
|
+
ctx.renderer.setParentApiForDetail(this.api);
|
|
220
|
+
// Photon AI needs the live `GridApi` (to resolve columns and execute
|
|
221
|
+
// commands), which does not exist until after `buildContext` returns —
|
|
222
|
+
// so, like the Master/Detail parent-api wiring above, it is constructed
|
|
223
|
+
// here rather than in `buildContext`.
|
|
224
|
+
if (options.photonAI?.enabled) {
|
|
225
|
+
this.photonAIService = new PhotonAIService(this.api);
|
|
226
|
+
ctx.renderer.setPhotonAISubmitHandler((text) => this.photonAIService.submit(text));
|
|
227
|
+
}
|
|
228
|
+
const gridWrapper = ctx.containerEl.querySelector('.pg-grid') ?? ctx.containerEl;
|
|
229
|
+
const chartPanel = new ChartPanel(gridWrapper);
|
|
230
|
+
const chartAnalyzer = new ChartAnalyzer();
|
|
231
|
+
ctx.cellSelectionEngine.setChartOpenCallback((type) => {
|
|
232
|
+
const ranges = ctx.store.get('cellRanges');
|
|
233
|
+
const rows = ctx.store.get('visibleRows');
|
|
234
|
+
const cols = ctx.columnModel.getVisibleColumns();
|
|
235
|
+
const result = chartAnalyzer.analyzeForType(type, ranges, rows, cols);
|
|
236
|
+
chartPanel.open(type, result?.title ?? '', result?.data ?? null);
|
|
237
|
+
});
|
|
238
|
+
ctx.renderer.setSearchCallback((term) => this.api.setQuickFilter(term));
|
|
239
|
+
// Wire column-group model into the public API if groups are present (legacy path)
|
|
240
|
+
if (this.columnGroupModel) {
|
|
241
|
+
this.api.setColumnGroupModel(this.columnGroupModel);
|
|
242
|
+
}
|
|
243
|
+
if (options.data?.length) {
|
|
244
|
+
this.api.setData(options.data);
|
|
245
|
+
}
|
|
246
|
+
if (options.enableStateManagement && options.stateKey) {
|
|
247
|
+
this.loadState(options.stateKey);
|
|
248
|
+
}
|
|
249
|
+
this.wireEventHandlers(ctx);
|
|
250
|
+
this.wireEditing(ctx);
|
|
251
|
+
ctx.eventBus.emit(GridEventType.READY, { api: this.api });
|
|
252
|
+
options.onReady?.(this.api);
|
|
253
|
+
}
|
|
254
|
+
wireEventHandlers(ctx) {
|
|
255
|
+
// Sort changed from header/menu clicks → snapshot positions then re-run pipeline
|
|
256
|
+
ctx.eventBus.on(GridEventType.SORT_CHANGED, () => {
|
|
257
|
+
const currentRows = ctx.store.get('visibleRows');
|
|
258
|
+
if (currentRows.length > 0) {
|
|
259
|
+
ctx.renderer.captureRowAnimation(currentRows);
|
|
260
|
+
}
|
|
261
|
+
this.api.refresh();
|
|
262
|
+
});
|
|
263
|
+
// Filter changed → snapshot current row positions so the renderer can FLIP-animate
|
|
264
|
+
// shifted rows and fade-in new rows. refresh() is called separately by the
|
|
265
|
+
// filter-panel callback, clearAllFilters(), setFilterModel(), etc.
|
|
266
|
+
ctx.eventBus.on(GridEventType.FILTER_CHANGED, () => {
|
|
267
|
+
const currentRows = ctx.store.get('visibleRows');
|
|
268
|
+
if (currentRows.length > 0)
|
|
269
|
+
ctx.renderer.captureRowAnimation(currentRows, 'filter');
|
|
270
|
+
});
|
|
271
|
+
// Pagination nav from footer → re-run pipeline
|
|
272
|
+
ctx.eventBus.on(GridEventType.PAGE_CHANGED, () => this.api.refresh());
|
|
273
|
+
ctx.eventBus.on(GridEventType.PAGE_SIZE_CHANGED, () => this.api.refresh());
|
|
274
|
+
// Group row toggle from body click → smooth expand/collapse animation + re-run pipeline.
|
|
275
|
+
// Capturing row positions before the toggle lets RowAnimator FLIP-slide rows
|
|
276
|
+
// that shift (filter-mode) and fade-in newly revealed child rows.
|
|
277
|
+
ctx.eventBus.on(GridEventType.ROW_GROUP_OPENED, (payload) => {
|
|
278
|
+
const p = payload;
|
|
279
|
+
const currentRows = ctx.store.get('visibleRows');
|
|
280
|
+
if (currentRows.length > 0)
|
|
281
|
+
ctx.renderer.captureRowAnimation(currentRows, 'filter');
|
|
282
|
+
ctx.groupingEngine.toggleGroup(p.groupKey);
|
|
283
|
+
this.api.refresh();
|
|
284
|
+
});
|
|
285
|
+
let prevGroupedIds = [];
|
|
286
|
+
ctx.eventBus.on(GridEventType.COLUMN_GROUP_CHANGED, () => {
|
|
287
|
+
const newIds = ctx.store.get('groupedColumnIds');
|
|
288
|
+
for (const id of newIds) {
|
|
289
|
+
if (!prevGroupedIds.includes(id))
|
|
290
|
+
ctx.columnModel.setColumnVisible(id, false);
|
|
291
|
+
}
|
|
292
|
+
for (const id of prevGroupedIds) {
|
|
293
|
+
if (!newIds.includes(id))
|
|
294
|
+
ctx.columnModel.setColumnVisible(id, true);
|
|
295
|
+
}
|
|
296
|
+
prevGroupedIds = [...newIds];
|
|
297
|
+
this.api.refresh();
|
|
298
|
+
});
|
|
299
|
+
// Master/Detail toggle click → capture positions so sibling rows FLIP-slide
|
|
300
|
+
// into their new place (same mechanism as ROW_GROUP_OPENED above), flip
|
|
301
|
+
// expanded state, then re-run the pipeline so `MasterDetailEngine.
|
|
302
|
+
// injectDetailRows` inserts/removes the detail row on the next render.
|
|
303
|
+
// The detail row's own grow/shrink + fade is handled separately by
|
|
304
|
+
// `DetailRowRenderer`, since it has no panel DOM for `RowAnimator` to see.
|
|
305
|
+
ctx.eventBus.on(GridEventType.ROW_DETAIL_TOGGLE_CLICKED, (payload) => {
|
|
306
|
+
const p = payload;
|
|
307
|
+
const currentRows = ctx.store.get('visibleRows');
|
|
308
|
+
if (currentRows.length > 0)
|
|
309
|
+
ctx.renderer.captureRowAnimation(currentRows, 'detail');
|
|
310
|
+
// Collapsing: freeze the detail row's current position and start its
|
|
311
|
+
// shrink/fade before the pipeline drops it — must happen before
|
|
312
|
+
// `toggle()`, while `top`/`height` are still valid (see beginDetailCollapse).
|
|
313
|
+
if (ctx.masterDetailEngine.isExpanded(p.row.nodeId)) {
|
|
314
|
+
ctx.renderer.beginDetailCollapse(p.row.nodeId);
|
|
315
|
+
}
|
|
316
|
+
ctx.masterDetailEngine.toggle(p.row);
|
|
317
|
+
this.api.refresh();
|
|
318
|
+
});
|
|
319
|
+
// Tree Data toggle click (from `applyTreeToggle`'s chevron button) →
|
|
320
|
+
// same capture-then-toggle-then-refresh shape as the group/detail
|
|
321
|
+
// handlers above, so expand/collapse gets the same FLIP row animation.
|
|
322
|
+
ctx.eventBus.on(GridEventType.TREE_NODE_TOGGLE_CLICKED, (payload) => {
|
|
323
|
+
const p = payload;
|
|
324
|
+
const currentRows = ctx.store.get('visibleRows');
|
|
325
|
+
if (currentRows.length > 0)
|
|
326
|
+
ctx.renderer.captureRowAnimation(currentRows, 'filter');
|
|
327
|
+
ctx.treeExpansionService.toggle(p.row);
|
|
328
|
+
this.api.refresh();
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Backs `CellSelectionEngine.setTreeToggleHandler` — ArrowLeft collapses a
|
|
333
|
+
* node (or jumps focus to its parent if already collapsed/leaf), ArrowRight
|
|
334
|
+
* expands a node (or jumps focus to its first child if already expanded).
|
|
335
|
+
* Returns `false` when Tree Data isn't enabled or the row has no children,
|
|
336
|
+
* letting normal column navigation take over.
|
|
337
|
+
*/
|
|
338
|
+
handleTreeToggleKey(ctx, row, direction) {
|
|
339
|
+
if (!ctx.treeDataService.isEnabled())
|
|
340
|
+
return false;
|
|
341
|
+
const hasChildren = row.hasChildren || row.children.length > 0;
|
|
342
|
+
const rows = ctx.store.get('visibleRows');
|
|
343
|
+
const activeCell = ctx.store.get('activeCell');
|
|
344
|
+
if (!activeCell)
|
|
345
|
+
return false;
|
|
346
|
+
if (direction === 'left') {
|
|
347
|
+
if (hasChildren && ctx.treeExpansionService.isExpanded(row.nodeId)) {
|
|
348
|
+
ctx.treeExpansionService.collapse(row);
|
|
349
|
+
this.api.refresh();
|
|
350
|
+
return true;
|
|
351
|
+
}
|
|
352
|
+
if (row.parent) {
|
|
353
|
+
const parentIndex = rows.findIndex((r) => r.nodeId === row.parent.nodeId);
|
|
354
|
+
if (parentIndex !== -1) {
|
|
355
|
+
ctx.cellSelectionEngine.startSelection(parentIndex, activeCell.colIndex);
|
|
356
|
+
return true;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
// direction === 'right'
|
|
362
|
+
if (!hasChildren)
|
|
363
|
+
return false;
|
|
364
|
+
if (!ctx.treeExpansionService.isExpanded(row.nodeId)) {
|
|
365
|
+
if (!row.childrenLoaded && ctx.treeDataService.getConfig()?.lazyLoadChildren) {
|
|
366
|
+
ctx.treeDataService.loadChildren(row.nodeId);
|
|
367
|
+
}
|
|
368
|
+
ctx.treeExpansionService.expand(row);
|
|
369
|
+
this.api.refresh();
|
|
370
|
+
return true;
|
|
371
|
+
}
|
|
372
|
+
const rowIndex = rows.findIndex((r) => r.nodeId === row.nodeId);
|
|
373
|
+
const next = rowIndex !== -1 ? rows[rowIndex + 1] : undefined;
|
|
374
|
+
if (next && next.level > row.level) {
|
|
375
|
+
ctx.cellSelectionEngine.startSelection(rowIndex + 1, activeCell.colIndex);
|
|
376
|
+
return true;
|
|
377
|
+
}
|
|
378
|
+
return false;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Wires cell-editing activation and teardown based on the configured
|
|
382
|
+
* `editing.singleClickEdit` flag.
|
|
383
|
+
*
|
|
384
|
+
* - `singleClickEdit: true` → edit starts on the first click (CELL_CLICKED)
|
|
385
|
+
* - `singleClickEdit: false` → edit starts on double-click (CELL_DOUBLE_CLICKED, default)
|
|
386
|
+
*
|
|
387
|
+
* On `CELL_EDIT_STOP` the cell's inner DOM is immediately restored with the
|
|
388
|
+
* committed (or cancelled) value — no full grid refresh required.
|
|
389
|
+
*/
|
|
390
|
+
wireEditing(ctx) {
|
|
391
|
+
if (ctx.options.editing?.mode === 'none')
|
|
392
|
+
return;
|
|
393
|
+
let activeInnerEl = null;
|
|
394
|
+
let activeRow = null;
|
|
395
|
+
let activeColDef = null;
|
|
396
|
+
let activeDropdown = null;
|
|
397
|
+
const startCellEdit = (payload) => {
|
|
398
|
+
const p = payload;
|
|
399
|
+
const { row, colDef } = p;
|
|
400
|
+
// Aggregate cells in group rows are read-only — never start an editor on them.
|
|
401
|
+
if (row.type !== 'data')
|
|
402
|
+
return;
|
|
403
|
+
if (!colDef.editable)
|
|
404
|
+
return;
|
|
405
|
+
if (ctx.cellEditorEngine.isCellEditing(row.nodeId, colDef.colId))
|
|
406
|
+
return;
|
|
407
|
+
// Find the cell and its inner element in the DOM
|
|
408
|
+
const cellEl = ctx.containerEl.querySelector(`[data-node-id="${row.nodeId}"] [data-col-id="${colDef.colId}"]`);
|
|
409
|
+
if (!cellEl)
|
|
410
|
+
return;
|
|
411
|
+
const innerEl = cellEl.querySelector('.pg-cell__inner');
|
|
412
|
+
if (!innerEl)
|
|
413
|
+
return;
|
|
414
|
+
// Commit any currently active edit; CELL_EDIT_STOP fires synchronously
|
|
415
|
+
// and its handler restores that cell's DOM + clears activeDropdown
|
|
416
|
+
if (ctx.cellEditorEngine.isEditing()) {
|
|
417
|
+
ctx.cellEditorEngine.stopEditing(false);
|
|
418
|
+
}
|
|
419
|
+
activeInnerEl = innerEl;
|
|
420
|
+
activeRow = row;
|
|
421
|
+
activeColDef = colDef;
|
|
422
|
+
innerEl.innerHTML = '';
|
|
423
|
+
const started = ctx.cellEditorEngine.startEditing(row, colDef, cellEl);
|
|
424
|
+
if (!started) {
|
|
425
|
+
this.renderCellValue(innerEl, row, colDef);
|
|
426
|
+
activeInnerEl = activeRow = activeColDef = null;
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
const value = row.data[colDef.field];
|
|
430
|
+
// Column-supplied custom editor takes priority over every built-in editor.
|
|
431
|
+
const customEditorFn = resolveColumnRenderer(colDef, 'editor');
|
|
432
|
+
if (customEditorFn) {
|
|
433
|
+
const params = {
|
|
434
|
+
value,
|
|
435
|
+
row: row.data,
|
|
436
|
+
colDef,
|
|
437
|
+
rowIndex: row.rowIndex,
|
|
438
|
+
onValueChange: (v) => ctx.cellEditorEngine.updateValue(v),
|
|
439
|
+
onEditStop: () => ctx.cellEditorEngine.stopEditing(false),
|
|
440
|
+
};
|
|
441
|
+
const editorEl = customEditorFn(params);
|
|
442
|
+
innerEl.appendChild(editorEl);
|
|
443
|
+
const session = ctx.cellEditorEngine.getActiveSession();
|
|
444
|
+
if (session)
|
|
445
|
+
session.editorEl = editorEl;
|
|
446
|
+
}
|
|
447
|
+
else if (colDef.type === 'dropdown' || colDef.type === 'object') {
|
|
448
|
+
// dropdown / object → custom accessible dropdown with virtual scrolling
|
|
449
|
+
// Prefer explicit dropdownOptions; fall back to enumOptions (string array → ColumnDropdownOption[])
|
|
450
|
+
const resolvedOpts = colDef.dropdownOptions ??
|
|
451
|
+
(colDef.enumOptions?.map((v) => ({ value: v, label: v })) ?? []);
|
|
452
|
+
const renderOption = resolveColumnRenderer(colDef, 'option');
|
|
453
|
+
activeDropdown = new CustomDropdownEditor(innerEl, cellEl, resolvedOpts, value, {
|
|
454
|
+
onSelect: (opt) => {
|
|
455
|
+
// For 'object' columns store the full option; for 'dropdown' store just the value
|
|
456
|
+
ctx.cellEditorEngine.updateValue(colDef.type === 'object' ? opt : opt.value);
|
|
457
|
+
},
|
|
458
|
+
onStop: (commit) => {
|
|
459
|
+
// commit=true → stopEditing(false/cancel=false); commit=false → cancel=true
|
|
460
|
+
ctx.cellEditorEngine.stopEditing(!commit);
|
|
461
|
+
},
|
|
462
|
+
onTab: handleTabEdit,
|
|
463
|
+
...(renderOption
|
|
464
|
+
? {
|
|
465
|
+
renderOption: (option, index, selected, highlighted) => renderOption({ option, index, selected, highlighted, colDef, api: this.api }),
|
|
466
|
+
}
|
|
467
|
+
: {}),
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
// All other types (text, number, date, time, boolean, array, …) use native editors
|
|
472
|
+
ctx.cellEditorEngine.buildNativeEditor(colDef, value, innerEl);
|
|
473
|
+
}
|
|
474
|
+
};
|
|
475
|
+
// Close the active editor immediately when a column is resized or moved so
|
|
476
|
+
// the floating panel does not drift away from its anchor cell.
|
|
477
|
+
const closeEditorOnColumnChange = () => {
|
|
478
|
+
if (ctx.cellEditorEngine.isEditing())
|
|
479
|
+
ctx.cellEditorEngine.stopEditing(false);
|
|
480
|
+
};
|
|
481
|
+
ctx.eventBus.on(GridEventType.COLUMN_RESIZED, closeEditorOnColumnChange);
|
|
482
|
+
ctx.eventBus.on(GridEventType.COLUMN_MOVED, closeEditorOnColumnChange);
|
|
483
|
+
// On edit stop: destroy any open dropdown panel, then restore the cell's display value
|
|
484
|
+
ctx.eventBus.on(GridEventType.CELL_EDIT_STOP, () => {
|
|
485
|
+
activeDropdown?.destroy();
|
|
486
|
+
activeDropdown = null;
|
|
487
|
+
if (!activeInnerEl || !activeRow || !activeColDef)
|
|
488
|
+
return;
|
|
489
|
+
const innerEl = activeInnerEl;
|
|
490
|
+
const row = activeRow;
|
|
491
|
+
const colDef = activeColDef;
|
|
492
|
+
activeInnerEl = activeRow = activeColDef = null;
|
|
493
|
+
this.renderCellValue(innerEl, row, colDef);
|
|
494
|
+
});
|
|
495
|
+
// When a cell value actually changes (new !== old):
|
|
496
|
+
// 1. Record the change in the undo/redo engine so Ctrl+Z can revert it.
|
|
497
|
+
// 2. Re-run the sort/filter/group+aggregation pipeline so group header and
|
|
498
|
+
// footer rows immediately reflect the updated aggregate values.
|
|
499
|
+
// CELL_VALUE_CHANGED fires before CELL_EDIT_STOP, so scheduleRender() queues
|
|
500
|
+
// a next-frame repaint; by then CELL_EDIT_STOP has already restored the
|
|
501
|
+
// edited cell's DOM and group rows are rebuilt with the correct aggregations.
|
|
502
|
+
ctx.eventBus.on(GridEventType.CELL_VALUE_CHANGED, (payload) => {
|
|
503
|
+
const p = payload;
|
|
504
|
+
ctx.undoRedoEngine.record({
|
|
505
|
+
type: 'edit',
|
|
506
|
+
changes: [{
|
|
507
|
+
nodeId: p.row.nodeId,
|
|
508
|
+
field: p.colDef.field,
|
|
509
|
+
oldValue: p.oldValue,
|
|
510
|
+
newValue: p.newValue,
|
|
511
|
+
}],
|
|
512
|
+
});
|
|
513
|
+
this.api.refresh();
|
|
514
|
+
});
|
|
515
|
+
// Tab while editing → commit current edit, move to the adjacent cell, and
|
|
516
|
+
// start editing it (dropdown cells open the dropdown directly).
|
|
517
|
+
const handleTabEdit = (shiftKey) => {
|
|
518
|
+
const rows = ctx.store.get('visibleRows');
|
|
519
|
+
const cols = ctx.columnModel.getVisibleColumns();
|
|
520
|
+
const activeCell = ctx.store.get('activeCell');
|
|
521
|
+
if (!activeCell)
|
|
522
|
+
return;
|
|
523
|
+
ctx.cellSelectionEngine.moveActiveCell(0, shiftKey ? -1 : 1, rows.length, cols.length, false);
|
|
524
|
+
const newActive = ctx.store.get('activeCell');
|
|
525
|
+
if (!newActive)
|
|
526
|
+
return;
|
|
527
|
+
const row = rows[newActive.rowIndex];
|
|
528
|
+
const col = cols[newActive.colIndex];
|
|
529
|
+
if (!row || !col || !col.editable)
|
|
530
|
+
return;
|
|
531
|
+
startCellEdit({ row, colDef: col });
|
|
532
|
+
};
|
|
533
|
+
ctx.cellEditorEngine.setTabHandler(handleTabEdit);
|
|
534
|
+
const trigger = ctx.options.editing?.singleClickEdit
|
|
535
|
+
? GridEventType.CELL_CLICKED
|
|
536
|
+
: GridEventType.CELL_DOUBLE_CLICKED;
|
|
537
|
+
ctx.eventBus.on(trigger, startCellEdit);
|
|
538
|
+
// Enter key on a focused cell → start editing instead of navigating down.
|
|
539
|
+
// Returns true to absorb the event; false to let the selection engine navigate.
|
|
540
|
+
ctx.cellSelectionEngine.setEnterEditHandler((rowIndex, colIndex) => {
|
|
541
|
+
if (ctx.cellEditorEngine.isEditing())
|
|
542
|
+
return false;
|
|
543
|
+
const rows = ctx.store.get('visibleRows');
|
|
544
|
+
const cols = ctx.columnModel.getVisibleColumns();
|
|
545
|
+
const row = rows[rowIndex];
|
|
546
|
+
const colDef = cols[colIndex];
|
|
547
|
+
// Group rows are read-only — fall through to down-navigation.
|
|
548
|
+
if (!row || row.type !== 'data' || !colDef || !colDef.editable)
|
|
549
|
+
return false;
|
|
550
|
+
startCellEdit({ row, colDef });
|
|
551
|
+
return true;
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
/**
|
|
555
|
+
* Re-renders the display content of a cell's inner element after an edit
|
|
556
|
+
* session ends, using the current value from `row.data`.
|
|
557
|
+
*
|
|
558
|
+
* Rendering priority:
|
|
559
|
+
* 1. `colDef.renderer.display` — custom renderer function (e.g. flag icons)
|
|
560
|
+
* 2. `colDef.renderHtml` — raw HTML string
|
|
561
|
+
* 3. Built-in type rendering — boolean, dropdown, array, formatted text
|
|
562
|
+
*/
|
|
563
|
+
renderCellValue(innerEl, row, colDef) {
|
|
564
|
+
innerEl.innerHTML = '';
|
|
565
|
+
const value = row.data[colDef.field];
|
|
566
|
+
const displayFn = resolveColumnRenderer(colDef, 'display');
|
|
567
|
+
if (displayFn) {
|
|
568
|
+
const cols = this.ctx.columnModel.getVisibleColumns();
|
|
569
|
+
const colIndex = cols.findIndex((c) => c.colId === colDef.colId);
|
|
570
|
+
const params = {
|
|
571
|
+
value,
|
|
572
|
+
rawValue: value,
|
|
573
|
+
row: row.data,
|
|
574
|
+
colDef,
|
|
575
|
+
rowIndex: row.rowIndex,
|
|
576
|
+
colIndex,
|
|
577
|
+
api: this.api,
|
|
578
|
+
};
|
|
579
|
+
const rendered = displayFn(params);
|
|
580
|
+
if (typeof rendered === 'string') {
|
|
581
|
+
innerEl.innerHTML = rendered;
|
|
582
|
+
}
|
|
583
|
+
else {
|
|
584
|
+
innerEl.appendChild(rendered);
|
|
585
|
+
}
|
|
586
|
+
return;
|
|
587
|
+
}
|
|
588
|
+
if (colDef.renderHtml) {
|
|
589
|
+
innerEl.innerHTML = String(value ?? '');
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
const span = document.createElement('span');
|
|
593
|
+
span.className = 'pg-cell__value';
|
|
594
|
+
switch (colDef.type) {
|
|
595
|
+
case 'boolean': {
|
|
596
|
+
span.textContent = value ? '✓' : '';
|
|
597
|
+
span.classList.add(value ? 'pg-cell--bool-true' : 'pg-cell--bool-false');
|
|
598
|
+
break;
|
|
599
|
+
}
|
|
600
|
+
case 'dropdown':
|
|
601
|
+
case 'object': {
|
|
602
|
+
const key = colDef.type === 'object' && typeof value === 'object' && value !== null
|
|
603
|
+
? value[colDef.objectValueKey ?? 'value']
|
|
604
|
+
: value;
|
|
605
|
+
const opt = colDef.dropdownOptions?.find((o) => String(o.value) === String(key ?? ''));
|
|
606
|
+
if (opt?.color) {
|
|
607
|
+
const badge = document.createElement('div');
|
|
608
|
+
badge.className = 'pg-badge';
|
|
609
|
+
badge.style.backgroundColor = opt.color + '20';
|
|
610
|
+
badge.style.color = opt.color;
|
|
611
|
+
badge.textContent = opt.label;
|
|
612
|
+
span.appendChild(badge);
|
|
613
|
+
}
|
|
614
|
+
else {
|
|
615
|
+
span.textContent = opt?.label ?? String(key ?? '');
|
|
616
|
+
}
|
|
617
|
+
break;
|
|
618
|
+
}
|
|
619
|
+
case 'array': {
|
|
620
|
+
span.className = 'pg-cell__value pg-cell__value--tags';
|
|
621
|
+
const vals = Array.isArray(value) ? value.map(String) : [];
|
|
622
|
+
const visible = vals.slice(0, 3);
|
|
623
|
+
for (const v of visible) {
|
|
624
|
+
const opt = colDef.dropdownOptions?.find((o) => String(o.value) === v);
|
|
625
|
+
const badge = document.createElement('div');
|
|
626
|
+
badge.className = 'pg-badge';
|
|
627
|
+
badge.textContent = opt?.label ?? v;
|
|
628
|
+
if (opt?.color) {
|
|
629
|
+
badge.style.backgroundColor = opt.color + '20';
|
|
630
|
+
badge.style.color = opt.color;
|
|
631
|
+
}
|
|
632
|
+
span.appendChild(badge);
|
|
633
|
+
}
|
|
634
|
+
if (vals.length > visible.length) {
|
|
635
|
+
const more = document.createElement('div');
|
|
636
|
+
more.className = 'pg-badge pg-badge--overflow';
|
|
637
|
+
more.textContent = `+${vals.length - visible.length}`;
|
|
638
|
+
span.appendChild(more);
|
|
639
|
+
}
|
|
640
|
+
break;
|
|
641
|
+
}
|
|
642
|
+
default: {
|
|
643
|
+
const formatted = formatValue(value, colDef, {
|
|
644
|
+
locale: this.ctx.options.locale,
|
|
645
|
+
dateFormat: this.ctx.options.dateFormat,
|
|
646
|
+
timeZone: this.ctx.options.timeZone,
|
|
647
|
+
currencySymbol: this.ctx.options.currencySymbol,
|
|
648
|
+
});
|
|
649
|
+
span.textContent = formatted || '—';
|
|
650
|
+
span.title = formatted || '';
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
innerEl.appendChild(span);
|
|
654
|
+
}
|
|
655
|
+
loadState(stateKey) {
|
|
656
|
+
try {
|
|
657
|
+
const raw = localStorage.getItem(`photon_grid_${stateKey}`);
|
|
658
|
+
if (raw) {
|
|
659
|
+
const state = JSON.parse(raw);
|
|
660
|
+
this.api.applyGridState(state);
|
|
661
|
+
}
|
|
662
|
+
this.ctx.eventBus.on(GridEventType.COLUMNS_STATE_CHANGED, () => {
|
|
663
|
+
const state = this.api.getGridState();
|
|
664
|
+
localStorage.setItem(`photon_grid_${stateKey}`, JSON.stringify(state));
|
|
665
|
+
});
|
|
666
|
+
}
|
|
667
|
+
catch {
|
|
668
|
+
// localStorage may not be available
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
destroy() {
|
|
672
|
+
this.api.destroy();
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
//# sourceMappingURL=grid-core.js.map
|