canvas-datagrid 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -386,9 +386,17 @@ export default function (self) {
386
386
  );
387
387
  // set canvas drawing related items
388
388
  if (!self.isChildGrid) {
389
- self.canvas.width = self.width * ratio;
390
- self.canvas.height = self.height * ratio;
391
- self.ctx.scale(ratio, ratio);
389
+ const newWidth = self.width * ratio;
390
+ const newHeight = self.height * ratio;
391
+ // We need to check is settings size to canvas necessary,
392
+ // because settings the canvas'size will cause the canvas and its state be cleared
393
+ // even if the size is the same.
394
+ // Notes: Please don't call `self.resize()` without a subsequent call to `self.draw()`
395
+ if (self.canvas.width !== newWidth || self.canvas.height !== newHeight) {
396
+ self.canvas.width = newWidth;
397
+ self.canvas.height = newHeight;
398
+ self.ctx.scale(ratio, ratio);
399
+ }
392
400
  }
393
401
  // resize any open dom elements (input/textarea)
394
402
  self.resizeEditInput();
@@ -616,6 +624,9 @@ export default function (self) {
616
624
  dragBounds.top = -1;
617
625
  dragBounds.bottom = self.viewData.length - 1;
618
626
  if (dragBounds.left < 0) dragBounds.left = 0;
627
+ if (dragBounds.left != dragBounds.right)
628
+ self.isMultiColumnsSelected = true;
629
+ else self.isMultiRowsSelected = false;
619
630
  }
620
631
 
621
632
  if (
@@ -729,6 +740,8 @@ export default function (self) {
729
740
  ) {
730
741
  if (!(cell.hovered && self.hovers.onFilterButton)) {
731
742
  self.selections = [];
743
+ self.selectedRows = [];
744
+ self.selectedColumns = [];
732
745
  }
733
746
  if (dragBounds.top === -1) {
734
747
  dragBounds.top = 0;
@@ -740,8 +753,13 @@ export default function (self) {
740
753
  }
741
754
  } else {
742
755
  self.selectArea(sBounds, true);
743
- if (sBounds.left == -1 && sBounds.top !== sBounds.bottom)
756
+ self.activeCell.rowIndex = sBounds.top;
757
+ self.activeCell.columnIndex = sBounds.left;
758
+ if (sBounds.left == -1 && sBounds.top !== sBounds.bottom) {
759
+ self.activeCell.columnIndex = 0;
744
760
  self.isMultiRowsSelected = true;
761
+ self.isMultiColumnsSelected = false;
762
+ }
745
763
  }
746
764
  }
747
765
 
@@ -981,12 +999,8 @@ export default function (self) {
981
999
  }
982
1000
 
983
1001
  self.resize();
984
- document.body.removeEventListener(
985
- 'mousemove',
986
- self.dragResizeColumn,
987
- false,
988
- );
989
- document.body.removeEventListener('mouseup', self.stopDragResize, false);
1002
+ window.removeEventListener('mousemove', self.dragResizeColumn, false);
1003
+ window.removeEventListener('mouseup', self.stopDragResize, false);
990
1004
  self.setStorageData();
991
1005
  self.draw(true);
992
1006
  self.ignoreNextClick = true;
@@ -1093,7 +1107,7 @@ export default function (self) {
1093
1107
  if (document.exitPointerLock) {
1094
1108
  document.exitPointerLock();
1095
1109
  }
1096
- document.removeEventListener('mousemove', self.scrollGrid, false);
1110
+ window.removeEventListener('mousemove', self.scrollGrid, false);
1097
1111
  };
1098
1112
  self.dragReorder = function (e) {
1099
1113
  var pos,
@@ -1111,10 +1125,7 @@ export default function (self) {
1111
1125
  return;
1112
1126
  }
1113
1127
  if ((e.ctrlKey || e.metaKey || e.shiftKey) && self.reorderObject) {
1114
- if (
1115
- self.dragMode === 'column-reorder' &&
1116
- !self.isMultiColumnsSelected(self.draggingItem.header.index)
1117
- ) {
1128
+ if (self.dragMode === 'column-reorder' && !self.isMultiColumnsSelected) {
1118
1129
  self.selectColumn(self.draggingItem.header.index, false, false);
1119
1130
  }
1120
1131
  }
@@ -1138,6 +1149,11 @@ export default function (self) {
1138
1149
  -1,
1139
1150
  self.activeCell.rowIndex,
1140
1151
  );
1152
+ if (self.isMultiColumnsSelected)
1153
+ self.reorderObject = self.getVisibleCellByIndex(
1154
+ self.activeCell.columnIndex,
1155
+ -1,
1156
+ );
1141
1157
  if (!self.reorderObject) return;
1142
1158
  self.reorderTarget = self.currentCell;
1143
1159
  self.reorderObject.dragOffset = {
@@ -1164,8 +1180,8 @@ export default function (self) {
1164
1180
  'row-reorder': 'rowIndex',
1165
1181
  'column-reorder': 'sortColumnIndex',
1166
1182
  }[self.dragMode];
1167
- document.body.removeEventListener('mousemove', self.dragReorder, false);
1168
- document.body.removeEventListener('mouseup', self.stopDragReorder, false);
1183
+ window.removeEventListener('mousemove', self.dragReorder, false);
1184
+ window.removeEventListener('mouseup', self.stopDragReorder, false);
1169
1185
  if (
1170
1186
  self.reorderObject &&
1171
1187
  self.reorderTarget &&
@@ -1188,23 +1204,34 @@ export default function (self) {
1188
1204
  tIndex = cr[self.dragMode].indexOf(self.reorderTarget[i]);
1189
1205
  if (self.dragMode === 'column-reorder') {
1190
1206
  var sortColumnIndices = [];
1191
- var seletedColumnIndices = [];
1207
+ var selectedColumnIndices = [];
1192
1208
  if (self.selections[0]) {
1209
+ oIndex = self.selections[0][0];
1193
1210
  self.selections[0].forEach(function (value) {
1194
1211
  sortColumnIndices.push(self.orders.columns[value]);
1195
1212
  });
1196
1213
  }
1197
1214
  var deleteCount = sortColumnIndices.length;
1198
- cr[self.dragMode].splice(oIndex, deleteCount);
1199
- if (tIndex > oIndex) tIndex = tIndex - (deleteCount - 1);
1200
- for (var i = 0; i < sortColumnIndices.length; i++) {
1201
- seletedColumnIndices.push(tIndex + i);
1202
- cr[self.dragMode].splice(tIndex + i, 0, sortColumnIndices[i]);
1215
+ if (
1216
+ tIndex < oIndex ||
1217
+ (tIndex > oIndex && Math.abs(tIndex - oIndex) >= deleteCount)
1218
+ ) {
1219
+ cr[self.dragMode].splice(oIndex, deleteCount);
1220
+ if (tIndex > oIndex) tIndex = tIndex - (deleteCount - 1);
1221
+
1222
+ self.selectedColumns = [];
1223
+ for (var i = 0; i < sortColumnIndices.length; i++) {
1224
+ if (i === 0) self.activeCell.columnIndex = tIndex;
1225
+ selectedColumnIndices.push(tIndex + i);
1226
+ self.selectedColumns.push(sortColumnIndices[i]);
1227
+ cr[self.dragMode].splice(tIndex + i, 0, sortColumnIndices[i]);
1228
+ }
1229
+
1230
+ self.orders.columns = cr[self.dragMode];
1231
+ self.viewData.forEach(function (row, rowIndex) {
1232
+ self.selections[rowIndex] = selectedColumnIndices;
1233
+ });
1203
1234
  }
1204
- self.orders.columns = cr[self.dragMode];
1205
- self.viewData.forEach(function (row, rowIndex) {
1206
- self.selections[rowIndex] = seletedColumnIndices;
1207
- });
1208
1235
  } else {
1209
1236
  var selectedRows = [];
1210
1237
  self.selections.forEach(function (row, rowIndex) {
@@ -1213,13 +1240,21 @@ export default function (self) {
1213
1240
  odata.push(self.viewData[rowIndex]);
1214
1241
  }
1215
1242
  });
1216
- self.viewData.splice(oIndex, odata.length);
1217
- self.selections = [];
1218
- if (tIndex > oIndex) tIndex = tIndex - (odata.length - 1);
1219
- self.activeCell.rowIndex = tIndex;
1220
- for (var i = 0; i < odata.length; i++) {
1221
- self.viewData.splice(tIndex + i, 0, odata[i]);
1222
- self.selections[tIndex + i] = selectedRows[i];
1243
+ if (
1244
+ tIndex < oIndex ||
1245
+ (tIndex > oIndex && Math.abs(tIndex - oIndex) >= odata.length)
1246
+ ) {
1247
+ self.viewData.splice(oIndex, odata.length);
1248
+ self.selections = [];
1249
+ self.selectedRows = [];
1250
+ if (tIndex > oIndex) tIndex = tIndex - (odata.length - 1);
1251
+ self.activeCell.rowIndex = tIndex;
1252
+
1253
+ for (var i = 0; i < odata.length; i++) {
1254
+ self.viewData.splice(tIndex + i, 0, odata[i]);
1255
+ self.selections[tIndex + i] = selectedRows[i];
1256
+ self.selectedRows.push(tIndex + i);
1257
+ }
1223
1258
  }
1224
1259
  }
1225
1260
  self.resize();
@@ -1250,8 +1285,8 @@ export default function (self) {
1250
1285
  }
1251
1286
  };
1252
1287
  self.stopDragMove = function (e) {
1253
- document.body.removeEventListener('mousemove', self.dragMove, false);
1254
- document.body.removeEventListener('mouseup', self.stopDragMove, false);
1288
+ window.removeEventListener('mousemove', self.dragMove, false);
1289
+ window.removeEventListener('mouseup', self.stopDragMove, false);
1255
1290
  var b = self.getSelectionBounds();
1256
1291
  if (
1257
1292
  self.dispatchEvent('endmove', { NativeEvent: e, cell: self.currentCell })
@@ -1282,16 +1317,30 @@ export default function (self) {
1282
1317
  ) {
1283
1318
  return;
1284
1319
  }
1285
- var pos = self.getLayerPos(e),
1320
+ var pos = self.getLayerPos(e);
1321
+
1322
+ self.ignoreNextClick = true;
1323
+ self.freezeMarkerPosition = pos;
1324
+ pos.x -= self.getRowGroupAreaWidth();
1325
+ pos.y -= self.getColumnGroupAreaHeight();
1326
+ if (
1327
+ Math.abs(pos.x) > self.attributes.reorderDeadZone ||
1328
+ Math.abs(pos.y) > self.attributes.reorderDeadZone
1329
+ ) {
1330
+ setTimeout(function () {
1331
+ self.autoScrollZone(e, pos.x, pos.y, false);
1332
+ }, 1);
1333
+ }
1334
+ };
1335
+ self.stopFreezeMove = function (e) {
1336
+ let pos = self.getLayerPos(e),
1286
1337
  bm = self.style.gridBorderCollapse === 'collapse' ? 1 : 2,
1287
1338
  columnHeaderCellBorder = self.style.columnHeaderCellBorderWidth * bm,
1288
1339
  columnHeaderCellHeight = self.getColumnHeaderCellHeight(),
1289
1340
  rowHeaderCellWidth = self.getRowHeaderCellWidth();
1290
-
1291
- self.ignoreNextClick = true;
1292
- self.freezeMarkerPosition = pos;
1293
1341
  pos.x -= self.getRowGroupAreaWidth();
1294
1342
  pos.y -= self.getColumnGroupAreaHeight();
1343
+
1295
1344
  if (
1296
1345
  self.currentCell &&
1297
1346
  self.currentCell.rowIndex !== undefined &&
@@ -1329,14 +1378,18 @@ export default function (self) {
1329
1378
  ) {
1330
1379
  const dataWidth = self.refreshScrollCacheX();
1331
1380
  self.scrollBox.scrollLeft = 0;
1332
- self.frozenColumn = self.currentCell.columnIndex + 1;
1381
+ let x =
1382
+ self.currentCell.x -
1383
+ self.style.frozenMarkerWidth -
1384
+ self.style.frozenMarkerBorderWidth;
1385
+ if (pos.x > x + self.currentCell.width / 2)
1386
+ self.frozenColumn = self.currentCell.columnIndex + 1;
1387
+ else if (self.currentCell.columnIndex >= 0)
1388
+ self.frozenColumn = self.currentCell.columnIndex;
1333
1389
  self.scrollBox.bar.h.x =
1334
- rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn - 1];
1335
- self.scrollBox.box.h.x =
1336
- rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn - 1];
1337
- // var dataWidth = self.scrollCache.x[self.scrollCache.x.length - 1];
1390
+ rowHeaderCellWidth + self.scrollCache.x[self.frozenColumn];
1338
1391
  self.scrollBox.widthBoxRatio =
1339
- (self.scrollBox.width - self.scrollCache.x[self.frozenColumn - 1]) /
1392
+ (self.scrollBox.width - self.scrollCache.x[self.frozenColumn]) /
1340
1393
  dataWidth;
1341
1394
  self.scrollBox.scrollBoxWidth =
1342
1395
  self.scrollBox.width * self.scrollBox.widthBoxRatio -
@@ -1355,10 +1408,9 @@ export default function (self) {
1355
1408
  self.autoScrollZone(e, pos.x, pos.y, false);
1356
1409
  }, 1);
1357
1410
  }
1358
- };
1359
- self.stopFreezeMove = function (e) {
1360
- document.body.removeEventListener('mousemove', self.freezeMove, false);
1361
- document.body.removeEventListener('mouseup', self.stopFreezeMove, false);
1411
+
1412
+ window.removeEventListener('mousemove', self.freezeMove, false);
1413
+ window.removeEventListener('mouseup', self.stopFreezeMove, false);
1362
1414
  self.freezeMarkerPosition = undefined;
1363
1415
  if (
1364
1416
  self.dispatchEvent('endfreezemove', {
@@ -1372,6 +1424,7 @@ export default function (self) {
1372
1424
  return;
1373
1425
  }
1374
1426
  self.draw(true);
1427
+ self.resize();
1375
1428
  };
1376
1429
  self.mousedown = function (e, overridePos) {
1377
1430
  self.lastMouseDownTarget = e.target;
@@ -1418,6 +1471,8 @@ export default function (self) {
1418
1471
  !(self.currentCell.hovered && self.hovers.onFilterButton)
1419
1472
  ) {
1420
1473
  self.selections = [];
1474
+ self.selectedRows = [];
1475
+ self.selectedColumns = [];
1421
1476
  }
1422
1477
  }
1423
1478
  if (self.dragStartObject.isGrid) {
@@ -1442,8 +1497,8 @@ export default function (self) {
1442
1497
  };
1443
1498
  self.canvas.requestPointerLock();
1444
1499
  }
1445
- document.addEventListener('mousemove', self.scrollGrid, false);
1446
- document.addEventListener('mouseup', self.stopScrollGrid, false);
1500
+ window.addEventListener('mousemove', self.scrollGrid, false);
1501
+ window.addEventListener('mouseup', self.stopScrollGrid, false);
1447
1502
  self.ignoreNextClick = true;
1448
1503
  return;
1449
1504
  }
@@ -1461,7 +1516,9 @@ export default function (self) {
1461
1516
  self.dragStartObject.columnIndex > -1
1462
1517
  ) {
1463
1518
  self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);
1464
- } else if (self.attributes.selectionMode !== 'row') {
1519
+ return;
1520
+ }
1521
+ if (self.attributes.selectionMode !== 'row') {
1465
1522
  self.mousemove(e);
1466
1523
  }
1467
1524
  return;
@@ -1478,8 +1535,8 @@ export default function (self) {
1478
1535
  ) {
1479
1536
  return;
1480
1537
  }
1481
- document.body.addEventListener('mousemove', self.dragMove, false);
1482
- document.body.addEventListener('mouseup', self.stopDragMove, false);
1538
+ window.addEventListener('mousemove', self.dragMove, false);
1539
+ window.addEventListener('mouseup', self.stopDragMove, false);
1483
1540
  return self.mousemove(e);
1484
1541
  }
1485
1542
  if (freeze) {
@@ -1491,8 +1548,12 @@ export default function (self) {
1491
1548
  if (self.dispatchEvent('beginfreezemove', { NativeEvent: e })) {
1492
1549
  return;
1493
1550
  }
1494
- document.body.addEventListener('mousemove', self.freezeMove, false);
1495
- document.body.addEventListener('mouseup', self.stopFreezeMove, false);
1551
+
1552
+ self.freezeMarkerPosition = self.getLayerPos(e);
1553
+ self.freezeMarkerPosition.isGrab = true;
1554
+
1555
+ window.addEventListener('mousemove', self.freezeMove, false);
1556
+ window.addEventListener('mouseup', self.stopFreezeMove, false);
1496
1557
  return self.mousemove(e);
1497
1558
  }
1498
1559
  if (resize && !onUnhideIndicator) {
@@ -1510,22 +1571,19 @@ export default function (self) {
1510
1571
  ? 'cornerCell'
1511
1572
  : self.draggingItem.sortColumnIndex
1512
1573
  ] || self.draggingItem.width;
1513
- document.body.addEventListener('mousemove', self.dragResizeColumn, false);
1514
- document.body.addEventListener('mouseup', self.stopDragResize, false);
1574
+ window.addEventListener('mousemove', self.dragResizeColumn, false);
1575
+ window.addEventListener('mouseup', self.stopDragResize, false);
1515
1576
  return;
1516
1577
  }
1517
1578
  if (['row-reorder', 'column-reorder'].indexOf(self.dragMode) !== -1) {
1518
1579
  self.draggingItem = self.dragStartObject;
1519
- if (
1520
- self.dragMode === 'column-reorder' &&
1521
- !self.isMultiColumnsSelected(self.currentCell.header.index)
1522
- ) {
1580
+ if (self.dragMode === 'column-reorder' && !self.isMultiColumnsSelected) {
1523
1581
  self.selectColumn(self.currentCell.header.index, ctrl, e.shiftKey);
1524
1582
  } else if (self.dragMode === 'row-reorder' && !self.isMultiRowsSelected) {
1525
1583
  self.selectRow(self.dragStartObject.rowIndex, ctrl, null);
1526
1584
  }
1527
- document.body.addEventListener('mousemove', self.dragReorder, false);
1528
- document.body.addEventListener('mouseup', self.stopDragReorder, false);
1585
+ window.addEventListener('mousemove', self.dragReorder, false);
1586
+ window.addEventListener('mouseup', self.stopDragReorder, false);
1529
1587
  return;
1530
1588
  }
1531
1589
  };
@@ -1753,6 +1811,8 @@ export default function (self) {
1753
1811
  if (!e.shiftKey && self.attributes.selectionFollowsActiveCell) {
1754
1812
  if (!ctrl) {
1755
1813
  self.selections = [];
1814
+ self.selectedRows = [];
1815
+ self.selectedColumns = [];
1756
1816
  }
1757
1817
  self.selections[y] = self.selections[y] || [];
1758
1818
  self.selections[y].push(x);
@@ -1911,6 +1971,8 @@ export default function (self) {
1911
1971
  });
1912
1972
  } else {
1913
1973
  var selections = [];
1974
+ self.selectedRows = [];
1975
+ self.selectedColumns = [];
1914
1976
  for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {
1915
1977
  // Rows may have been moved by user, so get the actual row index
1916
1978
  // (instead of the row index at which the row is rendered):
@@ -1921,6 +1983,7 @@ export default function (self) {
1921
1983
  var newRowData = Object.assign({}, existingRowData);
1922
1984
 
1923
1985
  selections[realRowIndex] = [];
1986
+ self.selectedRows.push(realRowIndex);
1924
1987
 
1925
1988
  for (var colIndex = 0; colIndex < cells.length; colIndex++) {
1926
1989
  var column = schema[startColIndex + colIndex];
@@ -1943,6 +2006,8 @@ export default function (self) {
1943
2006
  selections[realRowIndex].push(startColIndex + colIndex);
1944
2007
 
1945
2008
  newRowData[columnName] = cellData;
2009
+ if (self.selectedColumns.indexOf(startColIndex + colIndex) === -1)
2010
+ self.selectedColumns.push(startColIndex + colIndex);
1946
2011
  }
1947
2012
 
1948
2013
  self.originalData[self.boundRowIndexMap.get(realRowIndex)] = newRowData;
package/lib/intf.js CHANGED
@@ -90,6 +90,8 @@ export default function (self, ctor) {
90
90
  trees: {},
91
91
  };
92
92
  self.selections = [];
93
+ self.selectedRows = [];
94
+ self.selectedColumns = [];
93
95
  self.filterable = {
94
96
  rows: [],
95
97
  columns: [],
@@ -175,6 +177,8 @@ export default function (self, ctor) {
175
177
  'cellmouseover',
176
178
  'click',
177
179
  'collapsetree',
180
+ 'columnhide',
181
+ 'columnunhide',
178
182
  'contextmenu',
179
183
  'copy',
180
184
  'datachanged',
@@ -377,7 +381,7 @@ export default function (self, ctor) {
377
381
  );
378
382
  const columnName = schema[boundColumnIndex].name;
379
383
 
380
- self.originalData[boundRowIndex][columnName] = '';
384
+ self.viewData[boundRowIndex][columnName] = '';
381
385
 
382
386
  affectedCells.push([
383
387
  rowIndex,
@@ -903,7 +907,6 @@ export default function (self, ctor) {
903
907
  if (!self.isChildGrid) {
904
908
  document.body.removeChild(self.controlInput);
905
909
  }
906
- self.eventParent.removeEventListener('mouseup', self.mouseup, false);
907
910
  self.eventParent.removeEventListener('mousedown', self.mousedown, false);
908
911
  self.eventParent.removeEventListener('dblclick', self.dblclick, false);
909
912
  self.eventParent.removeEventListener('click', self.click, false);
@@ -917,7 +920,8 @@ export default function (self, ctor) {
917
920
  self.controlInput.removeEventListener('keypress', self.keypress, false);
918
921
  self.controlInput.removeEventListener('keyup', self.keyup, false);
919
922
  self.controlInput.removeEventListener('keydown', self.keydown, false);
920
- document.body.removeEventListener('mousemove', self.mousemove);
923
+ window.removeEventListener('mouseup', self.mouseup, false);
924
+ window.removeEventListener('mousemove', self.mousemove);
921
925
  window.removeEventListener('resize', self.resize);
922
926
  if (self.observer && self.observer.disconnect) {
923
927
  self.observer.disconnect();
@@ -1280,17 +1284,6 @@ export default function (self, ctor) {
1280
1284
  };
1281
1285
  };
1282
1286
 
1283
- self.unhideColumns = function (orderIndex0, orderIndex1) {
1284
- const orders = self.orders.columns;
1285
- const schema = self.getSchema();
1286
- for (let i = orderIndex0; i <= orderIndex1; i++) {
1287
- const columnIndex = orders[i];
1288
- const s = schema[columnIndex];
1289
- if (s && s.hidden) s.hidden = false;
1290
- }
1291
- self.refresh();
1292
- };
1293
-
1294
1287
  self.getDomRoot = function () {
1295
1288
  return self.shadowRoot ? self.shadowRoot.host : self.parentNode;
1296
1289
  };
@@ -1522,6 +1515,7 @@ export default function (self, ctor) {
1522
1515
  self.intf.paste = self.paste;
1523
1516
  self.intf.setStyleProperty = self.setStyleProperty;
1524
1517
  self.intf.hideColumns = self.hideColumns;
1518
+ self.intf.unhideColumns = self.unhideColumns;
1525
1519
  self.intf.hideRows = self.hideRows;
1526
1520
  self.intf.unhideRows = self.unhideRows;
1527
1521
  Object.defineProperty(self.intf, 'defaults', {