@omegagrid/tree 0.10.2 → 0.10.4

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 (85) hide show
  1. package/dist/adapters/dateAdapter.d.ts +35 -0
  2. package/dist/adapters/dateAdapter.d.ts.map +1 -0
  3. package/dist/adapters/dateAdapter.js +222 -0
  4. package/dist/adapters/dateAdapter.js.map +1 -0
  5. package/dist/adapters/index.d.ts +2 -0
  6. package/dist/adapters/index.d.ts.map +1 -0
  7. package/dist/adapters/index.js +2 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/constants.d.ts +53 -0
  10. package/dist/constants.d.ts.map +1 -0
  11. package/dist/constants.js +11 -0
  12. package/dist/constants.js.map +1 -0
  13. package/dist/index.d.ts +6 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +5 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/model/filterModel.d.ts +17 -0
  18. package/dist/model/filterModel.d.ts.map +1 -0
  19. package/dist/model/filterModel.js +60 -0
  20. package/dist/model/filterModel.js.map +1 -0
  21. package/dist/model/index.d.ts +5 -0
  22. package/dist/model/index.d.ts.map +1 -0
  23. package/dist/model/index.js +5 -0
  24. package/dist/model/index.js.map +1 -0
  25. package/dist/model/nodeModel.d.ts +100 -0
  26. package/dist/model/nodeModel.d.ts.map +1 -0
  27. package/dist/model/nodeModel.js +59 -0
  28. package/dist/model/nodeModel.js.map +1 -0
  29. package/dist/model/selectionModel.d.ts +39 -0
  30. package/dist/model/selectionModel.d.ts.map +1 -0
  31. package/dist/model/selectionModel.js +199 -0
  32. package/dist/model/selectionModel.js.map +1 -0
  33. package/dist/model/treeAdapter.d.ts +10 -0
  34. package/dist/model/treeAdapter.d.ts.map +1 -0
  35. package/dist/model/treeAdapter.js +10 -0
  36. package/dist/model/treeAdapter.js.map +1 -0
  37. package/dist/model/treeModel.d.ts +27 -0
  38. package/dist/model/treeModel.d.ts.map +1 -0
  39. package/dist/model/treeModel.js +97 -0
  40. package/dist/model/treeModel.js.map +1 -0
  41. package/dist/options.d.ts +35 -0
  42. package/dist/options.d.ts.map +1 -0
  43. package/dist/options.js +30 -0
  44. package/dist/options.js.map +1 -0
  45. package/dist/types.d.ts +42 -0
  46. package/dist/types.d.ts.map +1 -0
  47. package/dist/types.js +15 -0
  48. package/dist/types.js.map +1 -0
  49. package/dist/ui/dropdown.d.ts +68 -0
  50. package/dist/ui/dropdown.d.ts.map +1 -0
  51. package/dist/ui/dropdown.js +383 -0
  52. package/dist/ui/dropdown.js.map +1 -0
  53. package/dist/ui/dropdown.style.d.ts +2 -0
  54. package/dist/ui/dropdown.style.d.ts.map +1 -0
  55. package/dist/ui/dropdown.style.js +68 -0
  56. package/dist/ui/dropdown.style.js.map +1 -0
  57. package/dist/ui/index.d.ts +6 -0
  58. package/dist/ui/index.d.ts.map +1 -0
  59. package/dist/ui/index.js +6 -0
  60. package/dist/ui/index.js.map +1 -0
  61. package/dist/ui/levels.d.ts +13 -0
  62. package/dist/ui/levels.d.ts.map +1 -0
  63. package/dist/ui/levels.js +64 -0
  64. package/dist/ui/levels.js.map +1 -0
  65. package/dist/ui/menu.d.ts +14 -0
  66. package/dist/ui/menu.d.ts.map +1 -0
  67. package/dist/ui/menu.js +89 -0
  68. package/dist/ui/menu.js.map +1 -0
  69. package/dist/ui/search.d.ts +18 -0
  70. package/dist/ui/search.d.ts.map +1 -0
  71. package/dist/ui/search.js +92 -0
  72. package/dist/ui/search.js.map +1 -0
  73. package/dist/ui/tree.d.ts +86 -0
  74. package/dist/ui/tree.d.ts.map +1 -0
  75. package/dist/ui/tree.js +482 -0
  76. package/dist/ui/tree.js.map +1 -0
  77. package/dist/ui/tree.renderer.d.ts +7 -0
  78. package/dist/ui/tree.renderer.d.ts.map +1 -0
  79. package/dist/ui/tree.renderer.js +114 -0
  80. package/dist/ui/tree.renderer.js.map +1 -0
  81. package/dist/ui/tree.style.d.ts +3 -0
  82. package/dist/ui/tree.style.d.ts.map +1 -0
  83. package/dist/ui/tree.style.js +147 -0
  84. package/dist/ui/tree.style.js.map +1 -0
  85. package/package.json +3 -3
@@ -0,0 +1,59 @@
1
+ /* eslint-disable no-prototype-builtins */
2
+ import { tree } from '@omegagrid/core';
3
+ export class NodeModel extends tree.TreeNodeMixin() {
4
+ get type() { return this._type; }
5
+ set type(v) { this._type = v; }
6
+ get checkbox() { return this._checkbox; }
7
+ set checkbox(v) { this._checkbox = v; }
8
+ get key() { return this._key; }
9
+ set key(v) { this._key = v; }
10
+ get value() { return this._value; }
11
+ set value(v) { this._value = v; }
12
+ get htmlValue() { return this._htmlValue; }
13
+ set htmlValue(v) { this._htmlValue = v; }
14
+ get icon() { return this._icon; }
15
+ set icon(v) { this._icon = v; }
16
+ get folder() { return this._folder; }
17
+ set folder(v) { this._folder = v; }
18
+ get renderer() { return this._renderer || this.model.options.nodeRenderer; }
19
+ set renderer(v) { this._renderer = v; }
20
+ get properties() { return this._properties; }
21
+ set properties(v) { this._properties = v; }
22
+ constructor(model, source) {
23
+ super();
24
+ this.model = model;
25
+ this.subLevels = null;
26
+ this._checkbox = null;
27
+ this.populate(source);
28
+ }
29
+ populate(source) {
30
+ super.populate(source);
31
+ this.key = source.hasOwnProperty('key') ? source.key : source.k;
32
+ this.value = ((source.hasOwnProperty('value') ? source.value : source.v) ?? '').toString();
33
+ this.type = source.t;
34
+ this.icon = source.icon;
35
+ this.folder = source.folder;
36
+ this.checkbox = source.ch ?? null;
37
+ this.renderer = source.renderer;
38
+ this._properties = source.props;
39
+ }
40
+ getSourceData() {
41
+ const data = super.getSourceData();
42
+ if (this.key)
43
+ data.k = this.key;
44
+ if (this.value)
45
+ data.v = this.value;
46
+ if (this.type)
47
+ data.t = this.type;
48
+ if (this.icon)
49
+ data.icon = this.icon;
50
+ if (this.folder)
51
+ data.folder = this.folder;
52
+ if (this.checkbox != null)
53
+ data.ch = this.checkbox;
54
+ if (this.properties)
55
+ data.props = this.properties;
56
+ return data;
57
+ }
58
+ }
59
+ //# sourceMappingURL=nodeModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeModel.js","sourceRoot":"","sources":["../../src/model/nodeModel.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-prototype-builtins */\n\nimport { CustomProperties, IconSpec, tree } from '@omegagrid/core';\nimport { FolderOptions, TreeNodeRenderer } from '../types';\nimport { TreeModel } from './treeModel';\n\nexport type NodeSource = {\n\tk?: string,\n\tv?: string,\n\tkey?: string,\n\tvalue?: string,\n\tt?: string,\n\ts?: boolean,\n\tch?: boolean,\n\ticon?: IconSpec|string,\n\tfolder?: FolderOptions,\n\tprops?: CustomProperties,\n\trenderer?: TreeNodeRenderer\n} & tree.TreeNodeSource;\n\nexport class NodeModel extends tree.TreeNodeMixin() {\n\tpublic subLevels: number = null;\n\t\n\tprivate _type: string;\n\tget type(): string { return this._type }\n\tset type(v: string) { this._type = v }\n\t\n\tprivate _checkbox: boolean = null;\n\tget checkbox(): boolean { return this._checkbox }\n\tset checkbox(v: boolean) { this._checkbox = v }\n\t\n\tprivate _key: string;\n\tget key(): string { return this._key }\n\tprivate set key(v: string) { this._key = v }\n\t\n\tprivate _value: string;\n\tget value(): string { return this._value }\n\tset value(v: string) { this._value = v}\n\t\n\tprivate _htmlValue: string;\n\tget htmlValue() { return this._htmlValue }\n\tset htmlValue(v: string) { this._htmlValue = v }\n\n\tprivate _icon: IconSpec|string;\n\tget icon(): IconSpec|string { return this._icon }\n\tset icon(v: IconSpec|string) { this._icon = v }\n\n\tprivate _folder: FolderOptions;\n\tget folder(): FolderOptions { return this._folder }\n\tset folder(v: FolderOptions) { this._folder = v }\n\n\tprivate _renderer: TreeNodeRenderer;\n\tget renderer(): TreeNodeRenderer { return this._renderer || this.model.options.nodeRenderer }\n\tset renderer(v: TreeNodeRenderer) { this._renderer = v }\n\n\tprotected _properties: CustomProperties;\n\tget properties() { return this._properties }\n\tset properties(v: CustomProperties) { this._properties = v }\n\n\tconstructor(public model: TreeModel, source: NodeSource) {\n\t\tsuper();\n\t\tthis.populate(source);\n\t}\n\n\tpopulate(source: NodeSource) {\n\t\tsuper.populate(source);\n\t\tthis.key = source.hasOwnProperty('key') ? source.key : source.k;\n\t\tthis.value = ((source.hasOwnProperty('value') ? source.value : source.v) ?? '').toString();\n\t\tthis.type = source.t;\n\t\tthis.icon = source.icon;\n\t\tthis.folder = source.folder;\n\t\tthis.checkbox = source.ch ?? null;\n\t\tthis.renderer = source.renderer;\n\t\tthis._properties = source.props;\n\t}\n\n\tgetSourceData() {\n\t\tconst data = super.getSourceData() as NodeSource;\n\t\tif (this.key) data.k = this.key;\n\t\tif (this.value) data.v = this.value;\n\t\tif (this.type) data.t = this.type;\n\t\tif (this.icon) data.icon = this.icon;\n\t\tif (this.folder) data.folder = this.folder;\n\t\tif (this.checkbox != null) data.ch = this.checkbox;\n\t\tif (this.properties) data.props = this.properties;\n\t\treturn data;\n\t}\n\n}"]}
@@ -0,0 +1,39 @@
1
+ import { NodeModel, NodeSource } from "./nodeModel";
2
+ import { Options } from "../options";
3
+ import { TreeModel } from ".";
4
+ export declare enum NodeSelectionStatus {
5
+ None = 0,
6
+ Checked = 1,
7
+ CheckedByParent = 2,
8
+ Unchecked = 3
9
+ }
10
+ export type SerializedValue = [string, number?, (0 | 1)?, Partial<NodeSource>?];
11
+ export declare function normalizeSerializedValues(data: (string | number | SerializedValue)[]): SerializedValue[];
12
+ export type SelectedItemParams = {
13
+ levels: Map<number, boolean>;
14
+ value?: string;
15
+ };
16
+ export declare class TreeSelectionModel {
17
+ options: Options;
18
+ items: Map<string, SelectedItemParams>;
19
+ model: TreeModel;
20
+ get count(): number;
21
+ constructor(options: Options, sourceData?: SerializedValue[]);
22
+ ensureItem(key: string, value?: string): SelectedItemParams;
23
+ setItems(items: SerializedValue[]): void;
24
+ populate(sourceData: SerializedValue[]): void;
25
+ getPropertySerializer(serializedProps?: (keyof NodeSource)[]): (nodeKey: string, params: SelectedItemParams) => Record<string, unknown>;
26
+ serialize(serializedProps?: (keyof NodeSource)[]): SerializedValue[];
27
+ clear(): void;
28
+ validateChange(node: NodeModel, level: number, value: boolean): boolean;
29
+ toggle(node: NodeModel, level: number): this;
30
+ select(node: NodeModel, level: number, value?: boolean | null): this;
31
+ deselect(node: NodeModel, level: number): this;
32
+ clearItemSelection(node: NodeModel): void;
33
+ getLevelSelection(node: NodeModel): Map<number, boolean>;
34
+ getValue(node: NodeModel, level: number, defaultValue?: boolean): boolean;
35
+ isSelectedByParent(node: NodeModel): boolean;
36
+ getSelectionStatus(node: NodeModel): NodeSelectionStatus;
37
+ toggleChildNodes(node: NodeModel, level: number): void;
38
+ }
39
+ //# sourceMappingURL=selectionModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectionModel.d.ts","sourceRoot":"","sources":["../../src/model/selectionModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC;AAK9B,oBAAY,mBAAmB;IAC9B,IAAI,IAAI;IACR,OAAO,IAAI;IACX,eAAe,IAAI;IACnB,SAAS,IAAI;CACb;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAE9E,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,CAAC,MAAM,GAAC,MAAM,GAAC,eAAe,CAAC,EAAE,qBAKhF;AAED,MAAM,MAAM,kBAAkB,GAAG;IAChC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;CACd,CAAC;AAEF,qBAAa,kBAAkB;IASX,OAAO,EAAE,OAAO;IAPnC,KAAK,kCAAyC;IAC9C,KAAK,EAAE,SAAS,CAAC;IAEjB,IAAI,KAAK,WAER;gBAEkB,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,eAAe,EAAE;IAMnE,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAOtC,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE;IAIjC,QAAQ,CAAC,UAAU,EAAE,eAAe,EAAE;IAWtC,qBAAqB,CAAC,eAAe,CAAC,EAAE,CAAC,MAAM,UAAU,CAAC,EAAE,IACnD,SAAS,MAAM,EAAE,QAAQ,kBAAkB;IAUpD,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC,MAAM,UAAU,CAAC,EAAE;IAahD,KAAK;IAIL,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAS7D,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM;IAmCrC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,OAAO,GAAC,IAAW;IAgBjE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM;IAUvC,kBAAkB,CAAC,IAAI,EAAE,SAAS;IAIlC,iBAAiB,CAAC,IAAI,EAAE,SAAS;IAMjC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,GAAE,OAAc;IAOrE,kBAAkB,CAAC,IAAI,EAAE,SAAS;IAYlC,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,mBAAmB;IAaxD,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM;CAgB/C"}
@@ -0,0 +1,199 @@
1
+ import { SelectMode } from "../types";
2
+ const getMapValue = (map, key, defaultValue = null) => map.has(key) ? map.get(key) : defaultValue;
3
+ export var NodeSelectionStatus;
4
+ (function (NodeSelectionStatus) {
5
+ NodeSelectionStatus[NodeSelectionStatus["None"] = 0] = "None";
6
+ NodeSelectionStatus[NodeSelectionStatus["Checked"] = 1] = "Checked";
7
+ NodeSelectionStatus[NodeSelectionStatus["CheckedByParent"] = 2] = "CheckedByParent";
8
+ NodeSelectionStatus[NodeSelectionStatus["Unchecked"] = 3] = "Unchecked";
9
+ })(NodeSelectionStatus || (NodeSelectionStatus = {}));
10
+ export function normalizeSerializedValues(data) {
11
+ return data.map(item => {
12
+ if (Array.isArray(item))
13
+ return item;
14
+ return [item.toString(), 0, 1];
15
+ });
16
+ }
17
+ export class TreeSelectionModel {
18
+ get count() {
19
+ return this.items.size;
20
+ }
21
+ constructor(options, sourceData) {
22
+ this.options = options;
23
+ this.items = new Map();
24
+ if (sourceData) {
25
+ this.populate(sourceData);
26
+ }
27
+ }
28
+ ensureItem(key, value) {
29
+ if (!this.items.has(key))
30
+ this.items.set(key, { levels: new Map() });
31
+ const item = this.items.get(key);
32
+ if (value != null)
33
+ item.value = value;
34
+ return item;
35
+ }
36
+ setItems(items) {
37
+ this.populate(items ?? []);
38
+ }
39
+ populate(sourceData) {
40
+ const oldItems = this.items;
41
+ this.items = new Map();
42
+ sourceData.forEach(sourceItem => {
43
+ const value = sourceItem[3]?.v ?? sourceItem[3]?.value ?? oldItems.get(sourceItem[0])?.value;
44
+ const item = this.ensureItem(sourceItem[0], value);
45
+ item.levels.set(sourceItem[1] ?? 0, (sourceItem[2] ?? 1) == 1);
46
+ if (sourceItem[3])
47
+ Object.assign(item, sourceItem[3]);
48
+ });
49
+ }
50
+ getPropertySerializer(serializedProps) {
51
+ return (nodeKey, params) => serializedProps.reduce((acc, key) => {
52
+ if (key == 'v' || key == 'value') {
53
+ acc[key] = params.value ?? this.model?.nodeMap.get(nodeKey)?.value;
54
+ }
55
+ else {
56
+ acc[key] = this.model?.nodeMap.get(nodeKey)?.value;
57
+ }
58
+ return acc;
59
+ }, {});
60
+ }
61
+ serialize(serializedProps) {
62
+ const items = [];
63
+ const propertySerializer = serializedProps?.length ? this.getPropertySerializer(serializedProps) : null;
64
+ this.items.forEach((item, key) => {
65
+ const props = propertySerializer ? propertySerializer(key, item) : null;
66
+ item.levels.forEach((value, level) => items.push(props
67
+ ? [key, level, value ? 1 : 0, props]
68
+ : [key, level, value ? 1 : 0]));
69
+ });
70
+ return items;
71
+ }
72
+ clear() {
73
+ this.items.clear();
74
+ }
75
+ validateChange(node, level, value) {
76
+ if (this.options.selectMode == SelectMode.Single) {
77
+ if (value === false && this.items.size == 1) {
78
+ return false;
79
+ }
80
+ }
81
+ return true;
82
+ }
83
+ toggle(node, level) {
84
+ let item = this.ensureItem(node.key, node.value);
85
+ const currentValue = item.levels.has(level) ? item.levels.get(level) : null;
86
+ if (!this.validateChange(node, level, item.levels.has(level) ? !item.levels.get(level) : true))
87
+ return this;
88
+ if (currentValue) {
89
+ item.levels.delete(level);
90
+ }
91
+ else if (this.options.selectMode == SelectMode.MultipleLevels) {
92
+ if (level == 0 && this.isSelectedByParent(node)) {
93
+ if (currentValue === false) {
94
+ item.levels.delete(0);
95
+ }
96
+ else {
97
+ item.levels.set(0, false);
98
+ }
99
+ }
100
+ else {
101
+ item.levels.set(level, true);
102
+ }
103
+ }
104
+ else {
105
+ if (this.options.selectMode == SelectMode.Single) {
106
+ this.clear();
107
+ item = this.ensureItem(node.key, node.value);
108
+ }
109
+ if (level == 0) {
110
+ item.levels.set(0, true);
111
+ }
112
+ else {
113
+ this.toggleChildNodes(node, level);
114
+ }
115
+ }
116
+ if (item.levels.size == 0)
117
+ this.clearItemSelection(node);
118
+ return this;
119
+ }
120
+ select(node, level, value = true) {
121
+ const item = this.ensureItem(node.key, node.value);
122
+ if (!this.validateChange(node, level, value === null ? (item.levels.has(level) ? item.levels.get(level) : false) : value))
123
+ return this;
124
+ if (value === true) {
125
+ item.levels.set(level, true);
126
+ }
127
+ else if (value === false && this.options.selectMode == SelectMode.MultipleLevels) {
128
+ item.levels.set(level, false);
129
+ }
130
+ else {
131
+ item.levels.delete(level);
132
+ }
133
+ if (item.levels.size == 0)
134
+ this.clearItemSelection(node);
135
+ return this;
136
+ }
137
+ deselect(node, level) {
138
+ if (!this.validateChange(node, level, false))
139
+ return this;
140
+ if (this.items.has(node.key)) {
141
+ this.items.get(node.key).levels.delete(level);
142
+ if (this.items.get(node.key).levels.size == 0)
143
+ this.clearItemSelection(node);
144
+ }
145
+ return this;
146
+ }
147
+ clearItemSelection(node) {
148
+ this.items.delete(node.key);
149
+ }
150
+ getLevelSelection(node) {
151
+ return this.items.has(node.key)
152
+ ? this.items.get(node.key).levels
153
+ : new Map();
154
+ }
155
+ getValue(node, level, defaultValue = null) {
156
+ if (this.items.has(node.key)) {
157
+ return getMapValue(this.items.get(node.key).levels, level, defaultValue);
158
+ }
159
+ return defaultValue;
160
+ }
161
+ isSelectedByParent(node) {
162
+ let parent = node.parent;
163
+ let levelSpan = 0;
164
+ while (parent) {
165
+ if (this.getValue(parent, ++levelSpan, false)) {
166
+ return true;
167
+ }
168
+ parent = parent.parent;
169
+ }
170
+ return false;
171
+ }
172
+ getSelectionStatus(node) {
173
+ const value = this.getValue(node, 0, null);
174
+ if (value === true) {
175
+ return NodeSelectionStatus.Checked;
176
+ }
177
+ else if (value === false) {
178
+ return NodeSelectionStatus.Unchecked;
179
+ }
180
+ else if (this.options.selectMode == SelectMode.MultipleLevels && this.isSelectedByParent(node)) {
181
+ return NodeSelectionStatus.CheckedByParent;
182
+ }
183
+ return NodeSelectionStatus.None;
184
+ }
185
+ toggleChildNodes(node, level) {
186
+ const parentLevel = node.level;
187
+ let value = null;
188
+ node.walk((n) => {
189
+ if (n.level - parentLevel == level) {
190
+ if (value === null) {
191
+ value = this.getSelectionStatus(n) != NodeSelectionStatus.Checked;
192
+ }
193
+ this.select(n, 0, value ? true : null);
194
+ return false;
195
+ }
196
+ });
197
+ }
198
+ }
199
+ //# sourceMappingURL=selectionModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectionModel.js","sourceRoot":"","sources":["../../src/model/selectionModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeModel, NodeSource } from \"./nodeModel\";\nimport { Options } from \"../options\";\nimport { SelectMode } from \"../types\";\nimport { TreeModel } from \".\";\n\nconst getMapValue = <TKey, TValue>(map: Map<TKey, TValue>, key: TKey, defaultValue: TValue = null) =>\n\tmap.has(key) ? map.get(key) : defaultValue;\n\nexport enum NodeSelectionStatus {\n\tNone = 0,\n\tChecked = 1,\n\tCheckedByParent = 2,\n\tUnchecked = 3\n}\n\nexport type SerializedValue = [string, number?, (0|1)?, Partial<NodeSource>?];\n\nexport function normalizeSerializedValues(data: (string|number|SerializedValue)[]) {\n\treturn data.map<SerializedValue>(item => {\n\t\tif (Array.isArray(item)) return item;\n\t\treturn [item.toString(), 0, 1];\n\t});\n}\n\nexport type SelectedItemParams = {\n\tlevels: Map<number, boolean>,\n\tvalue?: string\n};\n\nexport class TreeSelectionModel {\n\n\titems = new Map<string, SelectedItemParams>();\n\tmodel: TreeModel;\n\n\tget count() {\n\t\treturn this.items.size;\n\t}\n\n\tconstructor(public options: Options, sourceData?: SerializedValue[]) {\n\t\tif (sourceData) {\n\t\t\tthis.populate(sourceData);\n\t\t}\n\t}\n\n\tensureItem(key: string, value?: string) {\n\t\tif (!this.items.has(key)) this.items.set(key, {levels: new Map<number, boolean>()});\n\t\tconst item = this.items.get(key);\n\t\tif (value != null) item.value = value;\n\t\treturn item;\t\n\t}\n\n\tsetItems(items: SerializedValue[]) {\n\t\tthis.populate(items ?? []);\n\t}\n\n\tpopulate(sourceData: SerializedValue[]) {\n\t\tconst oldItems = this.items;\n\t\tthis.items = new Map();\n\t\tsourceData.forEach(sourceItem => {\n\t\t\tconst value = sourceItem[3]?.v ?? sourceItem[3]?.value ?? oldItems.get(sourceItem[0])?.value;\n\t\t\tconst item = this.ensureItem(sourceItem[0], value);\n\t\t\titem.levels.set(sourceItem[1] ?? 0, (sourceItem[2] ?? 1) == 1);\n\t\t\tif (sourceItem[3]) Object.assign(item, sourceItem[3]);\n\t\t});\n\t}\n\n\tgetPropertySerializer(serializedProps?: (keyof NodeSource)[]) {\n\t\treturn (nodeKey: string, params: SelectedItemParams) => serializedProps.reduce((acc, key) => {\n\t\t\tif (key == 'v' || key == 'value') {\n\t\t\t\tacc[key] = params.value ?? this.model?.nodeMap.get(nodeKey)?.value;\n\t\t\t} else {\n\t\t\t\tacc[key] = this.model?.nodeMap.get(nodeKey)?.value;\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, {} as Record<string, unknown>);\n\t}\n\n\tserialize(serializedProps?: (keyof NodeSource)[]) {\n\t\tconst items: SerializedValue[] = [];\n\t\tconst propertySerializer = serializedProps?.length ? this.getPropertySerializer(serializedProps) : null;\n\t\tthis.items.forEach((item, key) => {\n\t\t\tconst props = propertySerializer ? propertySerializer(key, item) : null;\n\t\t\titem.levels.forEach((value, level) => items.push(props \n\t\t\t\t? [key, level, value ? 1 : 0, props] \n\t\t\t\t: [key, level, value ? 1 : 0]\n\t\t\t));\n\t\t});\n\t\treturn items;\n\t}\n\n\tclear() {\n\t\tthis.items.clear();\n\t}\n\n\tvalidateChange(node: NodeModel, level: number, value: boolean) {\n\t\tif (this.options.selectMode == SelectMode.Single) {\n\t\t\tif (value === false && this.items.size == 1) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\ttoggle(node: NodeModel, level: number) {\n\t\tlet item = this.ensureItem(node.key, node.value);\n\t\tconst currentValue = item.levels.has(level) ? item.levels.get(level) : null;\n\t\t\n\t\tif (!this.validateChange(node, level, item.levels.has(level) ? !item.levels.get(level) : true)) return this;\n\n\t\tif (currentValue) {\n\t\t\titem.levels.delete(level);\n\t\t} else if (this.options.selectMode == SelectMode.MultipleLevels) {\n\t\t\tif (level == 0 && this.isSelectedByParent(node)) {\n\t\t\t\tif (currentValue === false) {\n\t\t\t\t\titem.levels.delete(0);\n\t\t\t\t} else {\n\t\t\t\t\titem.levels.set(0, false);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\titem.levels.set(level, true);\n\t\t\t}\n\t\t} else {\n\t\t\tif (this.options.selectMode == SelectMode.Single) {\n\t\t\t\tthis.clear();\n\t\t\t\titem = this.ensureItem(node.key, node.value);\n\t\t\t}\n\n\t\t\tif (level == 0) {\n\t\t\t\titem.levels.set(0, true);\n\t\t\t} else {\n\t\t\t\tthis.toggleChildNodes(node, level);\n\t\t\t}\n\t\t}\n\n\t\tif (item.levels.size == 0) this.clearItemSelection(node);\n\t\treturn this;\n\t}\n\t\n\tselect(node: NodeModel, level: number, value: boolean|null = true) {\n\t\tconst item = this.ensureItem(node.key, node.value);\n\n\t\tif (!this.validateChange(node, level, value === null ? (item.levels.has(level) ? item.levels.get(level) : false) : value)) return this;\n\n\t\tif (value === true) {\n\t\t\titem.levels.set(level, true);\n\t\t} else if (value === false && this.options.selectMode == SelectMode.MultipleLevels) {\n\t\t\titem.levels.set(level, false);\n\t\t} else {\n\t\t\titem.levels.delete(level);\n\t\t}\n\t\tif (item.levels.size == 0) this.clearItemSelection(node);\n\t\treturn this;\n\t}\n\n\tdeselect(node: NodeModel, level: number) {\n\t\tif (!this.validateChange(node, level, false)) return this;\n\n\t\tif (this.items.has(node.key)) {\n\t\t\tthis.items.get(node.key).levels.delete(level);\n\t\t\tif (this.items.get(node.key).levels.size == 0) this.clearItemSelection(node);\n\t\t}\n\t\treturn this;\n\t}\n\t\n\tclearItemSelection(node: NodeModel) {\n\t\tthis.items.delete(node.key);\n\t}\n\n\tgetLevelSelection(node: NodeModel) {\n\t\treturn this.items.has(node.key)\n\t\t\t? this.items.get(node.key).levels\n\t\t\t: new Map<number, boolean>()\n\t}\n\n\tgetValue(node: NodeModel, level: number, defaultValue: boolean = null) {\n\t\tif (this.items.has(node.key)) {\n\t\t\treturn getMapValue(this.items.get(node.key).levels, level, defaultValue);\n\t\t}\n\t\treturn defaultValue;\n\t}\n\n\tisSelectedByParent(node: NodeModel) {\n\t\tlet parent = node.parent as NodeModel;\n\t\tlet levelSpan = 0;\n\t\twhile (parent) {\n\t\t\tif (this.getValue(parent, ++levelSpan, false)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tparent = parent.parent as NodeModel;\n\t\t}\n\t\treturn false;\n\t}\n\n\tgetSelectionStatus(node: NodeModel): NodeSelectionStatus {\n\t\tconst value = this.getValue(node, 0, null);\n\n\t\tif (value === true) {\n\t\t\treturn NodeSelectionStatus.Checked;\n\t\t} else if (value === false) {\n\t\t\treturn NodeSelectionStatus.Unchecked;\n\t\t} else if (this.options.selectMode == SelectMode.MultipleLevels && this.isSelectedByParent(node)) {\n\t\t\treturn NodeSelectionStatus.CheckedByParent;\n\t\t}\n\t\treturn NodeSelectionStatus.None;\n\t}\n\n\ttoggleChildNodes(node: NodeModel, level: number) {\n\t\tconst parentLevel = node.level;\n\t\tlet value: boolean = null;\n\n\t\tnode.walk((n: NodeModel) => {\n\t\t\tif (n.level - parentLevel == level) {\n\t\t\t\tif (value === null) {\n\t\t\t\t\tvalue = this.getSelectionStatus(n) != NodeSelectionStatus.Checked;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.select(n, 0, value ? true : null)\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n}"]}
@@ -0,0 +1,10 @@
1
+ import { Options } from '../options';
2
+ import { TreeSource } from './treeModel';
3
+ import { ComponentAdapter } from '@omegagrid/core';
4
+ import { Tree } from '../ui';
5
+ import { TreeAdapterParams } from '../types';
6
+ export declare abstract class TreeAdapter extends ComponentAdapter<Tree> {
7
+ abstract getTree(params?: TreeAdapterParams): TreeSource | Promise<TreeSource>;
8
+ getOptions(): Partial<Options> | Promise<Partial<Options>>;
9
+ }
10
+ //# sourceMappingURL=treeAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treeAdapter.d.ts","sourceRoot":"","sources":["../../src/model/treeAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,8BAAsB,WAAY,SAAQ,gBAAgB,CAAC,IAAI,CAAC;IAE/D,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,UAAU,GAAC,OAAO,CAAC,UAAU,CAAC;IAM5E,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,GAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;CAIxD"}
@@ -0,0 +1,10 @@
1
+ import { ComponentAdapter } from '@omegagrid/core';
2
+ export class TreeAdapter extends ComponentAdapter {
3
+ // getItems(_keys: string[]): NodeSource[]|Promise<NodeSource[]> {
4
+ // return [];
5
+ // }
6
+ getOptions() {
7
+ return null;
8
+ }
9
+ }
10
+ //# sourceMappingURL=treeAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treeAdapter.js","sourceRoot":"","sources":["../../src/model/treeAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAInD,MAAM,OAAgB,WAAY,SAAQ,gBAAsB;IAI/D,kEAAkE;IAClE,cAAc;IACd,IAAI;IAEJ,UAAU;QACT,OAAO,IAAI,CAAC;IACb,CAAC;CAED","sourcesContent":["import { Options } from '../options';\nimport { TreeSource } from './treeModel';\nimport { ComponentAdapter } from '@omegagrid/core';\nimport { Tree } from '../ui';\nimport { TreeAdapterParams } from '../types';\n\nexport abstract class TreeAdapter extends ComponentAdapter<Tree> {\n\n\tabstract getTree(params?: TreeAdapterParams): TreeSource|Promise<TreeSource>;\n\n\t// getItems(_keys: string[]): NodeSource[]|Promise<NodeSource[]> {\n\t// \treturn [];\n\t// }\n\n\tgetOptions(): Partial<Options>|Promise<Partial<Options>> {\n\t\treturn null;\n\t}\n\n}"]}
@@ -0,0 +1,27 @@
1
+ import { NodeModel, NodeSource } from "./nodeModel";
2
+ import { Options } from "../options";
3
+ import { NodePlaceholder } from "../types";
4
+ export type TreeSource = NodeSource[];
5
+ export declare class TreeModel {
6
+ options: Options;
7
+ readonly nodeMap: Map<string, NodeModel>;
8
+ private _root;
9
+ private _nodes;
10
+ private _visibleNodes;
11
+ private _maxLevel;
12
+ get maxLevel(): number;
13
+ get root(): NodeModel;
14
+ get nodes(): NodeModel[];
15
+ get visibleNodes(): (NodeModel | NodePlaceholder)[];
16
+ getNodeByViewIndex(index: number): NodeModel | NodePlaceholder;
17
+ constructor(source: TreeSource, options: Options);
18
+ populate(source: TreeSource): void;
19
+ insertNodes(index: number, nodes: number | NodeModel[]): NodeModel[];
20
+ deleteNodes(index: number, count: number): NodeModel[];
21
+ calculateNodeLevels(node: NodeModel): void;
22
+ indexNodes(calculateSubLevels?: boolean): void;
23
+ indexNodesByTree(calculateSubLevels?: boolean): void;
24
+ indexVisibleNodes(): void;
25
+ getSourceData(): NodeSource[];
26
+ }
27
+ //# sourceMappingURL=treeModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treeModel.d.ts","sourceRoot":"","sources":["../../src/model/treeModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC;AAEtC,qBAAa,SAAS;IAgBkB,OAAO,EAAE,OAAO;IAdvD,SAAgB,OAAO,yBAAgC;IAEvD,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,SAAS,CAAM;IAEvB,IAAI,QAAQ,WAA4B;IACxC,IAAI,IAAI,cAAwB;IAChC,IAAI,KAAK,gBAAyB;IAClC,IAAI,YAAY,oCAAgC;IAEhD,kBAAkB,CAAC,KAAK,EAAE,MAAM;gBAEpB,MAAM,EAAE,UAAU,EAAS,OAAO,EAAE,OAAO;IAIvD,QAAQ,CAAC,MAAM,EAAE,UAAU;IAS3B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAC,SAAS,EAAE;IAWpD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IASxC,mBAAmB,CAAC,IAAI,EAAE,SAAS;IAQnC,UAAU,CAAC,kBAAkB,UAAQ;IASrC,gBAAgB,CAAC,kBAAkB,UAAQ;IAe3C,iBAAiB;IAoBjB,aAAa;CAIb"}
@@ -0,0 +1,97 @@
1
+ import { NodeModel } from "./nodeModel";
2
+ import { tree } from '@omegagrid/core';
3
+ export class TreeModel {
4
+ get maxLevel() { return this._maxLevel; }
5
+ get root() { return this._root; }
6
+ get nodes() { return this._nodes; }
7
+ get visibleNodes() { return this._visibleNodes; }
8
+ getNodeByViewIndex(index) { return this.visibleNodes[index]; }
9
+ constructor(source, options) {
10
+ this.options = options;
11
+ this.nodeMap = new Map();
12
+ this._maxLevel = -1;
13
+ this.populate(source);
14
+ }
15
+ populate(source) {
16
+ this._root = new NodeModel(this, { k: null, v: null, i: -1 });
17
+ this._root.level = -1;
18
+ this._nodes = source.map((nodeSource, i) => new NodeModel(this, { ...nodeSource, i: i }));
19
+ this._maxLevel = tree.buildTree(this._nodes, this._root);
20
+ this.indexNodes(true);
21
+ this.indexVisibleNodes();
22
+ }
23
+ insertNodes(index, nodes) {
24
+ const parent = this.nodes[index].parent;
25
+ const count = isNaN(nodes) ? nodes.length : nodes;
26
+ const newNodes = isNaN(nodes) ? nodes : (new Array(count)).fill(null).map(() => new NodeModel(this, {}));
27
+ this.nodes.splice(index, 0, ...newNodes);
28
+ if (this.maxLevel > 0)
29
+ parent.insertChildren(newNodes, index - (parent.index || -1) - 1);
30
+ this.indexNodes();
31
+ this.indexVisibleNodes();
32
+ return newNodes;
33
+ }
34
+ deleteNodes(index, count) {
35
+ const parent = this.nodes[index].parent;
36
+ const deletedNodes = this.nodes.splice(index, count);
37
+ parent?.deleteChildren(deletedNodes);
38
+ this.indexNodes(true);
39
+ this.indexVisibleNodes();
40
+ return deletedNodes;
41
+ }
42
+ calculateNodeLevels(node) {
43
+ let parent = node.parent;
44
+ while (parent) {
45
+ parent.subLevels = Math.max(parent.subLevels, node.level - parent.level + (node.hasChildren ? 1 : 0));
46
+ parent = parent.parent;
47
+ }
48
+ }
49
+ indexNodes(calculateSubLevels = false) {
50
+ this.nodeMap.clear();
51
+ this._nodes.forEach((node, i) => {
52
+ node.index = i;
53
+ this.nodeMap.set(node.key, node);
54
+ if (calculateSubLevels)
55
+ this.calculateNodeLevels(node);
56
+ });
57
+ }
58
+ indexNodesByTree(calculateSubLevels = false) {
59
+ this.nodeMap.clear();
60
+ this._nodes = [];
61
+ let n = 0;
62
+ this.root.walk((node) => {
63
+ node.index = n++;
64
+ node.visibleIndex = null;
65
+ this._nodes.push(node);
66
+ this.nodeMap.set(node.key, node);
67
+ if (calculateSubLevels)
68
+ this.calculateNodeLevels(node);
69
+ });
70
+ this._maxLevel = this.root.subLevels - 1;
71
+ this.indexVisibleNodes();
72
+ }
73
+ indexVisibleNodes() {
74
+ this._visibleNodes = [];
75
+ // perf optimization by distinguishing between paged and non-paged trees
76
+ const pageSize = this.options?.pageSize;
77
+ if (pageSize > 0) {
78
+ this.root.walkVisible((node) => {
79
+ node.visibleIndex = this._visibleNodes.length;
80
+ this._visibleNodes.push(node);
81
+ if (node.parent && node.parent.lastChild === node && node.parent.isPartialyLoaded) {
82
+ this._visibleNodes.push({ placeholder: true, parent: node.parent });
83
+ }
84
+ });
85
+ }
86
+ else {
87
+ this.root.walkVisible((node) => {
88
+ node.visibleIndex = this._visibleNodes.length;
89
+ this._visibleNodes.push(node);
90
+ });
91
+ }
92
+ }
93
+ getSourceData() {
94
+ return this.nodes.map(node => node.getSourceData());
95
+ }
96
+ }
97
+ //# sourceMappingURL=treeModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treeModel.js","sourceRoot":"","sources":["../../src/model/treeModel.ts"],"names":[],"mappings":"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","sourcesContent":["import { NodeModel, NodeSource } from \"./nodeModel\";\nimport { Options } from \"../options\";\nimport { tree } from '@omegagrid/core';\nimport { NodePlaceholder } from \"../types\";\n\nexport type TreeSource = NodeSource[];\n\nexport class TreeModel {\n\n\tpublic readonly nodeMap = new Map<string, NodeModel>();\n\n\tprivate _root: NodeModel;\n\tprivate _nodes: NodeModel[];\n\tprivate _visibleNodes: (NodeModel|NodePlaceholder)[];\n\tprivate _maxLevel = -1;\n\t\n\tget maxLevel() { return this._maxLevel }\n\tget root() { return this._root }\n\tget nodes() { return this._nodes }\n\tget visibleNodes() { return this._visibleNodes }\n\n\tgetNodeByViewIndex(index: number) { return this.visibleNodes[index] }\n\n\tconstructor(source: TreeSource, public options: Options) {\n\t\tthis.populate(source);\n\t}\n\n\tpopulate(source: TreeSource) {\n\t\tthis._root = new NodeModel(this, {k: null, v: null, i: -1});\n\t\tthis._root.level = -1;\n\t\tthis._nodes = source.map((nodeSource, i) => new NodeModel(this, {...nodeSource, i: i}));\n\t\tthis._maxLevel = tree.buildTree(this._nodes, this._root);\n\t\tthis.indexNodes(true);\n\t\tthis.indexVisibleNodes();\n\t}\n\n\tinsertNodes(index: number, nodes: number|NodeModel[]) {\n\t\tconst parent = this.nodes[index].parent;\n\t\tconst count = isNaN(nodes as number) ? (nodes as NodeModel[]).length : nodes as number;\n\t\tconst newNodes = isNaN(nodes as number) ? (nodes as NodeModel[]) : (new Array(count)).fill(null).map(() => new NodeModel(this, {}));\n\t\tthis.nodes.splice(index, 0, ...newNodes);\n\t\tif (this.maxLevel > 0) parent.insertChildren(newNodes, index - (parent.index || -1) - 1);\n\t\tthis.indexNodes();\n\t\tthis.indexVisibleNodes();\n\t\treturn newNodes;\n\t}\n\n\tdeleteNodes(index: number, count: number) {\n\t\tconst parent = this.nodes[index].parent;\n\t\tconst deletedNodes = this.nodes.splice(index, count);\n\t\tparent?.deleteChildren(deletedNodes);\n\t\tthis.indexNodes(true);\n\t\tthis.indexVisibleNodes();\n\t\treturn deletedNodes;\n\t}\n\n\tcalculateNodeLevels(node: NodeModel) {\n\t\tlet parent = node.parent as NodeModel;\n\t\twhile (parent) {\n\t\t\tparent.subLevels = Math.max(parent.subLevels, node.level - parent.level + (node.hasChildren ? 1 : 0));\n\t\t\tparent = parent.parent as NodeModel;\n\t\t}\n\t}\n\n\tindexNodes(calculateSubLevels = false) {\n\t\tthis.nodeMap.clear();\n\t\tthis._nodes.forEach((node, i) => {\n\t\t\tnode.index = i;\n\t\t\tthis.nodeMap.set(node.key, node);\n\t\t\tif (calculateSubLevels) this.calculateNodeLevels(node);\n\t\t});\n\t}\n\n\tindexNodesByTree(calculateSubLevels = false) {\n\t\tthis.nodeMap.clear();\n\t\tthis._nodes = [];\n\t\tlet n = 0;\n\t\tthis.root.walk((node: NodeModel) => {\n\t\t\tnode.index = n++;\n\t\t\tnode.visibleIndex = null;\n\t\t\tthis._nodes.push(node);\n\t\t\tthis.nodeMap.set(node.key, node);\n\t\t\tif (calculateSubLevels) this.calculateNodeLevels(node);\n\t\t});\n\t\tthis._maxLevel = this.root.subLevels - 1;\n\t\tthis.indexVisibleNodes();\n\t}\n\n\tindexVisibleNodes() {\n\t\tthis._visibleNodes = [];\n\t\t// perf optimization by distinguishing between paged and non-paged trees\n\t\tconst pageSize = this.options?.pageSize;\n\t\tif (pageSize > 0) {\n\t\t\tthis.root.walkVisible((node: NodeModel) => {\n\t\t\t\tnode.visibleIndex = this._visibleNodes.length;\n\t\t\t\tthis._visibleNodes.push(node);\n\t\t\t\tif (node.parent && node.parent.lastChild === node && node.parent.isPartialyLoaded) {\n\t\t\t\t\tthis._visibleNodes.push({placeholder: true, parent: node.parent} as NodePlaceholder);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.root.walkVisible((node: NodeModel) => {\n\t\t\t\tnode.visibleIndex = this._visibleNodes.length;\n\t\t\t\tthis._visibleNodes.push(node);\n\t\t\t});\n\t\t}\n\t}\n\n\tgetSourceData() {\n\t\treturn this.nodes.map(node => node.getSourceData());\n\t}\n\n}"]}
@@ -0,0 +1,35 @@
1
+ import { CommonOptions } from "@omegagrid/core";
2
+ import { NodeModel } from "./model/nodeModel";
3
+ import { FolderOptions, ItemProperty, ItemTypeOptions, SelectMode } from "./types";
4
+ import { TemplateResult } from "lit-html";
5
+ import { CSSResultOrNative } from "lit";
6
+ import { SelectedItemParams } from "./model";
7
+ export type Options = {
8
+ alwaysRefresh?: boolean;
9
+ nodeHeight?: number;
10
+ renderingNodeTreshold?: number;
11
+ selectMode?: SelectMode | string;
12
+ levelIndent?: number;
13
+ maxLevel?: number;
14
+ globalLevels?: boolean;
15
+ levelsAlwaysVisible?: boolean;
16
+ checkboxes?: boolean;
17
+ expanders?: boolean;
18
+ allowEmpty?: boolean;
19
+ autoClose?: boolean;
20
+ search?: boolean;
21
+ fileDrop?: boolean;
22
+ pageSize?: number;
23
+ customSearch?: boolean;
24
+ folderOptions?: FolderOptions;
25
+ itemProperties?: ItemProperty[];
26
+ itemTypeOptions?: Record<string, ItemTypeOptions>;
27
+ customStyle?: CSSResultOrNative | string | (CSSResultOrNative | string)[];
28
+ nodeRenderer?: (div: HTMLDivElement, node: NodeModel) => string | TemplateResult<1> | void;
29
+ afterRenderer?: (div: HTMLDivElement, node: NodeModel) => void;
30
+ } & CommonOptions;
31
+ export type TreeDropdownOptions = Options & {
32
+ textRenderer?: (selectedItems: Map<string, SelectedItemParams>) => string | TemplateResult<1>;
33
+ };
34
+ export declare function initOptions(options?: Partial<Options>, origOptions?: Options): Options;
35
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,KAAK,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,MAAM,OAAO,GAAG;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,UAAU,CAAC,EAAE,UAAU,GAAC,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAClD,WAAW,CAAC,EAAE,iBAAiB,GAAC,MAAM,GAAC,CAAC,iBAAiB,GAAC,MAAM,CAAC,EAAE,CAAC;IACpE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,KAAK,MAAM,GAAC,cAAc,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC;IACvF,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAA;CAC9D,GAAG,aAAa,CAAC;AAElB,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG;IAC3C,YAAY,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,KAAK,MAAM,GAAC,cAAc,CAAC,CAAC,CAAC,CAAA;CAC3F,CAAA;AAqBD,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,GAAE,OAAc,GAAG,OAAO,CAO5F"}
@@ -0,0 +1,30 @@
1
+ import constants from "./constants";
2
+ import { initCommonOptions } from "@omegagrid/core";
3
+ import { SelectMode } from "./types";
4
+ const DEFAULT_OPTIONS = {
5
+ nodeHeight: constants.DEFAULT_NODE_HEIGHT,
6
+ renderingNodeTreshold: constants.RENDERING_NODE_TRESHOLD,
7
+ selectMode: SelectMode.MultipleLevels,
8
+ levelIndent: 10,
9
+ maxLevel: null,
10
+ globalLevels: true,
11
+ levelsAlwaysVisible: true,
12
+ allowEmpty: true,
13
+ itemProperties: [],
14
+ itemTypeOptions: {},
15
+ expanders: true,
16
+ search: false,
17
+ checkboxes: true,
18
+ autoClose: false,
19
+ folderOptions: null,
20
+ alwaysRefresh: false
21
+ };
22
+ export function initOptions(options, origOptions = null) {
23
+ return {
24
+ ...initCommonOptions(options, origOptions),
25
+ ...DEFAULT_OPTIONS,
26
+ ...origOptions,
27
+ ...options,
28
+ };
29
+ }
30
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAgD,UAAU,EAAE,MAAM,SAAS,CAAC;AAkCnF,MAAM,eAAe,GAAqB;IACzC,UAAU,EAAE,SAAS,CAAC,mBAAmB;IACzC,qBAAqB,EAAE,SAAS,CAAC,uBAAuB;IACxD,UAAU,EAAE,UAAU,CAAC,cAAc;IACrC,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE,IAAI;IACd,YAAY,EAAE,IAAI;IAClB,mBAAmB,EAAE,IAAI;IACzB,UAAU,EAAE,IAAI;IAChB,cAAc,EAAE,EAAE;IAClB,eAAe,EAAE,EAAE;IACnB,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,KAAK;IACb,UAAU,EAAE,IAAI;IAChB,SAAS,EAAE,KAAK;IAChB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,KAAK;CACpB,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,OAA0B,EAAE,cAAuB,IAAI;IAClF,OAAO;QACN,GAAG,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC;QAC1C,GAAG,eAAe;QAClB,GAAG,WAAW;QACd,GAAG,OAAO;KACV,CAAC;AACH,CAAC","sourcesContent":["import constants from \"./constants\";\nimport { initCommonOptions, CommonOptions } from \"@omegagrid/core\";\nimport { NodeModel } from \"./model/nodeModel\";\nimport { FolderOptions, ItemProperty, ItemTypeOptions, SelectMode } from \"./types\";\nimport { TemplateResult } from \"lit-html\";\nimport { CSSResultOrNative } from \"lit\";\nimport { SelectedItemParams } from \"./model\";\n\nexport type Options = {\n\talwaysRefresh?: boolean,\n\tnodeHeight?: number,\n\trenderingNodeTreshold?: number,\n\tselectMode?: SelectMode|string,\n\tlevelIndent?: number,\n\tmaxLevel?: number,\n\tglobalLevels?: boolean,\n\tlevelsAlwaysVisible?: boolean,\n\tcheckboxes?: boolean,\n\texpanders?: boolean,\n\tallowEmpty?: boolean,\n\tautoClose?: boolean,\n\tsearch?: boolean,\n\tfileDrop?: boolean,\n\tpageSize?: number,\n\tcustomSearch?: boolean,\n\tfolderOptions?: FolderOptions,\n\titemProperties?: ItemProperty[],\n\titemTypeOptions?: Record<string, ItemTypeOptions>,\n\tcustomStyle?: CSSResultOrNative|string|(CSSResultOrNative|string)[],\n\tnodeRenderer?: (div: HTMLDivElement, node: NodeModel) => string|TemplateResult<1>|void,\n\tafterRenderer?: (div: HTMLDivElement, node: NodeModel) => void\n} & CommonOptions;\n\nexport type TreeDropdownOptions = Options & {\n\ttextRenderer?: (selectedItems: Map<string, SelectedItemParams>) => string|TemplateResult<1>\n}\n\nconst DEFAULT_OPTIONS: Partial<Options> = {\n\tnodeHeight: constants.DEFAULT_NODE_HEIGHT,\n\trenderingNodeTreshold: constants.RENDERING_NODE_TRESHOLD,\n\tselectMode: SelectMode.MultipleLevels,\n\tlevelIndent: 10,\n\tmaxLevel: null,\n\tglobalLevels: true,\n\tlevelsAlwaysVisible: true,\n\tallowEmpty: true,\n\titemProperties: [],\n\titemTypeOptions: {},\n\texpanders: true,\n\tsearch: false,\n\tcheckboxes: true,\n\tautoClose: false,\n\tfolderOptions: null,\n\talwaysRefresh: false\n};\n\nexport function initOptions(options?: Partial<Options>, origOptions: Options = null): Options {\n\treturn {\n\t\t...initCommonOptions(options, origOptions),\n\t\t...DEFAULT_OPTIONS,\n\t\t...origOptions,\n\t\t...options,\n\t};\n}"]}