canvas-datagrid 0.3.20 → 0.3.24

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/CHANGELOG.md CHANGED
@@ -7,6 +7,37 @@ All notable changes to this project will be documented in this file.
7
7
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
8
8
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
9
9
 
10
+ ## 0.3.24 - 2021-12-22
11
+
12
+ ### Changed
13
+
14
+ - Prevent default when handling cut event and cleanup utility functions (mdebrauw, #454)
15
+
16
+ ## 0.3.23 - 2021-12-16
17
+
18
+ ### Fixed
19
+
20
+ - Slight refactor and set minimum width when resizing (mdebrauw, #452)
21
+
22
+ ## 0.3.22 - 2021-12-15
23
+
24
+ ### Changed
25
+
26
+ - Resize selected columns simultaneously (mdebrauw, #451)
27
+ - Refactor `cut` and `copy` event handlers (mdebrauw, #450)
28
+
29
+ ## 0.3.21 - 2021-12-08
30
+
31
+ ### Added
32
+
33
+ - Add `afterdelete` event and `deleteSelectedData()` public method (mdebrauw, #446)
34
+
35
+ ### Fixed
36
+
37
+ - Remove mousemove at body when dispose (faimaklg, #449)
38
+ - Fire event when resizing column by double clicking column border (mdebrauw, #447)
39
+ - Fix filter button active/hover states, remove inline grid button after menu item click (xianzhi3, #445)
40
+
10
41
  ## 0.3.20 - 2021-12-04
11
42
 
12
43
  ### Added
@@ -175,6 +175,7 @@ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "functi
175
175
  if (item.click) {
176
176
  menuItemContainer.addEventListener('click', function (ev) {
177
177
  item.click.apply(self, [ev]);
178
+ self.disposeButton();
178
179
  });
179
180
  }
180
181
  }
@@ -4083,15 +4084,7 @@ __webpack_require__.r(__webpack_exports__);
4083
4084
  /*globals define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/
4084
4085
 
4085
4086
 
4086
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4087
-
4088
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4089
-
4090
- function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
4091
-
4092
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
4093
-
4094
- function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
4087
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
4095
4088
 
4096
4089
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
4097
4090
 
@@ -4545,7 +4538,7 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
4545
4538
  onFilterButton: false
4546
4539
  };
4547
4540
 
4548
- if (cell.isFilterable && x > cell.x + cell.width - self.style.filterButtonWidth && x < cell.x + cell.width && y > cell.y + cell.height - self.style.filterButtonHeight && y < cell.y + cell.height) {
4541
+ if (cell.isFilterable && x > cell.x + cell.width + self.canvasOffsetLeft - self.style.filterButtonWidth && x < cell.x + cell.width + self.canvasOffsetLeft && y > cell.y + cell.height + self.canvasOffsetTop - self.style.filterButtonHeight && y < cell.y + cell.height + self.canvasOffsetTop) {
4549
4542
  self.hovers.onFilterButton = true;
4550
4543
  self.draw();
4551
4544
  }
@@ -4833,7 +4826,21 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
4833
4826
  self.ellipsisCache = {};
4834
4827
  };
4835
4828
 
4836
- self.stopDragResize = function () {
4829
+ self.stopDragResize = function (event) {
4830
+ var pos = self.getLayerPos(event);
4831
+
4832
+ if (self.dragMode === 'ew-resize') {
4833
+ var hasMoved = !!(pos.x - self.dragStart.x); // Check that dragItem is selected or part of selection.
4834
+
4835
+ var dragItemIsSelected = self.isColumnSelected(self.dragItem.columnIndex);
4836
+
4837
+ if (hasMoved && dragItemIsSelected) {
4838
+ var width = Math.max(self.resizingStartingWidth + pos.x - self.dragStart.x, self.style.minColumnWidth); // If the column is selected, resize it to width plus any other selected columns.
4839
+
4840
+ self.fitSelectedColumns(width);
4841
+ }
4842
+ }
4843
+
4837
4844
  self.resize();
4838
4845
  document.body.removeEventListener('mousemove', self.dragResizeColumn, false);
4839
4846
  document.body.removeEventListener('mouseup', self.stopDragResize, false);
@@ -5394,6 +5401,8 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
5394
5401
  self.selectNone();
5395
5402
  } else if (ctrl && e.key === 'a') {
5396
5403
  self.selectAll();
5404
+ } else if (['Backspace', 'Delete'].includes(e.key)) {
5405
+ self.deleteSelectedData();
5397
5406
  } else if (e.key === 'ArrowDown') {
5398
5407
  y += 1;
5399
5408
  } else if (e.key === 'ArrowUp') {
@@ -5583,7 +5592,15 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
5583
5592
  }
5584
5593
 
5585
5594
  if (self.currentCell.context === 'ew-resize' && self.currentCell.style === 'columnHeaderCell') {
5586
- self.fitColumnToValues(self.currentCell.header.name);
5595
+ // Check that double-clicked cell is selected or part of selection.
5596
+ var currentCellIsSelected = self.isColumnSelected(self.currentCell.columnIndex);
5597
+
5598
+ if (currentCellIsSelected) {
5599
+ // There might be more
5600
+ self.fitSelectedColumns();
5601
+ } else {
5602
+ self.fitColumnToValues(self.currentCell.header.name);
5603
+ }
5587
5604
  } else if (self.currentCell.context === 'ew-resize' && self.currentCell.style === 'cornerCell') {
5588
5605
  self.autosize();
5589
5606
  } else if (['cell', 'activeCell'].includes(self.currentCell.style) && !self.hovers.onFilterButton) {
@@ -5792,135 +5809,43 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
5792
5809
  });
5793
5810
  };
5794
5811
 
5795
- self.cut = function (e) {
5796
- self.copy(e);
5797
- var schema = self.getSchema();
5798
- var affectedCells = [];
5799
-
5800
- var _iterator2 = _createForOfIteratorHelper(self.selections.entries()),
5801
- _step2;
5802
-
5803
- try {
5804
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
5805
- var _step2$value = _slicedToArray(_step2.value, 2),
5806
- rowIndex = _step2$value[0],
5807
- row = _step2$value[1];
5808
-
5809
- if (!row) continue;
5810
- var boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);
5812
+ self.cut = function (event) {
5813
+ if (self.dispatchEvent('cut', {
5814
+ NativeEvent: event
5815
+ })) {
5816
+ return;
5817
+ } // Expecting instance of `ClipboardEvent` with `clipboardData` attribute
5811
5818
 
5812
- var _iterator3 = _createForOfIteratorHelper(row),
5813
- _step3;
5814
5819
 
5815
- try {
5816
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
5817
- var columnIndex = _step3.value;
5818
- var boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(columnIndex);
5819
- var colName = schema[boundColumnIndex].name;
5820
- self.viewData[rowIndex][colName] = '';
5821
- affectedCells.push([rowIndex, columnIndex, boundRowIndex, boundColumnIndex]);
5822
- }
5823
- } catch (err) {
5824
- _iterator3.e(err);
5825
- } finally {
5826
- _iterator3.f();
5827
- }
5828
- }
5829
- } catch (err) {
5830
- _iterator2.e(err);
5831
- } finally {
5832
- _iterator2.f();
5820
+ if (!self.hasFocus || !event.clipboardData) {
5821
+ return;
5833
5822
  }
5834
5823
 
5835
- if (self.dispatchEvent('cut', {
5836
- NativeEvent: e,
5824
+ self.copySelectedCellsToClipboard(event.clipboardData);
5825
+ var affectedCells = self.clearSelectedCells();
5826
+ self.dispatchEvent('aftercut', {
5837
5827
  cells: affectedCells
5838
- })) {
5839
- return;
5840
- }
5828
+ });
5829
+ requestAnimationFrame(function () {
5830
+ return self.draw();
5831
+ });
5832
+ event.preventDefault();
5841
5833
  };
5842
5834
 
5843
- self.copy = function (e) {
5835
+ self.copy = function (event) {
5844
5836
  if (self.dispatchEvent('copy', {
5845
- NativeEvent: e
5837
+ NativeEvent: event
5846
5838
  })) {
5847
5839
  return;
5848
- }
5840
+ } // Expecting instance of `ClipboardEvent` with `clipboardData` attribute
5849
5841
 
5850
- if (!self.hasFocus || !e.clipboardData) {
5851
- return;
5852
- }
5853
5842
 
5854
- var t = '',
5855
- d = '',
5856
- textRows = [],
5857
- sData = self.getSelectedData(),
5858
- s = self.getSchema(),
5859
- sSorted = [],
5860
- firstRowKeys,
5861
- isNeat = true; // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy
5862
-
5863
- function htmlSafe(v) {
5864
- if (typeof v === 'number') return v;
5865
- return v.replace(/</g, '&lt;').replace(/>/g, '&gt;');
5843
+ if (!self.hasFocus || !event.clipboardData) {
5844
+ return;
5866
5845
  }
5867
5846
 
5868
- s.forEach(function (column, columnIndex) {
5869
- sSorted.push(s[self.orders.columns[columnIndex]]);
5870
- });
5871
-
5872
- if (sData.length > 0) {
5873
- sData.forEach(function (row) {
5874
- if (!row) return;
5875
- var rowKeys = Object.keys(row);
5876
- var textRow = [];
5877
- if (!firstRowKeys) firstRowKeys = Object.keys(row);
5878
- if (isNeat && rowKeys.length !== firstRowKeys.length) isNeat = false;
5879
- sSorted.forEach(function (column, columnIndex) {
5880
- if (rowKeys.indexOf(String(column.name)) < 0) {
5881
- if (firstRowKeys.indexOf(String(column.name)) < 0) {
5882
- return;
5883
- } else if (isNeat) {
5884
- isNeat = false;
5885
- }
5886
- }
5887
-
5888
- textRow.push(row[column.name] || '');
5889
- });
5890
- textRows.push(textRow);
5891
- });
5892
-
5893
- if (isNeat) {
5894
- t = textRows.map(function (row) {
5895
- return row.join('\t');
5896
- }).join('\n');
5897
- /**
5898
- * The html content copied by Excel has not header
5899
- */
5900
-
5901
- d += '<table>';
5902
- d += textRows.map(function (row) {
5903
- return '<tr>' + row.map(function (value) {
5904
- return '<td>' + htmlSafe(value) + '</td>';
5905
- }).join('') + '</tr>';
5906
- }).join('');
5907
- d += '</table>';
5908
- } else {
5909
- t = textRows.map(function (row) {
5910
- return row.join('');
5911
- }).join('');
5912
- d = t;
5913
- }
5914
-
5915
- if (t) {
5916
- e.clipboardData.setData('text/html', d);
5917
- e.clipboardData.setData('text/plain', t);
5918
- e.clipboardData.setData('text/csv', t);
5919
- e.clipboardData.setData('application/json', JSON.stringify(sData));
5920
- }
5921
-
5922
- e.preventDefault();
5923
- }
5847
+ self.copySelectedCellsToClipboard(event.clipboardData);
5848
+ event.preventDefault();
5924
5849
  };
5925
5850
 
5926
5851
  return;
@@ -5933,6 +5858,9 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
5933
5858
  !*** ./lib/events/util.js ***!
5934
5859
  \****************************/
5935
5860
  /*! namespace exports */
5861
+ /*! export createHTMLString [provided] [no usage info] [missing usage info prevents renaming] */
5862
+ /*! export createTextString [provided] [no usage info] [missing usage info prevents renaming] */
5863
+ /*! export htmlSafe [provided] [no usage info] [missing usage info prevents renaming] */
5936
5864
  /*! export isSupportedHtml [provided] [no usage info] [missing usage info prevents renaming] */
5937
5865
  /*! export parseData [provided] [no usage info] [missing usage info prevents renaming] */
5938
5866
  /*! export parseHtmlTable [provided] [no usage info] [missing usage info prevents renaming] */
@@ -5946,12 +5874,15 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
5946
5874
  "use strict";
5947
5875
  __webpack_require__.r(__webpack_exports__);
5948
5876
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
5877
+ /* harmony export */ "createTextString": function() { return /* binding */ createTextString; },
5878
+ /* harmony export */ "createHTMLString": function() { return /* binding */ createHTMLString; },
5949
5879
  /* harmony export */ "isSupportedHtml": function() { return /* binding */ isSupportedHtml; },
5950
- /* harmony export */ "sanitizeElementData": function() { return /* binding */ sanitizeElementData; },
5880
+ /* harmony export */ "htmlSafe": function() { return /* binding */ htmlSafe; },
5951
5881
  /* harmony export */ "parseData": function() { return /* binding */ parseData; },
5952
5882
  /* harmony export */ "parseHtmlTable": function() { return /* binding */ parseHtmlTable; },
5953
5883
  /* harmony export */ "parseHtmlText": function() { return /* binding */ parseHtmlText; },
5954
- /* harmony export */ "parseText": function() { return /* binding */ parseText; }
5884
+ /* harmony export */ "parseText": function() { return /* binding */ parseText; },
5885
+ /* harmony export */ "sanitizeElementData": function() { return /* binding */ sanitizeElementData; }
5955
5886
  /* harmony export */ });
5956
5887
 
5957
5888
 
@@ -6074,6 +6005,36 @@ var parseData = function parseData(data, mimeType) {
6074
6005
  return parseText(data);
6075
6006
  };
6076
6007
 
6008
+ var htmlSafe = function htmlSafe(value) {
6009
+ if (typeof value === 'number') return value;
6010
+ return value.replace(/</g, '&lt;').replace(/>/g, '&gt;');
6011
+ };
6012
+
6013
+ var createTextString = function createTextString(selectedData, isNeat) {
6014
+ // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy.
6015
+ // If not isNeat we just return a simple string of concatenated values.
6016
+ if (!isNeat) return selectedData.map(function (row) {
6017
+ return Object.values(row).join('');
6018
+ }).join(''); // If isNeat, we can create tab separated mutti-line text.
6019
+
6020
+ return selectedData.map(function (row) {
6021
+ return Object.values(row).join('\t');
6022
+ }).join('\n');
6023
+ };
6024
+
6025
+ var createHTMLString = function createHTMLString(selectedData, isNeat) {
6026
+ if (!isNeat) return createTextString(selectedData, isNeat); // If isNeat, we can create a HTML table with the selected data.
6027
+
6028
+ var htmlString = '<table>';
6029
+ htmlString += selectedData.map(function (row) {
6030
+ return '<tr>' + Object.values(row).map(function (value) {
6031
+ return '<td>' + htmlSafe(value) + '</td>';
6032
+ }).join('') + '</tr>';
6033
+ }).join('');
6034
+ htmlString += '</table>';
6035
+ return htmlString;
6036
+ };
6037
+
6077
6038
 
6078
6039
 
6079
6040
  /***/ }),
@@ -6085,7 +6046,7 @@ var parseData = function parseData(data, mimeType) {
6085
6046
  /*! namespace exports */
6086
6047
  /*! export default [provided] [no usage info] [missing usage info prevents renaming] */
6087
6048
  /*! other exports [not provided] [no usage info] */
6088
- /*! runtime requirements: __webpack_require__.r, __webpack_exports__, __webpack_require__.d, __webpack_require__.* */
6049
+ /*! runtime requirements: __webpack_require__, __webpack_require__.r, __webpack_exports__, __webpack_require__.d, __webpack_require__.* */
6089
6050
  /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6090
6051
 
6091
6052
  "use strict";
@@ -6093,6 +6054,7 @@ __webpack_require__.r(__webpack_exports__);
6093
6054
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6094
6055
  /* harmony export */ "default": function() { return /* export default binding */ __WEBPACK_DEFAULT_EXPORT__; }
6095
6056
  /* harmony export */ });
6057
+ /* harmony import */ var _events_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./events/util */ "./lib/events/util.js");
6096
6058
  /*jslint browser: true, unparam: true, todo: true*/
6097
6059
 
6098
6060
  /*globals HTMLElement: false, Reflect: false, define: true, MutationObserver: false, requestAnimationFrame: false, performance: false, btoa: false*/
@@ -6114,6 +6076,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
6114
6076
 
6115
6077
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
6116
6078
 
6079
+
6117
6080
  /* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(self, ctor) {
6118
6081
  self.scale = 1;
6119
6082
  self.orders = {
@@ -6318,6 +6281,122 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
6318
6281
  return selectedCells;
6319
6282
  };
6320
6283
 
6284
+ self.copySelectedCellsToClipboard = function (clipboardData) {
6285
+ var selectedData = [];
6286
+ var schema = self.getSchema();
6287
+ var firstRowAsString;
6288
+ var isNeat = true; // Selected like [[0, 1], [0, 1]] of [[0, 3]] is neat; Selected like [[0, 1], [1, 2]] is untidy
6289
+
6290
+ var _iterator3 = _createForOfIteratorHelper(self.selections.entries()),
6291
+ _step3;
6292
+
6293
+ try {
6294
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
6295
+ var _step3$value = _slicedToArray(_step3.value, 2),
6296
+ rowIndex = _step3$value[0],
6297
+ row = _step3$value[1];
6298
+
6299
+ // If no cells are selected for a particular rowIndex the selections array will contain an empty element for that rowIndex.
6300
+ if (!row) continue; // Convert to string for easy comparison to the first row.
6301
+
6302
+ var rowAsString = row.join(',').toString();
6303
+ var rowDict = {};
6304
+ if (!firstRowAsString) firstRowAsString = row.join(',').toString();
6305
+ if (isNeat && rowAsString !== firstRowAsString) isNeat = false;
6306
+ var boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);
6307
+
6308
+ var _iterator4 = _createForOfIteratorHelper(row),
6309
+ _step4;
6310
+
6311
+ try {
6312
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
6313
+ var columnIndex = _step4.value;
6314
+ // If the whole row is selected the columnIndex for the rowHeader is -1.
6315
+ if (columnIndex < 0) continue;
6316
+ var boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(columnIndex);
6317
+ var columnName = schema[boundColumnIndex].name;
6318
+ var value = self.originalData[boundRowIndex][columnName];
6319
+ rowDict[columnName] = value;
6320
+ }
6321
+ } catch (err) {
6322
+ _iterator4.e(err);
6323
+ } finally {
6324
+ _iterator4.f();
6325
+ }
6326
+
6327
+ selectedData.push(rowDict);
6328
+ }
6329
+ } catch (err) {
6330
+ _iterator3.e(err);
6331
+ } finally {
6332
+ _iterator3.f();
6333
+ }
6334
+
6335
+ if (selectedData.length > 0) {
6336
+ var textString = (0,_events_util__WEBPACK_IMPORTED_MODULE_0__.createTextString)(selectedData, isNeat);
6337
+ var htmlString = (0,_events_util__WEBPACK_IMPORTED_MODULE_0__.createHTMLString)(selectedData, isNeat);
6338
+ var copiedData = {
6339
+ 'text/plain': textString,
6340
+ 'text/html': htmlString,
6341
+ 'text/csv': textString,
6342
+ 'application/json': JSON.stringify(selectedData)
6343
+ };
6344
+
6345
+ for (var _i2 = 0, _Object$entries = Object.entries(copiedData); _i2 < _Object$entries.length; _i2++) {
6346
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2),
6347
+ mimeType = _Object$entries$_i[0],
6348
+ data = _Object$entries$_i[1];
6349
+
6350
+ clipboardData.setData(mimeType, data);
6351
+ }
6352
+ }
6353
+ };
6354
+
6355
+ self.clearSelectedCells = function () {
6356
+ var schema = self.getSchema();
6357
+ var affectedCells = [];
6358
+
6359
+ var _iterator5 = _createForOfIteratorHelper(self.selections.entries()),
6360
+ _step5;
6361
+
6362
+ try {
6363
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
6364
+ var _step5$value = _slicedToArray(_step5.value, 2),
6365
+ rowIndex = _step5$value[0],
6366
+ row = _step5$value[1];
6367
+
6368
+ // If no cells are selected for a particular rowIndex the selections array will contain an empty element for that rowIndex.
6369
+ if (!row) continue;
6370
+ var boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);
6371
+
6372
+ var _iterator6 = _createForOfIteratorHelper(row),
6373
+ _step6;
6374
+
6375
+ try {
6376
+ for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
6377
+ var columnIndex = _step6.value;
6378
+ // If the whole row is selected the columnIndex for the rowHeader is -1.
6379
+ if (columnIndex < 0) continue;
6380
+ var boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(columnIndex);
6381
+ var columnName = schema[boundColumnIndex].name;
6382
+ self.viewData[boundRowIndex][columnName] = '';
6383
+ affectedCells.push([rowIndex, columnIndex, boundRowIndex, boundColumnIndex]);
6384
+ }
6385
+ } catch (err) {
6386
+ _iterator6.e(err);
6387
+ } finally {
6388
+ _iterator6.f();
6389
+ }
6390
+ }
6391
+ } catch (err) {
6392
+ _iterator5.e(err);
6393
+ } finally {
6394
+ _iterator5.f();
6395
+ }
6396
+
6397
+ return affectedCells;
6398
+ };
6399
+
6321
6400
  self.getBoundRowIndexFromViewRowIndex = function (viewRowIndex) {
6322
6401
  if (self.boundRowIndexMap && self.boundRowIndexMap.has(viewRowIndex)) {
6323
6402
  return self.boundRowIndexMap.get(viewRowIndex);
@@ -6394,6 +6473,39 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
6394
6473
  self.orders.rows = fillArray(0, self.originalData.length - 1);
6395
6474
  };
6396
6475
 
6476
+ self.fitSelectedColumns = function (width) {
6477
+ var selectedColumns = self.selections[0];
6478
+ var schema = self.getSchema();
6479
+
6480
+ var _iterator7 = _createForOfIteratorHelper(selectedColumns),
6481
+ _step7;
6482
+
6483
+ try {
6484
+ for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
6485
+ var selectedColumn = _step7.value;
6486
+
6487
+ // Make sure the column is not the row header and that the whole column has in fact been selected.
6488
+ if (selectedColumn >= 0 && self.isColumnSelected(selectedColumn)) {
6489
+ if (isNaN(width)) {
6490
+ var column = schema[self.orders.columns[selectedColumn]];
6491
+ self.fitColumnToValues(column.name);
6492
+ } else {
6493
+ self.sizes.columns[selectedColumn] = width;
6494
+ self.dispatchEvent('resizecolumn', {
6495
+ x: width,
6496
+ y: self.resizingStartingHeight,
6497
+ draggingItem: self.currentCell
6498
+ });
6499
+ }
6500
+ }
6501
+ }
6502
+ } catch (err) {
6503
+ _iterator7.e(err);
6504
+ } finally {
6505
+ _iterator7.f();
6506
+ }
6507
+ };
6508
+
6397
6509
  self.getVisibleSchema = function () {
6398
6510
  return self.getSchema().filter(function (col) {
6399
6511
  return !col.hidden;
@@ -6460,9 +6572,9 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
6460
6572
  }); // Apply filtering
6461
6573
 
6462
6574
  var _loop = function _loop() {
6463
- var _Object$entries$_i = _slicedToArray(_Object$entries[_i2], 2),
6464
- headerName = _Object$entries$_i[0],
6465
- filterText = _Object$entries$_i[1];
6575
+ var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i3], 2),
6576
+ headerName = _Object$entries2$_i[0],
6577
+ filterText = _Object$entries2$_i[1];
6466
6578
 
6467
6579
  var header = self.getHeaderByName(headerName);
6468
6580
 
@@ -6481,19 +6593,19 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
6481
6593
  });
6482
6594
  };
6483
6595
 
6484
- for (var _i2 = 0, _Object$entries = Object.entries(self.columnFilters); _i2 < _Object$entries.length; _i2++) {
6596
+ for (var _i3 = 0, _Object$entries2 = Object.entries(self.columnFilters); _i3 < _Object$entries2.length; _i3++) {
6485
6597
  var _ret = _loop();
6486
6598
 
6487
6599
  if (_ret === "continue") continue;
6488
6600
  } // Apply sorting
6489
6601
 
6490
6602
 
6491
- var _iterator3 = _createForOfIteratorHelper(self.orderings.columns),
6492
- _step3;
6603
+ var _iterator8 = _createForOfIteratorHelper(self.orderings.columns),
6604
+ _step8;
6493
6605
 
6494
6606
  try {
6495
6607
  var _loop2 = function _loop2() {
6496
- var column = _step3.value;
6608
+ var column = _step8.value;
6497
6609
  var sortFn = column.sortFunction(column.orderBy, column.orderDirection);
6498
6610
  newViewData.sort(function (_ref7, _ref8) {
6499
6611
  var _ref9 = _slicedToArray(_ref7, 1),
@@ -6508,13 +6620,13 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
6508
6620
  });
6509
6621
  };
6510
6622
 
6511
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
6623
+ for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
6512
6624
  _loop2();
6513
6625
  }
6514
6626
  } catch (err) {
6515
- _iterator3.e(err);
6627
+ _iterator8.e(err);
6516
6628
  } finally {
6517
- _iterator3.f();
6629
+ _iterator8.f();
6518
6630
  }
6519
6631
 
6520
6632
  return {
@@ -6668,6 +6780,7 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
6668
6780
  self.controlInput.removeEventListener('keypress', self.keypress, false);
6669
6781
  self.controlInput.removeEventListener('keyup', self.keyup, false);
6670
6782
  self.controlInput.removeEventListener('keydown', self.keydown, false);
6783
+ document.body.removeEventListener('mousemove', self.mousemove);
6671
6784
  window.removeEventListener('resize', self.resize);
6672
6785
 
6673
6786
  if (self.observer && self.observer.disconnect) {
@@ -6844,6 +6957,7 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
6844
6957
  };
6845
6958
  Object.keys(self.style).forEach(self.parseStyleValue);
6846
6959
  self.intf.moveSelection = self.moveSelection;
6960
+ self.intf.deleteSelectedData = self.deleteSelectedData;
6847
6961
  self.intf.moveTo = self.moveTo;
6848
6962
  self.intf.addEventListener = self.addEventListener;
6849
6963
  self.intf.removeEventListener = self.removeEventListener;
@@ -8788,7 +8902,14 @@ __webpack_require__.r(__webpack_exports__);
8788
8902
  return;
8789
8903
  }
8790
8904
 
8791
- self.sizes.columns[name === 'cornerCell' ? -1 : self.getHeaderByName(name).index] = Math.max(self.findColumnMaxTextLength(name), self.style.minColumnWidth);
8905
+ var columnIndex = name === 'cornerCell' ? -1 : self.getHeaderByName(name).index;
8906
+ var newSize = Math.max(self.findColumnMaxTextLength(name), self.style.minColumnWidth);
8907
+ self.sizes.columns[columnIndex] = newSize;
8908
+ self.dispatchEvent('resizecolumn', {
8909
+ x: newSize,
8910
+ y: self.resizingStartingHeight,
8911
+ draggingItem: self.currentCell
8912
+ });
8792
8913
 
8793
8914
  if (!internal) {
8794
8915
  self.resize();
@@ -8909,6 +9030,29 @@ __webpack_require__.r(__webpack_exports__);
8909
9030
  });
8910
9031
  self.selections = sel;
8911
9032
  };
9033
+ /**
9034
+ * Deletes currently selected data.
9035
+ * @memberof canvasDatagrid
9036
+ * @name deleteSelectedData
9037
+ * @method
9038
+ * @param {boolean} dontDraw Suppress the draw method after the selection change.
9039
+ */
9040
+
9041
+
9042
+ self.deleteSelectedData = function (dontDraw) {
9043
+ var affectedCells = self.clearSelectedCells();
9044
+ self.dispatchEvent('afterdelete', {
9045
+ cells: affectedCells
9046
+ });
9047
+
9048
+ if (dontDraw) {
9049
+ return;
9050
+ }
9051
+
9052
+ requestAnimationFrame(function () {
9053
+ return self.draw();
9054
+ });
9055
+ };
8912
9056
  /**
8913
9057
  * Moves data in the provided selection to another position in the grid. Moving data off the edge of the schema (columns/x) will truncate data.
8914
9058
  * @memberof canvasDatagrid