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,200 @@
|
|
|
1
|
+
export class ScrollController {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.scrollTop = 0;
|
|
4
|
+
this.scrollLeft = 0;
|
|
5
|
+
this.totalHeight = 0;
|
|
6
|
+
this.totalCenterWidth = 0;
|
|
7
|
+
this.viewportHeight = 0;
|
|
8
|
+
this.centerViewportWidth = 0;
|
|
9
|
+
this.gridEl = null;
|
|
10
|
+
this.sbVNativeEl = null;
|
|
11
|
+
this.sbVSpacerEl = null;
|
|
12
|
+
this.sbHNativeEl = null;
|
|
13
|
+
this.sbHSpacerEl = null;
|
|
14
|
+
this.sbHRowEl = null;
|
|
15
|
+
this.abortCtrl = null;
|
|
16
|
+
this.resizeObs = null;
|
|
17
|
+
this.scrollYCb = null;
|
|
18
|
+
this.scrollXCb = null;
|
|
19
|
+
/**
|
|
20
|
+
* When `true`, the vertical scrollbar column is never collapsed to 0 width
|
|
21
|
+
* — it stays reserved (a "stable gutter") even while `totalHeight <=
|
|
22
|
+
* viewportHeight`. Set for Master/Detail grids: expanding/collapsing a
|
|
23
|
+
* detail row changes total content height, which can tip whether a
|
|
24
|
+
* scrollbar is needed at all — if the column collapsed and reappeared with
|
|
25
|
+
* it, every flex column would jump to fill/re-cede that space on every
|
|
26
|
+
* toggle. Reserving it unconditionally makes that a non-event.
|
|
27
|
+
*/
|
|
28
|
+
this.reserveVerticalGutter = false;
|
|
29
|
+
this.onVNativeScroll = () => {
|
|
30
|
+
const st = this.sbVNativeEl.scrollTop;
|
|
31
|
+
if (Math.abs(st - this.scrollTop) < 0.5)
|
|
32
|
+
return;
|
|
33
|
+
this.scrollTop = st;
|
|
34
|
+
this.syncCSSVars();
|
|
35
|
+
this.scrollYCb?.(st);
|
|
36
|
+
};
|
|
37
|
+
this.onHNativeScroll = () => {
|
|
38
|
+
const sl = this.sbHNativeEl.scrollLeft;
|
|
39
|
+
if (Math.abs(sl - this.scrollLeft) < 0.5)
|
|
40
|
+
return;
|
|
41
|
+
this.scrollLeft = sl;
|
|
42
|
+
this.syncCSSVars();
|
|
43
|
+
this.scrollXCb?.();
|
|
44
|
+
};
|
|
45
|
+
this.onWheel = (e) => {
|
|
46
|
+
if (e.ctrlKey)
|
|
47
|
+
return;
|
|
48
|
+
// The Photon AI panel floats as a sibling overlay inside this same
|
|
49
|
+
// `.pg-grid__body` (see `GridRenderer.buildLayout`/`PhotonAIPanel.mount`),
|
|
50
|
+
// so a wheel event over its own scrollable chat log still bubbles up to
|
|
51
|
+
// this listener. Left unchecked, `preventDefault` below blocks the
|
|
52
|
+
// panel's native scroll entirely and redirects the gesture into scrolling
|
|
53
|
+
// the grid underneath it instead — bail out here so the panel scrolls itself.
|
|
54
|
+
if (e.target?.closest('.pg-ai-panel'))
|
|
55
|
+
return;
|
|
56
|
+
e.preventDefault();
|
|
57
|
+
// A nested Master/Detail grid's body sits inside the parent grid's own
|
|
58
|
+
// `.pg-grid__body` (a sibling of the pinned panels, not a descendant of
|
|
59
|
+
// them — see DetailRowRenderer). Without stopping propagation here, a
|
|
60
|
+
// wheel event this grid already handled keeps bubbling and also reaches
|
|
61
|
+
// the parent grid's own wheel listener on that shared ancestor, scrolling
|
|
62
|
+
// both grids from a single gesture (most visible on horizontal-dominant
|
|
63
|
+
// scrolls, and intermittently on trackpads whose "vertical" gestures emit
|
|
64
|
+
// a small stray deltaX).
|
|
65
|
+
e.stopPropagation();
|
|
66
|
+
let dx = e.deltaX;
|
|
67
|
+
let dy = e.deltaY;
|
|
68
|
+
if (e.deltaMode === 1 /* DOM_DELTA_LINE */) {
|
|
69
|
+
dx *= 32;
|
|
70
|
+
dy *= 32;
|
|
71
|
+
}
|
|
72
|
+
else if (e.deltaMode === 2 /* DOM_DELTA_PAGE */) {
|
|
73
|
+
dx *= this.centerViewportWidth;
|
|
74
|
+
dy *= this.viewportHeight;
|
|
75
|
+
}
|
|
76
|
+
if (e.shiftKey || Math.abs(dx) > Math.abs(dy)) {
|
|
77
|
+
this.scrollToX(this.scrollLeft + (e.deltaX !== 0 ? dx : dy));
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
this.scrollToY(this.scrollTop + dy);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
onScrollY(cb) { this.scrollYCb = cb; }
|
|
85
|
+
onScrollX(cb) { this.scrollXCb = cb; }
|
|
86
|
+
setReserveVerticalGutter(reserve) {
|
|
87
|
+
this.reserveVerticalGutter = reserve;
|
|
88
|
+
}
|
|
89
|
+
mount(gridEl, bodyEl, centerBodyEl, sbVNativeEl, sbVSpacerEl, sbHNativeEl, sbHSpacerEl, sbHRowEl) {
|
|
90
|
+
this.gridEl = gridEl;
|
|
91
|
+
this.sbVNativeEl = sbVNativeEl;
|
|
92
|
+
this.sbVSpacerEl = sbVSpacerEl;
|
|
93
|
+
this.sbHNativeEl = sbHNativeEl;
|
|
94
|
+
this.sbHSpacerEl = sbHSpacerEl;
|
|
95
|
+
this.sbHRowEl = sbHRowEl ?? sbHNativeEl;
|
|
96
|
+
const ac = new AbortController();
|
|
97
|
+
this.abortCtrl = ac;
|
|
98
|
+
const sig = ac.signal;
|
|
99
|
+
bodyEl.addEventListener('wheel', this.onWheel, { passive: false, signal: sig });
|
|
100
|
+
const headerEl = gridEl.querySelector('.pg-grid__header');
|
|
101
|
+
headerEl?.addEventListener('wheel', this.onWheel, { passive: false, signal: sig });
|
|
102
|
+
sbVNativeEl.addEventListener('scroll', this.onVNativeScroll, { signal: sig });
|
|
103
|
+
sbHNativeEl.addEventListener('scroll', this.onHNativeScroll, { signal: sig });
|
|
104
|
+
this.resizeObs = new ResizeObserver(() => {
|
|
105
|
+
this.viewportHeight = bodyEl.clientHeight;
|
|
106
|
+
this.centerViewportWidth = centerBodyEl.clientWidth;
|
|
107
|
+
this.clampScroll();
|
|
108
|
+
this.syncCSSVars();
|
|
109
|
+
this.syncScrollbars();
|
|
110
|
+
this.scrollXCb?.();
|
|
111
|
+
});
|
|
112
|
+
this.resizeObs.observe(bodyEl);
|
|
113
|
+
this.resizeObs.observe(centerBodyEl);
|
|
114
|
+
this.viewportHeight = bodyEl.clientHeight;
|
|
115
|
+
this.centerViewportWidth = centerBodyEl.clientWidth;
|
|
116
|
+
}
|
|
117
|
+
updateSizes(totalHeight, totalCenterWidth) {
|
|
118
|
+
this.totalHeight = totalHeight;
|
|
119
|
+
this.totalCenterWidth = totalCenterWidth;
|
|
120
|
+
if (this.sbVSpacerEl)
|
|
121
|
+
this.sbVSpacerEl.style.height = `${totalHeight}px`;
|
|
122
|
+
if (this.sbHSpacerEl)
|
|
123
|
+
this.sbHSpacerEl.style.width = `${totalCenterWidth}px`;
|
|
124
|
+
this.clampScroll();
|
|
125
|
+
this.syncCSSVars();
|
|
126
|
+
this.syncScrollbars();
|
|
127
|
+
}
|
|
128
|
+
getScrollTop() { return this.scrollTop; }
|
|
129
|
+
getScrollLeft() { return this.scrollLeft; }
|
|
130
|
+
/** Returns the current visible height of the body viewport in pixels. */
|
|
131
|
+
getViewportHeight() { return this.viewportHeight; }
|
|
132
|
+
/** Returns the current visible width of the center body viewport in pixels. */
|
|
133
|
+
getCenterViewportWidth() { return this.centerViewportWidth; }
|
|
134
|
+
canScrollLeft() { return this.scrollLeft > 0; }
|
|
135
|
+
canScrollRight() { return this.scrollLeft < Math.max(0, this.totalCenterWidth - this.centerViewportWidth); }
|
|
136
|
+
canScrollUp() { return this.scrollTop > 0; }
|
|
137
|
+
canScrollDown() { return this.scrollTop < Math.max(0, this.totalHeight - this.viewportHeight); }
|
|
138
|
+
scrollToY(y) {
|
|
139
|
+
const max = Math.max(0, this.totalHeight - this.viewportHeight);
|
|
140
|
+
const next = Math.max(0, Math.min(y, max));
|
|
141
|
+
if (next === this.scrollTop)
|
|
142
|
+
return;
|
|
143
|
+
this.scrollTop = next;
|
|
144
|
+
this.syncCSSVars();
|
|
145
|
+
this.syncScrollbars();
|
|
146
|
+
if (this.sbVNativeEl)
|
|
147
|
+
this.sbVNativeEl.scrollTop = next;
|
|
148
|
+
this.scrollYCb?.(this.scrollTop);
|
|
149
|
+
}
|
|
150
|
+
scrollToX(x) {
|
|
151
|
+
const max = Math.max(0, this.totalCenterWidth - this.centerViewportWidth);
|
|
152
|
+
const next = Math.max(0, Math.min(x, max));
|
|
153
|
+
if (next === this.scrollLeft)
|
|
154
|
+
return;
|
|
155
|
+
this.scrollLeft = next;
|
|
156
|
+
this.syncCSSVars();
|
|
157
|
+
this.syncScrollbars();
|
|
158
|
+
if (this.sbHNativeEl)
|
|
159
|
+
this.sbHNativeEl.scrollLeft = next;
|
|
160
|
+
this.scrollXCb?.();
|
|
161
|
+
}
|
|
162
|
+
scrollToRow(rowIndex, rows) {
|
|
163
|
+
if (rowIndex >= 0 && rowIndex < rows.length)
|
|
164
|
+
this.scrollToY(rows[rowIndex].top);
|
|
165
|
+
}
|
|
166
|
+
scrollToTop() { this.scrollToY(0); }
|
|
167
|
+
destroy() {
|
|
168
|
+
this.abortCtrl?.abort();
|
|
169
|
+
this.abortCtrl = null;
|
|
170
|
+
this.resizeObs?.disconnect();
|
|
171
|
+
this.resizeObs = null;
|
|
172
|
+
}
|
|
173
|
+
clampScroll() {
|
|
174
|
+
this.scrollTop = Math.max(0, Math.min(this.scrollTop, Math.max(0, this.totalHeight - this.viewportHeight)));
|
|
175
|
+
this.scrollLeft = Math.max(0, Math.min(this.scrollLeft, Math.max(0, this.totalCenterWidth - this.centerViewportWidth)));
|
|
176
|
+
}
|
|
177
|
+
syncCSSVars() {
|
|
178
|
+
if (!this.gridEl)
|
|
179
|
+
return;
|
|
180
|
+
this.gridEl.style.setProperty('--pg-scroll-x', `-${this.scrollLeft}px`);
|
|
181
|
+
this.gridEl.style.setProperty('--pg-scroll-y', `-${this.scrollTop}px`);
|
|
182
|
+
}
|
|
183
|
+
syncScrollbars() {
|
|
184
|
+
if (this.sbVNativeEl) {
|
|
185
|
+
const vHidden = !this.reserveVerticalGutter && this.totalHeight <= this.viewportHeight;
|
|
186
|
+
this.sbVNativeEl.classList.toggle('pg-scrollbar--hidden', vHidden);
|
|
187
|
+
// Master/Detail's full-width overlay layer spans the entire body
|
|
188
|
+
// (including the vertical scrollbar's flex-allocated column) so its
|
|
189
|
+
// rows can be positioned with simple `top` offsets. This live var lets
|
|
190
|
+
// it carve out exactly the scrollbar's *current* width — 0 when hidden,
|
|
191
|
+
// matching the real column layout — so it never visually paints over
|
|
192
|
+
// the native scrollbar when one is showing.
|
|
193
|
+
this.gridEl?.style.setProperty('--pg-scrollbar-v-live-width', vHidden ? '0px' : 'var(--pg-scrollbar-v-width, 17px)');
|
|
194
|
+
}
|
|
195
|
+
if (this.sbHRowEl) {
|
|
196
|
+
this.sbHRowEl.classList.toggle('pg-scrollbar--hidden', this.totalCenterWidth <= this.centerViewportWidth);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=scroll-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-controller.js","sourceRoot":"","sources":["../../src/renderer/scroll-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { RowNode } from '../types/row.types';
|
|
2
|
+
/** Result of a single `StickyRowTracker.compute` call. */
|
|
3
|
+
export interface StickyRowResult {
|
|
4
|
+
/** `nodeId` of the master row that should render pinned at the panel's top, or `null` when nothing is sticky. */
|
|
5
|
+
nodeId: string | null;
|
|
6
|
+
/** Pixel offset (always `<= 0`) to apply as the sticky row's `top` — `0` while fully pinned, negative while being pushed off-screen by the next block taking over. */
|
|
7
|
+
offsetPx: number;
|
|
8
|
+
/** The virtualization window's `start` index, widened if needed so the sticky row's cells stay rendered even though it has scrolled past its natural position. */
|
|
9
|
+
minStart: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Computes Master/Detail sticky-row state for one grid instance's current
|
|
13
|
+
* scroll position — the sole responsibility of this class, kept separate
|
|
14
|
+
* from `GridRenderer` so the sticky math is independently readable/testable
|
|
15
|
+
* and easy to extend (e.g. sticky group headers could reuse the same shape).
|
|
16
|
+
*
|
|
17
|
+
* A row R (`type: 'data'`, expanded, with an immediately-following `'detail'`
|
|
18
|
+
* row D) defines a "block" spanning `[R.top, D.top + D.height)`. Whenever the
|
|
19
|
+
* current `scrollTop` falls inside that range — including while merely
|
|
20
|
+
* scrolling through R's own height, before D even starts — R should render
|
|
21
|
+
* pinned at the viewport's top instead of scrolling normally.
|
|
22
|
+
*
|
|
23
|
+
* The returned `offsetPx` implements the classic "push-off" handoff used by
|
|
24
|
+
* native `position: sticky` with sequential sticky siblings: it stays `0`
|
|
25
|
+
* (fully pinned) until the block's end approaches, then slides negative so R
|
|
26
|
+
* appears to be covered/pushed away by the next row arriving from below,
|
|
27
|
+
* reaching exactly `-R.height` right as the block ends and control passes to
|
|
28
|
+
* whatever comes next — rather than R abruptly vanishing.
|
|
29
|
+
*/
|
|
30
|
+
export declare class StickyRowTracker {
|
|
31
|
+
compute(rows: RowNode[], scrollTop: number, rowHeight: number, windowStart: number): StickyRowResult;
|
|
32
|
+
/**
|
|
33
|
+
* Given the row whose span contains `scrollTop`, resolves the index of the
|
|
34
|
+
* "master" row that should be sticky — itself if it's an expanded master
|
|
35
|
+
* still within its own height, or its parent if it's the detail row.
|
|
36
|
+
* Returns -1 when the row at `idx` isn't part of a master/detail block.
|
|
37
|
+
*/
|
|
38
|
+
private resolveMasterIndex;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=sticky-row-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sticky-row-tracker.d.ts","sourceRoot":"","sources":["../../src/renderer/sticky-row-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGlD,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC9B,iHAAiH;IACjH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,sKAAsK;IACtK,QAAQ,EAAE,MAAM,CAAC;IACjB,kKAAkK;IAClK,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,eAAe;IAyBpG;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;CAW3B"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { findRowAtOffset } from './row-offset-search';
|
|
2
|
+
/**
|
|
3
|
+
* Computes Master/Detail sticky-row state for one grid instance's current
|
|
4
|
+
* scroll position — the sole responsibility of this class, kept separate
|
|
5
|
+
* from `GridRenderer` so the sticky math is independently readable/testable
|
|
6
|
+
* and easy to extend (e.g. sticky group headers could reuse the same shape).
|
|
7
|
+
*
|
|
8
|
+
* A row R (`type: 'data'`, expanded, with an immediately-following `'detail'`
|
|
9
|
+
* row D) defines a "block" spanning `[R.top, D.top + D.height)`. Whenever the
|
|
10
|
+
* current `scrollTop` falls inside that range — including while merely
|
|
11
|
+
* scrolling through R's own height, before D even starts — R should render
|
|
12
|
+
* pinned at the viewport's top instead of scrolling normally.
|
|
13
|
+
*
|
|
14
|
+
* The returned `offsetPx` implements the classic "push-off" handoff used by
|
|
15
|
+
* native `position: sticky` with sequential sticky siblings: it stays `0`
|
|
16
|
+
* (fully pinned) until the block's end approaches, then slides negative so R
|
|
17
|
+
* appears to be covered/pushed away by the next row arriving from below,
|
|
18
|
+
* reaching exactly `-R.height` right as the block ends and control passes to
|
|
19
|
+
* whatever comes next — rather than R abruptly vanishing.
|
|
20
|
+
*/
|
|
21
|
+
export class StickyRowTracker {
|
|
22
|
+
compute(rows, scrollTop, rowHeight, windowStart) {
|
|
23
|
+
const none = { nodeId: null, offsetPx: 0, minStart: windowStart };
|
|
24
|
+
if (rows.length === 0)
|
|
25
|
+
return none;
|
|
26
|
+
const idx = findRowAtOffset(rows, scrollTop, rowHeight);
|
|
27
|
+
if (idx < 0)
|
|
28
|
+
return none;
|
|
29
|
+
const masterIdx = this.resolveMasterIndex(rows, idx);
|
|
30
|
+
if (masterIdx < 0)
|
|
31
|
+
return none;
|
|
32
|
+
const master = rows[masterIdx];
|
|
33
|
+
const detail = rows[masterIdx + 1];
|
|
34
|
+
if (!detail || detail.type !== 'detail')
|
|
35
|
+
return none;
|
|
36
|
+
const masterHeight = master.height ?? rowHeight;
|
|
37
|
+
const blockBottom = detail.top + (detail.height ?? rowHeight);
|
|
38
|
+
const offsetPx = Math.min(0, blockBottom - scrollTop - masterHeight);
|
|
39
|
+
return {
|
|
40
|
+
nodeId: master.nodeId,
|
|
41
|
+
offsetPx,
|
|
42
|
+
minStart: Math.min(windowStart, masterIdx),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Given the row whose span contains `scrollTop`, resolves the index of the
|
|
47
|
+
* "master" row that should be sticky — itself if it's an expanded master
|
|
48
|
+
* still within its own height, or its parent if it's the detail row.
|
|
49
|
+
* Returns -1 when the row at `idx` isn't part of a master/detail block.
|
|
50
|
+
*/
|
|
51
|
+
resolveMasterIndex(rows, idx) {
|
|
52
|
+
const row = rows[idx];
|
|
53
|
+
if (row.type === 'detail') {
|
|
54
|
+
const parentIdx = idx - 1;
|
|
55
|
+
return rows[parentIdx]?.type === 'data' ? parentIdx : -1;
|
|
56
|
+
}
|
|
57
|
+
if (row.type === 'data' && rows[idx + 1]?.type === 'detail' && rows[idx + 1].parentNodeId === row.nodeId) {
|
|
58
|
+
return idx;
|
|
59
|
+
}
|
|
60
|
+
return -1;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=sticky-row-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sticky-row-tracker.js","sourceRoot":"","sources":["../../src/renderer/sticky-row-tracker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAYtD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,gBAAgB;IAC3B,OAAO,CAAC,IAAe,EAAE,SAAiB,EAAE,SAAiB,EAAE,WAAmB;QAChF,MAAM,IAAI,GAAoB,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;QACnF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEnC,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACxD,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,SAAS,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAE/B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAErD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC;QAChD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC;QAErE,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC;SAC3C,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,kBAAkB,CAAC,IAAe,EAAE,GAAW;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;YACzG,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ColumnModel } from '../core/column-model';
|
|
2
|
+
import type { GridStore } from '../core/grid-store';
|
|
3
|
+
/**
|
|
4
|
+
* Shows a floating, theme-styled tooltip for cells whose column defines
|
|
5
|
+
* `renderer.tooltip`. Columns without one keep using the grid's existing,
|
|
6
|
+
* essentially free native `title` attribute — this controller does nothing
|
|
7
|
+
* for them, so it adds zero cost to the common case.
|
|
8
|
+
*
|
|
9
|
+
* Uses a single delegated `mouseover`/`mouseout` listener pair on the grid
|
|
10
|
+
* body (not one listener per cell or per row), matching the cost profile of
|
|
11
|
+
* the grid's existing delegated click handling.
|
|
12
|
+
*/
|
|
13
|
+
export declare class TooltipController {
|
|
14
|
+
private readonly store;
|
|
15
|
+
private readonly columnModel;
|
|
16
|
+
private readonly api;
|
|
17
|
+
private hostEl;
|
|
18
|
+
private tooltipEl;
|
|
19
|
+
private showTimer;
|
|
20
|
+
private hoveredCellEl;
|
|
21
|
+
private readonly boundMouseOver;
|
|
22
|
+
private readonly boundMouseOut;
|
|
23
|
+
constructor(store: GridStore, columnModel: ColumnModel, api: unknown);
|
|
24
|
+
/** Attaches the delegated hover listeners to the grid body wrapper. */
|
|
25
|
+
mount(bodyWrapEl: HTMLElement): void;
|
|
26
|
+
/** Detaches listeners, clears any pending timer, and removes the tooltip element. */
|
|
27
|
+
destroy(): void;
|
|
28
|
+
private handleMouseOver;
|
|
29
|
+
private handleMouseOut;
|
|
30
|
+
private show;
|
|
31
|
+
private hide;
|
|
32
|
+
/** Positions the tooltip above the anchor cell, clamped to stay within the grid body. */
|
|
33
|
+
private position;
|
|
34
|
+
private clearShowTimer;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=tooltip-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip-renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/tooltip-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQpD;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IAU1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAXtB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,aAAa,CAA4B;IAEjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA0B;IACzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0B;gBAGrC,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,OAAO;IAM/B,uEAAuE;IACvE,KAAK,CAAC,UAAU,EAAE,WAAW,GAAG,IAAI;IAMpC,qFAAqF;IACrF,OAAO,IAAI,IAAI;IAUf,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,IAAI;IAmBZ,OAAO,CAAC,IAAI;IAIZ,yFAAyF;IACzF,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,cAAc;CAMvB"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { resolveColumnRenderer } from './renderer-resolver';
|
|
2
|
+
/** Delay, in milliseconds, between hovering a cell and the custom tooltip appearing. */
|
|
3
|
+
const SHOW_DELAY_MS = 400;
|
|
4
|
+
/**
|
|
5
|
+
* Shows a floating, theme-styled tooltip for cells whose column defines
|
|
6
|
+
* `renderer.tooltip`. Columns without one keep using the grid's existing,
|
|
7
|
+
* essentially free native `title` attribute — this controller does nothing
|
|
8
|
+
* for them, so it adds zero cost to the common case.
|
|
9
|
+
*
|
|
10
|
+
* Uses a single delegated `mouseover`/`mouseout` listener pair on the grid
|
|
11
|
+
* body (not one listener per cell or per row), matching the cost profile of
|
|
12
|
+
* the grid's existing delegated click handling.
|
|
13
|
+
*/
|
|
14
|
+
export class TooltipController {
|
|
15
|
+
constructor(store, columnModel, api) {
|
|
16
|
+
this.store = store;
|
|
17
|
+
this.columnModel = columnModel;
|
|
18
|
+
this.api = api;
|
|
19
|
+
this.hostEl = null;
|
|
20
|
+
this.tooltipEl = null;
|
|
21
|
+
this.showTimer = null;
|
|
22
|
+
this.hoveredCellEl = null;
|
|
23
|
+
this.boundMouseOver = this.handleMouseOver.bind(this);
|
|
24
|
+
this.boundMouseOut = this.handleMouseOut.bind(this);
|
|
25
|
+
}
|
|
26
|
+
/** Attaches the delegated hover listeners to the grid body wrapper. */
|
|
27
|
+
mount(bodyWrapEl) {
|
|
28
|
+
this.hostEl = bodyWrapEl;
|
|
29
|
+
bodyWrapEl.addEventListener('mouseover', this.boundMouseOver);
|
|
30
|
+
bodyWrapEl.addEventListener('mouseout', this.boundMouseOut);
|
|
31
|
+
}
|
|
32
|
+
/** Detaches listeners, clears any pending timer, and removes the tooltip element. */
|
|
33
|
+
destroy() {
|
|
34
|
+
this.hostEl?.removeEventListener('mouseover', this.boundMouseOver);
|
|
35
|
+
this.hostEl?.removeEventListener('mouseout', this.boundMouseOut);
|
|
36
|
+
this.clearShowTimer();
|
|
37
|
+
this.tooltipEl?.remove();
|
|
38
|
+
this.tooltipEl = null;
|
|
39
|
+
this.hostEl = null;
|
|
40
|
+
this.hoveredCellEl = null;
|
|
41
|
+
}
|
|
42
|
+
handleMouseOver(e) {
|
|
43
|
+
const cellEl = e.target.closest('.pg-cell[data-col-id]');
|
|
44
|
+
if (!cellEl || cellEl === this.hoveredCellEl)
|
|
45
|
+
return;
|
|
46
|
+
this.hoveredCellEl = cellEl;
|
|
47
|
+
this.clearShowTimer();
|
|
48
|
+
this.hide();
|
|
49
|
+
const colId = cellEl.getAttribute('data-col-id');
|
|
50
|
+
const nodeId = cellEl.closest('[data-node-id]')?.getAttribute('data-node-id');
|
|
51
|
+
if (!colId || !nodeId)
|
|
52
|
+
return;
|
|
53
|
+
const columns = this.columnModel.getVisibleColumns();
|
|
54
|
+
const colIndex = columns.findIndex((c) => c.colId === colId);
|
|
55
|
+
const colDef = columns[colIndex];
|
|
56
|
+
if (!colDef)
|
|
57
|
+
return;
|
|
58
|
+
const tooltipFn = resolveColumnRenderer(colDef, 'tooltip');
|
|
59
|
+
if (!tooltipFn)
|
|
60
|
+
return;
|
|
61
|
+
const rows = this.store.get('visibleRows') ?? [];
|
|
62
|
+
const row = rows.find((r) => r.nodeId === nodeId);
|
|
63
|
+
if (!row || row.type !== 'data')
|
|
64
|
+
return;
|
|
65
|
+
this.showTimer = setTimeout(() => {
|
|
66
|
+
const rawValue = row.data[colDef.field];
|
|
67
|
+
const params = {
|
|
68
|
+
value: rawValue,
|
|
69
|
+
rawValue,
|
|
70
|
+
row: row.data,
|
|
71
|
+
colDef,
|
|
72
|
+
rowIndex: row.rowIndex,
|
|
73
|
+
colIndex,
|
|
74
|
+
api: this.api,
|
|
75
|
+
};
|
|
76
|
+
this.show(cellEl, tooltipFn(params));
|
|
77
|
+
}, SHOW_DELAY_MS);
|
|
78
|
+
}
|
|
79
|
+
handleMouseOut(e) {
|
|
80
|
+
const related = e.relatedTarget;
|
|
81
|
+
if (this.hoveredCellEl && related && this.hoveredCellEl.contains(related))
|
|
82
|
+
return;
|
|
83
|
+
this.hoveredCellEl = null;
|
|
84
|
+
this.clearShowTimer();
|
|
85
|
+
this.hide();
|
|
86
|
+
}
|
|
87
|
+
show(anchorEl, content) {
|
|
88
|
+
if (!this.hostEl)
|
|
89
|
+
return;
|
|
90
|
+
if (!this.tooltipEl) {
|
|
91
|
+
this.tooltipEl = document.createElement('div');
|
|
92
|
+
this.tooltipEl.className = 'pg-tooltip';
|
|
93
|
+
this.hostEl.appendChild(this.tooltipEl);
|
|
94
|
+
}
|
|
95
|
+
if (typeof content === 'string') {
|
|
96
|
+
this.tooltipEl.innerHTML = content;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
this.tooltipEl.innerHTML = '';
|
|
100
|
+
this.tooltipEl.appendChild(content);
|
|
101
|
+
}
|
|
102
|
+
this.position(anchorEl);
|
|
103
|
+
this.tooltipEl.classList.add('pg-tooltip--visible');
|
|
104
|
+
}
|
|
105
|
+
hide() {
|
|
106
|
+
this.tooltipEl?.classList.remove('pg-tooltip--visible');
|
|
107
|
+
}
|
|
108
|
+
/** Positions the tooltip above the anchor cell, clamped to stay within the grid body. */
|
|
109
|
+
position(anchorEl) {
|
|
110
|
+
if (!this.tooltipEl || !this.hostEl)
|
|
111
|
+
return;
|
|
112
|
+
const hostRect = this.hostEl.getBoundingClientRect();
|
|
113
|
+
const anchorRect = anchorEl.getBoundingClientRect();
|
|
114
|
+
const tooltipRect = this.tooltipEl.getBoundingClientRect();
|
|
115
|
+
let top = anchorRect.top - hostRect.top - tooltipRect.height - 8;
|
|
116
|
+
if (top < 0)
|
|
117
|
+
top = anchorRect.bottom - hostRect.top + 8;
|
|
118
|
+
let left = anchorRect.left - hostRect.left;
|
|
119
|
+
const maxLeft = hostRect.width - tooltipRect.width - 4;
|
|
120
|
+
if (left > maxLeft)
|
|
121
|
+
left = Math.max(4, maxLeft);
|
|
122
|
+
if (left < 4)
|
|
123
|
+
left = 4;
|
|
124
|
+
this.tooltipEl.style.transform = `translate(${left}px, ${top}px)`;
|
|
125
|
+
}
|
|
126
|
+
clearShowTimer() {
|
|
127
|
+
if (this.showTimer !== null) {
|
|
128
|
+
clearTimeout(this.showTimer);
|
|
129
|
+
this.showTimer = null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=tooltip-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip-renderer.js","sourceRoot":"","sources":["../../src/renderer/tooltip-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { RowNode } from '../types/row.types';
|
|
2
|
+
import type { ColumnDef } from '../types/column.types';
|
|
3
|
+
import type { EventBus } from '../event-bus/event-bus';
|
|
4
|
+
import type { IconRenderer } from '../icons/icon-renderer';
|
|
5
|
+
/** The subset of `TreeDataConfig` `BodyRenderer` needs — passed as plain data so this module never imports the tree engine types (rendering never builds hierarchy, per the feature's own design contract). */
|
|
6
|
+
export interface TreeToggleRenderConfig {
|
|
7
|
+
toggleColumnId: string;
|
|
8
|
+
isExpandedFn: (nodeId: string) => boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Inserts Tree Data's expand/collapse toggle as a sibling of `.pg-cell__inner`
|
|
12
|
+
* (never inside it — same reasoning as `BodyRenderer.applyMasterDetailToggle`:
|
|
13
|
+
* `.pg-cell__inner` is wiped and rebuilt wholesale when a cell starts/stops
|
|
14
|
+
* editing, which would silently destroy a toggle placed inside it).
|
|
15
|
+
*
|
|
16
|
+
* A pure function, not a method on `BodyRenderer` — kept in its own module so
|
|
17
|
+
* Tree Data's rendering concern stays a separate, focused unit even though it
|
|
18
|
+
* executes inline in `BodyRenderer`'s existing per-cell build loop for
|
|
19
|
+
* performance (no parallel DOM pass, no extra pooling).
|
|
20
|
+
*
|
|
21
|
+
* No-ops for anything but a `'data'` row in the configured toggle column.
|
|
22
|
+
* A leaf row (no children) still reserves the toggle's own width as an
|
|
23
|
+
* invisible spacer rather than omitting it — without that, a leaf's content
|
|
24
|
+
* starts right at the level's base indent while its parent's content is
|
|
25
|
+
* pushed further right by the real toggle button + gap, so children render
|
|
26
|
+
* *less* indented than the parent they belong to. Reserving the same slot
|
|
27
|
+
* on every row keeps each level's content start strictly increasing.
|
|
28
|
+
*/
|
|
29
|
+
export declare function applyTreeToggle(cellEl: HTMLElement, row: RowNode, colDef: ColumnDef, treeData: TreeToggleRenderConfig | undefined, iconRenderer: IconRenderer, eventBus: EventBus): void;
|
|
30
|
+
/**
|
|
31
|
+
* Re-applies the toggle icon/label after expansion state changes without a
|
|
32
|
+
* full row rebuild — mirrors `BodyRenderer.updatePanelRow`'s master-detail
|
|
33
|
+
* sync block. A no-op when the row has no toggle button (leaf rows, or
|
|
34
|
+
* Tree Data not enabled).
|
|
35
|
+
*/
|
|
36
|
+
export declare function syncTreeToggle(rowEl: HTMLElement, row: RowNode, treeData: TreeToggleRenderConfig | undefined, iconRenderer: IconRenderer): void;
|
|
37
|
+
//# sourceMappingURL=tree-cell-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-cell-renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/tree-cell-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAI3D,+MAA+M;AAC/M,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,sBAAsB,GAAG,SAAS,EAC5C,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,QAAQ,GACjB,IAAI,CAoCN;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,sBAAsB,GAAG,SAAS,EAC5C,YAAY,EAAE,YAAY,GACzB,IAAI,CASN"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { GridEventType } from '../types/event.types';
|
|
2
|
+
import { createDiv } from './dom-utils';
|
|
3
|
+
/**
|
|
4
|
+
* Inserts Tree Data's expand/collapse toggle as a sibling of `.pg-cell__inner`
|
|
5
|
+
* (never inside it — same reasoning as `BodyRenderer.applyMasterDetailToggle`:
|
|
6
|
+
* `.pg-cell__inner` is wiped and rebuilt wholesale when a cell starts/stops
|
|
7
|
+
* editing, which would silently destroy a toggle placed inside it).
|
|
8
|
+
*
|
|
9
|
+
* A pure function, not a method on `BodyRenderer` — kept in its own module so
|
|
10
|
+
* Tree Data's rendering concern stays a separate, focused unit even though it
|
|
11
|
+
* executes inline in `BodyRenderer`'s existing per-cell build loop for
|
|
12
|
+
* performance (no parallel DOM pass, no extra pooling).
|
|
13
|
+
*
|
|
14
|
+
* No-ops for anything but a `'data'` row in the configured toggle column.
|
|
15
|
+
* A leaf row (no children) still reserves the toggle's own width as an
|
|
16
|
+
* invisible spacer rather than omitting it — without that, a leaf's content
|
|
17
|
+
* starts right at the level's base indent while its parent's content is
|
|
18
|
+
* pushed further right by the real toggle button + gap, so children render
|
|
19
|
+
* *less* indented than the parent they belong to. Reserving the same slot
|
|
20
|
+
* on every row keeps each level's content start strictly increasing.
|
|
21
|
+
*/
|
|
22
|
+
export function applyTreeToggle(cellEl, row, colDef, treeData, iconRenderer, eventBus) {
|
|
23
|
+
if (!treeData || row.type !== 'data' || colDef.colId !== treeData.toggleColumnId)
|
|
24
|
+
return;
|
|
25
|
+
// Marks the toggle column's cell for level-based indentation (see the
|
|
26
|
+
// `.pg-row--tree[data-level="N"] .pg-cell--tree-toggle-col` rules in
|
|
27
|
+
// base-styles.ts) — applied to every row in this column, leaves included,
|
|
28
|
+
// since a leaf still needs to sit indented under its parent even with no
|
|
29
|
+
// chevron of its own.
|
|
30
|
+
cellEl.classList.add('pg-cell--tree-toggle-col');
|
|
31
|
+
const inner = cellEl.querySelector('.pg-cell__inner');
|
|
32
|
+
if (!row.hasChildren) {
|
|
33
|
+
const spacer = createDiv('pg-tree-toggle-spacer');
|
|
34
|
+
if (inner)
|
|
35
|
+
cellEl.insertBefore(spacer, inner);
|
|
36
|
+
else
|
|
37
|
+
cellEl.insertBefore(spacer, cellEl.firstChild);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const isExpanded = treeData.isExpandedFn(row.nodeId);
|
|
41
|
+
const toggleBtn = createDiv('pg-tree-toggle');
|
|
42
|
+
toggleBtn.setAttribute('role', 'button');
|
|
43
|
+
toggleBtn.setAttribute('data-tree-toggle', '');
|
|
44
|
+
toggleBtn.setAttribute('aria-label', isExpanded ? 'Collapse' : 'Expand');
|
|
45
|
+
toggleBtn.appendChild(iconRenderer.render(isExpanded ? 'chevronDown' : 'chevronRight', { size: 16 }));
|
|
46
|
+
if (inner) {
|
|
47
|
+
cellEl.insertBefore(toggleBtn, inner);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
cellEl.insertBefore(toggleBtn, cellEl.firstChild);
|
|
51
|
+
}
|
|
52
|
+
toggleBtn.addEventListener('click', (e) => {
|
|
53
|
+
e.stopPropagation();
|
|
54
|
+
eventBus.emit(GridEventType.TREE_NODE_TOGGLE_CLICKED, { row, colDef });
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Re-applies the toggle icon/label after expansion state changes without a
|
|
59
|
+
* full row rebuild — mirrors `BodyRenderer.updatePanelRow`'s master-detail
|
|
60
|
+
* sync block. A no-op when the row has no toggle button (leaf rows, or
|
|
61
|
+
* Tree Data not enabled).
|
|
62
|
+
*/
|
|
63
|
+
export function syncTreeToggle(rowEl, row, treeData, iconRenderer) {
|
|
64
|
+
if (!treeData || row.type !== 'data')
|
|
65
|
+
return;
|
|
66
|
+
const toggleBtn = rowEl.querySelector('.pg-tree-toggle');
|
|
67
|
+
if (!toggleBtn)
|
|
68
|
+
return;
|
|
69
|
+
const isExpanded = treeData.isExpandedFn(row.nodeId);
|
|
70
|
+
const iconEl = toggleBtn.querySelector('.pg-icon');
|
|
71
|
+
if (iconEl)
|
|
72
|
+
iconRenderer.updateIcon(iconEl, isExpanded ? 'chevronDown' : 'chevronRight');
|
|
73
|
+
toggleBtn.setAttribute('aria-label', isExpanded ? 'Collapse' : 'Expand');
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=tree-cell-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-cell-renderer.js","sourceRoot":"","sources":["../../src/renderer/tree-cell-renderer.ts"],"names":[],"mappings":"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"}
|