@revolist/revogrid 4.21.11 → 4.22.1

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.
Files changed (66) hide show
  1. package/dist/cjs/{cell-renderer-uZmDBXz7.js → cell-renderer-BQdEGQXP.js} +2 -2
  2. package/dist/cjs/{column.drag.plugin-CM_5mKV3.js → column.drag.plugin-RDjQhKCH.js} +22 -15
  3. package/dist/cjs/{column.service-DvQDqxxx.js → column.service-DXYMehqK.js} +1 -1
  4. package/dist/cjs/{dimension.helpers-CaIsYC99.js → dimension.helpers-CiiNnlLa.js} +0 -1
  5. package/dist/cjs/{edit.utils-CwMzSIVF.js → edit.utils-CecCfA4E.js} +22 -1
  6. package/dist/cjs/{header-cell-renderer-B1dJwgTO.js → header-cell-renderer-DGyBrK8I.js} +1 -1
  7. package/dist/cjs/index.cjs.js +17 -8
  8. package/dist/cjs/revo-grid.cjs.entry.js +5 -5
  9. package/dist/cjs/revogr-attribution_7.cjs.entry.js +6 -6
  10. package/dist/cjs/revogr-clipboard_3.cjs.entry.js +4 -4
  11. package/dist/cjs/revogr-data_4.cjs.entry.js +111 -166
  12. package/dist/cjs/{text-editor-BTnGaIl3.js → text-editor-DnLZW1a-.js} +2 -2
  13. package/dist/cjs/{throttle-CI4MsAqs.js → throttle-CfgQFkfR.js} +1 -1
  14. package/dist/cjs/{viewport.store-Dcjud-a-.js → viewport.store-q6YdR9mg.js} +1 -1
  15. package/dist/collection/components/clipboard/revogr-clipboard.js +1 -1
  16. package/dist/collection/components/header/header-group-renderer.js +1 -0
  17. package/dist/collection/components/header/header-renderer.js +5 -4
  18. package/dist/collection/components/header/revogr-header.js +100 -40
  19. package/dist/collection/components/overlay/keyboard.service.js +2 -2
  20. package/dist/collection/plugins/moveColumn/column.drag.plugin.js +14 -11
  21. package/dist/collection/types/events.js +4 -0
  22. package/dist/collection/utils/key.utils.js +20 -0
  23. package/dist/{revo-grid/cell-renderer-K_BKH7Kx.js → esm/cell-renderer-CALsEsnh.js} +2 -2
  24. package/dist/esm/{column.drag.plugin-DEqZ2qXJ.js → column.drag.plugin-Dy5ztusn.js} +19 -16
  25. package/dist/esm/{column.service-Cdz3dYqZ.js → column.service-CCvAi5l4.js} +1 -1
  26. package/dist/{revo-grid/dimension.helpers-DzxqJQqN.js → esm/dimension.helpers-DmIvjIa7.js} +1 -1
  27. package/dist/esm/{edit.utils-CzfeG98N.js → edit.utils-DYN6XZh8.js} +22 -2
  28. package/dist/{revo-grid/header-cell-renderer-DXhxZMly.js → esm/header-cell-renderer-DU8wKAbg.js} +1 -1
  29. package/dist/esm/index.js +13 -9
  30. package/dist/esm/revo-grid.entry.js +5 -5
  31. package/dist/esm/revogr-attribution_7.entry.js +6 -6
  32. package/dist/esm/revogr-clipboard_3.entry.js +4 -4
  33. package/dist/esm/revogr-data_4.entry.js +111 -166
  34. package/dist/{revo-grid/text-editor-C1ks5eQ4.js → esm/text-editor-DpCnd6Fq.js} +2 -2
  35. package/dist/esm/{throttle-BEjFQa2l.js → throttle-ERvyruXb.js} +1 -1
  36. package/dist/{revo-grid/viewport.store-saAZJHRo.js → esm/viewport.store-CFjDW-3l.js} +1 -1
  37. package/dist/{esm/cell-renderer-K_BKH7Kx.js → revo-grid/cell-renderer-CALsEsnh.js} +2 -2
  38. package/dist/revo-grid/{column.drag.plugin-DEqZ2qXJ.js → column.drag.plugin-Dy5ztusn.js} +19 -16
  39. package/dist/revo-grid/{column.service-Cdz3dYqZ.js → column.service-CCvAi5l4.js} +1 -1
  40. package/dist/{esm/dimension.helpers-DzxqJQqN.js → revo-grid/dimension.helpers-DmIvjIa7.js} +1 -1
  41. package/dist/revo-grid/{edit.utils-CzfeG98N.js → edit.utils-DYN6XZh8.js} +22 -2
  42. package/dist/{esm/header-cell-renderer-DXhxZMly.js → revo-grid/header-cell-renderer-DU8wKAbg.js} +1 -1
  43. package/dist/revo-grid/index.esm.js +13 -9
  44. package/dist/revo-grid/revo-grid.entry.js +5 -5
  45. package/dist/revo-grid/revogr-attribution_7.entry.js +6 -6
  46. package/dist/revo-grid/revogr-clipboard_3.entry.js +4 -4
  47. package/dist/revo-grid/revogr-data_4.entry.js +111 -166
  48. package/dist/{esm/text-editor-C1ks5eQ4.js → revo-grid/text-editor-DpCnd6Fq.js} +2 -2
  49. package/dist/revo-grid/{throttle-BEjFQa2l.js → throttle-ERvyruXb.js} +1 -1
  50. package/dist/{esm/viewport.store-saAZJHRo.js → revo-grid/viewport.store-CFjDW-3l.js} +1 -1
  51. package/dist/types/components/header/revogr-header.d.ts +6 -0
  52. package/dist/types/plugins/moveColumn/column.drag.plugin.d.ts +29 -3
  53. package/dist/types/types/events.d.ts +1 -1
  54. package/dist/types/utils/key.utils.d.ts +8 -0
  55. package/hydrate/index.js +142 -174
  56. package/hydrate/index.mjs +142 -174
  57. package/package.json +1 -1
  58. package/standalone/column.service.js +1 -1
  59. package/standalone/data.store.js +1 -1
  60. package/standalone/index.js +1 -1
  61. package/standalone/revo-grid.js +1 -1
  62. package/standalone/revogr-clipboard2.js +1 -1
  63. package/standalone/revogr-edit.js +1 -1
  64. package/standalone/revogr-edit2.js +1 -1
  65. package/standalone/revogr-header2.js +1 -1
  66. package/standalone/revogr-overlay-selection2.js +1 -1
@@ -4,12 +4,12 @@
4
4
  'use strict';
5
5
 
6
6
  var index = require('./index-Dq8Xzj5l.js');
7
- var column_service = require('./column.service-DvQDqxxx.js');
8
- var dimension_helpers = require('./dimension.helpers-CaIsYC99.js');
9
- var cellRenderer = require('./cell-renderer-uZmDBXz7.js');
7
+ var column_service = require('./column.service-DXYMehqK.js');
8
+ var dimension_helpers = require('./dimension.helpers-CiiNnlLa.js');
9
+ var cellRenderer = require('./cell-renderer-BQdEGQXP.js');
10
10
  var filter_button = require('./filter.button-w6LWnyhi.js');
11
- var headerCellRenderer = require('./header-cell-renderer-B1dJwgTO.js');
12
- var throttle = require('./throttle-CI4MsAqs.js');
11
+ var headerCellRenderer = require('./header-cell-renderer-DGyBrK8I.js');
12
+ var throttle = require('./throttle-CfgQFkfR.js');
13
13
  var viewport_helpers = require('./viewport.helpers-BAovztDd.js');
14
14
  require('./debounce-CcpHiH2p.js');
15
15
 
@@ -261,126 +261,8 @@ const RevogrData = class {
261
261
  };
262
262
  RevogrData.style = revogrDataStyleCss();
263
263
 
264
- var defineProperty = (function() {
265
- try {
266
- var func = dimension_helpers.getNative(Object, 'defineProperty');
267
- func({}, '', {});
268
- return func;
269
- } catch (e) {}
270
- }());
271
-
272
- /**
273
- * The base implementation of `assignValue` and `assignMergeValue` without
274
- * value checks.
275
- *
276
- * @private
277
- * @param {Object} object The object to modify.
278
- * @param {string} key The key of the property to assign.
279
- * @param {*} value The value to assign.
280
- */
281
- function baseAssignValue(object, key, value) {
282
- if (key == '__proto__' && defineProperty) {
283
- defineProperty(object, key, {
284
- 'configurable': true,
285
- 'enumerable': true,
286
- 'value': value,
287
- 'writable': true
288
- });
289
- } else {
290
- object[key] = value;
291
- }
292
- }
293
-
294
- /**
295
- * A specialized version of `baseAggregator` for arrays.
296
- *
297
- * @private
298
- * @param {Array} [array] The array to iterate over.
299
- * @param {Function} setter The function to set `accumulator` values.
300
- * @param {Function} iteratee The iteratee to transform keys.
301
- * @param {Object} accumulator The initial aggregated object.
302
- * @returns {Function} Returns `accumulator`.
303
- */
304
- function arrayAggregator(array, setter, iteratee, accumulator) {
305
- var index = -1,
306
- length = array == null ? 0 : array.length;
307
-
308
- while (++index < length) {
309
- var value = array[index];
310
- setter(accumulator, value, iteratee(value), array);
311
- }
312
- return accumulator;
313
- }
314
-
315
- /**
316
- * Aggregates elements of `collection` on `accumulator` with keys transformed
317
- * by `iteratee` and values set by `setter`.
318
- *
319
- * @private
320
- * @param {Array|Object} collection The collection to iterate over.
321
- * @param {Function} setter The function to set `accumulator` values.
322
- * @param {Function} iteratee The iteratee to transform keys.
323
- * @param {Object} accumulator The initial aggregated object.
324
- * @returns {Function} Returns `accumulator`.
325
- */
326
- function baseAggregator(collection, setter, iteratee, accumulator) {
327
- column_service.baseEach(collection, function(value, key, collection) {
328
- setter(accumulator, value, iteratee(value), collection);
329
- });
330
- return accumulator;
331
- }
332
-
333
- /**
334
- * Creates a function like `_.groupBy`.
335
- *
336
- * @private
337
- * @param {Function} setter The function to set accumulator values.
338
- * @param {Function} [initializer] The accumulator object initializer.
339
- * @returns {Function} Returns the new aggregator function.
340
- */
341
- function createAggregator(setter, initializer) {
342
- return function(collection, iteratee) {
343
- var func = dimension_helpers.isArray(collection) ? arrayAggregator : baseAggregator,
344
- accumulator = {};
345
-
346
- return func(collection, setter, dimension_helpers.baseIteratee(iteratee), accumulator);
347
- };
348
- }
349
-
350
- /**
351
- * Creates an object composed of keys generated from the results of running
352
- * each element of `collection` thru `iteratee`. The corresponding value of
353
- * each key is the last element responsible for generating the key. The
354
- * iteratee is invoked with one argument: (value).
355
- *
356
- * @static
357
- * @memberOf _
358
- * @since 4.0.0
359
- * @category Collection
360
- * @param {Array|Object} collection The collection to iterate over.
361
- * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
362
- * @returns {Object} Returns the composed aggregate object.
363
- * @example
364
- *
365
- * var array = [
366
- * { 'dir': 'left', 'code': 97 },
367
- * { 'dir': 'right', 'code': 100 }
368
- * ];
369
- *
370
- * _.keyBy(array, function(o) {
371
- * return String.fromCharCode(o.code);
372
- * });
373
- * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
374
- *
375
- * _.keyBy(array, 'dir');
376
- * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
377
- */
378
- var keyBy = createAggregator(function(result, value, key) {
379
- baseAssignValue(result, key, value);
380
- });
381
-
382
264
  const HeaderRenderer = (p) => {
383
- var _a, _b, _c, _d, _e;
265
+ var _a, _b, _c, _d, _e, _f, _g;
384
266
  const cellClass = {
385
267
  [dimension_helpers.HEADER_CLASS]: true,
386
268
  [dimension_helpers.HEADER_SORTABLE_CLASS]: !!((_a = p.data) === null || _a === void 0 ? void 0 : _a.sortable),
@@ -389,10 +271,11 @@ const HeaderRenderer = (p) => {
389
271
  cellClass[p.data.order] = true;
390
272
  }
391
273
  const dataProps = {
274
+ key: String((_d = (_c = p.data) === null || _c === void 0 ? void 0 : _c.prop) !== null && _d !== void 0 ? _d : p.column.itemIndex),
392
275
  [dimension_helpers.DATA_COL]: p.column.itemIndex,
393
276
  canResize: p.canResize,
394
- minWidth: ((_c = p.data) === null || _c === void 0 ? void 0 : _c.minSize) || dimension_helpers.MIN_COL_SIZE,
395
- maxWidth: (_d = p.data) === null || _d === void 0 ? void 0 : _d.maxSize,
277
+ minWidth: ((_e = p.data) === null || _e === void 0 ? void 0 : _e.minSize) || dimension_helpers.MIN_COL_SIZE,
278
+ maxWidth: (_f = p.data) === null || _f === void 0 ? void 0 : _f.maxSize,
396
279
  active: p.active || ['r'],
397
280
  class: cellClass,
398
281
  style: {
@@ -428,11 +311,12 @@ const HeaderRenderer = (p) => {
428
311
  }
429
312
  }
430
313
  }
431
- return (index.h(headerCellRenderer.HeaderCellRenderer, { data: p.data, props: dataProps, additionalData: p.additionalData }, index.h(cellRenderer.SortingSign, { column: p.data }), p.canFilter && ((_e = p.data) === null || _e === void 0 ? void 0 : _e.filter) !== false ? (index.h(filter_button.FilterButton, { column: p.data })) : ('')));
314
+ return (index.h(headerCellRenderer.HeaderCellRenderer, { data: p.data, props: dataProps, additionalData: p.additionalData }, index.h(cellRenderer.SortingSign, { column: p.data }), p.canFilter && ((_g = p.data) === null || _g === void 0 ? void 0 : _g.filter) !== false ? (index.h(filter_button.FilterButton, { column: p.data })) : ('')));
432
315
  };
433
316
 
434
317
  const HeaderGroupRenderer = (p) => {
435
318
  const groupProps = {
319
+ key: `${p.group.name}-${p.group.indexes.join('-')}`,
436
320
  canResize: p.canResize,
437
321
  minWidth: p.group.indexes.length * dimension_helpers.MIN_COL_SIZE,
438
322
  maxWidth: 0,
@@ -482,13 +366,10 @@ const RevogrHeaderComponent = class {
482
366
  }
483
367
  onResizeGroup(changedX, startIndex, endIndex) {
484
368
  const sizes = {};
485
- const cols = keyBy(this.viewportCol.get('items'), 'itemIndex');
486
369
  const change = changedX / (endIndex - startIndex + 1);
487
370
  for (let i = startIndex; i <= endIndex; i++) {
488
- const item = cols[i];
489
- if (item) {
490
- sizes[i] = item.size + change;
491
- }
371
+ const item = dimension_helpers.getItemByIndex(this.dimensionCol.state, i);
372
+ sizes[i] = item.end - item.start + change;
492
373
  }
493
374
  this.headerresize.emit(sizes);
494
375
  }
@@ -502,12 +383,12 @@ const RevogrHeaderComponent = class {
502
383
  const { cells } = this.renderHeaderColumns(cols, range);
503
384
  const groupRow = this.renderGroupingColumns();
504
385
  return [
505
- index.h("div", { key: 'a8d57270f4758b454fb4900808453e0c4663c91c', class: "group-rgRow" }, groupRow),
506
- index.h("div", { key: '41a270ff6bde9943a81d9c46482f2a40312afb50', class: `${dimension_helpers.HEADER_ROW_CLASS} ${dimension_helpers.HEADER_ACTUAL_ROW_CLASS}` }, cells),
386
+ index.h("div", { key: '3cc466db6bc4df0cd61c47a22c3a0473318e5dd8', class: "group-rgRow" }, groupRow),
387
+ index.h("div", { key: '9742a3fa4d4b75073aef5544806f42386ebffdea', class: `${dimension_helpers.HEADER_ROW_CLASS} ${dimension_helpers.HEADER_ACTUAL_ROW_CLASS}` }, cells),
507
388
  ];
508
389
  }
509
390
  renderHeaderColumns(cols, range) {
510
- const cells = [];
391
+ const columnsToRender = [];
511
392
  for (let rgCol of cols) {
512
393
  const colData = this.colData[rgCol.itemIndex];
513
394
  const props = {
@@ -524,45 +405,105 @@ const RevogrHeaderComponent = class {
524
405
  };
525
406
  const event = this.beforeHeaderRender.emit(props);
526
407
  if (!event.defaultPrevented) {
527
- cells.push(index.h(HeaderRenderer, Object.assign({}, event.detail)));
408
+ columnsToRender.push(event.detail);
528
409
  }
529
410
  }
411
+ const duplicateProps = this.getDuplicateHeaderProps(columnsToRender);
412
+ const cells = columnsToRender.map(detail => index.h(HeaderRenderer, Object.assign({ key: this.getHeaderCellKey(detail.data, this.type, duplicateProps) }, detail)));
530
413
  return { cells };
531
414
  }
532
415
  renderGroupingColumns() {
416
+ const visibleGroupRange = this.getVisibleGroupRange();
417
+ return Array.from({ length: this.groupingDepth }, (_, level) => this.renderGroupRow(level, visibleGroupRange)).flat();
418
+ }
419
+ renderGroupRow(level, visibleGroupRange) {
420
+ const groupCells = (this.groups[level] || [])
421
+ .map(group => this.renderGroupColumn(group, level, visibleGroupRange))
422
+ .filter((cell) => !!cell);
423
+ return [
424
+ ...groupCells,
425
+ index.h('div', {
426
+ key: `group-row-${level}`,
427
+ class: {
428
+ [dimension_helpers.HEADER_ROW_CLASS]: true,
429
+ group: true,
430
+ },
431
+ }),
432
+ ];
433
+ }
434
+ renderGroupColumn(group, level, visibleGroupRange) {
533
435
  var _a;
534
- const groupRow = [];
535
- for (let i = 0; i < this.groupingDepth; i++) {
536
- if (this.groups[i]) {
537
- for (let group of this.groups[i]) {
538
- const groupStartIndex = (_a = group.indexes[0]) !== null && _a !== void 0 ? _a : -1;
539
- if (groupStartIndex > -1) {
540
- const groupEndIndex = groupStartIndex + group.indexes.length - 1;
541
- const groupStart = dimension_helpers.getItemByIndex(this.dimensionCol.state, groupStartIndex).start;
542
- const groupEnd = dimension_helpers.getItemByIndex(this.dimensionCol.state, groupEndIndex).end;
543
- const props = {
544
- providers: this.providers,
545
- start: groupStart,
546
- end: groupEnd,
547
- group,
548
- active: this.resizeHandler,
549
- canResize: this.canResize,
550
- additionalData: this.additionalData,
551
- onResize: e => {
552
- var _a;
553
- return this.onResizeGroup((_a = e.changedX) !== null && _a !== void 0 ? _a : 0, groupStartIndex, groupEndIndex);
554
- },
555
- };
556
- const event = this.beforeGroupHeaderRender.emit(props);
557
- if (!event.defaultPrevented) {
558
- groupRow.push(index.h(HeaderGroupRenderer, Object.assign({}, event.detail)));
559
- }
560
- }
436
+ const groupStartIndex = (_a = group.indexes[0]) !== null && _a !== void 0 ? _a : -1;
437
+ if (groupStartIndex < 0) {
438
+ return;
439
+ }
440
+ const groupEndIndex = groupStartIndex + group.indexes.length - 1;
441
+ if (!visibleGroupRange ||
442
+ !isGroupInVisibleRange(groupStartIndex, groupEndIndex, visibleGroupRange)) {
443
+ return;
444
+ }
445
+ const groupStart = dimension_helpers.getItemByIndex(this.dimensionCol.state, groupStartIndex).start;
446
+ const groupEnd = dimension_helpers.getItemByIndex(this.dimensionCol.state, groupEndIndex).end;
447
+ const props = {
448
+ providers: this.providers,
449
+ start: groupStart,
450
+ end: groupEnd,
451
+ group,
452
+ active: this.resizeHandler,
453
+ canResize: this.canResize,
454
+ additionalData: this.additionalData,
455
+ onResize: e => {
456
+ var _a;
457
+ return this.onResizeGroup((_a = e.changedX) !== null && _a !== void 0 ? _a : 0, groupStartIndex, groupEndIndex);
458
+ },
459
+ };
460
+ const event = this.beforeGroupHeaderRender.emit(props);
461
+ if (event.defaultPrevented) {
462
+ return;
463
+ }
464
+ return index.h(HeaderGroupRenderer, Object.assign({ key: this.getGroupHeaderCellKey(event.detail.group, level) }, event.detail));
465
+ }
466
+ getVisibleGroupRange() {
467
+ const visibleColumns = this.viewportCol.get('items');
468
+ if (!visibleColumns.length) {
469
+ return;
470
+ }
471
+ return visibleColumns.reduce((range, column) => ({
472
+ start: Math.min(range.start, column.itemIndex),
473
+ end: Math.max(range.end, column.itemIndex),
474
+ }), {
475
+ start: visibleColumns[0].itemIndex,
476
+ end: visibleColumns[0].itemIndex,
477
+ });
478
+ }
479
+ getHeaderCellKey(column, type, duplicateProps) {
480
+ if ((column === null || column === void 0 ? void 0 : column.prop) === undefined) {
481
+ return `${type}-${String(column === null || column === void 0 ? void 0 : column.index)}`;
482
+ }
483
+ const propKey = String(column.prop);
484
+ if (duplicateProps.has(propKey)) {
485
+ return `${type}-${propKey}-${String(column.index)}`;
486
+ }
487
+ return `${type}-${propKey}`;
488
+ }
489
+ getDuplicateHeaderProps(columns) {
490
+ const seenProps = new Set();
491
+ const duplicateProps = new Set();
492
+ columns.forEach(({ data }) => {
493
+ if ((data === null || data === void 0 ? void 0 : data.prop) !== undefined) {
494
+ const propKey = String(data.prop);
495
+ if (seenProps.has(propKey)) {
496
+ duplicateProps.add(propKey);
497
+ }
498
+ else {
499
+ seenProps.add(propKey);
561
500
  }
562
501
  }
563
- groupRow.push(index.h("div", { class: `${dimension_helpers.HEADER_ROW_CLASS} group` }));
564
- }
565
- return groupRow;
502
+ });
503
+ return duplicateProps;
504
+ }
505
+ getGroupHeaderCellKey(group, level) {
506
+ return `group-${level}-${group.name}-${group.indexes.join('-')}`;
566
507
  }
567
508
  get providers() {
568
509
  return {
@@ -576,6 +517,10 @@ const RevogrHeaderComponent = class {
576
517
  }
577
518
  get element() { return index.getElement(this); }
578
519
  };
520
+ function isGroupInVisibleRange(groupStartIndex, groupEndIndex, visibleRange) {
521
+ return (groupStartIndex <= visibleRange.end &&
522
+ groupEndIndex >= visibleRange.start);
523
+ }
579
524
  RevogrHeaderComponent.style = revogrHeaderStyleCss();
580
525
 
581
526
  class GridResizeService {
@@ -3,8 +3,8 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var edit_utils = require('./edit.utils-CwMzSIVF.js');
7
- var dimension_helpers = require('./dimension.helpers-CaIsYC99.js');
6
+ var edit_utils = require('./edit.utils-CecCfA4E.js');
7
+ var dimension_helpers = require('./dimension.helpers-CiiNnlLa.js');
8
8
 
9
9
  class TextEditor {
10
10
  constructor(data, saveCallback) {
@@ -3,7 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var dimension_helpers = require('./dimension.helpers-CaIsYC99.js');
6
+ var dimension_helpers = require('./dimension.helpers-CiiNnlLa.js');
7
7
  var debounce = require('./debounce-CcpHiH2p.js');
8
8
 
9
9
  const initialParams = {
@@ -3,7 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- var dimension_helpers = require('./dimension.helpers-CaIsYC99.js');
6
+ var dimension_helpers = require('./dimension.helpers-CiiNnlLa.js');
7
7
 
8
8
  const LETTER_BLOCK_SIZE = 10;
9
9
  const calculateRowHeaderSize = (itemsLength, rowHeaderColumn, minWidth = 50) => {
@@ -66,8 +66,8 @@ export class Clipboard {
66
66
  return;
67
67
  }
68
68
  const data = this.getData(beforeCopy.detail.event);
69
- this.copyRegion.emit(data || undefined);
70
69
  e.preventDefault();
70
+ this.copyRegion.emit(data || undefined);
71
71
  }
72
72
  /**
73
73
  * Listen to copy event and emit copy region event
@@ -6,6 +6,7 @@ import { HEADER_CLASS, MIN_COL_SIZE } from "../../utils/consts";
6
6
  import { HeaderCellRenderer } from "./header-cell-renderer";
7
7
  const HeaderGroupRenderer = (p) => {
8
8
  const groupProps = {
9
+ key: `${p.group.name}-${p.group.indexes.join('-')}`,
9
10
  canResize: p.canResize,
10
11
  minWidth: p.group.indexes.length * MIN_COL_SIZE,
11
12
  maxWidth: 0,
@@ -7,7 +7,7 @@ import { SortingSign } from "../../plugins/sorting/sorting.sign";
7
7
  import { DATA_COL, FOCUS_CLASS, HEADER_CLASS, HEADER_SORTABLE_CLASS, MIN_COL_SIZE, } from "../../utils/consts";
8
8
  import { HeaderCellRenderer } from "./header-cell-renderer";
9
9
  const HeaderRenderer = (p) => {
10
- var _a, _b, _c, _d, _e;
10
+ var _a, _b, _c, _d, _e, _f, _g;
11
11
  const cellClass = {
12
12
  [HEADER_CLASS]: true,
13
13
  [HEADER_SORTABLE_CLASS]: !!((_a = p.data) === null || _a === void 0 ? void 0 : _a.sortable),
@@ -16,10 +16,11 @@ const HeaderRenderer = (p) => {
16
16
  cellClass[p.data.order] = true;
17
17
  }
18
18
  const dataProps = {
19
+ key: String((_d = (_c = p.data) === null || _c === void 0 ? void 0 : _c.prop) !== null && _d !== void 0 ? _d : p.column.itemIndex),
19
20
  [DATA_COL]: p.column.itemIndex,
20
21
  canResize: p.canResize,
21
- minWidth: ((_c = p.data) === null || _c === void 0 ? void 0 : _c.minSize) || MIN_COL_SIZE,
22
- maxWidth: (_d = p.data) === null || _d === void 0 ? void 0 : _d.maxSize,
22
+ minWidth: ((_e = p.data) === null || _e === void 0 ? void 0 : _e.minSize) || MIN_COL_SIZE,
23
+ maxWidth: (_f = p.data) === null || _f === void 0 ? void 0 : _f.maxSize,
23
24
  active: p.active || ['r'],
24
25
  class: cellClass,
25
26
  style: {
@@ -55,6 +56,6 @@ const HeaderRenderer = (p) => {
55
56
  }
56
57
  }
57
58
  }
58
- return (h(HeaderCellRenderer, { data: p.data, props: dataProps, additionalData: p.additionalData }, h(SortingSign, { column: p.data }), p.canFilter && ((_e = p.data) === null || _e === void 0 ? void 0 : _e.filter) !== false ? (h(FilterButton, { column: p.data })) : ('')));
59
+ return (h(HeaderCellRenderer, { data: p.data, props: dataProps, additionalData: p.additionalData }, h(SortingSign, { column: p.data }), p.canFilter && ((_g = p.data) === null || _g === void 0 ? void 0 : _g.filter) !== false ? (h(FilterButton, { column: p.data })) : ('')));
59
60
  };
60
61
  export default HeaderRenderer;
@@ -2,7 +2,6 @@
2
2
  * Built by Revolist OU ❤️
3
3
  */
4
4
  import { h, } from "@stencil/core";
5
- import keyBy from "lodash/keyBy";
6
5
  import { getItemByIndex } from "../../store/index";
7
6
  import { HEADER_ACTUAL_ROW_CLASS, HEADER_ROW_CLASS } from "../../utils/consts";
8
7
  import HeaderRenderer from "./header-renderer";
@@ -30,13 +29,10 @@ export class RevogrHeaderComponent {
30
29
  }
31
30
  onResizeGroup(changedX, startIndex, endIndex) {
32
31
  const sizes = {};
33
- const cols = keyBy(this.viewportCol.get('items'), 'itemIndex');
34
32
  const change = changedX / (endIndex - startIndex + 1);
35
33
  for (let i = startIndex; i <= endIndex; i++) {
36
- const item = cols[i];
37
- if (item) {
38
- sizes[i] = item.size + change;
39
- }
34
+ const item = getItemByIndex(this.dimensionCol.state, i);
35
+ sizes[i] = item.end - item.start + change;
40
36
  }
41
37
  this.headerresize.emit(sizes);
42
38
  }
@@ -50,12 +46,12 @@ export class RevogrHeaderComponent {
50
46
  const { cells } = this.renderHeaderColumns(cols, range);
51
47
  const groupRow = this.renderGroupingColumns();
52
48
  return [
53
- h("div", { key: 'a8d57270f4758b454fb4900808453e0c4663c91c', class: "group-rgRow" }, groupRow),
54
- h("div", { key: '41a270ff6bde9943a81d9c46482f2a40312afb50', class: `${HEADER_ROW_CLASS} ${HEADER_ACTUAL_ROW_CLASS}` }, cells),
49
+ h("div", { key: '3cc466db6bc4df0cd61c47a22c3a0473318e5dd8', class: "group-rgRow" }, groupRow),
50
+ h("div", { key: '9742a3fa4d4b75073aef5544806f42386ebffdea', class: `${HEADER_ROW_CLASS} ${HEADER_ACTUAL_ROW_CLASS}` }, cells),
55
51
  ];
56
52
  }
57
53
  renderHeaderColumns(cols, range) {
58
- const cells = [];
54
+ const columnsToRender = [];
59
55
  for (let rgCol of cols) {
60
56
  const colData = this.colData[rgCol.itemIndex];
61
57
  const props = {
@@ -72,45 +68,105 @@ export class RevogrHeaderComponent {
72
68
  };
73
69
  const event = this.beforeHeaderRender.emit(props);
74
70
  if (!event.defaultPrevented) {
75
- cells.push(h(HeaderRenderer, Object.assign({}, event.detail)));
71
+ columnsToRender.push(event.detail);
76
72
  }
77
73
  }
74
+ const duplicateProps = this.getDuplicateHeaderProps(columnsToRender);
75
+ const cells = columnsToRender.map(detail => h(HeaderRenderer, Object.assign({ key: this.getHeaderCellKey(detail.data, this.type, duplicateProps) }, detail)));
78
76
  return { cells };
79
77
  }
80
78
  renderGroupingColumns() {
79
+ const visibleGroupRange = this.getVisibleGroupRange();
80
+ return Array.from({ length: this.groupingDepth }, (_, level) => this.renderGroupRow(level, visibleGroupRange)).flat();
81
+ }
82
+ renderGroupRow(level, visibleGroupRange) {
83
+ const groupCells = (this.groups[level] || [])
84
+ .map(group => this.renderGroupColumn(group, level, visibleGroupRange))
85
+ .filter((cell) => !!cell);
86
+ return [
87
+ ...groupCells,
88
+ h('div', {
89
+ key: `group-row-${level}`,
90
+ class: {
91
+ [HEADER_ROW_CLASS]: true,
92
+ group: true,
93
+ },
94
+ }),
95
+ ];
96
+ }
97
+ renderGroupColumn(group, level, visibleGroupRange) {
81
98
  var _a;
82
- const groupRow = [];
83
- for (let i = 0; i < this.groupingDepth; i++) {
84
- if (this.groups[i]) {
85
- for (let group of this.groups[i]) {
86
- const groupStartIndex = (_a = group.indexes[0]) !== null && _a !== void 0 ? _a : -1;
87
- if (groupStartIndex > -1) {
88
- const groupEndIndex = groupStartIndex + group.indexes.length - 1;
89
- const groupStart = getItemByIndex(this.dimensionCol.state, groupStartIndex).start;
90
- const groupEnd = getItemByIndex(this.dimensionCol.state, groupEndIndex).end;
91
- const props = {
92
- providers: this.providers,
93
- start: groupStart,
94
- end: groupEnd,
95
- group,
96
- active: this.resizeHandler,
97
- canResize: this.canResize,
98
- additionalData: this.additionalData,
99
- onResize: e => {
100
- var _a;
101
- return this.onResizeGroup((_a = e.changedX) !== null && _a !== void 0 ? _a : 0, groupStartIndex, groupEndIndex);
102
- },
103
- };
104
- const event = this.beforeGroupHeaderRender.emit(props);
105
- if (!event.defaultPrevented) {
106
- groupRow.push(h(GroupHeaderRenderer, Object.assign({}, event.detail)));
107
- }
108
- }
99
+ const groupStartIndex = (_a = group.indexes[0]) !== null && _a !== void 0 ? _a : -1;
100
+ if (groupStartIndex < 0) {
101
+ return;
102
+ }
103
+ const groupEndIndex = groupStartIndex + group.indexes.length - 1;
104
+ if (!visibleGroupRange ||
105
+ !isGroupInVisibleRange(groupStartIndex, groupEndIndex, visibleGroupRange)) {
106
+ return;
107
+ }
108
+ const groupStart = getItemByIndex(this.dimensionCol.state, groupStartIndex).start;
109
+ const groupEnd = getItemByIndex(this.dimensionCol.state, groupEndIndex).end;
110
+ const props = {
111
+ providers: this.providers,
112
+ start: groupStart,
113
+ end: groupEnd,
114
+ group,
115
+ active: this.resizeHandler,
116
+ canResize: this.canResize,
117
+ additionalData: this.additionalData,
118
+ onResize: e => {
119
+ var _a;
120
+ return this.onResizeGroup((_a = e.changedX) !== null && _a !== void 0 ? _a : 0, groupStartIndex, groupEndIndex);
121
+ },
122
+ };
123
+ const event = this.beforeGroupHeaderRender.emit(props);
124
+ if (event.defaultPrevented) {
125
+ return;
126
+ }
127
+ return h(GroupHeaderRenderer, Object.assign({ key: this.getGroupHeaderCellKey(event.detail.group, level) }, event.detail));
128
+ }
129
+ getVisibleGroupRange() {
130
+ const visibleColumns = this.viewportCol.get('items');
131
+ if (!visibleColumns.length) {
132
+ return;
133
+ }
134
+ return visibleColumns.reduce((range, column) => ({
135
+ start: Math.min(range.start, column.itemIndex),
136
+ end: Math.max(range.end, column.itemIndex),
137
+ }), {
138
+ start: visibleColumns[0].itemIndex,
139
+ end: visibleColumns[0].itemIndex,
140
+ });
141
+ }
142
+ getHeaderCellKey(column, type, duplicateProps) {
143
+ if ((column === null || column === void 0 ? void 0 : column.prop) === undefined) {
144
+ return `${type}-${String(column === null || column === void 0 ? void 0 : column.index)}`;
145
+ }
146
+ const propKey = String(column.prop);
147
+ if (duplicateProps.has(propKey)) {
148
+ return `${type}-${propKey}-${String(column.index)}`;
149
+ }
150
+ return `${type}-${propKey}`;
151
+ }
152
+ getDuplicateHeaderProps(columns) {
153
+ const seenProps = new Set();
154
+ const duplicateProps = new Set();
155
+ columns.forEach(({ data }) => {
156
+ if ((data === null || data === void 0 ? void 0 : data.prop) !== undefined) {
157
+ const propKey = String(data.prop);
158
+ if (seenProps.has(propKey)) {
159
+ duplicateProps.add(propKey);
160
+ }
161
+ else {
162
+ seenProps.add(propKey);
109
163
  }
110
164
  }
111
- groupRow.push(h("div", { class: `${HEADER_ROW_CLASS} group` }));
112
- }
113
- return groupRow;
165
+ });
166
+ return duplicateProps;
167
+ }
168
+ getGroupHeaderCellKey(group, level) {
169
+ return `group-${level}-${group.name}-${group.indexes.join('-')}`;
114
170
  }
115
171
  get providers() {
116
172
  return {
@@ -581,3 +637,7 @@ export class RevogrHeaderComponent {
581
637
  }
582
638
  static get elementRef() { return "element"; }
583
639
  }
640
+ function isGroupInVisibleRange(groupStartIndex, groupEndIndex, visibleRange) {
641
+ return (groupStartIndex <= visibleRange.end &&
642
+ groupEndIndex >= visibleRange.start);
643
+ }
@@ -2,7 +2,7 @@
2
2
  * Built by Revolist OU ❤️
3
3
  */
4
4
  import { getRange } from "../../store/index";
5
- import { codesLetter, isAll, isClear, isCopy, isCut, isEnterKeyValue, isPaste, isTab, timeout, RESIZE_INTERVAL, } from "../../utils";
5
+ import { codesLetter, isAll, isClear, isCopy, isCut, isEnterKeyValue, isPaste, isShortcutModifier, isTab, timeout, RESIZE_INTERVAL, } from "../../utils";
6
6
  import { getCoordinate, isAfterLast, isBeforeFirst, } from "./selection.utils";
7
7
  const DIRECTION_CODES = [
8
8
  codesLetter.TAB,
@@ -69,7 +69,7 @@ export class KeyboardService {
69
69
  return;
70
70
  }
71
71
  // pressed letter key
72
- if (e.key.length === 1) {
72
+ if (!isShortcutModifier(e) && e.key.length === 1) {
73
73
  this.sv.change(e.key);
74
74
  return;
75
75
  }