@syncfusion/ej2-treegrid 30.2.4 → 31.1.17

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 (148) hide show
  1. package/dist/ej2-treegrid.min.js +2 -2
  2. package/dist/ej2-treegrid.umd.min.js +2 -2
  3. package/dist/ej2-treegrid.umd.min.js.map +1 -1
  4. package/dist/es6/ej2-treegrid.es2015.js +263 -157
  5. package/dist/es6/ej2-treegrid.es2015.js.map +1 -1
  6. package/dist/es6/ej2-treegrid.es5.js +291 -167
  7. package/dist/es6/ej2-treegrid.es5.js.map +1 -1
  8. package/dist/global/ej2-treegrid.min.js +2 -2
  9. package/dist/global/ej2-treegrid.min.js.map +1 -1
  10. package/dist/global/index.d.ts +1 -1
  11. package/dist/ts/index.d.ts +4 -0
  12. package/dist/ts/index.ts +4 -0
  13. package/dist/ts/treegrid/actions/batch-edit.d.ts +74 -0
  14. package/dist/ts/treegrid/actions/batch-edit.ts +627 -0
  15. package/dist/ts/treegrid/actions/clipboard.d.ts +36 -0
  16. package/dist/ts/treegrid/actions/clipboard.ts +174 -0
  17. package/dist/ts/treegrid/actions/column-chooser.d.ts +37 -0
  18. package/dist/ts/treegrid/actions/column-chooser.ts +55 -0
  19. package/dist/ts/treegrid/actions/column-menu.d.ts +24 -0
  20. package/dist/ts/treegrid/actions/column-menu.ts +39 -0
  21. package/dist/ts/treegrid/actions/command-column.d.ts +24 -0
  22. package/dist/ts/treegrid/actions/command-column.ts +32 -0
  23. package/dist/ts/treegrid/actions/context-menu.d.ts +42 -0
  24. package/dist/ts/treegrid/actions/context-menu.ts +149 -0
  25. package/dist/ts/treegrid/actions/crud-actions.d.ts +66 -0
  26. package/dist/ts/treegrid/actions/crud-actions.ts +388 -0
  27. package/dist/ts/treegrid/actions/detail-row.d.ts +39 -0
  28. package/dist/ts/treegrid/actions/detail-row.ts +124 -0
  29. package/dist/ts/treegrid/actions/edit.d.ts +121 -0
  30. package/dist/ts/treegrid/actions/edit.ts +1083 -0
  31. package/dist/ts/treegrid/actions/excel-export.d.ts +67 -0
  32. package/dist/ts/treegrid/actions/excel-export.ts +240 -0
  33. package/dist/ts/treegrid/actions/filter.d.ts +57 -0
  34. package/dist/ts/treegrid/actions/filter.ts +231 -0
  35. package/dist/ts/treegrid/actions/freeze-column.d.ts +28 -0
  36. package/dist/ts/treegrid/actions/freeze-column.ts +119 -0
  37. package/dist/ts/treegrid/actions/index.d.ts +24 -0
  38. package/dist/ts/treegrid/actions/index.ts +24 -0
  39. package/dist/ts/treegrid/actions/infinite-scroll.d.ts +96 -0
  40. package/dist/ts/treegrid/actions/infinite-scroll.ts +320 -0
  41. package/dist/ts/treegrid/actions/logger.d.ts +25 -0
  42. package/dist/ts/treegrid/actions/logger.ts +136 -0
  43. package/dist/ts/treegrid/actions/page.d.ts +67 -0
  44. package/dist/ts/treegrid/actions/page.ts +212 -0
  45. package/dist/ts/treegrid/actions/pdf-export.d.ts +63 -0
  46. package/dist/ts/treegrid/actions/pdf-export.ts +182 -0
  47. package/dist/ts/treegrid/actions/print.d.ts +37 -0
  48. package/dist/ts/treegrid/actions/print.ts +69 -0
  49. package/dist/ts/treegrid/actions/reorder.d.ts +36 -0
  50. package/dist/ts/treegrid/actions/reorder.ts +60 -0
  51. package/dist/ts/treegrid/actions/resize.d.ts +36 -0
  52. package/dist/ts/treegrid/actions/resize.ts +54 -0
  53. package/dist/ts/treegrid/actions/rowdragdrop.d.ts +405 -0
  54. package/dist/ts/treegrid/actions/rowdragdrop.ts +1896 -0
  55. package/dist/ts/treegrid/actions/selection.d.ts +51 -0
  56. package/dist/ts/treegrid/actions/selection.ts +530 -0
  57. package/dist/ts/treegrid/actions/sort.d.ts +63 -0
  58. package/dist/ts/treegrid/actions/sort.ts +149 -0
  59. package/dist/ts/treegrid/actions/summary.d.ts +47 -0
  60. package/dist/ts/treegrid/actions/summary.ts +231 -0
  61. package/dist/ts/treegrid/actions/toolbar.d.ts +52 -0
  62. package/dist/ts/treegrid/actions/toolbar.ts +154 -0
  63. package/dist/ts/treegrid/actions/virtual-scroll.d.ts +90 -0
  64. package/dist/ts/treegrid/actions/virtual-scroll.ts +306 -0
  65. package/dist/ts/treegrid/base/constant.d.ts +158 -0
  66. package/dist/ts/treegrid/base/constant.ts +158 -0
  67. package/dist/ts/treegrid/base/data.d.ts +90 -0
  68. package/dist/ts/treegrid/base/data.ts +904 -0
  69. package/dist/ts/treegrid/base/index.d.ts +11 -0
  70. package/dist/ts/treegrid/base/index.ts +11 -0
  71. package/dist/ts/treegrid/base/interface.d.ts +186 -0
  72. package/dist/ts/treegrid/base/interface.ts +191 -0
  73. package/dist/ts/treegrid/base/treegrid-model.d.ts +1100 -0
  74. package/dist/ts/treegrid/base/treegrid.d.ts +2422 -0
  75. package/dist/ts/treegrid/base/treegrid.ts +5962 -0
  76. package/dist/ts/treegrid/enum.d.ts +152 -0
  77. package/dist/ts/treegrid/enum.ts +217 -0
  78. package/dist/ts/treegrid/index.d.ts +9 -0
  79. package/dist/ts/treegrid/index.ts +9 -0
  80. package/dist/ts/treegrid/models/column-chooser-settings-model.d.ts +62 -0
  81. package/dist/ts/treegrid/models/column-chooser-settings.d.ts +53 -0
  82. package/dist/ts/treegrid/models/column-chooser-settings.ts +67 -0
  83. package/dist/ts/treegrid/models/column-model.d.ts +30 -0
  84. package/dist/ts/treegrid/models/column.d.ts +697 -0
  85. package/dist/ts/treegrid/models/column.ts +800 -0
  86. package/dist/ts/treegrid/models/edit-settings-model.d.ts +100 -0
  87. package/dist/ts/treegrid/models/edit-settings.d.ts +89 -0
  88. package/dist/ts/treegrid/models/edit-settings.ts +111 -0
  89. package/dist/ts/treegrid/models/filter-settings-model.d.ts +216 -0
  90. package/dist/ts/treegrid/models/filter-settings.d.ts +195 -0
  91. package/dist/ts/treegrid/models/filter-settings.ts +237 -0
  92. package/dist/ts/treegrid/models/index.d.ts +24 -0
  93. package/dist/ts/treegrid/models/index.ts +24 -0
  94. package/dist/ts/treegrid/models/infinite-scroll-settings-model.d.ts +29 -0
  95. package/dist/ts/treegrid/models/infinite-scroll-settings.d.ts +25 -0
  96. package/dist/ts/treegrid/models/infinite-scroll-settings.ts +31 -0
  97. package/dist/ts/treegrid/models/loading-indicator-model.d.ts +21 -0
  98. package/dist/ts/treegrid/models/loading-indicator.d.ts +19 -0
  99. package/dist/ts/treegrid/models/loading-indicator.ts +21 -0
  100. package/dist/ts/treegrid/models/page-settings-model.d.ts +66 -0
  101. package/dist/ts/treegrid/models/page-settings.d.ts +57 -0
  102. package/dist/ts/treegrid/models/page-settings.ts +73 -0
  103. package/dist/ts/treegrid/models/rowdrop-settings-model.d.ts +15 -0
  104. package/dist/ts/treegrid/models/rowdrop-settings.d.ts +34 -0
  105. package/dist/ts/treegrid/models/rowdrop-settings.ts +37 -0
  106. package/dist/ts/treegrid/models/search-settings-model.d.ts +79 -0
  107. package/dist/ts/treegrid/models/search-settings.d.ts +73 -0
  108. package/dist/ts/treegrid/models/search-settings.ts +83 -0
  109. package/dist/ts/treegrid/models/selection-settings-model.d.ts +76 -0
  110. package/dist/ts/treegrid/models/selection-settings.d.ts +68 -0
  111. package/dist/ts/treegrid/models/selection-settings.ts +82 -0
  112. package/dist/ts/treegrid/models/sort-settings-model.d.ts +49 -0
  113. package/dist/ts/treegrid/models/sort-settings.d.ts +43 -0
  114. package/dist/ts/treegrid/models/sort-settings.ts +51 -0
  115. package/dist/ts/treegrid/models/summary-model.d.ts +93 -0
  116. package/dist/ts/treegrid/models/summary.d.ts +126 -0
  117. package/dist/ts/treegrid/models/summary.ts +170 -0
  118. package/dist/ts/treegrid/models/textwrap-settings-model.d.ts +21 -0
  119. package/dist/ts/treegrid/models/textwrap-settings.d.ts +19 -0
  120. package/dist/ts/treegrid/models/textwrap-settings.ts +21 -0
  121. package/dist/ts/treegrid/renderer/index.d.ts +5 -0
  122. package/dist/ts/treegrid/renderer/index.ts +5 -0
  123. package/dist/ts/treegrid/renderer/render.d.ts +41 -0
  124. package/dist/ts/treegrid/renderer/render.ts +379 -0
  125. package/dist/ts/treegrid/renderer/virtual-row-model-generator.d.ts +16 -0
  126. package/dist/ts/treegrid/renderer/virtual-row-model-generator.ts +90 -0
  127. package/dist/ts/treegrid/renderer/virtual-tree-content-render.d.ts +353 -0
  128. package/dist/ts/treegrid/renderer/virtual-tree-content-render.ts +1125 -0
  129. package/dist/ts/treegrid/utils.d.ts +70 -0
  130. package/dist/ts/treegrid/utils.ts +217 -0
  131. package/package.json +51 -15
  132. package/src/treegrid/actions/context-menu.js +3 -1
  133. package/src/treegrid/actions/excel-export.d.ts +8 -0
  134. package/src/treegrid/actions/excel-export.js +12 -0
  135. package/src/treegrid/actions/freeze-column.js +1 -1
  136. package/src/treegrid/actions/pdf-export.d.ts +8 -0
  137. package/src/treegrid/actions/pdf-export.js +12 -0
  138. package/src/treegrid/actions/selection.js +1 -1
  139. package/src/treegrid/actions/virtual-scroll.js +2 -2
  140. package/src/treegrid/base/data.js +1 -1
  141. package/src/treegrid/base/treegrid-model.d.ts +32 -2
  142. package/src/treegrid/base/treegrid.d.ts +29 -2
  143. package/src/treegrid/base/treegrid.js +39 -2
  144. package/src/treegrid/models/column-chooser-settings-model.d.ts +62 -0
  145. package/src/treegrid/models/column-chooser-settings.d.ts +53 -0
  146. package/src/treegrid/models/column-chooser-settings.js +52 -0
  147. package/src/treegrid/renderer/virtual-tree-content-render.js +3 -8
  148. package/src/treegrid/utils.js +22 -6
@@ -0,0 +1,51 @@
1
+ import { TreeGrid } from '../base/treegrid';
2
+ /**
3
+ * TreeGrid Selection module
4
+ *
5
+ * @hidden
6
+ */
7
+ export declare class Selection {
8
+ private parent;
9
+ private columnIndex;
10
+ private selectedItems;
11
+ private selectedIndexes;
12
+ private filteredList;
13
+ private searchingRecords;
14
+ /**
15
+ * Constructor for Selection module
16
+ *
17
+ * @param {TreeGrid} parent - Tree Grid instance
18
+ */
19
+ constructor(parent: TreeGrid);
20
+ /**
21
+ * For internal use only - Get the module name.
22
+ *
23
+ * @private
24
+ * @returns {string} Returns Selection module name
25
+ */
26
+ private getModuleName;
27
+ addEventListener(): void;
28
+ removeEventListener(): void;
29
+ /**
30
+ * To destroy the Selection
31
+ *
32
+ * @returns {void}
33
+ * @hidden
34
+ */
35
+ destroy(): void;
36
+ private checkboxSelection;
37
+ private triggerChkChangeEvent;
38
+ private getCheckboxcolumnIndex;
39
+ private headerCheckbox;
40
+ private renderColumnCheckbox;
41
+ private columnCheckbox;
42
+ selectCheckboxes(rowIndexes: number[]): void;
43
+ private traverSelection;
44
+ private getFilteredChildRecords;
45
+ private updateParentSelection;
46
+ private headerSelection;
47
+ private updateSelectedItems;
48
+ private updateGridActions;
49
+ getCheckedrecords(): Object[];
50
+ getCheckedRowIndexes(): number[];
51
+ }
@@ -0,0 +1,530 @@
1
+ import { TreeGrid } from '../base/treegrid';
2
+ import { ColumnModel } from '../models/column';
3
+ import { isNullOrUndefined, removeClass } from '@syncfusion/ej2-base';
4
+ import { createCheckBox } from '@syncfusion/ej2-buttons';
5
+ import { QueryCellInfoEventArgs, parentsUntil, getObject } from '@syncfusion/ej2-grids';
6
+ import { CellSaveEventArgs } from '../base/interface';
7
+ import { ITreeData } from '../base/interface';
8
+ import * as events from '../base/constant';
9
+ import { getParentData, isRemoteData, isCheckboxcolumn, findChildrenRecords } from '../utils';
10
+
11
+ /**
12
+ * TreeGrid Selection module
13
+ *
14
+ * @hidden
15
+ */
16
+ export class Selection {
17
+ private parent: TreeGrid;
18
+ private columnIndex: number;
19
+ private selectedItems: Object[];
20
+ private selectedIndexes: number[];
21
+ private filteredList: Object[];
22
+ private searchingRecords: Object[];
23
+ /**
24
+ * Constructor for Selection module
25
+ *
26
+ * @param {TreeGrid} parent - Tree Grid instance
27
+ */
28
+ constructor(parent: TreeGrid) {
29
+ this.parent = parent;
30
+ this.selectedItems = [];
31
+ this.selectedIndexes = [];
32
+ this.filteredList = [];
33
+ this.searchingRecords = [];
34
+ this.addEventListener();
35
+ }
36
+
37
+ /**
38
+ * For internal use only - Get the module name.
39
+ *
40
+ * @private
41
+ * @returns {string} Returns Selection module name
42
+ */
43
+ private getModuleName(): string {
44
+ return 'selection';
45
+ }
46
+
47
+ public addEventListener(): void {
48
+ this.parent.on('dataBoundArg', this.headerCheckbox, this);
49
+ this.parent.on('columnCheckbox', this.columnCheckbox, this);
50
+ this.parent.on('updateGridActions', this.updateGridActions, this);
51
+ this.parent.grid.on('colgroup-refresh', this.headerCheckbox, this);
52
+ this.parent.on('checkboxSelection', this.checkboxSelection, this);
53
+
54
+ }
55
+
56
+ public removeEventListener(): void {
57
+ if (this.parent.isDestroyed) { return; }
58
+ this.parent.off('dataBoundArg', this.headerCheckbox);
59
+ this.parent.off('columnCheckbox', this.columnCheckbox);
60
+ this.parent.grid.off('colgroup-refresh', this.headerCheckbox);
61
+ this.parent.off('checkboxSelection', this.checkboxSelection);
62
+ this.parent.off('updateGridActions', this.updateGridActions);
63
+ }
64
+
65
+ /**
66
+ * To destroy the Selection
67
+ *
68
+ * @returns {void}
69
+ * @hidden
70
+ */
71
+ public destroy(): void {
72
+ this.removeEventListener();
73
+ }
74
+
75
+ private checkboxSelection(args: Object): void {
76
+ const target: HTMLElement = getObject('target', args);
77
+ const checkWrap: HTMLElement = parentsUntil(target, 'e-checkbox-wrapper') as HTMLElement;
78
+ let checkBox: HTMLInputElement;
79
+ if (checkWrap && checkWrap.querySelectorAll('.e-treecheckselect').length > 0) {
80
+ checkBox = checkWrap.querySelector('input[type="checkbox"]') as HTMLInputElement;
81
+ const rowIndex: number[] = [];
82
+ rowIndex.push((target.closest('tr') as HTMLTableRowElement).rowIndex);
83
+ this.selectCheckboxes(rowIndex);
84
+ this.triggerChkChangeEvent(checkBox, checkBox.nextElementSibling.classList.contains('e-check'), target.closest('tr'));
85
+ } else if (checkWrap && checkWrap.querySelectorAll('.e-treeselectall').length > 0 && this.parent.autoCheckHierarchy) {
86
+ const checkBoxvalue: boolean = !checkWrap.querySelector('.e-frame').classList.contains('e-check')
87
+ && !checkWrap.querySelector('.e-frame').classList.contains('e-stop');
88
+ this.headerSelection(checkBoxvalue);
89
+ checkBox = checkWrap.querySelector('input[type="checkbox"]') as HTMLInputElement;
90
+ this.triggerChkChangeEvent(checkBox, checkBoxvalue, target.closest('tr'));
91
+
92
+ }
93
+ if (!isNullOrUndefined(this.parent['parentQuery']) && this.parent.selectionSettings.persistSelection
94
+ && this.parent['columnModel'].filter((col: { type: string }) => { return col.type === 'checkbox'; }).length > 0
95
+ && isRemoteData(this.parent)) {
96
+ if (this.parent['parentQuery'].length > 0) {
97
+ this.parent.query.queries.push(...this.parent['parentQuery']);
98
+ this.parent['parentQuery'] = [];
99
+ }
100
+ }
101
+ }
102
+
103
+ private triggerChkChangeEvent(checkBox: HTMLInputElement, checkState: boolean, rowElement: HTMLTableRowElement): void {
104
+ const data: ITreeData = this.parent.getCurrentViewRecords()[rowElement.rowIndex];
105
+ const args: Object = { checked: checkState, target: checkBox, rowElement: rowElement,
106
+ rowData: checkBox.classList.contains('e-treeselectall')
107
+ ? this.parent.getCheckedRecords() : data };
108
+ this.parent.trigger(events.checkboxChange, args);
109
+ }
110
+
111
+ private getCheckboxcolumnIndex(): number {
112
+ let mappingUid: string; let columnIndex: number; const stackedHeader: string = 'stackedHeader';
113
+ const columnModel: string = 'columnModel';
114
+ const columns: ColumnModel[] = this.parent[`${stackedHeader}`] ? this.parent[`${columnModel}`] : <ColumnModel[]>(this.parent.columns);
115
+ for (let col: number = 0; col < columns.length; col++) {
116
+ if ((<ColumnModel>columns[parseInt(col.toString(), 10)]).showCheckbox) {
117
+ mappingUid = (<ColumnModel>columns[parseInt(col.toString(), 10)]).uid;
118
+ }
119
+ }
120
+ const headerCelllength: number = this.parent.getHeaderContent().querySelectorAll('.e-headercelldiv').length;
121
+ for (let j: number = 0; j < headerCelllength; j++) {
122
+ const headercell: Element = this.parent.getHeaderContent().querySelectorAll('.e-headercelldiv')[parseInt(j.toString(), 10)];
123
+ if (headercell.getAttribute('data-mappinguid') === mappingUid) {
124
+ columnIndex = j;
125
+ }
126
+ }
127
+ return columnIndex;
128
+ }
129
+
130
+ private headerCheckbox(): void {
131
+ this.columnIndex = this.getCheckboxcolumnIndex();
132
+ if (this.columnIndex > -1 && this.parent.getHeaderContent().querySelectorAll('.e-treeselectall').length === 0) {
133
+ const headerElement: Element = this.parent.getHeaderContent().querySelectorAll('.e-headercelldiv')[this.columnIndex];
134
+ const value: boolean = false;
135
+ const rowChkBox: Element = this.parent.createElement('input', { className: 'e-treeselectall', attrs: { 'type': 'checkbox'}});
136
+ const checkWrap: Element = createCheckBox(this.parent.createElement, false, { checked: value as boolean, label: ' ' });
137
+ checkWrap.classList.add('e-hierarchycheckbox');
138
+ checkWrap.insertBefore(rowChkBox.cloneNode(), checkWrap.firstChild);
139
+ if (!isNullOrUndefined(headerElement)) {
140
+ headerElement.insertBefore(checkWrap, headerElement.firstChild);
141
+ }
142
+ if (this.parent.autoCheckHierarchy) {
143
+ this.headerSelection();
144
+ }
145
+ } else if (this.columnIndex > -1 && this.parent.getHeaderContent().querySelectorAll('.e-treeselectall').length > 0) {
146
+ const checkWrap: Element = this.parent.getHeaderContent().querySelectorAll('.e-checkbox-wrapper')[0];
147
+ const checkBoxvalue: boolean = checkWrap.querySelector('.e-frame').classList.contains('e-check');
148
+ if (this.parent.autoCheckHierarchy && checkBoxvalue) {
149
+ this.headerSelection(checkBoxvalue);
150
+ }
151
+ }
152
+ }
153
+
154
+ private renderColumnCheckbox(args: QueryCellInfoEventArgs): Element {
155
+ const rowChkBox: Element = this.parent.createElement('input', { className: 'e-treecheckselect', attrs: { 'type': 'checkbox', 'aria-label': 'checkbox' }});
156
+ const data: ITreeData = <ITreeData>args.data;
157
+ args.cell.classList.add('e-treegridcheckbox');
158
+ args.cell.setAttribute('aria-label', 'checkbox');
159
+ const value: boolean = (isNullOrUndefined(data.checkboxState) || data.checkboxState === 'uncheck') ? false : true;
160
+ const checkWrap: Element = createCheckBox(this.parent.createElement, false, { checked: value as boolean, label: ' ' });
161
+ checkWrap.classList.add('e-hierarchycheckbox');
162
+ if (this.parent.allowTextWrap) {
163
+ (<HTMLElement>checkWrap.querySelector('.e-frame')).style.width = '18px';
164
+ }
165
+ if (data.checkboxState === 'indeterminate') {
166
+ const checkbox: HTMLElement = <HTMLElement>checkWrap.querySelectorAll('.e-frame')[0];
167
+ removeClass([checkbox], ['e-check', 'e-stop', 'e-uncheck']);
168
+ checkWrap.querySelector('.e-frame').classList.add('e-stop');
169
+ }
170
+ checkWrap.insertBefore(rowChkBox.cloneNode(), checkWrap.firstChild);
171
+ return checkWrap;
172
+ }
173
+
174
+ private columnCheckbox(container: QueryCellInfoEventArgs): void {
175
+ const checkWrap: Element = this.renderColumnCheckbox(container);
176
+ const containerELe: Element = container.cell.querySelector('.e-treecolumn-container');
177
+ if (!isNullOrUndefined(containerELe)) {
178
+ if (!container.cell.querySelector('.e-hierarchycheckbox')) {
179
+ containerELe.insertBefore(checkWrap, containerELe.querySelectorAll('.e-treecell')[0]);
180
+ }
181
+ } else {
182
+ const spanEle: HTMLElement = this.parent.createElement('span', { className: 'e-treecheckbox' });
183
+ const data: string = container.cell.innerHTML;
184
+ container.cell.innerHTML = '';
185
+ spanEle.innerHTML = data;
186
+ const divEle: HTMLElement = this.parent.createElement('div', { className: 'e-treecheckbox-container' });
187
+ divEle.appendChild(checkWrap);
188
+ divEle.appendChild(spanEle);
189
+ container.cell.appendChild(divEle);
190
+ }
191
+ }
192
+
193
+ public selectCheckboxes(rowIndexes: number[]): void {
194
+ if (isNullOrUndefined(rowIndexes)) {
195
+ const error: string = 'The provided value for the rowIndexes is undefined. Please ensure the rowIndexes contains number.';
196
+ this.parent.trigger(events.actionFailure, { error: error });
197
+ }
198
+ for (let i: number = 0; i < rowIndexes.length; i++) {
199
+ let record: ITreeData = this.parent.getCurrentViewRecords()[rowIndexes[parseInt(i.toString(), 10)]];
200
+ const flatRecord: ITreeData = getParentData(this.parent, record.uniqueID);
201
+ record = flatRecord;
202
+ const checkboxState: string = (record.checkboxState === 'uncheck') ? 'check' : 'uncheck';
203
+ record.checkboxState = checkboxState;
204
+ const keys: string[] = Object.keys(record);
205
+ for (let j: number = 0; j < keys.length; j++) {
206
+ if (Object.prototype.hasOwnProperty.call(flatRecord, keys[parseInt(j.toString(), 10)])) {
207
+ flatRecord[keys[parseInt(j.toString(), 10)]] = record[keys[parseInt(j.toString(), 10)]];
208
+ }
209
+ }
210
+ this.traverSelection(record, checkboxState, false);
211
+ if (this.parent.autoCheckHierarchy) {
212
+ this.headerSelection();
213
+ }
214
+ }
215
+ }
216
+
217
+ private traverSelection(record: ITreeData, checkboxState: string, ischildItem: boolean): void {
218
+ let length: number = 0;
219
+ this.updateSelectedItems(record, checkboxState);
220
+ if (!ischildItem && record.parentItem && this.parent.autoCheckHierarchy) {
221
+ this.updateParentSelection(record.parentItem);
222
+ }
223
+ if (record.childRecords && this.parent.autoCheckHierarchy) {
224
+ let childRecords: ITreeData[] = record.childRecords;
225
+ if (!isNullOrUndefined(this.parent.filterModule) &&
226
+ this.parent.filterModule.filteredResult.length > 0 && this.parent.autoCheckHierarchy) {
227
+ childRecords = this.getFilteredChildRecords(childRecords);
228
+ }
229
+ length = childRecords.length;
230
+ for (let count: number = 0; count < length; count++) {
231
+ if (!childRecords[parseInt(count.toString(), 10)].isSummaryRow) {
232
+ if (childRecords[parseInt(count.toString(), 10)].hasChildRecords) {
233
+ this.traverSelection(childRecords[parseInt(count.toString(), 10)], checkboxState, true);
234
+ } else {
235
+ this.updateSelectedItems(childRecords[parseInt(count.toString(), 10)], checkboxState);
236
+ }
237
+ }
238
+ }
239
+ }
240
+ }
241
+
242
+ private getFilteredChildRecords(childRecords: ITreeData[]): ITreeData[] {
243
+ const filteredChildRecords: ITreeData[] = childRecords.filter((e: ITreeData) => {
244
+ return this.parent.filterModule.filteredResult.indexOf(e) > -1;
245
+ });
246
+ return filteredChildRecords;
247
+ }
248
+
249
+ private updateParentSelection(parentRecord: ITreeData): void {
250
+ let length: number = 0; let childRecords: ITreeData[] = [];
251
+ const record: ITreeData = getParentData(this.parent, parentRecord.uniqueID);
252
+ if (record && record.childRecords) {
253
+ childRecords = record.childRecords;
254
+ }
255
+ if (!isNullOrUndefined(this.parent.filterModule) &&
256
+ this.parent.filterModule.filteredResult.length > 0 && this.parent.autoCheckHierarchy) {
257
+ childRecords = this.getFilteredChildRecords(childRecords);
258
+ }
259
+ length = childRecords && childRecords.length;
260
+ let indeter: number = 0; let checkChildRecords: number = 0;
261
+ if (!isNullOrUndefined(record)) {
262
+ for (let i: number = 0; i < childRecords.length; i++) {
263
+ const currentRecord: ITreeData = getParentData(this.parent, childRecords[parseInt(i.toString(), 10)].uniqueID);
264
+ const checkBoxRecord: ITreeData = currentRecord;
265
+ if (!isNullOrUndefined(checkBoxRecord)) {
266
+ if (checkBoxRecord.checkboxState === 'indeterminate') {
267
+ indeter++;
268
+ } else if (checkBoxRecord.checkboxState === 'check') {
269
+ checkChildRecords++;
270
+ }
271
+ }
272
+ }
273
+ if (indeter > 0 || (checkChildRecords > 0 && checkChildRecords !== length)) {
274
+ record.checkboxState = 'indeterminate';
275
+ }
276
+ else if (checkChildRecords === 0 && (!record.hasFilteredChildRecords || isNullOrUndefined(record.hasFilteredChildRecords)) && !isNullOrUndefined(this.parent['dataResults']['actionArgs']) &&
277
+ (this.parent['dataResults']['actionArgs'].requestType === 'searching' || this.parent['dataResults']['actionArgs'].requestType === 'filtering') && record.checkboxState === 'check') {
278
+ record.checkboxState = 'check';
279
+ }
280
+ else if ((checkChildRecords === 0 && indeter === 0) || (checkChildRecords === 0 && record.hasFilteredChildRecords && !isNullOrUndefined(this.parent['dataResults']['actionArgs']) &&
281
+ (this.parent['dataResults']['actionArgs'].requestType === 'searching' || this.parent['dataResults']['actionArgs'].requestType === 'filtering') && record.checkboxState === 'check' )) {
282
+ record.checkboxState = 'uncheck';
283
+ } else {
284
+ record.checkboxState = 'check';
285
+ }
286
+ this.updateSelectedItems(record, record.checkboxState);
287
+ if (record.parentItem) {
288
+ this.updateParentSelection(record.parentItem);
289
+ }
290
+ }
291
+ }
292
+
293
+ private headerSelection(checkAll?: boolean): void {
294
+ let index: number = -1; let length: number = 0;
295
+ //This property used to maintain the check state of the currentview data after clear filtering
296
+ let multiFilterCheckState: boolean = false;
297
+ if (!isNullOrUndefined(this.parent.filterModule) && this.parent.filterModule.filteredResult.length > 0) {
298
+ const filterResult: Object[] = this.parent.filterModule.filteredResult;
299
+ if (this.filteredList.length === 0){
300
+ this.filteredList = filterResult;
301
+ }
302
+ if (this.parent.grid.searchSettings.key.length) {
303
+ this.searchingRecords = filterResult;
304
+ }
305
+ else {
306
+ if (this.filteredList !== filterResult) {
307
+ this.filteredList = filterResult;
308
+ multiFilterCheckState = true;
309
+ }
310
+ else {
311
+ multiFilterCheckState = false;
312
+ }
313
+ }
314
+ }
315
+ if (this.filteredList.length > 0){
316
+ if (!this.parent.filterSettings.columns.length && this.filteredList.length && !this.parent.grid.searchSettings.key.length){
317
+ this.filteredList = [];
318
+ }
319
+ if (this.searchingRecords.length && !isNullOrUndefined(checkAll)) {
320
+ this.filteredList = this.searchingRecords;
321
+ }
322
+ }
323
+ let data: ITreeData[];
324
+ if (!(isNullOrUndefined(this.parent.filterModule)) &&
325
+ this.parent.filterModule.filteredResult.length === 0 && this.parent.getCurrentViewRecords().length === 0 &&
326
+ this.parent.filterSettings.columns.length > 0) {
327
+ data = this.filteredList;
328
+ }
329
+ else {
330
+ data = (!isNullOrUndefined(this.parent.filterModule) &&
331
+ (this.filteredList.length > 0)) ? this.filteredList : this.parent.flatData;
332
+ }
333
+ data = isRemoteData(this.parent) ? this.parent.getCurrentViewRecords() : data;
334
+ if (!isNullOrUndefined(checkAll)) {
335
+ for (let i: number = 0; i < data.length; i++) {
336
+ if (checkAll) {
337
+ if (data[parseInt(i.toString(), 10)].checkboxState === 'check') {
338
+ continue;
339
+ }
340
+ if (multiFilterCheckState) {
341
+ continue;
342
+ }
343
+ data[parseInt(i.toString(), 10)].checkboxState = 'check';
344
+ this.updateSelectedItems(data[parseInt(i.toString(), 10)], data[parseInt(i.toString(), 10)].checkboxState);
345
+ } else {
346
+ index = this.selectedItems.indexOf(data[parseInt(i.toString(), 10)]);
347
+ if (index > -1) {
348
+ data[parseInt(i.toString(), 10)].checkboxState = 'uncheck';
349
+ this.updateSelectedItems(data[parseInt(i.toString(), 10)], data[parseInt(i.toString(), 10)].checkboxState);
350
+ if (this.parent.autoCheckHierarchy) {
351
+ this.updateParentSelection(data[parseInt(i.toString(), 10)]);
352
+ }
353
+ }
354
+ }
355
+ }
356
+ }
357
+ if (checkAll === false && this.parent.enableVirtualization) {
358
+ this.selectedItems = [];
359
+ this.selectedIndexes = [];
360
+ data.filter((rec: ITreeData) => {
361
+ rec.checkboxState = 'uncheck';
362
+ this.updateSelectedItems(rec, rec.checkboxState);
363
+ });
364
+ }
365
+ length = this.selectedItems.length;
366
+ const checkbox: HTMLElement = <HTMLElement>this.parent.getHeaderContent().querySelectorAll('.e-frame')[0];
367
+ if (length > 0 && data.length > 0) {
368
+ if (length !== data.length && !checkAll) {
369
+ removeClass([checkbox], ['e-check']);
370
+ checkbox.classList.add('e-stop');
371
+ } else {
372
+ removeClass([checkbox], ['e-stop']);
373
+ checkbox.classList.add('e-check');
374
+ }
375
+ } else {
376
+ removeClass([checkbox], ['e-check', 'e-stop']);
377
+ }
378
+ }
379
+
380
+ private updateSelectedItems(currentRecord: ITreeData, checkState: string): void {
381
+ const record: ITreeData[] = this.parent.grid.currentViewData.filter((e: ITreeData) => {
382
+ return e.uniqueID === currentRecord.uniqueID;
383
+ });
384
+ let checkedRecord: ITreeData;
385
+ const recordIndex: number = this.parent.grid.currentViewData.indexOf(record[0]);
386
+ const checkboxRecord: ITreeData = getParentData(this.parent, currentRecord.uniqueID);
387
+ const tr: HTMLElement = this.parent.getRows()[parseInt(recordIndex.toString(), 10)];
388
+ let checkbox: HTMLElement;
389
+ if (recordIndex > -1) {
390
+ let movableTr: Element;
391
+ if (this.parent.frozenRows || this.parent.getFrozenColumns()) {
392
+ movableTr = this.parent.getDataRows()[parseInt(recordIndex.toString(), 10)];
393
+ }
394
+ checkbox = <HTMLElement>tr.querySelectorAll('.e-hierarchycheckbox .e-frame')[0] ? <HTMLElement>tr.querySelectorAll('.e-hierarchycheckbox .e-frame')[0]
395
+ : <HTMLElement>movableTr.querySelectorAll('.e-hierarchycheckbox .e-frame')[0];
396
+ if (!isNullOrUndefined(checkbox)) {
397
+ removeClass([checkbox], ['e-check', 'e-stop', 'e-uncheck']);
398
+ }
399
+ }
400
+ checkedRecord = checkboxRecord;
401
+ if (isNullOrUndefined(checkedRecord)) {
402
+ checkedRecord = currentRecord;
403
+ }
404
+ checkedRecord.checkboxState = checkState;
405
+ if (checkState === 'check' && isNullOrUndefined(currentRecord.isSummaryRow)) {
406
+ if (recordIndex !== -1 && this.selectedIndexes.indexOf(recordIndex) === -1) {
407
+ this.selectedIndexes.push(recordIndex);
408
+ }
409
+ if (this.selectedItems.indexOf(checkedRecord) === -1 && (recordIndex !== -1 &&
410
+ (!isNullOrUndefined(this.parent.filterModule) && this.parent.filterModule.filteredResult.length > 0))) {
411
+ this.selectedItems.push(checkedRecord);
412
+ }
413
+ if (this.selectedItems.indexOf(checkedRecord) === -1 && (this.parent.enableVirtualization || this.parent.allowPaging) && (
414
+ (!isNullOrUndefined(this.parent.filterModule) && this.parent.filterModule.filteredResult.length > 0))) {
415
+ this.selectedItems.push(checkedRecord);
416
+ }
417
+ if (this.selectedItems.indexOf(checkedRecord) === -1 && (!isNullOrUndefined(this.parent.filterModule) &&
418
+ this.parent.filterModule.filteredResult.length === 0)) {
419
+ this.selectedItems.push(checkedRecord);
420
+ }
421
+ if (this.selectedItems.indexOf(checkedRecord) === -1 && isNullOrUndefined(this.parent.filterModule)) {
422
+ this.selectedItems.push(checkedRecord);
423
+ }
424
+ } else if ((checkState === 'uncheck' || checkState === 'indeterminate') && isNullOrUndefined(currentRecord.isSummaryRow)) {
425
+ const index: number = this.selectedItems.indexOf(checkedRecord);
426
+ if (index !== -1) {
427
+ this.selectedItems.splice(index, 1);
428
+ }
429
+ if (this.selectedIndexes.indexOf(recordIndex) !== -1) {
430
+ const checkedIndex: number = this.selectedIndexes.indexOf(recordIndex);
431
+ this.selectedIndexes.splice(checkedIndex, 1);
432
+ }
433
+ }
434
+ const checkBoxclass: string = checkState === 'indeterminate' ? 'e-stop' : 'e-' + checkState;
435
+ if (recordIndex > -1) {
436
+ if (!isNullOrUndefined(checkbox)) {
437
+ checkbox.classList.add(checkBoxclass);
438
+ tr.querySelector('.e-treecheckselect').setAttribute('aria-checked', checkState === 'check' ? 'true' : checkState === 'uncheck' ? 'false' : 'mixed');
439
+ }
440
+ }
441
+ }
442
+
443
+ private updateGridActions(args: CellSaveEventArgs): void {
444
+ const requestType: string = args.requestType; let childData: ITreeData[]; let childLength: number;
445
+ if (isCheckboxcolumn(this.parent)) {
446
+ if (this.parent.autoCheckHierarchy) {
447
+ if ((requestType === 'sorting' || requestType === 'paging')) {
448
+ const rows: Element[] = this.parent.grid.getRows();
449
+ childData = this.parent.getCurrentViewRecords();
450
+ childLength = childData.length;
451
+ this.selectedIndexes = [];
452
+ for (let i: number = 0; i < childLength; i++) {
453
+ if (!rows[parseInt(i.toString(), 10)].classList.contains('e-summaryrow')) {
454
+ this.updateSelectedItems(childData[parseInt(i.toString(), 10)],
455
+ childData[parseInt(i.toString(), 10)].checkboxState);
456
+ }
457
+ }
458
+ } else if (requestType === 'delete' || args.action === 'add') {
459
+ let updatedData: ITreeData[] = [];
460
+ if (requestType === 'delete') {
461
+ updatedData = <ITreeData[]>args.data;
462
+ } else {
463
+ updatedData.push(args.data);
464
+ }
465
+ for (let i: number = 0; i < updatedData.length; i++) {
466
+ if (requestType === 'delete') {
467
+ const index: number = this.parent.flatData.indexOf(updatedData[parseInt(i.toString(), 10)]);
468
+ const checkedIndex: number = this.selectedIndexes.indexOf(index);
469
+ this.selectedIndexes.splice(checkedIndex, 1);
470
+ this.updateSelectedItems(updatedData[parseInt(i.toString(), 10)], 'uncheck');
471
+ }
472
+ if (!isNullOrUndefined(updatedData[parseInt(i.toString(), 10)].parentItem)) {
473
+ this.updateParentSelection(updatedData[parseInt(i.toString(), 10)].parentItem);
474
+ }
475
+ }
476
+ } else if (args.requestType === 'add' && this.parent.autoCheckHierarchy) {
477
+ (<ITreeData>args.data).checkboxState = 'uncheck';
478
+ } else if (requestType === 'filtering' || requestType === 'searching' || requestType === 'refresh'
479
+ && !isRemoteData(this.parent)) {
480
+ this.selectedItems = []; this.selectedIndexes = [];
481
+ childData = (!isNullOrUndefined(this.parent.filterModule) && this.parent.filterModule.filteredResult.length > 0) ?
482
+ this.parent.filterModule.filteredResult : this.parent.flatData;
483
+ childData.forEach((record: ITreeData) => {
484
+ if (this.parent.enableVirtualization) {
485
+ if (record.hasChildRecords && record.childRecords.length > 0) {
486
+ this.updateParentSelection(record);
487
+ } else {
488
+ this.updateSelectedItems(record, record.checkboxState);
489
+ }
490
+ let child: ITreeData[] = findChildrenRecords(record);
491
+ child = this.getFilteredChildRecords (child);
492
+ for (let i: number = 0; i < child.length; i++) {
493
+ if (child[parseInt(i.toString(), 10)].hasChildRecords) {
494
+ this.updateParentSelection(child[parseInt(i.toString(), 10)]);
495
+ } else if (!(child[parseInt(i.toString(), 10)].hasChildRecords) &&
496
+ !isNullOrUndefined(child[parseInt(i.toString(), 10)])) {
497
+ this.updateSelectedItems(child[parseInt(i.toString(), 10)],
498
+ child[parseInt(i.toString(), 10)].checkboxState);
499
+ }
500
+ }
501
+ }
502
+ else {
503
+ if (record.hasChildRecords) {
504
+ this.updateParentSelection(record);
505
+ } else {
506
+ this.updateSelectedItems(record, record.checkboxState);
507
+ }
508
+ }
509
+ });
510
+ this.headerSelection();
511
+ }
512
+ }
513
+ else {
514
+ if ((requestType === 'filtering' || requestType === 'searching' || requestType === 'refresh')
515
+ && !isRemoteData(this.parent)) {
516
+ this.selectedItems = [];
517
+ this.selectedIndexes = [];
518
+ }
519
+ }
520
+ }
521
+ }
522
+
523
+ public getCheckedrecords(): Object[] {
524
+ return this.selectedItems;
525
+ }
526
+
527
+ public getCheckedRowIndexes(): number[] {
528
+ return this.selectedIndexes;
529
+ }
530
+ }
@@ -0,0 +1,63 @@
1
+ import { TreeGrid } from '../base/treegrid';
2
+ import { SortDirection } from '@syncfusion/ej2-grids';
3
+ /**
4
+ * Internal dataoperations for TreeGrid
5
+ *
6
+ * @hidden
7
+ */
8
+ export declare class Sort {
9
+ private flatSortedData;
10
+ private taskIds;
11
+ private storedIndex;
12
+ private parent;
13
+ private isSelfReference;
14
+ constructor(grid: TreeGrid);
15
+ /**
16
+ * For internal use only - Get the module name.
17
+ *
18
+ * @private
19
+ * @returns {string} Returns Sort module name
20
+ */
21
+ private getModuleName;
22
+ /**
23
+ * @hidden
24
+ */
25
+ addEventListener(): void;
26
+ /**
27
+ * @hidden
28
+ * @returns {void}
29
+ */
30
+ removeEventListener(): void;
31
+ private createdSortedRecords;
32
+ private iterateSort;
33
+ /**
34
+ * Sorts a column with the given options.
35
+ *
36
+ * @param {string} columnName - Defines the column name to be sorted.
37
+ * @param {SortDirection} direction - Defines the direction of sorting field.
38
+ * @param {boolean} isMultiSort - Specifies whether the previous sorted columns are to be maintained.
39
+ * @returns {void}
40
+ */
41
+ sortColumn(columnName: string, direction: SortDirection, isMultiSort?: boolean): void;
42
+ removeSortColumn(field: string): void;
43
+ /**
44
+ * The function used to update sortSettings of TreeGrid.
45
+ *
46
+ * @returns {void}
47
+ * @hidden
48
+ */
49
+ private updateModel;
50
+ /**
51
+ * Clears all the sorted columns of the TreeGrid.
52
+ *
53
+ * @returns {void}
54
+ */
55
+ clearSorting(): void;
56
+ /**
57
+ * Destroys the Sorting of TreeGrid.
58
+ *
59
+ * @function destroy
60
+ * @returns {void}
61
+ */
62
+ destroy(): void;
63
+ }