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,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure hierarchy-construction functions for Tree Data. No class, no store
|
|
3
|
+
* access, no side effects — `TreeDataService` is the only caller, and it
|
|
4
|
+
* owns everything stateful (expansion, filtering, sorting). Kept separate so
|
|
5
|
+
* the O(n) construction algorithms are trivially unit-testable in isolation.
|
|
6
|
+
*
|
|
7
|
+
* All four {@link TreeDataConfig.mode} values reduce to two algorithms:
|
|
8
|
+
*
|
|
9
|
+
* 1. **Flat array + a per-record `(id, parentId)` resolver** — `'parentId'`,
|
|
10
|
+
* `'dataPath'`, and `'custom'` are all this, differing only in how the
|
|
11
|
+
* pair is derived (see {@link resolveEdges}).
|
|
12
|
+
* 2. **Nested `children` arrays** — `'childrenField'` alone, since the input
|
|
13
|
+
* isn't flat; {@link flattenNestedChildren} walks it once into the same
|
|
14
|
+
* `TreeEdge[]` shape algorithm 1 produces, so {@link buildTree} never
|
|
15
|
+
* needs to know which mode produced its input.
|
|
16
|
+
*/
|
|
17
|
+
/** Default field names, mirroring every other Photon config's "sensible default, fully overridable" convention. */
|
|
18
|
+
const DEFAULT_ID_FIELD = 'id';
|
|
19
|
+
const DEFAULT_PARENT_ID_FIELD = 'parentId';
|
|
20
|
+
const DEFAULT_CHILDREN_FIELD = 'children';
|
|
21
|
+
/**
|
|
22
|
+
* Resolves raw row data into `{id, parentId, record}` edges, ready for
|
|
23
|
+
* {@link buildTree}. Dispatches on `config.mode` — this is the only place
|
|
24
|
+
* that branches on hierarchy source; everything downstream is source-agnostic.
|
|
25
|
+
*/
|
|
26
|
+
export function resolveEdges(config, rawRecords) {
|
|
27
|
+
switch (config.mode) {
|
|
28
|
+
case 'parentId':
|
|
29
|
+
return resolveParentIdEdges(rawRecords, config.idField ?? DEFAULT_ID_FIELD, config.parentIdField ?? DEFAULT_PARENT_ID_FIELD);
|
|
30
|
+
case 'dataPath':
|
|
31
|
+
return resolveDataPathEdges(rawRecords, config.getDataPath);
|
|
32
|
+
case 'custom':
|
|
33
|
+
return resolveCustomEdges(rawRecords, config.hierarchyProvider);
|
|
34
|
+
case 'childrenField':
|
|
35
|
+
return flattenNestedChildren(rawRecords, config.childrenField ?? DEFAULT_CHILDREN_FIELD, config.idField ?? DEFAULT_ID_FIELD);
|
|
36
|
+
default:
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function resolveParentIdEdges(records, idField, parentIdField) {
|
|
41
|
+
const edges = new Array(records.length);
|
|
42
|
+
for (let i = 0; i < records.length; i++) {
|
|
43
|
+
const record = records[i];
|
|
44
|
+
const rawId = record[idField];
|
|
45
|
+
const rawParentId = record[parentIdField];
|
|
46
|
+
edges[i] = {
|
|
47
|
+
id: rawId != null ? String(rawId) : `pos_${i}`,
|
|
48
|
+
parentId: rawParentId != null ? String(rawParentId) : null,
|
|
49
|
+
record,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return edges;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* `getDataPath` mode: each record's full ancestor path (e.g.
|
|
56
|
+
* `['Electronics', 'Phones', 'iPhone 15']`) implies both its own id (the
|
|
57
|
+
* full path, joined) and its parent's id (the path minus its last segment).
|
|
58
|
+
* Path prefixes with no record of their own (`'Electronics'`,
|
|
59
|
+
* `'Electronics/Phones'` above, if only the leaf was ever supplied) are
|
|
60
|
+
* synthesized as filler edges — the same idea as `GroupingEngine`'s
|
|
61
|
+
* synthetic group-header rows, just keyed by path instead of column value.
|
|
62
|
+
*/
|
|
63
|
+
function resolveDataPathEdges(records, getDataPath) {
|
|
64
|
+
const edges = new Map();
|
|
65
|
+
for (const record of records) {
|
|
66
|
+
const path = getDataPath(record);
|
|
67
|
+
for (let depth = 0; depth < path.length; depth++) {
|
|
68
|
+
const id = path.slice(0, depth + 1).join('/');
|
|
69
|
+
const isLeaf = depth === path.length - 1;
|
|
70
|
+
if (isLeaf) {
|
|
71
|
+
// A real record always wins over/replaces a same-path filler that an
|
|
72
|
+
// earlier record's ancestor path may have already synthesized.
|
|
73
|
+
edges.set(id, { id, parentId: depth > 0 ? path.slice(0, depth).join('/') : null, record });
|
|
74
|
+
}
|
|
75
|
+
else if (!edges.has(id)) {
|
|
76
|
+
edges.set(id, {
|
|
77
|
+
id,
|
|
78
|
+
parentId: depth > 0 ? path.slice(0, depth).join('/') : null,
|
|
79
|
+
record: { [path[depth]]: path[depth] },
|
|
80
|
+
isFiller: true,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return Array.from(edges.values());
|
|
86
|
+
}
|
|
87
|
+
function resolveCustomEdges(records, provider) {
|
|
88
|
+
return records.map((record) => ({
|
|
89
|
+
id: provider.getId(record),
|
|
90
|
+
parentId: provider.getParentKey(record) ?? null,
|
|
91
|
+
record,
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* `childrenField` mode: input is already nested (`data[i][childrenField]` is
|
|
96
|
+
* an array of raw child records, not `RowNode`s), so it needs one O(n) DFS
|
|
97
|
+
* walk before it can be treated like every other mode's flat edge list.
|
|
98
|
+
*
|
|
99
|
+
* Ids fall back to a positional path (`"0"`, `"0.1"`, `"0.1.2"`, ...) when a
|
|
100
|
+
* record has no `idField` value — stable across rebuilds as long as the
|
|
101
|
+
* caller's array order/shape doesn't change between pipeline runs, which is
|
|
102
|
+
* what keeps `expandedTreeNodeIds` (keyed by these ids) from losing state on
|
|
103
|
+
* every `refresh()`.
|
|
104
|
+
*/
|
|
105
|
+
export function flattenNestedChildren(rootsRaw, childrenField, idField) {
|
|
106
|
+
const edges = [];
|
|
107
|
+
function walk(records, parentId, positionalPrefix) {
|
|
108
|
+
for (let i = 0; i < records.length; i++) {
|
|
109
|
+
const record = records[i];
|
|
110
|
+
const positionalId = positionalPrefix ? `${positionalPrefix}.${i}` : String(i);
|
|
111
|
+
const rawId = record[idField];
|
|
112
|
+
const id = rawId != null ? String(rawId) : positionalId;
|
|
113
|
+
edges.push({ id, parentId, record });
|
|
114
|
+
const rawChildren = record[childrenField];
|
|
115
|
+
if (Array.isArray(rawChildren) && rawChildren.length > 0) {
|
|
116
|
+
walk(rawChildren, id, positionalId);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
walk(rootsRaw, null, '');
|
|
121
|
+
return edges;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Builds the `RowNode` tree from resolved edges — classic two-pass O(n)
|
|
125
|
+
* construction (no O(n²) parent scanning): pass 1 creates every node keyed
|
|
126
|
+
* by id, pass 2 wires `children`/`parent`/`level` by looking up each edge's
|
|
127
|
+
* `parentId`. An edge whose `parentId` doesn't resolve to a known id (a
|
|
128
|
+
* dangling reference, or a genuine root) becomes a root.
|
|
129
|
+
*
|
|
130
|
+
* `expanded` is intentionally left `false` here — it's set per-node by
|
|
131
|
+
* {@link flattenTree} at flatten time, since expansion state is external,
|
|
132
|
+
* mutable, and this function is called fresh on every pipeline run.
|
|
133
|
+
*/
|
|
134
|
+
export function buildTree(edges, defaultRowHeight = 50) {
|
|
135
|
+
const nodesById = new Map();
|
|
136
|
+
for (const edge of edges) {
|
|
137
|
+
nodesById.set(edge.id, {
|
|
138
|
+
nodeId: edge.id,
|
|
139
|
+
rowIndex: -1,
|
|
140
|
+
data: edge.record,
|
|
141
|
+
type: 'data',
|
|
142
|
+
selected: false,
|
|
143
|
+
expanded: false,
|
|
144
|
+
editable: !edge.isFiller,
|
|
145
|
+
level: 0,
|
|
146
|
+
parent: null,
|
|
147
|
+
children: [],
|
|
148
|
+
hasChildren: false,
|
|
149
|
+
isTreeFiller: edge.isFiller,
|
|
150
|
+
height: defaultRowHeight,
|
|
151
|
+
top: 0,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
const roots = [];
|
|
155
|
+
for (const edge of edges) {
|
|
156
|
+
const node = nodesById.get(edge.id);
|
|
157
|
+
const parent = edge.parentId != null ? nodesById.get(edge.parentId) : undefined;
|
|
158
|
+
if (parent) {
|
|
159
|
+
parent.children.push(node);
|
|
160
|
+
parent.hasChildren = true;
|
|
161
|
+
node.parent = parent;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
roots.push(node);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Levels can only be assigned once every parent link exists (a record can
|
|
168
|
+
// reference a parent that appears later in `edges`), so this is a
|
|
169
|
+
// deliberate third O(n) pass rather than folded into the wiring pass above.
|
|
170
|
+
const assignLevels = (nodes, level) => {
|
|
171
|
+
for (const node of nodes) {
|
|
172
|
+
node.level = level;
|
|
173
|
+
if (node.children.length > 0)
|
|
174
|
+
assignLevels(node.children, level + 1);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
assignLevels(roots, 0);
|
|
178
|
+
return roots;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Flattens an expanded subset of the tree into the flat `RowNode[]` every
|
|
182
|
+
* downstream consumer (pagination, Master/Detail injection, virtualization)
|
|
183
|
+
* already expects — mirrors `flattenGroupTree` (`group-node.ts`) exactly:
|
|
184
|
+
* push a node, recurse into its children only if it's expanded.
|
|
185
|
+
*/
|
|
186
|
+
export function flattenTree(roots, expandedIds) {
|
|
187
|
+
const result = [];
|
|
188
|
+
const visit = (nodes) => {
|
|
189
|
+
for (const node of nodes) {
|
|
190
|
+
node.expanded = expandedIds.has(node.nodeId);
|
|
191
|
+
result.push(node);
|
|
192
|
+
if (node.expanded && node.children.length > 0)
|
|
193
|
+
visit(node.children);
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
visit(roots);
|
|
197
|
+
return result;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=tree-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-node.js","sourceRoot":"","sources":["../../../src/engines/tree/tree-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { RowNode } from '../../types/row.types';
|
|
2
|
+
import type { RowSelectionEngine } from '../selection/row-selection-engine';
|
|
3
|
+
import type { TreeDataService } from './tree-data-service';
|
|
4
|
+
/** Tri-state result for a node whose selection depends on its descendants. */
|
|
5
|
+
export type CascadeSelectionState = 'all' | 'some' | 'none';
|
|
6
|
+
/**
|
|
7
|
+
* Adds tree-specific cascade selection semantics — selecting a node selects
|
|
8
|
+
* every descendant, and a node with only some descendants selected reports
|
|
9
|
+
* as `'some'` (the checkbox-indeterminate state) — on top of the grid's
|
|
10
|
+
* existing row selection. It never re-implements selection storage: every
|
|
11
|
+
* mutation goes through `RowSelectionEngine`'s own `selectRows`/`deselectRow`,
|
|
12
|
+
* so `selectedRowIds`, the `ROW_SELECTED`/`ROW_DESELECTED` events, and
|
|
13
|
+
* `RowNode.selected` all stay the single source of truth they already are.
|
|
14
|
+
*/
|
|
15
|
+
export declare class TreeSelectionService {
|
|
16
|
+
private rowSelectionEngine;
|
|
17
|
+
private treeDataService;
|
|
18
|
+
constructor(rowSelectionEngine: RowSelectionEngine, treeDataService: TreeDataService);
|
|
19
|
+
/** Selects `node` and every descendant in its (unfiltered) subtree. */
|
|
20
|
+
selectWithDescendants(node: RowNode, visibleRows: RowNode[]): void;
|
|
21
|
+
/** Deselects `node` and every descendant in its (unfiltered) subtree. */
|
|
22
|
+
deselectWithDescendants(node: RowNode, visibleRows: RowNode[]): void;
|
|
23
|
+
toggleWithDescendants(node: RowNode, visibleRows: RowNode[]): void;
|
|
24
|
+
/**
|
|
25
|
+
* Reports whether every, some, or none of `node`'s descendants are
|
|
26
|
+
* selected — the input a checkbox renderer needs to show a filled,
|
|
27
|
+
* indeterminate (`-`), or empty box for a parent row. Walks the *full*
|
|
28
|
+
* unfiltered subtree (via `TreeDataService.getNode`), not just currently
|
|
29
|
+
* visible/expanded rows, so collapsing a partially-selected group never
|
|
30
|
+
* silently changes its reported state.
|
|
31
|
+
*/
|
|
32
|
+
getDescendantSelectionState(node: RowNode): CascadeSelectionState;
|
|
33
|
+
private collectDescendantIds;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=tree-selection-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-selection-service.d.ts","sourceRoot":"","sources":["../../../src/engines/tree/tree-selection-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,8EAA8E;AAC9E,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5D;;;;;;;;GAQG;AACH,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,eAAe;gBADf,kBAAkB,EAAE,kBAAkB,EACtC,eAAe,EAAE,eAAe;IAG1C,uEAAuE;IACvE,qBAAqB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI;IAKlE,yEAAyE;IACzE,uBAAuB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI;IAOpE,qBAAqB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI;IAQlE;;;;;;;OAOG;IACH,2BAA2B,CAAC,IAAI,EAAE,OAAO,GAAG,qBAAqB;IAYjE,OAAO,CAAC,oBAAoB;CAe7B"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adds tree-specific cascade selection semantics — selecting a node selects
|
|
3
|
+
* every descendant, and a node with only some descendants selected reports
|
|
4
|
+
* as `'some'` (the checkbox-indeterminate state) — on top of the grid's
|
|
5
|
+
* existing row selection. It never re-implements selection storage: every
|
|
6
|
+
* mutation goes through `RowSelectionEngine`'s own `selectRows`/`deselectRow`,
|
|
7
|
+
* so `selectedRowIds`, the `ROW_SELECTED`/`ROW_DESELECTED` events, and
|
|
8
|
+
* `RowNode.selected` all stay the single source of truth they already are.
|
|
9
|
+
*/
|
|
10
|
+
export class TreeSelectionService {
|
|
11
|
+
constructor(rowSelectionEngine, treeDataService) {
|
|
12
|
+
this.rowSelectionEngine = rowSelectionEngine;
|
|
13
|
+
this.treeDataService = treeDataService;
|
|
14
|
+
}
|
|
15
|
+
/** Selects `node` and every descendant in its (unfiltered) subtree. */
|
|
16
|
+
selectWithDescendants(node, visibleRows) {
|
|
17
|
+
const ids = [node.nodeId, ...this.collectDescendantIds(node)];
|
|
18
|
+
this.rowSelectionEngine.selectRows(ids, visibleRows);
|
|
19
|
+
}
|
|
20
|
+
/** Deselects `node` and every descendant in its (unfiltered) subtree. */
|
|
21
|
+
deselectWithDescendants(node, visibleRows) {
|
|
22
|
+
this.rowSelectionEngine.deselectRow(node.nodeId, visibleRows);
|
|
23
|
+
for (const id of this.collectDescendantIds(node)) {
|
|
24
|
+
this.rowSelectionEngine.deselectRow(id, visibleRows);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
toggleWithDescendants(node, visibleRows) {
|
|
28
|
+
if (this.rowSelectionEngine.isRowSelected(node.nodeId)) {
|
|
29
|
+
this.deselectWithDescendants(node, visibleRows);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
this.selectWithDescendants(node, visibleRows);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Reports whether every, some, or none of `node`'s descendants are
|
|
37
|
+
* selected — the input a checkbox renderer needs to show a filled,
|
|
38
|
+
* indeterminate (`-`), or empty box for a parent row. Walks the *full*
|
|
39
|
+
* unfiltered subtree (via `TreeDataService.getNode`), not just currently
|
|
40
|
+
* visible/expanded rows, so collapsing a partially-selected group never
|
|
41
|
+
* silently changes its reported state.
|
|
42
|
+
*/
|
|
43
|
+
getDescendantSelectionState(node) {
|
|
44
|
+
const descendantIds = this.collectDescendantIds(node);
|
|
45
|
+
if (descendantIds.length === 0)
|
|
46
|
+
return this.rowSelectionEngine.isRowSelected(node.nodeId) ? 'all' : 'none';
|
|
47
|
+
let selectedCount = 0;
|
|
48
|
+
for (const id of descendantIds) {
|
|
49
|
+
if (this.rowSelectionEngine.isRowSelected(id))
|
|
50
|
+
selectedCount++;
|
|
51
|
+
}
|
|
52
|
+
if (selectedCount === 0)
|
|
53
|
+
return 'none';
|
|
54
|
+
return selectedCount === descendantIds.length ? 'all' : 'some';
|
|
55
|
+
}
|
|
56
|
+
collectDescendantIds(node) {
|
|
57
|
+
// Prefer the live tree (has every descendant, including currently
|
|
58
|
+
// collapsed/lazy-unloaded ones already fetched) over `node.children`,
|
|
59
|
+
// which may be a filtered copy if called mid-filter.
|
|
60
|
+
const liveNode = this.treeDataService.getNode(node.nodeId) ?? node;
|
|
61
|
+
const ids = [];
|
|
62
|
+
const collect = (n) => {
|
|
63
|
+
for (const child of n.children) {
|
|
64
|
+
ids.push(child.nodeId);
|
|
65
|
+
collect(child);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
collect(liveNode);
|
|
69
|
+
return ids;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=tree-selection-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-selection-service.js","sourceRoot":"","sources":["../../../src/engines/tree/tree-selection-service.ts"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAoB;IAC/B,YACU,kBAAsC,EACtC,eAAgC;QADhC,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,oBAAe,GAAf,eAAe,CAAiB;IACvC,CAAC;IAEJ,uEAAuE;IACvE,qBAAqB,CAAC,IAAa,EAAE,WAAsB;QACzD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IAED,yEAAyE;IACzE,uBAAuB,CAAC,IAAa,EAAE,WAAsB;QAC3D,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC9D,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,qBAAqB,CAAC,IAAa,EAAE,WAAsB;QACzD,IAAI,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACH,2BAA2B,CAAC,IAAa;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAE3G,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,EAAE,CAAC;gBAAE,aAAa,EAAE,CAAC;QACjE,CAAC;QACD,IAAI,aAAa,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QACvC,OAAO,aAAa,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACjE,CAAC;IAEO,oBAAoB,CAAC,IAAa;QACxC,kEAAkE;QAClE,sEAAsE;QACtE,qDAAqD;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QACnE,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,CAAC,CAAU,EAAQ,EAAE;YACnC,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC/B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC;QACF,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClB,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file undo-redo-engine.ts
|
|
3
|
+
* Standalone undo/redo history manager for cell data mutations.
|
|
4
|
+
*
|
|
5
|
+
* Design goals
|
|
6
|
+
* ────────────
|
|
7
|
+
* • Zero dependencies — no GridStore, EventBus, or DOM access.
|
|
8
|
+
* • Deduplication — no-op changes (oldValue === newValue) and exact stack
|
|
9
|
+
* duplicates are silently dropped so repeated Ctrl+X on an already-null cell
|
|
10
|
+
* costs nothing.
|
|
11
|
+
* • Edit squashing — consecutive edits to the same cell are merged into one
|
|
12
|
+
* entry (keeps the original `oldValue`, updates `newValue`) so a single
|
|
13
|
+
* Ctrl+Z undoes the whole editing session rather than stepping through every
|
|
14
|
+
* intermediate commit.
|
|
15
|
+
* • Capped stacks — both undo and redo stacks are bounded by `maxStackSize`
|
|
16
|
+
* (default 200) to prevent unbounded memory growth on long sessions.
|
|
17
|
+
* • Redo invalidation — recording a new action clears the redo stack, matching
|
|
18
|
+
* the standard branching-history model.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* A before-and-after snapshot of a single cell value mutation.
|
|
22
|
+
* `nodeId` + `field` uniquely identify the cell across renders.
|
|
23
|
+
*/
|
|
24
|
+
export interface CellChange {
|
|
25
|
+
/** Stable row identity — survives sort/filter/group operations. */
|
|
26
|
+
nodeId: string;
|
|
27
|
+
/** Dot-notation field path in the row's `data` object. */
|
|
28
|
+
field: string;
|
|
29
|
+
/** Value before the mutation (restored on undo). */
|
|
30
|
+
oldValue: unknown;
|
|
31
|
+
/** Value after the mutation (re-applied on redo). */
|
|
32
|
+
newValue: unknown;
|
|
33
|
+
}
|
|
34
|
+
/** Discriminated label for what kind of operation produced the action. */
|
|
35
|
+
export type UndoRedoActionType = 'edit' | 'cut' | 'paste';
|
|
36
|
+
/**
|
|
37
|
+
* One reversible step on the history stack.
|
|
38
|
+
* Contains every cell that changed as part of a single user gesture.
|
|
39
|
+
*/
|
|
40
|
+
export interface UndoRedoAction {
|
|
41
|
+
/** What triggered this history entry. */
|
|
42
|
+
type: UndoRedoActionType;
|
|
43
|
+
/**
|
|
44
|
+
* Ordered list of mutations. Only meaningful changes are stored
|
|
45
|
+
* (i.e. `oldValue !== newValue` for every entry).
|
|
46
|
+
*/
|
|
47
|
+
changes: CellChange[];
|
|
48
|
+
}
|
|
49
|
+
export declare class UndoRedoEngine {
|
|
50
|
+
private undoStack;
|
|
51
|
+
private redoStack;
|
|
52
|
+
private readonly maxStackSize;
|
|
53
|
+
/**
|
|
54
|
+
* @param maxStackSize - Upper bound for each stack (default: 200).
|
|
55
|
+
*/
|
|
56
|
+
constructor(maxStackSize?: number);
|
|
57
|
+
/** `true` when there is at least one action that can be undone. */
|
|
58
|
+
get canUndo(): boolean;
|
|
59
|
+
/** `true` when there is at least one action that can be redone. */
|
|
60
|
+
get canRedo(): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Records a new action onto the undo stack.
|
|
63
|
+
*
|
|
64
|
+
* ### Deduplication rules (applied in order)
|
|
65
|
+
* 1. **No-op filter** — individual changes where `oldValue === newValue`
|
|
66
|
+
* (via `Object.is`) are stripped. If all changes are no-ops, the entire
|
|
67
|
+
* action is silently discarded (e.g. cutting an already-null cell).
|
|
68
|
+
* 2. **Exact duplicate** — if the incoming action is byte-for-byte identical
|
|
69
|
+
* to the current stack top it is discarded, preventing repeated identical
|
|
70
|
+
* operations from inflating the stack.
|
|
71
|
+
* 3. **Edit squash** — when the new action is `'edit'` AND the stack top is
|
|
72
|
+
* also `'edit'` on the **same single cell** (`nodeId` + `field` match),
|
|
73
|
+
* the top entry's `newValue` is updated in-place. This collapses a rapid
|
|
74
|
+
* sequence of edits into one undo step while preserving the original
|
|
75
|
+
* `oldValue`, so Ctrl+Z always jumps back to the value before the first
|
|
76
|
+
* edit in the session.
|
|
77
|
+
*
|
|
78
|
+
* Recording always clears the redo stack (branching-history model).
|
|
79
|
+
*
|
|
80
|
+
* @param action - The action to record.
|
|
81
|
+
*/
|
|
82
|
+
record(action: UndoRedoAction): void;
|
|
83
|
+
/**
|
|
84
|
+
* Pops the most recent action off the undo stack and returns the **inverse**
|
|
85
|
+
* changes that the caller must apply to restore the previous state.
|
|
86
|
+
*
|
|
87
|
+
* The popped action is pushed onto the redo stack so it can be re-applied.
|
|
88
|
+
*
|
|
89
|
+
* @returns Inverse `CellChange[]` to apply, or `null` if the stack is empty.
|
|
90
|
+
*/
|
|
91
|
+
undo(): CellChange[] | null;
|
|
92
|
+
/**
|
|
93
|
+
* Pops the most recently undone action off the redo stack and returns its
|
|
94
|
+
* **forward** changes so the caller can re-apply them.
|
|
95
|
+
*
|
|
96
|
+
* The action is pushed back onto the undo stack.
|
|
97
|
+
*
|
|
98
|
+
* @returns Forward `CellChange[]` to apply, or `null` if the stack is empty.
|
|
99
|
+
*/
|
|
100
|
+
redo(): CellChange[] | null;
|
|
101
|
+
/**
|
|
102
|
+
* Empties both the undo and redo stacks.
|
|
103
|
+
* Call when the underlying dataset is completely replaced (e.g. `api.setData`)
|
|
104
|
+
* so stale history cannot corrupt the new data.
|
|
105
|
+
*/
|
|
106
|
+
clear(): void;
|
|
107
|
+
/**
|
|
108
|
+
* Returns `true` when two actions are structurally identical:
|
|
109
|
+
* same `type`, same number of changes, and every change has the same
|
|
110
|
+
* `nodeId`, `field`, `oldValue`, and `newValue` (compared via `Object.is`).
|
|
111
|
+
*/
|
|
112
|
+
private actionsIdentical;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=undo-redo-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"undo-redo-engine.d.ts","sourceRoot":"","sources":["../../../src/engines/undo-redo/undo-redo-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,QAAQ,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,0EAA0E;AAC1E,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,IAAI,EAAE,kBAAkB,CAAC;IACzB;;;OAGG;IACH,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAOD,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IAEtC;;OAEG;gBACS,YAAY,SAAyB;IAMjD,mEAAmE;IACnE,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,mEAAmE;IACnE,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAuCpC;;;;;;;OAOG;IACH,IAAI,IAAI,UAAU,EAAE,GAAG,IAAI;IAiB3B;;;;;;;OAOG;IACH,IAAI,IAAI,UAAU,EAAE,GAAG,IAAI;IAU3B;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAOb;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;CAgBzB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file undo-redo-engine.ts
|
|
3
|
+
* Standalone undo/redo history manager for cell data mutations.
|
|
4
|
+
*
|
|
5
|
+
* Design goals
|
|
6
|
+
* ────────────
|
|
7
|
+
* • Zero dependencies — no GridStore, EventBus, or DOM access.
|
|
8
|
+
* • Deduplication — no-op changes (oldValue === newValue) and exact stack
|
|
9
|
+
* duplicates are silently dropped so repeated Ctrl+X on an already-null cell
|
|
10
|
+
* costs nothing.
|
|
11
|
+
* • Edit squashing — consecutive edits to the same cell are merged into one
|
|
12
|
+
* entry (keeps the original `oldValue`, updates `newValue`) so a single
|
|
13
|
+
* Ctrl+Z undoes the whole editing session rather than stepping through every
|
|
14
|
+
* intermediate commit.
|
|
15
|
+
* • Capped stacks — both undo and redo stacks are bounded by `maxStackSize`
|
|
16
|
+
* (default 200) to prevent unbounded memory growth on long sessions.
|
|
17
|
+
* • Redo invalidation — recording a new action clears the redo stack, matching
|
|
18
|
+
* the standard branching-history model.
|
|
19
|
+
*/
|
|
20
|
+
// ── Engine ────────────────────────────────────────────────────────────────────
|
|
21
|
+
/** Maximum number of entries stored in each stack. */
|
|
22
|
+
const DEFAULT_MAX_STACK_SIZE = 200;
|
|
23
|
+
export class UndoRedoEngine {
|
|
24
|
+
/**
|
|
25
|
+
* @param maxStackSize - Upper bound for each stack (default: 200).
|
|
26
|
+
*/
|
|
27
|
+
constructor(maxStackSize = DEFAULT_MAX_STACK_SIZE) {
|
|
28
|
+
this.undoStack = [];
|
|
29
|
+
this.redoStack = [];
|
|
30
|
+
this.maxStackSize = maxStackSize;
|
|
31
|
+
}
|
|
32
|
+
// ── Public API ─────────────────────────────────────────────────────────────
|
|
33
|
+
/** `true` when there is at least one action that can be undone. */
|
|
34
|
+
get canUndo() {
|
|
35
|
+
return this.undoStack.length > 0;
|
|
36
|
+
}
|
|
37
|
+
/** `true` when there is at least one action that can be redone. */
|
|
38
|
+
get canRedo() {
|
|
39
|
+
return this.redoStack.length > 0;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Records a new action onto the undo stack.
|
|
43
|
+
*
|
|
44
|
+
* ### Deduplication rules (applied in order)
|
|
45
|
+
* 1. **No-op filter** — individual changes where `oldValue === newValue`
|
|
46
|
+
* (via `Object.is`) are stripped. If all changes are no-ops, the entire
|
|
47
|
+
* action is silently discarded (e.g. cutting an already-null cell).
|
|
48
|
+
* 2. **Exact duplicate** — if the incoming action is byte-for-byte identical
|
|
49
|
+
* to the current stack top it is discarded, preventing repeated identical
|
|
50
|
+
* operations from inflating the stack.
|
|
51
|
+
* 3. **Edit squash** — when the new action is `'edit'` AND the stack top is
|
|
52
|
+
* also `'edit'` on the **same single cell** (`nodeId` + `field` match),
|
|
53
|
+
* the top entry's `newValue` is updated in-place. This collapses a rapid
|
|
54
|
+
* sequence of edits into one undo step while preserving the original
|
|
55
|
+
* `oldValue`, so Ctrl+Z always jumps back to the value before the first
|
|
56
|
+
* edit in the session.
|
|
57
|
+
*
|
|
58
|
+
* Recording always clears the redo stack (branching-history model).
|
|
59
|
+
*
|
|
60
|
+
* @param action - The action to record.
|
|
61
|
+
*/
|
|
62
|
+
record(action) {
|
|
63
|
+
// ── 1. Strip no-op individual changes ──────────────────────────────────
|
|
64
|
+
const meaningful = action.changes.filter((c) => !Object.is(c.oldValue, c.newValue));
|
|
65
|
+
if (meaningful.length === 0)
|
|
66
|
+
return;
|
|
67
|
+
const normalised = { type: action.type, changes: meaningful };
|
|
68
|
+
const top = this.undoStack.length > 0
|
|
69
|
+
? this.undoStack[this.undoStack.length - 1]
|
|
70
|
+
: null;
|
|
71
|
+
// ── 2. Exact duplicate check ───────────────────────────────────────────
|
|
72
|
+
if (top && this.actionsIdentical(top, normalised))
|
|
73
|
+
return;
|
|
74
|
+
// ── 3. Edit squash (same cell, consecutive edits) ──────────────────────
|
|
75
|
+
if (action.type === 'edit' &&
|
|
76
|
+
top?.type === 'edit' &&
|
|
77
|
+
meaningful.length === 1 &&
|
|
78
|
+
top.changes.length === 1 &&
|
|
79
|
+
top.changes[0].nodeId === meaningful[0].nodeId &&
|
|
80
|
+
top.changes[0].field === meaningful[0].field) {
|
|
81
|
+
// Mutate the existing top entry: keep its oldValue, update its newValue.
|
|
82
|
+
top.changes[0].newValue = meaningful[0].newValue;
|
|
83
|
+
this.redoStack = [];
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// ── Push to stack ──────────────────────────────────────────────────────
|
|
87
|
+
if (this.undoStack.length >= this.maxStackSize) {
|
|
88
|
+
this.undoStack.shift(); // evict oldest to stay within cap
|
|
89
|
+
}
|
|
90
|
+
this.undoStack.push(normalised);
|
|
91
|
+
this.redoStack = []; // invalidate redo branch on any new action
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Pops the most recent action off the undo stack and returns the **inverse**
|
|
95
|
+
* changes that the caller must apply to restore the previous state.
|
|
96
|
+
*
|
|
97
|
+
* The popped action is pushed onto the redo stack so it can be re-applied.
|
|
98
|
+
*
|
|
99
|
+
* @returns Inverse `CellChange[]` to apply, or `null` if the stack is empty.
|
|
100
|
+
*/
|
|
101
|
+
undo() {
|
|
102
|
+
const action = this.undoStack.pop();
|
|
103
|
+
if (!action)
|
|
104
|
+
return null;
|
|
105
|
+
if (this.redoStack.length >= this.maxStackSize)
|
|
106
|
+
this.redoStack.shift();
|
|
107
|
+
this.redoStack.push(action);
|
|
108
|
+
// Inverse: swap oldValue ↔ newValue so applying `newValue` restores the
|
|
109
|
+
// original cell state.
|
|
110
|
+
return action.changes.map((c) => ({
|
|
111
|
+
nodeId: c.nodeId,
|
|
112
|
+
field: c.field,
|
|
113
|
+
oldValue: c.newValue, // not used by the caller — kept for symmetry
|
|
114
|
+
newValue: c.oldValue, // caller writes this into row.data[field]
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Pops the most recently undone action off the redo stack and returns its
|
|
119
|
+
* **forward** changes so the caller can re-apply them.
|
|
120
|
+
*
|
|
121
|
+
* The action is pushed back onto the undo stack.
|
|
122
|
+
*
|
|
123
|
+
* @returns Forward `CellChange[]` to apply, or `null` if the stack is empty.
|
|
124
|
+
*/
|
|
125
|
+
redo() {
|
|
126
|
+
const action = this.redoStack.pop();
|
|
127
|
+
if (!action)
|
|
128
|
+
return null;
|
|
129
|
+
if (this.undoStack.length >= this.maxStackSize)
|
|
130
|
+
this.undoStack.shift();
|
|
131
|
+
this.undoStack.push(action);
|
|
132
|
+
return action.changes; // caller writes newValue into row.data[field]
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Empties both the undo and redo stacks.
|
|
136
|
+
* Call when the underlying dataset is completely replaced (e.g. `api.setData`)
|
|
137
|
+
* so stale history cannot corrupt the new data.
|
|
138
|
+
*/
|
|
139
|
+
clear() {
|
|
140
|
+
this.undoStack = [];
|
|
141
|
+
this.redoStack = [];
|
|
142
|
+
}
|
|
143
|
+
// ── Private helpers ────────────────────────────────────────────────────────
|
|
144
|
+
/**
|
|
145
|
+
* Returns `true` when two actions are structurally identical:
|
|
146
|
+
* same `type`, same number of changes, and every change has the same
|
|
147
|
+
* `nodeId`, `field`, `oldValue`, and `newValue` (compared via `Object.is`).
|
|
148
|
+
*/
|
|
149
|
+
actionsIdentical(a, b) {
|
|
150
|
+
if (a.type !== b.type || a.changes.length !== b.changes.length)
|
|
151
|
+
return false;
|
|
152
|
+
for (let i = 0; i < a.changes.length; i++) {
|
|
153
|
+
const ca = a.changes[i];
|
|
154
|
+
const cb = b.changes[i];
|
|
155
|
+
if (ca.nodeId !== cb.nodeId ||
|
|
156
|
+
ca.field !== cb.field ||
|
|
157
|
+
!Object.is(ca.oldValue, cb.oldValue) ||
|
|
158
|
+
!Object.is(ca.newValue, cb.newValue)) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=undo-redo-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"undo-redo-engine.js","sourceRoot":"","sources":["../../../src/engines/undo-redo/undo-redo-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAoCH,iFAAiF;AAEjF,sDAAsD;AACtD,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,MAAM,OAAO,cAAc;IAKzB;;OAEG;IACH,YAAY,YAAY,GAAG,sBAAsB;QAPzC,cAAS,GAAqB,EAAE,CAAC;QACjC,cAAS,GAAqB,EAAE,CAAC;QAOvC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED,8EAA8E;IAE9E,mEAAmE;IACnE,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,mEAAmE;IACnE,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,MAAsB;QAC3B,0EAA0E;QAC1E,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAC1C,CAAC;QACF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEpC,MAAM,UAAU,GAAmB,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QAE9E,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;YACnC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YAC3C,CAAC,CAAC,IAAI,CAAC;QAET,0EAA0E;QAC1E,IAAI,GAAG,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,UAAU,CAAC;YAAE,OAAO;QAE1D,0EAA0E;QAC1E,IACE,MAAM,CAAC,IAAI,KAAK,MAAM;YACtB,GAAG,EAAE,IAAI,KAAK,MAAM;YACpB,UAAU,CAAC,MAAM,KAAK,CAAC;YACvB,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YACxB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM;YAC9C,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,EAC5C,CAAC;YACD,yEAAyE;YACzE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YACjD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,0EAA0E;QAC1E,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/C,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,kCAAkC;QAC5D,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,2CAA2C;IAClE,CAAC;IAED;;;;;;;OAOG;IACH,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE5B,wEAAwE;QACxE,uBAAuB;QACvB,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAI,6CAA6C;YACrE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAI,0CAA0C;SACnE,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;OAOG;IACH,IAAI;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY;YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE5B,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,8CAA8C;IACvE,CAAC;IAED;;;;OAIG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,8EAA8E;IAE9E;;;;OAIG;IACK,gBAAgB,CAAC,CAAiB,EAAE,CAAiB;QAC3D,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxB,IACE,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM;gBACvB,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK;gBACrB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC;gBACpC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EACpC,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { GridEventType } from '../types/event.types';
|
|
2
|
+
export type EventHandler<T = unknown> = (payload: T) => void;
|
|
3
|
+
export declare class EventBus {
|
|
4
|
+
private subscriptions;
|
|
5
|
+
private nextId;
|
|
6
|
+
private paused;
|
|
7
|
+
private pendingQueue;
|
|
8
|
+
on<T>(type: GridEventType, handler: EventHandler<T>, priority?: number): () => void;
|
|
9
|
+
once<T>(type: GridEventType, handler: EventHandler<T>): () => void;
|
|
10
|
+
off(type: GridEventType, handler: EventHandler): void;
|
|
11
|
+
emit<T>(type: GridEventType, payload: T): void;
|
|
12
|
+
emitAsync<T>(type: GridEventType, payload: T): Promise<void>;
|
|
13
|
+
pause(): void;
|
|
14
|
+
resume(): void;
|
|
15
|
+
clear(type?: GridEventType): void;
|
|
16
|
+
hasListeners(type: GridEventType): boolean;
|
|
17
|
+
private addSubscription;
|
|
18
|
+
private removeSubscription;
|
|
19
|
+
private dispatch;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/event-bus/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;AAU7D,qBAAa,QAAQ;IACnB,OAAO,CAAC,aAAa,CAA4C;IACjE,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAwD;IAE5E,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,SAAI,GAAG,MAAM,IAAI;IAY9E,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAYlE,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAOrD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAQ9C,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5D,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAQd,KAAK,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,IAAI;IAQjC,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;IAK1C,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,QAAQ;CAejB"}
|