@visactor/vtable 0.22.0 → 0.23.0-alpha.0

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 (113) hide show
  1. package/cjs/ListTable.js.map +1 -1
  2. package/cjs/core/BaseTable.d.ts +1 -0
  3. package/cjs/core/BaseTable.js +25 -7
  4. package/cjs/core/BaseTable.js.map +1 -1
  5. package/cjs/core/TABLE_EVENT_TYPE.d.ts +3 -0
  6. package/cjs/core/TABLE_EVENT_TYPE.js +4 -1
  7. package/cjs/core/TABLE_EVENT_TYPE.js.map +1 -1
  8. package/cjs/data/DataSource.js +5 -1
  9. package/cjs/data/DataSource.js.map +1 -1
  10. package/cjs/event/event.d.ts +2 -0
  11. package/cjs/event/event.js +30 -1
  12. package/cjs/event/event.js.map +1 -1
  13. package/cjs/event/listener/container-dom.js +78 -39
  14. package/cjs/event/listener/container-dom.js.map +1 -1
  15. package/cjs/event/listener/table-group.js +5 -4
  16. package/cjs/event/listener/table-group.js.map +1 -1
  17. package/cjs/index.d.ts +1 -1
  18. package/cjs/index.js +1 -1
  19. package/cjs/index.js.map +1 -1
  20. package/cjs/layout/pivot-header-layout.js +1 -1
  21. package/cjs/layout/pivot-header-layout.js.map +1 -1
  22. package/cjs/scenegraph/component/custom.js +1 -1
  23. package/cjs/scenegraph/component/custom.js.map +1 -1
  24. package/cjs/scenegraph/group-creater/cell-helper.d.ts +1 -0
  25. package/cjs/scenegraph/group-creater/cell-helper.js +16 -26
  26. package/cjs/scenegraph/group-creater/cell-helper.js.map +1 -1
  27. package/cjs/scenegraph/group-creater/column-helper.js +3 -2
  28. package/cjs/scenegraph/group-creater/column-helper.js.map +1 -1
  29. package/cjs/scenegraph/group-creater/progress/proxy.js +1 -1
  30. package/cjs/scenegraph/group-creater/progress/proxy.js.map +1 -1
  31. package/cjs/scenegraph/scenegraph.d.ts +3 -0
  32. package/cjs/scenegraph/scenegraph.js +3 -0
  33. package/cjs/scenegraph/scenegraph.js.map +1 -1
  34. package/cjs/scenegraph/select/create-select-border.d.ts +1 -1
  35. package/cjs/scenegraph/select/create-select-border.js +24 -5
  36. package/cjs/scenegraph/select/create-select-border.js.map +1 -1
  37. package/cjs/scenegraph/select/delete-select-border.d.ts +1 -0
  38. package/cjs/scenegraph/select/delete-select-border.js +15 -4
  39. package/cjs/scenegraph/select/delete-select-border.js.map +1 -1
  40. package/cjs/scenegraph/select/move-select-border.js +3 -1
  41. package/cjs/scenegraph/select/move-select-border.js.map +1 -1
  42. package/cjs/scenegraph/select/update-select-border.d.ts +2 -0
  43. package/cjs/scenegraph/select/update-select-border.js +28 -4
  44. package/cjs/scenegraph/select/update-select-border.js.map +1 -1
  45. package/cjs/state/state.d.ts +10 -0
  46. package/cjs/state/state.js +17 -0
  47. package/cjs/state/state.js.map +1 -1
  48. package/cjs/ts-types/base-table.d.ts +4 -0
  49. package/cjs/ts-types/base-table.js.map +1 -1
  50. package/cjs/ts-types/events.d.ts +8 -0
  51. package/cjs/ts-types/events.js.map +1 -1
  52. package/cjs/ts-types/new-data-set.d.ts +2 -1
  53. package/cjs/ts-types/new-data-set.js.map +1 -1
  54. package/cjs/ts-types/theme.js.map +1 -1
  55. package/cjs/vrender.js.map +1 -1
  56. package/dist/vtable.js +396 -129
  57. package/dist/vtable.min.js +2 -2
  58. package/es/ListTable.js.map +1 -1
  59. package/es/core/BaseTable.d.ts +1 -0
  60. package/es/core/BaseTable.js +25 -8
  61. package/es/core/BaseTable.js.map +1 -1
  62. package/es/core/TABLE_EVENT_TYPE.d.ts +3 -0
  63. package/es/core/TABLE_EVENT_TYPE.js +4 -1
  64. package/es/core/TABLE_EVENT_TYPE.js.map +1 -1
  65. package/es/data/DataSource.js +5 -1
  66. package/es/data/DataSource.js.map +1 -1
  67. package/es/event/event.d.ts +2 -0
  68. package/es/event/event.js +30 -1
  69. package/es/event/event.js.map +1 -1
  70. package/es/event/listener/container-dom.js +78 -39
  71. package/es/event/listener/container-dom.js.map +1 -1
  72. package/es/event/listener/table-group.js +5 -4
  73. package/es/event/listener/table-group.js.map +1 -1
  74. package/es/index.d.ts +1 -1
  75. package/es/index.js +1 -1
  76. package/es/index.js.map +1 -1
  77. package/es/layout/pivot-header-layout.js +1 -1
  78. package/es/layout/pivot-header-layout.js.map +1 -1
  79. package/es/scenegraph/component/custom.js +1 -1
  80. package/es/scenegraph/component/custom.js.map +1 -1
  81. package/es/scenegraph/group-creater/cell-helper.d.ts +1 -0
  82. package/es/scenegraph/group-creater/cell-helper.js +12 -24
  83. package/es/scenegraph/group-creater/cell-helper.js.map +1 -1
  84. package/es/scenegraph/group-creater/column-helper.js +5 -4
  85. package/es/scenegraph/group-creater/column-helper.js.map +1 -1
  86. package/es/scenegraph/group-creater/progress/proxy.js +1 -1
  87. package/es/scenegraph/group-creater/progress/proxy.js.map +1 -1
  88. package/es/scenegraph/scenegraph.d.ts +3 -0
  89. package/es/scenegraph/scenegraph.js +4 -1
  90. package/es/scenegraph/scenegraph.js.map +1 -1
  91. package/es/scenegraph/select/create-select-border.d.ts +1 -1
  92. package/es/scenegraph/select/create-select-border.js +24 -5
  93. package/es/scenegraph/select/create-select-border.js.map +1 -1
  94. package/es/scenegraph/select/delete-select-border.d.ts +1 -0
  95. package/es/scenegraph/select/delete-select-border.js +12 -2
  96. package/es/scenegraph/select/delete-select-border.js.map +1 -1
  97. package/es/scenegraph/select/move-select-border.js +3 -1
  98. package/es/scenegraph/select/move-select-border.js.map +1 -1
  99. package/es/scenegraph/select/update-select-border.d.ts +2 -0
  100. package/es/scenegraph/select/update-select-border.js +25 -2
  101. package/es/scenegraph/select/update-select-border.js.map +1 -1
  102. package/es/state/state.d.ts +10 -0
  103. package/es/state/state.js +17 -0
  104. package/es/state/state.js.map +1 -1
  105. package/es/ts-types/base-table.d.ts +4 -0
  106. package/es/ts-types/base-table.js.map +1 -1
  107. package/es/ts-types/events.d.ts +8 -0
  108. package/es/ts-types/events.js.map +1 -1
  109. package/es/ts-types/new-data-set.d.ts +2 -1
  110. package/es/ts-types/new-data-set.js.map +1 -1
  111. package/es/ts-types/theme.js.map +1 -1
  112. package/es/vrender.js.map +1 -1
  113. package/package.json +5 -5
package/dist/vtable.js CHANGED
@@ -23050,7 +23050,10 @@
23050
23050
  CHECKBOX_STATE_CHANGE: 'checkbox_state_change',
23051
23051
  AFTER_RENDER: 'after_render',
23052
23052
  INITIALIZED: 'initialized',
23053
- CHANGE_CELL_VALUE: 'change_cell_value'
23053
+ CHANGE_CELL_VALUE: 'change_cell_value',
23054
+ DRAG_FILL_HANDLE_END: 'drag_fill_handle_end',
23055
+ MOUSEDOWN_FILL_HANDLE: 'mousedown_fill_handle',
23056
+ DBLCLICK_FILL_HANDLE: 'dblclick_fill_handle'
23054
23057
  };
23055
23058
 
23056
23059
  const judgeType = (value) => {
@@ -33851,11 +33854,20 @@
33851
33854
  if (typeof field === 'string' || typeof field === 'number') {
33852
33855
  const beforeChangedValue = this.beforeChangedRecordsMap[dataIndex][field];
33853
33856
  const record = this.getOriginalRecord(dataIndex);
33857
+ let formatValue = value;
33854
33858
  if (typeof beforeChangedValue === 'number' && isAllDigits(value)) {
33855
- record[field] = parseFloat(value);
33859
+ formatValue = parseFloat(value);
33860
+ }
33861
+ if (isPromise(record)) {
33862
+ record
33863
+ .then(record => {
33864
+ record[field] = formatValue;
33865
+ })
33866
+ .catch((err) => {
33867
+ });
33856
33868
  }
33857
33869
  else {
33858
- record[field] = value;
33870
+ record[field] = formatValue;
33859
33871
  }
33860
33872
  }
33861
33873
  }
@@ -35475,7 +35487,9 @@
35475
35487
  });
35476
35488
  }
35477
35489
  function decodeReactDom(dom) {
35478
- if (!dom || !dom.$$typeof) {
35490
+ if (!dom ||
35491
+ (!isValid$3(dom.$$typeof) &&
35492
+ !isValid$3(dom.vtype))) {
35479
35493
  return dom;
35480
35494
  }
35481
35495
  const type = dom.type;
@@ -38347,16 +38361,6 @@
38347
38361
  if (isPromise(value)) {
38348
38362
  value = table.getCellValue(col, row);
38349
38363
  }
38350
- let bgColorFunc;
38351
- if (table.internalProps?.dataConfig?.mappingRules && !table.isHeader(col, row)) {
38352
- table.internalProps?.dataConfig?.mappingRules?.forEach((mappingRule, i) => {
38353
- if (mappingRule.bgColor &&
38354
- table.internalProps.layoutMap.getIndicatorKey(col, row) ===
38355
- mappingRule.bgColor.indicatorKey) {
38356
- bgColorFunc = mappingRule.bgColor.mapping;
38357
- }
38358
- });
38359
- }
38360
38364
  let cellGroup;
38361
38365
  if (type === 'text' || type === 'link') {
38362
38366
  if (type === 'link') {
@@ -38382,22 +38386,6 @@
38382
38386
  }
38383
38387
  }
38384
38388
  }
38385
- if (bgColorFunc) {
38386
- const cellValue = table.getCellOriginValue(col, row);
38387
- const bgColor = bgColorFunc(table, cellValue);
38388
- if (bgColor) {
38389
- if (cellTheme) {
38390
- cellTheme.group.fill = bgColor;
38391
- }
38392
- else {
38393
- cellTheme = {
38394
- group: {
38395
- fill: bgColor
38396
- }
38397
- };
38398
- }
38399
- }
38400
- }
38401
38389
  let customElementsGroup;
38402
38390
  let renderDefault = true;
38403
38391
  if (customResult) {
@@ -38601,16 +38589,6 @@
38601
38589
  const textAlign = cellTheme.text.textAlign;
38602
38590
  const textBaseline = cellTheme.text.textBaseline;
38603
38591
  let newCellGroup;
38604
- let bgColorFunc;
38605
- if (table.internalProps?.dataConfig?.mappingRules && !table.isHeader(col, row)) {
38606
- table.internalProps?.dataConfig?.mappingRules?.forEach((mappingRule, i) => {
38607
- if (mappingRule.bgColor &&
38608
- table.internalProps.layoutMap.getIndicatorKey(col, row) ===
38609
- mappingRule.bgColor.indicatorKey) {
38610
- bgColorFunc = mappingRule.bgColor.mapping;
38611
- }
38612
- });
38613
- }
38614
38592
  let cellWidth;
38615
38593
  let cellHeight;
38616
38594
  if (range) {
@@ -38623,10 +38601,10 @@
38623
38601
  }
38624
38602
  if (isPromise(value)) {
38625
38603
  oldCellGroup.removeAllChild();
38626
- dealPromiseData(value, table, updateCellContent.bind(null, type, value, define, table, col, row, bgColorFunc, cellWidth, cellHeight, oldCellGroup, padding, textAlign, textBaseline, mayHaveIcon, addNew, cellTheme, range, customResult));
38604
+ dealPromiseData(value, table, updateCellContent.bind(null, type, value, define, table, col, row, cellWidth, cellHeight, oldCellGroup, padding, textAlign, textBaseline, mayHaveIcon, addNew, cellTheme, range, customResult));
38627
38605
  }
38628
38606
  else {
38629
- newCellGroup = updateCellContent(type, value, define, table, col, row, bgColorFunc, cellWidth, cellHeight, oldCellGroup, padding, textAlign, textBaseline, mayHaveIcon, addNew, cellTheme, range, customResult);
38607
+ newCellGroup = updateCellContent(type, value, define, table, col, row, cellWidth, cellHeight, oldCellGroup, padding, textAlign, textBaseline, mayHaveIcon, addNew, cellTheme, range, customResult);
38630
38608
  }
38631
38609
  if (isMerge) {
38632
38610
  const { width: contentWidth } = newCellGroup.attribute;
@@ -38637,7 +38615,7 @@
38637
38615
  }
38638
38616
  return newCellGroup;
38639
38617
  }
38640
- function updateCellContent(type, value, define, table, col, row, bgColorFunc, cellWidth, cellHeight, oldCellGroup, padding, textAlign, textBaseline, mayHaveIcon, addNew, cellTheme, range, customResult) {
38618
+ function updateCellContent(type, value, define, table, col, row, cellWidth, cellHeight, oldCellGroup, padding, textAlign, textBaseline, mayHaveIcon, addNew, cellTheme, range, customResult) {
38641
38619
  if (isPromise(value)) {
38642
38620
  value = table.getCellValue(col, row);
38643
38621
  }
@@ -38676,10 +38654,10 @@
38676
38654
  for (let col = range.start.col; col <= range.end.col; col++) {
38677
38655
  for (let row = range.start.row; row <= range.end.row; row++) {
38678
38656
  const cellGroup = table.scenegraph.getCell(col, row, true);
38679
- if (range.start.row !== range.end.row) {
38657
+ if (cellGroup.role === 'cell' && range.start.row !== range.end.row && cellGroup.contentWidth !== cellWidth) {
38680
38658
  updateCellContentHeight(cellGroup, cellHeight, cellHeight, table.heightMode === 'autoHeight', padding, textAlign, textBaseline);
38681
38659
  }
38682
- if (range.start.col !== range.end.col) {
38660
+ if (cellGroup.role === 'cell' && range.start.col !== range.end.col && cellGroup.contentHeight !== cellHeight) {
38683
38661
  updateCellContentWidth(cellGroup, cellWidth, cellHeight, 0, table.heightMode === 'autoHeight', padding, textAlign, textBaseline, table.scenegraph);
38684
38662
  }
38685
38663
  cellGroup.contentWidth = cellWidth;
@@ -43836,12 +43814,12 @@
43836
43814
  columnGroup.updateColumnRowNumber(row);
43837
43815
  if (isMerge) {
43838
43816
  const rangeHeight = table.getRowHeight(row);
43839
- const rangeWidth = table.getColWidth(col);
43817
+ table.getColWidth(col);
43840
43818
  const { width: contentWidth } = cellGroup.attribute;
43841
43819
  const { height: contentHeight } = cellGroup.attribute;
43842
43820
  cellGroup.contentWidth = contentWidth;
43843
43821
  cellGroup.contentHeight = contentHeight;
43844
- resizeCellGroup(cellGroup, rangeWidth, rangeHeight, range, table);
43822
+ dealWithMergeCellSize(range, contentWidth, contentHeight, padding, textAlign, textBaseline, table);
43845
43823
  columnGroup.updateColumnHeight(rangeHeight);
43846
43824
  y += rangeHeight;
43847
43825
  }
@@ -44877,7 +44855,7 @@
44877
44855
  computeColsWidth(this.table, this.currentCol + 1, endCol);
44878
44856
  for (let row = 0; row < this.table.rowCount; row++) {
44879
44857
  const cellGroup = this.highPerformanceGetCell(this.currentCol, row);
44880
- if (isNumber$4(cellGroup.mergeStartCol) && cellGroup.mergeStartCol > this.currentCol) {
44858
+ if (cellGroup.role === 'cell' && isNumber$4(cellGroup.mergeStartCol) && cellGroup.mergeStartCol > this.currentCol) {
44881
44859
  this.table.scenegraph.updateCellContent(cellGroup.col, cellGroup.row);
44882
44860
  }
44883
44861
  }
@@ -45294,6 +45272,7 @@
45294
45272
  const colsWidth = scene.table.getColsWidth(computeRectCellRangeStartCol, computeRectCellRangeEndCol);
45295
45273
  const rowsHeight = scene.table.getRowsHeight(computeRectCellRangeStartRow, computeRectCellRangeEndRow);
45296
45274
  const firstCellBound = scene.highPerformanceGetCell(computeRectCellRangeStartCol, computeRectCellRangeStartRow).globalAABBBounds;
45275
+ const lastCellBound = scene.highPerformanceGetCell(computeRectCellRangeEndCol, computeRectCellRangeEndRow).globalAABBBounds;
45297
45276
  selectComp.rect.setAttributes({
45298
45277
  x: firstCellBound.x1 - scene.tableGroup.attribute.x,
45299
45278
  y: firstCellBound.y1 - scene.tableGroup.attribute.y,
@@ -45301,6 +45280,15 @@
45301
45280
  height: rowsHeight,
45302
45281
  visible: true
45303
45282
  });
45283
+ if (selectComp.fillhandle) {
45284
+ selectComp.fillhandle.setAttributes({
45285
+ x: lastCellBound.x2 - scene.tableGroup.attribute.x - 3,
45286
+ y: lastCellBound.y2 - scene.tableGroup.attribute.y - 3,
45287
+ width: 6,
45288
+ height: 6,
45289
+ visible: true
45290
+ });
45291
+ }
45304
45292
  const isNearRowHeader = scene.table.frozenColCount ? startCol === scene.table.frozenColCount : false;
45305
45293
  const isNearRightRowHeader = scene.table.rightFrozenColCount
45306
45294
  ? scene.table.rightFrozenColCount > 0 && endCol === scene.table.colCount - scene.table.rightFrozenColCount - 1
@@ -45504,6 +45492,7 @@
45504
45492
  ifExtendSelectRange && extendSelectRange();
45505
45493
  scene.selectingRangeComponents.forEach((selectComp, key) => {
45506
45494
  selectComp.rect.delete();
45495
+ selectComp.fillhandle?.delete();
45507
45496
  });
45508
45497
  scene.selectingRangeComponents = new Map();
45509
45498
  let needRowHeader = false;
@@ -45615,13 +45604,45 @@
45615
45604
  scene.createCellSelectBorder(columnHeaderStartCol, columnHeaderStartRow, columnHeaderEndCol, columnHeaderEndRow, 'body', `${startCol}${startRow}${endCol}${endRow}`, strokeArray);
45616
45605
  }
45617
45606
  }
45607
+ function hideCellSelectBorder(scene) {
45608
+ scene.selectingRangeComponents.forEach((selectComp, key) => {
45609
+ selectComp.rect.setAttribute('visible', false);
45610
+ });
45611
+ scene.selectedRangeComponents.forEach((selectComp, key) => {
45612
+ selectComp.rect.setAttribute('visible', false);
45613
+ });
45614
+ }
45615
+ function restoreCellSelectBorder(scene) {
45616
+ scene.selectingRangeComponents.forEach((selectComp, key) => {
45617
+ selectComp.rect.setAttribute('visible', false);
45618
+ });
45619
+ scene.selectedRangeComponents.forEach((selectComp, key) => {
45620
+ selectComp.rect.setAttribute('visible', false);
45621
+ });
45622
+ }
45618
45623
 
45619
45624
  function createCellSelectBorder(scene, start_Col, start_Row, end_Col, end_Row, selectRangeType, selectId, strokes) {
45625
+ let isHasFillHandleRect = !!scene.table.options.excelOptions?.fillHandle;
45626
+ if (scene.table.stateManager.select.ranges?.length > 1) {
45627
+ isHasFillHandleRect = false;
45628
+ scene.removeFillHandleFromSelectComponents();
45629
+ }
45630
+ else if (scene.table.stateManager.select.ranges?.length === 1) {
45631
+ const maxRow = Math.max(scene.table.stateManager.select.ranges[0].start.row, scene.table.stateManager.select.ranges[0].end.row);
45632
+ const maxCol = Math.max(scene.table.stateManager.select.ranges[0].start.col, scene.table.stateManager.select.ranges[0].end.col);
45633
+ if (scene.table.isHeader(maxCol, maxRow)) {
45634
+ isHasFillHandleRect = false;
45635
+ }
45636
+ }
45637
+ if (Array.isArray(strokes) && (strokes[1] === false || strokes[2] === false)) {
45638
+ isHasFillHandleRect = false;
45639
+ }
45620
45640
  const startCol = Math.min(start_Col, end_Col);
45621
45641
  const startRow = Math.min(start_Row, end_Row);
45622
45642
  const endCol = Math.max(start_Col, end_Col);
45623
45643
  const endRow = Math.max(start_Row, end_Row);
45624
45644
  const firstCellBound = scene.highPerformanceGetCell(startCol, startRow).globalAABBBounds;
45645
+ const lastCellBound = scene.highPerformanceGetCell(endCol, endRow).globalAABBBounds;
45625
45646
  const theme = scene.table.theme;
45626
45647
  const bodyClickBorderColor = theme.selectionStyle?.cellBorderColor;
45627
45648
  const bodyClickLineWidth = theme.selectionStyle?.cellBorderLineWidth;
@@ -45641,9 +45662,23 @@
45641
45662
  height: 0,
45642
45663
  visible: true
45643
45664
  });
45665
+ let fillhandle;
45666
+ if (isHasFillHandleRect) {
45667
+ fillhandle = createRect({
45668
+ pickable: false,
45669
+ fill: bodyClickBorderColor,
45670
+ stroke: bodyClickBorderColor,
45671
+ x: lastCellBound.x2 - 3,
45672
+ y: lastCellBound.y2 - 3,
45673
+ width: 6,
45674
+ height: 6,
45675
+ visible: true
45676
+ });
45677
+ }
45644
45678
  scene.lastSelectId = selectId;
45645
45679
  scene.selectingRangeComponents.set(`${startCol}-${startRow}-${endCol}-${endRow}-${selectId}`, {
45646
45680
  rect,
45681
+ fillhandle,
45647
45682
  role: selectRangeType
45648
45683
  });
45649
45684
  scene.tableGroup.insertAfter(rect, selectRangeType === 'body'
@@ -45663,12 +45698,31 @@
45663
45698
  : selectRangeType === 'bottomFrozen'
45664
45699
  ? scene.bottomFrozenGroup
45665
45700
  : scene.rightBottomCornerGroup);
45701
+ isHasFillHandleRect &&
45702
+ scene.tableGroup.insertAfter(fillhandle, selectRangeType === 'body'
45703
+ ? scene.bodyGroup
45704
+ : selectRangeType === 'columnHeader'
45705
+ ? scene.colHeaderGroup
45706
+ : selectRangeType === 'rowHeader'
45707
+ ? scene.rowHeaderGroup
45708
+ : selectRangeType === 'cornerHeader'
45709
+ ? scene.cornerHeaderGroup
45710
+ : selectRangeType === 'rightTopCorner'
45711
+ ? scene.rightTopCornerGroup
45712
+ : selectRangeType === 'rightFrozen'
45713
+ ? scene.rightFrozenGroup
45714
+ : selectRangeType === 'leftBottomCorner'
45715
+ ? scene.leftBottomCornerGroup
45716
+ : selectRangeType === 'bottomFrozen'
45717
+ ? scene.bottomFrozenGroup
45718
+ : scene.rightBottomCornerGroup);
45666
45719
  }
45667
45720
 
45668
45721
  function moveSelectingRangeComponentsToSelectedRangeComponents(scene) {
45669
45722
  scene.selectingRangeComponents.forEach((rangeComponent, key) => {
45670
45723
  if (scene.selectedRangeComponents.get(key)) {
45671
- scene.selectedRangeComponents.get(key).rect.delete();
45724
+ scene.selectingRangeComponents.get(key).rect.delete();
45725
+ scene.selectingRangeComponents.get(key).fillhandle?.delete();
45672
45726
  }
45673
45727
  scene.selectedRangeComponents.set(key, rangeComponent);
45674
45728
  });
@@ -45681,6 +45735,7 @@
45681
45735
  const lastSelectId = key.split('-')[4];
45682
45736
  if (lastSelectId === scene.lastSelectId) {
45683
45737
  selectComp.rect.delete();
45738
+ selectComp.fillhandle?.delete();
45684
45739
  scene.selectedRangeComponents.delete(key);
45685
45740
  }
45686
45741
  });
@@ -45688,9 +45743,16 @@
45688
45743
  function deleteAllSelectBorder(scene) {
45689
45744
  scene.selectedRangeComponents.forEach((selectComp, key) => {
45690
45745
  selectComp.rect.delete();
45746
+ selectComp.fillhandle?.delete();
45691
45747
  });
45692
45748
  scene.selectedRangeComponents = new Map();
45693
45749
  }
45750
+ function removeFillHandleFromSelectComponents(scene) {
45751
+ scene.selectedRangeComponents.forEach((selectComp, key) => {
45752
+ selectComp.fillhandle?.delete();
45753
+ selectComp.fillhandle = undefined;
45754
+ });
45755
+ }
45694
45756
 
45695
45757
  function updateRow(removeCells, addCells, updateCells, table) {
45696
45758
  const scene = table.scenegraph;
@@ -47863,6 +47925,9 @@
47863
47925
  updateCellSelectBorder(newStartCol, newStartRow, newEndCol, newEndRow, extendSelectRange = true) {
47864
47926
  updateCellSelectBorder(this, newStartCol, newStartRow, newEndCol, newEndRow, extendSelectRange);
47865
47927
  }
47928
+ removeFillHandleFromSelectComponents() {
47929
+ removeFillHandleFromSelectComponents(this);
47930
+ }
47866
47931
  recreateAllSelectRangeComponents() {
47867
47932
  deleteAllSelectBorder(this);
47868
47933
  this.table.stateManager.select.ranges.forEach((cellRange) => {
@@ -49657,6 +49722,7 @@
49657
49722
  table;
49658
49723
  interactionState;
49659
49724
  select;
49725
+ fillHandle;
49660
49726
  hover;
49661
49727
  hoverIcon;
49662
49728
  residentHoverIcon;
@@ -49759,6 +49825,11 @@
49759
49825
  },
49760
49826
  selecting: false
49761
49827
  };
49828
+ this.fillHandle = {
49829
+ isFilling: false,
49830
+ startX: undefined,
49831
+ startY: undefined
49832
+ };
49762
49833
  this.hover = {
49763
49834
  highlightScope: HighlightScope.single,
49764
49835
  cellPos: {
@@ -49962,6 +50033,9 @@
49962
50033
  isResizeCol() {
49963
50034
  return this.columnResize.resizing;
49964
50035
  }
50036
+ isFillHandle() {
50037
+ return this.fillHandle.isFilling;
50038
+ }
49965
50039
  isSelecting() {
49966
50040
  return this.select.selecting;
49967
50041
  }
@@ -49998,6 +50072,21 @@
49998
50072
  this.table.stateManager.updateSelectPos(-1, -1);
49999
50073
  this.table.scenegraph.updateNextFrame();
50000
50074
  }
50075
+ startFillSelect(x, y) {
50076
+ this.fillHandle.isFilling = true;
50077
+ this.fillHandle.startX = x;
50078
+ this.fillHandle.startY = y;
50079
+ this.table.scenegraph.updateNextFrame();
50080
+ this.table.fireListeners(TABLE_EVENT_TYPE.MOUSEDOWN_FILL_HANDLE, {});
50081
+ }
50082
+ endFillSelect() {
50083
+ this.fillHandle.isFilling = false;
50084
+ this.fillHandle.startX = undefined;
50085
+ this.fillHandle.startY = undefined;
50086
+ this.table.stateManager.fillHandle.directionRow = undefined;
50087
+ this.table.eventManager.isDraging &&
50088
+ this.table.fireListeners(TABLE_EVENT_TYPE.DRAG_FILL_HANDLE_END, { direction: this.fillHandle.direction });
50089
+ }
50001
50090
  updateResizeCol(xInTable, yInTable) {
50002
50091
  updateResizeColumn(xInTable, yInTable, this);
50003
50092
  }
@@ -50741,6 +50830,9 @@
50741
50830
  else if (stateManager.isMoveCol()) {
50742
50831
  eventManager.dealColumnMover(eventArgsSet);
50743
50832
  }
50833
+ else if (stateManager.isFillHandle()) {
50834
+ eventManager.dealFillSelect(eventArgsSet, true);
50835
+ }
50744
50836
  else {
50745
50837
  eventManager.dealTableSelect(eventArgsSet, true);
50746
50838
  }
@@ -50748,7 +50840,12 @@
50748
50840
  return;
50749
50841
  }
50750
50842
  if (stateManager.isResizeCol() || eventManager.checkColumnResize(eventArgsSet)) {
50751
- stateManager.updateCursor('col-resize');
50843
+ if (table.stateManager.select && eventManager.checkCellFillhandle(eventArgsSet)) {
50844
+ stateManager.updateCursor('crosshair');
50845
+ }
50846
+ else {
50847
+ stateManager.updateCursor('col-resize');
50848
+ }
50752
50849
  }
50753
50850
  else {
50754
50851
  stateManager.updateCursor();
@@ -50983,7 +51080,7 @@
50983
51080
  eventManager.dealTableHover(eventArgsSet);
50984
51081
  }
50985
51082
  else {
50986
- if (eventManager.checkColumnResize(eventArgsSet, true)) {
51083
+ if (!eventManager.checkCellFillhandle(eventArgsSet) && eventManager.checkColumnResize(eventArgsSet, true)) {
50987
51084
  table.scenegraph.updateChartState(null);
50988
51085
  stateManager.updateInteractionState(InteractionState.grabing);
50989
51086
  return;
@@ -50992,6 +51089,10 @@
50992
51089
  stateManager.updateInteractionState(InteractionState.grabing);
50993
51090
  return;
50994
51091
  }
51092
+ if (eventManager.checkCellFillhandle(eventArgsSet, true) && eventManager.dealFillSelect(eventArgsSet)) {
51093
+ stateManager.updateInteractionState(InteractionState.grabing);
51094
+ return;
51095
+ }
50995
51096
  if (eventManager.dealTableSelect(eventArgsSet)) {
50996
51097
  stateManager.updateInteractionState(InteractionState.grabing);
50997
51098
  }
@@ -51037,6 +51138,9 @@
51037
51138
  }
51038
51139
  else if (stateManager.isSelecting()) {
51039
51140
  table.stateManager.endSelectCells();
51141
+ if (table.stateManager.isFillHandle()) {
51142
+ table.stateManager.endFillSelect();
51143
+ }
51040
51144
  const eventArgsSet = getCellEventArgsSet(e);
51041
51145
  if (eventArgsSet.eventArgs && table.hasListeners(TABLE_EVENT_TYPE.DRAG_SELECT_END)) {
51042
51146
  const cellsEvent = {
@@ -51634,84 +51738,13 @@
51634
51738
  return;
51635
51739
  }
51636
51740
  if (table.stateManager.select.ranges?.length > 0) {
51637
- const ranges = table.stateManager.select.ranges;
51638
- const col = Math.min(ranges[0].start.col, ranges[0].end.col);
51639
- const row = Math.min(ranges[0].start.row, ranges[0].end.row);
51640
- const values = [];
51641
51741
  navigator.clipboard.read().then(clipboardItems => {
51642
51742
  for (const item of clipboardItems) {
51643
51743
  if (item.types.includes('text/html')) {
51644
- item.getType('text/html').then(blob => {
51645
- blob.text().then(pastedData => {
51646
- if (pastedData && /(<table)|(<TABLE)/g.test(pastedData)) {
51647
- const regex = /<tr[^>]*>(.*?)<\/tr>/gs;
51648
- const matches = Array.from(pastedData.matchAll(regex));
51649
- for (const match of matches) {
51650
- const rowContent = match[1];
51651
- const cellRegex = /<td[^>]*>(.*?)<\/td>/gs;
51652
- const cellMatches = Array.from(rowContent.matchAll(cellRegex));
51653
- const rowValues = cellMatches.map(cellMatch => {
51654
- return (cellMatch[1]
51655
- .replace(/(<(?!br)([^>]+)>)/gi, '')
51656
- .replace(/<br(\s*|\/)>[\r\n]?/gim, '\n')
51657
- .replace(/&amp;/g, '&')
51658
- .replace(/&lt;/g, '<')
51659
- .replace(/&gt;/g, '>')
51660
- .replace(/&#9;/gi, '\t')
51661
- .replace(/&nbsp;/g, ' '));
51662
- });
51663
- values.push(rowValues);
51664
- }
51665
- table.changeCellValues(col, row, values, true);
51666
- }
51667
- else {
51668
- navigator.clipboard.read().then(clipboardItems => {
51669
- for (const item of clipboardItems) {
51670
- if (item.types.includes('text/plain')) {
51671
- item.getType('text/plain').then(blob => {
51672
- blob.text().then(pastedData => {
51673
- const rows = pastedData.split('\n');
51674
- rows.forEach(function (rowCells, rowIndex) {
51675
- const cells = rowCells.split('\t');
51676
- const rowValues = [];
51677
- values.push(rowValues);
51678
- cells.forEach(function (cell, cellIndex) {
51679
- if (cellIndex === cells.length - 1) {
51680
- cell = cell.trim();
51681
- }
51682
- rowValues.push(cell);
51683
- });
51684
- });
51685
- table.changeCellValues(col, row, values, true);
51686
- });
51687
- });
51688
- }
51689
- }
51690
- });
51691
- }
51692
- });
51693
- });
51744
+ pasteHtmlToTable(item);
51694
51745
  }
51695
51746
  else if (item.types.length === 1 && item.types[0] === 'text/plain') {
51696
- item.getType('text/plain').then(blob => {
51697
- blob.text().then(pastedData => {
51698
- const rows = pastedData.replace(/\r(?!\n)/g, '\r\n').split('\r\n');
51699
- if (rows.length > 1 && rows[rows.length - 1] === '') {
51700
- rows.pop();
51701
- }
51702
- rows.forEach(function (rowCells, rowIndex) {
51703
- const cells = rowCells.split('\t');
51704
- cells.forEach(function (cell, cellIndex) {
51705
- if (cell.includes('\n')) {
51706
- cell = cell
51707
- .replace(/^"(.*)"$/, '$1')
51708
- .replace(/["]*/g, match => new Array(Math.floor(match.length / 2)).fill('"').join(''));
51709
- }
51710
- });
51711
- });
51712
- });
51713
- });
51714
- table.changeCellValues(col, row, values, true);
51747
+ pasteTextToTable(item);
51715
51748
  }
51716
51749
  else ;
51717
51750
  }
@@ -51730,6 +51763,138 @@
51730
51763
  }
51731
51764
  table.resize();
51732
51765
  });
51766
+ function pasteHtmlToTable(item) {
51767
+ const ranges = table.stateManager.select.ranges;
51768
+ const selectRangeLength = ranges.length;
51769
+ const col = Math.min(ranges[selectRangeLength - 1].start.col, ranges[selectRangeLength - 1].end.col);
51770
+ const row = Math.min(ranges[selectRangeLength - 1].start.row, ranges[selectRangeLength - 1].end.row);
51771
+ const maxCol = Math.max(ranges[selectRangeLength - 1].start.col, ranges[selectRangeLength - 1].end.col);
51772
+ const maxRow = Math.max(ranges[selectRangeLength - 1].start.row, ranges[selectRangeLength - 1].end.row);
51773
+ let pasteValuesColCount = 0;
51774
+ let pasteValuesRowCount = 0;
51775
+ let values = [];
51776
+ item.getType('text/html').then((blob) => {
51777
+ blob.text().then((pastedData) => {
51778
+ if (pastedData && /(<table)|(<TABLE)/g.test(pastedData)) {
51779
+ const regex = /<tr[^>]*>(.*?)<\/tr>/gs;
51780
+ const matches = Array.from(pastedData.matchAll(regex));
51781
+ for (const match of matches) {
51782
+ const rowContent = match[1];
51783
+ const cellRegex = /<td[^>]*>(.*?)<\/td>/gs;
51784
+ const cellMatches = Array.from(rowContent.matchAll(cellRegex));
51785
+ const rowValues = cellMatches.map(cellMatch => {
51786
+ return (cellMatch[1]
51787
+ .replace(/(<(?!br)([^>]+)>)/gi, '')
51788
+ .replace(/<br(\s*|\/)>[\r\n]?/gim, '\n')
51789
+ .replace(/&amp;/g, '&')
51790
+ .replace(/&lt;/g, '<')
51791
+ .replace(/&gt;/g, '>')
51792
+ .replace(/&#9;/gi, '\t')
51793
+ .replace(/&nbsp;/g, ' '));
51794
+ });
51795
+ values.push(rowValues);
51796
+ pasteValuesColCount = Math.max(pasteValuesColCount, rowValues?.length ?? 0);
51797
+ }
51798
+ pasteValuesRowCount = values.length ?? 0;
51799
+ values = handlePasteValues(values, pasteValuesRowCount, pasteValuesColCount, maxRow - row + 1, maxCol - col + 1);
51800
+ table.changeCellValues(col, row, values, true);
51801
+ }
51802
+ else {
51803
+ navigator.clipboard.read().then(clipboardItems => {
51804
+ for (const item of clipboardItems) {
51805
+ if (item.types.includes('text/plain')) {
51806
+ item.getType('text/plain').then((blob) => {
51807
+ blob.text().then(_pasteValue);
51808
+ });
51809
+ }
51810
+ }
51811
+ });
51812
+ }
51813
+ });
51814
+ });
51815
+ }
51816
+ function _pasteValue(pastedData) {
51817
+ const ranges = table.stateManager.select.ranges;
51818
+ const selectRangeLength = ranges.length;
51819
+ const col = Math.min(ranges[selectRangeLength - 1].start.col, ranges[selectRangeLength - 1].end.col);
51820
+ const row = Math.min(ranges[selectRangeLength - 1].start.row, ranges[selectRangeLength - 1].end.row);
51821
+ const maxCol = Math.max(ranges[selectRangeLength - 1].start.col, ranges[selectRangeLength - 1].end.col);
51822
+ const maxRow = Math.max(ranges[selectRangeLength - 1].start.row, ranges[selectRangeLength - 1].end.row);
51823
+ let pasteValuesColCount = 0;
51824
+ let pasteValuesRowCount = 0;
51825
+ let values = [];
51826
+ const rows = pastedData.split('\n');
51827
+ rows.forEach(function (rowCells, rowIndex) {
51828
+ const cells = rowCells.split('\t');
51829
+ const rowValues = [];
51830
+ values.push(rowValues);
51831
+ cells.forEach(function (cell, cellIndex) {
51832
+ if (cellIndex === cells.length - 1) {
51833
+ cell = cell.trim();
51834
+ }
51835
+ rowValues.push(cell);
51836
+ });
51837
+ pasteValuesColCount = Math.max(pasteValuesColCount, rowValues?.length ?? 0);
51838
+ });
51839
+ pasteValuesRowCount = values.length ?? 0;
51840
+ values = handlePasteValues(values, pasteValuesRowCount, pasteValuesColCount, maxRow - row + 1, maxCol - col + 1);
51841
+ table.changeCellValues(col, row, values, true);
51842
+ }
51843
+ function pasteTextToTable(item) {
51844
+ const ranges = table.stateManager.select.ranges;
51845
+ const selectRangeLength = ranges.length;
51846
+ const col = Math.min(ranges[selectRangeLength - 1].start.col, ranges[selectRangeLength - 1].end.col);
51847
+ const row = Math.min(ranges[selectRangeLength - 1].start.row, ranges[selectRangeLength - 1].end.row);
51848
+ const maxCol = Math.max(ranges[selectRangeLength - 1].start.col, ranges[selectRangeLength - 1].end.col);
51849
+ const maxRow = Math.max(ranges[selectRangeLength - 1].start.row, ranges[selectRangeLength - 1].end.row);
51850
+ let pasteValuesColCount = 0;
51851
+ let pasteValuesRowCount = 0;
51852
+ item.getType('text/plain').then((blob) => {
51853
+ blob.text().then((pastedData) => {
51854
+ const rows = pastedData.replace(/\r(?!\n)/g, '\r\n').split('\r\n');
51855
+ let values = [];
51856
+ if (rows.length > 1 && rows[rows.length - 1] === '') {
51857
+ rows.pop();
51858
+ }
51859
+ rows.forEach(function (rowCells, rowIndex) {
51860
+ const cells = rowCells.split('\t');
51861
+ const rowValues = [];
51862
+ values.push(rowValues);
51863
+ cells.forEach(function (cell, cellIndex) {
51864
+ if (cell.includes('\n')) {
51865
+ cell = cell
51866
+ .replace(/^"(.*)"$/, '$1')
51867
+ .replace(/["]*/g, match => new Array(Math.floor(match.length / 2)).fill('"').join(''));
51868
+ }
51869
+ rowValues.push(cell);
51870
+ });
51871
+ pasteValuesColCount = Math.max(pasteValuesColCount, rowValues?.length ?? 0);
51872
+ });
51873
+ pasteValuesRowCount = values.length ?? 0;
51874
+ values = handlePasteValues(values, pasteValuesRowCount, pasteValuesColCount, maxRow - row + 1, maxCol - col + 1);
51875
+ table.changeCellValues(col, row, values, true);
51876
+ });
51877
+ });
51878
+ }
51879
+ function handlePasteValues(values, rowCount, colCount, selectedRowCount, selectedColCount) {
51880
+ if (selectedColCount > colCount || selectedRowCount > rowCount) {
51881
+ if (selectedColCount % colCount === 0 && selectedRowCount % rowCount === 0) {
51882
+ const toPasteValues = [];
51883
+ for (let i = 0; i < selectedRowCount; i++) {
51884
+ const rowPasteValue = [];
51885
+ toPasteValues.push(rowPasteValue);
51886
+ for (let j = 0; j < selectedColCount; j++) {
51887
+ const copiedRow = i % rowCount;
51888
+ const copiedCol = j % colCount;
51889
+ rowPasteValue.push(values[copiedRow][copiedCol]);
51890
+ }
51891
+ }
51892
+ return toPasteValues;
51893
+ }
51894
+ return values;
51895
+ }
51896
+ return values;
51897
+ }
51733
51898
  const globalPointerdownCallback = (e) => {
51734
51899
  table.eventManager.LastBodyPointerXY = { x: e.x, y: e.y };
51735
51900
  table.eventManager.isDown = true;
@@ -52119,7 +52284,10 @@
52119
52284
  if (e.federatedEvent) {
52120
52285
  const eventArgsSet = getCellEventArgsSet(e.federatedEvent);
52121
52286
  const resizeCol = this.table.scenegraph.getResizeColAt(eventArgsSet.abstractPos.x, eventArgsSet.abstractPos.y, eventArgsSet.eventArgs?.targetCell);
52122
- if (this.table._canResizeColumn(resizeCol.col, resizeCol.row) && resizeCol.col >= 0) {
52287
+ if (this.table.eventManager.checkCellFillhandle(eventArgsSet)) {
52288
+ this.table.fireListeners(TABLE_EVENT_TYPE.DBLCLICK_FILL_HANDLE, {});
52289
+ }
52290
+ else if (this.table._canResizeColumn(resizeCol.col, resizeCol.row) && resizeCol.col >= 0) {
52123
52291
  this.table.scenegraph.updateAutoColWidth(resizeCol.col);
52124
52292
  this.table.scenegraph.updateChartSize(resizeCol.col);
52125
52293
  const state = this.table.stateManager;
@@ -52196,6 +52364,53 @@
52196
52364
  }
52197
52365
  return false;
52198
52366
  }
52367
+ dealFillSelect(eventArgsSet, isSelectMoving) {
52368
+ const { eventArgs } = eventArgsSet;
52369
+ if (eventArgs) {
52370
+ if (this.table.stateManager.select?.ranges?.length && this.table.stateManager.isFillHandle()) {
52371
+ let updateRow;
52372
+ let updateCol;
52373
+ const currentRange = this.table.stateManager.select.ranges[this.table.stateManager.select.ranges.length - 1];
52374
+ if (isSelectMoving) {
52375
+ if (!isValid$3(this.table.stateManager.fillHandle.directionRow)) {
52376
+ if (Math.abs(this.table.stateManager.fillHandle.startY - eventArgsSet.abstractPos.y) >=
52377
+ Math.abs(this.table.stateManager.fillHandle.startX - eventArgsSet.abstractPos.x)) {
52378
+ this.table.stateManager.fillHandle.directionRow = true;
52379
+ if (this.table.stateManager.fillHandle.startY - eventArgsSet.abstractPos.y > 0) {
52380
+ this.table.stateManager.fillHandle.direction = 'top';
52381
+ }
52382
+ else {
52383
+ this.table.stateManager.fillHandle.direction = 'bottom';
52384
+ }
52385
+ }
52386
+ else {
52387
+ this.table.stateManager.fillHandle.directionRow = false;
52388
+ if (this.table.stateManager.fillHandle.startX - eventArgsSet.abstractPos.x > 0) {
52389
+ this.table.stateManager.fillHandle.direction = 'left';
52390
+ }
52391
+ else {
52392
+ this.table.stateManager.fillHandle.direction = 'right';
52393
+ }
52394
+ }
52395
+ }
52396
+ if (this.table.stateManager.fillHandle.directionRow) {
52397
+ updateRow = eventArgs.row;
52398
+ updateCol = currentRange.end.col;
52399
+ }
52400
+ else {
52401
+ updateRow = currentRange.end.row;
52402
+ updateCol = eventArgs.col;
52403
+ }
52404
+ }
52405
+ this.table.stateManager.updateSelectPos(isSelectMoving ? updateCol : currentRange.end.col, isSelectMoving ? updateRow : currentRange.end.row, true, eventArgs.event.ctrlKey || eventArgs.event.metaKey);
52406
+ }
52407
+ else {
52408
+ this.table.stateManager.updateSelectPos(eventArgs.col, eventArgs.row, eventArgs.event.shiftKey, eventArgs.event.ctrlKey || eventArgs.event.metaKey);
52409
+ }
52410
+ return true;
52411
+ }
52412
+ return false;
52413
+ }
52199
52414
  deelTableSelectAll() {
52200
52415
  this.table.stateManager.updateSelectPos(-1, -1, false, false, true);
52201
52416
  }
@@ -52214,6 +52429,29 @@
52214
52429
  }
52215
52430
  return false;
52216
52431
  }
52432
+ checkCellFillhandle(eventArgsSet, update) {
52433
+ if (this.table.options.excelOptions?.fillHandle) {
52434
+ const { eventArgs } = eventArgsSet;
52435
+ if (eventArgs) {
52436
+ if (this.table.stateManager.select?.ranges?.length) {
52437
+ const lastCol = this.table.stateManager.select.ranges[this.table.stateManager.select.ranges.length - 1].end.col;
52438
+ const lastRow = this.table.stateManager.select.ranges[this.table.stateManager.select.ranges.length - 1].end.row;
52439
+ const lastCellBound = this.table.scenegraph.highPerformanceGetCell(lastCol, lastRow).globalAABBBounds;
52440
+ const distanceX = Math.abs(eventArgsSet.abstractPos.x - lastCellBound.x2);
52441
+ const distanceY = Math.abs(eventArgsSet.abstractPos.y - lastCellBound.y2);
52442
+ const squareSize = 6 * 3;
52443
+ if (this.table.stateManager.fillHandle?.isFilling ||
52444
+ (distanceX <= squareSize / 2 && distanceY <= squareSize / 2)) {
52445
+ if (update) {
52446
+ this.table.stateManager.startFillSelect(eventArgsSet.abstractPos.x, eventArgsSet.abstractPos.y);
52447
+ }
52448
+ return true;
52449
+ }
52450
+ }
52451
+ }
52452
+ }
52453
+ return false;
52454
+ }
52217
52455
  dealColumnResize(xInTable, yInTable) {
52218
52456
  this.table.stateManager.updateResizeCol(xInTable, yInTable);
52219
52457
  }
@@ -55504,7 +55742,7 @@
55504
55742
  return TABLE_EVENT_TYPE;
55505
55743
  }
55506
55744
  options;
55507
- version = "0.22.0";
55745
+ version = "0.23.0-alpha.0";
55508
55746
  pagination;
55509
55747
  id = `VTable${Date.now()}`;
55510
55748
  headerStyleCache;
@@ -57281,6 +57519,16 @@
57281
57519
  }
57282
57520
  return cacheStyle;
57283
57521
  }
57522
+ let bgColorFunc;
57523
+ if (this.internalProps?.dataConfig?.mappingRules && !this.isHeader(col, row)) {
57524
+ this.internalProps?.dataConfig?.mappingRules?.forEach((mappingRule, i) => {
57525
+ if (mappingRule.bgColor &&
57526
+ this.internalProps.layoutMap.getIndicatorKey(col, row) ===
57527
+ mappingRule.bgColor.indicatorKey) {
57528
+ bgColorFunc = mappingRule.bgColor.mapping;
57529
+ }
57530
+ });
57531
+ }
57284
57532
  let cacheKey;
57285
57533
  const cellType = this.getCellType(col, row);
57286
57534
  if (this.isSeriesNumberInBody(col, row)) {
@@ -57321,6 +57569,9 @@
57321
57569
  dataValue: this.getCellOriginValue(col, row),
57322
57570
  cellHeaderPaths: this.getCellHeaderPaths(col, row)
57323
57571
  }, styleClass, this.options.autoWrapText, this.theme);
57572
+ if (bgColorFunc) {
57573
+ cacheStyle = mergeStyle(cacheStyle, { bgColor: bgColorFunc });
57574
+ }
57324
57575
  if (!isFunction$3(style)) {
57325
57576
  if (layoutMap.isBottomFrozenRow(row)) {
57326
57577
  this.bodyBottomStyleCache.set(cacheKey, cacheStyle);
@@ -57625,7 +57876,7 @@
57625
57876
  const copyCellValue = getCopyCellValue(c, r, range);
57626
57877
  if (typeof Promise !== 'undefined' && copyCellValue instanceof Promise) ;
57627
57878
  else {
57628
- const strCellValue = `${copyCellValue}`;
57879
+ const strCellValue = isValid$3(copyCellValue) ? `${copyCellValue}` : '';
57629
57880
  if (/^\[object .*\]$/.exec(strCellValue)) ;
57630
57881
  else {
57631
57882
  copyValue += strCellValue;
@@ -57722,6 +57973,13 @@
57722
57973
  }
57723
57974
  return cellInfoArray;
57724
57975
  }
57976
+ getSelectedCellRanges() {
57977
+ const ranges = this.stateManager.select.ranges;
57978
+ if (!ranges.length) {
57979
+ return [];
57980
+ }
57981
+ return cloneDeep(ranges);
57982
+ }
57725
57983
  measureText(text, font) {
57726
57984
  return textMeasure.measureText(text, font);
57727
57985
  }
@@ -57799,11 +58057,20 @@
57799
58057
  this.scrollToCell({ col, row });
57800
58058
  }
57801
58059
  const cellRect = this.getCellRelativeRect(col, row);
58060
+ if (this.stateManager.select?.ranges?.length > 0) {
58061
+ hideCellSelectBorder(this.scenegraph);
58062
+ }
58063
+ const { col: hoverCol, row: hoverRow } = this.stateManager.hover.cellPos;
58064
+ this.stateManager.updateHoverPos(-1, -1);
57802
58065
  const c = this.scenegraph.stage.toCanvas(false, new AABBBounds$1().set(cellRect.left + this.tableX + 1, cellRect.top + this.tableY + 1, cellRect.right + this.tableX, cellRect.bottom + this.tableY));
57803
58066
  if (!isInView) {
57804
58067
  this.setScrollTop(scrollTop);
57805
58068
  this.setScrollLeft(scrollLeft);
57806
58069
  }
58070
+ if (this.stateManager.select?.ranges?.length > 0) {
58071
+ restoreCellSelectBorder(this.scenegraph);
58072
+ }
58073
+ this.stateManager.updateHoverPos(hoverCol, hoverRow);
57807
58074
  return c.toDataURL();
57808
58075
  }
57809
58076
  exportCellRangeImg(cellRange) {
@@ -63362,7 +63629,7 @@
63362
63629
  dimension.indicatorKey === rowDimension.indicatorKey &&
63363
63630
  (!rowDimension.value || dimension.value === rowDimension.value))) {
63364
63631
  rowArr = dimension.children;
63365
- if (needLowestLevel && !rowArr) {
63632
+ if (needLowestLevel && (!rowArr || rowArr.some(row => row.dimensionKey === 'axis'))) {
63366
63633
  rowDimensionFinded = dimension;
63367
63634
  }
63368
63635
  else if (!needLowestLevel) {
@@ -67563,7 +67830,7 @@
67563
67830
  }
67564
67831
 
67565
67832
  registerForVrender();
67566
- const version = "0.22.0";
67833
+ const version = "0.23.0-alpha.0";
67567
67834
  function getIcons() {
67568
67835
  return get$2();
67569
67836
  }