canvas-datagrid 0.4.5 → 0.4.7

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.
@@ -702,32 +702,9 @@ export default function (self) {
702
702
  if (self.hovers.onFilterButton) return;
703
703
  if (self.hovers.onCellTreeIcon) return;
704
704
  if (!self.dragAddToSelection && cell.rowIndex !== undefined) {
705
- if (
706
- self.selections[cell.rowIndex] &&
707
- self.selections[cell.rowIndex].indexOf(cell.columnIndex) !==
708
- -1
709
- ) {
710
- self.selections[cell.rowIndex].splice(
711
- self.selections[cell.rowIndex].indexOf(cell.columnIndex),
712
- 1,
713
- );
714
- }
705
+ if (self.isCellSelected(cell)) self.unselectCell(cell);
715
706
  } else {
716
- self.selections[cell.rowIndex] =
717
- self.selections[cell.rowIndex] || [];
718
- if (
719
- self.selections[cell.rowIndex].indexOf(cell.columnIndex) ===
720
- -1
721
- ) {
722
- self.selections[cell.rowIndex].push(cell.columnIndex);
723
- var event = {
724
- selections: self.selections,
725
- selectedData: self.getSelectedData(),
726
- selectedCells: self.getSelectedCells(),
727
- selectionBounds: self.getSelectionBounds(),
728
- };
729
- self.dispatchEvent('selectionchanged', event);
730
- }
707
+ if (!self.isCellSelected(cell)) self.selectCell(cell);
731
708
  }
732
709
  }
733
710
  }
@@ -740,11 +717,8 @@ export default function (self) {
740
717
  dragBounds.right !== self.selectionBounds.right) &&
741
718
  !ctrl
742
719
  ) {
743
- if (!(cell.hovered && self.hovers.onFilterButton)) {
744
- self.selections = [];
745
- self.selectedRows = [];
746
- self.selectedColumns = [];
747
- }
720
+ if (!(cell.hovered && self.hovers.onFilterButton))
721
+ self.clearSelections();
748
722
  if (dragBounds.top === -1) {
749
723
  dragBounds.top = 0;
750
724
  }
@@ -832,17 +806,7 @@ export default function (self) {
832
806
  if (startingBounds === JSON.stringify(sb)) {
833
807
  return;
834
808
  }
835
- ev = {
836
- selections: self.selections,
837
- selectionBounds: self.getSelectionBounds(),
838
- selectedCells: self.getSelectedCells(),
839
- };
840
- Object.defineProperty(ev, 'selectedData', {
841
- get: function () {
842
- return self.getSelectedData();
843
- },
844
- });
845
- self.dispatchEvent('selectionchanged', ev);
809
+ self.dispatchEvent('selectionchanged', self.getContextOfSelectionEvent());
846
810
  }
847
811
  if (self.input) {
848
812
  self.endEdit();
@@ -914,7 +878,6 @@ export default function (self) {
914
878
  return;
915
879
  }
916
880
  }
917
- self.selections[i.rowIndex] = self.selections[i.rowIndex] || [];
918
881
  if (
919
882
  self.attributes.selectionMode === 'row' ||
920
883
  self.currentCell.style === 'rowHeaderCell'
@@ -947,6 +910,7 @@ export default function (self) {
947
910
  self.draw(true);
948
911
  };
949
912
  self.dragResizeColumn = function (e) {
913
+ const resizingColumn = self.dragMode === 'ew-resize';
950
914
  var pos, x, y;
951
915
  pos = self.getLayerPos(e);
952
916
  x = self.resizingStartingWidth + pos.x - self.dragStart.x;
@@ -958,14 +922,31 @@ export default function (self) {
958
922
  y = self.style.minRowHeight;
959
923
  }
960
924
  if (
961
- self.dispatchEvent('resizecolumn', {
925
+ self.dispatchEvent(resizingColumn ? 'resizecolumn' : 'resizerow', {
962
926
  x: x,
963
927
  y: y,
928
+ width: x,
929
+ height: y,
930
+ columnIndex: resizingColumn ? self.draggingItem.columnIndex : undefined,
931
+ rowIndex: resizingColumn ? undefined : self.draggingItem.rowIndex,
964
932
  draggingItem: self.draggingItem,
965
933
  })
966
934
  ) {
967
935
  return false;
968
936
  }
937
+ if (self.attributes.resizeAfterDragged) {
938
+ self.pendingDragResize = {
939
+ item: self.draggingItem,
940
+ width: x,
941
+ height: y,
942
+ x: e.clientX,
943
+ y: e.clientY,
944
+ };
945
+ } else {
946
+ self.dragResizeApply(self.draggingItem, x, y);
947
+ }
948
+ };
949
+ self.dragResizeApply = function (draggingItem, width, height) {
969
950
  if (
970
951
  self.scrollBox.scrollLeft >
971
952
  self.scrollBox.scrollWidth - self.attributes.resizeScrollZone &&
@@ -975,29 +956,27 @@ export default function (self) {
975
956
  }
976
957
  if (self.dragMode === 'ew-resize') {
977
958
  self.sizes.columns[
978
- self.draggingItem.header.style === 'rowHeaderCell'
959
+ draggingItem.header.style === 'rowHeaderCell'
979
960
  ? 'cornerCell'
980
- : self.draggingItem.sortColumnIndex
981
- ] = x;
961
+ : draggingItem.sortColumnIndex
962
+ ] = width;
982
963
  if (
983
- ['rowHeaderCell', 'cornerCell'].indexOf(
984
- self.draggingItem.header.style,
985
- ) !== -1
964
+ ['rowHeaderCell', 'cornerCell'].indexOf(draggingItem.header.style) !==
965
+ -1
986
966
  ) {
987
967
  self.resize(true);
988
968
  }
989
969
  self.resizeChildGrids();
990
970
  return;
991
- }
992
- if (self.dragMode === 'ns-resize') {
993
- if (self.draggingItem.rowOpen) {
994
- self.sizes.trees[self.draggingItem.rowIndex] = y;
971
+ } else if (self.dragMode === 'ns-resize') {
972
+ if (draggingItem.rowOpen) {
973
+ self.sizes.trees[draggingItem.rowIndex] = height;
995
974
  } else if (self.attributes.globalRowResize) {
996
- self.style.cellHeight = y;
975
+ self.style.cellHeight = height;
997
976
  } else {
998
- self.sizes.rows[self.draggingItem.rowIndex] = y;
977
+ self.sizes.rows[draggingItem.rowIndex] = height;
999
978
  }
1000
- self.dispatchEvent('resizerow', { row: y });
979
+ self.dispatchEvent('resizerow', { row: height });
1001
980
  self.resizeChildGrids();
1002
981
  return;
1003
982
  }
@@ -1006,6 +985,15 @@ export default function (self) {
1006
985
  self.stopDragResize = function (event) {
1007
986
  const pos = self.getLayerPos(event);
1008
987
 
988
+ if (self.attributes.resizeAfterDragged) {
989
+ self.dragResizeApply(
990
+ self.pendingDragResize.item,
991
+ self.pendingDragResize.width,
992
+ self.pendingDragResize.height,
993
+ );
994
+ self.pendingDragResize = undefined;
995
+ }
996
+
1009
997
  if (self.dragMode === 'ew-resize') {
1010
998
  const hasMoved = !!(pos.x - self.dragStart.x);
1011
999
  // Check that dragItem is selected or part of selection.
@@ -1021,6 +1009,18 @@ export default function (self) {
1021
1009
  // If the column is selected, resize it to width plus any other selected columns.
1022
1010
  self.fitSelectedColumns(width);
1023
1011
  }
1012
+ } else if (self.dragMode === 'ns-resize') {
1013
+ // Do the above for rows.
1014
+ const hasMoved = !!(pos.y - self.dragStart.y);
1015
+ const dragItemIsSelected = self.isRowSelected(self.dragItem.rowIndex);
1016
+
1017
+ if (hasMoved && dragItemIsSelected) {
1018
+ const height = Math.max(
1019
+ self.resizingStartingHeight + pos.y - self.dragStart.y,
1020
+ self.style.minRowHeight,
1021
+ );
1022
+ self.fitSelectedRows(height);
1023
+ }
1024
1024
  }
1025
1025
 
1026
1026
  self.resize();
@@ -1194,17 +1194,16 @@ export default function (self) {
1194
1194
  }
1195
1195
  };
1196
1196
  self.stopDragReorder = function (e) {
1197
- var oIndex,
1198
- tIndex,
1199
- odata = [],
1200
- cr = {
1201
- 'row-reorder': self.orders.rows,
1202
- 'column-reorder': self.orders.columns,
1203
- },
1204
- i = {
1205
- 'row-reorder': 'rowIndex',
1206
- 'column-reorder': 'sortColumnIndex',
1207
- }[self.dragMode];
1197
+ let originalIndex;
1198
+ let targetIndex;
1199
+ const orderLists = {
1200
+ 'row-reorder': self.orders.rows,
1201
+ 'column-reorder': self.orders.columns,
1202
+ };
1203
+ const indexName = {
1204
+ 'row-reorder': 'rowIndex',
1205
+ 'column-reorder': 'sortColumnIndex',
1206
+ }[self.dragMode];
1208
1207
  window.removeEventListener('mousemove', self.dragReorder, false);
1209
1208
  window.removeEventListener('mouseup', self.stopDragReorder, false);
1210
1209
  if (
@@ -1216,7 +1215,7 @@ export default function (self) {
1216
1215
  (self.dragMode === 'row-reorder' &&
1217
1216
  self.reorderTarget.rowIndex > -1 &&
1218
1217
  self.reorderTarget.rowIndex < self.viewData.length)) &&
1219
- self.reorderObject[i] !== self.reorderTarget[i] &&
1218
+ self.reorderObject[indexName] !== self.reorderTarget[indexName] &&
1220
1219
  !self.dispatchEvent('reorder', {
1221
1220
  NativeEvent: e,
1222
1221
  source: self.reorderObject,
@@ -1225,61 +1224,64 @@ export default function (self) {
1225
1224
  })
1226
1225
  ) {
1227
1226
  self.ignoreNextClick = true;
1228
- oIndex = cr[self.dragMode].indexOf(self.reorderObject[i]);
1229
- tIndex = cr[self.dragMode].indexOf(self.reorderTarget[i]);
1227
+ originalIndex = orderLists[self.dragMode].indexOf(
1228
+ self.reorderObject[indexName],
1229
+ );
1230
+ targetIndex = orderLists[self.dragMode].indexOf(
1231
+ self.reorderTarget[indexName],
1232
+ );
1230
1233
  if (self.dragMode === 'column-reorder') {
1231
- var sortColumnIndices = [];
1232
- var selectedColumnIndices = [];
1233
- if (self.selections[0]) {
1234
- oIndex = self.selections[0][0];
1235
- self.selections[0].forEach(function (value) {
1234
+ /** Select column view indexes in the first row */
1235
+ const selectedIndexes = self.getRowSelectionStates(0);
1236
+ const sortColumnIndices = [];
1237
+ const selectedColumnIndices = [];
1238
+ if (selectedIndexes) {
1239
+ originalIndex = selectedIndexes[0];
1240
+ selectedIndexes.forEach(function (value) {
1236
1241
  sortColumnIndices.push(self.orders.columns[value]);
1237
1242
  });
1238
1243
  }
1239
- var deleteCount = sortColumnIndices.length;
1244
+ const deleteCount = sortColumnIndices.length;
1240
1245
  if (
1241
- tIndex < oIndex ||
1242
- (tIndex > oIndex && Math.abs(tIndex - oIndex) >= deleteCount)
1246
+ targetIndex < originalIndex ||
1247
+ (targetIndex > originalIndex &&
1248
+ Math.abs(targetIndex - originalIndex) >= deleteCount)
1243
1249
  ) {
1244
- cr[self.dragMode].splice(oIndex, deleteCount);
1245
- if (tIndex > oIndex) tIndex = tIndex - (deleteCount - 1);
1246
-
1247
- self.selectedColumns = [];
1248
- for (var i = 0; i < sortColumnIndices.length; i++) {
1249
- if (i === 0) self.activeCell.columnIndex = tIndex;
1250
- selectedColumnIndices.push(tIndex + i);
1251
- self.selectedColumns.push(sortColumnIndices[i]);
1252
- cr[self.dragMode].splice(tIndex + i, 0, sortColumnIndices[i]);
1250
+ orderLists[self.dragMode].splice(originalIndex, deleteCount);
1251
+ if (targetIndex > originalIndex)
1252
+ targetIndex = targetIndex - (deleteCount - 1);
1253
+
1254
+ for (let i = 0; i < sortColumnIndices.length; i++) {
1255
+ if (i === 0) self.activeCell.columnIndex = targetIndex;
1256
+ selectedColumnIndices.push(targetIndex + i);
1257
+ orderLists[self.dragMode].splice(
1258
+ targetIndex + i,
1259
+ 0,
1260
+ sortColumnIndices[i],
1261
+ );
1253
1262
  }
1254
1263
 
1255
- self.orders.columns = cr[self.dragMode];
1256
- self.viewData.forEach(function (row, rowIndex) {
1257
- self.selections[rowIndex] = selectedColumnIndices;
1258
- });
1264
+ self.orders.columns = orderLists[self.dragMode];
1265
+ self.selectColumnViewIndexes(selectedColumnIndices);
1259
1266
  }
1260
1267
  } else {
1261
- var selectedRows = [];
1262
- self.selections.forEach(function (row, rowIndex) {
1263
- if (row) {
1264
- selectedRows.push(row);
1265
- odata.push(self.viewData[rowIndex]);
1266
- }
1267
- });
1268
+ /** The original name of this variable is `odata` */
1269
+ const rowIndexes = self.getRowViewIndexesFromSelection();
1270
+ const originalData = rowIndexes.map(
1271
+ (rowIndex) => self.viewData[rowIndex],
1272
+ );
1268
1273
  if (
1269
- tIndex < oIndex ||
1270
- (tIndex > oIndex && Math.abs(tIndex - oIndex) >= odata.length)
1274
+ targetIndex < originalIndex ||
1275
+ (targetIndex > originalIndex &&
1276
+ Math.abs(targetIndex - originalIndex) >= originalData.length)
1271
1277
  ) {
1272
- self.viewData.splice(oIndex, odata.length);
1273
- self.selections = [];
1274
- self.selectedRows = [];
1275
- if (tIndex > oIndex) tIndex = tIndex - (odata.length - 1);
1276
- self.activeCell.rowIndex = tIndex;
1277
-
1278
- for (var i = 0; i < odata.length; i++) {
1279
- self.viewData.splice(tIndex + i, 0, odata[i]);
1280
- self.selections[tIndex + i] = selectedRows[i];
1281
- self.selectedRows.push(tIndex + i);
1282
- }
1278
+ self.viewData.splice(originalIndex, originalData.length);
1279
+ if (targetIndex > originalIndex)
1280
+ targetIndex = targetIndex - (originalData.length - 1);
1281
+ self.activeCell.rowIndex = targetIndex;
1282
+ for (let i = 0; i < originalData.length; i++)
1283
+ self.viewData.splice(targetIndex + i, 0, originalData[i]);
1284
+ self.moveSelection(0, targetIndex);
1283
1285
  }
1284
1286
  }
1285
1287
  self.resize();
@@ -1497,9 +1499,7 @@ export default function (self) {
1497
1499
  !(self.dragMode == 'row-reorder' && self.isMultiRowsSelected) &&
1498
1500
  !(self.currentCell.hovered && self.hovers.onFilterButton)
1499
1501
  ) {
1500
- self.selections = [];
1501
- self.selectedRows = [];
1502
- self.selectedColumns = [];
1502
+ self.clearSelections();
1503
1503
  }
1504
1504
  }
1505
1505
  if (self.dragStartObject.isGrid) {
@@ -1569,7 +1569,7 @@ export default function (self) {
1569
1569
  }
1570
1570
  if (move) {
1571
1571
  self.draggingItem = self.dragItem;
1572
- self.movingSelection = self.selections.concat([]);
1572
+ self.movingSelection = self.cloneSelections();
1573
1573
  self.dragging = self.dragStartObject;
1574
1574
  if (
1575
1575
  self.dispatchEvent('beginmove', {
@@ -1777,7 +1777,7 @@ export default function (self) {
1777
1777
 
1778
1778
  // TODO - most likely some column order related bugs in key based selection
1779
1779
  // Arrows
1780
- var isArrowKey = [
1780
+ const isArrowKey = [
1781
1781
  'ArrowLeft',
1782
1782
  'ArrowUp',
1783
1783
  'ArrowRight',
@@ -1786,63 +1786,12 @@ export default function (self) {
1786
1786
 
1787
1787
  // Shrinking and expanding selection using shift and arrow keys
1788
1788
  if (e.shiftKey && isArrowKey) {
1789
- const firstSelectedRowIndex = self.selections.findIndex((el) => !!el);
1790
- const firstSelectedRow = self.selections[firstSelectedRowIndex];
1791
- const firstSelectedColumnIndex = firstSelectedRow[0];
1792
- const lastSelectedColumn = firstSelectedRow[firstSelectedRow.length - 1];
1793
- const yAtTop = y === 0;
1794
- const yAtBottom = y === last;
1795
- const xAtLeft = x === 0;
1796
- const xAtRight = x === cols;
1797
-
1798
- if (e.key === 'ArrowUp') {
1799
- if (y + 1 > firstSelectedRowIndex && !yAtTop) {
1800
- self.selections.pop();
1801
- } else if (y < firstSelectedRowIndex) {
1802
- self.selections[y] = self.selections[y] || [];
1803
- self.selections[y].push(x);
1804
- } else if (yAtTop && self.activeCell.rowIndex !== 0) {
1805
- self.selections.pop();
1806
- }
1807
- }
1808
-
1809
- if (e.key === 'ArrowDown') {
1810
- if (y > firstSelectedRowIndex && y === self.selections.length) {
1811
- self.selections[y] = self.selections[y] || [];
1812
- self.selections[y].push(x);
1813
- } else if (y >= firstSelectedRowIndex && !yAtBottom) {
1814
- delete self.selections[y - 1];
1815
- } else if (yAtBottom && self.activeCell.rowIndex !== last) {
1816
- delete self.selections[y - 1];
1817
- }
1818
- }
1819
-
1820
- for (const selection of self.selections) {
1821
- if (e.key === 'ArrowRight' && selection) {
1822
- if (x > lastSelectedColumn) {
1823
- selection.push(x);
1824
- } else if (x <= lastSelectedColumn && !xAtRight) {
1825
- selection.shift();
1826
- } else if (xAtRight && self.activeCell.columnIndex !== cols) {
1827
- selection.shift();
1828
- }
1829
- }
1830
-
1831
- if (e.key === 'ArrowLeft' && selection) {
1832
- if (x < firstSelectedColumnIndex) {
1833
- selection.unshift(x);
1834
- } else if (x >= firstSelectedColumnIndex && !xAtLeft) {
1835
- selection.pop();
1836
- } else if (xAtLeft && self.activeCell.columnIndex !== 0) {
1837
- selection.pop();
1838
- }
1839
- }
1840
- }
1841
-
1842
- self.selectionBounds = self.getSelectionBounds();
1843
- self.selectArea(undefined, ctrl);
1844
-
1845
- self.draw(true);
1789
+ const changed = self.shrinkOrExpandSelections(
1790
+ { rowIndex: y, columnIndex: x },
1791
+ e,
1792
+ true,
1793
+ );
1794
+ if (changed) self.draw(true);
1846
1795
  }
1847
1796
 
1848
1797
  if (x !== self.activeCell.columnIndex || y !== self.activeCell.rowIndex) {
@@ -1853,25 +1802,8 @@ export default function (self) {
1853
1802
 
1854
1803
  self.setActiveCell(x, y);
1855
1804
  if (!e.shiftKey && self.attributes.selectionFollowsActiveCell) {
1856
- if (!ctrl) {
1857
- self.selections = [];
1858
- self.selectedRows = [];
1859
- self.selectedColumns = [];
1860
- }
1861
- self.selections[y] = self.selections[y] || [];
1862
- self.selections[y].push(x);
1863
- ev = {
1864
- selectedData: self.getSelectedData(),
1865
- selections: self.selections,
1866
- selectionBounds: self.getSelectionBounds(),
1867
- selectedCells: self.getSelectedCells(),
1868
- };
1869
- Object.defineProperty(ev, 'selectedData', {
1870
- get: function () {
1871
- return self.getSelectedData();
1872
- },
1873
- });
1874
- self.dispatchEvent('selectionchanged', ev);
1805
+ if (!ctrl) self.clearSelections();
1806
+ self.selectCell({ rowIndex: y, viewColumnIndex: x });
1875
1807
  }
1876
1808
  self.draw(true);
1877
1809
  }
@@ -1952,7 +1884,7 @@ export default function (self) {
1952
1884
  deltaY = e.deltaY === undefined ? e.NativeEvent.deltaY : e.deltaY,
1953
1885
  deltaMode =
1954
1886
  e.deltaMode === undefined ? e.NativeEvent.deltaMode : e.deltaMode;
1955
- var e = e.NativeEvent || e;
1887
+ if (e.NativeEvent) e = e.NativeEvent;
1956
1888
  if (wheeling) {
1957
1889
  ev.preventDefault(e);
1958
1890
  return;
@@ -2005,9 +1937,6 @@ export default function (self) {
2005
1937
  return;
2006
1938
  }
2007
1939
 
2008
- self.selectedRows = [];
2009
- self.selectedColumns = [];
2010
-
2011
1940
  const rows = parseData(pasteValue, mimeType);
2012
1941
  const columnsLength = rows[0].length;
2013
1942
 
@@ -2050,19 +1979,14 @@ export default function (self) {
2050
1979
  }
2051
1980
 
2052
1981
  // selections is a sparse array, so we condense:
2053
- var affectedCells = [];
2054
-
2055
- self.selections.forEach(function (row, rowIndex) {
2056
- if (rowIndex === undefined) return;
2057
-
2058
- row.forEach(function (columnIndex) {
2059
- affectedCells.push([
2060
- rowIndex,
2061
- columnIndex,
2062
- self.getBoundRowIndexFromViewRowIndex(rowIndex),
2063
- self.getBoundColumnIndexFromViewColumnIndex(columnIndex),
2064
- ]);
2065
- });
1982
+ const affectedCells = [];
1983
+ self.forEachSelectedCell((viewData, viewRowIndex, columnName, cell) => {
1984
+ affectedCells.push([
1985
+ viewRowIndex,
1986
+ cell.viewColumnIndex,
1987
+ cell.boundRowIndex,
1988
+ cell.boundColumnIndex,
1989
+ ]);
2066
1990
  });
2067
1991
 
2068
1992
  self.dispatchEvent('afterpaste', {
@@ -2086,9 +2010,10 @@ export default function (self) {
2086
2010
  var schema = self.getSchema();
2087
2011
  const rowsLength = Math.max(rows.length, minRowsLength);
2088
2012
  const fillCellCallback = self.fillCellCallback;
2089
- const selections = clearSelections ? [] : self.selections;
2090
2013
  const filledCells = [];
2091
2014
 
2015
+ if (clearSelections) self.selections = [];
2016
+
2092
2017
  for (
2093
2018
  let rowPosReal = 0, rowDataPos = 0;
2094
2019
  rowPosReal < rowsLength;
@@ -2134,12 +2059,6 @@ export default function (self) {
2134
2059
  }
2135
2060
  : undefined;
2136
2061
 
2137
- self.selectedRows.push(realRowIndex);
2138
-
2139
- if (selections[realRowIndex] === undefined) {
2140
- selections[realRowIndex] = [];
2141
- }
2142
-
2143
2062
  for (
2144
2063
  var colPosReal = 0, cellDataPos = 0;
2145
2064
  colPosReal < cellsLength;
@@ -2154,7 +2073,7 @@ export default function (self) {
2154
2073
  ? cellsLength - colPosReal - 1
2155
2074
  : colPosReal;
2156
2075
  const columnIndex = startColumnIndex + colPosition;
2157
- var column = schema[columnIndex];
2076
+ var column = schema[self.orders.columns[columnIndex]];
2158
2077
 
2159
2078
  if (!column) {
2160
2079
  console.warn('Paste data exceeded grid bounds. Skipping.');
@@ -2199,7 +2118,10 @@ export default function (self) {
2199
2118
  : cellData;
2200
2119
  }
2201
2120
 
2202
- selections[realRowIndex].push(columnIndex);
2121
+ self.selectCell(
2122
+ { rowIndex: realRowIndex, viewColumnIndex: columnIndex },
2123
+ true,
2124
+ );
2203
2125
 
2204
2126
  if (alwaysFilling || fillingRow || fillingColumn) {
2205
2127
  filledCells.push([
@@ -2209,9 +2131,6 @@ export default function (self) {
2209
2131
  self.getBoundColumnIndexFromViewColumnIndex(columnIndex),
2210
2132
  ]);
2211
2133
  }
2212
-
2213
- if (self.selectedColumns.indexOf(columnIndex) === -1)
2214
- self.selectedColumns.push(columnIndex);
2215
2134
  }
2216
2135
 
2217
2136
  self.originalData[self.boundRowIndexMap.get(realRowIndex)] = newRowData;
@@ -2222,8 +2141,6 @@ export default function (self) {
2222
2141
  self.viewData[realRowIndex] = newRowData;
2223
2142
  }
2224
2143
 
2225
- self.selections = selections;
2226
-
2227
2144
  if (filledCells.length > 0 || alwaysFilling) {
2228
2145
  self.dispatchEvent('afterfill', {
2229
2146
  filledCells: filledCells,
@@ -2251,19 +2168,18 @@ export default function (self) {
2251
2168
  return -1;
2252
2169
  };
2253
2170
  self.getSelectionIndex = function () {
2254
- for (
2255
- let rowIndex = 0, len = self.selections.length;
2256
- rowIndex < len;
2257
- rowIndex++
2258
- ) {
2259
- const row = self.selections[rowIndex];
2171
+ const bounds = self.getSelectionBounds(true);
2172
+ if (!bounds) return;
2173
+ const { top, bottom } = bounds;
2174
+ for (let rowIndex = top; rowIndex <= bottom; rowIndex++) {
2175
+ const row = self.getRowSelectionStates(rowIndex);
2260
2176
  if (row) {
2261
2177
  if (row[0] === undefined) break;
2262
2178
 
2263
2179
  return {
2264
2180
  row: rowIndex,
2265
2181
  column: row[0] < 0 ? row[1] : row[0],
2266
- rowLength: len - rowIndex,
2182
+ rowLength: bottom - rowIndex + 1,
2267
2183
  columnLength: row.length - (row[0] < 0 ? 1 : 0),
2268
2184
  };
2269
2185
  }
@@ -2342,9 +2258,17 @@ export default function (self) {
2342
2258
  self.copySelectedCellsToClipboard(event.clipboardData);
2343
2259
 
2344
2260
  const affectedCells = self.clearSelectedCells();
2261
+ const apiCompatibleCells = affectedCells.map((cell) => {
2262
+ return [
2263
+ cell.viewRowIndex,
2264
+ cell.viewColumnIndex,
2265
+ cell.boundRowIndex,
2266
+ cell.boundColumnIndex,
2267
+ ];
2268
+ });
2345
2269
 
2346
2270
  self.dispatchEvent('aftercut', {
2347
- cells: affectedCells,
2271
+ cells: apiCompatibleCells,
2348
2272
  });
2349
2273
 
2350
2274
  requestAnimationFrame(() => self.draw());