@deephaven/iris-grid 0.85.35 → 0.85.37
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/dist/IrisGrid.d.ts +19 -2
- package/dist/IrisGrid.d.ts.map +1 -1
- package/dist/IrisGrid.js +16 -11
- package/dist/IrisGrid.js.map +1 -1
- package/dist/IrisGridMetricCalculator.d.ts +34 -1
- package/dist/IrisGridMetricCalculator.d.ts.map +1 -1
- package/dist/IrisGridMetricCalculator.js +143 -3
- package/dist/IrisGridMetricCalculator.js.map +1 -1
- package/dist/LazyIrisGrid.d.ts +16 -1
- package/dist/LazyIrisGrid.d.ts.map +1 -1
- package/dist/TreeRebalanceUtil.d.ts +50 -0
- package/dist/TreeRebalanceUtil.d.ts.map +1 -0
- package/dist/TreeRebalanceUtil.js +105 -0
- package/dist/TreeRebalanceUtil.js.map +1 -0
- package/package.json +3 -3
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { GridMetricCalculator, GridMetrics, ModelSizeMap } from '@deephaven/grid';
|
|
1
|
+
import { GridMetricCalculator, GridMetrics, ModelIndex, ModelSizeMap } from '@deephaven/grid';
|
|
2
2
|
import type { GridMetricState } from '@deephaven/grid';
|
|
3
3
|
import type { dh } from '@deephaven/jsapi-types';
|
|
4
4
|
import type IrisGridModel from './IrisGridModel';
|
|
5
5
|
import { IrisGridThemeType } from './IrisGridTheme';
|
|
6
6
|
import { ColumnName, ReadonlyAdvancedFilterMap, ReadonlyQuickFilterMap } from './CommonTypes';
|
|
7
|
+
import type ColumnHeaderGroup from './ColumnHeaderGroup';
|
|
7
8
|
export interface IrisGridMetricState extends GridMetricState {
|
|
8
9
|
model: IrisGridModel;
|
|
9
10
|
theme: IrisGridThemeType;
|
|
@@ -16,7 +17,29 @@ export interface IrisGridMetricState extends GridMetricState {
|
|
|
16
17
|
export declare class IrisGridMetricCalculator extends GridMetricCalculator {
|
|
17
18
|
userColumnWidthsByName: Map<ColumnName, number>;
|
|
18
19
|
private cachedModelColumnNames;
|
|
20
|
+
private cachedHeaderGroupNames;
|
|
21
|
+
private cachedPaddingMaps;
|
|
22
|
+
static getModelColumnRoot(model: IrisGridModel, modelColumn: ModelIndex): ColumnHeaderGroup | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Builds a TreeNode from the model header groups and columns for padding calculation
|
|
25
|
+
* @param name The name of the root node to build the tree for
|
|
26
|
+
* @param model The IrisGridModel containing columns and header groups
|
|
27
|
+
* @param getLeafValue Function to get the value for leaf nodes (columns)
|
|
28
|
+
* @param getGroupValue Function to get the value for group nodes (header groups)
|
|
29
|
+
* @returns The TreeNode structure
|
|
30
|
+
*/
|
|
31
|
+
private static buildNode;
|
|
32
|
+
/**
|
|
33
|
+
* Gets the header padding for a specific column based on the widths of its group tree nodes.
|
|
34
|
+
* We only adjust paddings on the column, because the group widths are automatically sized to fit their children.
|
|
35
|
+
* @param state The current IrisGridMetricState
|
|
36
|
+
* @param modelColumn The column index to get the padding for
|
|
37
|
+
* @param maxColumnWidth Maximum allowed column width, applies only to leaf nodes
|
|
38
|
+
* @returns The calculated header padding for the column
|
|
39
|
+
*/
|
|
40
|
+
private getHeaderPadding;
|
|
19
41
|
private getCachedCurrentModelColumnNames;
|
|
42
|
+
private getCachedCurrentHeaderGroupNames;
|
|
20
43
|
private updateCalculatedColumnWidths;
|
|
21
44
|
/**
|
|
22
45
|
* Updates the user column widths based on the current model state
|
|
@@ -55,6 +78,16 @@ export declare class IrisGridMetricCalculator extends GridMetricCalculator {
|
|
|
55
78
|
* @returns A map of user column widths
|
|
56
79
|
*/
|
|
57
80
|
getUserColumnWidths(): ModelSizeMap;
|
|
81
|
+
getCalculatedColumnWidths(): ModelSizeMap;
|
|
82
|
+
/**
|
|
83
|
+
* Calculate the width of the specified column's header
|
|
84
|
+
* @param modelColumn ModelIndex of the column to get the header width for
|
|
85
|
+
* @param state The grid metric state
|
|
86
|
+
* @param maxColumnWidth Maximum allowed column width, applies only to leaf nodes
|
|
87
|
+
* @returns The calculated width of the column header
|
|
88
|
+
*/
|
|
89
|
+
calculateColumnHeaderWidth(modelColumn: ModelIndex, state: IrisGridMetricState, maxColumnWidth: number): number;
|
|
90
|
+
getColumnHeaderGroupWidth(modelColumn: ModelIndex, depth: number, state: IrisGridMetricState, maxColumnWidth: number): number;
|
|
58
91
|
}
|
|
59
92
|
export default IrisGridMetricCalculator;
|
|
60
93
|
//# 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,WAAW,
|
|
1
|
+
{"version":3,"file":"IrisGridMetricCalculator.d.ts","sourceRoot":"","sources":["../src/IrisGridMetricCalculator.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,YAAY,EAGb,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,KAAK,aAAa,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,UAAU,EACV,yBAAyB,EACzB,sBAAsB,EACvB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,iBAAiB,MAAM,qBAAqB,CAAC;AAGzD,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,iBAAiB,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,yBAAyB,CAAC;IAC3C,YAAY,EAAE,sBAAsB,CAAC;IACrC,KAAK,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,wBAAyB,SAAQ,oBAAoB;IAEhE,sBAAsB,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAa;IAG5D,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;IAgCrC,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,16 +3,99 @@ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typ
|
|
|
3
3
|
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
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);
|
|
11
12
|
_defineProperty(this, "userColumnWidthsByName", new Map());
|
|
12
13
|
_defineProperty(this, "cachedModelColumnNames", void 0);
|
|
14
|
+
_defineProperty(this, "cachedHeaderGroupNames", void 0);
|
|
15
|
+
_defineProperty(this, "cachedPaddingMaps", new Map());
|
|
13
16
|
_defineProperty(this, "getCachedCurrentModelColumnNames", memoizeOne(columns => columns.map(col => col.name)));
|
|
17
|
+
_defineProperty(this, "getCachedCurrentHeaderGroupNames", memoizeOne(columnHeaderGroups => columnHeaderGroups.map(group => group.name)));
|
|
14
18
|
} // Column widths by name to keep track of columns going in and out of viewport
|
|
15
19
|
// Cached model column names to detect when the column width map update is necessary
|
|
20
|
+
// Cached padding maps for column header groups
|
|
21
|
+
static getModelColumnRoot(model, modelColumn) {
|
|
22
|
+
var depth = 0;
|
|
23
|
+
var current = model.getColumnHeaderParentGroup(modelColumn, depth);
|
|
24
|
+
var root = current;
|
|
25
|
+
while (current != null) {
|
|
26
|
+
root = current;
|
|
27
|
+
depth += 1;
|
|
28
|
+
current = model.getColumnHeaderParentGroup(modelColumn, depth);
|
|
29
|
+
}
|
|
30
|
+
return root;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Builds a TreeNode from the model header groups and columns for padding calculation
|
|
35
|
+
* @param name The name of the root node to build the tree for
|
|
36
|
+
* @param model The IrisGridModel containing columns and header groups
|
|
37
|
+
* @param getLeafValue Function to get the value for leaf nodes (columns)
|
|
38
|
+
* @param getGroupValue Function to get the value for group nodes (header groups)
|
|
39
|
+
* @returns The TreeNode structure
|
|
40
|
+
*/
|
|
41
|
+
static buildNode(name, model, getLeafValue, getGroupValue) {
|
|
42
|
+
var _getLeafValue;
|
|
43
|
+
var headerGroup = model.columnHeaderGroupMap.get(name);
|
|
44
|
+
if (headerGroup) {
|
|
45
|
+
var value = getGroupValue(name);
|
|
46
|
+
var children = headerGroup.children.map(childName => IrisGridMetricCalculator.buildNode(childName, model, getLeafValue, getGroupValue));
|
|
47
|
+
|
|
48
|
+
// Group node
|
|
49
|
+
return {
|
|
50
|
+
name,
|
|
51
|
+
children,
|
|
52
|
+
value
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Leaf node
|
|
57
|
+
return {
|
|
58
|
+
name,
|
|
59
|
+
children: [],
|
|
60
|
+
value: (_getLeafValue = getLeafValue(name)) !== null && _getLeafValue !== void 0 ? _getLeafValue : 0
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Gets the header padding for a specific column based on the widths of its group tree nodes.
|
|
66
|
+
* We only adjust paddings on the column, because the group widths are automatically sized to fit their children.
|
|
67
|
+
* @param state The current IrisGridMetricState
|
|
68
|
+
* @param modelColumn The column index to get the padding for
|
|
69
|
+
* @param maxColumnWidth Maximum allowed column width, applies only to leaf nodes
|
|
70
|
+
* @returns The calculated header padding for the column
|
|
71
|
+
*/
|
|
72
|
+
getHeaderPadding(state, modelColumn, maxColumnWidth) {
|
|
73
|
+
var _paddingMap$get;
|
|
74
|
+
var {
|
|
75
|
+
model
|
|
76
|
+
} = state;
|
|
77
|
+
var root = IrisGridMetricCalculator.getModelColumnRoot(model, modelColumn);
|
|
78
|
+
if (root == null) {
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
var cachedMap = this.cachedPaddingMaps.get(root.name);
|
|
82
|
+
if (cachedMap != null) {
|
|
83
|
+
var _cachedMap$get;
|
|
84
|
+
return (_cachedMap$get = cachedMap.get(model.columns[modelColumn].name)) !== null && _cachedMap$get !== void 0 ? _cachedMap$get : 0;
|
|
85
|
+
}
|
|
86
|
+
var groupTree = IrisGridMetricCalculator.buildNode(root.name, model, name => {
|
|
87
|
+
var columnIndex = model.getColumnIndexByName(name);
|
|
88
|
+
assertNotNull(columnIndex, "".concat(name, " not found in model columns"));
|
|
89
|
+
return super.calculateColumnHeaderWidth(columnIndex, state, maxColumnWidth);
|
|
90
|
+
}, name => {
|
|
91
|
+
var group = model.columnHeaderGroupMap.get(name);
|
|
92
|
+
assertNotNull(group, "".concat(name, " not found in columnHeaderGroupMap"));
|
|
93
|
+
return this.getColumnHeaderGroupWidth(group.childIndexes[0], group.depth, state, maxColumnWidth);
|
|
94
|
+
});
|
|
95
|
+
var paddingMap = rebalanceTree(groupTree);
|
|
96
|
+
this.cachedPaddingMaps.set(root.name, paddingMap);
|
|
97
|
+
return (_paddingMap$get = paddingMap.get(model.columns[modelColumn].name)) !== null && _paddingMap$get !== void 0 ? _paddingMap$get : 0;
|
|
98
|
+
}
|
|
16
99
|
updateCalculatedColumnWidths(model) {
|
|
17
100
|
assertNotNull(this.cachedModelColumnNames);
|
|
18
101
|
var calculatedColumnWidthsByName = new Map();
|
|
@@ -53,12 +136,20 @@ export class IrisGridMetricCalculator extends GridMetricCalculator {
|
|
|
53
136
|
updateColumnWidthsIfNecessary(model) {
|
|
54
137
|
// Comparing model.columns references wouldn't work here because
|
|
55
138
|
// the reference can change in the model without the actual column definitions changing
|
|
56
|
-
|
|
139
|
+
var modelColumnNames = this.getCachedCurrentModelColumnNames(model.columns);
|
|
140
|
+
if (this.cachedModelColumnNames != null && this.cachedModelColumnNames !== modelColumnNames && !deepEqual(modelColumnNames, this.cachedModelColumnNames)) {
|
|
57
141
|
// Preserve column widths when possible to minimize visual shifts in the grid layout
|
|
58
142
|
this.updateCalculatedColumnWidths(model);
|
|
59
143
|
this.updateUserColumnWidths(model);
|
|
144
|
+
this.cachedPaddingMaps.clear();
|
|
145
|
+
}
|
|
146
|
+
this.cachedModelColumnNames = modelColumnNames;
|
|
147
|
+
var headerGroupNames = this.getCachedCurrentHeaderGroupNames(model.columnHeaderGroups);
|
|
148
|
+
if (this.cachedHeaderGroupNames != null && this.cachedHeaderGroupNames !== headerGroupNames && !deepEqual(headerGroupNames, this.cachedHeaderGroupNames)) {
|
|
149
|
+
this.resetCalculatedColumnWidths();
|
|
150
|
+
this.cachedPaddingMaps.clear();
|
|
60
151
|
}
|
|
61
|
-
this.
|
|
152
|
+
this.cachedHeaderGroupNames = headerGroupNames;
|
|
62
153
|
}
|
|
63
154
|
getGridY(state) {
|
|
64
155
|
// The state here seems to be a GridMetricState with stateOverrides passed from IrisGrid in the props,
|
|
@@ -141,6 +232,55 @@ export class IrisGridMetricCalculator extends GridMetricCalculator {
|
|
|
141
232
|
// This might return stale data if getMetrics hasn't been called
|
|
142
233
|
return this.userColumnWidths;
|
|
143
234
|
}
|
|
235
|
+
getCalculatedColumnWidths() {
|
|
236
|
+
return this.calculatedColumnWidths;
|
|
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
|
+
}
|
|
144
284
|
}
|
|
145
285
|
export default IrisGridMetricCalculator;
|
|
146
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","getCachedCurrentModelColumnNames","getGridY","state","gridY","isFilterBarShown","theme","advancedFilters","quickFilters","sorts","reverse","filterBarHeight","size","filterBarCollapsedHeight","length","reverseHeaderBarHeight","getMetrics","column","resetColumnWidth","delete","resetAllColumnWidths","getUserColumnWidths"],"sources":["../src/IrisGridMetricCalculator.ts"],"sourcesContent":["import deepEqual from 'fast-deep-equal';\nimport memoizeOne from 'memoize-one';\nimport {\n GridMetricCalculator,\n GridMetrics,\n ModelIndex,\n ModelSizeMap,\n trimMap,\n} from '@deephaven/grid';\nimport type { GridMetricState } from '@deephaven/grid';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { assertNotNull } from '@deephaven/utils';\nimport type IrisGridModel from './IrisGridModel';\nimport { IrisGridThemeType } from './IrisGridTheme';\nimport {\n ColumnName,\n ReadonlyAdvancedFilterMap,\n ReadonlyQuickFilterMap,\n} from './CommonTypes';\n\nexport interface IrisGridMetricState extends GridMetricState {\n model: IrisGridModel;\n theme: IrisGridThemeType;\n isFilterBarShown: boolean;\n advancedFilters: ReadonlyAdvancedFilterMap;\n quickFilters: ReadonlyQuickFilterMap;\n sorts: readonly dh.Sort[];\n reverse: boolean;\n}\n\nexport class IrisGridMetricCalculator extends GridMetricCalculator {\n // Column widths by name to keep track of columns going in and out of viewport\n 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 if (\n this.cachedModelColumnNames != null &&\n !deepEqual(\n this.getCachedCurrentModelColumnNames(model.columns),\n this.cachedModelColumnNames\n )\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 = model.columns.map(col => col.name);\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\nexport default IrisGridMetricCalculator;\n"],"mappings":"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"}
|
|
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","headerGroupNames","getCachedCurrentHeaderGroupNames","cachedHeaderGroupNames","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 GridMetrics,\n ModelIndex,\n ModelSizeMap,\n trimMap,\n isExpandableColumnGridModel,\n} from '@deephaven/grid';\nimport type { GridMetricState } from '@deephaven/grid';\nimport type { dh } from '@deephaven/jsapi-types';\nimport { assertNotNull } from '@deephaven/utils';\nimport type IrisGridModel from './IrisGridModel';\nimport { IrisGridThemeType } from './IrisGridTheme';\nimport {\n ColumnName,\n ReadonlyAdvancedFilterMap,\n ReadonlyQuickFilterMap,\n} from './CommonTypes';\nimport type ColumnHeaderGroup from './ColumnHeaderGroup';\nimport { rebalanceTree, type TreeNode } from './TreeRebalanceUtil';\n\nexport interface IrisGridMetricState extends GridMetricState {\n model: IrisGridModel;\n theme: IrisGridThemeType;\n isFilterBarShown: boolean;\n advancedFilters: ReadonlyAdvancedFilterMap;\n quickFilters: ReadonlyQuickFilterMap;\n sorts: readonly dh.Sort[];\n reverse: boolean;\n}\n\nexport class IrisGridMetricCalculator extends GridMetricCalculator {\n // Column widths by name to keep track of columns going in and out of viewport\n 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 const headerGroupNames = this.getCachedCurrentHeaderGroupNames(\n model.columnHeaderGroups\n );\n if (\n this.cachedHeaderGroupNames != null &&\n this.cachedHeaderGroupNames !== headerGroupNames &&\n !deepEqual(headerGroupNames, this.cachedHeaderGroupNames)\n ) {\n this.resetCalculatedColumnWidths();\n this.cachedPaddingMaps.clear();\n }\n this.cachedHeaderGroupNames = headerGroupNames;\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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"}
|
package/dist/LazyIrisGrid.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import type IrisGridType from './IrisGrid';
|
|
3
3
|
import type { IrisGridProps } from './IrisGrid';
|
|
4
|
-
declare const LazyIrisGrid: import("react").ForwardRefExoticComponent<Pick<IrisGridProps, "model" | "reverseType" | "columnHeaderGroups" | "renderer"> & Partial<Pick<IrisGridProps, "name" | "children" | "settings" | "onError" | "onContextMenu" | "isStuckToBottom" | "theme" | "customColumns" | "reverse" | "pendingDataMap" | "movedColumns" | "userColumnWidths" | "movedRows" | "isStuckToRight" | "advancedFilters" | "advancedSettings" | "alwaysFetchColumns" | "isFilterBarShown" | "applyInputFiltersOnInit" | "conditionalFormats" | "customColumnFormatMap" | "inputFilters" | "customFilters" | "onCreateChart" | "onColumnSelected" | "onDataSelected" | "onStateChange" | "onAdvancedSettingsChange" | "partitions" | "partitionConfig" | "sorts" | "quickFilters" | "selectDistinctColumns" | "userRowHeights" | "onSelectionChanged" | "rollupConfig" | "aggregationSettings" | "isSelectingColumn" | "isSelectingPartition" | "columnSelectionValidator" | "columnAllowedCursor" | "columnNotAllowedCursor" | "copyCursor" | "onlyFetchVisibleColumns" | "showSearchBar" | "searchValue" | "selectedSearchColumns" | "invertSearchColumns" | "getDownloadWorker" | "canCopy" | "canDownloadCsv" | "frozenColumns" | "canToggleSearch" | "keyHandlers" | "mouseHandlers" | "density">> & Partial<Pick<{
|
|
4
|
+
declare const LazyIrisGrid: import("react").ForwardRefExoticComponent<Pick<IrisGridProps, "model" | "reverseType" | "columnHeaderGroups" | "renderer"> & Partial<Pick<IrisGridProps, "name" | "children" | "settings" | "onError" | "onContextMenu" | "isStuckToBottom" | "theme" | "customColumns" | "reverse" | "pendingDataMap" | "movedColumns" | "userColumnWidths" | "movedRows" | "isStuckToRight" | "advancedFilters" | "advancedSettings" | "alwaysFetchColumns" | "isFilterBarShown" | "applyInputFiltersOnInit" | "conditionalFormats" | "customColumnFormatMap" | "inputFilters" | "customFilters" | "onCreateChart" | "onColumnSelected" | "onDataSelected" | "onStateChange" | "onAdvancedSettingsChange" | "partitions" | "partitionConfig" | "sorts" | "quickFilters" | "selectDistinctColumns" | "userRowHeights" | "onSelectionChanged" | "rollupConfig" | "aggregationSettings" | "isSelectingColumn" | "isSelectingPartition" | "columnSelectionValidator" | "columnAllowedCursor" | "columnNotAllowedCursor" | "copyCursor" | "onlyFetchVisibleColumns" | "showSearchBar" | "searchValue" | "selectedSearchColumns" | "invertSearchColumns" | "getDownloadWorker" | "canCopy" | "canDownloadCsv" | "frozenColumns" | "canToggleSearch" | "keyHandlers" | "mouseHandlers" | "density" | "getMetricCalculator">> & Partial<Pick<{
|
|
5
5
|
children: null;
|
|
6
6
|
advancedFilters: ReadonlyMap<never, never>;
|
|
7
7
|
advancedSettings: ReadonlyMap<never, never>;
|
|
@@ -76,6 +76,21 @@ declare const LazyIrisGrid: import("react").ForwardRefExoticComponent<Pick<IrisG
|
|
|
76
76
|
canToggleSearch: boolean;
|
|
77
77
|
mouseHandlers: readonly never[];
|
|
78
78
|
keyHandlers: readonly never[];
|
|
79
|
+
getMetricCalculator: (args_0?: {
|
|
80
|
+
userColumnWidths?: Map<any, any> | undefined;
|
|
81
|
+
userRowHeights?: Map<any, any> | undefined;
|
|
82
|
+
calculatedColumnWidths?: Map<any, any> | undefined;
|
|
83
|
+
calculatedRowHeights?: Map<any, any> | undefined;
|
|
84
|
+
fontWidthsLower?: Map<any, any> | undefined;
|
|
85
|
+
fontWidthsUpper?: Map<any, any> | undefined;
|
|
86
|
+
allCharWidths?: Map<any, any> | undefined;
|
|
87
|
+
modelRows?: Map<any, any> | undefined;
|
|
88
|
+
modelColumns?: Map<any, any> | undefined;
|
|
89
|
+
movedRows?: readonly import("@deephaven/grid").MoveOperation[] | undefined;
|
|
90
|
+
movedColumns?: readonly import("@deephaven/grid").MoveOperation[] | undefined;
|
|
91
|
+
initialRowHeights?: Map<any, any> | undefined;
|
|
92
|
+
initialColumnWidths?: Map<any, any> | undefined;
|
|
93
|
+
} | undefined) => import("./IrisGridMetricCalculator").IrisGridMetricCalculator;
|
|
79
94
|
}, never>> & import("react").RefAttributes<IrisGridType>>;
|
|
80
95
|
export default LazyIrisGrid;
|
|
81
96
|
//# 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
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yDAcjB,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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/iris-grid",
|
|
3
|
-
"version": "0.85.
|
|
3
|
+
"version": "0.85.37",
|
|
4
4
|
"description": "Deephaven Iris Grid",
|
|
5
5
|
"author": "Deephaven Data Labs LLC",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"@deephaven/components": "^0.85.35",
|
|
35
35
|
"@deephaven/console": "^0.85.35",
|
|
36
36
|
"@deephaven/filters": "^0.85.0",
|
|
37
|
-
"@deephaven/grid": "^0.85.
|
|
37
|
+
"@deephaven/grid": "^0.85.37",
|
|
38
38
|
"@deephaven/icons": "^0.85.0",
|
|
39
39
|
"@deephaven/jsapi-components": "^0.85.35",
|
|
40
40
|
"@deephaven/jsapi-types": "^1.0.0-dev0.39.4",
|
|
@@ -79,5 +79,5 @@
|
|
|
79
79
|
"publishConfig": {
|
|
80
80
|
"access": "public"
|
|
81
81
|
},
|
|
82
|
-
"gitHead": "
|
|
82
|
+
"gitHead": "af19156370497a40cb9aa4853d0bf539195d64e3"
|
|
83
83
|
}
|