@deephaven/iris-grid 1.8.1-beta.8 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/IrisGrid.d.ts +19 -0
  2. package/dist/IrisGrid.d.ts.map +1 -1
  3. package/dist/IrisGrid.js +17 -9
  4. package/dist/IrisGrid.js.map +1 -1
  5. package/dist/IrisGridMetricCalculator.d.ts +34 -1
  6. package/dist/IrisGridMetricCalculator.d.ts.map +1 -1
  7. package/dist/IrisGridMetricCalculator.js +136 -1
  8. package/dist/IrisGridMetricCalculator.js.map +1 -1
  9. package/dist/LazyIrisGrid.d.ts +1 -0
  10. package/dist/LazyIrisGrid.d.ts.map +1 -1
  11. package/dist/TreeRebalanceUtil.d.ts +50 -0
  12. package/dist/TreeRebalanceUtil.d.ts.map +1 -0
  13. package/dist/TreeRebalanceUtil.js +105 -0
  14. package/dist/TreeRebalanceUtil.js.map +1 -0
  15. package/dist/sidebar/visibility-ordering-builder/SearchItem.d.ts +12 -0
  16. package/dist/sidebar/visibility-ordering-builder/SearchItem.d.ts.map +1 -0
  17. package/dist/sidebar/visibility-ordering-builder/SearchItem.js +55 -0
  18. package/dist/sidebar/visibility-ordering-builder/SearchItem.js.map +1 -0
  19. package/dist/sidebar/visibility-ordering-builder/SearchWithModal.css +408 -0
  20. package/dist/sidebar/visibility-ordering-builder/SearchWithModal.css.map +1 -0
  21. package/dist/sidebar/visibility-ordering-builder/SearchWithModal.d.ts +14 -0
  22. package/dist/sidebar/visibility-ordering-builder/SearchWithModal.d.ts.map +1 -0
  23. package/dist/sidebar/visibility-ordering-builder/SearchWithModal.js +235 -0
  24. package/dist/sidebar/visibility-ordering-builder/SearchWithModal.js.map +1 -0
  25. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.d.ts +43 -43
  26. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.d.ts.map +1 -1
  27. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js +427 -466
  28. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js.map +1 -1
  29. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.d.ts +7 -2
  30. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.d.ts.map +1 -1
  31. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js +7 -4
  32. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js.map +1 -1
  33. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.d.ts +7 -15
  34. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.d.ts.map +1 -1
  35. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js +53 -137
  36. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js.map +1 -1
  37. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeDndContext.d.ts +14 -0
  38. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeDndContext.d.ts.map +1 -0
  39. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeDndContext.js +245 -0
  40. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeDndContext.js.map +1 -0
  41. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.d.ts +4 -3
  42. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.d.ts.map +1 -1
  43. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js +2 -1
  44. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js.map +1 -1
  45. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css +45 -22
  46. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css.map +1 -1
  47. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.d.ts +13 -14
  48. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.d.ts.map +1 -1
  49. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js +9 -7
  50. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js.map +1 -1
  51. package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.d.ts +1 -1
  52. package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.d.ts.map +1 -1
  53. package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js +8 -7
  54. package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js.map +1 -1
  55. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.d.ts +4 -4
  56. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.d.ts.map +1 -1
  57. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js +5 -1
  58. package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js.map +1 -1
  59. package/package.json +20 -19
  60. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.d.ts +0 -21
  61. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.d.ts.map +0 -1
  62. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js +0 -149
  63. package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js.map +0 -1
@@ -1,10 +1,34 @@
1
- import { GridMetricCalculator, type GridMetrics, type GridMetricState, type ModelSizeMap } from '@deephaven/grid';
1
+ import { GridMetricCalculator, type GridMetrics, type GridMetricState, type ModelIndex, type ModelSizeMap } from '@deephaven/grid';
2
+ import type IrisGridModel from './IrisGridModel';
2
3
  import { type IrisGridStateOverride } from './CommonTypes';
4
+ import type ColumnHeaderGroup from './ColumnHeaderGroup';
3
5
  export type IrisGridMetricState = GridMetricState & IrisGridStateOverride;
4
6
  export declare class IrisGridMetricCalculator extends GridMetricCalculator {
5
7
  private userColumnWidthsByName;
6
8
  private cachedModelColumnNames;
9
+ private cachedHeaderGroupNames;
10
+ private cachedPaddingMaps;
11
+ static getModelColumnRoot(model: IrisGridModel, modelColumn: ModelIndex): ColumnHeaderGroup | undefined;
12
+ /**
13
+ * Builds a TreeNode from the model header groups and columns for padding calculation
14
+ * @param name The name of the root node to build the tree for
15
+ * @param model The IrisGridModel containing columns and header groups
16
+ * @param getLeafValue Function to get the value for leaf nodes (columns)
17
+ * @param getGroupValue Function to get the value for group nodes (header groups)
18
+ * @returns The TreeNode structure
19
+ */
20
+ private static buildNode;
21
+ /**
22
+ * Gets the header padding for a specific column based on the widths of its group tree nodes.
23
+ * We only adjust paddings on the column, because the group widths are automatically sized to fit their children.
24
+ * @param state The current IrisGridMetricState
25
+ * @param modelColumn The column index to get the padding for
26
+ * @param maxColumnWidth Maximum allowed column width, applies only to leaf nodes
27
+ * @returns The calculated header padding for the column
28
+ */
29
+ private getHeaderPadding;
7
30
  private getCachedCurrentModelColumnNames;
31
+ private getCachedCurrentHeaderGroupNames;
8
32
  private updateCalculatedColumnWidths;
9
33
  /**
10
34
  * Updates the user column widths based on the current model state
@@ -44,6 +68,15 @@ export declare class IrisGridMetricCalculator extends GridMetricCalculator {
44
68
  */
45
69
  getUserColumnWidths(): ModelSizeMap;
46
70
  getCalculatedColumnWidths(): ModelSizeMap;
71
+ /**
72
+ * Calculate the width of the specified column's header
73
+ * @param modelColumn ModelIndex of the column to get the header width for
74
+ * @param state The grid metric state
75
+ * @param maxColumnWidth Maximum allowed column width, applies only to leaf nodes
76
+ * @returns The calculated width of the column header
77
+ */
78
+ calculateColumnHeaderWidth(modelColumn: ModelIndex, state: IrisGridMetricState, maxColumnWidth: number): number;
79
+ getColumnHeaderGroupWidth(modelColumn: ModelIndex, depth: number, state: IrisGridMetricState, maxColumnWidth: number): number;
47
80
  }
48
81
  export default IrisGridMetricCalculator;
49
82
  //# sourceMappingURL=IrisGridMetricCalculator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IrisGridMetricCalculator.d.ts","sourceRoot":"","sources":["../src/IrisGridMetricCalculator.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EAEpB,KAAK,YAAY,EAElB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAAE,KAAK,qBAAqB,EAAmB,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG,qBAAqB,CAAC;AAE1E,qBAAa,wBAAyB,SAAQ,oBAAoB;IAEhE,OAAO,CAAC,sBAAsB,CAAsC;IAGpE,OAAO,CAAC,sBAAsB,CAAoC;IAElE,OAAO,CAAC,gCAAgC,CAEtC;IAEF,OAAO,CAAC,4BAA4B;IAmBpC;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;OAGG;IACH,OAAO,CAAC,6BAA6B;IAkBrC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM;IA2B5C;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,mBAAmB,GAAG,WAAW;IAQnD;;;;OAIG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAalD;;;OAGG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAYtC;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAK5B;;;OAGG;IACH,mBAAmB,IAAI,YAAY;IAKnC,yBAAyB,IAAI,YAAY;CAG1C;AAED,eAAe,wBAAwB,CAAC"}
1
+ {"version":3,"file":"IrisGridMetricCalculator.d.ts","sourceRoot":"","sources":["../src/IrisGridMetricCalculator.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,YAAY,EAGlB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,aAAa,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,KAAK,qBAAqB,EAAmB,MAAM,eAAe,CAAC;AAC5E,OAAO,KAAK,iBAAiB,MAAM,qBAAqB,CAAC;AAGzD,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG,qBAAqB,CAAC;AAE1E,qBAAa,wBAAyB,SAAQ,oBAAoB;IAEhE,OAAO,CAAC,sBAAsB,CAAsC;IAGpE,OAAO,CAAC,sBAAsB,CAAoC;IAElE,OAAO,CAAC,sBAAsB,CAAgC;IAG9D,OAAO,CAAC,iBAAiB,CAA+C;IAExE,MAAM,CAAC,kBAAkB,CACvB,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,UAAU,GACtB,iBAAiB,GAAG,SAAS;IAchC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAoCxB;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IA6CxB,OAAO,CAAC,gCAAgC,CAEtC;IAEF,OAAO,CAAC,gCAAgC,CAGtC;IAEF,OAAO,CAAC,4BAA4B;IAmBpC;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;OAGG;IACH,OAAO,CAAC,6BAA6B;IAiCrC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM;IA2B5C;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,mBAAmB,GAAG,WAAW;IAQnD;;;;OAIG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAalD;;;OAGG;IACH,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAYtC;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAK5B;;;OAGG;IACH,mBAAmB,IAAI,YAAY;IAKnC,yBAAyB,IAAI,YAAY;IAIzC;;;;;;OAMG;IACH,0BAA0B,CACxB,WAAW,EAAE,UAAU,EACvB,KAAK,EAAE,mBAAmB,EAC1B,cAAc,EAAE,MAAM,GACrB,MAAM;IA2BT,yBAAyB,CACvB,WAAW,EAAE,UAAU,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,mBAAmB,EAC1B,cAAc,EAAE,MAAM,GACrB,MAAM;CA+BV;AAED,eAAe,wBAAwB,CAAC"}
@@ -3,8 +3,9 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
3
3
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
4
4
  import deepEqual from 'fast-deep-equal';
5
5
  import memoizeOne from 'memoize-one';
6
- import { GridMetricCalculator, trimMap } from '@deephaven/grid';
6
+ import { GridMetricCalculator, trimMap, isExpandableColumnGridModel } from '@deephaven/grid';
7
7
  import { assertNotNull } from '@deephaven/utils';
8
+ import { rebalanceTree } from "./TreeRebalanceUtil.js";
8
9
  export class IrisGridMetricCalculator extends GridMetricCalculator {
9
10
  constructor() {
10
11
  super(...arguments);
@@ -12,7 +13,89 @@ export class IrisGridMetricCalculator extends GridMetricCalculator {
12
13
  _defineProperty(this, "userColumnWidthsByName", new Map());
13
14
  // Cached model column names to detect when the column width map update is necessary
14
15
  _defineProperty(this, "cachedModelColumnNames", void 0);
16
+ _defineProperty(this, "cachedHeaderGroupNames", void 0);
17
+ // Cached padding maps for column header groups
18
+ _defineProperty(this, "cachedPaddingMaps", new Map());
15
19
  _defineProperty(this, "getCachedCurrentModelColumnNames", memoizeOne(columns => columns.map(col => col.name)));
20
+ _defineProperty(this, "getCachedCurrentHeaderGroupNames", memoizeOne(columnHeaderGroups => columnHeaderGroups.map(group => group.name)));
21
+ }
22
+ static getModelColumnRoot(model, modelColumn) {
23
+ var depth = 0;
24
+ var current = model.getColumnHeaderParentGroup(modelColumn, depth);
25
+ var root = current;
26
+ while (current != null) {
27
+ root = current;
28
+ depth += 1;
29
+ current = model.getColumnHeaderParentGroup(modelColumn, depth);
30
+ }
31
+ return root;
32
+ }
33
+
34
+ /**
35
+ * Builds a TreeNode from the model header groups and columns for padding calculation
36
+ * @param name The name of the root node to build the tree for
37
+ * @param model The IrisGridModel containing columns and header groups
38
+ * @param getLeafValue Function to get the value for leaf nodes (columns)
39
+ * @param getGroupValue Function to get the value for group nodes (header groups)
40
+ * @returns The TreeNode structure
41
+ */
42
+ static buildNode(name, model, getLeafValue, getGroupValue) {
43
+ var _getLeafValue;
44
+ var headerGroup = model.columnHeaderGroupMap.get(name);
45
+ if (headerGroup) {
46
+ var value = getGroupValue(name);
47
+ var children = headerGroup.children.map(childName => IrisGridMetricCalculator.buildNode(childName, model, getLeafValue, getGroupValue));
48
+
49
+ // Group node
50
+ return {
51
+ name,
52
+ children,
53
+ value
54
+ };
55
+ }
56
+
57
+ // Leaf node
58
+ return {
59
+ name,
60
+ children: [],
61
+ value: (_getLeafValue = getLeafValue(name)) !== null && _getLeafValue !== void 0 ? _getLeafValue : 0
62
+ };
63
+ }
64
+
65
+ /**
66
+ * Gets the header padding for a specific column based on the widths of its group tree nodes.
67
+ * We only adjust paddings on the column, because the group widths are automatically sized to fit their children.
68
+ * @param state The current IrisGridMetricState
69
+ * @param modelColumn The column index to get the padding for
70
+ * @param maxColumnWidth Maximum allowed column width, applies only to leaf nodes
71
+ * @returns The calculated header padding for the column
72
+ */
73
+ getHeaderPadding(state, modelColumn, maxColumnWidth) {
74
+ var _paddingMap$get;
75
+ var {
76
+ model
77
+ } = state;
78
+ var root = IrisGridMetricCalculator.getModelColumnRoot(model, modelColumn);
79
+ if (root == null) {
80
+ return 0;
81
+ }
82
+ var cachedMap = this.cachedPaddingMaps.get(root.name);
83
+ if (cachedMap != null) {
84
+ var _cachedMap$get;
85
+ return (_cachedMap$get = cachedMap.get(model.columns[modelColumn].name)) !== null && _cachedMap$get !== void 0 ? _cachedMap$get : 0;
86
+ }
87
+ var groupTree = IrisGridMetricCalculator.buildNode(root.name, model, name => {
88
+ var columnIndex = model.getColumnIndexByName(name);
89
+ assertNotNull(columnIndex, "".concat(name, " not found in model columns"));
90
+ return super.calculateColumnHeaderWidth(columnIndex, state, maxColumnWidth);
91
+ }, name => {
92
+ var group = model.columnHeaderGroupMap.get(name);
93
+ assertNotNull(group, "".concat(name, " not found in columnHeaderGroupMap"));
94
+ return this.getColumnHeaderGroupWidth(group.childIndexes[0], group.depth, state, maxColumnWidth);
95
+ });
96
+ var paddingMap = rebalanceTree(groupTree);
97
+ this.cachedPaddingMaps.set(root.name, paddingMap);
98
+ return (_paddingMap$get = paddingMap.get(model.columns[modelColumn].name)) !== null && _paddingMap$get !== void 0 ? _paddingMap$get : 0;
16
99
  }
17
100
  updateCalculatedColumnWidths(model) {
18
101
  assertNotNull(this.cachedModelColumnNames);
@@ -59,8 +142,14 @@ export class IrisGridMetricCalculator extends GridMetricCalculator {
59
142
  // Preserve column widths when possible to minimize visual shifts in the grid layout
60
143
  this.updateCalculatedColumnWidths(model);
61
144
  this.updateUserColumnWidths(model);
145
+ this.cachedPaddingMaps.clear();
62
146
  }
63
147
  this.cachedModelColumnNames = modelColumnNames;
148
+ if (this.cachedHeaderGroupNames != null && !deepEqual(this.getCachedCurrentHeaderGroupNames(model.columnHeaderGroups), this.cachedHeaderGroupNames)) {
149
+ this.resetCalculatedColumnWidths();
150
+ this.cachedPaddingMaps.clear();
151
+ }
152
+ this.cachedHeaderGroupNames = model.columnHeaderGroups.map(group => group.name);
64
153
  }
65
154
  getGridY(state) {
66
155
  // The state here seems to be a GridMetricState with stateOverrides passed from IrisGrid in the props,
@@ -146,6 +235,52 @@ export class IrisGridMetricCalculator extends GridMetricCalculator {
146
235
  getCalculatedColumnWidths() {
147
236
  return this.calculatedColumnWidths;
148
237
  }
238
+
239
+ /**
240
+ * Calculate the width of the specified column's header
241
+ * @param modelColumn ModelIndex of the column to get the header width for
242
+ * @param state The grid metric state
243
+ * @param maxColumnWidth Maximum allowed column width, applies only to leaf nodes
244
+ * @returns The calculated width of the column header
245
+ */
246
+ calculateColumnHeaderWidth(modelColumn, state, maxColumnWidth) {
247
+ var {
248
+ model
249
+ } = state;
250
+ var parent = model.getColumnHeaderParentGroup(modelColumn, 0);
251
+ var baseHeaderWidth = super.calculateColumnHeaderWidth(modelColumn, state, maxColumnWidth);
252
+
253
+ // Column header with no grouping, use base implementation
254
+ if (parent == null) {
255
+ return baseHeaderWidth;
256
+ }
257
+ var headerPadding = this.getHeaderPadding(state, modelColumn, maxColumnWidth);
258
+ return baseHeaderWidth + headerPadding;
259
+ }
260
+
261
+ // Original width of column header group content, including title, padding, icons, etc.
262
+ // Does not include any rebalancing adjustments
263
+ getColumnHeaderGroupWidth(modelColumn, depth, state, maxColumnWidth) {
264
+ var {
265
+ model,
266
+ theme,
267
+ context
268
+ } = state;
269
+ var {
270
+ headerHorizontalPadding,
271
+ headerFont
272
+ } = theme;
273
+ this.calculateLowerFontWidth(headerFont, context);
274
+ this.calculateUpperFontWidth(headerFont, context);
275
+ var padding = headerHorizontalPadding * 2;
276
+ var headerText = model.textForColumnHeader(modelColumn, depth);
277
+ var isColumnExpandable = isExpandableColumnGridModel(model) && model.isColumnExpandable(modelColumn);
278
+ var expandCollapseIconWidth = isColumnExpandable ? theme.iconSize : 0;
279
+ if (headerText !== undefined && headerText !== '') {
280
+ return this.calculateTextWidth(context, headerFont, headerText, maxColumnWidth - padding) + padding + expandCollapseIconWidth;
281
+ }
282
+ return padding + expandCollapseIconWidth;
283
+ }
149
284
  }
150
285
  export default IrisGridMetricCalculator;
151
286
  //# sourceMappingURL=IrisGridMetricCalculator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IrisGridMetricCalculator.js","names":["deepEqual","memoizeOne","GridMetricCalculator","trimMap","assertNotNull","IrisGridMetricCalculator","constructor","arguments","_defineProperty","Map","columns","map","col","name","updateCalculatedColumnWidths","model","cachedModelColumnNames","calculatedColumnWidthsByName","forEach","index","prevColumnWidth","calculatedColumnWidths","get","set","resetCalculatedColumnWidths","width","getColumnIndexByName","updateUserColumnWidths","userColumnWidths","userColumnWidthsByName","modelIndex","setColumnWidth","updateColumnWidthsIfNecessary","modelColumnNames","getCachedCurrentModelColumnNames","getGridY","state","gridY","isFilterBarShown","theme","advancedFilters","quickFilters","sorts","reverse","filterBarHeight","size","filterBarCollapsedHeight","length","reverseHeaderBarHeight","getMetrics","column","resetColumnWidth","delete","resetAllColumnWidths","getUserColumnWidths","getCalculatedColumnWidths"],"sources":["../src/IrisGridMetricCalculator.ts"],"sourcesContent":["import deepEqual from 'fast-deep-equal';\nimport memoizeOne from 'memoize-one';\nimport {\n GridMetricCalculator,\n type GridMetrics,\n type GridMetricState,\n type ModelIndex,\n type ModelSizeMap,\n trimMap,\n} from '@deephaven/grid';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { assertNotNull } from '@deephaven/utils';\nimport type IrisGridModel from './IrisGridModel';\nimport { type IrisGridStateOverride, type ColumnName } from './CommonTypes';\n\nexport type IrisGridMetricState = GridMetricState & IrisGridStateOverride;\n\nexport class IrisGridMetricCalculator extends GridMetricCalculator {\n // Column widths by name to keep track of columns going in and out of viewport\n private userColumnWidthsByName: Map<ColumnName, number> = new Map();\n\n // Cached model column names to detect when the column width map update is necessary\n private cachedModelColumnNames: readonly ColumnName[] | undefined;\n\n private getCachedCurrentModelColumnNames = memoizeOne(\n (columns: readonly dh.Column[]) => columns.map(col => col.name)\n );\n\n private updateCalculatedColumnWidths(model: IrisGridModel): void {\n assertNotNull(this.cachedModelColumnNames);\n const calculatedColumnWidthsByName = new Map<ColumnName, number>();\n this.cachedModelColumnNames.forEach((name, index) => {\n const prevColumnWidth = this.calculatedColumnWidths.get(index);\n if (prevColumnWidth != null) {\n calculatedColumnWidthsByName.set(name, prevColumnWidth);\n }\n });\n this.resetCalculatedColumnWidths();\n calculatedColumnWidthsByName.forEach((width, name) => {\n const index = model.getColumnIndexByName(name);\n if (index != null) {\n this.calculatedColumnWidths.set(index, width);\n }\n });\n trimMap(this.calculatedColumnWidths);\n }\n\n /**\n * Updates the user column widths based on the current model state\n * @param model The current IrisGridModel\n */\n private updateUserColumnWidths(model: IrisGridModel): void {\n this.userColumnWidths = new Map<ModelIndex, number>();\n this.userColumnWidthsByName.forEach((width, name) => {\n const modelIndex = model.getColumnIndexByName(name);\n if (modelIndex != null) {\n super.setColumnWidth(modelIndex, width);\n }\n });\n }\n\n /**\n * Updates the user and calculated column widths if the model columns have changed\n * @param model The current IrisGridModel\n */\n private updateColumnWidthsIfNecessary(model: IrisGridModel): void {\n // Comparing model.columns references wouldn't work here because\n // the reference can change in the model without the actual column definitions changing\n const modelColumnNames = this.getCachedCurrentModelColumnNames(\n model.columns\n );\n if (\n this.cachedModelColumnNames != null &&\n this.cachedModelColumnNames !== modelColumnNames &&\n !deepEqual(modelColumnNames, this.cachedModelColumnNames)\n ) {\n // Preserve column widths when possible to minimize visual shifts in the grid layout\n this.updateCalculatedColumnWidths(model);\n this.updateUserColumnWidths(model);\n }\n this.cachedModelColumnNames = modelColumnNames;\n }\n\n getGridY(state: IrisGridMetricState): number {\n // The state here seems to be a GridMetricState with stateOverrides passed from IrisGrid in the props,\n // not guaranteed to be IrisGridMetricState\n let gridY = super.getGridY(state);\n const {\n isFilterBarShown,\n theme,\n advancedFilters,\n quickFilters,\n sorts,\n reverse,\n } = state;\n if (isFilterBarShown) {\n gridY += theme.filterBarHeight;\n } else if (\n (quickFilters != null && quickFilters.size > 0) ||\n (advancedFilters != null && advancedFilters.size > 0)\n ) {\n gridY += theme.filterBarCollapsedHeight;\n }\n if (reverse && sorts != null && sorts.length > 0) {\n gridY += theme.reverseHeaderBarHeight;\n }\n\n return gridY;\n }\n\n /**\n * Gets the metrics for the current state. This method has to be called before setColumnSize or resetColumnSize.\n * @param state The current IrisGridMetricState\n * @returns The metrics for the current state\n */\n getMetrics(state: IrisGridMetricState): GridMetrics {\n const { model } = state;\n // Update column widths if columns in the cached model don't match the current model passed in the state\n this.updateColumnWidthsIfNecessary(model);\n\n return super.getMetrics(state);\n }\n\n /**\n * Sets the width for a specific column by index\n * @param column The index of the column to set\n * @param size The new width for the column\n */\n setColumnWidth(column: number, size: number): void {\n super.setColumnWidth(column, size);\n assertNotNull(\n this.cachedModelColumnNames,\n 'setColumnWidth should be called after getMetrics'\n );\n const name = this.cachedModelColumnNames[column];\n if (name != null) {\n this.userColumnWidthsByName.set(name, size);\n trimMap(this.userColumnWidthsByName);\n }\n }\n\n /**\n * Resets the width for a specific column by index\n * @param column The index of the column to reset\n */\n resetColumnWidth(column: number): void {\n super.resetColumnWidth(column);\n assertNotNull(\n this.cachedModelColumnNames,\n 'resetColumnWidth should be called after getMetrics'\n );\n const name = this.cachedModelColumnNames[column];\n if (name != null) {\n this.userColumnWidthsByName.delete(name);\n }\n }\n\n /**\n * Resets all user column widths\n */\n resetAllColumnWidths(): void {\n this.userColumnWidths = new Map<ModelIndex, number>();\n this.userColumnWidthsByName = new Map<ColumnName, number>();\n }\n\n /**\n * Gets the user column widths\n * @returns A map of user column widths\n */\n getUserColumnWidths(): ModelSizeMap {\n // This might return stale data if getMetrics hasn't been called\n return this.userColumnWidths;\n }\n\n getCalculatedColumnWidths(): ModelSizeMap {\n return this.calculatedColumnWidths;\n }\n}\n\nexport default IrisGridMetricCalculator;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"IrisGridMetricCalculator.js","names":["deepEqual","memoizeOne","GridMetricCalculator","trimMap","isExpandableColumnGridModel","assertNotNull","rebalanceTree","IrisGridMetricCalculator","constructor","arguments","_defineProperty","Map","columns","map","col","name","columnHeaderGroups","group","getModelColumnRoot","model","modelColumn","depth","current","getColumnHeaderParentGroup","root","buildNode","getLeafValue","getGroupValue","_getLeafValue","headerGroup","columnHeaderGroupMap","get","value","children","childName","getHeaderPadding","state","maxColumnWidth","_paddingMap$get","cachedMap","cachedPaddingMaps","_cachedMap$get","groupTree","columnIndex","getColumnIndexByName","concat","calculateColumnHeaderWidth","getColumnHeaderGroupWidth","childIndexes","paddingMap","set","updateCalculatedColumnWidths","cachedModelColumnNames","calculatedColumnWidthsByName","forEach","index","prevColumnWidth","calculatedColumnWidths","resetCalculatedColumnWidths","width","updateUserColumnWidths","userColumnWidths","userColumnWidthsByName","modelIndex","setColumnWidth","updateColumnWidthsIfNecessary","modelColumnNames","getCachedCurrentModelColumnNames","clear","cachedHeaderGroupNames","getCachedCurrentHeaderGroupNames","getGridY","gridY","isFilterBarShown","theme","advancedFilters","quickFilters","sorts","reverse","filterBarHeight","size","filterBarCollapsedHeight","length","reverseHeaderBarHeight","getMetrics","column","resetColumnWidth","delete","resetAllColumnWidths","getUserColumnWidths","getCalculatedColumnWidths","parent","baseHeaderWidth","headerPadding","context","headerHorizontalPadding","headerFont","calculateLowerFontWidth","calculateUpperFontWidth","padding","headerText","textForColumnHeader","isColumnExpandable","expandCollapseIconWidth","iconSize","undefined","calculateTextWidth"],"sources":["../src/IrisGridMetricCalculator.ts"],"sourcesContent":["import deepEqual from 'fast-deep-equal';\nimport memoizeOne from 'memoize-one';\nimport {\n GridMetricCalculator,\n type GridMetrics,\n type GridMetricState,\n type ModelIndex,\n type ModelSizeMap,\n trimMap,\n isExpandableColumnGridModel,\n} from '@deephaven/grid';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { assertNotNull } from '@deephaven/utils';\nimport type IrisGridModel from './IrisGridModel';\nimport { type IrisGridStateOverride, type ColumnName } from './CommonTypes';\nimport type ColumnHeaderGroup from './ColumnHeaderGroup';\nimport { rebalanceTree, type TreeNode } from './TreeRebalanceUtil';\n\nexport type IrisGridMetricState = GridMetricState & IrisGridStateOverride;\n\nexport class IrisGridMetricCalculator extends GridMetricCalculator {\n // Column widths by name to keep track of columns going in and out of viewport\n private userColumnWidthsByName: Map<ColumnName, number> = new Map();\n\n // Cached model column names to detect when the column width map update is necessary\n private cachedModelColumnNames: readonly ColumnName[] | undefined;\n\n private cachedHeaderGroupNames: readonly string[] | undefined;\n\n // Cached padding maps for column header groups\n private cachedPaddingMaps: Map<string, Map<string, number>> = new Map();\n\n static getModelColumnRoot(\n model: IrisGridModel,\n modelColumn: ModelIndex\n ): ColumnHeaderGroup | undefined {\n let depth = 0;\n let current = model.getColumnHeaderParentGroup(modelColumn, depth);\n let root = current;\n\n while (current != null) {\n root = current;\n depth += 1;\n current = model.getColumnHeaderParentGroup(modelColumn, depth);\n }\n\n return root;\n }\n\n /**\n * Builds a TreeNode from the model header groups and columns for padding calculation\n * @param name The name of the root node to build the tree for\n * @param model The IrisGridModel containing columns and header groups\n * @param getLeafValue Function to get the value for leaf nodes (columns)\n * @param getGroupValue Function to get the value for group nodes (header groups)\n * @returns The TreeNode structure\n */\n private static buildNode(\n name: string,\n model: IrisGridModel,\n getLeafValue: (name: string) => number,\n getGroupValue: (name: string) => number\n ): TreeNode {\n const headerGroup = model.columnHeaderGroupMap.get(name);\n\n if (headerGroup) {\n const value = getGroupValue(name);\n\n const children = headerGroup.children.map(childName =>\n IrisGridMetricCalculator.buildNode(\n childName,\n model,\n getLeafValue,\n getGroupValue\n )\n );\n\n // Group node\n return {\n name,\n children,\n value,\n };\n }\n\n // Leaf node\n return {\n name,\n children: [],\n value: getLeafValue(name) ?? 0,\n };\n }\n\n /**\n * Gets the header padding for a specific column based on the widths of its group tree nodes.\n * We only adjust paddings on the column, because the group widths are automatically sized to fit their children.\n * @param state The current IrisGridMetricState\n * @param modelColumn The column index to get the padding for\n * @param maxColumnWidth Maximum allowed column width, applies only to leaf nodes\n * @returns The calculated header padding for the column\n */\n private getHeaderPadding(\n state: IrisGridMetricState,\n modelColumn: ModelIndex,\n maxColumnWidth: number\n ): number {\n const { model } = state;\n const root = IrisGridMetricCalculator.getModelColumnRoot(\n model,\n modelColumn\n );\n if (root == null) {\n return 0;\n }\n const cachedMap = this.cachedPaddingMaps.get(root.name);\n if (cachedMap != null) {\n return cachedMap.get(model.columns[modelColumn].name) ?? 0;\n }\n const groupTree = IrisGridMetricCalculator.buildNode(\n root.name,\n model,\n name => {\n const columnIndex = model.getColumnIndexByName(name);\n assertNotNull(columnIndex, `${name} not found in model columns`);\n return super.calculateColumnHeaderWidth(\n columnIndex,\n state,\n maxColumnWidth\n );\n },\n name => {\n const group = model.columnHeaderGroupMap.get(name);\n assertNotNull(group, `${name} not found in columnHeaderGroupMap`);\n return this.getColumnHeaderGroupWidth(\n group.childIndexes[0],\n group.depth,\n state,\n maxColumnWidth\n );\n }\n );\n const paddingMap = rebalanceTree(groupTree);\n this.cachedPaddingMaps.set(root.name, paddingMap);\n return paddingMap.get(model.columns[modelColumn].name) ?? 0;\n }\n\n private getCachedCurrentModelColumnNames = memoizeOne(\n (columns: readonly dh.Column[]) => columns.map(col => col.name)\n );\n\n private getCachedCurrentHeaderGroupNames = memoizeOne(\n (columnHeaderGroups: readonly ColumnHeaderGroup[]) =>\n columnHeaderGroups.map(group => group.name)\n );\n\n private updateCalculatedColumnWidths(model: IrisGridModel): void {\n assertNotNull(this.cachedModelColumnNames);\n const calculatedColumnWidthsByName = new Map<ColumnName, number>();\n this.cachedModelColumnNames.forEach((name, index) => {\n const prevColumnWidth = this.calculatedColumnWidths.get(index);\n if (prevColumnWidth != null) {\n calculatedColumnWidthsByName.set(name, prevColumnWidth);\n }\n });\n this.resetCalculatedColumnWidths();\n calculatedColumnWidthsByName.forEach((width, name) => {\n const index = model.getColumnIndexByName(name);\n if (index != null) {\n this.calculatedColumnWidths.set(index, width);\n }\n });\n trimMap(this.calculatedColumnWidths);\n }\n\n /**\n * Updates the user column widths based on the current model state\n * @param model The current IrisGridModel\n */\n private updateUserColumnWidths(model: IrisGridModel): void {\n this.userColumnWidths = new Map<ModelIndex, number>();\n this.userColumnWidthsByName.forEach((width, name) => {\n const modelIndex = model.getColumnIndexByName(name);\n if (modelIndex != null) {\n super.setColumnWidth(modelIndex, width);\n }\n });\n }\n\n /**\n * Updates the user and calculated column widths if the model columns have changed\n * @param model The current IrisGridModel\n */\n private updateColumnWidthsIfNecessary(model: IrisGridModel): void {\n // Comparing model.columns references wouldn't work here because\n // the reference can change in the model without the actual column definitions changing\n const modelColumnNames = this.getCachedCurrentModelColumnNames(\n model.columns\n );\n if (\n this.cachedModelColumnNames != null &&\n this.cachedModelColumnNames !== modelColumnNames &&\n !deepEqual(modelColumnNames, this.cachedModelColumnNames)\n ) {\n // Preserve column widths when possible to minimize visual shifts in the grid layout\n this.updateCalculatedColumnWidths(model);\n this.updateUserColumnWidths(model);\n this.cachedPaddingMaps.clear();\n }\n this.cachedModelColumnNames = modelColumnNames;\n\n if (\n this.cachedHeaderGroupNames != null &&\n !deepEqual(\n this.getCachedCurrentHeaderGroupNames(model.columnHeaderGroups),\n this.cachedHeaderGroupNames\n )\n ) {\n this.resetCalculatedColumnWidths();\n this.cachedPaddingMaps.clear();\n }\n this.cachedHeaderGroupNames = model.columnHeaderGroups.map(\n group => group.name\n );\n }\n\n getGridY(state: IrisGridMetricState): number {\n // The state here seems to be a GridMetricState with stateOverrides passed from IrisGrid in the props,\n // not guaranteed to be IrisGridMetricState\n let gridY = super.getGridY(state);\n const {\n isFilterBarShown,\n theme,\n advancedFilters,\n quickFilters,\n sorts,\n reverse,\n } = state;\n if (isFilterBarShown) {\n gridY += theme.filterBarHeight;\n } else if (\n (quickFilters != null && quickFilters.size > 0) ||\n (advancedFilters != null && advancedFilters.size > 0)\n ) {\n gridY += theme.filterBarCollapsedHeight;\n }\n if (reverse && sorts != null && sorts.length > 0) {\n gridY += theme.reverseHeaderBarHeight;\n }\n\n return gridY;\n }\n\n /**\n * Gets the metrics for the current state. This method has to be called before setColumnSize or resetColumnSize.\n * @param state The current IrisGridMetricState\n * @returns The metrics for the current state\n */\n getMetrics(state: IrisGridMetricState): GridMetrics {\n const { model } = state;\n // Update column widths if columns in the cached model don't match the current model passed in the state\n this.updateColumnWidthsIfNecessary(model);\n\n return super.getMetrics(state);\n }\n\n /**\n * Sets the width for a specific column by index\n * @param column The index of the column to set\n * @param size The new width for the column\n */\n setColumnWidth(column: number, size: number): void {\n super.setColumnWidth(column, size);\n assertNotNull(\n this.cachedModelColumnNames,\n 'setColumnWidth should be called after getMetrics'\n );\n const name = this.cachedModelColumnNames[column];\n if (name != null) {\n this.userColumnWidthsByName.set(name, size);\n trimMap(this.userColumnWidthsByName);\n }\n }\n\n /**\n * Resets the width for a specific column by index\n * @param column The index of the column to reset\n */\n resetColumnWidth(column: number): void {\n super.resetColumnWidth(column);\n assertNotNull(\n this.cachedModelColumnNames,\n 'resetColumnWidth should be called after getMetrics'\n );\n const name = this.cachedModelColumnNames[column];\n if (name != null) {\n this.userColumnWidthsByName.delete(name);\n }\n }\n\n /**\n * Resets all user column widths\n */\n resetAllColumnWidths(): void {\n this.userColumnWidths = new Map<ModelIndex, number>();\n this.userColumnWidthsByName = new Map<ColumnName, number>();\n }\n\n /**\n * Gets the user column widths\n * @returns A map of user column widths\n */\n getUserColumnWidths(): ModelSizeMap {\n // This might return stale data if getMetrics hasn't been called\n return this.userColumnWidths;\n }\n\n getCalculatedColumnWidths(): ModelSizeMap {\n return this.calculatedColumnWidths;\n }\n\n /**\n * Calculate the width of the specified column's header\n * @param modelColumn ModelIndex of the column to get the header width for\n * @param state The grid metric state\n * @param maxColumnWidth Maximum allowed column width, applies only to leaf nodes\n * @returns The calculated width of the column header\n */\n calculateColumnHeaderWidth(\n modelColumn: ModelIndex,\n state: IrisGridMetricState,\n maxColumnWidth: number\n ): number {\n const { model } = state;\n\n const parent = model.getColumnHeaderParentGroup(modelColumn, 0);\n\n const baseHeaderWidth = super.calculateColumnHeaderWidth(\n modelColumn,\n state,\n maxColumnWidth\n );\n\n // Column header with no grouping, use base implementation\n if (parent == null) {\n return baseHeaderWidth;\n }\n\n const headerPadding = this.getHeaderPadding(\n state,\n modelColumn,\n maxColumnWidth\n );\n\n return baseHeaderWidth + headerPadding;\n }\n\n // Original width of column header group content, including title, padding, icons, etc.\n // Does not include any rebalancing adjustments\n getColumnHeaderGroupWidth(\n modelColumn: ModelIndex,\n depth: number,\n state: IrisGridMetricState,\n maxColumnWidth: number\n ): number {\n const { model, theme, context } = state;\n const { headerHorizontalPadding, headerFont } = theme;\n this.calculateLowerFontWidth(headerFont, context);\n this.calculateUpperFontWidth(headerFont, context);\n\n const padding = headerHorizontalPadding * 2;\n\n const headerText = model.textForColumnHeader(modelColumn, depth);\n\n const isColumnExpandable =\n isExpandableColumnGridModel(model) &&\n model.isColumnExpandable(modelColumn);\n\n const expandCollapseIconWidth = isColumnExpandable ? theme.iconSize : 0;\n\n if (headerText !== undefined && headerText !== '') {\n return (\n this.calculateTextWidth(\n context,\n headerFont,\n headerText,\n maxColumnWidth - padding\n ) +\n padding +\n expandCollapseIconWidth\n );\n }\n\n return padding + expandCollapseIconWidth;\n }\n}\n\nexport default IrisGridMetricCalculator;\n"],"mappings":"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","ignoreList":[]}
@@ -54,6 +54,7 @@ declare const LazyIrisGrid: import("react").ForwardRefExoticComponent<Pick<IrisG
54
54
  keyHandlers?: readonly import("@deephaven/grid").KeyHandler[] | undefined;
55
55
  mouseHandlers?: import("./IrisGrid").MouseHandlersProp | undefined;
56
56
  density?: ("compact" | "regular" | "spacious") | undefined;
57
+ getMetricCalculator?: import("./IrisGrid").GetMetricCalculatorType | undefined;
57
58
  } & {} & import("react").RefAttributes<IrisGridType>>;
58
59
  export default LazyIrisGrid;
59
60
  //# sourceMappingURL=LazyIrisGrid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LazyIrisGrid.d.ts","sourceRoot":"","sources":["../src/LazyIrisGrid.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,YAAY,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qDAgBjB,CAAC;AAIF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"LazyIrisGrid.d.ts","sourceRoot":"","sources":["../src/LazyIrisGrid.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,YAAY,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qDAgBjB,CAAC;AAIF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Interface for tree nodes used in rebalancing
3
+ */
4
+ export interface TreeNode {
5
+ name: string;
6
+ children: TreeNode[];
7
+ value: number;
8
+ }
9
+ /**
10
+ * Helper function to rebalance a tree according to the following rules:
11
+ * - Each node value must equal the sum of its immediate children with adjustments
12
+ * - Can only add to nodes, no subtraction
13
+ * - Excess value from parents is distributed evenly among all children
14
+ * - Minimize the sum of all leaf nodes
15
+ *
16
+ * The function does not mutate the tree. Instead, it returns an adjustments map
17
+ * indicating how much to add to each node to achieve the balanced state.
18
+ *
19
+ * @example
20
+ * Tree structure:
21
+ * root(20)
22
+ * / \
23
+ * a(4) b(6)
24
+ * / \ / \
25
+ * c(5) d(1) e(2) f(3)
26
+ *
27
+ * After rebalancing, the adjusted values would be:
28
+ * root(20)
29
+ * / \
30
+ * a(10) b(10)
31
+ * / \ / \
32
+ * c(7) d(3) e(4.5) f(5.5)
33
+ *
34
+ * The resulting adjustments map:
35
+ * {
36
+ * "root": 0,
37
+ * "a": 6,
38
+ * "b": 4,
39
+ * "c": 2,
40
+ * "d": 2,
41
+ * "e": 2.5,
42
+ * "f": 2.5
43
+ * }
44
+ *
45
+ * @param node The root of the tree to rebalance
46
+ * @returns A map of node names to adjustment values
47
+ */
48
+ export declare function rebalanceTree(node: TreeNode): Map<string, number>;
49
+ export default rebalanceTree;
50
+ //# sourceMappingURL=TreeRebalanceUtil.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeRebalanceUtil.d.ts","sourceRoot":"","sources":["../src/TreeRebalanceUtil.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAIjE;AAwED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Interface for tree nodes used in rebalancing
3
+ */
4
+
5
+ /**
6
+ * Helper function to rebalance a tree according to the following rules:
7
+ * - Each node value must equal the sum of its immediate children with adjustments
8
+ * - Can only add to nodes, no subtraction
9
+ * - Excess value from parents is distributed evenly among all children
10
+ * - Minimize the sum of all leaf nodes
11
+ *
12
+ * The function does not mutate the tree. Instead, it returns an adjustments map
13
+ * indicating how much to add to each node to achieve the balanced state.
14
+ *
15
+ * @example
16
+ * Tree structure:
17
+ * root(20)
18
+ * / \
19
+ * a(4) b(6)
20
+ * / \ / \
21
+ * c(5) d(1) e(2) f(3)
22
+ *
23
+ * After rebalancing, the adjusted values would be:
24
+ * root(20)
25
+ * / \
26
+ * a(10) b(10)
27
+ * / \ / \
28
+ * c(7) d(3) e(4.5) f(5.5)
29
+ *
30
+ * The resulting adjustments map:
31
+ * {
32
+ * "root": 0,
33
+ * "a": 6,
34
+ * "b": 4,
35
+ * "c": 2,
36
+ * "d": 2,
37
+ * "e": 2.5,
38
+ * "f": 2.5
39
+ * }
40
+ *
41
+ * @param node The root of the tree to rebalance
42
+ * @returns A map of node names to adjustment values
43
+ */
44
+ export function rebalanceTree(node) {
45
+ var adjustments = new Map();
46
+ processNode(node, adjustments);
47
+ return adjustments;
48
+ }
49
+ function isLeaf(node) {
50
+ return node.children.length === 0;
51
+ }
52
+
53
+ /**
54
+ * Add a value to a subtree, distributing it evenly among all nodes
55
+ * @param node Current node to process
56
+ * @param amount Amount to add to this subtree
57
+ * @param adjustments Mutable map to store adjustments
58
+ */
59
+ function addToSubtree(node, amount, adjustments) {
60
+ var _adjustments$get;
61
+ // Add the amount to this node's adjustment
62
+ var prevAdjustment = (_adjustments$get = adjustments.get(node.name)) !== null && _adjustments$get !== void 0 ? _adjustments$get : 0;
63
+ adjustments.set(node.name, prevAdjustment + amount);
64
+ if (!isLeaf(node)) {
65
+ // Distribute the addition evenly among children
66
+ var additionPerChild = amount / node.children.length;
67
+ node.children.forEach(child => addToSubtree(child, additionPerChild, adjustments));
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Calculate adjustments map for a subtree
73
+ * @param node Node to process
74
+ * @param adjustments Mutable map to store adjustments
75
+ * @returns The adjusted value for the current node
76
+ */
77
+ function processNode(node, adjustments) {
78
+ if (isLeaf(node)) {
79
+ return node.value;
80
+ }
81
+
82
+ // Recursively process children first and get their adjusted values
83
+ var childrenAdjustedValues = node.children.map(child => processNode(child, adjustments));
84
+
85
+ // Calculate the adjusted sum of children
86
+ var adjustedChildrenSum = childrenAdjustedValues.reduce((sum, value) => sum + value, 0);
87
+
88
+ // Ensure this node's value is at least the sum of children
89
+ if (node.value <= adjustedChildrenSum) {
90
+ var _adjustments$get2;
91
+ var adjustment = adjustedChildrenSum - node.value;
92
+ var prevAdjustment = (_adjustments$get2 = adjustments.get(node.name)) !== null && _adjustments$get2 !== void 0 ? _adjustments$get2 : 0;
93
+ adjustments.set(node.name, prevAdjustment + adjustment);
94
+ return adjustedChildrenSum;
95
+ }
96
+
97
+ // Node value exceeds children sum, distribute the excess evenly among all children
98
+ var additionPerChild = (node.value - adjustedChildrenSum) / node.children.length;
99
+ node.children.forEach(child => {
100
+ addToSubtree(child, additionPerChild, adjustments);
101
+ });
102
+ return node.value;
103
+ }
104
+ export default rebalanceTree;
105
+ //# sourceMappingURL=TreeRebalanceUtil.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TreeRebalanceUtil.js","names":["rebalanceTree","node","adjustments","Map","processNode","isLeaf","children","length","addToSubtree","amount","_adjustments$get","prevAdjustment","get","name","set","additionPerChild","forEach","child","value","childrenAdjustedValues","map","adjustedChildrenSum","reduce","sum","_adjustments$get2","adjustment"],"sources":["../src/TreeRebalanceUtil.ts"],"sourcesContent":["/**\n * Interface for tree nodes used in rebalancing\n */\nexport interface TreeNode {\n name: string;\n children: TreeNode[];\n value: number;\n}\n\n/**\n * Helper function to rebalance a tree according to the following rules:\n * - Each node value must equal the sum of its immediate children with adjustments\n * - Can only add to nodes, no subtraction\n * - Excess value from parents is distributed evenly among all children\n * - Minimize the sum of all leaf nodes\n *\n * The function does not mutate the tree. Instead, it returns an adjustments map\n * indicating how much to add to each node to achieve the balanced state.\n *\n * @example\n * Tree structure:\n * root(20)\n * / \\\n * a(4) b(6)\n * / \\ / \\\n * c(5) d(1) e(2) f(3)\n *\n * After rebalancing, the adjusted values would be:\n * root(20)\n * / \\\n * a(10) b(10)\n * / \\ / \\\n * c(7) d(3) e(4.5) f(5.5)\n *\n * The resulting adjustments map:\n * {\n * \"root\": 0,\n * \"a\": 6,\n * \"b\": 4,\n * \"c\": 2,\n * \"d\": 2,\n * \"e\": 2.5,\n * \"f\": 2.5\n * }\n *\n * @param node The root of the tree to rebalance\n * @returns A map of node names to adjustment values\n */\nexport function rebalanceTree(node: TreeNode): Map<string, number> {\n const adjustments = new Map<string, number>();\n processNode(node, adjustments);\n return adjustments;\n}\n\nfunction isLeaf(node: TreeNode): boolean {\n return node.children.length === 0;\n}\n\n/**\n * Add a value to a subtree, distributing it evenly among all nodes\n * @param node Current node to process\n * @param amount Amount to add to this subtree\n * @param adjustments Mutable map to store adjustments\n */\nfunction addToSubtree(\n node: TreeNode,\n amount: number,\n adjustments: Map<string, number>\n): void {\n // Add the amount to this node's adjustment\n const prevAdjustment = adjustments.get(node.name) ?? 0;\n adjustments.set(node.name, prevAdjustment + amount);\n\n if (!isLeaf(node)) {\n // Distribute the addition evenly among children\n const additionPerChild = amount / node.children.length;\n\n node.children.forEach(child =>\n addToSubtree(child, additionPerChild, adjustments)\n );\n }\n}\n\n/**\n * Calculate adjustments map for a subtree\n * @param node Node to process\n * @param adjustments Mutable map to store adjustments\n * @returns The adjusted value for the current node\n */\nfunction processNode(node: TreeNode, adjustments: Map<string, number>): number {\n if (isLeaf(node)) {\n return node.value;\n }\n\n // Recursively process children first and get their adjusted values\n const childrenAdjustedValues = node.children.map(child =>\n processNode(child, adjustments)\n );\n\n // Calculate the adjusted sum of children\n const adjustedChildrenSum = childrenAdjustedValues.reduce(\n (sum, value) => sum + value,\n 0\n );\n\n // Ensure this node's value is at least the sum of children\n if (node.value <= adjustedChildrenSum) {\n const adjustment = adjustedChildrenSum - node.value;\n const prevAdjustment = adjustments.get(node.name) ?? 0;\n adjustments.set(node.name, prevAdjustment + adjustment);\n\n return adjustedChildrenSum;\n }\n\n // Node value exceeds children sum, distribute the excess evenly among all children\n const additionPerChild =\n (node.value - adjustedChildrenSum) / node.children.length;\n node.children.forEach(child => {\n addToSubtree(child, additionPerChild, adjustments);\n });\n\n return node.value;\n}\n\nexport default rebalanceTree;\n"],"mappings":"AAAA;AACA;AACA;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,aAAaA,CAACC,IAAc,EAAuB;EACjE,IAAMC,WAAW,GAAG,IAAIC,GAAG,CAAiB,CAAC;EAC7CC,WAAW,CAACH,IAAI,EAAEC,WAAW,CAAC;EAC9B,OAAOA,WAAW;AACpB;AAEA,SAASG,MAAMA,CAACJ,IAAc,EAAW;EACvC,OAAOA,IAAI,CAACK,QAAQ,CAACC,MAAM,KAAK,CAAC;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,YAAYA,CACnBP,IAAc,EACdQ,MAAc,EACdP,WAAgC,EAC1B;EAAA,IAAAQ,gBAAA;EACN;EACA,IAAMC,cAAc,IAAAD,gBAAA,GAAGR,WAAW,CAACU,GAAG,CAACX,IAAI,CAACY,IAAI,CAAC,cAAAH,gBAAA,cAAAA,gBAAA,GAAI,CAAC;EACtDR,WAAW,CAACY,GAAG,CAACb,IAAI,CAACY,IAAI,EAAEF,cAAc,GAAGF,MAAM,CAAC;EAEnD,IAAI,CAACJ,MAAM,CAACJ,IAAI,CAAC,EAAE;IACjB;IACA,IAAMc,gBAAgB,GAAGN,MAAM,GAAGR,IAAI,CAACK,QAAQ,CAACC,MAAM;IAEtDN,IAAI,CAACK,QAAQ,CAACU,OAAO,CAACC,KAAK,IACzBT,YAAY,CAACS,KAAK,EAAEF,gBAAgB,EAAEb,WAAW,CACnD,CAAC;EACH;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASE,WAAWA,CAACH,IAAc,EAAEC,WAAgC,EAAU;EAC7E,IAAIG,MAAM,CAACJ,IAAI,CAAC,EAAE;IAChB,OAAOA,IAAI,CAACiB,KAAK;EACnB;;EAEA;EACA,IAAMC,sBAAsB,GAAGlB,IAAI,CAACK,QAAQ,CAACc,GAAG,CAACH,KAAK,IACpDb,WAAW,CAACa,KAAK,EAAEf,WAAW,CAChC,CAAC;;EAED;EACA,IAAMmB,mBAAmB,GAAGF,sBAAsB,CAACG,MAAM,CACvD,CAACC,GAAG,EAAEL,KAAK,KAAKK,GAAG,GAAGL,KAAK,EAC3B,CACF,CAAC;;EAED;EACA,IAAIjB,IAAI,CAACiB,KAAK,IAAIG,mBAAmB,EAAE;IAAA,IAAAG,iBAAA;IACrC,IAAMC,UAAU,GAAGJ,mBAAmB,GAAGpB,IAAI,CAACiB,KAAK;IACnD,IAAMP,cAAc,IAAAa,iBAAA,GAAGtB,WAAW,CAACU,GAAG,CAACX,IAAI,CAACY,IAAI,CAAC,cAAAW,iBAAA,cAAAA,iBAAA,GAAI,CAAC;IACtDtB,WAAW,CAACY,GAAG,CAACb,IAAI,CAACY,IAAI,EAAEF,cAAc,GAAGc,UAAU,CAAC;IAEvD,OAAOJ,mBAAmB;EAC5B;;EAEA;EACA,IAAMN,gBAAgB,GACpB,CAACd,IAAI,CAACiB,KAAK,GAAGG,mBAAmB,IAAIpB,IAAI,CAACK,QAAQ,CAACC,MAAM;EAC3DN,IAAI,CAACK,QAAQ,CAACU,OAAO,CAACC,KAAK,IAAI;IAC7BT,YAAY,CAACS,KAAK,EAAEF,gBAAgB,EAAEb,WAAW,CAAC;EACpD,CAAC,CAAC;EAEF,OAAOD,IAAI,CAACiB,KAAK;AACnB;AAEA,eAAelB,aAAa","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { type FlattenedIrisGridTreeItem } from './sortable-tree/utilities';
3
+ type SearchItemProps = {
4
+ value: string;
5
+ item: FlattenedIrisGridTreeItem;
6
+ onClick: (name: string, event: React.MouseEvent<HTMLElement>) => void;
7
+ onKeyDown: (name: string, event: React.KeyboardEvent<HTMLElement>) => void;
8
+ handleProps?: Record<string, unknown>;
9
+ };
10
+ declare const MemoizedSearchItem: React.MemoExoticComponent<React.ForwardRefExoticComponent<SearchItemProps & React.RefAttributes<HTMLDivElement>>>;
11
+ export default MemoizedSearchItem;
12
+ //# sourceMappingURL=SearchItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchItem.d.ts","sourceRoot":"","sources":["../../../src/sidebar/visibility-ordering-builder/SearchItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAwC,MAAM,OAAO,CAAC;AAK7D,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAE3E,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,yBAAyB,CAAC;IAChC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACtE,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC,CAAC;AA6CF,QAAA,MAAM,kBAAkB,mHAAmB,CAAC;AAE5C,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,55 @@
1
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
4
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
6
+ import React, { forwardRef, memo, useCallback } from 'react';
7
+ import classNames from 'classnames';
8
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
9
+ import { vsGripper } from '@deephaven/icons';
10
+ import { Tooltip } from '@deephaven/components';
11
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
+ var SearchItem = /*#__PURE__*/forwardRef(function SearchItem(props, ref) {
13
+ var {
14
+ value,
15
+ item,
16
+ onClick,
17
+ onKeyDown,
18
+ handleProps
19
+ } = props;
20
+ var handleClick = useCallback(event => {
21
+ onClick(value, event);
22
+ }, [onClick, value]);
23
+ var handleKeyDown = useCallback(event => {
24
+ onKeyDown(value, event);
25
+ }, [onKeyDown, value]);
26
+ return (
27
+ /*#__PURE__*/
28
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions
29
+ _jsxs("div", _objectSpread(_objectSpread({
30
+ ref: ref,
31
+ className: classNames('tree-item', {
32
+ isSelected: item.selected
33
+ }),
34
+ onClick: handleClick,
35
+ onKeyDownCapture: handleKeyDown,
36
+ "data-index": item.index
37
+ // eslint-disable-next-line react/jsx-props-no-spreading
38
+ }, handleProps), {}, {
39
+ children: [/*#__PURE__*/_jsx("span", {
40
+ title: value,
41
+ className: classNames('column-name'),
42
+ children: value
43
+ }), /*#__PURE__*/_jsxs("div", {
44
+ children: [/*#__PURE__*/_jsx(Tooltip, {
45
+ children: "Drag to re-order"
46
+ }), /*#__PURE__*/_jsx(FontAwesomeIcon, {
47
+ icon: vsGripper
48
+ })]
49
+ })]
50
+ }))
51
+ );
52
+ });
53
+ var MemoizedSearchItem = /*#__PURE__*/memo(SearchItem);
54
+ export default MemoizedSearchItem;
55
+ //# sourceMappingURL=SearchItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchItem.js","names":["React","forwardRef","memo","useCallback","classNames","FontAwesomeIcon","vsGripper","Tooltip","jsx","_jsx","jsxs","_jsxs","SearchItem","props","ref","value","item","onClick","onKeyDown","handleProps","handleClick","event","handleKeyDown","_objectSpread","className","isSelected","selected","onKeyDownCapture","index","children","title","icon","MemoizedSearchItem"],"sources":["../../../src/sidebar/visibility-ordering-builder/SearchItem.tsx"],"sourcesContent":["import React, { forwardRef, memo, useCallback } from 'react';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsGripper } from '@deephaven/icons';\nimport { Tooltip } from '@deephaven/components';\nimport { type FlattenedIrisGridTreeItem } from './sortable-tree/utilities';\n\ntype SearchItemProps = {\n value: string;\n item: FlattenedIrisGridTreeItem;\n onClick: (name: string, event: React.MouseEvent<HTMLElement>) => void;\n onKeyDown: (name: string, event: React.KeyboardEvent<HTMLElement>) => void;\n handleProps?: Record<string, unknown>;\n};\n\nconst SearchItem = forwardRef<HTMLDivElement, SearchItemProps>(\n function SearchItem(props, ref) {\n const { value, item, onClick, onKeyDown, handleProps } = props;\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n onClick(value, event);\n },\n [onClick, value]\n );\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLElement>) => {\n onKeyDown(value, event);\n },\n [onKeyDown, value]\n );\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n ref={ref}\n className={classNames('tree-item', {\n isSelected: item.selected,\n })}\n onClick={handleClick}\n onKeyDownCapture={handleKeyDown}\n data-index={item.index}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...handleProps}\n >\n <span title={value} className={classNames('column-name')}>\n {value}\n </span>\n <div>\n <Tooltip>Drag to re-order</Tooltip>\n <FontAwesomeIcon icon={vsGripper} />\n </div>\n </div>\n );\n }\n);\n\nconst MemoizedSearchItem = memo(SearchItem);\n\nexport default MemoizedSearchItem;\n"],"mappings":";;;;;AAAA,OAAOA,KAAK,IAAIC,UAAU,EAAEC,IAAI,EAAEC,WAAW,QAAQ,OAAO;AAC5D,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,kBAAkB;AAC5C,SAASC,OAAO,QAAQ,uBAAuB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAWhD,IAAMC,UAAU,gBAAGX,UAAU,CAC3B,SAASW,UAAUA,CAACC,KAAK,EAAEC,GAAG,EAAE;EAC9B,IAAM;IAAEC,KAAK;IAAEC,IAAI;IAAEC,OAAO;IAAEC,SAAS;IAAEC;EAAY,CAAC,GAAGN,KAAK;EAE9D,IAAMO,WAAW,GAAGjB,WAAW,CAC5BkB,KAAoC,IAAK;IACxCJ,OAAO,CAACF,KAAK,EAAEM,KAAK,CAAC;EACvB,CAAC,EACD,CAACJ,OAAO,EAAEF,KAAK,CACjB,CAAC;EAED,IAAMO,aAAa,GAAGnB,WAAW,CAC9BkB,KAAuC,IAAK;IAC3CH,SAAS,CAACH,KAAK,EAAEM,KAAK,CAAC;EACzB,CAAC,EACD,CAACH,SAAS,EAAEH,KAAK,CACnB,CAAC;EAED;IAAA;IACE;IACAJ,KAAA,QAAAY,aAAA,CAAAA,aAAA;MACET,GAAG,EAAEA,GAAI;MACTU,SAAS,EAAEpB,UAAU,CAAC,WAAW,EAAE;QACjCqB,UAAU,EAAET,IAAI,CAACU;MACnB,CAAC,CAAE;MACHT,OAAO,EAAEG,WAAY;MACrBO,gBAAgB,EAAEL,aAAc;MAChC,cAAYN,IAAI,CAACY;MACjB;IAAA,GACIT,WAAW;MAAAU,QAAA,gBAEfpB,IAAA;QAAMqB,KAAK,EAAEf,KAAM;QAACS,SAAS,EAAEpB,UAAU,CAAC,aAAa,CAAE;QAAAyB,QAAA,EACtDd;MAAK,CACF,CAAC,eACPJ,KAAA;QAAAkB,QAAA,gBACEpB,IAAA,CAACF,OAAO;UAAAsB,QAAA,EAAC;QAAgB,CAAS,CAAC,eACnCpB,IAAA,CAACJ,eAAe;UAAC0B,IAAI,EAAEzB;QAAU,CAAE,CAAC;MAAA,CACjC,CAAC;IAAA,EACH;EAAC;AAEV,CACF,CAAC;AAED,IAAM0B,kBAAkB,gBAAG9B,IAAI,CAACU,UAAU,CAAC;AAE3C,eAAeoB,kBAAkB","ignoreList":[]}