@omegagrid/core 0.10.80 → 0.10.82
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/common/tree.d.ts +5 -0
- package/dist/common/tree.d.ts.map +1 -1
- package/dist/common/tree.js +90 -20
- package/dist/common/tree.js.map +1 -1
- package/package.json +2 -2
package/dist/common/tree.d.ts
CHANGED
|
@@ -36,6 +36,8 @@ export declare function TreeNodeMixin<TBase extends Constructor>(Base?: TBase):
|
|
|
36
36
|
_children: /*elided*/ any[];
|
|
37
37
|
_count: number;
|
|
38
38
|
_parent: /*elided*/ any;
|
|
39
|
+
/** node was defined with a negative level: it renders before (above) its parent */
|
|
40
|
+
_beforeParent: boolean;
|
|
39
41
|
_collapsed: boolean;
|
|
40
42
|
_hidden: boolean;
|
|
41
43
|
_filterState: FilterState;
|
|
@@ -52,6 +54,8 @@ export declare function TreeNodeMixin<TBase extends Constructor>(Base?: TBase):
|
|
|
52
54
|
get visible(): boolean;
|
|
53
55
|
get collapsed(): boolean;
|
|
54
56
|
set collapsed(value: boolean);
|
|
57
|
+
get beforeParent(): boolean;
|
|
58
|
+
set beforeParent(value: boolean);
|
|
55
59
|
get parent(): /*elided*/ any;
|
|
56
60
|
set parent(parent: /*elided*/ any);
|
|
57
61
|
get children(): /*elided*/ any[];
|
|
@@ -72,6 +76,7 @@ export declare function TreeNodeMixin<TBase extends Constructor>(Base?: TBase):
|
|
|
72
76
|
clearChildren(): void;
|
|
73
77
|
walk(cb: (m: /*elided*/ any) => unknown | void): void;
|
|
74
78
|
walkVisible(cb: (m: /*elided*/ any) => unknown | void): void;
|
|
79
|
+
_walkVisibleSelf(cb: (m: /*elided*/ any) => unknown | void): void;
|
|
75
80
|
walkUp(cb: (m: /*elided*/ any) => unknown | void): void;
|
|
76
81
|
_sort(comparer: (a: /*elided*/ any, b: /*elided*/ any) => number): void;
|
|
77
82
|
sort(comparer: (a: /*elided*/ any, b: /*elided*/ any) => number): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/common/tree.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAE9C,oBAAY,WAAW;IACtB,QAAQ,IAAI;IACZ,OAAO,IAAI;IACX,YAAY,IAAI;IAChB,aAAa,IAAI;CACjB;AAED,uCAAuC;AACvC,MAAM,MAAM,cAAc,GAAG;IAC5B,4BAA4B;IAC5B,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,iBAAiB;IACjB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sBAAsB;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB,CAAA;AAOD,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,WAAW,IAAI,KAAK,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAEtE,wBAAgB,aAAa,CAAC,KAAK,SAAS,WAAW,EAAE,IAAI,GAAE,KAA6B;mBAFlC,GAAG,EAAE;eAKtD,MAAM;qBACA,MAAM;eACZ,MAAM;sBACC,MAAM;mBAET,gBAAU;gBACb,MAAM;;
|
|
1
|
+
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/common/tree.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAE9C,oBAAY,WAAW;IACtB,QAAQ,IAAI;IACZ,OAAO,IAAI;IACX,YAAY,IAAI;IAChB,aAAa,IAAI;CACjB;AAED,uCAAuC;AACvC,MAAM,MAAM,cAAc,GAAG;IAC5B,4BAA4B;IAC5B,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,iBAAiB;IACjB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sBAAsB;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB,CAAA;AAOD,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,WAAW,IAAI,KAAK,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAEtE,wBAAgB,aAAa,CAAC,KAAK,SAAS,WAAW,EAAE,IAAI,GAAE,KAA6B;mBAFlC,GAAG,EAAE;eAKtD,MAAM;qBACA,MAAM;eACZ,MAAM;sBACC,MAAM;mBAET,gBAAU;gBACb,MAAM;;QAEd,mFAAmF;uBACpE,OAAO;oBACV,OAAO;iBACV,OAAO;sBACF,WAAW;qBACZ,OAAO;mBACT,OAAO;yBAED,cAAc;;;;2BAuBX,WAAW;2BAAX,WAAW;sBAEb,OAAO;0BAAP,OAAO;;yBAGJ,OAAO;6BAAP,OAAO;4BAEJ,OAAO;gCAAP,OAAO;;;wBAGX,gBAAU;4BAAV,gBAAU;;yBAMZ,MAAM;;;;;;;iCAcC,gBAAU,SAAS,MAAM;8BAS5B,MAAM,GAAC,gBAAU,UAAU,MAAM;wBAgBvC,OAAO;;qDAQoB,OAAO;;iBAiBzC,CAAC,CAAC,gBAAU,KAAK,OAAO,GAAC,IAAI;wBAMtB,CAAC,CAAC,gBAAU,KAAK,OAAO,GAAC,IAAI;6BAMxB,CAAC,CAAC,gBAAU,KAAK,OAAO,GAAC,IAAI;mBAcvC,CAAC,CAAC,gBAAU,KAAK,OAAO,GAAC,IAAI;wBAMxB,CAAC,CAAC,gBAAU,EAAE,CAAC,gBAAU,KAAK,MAAM;uBAOrC,CAAC,CAAC,gBAAU,EAAE,CAAC,gBAAU,KAAK,MAAM;;UAMpD;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEvD,MAAM,MAAM,2BAA2B,GAAG;IACzC,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB,CAAA;AAED,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,YAAY,EAAE,EACrB,IAAI,EAAE,YAAY,EAClB,OAAO,CAAC,EAAE,2BAA2B,GACnC,MAAM,CAuFR;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAUtF;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM,CAS3E"}
|
package/dist/common/tree.js
CHANGED
|
@@ -32,7 +32,7 @@ export function TreeNodeMixin(Base = TreeNodeBase) {
|
|
|
32
32
|
getSourceData() {
|
|
33
33
|
const data = super.getSourceData();
|
|
34
34
|
if (this.level > 0)
|
|
35
|
-
data.l = this.level;
|
|
35
|
+
data.l = this._beforeParent ? -this.level : this.level;
|
|
36
36
|
if (this.parentIndex != null)
|
|
37
37
|
data.p = this.parentIndex;
|
|
38
38
|
if (this._collapsed != null)
|
|
@@ -48,6 +48,8 @@ export function TreeNodeMixin(Base = TreeNodeBase) {
|
|
|
48
48
|
get visible() { return !this.hidden && this.filterState > 0; }
|
|
49
49
|
get collapsed() { return this._collapsed; }
|
|
50
50
|
set collapsed(value) { this._collapsed = value; }
|
|
51
|
+
get beforeParent() { return this._beforeParent; }
|
|
52
|
+
set beforeParent(value) { this._beforeParent = value; }
|
|
51
53
|
set parent(parent) { this._parent = parent; }
|
|
52
54
|
get parent() { return this._parent; }
|
|
53
55
|
set children(value) {
|
|
@@ -124,15 +126,27 @@ export function TreeNodeMixin(Base = TreeNodeBase) {
|
|
|
124
126
|
});
|
|
125
127
|
}
|
|
126
128
|
walkVisible(cb) {
|
|
127
|
-
this._children.forEach(ch =>
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
129
|
+
this._children.forEach(ch => ch._walkVisibleSelf(cb));
|
|
130
|
+
}
|
|
131
|
+
// visits this node and its visible subtree in visual order:
|
|
132
|
+
// children marked beforeParent (negative level) render above their parent
|
|
133
|
+
_walkVisibleSelf(cb) {
|
|
134
|
+
if (this.visible) {
|
|
135
|
+
const expanded = !this.collapsed;
|
|
136
|
+
if (expanded)
|
|
137
|
+
this._children.forEach(ch => {
|
|
138
|
+
if (ch.beforeParent)
|
|
139
|
+
ch._walkVisibleSelf(cb);
|
|
140
|
+
});
|
|
141
|
+
if (cb(this) !== false && expanded)
|
|
142
|
+
this._children.forEach(ch => {
|
|
143
|
+
if (!ch.beforeParent)
|
|
144
|
+
ch._walkVisibleSelf(cb);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
this.walkVisible(cb);
|
|
149
|
+
}
|
|
136
150
|
}
|
|
137
151
|
walkUp(cb) {
|
|
138
152
|
if (this._parent) {
|
|
@@ -156,26 +170,82 @@ export function buildLevelBasedTree(nodes, root, options) {
|
|
|
156
170
|
// [node, originalLevel]
|
|
157
171
|
// levels are beeing normalized, so it is necessary to remember the original level during tree building
|
|
158
172
|
const parents = [[root, -1]];
|
|
173
|
+
let pending = [];
|
|
159
174
|
let prev;
|
|
160
175
|
let prevLevel = -1;
|
|
161
176
|
let maxLevel = -1;
|
|
162
|
-
let nodeLevel = 0;
|
|
163
177
|
if (options?.reverse)
|
|
164
178
|
nodes = [...nodes].reverse();
|
|
179
|
+
const updateMaxLevel = (node) => {
|
|
180
|
+
maxLevel = Math.max(maxLevel, node.level + (node.hasChildren ? 1 : 0));
|
|
181
|
+
};
|
|
182
|
+
// addChild/insertChildren normalize only the direct child's level,
|
|
183
|
+
// so grandchildren of an attached pending subtree must be fixed here
|
|
184
|
+
const finalizeSubtree = (node) => {
|
|
185
|
+
updateMaxLevel(node);
|
|
186
|
+
node.walk(ch => {
|
|
187
|
+
ch.level = ch.parent.level + 1;
|
|
188
|
+
updateMaxLevel(ch);
|
|
189
|
+
});
|
|
190
|
+
};
|
|
191
|
+
// hand deeper pending nodes over to `parent`; attached = parent is already part of the tree
|
|
192
|
+
const adoptPending = (parent, level, attached) => {
|
|
193
|
+
const adopted = pending.filter(p => p.level > level);
|
|
194
|
+
if (adopted.length === 0)
|
|
195
|
+
return;
|
|
196
|
+
pending = pending.filter(p => p.level <= level);
|
|
197
|
+
adopted.forEach(p => {
|
|
198
|
+
parent.addChild(p.node);
|
|
199
|
+
p.node._beforeParent = true;
|
|
200
|
+
if (attached)
|
|
201
|
+
finalizeSubtree(p.node);
|
|
202
|
+
});
|
|
203
|
+
};
|
|
204
|
+
// the parent this node would get under the standard preceding rule (non-mutating);
|
|
205
|
+
// prev is not on the stack yet, so it must be considered first
|
|
206
|
+
const findPrecedingParent = (nodeLevel) => {
|
|
207
|
+
if (prev && prevLevel < nodeLevel)
|
|
208
|
+
return prev;
|
|
209
|
+
for (let i = parents.length - 1; i >= 0; i--) {
|
|
210
|
+
if (parents[i][1] < nodeLevel)
|
|
211
|
+
return parents[i][0];
|
|
212
|
+
}
|
|
213
|
+
return root;
|
|
214
|
+
};
|
|
165
215
|
root._children = [];
|
|
166
216
|
root._parent = null;
|
|
167
217
|
nodes.forEach(node => {
|
|
168
218
|
node._children = [];
|
|
169
219
|
node._parent = null;
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
220
|
+
node._beforeParent = false;
|
|
221
|
+
const nodeLevel = Math.abs(node.level) + root.level + 1;
|
|
222
|
+
if (node.level < 0) {
|
|
223
|
+
// parent is the nearest FOLLOWING node with a lower absolute level;
|
|
224
|
+
// negative nodes are transparent to the preceding rule (prev/stack untouched)
|
|
225
|
+
const fallbackParent = findPrecedingParent(nodeLevel);
|
|
226
|
+
adoptPending(node, nodeLevel, false);
|
|
227
|
+
pending.push({ node, level: nodeLevel, fallbackParent, fallbackIndex: fallbackParent.children.length });
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
if (prev && prevLevel < nodeLevel)
|
|
231
|
+
parents.push([prev, prevLevel]);
|
|
232
|
+
while (parents.length > 1 && parents[parents.length - 1][1] >= nodeLevel)
|
|
233
|
+
parents.pop();
|
|
234
|
+
prevLevel = nodeLevel;
|
|
235
|
+
parents[parents.length - 1][0].addChild(node);
|
|
236
|
+
updateMaxLevel(node);
|
|
237
|
+
adoptPending(node, nodeLevel, true);
|
|
238
|
+
prev = node;
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
// orphans: no following node with a lower absolute level -> fall back to the preceding
|
|
242
|
+
// rule, inserted at the position they would have occupied (before later siblings)
|
|
243
|
+
const insertedCount = new Map();
|
|
244
|
+
pending.forEach(p => {
|
|
245
|
+
const offset = insertedCount.get(p.fallbackParent) || 0;
|
|
246
|
+
p.fallbackParent.insertChildren([p.node], p.fallbackIndex + offset);
|
|
247
|
+
insertedCount.set(p.fallbackParent, offset + 1);
|
|
248
|
+
finalizeSubtree(p.node);
|
|
179
249
|
});
|
|
180
250
|
return maxLevel;
|
|
181
251
|
}
|
package/dist/common/tree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/common/tree.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Populatable, Mixin } from \"../types\";\n\nexport enum FilterState {\n\tFiltered = 0,\n\tMatched = 1,\n\tChildMatched = 2,\n\tParentMatched = 3\n}\n\n/** Source object type for tree node */\nexport type TreeNodeSource = {\n\t/** node index (readonly) */\n\ti?: number,\n\t/** node level */\n\tl?: number,\n\t/** node level */\n\tlevel?: number,\n\t/** parent index */\n\tp?: number,\n\t/** children count */\n\tcount?: number,\n\t/** initital collapse state */\n\tcollapsed?: boolean,\n\t/** node visibility */\n\thidden?: boolean,\n\t/** false for excluding node from sorting, default = true */\n\tsortable?: boolean,\n\t/** false for excluding node from filtering, default = true */\n\tfilterable?: boolean,\n}\n\nclass TreeNodeBase implements Populatable {\n\tpopulate(_source: TreeNodeSource) { /* empty */ }\n\tgetSourceData(): TreeNodeSource { return {} }\n}\n\nexport type Constructor<A = Populatable> = new (...input: any[]) => A;\n\nexport function TreeNodeMixin<TBase extends Constructor>(Base: TBase = TreeNodeBase as TBase) {\n\treturn class TreeNode extends Base {\n\n\t\tindex: number;\n\t\tparentIndex: number;\n\t\tlevel: number;\n\t\tvisibleIndex: number;\n\n\t\t_children: TreeNode[] = [];\n\t\t_count: number;\n\t\t_parent: TreeNode;\n\t\t_collapsed: boolean;\n\t\t_hidden: boolean;\n\t\t_filterState: FilterState = FilterState.Matched;\n\t\t_filterable: boolean;\n\t\t_sortable: boolean;\n\n\t\tpopulate(source: TreeNodeSource) {\n\t\t\tsuper.populate(source);\n\t\t\tif (!isNaN(source.i)) this.index = source.i;\n\t\t\tthis.level = source.level || source.l || 0;\n\t\t\tthis.parentIndex = source.p;\n\t\t\tthis._count = source.count;\n\t\t\tthis._hidden = source.hidden;\n\t\t\tthis._filterable = source.filterable;\n\t\t\tthis._sortable = source.sortable;\n\t\t\tif (source.collapsed || source.count) this._collapsed = true;\n\t\t}\n\n\t\tgetSourceData() {\n\t\t\tconst data = super.getSourceData() as TreeNodeSource;\n\t\t\tif (this.level > 0) data.l = this.level;\n\t\t\tif (this.parentIndex != null) data.p = this.parentIndex;\n\t\t\tif (this._collapsed != null) data.collapsed = this._collapsed;\n\t\t\treturn data;\n\t\t}\n\n\t\tget filterable() { return this._filterable !== false }\n\t\tget sortable() { return this._sortable !== false }\n\t\tget filterState() { return this._filterState }\n\t\tset filterState(v : FilterState) { this._filterState = v }\n\t\tget hidden() { return this._hidden }\n\t\tset hidden(value: boolean) { this._hidden = value }\n\t\tget visible() { return !this.hidden && this.filterState > 0 }\n\t\tget collapsed() { return this._collapsed }\n\t\tset collapsed(value: boolean) { this._collapsed = value }\n\t\tset parent(parent: TreeNode) { this._parent = parent }\n\t\tget parent() { return this._parent }\n\t\tset children(value: TreeNode[]) { \n\t\t\tthis._children = value;\n\t\t\tthis._count = Math.max(this._count || 0, this._children.length);\n\t\t}\n\t\tget children() { return this._children }\n\t\tget hasChildren() { return this._children.length > 0 || this._count > 0 }\n\t\tset count (value: number) { this._count = value }\n\t\tget isLoaded() { return this._count == null || this._count <= this._children.length }\n\t\tget isPartialyLoaded() { return this._children.length > 0 && this._count > this._children.length }\n\t\tget hasParent() { return this.parent ? this.parent.level > -1 : false }\n\t\tget firstChild() { return this.children[0] }\n\t\tget lastChild() { return this.children[this.children.length - 1] }\n\n\t\taddChild(child: TreeNode) {\n\t\t\tthis._children.push(child);\n\t\t\tchild.parent = this;\n\t\t\tchild.level = this.level + 1;\n\t\t\tthis._count = Math.max(this._count || 0, this._children.length);\n\t\t}\n\n\t\tinsertChildren(children: TreeNode[], index: number) {\n\t\t\tthis._children.splice(index, 0, ...children);\n\t\t\tchildren.forEach(n => {\n\t\t\t\tn.parent = this;\n\t\t\t\tn.level = this.level + 1\n\t\t\t});\n\t\t\tthis._count = Math.max(this._count || 0, this._children.length);\n\t\t}\n\n\t\tdeleteChildren(index: number|TreeNode[], count?: number) {\n\t\t\tif (Array.isArray(index)) {\n\t\t\t\tconst stack = new Set<TreeNode>();\n\t\t\t\tindex.forEach(ch => {\n\t\t\t\t\tch.parent = null;\n\t\t\t\t\tstack.add(ch);\n\t\t\t\t});\n\t\t\t\tthis._children = this._children.filter(ch => !stack.has(ch));\n\t\t\t\tthis._count -= index.length;\n\t\t\t} else {\n\t\t\t\tcount = count || 1;\n\t\t\t\tthis._children.splice(index as number, count);\n\t\t\t\tthis._count -= count;\n\t\t\t}\n\t\t}\n\n\t\texpand(unhide?: boolean) {\n\t\t\tthis._collapsed = false;\n\t\t\tif (unhide && this.hasChildren) {\n\t\t\t\tthis.walk(ch => ch.hidden = false);\n\t\t\t}\n\t\t}\n\t\tcollapse() { this._collapsed = true }\n\n\t\ttoggleCollapse(recursive = false, unhide?: boolean) {\n\t\t\tconst expand = this._collapsed;\n\t\t\tif (expand) this.expand(unhide);\n\t\t\telse this.collapse();\n\n\t\t\tif (recursive) {\n\t\t\t\tif (expand) this.walk(ch => ch.expand(unhide));\n\t\t\t\telse this.walk(ch => ch.collapse());\n\t\t\t}\n\t\t}\n\n\t\tclearChildren() {\n\t\t\tthis._children.forEach(ch => ch.parent = null);\n\t\t\tthis._children = [];\n\t\t\tthis._count = null;\n\t\t}\n\n\t\twalk(cb: (m: TreeNode) => unknown|void) {\n\t\t\tthis._children.forEach(ch => {\n\t\t\t\tif (cb(ch) !== false) ch.walk(cb);\n\t\t\t});\n\t\t}\n\n\t\twalkVisible(cb: (m: TreeNode) => unknown|void) {\n\t\t\tthis._children.forEach(ch => {\n\t\t\t\tif (ch.visible) {\n\t\t\t\t\tif (cb(ch) !== false && !ch.collapsed) ch.walkVisible(cb);\n\t\t\t\t} else {\n\t\t\t\t\tch.walkVisible(cb);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\twalkUp(cb: (m: TreeNode) => unknown|void) {\n\t\t\tif (this._parent) {\n\t\t\t\tif (cb(this._parent) !== false) this._parent.walkUp(cb);\n\t\t\t}\n\t\t}\n\n\t\t_sort(comparer: (a: TreeNode, b: TreeNode) => number) {\n\t\t\tif (this.hasChildren) {\n\t\t\t\tthis._children.sort(comparer);\n\t\t\t\tthis._children.forEach(ch => ch._sort(comparer));\n\t\t\t}\n\t\t}\n\n\t\tsort(comparer: (a: TreeNode, b: TreeNode) => number) {\n\t\t\t// use physical index for sorting if one or both nodes are not sortable\n\t\t\tthis._sort((a: TreeNode, b: TreeNode) => a.sortable && b.sortable ? comparer(a, b) : (a.index - b.index));\n\t\t}\n\n\t}\n}\n\nexport type TreeNodeType = Mixin<typeof TreeNodeMixin>;\n\nexport type LevelBasedTreeCreateOptions = {\n\treverse?: boolean,\n}\n\nexport function buildLevelBasedTree(\n\tnodes: TreeNodeType[],\n\troot: TreeNodeType,\n\toptions?: LevelBasedTreeCreateOptions\n): number {\n\ttype OriginalLevel = number;\n\t// [node, originalLevel]\n\t// levels are beeing normalized, so it is necessary to remember the original level during tree building\n\tconst parents: [TreeNodeType, OriginalLevel][] = [[root, -1]];\n\tlet prev: TreeNodeType;\n\tlet prevLevel = -1;\n\tlet maxLevel = -1;\n\tlet nodeLevel = 0;\n\n\tif (options?.reverse) nodes = [...nodes].reverse();\n\n\troot._children = [];\n\troot._parent = null;\n\tnodes.forEach(node => {\n\t\tnode._children = [];\n\t\tnode._parent = null;\n\n\t\tnodeLevel = node.level + root.level + 1;\n\t\tif (prev && prevLevel < nodeLevel) parents.push([prev, prevLevel]);\n\t\twhile (parents[parents.length - 1][1] >= nodeLevel) parents.pop();\n\t\tprevLevel = nodeLevel;\n\t\tparents[parents.length - 1][0].addChild(node);\n\t\tmaxLevel = Math.max(maxLevel, node.level + (node.hasChildren ? 1 : 0));\n\t\tprev = node;\n\t});\n\treturn maxLevel;\n}\n\nexport function buildParentBasedTree(nodes: TreeNodeType[], root: TreeNodeType): number {\n\tlet maxLevel = -1;\n\tnodes.forEach(node => {\n\t\t(node.parentIndex == null ? root : nodes[node.parentIndex]).addChild(node);\n\t});\n\troot.walk(node => {\n\t\tnode.level = node.parent ? node.parent.level + 1 : 0;\n\t\tmaxLevel = Math.max(maxLevel, node.level);\n\t});\n\treturn maxLevel;\n}\n\nexport function buildTree(nodes: TreeNodeType[], root: TreeNodeType): number {\n\tif (nodes.length > 0) {\n\t\tif (nodes[0].level == null) {\n\t\t\treturn buildParentBasedTree(nodes, root);\n\t\t} else {\n\t\t\treturn buildLevelBasedTree(nodes, root);\n\t\t}\n\t}\n\treturn -1;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/common/tree.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Populatable, Mixin } from \"../types\";\n\nexport enum FilterState {\n\tFiltered = 0,\n\tMatched = 1,\n\tChildMatched = 2,\n\tParentMatched = 3\n}\n\n/** Source object type for tree node */\nexport type TreeNodeSource = {\n\t/** node index (readonly) */\n\ti?: number,\n\t/** node level */\n\tl?: number,\n\t/** node level */\n\tlevel?: number,\n\t/** parent index */\n\tp?: number,\n\t/** children count */\n\tcount?: number,\n\t/** initital collapse state */\n\tcollapsed?: boolean,\n\t/** node visibility */\n\thidden?: boolean,\n\t/** false for excluding node from sorting, default = true */\n\tsortable?: boolean,\n\t/** false for excluding node from filtering, default = true */\n\tfilterable?: boolean,\n}\n\nclass TreeNodeBase implements Populatable {\n\tpopulate(_source: TreeNodeSource) { /* empty */ }\n\tgetSourceData(): TreeNodeSource { return {} }\n}\n\nexport type Constructor<A = Populatable> = new (...input: any[]) => A;\n\nexport function TreeNodeMixin<TBase extends Constructor>(Base: TBase = TreeNodeBase as TBase) {\n\treturn class TreeNode extends Base {\n\n\t\tindex: number;\n\t\tparentIndex: number;\n\t\tlevel: number;\n\t\tvisibleIndex: number;\n\n\t\t_children: TreeNode[] = [];\n\t\t_count: number;\n\t\t_parent: TreeNode;\n\t\t/** node was defined with a negative level: it renders before (above) its parent */\n\t\t_beforeParent: boolean;\n\t\t_collapsed: boolean;\n\t\t_hidden: boolean;\n\t\t_filterState: FilterState = FilterState.Matched;\n\t\t_filterable: boolean;\n\t\t_sortable: boolean;\n\n\t\tpopulate(source: TreeNodeSource) {\n\t\t\tsuper.populate(source);\n\t\t\tif (!isNaN(source.i)) this.index = source.i;\n\t\t\tthis.level = source.level || source.l || 0;\n\t\t\tthis.parentIndex = source.p;\n\t\t\tthis._count = source.count;\n\t\t\tthis._hidden = source.hidden;\n\t\t\tthis._filterable = source.filterable;\n\t\t\tthis._sortable = source.sortable;\n\t\t\tif (source.collapsed || source.count) this._collapsed = true;\n\t\t}\n\n\t\tgetSourceData() {\n\t\t\tconst data = super.getSourceData() as TreeNodeSource;\n\t\t\tif (this.level > 0) data.l = this._beforeParent ? -this.level : this.level;\n\t\t\tif (this.parentIndex != null) data.p = this.parentIndex;\n\t\t\tif (this._collapsed != null) data.collapsed = this._collapsed;\n\t\t\treturn data;\n\t\t}\n\n\t\tget filterable() { return this._filterable !== false }\n\t\tget sortable() { return this._sortable !== false }\n\t\tget filterState() { return this._filterState }\n\t\tset filterState(v : FilterState) { this._filterState = v }\n\t\tget hidden() { return this._hidden }\n\t\tset hidden(value: boolean) { this._hidden = value }\n\t\tget visible() { return !this.hidden && this.filterState > 0 }\n\t\tget collapsed() { return this._collapsed }\n\t\tset collapsed(value: boolean) { this._collapsed = value }\n\t\tget beforeParent() { return this._beforeParent }\n\t\tset beforeParent(value: boolean) { this._beforeParent = value }\n\t\tset parent(parent: TreeNode) { this._parent = parent }\n\t\tget parent() { return this._parent }\n\t\tset children(value: TreeNode[]) { \n\t\t\tthis._children = value;\n\t\t\tthis._count = Math.max(this._count || 0, this._children.length);\n\t\t}\n\t\tget children() { return this._children }\n\t\tget hasChildren() { return this._children.length > 0 || this._count > 0 }\n\t\tset count (value: number) { this._count = value }\n\t\tget isLoaded() { return this._count == null || this._count <= this._children.length }\n\t\tget isPartialyLoaded() { return this._children.length > 0 && this._count > this._children.length }\n\t\tget hasParent() { return this.parent ? this.parent.level > -1 : false }\n\t\tget firstChild() { return this.children[0] }\n\t\tget lastChild() { return this.children[this.children.length - 1] }\n\n\t\taddChild(child: TreeNode) {\n\t\t\tthis._children.push(child);\n\t\t\tchild.parent = this;\n\t\t\tchild.level = this.level + 1;\n\t\t\tthis._count = Math.max(this._count || 0, this._children.length);\n\t\t}\n\n\t\tinsertChildren(children: TreeNode[], index: number) {\n\t\t\tthis._children.splice(index, 0, ...children);\n\t\t\tchildren.forEach(n => {\n\t\t\t\tn.parent = this;\n\t\t\t\tn.level = this.level + 1\n\t\t\t});\n\t\t\tthis._count = Math.max(this._count || 0, this._children.length);\n\t\t}\n\n\t\tdeleteChildren(index: number|TreeNode[], count?: number) {\n\t\t\tif (Array.isArray(index)) {\n\t\t\t\tconst stack = new Set<TreeNode>();\n\t\t\t\tindex.forEach(ch => {\n\t\t\t\t\tch.parent = null;\n\t\t\t\t\tstack.add(ch);\n\t\t\t\t});\n\t\t\t\tthis._children = this._children.filter(ch => !stack.has(ch));\n\t\t\t\tthis._count -= index.length;\n\t\t\t} else {\n\t\t\t\tcount = count || 1;\n\t\t\t\tthis._children.splice(index as number, count);\n\t\t\t\tthis._count -= count;\n\t\t\t}\n\t\t}\n\n\t\texpand(unhide?: boolean) {\n\t\t\tthis._collapsed = false;\n\t\t\tif (unhide && this.hasChildren) {\n\t\t\t\tthis.walk(ch => ch.hidden = false);\n\t\t\t}\n\t\t}\n\t\tcollapse() { this._collapsed = true }\n\n\t\ttoggleCollapse(recursive = false, unhide?: boolean) {\n\t\t\tconst expand = this._collapsed;\n\t\t\tif (expand) this.expand(unhide);\n\t\t\telse this.collapse();\n\n\t\t\tif (recursive) {\n\t\t\t\tif (expand) this.walk(ch => ch.expand(unhide));\n\t\t\t\telse this.walk(ch => ch.collapse());\n\t\t\t}\n\t\t}\n\n\t\tclearChildren() {\n\t\t\tthis._children.forEach(ch => ch.parent = null);\n\t\t\tthis._children = [];\n\t\t\tthis._count = null;\n\t\t}\n\n\t\twalk(cb: (m: TreeNode) => unknown|void) {\n\t\t\tthis._children.forEach(ch => {\n\t\t\t\tif (cb(ch) !== false) ch.walk(cb);\n\t\t\t});\n\t\t}\n\n\t\twalkVisible(cb: (m: TreeNode) => unknown|void) {\n\t\t\tthis._children.forEach(ch => ch._walkVisibleSelf(cb));\n\t\t}\n\n\t\t// visits this node and its visible subtree in visual order:\n\t\t// children marked beforeParent (negative level) render above their parent\n\t\t_walkVisibleSelf(cb: (m: TreeNode) => unknown|void) {\n\t\t\tif (this.visible) {\n\t\t\t\tconst expanded = !this.collapsed;\n\t\t\t\tif (expanded) this._children.forEach(ch => {\n\t\t\t\t\tif (ch.beforeParent) ch._walkVisibleSelf(cb);\n\t\t\t\t});\n\t\t\t\tif (cb(this) !== false && expanded) this._children.forEach(ch => {\n\t\t\t\t\tif (!ch.beforeParent) ch._walkVisibleSelf(cb);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.walkVisible(cb);\n\t\t\t}\n\t\t}\n\n\t\twalkUp(cb: (m: TreeNode) => unknown|void) {\n\t\t\tif (this._parent) {\n\t\t\t\tif (cb(this._parent) !== false) this._parent.walkUp(cb);\n\t\t\t}\n\t\t}\n\n\t\t_sort(comparer: (a: TreeNode, b: TreeNode) => number) {\n\t\t\tif (this.hasChildren) {\n\t\t\t\tthis._children.sort(comparer);\n\t\t\t\tthis._children.forEach(ch => ch._sort(comparer));\n\t\t\t}\n\t\t}\n\n\t\tsort(comparer: (a: TreeNode, b: TreeNode) => number) {\n\t\t\t// use physical index for sorting if one or both nodes are not sortable\n\t\t\tthis._sort((a: TreeNode, b: TreeNode) => a.sortable && b.sortable ? comparer(a, b) : (a.index - b.index));\n\t\t}\n\n\t}\n}\n\nexport type TreeNodeType = Mixin<typeof TreeNodeMixin>;\n\nexport type LevelBasedTreeCreateOptions = {\n\treverse?: boolean,\n}\n\nexport function buildLevelBasedTree(\n\tnodes: TreeNodeType[],\n\troot: TreeNodeType,\n\toptions?: LevelBasedTreeCreateOptions\n): number {\n\ttype OriginalLevel = number;\n\t// [node, originalLevel]\n\t// levels are beeing normalized, so it is necessary to remember the original level during tree building\n\tconst parents: [TreeNodeType, OriginalLevel][] = [[root, -1]];\n\t// negative-level nodes waiting to be adopted by a following node with a lower absolute level;\n\t// fallbackParent/fallbackIndex describe where the node would go under the standard preceding\n\t// rule, in case no such following node exists\n\ttype Pending = { node: TreeNodeType, level: OriginalLevel, fallbackParent: TreeNodeType, fallbackIndex: number };\n\tlet pending: Pending[] = [];\n\tlet prev: TreeNodeType;\n\tlet prevLevel = -1;\n\tlet maxLevel = -1;\n\n\tif (options?.reverse) nodes = [...nodes].reverse();\n\n\tconst updateMaxLevel = (node: TreeNodeType) => {\n\t\tmaxLevel = Math.max(maxLevel, node.level + (node.hasChildren ? 1 : 0));\n\t};\n\n\t// addChild/insertChildren normalize only the direct child's level,\n\t// so grandchildren of an attached pending subtree must be fixed here\n\tconst finalizeSubtree = (node: TreeNodeType) => {\n\t\tupdateMaxLevel(node);\n\t\tnode.walk(ch => {\n\t\t\tch.level = ch.parent.level + 1;\n\t\t\tupdateMaxLevel(ch);\n\t\t});\n\t};\n\n\t// hand deeper pending nodes over to `parent`; attached = parent is already part of the tree\n\tconst adoptPending = (parent: TreeNodeType, level: OriginalLevel, attached: boolean) => {\n\t\tconst adopted = pending.filter(p => p.level > level);\n\t\tif (adopted.length === 0) return;\n\t\tpending = pending.filter(p => p.level <= level);\n\t\tadopted.forEach(p => {\n\t\t\tparent.addChild(p.node);\n\t\t\tp.node._beforeParent = true;\n\t\t\tif (attached) finalizeSubtree(p.node);\n\t\t});\n\t};\n\n\t// the parent this node would get under the standard preceding rule (non-mutating);\n\t// prev is not on the stack yet, so it must be considered first\n\tconst findPrecedingParent = (nodeLevel: OriginalLevel): TreeNodeType => {\n\t\tif (prev && prevLevel < nodeLevel) return prev;\n\t\tfor (let i = parents.length - 1; i >= 0; i--) {\n\t\t\tif (parents[i][1] < nodeLevel) return parents[i][0];\n\t\t}\n\t\treturn root;\n\t};\n\n\troot._children = [];\n\troot._parent = null;\n\tnodes.forEach(node => {\n\t\tnode._children = [];\n\t\tnode._parent = null;\n\t\tnode._beforeParent = false;\n\n\t\tconst nodeLevel = Math.abs(node.level) + root.level + 1;\n\t\tif (node.level < 0) {\n\t\t\t// parent is the nearest FOLLOWING node with a lower absolute level;\n\t\t\t// negative nodes are transparent to the preceding rule (prev/stack untouched)\n\t\t\tconst fallbackParent = findPrecedingParent(nodeLevel);\n\t\t\tadoptPending(node, nodeLevel, false);\n\t\t\tpending.push({ node, level: nodeLevel, fallbackParent, fallbackIndex: fallbackParent.children.length });\n\t\t} else {\n\t\t\tif (prev && prevLevel < nodeLevel) parents.push([prev, prevLevel]);\n\t\t\twhile (parents.length > 1 && parents[parents.length - 1][1] >= nodeLevel) parents.pop();\n\t\t\tprevLevel = nodeLevel;\n\t\t\tparents[parents.length - 1][0].addChild(node);\n\t\t\tupdateMaxLevel(node);\n\t\t\tadoptPending(node, nodeLevel, true);\n\t\t\tprev = node;\n\t\t}\n\t});\n\n\t// orphans: no following node with a lower absolute level -> fall back to the preceding\n\t// rule, inserted at the position they would have occupied (before later siblings)\n\tconst insertedCount = new Map<TreeNodeType, number>();\n\tpending.forEach(p => {\n\t\tconst offset = insertedCount.get(p.fallbackParent) || 0;\n\t\tp.fallbackParent.insertChildren([p.node], p.fallbackIndex + offset);\n\t\tinsertedCount.set(p.fallbackParent, offset + 1);\n\t\tfinalizeSubtree(p.node);\n\t});\n\treturn maxLevel;\n}\n\nexport function buildParentBasedTree(nodes: TreeNodeType[], root: TreeNodeType): number {\n\tlet maxLevel = -1;\n\tnodes.forEach(node => {\n\t\t(node.parentIndex == null ? root : nodes[node.parentIndex]).addChild(node);\n\t});\n\troot.walk(node => {\n\t\tnode.level = node.parent ? node.parent.level + 1 : 0;\n\t\tmaxLevel = Math.max(maxLevel, node.level);\n\t});\n\treturn maxLevel;\n}\n\nexport function buildTree(nodes: TreeNodeType[], root: TreeNodeType): number {\n\tif (nodes.length > 0) {\n\t\tif (nodes[0].level == null) {\n\t\t\treturn buildParentBasedTree(nodes, root);\n\t\t} else {\n\t\t\treturn buildLevelBasedTree(nodes, root);\n\t\t}\n\t}\n\treturn -1;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@omegagrid/core",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.82",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"description": "Core components",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@fortawesome/fontawesome-svg-core": "^7.0.1",
|
|
39
|
-
"@omegagrid/localize": "^0.10.
|
|
39
|
+
"@omegagrid/localize": "^0.10.82",
|
|
40
40
|
"color": "^4.2.3",
|
|
41
41
|
"date-fns": "^3.2.0",
|
|
42
42
|
"lit": "^3.1.1",
|