igniteui-webcomponents 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +6 -1
  3. package/components/button/button-base.d.ts +5 -0
  4. package/components/button/button-base.js +4 -0
  5. package/components/button/button-base.js.map +1 -1
  6. package/components/button/icon-button.js +10 -8
  7. package/components/button/icon-button.js.map +1 -1
  8. package/components/button/themes/button/light/button.base.css.js +1 -1
  9. package/components/button/themes/button/light/button.base.css.js.map +1 -1
  10. package/components/button/themes/button/light/button.material.css.js +1 -1
  11. package/components/button/themes/button/light/button.material.css.js.map +1 -1
  12. package/components/button/themes/icon-button/light/icon-button.base.css.js +1 -1
  13. package/components/button/themes/icon-button/light/icon-button.base.css.js.map +1 -1
  14. package/components/button/themes/icon-button/light/icon-button.bootstrap.css.js +1 -1
  15. package/components/button/themes/icon-button/light/icon-button.bootstrap.css.js.map +1 -1
  16. package/components/button/themes/icon-button/light/icon-button.fluent.css.js +1 -1
  17. package/components/button/themes/icon-button/light/icon-button.fluent.css.js.map +1 -1
  18. package/components/button/themes/icon-button/light/icon-button.indigo.css.js +1 -1
  19. package/components/button/themes/icon-button/light/icon-button.indigo.css.js.map +1 -1
  20. package/components/button/themes/icon-button/light/icon-button.material.css.js +1 -1
  21. package/components/button/themes/icon-button/light/icon-button.material.css.js.map +1 -1
  22. package/components/calendar/common/calendar-base.js +16 -12
  23. package/components/calendar/common/calendar-base.js.map +1 -1
  24. package/components/checkbox/themes/light/switch.base.css.js +1 -1
  25. package/components/checkbox/themes/light/switch.base.css.js.map +1 -1
  26. package/components/common/definitions/defineAllComponents.js +8 -0
  27. package/components/common/definitions/defineAllComponents.js.map +1 -1
  28. package/components/expansion-panel/expansion-panel.d.ts +72 -0
  29. package/components/expansion-panel/expansion-panel.js +167 -0
  30. package/components/expansion-panel/expansion-panel.js.map +1 -0
  31. package/components/expansion-panel/themes/light/expansion-panel.base.css.d.ts +1 -0
  32. package/components/expansion-panel/themes/light/expansion-panel.base.css.js +3 -0
  33. package/components/expansion-panel/themes/light/expansion-panel.base.css.js.map +1 -0
  34. package/components/expansion-panel/themes/light/expansion-panel.bootstrap.css.d.ts +1 -0
  35. package/components/expansion-panel/themes/light/expansion-panel.bootstrap.css.js +3 -0
  36. package/components/expansion-panel/themes/light/expansion-panel.bootstrap.css.js.map +1 -0
  37. package/components/expansion-panel/themes/light/expansion-panel.fluent.css.d.ts +1 -0
  38. package/components/expansion-panel/themes/light/expansion-panel.fluent.css.js +3 -0
  39. package/components/expansion-panel/themes/light/expansion-panel.fluent.css.js.map +1 -0
  40. package/components/expansion-panel/themes/light/expansion-panel.indigo.css.d.ts +1 -0
  41. package/components/expansion-panel/themes/light/expansion-panel.indigo.css.js +3 -0
  42. package/components/expansion-panel/themes/light/expansion-panel.indigo.css.js.map +1 -0
  43. package/components/form/form.js +10 -2
  44. package/components/form/form.js.map +1 -1
  45. package/components/icon/icon.registry.js +3 -0
  46. package/components/icon/icon.registry.js.map +1 -1
  47. package/components/input/themes/light/input.base.css.js +1 -1
  48. package/components/input/themes/light/input.base.css.js.map +1 -1
  49. package/components/list/themes/light/list.base.css.js +1 -1
  50. package/components/list/themes/light/list.base.css.js.map +1 -1
  51. package/components/mask-input/mask-input.d.ts +102 -0
  52. package/components/mask-input/mask-input.js +260 -0
  53. package/components/mask-input/mask-input.js.map +1 -0
  54. package/components/mask-input/mask-parser.d.ts +30 -0
  55. package/components/mask-input/mask-parser.js +167 -0
  56. package/components/mask-input/mask-parser.js.map +1 -0
  57. package/components/nav-drawer/nav-drawer-item.d.ts +1 -0
  58. package/components/nav-drawer/nav-drawer-item.js +5 -2
  59. package/components/nav-drawer/nav-drawer-item.js.map +1 -1
  60. package/components/nav-drawer/styles/indigo/nav-drawer-item.indigo.css.js +1 -1
  61. package/components/nav-drawer/styles/indigo/nav-drawer-item.indigo.css.js.map +1 -1
  62. package/components/nav-drawer/styles/nav-drawer-item.base.css.js +1 -1
  63. package/components/nav-drawer/styles/nav-drawer-item.base.css.js.map +1 -1
  64. package/components/nav-drawer/styles/nav-drawer.base.css.js +1 -1
  65. package/components/nav-drawer/styles/nav-drawer.base.css.js.map +1 -1
  66. package/components/navbar/navbar.js +2 -1
  67. package/components/navbar/navbar.js.map +1 -1
  68. package/components/navbar/themes/light/navbar.base.css.js +1 -1
  69. package/components/navbar/themes/light/navbar.base.css.js.map +1 -1
  70. package/components/navbar/themes/light/navbar.bootstrap.css.js +1 -1
  71. package/components/navbar/themes/light/navbar.bootstrap.css.js.map +1 -1
  72. package/components/navbar/themes/light/navbar.fluent.css.d.ts +1 -0
  73. package/components/navbar/themes/light/navbar.fluent.css.js +3 -0
  74. package/components/navbar/themes/light/navbar.fluent.css.js.map +1 -0
  75. package/components/rating/rating.base.css.js +1 -1
  76. package/components/rating/rating.base.css.js.map +1 -1
  77. package/components/rating/rating.fluent.css.js +1 -1
  78. package/components/rating/rating.fluent.css.js.map +1 -1
  79. package/components/rating/rating.js +1 -1
  80. package/components/rating/rating.js.map +1 -1
  81. package/components/toggle/toggle.directive.js +5 -4
  82. package/components/toggle/toggle.directive.js.map +1 -1
  83. package/components/tree/themes/dark/tree-item.bootstrap.css.d.ts +1 -0
  84. package/components/tree/themes/dark/tree-item.bootstrap.css.js +3 -0
  85. package/components/tree/themes/dark/tree-item.bootstrap.css.js.map +1 -0
  86. package/components/tree/themes/dark/tree-item.fluent.css.d.ts +1 -0
  87. package/components/tree/themes/dark/tree-item.fluent.css.js +3 -0
  88. package/components/tree/themes/dark/tree-item.fluent.css.js.map +1 -0
  89. package/components/tree/themes/dark/tree-item.indigo.css.d.ts +1 -0
  90. package/components/tree/themes/dark/tree-item.indigo.css.js +3 -0
  91. package/components/tree/themes/dark/tree-item.indigo.css.js.map +1 -0
  92. package/components/tree/themes/light/tree-item.base.css.d.ts +1 -0
  93. package/components/tree/themes/light/tree-item.base.css.js +3 -0
  94. package/components/tree/themes/light/tree-item.base.css.js.map +1 -0
  95. package/components/tree/themes/light/tree-item.bootstrap.css.d.ts +1 -0
  96. package/components/tree/themes/light/tree-item.bootstrap.css.js +3 -0
  97. package/components/tree/themes/light/tree-item.bootstrap.css.js.map +1 -0
  98. package/components/tree/themes/light/tree-item.fluent.css.d.ts +1 -0
  99. package/components/tree/themes/light/tree-item.fluent.css.js +3 -0
  100. package/components/tree/themes/light/tree-item.fluent.css.js.map +1 -0
  101. package/components/tree/themes/light/tree-item.indigo.css.d.ts +1 -0
  102. package/components/tree/themes/light/tree-item.indigo.css.js +3 -0
  103. package/components/tree/themes/light/tree-item.indigo.css.js.map +1 -0
  104. package/components/tree/themes/light/tree.base.css.d.ts +1 -0
  105. package/components/tree/themes/light/tree.base.css.js +3 -0
  106. package/components/tree/themes/light/tree.base.css.js.map +1 -0
  107. package/components/tree/tree-item.d.ts +116 -0
  108. package/components/tree/tree-item.js +447 -0
  109. package/components/tree/tree-item.js.map +1 -0
  110. package/components/tree/tree.common.d.ts +17 -0
  111. package/components/tree/tree.common.js +2 -0
  112. package/components/tree/tree.common.js.map +1 -0
  113. package/components/tree/tree.d.ts +71 -0
  114. package/components/tree/tree.js +139 -0
  115. package/components/tree/tree.js.map +1 -0
  116. package/components/tree/tree.navigation.d.ts +41 -0
  117. package/components/tree/tree.navigation.js +260 -0
  118. package/components/tree/tree.navigation.js.map +1 -0
  119. package/components/tree/tree.selection.d.ts +55 -0
  120. package/components/tree/tree.selection.js +265 -0
  121. package/components/tree/tree.selection.js.map +1 -0
  122. package/custom-elements.json +632 -2
  123. package/index.d.ts +4 -0
  124. package/index.js +4 -0
  125. package/index.js.map +1 -1
  126. package/package.json +2 -2
  127. package/themes/dark/bootstrap.css +1 -1
  128. package/themes/dark/fluent.css +1 -1
  129. package/themes/dark/indigo.css +1 -1
  130. package/themes/light/bootstrap.css +1 -1
  131. package/themes/light/fluent.css +1 -1
  132. package/vscode-html-custom-data.json +313 -45
@@ -0,0 +1,265 @@
1
+ export class IgcTreeSelectionService {
2
+ constructor(tree) {
3
+ this.itemSelection = new Set();
4
+ this.indeterminateItems = new Set();
5
+ this.tree = tree;
6
+ }
7
+ selectMultipleItems(item) {
8
+ if (!this.itemSelection.size) {
9
+ this.selectItem(item);
10
+ return;
11
+ }
12
+ const lastSelectedItemIndex = this.tree.items.indexOf(this.getSelectedItems()[this.itemSelection.size - 1]);
13
+ const currentItemIndex = this.tree.items.indexOf(item);
14
+ const items = this.tree.items.slice(Math.min(currentItemIndex, lastSelectedItemIndex), Math.max(currentItemIndex, lastSelectedItemIndex) + 1);
15
+ const added = items.filter((_item) => !this.isItemSelected(_item));
16
+ const newSelection = this.getSelectedItems().concat(added);
17
+ this.emitItemSelectionEvent(newSelection, added, []);
18
+ }
19
+ selectItem(item) {
20
+ if (this.tree.selection === 'none') {
21
+ return;
22
+ }
23
+ this.emitItemSelectionEvent([...this.getSelectedItems(), item], [item], []);
24
+ }
25
+ deselectItem(item) {
26
+ const newSelection = this.getSelectedItems().filter((_item) => _item !== item);
27
+ this.emitItemSelectionEvent(newSelection, [], [item]);
28
+ }
29
+ clearItemsSelection() {
30
+ const oldSelection = this.getSelectedItems();
31
+ const oldIndeterminate = this.getIndeterminateItems();
32
+ this.itemSelection.clear();
33
+ this.indeterminateItems.clear();
34
+ oldSelection.forEach((i) => (i.selected = false));
35
+ oldIndeterminate.forEach((i) => (i.indeterminate = false));
36
+ }
37
+ isItemSelected(item) {
38
+ return this.itemSelection.has(item);
39
+ }
40
+ isItemIndeterminate(item) {
41
+ return this.indeterminateItems.has(item);
42
+ }
43
+ ensureStateOnItemDelete(item) {
44
+ this.deselectItemsWithNoEvent([item, ...item.getChildren({ flatten: true })], true);
45
+ }
46
+ retriggerItemState(item) {
47
+ if (item.selected) {
48
+ this.itemSelection.delete(item);
49
+ this.selectItemsWithNoEvent([item]);
50
+ }
51
+ else {
52
+ this.itemSelection.add(item);
53
+ this.deselectItemsWithNoEvent([item]);
54
+ }
55
+ }
56
+ emitItemSelectionEvent(newSelection, added, removed) {
57
+ const currSelection = this.getSelectedItems();
58
+ if (this.areEqualCollections(currSelection, newSelection)) {
59
+ return;
60
+ }
61
+ if (this.tree.selection === 'cascade') {
62
+ this.emitCascadeItemSelectionEvent(currSelection, added, removed);
63
+ return;
64
+ }
65
+ const args = {
66
+ detail: {
67
+ newSelection,
68
+ },
69
+ cancelable: true,
70
+ };
71
+ const allowed = this.tree.emitEvent('igcSelection', args);
72
+ if (!allowed) {
73
+ return;
74
+ }
75
+ if (this.areEqualCollections(newSelection, args.detail.newSelection)) {
76
+ this.itemSelection = new Set(newSelection);
77
+ this.updateItemsState(currSelection);
78
+ }
79
+ }
80
+ selectItemsWithNoEvent(items) {
81
+ const oldSelection = this.getSelectedItems();
82
+ if (this.tree && this.tree.selection === 'cascade') {
83
+ this.cascadeSelectItemsWithNoEvent(items, oldSelection);
84
+ return;
85
+ }
86
+ items.forEach((item) => this.itemSelection.add(item));
87
+ this.updateItemsState(oldSelection);
88
+ }
89
+ deselectItemsWithNoEvent(items, onDelete = false) {
90
+ if (this.tree && this.tree.selection === 'cascade') {
91
+ this.cascadeDeselectItemsWithNoEvent(items, onDelete);
92
+ return;
93
+ }
94
+ const itemSet = new Set(items);
95
+ const oldSelection = onDelete
96
+ ? this.getSelectedItems().filter((i) => !itemSet.has(i))
97
+ : this.getSelectedItems();
98
+ if (!items) {
99
+ this.itemSelection.clear();
100
+ }
101
+ else {
102
+ items.forEach((item) => this.itemSelection.delete(item));
103
+ }
104
+ this.updateItemsState(oldSelection);
105
+ }
106
+ emitCascadeItemSelectionEvent(currSelection, added, removed) {
107
+ const oldIndeterminate = this.getIndeterminateItems();
108
+ this.calculateItemsNewSelectionState(currSelection, added, removed);
109
+ const args = {
110
+ detail: {
111
+ newSelection: Array.from(this.itemsToBeSelected),
112
+ },
113
+ cancelable: true,
114
+ };
115
+ const allowed = this.tree.emitEvent('igcSelection', args);
116
+ if (!allowed) {
117
+ return;
118
+ }
119
+ if (this.areEqualCollections(Array.from(this.itemsToBeSelected), args.detail.newSelection)) {
120
+ this.itemSelection = new Set(this.itemsToBeSelected);
121
+ this.indeterminateItems = new Set(this.itemsToBeIndeterminate);
122
+ this.updateItemsState(currSelection, oldIndeterminate);
123
+ }
124
+ }
125
+ cascadeSelectItemsWithNoEvent(items, oldSelection) {
126
+ const oldIndeterminate = this.getIndeterminateItems();
127
+ const newSelection = [...oldSelection, ...items];
128
+ const newSelectionSet = new Set(newSelection);
129
+ const removed = oldSelection.filter((x) => !newSelectionSet.has(x));
130
+ const added = newSelection.filter((x) => !this.itemSelection.has(x));
131
+ this.calculateItemsNewSelectionState(oldSelection, added, removed);
132
+ this.itemSelection = new Set(this.itemsToBeSelected);
133
+ this.indeterminateItems = new Set(this.itemsToBeIndeterminate);
134
+ this.updateItemsState(oldSelection, oldIndeterminate);
135
+ }
136
+ cascadeDeselectItemsWithNoEvent(items, onDelete = false) {
137
+ const itemSet = new Set(items);
138
+ const oldSelection = onDelete
139
+ ? this.getSelectedItems().filter((i) => !itemSet.has(i))
140
+ : this.getSelectedItems();
141
+ const oldIndeterminate = onDelete
142
+ ? this.getIndeterminateItems().filter((i) => !itemSet.has(i))
143
+ : this.getIndeterminateItems();
144
+ if (!items) {
145
+ this.itemSelection.clear();
146
+ this.indeterminateItems.clear();
147
+ }
148
+ else {
149
+ this.calculateItemsNewSelectionState(oldSelection, [], items);
150
+ this.itemSelection = new Set(this.itemsToBeSelected);
151
+ this.indeterminateItems = new Set(this.itemsToBeIndeterminate);
152
+ }
153
+ this.updateItemsState(oldSelection, oldIndeterminate);
154
+ }
155
+ calculateItemsNewSelectionState(oldSelection, added, removed) {
156
+ this.itemsToBeSelected = new Set(oldSelection);
157
+ this.itemsToBeIndeterminate = new Set(this.getIndeterminateItems());
158
+ this.cascadeSelectionState(removed, false);
159
+ this.cascadeSelectionState(added, true);
160
+ }
161
+ cascadeSelectionState(items, selected) {
162
+ if (!items || items.length === 0) {
163
+ return;
164
+ }
165
+ const parents = new Set();
166
+ items.forEach((item) => {
167
+ this.selectDeselectItem(item, selected);
168
+ const itemAndAllChildren = item.getChildren({ flatten: true }) || [];
169
+ itemAndAllChildren.forEach((i) => {
170
+ this.selectDeselectItem(i, selected);
171
+ });
172
+ if (item && item.parent) {
173
+ parents.add(item.parent);
174
+ }
175
+ });
176
+ for (const parent of parents) {
177
+ this.handleParentSelectionState(parent);
178
+ }
179
+ }
180
+ handleParentSelectionState(item) {
181
+ if (!item) {
182
+ return;
183
+ }
184
+ this.handleItemSelectionState(item);
185
+ if (item.parent) {
186
+ this.handleParentSelectionState(item.parent);
187
+ }
188
+ }
189
+ handleItemSelectionState(item) {
190
+ const itemsArray = item && item.getChildren() ? item.getChildren() : [];
191
+ if (itemsArray.length) {
192
+ if (itemsArray.every((i) => this.itemsToBeSelected.has(i))) {
193
+ this.selectDeselectItem(item, true);
194
+ }
195
+ else if (itemsArray.some((i) => this.itemsToBeSelected.has(i) || this.itemsToBeIndeterminate.has(i))) {
196
+ this.selectDeselectItem(item, false, true);
197
+ }
198
+ else {
199
+ this.selectDeselectItem(item, false);
200
+ }
201
+ }
202
+ else {
203
+ if (this.isItemSelected(item)) {
204
+ this.selectDeselectItem(item, true);
205
+ }
206
+ else {
207
+ this.selectDeselectItem(item, false);
208
+ }
209
+ }
210
+ }
211
+ updateItemsState(oldSelection, oldIndeterminate = []) {
212
+ const selected = new Set(oldSelection);
213
+ const indeterminated = new Set(oldIndeterminate);
214
+ this.getSelectedItems().forEach((i) => {
215
+ if (!selected.has(i)) {
216
+ i.selected = true;
217
+ }
218
+ });
219
+ oldSelection.forEach((i) => {
220
+ if (!this.itemSelection.has(i)) {
221
+ i.selected = false;
222
+ }
223
+ });
224
+ if (this.tree.selection === 'cascade') {
225
+ this.indeterminateItems.forEach((i) => {
226
+ if (!indeterminated.has(i)) {
227
+ i.indeterminate = true;
228
+ }
229
+ });
230
+ oldIndeterminate.forEach((i) => {
231
+ if (!this.indeterminateItems.has(i)) {
232
+ i.indeterminate = false;
233
+ }
234
+ });
235
+ }
236
+ }
237
+ getSelectedItems() {
238
+ return this.itemSelection.size ? Array.from(this.itemSelection) : [];
239
+ }
240
+ getIndeterminateItems() {
241
+ return this.indeterminateItems.size
242
+ ? Array.from(this.indeterminateItems)
243
+ : [];
244
+ }
245
+ areEqualCollections(first, second) {
246
+ return (first.length === second.length &&
247
+ new Set(first.concat(second)).size === first.length);
248
+ }
249
+ selectDeselectItem(item, select, indeterminate = false) {
250
+ if (indeterminate) {
251
+ this.itemsToBeIndeterminate.add(item);
252
+ this.itemsToBeSelected.delete(item);
253
+ return;
254
+ }
255
+ if (select) {
256
+ this.itemsToBeSelected.add(item);
257
+ this.itemsToBeIndeterminate.delete(item);
258
+ }
259
+ else {
260
+ this.itemsToBeSelected.delete(item);
261
+ this.itemsToBeIndeterminate.delete(item);
262
+ }
263
+ }
264
+ }
265
+ //# sourceMappingURL=tree.selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.selection.js","sourceRoot":"","sources":["../../../src/components/tree/tree.selection.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,uBAAuB;IASlC,YAAY,IAAsB;QAP1B,kBAAa,GACnB,IAAI,GAAG,EAAwB,CAAC;QAC1B,uBAAkB,GACxB,IAAI,GAAG,EAAwB,CAAC;QAKhC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAGM,mBAAmB,CAAC,IAA0B;QACnD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;YAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO;SACR;QACD,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CACnD,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC,CACrD,CAAC;QACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CACjC,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,EACjD,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,GAAG,CAAC,CACtD,CAAC;QAEF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CACxB,CAAC,KAA2B,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAC7D,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAGM,UAAU,CAAC,IAA0B;QAC1C,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE;YAClC,OAAO;SACR;QACD,IAAI,CAAC,sBAAsB,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC;IAGM,YAAY,CAAC,IAA0B;QAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CACjD,CAAC,KAA2B,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAChD,CAAC;QACF,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;IAGM,mBAAmB;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC7C,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACtD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAChC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAuB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC;QACxE,gBAAgB,CAAC,OAAO,CACtB,CAAC,CAAuB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,KAAK,CAAC,CACvD,CAAC;IACJ,CAAC;IAEM,cAAc,CAAC,IAA0B;QAC9C,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAEM,mBAAmB,CAAC,IAA0B;QACnD,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAGM,uBAAuB,CAAC,IAA0B;QAGvD,IAAI,CAAC,wBAAwB,CAC3B,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAC9C,IAAI,CACL,CAAC;IACJ,CAAC;IAGM,kBAAkB,CAAC,IAA0B;QAClD,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SACrC;aAAM;YACL,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SACvC;IACH,CAAC;IAEO,sBAAsB,CAC5B,YAAoC,EACpC,KAA6B,EAC7B,OAA+B;QAE/B,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,IAAI,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE;YACzD,OAAO;SACR;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;YACrC,IAAI,CAAC,6BAA6B,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAClE,OAAO;SACR;QAED,MAAM,IAAI,GAA0B;YAClC,MAAM,EAAE;gBACN,YAAY;aACb;YACD,UAAU,EAAE,IAAI;SACjB,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO;SACR;QAGD,IAAI,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;YACpE,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;YAC3C,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;SACtC;IACH,CAAC;IAGM,sBAAsB,CAAC,KAA6B;QACzD,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE7C,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;YAClD,IAAI,CAAC,6BAA6B,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;YACxD,OAAO;SACR;QAED,KAAK,CAAC,OAAO,CAAC,CAAC,IAA0B,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAE5E,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAGM,wBAAwB,CAC7B,KAA8B,EAC9B,QAAQ,GAAG,KAAK;QAEhB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;YAClD,IAAI,CAAC,+BAA+B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACtD,OAAO;SACR;QACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,YAAY,GAAG,QAAQ;YAC3B,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAC5B,CAAC,CAAuB,EAAE,EAAE,CAAC,CAAC,OAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAC9C;YACH,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE5B,IAAI,CAAC,KAAK,EAAE;YACV,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;SAC5B;aAAM;YACL,KAAK,CAAC,OAAO,CAAC,CAAC,IAA0B,EAAE,EAAE,CAC3C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAChC,CAAC;SACH;QAED,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAEO,6BAA6B,CACnC,aAAqC,EACrC,KAA6B,EAC7B,OAA+B;QAE/B,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAEtD,IAAI,CAAC,+BAA+B,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAEpE,MAAM,IAAI,GAA0B;YAClC,MAAM,EAAE;gBACN,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;aACjD;YACD,UAAU,EAAE,IAAI;SACjB,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAE1D,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO;SACR;QAGD,IACE,IAAI,CAAC,mBAAmB,CACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAClC,IAAI,CAAC,MAAM,CAAC,YAAY,CACzB,EACD;YACA,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAC1B,IAAI,CAAC,iBAAiB,CACvB,CAAC;YACF,IAAI,CAAC,kBAAkB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC/D,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;SACxD;IACH,CAAC;IAEO,6BAA6B,CACnC,KAA6B,EAC7B,YAAoC;QAEpC,MAAM,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAEtD,MAAM,YAAY,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,KAAK,CAAC,CAAC;QAGjD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,YAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,YAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtE,IAAI,CAAC,+BAA+B,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAEnE,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACrD,IAAI,CAAC,kBAAkB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAE/D,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACxD,CAAC;IAEO,+BAA+B,CACrC,KAA8B,EAC9B,QAAQ,GAAG,KAAK;QAEhB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,YAAY,GAAG,QAAQ;YAC3B,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAC5B,CAAC,CAAuB,EAAE,EAAE,CAAC,CAAC,OAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAC9C;YACH,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,MAAM,gBAAgB,GAAG,QAAQ;YAC/B,CAAC,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,MAAM,CACjC,CAAC,CAAuB,EAAE,EAAE,CAAC,CAAC,OAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAC9C;YACH,CAAC,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAEjC,IAAI,CAAC,KAAK,EAAE;YACV,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;SACjC;aAAM;YACL,IAAI,CAAC,+BAA+B,CAAC,YAAY,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;YAE9D,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAC1B,IAAI,CAAC,iBAAiB,CACvB,CAAC;YACF,IAAI,CAAC,kBAAkB,GAAG,IAAI,GAAG,CAC/B,IAAI,CAAC,sBAAsB,CAC5B,CAAC;SACH;QAED,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACxD,CAAC;IAOO,+BAA+B,CACrC,YAAoC,EACpC,KAA6B,EAC7B,OAA+B;QAE/B,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,CAAuB,YAAY,CAAC,CAAC;QACrE,IAAI,CAAC,sBAAsB,GAAG,IAAI,GAAG,CACnC,IAAI,CAAC,qBAAqB,EAAE,CAC7B,CAAC;QAEF,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAIO,qBAAqB,CAC3B,KAAyC,EACzC,QAAiB;QAEjB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YAChC,OAAO;SACR;QAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC,IAA0B,EAAE,EAAE;YAE3C,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAGxC,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;YACrE,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAuB,EAAE,EAAE;gBACrD,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;YAGH,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;gBACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAC1B;QACH,CAAC,CAAC,CAAC;QAGH,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;SACzC;IACH,CAAC;IAMO,0BAA0B,CAAC,IAA0B;QAC3D,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;QACD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC9C;IACH,CAAC;IAMO,wBAAwB,CAAC,IAA0B;QACzD,MAAM,UAAU,GAAG,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,IAAI,UAAU,CAAC,MAAM,EAAE;YACrB,IACE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAuB,EAAE,EAAE,CAC3C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAC9B,EACD;gBACA,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;aACrC;iBAAM,IACL,UAAU,CAAC,IAAI,CACb,CAAC,CAAuB,EAAE,EAAE,CAC1B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,CACtE,EACD;gBACA,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;aAC5C;iBAAM;gBACL,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;aACtC;SACF;aAAM;YAEL,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE;gBAC7B,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;aACrC;iBAAM;gBACL,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;aACtC;SACF;IACH,CAAC;IAGO,gBAAgB,CACtB,YAAoC,EACpC,mBAA2C,EAAE;QAE7C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAuB,YAAY,CAAC,CAAC;QAC7D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAuB,gBAAgB,CAAC,CAAC;QAEvE,IAAI,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAuB,EAAE,EAAE;YAC1D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACpB,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;aACnB;QACH,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,OAAO,CAAC,CAAC,CAAuB,EAAE,EAAE;YAC/C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBAC9B,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC;aACpB;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;YACrC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAuB,EAAE,EAAE;gBAC1D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;oBAC1B,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC;iBACxB;YACH,CAAC,CAAC,CAAC;YAEH,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAuB,EAAE,EAAE;gBACnD,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;oBACnC,CAAC,CAAC,aAAa,GAAG,KAAK,CAAC;iBACzB;YACH,CAAC,CAAC,CAAC;SACJ;IACH,CAAC;IAGO,gBAAgB;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,CAAC;IAGO,qBAAqB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI;YACjC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC;YACrC,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAEO,mBAAmB,CACzB,KAA6B,EAC7B,MAA8B;QAE9B,OAAO,CACL,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAC9B,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CACpD,CAAC;IACJ,CAAC;IAEO,kBAAkB,CACxB,IAA0B,EAC1B,MAAe,EACf,aAAa,GAAG,KAAK;QAErB,IAAI,aAAa,EAAE;YACjB,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC,OAAO;SACR;QAED,IAAI,MAAM,EAAE;YACV,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAC1C;aAAM;YACL,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAC1C;IACH,CAAC;CACF","sourcesContent":["import IgcTreeComponent from './tree.js';\nimport IgcTreeItemComponent from './tree-item.js';\nimport { IgcSelectionEventArgs } from './tree.common.js';\n\nexport class IgcTreeSelectionService {\n private tree!: IgcTreeComponent;\n private itemSelection: Set<IgcTreeItemComponent> =\n new Set<IgcTreeItemComponent>();\n private indeterminateItems: Set<IgcTreeItemComponent> =\n new Set<IgcTreeItemComponent>();\n private itemsToBeSelected!: Set<IgcTreeItemComponent>;\n private itemsToBeIndeterminate!: Set<IgcTreeItemComponent>;\n\n constructor(tree: IgcTreeComponent) {\n this.tree = tree;\n }\n\n /** Select range from last selected item to the current specified item. */\n public selectMultipleItems(item: IgcTreeItemComponent): void {\n if (!this.itemSelection.size) {\n this.selectItem(item);\n return;\n }\n const lastSelectedItemIndex = this.tree.items.indexOf(\n this.getSelectedItems()[this.itemSelection.size - 1]\n );\n const currentItemIndex = this.tree.items.indexOf(item);\n const items = this.tree.items.slice(\n Math.min(currentItemIndex, lastSelectedItemIndex),\n Math.max(currentItemIndex, lastSelectedItemIndex) + 1\n );\n\n const added = items.filter(\n (_item: IgcTreeItemComponent) => !this.isItemSelected(_item)\n );\n const newSelection = this.getSelectedItems().concat(added);\n this.emitItemSelectionEvent(newSelection, added, []);\n }\n\n /** Select the specified item and emit event. */\n public selectItem(item: IgcTreeItemComponent): void {\n if (this.tree.selection === 'none') {\n return;\n }\n this.emitItemSelectionEvent([...this.getSelectedItems(), item], [item], []);\n }\n\n /** Deselect the specified item and emit event. */\n public deselectItem(item: IgcTreeItemComponent): void {\n const newSelection = this.getSelectedItems().filter(\n (_item: IgcTreeItemComponent) => _item !== item\n );\n this.emitItemSelectionEvent(newSelection, [], [item]);\n }\n\n /** Clears item selection */\n public clearItemsSelection(): void {\n const oldSelection = this.getSelectedItems();\n const oldIndeterminate = this.getIndeterminateItems();\n this.itemSelection.clear();\n this.indeterminateItems.clear();\n oldSelection.forEach((i: IgcTreeItemComponent) => (i.selected = false));\n oldIndeterminate.forEach(\n (i: IgcTreeItemComponent) => (i.indeterminate = false)\n );\n }\n\n public isItemSelected(item: IgcTreeItemComponent): boolean {\n return this.itemSelection.has(item);\n }\n\n public isItemIndeterminate(item: IgcTreeItemComponent): boolean {\n return this.indeterminateItems.has(item);\n }\n\n /** Called on item`s disconnectedCallback */\n public ensureStateOnItemDelete(item: IgcTreeItemComponent): void {\n // Don't update the internal state of the deleted items because when moving they should keep it\n // However update the state of their parents\n this.deselectItemsWithNoEvent(\n [item, ...item.getChildren({ flatten: true })],\n true\n );\n }\n\n /** Retrigger the selection state of the item. */\n public retriggerItemState(item: IgcTreeItemComponent): void {\n if (item.selected) {\n this.itemSelection.delete(item);\n this.selectItemsWithNoEvent([item]);\n } else {\n this.itemSelection.add(item);\n this.deselectItemsWithNoEvent([item]);\n }\n }\n\n private emitItemSelectionEvent(\n newSelection: IgcTreeItemComponent[],\n added: IgcTreeItemComponent[],\n removed: IgcTreeItemComponent[]\n ): void {\n const currSelection = this.getSelectedItems();\n if (this.areEqualCollections(currSelection, newSelection)) {\n return;\n }\n\n if (this.tree.selection === 'cascade') {\n this.emitCascadeItemSelectionEvent(currSelection, added, removed);\n return;\n }\n\n const args: IgcSelectionEventArgs = {\n detail: {\n newSelection,\n },\n cancelable: true,\n };\n\n const allowed = this.tree.emitEvent('igcSelection', args);\n if (!allowed) {\n return;\n }\n\n // if newSelection is overwritten do not proceed (Blazor)\n if (this.areEqualCollections(newSelection, args.detail.newSelection)) {\n this.itemSelection = new Set(newSelection);\n this.updateItemsState(currSelection);\n }\n }\n\n /** Select specified items. No event is emitted. */\n public selectItemsWithNoEvent(items: IgcTreeItemComponent[]): void {\n const oldSelection = this.getSelectedItems();\n\n if (this.tree && this.tree.selection === 'cascade') {\n this.cascadeSelectItemsWithNoEvent(items, oldSelection);\n return;\n }\n\n items.forEach((item: IgcTreeItemComponent) => this.itemSelection.add(item));\n\n this.updateItemsState(oldSelection);\n }\n\n /** Deselect specified items. No event is emitted. */\n public deselectItemsWithNoEvent(\n items?: IgcTreeItemComponent[],\n onDelete = false\n ): void {\n if (this.tree && this.tree.selection === 'cascade') {\n this.cascadeDeselectItemsWithNoEvent(items, onDelete);\n return;\n }\n const itemSet = new Set(items);\n const oldSelection = onDelete\n ? this.getSelectedItems().filter(\n (i: IgcTreeItemComponent) => !itemSet!.has(i)\n )\n : this.getSelectedItems();\n\n if (!items) {\n this.itemSelection.clear();\n } else {\n items.forEach((item: IgcTreeItemComponent) =>\n this.itemSelection.delete(item)\n );\n }\n\n this.updateItemsState(oldSelection);\n }\n\n private emitCascadeItemSelectionEvent(\n currSelection: IgcTreeItemComponent[],\n added: IgcTreeItemComponent[],\n removed: IgcTreeItemComponent[]\n ): void {\n const oldIndeterminate = this.getIndeterminateItems();\n\n this.calculateItemsNewSelectionState(currSelection, added, removed);\n\n const args: IgcSelectionEventArgs = {\n detail: {\n newSelection: Array.from(this.itemsToBeSelected),\n },\n cancelable: true,\n };\n\n const allowed = this.tree.emitEvent('igcSelection', args);\n\n if (!allowed) {\n return;\n }\n\n // if newSelection is overwritten do not proceed (Blazor)\n if (\n this.areEqualCollections(\n Array.from(this.itemsToBeSelected),\n args.detail.newSelection\n )\n ) {\n this.itemSelection = new Set<IgcTreeItemComponent>(\n this.itemsToBeSelected\n );\n this.indeterminateItems = new Set(this.itemsToBeIndeterminate);\n this.updateItemsState(currSelection, oldIndeterminate);\n }\n }\n\n private cascadeSelectItemsWithNoEvent(\n items: IgcTreeItemComponent[],\n oldSelection: IgcTreeItemComponent[]\n ): void {\n const oldIndeterminate = this.getIndeterminateItems();\n\n const newSelection = [...oldSelection, ...items];\n\n // retrieve only the rows without their parents/children which has to be added to the selection\n const newSelectionSet = new Set(newSelection);\n const removed = oldSelection!.filter((x) => !newSelectionSet.has(x));\n const added = newSelection!.filter((x) => !this.itemSelection.has(x));\n\n this.calculateItemsNewSelectionState(oldSelection, added, removed);\n\n this.itemSelection = new Set(this.itemsToBeSelected);\n this.indeterminateItems = new Set(this.itemsToBeIndeterminate);\n\n this.updateItemsState(oldSelection, oldIndeterminate);\n }\n\n private cascadeDeselectItemsWithNoEvent(\n items?: IgcTreeItemComponent[],\n onDelete = false\n ): void {\n const itemSet = new Set(items);\n const oldSelection = onDelete\n ? this.getSelectedItems().filter(\n (i: IgcTreeItemComponent) => !itemSet!.has(i)\n )\n : this.getSelectedItems();\n const oldIndeterminate = onDelete\n ? this.getIndeterminateItems().filter(\n (i: IgcTreeItemComponent) => !itemSet!.has(i)\n )\n : this.getIndeterminateItems();\n\n if (!items) {\n this.itemSelection.clear();\n this.indeterminateItems.clear();\n } else {\n this.calculateItemsNewSelectionState(oldSelection, [], items);\n\n this.itemSelection = new Set<IgcTreeItemComponent>(\n this.itemsToBeSelected\n );\n this.indeterminateItems = new Set<IgcTreeItemComponent>(\n this.itemsToBeIndeterminate\n );\n }\n\n this.updateItemsState(oldSelection, oldIndeterminate);\n }\n\n // OK (disabled children?)\n /**\n * populates the itemsToBeSelected and itemsToBeIndeterminate sets\n * with the items which will be eventually in selected/indeterminate state\n */\n private calculateItemsNewSelectionState(\n oldSelection: IgcTreeItemComponent[],\n added: IgcTreeItemComponent[],\n removed: IgcTreeItemComponent[]\n ): void {\n this.itemsToBeSelected = new Set<IgcTreeItemComponent>(oldSelection);\n this.itemsToBeIndeterminate = new Set<IgcTreeItemComponent>(\n this.getIndeterminateItems()\n );\n\n this.cascadeSelectionState(removed, false);\n this.cascadeSelectionState(added, true);\n }\n\n // OK (disabled children?)\n /** Ensures proper selection state for all predescessors and descendants during a selection event */\n private cascadeSelectionState(\n items: IgcTreeItemComponent[] | undefined,\n selected: boolean\n ): void {\n if (!items || items.length === 0) {\n return;\n }\n\n const parents = new Set<IgcTreeItemComponent>();\n items.forEach((item: IgcTreeItemComponent) => {\n // select/deselect items passed by event/api\n this.selectDeselectItem(item, selected);\n\n // select/deselect all of their children\n const itemAndAllChildren = item.getChildren({ flatten: true }) || [];\n itemAndAllChildren.forEach((i: IgcTreeItemComponent) => {\n this.selectDeselectItem(i, selected);\n });\n\n // add their direct parent to the set\n if (item && item.parent) {\n parents.add(item.parent);\n }\n });\n\n // handle direct parents from the set\n for (const parent of parents) {\n this.handleParentSelectionState(parent);\n }\n }\n\n // OK (disabled children?)\n /**\n * recursively handle the selection state of the direct and indirect parents\n */\n private handleParentSelectionState(item: IgcTreeItemComponent): void {\n if (!item) {\n return;\n }\n this.handleItemSelectionState(item);\n if (item.parent) {\n this.handleParentSelectionState(item.parent);\n }\n }\n\n // OK (disabled children?)\n /**\n * Handle the selection state of a given item based the selection states of its direct children\n */\n private handleItemSelectionState(item: IgcTreeItemComponent): void {\n const itemsArray = item && item.getChildren() ? item.getChildren() : [];\n if (itemsArray.length) {\n if (\n itemsArray.every((i: IgcTreeItemComponent) =>\n this.itemsToBeSelected.has(i)\n )\n ) {\n this.selectDeselectItem(item, true);\n } else if (\n itemsArray.some(\n (i: IgcTreeItemComponent) =>\n this.itemsToBeSelected.has(i) || this.itemsToBeIndeterminate.has(i)\n )\n ) {\n this.selectDeselectItem(item, false, true);\n } else {\n this.selectDeselectItem(item, false);\n }\n } else {\n // if the children of the item has been deleted and the item was selected do not change its state\n if (this.isItemSelected(item)) {\n this.selectDeselectItem(item, true);\n } else {\n this.selectDeselectItem(item, false);\n }\n }\n }\n\n /** Emits the `selectedChange` event for each item affected by the selection */\n private updateItemsState(\n oldSelection: IgcTreeItemComponent[],\n oldIndeterminate: IgcTreeItemComponent[] = []\n ): void {\n const selected = new Set<IgcTreeItemComponent>(oldSelection);\n const indeterminated = new Set<IgcTreeItemComponent>(oldIndeterminate);\n\n this.getSelectedItems().forEach((i: IgcTreeItemComponent) => {\n if (!selected.has(i)) {\n i.selected = true;\n }\n });\n\n oldSelection.forEach((i: IgcTreeItemComponent) => {\n if (!this.itemSelection.has(i)) {\n i.selected = false;\n }\n });\n\n if (this.tree.selection === 'cascade') {\n this.indeterminateItems.forEach((i: IgcTreeItemComponent) => {\n if (!indeterminated.has(i)) {\n i.indeterminate = true;\n }\n });\n\n oldIndeterminate.forEach((i: IgcTreeItemComponent) => {\n if (!this.indeterminateItems.has(i)) {\n i.indeterminate = false;\n }\n });\n }\n }\n\n /** Returns array of the selected items. */\n private getSelectedItems(): IgcTreeItemComponent[] {\n return this.itemSelection.size ? Array.from(this.itemSelection) : [];\n }\n\n /** Returns array of the items in indeterminate state. */\n private getIndeterminateItems(): IgcTreeItemComponent[] {\n return this.indeterminateItems.size\n ? Array.from(this.indeterminateItems)\n : [];\n }\n\n private areEqualCollections(\n first: IgcTreeItemComponent[],\n second: IgcTreeItemComponent[]\n ): boolean {\n return (\n first.length === second.length &&\n new Set(first.concat(second)).size === first.length\n );\n }\n\n private selectDeselectItem(\n item: IgcTreeItemComponent,\n select: boolean,\n indeterminate = false\n ): void {\n if (indeterminate) {\n this.itemsToBeIndeterminate.add(item);\n this.itemsToBeSelected.delete(item);\n return;\n }\n\n if (select) {\n this.itemsToBeSelected.add(item);\n this.itemsToBeIndeterminate.delete(item);\n } else {\n this.itemsToBeSelected.delete(item);\n this.itemsToBeIndeterminate.delete(item);\n }\n }\n}\n"]}