canvas-datagrid 0.3.17 → 0.3.21

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
@@ -61,6 +61,14 @@ export default function (self, ctor) {
61
61
  trees: {},
62
62
  };
63
63
  self.selections = [];
64
+ self.filterable = {
65
+ rows: [],
66
+ columns: [],
67
+ };
68
+ self.selectedFilterButton = {
69
+ columnIndex: -1,
70
+ rowIndex: -1,
71
+ };
64
72
  self.hovers = {};
65
73
  self.attributes = {};
66
74
  self.style = {};
@@ -88,6 +96,7 @@ export default function (self, ctor) {
88
96
  self.eventNames = [
89
97
  'afterdraw',
90
98
  'afterrendercell',
99
+ 'afterrenderfilterbutton',
91
100
  'attributechanged',
92
101
  'beforebeginedit',
93
102
  'beforecreatecellgrid',
@@ -95,6 +104,7 @@ export default function (self, ctor) {
95
104
  'beforeendedit',
96
105
  'beforerendercell',
97
106
  'beforerendercellgrid',
107
+ 'beforerenderfilterbutton',
98
108
  'beginedit',
99
109
  'cellmouseout',
100
110
  'cellmouseover',
@@ -232,6 +242,38 @@ export default function (self, ctor) {
232
242
 
233
243
  return selectedCells;
234
244
  };
245
+ self.clearSelectedCells = function () {
246
+ const schema = self.getSchema();
247
+ const affectedCells = [];
248
+
249
+ for (const [rowIndex, row] of self.selections.entries()) {
250
+ // If no cells are selected for a particular rowIndex the selections array will contain an empty element for that rowIndex.
251
+ if (!row) continue;
252
+
253
+ const boundRowIndex = self.getBoundRowIndexFromViewRowIndex(rowIndex);
254
+
255
+ for (let columnIndex of row) {
256
+ // If the whole row is selected the columnIndex for the rowHeader is -1.
257
+ if (columnIndex < 0) continue;
258
+
259
+ const boundColumnIndex = self.getBoundColumnIndexFromViewColumnIndex(
260
+ columnIndex,
261
+ );
262
+ const columnName = schema[boundColumnIndex].name;
263
+
264
+ self.viewData[boundRowIndex][columnName] = null;
265
+
266
+ affectedCells.push([
267
+ rowIndex,
268
+ columnIndex,
269
+ boundRowIndex,
270
+ boundColumnIndex,
271
+ ]);
272
+ }
273
+ }
274
+
275
+ return affectedCells;
276
+ };
235
277
  self.getBoundRowIndexFromViewRowIndex = function (viewRowIndex) {
236
278
  if (self.boundRowIndexMap && self.boundRowIndexMap.has(viewRowIndex)) {
237
279
  return self.boundRowIndexMap.get(viewRowIndex);
@@ -547,6 +589,7 @@ export default function (self, ctor) {
547
589
  self.controlInput.removeEventListener('keypress', self.keypress, false);
548
590
  self.controlInput.removeEventListener('keyup', self.keyup, false);
549
591
  self.controlInput.removeEventListener('keydown', self.keydown, false);
592
+ document.body.removeEventListener('mousemove', self.mousemove);
550
593
  window.removeEventListener('resize', self.resize);
551
594
  if (self.observer && self.observer.disconnect) {
552
595
  self.observer.disconnect();
@@ -724,6 +767,7 @@ export default function (self, ctor) {
724
767
  self.pointerLockPosition = { x: 0, y: 0 };
725
768
  Object.keys(self.style).forEach(self.parseStyleValue);
726
769
  self.intf.moveSelection = self.moveSelection;
770
+ self.intf.deleteSelectedData = self.deleteSelectedData;
727
771
  self.intf.moveTo = self.moveTo;
728
772
  self.intf.addEventListener = self.addEventListener;
729
773
  self.intf.removeEventListener = self.removeEventListener;
@@ -755,6 +799,7 @@ export default function (self, ctor) {
755
799
  self.intf.clearChangeLog = self.clearChangeLog;
756
800
  self.intf.gotoCell = self.gotoCell;
757
801
  self.intf.gotoRow = self.gotoRow;
802
+ self.intf.addButton = self.addButton;
758
803
  self.intf.getHeaderByName = self.getHeaderByName;
759
804
  self.intf.findColumnScrollLeft = self.findColumnScrollLeft;
760
805
  self.intf.findRowScrollTop = self.findRowScrollTop;
@@ -1534,6 +1579,9 @@ export default function (self, ctor) {
1534
1579
  if (!preventScrollEvent) {
1535
1580
  self.scroll();
1536
1581
  }
1582
+ if (self.button) {
1583
+ self.moveButtonPos();
1584
+ }
1537
1585
  }
1538
1586
  function setScrollLeft(value, preventScrollEvent) {
1539
1587
  if (isNaN(value)) {
@@ -1552,6 +1600,9 @@ export default function (self, ctor) {
1552
1600
  if (!preventScrollEvent) {
1553
1601
  self.scroll();
1554
1602
  }
1603
+ if (self.button) {
1604
+ self.moveButtonPos();
1605
+ }
1555
1606
  }
1556
1607
  self.scrollBox.toString = function () {
1557
1608
  return (
package/lib/main.js CHANGED
@@ -9,6 +9,7 @@ import events from './events';
9
9
  import touch from './touch';
10
10
  import intf from './intf';
11
11
  import contextMenu from './contextMenu';
12
+ import button from './button';
12
13
  import dom from './dom';
13
14
  import publicMethods from './publicMethods';
14
15
 
@@ -21,6 +22,7 @@ var modules = [
21
22
  touch,
22
23
  intf,
23
24
  contextMenu,
25
+ button,
24
26
  dom,
25
27
  publicMethods,
26
28
  ];
@@ -206,6 +206,18 @@ export default function (self) {
206
206
  delete self.columnFilters[column];
207
207
  } else {
208
208
  self.columnFilters[column] = value;
209
+ if (self.attributes.showFilterInCell) {
210
+ self.filterable.rows.push(0);
211
+ self.orders.columns.forEach(function (value, index) {
212
+ self.filterable.columns.push(index);
213
+ });
214
+ }
215
+ }
216
+ if (!Object.keys(self.columnFilters).length) {
217
+ self.filterable = {
218
+ rows: [],
219
+ columns: [],
220
+ };
209
221
  }
210
222
  self.refresh();
211
223
  };
@@ -294,6 +306,31 @@ export default function (self) {
294
306
  self.gotoRow = function (y) {
295
307
  self.gotoCell(0, y);
296
308
  };
309
+ /**
310
+ * Add a button into the cell.
311
+ * @memberof canvasDatagrid
312
+ * @name addButton
313
+ * @method
314
+ * @param {number} columnIndex The column index of the cell to to add a button.
315
+ * @param {number} rowIndex The row index of the cell to to add a button.
316
+ * @param {object} offset Offset how far go away from cell.
317
+ * @param {object} items a list of items to add into button menu.
318
+ * @param {string} imgSrc icon path to add into button.
319
+ */
320
+ self.addButton = function (columnIndex, rowIndex, offset, items, imgSrc) {
321
+ var cells = self.visibleCells.filter(function (c) {
322
+ return c.sortColumnIndex === columnIndex && c.sortRowIndex === rowIndex;
323
+ });
324
+
325
+ self.attachButton(
326
+ {
327
+ top: cells[0].y + cells[0].height + offset.y,
328
+ left: cells[0].x + cells[0].width + offset.x,
329
+ },
330
+ items,
331
+ imgSrc,
332
+ );
333
+ };
297
334
  /**
298
335
  * Scrolls the cell at cell x, row y into view if it is not already.
299
336
  * @memberof canvasDatagrid
@@ -379,6 +416,37 @@ export default function (self) {
379
416
  }
380
417
  self.draw();
381
418
  };
419
+ /**
420
+ * Returns true if indices of columns next to the selected columnIndex is selected on every row.
421
+ * @memberof canvasDatagrid
422
+ * @name isMultiColumnsSelected
423
+ * @method
424
+ * @param {number} columnIndex The column index to check.
425
+ */
426
+ self.isMultiColumnsSelected = function (columnIndex) {
427
+ var multiColIsSelected = true;
428
+ self.viewData.forEach(function (row, rowIndex) {
429
+ var columnIndices = self.selections[rowIndex];
430
+ if (
431
+ !columnIndices ||
432
+ columnIndices.length <= 1 ||
433
+ columnIndices.indexOf(columnIndex) === -1
434
+ ) {
435
+ multiColIsSelected = false;
436
+ } else if (columnIndices.length > 1) {
437
+ if (columnIndices[0] != columnIndex) multiColIsSelected = false;
438
+ else {
439
+ for (var i = 0; i < columnIndices.length - 1; i++) {
440
+ if (columnIndices[i] + 1 != columnIndices[i + 1]) {
441
+ multiColIsSelected = false;
442
+ break;
443
+ }
444
+ }
445
+ }
446
+ }
447
+ });
448
+ return multiColIsSelected;
449
+ };
382
450
  /**
383
451
  * Returns true if the selected columnIndex is selected on every row.
384
452
  * @memberof canvasDatagrid
@@ -391,8 +459,7 @@ export default function (self) {
391
459
  self.viewData.forEach(function (row, rowIndex) {
392
460
  if (
393
461
  !self.selections[rowIndex] ||
394
- self.selections[rowIndex].indexOf(self.orders.columns[columnIndex]) ===
395
- -1
462
+ self.selections[rowIndex].indexOf(columnIndex) === -1
396
463
  ) {
397
464
  colIsSelected = false;
398
465
  }
@@ -504,6 +571,7 @@ export default function (self) {
504
571
  st,
505
572
  en,
506
573
  s = self.getVisibleSchema();
574
+ self.isMultiRowsSelected = false;
507
575
  function de() {
508
576
  if (supressEvent) {
509
577
  return;
@@ -666,9 +734,23 @@ export default function (self) {
666
734
  if (!self.canvas) {
667
735
  return;
668
736
  }
669
- self.sizes.columns[
670
- name === 'cornerCell' ? -1 : self.getHeaderByName(name).index
671
- ] = Math.max(self.findColumnMaxTextLength(name), self.style.minColumnWidth);
737
+
738
+ const columnIndex =
739
+ name === 'cornerCell' ? -1 : self.getHeaderByName(name).index;
740
+
741
+ const newSize = Math.max(
742
+ self.findColumnMaxTextLength(name),
743
+ self.style.minColumnWidth,
744
+ );
745
+
746
+ self.sizes.columns[columnIndex] = newSize;
747
+
748
+ self.dispatchEvent('resizecolumn', {
749
+ x: newSize,
750
+ y: self.resizingStartingHeight,
751
+ draggingItem: self.currentCell,
752
+ });
753
+
672
754
  if (!internal) {
673
755
  self.resize();
674
756
  self.draw(true);
@@ -788,6 +870,26 @@ export default function (self) {
788
870
  });
789
871
  self.selections = sel;
790
872
  };
873
+ /**
874
+ * Deletes currently selected data.
875
+ * @memberof canvasDatagrid
876
+ * @name deleteSelectedData
877
+ * @method
878
+ * @param {boolean} dontDraw Suppress the draw method after the selection change.
879
+ */
880
+ self.deleteSelectedData = function (dontDraw) {
881
+ const affectedCells = self.clearSelectedCells();
882
+
883
+ self.dispatchEvent('afterdelete', {
884
+ cells: affectedCells,
885
+ });
886
+
887
+ if (dontDraw) {
888
+ return;
889
+ }
890
+
891
+ requestAnimationFrame(() => self.draw());
892
+ };
791
893
  /**
792
894
  * 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.
793
895
  * @memberof canvasDatagrid
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "canvas-datagrid",
3
- "version": "0.3.17",
3
+ "version": "0.3.21",
4
4
  "description": "Canvas based data grid web component. Capable of displaying millions of contiguous hierarchical rows and columns without paging or loading, on a single canvas element.",
5
5
  "main": "./dist/canvas-datagrid.js",
6
6
  "module": "./dist/canvas-datagrid.module.js",