canvas-datagrid 0.3.24 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/intf.js CHANGED
@@ -57,6 +57,20 @@ export default function (self, ctor) {
57
57
  self.scrollBox = {};
58
58
  self.visibleRows = [];
59
59
  self.visibleCells = [];
60
+ /**
61
+ * This array stored all groups information with context for drawing,
62
+ * it is generated by drawing functions,
63
+ * and be used for searching groups when users operate on the spreadsheet
64
+ * Each item of this array contains these properties:
65
+ * - `type`: its available values: 'c' and 'r'. indicates the type of this item, 'c' for column group
66
+ * and 'r' for row group.
67
+ * - `x`,`y`: the left-top point of this group's rendering area.
68
+ * - `x2`, `y2`: the right-bottom of this group's rendering area.
69
+ * - `collapsed`: this value indicates the collapsed status of this group.
70
+ * - `from`, `to`: The column index range of this group (We use this value for searching the group)
71
+ * - `row`: The row index for column groups (We use this value for searching the group)
72
+ */
73
+ self.visibleGroups = [];
60
74
  self.sizes = {
61
75
  rows: {},
62
76
  columns: {},
@@ -71,6 +85,18 @@ export default function (self, ctor) {
71
85
  columnIndex: -1,
72
86
  rowIndex: -1,
73
87
  };
88
+ self.cellTree = {
89
+ rows: [],
90
+ columns: {},
91
+ tempSchema: {},
92
+ rowTreeColIndex: 0,
93
+ columnTreeRowStartIndex: 0,
94
+ columnTreeRowEndIndex: 0,
95
+ origin: {
96
+ rows: [],
97
+ columns: {},
98
+ },
99
+ };
74
100
  self.hovers = {};
75
101
  self.attributes = {};
76
102
  self.style = {};
@@ -86,6 +112,29 @@ export default function (self, ctor) {
86
112
  self.scrollPixelLeft = 0;
87
113
  self.childGrids = {};
88
114
  self.openChildren = {};
115
+
116
+ /**
117
+ * Array for grouped columns
118
+ * Each item in this array is an array and it represents some grouping in one row
119
+ * A grouping descriptor has three properties:
120
+ * - `from`: The column index of the first column
121
+ * - `to`: The column index of the last column
122
+ * - `collapsed`: Is this group be collapsed
123
+ * @example [[{ from: 1, to: 2, collapsed: false }]]
124
+ */
125
+ self.groupedColumns = [];
126
+
127
+ /**
128
+ * Array for grouped rows
129
+ * Each item in this array is an array and it represents some grouping in one column
130
+ * A grouping descriptor has three properties:
131
+ * - `from`: The row index of the first row
132
+ * - `to`: The row index of the last row
133
+ * - `collapsed`: Is this group be collapsed
134
+ * @example [[{ from: 1, to: 2, collapsed: false }]]
135
+ */
136
+ self.groupedRows = [];
137
+
89
138
  self.scrollModes = [
90
139
  'vertical-scroll-box',
91
140
  'vertical-scroll-top',
@@ -99,6 +148,7 @@ export default function (self, ctor) {
99
148
  'afterdraw',
100
149
  'afterrendercell',
101
150
  'afterrenderfilterbutton',
151
+ 'aftercreategroup',
102
152
  'attributechanged',
103
153
  'beforebeginedit',
104
154
  'beforecreatecellgrid',
@@ -314,7 +364,7 @@ export default function (self, ctor) {
314
364
  );
315
365
  const columnName = schema[boundColumnIndex].name;
316
366
 
317
- self.viewData[boundRowIndex][columnName] = '';
367
+ self.originalData[boundRowIndex][columnName] = '';
318
368
 
319
369
  affectedCells.push([
320
370
  rowIndex,
@@ -337,6 +387,124 @@ export default function (self, ctor) {
337
387
  self.getBoundColumnIndexFromViewColumnIndex = function (viewColumnIndex) {
338
388
  return self.orders.columns[viewColumnIndex];
339
389
  };
390
+ /**
391
+ * Get the height of the area about column groups for rendering and handling events.
392
+ */
393
+ self.getColumnGroupAreaHeight = function () {
394
+ if (!self.attributes.allowGroupingColumns) {
395
+ return 0;
396
+ }
397
+ const groups = self.groupedColumns.length;
398
+ const base = self.style.columnGroupRowHeight * self.scale;
399
+ return base * groups;
400
+ };
401
+ /**
402
+ * Get the width of the area about row groups for rendering and handling events.
403
+ */
404
+ self.getRowGroupAreaWidth = function () {
405
+ if (!self.attributes.allowGroupingRows) {
406
+ return 0;
407
+ }
408
+ const groups = self.groupedRows.length;
409
+ const base = self.style.rowGroupColumnWidth * self.scale;
410
+ return base * groups;
411
+ };
412
+ self.getCollapsedColumnGroups = function () {
413
+ const result = [];
414
+ for (let rowIndex = 0; rowIndex < self.groupedColumns.length; rowIndex++) {
415
+ const groups = self.groupedColumns[rowIndex];
416
+ for (let groupIndex = 0; groupIndex < groups.length; groupIndex++) {
417
+ const group = groups[groupIndex];
418
+ if (group.collapsed) result.push(group);
419
+ }
420
+ }
421
+ return result;
422
+ };
423
+ self.getCollapsedRowGroups = function () {
424
+ const result = [];
425
+ for (let rowIndex = 0; rowIndex < self.groupedRows.length; rowIndex++) {
426
+ const groups = self.groupedRows[rowIndex];
427
+ for (let groupIndex = 0; groupIndex < groups.length; groupIndex++) {
428
+ const group = groups[groupIndex];
429
+ if (group.collapsed) result.push(group);
430
+ }
431
+ }
432
+ return result;
433
+ };
434
+ /**
435
+ * Toggle the collapse status of a group (expanded/collapsed)
436
+ * @param {{type:string,from:number,to:number}} group
437
+ */
438
+ self.toggleGroup = function (group) {
439
+ if (group.type === 'c') {
440
+ const { from, to } = group;
441
+ /** @type {{from:number,to:number,collapsed:boolean}} */
442
+ let matchedGroup;
443
+ /** @type {Array<Array<{from:number,to:number,collapsed:boolean}>>} */
444
+ const allGroups = self.groupedColumns;
445
+ for (let i = 0; i < allGroups.length; i++) {
446
+ const groups = allGroups[i];
447
+ for (let gi = 0; gi < groups.length; gi++) {
448
+ const group = groups[gi];
449
+ if (group.from === from && group.to === to) {
450
+ matchedGroup = group;
451
+ break;
452
+ }
453
+ }
454
+ if (matchedGroup) break;
455
+ }
456
+ if (!matchedGroup) return;
457
+ const nextCollapsed = !matchedGroup.collapsed;
458
+ matchedGroup.collapsed = nextCollapsed;
459
+ return true;
460
+ }
461
+ if (group.type === 'r') {
462
+ const { from, to } = group;
463
+ /** @type {{from:number,to:number,collapsed:boolean}} */
464
+ let matchedGroup;
465
+ /** @type {Array<Array<{from:number,to:number,collapsed:boolean}>>} */
466
+ const allGroups = self.groupedRows;
467
+ for (let i = 0; i < allGroups.length; i++) {
468
+ const groups = allGroups[i];
469
+ for (let gi = 0; gi < groups.length; gi++) {
470
+ const group = groups[gi];
471
+ if (group.from === from && group.to === to) {
472
+ matchedGroup = group;
473
+ break;
474
+ }
475
+ }
476
+ if (matchedGroup) break;
477
+ }
478
+ if (!matchedGroup) return;
479
+ const nextCollapsed = !matchedGroup.collapsed;
480
+ matchedGroup.collapsed = nextCollapsed;
481
+ return true;
482
+ }
483
+ return false;
484
+ };
485
+ self.isNewGroupRangeValid = function (groupsArray, from, to) {
486
+ for (let i = 0; i < groupsArray.length; i++) {
487
+ const groups = groupsArray[i];
488
+ for (let gIndex = 0; gIndex < groups.length; gIndex++) {
489
+ const group = groups[gIndex];
490
+ if (from === group.to + 1) return false;
491
+ if (from > group.to) continue;
492
+
493
+ if (from === group.from) {
494
+ if (to === group.to) return false;
495
+ if (to > group.to) return true;
496
+ break; // check smaller range
497
+ }
498
+ if (from > group.from) {
499
+ if (to > group.to) return false;
500
+ break; // check smaller range
501
+ }
502
+ if (to < group.to) return false;
503
+ return true;
504
+ }
505
+ }
506
+ return true;
507
+ };
340
508
  self.getColumnHeaderCellHeight = function () {
341
509
  if (!self.attributes.showColumnHeaders) {
342
510
  return 0;
@@ -464,6 +632,16 @@ export default function (self, ctor) {
464
632
  self.hasActiveFilters = function () {
465
633
  return self.columnFilters && Object.keys(self.columnFilters).length > 0;
466
634
  };
635
+ self.hasCollapsedRowGroup = function () {
636
+ for (let i = 0; i < self.groupedRows.length; i++) {
637
+ const groups = self.groupedRows[i];
638
+ for (let j = 0; j < groups.length; j++) {
639
+ const g = groups[j];
640
+ if (g.collapsed) return true;
641
+ }
642
+ }
643
+ return false;
644
+ };
467
645
  self.getFilteredAndSortedViewData = function (originalData) {
468
646
  // We make a copy of originalData here in order be able to
469
647
  // filter and sort rows without modifying the original array.
@@ -499,6 +677,59 @@ export default function (self, ctor) {
499
677
  });
500
678
  }
501
679
 
680
+ //#region Hide rows from collapsed group
681
+ /** @type {number[][]} */
682
+ let collapsedGroups = [];
683
+ for (let i = 0; i < self.groupedRows.length; i++) {
684
+ const rows = self.groupedRows[i];
685
+ for (let j = 0; j < rows.length; j++) {
686
+ const r = rows[j];
687
+ if (!r.collapsed) continue;
688
+ collapsedGroups.push([r.from, r.to]);
689
+ }
690
+ }
691
+ if (collapsedGroups.length > 0) {
692
+ //#region merge groups
693
+ collapsedGroups.sort((a, b) => a[0] - b[0]);
694
+ let newLen = 0;
695
+ const len = collapsedGroups.length;
696
+ for (let i = 0; i < len; i++) {
697
+ const r = collapsedGroups[i];
698
+ if (i === len - 1) {
699
+ collapsedGroups[newLen++] = r;
700
+ break;
701
+ }
702
+ const to = r[1];
703
+ const [from2, to2] = collapsedGroups[i + 1];
704
+ if (from2 > to + 1) {
705
+ collapsedGroups[newLen++] = r;
706
+ continue;
707
+ }
708
+ collapsedGroups[i + 1] = r;
709
+ if (to2 > to) collapsedGroups[i + 1][1] = to2;
710
+ }
711
+ collapsedGroups = collapsedGroups.slice(0, newLen);
712
+ //#endregion merge groups
713
+
714
+ //#region omit rows by groups
715
+ let g = collapsedGroups.shift();
716
+ for (let start = 0; start < newViewData.length; start++) {
717
+ const it = newViewData[start][1];
718
+ if (it < g[0]) continue;
719
+ let end = start + 1;
720
+ for (; end < newViewData.length; end++) {
721
+ const it2 = newViewData[end][1];
722
+ if (it2 > g[1]) break;
723
+ }
724
+ newViewData.splice(start, end - start);
725
+ g = collapsedGroups.shift();
726
+ if (!g) break;
727
+ start--;
728
+ }
729
+ //#endregion omit rows by groups
730
+ }
731
+ //#endregion Hide rows from collapsed group
732
+
502
733
  // Apply sorting
503
734
  for (const column of self.orderings.columns) {
504
735
  const sortFn = column.sortFunction(column.orderBy, column.orderDirection);
@@ -703,6 +934,329 @@ export default function (self, ctor) {
703
934
  }
704
935
  }
705
936
  };
937
+ self.toggleCollapseTree = function (rowIndex, columnIndex, type) {
938
+ let tempData = [];
939
+ let collapsedCount = 0;
940
+ if (
941
+ columnIndex == self.cellTree.rowTreeColIndex &&
942
+ (rowIndex > 0 || (rowIndex == 0 && self.cellTree.rows[0].icon))
943
+ ) {
944
+ let ctr = self.cellTree.rows;
945
+ switch (type) {
946
+ case 'Expand':
947
+ ctr[rowIndex].expand = true;
948
+ self.cellTree.origin.rows[ctr[rowIndex].index].expand = true;
949
+ break;
950
+
951
+ case 'Collapse':
952
+ ctr[rowIndex].expand = false;
953
+ self.cellTree.origin.rows[ctr[rowIndex].index].expand = false;
954
+ break;
955
+
956
+ default:
957
+ ctr[rowIndex].expand = !ctr[rowIndex].expand;
958
+ self.cellTree.origin.rows[ctr[rowIndex].index].expand =
959
+ ctr[rowIndex].expand;
960
+ }
961
+ for (
962
+ let ri = ctr[rowIndex].index + 1;
963
+ ri <= ctr[rowIndex].lastchild;
964
+ ri++
965
+ ) {
966
+ let orTree = self.cellTree.origin.rows[ri];
967
+ if (ctr[rowIndex].expand) {
968
+ orTree.hide = false;
969
+ if (orTree.icon && !orTree.expand) ri = orTree.lastchild;
970
+ } else {
971
+ orTree.hide = true;
972
+ }
973
+ }
974
+ } else if (self.cellTree.columns[rowIndex]) {
975
+ let ctc = self.cellTree.columns[rowIndex];
976
+
977
+ switch (type) {
978
+ case 'Expand':
979
+ ctc[columnIndex].expand = true;
980
+ break;
981
+
982
+ case 'Collapse':
983
+ ctc[columnIndex].expand = false;
984
+ break;
985
+
986
+ default:
987
+ ctc[columnIndex].expand = !ctc[columnIndex].expand;
988
+ }
989
+ for (
990
+ let ci = ctc[columnIndex].index + 1;
991
+ ci <= ctc[columnIndex].lastchild;
992
+ ci++
993
+ ) {
994
+ if (ctc[columnIndex].expand)
995
+ self.cellTree.tempSchema[ci].hidden = false;
996
+ else self.cellTree.tempSchema[ci].hidden = true;
997
+ }
998
+ let rc = 0,
999
+ _ri;
1000
+
1001
+ if (ctc[columnIndex].expand) {
1002
+ while (rc < ctc[columnIndex].child) {
1003
+ _ri = rowIndex + rc + 1;
1004
+
1005
+ for (
1006
+ let _ci = ctc[columnIndex].index;
1007
+ _ci <= ctc[columnIndex].lastchild;
1008
+ _ci++
1009
+ ) {
1010
+ if (
1011
+ self.cellTree.origin.columns[_ri] &&
1012
+ self.cellTree.origin.columns[_ri][_ci].icon &&
1013
+ !self.cellTree.origin.columns[_ri][_ci].expand
1014
+ ) {
1015
+ for (
1016
+ let si = _ci + 1;
1017
+ si <= self.cellTree.origin.columns[_ri][_ci].lastchild;
1018
+ si++
1019
+ ) {
1020
+ self.cellTree.tempSchema[si].hidden = true;
1021
+ }
1022
+ }
1023
+ }
1024
+
1025
+ rc++;
1026
+ }
1027
+ }
1028
+ }
1029
+ let otherData = {};
1030
+ let collapsed = [];
1031
+ self.cellTree.rows = [];
1032
+ self.cellTree.columns = {};
1033
+ for (let k in self.cellTree.origin.rows) {
1034
+ let tempRow = [];
1035
+ let tree = self.cellTree.origin.rows[k];
1036
+ if (!tree.hide) {
1037
+ let colTrees = [];
1038
+ let collapsedColCount = 0;
1039
+ if (k < self.cellTree.columnTreeRowStartIndex) {
1040
+ tempData.push(self.originalData[k]);
1041
+ } else {
1042
+ if (k > self.cellTree.columnTreeRowEndIndex) {
1043
+ otherData[k] = self.viewData[k];
1044
+ collapsedCount++;
1045
+ } else {
1046
+ for (let l = 0; l < self.originalData[k].length; l++) {
1047
+ if (!self.cellTree.tempSchema[l].hidden) {
1048
+ if (l < self.cellTree.rowTreeColIndex) {
1049
+ if (!Object.prototype.hasOwnProperty.call(otherData, k))
1050
+ otherData[k] = [];
1051
+ otherData[k].push(self.viewData[k][l]);
1052
+ }
1053
+ tempRow.push(self.originalData[k][l]);
1054
+ if (
1055
+ Object.prototype.hasOwnProperty.call(
1056
+ self.cellTree.origin.columns,
1057
+ k,
1058
+ )
1059
+ )
1060
+ colTrees.push(self.cellTree.origin.columns[k][l]);
1061
+ } else collapsedColCount++;
1062
+ }
1063
+ tempRow.push(
1064
+ ...Array(collapsedColCount)
1065
+ .fill()
1066
+ .map(function () {
1067
+ return '';
1068
+ }),
1069
+ );
1070
+ if (colTrees.length) {
1071
+ colTrees.push(
1072
+ ...Array(collapsedColCount)
1073
+ .fill()
1074
+ .map(() => {
1075
+ return {};
1076
+ }),
1077
+ );
1078
+ self.cellTree.columns[k] = colTrees;
1079
+ }
1080
+ tempData.push(tempRow);
1081
+ }
1082
+ }
1083
+ self.cellTree.rows.push(tree);
1084
+ } else {
1085
+ for (let l = 0; l < self.cellTree.rowTreeColIndex; l++) {
1086
+ tempRow.push(self.viewData[k][l]);
1087
+ }
1088
+ otherData[k] = tempRow;
1089
+ collapsed.push(
1090
+ Array(self.viewData[0].length)
1091
+ .fill()
1092
+ .map(function () {
1093
+ return '';
1094
+ }),
1095
+ );
1096
+ collapsedCount++;
1097
+ }
1098
+ }
1099
+ if (collapsedCount) {
1100
+ self.cellTree.rows.push(
1101
+ ...Array(collapsedCount)
1102
+ .fill()
1103
+ .map((u, index) => {
1104
+ return { index: self.cellTree.rows.length + index };
1105
+ }),
1106
+ );
1107
+ tempData.push(...collapsed);
1108
+ }
1109
+ for (let k in otherData) {
1110
+ if (k > self.cellTree.columnTreeRowEndIndex) tempData[k] = otherData[k];
1111
+ else
1112
+ for (let l in otherData[k]) {
1113
+ tempData[k][l] = otherData[k][l];
1114
+ }
1115
+ }
1116
+ self.viewData = tempData;
1117
+ };
1118
+ self.cellTreeExpandCollapse = function (rowIndex, columnIndex, type) {
1119
+ if (
1120
+ columnIndex == self.cellTree.rowTreeColIndex &&
1121
+ (rowIndex > 0 || (rowIndex == 0 && self.cellTree.rows[0].icon))
1122
+ ) {
1123
+ const ctr = self.cellTree.rows;
1124
+ switch (type) {
1125
+ case 'Expand':
1126
+ ctr[rowIndex].expand = true;
1127
+ break;
1128
+ case 'Collapse':
1129
+ ctr[rowIndex].expand = false;
1130
+ break;
1131
+ default:
1132
+ ctr[rowIndex].expand = !ctr[rowIndex].expand;
1133
+ }
1134
+ for (let ri = rowIndex + 1; ri <= ctr[rowIndex].lastchild; ri++) {
1135
+ if (ctr[rowIndex].expand) {
1136
+ ctr[ri].hide = false;
1137
+ if (ctr[ri].icon && !ctr[ri].expand) ri = ctr[ri].lastchild;
1138
+ } else {
1139
+ ctr[ri].hide = true;
1140
+ }
1141
+ }
1142
+ } else if (self.cellTree.columns[rowIndex]) {
1143
+ const ctc = self.cellTree.columns[rowIndex];
1144
+ switch (type) {
1145
+ case 'Expand':
1146
+ ctc[columnIndex].expand = true;
1147
+ break;
1148
+ case 'Collapse':
1149
+ ctc[columnIndex].expand = false;
1150
+ break;
1151
+ default:
1152
+ ctc[columnIndex].expand = !ctc[columnIndex].expand;
1153
+ }
1154
+
1155
+ for (let ci = columnIndex + 1; ci <= ctc[columnIndex].lastchild; ci++) {
1156
+ if (ctc[columnIndex].expand) self.tempSchema[ci].hidden = false;
1157
+ else self.tempSchema[ci].hidden = true;
1158
+ }
1159
+
1160
+ let rc = 0,
1161
+ ri;
1162
+ if (ctc[columnIndex].expand) {
1163
+ while (rc < ctc[columnIndex].child) {
1164
+ ri = rowIndex + rc + 1;
1165
+ for (let ci = columnIndex; ci <= ctc[columnIndex].lastchild; ci++) {
1166
+ if (
1167
+ self.cellTree.columns[ri] &&
1168
+ self.cellTree.columns[ri][ci].icon &&
1169
+ !self.cellTree.columns[ri][ci].expand
1170
+ ) {
1171
+ for (
1172
+ let si = ci + 1;
1173
+ si <= self.cellTree.columns[ri][ci].lastchild;
1174
+ si++
1175
+ )
1176
+ self.tempSchema[si].hidden = true;
1177
+ }
1178
+ }
1179
+ rc++;
1180
+ }
1181
+ }
1182
+ }
1183
+ };
1184
+
1185
+ self.initCellTreeSettings = function () {
1186
+ if (self.viewData === undefined) return;
1187
+ if (self.attributes.rowTree.length > 0 && self.viewData.length > 0) {
1188
+ self.cellTree.rows = Array(self.viewData.length)
1189
+ .fill()
1190
+ .map((u, index) => ({ index: index }));
1191
+ self.cellTree.rowTreeColIndex = self.attributes.rowTreeColIndex;
1192
+ let invalidRowTree = false;
1193
+ for (let rt of self.attributes.rowTree) {
1194
+ if (self.cellTree.rows.length <= rt.end) {
1195
+ invalidRowTree = true;
1196
+ break;
1197
+ }
1198
+
1199
+ for (let ri = rt.begin; ri <= rt.end; ri++) {
1200
+ if (ri == rt.begin) {
1201
+ self.cellTree.rows[ri].icon = true;
1202
+ self.cellTree.rows[ri].lastchild = rt.end;
1203
+ self.cellTree.rows[ri].expand = true;
1204
+ if (!self.cellTree.rows[ri].parentCount)
1205
+ self.cellTree.rows[ri].parentCount = 0;
1206
+ } else {
1207
+ self.cellTree.rows[ri].hide = false;
1208
+ self.cellTree.rows[ri].parentIndex = rt.begin;
1209
+ if (self.cellTree.rows[ri] && self.cellTree.rows[ri].parentCount)
1210
+ self.cellTree.rows[ri].parentCount += 1;
1211
+ else self.cellTree.rows[ri].parentCount = 1;
1212
+ }
1213
+ }
1214
+ }
1215
+ if (invalidRowTree) self.cellTree.rows = {};
1216
+ }
1217
+ if (self.attributes.columnTree.length > 0 && self.viewData.length > 0) {
1218
+ self.cellTree.columnTreeRowStartIndex =
1219
+ self.attributes.columnTreeRowStartIndex;
1220
+ self.cellTree.columnTreeRowEndIndex =
1221
+ self.attributes.columnTreeRowEndIndex;
1222
+ let dataColumnLength = Object.keys(self.viewData[0]).length;
1223
+ let invalidColumnTree = false;
1224
+ for (let ct of self.attributes.columnTree) {
1225
+ if (dataColumnLength <= ct.end) {
1226
+ invalidColumnTree = true;
1227
+ break;
1228
+ }
1229
+
1230
+ if (!self.cellTree.columns[ct.row])
1231
+ self.cellTree.columns[ct.row] = Array(dataColumnLength)
1232
+ .fill()
1233
+ .map((u, index) => ({ index: index }));
1234
+
1235
+ for (let i = ct.begin; i <= ct.end; i++) {
1236
+ const ctc = self.cellTree.columns[ct.row][i];
1237
+ if (i == ct.begin) {
1238
+ ctc.icon = true;
1239
+ ctc.lastchild = ct.end;
1240
+ ctc.length = ct.end - ct.begin;
1241
+ ctc.expand = true;
1242
+ if (ct.child) ctc.child = ct.child;
1243
+ else ctc.child = 0;
1244
+ }
1245
+ }
1246
+ }
1247
+ self.cellTree.tempSchema = Array(dataColumnLength)
1248
+ .fill()
1249
+ .map(function () {
1250
+ return { hidden: false };
1251
+ });
1252
+ if (invalidColumnTree) self.cellTree.columns = {};
1253
+ }
1254
+ self.cellTree.origin = {
1255
+ rows: self.cellTree.rows,
1256
+ columns: self.cellTree.columns,
1257
+ };
1258
+ };
1259
+
706
1260
  self.getDomRoot = function () {
707
1261
  return self.shadowRoot ? self.shadowRoot.host : self.parentNode;
708
1262
  };
@@ -874,6 +1428,8 @@ export default function (self, ctor) {
874
1428
  self.intf.gotoCell = self.gotoCell;
875
1429
  self.intf.gotoRow = self.gotoRow;
876
1430
  self.intf.addButton = self.addButton;
1431
+ self.intf.toggleCellCollapseTree = self.toggleCellCollapseTree;
1432
+ self.intf.expandCollapseCellTree = self.expandCollapseCellTree;
877
1433
  self.intf.getHeaderByName = self.getHeaderByName;
878
1434
  self.intf.findColumnScrollLeft = self.findColumnScrollLeft;
879
1435
  self.intf.findRowScrollTop = self.findRowScrollTop;
@@ -881,6 +1437,14 @@ export default function (self, ctor) {
881
1437
  self.intf.findColumnMaxTextLength = self.findColumnMaxTextLength;
882
1438
  self.intf.disposeContextMenu = self.disposeContextMenu;
883
1439
  self.intf.getCellAt = self.getCellAt;
1440
+ self.intf.groupColumns = self.groupColumns;
1441
+ self.intf.groupRows = self.groupRows;
1442
+ self.intf.removeGroupColumns = self.removeGroupColumns;
1443
+ self.intf.removeGroupRows = self.removeGroupRows;
1444
+ self.intf.toggleGroupColumns = self.toggleGroupColumns;
1445
+ self.intf.toggleGroupRows = self.toggleGroupRows;
1446
+ self.intf.getGroupsColumnBelongsTo = self.getGroupsColumnBelongsTo;
1447
+ self.intf.getGroupsRowBelongsTo = self.getGroupsRowBelongsTo;
884
1448
  self.intf.isCellVisible = self.isCellVisible;
885
1449
  self.intf.isRowVisible = self.isRowVisible;
886
1450
  self.intf.isColumnVisible = self.isColumnVisible;
@@ -1010,6 +1574,13 @@ export default function (self, ctor) {
1010
1574
  if (key === 'name') {
1011
1575
  self.tryLoadStoredSettings();
1012
1576
  }
1577
+ if (
1578
+ key === 'rowTree' ||
1579
+ key === 'columnTree' ||
1580
+ key === 'columnTreeRowEndIndex'
1581
+ ) {
1582
+ self.initCellTreeSettings();
1583
+ }
1013
1584
  self.draw(true);
1014
1585
  self.dispatchEvent('attributechanged', {
1015
1586
  name: key,
@@ -1623,6 +2194,7 @@ export default function (self, ctor) {
1623
2194
  self.createRowOrders();
1624
2195
  self.tryLoadStoredSettings();
1625
2196
  self.dispatchEvent('datachanged', { data: self.originalData });
2197
+ self.initCellTreeSettings();
1626
2198
  self.resize(true);
1627
2199
  });
1628
2200
  },