@visactor/vtable 0.22.1 → 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 (83) hide show
  1. package/cjs/core/BaseTable.d.ts +1 -0
  2. package/cjs/core/BaseTable.js +5 -1
  3. package/cjs/core/BaseTable.js.map +1 -1
  4. package/cjs/core/TABLE_EVENT_TYPE.d.ts +3 -0
  5. package/cjs/core/TABLE_EVENT_TYPE.js +4 -1
  6. package/cjs/core/TABLE_EVENT_TYPE.js.map +1 -1
  7. package/cjs/event/event.d.ts +2 -0
  8. package/cjs/event/event.js +30 -1
  9. package/cjs/event/event.js.map +1 -1
  10. package/cjs/event/listener/container-dom.js +78 -39
  11. package/cjs/event/listener/container-dom.js.map +1 -1
  12. package/cjs/event/listener/table-group.js +5 -4
  13. package/cjs/event/listener/table-group.js.map +1 -1
  14. package/cjs/index.d.ts +1 -1
  15. package/cjs/index.js +1 -1
  16. package/cjs/index.js.map +1 -1
  17. package/cjs/layout/tree-helper.js +1 -0
  18. package/cjs/plugins/themes.js +1 -2
  19. package/cjs/scenegraph/scenegraph.d.ts +3 -0
  20. package/cjs/scenegraph/scenegraph.js +3 -0
  21. package/cjs/scenegraph/scenegraph.js.map +1 -1
  22. package/cjs/scenegraph/select/create-select-border.d.ts +1 -1
  23. package/cjs/scenegraph/select/create-select-border.js +24 -5
  24. package/cjs/scenegraph/select/create-select-border.js.map +1 -1
  25. package/cjs/scenegraph/select/delete-select-border.d.ts +1 -0
  26. package/cjs/scenegraph/select/delete-select-border.js +15 -4
  27. package/cjs/scenegraph/select/delete-select-border.js.map +1 -1
  28. package/cjs/scenegraph/select/move-select-border.js +3 -1
  29. package/cjs/scenegraph/select/move-select-border.js.map +1 -1
  30. package/cjs/scenegraph/select/update-select-border.js +9 -2
  31. package/cjs/scenegraph/select/update-select-border.js.map +1 -1
  32. package/cjs/state/state.d.ts +10 -0
  33. package/cjs/state/state.js +17 -0
  34. package/cjs/state/state.js.map +1 -1
  35. package/cjs/ts-types/base-table.d.ts +4 -0
  36. package/cjs/ts-types/base-table.js.map +1 -1
  37. package/cjs/ts-types/events.d.ts +8 -0
  38. package/cjs/ts-types/events.js.map +1 -1
  39. package/cjs/ts-types/theme.js.map +1 -1
  40. package/cjs/vrender.js.map +1 -1
  41. package/dist/vtable.js +334 -80
  42. package/dist/vtable.min.js +2 -2
  43. package/es/core/BaseTable.d.ts +1 -0
  44. package/es/core/BaseTable.js +6 -2
  45. package/es/core/BaseTable.js.map +1 -1
  46. package/es/core/TABLE_EVENT_TYPE.d.ts +3 -0
  47. package/es/core/TABLE_EVENT_TYPE.js +4 -1
  48. package/es/core/TABLE_EVENT_TYPE.js.map +1 -1
  49. package/es/event/event.d.ts +2 -0
  50. package/es/event/event.js +30 -1
  51. package/es/event/event.js.map +1 -1
  52. package/es/event/listener/container-dom.js +78 -39
  53. package/es/event/listener/container-dom.js.map +1 -1
  54. package/es/event/listener/table-group.js +5 -4
  55. package/es/event/listener/table-group.js.map +1 -1
  56. package/es/index.d.ts +1 -1
  57. package/es/index.js +1 -1
  58. package/es/index.js.map +1 -1
  59. package/es/layout/tree-helper.js +2 -1
  60. package/es/plugins/themes.js +1 -2
  61. package/es/scenegraph/scenegraph.d.ts +3 -0
  62. package/es/scenegraph/scenegraph.js +4 -1
  63. package/es/scenegraph/scenegraph.js.map +1 -1
  64. package/es/scenegraph/select/create-select-border.d.ts +1 -1
  65. package/es/scenegraph/select/create-select-border.js +24 -5
  66. package/es/scenegraph/select/create-select-border.js.map +1 -1
  67. package/es/scenegraph/select/delete-select-border.d.ts +1 -0
  68. package/es/scenegraph/select/delete-select-border.js +12 -2
  69. package/es/scenegraph/select/delete-select-border.js.map +1 -1
  70. package/es/scenegraph/select/move-select-border.js +3 -1
  71. package/es/scenegraph/select/move-select-border.js.map +1 -1
  72. package/es/scenegraph/select/update-select-border.js +9 -2
  73. package/es/scenegraph/select/update-select-border.js.map +1 -1
  74. package/es/state/state.d.ts +10 -0
  75. package/es/state/state.js +17 -0
  76. package/es/state/state.js.map +1 -1
  77. package/es/ts-types/base-table.d.ts +4 -0
  78. package/es/ts-types/base-table.js.map +1 -1
  79. package/es/ts-types/events.d.ts +8 -0
  80. package/es/ts-types/events.js.map +1 -1
  81. package/es/ts-types/theme.js.map +1 -1
  82. package/es/vrender.js.map +1 -1
  83. 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) => {
@@ -45269,6 +45272,7 @@
45269
45272
  const colsWidth = scene.table.getColsWidth(computeRectCellRangeStartCol, computeRectCellRangeEndCol);
45270
45273
  const rowsHeight = scene.table.getRowsHeight(computeRectCellRangeStartRow, computeRectCellRangeEndRow);
45271
45274
  const firstCellBound = scene.highPerformanceGetCell(computeRectCellRangeStartCol, computeRectCellRangeStartRow).globalAABBBounds;
45275
+ const lastCellBound = scene.highPerformanceGetCell(computeRectCellRangeEndCol, computeRectCellRangeEndRow).globalAABBBounds;
45272
45276
  selectComp.rect.setAttributes({
45273
45277
  x: firstCellBound.x1 - scene.tableGroup.attribute.x,
45274
45278
  y: firstCellBound.y1 - scene.tableGroup.attribute.y,
@@ -45276,6 +45280,15 @@
45276
45280
  height: rowsHeight,
45277
45281
  visible: true
45278
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
+ }
45279
45292
  const isNearRowHeader = scene.table.frozenColCount ? startCol === scene.table.frozenColCount : false;
45280
45293
  const isNearRightRowHeader = scene.table.rightFrozenColCount
45281
45294
  ? scene.table.rightFrozenColCount > 0 && endCol === scene.table.colCount - scene.table.rightFrozenColCount - 1
@@ -45479,6 +45492,7 @@
45479
45492
  ifExtendSelectRange && extendSelectRange();
45480
45493
  scene.selectingRangeComponents.forEach((selectComp, key) => {
45481
45494
  selectComp.rect.delete();
45495
+ selectComp.fillhandle?.delete();
45482
45496
  });
45483
45497
  scene.selectingRangeComponents = new Map();
45484
45498
  let needRowHeader = false;
@@ -45608,11 +45622,27 @@
45608
45622
  }
45609
45623
 
45610
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
+ }
45611
45640
  const startCol = Math.min(start_Col, end_Col);
45612
45641
  const startRow = Math.min(start_Row, end_Row);
45613
45642
  const endCol = Math.max(start_Col, end_Col);
45614
45643
  const endRow = Math.max(start_Row, end_Row);
45615
45644
  const firstCellBound = scene.highPerformanceGetCell(startCol, startRow).globalAABBBounds;
45645
+ const lastCellBound = scene.highPerformanceGetCell(endCol, endRow).globalAABBBounds;
45616
45646
  const theme = scene.table.theme;
45617
45647
  const bodyClickBorderColor = theme.selectionStyle?.cellBorderColor;
45618
45648
  const bodyClickLineWidth = theme.selectionStyle?.cellBorderLineWidth;
@@ -45632,9 +45662,23 @@
45632
45662
  height: 0,
45633
45663
  visible: true
45634
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
+ }
45635
45678
  scene.lastSelectId = selectId;
45636
45679
  scene.selectingRangeComponents.set(`${startCol}-${startRow}-${endCol}-${endRow}-${selectId}`, {
45637
45680
  rect,
45681
+ fillhandle,
45638
45682
  role: selectRangeType
45639
45683
  });
45640
45684
  scene.tableGroup.insertAfter(rect, selectRangeType === 'body'
@@ -45654,12 +45698,31 @@
45654
45698
  : selectRangeType === 'bottomFrozen'
45655
45699
  ? scene.bottomFrozenGroup
45656
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);
45657
45719
  }
45658
45720
 
45659
45721
  function moveSelectingRangeComponentsToSelectedRangeComponents(scene) {
45660
45722
  scene.selectingRangeComponents.forEach((rangeComponent, key) => {
45661
45723
  if (scene.selectedRangeComponents.get(key)) {
45662
- scene.selectedRangeComponents.get(key).rect.delete();
45724
+ scene.selectingRangeComponents.get(key).rect.delete();
45725
+ scene.selectingRangeComponents.get(key).fillhandle?.delete();
45663
45726
  }
45664
45727
  scene.selectedRangeComponents.set(key, rangeComponent);
45665
45728
  });
@@ -45672,6 +45735,7 @@
45672
45735
  const lastSelectId = key.split('-')[4];
45673
45736
  if (lastSelectId === scene.lastSelectId) {
45674
45737
  selectComp.rect.delete();
45738
+ selectComp.fillhandle?.delete();
45675
45739
  scene.selectedRangeComponents.delete(key);
45676
45740
  }
45677
45741
  });
@@ -45679,9 +45743,16 @@
45679
45743
  function deleteAllSelectBorder(scene) {
45680
45744
  scene.selectedRangeComponents.forEach((selectComp, key) => {
45681
45745
  selectComp.rect.delete();
45746
+ selectComp.fillhandle?.delete();
45682
45747
  });
45683
45748
  scene.selectedRangeComponents = new Map();
45684
45749
  }
45750
+ function removeFillHandleFromSelectComponents(scene) {
45751
+ scene.selectedRangeComponents.forEach((selectComp, key) => {
45752
+ selectComp.fillhandle?.delete();
45753
+ selectComp.fillhandle = undefined;
45754
+ });
45755
+ }
45685
45756
 
45686
45757
  function updateRow(removeCells, addCells, updateCells, table) {
45687
45758
  const scene = table.scenegraph;
@@ -47854,6 +47925,9 @@
47854
47925
  updateCellSelectBorder(newStartCol, newStartRow, newEndCol, newEndRow, extendSelectRange = true) {
47855
47926
  updateCellSelectBorder(this, newStartCol, newStartRow, newEndCol, newEndRow, extendSelectRange);
47856
47927
  }
47928
+ removeFillHandleFromSelectComponents() {
47929
+ removeFillHandleFromSelectComponents(this);
47930
+ }
47857
47931
  recreateAllSelectRangeComponents() {
47858
47932
  deleteAllSelectBorder(this);
47859
47933
  this.table.stateManager.select.ranges.forEach((cellRange) => {
@@ -49648,6 +49722,7 @@
49648
49722
  table;
49649
49723
  interactionState;
49650
49724
  select;
49725
+ fillHandle;
49651
49726
  hover;
49652
49727
  hoverIcon;
49653
49728
  residentHoverIcon;
@@ -49750,6 +49825,11 @@
49750
49825
  },
49751
49826
  selecting: false
49752
49827
  };
49828
+ this.fillHandle = {
49829
+ isFilling: false,
49830
+ startX: undefined,
49831
+ startY: undefined
49832
+ };
49753
49833
  this.hover = {
49754
49834
  highlightScope: HighlightScope.single,
49755
49835
  cellPos: {
@@ -49953,6 +50033,9 @@
49953
50033
  isResizeCol() {
49954
50034
  return this.columnResize.resizing;
49955
50035
  }
50036
+ isFillHandle() {
50037
+ return this.fillHandle.isFilling;
50038
+ }
49956
50039
  isSelecting() {
49957
50040
  return this.select.selecting;
49958
50041
  }
@@ -49989,6 +50072,21 @@
49989
50072
  this.table.stateManager.updateSelectPos(-1, -1);
49990
50073
  this.table.scenegraph.updateNextFrame();
49991
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
+ }
49992
50090
  updateResizeCol(xInTable, yInTable) {
49993
50091
  updateResizeColumn(xInTable, yInTable, this);
49994
50092
  }
@@ -50732,6 +50830,9 @@
50732
50830
  else if (stateManager.isMoveCol()) {
50733
50831
  eventManager.dealColumnMover(eventArgsSet);
50734
50832
  }
50833
+ else if (stateManager.isFillHandle()) {
50834
+ eventManager.dealFillSelect(eventArgsSet, true);
50835
+ }
50735
50836
  else {
50736
50837
  eventManager.dealTableSelect(eventArgsSet, true);
50737
50838
  }
@@ -50739,7 +50840,12 @@
50739
50840
  return;
50740
50841
  }
50741
50842
  if (stateManager.isResizeCol() || eventManager.checkColumnResize(eventArgsSet)) {
50742
- 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
+ }
50743
50849
  }
50744
50850
  else {
50745
50851
  stateManager.updateCursor();
@@ -50974,7 +51080,7 @@
50974
51080
  eventManager.dealTableHover(eventArgsSet);
50975
51081
  }
50976
51082
  else {
50977
- if (eventManager.checkColumnResize(eventArgsSet, true)) {
51083
+ if (!eventManager.checkCellFillhandle(eventArgsSet) && eventManager.checkColumnResize(eventArgsSet, true)) {
50978
51084
  table.scenegraph.updateChartState(null);
50979
51085
  stateManager.updateInteractionState(InteractionState.grabing);
50980
51086
  return;
@@ -50983,6 +51089,10 @@
50983
51089
  stateManager.updateInteractionState(InteractionState.grabing);
50984
51090
  return;
50985
51091
  }
51092
+ if (eventManager.checkCellFillhandle(eventArgsSet, true) && eventManager.dealFillSelect(eventArgsSet)) {
51093
+ stateManager.updateInteractionState(InteractionState.grabing);
51094
+ return;
51095
+ }
50986
51096
  if (eventManager.dealTableSelect(eventArgsSet)) {
50987
51097
  stateManager.updateInteractionState(InteractionState.grabing);
50988
51098
  }
@@ -51028,6 +51138,9 @@
51028
51138
  }
51029
51139
  else if (stateManager.isSelecting()) {
51030
51140
  table.stateManager.endSelectCells();
51141
+ if (table.stateManager.isFillHandle()) {
51142
+ table.stateManager.endFillSelect();
51143
+ }
51031
51144
  const eventArgsSet = getCellEventArgsSet(e);
51032
51145
  if (eventArgsSet.eventArgs && table.hasListeners(TABLE_EVENT_TYPE.DRAG_SELECT_END)) {
51033
51146
  const cellsEvent = {
@@ -51625,84 +51738,13 @@
51625
51738
  return;
51626
51739
  }
51627
51740
  if (table.stateManager.select.ranges?.length > 0) {
51628
- const ranges = table.stateManager.select.ranges;
51629
- const col = Math.min(ranges[0].start.col, ranges[0].end.col);
51630
- const row = Math.min(ranges[0].start.row, ranges[0].end.row);
51631
- const values = [];
51632
51741
  navigator.clipboard.read().then(clipboardItems => {
51633
51742
  for (const item of clipboardItems) {
51634
51743
  if (item.types.includes('text/html')) {
51635
- item.getType('text/html').then(blob => {
51636
- blob.text().then(pastedData => {
51637
- if (pastedData && /(<table)|(<TABLE)/g.test(pastedData)) {
51638
- const regex = /<tr[^>]*>(.*?)<\/tr>/gs;
51639
- const matches = Array.from(pastedData.matchAll(regex));
51640
- for (const match of matches) {
51641
- const rowContent = match[1];
51642
- const cellRegex = /<td[^>]*>(.*?)<\/td>/gs;
51643
- const cellMatches = Array.from(rowContent.matchAll(cellRegex));
51644
- const rowValues = cellMatches.map(cellMatch => {
51645
- return (cellMatch[1]
51646
- .replace(/(<(?!br)([^>]+)>)/gi, '')
51647
- .replace(/<br(\s*|\/)>[\r\n]?/gim, '\n')
51648
- .replace(/&amp;/g, '&')
51649
- .replace(/&lt;/g, '<')
51650
- .replace(/&gt;/g, '>')
51651
- .replace(/&#9;/gi, '\t')
51652
- .replace(/&nbsp;/g, ' '));
51653
- });
51654
- values.push(rowValues);
51655
- }
51656
- table.changeCellValues(col, row, values, true);
51657
- }
51658
- else {
51659
- navigator.clipboard.read().then(clipboardItems => {
51660
- for (const item of clipboardItems) {
51661
- if (item.types.includes('text/plain')) {
51662
- item.getType('text/plain').then(blob => {
51663
- blob.text().then(pastedData => {
51664
- const rows = pastedData.split('\n');
51665
- rows.forEach(function (rowCells, rowIndex) {
51666
- const cells = rowCells.split('\t');
51667
- const rowValues = [];
51668
- values.push(rowValues);
51669
- cells.forEach(function (cell, cellIndex) {
51670
- if (cellIndex === cells.length - 1) {
51671
- cell = cell.trim();
51672
- }
51673
- rowValues.push(cell);
51674
- });
51675
- });
51676
- table.changeCellValues(col, row, values, true);
51677
- });
51678
- });
51679
- }
51680
- }
51681
- });
51682
- }
51683
- });
51684
- });
51744
+ pasteHtmlToTable(item);
51685
51745
  }
51686
51746
  else if (item.types.length === 1 && item.types[0] === 'text/plain') {
51687
- item.getType('text/plain').then(blob => {
51688
- blob.text().then(pastedData => {
51689
- const rows = pastedData.replace(/\r(?!\n)/g, '\r\n').split('\r\n');
51690
- if (rows.length > 1 && rows[rows.length - 1] === '') {
51691
- rows.pop();
51692
- }
51693
- rows.forEach(function (rowCells, rowIndex) {
51694
- const cells = rowCells.split('\t');
51695
- cells.forEach(function (cell, cellIndex) {
51696
- if (cell.includes('\n')) {
51697
- cell = cell
51698
- .replace(/^"(.*)"$/, '$1')
51699
- .replace(/["]*/g, match => new Array(Math.floor(match.length / 2)).fill('"').join(''));
51700
- }
51701
- });
51702
- });
51703
- });
51704
- });
51705
- table.changeCellValues(col, row, values, true);
51747
+ pasteTextToTable(item);
51706
51748
  }
51707
51749
  else ;
51708
51750
  }
@@ -51721,6 +51763,138 @@
51721
51763
  }
51722
51764
  table.resize();
51723
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
+ }
51724
51898
  const globalPointerdownCallback = (e) => {
51725
51899
  table.eventManager.LastBodyPointerXY = { x: e.x, y: e.y };
51726
51900
  table.eventManager.isDown = true;
@@ -52110,7 +52284,10 @@
52110
52284
  if (e.federatedEvent) {
52111
52285
  const eventArgsSet = getCellEventArgsSet(e.federatedEvent);
52112
52286
  const resizeCol = this.table.scenegraph.getResizeColAt(eventArgsSet.abstractPos.x, eventArgsSet.abstractPos.y, eventArgsSet.eventArgs?.targetCell);
52113
- 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) {
52114
52291
  this.table.scenegraph.updateAutoColWidth(resizeCol.col);
52115
52292
  this.table.scenegraph.updateChartSize(resizeCol.col);
52116
52293
  const state = this.table.stateManager;
@@ -52187,6 +52364,53 @@
52187
52364
  }
52188
52365
  return false;
52189
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
+ }
52190
52414
  deelTableSelectAll() {
52191
52415
  this.table.stateManager.updateSelectPos(-1, -1, false, false, true);
52192
52416
  }
@@ -52205,6 +52429,29 @@
52205
52429
  }
52206
52430
  return false;
52207
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
+ }
52208
52455
  dealColumnResize(xInTable, yInTable) {
52209
52456
  this.table.stateManager.updateResizeCol(xInTable, yInTable);
52210
52457
  }
@@ -55495,7 +55742,7 @@
55495
55742
  return TABLE_EVENT_TYPE;
55496
55743
  }
55497
55744
  options;
55498
- version = "0.22.1";
55745
+ version = "0.23.0-alpha.0";
55499
55746
  pagination;
55500
55747
  id = `VTable${Date.now()}`;
55501
55748
  headerStyleCache;
@@ -57726,6 +57973,13 @@
57726
57973
  }
57727
57974
  return cellInfoArray;
57728
57975
  }
57976
+ getSelectedCellRanges() {
57977
+ const ranges = this.stateManager.select.ranges;
57978
+ if (!ranges.length) {
57979
+ return [];
57980
+ }
57981
+ return cloneDeep(ranges);
57982
+ }
57729
57983
  measureText(text, font) {
57730
57984
  return textMeasure.measureText(text, font);
57731
57985
  }
@@ -67576,7 +67830,7 @@
67576
67830
  }
67577
67831
 
67578
67832
  registerForVrender();
67579
- const version = "0.22.1";
67833
+ const version = "0.23.0-alpha.0";
67580
67834
  function getIcons() {
67581
67835
  return get$2();
67582
67836
  }