handsontable 18.0.0 → 18.1.0-rc7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/3rdparty/walkontable/src/axisSizing/axisSizeSource.d.mts +1 -0
- package/3rdparty/walkontable/src/axisSizing/axisSizeSource.d.ts +55 -0
- package/3rdparty/walkontable/src/axisSizing/axisSizeSource.js +15 -0
- package/3rdparty/walkontable/src/axisSizing/axisSizeSource.mjs +14 -0
- package/3rdparty/walkontable/src/axisSizing/boxModel.d.mts +1 -0
- package/3rdparty/walkontable/src/axisSizing/boxModel.d.ts +32 -0
- package/3rdparty/walkontable/src/axisSizing/boxModel.js +45 -0
- package/3rdparty/walkontable/src/axisSizing/boxModel.mjs +33 -0
- package/3rdparty/walkontable/src/axisSizing/columnUtils.d.mts +2 -0
- package/3rdparty/walkontable/src/{utils/column.d.ts → axisSizing/columnUtils.d.ts} +12 -10
- package/3rdparty/walkontable/src/axisSizing/columnUtils.js +147 -0
- package/3rdparty/walkontable/src/axisSizing/columnUtils.mjs +142 -0
- package/3rdparty/walkontable/src/axisSizing/defaultSizeSource.d.mts +1 -0
- package/3rdparty/walkontable/src/axisSizing/defaultSizeSource.d.ts +58 -0
- package/3rdparty/walkontable/src/axisSizing/defaultSizeSource.js +129 -0
- package/3rdparty/walkontable/src/axisSizing/defaultSizeSource.mjs +119 -0
- package/3rdparty/walkontable/src/axisSizing/oversizedRows.d.mts +1 -0
- package/3rdparty/walkontable/src/axisSizing/oversizedRows.d.ts +162 -0
- package/3rdparty/walkontable/src/axisSizing/oversizedRows.js +424 -0
- package/3rdparty/walkontable/src/axisSizing/oversizedRows.mjs +522 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/index.d.ts +130 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/index.js +256 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/index.mjs +262 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/prefixSumStrategy.d.mts +1 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/prefixSumStrategy.d.ts +51 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/prefixSumStrategy.js +121 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/prefixSumStrategy.mjs +117 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/sparseStrategy.d.mts +1 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/sparseStrategy.d.ts +53 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/sparseStrategy.js +206 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/sparseStrategy.mjs +203 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/strategy.d.mts +1 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/strategy.d.ts +53 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/strategy.js +40 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/strategy.mjs +41 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/uniformStrategy.d.mts +1 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/uniformStrategy.d.ts +47 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/uniformStrategy.js +121 -0
- package/3rdparty/walkontable/src/axisSizing/positionCache/uniformStrategy.mjs +115 -0
- package/3rdparty/walkontable/src/axisSizing/rowUtils.d.mts +2 -0
- package/3rdparty/walkontable/src/{utils/row.d.ts → axisSizing/rowUtils.d.ts} +11 -9
- package/3rdparty/walkontable/src/axisSizing/rowUtils.js +111 -0
- package/3rdparty/walkontable/src/axisSizing/rowUtils.mjs +106 -0
- package/3rdparty/walkontable/src/axisSizing/sizeGetters.d.mts +2 -0
- package/3rdparty/walkontable/src/axisSizing/sizeGetters.d.ts +84 -0
- package/3rdparty/walkontable/src/axisSizing/sizeGetters.js +102 -0
- package/3rdparty/walkontable/src/axisSizing/sizeGetters.mjs +92 -0
- package/3rdparty/walkontable/src/calculator/axisCalculation.d.ts +1 -1
- package/3rdparty/walkontable/src/calculator/calculationType/renderedColumns.d.ts +10 -0
- package/3rdparty/walkontable/src/calculator/calculationType/renderedColumns.js +10 -1
- package/3rdparty/walkontable/src/calculator/calculationType/renderedColumns.mjs +10 -1
- package/3rdparty/walkontable/src/calculator/calculationType/renderedRows.d.ts +9 -0
- package/3rdparty/walkontable/src/calculator/calculationType/renderedRows.js +9 -1
- package/3rdparty/walkontable/src/calculator/calculationType/renderedRows.mjs +9 -1
- package/3rdparty/walkontable/src/calculator/viewportColumns.d.ts +1 -1
- package/3rdparty/walkontable/src/calculator/viewportRows.d.ts +1 -1
- package/3rdparty/walkontable/src/cell/range.d.ts +10 -0
- package/3rdparty/walkontable/src/cell/range.js +14 -3
- package/3rdparty/walkontable/src/cell/range.mjs +11 -0
- package/3rdparty/walkontable/src/core/_base.d.ts +21 -21
- package/3rdparty/walkontable/src/core/_base.js +58 -147
- package/3rdparty/walkontable/src/core/_base.mjs +17 -147
- package/3rdparty/walkontable/src/core/clone.d.ts +4 -14
- package/3rdparty/walkontable/src/core/clone.js +51 -5
- package/3rdparty/walkontable/src/core/clone.mjs +10 -5
- package/3rdparty/walkontable/src/core/core.d.ts +1 -5
- package/3rdparty/walkontable/src/core/core.js +52 -47
- package/3rdparty/walkontable/src/core/core.mjs +12 -48
- package/3rdparty/walkontable/src/domMeasure/geometryReader.d.mts +1 -0
- package/3rdparty/walkontable/src/domMeasure/geometryReader.d.ts +172 -0
- package/3rdparty/walkontable/src/domMeasure/geometryReader.js +19 -0
- package/3rdparty/walkontable/src/domMeasure/geometryReader.mjs +16 -0
- package/3rdparty/walkontable/src/domMeasure/liveGeometryReader.d.mts +1 -0
- package/3rdparty/walkontable/src/domMeasure/liveGeometryReader.d.ts +134 -0
- package/3rdparty/walkontable/src/domMeasure/liveGeometryReader.js +200 -0
- package/3rdparty/walkontable/src/domMeasure/liveGeometryReader.mjs +198 -0
- package/3rdparty/walkontable/src/event.d.ts +25 -12
- package/3rdparty/walkontable/src/event.js +91 -224
- package/3rdparty/walkontable/src/event.mjs +90 -224
- package/3rdparty/walkontable/src/facade/core.d.ts +6 -6
- package/3rdparty/walkontable/src/index.d.ts +1 -1
- package/3rdparty/walkontable/src/index.js +2 -2
- package/3rdparty/walkontable/src/index.mjs +1 -1
- package/3rdparty/walkontable/src/overlay/index.d.ts +6 -6
- package/3rdparty/walkontable/src/overlay/index.js +11 -11
- package/3rdparty/walkontable/src/overlay/index.mjs +6 -6
- package/3rdparty/walkontable/src/overlay/overlays.d.ts +375 -0
- package/3rdparty/walkontable/src/overlay/overlays.js +612 -0
- package/3rdparty/walkontable/src/overlay/overlays.mjs +601 -0
- package/3rdparty/walkontable/src/overlay/{_base.d.ts → regions/_base.d.ts} +65 -16
- package/3rdparty/walkontable/src/overlay/{_base.js → regions/_base.js} +160 -50
- package/3rdparty/walkontable/src/overlay/{_base.mjs → regions/_base.mjs} +163 -47
- package/3rdparty/walkontable/src/overlay/regions/bottomInlineStartCornerOverlay.d.mts +1 -0
- package/3rdparty/walkontable/src/overlay/{bottomInlineStartCorner.d.ts → regions/bottomInlineStartCornerOverlay.d.ts} +5 -10
- package/3rdparty/walkontable/src/overlay/{bottomInlineStartCorner.js → regions/bottomInlineStartCornerOverlay.js} +18 -20
- package/3rdparty/walkontable/src/overlay/{bottomInlineStartCorner.mjs → regions/bottomInlineStartCornerOverlay.mjs} +18 -20
- package/3rdparty/walkontable/src/overlay/regions/bottomOverlay.d.mts +1 -0
- package/3rdparty/walkontable/src/overlay/{bottom.d.ts → regions/bottomOverlay.d.ts} +16 -11
- package/3rdparty/walkontable/src/overlay/{bottom.js → regions/bottomOverlay.js} +113 -66
- package/3rdparty/walkontable/src/overlay/{bottom.mjs → regions/bottomOverlay.mjs} +113 -66
- package/3rdparty/walkontable/src/overlay/regions/inlineStartOverlay.d.mts +1 -0
- package/3rdparty/walkontable/src/overlay/{inlineStart.d.ts → regions/inlineStartOverlay.d.ts} +17 -11
- package/3rdparty/walkontable/src/overlay/{inlineStart.js → regions/inlineStartOverlay.js} +122 -67
- package/3rdparty/walkontable/src/overlay/{inlineStart.mjs → regions/inlineStartOverlay.mjs} +122 -67
- package/3rdparty/walkontable/src/overlay/regions/topInlineStartCornerOverlay.d.mts +1 -0
- package/3rdparty/walkontable/src/overlay/{topInlineStartCorner.d.ts → regions/topInlineStartCornerOverlay.d.ts} +5 -10
- package/3rdparty/walkontable/src/overlay/{topInlineStartCorner.js → regions/topInlineStartCornerOverlay.js} +13 -16
- package/3rdparty/walkontable/src/overlay/{topInlineStartCorner.mjs → regions/topInlineStartCornerOverlay.mjs} +13 -16
- package/3rdparty/walkontable/src/overlay/regions/topOverlay.d.mts +1 -0
- package/3rdparty/walkontable/src/overlay/{top.d.ts → regions/topOverlay.d.ts} +32 -11
- package/3rdparty/walkontable/src/overlay/{top.js → regions/topOverlay.js} +163 -77
- package/3rdparty/walkontable/src/overlay/{top.mjs → regions/topOverlay.mjs} +163 -77
- package/3rdparty/walkontable/src/overlay/resizeMonitor.d.mts +1 -0
- package/3rdparty/walkontable/src/overlay/resizeMonitor.d.ts +49 -0
- package/3rdparty/walkontable/src/overlay/resizeMonitor.js +154 -0
- package/3rdparty/walkontable/src/overlay/resizeMonitor.mjs +153 -0
- package/3rdparty/walkontable/src/overlay/scroll/nativeScrollInput.d.mts +1 -0
- package/3rdparty/walkontable/src/overlay/scroll/nativeScrollInput.d.ts +62 -0
- package/3rdparty/walkontable/src/overlay/scroll/nativeScrollInput.js +290 -0
- package/3rdparty/walkontable/src/overlay/scroll/nativeScrollInput.mjs +295 -0
- package/3rdparty/walkontable/src/overlay/scroll/scrollSync.d.mts +1 -0
- package/3rdparty/walkontable/src/overlay/scroll/scrollSync.d.ts +176 -0
- package/3rdparty/walkontable/src/overlay/scroll/scrollSync.js +549 -0
- package/3rdparty/walkontable/src/overlay/scroll/scrollSync.mjs +557 -0
- package/3rdparty/walkontable/src/overlay/spreaderSize.d.mts +1 -0
- package/3rdparty/walkontable/src/overlay/spreaderSize.d.ts +67 -0
- package/3rdparty/walkontable/src/overlay/spreaderSize.js +178 -0
- package/3rdparty/walkontable/src/overlay/spreaderSize.mjs +179 -0
- package/3rdparty/walkontable/src/{stickyScrollStrategy.d.ts → overlay/strategies/stickyScrollStrategy.d.ts} +33 -21
- package/3rdparty/walkontable/src/{stickyScrollStrategy.js → overlay/strategies/stickyScrollStrategy.js} +60 -41
- package/3rdparty/walkontable/src/{stickyScrollStrategy.mjs → overlay/strategies/stickyScrollStrategy.mjs} +58 -38
- package/3rdparty/walkontable/src/ports.d.mts +1 -0
- package/3rdparty/walkontable/src/ports.d.ts +54 -0
- package/3rdparty/walkontable/src/ports.js +23 -0
- package/3rdparty/walkontable/src/ports.mjs +24 -0
- package/3rdparty/walkontable/src/{renderer → render}/_base.d.ts +1 -1
- package/3rdparty/walkontable/src/{renderer → render}/cells.js +1 -1
- package/3rdparty/walkontable/src/{renderer → render}/cells.mjs +1 -1
- package/3rdparty/walkontable/src/{renderer → render}/columnHeaders.d.ts +1 -0
- package/3rdparty/walkontable/src/{renderer → render}/columnHeaders.js +43 -1
- package/3rdparty/walkontable/src/{renderer → render}/columnHeaders.mjs +44 -2
- package/3rdparty/walkontable/src/render/index.d.mts +1 -0
- package/3rdparty/walkontable/src/{renderer → render}/index.d.ts +11 -3
- package/3rdparty/walkontable/src/{renderer → render}/index.js +13 -3
- package/3rdparty/walkontable/src/{renderer → render}/index.mjs +11 -1
- package/3rdparty/walkontable/src/{renderer → render}/rows.js +1 -1
- package/3rdparty/walkontable/src/{renderer → render}/rows.mjs +1 -1
- package/3rdparty/walkontable/src/render/tableRenderer.d.mts +1 -0
- package/3rdparty/walkontable/src/{renderer/table.d.ts → render/tableRenderer.d.ts} +12 -2
- package/3rdparty/walkontable/src/render/tableRenderer.js +382 -0
- package/3rdparty/walkontable/src/{renderer/table.mjs → render/tableRenderer.mjs} +159 -6
- package/3rdparty/walkontable/src/{scroll.d.ts → scroll/scroll.d.ts} +27 -10
- package/3rdparty/walkontable/src/{scroll.js → scroll/scroll.js} +108 -32
- package/3rdparty/walkontable/src/{scroll.mjs → scroll/scroll.mjs} +106 -29
- package/3rdparty/walkontable/src/selection/border/border.d.ts +313 -5
- package/3rdparty/walkontable/src/selection/border/border.js +861 -51
- package/3rdparty/walkontable/src/selection/border/border.mjs +863 -53
- package/3rdparty/walkontable/src/selection/border/types.d.ts +30 -0
- package/3rdparty/walkontable/src/selection/manager.js +237 -0
- package/3rdparty/walkontable/src/selection/manager.mjs +238 -1
- package/3rdparty/walkontable/src/settings/accessor.d.mts +2 -0
- package/3rdparty/walkontable/src/settings/accessor.d.ts +74 -0
- package/3rdparty/walkontable/src/settings/accessor.js +78 -0
- package/3rdparty/walkontable/src/settings/accessor.mjs +71 -0
- package/3rdparty/walkontable/src/settings/defaults.d.mts +1 -0
- package/3rdparty/walkontable/src/{settings.d.ts → settings/defaults.d.ts} +16 -77
- package/3rdparty/walkontable/src/settings/defaults.js +146 -0
- package/3rdparty/walkontable/src/settings/defaults.mjs +225 -0
- package/3rdparty/walkontable/src/settings/index.d.mts +1 -0
- package/3rdparty/walkontable/src/settings/index.d.ts +6 -0
- package/3rdparty/walkontable/src/settings/index.js +20 -0
- package/3rdparty/walkontable/src/settings/index.mjs +5 -0
- package/3rdparty/walkontable/src/table/baseTable.d.mts +2 -0
- package/3rdparty/walkontable/src/table/baseTable.d.ts +284 -0
- package/3rdparty/walkontable/src/table/baseTable.js +295 -0
- package/3rdparty/walkontable/src/table/baseTable.mjs +283 -0
- package/3rdparty/walkontable/src/table/cellAccess.d.mts +1 -0
- package/3rdparty/walkontable/src/table/cellAccess.d.ts +101 -0
- package/3rdparty/walkontable/src/table/cellAccess.js +238 -0
- package/3rdparty/walkontable/src/table/cellAccess.mjs +229 -0
- package/3rdparty/walkontable/src/table/domScaffold.d.mts +1 -0
- package/3rdparty/walkontable/src/table/domScaffold.d.ts +37 -0
- package/3rdparty/walkontable/src/table/domScaffold.js +145 -0
- package/3rdparty/walkontable/src/table/domScaffold.mjs +136 -0
- package/3rdparty/walkontable/src/table/drawCycle.d.mts +1 -0
- package/3rdparty/walkontable/src/table/drawCycle.d.ts +16 -0
- package/3rdparty/walkontable/src/table/drawCycle.js +405 -0
- package/3rdparty/walkontable/src/table/drawCycle.mjs +403 -0
- package/3rdparty/walkontable/src/table/rangeQuery/renderedRange.d.mts +1 -0
- package/3rdparty/walkontable/src/table/rangeQuery/renderedRange.d.ts +38 -0
- package/3rdparty/walkontable/src/table/rangeQuery/renderedRange.js +15 -0
- package/3rdparty/walkontable/src/table/rangeQuery/renderedRange.mjs +14 -0
- package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyColumnsStart.d.ts +1 -1
- package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyColumnsStart.js +1 -1
- package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyColumnsStart.mjs +1 -1
- package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsBottom.d.ts +1 -1
- package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsTop.d.ts +1 -1
- package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsTop.js +1 -1
- package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsTop.mjs +1 -1
- package/3rdparty/walkontable/src/table/rangeQuery/viewportPredicates.d.mts +2 -0
- package/3rdparty/walkontable/src/table/rangeQuery/viewportPredicates.d.ts +226 -0
- package/3rdparty/walkontable/src/table/rangeQuery/viewportPredicates.js +251 -0
- package/3rdparty/walkontable/src/table/rangeQuery/viewportPredicates.mjs +241 -0
- package/3rdparty/walkontable/src/table/rangeQuery/virtualRange.d.mts +1 -0
- package/3rdparty/walkontable/src/table/rangeQuery/virtualRange.d.ts +14 -0
- package/3rdparty/walkontable/src/table/rangeQuery/virtualRange.js +196 -0
- package/3rdparty/walkontable/src/table/rangeQuery/virtualRange.mjs +179 -0
- package/3rdparty/walkontable/src/table/regions/bottomInlineStartCornerTable.d.mts +2 -0
- package/3rdparty/walkontable/src/table/regions/bottomInlineStartCornerTable.d.ts +16 -0
- package/3rdparty/walkontable/src/table/{bottomInlineStartCorner.js → regions/bottomInlineStartCornerTable.js} +9 -12
- package/3rdparty/walkontable/src/table/regions/bottomInlineStartCornerTable.mjs +21 -0
- package/3rdparty/walkontable/src/table/regions/bottomTable.d.mts +2 -0
- package/3rdparty/walkontable/src/table/regions/bottomTable.d.ts +15 -0
- package/3rdparty/walkontable/src/table/regions/bottomTable.js +35 -0
- package/3rdparty/walkontable/src/table/regions/bottomTable.mjs +20 -0
- package/3rdparty/walkontable/src/table/regions/inlineStartTable.d.mts +2 -0
- package/3rdparty/walkontable/src/table/regions/inlineStartTable.d.ts +12 -0
- package/3rdparty/walkontable/src/table/regions/inlineStartTable.js +32 -0
- package/3rdparty/walkontable/src/table/regions/inlineStartTable.mjs +17 -0
- package/3rdparty/walkontable/src/table/regions/masterTable.d.mts +2 -0
- package/3rdparty/walkontable/src/table/{master.d.ts → regions/masterTable.d.ts} +4 -13
- package/3rdparty/walkontable/src/table/{master.js → regions/masterTable.js} +23 -48
- package/3rdparty/walkontable/src/table/{master.mjs → regions/masterTable.mjs} +22 -47
- package/3rdparty/walkontable/src/table/regions/topInlineStartCornerTable.d.mts +2 -0
- package/3rdparty/walkontable/src/table/regions/topInlineStartCornerTable.d.ts +16 -0
- package/3rdparty/walkontable/src/table/{topInlineStartCorner.js → regions/topInlineStartCornerTable.js} +9 -12
- package/3rdparty/walkontable/src/table/regions/topInlineStartCornerTable.mjs +21 -0
- package/3rdparty/walkontable/src/table/regions/topTable.d.mts +2 -0
- package/3rdparty/walkontable/src/table/regions/topTable.d.ts +15 -0
- package/3rdparty/walkontable/src/table/regions/topTable.js +35 -0
- package/3rdparty/walkontable/src/table/regions/topTable.mjs +20 -0
- package/3rdparty/walkontable/src/types.d.ts +7 -69
- package/3rdparty/walkontable/src/types.mjs +2 -1
- package/3rdparty/walkontable/src/utils/pointerToCoords.d.mts +1 -0
- package/3rdparty/walkontable/src/utils/{cellCoords.d.ts → pointerToCoords.d.ts} +24 -0
- package/3rdparty/walkontable/src/utils/pointerToCoords.js +181 -0
- package/3rdparty/walkontable/src/utils/pointerToCoords.mjs +186 -0
- package/3rdparty/walkontable/src/viewport/boxLayout/gatherLayoutInput.d.mts +1 -0
- package/3rdparty/walkontable/src/viewport/boxLayout/gatherLayoutInput.d.ts +40 -0
- package/3rdparty/walkontable/src/viewport/boxLayout/gatherLayoutInput.js +139 -0
- package/3rdparty/walkontable/src/viewport/boxLayout/gatherLayoutInput.mjs +131 -0
- package/3rdparty/walkontable/src/viewport/boxLayout/layoutSnapshot.d.mts +1 -0
- package/3rdparty/walkontable/src/viewport/boxLayout/layoutSnapshot.d.ts +133 -0
- package/3rdparty/walkontable/src/viewport/boxLayout/layoutSnapshot.js +18 -0
- package/3rdparty/walkontable/src/viewport/boxLayout/layoutSnapshot.mjs +18 -0
- package/3rdparty/walkontable/src/viewport/boxLayout/resolveLayout.d.mts +1 -0
- package/3rdparty/walkontable/src/viewport/boxLayout/resolveLayout.d.ts +17 -0
- package/3rdparty/walkontable/src/viewport/boxLayout/resolveLayout.js +104 -0
- package/3rdparty/walkontable/src/viewport/boxLayout/resolveLayout.mjs +99 -0
- package/3rdparty/walkontable/src/viewport/calculatorFactory.d.mts +1 -0
- package/3rdparty/walkontable/src/viewport/calculatorFactory.d.ts +84 -0
- package/3rdparty/walkontable/src/viewport/calculatorFactory.js +588 -0
- package/3rdparty/walkontable/src/viewport/calculatorFactory.mjs +601 -0
- package/3rdparty/walkontable/src/viewport/viewport.d.ts +267 -0
- package/3rdparty/walkontable/src/viewport/viewport.js +368 -0
- package/3rdparty/walkontable/src/viewport/viewport.mjs +360 -0
- package/3rdparty/walkontable/src/viewport/workspaceSize.d.mts +1 -0
- package/3rdparty/walkontable/src/viewport/workspaceSize.d.ts +59 -0
- package/3rdparty/walkontable/src/viewport/workspaceSize.js +284 -0
- package/3rdparty/walkontable/src/viewport/workspaceSize.mjs +282 -0
- package/3rdparty/walkontable/src/wire.d.mts +1 -0
- package/3rdparty/walkontable/src/wire.d.ts +81 -0
- package/3rdparty/walkontable/src/wire.js +56 -0
- package/3rdparty/walkontable/src/wire.mjs +56 -0
- package/CHANGELOG.md +114 -1
- package/LICENSE.txt +1 -1
- package/README.md +2 -2
- package/base.d.ts +13 -4
- package/base.js +2 -2
- package/base.mjs +2 -2
- package/cellTypes/checkboxType/accessors/valueSetter.d.ts +1 -1
- package/cellTypes/checkboxType/accessors/valueSetter.js +3 -1
- package/cellTypes/checkboxType/accessors/valueSetter.mjs +3 -1
- package/cellTypes/index.d.ts +3 -2
- package/cellTypes/index.js +9 -0
- package/cellTypes/index.mjs +5 -2
- package/cellTypes/intlDatetimeType/index.d.mts +1 -0
- package/cellTypes/intlDatetimeType/index.d.ts +1 -0
- package/cellTypes/intlDatetimeType/index.js +19 -0
- package/cellTypes/intlDatetimeType/index.mjs +1 -0
- package/cellTypes/intlDatetimeType/intlDatetimeType.d.mts +1 -0
- package/cellTypes/intlDatetimeType/intlDatetimeType.d.ts +16 -0
- package/cellTypes/intlDatetimeType/intlDatetimeType.js +31 -0
- package/cellTypes/intlDatetimeType/intlDatetimeType.mjs +15 -0
- package/cellTypes/multiSelectType/index.d.ts +1 -1
- package/cellTypes/multiSelectType/index.js +3 -0
- package/cellTypes/multiSelectType/index.mjs +1 -1
- package/cellTypes/multiSelectType/multiSelectType.d.ts +1 -0
- package/cellTypes/multiSelectType/multiSelectType.js +4 -0
- package/cellTypes/multiSelectType/multiSelectType.mjs +1 -0
- package/cellTypes/numericType/accessors/valueSetter.js +30 -2
- package/cellTypes/numericType/accessors/valueSetter.mjs +31 -3
- package/core/hooks/bucket.d.ts +40 -6
- package/core/hooks/bucket.js +108 -72
- package/core/hooks/bucket.mjs +113 -72
- package/core/hooks/constants.js +254 -16
- package/core/hooks/constants.mjs +254 -16
- package/core/hooks/index.js +27 -22
- package/core/hooks/index.mjs +27 -22
- package/core/layout/constants.d.ts +11 -0
- package/core/layout/constants.js +6 -0
- package/core/layout/constants.mjs +12 -0
- package/core/layout/domSlot.d.ts +3 -1
- package/core/layout/domSlot.js +16 -2
- package/core/layout/domSlot.mjs +16 -2
- package/core/layout/index.d.ts +2 -2
- package/core/layout/index.js +6 -0
- package/core/layout/index.mjs +2 -2
- package/core/layout/layoutManager.d.ts +13 -0
- package/core/layout/layoutManager.js +21 -4
- package/core/layout/layoutManager.mjs +22 -2
- package/core/settings.d.ts +102 -6
- package/core/types.d.ts +15 -1
- package/core/types.mjs +9 -0
- package/core.js +534 -88
- package/core.mjs +537 -91
- package/dataMap/dataMap.d.ts +3 -13
- package/dataMap/dataMap.js +100 -41
- package/dataMap/dataMap.mjs +101 -42
- package/dataMap/dataSource.js +4 -1
- package/dataMap/dataSource.mjs +4 -1
- package/dataMap/metaManager/index.d.ts +62 -8
- package/dataMap/metaManager/index.js +66 -0
- package/dataMap/metaManager/index.mjs +66 -0
- package/dataMap/metaManager/lazyFactoryMap.d.ts +68 -43
- package/dataMap/metaManager/lazyFactoryMap.js +497 -110
- package/dataMap/metaManager/lazyFactoryMap.mjs +511 -111
- package/dataMap/metaManager/metaLayers/cellMeta.d.ts +55 -8
- package/dataMap/metaManager/metaLayers/cellMeta.js +108 -8
- package/dataMap/metaManager/metaLayers/cellMeta.mjs +108 -8
- package/dataMap/metaManager/metaLayers/columnMeta.d.ts +2 -1
- package/dataMap/metaManager/metaLayers/columnMeta.js +1 -0
- package/dataMap/metaManager/metaLayers/columnMeta.mjs +1 -0
- package/dataMap/metaManager/metaSchema.js +759 -39
- package/dataMap/metaManager/metaSchema.mjs +759 -39
- package/dataMap/metaManager/mods/dynamicCellMeta.d.ts +24 -10
- package/dataMap/metaManager/mods/dynamicCellMeta.js +252 -28
- package/dataMap/metaManager/mods/dynamicCellMeta.mjs +253 -29
- package/dataMap/sourceDataValidator.d.ts +13 -21
- package/dataMap/sourceDataValidator.js +39 -29
- package/dataMap/sourceDataValidator.mjs +50 -33
- package/dist/handsontable.full.js +30027 -11261
- package/dist/handsontable.full.min.js +168 -112
- package/dist/handsontable.js +32468 -13762
- package/dist/handsontable.min.js +172 -116
- package/dist/languages/all.js +2 -1
- package/dist/languages/all.min.js +1 -1
- package/dist/languages/fa-IR.js +2 -1
- package/dist/languages/fa-IR.min.js +1 -1
- package/dist/themes/classic.js +9 -3
- package/dist/themes/classic.min.js +4 -4
- package/dist/themes/horizon.js +9 -3
- package/dist/themes/horizon.min.js +4 -4
- package/dist/themes/main.js +9 -3
- package/dist/themes/main.min.js +4 -4
- package/dist/themes/static/variables/colors/ant.js +3 -3
- package/dist/themes/static/variables/colors/ant.min.js +3 -3
- package/dist/themes/static/variables/colors/classic.js +3 -3
- package/dist/themes/static/variables/colors/classic.min.js +3 -3
- package/dist/themes/static/variables/colors/horizon.js +3 -3
- package/dist/themes/static/variables/colors/horizon.min.js +3 -3
- package/dist/themes/static/variables/colors/main.js +3 -3
- package/dist/themes/static/variables/colors/main.min.js +3 -3
- package/dist/themes/static/variables/colors/material.js +3 -3
- package/dist/themes/static/variables/colors/material.min.js +3 -3
- package/dist/themes/static/variables/colors/shadcn.js +3 -3
- package/dist/themes/static/variables/colors/shadcn.min.js +3 -3
- package/dist/themes/static/variables/density.js +3 -3
- package/dist/themes/static/variables/density.min.js +3 -3
- package/dist/themes/static/variables/helpers/iconsMap.js +4 -9
- package/dist/themes/static/variables/helpers/iconsMap.min.js +4 -9
- package/dist/themes/static/variables/icons/horizon.js +3 -3
- package/dist/themes/static/variables/icons/horizon.min.js +3 -3
- package/dist/themes/static/variables/icons/main.js +3 -3
- package/dist/themes/static/variables/icons/main.min.js +3 -3
- package/dist/themes/static/variables/sizing.js +3 -3
- package/dist/themes/static/variables/sizing.min.js +3 -3
- package/dist/themes/static/variables/tokens/classic.js +9 -3
- package/dist/themes/static/variables/tokens/classic.min.js +4 -4
- package/dist/themes/static/variables/tokens/horizon.js +9 -3
- package/dist/themes/static/variables/tokens/horizon.min.js +4 -4
- package/dist/themes/static/variables/tokens/main.js +9 -3
- package/dist/themes/static/variables/tokens/main.min.js +4 -4
- package/editorManager.js +152 -3
- package/editorManager.mjs +152 -3
- package/editors/autocompleteEditor/autocompleteEditor.js +58 -11
- package/editors/autocompleteEditor/autocompleteEditor.mjs +59 -12
- package/editors/baseEditor/baseEditor.d.ts +15 -3
- package/editors/baseEditor/baseEditor.js +5 -3
- package/editors/baseEditor/baseEditor.mjs +15 -3
- package/editors/factory.js +5 -2
- package/editors/factory.mjs +5 -2
- package/editors/index.d.ts +3 -2
- package/editors/index.js +8 -0
- package/editors/index.mjs +3 -1
- package/editors/intlDatetimeEditor/index.d.mts +1 -0
- package/editors/intlDatetimeEditor/index.d.ts +1 -0
- package/editors/intlDatetimeEditor/index.js +19 -0
- package/editors/intlDatetimeEditor/index.mjs +1 -0
- package/editors/intlDatetimeEditor/intlDatetimeEditor.d.mts +1 -0
- package/editors/intlDatetimeEditor/intlDatetimeEditor.d.ts +42 -0
- package/editors/intlDatetimeEditor/intlDatetimeEditor.js +108 -0
- package/editors/intlDatetimeEditor/intlDatetimeEditor.mjs +93 -0
- package/editors/multiSelectEditor/multiSelectEditor.js +11 -9
- package/editors/multiSelectEditor/multiSelectEditor.mjs +12 -10
- package/editors/selectEditor/selectEditor.js +2 -1
- package/editors/selectEditor/selectEditor.mjs +2 -1
- package/editors/textEditor/textEditor.js +1 -1
- package/editors/textEditor/textEditor.mjs +2 -2
- package/eventManager.d.ts +3 -3
- package/focusManager/grid.d.ts +28 -0
- package/focusManager/grid.js +85 -2
- package/focusManager/grid.mjs +81 -3
- package/focusManager/scopeManager.js +1 -1
- package/focusManager/scopeManager.mjs +2 -2
- package/handsontable-non-commercial-license.pdf +0 -0
- package/helpers/array.d.ts +25 -0
- package/helpers/array.js +41 -4
- package/helpers/array.mjs +56 -4
- package/helpers/console.d.ts +25 -3
- package/helpers/console.js +40 -7
- package/helpers/console.mjs +52 -7
- package/helpers/dateTime.d.ts +14 -0
- package/helpers/dateTime.js +74 -2
- package/helpers/dateTime.mjs +73 -2
- package/helpers/dom/cellCoords.js +156 -13
- package/helpers/dom/cellCoords.mjs +156 -13
- package/helpers/dom/element.d.ts +47 -8
- package/helpers/dom/element.js +104 -18
- package/helpers/dom/element.mjs +132 -23
- package/helpers/dom/event.d.ts +58 -0
- package/helpers/dom/event.js +39 -0
- package/helpers/dom/event.mjs +63 -0
- package/helpers/errors.d.ts +5 -0
- package/helpers/errors.js +10 -6
- package/helpers/errors.mjs +10 -6
- package/helpers/feature.d.ts +19 -0
- package/helpers/feature.js +21 -0
- package/helpers/feature.mjs +30 -0
- package/helpers/function.d.ts +1 -1
- package/helpers/function.js +4 -1
- package/helpers/function.mjs +4 -1
- package/helpers/mixed.d.ts +103 -0
- package/helpers/mixed.js +373 -4
- package/helpers/mixed.mjs +413 -4
- package/helpers/moves.js +2 -1
- package/helpers/moves.mjs +2 -1
- package/helpers/number.d.ts +22 -0
- package/helpers/number.js +49 -0
- package/helpers/number.mjs +66 -0
- package/helpers/string.d.ts +14 -10
- package/helpers/string.js +17 -9
- package/helpers/string.mjs +27 -17
- package/helpers/templateString.d.mts +1 -0
- package/helpers/templateString.d.ts +13 -0
- package/helpers/templateString.js +29 -0
- package/helpers/templateString.mjs +19 -0
- package/helpers/uiButton.d.mts +1 -0
- package/helpers/uiButton.d.ts +21 -0
- package/helpers/uiButton.js +37 -0
- package/helpers/uiButton.mjs +31 -0
- package/i18n/languages/fa-IR.d.ts +1 -0
- package/i18n/languages/fa-IR.js +1 -0
- package/i18n/languages/fa-IR.mjs +1 -0
- package/index.d.ts +3 -3
- package/languages/all.js +2 -1
- package/languages/fa-IR.js +2 -1
- package/languages/fa-IR.mjs +1 -0
- package/languages/index.js +2 -1
- package/package.json +61 -1
- package/plugins/autoColumnSize/autoColumnSize.d.ts +24 -1
- package/plugins/autoColumnSize/autoColumnSize.js +501 -82
- package/plugins/autoColumnSize/autoColumnSize.mjs +508 -83
- package/plugins/autoRowSize/autoRowSize.d.ts +40 -5
- package/plugins/autoRowSize/autoRowSize.js +68 -24
- package/plugins/autoRowSize/autoRowSize.mjs +98 -29
- package/plugins/autofill/autofill.js +30 -12
- package/plugins/autofill/autofill.mjs +30 -12
- package/plugins/base/base.d.ts +10 -0
- package/plugins/collapsibleColumns/collapsibleColumns.d.ts +4 -0
- package/plugins/collapsibleColumns/collapsibleColumns.js +89 -8
- package/plugins/collapsibleColumns/collapsibleColumns.mjs +93 -8
- package/plugins/columnSorting/columnSorting.d.ts +31 -2
- package/plugins/columnSorting/columnSorting.js +151 -24
- package/plugins/columnSorting/columnSorting.mjs +153 -26
- package/plugins/columnSorting/columnStatesManager.d.ts +1 -1
- package/plugins/columnSorting/columnStatesManager.js +1 -7
- package/plugins/columnSorting/columnStatesManager.mjs +1 -7
- package/plugins/columnSorting/domHelpers.d.ts +3 -0
- package/plugins/columnSorting/domHelpers.js +9 -0
- package/plugins/columnSorting/domHelpers.mjs +3 -3
- package/plugins/columnSorting/rootComparator.js +21 -16
- package/plugins/columnSorting/rootComparator.mjs +21 -16
- package/plugins/columnSorting/sortFunction/checkbox.js +7 -5
- package/plugins/columnSorting/sortFunction/checkbox.mjs +7 -5
- package/plugins/columnSorting/sortFunction/default.js +15 -4
- package/plugins/columnSorting/sortFunction/default.mjs +15 -4
- package/plugins/columnSorting/sortFunction/intlDatetime.d.mts +1 -0
- package/plugins/columnSorting/sortFunction/intlDatetime.d.ts +10 -0
- package/plugins/columnSorting/sortFunction/intlDatetime.js +23 -0
- package/plugins/columnSorting/sortFunction/intlDatetime.mjs +12 -0
- package/plugins/columnSorting/sortService/registry.js +2 -0
- package/plugins/columnSorting/sortService/registry.mjs +2 -0
- package/plugins/columnSorting/utils.d.ts +8 -0
- package/plugins/columnSorting/utils.js +37 -45
- package/plugins/columnSorting/utils.mjs +42 -47
- package/plugins/columnSummary/columnSummary.js +9 -5
- package/plugins/columnSummary/columnSummary.mjs +9 -5
- package/plugins/columnSummary/endpoints.d.ts +69 -2
- package/plugins/columnSummary/endpoints.js +181 -29
- package/plugins/columnSummary/endpoints.mjs +181 -29
- package/plugins/comments/commentEditor.js +1 -1
- package/plugins/comments/commentEditor.mjs +2 -2
- package/plugins/contextMenu/contextMenu.d.ts +12 -1
- package/plugins/contextMenu/contextMenu.js +30 -6
- package/plugins/contextMenu/contextMenu.mjs +30 -6
- package/plugins/contextMenu/index.d.ts +1 -1
- package/plugins/contextMenu/menu/menu.d.ts +22 -1
- package/plugins/contextMenu/menu/menu.js +211 -3
- package/plugins/contextMenu/menu/menu.mjs +212 -4
- package/plugins/contextMenu/menu/menuItemRenderer.js +2 -2
- package/plugins/contextMenu/menu/menuItemRenderer.mjs +2 -2
- package/plugins/contextMenu/predefinedItems/alignment.js +14 -14
- package/plugins/contextMenu/predefinedItems/alignment.mjs +14 -14
- package/plugins/contextMenu/predefinedItems/clearColumn.js +1 -1
- package/plugins/contextMenu/predefinedItems/clearColumn.mjs +1 -1
- package/plugins/contextMenu/predefinedItems/readOnly.js +3 -3
- package/plugins/contextMenu/predefinedItems/readOnly.mjs +3 -3
- package/plugins/contextMenu/utils.js +1 -1
- package/plugins/contextMenu/utils.mjs +1 -1
- package/plugins/copyPaste/copyPaste.js +70 -16
- package/plugins/copyPaste/copyPaste.mjs +71 -17
- package/plugins/copyPaste/copyableRanges.js +6 -2
- package/plugins/copyPaste/copyableRanges.mjs +6 -2
- package/plugins/copyPaste/pasteEvent.d.ts +1 -1
- package/plugins/customBorders/customBorders.d.ts +21 -40
- package/plugins/customBorders/customBorders.js +1080 -201
- package/plugins/customBorders/customBorders.mjs +1082 -203
- package/plugins/customBorders/utils.d.ts +71 -0
- package/plugins/customBorders/utils.js +63 -0
- package/plugins/customBorders/utils.mjs +101 -0
- package/plugins/dataProvider/dataProvider.d.ts +2 -1
- package/plugins/dataProvider/dataProvider.js +22 -7
- package/plugins/dataProvider/dataProvider.mjs +22 -7
- package/plugins/dataProvider/query/crud.js +1 -1
- package/plugins/dataProvider/query/crud.mjs +1 -1
- package/plugins/dialog/dialog.js +14 -9
- package/plugins/dialog/dialog.mjs +14 -9
- package/plugins/dialog/templates/confirm.d.ts +1 -1
- package/plugins/dialog/templates/confirm.js +2 -1
- package/plugins/dialog/templates/confirm.mjs +2 -1
- package/plugins/dialog/ui.d.ts +5 -3
- package/plugins/dialog/ui.js +12 -4
- package/plugins/dialog/ui.mjs +12 -4
- package/plugins/dragToScroll/dragToScroll.d.ts +2 -2
- package/plugins/dragToScroll/dragToScroll.js +150 -14
- package/plugins/dragToScroll/dragToScroll.mjs +151 -15
- package/plugins/dropdownMenu/dropdownMenu.d.ts +5 -1
- package/plugins/dropdownMenu/dropdownMenu.js +45 -3
- package/plugins/dropdownMenu/dropdownMenu.mjs +46 -4
- package/plugins/dropdownMenu/index.d.ts +1 -0
- package/plugins/emptyDataState/emptyDataState.js +4 -6
- package/plugins/emptyDataState/emptyDataState.mjs +4 -6
- package/plugins/emptyDataState/ui.js +2 -1
- package/plugins/emptyDataState/ui.mjs +2 -1
- package/plugins/exportFile/dataProvider.js +7 -9
- package/plugins/exportFile/dataProvider.mjs +7 -9
- package/plugins/exportFile/exportFile.d.ts +10 -3
- package/plugins/exportFile/types/_base.js +4 -10
- package/plugins/exportFile/types/_base.mjs +4 -10
- package/plugins/exportFile/types/xlsx/cell-style.js +4 -2
- package/plugins/exportFile/types/xlsx/cell-style.mjs +4 -2
- package/plugins/exportFile/types/xlsx/date-utils.d.ts +15 -0
- package/plugins/exportFile/types/xlsx/date-utils.js +31 -0
- package/plugins/exportFile/types/xlsx/date-utils.mjs +36 -0
- package/plugins/exportFile/types/xlsx.js +13 -9
- package/plugins/exportFile/types/xlsx.mjs +14 -10
- package/plugins/exportFile/utils.d.ts +9 -1
- package/plugins/exportFile/utils.js +27 -4
- package/plugins/exportFile/utils.mjs +40 -2
- package/plugins/filters/component/_base.d.ts +1 -2
- package/plugins/filters/component/_base.js +1 -2
- package/plugins/filters/component/_base.mjs +1 -2
- package/plugins/filters/component/condition.d.ts +1 -0
- package/plugins/filters/component/condition.js +2 -0
- package/plugins/filters/component/condition.mjs +2 -0
- package/plugins/filters/component/value.d.ts +5 -6
- package/plugins/filters/component/value.js +53 -34
- package/plugins/filters/component/value.mjs +54 -35
- package/plugins/filters/condition/date/after.js +2 -1
- package/plugins/filters/condition/date/after.mjs +2 -1
- package/plugins/filters/condition/date/afterOrEqual.js +2 -1
- package/plugins/filters/condition/date/afterOrEqual.mjs +2 -1
- package/plugins/filters/condition/date/before.js +2 -1
- package/plugins/filters/condition/date/before.mjs +2 -1
- package/plugins/filters/condition/date/beforeOrEqual.js +2 -1
- package/plugins/filters/condition/date/beforeOrEqual.mjs +2 -1
- package/plugins/filters/condition/equal.d.ts +7 -0
- package/plugins/filters/condition/equal.js +4 -0
- package/plugins/filters/condition/equal.mjs +10 -0
- package/plugins/filters/condition/intlDatetime/after.d.mts +1 -0
- package/plugins/filters/condition/intlDatetime/after.d.ts +18 -0
- package/plugins/filters/condition/intlDatetime/after.js +77 -0
- package/plugins/filters/condition/intlDatetime/after.mjs +22 -0
- package/plugins/filters/condition/intlDatetime/afterOrEqual.d.mts +1 -0
- package/plugins/filters/condition/intlDatetime/afterOrEqual.d.ts +18 -0
- package/plugins/filters/condition/intlDatetime/afterOrEqual.js +77 -0
- package/plugins/filters/condition/intlDatetime/afterOrEqual.mjs +22 -0
- package/plugins/filters/condition/intlDatetime/before.d.mts +1 -0
- package/plugins/filters/condition/intlDatetime/before.d.ts +18 -0
- package/plugins/filters/condition/intlDatetime/before.js +77 -0
- package/plugins/filters/condition/intlDatetime/before.mjs +22 -0
- package/plugins/filters/condition/intlDatetime/beforeOrEqual.d.mts +1 -0
- package/plugins/filters/condition/intlDatetime/beforeOrEqual.d.ts +18 -0
- package/plugins/filters/condition/intlDatetime/beforeOrEqual.js +77 -0
- package/plugins/filters/condition/intlDatetime/beforeOrEqual.mjs +22 -0
- package/plugins/filters/condition/intlDatetime/between.d.mts +1 -0
- package/plugins/filters/condition/intlDatetime/between.d.ts +18 -0
- package/plugins/filters/condition/intlDatetime/between.js +78 -0
- package/plugins/filters/condition/intlDatetime/between.mjs +23 -0
- package/plugins/filters/condition/intlDatetime/today.d.mts +1 -0
- package/plugins/filters/condition/intlDatetime/today.d.ts +17 -0
- package/plugins/filters/condition/intlDatetime/today.js +76 -0
- package/plugins/filters/condition/intlDatetime/today.mjs +20 -0
- package/plugins/filters/condition/intlDatetime/tomorrow.d.mts +1 -0
- package/plugins/filters/condition/intlDatetime/tomorrow.d.ts +17 -0
- package/plugins/filters/condition/intlDatetime/tomorrow.js +77 -0
- package/plugins/filters/condition/intlDatetime/tomorrow.mjs +21 -0
- package/plugins/filters/condition/intlDatetime/yesterday.d.mts +1 -0
- package/plugins/filters/condition/intlDatetime/yesterday.d.ts +17 -0
- package/plugins/filters/condition/intlDatetime/yesterday.js +77 -0
- package/plugins/filters/condition/intlDatetime/yesterday.mjs +21 -0
- package/plugins/filters/conditionCollection.js +4 -7
- package/plugins/filters/conditionCollection.mjs +4 -7
- package/plugins/filters/conditionUpdateObserver.d.ts +2 -2
- package/plugins/filters/conditionUpdateObserver.js +148 -49
- package/plugins/filters/conditionUpdateObserver.mjs +148 -49
- package/plugins/filters/constants.d.ts +1 -0
- package/plugins/filters/constants.js +31 -0
- package/plugins/filters/constants.mjs +28 -0
- package/plugins/filters/dataFilter.d.ts +4 -12
- package/plugins/filters/dataFilter.js +7 -19
- package/plugins/filters/dataFilter.mjs +8 -20
- package/plugins/filters/filters.d.ts +33 -9
- package/plugins/filters/filters.js +91 -31
- package/plugins/filters/filters.mjs +92 -32
- package/plugins/filters/sortComparators.d.ts +9 -2
- package/plugins/filters/sortComparators.js +34 -1
- package/plugins/filters/sortComparators.mjs +38 -3
- package/plugins/filters/ui/input.d.ts +4 -0
- package/plugins/filters/ui/input.js +18 -6
- package/plugins/filters/ui/input.mjs +18 -6
- package/plugins/filters/ui/multipleSelect.js +27 -4
- package/plugins/filters/ui/multipleSelect.mjs +27 -4
- package/plugins/filters/ui/select.js +1 -1
- package/plugins/filters/ui/select.mjs +1 -1
- package/plugins/formulas/engine/register.d.ts +5 -4
- package/plugins/formulas/engine/register.js +5 -2
- package/plugins/formulas/engine/register.mjs +9 -5
- package/plugins/formulas/engine/settings.d.ts +2 -6
- package/plugins/formulas/engine/settings.js +29 -4
- package/plugins/formulas/engine/settings.mjs +29 -4
- package/plugins/formulas/engine/types.d.ts +12 -2
- package/plugins/formulas/formulas.d.ts +39 -0
- package/plugins/formulas/formulas.js +789 -47
- package/plugins/formulas/formulas.mjs +793 -49
- package/plugins/formulas/hyperlinkUrl.d.mts +1 -0
- package/plugins/formulas/hyperlinkUrl.d.ts +12 -0
- package/plugins/formulas/hyperlinkUrl.js +32 -0
- package/plugins/formulas/hyperlinkUrl.mjs +32 -0
- package/plugins/formulas/indexSyncer/axisSyncer.d.ts +1 -0
- package/plugins/formulas/indexSyncer/axisSyncer.js +72 -15
- package/plugins/formulas/indexSyncer/axisSyncer.mjs +72 -15
- package/plugins/formulas/utils.d.ts +9 -0
- package/plugins/formulas/utils.js +21 -0
- package/plugins/formulas/utils.mjs +25 -0
- package/plugins/hiddenColumns/contextMenuItem/showColumn.js +6 -1
- package/plugins/hiddenColumns/contextMenuItem/showColumn.mjs +6 -1
- package/plugins/hiddenColumns/hiddenColumns.js +6 -3
- package/plugins/hiddenColumns/hiddenColumns.mjs +6 -3
- package/plugins/hiddenRows/contextMenuItem/showRow.js +6 -1
- package/plugins/hiddenRows/contextMenuItem/showRow.mjs +6 -1
- package/plugins/hiddenRows/hiddenRows.js +6 -3
- package/plugins/hiddenRows/hiddenRows.mjs +6 -3
- package/plugins/index.d.ts +5 -1
- package/plugins/index.js +10 -0
- package/plugins/index.mjs +5 -1
- package/plugins/loading/content.d.ts +5 -3
- package/plugins/loading/content.js +3 -2
- package/plugins/loading/content.mjs +8 -5
- package/plugins/loading/loading.d.ts +5 -2
- package/plugins/loading/loading.mjs +5 -2
- package/plugins/manualColumnMove/manualColumnMove.d.ts +10 -0
- package/plugins/manualColumnMove/manualColumnMove.js +122 -20
- package/plugins/manualColumnMove/manualColumnMove.mjs +123 -21
- package/plugins/manualColumnResize/manualColumnResize.d.ts +20 -7
- package/plugins/manualColumnResize/manualColumnResize.js +33 -13
- package/plugins/manualColumnResize/manualColumnResize.mjs +34 -14
- package/plugins/manualRowResize/manualRowResize.d.ts +21 -8
- package/plugins/manualRowResize/manualRowResize.js +34 -14
- package/plugins/manualRowResize/manualRowResize.mjs +35 -15
- package/plugins/mergeCells/cellCoords.d.ts +8 -0
- package/plugins/mergeCells/cellCoords.js +11 -0
- package/plugins/mergeCells/cellCoords.mjs +11 -0
- package/plugins/mergeCells/cellsCollection.d.ts +46 -2
- package/plugins/mergeCells/cellsCollection.js +189 -68
- package/plugins/mergeCells/cellsCollection.mjs +189 -68
- package/plugins/mergeCells/focusOrder.d.ts +26 -20
- package/plugins/mergeCells/focusOrder.js +358 -177
- package/plugins/mergeCells/focusOrder.mjs +363 -172
- package/plugins/mergeCells/mergeCells.d.ts +13 -8
- package/plugins/mergeCells/mergeCells.js +322 -64
- package/plugins/mergeCells/mergeCells.mjs +322 -64
- package/plugins/moveCells/helpers.d.mts +1 -0
- package/plugins/moveCells/helpers.d.ts +21 -0
- package/plugins/moveCells/helpers.js +20 -0
- package/plugins/moveCells/helpers.mjs +15 -0
- package/plugins/moveCells/index.d.mts +1 -0
- package/plugins/moveCells/index.d.ts +1 -0
- package/plugins/moveCells/index.js +22 -0
- package/plugins/moveCells/index.mjs +1 -0
- package/plugins/moveCells/moveCells.d.mts +1 -0
- package/plugins/moveCells/moveCells.d.ts +80 -0
- package/plugins/moveCells/moveCells.js +602 -0
- package/plugins/moveCells/moveCells.mjs +587 -0
- package/plugins/multiColumnSorting/multiColumnSorting.d.ts +8 -8
- package/plugins/multiColumnSorting/multiColumnSorting.js +11 -16
- package/plugins/multiColumnSorting/multiColumnSorting.mjs +11 -16
- package/plugins/multiColumnSorting/rootComparator.js +26 -19
- package/plugins/multiColumnSorting/rootComparator.mjs +26 -19
- package/plugins/multipleSelectionHandles/multipleSelectionHandles.d.ts +19 -4
- package/plugins/multipleSelectionHandles/multipleSelectionHandles.js +273 -58
- package/plugins/multipleSelectionHandles/multipleSelectionHandles.mjs +273 -58
- package/plugins/nestedHeaders/nestedHeaders.d.ts +10 -1
- package/plugins/nestedHeaders/nestedHeaders.js +222 -23
- package/plugins/nestedHeaders/nestedHeaders.mjs +222 -23
- package/plugins/nestedHeaders/stateManager/columnArrangement.d.mts +1 -0
- package/plugins/nestedHeaders/stateManager/columnArrangement.d.ts +37 -0
- package/plugins/nestedHeaders/stateManager/columnArrangement.js +35 -0
- package/plugins/nestedHeaders/stateManager/columnArrangement.mjs +30 -0
- package/plugins/nestedHeaders/stateManager/deriveSettings.d.mts +1 -0
- package/plugins/nestedHeaders/stateManager/deriveSettings.d.ts +57 -0
- package/plugins/nestedHeaders/stateManager/deriveSettings.js +115 -0
- package/plugins/nestedHeaders/stateManager/deriveSettings.mjs +135 -0
- package/plugins/nestedHeaders/stateManager/headersTree.d.ts +14 -1
- package/plugins/nestedHeaders/stateManager/index.d.ts +76 -13
- package/plugins/nestedHeaders/stateManager/index.js +381 -38
- package/plugins/nestedHeaders/stateManager/index.mjs +382 -39
- package/plugins/nestedHeaders/stateManager/matrixGenerator.js +3 -2
- package/plugins/nestedHeaders/stateManager/matrixGenerator.mjs +3 -2
- package/plugins/nestedHeaders/stateManager/settingsNormalizer.js +5 -1
- package/plugins/nestedHeaders/stateManager/settingsNormalizer.mjs +5 -1
- package/plugins/nestedHeaders/stateManager/sourceSettings.d.ts +23 -6
- package/plugins/nestedHeaders/stateManager/sourceSettings.js +20 -4
- package/plugins/nestedHeaders/stateManager/sourceSettings.mjs +20 -4
- package/plugins/nestedHeaders/stateManager/utils.d.ts +17 -1
- package/plugins/nestedHeaders/stateManager/utils.js +6 -1
- package/plugins/nestedHeaders/stateManager/utils.mjs +6 -1
- package/plugins/nestedHeaders/utils/ghostTable.js +21 -8
- package/plugins/nestedHeaders/utils/ghostTable.mjs +21 -8
- package/plugins/nestedRows/data/dataManager.d.ts +4 -1
- package/plugins/nestedRows/data/dataManager.js +10 -4
- package/plugins/nestedRows/data/dataManager.mjs +10 -4
- package/plugins/nestedRows/nestedRows.d.ts +127 -1
- package/plugins/nestedRows/nestedRows.js +330 -8
- package/plugins/nestedRows/nestedRows.mjs +330 -8
- package/plugins/nestedRows/ui/collapsing.d.ts +58 -0
- package/plugins/nestedRows/ui/collapsing.js +236 -40
- package/plugins/nestedRows/ui/collapsing.mjs +236 -40
- package/plugins/notification/notification.d.ts +2 -1
- package/plugins/notification/notification.js +6 -3
- package/plugins/notification/notification.mjs +6 -3
- package/plugins/notification/ui.d.ts +8 -5
- package/plugins/notification/ui.js +18 -6
- package/plugins/notification/ui.mjs +18 -6
- package/plugins/pagination/pagination.js +2 -2
- package/plugins/pagination/pagination.mjs +2 -2
- package/plugins/search/search.js +23 -2
- package/plugins/search/search.mjs +23 -2
- package/plugins/selectionHandles/helpers.d.mts +1 -0
- package/plugins/selectionHandles/helpers.d.ts +17 -0
- package/plugins/selectionHandles/helpers.js +16 -0
- package/plugins/selectionHandles/helpers.mjs +11 -0
- package/plugins/selectionHandles/index.d.mts +1 -0
- package/plugins/selectionHandles/index.d.ts +1 -0
- package/plugins/selectionHandles/index.js +22 -0
- package/plugins/selectionHandles/index.mjs +1 -0
- package/plugins/selectionHandles/selectionHandles.d.mts +1 -0
- package/plugins/selectionHandles/selectionHandles.d.ts +52 -0
- package/plugins/selectionHandles/selectionHandles.js +342 -0
- package/plugins/selectionHandles/selectionHandles.mjs +323 -0
- package/plugins/trimRows/trimRows.d.ts +1 -1
- package/plugins/trimRows/trimRows.js +6 -2
- package/plugins/trimRows/trimRows.mjs +6 -2
- package/plugins/types.d.ts +4 -0
- package/plugins/undoRedo/actions/cellAlignment.js +1 -1
- package/plugins/undoRedo/actions/cellAlignment.mjs +1 -1
- package/plugins/undoRedo/actions/createColumn.js +4 -1
- package/plugins/undoRedo/actions/createColumn.mjs +4 -1
- package/plugins/undoRedo/actions/createRow.js +4 -1
- package/plugins/undoRedo/actions/createRow.mjs +4 -1
- package/plugins/undoRedo/actions/fixedCounts.d.mts +1 -0
- package/plugins/undoRedo/actions/fixedCounts.d.ts +36 -0
- package/plugins/undoRedo/actions/fixedCounts.js +63 -0
- package/plugins/undoRedo/actions/fixedCounts.mjs +62 -0
- package/plugins/undoRedo/actions/index.js +2 -0
- package/plugins/undoRedo/actions/index.mjs +2 -0
- package/plugins/undoRedo/actions/moveCells.d.mts +1 -0
- package/plugins/undoRedo/actions/moveCells.d.ts +104 -0
- package/plugins/undoRedo/actions/moveCells.js +225 -0
- package/plugins/undoRedo/actions/moveCells.mjs +227 -0
- package/plugins/undoRedo/actions/removeColumn.d.ts +18 -2
- package/plugins/undoRedo/actions/removeColumn.js +11 -4
- package/plugins/undoRedo/actions/removeColumn.mjs +12 -5
- package/plugins/undoRedo/actions/removeRow.js +2 -57
- package/plugins/undoRedo/actions/removeRow.mjs +2 -57
- package/plugins/undoRedo/undoRedo.d.ts +26 -0
- package/plugins/undoRedo/undoRedo.js +36 -2
- package/plugins/undoRedo/undoRedo.mjs +36 -2
- package/plugins/undoRedo/utils.d.ts +29 -0
- package/plugins/undoRedo/utils.js +55 -3
- package/plugins/undoRedo/utils.mjs +59 -0
- package/renderSizeProbe.d.mts +1 -0
- package/renderSizeProbe.d.ts +60 -0
- package/renderSizeProbe.js +163 -0
- package/renderSizeProbe.mjs +176 -0
- package/renderers/checkboxRenderer/checkboxRenderer.js +9 -4
- package/renderers/checkboxRenderer/checkboxRenderer.mjs +9 -4
- package/renderers/index.d.ts +3 -2
- package/renderers/index.js +8 -0
- package/renderers/index.mjs +3 -1
- package/renderers/intlDatetimeRenderer/index.d.mts +1 -0
- package/renderers/intlDatetimeRenderer/index.d.ts +1 -0
- package/renderers/intlDatetimeRenderer/index.js +22 -0
- package/renderers/intlDatetimeRenderer/index.mjs +1 -0
- package/renderers/intlDatetimeRenderer/intlDatetimeRenderer.d.mts +1 -0
- package/renderers/intlDatetimeRenderer/intlDatetimeRenderer.d.ts +26 -0
- package/renderers/intlDatetimeRenderer/intlDatetimeRenderer.js +82 -0
- package/renderers/intlDatetimeRenderer/intlDatetimeRenderer.mjs +67 -0
- package/renderers/multiSelectRenderer/multiSelectRenderer.js +2 -3
- package/renderers/multiSelectRenderer/multiSelectRenderer.mjs +2 -3
- package/renderers/multiSelectRenderer/utils/utils.d.ts +1 -1
- package/renderers/multiSelectRenderer/utils/utils.js +11 -8
- package/renderers/multiSelectRenderer/utils/utils.mjs +11 -8
- package/renderers/passwordRenderer/passwordRenderer.js +6 -1
- package/renderers/passwordRenderer/passwordRenderer.mjs +6 -1
- package/renderers/renderCell.d.mts +1 -0
- package/renderers/renderCell.d.ts +37 -0
- package/renderers/renderCell.js +43 -0
- package/renderers/renderCell.mjs +48 -0
- package/selection/highlight/types/areaLayered.d.ts +3 -1
- package/selection/highlight/types/areaLayered.js +4 -2
- package/selection/highlight/types/areaLayered.mjs +6 -2
- package/selection/highlight/types/focus.d.ts +3 -1
- package/selection/highlight/types/focus.js +3 -2
- package/selection/highlight/types/focus.mjs +5 -2
- package/selection/mouseEventHandler.js +29 -26
- package/selection/mouseEventHandler.mjs +29 -26
- package/selection/moveCells.d.mts +1 -0
- package/selection/moveCells.d.ts +15 -0
- package/selection/moveCells.js +13 -0
- package/selection/moveCells.mjs +9 -0
- package/selection/selection.d.ts +56 -2
- package/selection/selection.js +149 -5
- package/selection/selection.mjs +149 -5
- package/selection/types.d.ts +3 -0
- package/settings.d.ts +24 -3
- package/shortcuts/context.d.ts +4 -0
- package/shortcuts/context.js +16 -8
- package/shortcuts/context.mjs +20 -8
- package/shortcuts/contexts/commands/populateSelectedCellsData.js +1 -1
- package/shortcuts/contexts/commands/populateSelectedCellsData.mjs +1 -1
- package/styles/handsontable.css +504 -158
- package/styles/handsontable.min.css +4 -4
- package/styles/handsontableStyles.d.mts +2 -0
- package/styles/handsontableStyles.d.ts +2 -0
- package/styles/handsontableStyles.js +1 -1
- package/styles/handsontableStyles.mjs +1 -1
- package/styles/ht-icons-horizon.css +1 -10
- package/styles/ht-icons-horizon.min.css +4 -4
- package/styles/ht-icons-main.css +1 -10
- package/styles/ht-icons-main.min.css +4 -4
- package/styles/ht-theme-classic-no-icons.css +6 -0
- package/styles/ht-theme-classic-no-icons.min.css +4 -4
- package/styles/ht-theme-classic.css +7 -10
- package/styles/ht-theme-classic.min.css +4 -4
- package/styles/ht-theme-horizon-no-icons.css +6 -0
- package/styles/ht-theme-horizon-no-icons.min.css +4 -4
- package/styles/ht-theme-horizon.css +7 -10
- package/styles/ht-theme-horizon.min.css +4 -4
- package/styles/ht-theme-main-no-icons.css +6 -0
- package/styles/ht-theme-main-no-icons.min.css +4 -4
- package/styles/ht-theme-main.css +7 -10
- package/styles/ht-theme-main.min.css +4 -4
- package/tableView.d.ts +17 -4
- package/tableView.js +208 -42
- package/tableView.mjs +209 -43
- package/themes/engine/index.d.ts +2 -1
- package/themes/engine/index.js +3 -0
- package/themes/engine/index.mjs +1 -1
- package/themes/engine/manager.d.ts +75 -3
- package/themes/engine/manager.js +242 -6
- package/themes/engine/manager.mjs +249 -6
- package/themes/engine/utils/cssVariables.d.ts +18 -1
- package/themes/engine/utils/cssVariables.js +27 -11
- package/themes/engine/utils/cssVariables.mjs +28 -11
- package/themes/engine/utils/validation.js +7 -0
- package/themes/engine/utils/validation.mjs +7 -0
- package/themes/static/variables/helpers/iconsMap.js +1 -6
- package/themes/static/variables/helpers/iconsMap.mjs +1 -6
- package/themes/static/variables/tokens/classic.js +6 -0
- package/themes/static/variables/tokens/classic.mjs +6 -0
- package/themes/static/variables/tokens/horizon.js +6 -0
- package/themes/static/variables/tokens/horizon.mjs +6 -0
- package/themes/static/variables/tokens/main.js +6 -0
- package/themes/static/variables/tokens/main.mjs +6 -0
- package/themes/types.d.ts +1 -1
- package/translations/indexMapper.d.ts +14 -9
- package/translations/indexMapper.js +104 -43
- package/translations/indexMapper.mjs +104 -43
- package/translations/mapCollections/aggregatedCollection.js +20 -35
- package/translations/mapCollections/aggregatedCollection.mjs +20 -35
- package/translations/mapCollections/mapCollection.d.ts +10 -4
- package/translations/mapCollections/mapCollection.js +2 -2
- package/translations/mapCollections/mapCollection.mjs +2 -2
- package/translations/maps/booleanMap.d.mts +1 -0
- package/translations/maps/booleanMap.d.ts +86 -0
- package/translations/maps/booleanMap.js +300 -0
- package/translations/maps/booleanMap.mjs +308 -0
- package/translations/maps/hidingMap.d.ts +5 -2
- package/translations/maps/hidingMap.js +8 -3
- package/translations/maps/hidingMap.mjs +8 -3
- package/translations/maps/index.d.ts +5 -2
- package/translations/maps/index.js +7 -3
- package/translations/maps/index.mjs +10 -2
- package/translations/maps/indexMap.d.ts +26 -2
- package/translations/maps/indexMap.js +78 -6
- package/translations/maps/indexMap.mjs +78 -6
- package/translations/maps/indexesSequence.d.ts +53 -2
- package/translations/maps/indexesSequence.js +225 -3
- package/translations/maps/indexesSequence.mjs +233 -3
- package/translations/maps/trimmingMap.d.ts +5 -2
- package/translations/maps/trimmingMap.js +8 -3
- package/translations/maps/trimmingMap.mjs +8 -3
- package/translations/maps/utils/actionsOnIndexes.js +20 -1
- package/translations/maps/utils/actionsOnIndexes.mjs +20 -1
- package/translations/maps/utils/indexesSequence.js +12 -3
- package/translations/maps/utils/indexesSequence.mjs +12 -3
- package/translations/maps/utils/physicallyIndexed.js +12 -1
- package/translations/maps/utils/physicallyIndexed.mjs +12 -1
- package/utils/entitlementLicenseKey/classify.d.mts +1 -0
- package/utils/entitlementLicenseKey/classify.d.ts +34 -0
- package/utils/entitlementLicenseKey/classify.js +97 -0
- package/utils/entitlementLicenseKey/classify.mjs +96 -0
- package/utils/entitlementLicenseKey/constants.d.mts +1 -0
- package/utils/entitlementLicenseKey/constants.d.ts +69 -0
- package/utils/entitlementLicenseKey/constants.js +54 -0
- package/utils/entitlementLicenseKey/constants.mjs +66 -0
- package/utils/entitlementLicenseKey/detectFormat.d.mts +1 -0
- package/utils/entitlementLicenseKey/detectFormat.d.ts +23 -0
- package/utils/entitlementLicenseKey/detectFormat.js +60 -0
- package/utils/entitlementLicenseKey/detectFormat.mjs +60 -0
- package/utils/entitlementLicenseKey/encoding.d.mts +1 -0
- package/utils/entitlementLicenseKey/encoding.d.ts +58 -0
- package/utils/entitlementLicenseKey/encoding.js +161 -0
- package/utils/entitlementLicenseKey/encoding.mjs +172 -0
- package/utils/entitlementLicenseKey/extractKeyData.d.mts +1 -0
- package/utils/entitlementLicenseKey/extractKeyData.d.ts +47 -0
- package/utils/entitlementLicenseKey/extractKeyData.js +213 -0
- package/utils/entitlementLicenseKey/extractKeyData.mjs +232 -0
- package/utils/entitlementLicenseKey/grants.d.mts +1 -0
- package/utils/entitlementLicenseKey/grants.d.ts +54 -0
- package/utils/entitlementLicenseKey/grants.js +68 -0
- package/utils/entitlementLicenseKey/grants.mjs +84 -0
- package/utils/entitlementLicenseKey/index.d.mts +1 -0
- package/utils/entitlementLicenseKey/index.d.ts +8 -0
- package/utils/entitlementLicenseKey/index.js +53 -0
- package/utils/entitlementLicenseKey/index.mjs +6 -0
- package/utils/entitlementLicenseKey/sha512.d.mts +1 -0
- package/utils/entitlementLicenseKey/sha512.d.ts +11 -0
- package/utils/entitlementLicenseKey/sha512.js +328 -0
- package/utils/entitlementLicenseKey/sha512.mjs +327 -0
- package/utils/entitlementLicenseKey/types.d.mts +1 -0
- package/utils/entitlementLicenseKey/types.d.ts +84 -0
- package/utils/entitlementLicenseKey/types.js +8 -0
- package/utils/entitlementLicenseKey/types.mjs +10 -0
- package/utils/ghostTable.d.ts +1 -0
- package/utils/ghostTable.js +60 -11
- package/utils/ghostTable.mjs +60 -11
- package/utils/licenseBranding/badge.d.mts +1 -0
- package/utils/licenseBranding/badge.d.ts +21 -0
- package/utils/licenseBranding/badge.js +237 -0
- package/utils/licenseBranding/badge.mjs +244 -0
- package/utils/licenseBranding/content.d.mts +1 -0
- package/utils/licenseBranding/content.d.ts +54 -0
- package/utils/licenseBranding/content.js +93 -0
- package/utils/licenseBranding/content.mjs +79 -0
- package/utils/licenseBranding/index.d.mts +1 -0
- package/utils/licenseBranding/index.d.ts +14 -0
- package/utils/licenseBranding/index.js +55 -0
- package/utils/licenseBranding/index.mjs +56 -0
- package/utils/licenseBranding/lockScreen.d.mts +1 -0
- package/utils/licenseBranding/lockScreen.d.ts +23 -0
- package/utils/licenseBranding/lockScreen.js +150 -0
- package/utils/licenseBranding/lockScreen.mjs +159 -0
- package/utils/licenseNotification.d.ts +19 -0
- package/utils/licenseNotification.js +56 -29
- package/utils/licenseNotification.mjs +61 -29
- package/utils/movableMeta.d.mts +1 -0
- package/utils/movableMeta.d.ts +40 -0
- package/utils/movableMeta.js +47 -0
- package/utils/movableMeta.mjs +46 -0
- package/utils/parseTable.js +16 -7
- package/utils/parseTable.mjs +16 -7
- package/utils/samplesGenerator.d.ts +41 -14
- package/utils/samplesGenerator.js +114 -42
- package/utils/samplesGenerator.mjs +114 -42
- package/utils/sanitizer.d.mts +1 -0
- package/utils/sanitizer.d.ts +47 -0
- package/utils/sanitizer.js +43 -0
- package/utils/sanitizer.mjs +55 -0
- package/utils/stylesHandler.d.ts +13 -0
- package/utils/stylesHandler.js +55 -2
- package/utils/stylesHandler.mjs +55 -2
- package/validators/autocompleteValidator/autocompleteValidator.js +3 -0
- package/validators/autocompleteValidator/autocompleteValidator.mjs +3 -0
- package/validators/index.d.ts +3 -2
- package/validators/index.js +8 -0
- package/validators/index.mjs +3 -1
- package/validators/intlDatetimeValidator/index.d.mts +1 -0
- package/validators/intlDatetimeValidator/index.d.ts +1 -0
- package/validators/intlDatetimeValidator/index.js +25 -0
- package/validators/intlDatetimeValidator/index.mjs +1 -0
- package/validators/intlDatetimeValidator/intlDatetimeValidator.d.mts +1 -0
- package/validators/intlDatetimeValidator/intlDatetimeValidator.d.ts +28 -0
- package/validators/intlDatetimeValidator/intlDatetimeValidator.js +49 -0
- package/validators/intlDatetimeValidator/intlDatetimeValidator.mjs +37 -0
- package/3rdparty/walkontable/src/overlay/bottom.d.mts +0 -1
- package/3rdparty/walkontable/src/overlay/bottomInlineStartCorner.d.mts +0 -1
- package/3rdparty/walkontable/src/overlay/inlineStart.d.mts +0 -1
- package/3rdparty/walkontable/src/overlay/top.d.mts +0 -1
- package/3rdparty/walkontable/src/overlay/topInlineStartCorner.d.mts +0 -1
- package/3rdparty/walkontable/src/overlays.d.ts +0 -329
- package/3rdparty/walkontable/src/overlays.js +0 -870
- package/3rdparty/walkontable/src/overlays.mjs +0 -860
- package/3rdparty/walkontable/src/renderer/table.d.mts +0 -1
- package/3rdparty/walkontable/src/renderer/table.js +0 -229
- package/3rdparty/walkontable/src/settings.d.mts +0 -2
- package/3rdparty/walkontable/src/settings.js +0 -196
- package/3rdparty/walkontable/src/settings.mjs +0 -263
- package/3rdparty/walkontable/src/table/bottom.d.mts +0 -2
- package/3rdparty/walkontable/src/table/bottom.d.ts +0 -19
- package/3rdparty/walkontable/src/table/bottom.js +0 -38
- package/3rdparty/walkontable/src/table/bottom.mjs +0 -23
- package/3rdparty/walkontable/src/table/bottomInlineStartCorner.d.mts +0 -2
- package/3rdparty/walkontable/src/table/bottomInlineStartCorner.d.ts +0 -20
- package/3rdparty/walkontable/src/table/bottomInlineStartCorner.mjs +0 -24
- package/3rdparty/walkontable/src/table/inlineStart.d.mts +0 -2
- package/3rdparty/walkontable/src/table/inlineStart.d.ts +0 -16
- package/3rdparty/walkontable/src/table/inlineStart.js +0 -35
- package/3rdparty/walkontable/src/table/inlineStart.mjs +0 -20
- package/3rdparty/walkontable/src/table/master.d.mts +0 -2
- package/3rdparty/walkontable/src/table/mixin/calculatedColumns.d.mts +0 -2
- package/3rdparty/walkontable/src/table/mixin/calculatedColumns.d.ts +0 -75
- package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +0 -122
- package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +0 -112
- package/3rdparty/walkontable/src/table/mixin/calculatedRows.d.mts +0 -2
- package/3rdparty/walkontable/src/table/mixin/calculatedRows.d.ts +0 -75
- package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +0 -122
- package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +0 -112
- package/3rdparty/walkontable/src/table/top.d.mts +0 -2
- package/3rdparty/walkontable/src/table/top.d.ts +0 -19
- package/3rdparty/walkontable/src/table/top.js +0 -38
- package/3rdparty/walkontable/src/table/top.mjs +0 -23
- package/3rdparty/walkontable/src/table/topInlineStartCorner.d.mts +0 -2
- package/3rdparty/walkontable/src/table/topInlineStartCorner.d.ts +0 -20
- package/3rdparty/walkontable/src/table/topInlineStartCorner.mjs +0 -24
- package/3rdparty/walkontable/src/table.d.mts +0 -2
- package/3rdparty/walkontable/src/table.d.ts +0 -741
- package/3rdparty/walkontable/src/table.js +0 -1120
- package/3rdparty/walkontable/src/table.mjs +0 -1105
- package/3rdparty/walkontable/src/utils/cellCoords.d.mts +0 -1
- package/3rdparty/walkontable/src/utils/cellCoords.js +0 -54
- package/3rdparty/walkontable/src/utils/cellCoords.mjs +0 -54
- package/3rdparty/walkontable/src/utils/column.d.mts +0 -2
- package/3rdparty/walkontable/src/utils/column.js +0 -75
- package/3rdparty/walkontable/src/utils/column.mjs +0 -70
- package/3rdparty/walkontable/src/utils/positionCache.d.mts +0 -1
- package/3rdparty/walkontable/src/utils/positionCache.d.ts +0 -91
- package/3rdparty/walkontable/src/utils/positionCache.js +0 -193
- package/3rdparty/walkontable/src/utils/positionCache.mjs +0 -194
- package/3rdparty/walkontable/src/utils/row.d.mts +0 -2
- package/3rdparty/walkontable/src/utils/row.js +0 -46
- package/3rdparty/walkontable/src/utils/row.mjs +0 -41
- package/3rdparty/walkontable/src/viewport.d.ts +0 -254
- package/3rdparty/walkontable/src/viewport.js +0 -533
- package/3rdparty/walkontable/src/viewport.mjs +0 -523
- /package/3rdparty/walkontable/src/{renderer → axisSizing/positionCache}/index.d.mts +0 -0
- /package/3rdparty/walkontable/src/{overlays.d.mts → overlay/overlays.d.mts} +0 -0
- /package/3rdparty/walkontable/src/overlay/{_base.d.mts → regions/_base.d.mts} +0 -0
- /package/3rdparty/walkontable/src/{stickyScrollStrategy.d.mts → overlay/strategies/stickyScrollStrategy.d.mts} +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/_base.d.mts +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/_base.js +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/_base.mjs +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/cells.d.mts +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/cells.d.ts +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/colGroup.d.mts +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/colGroup.d.ts +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/colGroup.js +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/colGroup.mjs +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/columnHeaderRows.d.mts +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/columnHeaderRows.d.ts +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/columnHeaderRows.js +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/columnHeaderRows.mjs +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/columnHeaders.d.mts +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/rowHeaders.d.mts +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/rowHeaders.d.ts +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/rowHeaders.js +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/rowHeaders.mjs +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/rows.d.mts +0 -0
- /package/3rdparty/walkontable/src/{renderer → render}/rows.d.ts +0 -0
- /package/3rdparty/walkontable/src/{scroll.d.mts → scroll/scroll.d.mts} +0 -0
- /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyColumnsStart.d.mts +0 -0
- /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsBottom.d.mts +0 -0
- /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsBottom.js +0 -0
- /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsBottom.mjs +0 -0
- /package/3rdparty/walkontable/src/table/{mixin → rangeQuery}/stickyRowsTop.d.mts +0 -0
- /package/3rdparty/walkontable/src/{viewport.d.mts → viewport/viewport.d.mts} +0 -0
|
@@ -12,7 +12,9 @@ const _element = require("../../../../../helpers/dom/element");
|
|
|
12
12
|
const _event = require("../../../../../helpers/dom/event");
|
|
13
13
|
const _browser = require("../../../../../helpers/browser");
|
|
14
14
|
const _utils = require("./utils");
|
|
15
|
+
const _constants = require("../constants");
|
|
15
16
|
const BORDER_STYLE_CLASS_PREFIX = 'ht-border-style-';
|
|
17
|
+
const MOVE_ZONE_THICKNESS = 6;
|
|
16
18
|
const BORDER_STYLE_VERTICAL_SUFFIX = '-vertical';
|
|
17
19
|
const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
18
20
|
/**
|
|
@@ -24,6 +26,11 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
24
26
|
const documentBody = this.wot.rootDocument.body;
|
|
25
27
|
this.eventManager.addEventListener(documentBody, 'mousedown', ()=>this.onMouseDown());
|
|
26
28
|
this.eventManager.addEventListener(documentBody, 'mouseup', ()=>this.onMouseUp());
|
|
29
|
+
// Only the five border divs created by `createBorders` are present at this point, which is
|
|
30
|
+
// exactly the set that wants the fragment-selection hide-on-enter behavior. The lazily created
|
|
31
|
+
// `selectionHandles`/`moveCells` elements must NOT get it — `onMouseEnter` restores with an
|
|
32
|
+
// unconditional `display = 'block'`, which would un-hide a handle the visibility predicate
|
|
33
|
+
// wants hidden. Their own listeners are attached in their `create*` methods instead.
|
|
27
34
|
if (this.main) {
|
|
28
35
|
for(let c = 0, len = this.main.childNodes.length; c < len; c++){
|
|
29
36
|
const mainNode = this.main;
|
|
@@ -59,7 +66,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
59
66
|
event.preventDefault();
|
|
60
67
|
(0, _event.stopImmediatePropagation)(event);
|
|
61
68
|
const documentBody = this.wot.rootDocument.body;
|
|
62
|
-
const bounds =
|
|
69
|
+
const bounds = this.wot.domBindings.geometryReader.getBoundingClientRect(parentElement);
|
|
63
70
|
// Hide border to prevents selection jumping when fragmentSelection is enabled.
|
|
64
71
|
parentElement.style.display = 'none';
|
|
65
72
|
/**
|
|
@@ -107,6 +114,13 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
107
114
|
style.position = 'absolute';
|
|
108
115
|
style.top = '0';
|
|
109
116
|
style.left = '0';
|
|
117
|
+
// Custom borders can overlap (e.g. two configured ranges sharing a cell). Each EDGE is stacked by
|
|
118
|
+
// its own width so overlapping ranges paint deterministically - the thicker (more emphasized) edge
|
|
119
|
+
// consistently sits on top. Stacking per edge, not per whole border, keeps a single visual line
|
|
120
|
+
// uniform where it crosses a shared cell (that cell's merged border mixes a thin and a thick side).
|
|
121
|
+
// The `main` wrapper must NOT carry a z-index, or it would create a stacking context and trap each
|
|
122
|
+
// edge's z-index inside its own border instead of ordering edges across overlapping borders.
|
|
123
|
+
const isCustomBorder = settings.selectionType === _constants.CUSTOM_SELECTION_TYPE;
|
|
110
124
|
const createdDivs = [];
|
|
111
125
|
for(let i = 0; i < 5; i++){
|
|
112
126
|
const position = borderDivs[i];
|
|
@@ -137,6 +151,9 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
137
151
|
}
|
|
138
152
|
style.height = `${getSettingsProperty('width')}px`;
|
|
139
153
|
style.width = `${getSettingsProperty('width')}px`;
|
|
154
|
+
if (isCustomBorder) {
|
|
155
|
+
style.zIndex = `${getSettingsProperty('width') ?? 1}`;
|
|
156
|
+
}
|
|
140
157
|
createdDivs.push(div);
|
|
141
158
|
this.main.appendChild(div);
|
|
142
159
|
}
|
|
@@ -158,9 +175,13 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
158
175
|
this.cornerDefaultStyle.borderStyle,
|
|
159
176
|
this.cornerDefaultStyle.borderColor
|
|
160
177
|
].join(' ');
|
|
161
|
-
if ((0, _browser.isMobileBrowser)() && this.
|
|
178
|
+
if ((0, _browser.isMobileBrowser)() && this.wot.getSetting('isDataViewInstance')) {
|
|
162
179
|
this.createMultipleSelectorHandles();
|
|
163
180
|
}
|
|
181
|
+
// The `selectionHandles` and `moveCells` elements are created lazily, on the first `appear()`
|
|
182
|
+
// whose visibility predicate resolves truthy. Creating them here would add 8 divs and their
|
|
183
|
+
// listeners to every border of every highlight in every overlay, for every instance — including
|
|
184
|
+
// the majority that leave both options off. See `appear()`.
|
|
164
185
|
this.disappear();
|
|
165
186
|
const { wtTable } = this.wot;
|
|
166
187
|
let bordersHolder = wtTable.bordersHolder;
|
|
@@ -223,6 +244,153 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
223
244
|
handleStyleTarget.background = `color-mix(in srgb, ${cellMobileHandleBackgroundColor} ${cellMobileHandleBackgroundOpacity}%, transparent)`;
|
|
224
245
|
handleStyleTarget.border = `${cellMobileHandleBorderWidth}px solid ${cellMobileHandleBorderColor}`;
|
|
225
246
|
}
|
|
247
|
+
this.main.appendChild(this.selectionHandles.top);
|
|
248
|
+
this.main.appendChild(this.selectionHandles.bottom);
|
|
249
|
+
this.main.appendChild(this.selectionHandles.topHitArea);
|
|
250
|
+
this.main.appendChild(this.selectionHandles.bottomHitArea);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Creates the four edge-adjustment handle elements used by the `selectionHandles` feature.
|
|
254
|
+
* Visual styling (size, background, border, border-radius, cursor, z-index) is driven entirely
|
|
255
|
+
* by CSS via the `--ht-cell-selection-handle-*` tokens defined in the theme stylesheets.
|
|
256
|
+
* JS sets only `display:none` (initial hidden state) and the positioning `top`/`left` values
|
|
257
|
+
* during `positionAdjustHandles`. Class names (`wtSelectionHandle--<edge>`) carry orientation.
|
|
258
|
+
*
|
|
259
|
+
* Called lazily from `appear()` on the first draw whose `adjustHandlesVisible` predicate resolves
|
|
260
|
+
* truthy, so the elements never exist for instances that leave `selectionHandles` off. Because
|
|
261
|
+
* `registerListeners` has already run by then, each handle attaches its own `mousedown` listener
|
|
262
|
+
* here.
|
|
263
|
+
*
|
|
264
|
+
* @returns {AdjustHandles} The created handle set, so the caller can use it without a null check.
|
|
265
|
+
*/ createAdjustHandles() {
|
|
266
|
+
const { rootDocument } = this.wot;
|
|
267
|
+
const make = (edge)=>{
|
|
268
|
+
const el = rootDocument.createElement('div');
|
|
269
|
+
el.className = `wtSelectionHandle wtSelectionHandle--${edge}`;
|
|
270
|
+
el.style.display = 'none';
|
|
271
|
+
this.main.appendChild(el);
|
|
272
|
+
this.eventManager.addEventListener(el, 'mousedown', (event)=>{
|
|
273
|
+
// A right-press must fall through to the context menu without starting a resize drag.
|
|
274
|
+
if ((0, _event.isRightClick)(event)) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
(0, _event.stopImmediatePropagation)(event);
|
|
278
|
+
event.preventDefault();
|
|
279
|
+
this.wot.getSetting('onSelectionHandleMouseDown', event, edge);
|
|
280
|
+
});
|
|
281
|
+
return el;
|
|
282
|
+
};
|
|
283
|
+
const top = make('top');
|
|
284
|
+
const bottom = make('bottom');
|
|
285
|
+
const start = make('start');
|
|
286
|
+
const end = make('end');
|
|
287
|
+
this.adjustHandles = {
|
|
288
|
+
top,
|
|
289
|
+
bottom,
|
|
290
|
+
start,
|
|
291
|
+
end,
|
|
292
|
+
styles: {
|
|
293
|
+
top: top.style,
|
|
294
|
+
bottom: bottom.style,
|
|
295
|
+
start: start.style,
|
|
296
|
+
end: end.style
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
return this.adjustHandles;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Creates the four edge move-zone band elements. Each band is a thin overlay div positioned along
|
|
303
|
+
* one selection edge. Hovering a band shows a `grab` cursor; a `mousedown` on a band calls the
|
|
304
|
+
* `onSelectionEdgeMouseDown` Walkontable setting so the core can initiate a move drag.
|
|
305
|
+
*
|
|
306
|
+
* Bands sit at z-index 100 — below the resize pills (z-index 115) and below the autofill fill
|
|
307
|
+
* handle (`.wtBorder.corner`, z-index 110), so both keep winning their own pixels in the corner
|
|
308
|
+
* regions where the bands overlap them. All four bands are created hidden; `positionMoveZone`
|
|
309
|
+
* + `appear` control their visibility.
|
|
310
|
+
*
|
|
311
|
+
* Called lazily from `appear()` on the first draw whose `moveEnabled` predicate resolves truthy,
|
|
312
|
+
* so the bands never exist for instances that leave `moveCells` off.
|
|
313
|
+
*
|
|
314
|
+
* @private
|
|
315
|
+
*/ createMoveZone() {
|
|
316
|
+
const { rootDocument } = this.wot;
|
|
317
|
+
const make = (edge)=>{
|
|
318
|
+
const el = rootDocument.createElement('div');
|
|
319
|
+
el.className = 'wtMoveZone';
|
|
320
|
+
el.style.position = 'absolute';
|
|
321
|
+
el.style.display = 'none';
|
|
322
|
+
el.style.zIndex = '100';
|
|
323
|
+
el.style.pointerEvents = 'auto';
|
|
324
|
+
el.style.cursor = 'grab';
|
|
325
|
+
this.main.appendChild(el);
|
|
326
|
+
this.eventManager.addEventListener(el, 'mousedown', (event)=>{
|
|
327
|
+
// A right-press must fall through to the context menu without starting a move drag.
|
|
328
|
+
if ((0, _event.isRightClick)(event)) {
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
(0, _event.stopImmediatePropagation)(event);
|
|
332
|
+
event.preventDefault();
|
|
333
|
+
this.wot.getSetting('onSelectionEdgeMouseDown', event, edge);
|
|
334
|
+
});
|
|
335
|
+
return el;
|
|
336
|
+
};
|
|
337
|
+
const top = make('top');
|
|
338
|
+
const bottom = make('bottom');
|
|
339
|
+
const start = make('start');
|
|
340
|
+
const end = make('end');
|
|
341
|
+
this.moveZone = {
|
|
342
|
+
top,
|
|
343
|
+
bottom,
|
|
344
|
+
start,
|
|
345
|
+
end,
|
|
346
|
+
styles: {
|
|
347
|
+
top: top.style,
|
|
348
|
+
bottom: bottom.style,
|
|
349
|
+
start: start.style,
|
|
350
|
+
end: end.style
|
|
351
|
+
}
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Positions the four move-zone bands along the selection edges. Each band is `MOVE_ZONE_THICKNESS`
|
|
356
|
+
* pixels tall (or wide for the vertical bands) and centered on its respective edge line. RTL layout
|
|
357
|
+
* is handled by using `right` instead of `left` for the inline axis, mirroring `positionAdjustHandles`.
|
|
358
|
+
*
|
|
359
|
+
* @private
|
|
360
|
+
* @param {number} top The selection border top (px, container-relative).
|
|
361
|
+
* @param {number} inlineStart The selection border inline-start (px, container-relative).
|
|
362
|
+
* @param {number} width The selection border width (px).
|
|
363
|
+
* @param {number} height The selection border height (px).
|
|
364
|
+
*/ positionMoveZone(top, inlineStart, width, height) {
|
|
365
|
+
const isRtl = this.wot.wtSettings.getSetting('rtlMode');
|
|
366
|
+
const inlineProp = isRtl ? 'right' : 'left';
|
|
367
|
+
// Only ever called from `appear()` after the bands have been created.
|
|
368
|
+
const s = this.moveZone.styles;
|
|
369
|
+
const half = Math.floor(MOVE_ZONE_THICKNESS / 2);
|
|
370
|
+
// Top band — full width, centered on the top edge.
|
|
371
|
+
s.top[inlineProp] = `${inlineStart}px`;
|
|
372
|
+
s.top.top = `${top - half}px`;
|
|
373
|
+
s.top.width = `${width}px`;
|
|
374
|
+
s.top.height = `${MOVE_ZONE_THICKNESS}px`;
|
|
375
|
+
s.top.display = 'block';
|
|
376
|
+
// Bottom band — full width, centered on the bottom edge.
|
|
377
|
+
s.bottom[inlineProp] = `${inlineStart}px`;
|
|
378
|
+
s.bottom.top = `${top + height - half}px`;
|
|
379
|
+
s.bottom.width = `${width}px`;
|
|
380
|
+
s.bottom.height = `${MOVE_ZONE_THICKNESS}px`;
|
|
381
|
+
s.bottom.display = 'block';
|
|
382
|
+
// Start band — full height, centered on the inline-start edge.
|
|
383
|
+
s.start[inlineProp] = `${inlineStart - half}px`;
|
|
384
|
+
s.start.top = `${top}px`;
|
|
385
|
+
s.start.width = `${MOVE_ZONE_THICKNESS}px`;
|
|
386
|
+
s.start.height = `${height}px`;
|
|
387
|
+
s.start.display = 'block';
|
|
388
|
+
// End band — full height, centered on the inline-end edge.
|
|
389
|
+
s.end[inlineProp] = `${inlineStart + width - half}px`;
|
|
390
|
+
s.end.top = `${top}px`;
|
|
391
|
+
s.end.width = `${MOVE_ZONE_THICKNESS}px`;
|
|
392
|
+
s.end.height = `${height}px`;
|
|
393
|
+
s.end.display = 'block';
|
|
226
394
|
}
|
|
227
395
|
/**
|
|
228
396
|
* Checks if the given coordinates are south-east of the area selection. If `true` then
|
|
@@ -298,20 +466,512 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
298
466
|
}
|
|
299
467
|
}
|
|
300
468
|
/**
|
|
469
|
+
* Tells whether a selection edge lands exactly on a frozen-pane boundary and is therefore owned by
|
|
470
|
+
* the frozen overlay. Depends only on the fixed-pane settings and the raw corner, so every overlay
|
|
471
|
+
* evaluates it on identical inputs.
|
|
472
|
+
*
|
|
473
|
+
* @private
|
|
474
|
+
* @param {'row'|'column'} axis The freeze axis to test (`row` → `fixedRowsTop`, `column` → `fixedColumnsStart`).
|
|
475
|
+
* @param {number} fromIndex The selection's top (`row`) or inline-start (`column`) corner index.
|
|
476
|
+
* @returns {boolean}
|
|
477
|
+
*/ isFrozenBoundaryEdge(axis, fromIndex) {
|
|
478
|
+
if (axis === 'row') {
|
|
479
|
+
const fixedRowsTop = this.wot.getSetting('fixedRowsTop');
|
|
480
|
+
return fixedRowsTop > 0 && fromIndex === fixedRowsTop;
|
|
481
|
+
}
|
|
482
|
+
const fixedColumnsStart = this.wot.getSetting('fixedColumnsStart');
|
|
483
|
+
return fixedColumnsStart > 0 && fromIndex === fixedColumnsStart;
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Tells whether a selection's bottom or end edge lands immediately before a top or start frozen pane.
|
|
487
|
+
*
|
|
488
|
+
* @private
|
|
489
|
+
* @param {'row'|'column'} axis The freeze axis to test.
|
|
490
|
+
* @param {number} toIndex The selection's bottom (`row`) or inline-end (`column`) corner index.
|
|
491
|
+
* @returns {boolean}
|
|
492
|
+
*/ isFrozenStartBoundaryOppositeEdge(axis, toIndex) {
|
|
493
|
+
if (axis === 'row') {
|
|
494
|
+
const fixedRowsTop = this.wot.getSetting('fixedRowsTop');
|
|
495
|
+
return fixedRowsTop > 0 && toIndex === fixedRowsTop - 1;
|
|
496
|
+
}
|
|
497
|
+
const fixedColumnsStart = this.wot.getSetting('fixedColumnsStart');
|
|
498
|
+
return fixedColumnsStart > 0 && toIndex === fixedColumnsStart - 1;
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Tells whether the selection's boundary corner (the cell flush with a frozen-pane line) has
|
|
502
|
+
* scrolled behind the frozen pane in the master viewport. The frozen overlay can't detect this
|
|
503
|
+
* itself (its rendered range is sticky), so we consult the scroll-aware master and stop drawing the
|
|
504
|
+
* edge once the cell is occluded by the pane.
|
|
505
|
+
*
|
|
506
|
+
* @private
|
|
507
|
+
* @param {'row'|'column'} axis The freeze axis to test (`row` → vertical, `column` → horizontal).
|
|
508
|
+
* @param {number} fromIndex The selection's boundary corner index on that axis.
|
|
509
|
+
* @returns {boolean} `true` when the boundary corner is scrolled out (edge must not be drawn).
|
|
510
|
+
*/ isBoundaryCornerScrolledOut(axis, fromIndex) {
|
|
511
|
+
const masterTable = this.wot.cloneSource?.wtTable;
|
|
512
|
+
if (!masterTable) {
|
|
513
|
+
return false;
|
|
514
|
+
}
|
|
515
|
+
const firstVisible = axis === 'row' ? masterTable.getFirstVisibleRow() : masterTable.getFirstVisibleColumn();
|
|
516
|
+
return firstVisible >= 0 && fromIndex < firstVisible;
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Mirror of {@link Border#isFrozenBoundaryEdge} for the bottom freeze line: tells whether the
|
|
520
|
+
* selection's bottom edge lands exactly on the `fixedRowsBottom` boundary (the line between the last
|
|
521
|
+
* non-frozen row and the first bottom-frozen row), and is therefore owned by the bottom overlay.
|
|
522
|
+
*
|
|
523
|
+
* @private
|
|
524
|
+
* @param {number} toIndex The selection's bottom corner row index.
|
|
525
|
+
* @returns {boolean}
|
|
526
|
+
*/ isFrozenBottomBoundaryEdge(toIndex) {
|
|
527
|
+
const fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');
|
|
528
|
+
const totalRows = this.wot.getSetting('totalRows');
|
|
529
|
+
return fixedRowsBottom > 0 && toIndex === totalRows - fixedRowsBottom - 1;
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Mirror of {@link Border#isFrozenStartBoundaryOppositeEdge} for the bottom freeze line: tells
|
|
533
|
+
* whether the selection's top edge lands exactly on the `fixedRowsBottom` boundary (the selection
|
|
534
|
+
* starts at the first bottom-frozen row), so the top handle sits on the freeze line and must be
|
|
535
|
+
* suppressed there like every other frozen-seam edge.
|
|
536
|
+
*
|
|
537
|
+
* @private
|
|
538
|
+
* @param {number} fromIndex The selection's top corner row index.
|
|
539
|
+
* @returns {boolean}
|
|
540
|
+
*/ isFrozenBottomBoundaryOppositeEdge(fromIndex) {
|
|
541
|
+
const fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');
|
|
542
|
+
const totalRows = this.wot.getSetting('totalRows');
|
|
543
|
+
return fixedRowsBottom > 0 && fromIndex === totalRows - fixedRowsBottom;
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* Mirror of {@link Border#isBoundaryCornerScrolledOut} for the bottom freeze line: tells whether the
|
|
547
|
+
* selection's bottom boundary cell has scrolled behind the bottom frozen pane in the master viewport
|
|
548
|
+
* (it then drops below the last visible master row), so the edge must not be drawn.
|
|
549
|
+
*
|
|
550
|
+
* @private
|
|
551
|
+
* @param {number} toIndex The selection's bottom boundary corner row index.
|
|
552
|
+
* @returns {boolean} `true` when the boundary corner is scrolled out (edge must not be drawn).
|
|
553
|
+
*/ isBottomBoundaryCornerScrolledOut(toIndex) {
|
|
554
|
+
const masterTable = this.wot.cloneSource?.wtTable;
|
|
555
|
+
if (!masterTable) {
|
|
556
|
+
return false;
|
|
557
|
+
}
|
|
558
|
+
const lastVisible = masterTable.getLastVisibleRow();
|
|
559
|
+
return lastVisible >= 0 && toIndex > lastVisible;
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Draws the selection-border edge(s) that lie exactly on a frozen-pane boundary, where the master
|
|
563
|
+
* renders them on the freeze line under the occluding frozen overlay. Re-draws each such edge
|
|
564
|
+
* inside the frozen overlay(s) that own it (clamped to each overlay's rendered range), while
|
|
565
|
+
* `appear` hides the matching master edge so exactly one line is drawn per segment.
|
|
566
|
+
*
|
|
567
|
+
* @param {number[]} corners The selection corners `[fromRow, fromColumn, toRow, toColumn]`.
|
|
568
|
+
* @returns {boolean} `true` when a boundary edge was drawn (regular drawing should be skipped).
|
|
569
|
+
*/ drawFrozenBoundaryEdge(corners) {
|
|
570
|
+
const { wtTable } = this.wot;
|
|
571
|
+
const overlayName = wtTable.name;
|
|
572
|
+
const isTopOverlay = overlayName === 'top';
|
|
573
|
+
const isInlineStartOverlay = overlayName === 'inline_start';
|
|
574
|
+
const isCornerOverlay = overlayName === 'top_inline_start_corner';
|
|
575
|
+
const isBottomOverlay = overlayName === 'bottom';
|
|
576
|
+
const isBottomCornerOverlay = overlayName === 'bottom_inline_start_corner';
|
|
577
|
+
if (!isTopOverlay && !isInlineStartOverlay && !isCornerOverlay && !isBottomOverlay && !isBottomCornerOverlay) {
|
|
578
|
+
return false;
|
|
579
|
+
}
|
|
580
|
+
// In RTL the horizontal axis is mirrored: edges are anchored with `right`, like the regular flow
|
|
581
|
+
// in `appear`. Row-freeze (vertical) geometry is direction-agnostic.
|
|
582
|
+
const isRtl = this.wot.wtSettings.getSetting('rtlMode');
|
|
583
|
+
const [fromRow, fromColumn, toRow, toColumn] = corners;
|
|
584
|
+
const borderWidth = this.settings.border?.width ?? 0;
|
|
585
|
+
// Along-axis length extension mirroring `appear`'s `ceil(borderWidth / 2)`, so corners meet.
|
|
586
|
+
// Without it the line falls short of the master's side edges for borders thicker than 1px.
|
|
587
|
+
const delta = Math.ceil(borderWidth / 2);
|
|
588
|
+
// `rowEdgeOwned`/`columnEdgeOwned` are true when the selection's top/start edge lands on the
|
|
589
|
+
// freeze line AND its boundary cell is still visible. Resolved once and reused by every branch
|
|
590
|
+
// below.
|
|
591
|
+
const rowEdgeOwned = this.isFrozenBoundaryEdge('row', fromRow) && !this.isBoundaryCornerScrolledOut('row', fromRow);
|
|
592
|
+
const columnEdgeOwned = this.isFrozenBoundaryEdge('column', fromColumn) && !this.isBoundaryCornerScrolledOut('column', fromColumn);
|
|
593
|
+
// The bottom-freeze counterpart of `rowEdgeOwned`: the selection's bottom edge lands on the
|
|
594
|
+
// `fixedRowsBottom` line and its boundary cell is still visible in the master.
|
|
595
|
+
const bottomRowEdgeOwned = this.isFrozenBottomBoundaryEdge(toRow) && !this.isBottomBoundaryCornerScrolledOut(toRow);
|
|
596
|
+
// The row-freeze edge straddles the freeze line: the master draws its lower half (below the seam)
|
|
597
|
+
// and the frozen overlay its upper half (above the seam, on top of the opaque pane), so together
|
|
598
|
+
// they show the full thickness in both selection and edit modes. Split between the `top` overlay
|
|
599
|
+
// (non-frozen columns) and the corner overlay (frozen columns), each clamped to its rendered range.
|
|
600
|
+
if (rowEdgeOwned && (isTopOverlay || isCornerOverlay)) {
|
|
601
|
+
const firstColumn = Math.max(fromColumn, wtTable.getFirstRenderedColumn());
|
|
602
|
+
const lastColumn = Math.min(toColumn, wtTable.getLastRenderedColumn());
|
|
603
|
+
if (this.drawRowFreezeEdge(firstColumn, lastColumn, isRtl, delta)) {
|
|
604
|
+
return true;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
// The column-freeze edge is split between the `inline_start` overlay (non-frozen rows) and the
|
|
608
|
+
// top/bottom corner overlays (top-frozen / bottom-frozen rows), each clamped to its own rendered
|
|
609
|
+
// row range so together they cover the edge without overlap. Mirror of the row-freeze branch on
|
|
610
|
+
// the column axis. Without the bottom corner the slice that reaches down into the bottom-frozen
|
|
611
|
+
// rows would be occluded by that overlay and left undrawn.
|
|
612
|
+
if (columnEdgeOwned && (isInlineStartOverlay || isCornerOverlay || isBottomCornerOverlay)) {
|
|
613
|
+
const firstRow = Math.max(fromRow, wtTable.getFirstRenderedRow());
|
|
614
|
+
const lastRow = Math.min(toRow, wtTable.getLastRenderedRow());
|
|
615
|
+
if (this.drawColumnFreezeEdge(firstRow, lastRow, isRtl, delta)) {
|
|
616
|
+
return true;
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
// The bottom-freeze edge is split between the `bottom` overlay (non-frozen columns) and the bottom
|
|
620
|
+
// corner overlay (frozen columns), mirroring the row-freeze branch on the bottom axis. The bottom
|
|
621
|
+
// overlay occludes the master's edge on the freeze line, so re-draw it here.
|
|
622
|
+
if (bottomRowEdgeOwned && (isBottomOverlay || isBottomCornerOverlay)) {
|
|
623
|
+
const firstColumn = Math.max(fromColumn, wtTable.getFirstRenderedColumn());
|
|
624
|
+
const lastColumn = Math.min(toColumn, wtTable.getLastRenderedColumn());
|
|
625
|
+
if (this.drawRowFreezeBottomEdge(firstColumn, lastColumn, isRtl, delta)) {
|
|
626
|
+
return true;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
// When the corner lands on BOTH freeze lines, the top and start edges meet in the frozen×frozen
|
|
630
|
+
// square owned by the corner overlay, which occludes both their tips and leaves a gap. Draw that
|
|
631
|
+
// connecting square here to close it.
|
|
632
|
+
if (isCornerOverlay && rowEdgeOwned && columnEdgeOwned) {
|
|
633
|
+
if (this.drawFrozenBoundaryCorner(isRtl, borderWidth)) {
|
|
634
|
+
return true;
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
// Bottom mirror of the branch above: when the corner lands on BOTH the bottom and column freeze
|
|
638
|
+
// lines, the bottom and start edges meet in the bottom corner overlay's frozen×frozen square,
|
|
639
|
+
// which occludes their tips. Draw that connecting square here to close the gap.
|
|
640
|
+
if (isBottomCornerOverlay && bottomRowEdgeOwned && columnEdgeOwned) {
|
|
641
|
+
if (this.drawFrozenBottomBoundaryCorner(isRtl, borderWidth)) {
|
|
642
|
+
return true;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
return false;
|
|
646
|
+
}
|
|
647
|
+
/**
|
|
648
|
+
* Shared inline-axis writer for the row/bottom freeze edges. Given the boundary cells and an
|
|
649
|
+
* already-resolved vertical position, writes the horizontal anchor + width (RTL-aware) on the
|
|
650
|
+
* supplied border element and reveals it. The top and bottom freeze edges differ only in which
|
|
651
|
+
* gridline they sit on and which element they reuse, so they delegate the identical inline math
|
|
652
|
+
* here. Cheap range/cell-lookup guards run before any reflow-forcing `geometryReader.offset()`, so non-drawing
|
|
653
|
+
* calls leave the styles untouched.
|
|
654
|
+
*
|
|
655
|
+
* @private
|
|
656
|
+
* @param {number} boundaryRow The row whose edge carries the freeze line.
|
|
657
|
+
* @param {CSSStyleDeclaration} style The border element to position (`topStyle` or `bottomStyle`).
|
|
658
|
+
* @param {number} firstColumn The first column index to span (clamped to the overlay).
|
|
659
|
+
* @param {number} lastColumn The last column index to span (clamped to the overlay).
|
|
660
|
+
* @param {boolean} isRtl Whether the grid is rendered right-to-left.
|
|
661
|
+
* @param {number} delta The along-axis length extension (`ceil(borderWidth / 2)`).
|
|
662
|
+
* @param {Function} resolveTop Resolves the edge's `top` (px) from the boundary cell and offsets.
|
|
663
|
+
* @returns {boolean} `true` when the edge was drawn.
|
|
664
|
+
*/ drawHorizontalFreezeEdge(boundaryRow, style, firstColumn, lastColumn, isRtl, delta, resolveTop) {
|
|
665
|
+
const { geometryReader } = this.wot.domBindings;
|
|
666
|
+
if (lastColumn < firstColumn) {
|
|
667
|
+
return false;
|
|
668
|
+
}
|
|
669
|
+
const { wtTable } = this.wot;
|
|
670
|
+
const boundaryTD = wtTable.getCell(this.wot.createCellCoords(boundaryRow, firstColumn));
|
|
671
|
+
const boundaryEndTD = wtTable.getCell(this.wot.createCellCoords(boundaryRow, lastColumn));
|
|
672
|
+
if (!(0, _element.isHTMLElement)(boundaryTD) || !(0, _element.isHTMLElement)(boundaryEndTD)) {
|
|
673
|
+
return false;
|
|
674
|
+
}
|
|
675
|
+
const containerOffset = geometryReader.offset(wtTable.TABLE);
|
|
676
|
+
const boundaryOffset = geometryReader.offset(boundaryTD);
|
|
677
|
+
const endOffset = geometryReader.offset(boundaryEndTD);
|
|
678
|
+
// The `-1` overlaps the border shared with the previous column, mirroring `appear`. At column 0
|
|
679
|
+
// there is no previous column, so drop the shift and shorten the line to avoid protruding past
|
|
680
|
+
// the pane edge.
|
|
681
|
+
const startShift = firstColumn === 0 ? 0 : 1;
|
|
682
|
+
this.disappear();
|
|
683
|
+
style.top = `${resolveTop(boundaryTD, boundaryOffset, containerOffset.top)}px`;
|
|
684
|
+
if (isRtl) {
|
|
685
|
+
// `firstColumn` (lowest index) is the visual-right cell, `lastColumn` the visual-left one.
|
|
686
|
+
const spanRightX = boundaryOffset.left + geometryReader.outerWidth(boundaryTD);
|
|
687
|
+
const tableRightX = containerOffset.left + geometryReader.outerWidth(wtTable.TABLE);
|
|
688
|
+
style.right = `${tableRightX - spanRightX - startShift}px`;
|
|
689
|
+
style.width = `${spanRightX - endOffset.left + delta - (1 - startShift)}px`;
|
|
690
|
+
} else {
|
|
691
|
+
style.left = `${boundaryOffset.left - containerOffset.left - startShift}px`;
|
|
692
|
+
const edgeWidth = endOffset.left + geometryReader.outerWidth(boundaryEndTD) - boundaryOffset.left + delta - (1 - startShift);
|
|
693
|
+
style.width = `${edgeWidth}px`;
|
|
694
|
+
}
|
|
695
|
+
style.display = 'block';
|
|
696
|
+
return true;
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* Draws the selection's top edge on the row freeze line across the given (clamped) column span,
|
|
700
|
+
* anchored one pixel inside the freeze line by a constant so borders of different widths line up.
|
|
701
|
+
*
|
|
702
|
+
* @private
|
|
703
|
+
* @param {number} firstColumn The first column index to span (clamped to the overlay).
|
|
704
|
+
* @param {number} lastColumn The last column index to span (clamped to the overlay).
|
|
705
|
+
* @param {boolean} isRtl Whether the grid is rendered right-to-left.
|
|
706
|
+
* @param {number} delta The along-axis length extension (`ceil(borderWidth / 2)`).
|
|
707
|
+
* @returns {boolean} `true` when the edge was drawn.
|
|
708
|
+
*/ drawRowFreezeEdge(firstColumn, lastColumn, isRtl, delta) {
|
|
709
|
+
const boundaryRow = this.wot.getSetting('fixedRowsTop') - 1;
|
|
710
|
+
// The seam sits on the boundary cell's BOTTOM edge, one pixel up to overlap the shared gridline.
|
|
711
|
+
return this.drawHorizontalFreezeEdge(boundaryRow, this.topStyle, firstColumn, lastColumn, isRtl, delta, (boundaryTD, boundaryOffset, containerTop)=>boundaryOffset.top + this.wot.domBindings.geometryReader.outerHeight(boundaryTD) - containerTop - 1);
|
|
712
|
+
}
|
|
713
|
+
/**
|
|
714
|
+
* Mirror of {@link Border#drawRowFreezeEdge} for the bottom freeze line: draws the selection's
|
|
715
|
+
* bottom edge on the `fixedRowsBottom` line across the given (clamped) column span. The boundary
|
|
716
|
+
* cell is the FIRST bottom-frozen row, and the freeze line is its TOP edge (= bottom of the last
|
|
717
|
+
* non-frozen row). Uses the `bottom` border element.
|
|
718
|
+
*
|
|
719
|
+
* @private
|
|
720
|
+
* @param {number} firstColumn The first column index to span (clamped to the overlay).
|
|
721
|
+
* @param {number} lastColumn The last column index to span (clamped to the overlay).
|
|
722
|
+
* @param {boolean} isRtl Whether the grid is rendered right-to-left.
|
|
723
|
+
* @param {number} delta The along-axis length extension (`ceil(borderWidth / 2)`).
|
|
724
|
+
* @returns {boolean} `true` when the edge was drawn.
|
|
725
|
+
*/ drawRowFreezeBottomEdge(firstColumn, lastColumn, isRtl, delta) {
|
|
726
|
+
const fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');
|
|
727
|
+
const totalRows = this.wot.getSetting('totalRows');
|
|
728
|
+
const boundaryRow = totalRows - fixedRowsBottom;
|
|
729
|
+
// The freeze line is the boundary cell's TOP edge; position like `appear`'s bottom border
|
|
730
|
+
// (`cellBottom - thickness + delta`, where `cellBottom` is the freeze line) so borders of
|
|
731
|
+
// different widths stay aligned on the gridline.
|
|
732
|
+
return this.drawHorizontalFreezeEdge(boundaryRow, this.bottomStyle, firstColumn, lastColumn, isRtl, delta, (_boundaryTD, boundaryOffset, containerTop)=>boundaryOffset.top - containerTop - parseInt(this.bottomStyle.height, 10) + delta);
|
|
733
|
+
}
|
|
734
|
+
/**
|
|
735
|
+
* Draws the selection's inline-start edge on the column freeze line across the given (clamped) row
|
|
736
|
+
* span, anchored one pixel inside the freeze line by a constant so borders of different widths line
|
|
737
|
+
* up. Guard/reflow behavior mirrors `drawRowFreezeEdge`.
|
|
738
|
+
*
|
|
739
|
+
* @private
|
|
740
|
+
* @param {number} firstRow The first row index to span (clamped to the overlay).
|
|
741
|
+
* @param {number} lastRow The last row index to span (clamped to the overlay).
|
|
742
|
+
* @param {boolean} isRtl Whether the grid is rendered right-to-left.
|
|
743
|
+
* @param {number} delta The along-axis length extension (`ceil(borderWidth / 2)`).
|
|
744
|
+
* @returns {boolean} `true` when the edge was drawn.
|
|
745
|
+
*/ drawColumnFreezeEdge(firstRow, lastRow, isRtl, delta) {
|
|
746
|
+
if (lastRow < firstRow) {
|
|
747
|
+
return false;
|
|
748
|
+
}
|
|
749
|
+
const { geometryReader } = this.wot.domBindings;
|
|
750
|
+
const { wtTable } = this.wot;
|
|
751
|
+
const boundaryColumn = this.wot.getSetting('fixedColumnsStart') - 1;
|
|
752
|
+
const boundaryTD = wtTable.getCell(this.wot.createCellCoords(firstRow, boundaryColumn));
|
|
753
|
+
const boundaryEndTD = wtTable.getCell(this.wot.createCellCoords(lastRow, boundaryColumn));
|
|
754
|
+
if (!(0, _element.isHTMLElement)(boundaryTD) || !(0, _element.isHTMLElement)(boundaryEndTD)) {
|
|
755
|
+
return false;
|
|
756
|
+
}
|
|
757
|
+
const containerOffset = geometryReader.offset(wtTable.TABLE);
|
|
758
|
+
const boundaryOffset = geometryReader.offset(boundaryTD);
|
|
759
|
+
const endOffset = geometryReader.offset(boundaryEndTD);
|
|
760
|
+
// The `-1` overlaps the border shared with the row above, like `appear`. At row 0 there is no row
|
|
761
|
+
// above, so drop the shift and shorten the line to avoid protruding past the pane top.
|
|
762
|
+
const atFirstRow = firstRow === 0;
|
|
763
|
+
let edgeTop = boundaryOffset.top - containerOffset.top - 1;
|
|
764
|
+
let edgeHeight = endOffset.top + geometryReader.outerHeight(boundaryEndTD) - boundaryOffset.top + delta;
|
|
765
|
+
if (atFirstRow) {
|
|
766
|
+
edgeTop += 1;
|
|
767
|
+
edgeHeight = Math.max(edgeHeight - 1, 0);
|
|
768
|
+
}
|
|
769
|
+
this.disappear();
|
|
770
|
+
this.startStyle.top = `${edgeTop}px`;
|
|
771
|
+
if (isRtl) {
|
|
772
|
+
// RTL: the frozen pane sits on the right, so the freeze line is the boundary cell's LEFT edge,
|
|
773
|
+
// and the edge is drawn one pixel inside it (to the right) via the `right` anchor.
|
|
774
|
+
const tableRightX = containerOffset.left + geometryReader.outerWidth(wtTable.TABLE);
|
|
775
|
+
this.startStyle.right = `${tableRightX - boundaryOffset.left - 1}px`;
|
|
776
|
+
} else {
|
|
777
|
+
const freezeLineX = boundaryOffset.left + geometryReader.outerWidth(boundaryTD);
|
|
778
|
+
this.startStyle.left = `${freezeLineX - containerOffset.left - 1}px`;
|
|
779
|
+
}
|
|
780
|
+
this.startStyle.height = `${edgeHeight}px`;
|
|
781
|
+
this.startStyle.display = 'block';
|
|
782
|
+
return true;
|
|
783
|
+
}
|
|
784
|
+
/**
|
|
785
|
+
* Shared writer for the freeze-corner squares. Draws the `borderWidth`-sized square bridging a
|
|
786
|
+
* row/bottom edge and the inline-start edge where a selection corner lands on both freeze lines,
|
|
787
|
+
* since that square sits in the corner overlay's frozen×frozen region that occludes both edges'
|
|
788
|
+
* tips. Anchored one pixel inside the freeze column; the caller resolves the vertical position and
|
|
789
|
+
* the border element to reuse. Reflow/guard behavior mirrors the freeze-edge helpers.
|
|
790
|
+
*
|
|
791
|
+
* @private
|
|
792
|
+
* @param {number} boundaryRow The row whose edge carries the freeze line.
|
|
793
|
+
* @param {CSSStyleDeclaration} style The border element to position (`topStyle` or `bottomStyle`).
|
|
794
|
+
* @param {boolean} isRtl Whether the grid is rendered right-to-left.
|
|
795
|
+
* @param {number} borderWidth The configured border width in pixels.
|
|
796
|
+
* @param {Function} resolveTop Resolves the square's `top` (px) from the boundary cell and offsets.
|
|
797
|
+
* @returns {boolean} `true` when the corner square was drawn.
|
|
798
|
+
*/ drawFreezeCorner(boundaryRow, style, isRtl, borderWidth, resolveTop) {
|
|
799
|
+
const { geometryReader } = this.wot.domBindings;
|
|
800
|
+
const { wtTable } = this.wot;
|
|
801
|
+
const boundaryColumn = this.wot.getSetting('fixedColumnsStart') - 1;
|
|
802
|
+
const boundaryTD = wtTable.getCell(this.wot.createCellCoords(boundaryRow, boundaryColumn));
|
|
803
|
+
if (!(0, _element.isHTMLElement)(boundaryTD)) {
|
|
804
|
+
return false;
|
|
805
|
+
}
|
|
806
|
+
const containerOffset = geometryReader.offset(wtTable.TABLE);
|
|
807
|
+
const boundaryOffset = geometryReader.offset(boundaryTD);
|
|
808
|
+
this.disappear();
|
|
809
|
+
style.top = `${resolveTop(boundaryTD, boundaryOffset, containerOffset.top)}px`;
|
|
810
|
+
style.height = `${borderWidth}px`;
|
|
811
|
+
style.width = `${borderWidth}px`;
|
|
812
|
+
if (isRtl) {
|
|
813
|
+
// RTL: the frozen pane is on the right, so the freeze line is the boundary cell's LEFT edge;
|
|
814
|
+
// the square sits one pixel inside it (to the right) via the `right` anchor.
|
|
815
|
+
const tableRightX = containerOffset.left + geometryReader.outerWidth(wtTable.TABLE);
|
|
816
|
+
style.right = `${tableRightX - boundaryOffset.left - 1}px`;
|
|
817
|
+
} else {
|
|
818
|
+
const freezeLineX = boundaryOffset.left + geometryReader.outerWidth(boundaryTD);
|
|
819
|
+
style.left = `${freezeLineX - containerOffset.left - 1}px`;
|
|
820
|
+
}
|
|
821
|
+
style.display = 'block';
|
|
822
|
+
return true;
|
|
823
|
+
}
|
|
824
|
+
/**
|
|
825
|
+
* Draws the corner square bridging the top and inline-start edges where a selection corner lands on
|
|
826
|
+
* both the `fixedRowsTop` and `fixedColumnsStart` freeze lines. Reuses the `top` border element.
|
|
827
|
+
*
|
|
828
|
+
* @private
|
|
829
|
+
* @param {boolean} isRtl Whether the grid is rendered right-to-left.
|
|
830
|
+
* @param {number} borderWidth The configured border width in pixels.
|
|
831
|
+
* @returns {boolean} `true` when the corner square was drawn.
|
|
832
|
+
*/ drawFrozenBoundaryCorner(isRtl, borderWidth) {
|
|
833
|
+
const boundaryRow = this.wot.getSetting('fixedRowsTop') - 1;
|
|
834
|
+
// The square sits on the boundary cell's BOTTOM edge (the top freeze line), one pixel up.
|
|
835
|
+
return this.drawFreezeCorner(boundaryRow, this.topStyle, isRtl, borderWidth, (boundaryTD, boundaryOffset, containerTop)=>boundaryOffset.top + this.wot.domBindings.geometryReader.outerHeight(boundaryTD) - containerTop - 1);
|
|
836
|
+
}
|
|
837
|
+
/**
|
|
838
|
+
* Bottom mirror of {@link Border#drawFrozenBoundaryCorner}: draws the corner square bridging the
|
|
839
|
+
* bottom and inline-start edges where a selection corner lands on both the `fixedRowsBottom` and
|
|
840
|
+
* `fixedColumnsStart` freeze lines. The boundary cell is the FIRST bottom-frozen row and the bottom
|
|
841
|
+
* freeze line is its TOP edge. Reuses the `bottom` border element.
|
|
842
|
+
*
|
|
843
|
+
* @private
|
|
844
|
+
* @param {boolean} isRtl Whether the grid is rendered right-to-left.
|
|
845
|
+
* @param {number} borderWidth The configured border width in pixels.
|
|
846
|
+
* @returns {boolean} `true` when the corner square was drawn.
|
|
847
|
+
*/ drawFrozenBottomBoundaryCorner(isRtl, borderWidth) {
|
|
848
|
+
const fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');
|
|
849
|
+
const totalRows = this.wot.getSetting('totalRows');
|
|
850
|
+
const boundaryRow = totalRows - fixedRowsBottom;
|
|
851
|
+
const delta = Math.ceil(borderWidth / 2);
|
|
852
|
+
// Align with the bottom edge's vertical position (`cellBottom - thickness + delta`, where
|
|
853
|
+
// `cellBottom` is the freeze line = the boundary cell's TOP edge) so it joins seamlessly.
|
|
854
|
+
return this.drawFreezeCorner(boundaryRow, this.bottomStyle, isRtl, borderWidth, (_boundaryTD, boundaryOffset, containerTop)=>boundaryOffset.top - containerTop - borderWidth + delta);
|
|
855
|
+
}
|
|
856
|
+
/**
|
|
857
|
+
* Resolves the position the fill handle's overflow checks measure from, in the same space as the
|
|
858
|
+
* trimming container they compare against: viewport coordinates when the window trims the grid,
|
|
859
|
+
* otherwise the offset inside the scrollable content.
|
|
860
|
+
*
|
|
861
|
+
* A cell's own `offsetLeft`/`offsetTop` are relative to the `<table>`, and the master shifts that
|
|
862
|
+
* table through the spreader by the frozen-pane size and by the first rendered column/row offset.
|
|
863
|
+
* That shift is missing from the cell offsets, so the handle could measure as "inside" while it
|
|
864
|
+
* protruded past the content edge and forced a spurious scrollbar. The hider spans the whole
|
|
865
|
+
* scrollable content, so measuring from it puts the shift back.
|
|
866
|
+
*
|
|
867
|
+
* @private
|
|
868
|
+
* @param {HTMLElement} TD The cell that carries the fill handle (the selection's bottom-end cell).
|
|
869
|
+
* @param {{ top: number, left: number }} TDOffset The cell's already-measured document offset.
|
|
870
|
+
* @param {boolean} trimToWindow Whether the grid is trimmed by the window rather than an element.
|
|
871
|
+
* @returns {{ top: number, left: number }}
|
|
872
|
+
*/ getFillHandleAnchor(TD, TDOffset, trimToWindow) {
|
|
873
|
+
const { geometryReader } = this.wot.domBindings;
|
|
874
|
+
if (trimToWindow) {
|
|
875
|
+
const { top, left } = geometryReader.getBoundingClientRect(TD);
|
|
876
|
+
return {
|
|
877
|
+
top,
|
|
878
|
+
left
|
|
879
|
+
};
|
|
880
|
+
}
|
|
881
|
+
const hiderOffset = geometryReader.offset(this.wot.wtTable.hider);
|
|
882
|
+
return {
|
|
883
|
+
top: TDOffset.top - hiderOffset.top,
|
|
884
|
+
left: TDOffset.left - hiderOffset.left
|
|
885
|
+
};
|
|
886
|
+
}
|
|
887
|
+
/**
|
|
888
|
+
* Tells whether the fill handle must be pulled back inside the selection's inline-end edge instead
|
|
889
|
+
* of straddling it. Only the grid's last column needs that, where the overhang would spill out of
|
|
890
|
+
* the trimming container and force a scrollbar. A selection ending on the last frozen-start column
|
|
891
|
+
* does not: the frozen overlay draws that handle itself and already lands it flush against its own
|
|
892
|
+
* edge, which `border.spec.js` pins to the pixel — lifting it there moves it off that line.
|
|
893
|
+
*
|
|
894
|
+
* @private
|
|
895
|
+
* @param {number} toColumn The selection's inline-end column index.
|
|
896
|
+
* @param {number} anchorInlineStart The fill handle anchor's inline-start offset.
|
|
897
|
+
* @param {HTMLElement} TD The cell that carries the fill handle.
|
|
898
|
+
* @param {HTMLElement | Window} trimmingContainer The container that clips the grid.
|
|
899
|
+
* @param {boolean} isRtl Whether the grid renders right-to-left.
|
|
900
|
+
* @returns {boolean}
|
|
901
|
+
*/ isCornerLiftedAtInlineEnd(toColumn, anchorInlineStart, TD, trimmingContainer, isRtl) {
|
|
902
|
+
if (toColumn !== this.wot.getSetting('totalColumns') - 1) {
|
|
903
|
+
return false;
|
|
904
|
+
}
|
|
905
|
+
const { geometryReader } = this.wot.domBindings;
|
|
906
|
+
const cornerHalfWidth = parseInt(String(this.cornerDefaultStyle.width), 10) / 2;
|
|
907
|
+
if (isRtl) {
|
|
908
|
+
return anchorInlineStart - cornerHalfWidth < 0;
|
|
909
|
+
}
|
|
910
|
+
return anchorInlineStart + geometryReader.outerWidth(TD) + cornerHalfWidth >= geometryReader.innerWidth(trimmingContainer);
|
|
911
|
+
}
|
|
912
|
+
/**
|
|
913
|
+
* Block-axis mirror of {@link Border#isCornerLiftedAtInlineEnd}. Two rows pull the fill handle back
|
|
914
|
+
* inside the selection's bottom edge: the grid's last row, where the overhang would spill out of
|
|
915
|
+
* the trimming container, and the last scrollable row above the `fixedRowsBottom` line, where the
|
|
916
|
+
* bottom overlay is painted above the master and would cover the overhang. The last frozen-top row
|
|
917
|
+
* is not one of them — like the frozen-start column, that handle is drawn by the overlay itself and
|
|
918
|
+
* already sits flush against its edge.
|
|
919
|
+
*
|
|
920
|
+
* @private
|
|
921
|
+
* @param {number} toRow The selection's bottom row index.
|
|
922
|
+
* @param {number} anchorTop The fill handle anchor's top offset.
|
|
923
|
+
* @param {HTMLElement} TD The cell that carries the fill handle.
|
|
924
|
+
* @param {HTMLElement | Window} trimmingContainer The container that clips the grid.
|
|
925
|
+
* @returns {boolean}
|
|
926
|
+
*/ isCornerLiftedAtBlockEnd(toRow, anchorTop, TD, trimmingContainer) {
|
|
927
|
+
if (this.isFrozenBottomBoundaryEdge(toRow)) {
|
|
928
|
+
return true;
|
|
929
|
+
}
|
|
930
|
+
if (toRow !== this.wot.getSetting('totalRows') - 1) {
|
|
931
|
+
return false;
|
|
932
|
+
}
|
|
933
|
+
const { geometryReader } = this.wot.domBindings;
|
|
934
|
+
const cornerHalfHeight = parseInt(String(this.cornerDefaultStyle.height), 10) / 2;
|
|
935
|
+
return anchorTop + geometryReader.outerHeight(TD) + cornerHalfHeight >= geometryReader.innerHeight(trimmingContainer);
|
|
936
|
+
}
|
|
937
|
+
/**
|
|
301
938
|
* Show border around one or many cells.
|
|
302
939
|
*
|
|
940
|
+
* The fill handle is normally centered on the selection's bottom-end corner, so half of it hangs
|
|
941
|
+
* past that corner. Where that overhang cannot survive — a container edge, or a frozen pane that
|
|
942
|
+
* clips or covers it — the handle is pulled back inside instead, and `wtCornerInlineEndEdge` /
|
|
943
|
+
* `wtCornerBlockEndEdge` pull its hit area along. See {@link Border#isCornerLiftedAtInlineEnd} and
|
|
944
|
+
* {@link Border#isCornerLiftedAtBlockEnd} for which edges those are.
|
|
945
|
+
*
|
|
303
946
|
* @param {Array} corners The corner coordinates.
|
|
304
947
|
*/ appear(corners) {
|
|
305
948
|
if (this.disabled) {
|
|
306
949
|
return;
|
|
307
950
|
}
|
|
951
|
+
// A selection flush against a frozen-pane boundary has its top/inline-start edge rendered by the
|
|
952
|
+
// master on the freeze line, where the frozen overlay occludes it. Re-draw it inside the frozen
|
|
953
|
+
// overlay so it stays visible; no-op unless `fixedRowsTop`/`fixedColumnsStart` is used.
|
|
954
|
+
//
|
|
955
|
+
// When it draws, we return early and intentionally skip the rest of `appear` (corner/fill handle,
|
|
956
|
+
// the other edges): in these overlays the selection's cell isn't rendered here — only the seam
|
|
957
|
+
// edge slice is — so there is nothing else to draw.
|
|
958
|
+
if (this.drawFrozenBoundaryEdge(corners)) {
|
|
959
|
+
return;
|
|
960
|
+
}
|
|
308
961
|
let [fromRow, fromColumn, toRow, toColumn] = corners;
|
|
962
|
+
// Capture the top-start corner before the clamping below mutates it — used to suppress the
|
|
963
|
+
// master's boundary edge (so it isn't doubled by the frozen overlay's edge).
|
|
964
|
+
const originalFromRow = fromRow;
|
|
965
|
+
const originalFromColumn = fromColumn;
|
|
966
|
+
const originalToRow = toRow;
|
|
967
|
+
const originalToColumn = toColumn;
|
|
309
968
|
// borders can not be rendered on headers so hide them
|
|
310
969
|
if (fromRow < 0 && toRow < 0 || fromColumn < 0 && toColumn < 0) {
|
|
311
970
|
this.disappear();
|
|
312
971
|
return;
|
|
313
972
|
}
|
|
314
973
|
const { wtTable, rootDocument, rootWindow } = this.wot;
|
|
974
|
+
const { geometryReader } = this.wot.domBindings;
|
|
315
975
|
const isMultiple = fromRow !== toRow || fromColumn !== toColumn;
|
|
316
976
|
const firstRenderedRow = wtTable.getFirstRenderedRow();
|
|
317
977
|
const lastRenderedRow = wtTable.getLastRenderedRow();
|
|
@@ -347,22 +1007,22 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
347
1007
|
const toTD = isMultiple ? wtTable.getCell(this.wot.createCellCoords(toRow, toColumn)) : fromTD;
|
|
348
1008
|
const fromTDEl = fromTD;
|
|
349
1009
|
const toTDEl = (0, _element.isHTMLElement)(toTD) ? toTD : fromTDEl;
|
|
350
|
-
const fromOffset =
|
|
351
|
-
const toOffset = isMultiple ?
|
|
352
|
-
const containerOffset =
|
|
1010
|
+
const fromOffset = geometryReader.offset(fromTDEl);
|
|
1011
|
+
const toOffset = isMultiple ? geometryReader.offset(toTDEl) : fromOffset;
|
|
1012
|
+
const containerOffset = geometryReader.offset(wtTable.TABLE);
|
|
353
1013
|
const minTop = fromOffset.top;
|
|
354
1014
|
const minLeft = fromOffset.left;
|
|
355
1015
|
const isRtl = this.wot.wtSettings.getSetting('rtlMode');
|
|
356
1016
|
let inlineStartPos = 0;
|
|
357
1017
|
let width = 0;
|
|
358
1018
|
if (isRtl) {
|
|
359
|
-
const containerWidth =
|
|
360
|
-
const fromWidth =
|
|
1019
|
+
const containerWidth = geometryReader.outerWidth(wtTable.TABLE);
|
|
1020
|
+
const fromWidth = geometryReader.outerWidth(fromTDEl);
|
|
361
1021
|
const gridRightPos = rootWindow.innerWidth - containerOffset.left - containerWidth;
|
|
362
1022
|
width = minLeft + fromWidth - toOffset.left;
|
|
363
1023
|
inlineStartPos = rootWindow.innerWidth - minLeft - fromWidth - gridRightPos - 1;
|
|
364
1024
|
} else {
|
|
365
|
-
width = toOffset.left +
|
|
1025
|
+
width = toOffset.left + geometryReader.outerWidth(toTDEl) - minLeft;
|
|
366
1026
|
inlineStartPos = minLeft - containerOffset.left - 1;
|
|
367
1027
|
}
|
|
368
1028
|
if (this.isEntireColumnSelected(fromRow, toRow)) {
|
|
@@ -377,7 +1037,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
377
1037
|
}
|
|
378
1038
|
}
|
|
379
1039
|
let top = minTop - containerOffset.top - 1;
|
|
380
|
-
let height = toOffset.top +
|
|
1040
|
+
let height = toOffset.top + geometryReader.outerHeight(toTDEl) - minTop;
|
|
381
1041
|
if (this.isEntireRowSelected(fromColumn, toColumn)) {
|
|
382
1042
|
const columnHeader = fromColumn;
|
|
383
1043
|
const modifiedValues = this.getDimensionsFromHeader('rows', fromRow, toRow, columnHeader, containerOffset);
|
|
@@ -389,7 +1049,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
389
1049
|
fromTD = fromTH;
|
|
390
1050
|
}
|
|
391
1051
|
}
|
|
392
|
-
const style =
|
|
1052
|
+
const style = geometryReader.getComputedStyle(fromTDEl);
|
|
393
1053
|
if (parseInt(style.borderTopWidth, 10) > 0) {
|
|
394
1054
|
top += 1;
|
|
395
1055
|
height = height > 0 ? height - 1 : 0;
|
|
@@ -399,23 +1059,70 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
399
1059
|
width = width > 0 ? width - 1 : 0;
|
|
400
1060
|
}
|
|
401
1061
|
const inlinePosProperty = isRtl ? 'right' : 'left';
|
|
402
|
-
|
|
1062
|
+
// Corner geometry is resolved per edge rather than from a single `settings.border.width` delta,
|
|
1063
|
+
// which misaligns edges whose own width differs from the border-object default - e.g. a cell
|
|
1064
|
+
// shared by two overlapping custom-border ranges of different widths. Two distinct roles:
|
|
1065
|
+
// - POSITION offset (bottom `top`, end inline-start) uses the edge's OWN half-thickness, so a
|
|
1066
|
+
// straight run of same-width edges stays level across a shared cell.
|
|
1067
|
+
// - LENGTH extension (so a corner is filled) uses the PERPENDICULAR edge's half-thickness - the
|
|
1068
|
+
// edge it meets at that corner - so the horizontal line reaches, but does not overshoot, the
|
|
1069
|
+
// vertical one. Using its own half-thickness would make a thick edge stick out past a thinner
|
|
1070
|
+
// perpendicular edge.
|
|
1071
|
+
// For uniform-width borders every per-edge delta equals the old shared delta, so regular
|
|
1072
|
+
// selections are unaffected.
|
|
1073
|
+
// A corner is only filled when the perpendicular edge is actually drawn there. A horizontal edge
|
|
1074
|
+
// extends toward the end corner only if this cell has a visible end edge, and toward the bottom
|
|
1075
|
+
// only if it has a visible bottom edge. Without this, a per-cell custom border whose end/bottom
|
|
1076
|
+
// side is hidden (an interior or split-range edge) would still extend into the empty neighbour and
|
|
1077
|
+
// stick out. For regular selections the side settings are absent, so `!undefined?.hide` is `true`
|
|
1078
|
+
// and the extension behaves exactly as before.
|
|
1079
|
+
const extendToEnd = !this.settings.end?.hide;
|
|
1080
|
+
const extendToBottom = !this.settings.bottom?.hide;
|
|
1081
|
+
const bottomThickness = parseInt(this.bottomStyle.height, 10);
|
|
1082
|
+
const endThickness = parseInt(this.endStyle.width, 10);
|
|
1083
|
+
const bottomDelta = Math.ceil(bottomThickness / 2);
|
|
1084
|
+
const endDelta = Math.ceil(endThickness / 2);
|
|
1085
|
+
const horizontalExtension = extendToEnd ? endDelta : 0;
|
|
1086
|
+
const verticalExtension = extendToBottom ? bottomDelta : 0;
|
|
403
1087
|
this.topStyle.top = `${top}px`;
|
|
404
1088
|
this.topStyle[inlinePosProperty] = `${inlineStartPos}px`;
|
|
405
|
-
this.topStyle.width = `${width +
|
|
1089
|
+
this.topStyle.width = `${width + horizontalExtension}px`;
|
|
406
1090
|
this.topStyle.display = 'block';
|
|
407
1091
|
this.startStyle.top = `${top}px`;
|
|
408
1092
|
this.startStyle[inlinePosProperty] = `${inlineStartPos}px`;
|
|
409
|
-
this.startStyle.height = `${height +
|
|
1093
|
+
this.startStyle.height = `${height + verticalExtension}px`;
|
|
410
1094
|
this.startStyle.display = 'block';
|
|
411
|
-
this.bottomStyle.top = `${top + height -
|
|
1095
|
+
this.bottomStyle.top = `${top + height - bottomThickness + bottomDelta}px`;
|
|
412
1096
|
this.bottomStyle[inlinePosProperty] = `${inlineStartPos}px`;
|
|
413
|
-
this.bottomStyle.width = `${width +
|
|
1097
|
+
this.bottomStyle.width = `${width + horizontalExtension}px`;
|
|
414
1098
|
this.bottomStyle.display = 'block';
|
|
415
1099
|
this.endStyle.top = `${top}px`;
|
|
416
|
-
this.endStyle[inlinePosProperty] = `${inlineStartPos + width -
|
|
417
|
-
this.endStyle.height = `${height +
|
|
1100
|
+
this.endStyle[inlinePosProperty] = `${inlineStartPos + width - endThickness + endDelta}px`;
|
|
1101
|
+
this.endStyle.height = `${height + verticalExtension}px`;
|
|
418
1102
|
this.endStyle.display = 'block';
|
|
1103
|
+
// A boundary edge owned by the frozen overlay must be hidden on every other overlay that would
|
|
1104
|
+
// redraw it in its regular flow, so the lines don't stack into a doubled border. The row-freeze
|
|
1105
|
+
// edge is hidden on the master and `inline_start`; the column-freeze edge on the master and `top`.
|
|
1106
|
+
const overlayName = wtTable.name;
|
|
1107
|
+
// The master keeps drawing the seam top edge (its straddling lower half stays visible below the
|
|
1108
|
+
// frozen pane / editor); the frozen overlay adds the upper half on top of the pane. Only hide the
|
|
1109
|
+
// master when the whole selection is in frozen columns (then the inline-start pane occludes it and
|
|
1110
|
+
// the corner overlay owns the edge). `inline_start` always hides its row-edge duplicate.
|
|
1111
|
+
const seamAllFrozenCols = originalToColumn < this.wot.getSetting('fixedColumnsStart');
|
|
1112
|
+
if (this.isFrozenBoundaryEdge('row', originalFromRow) && (overlayName === 'inline_start' || wtTable.isMaster && seamAllFrozenCols)) {
|
|
1113
|
+
this.topStyle.display = 'none';
|
|
1114
|
+
}
|
|
1115
|
+
if (this.isFrozenBoundaryEdge('column', originalFromColumn) && (wtTable.isMaster || overlayName === 'top' || overlayName === 'bottom')) {
|
|
1116
|
+
this.startStyle.display = 'none';
|
|
1117
|
+
}
|
|
1118
|
+
// The bottom-freeze edge straddles its seam: the master draws the half above the freeze line and
|
|
1119
|
+
// the `bottom` overlay the half below it (on top of the opaque bottom pane), so together they show
|
|
1120
|
+
// the full thickness in both selection and edit modes. Hide the master only when the whole
|
|
1121
|
+
// selection is in frozen columns (then the inline-start pane occludes it and the bottom corner owns
|
|
1122
|
+
// the edge); `inline_start` always hides its duplicate.
|
|
1123
|
+
if (this.isFrozenBottomBoundaryEdge(originalToRow) && (overlayName === 'inline_start' || wtTable.isMaster && seamAllFrozenCols)) {
|
|
1124
|
+
this.bottomStyle.display = 'none';
|
|
1125
|
+
}
|
|
419
1126
|
let cornerVisibleSetting = this.settings.border?.cornerVisible;
|
|
420
1127
|
cornerVisibleSetting = typeof cornerVisibleSetting === 'function' ? cornerVisibleSetting(this.settings.layerLevel) : cornerVisibleSetting;
|
|
421
1128
|
const hookResult = this.wot.getSetting('onModifyGetCellCoords', toRow, toColumn, false, 'render');
|
|
@@ -449,43 +1156,68 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
449
1156
|
const cornerBorderCompensation = parseInt(String(this.cornerDefaultStyle.borderWidth), 10) - 1;
|
|
450
1157
|
const cornerHalfWidth = Math.ceil(parseInt(String(this.cornerDefaultStyle.width), 10) / 2);
|
|
451
1158
|
const cornerHalfHeight = Math.ceil(parseInt(String(this.cornerDefaultStyle.height), 10) / 2);
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
cornerOverlappingContainer = cornerEdge < 0;
|
|
459
|
-
} else {
|
|
460
|
-
cornerEdge = toTdOffsetLeft + (0, _element.outerWidth)(toTDEl) + parseInt(String(this.cornerDefaultStyle.width), 10) / 2;
|
|
461
|
-
cornerOverlappingContainer = cornerEdge >= (0, _element.innerWidth)(trimmingContainer);
|
|
462
|
-
}
|
|
463
|
-
if (cornerOverlappingContainer) {
|
|
464
|
-
const inlineStartPosition = Math.floor(inlineStartPos + width + this.cornerCenterPointOffset - cornerHalfWidth - cornerBorderCompensation);
|
|
465
|
-
(0, _element.addClass)(this.corner, 'wtCornerInlineEndEdge');
|
|
466
|
-
this.cornerStyle[inlinePosProperty] = `${inlineStartPosition - 1}px`;
|
|
467
|
-
}
|
|
1159
|
+
const fillHandleAnchor = this.getFillHandleAnchor(toTDEl, toOffset, trimToWindow);
|
|
1160
|
+
const liftsAtInlineEnd = this.isCornerLiftedAtInlineEnd(toColumn, fillHandleAnchor.left, toTDEl, trimmingContainer, isRtl);
|
|
1161
|
+
if (liftsAtInlineEnd) {
|
|
1162
|
+
const inlineStartPosition = Math.floor(inlineStartPos + width + this.cornerCenterPointOffset - cornerHalfWidth - cornerBorderCompensation);
|
|
1163
|
+
(0, _element.addClass)(this.corner, 'wtCornerInlineEndEdge');
|
|
1164
|
+
this.cornerStyle[inlinePosProperty] = `${inlineStartPosition - 1}px`;
|
|
468
1165
|
} else {
|
|
469
1166
|
(0, _element.removeClass)(this.corner, 'wtCornerInlineEndEdge');
|
|
470
1167
|
}
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
const
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
if (cornerOverlappingContainer) {
|
|
477
|
-
const cornerTopPosition = Math.floor(top + height + this.cornerCenterPointOffset - cornerHalfHeight - cornerBorderCompensation);
|
|
478
|
-
(0, _element.addClass)(this.corner, 'wtCornerBlockEndEdge');
|
|
479
|
-
this.cornerStyle.top = `${cornerTopPosition - 1}px`;
|
|
480
|
-
}
|
|
1168
|
+
const liftsAtBlockEnd = this.isCornerLiftedAtBlockEnd(toRow, fillHandleAnchor.top, toTDEl, trimmingContainer);
|
|
1169
|
+
if (liftsAtBlockEnd) {
|
|
1170
|
+
const cornerTopPosition = Math.floor(top + height + this.cornerCenterPointOffset - cornerHalfHeight - cornerBorderCompensation);
|
|
1171
|
+
(0, _element.addClass)(this.corner, 'wtCornerBlockEndEdge');
|
|
1172
|
+
this.cornerStyle.top = `${cornerTopPosition - 1}px`;
|
|
481
1173
|
} else {
|
|
482
1174
|
(0, _element.removeClass)(this.corner, 'wtCornerBlockEndEdge');
|
|
483
1175
|
}
|
|
484
1176
|
this.cornerStyle.display = 'block';
|
|
485
1177
|
}
|
|
486
|
-
if ((0, _browser.isMobileBrowser)() && this.
|
|
1178
|
+
if ((0, _browser.isMobileBrowser)() && this.wot.getSetting('isDataViewInstance')) {
|
|
487
1179
|
this.updateMultipleSelectionHandlesPosition(toRow, toColumn, top, inlineStartPos, width, height);
|
|
488
1180
|
}
|
|
1181
|
+
let adjustVisible = this.settings.border?.adjustHandlesVisible;
|
|
1182
|
+
adjustVisible = typeof adjustVisible === 'function' ? adjustVisible(this.settings.layerLevel) : adjustVisible;
|
|
1183
|
+
if (!(0, _browser.isMobileBrowser)() && adjustVisible && this.wot.getSetting('isDataViewInstance')) {
|
|
1184
|
+
const adjustHandles = this.adjustHandles ?? this.createAdjustHandles();
|
|
1185
|
+
this.positionAdjustHandles(top, inlineStartPos, width, height, corners);
|
|
1186
|
+
// Hide handles on an edge that lands on a frozen-pane line. This boundary rule is
|
|
1187
|
+
// intentionally Walkontable-local: Walkontable cannot import core helpers, so the
|
|
1188
|
+
// matching core-side check was removed as dead code — this is the single
|
|
1189
|
+
// authoritative enforcement point.
|
|
1190
|
+
if (this.isFrozenBoundaryEdge('row', corners[0]) || this.isFrozenBottomBoundaryOppositeEdge(corners[0])) {
|
|
1191
|
+
adjustHandles.styles.top.display = 'none';
|
|
1192
|
+
}
|
|
1193
|
+
if (this.isFrozenBoundaryEdge('column', corners[1])) {
|
|
1194
|
+
adjustHandles.styles.start.display = 'none';
|
|
1195
|
+
}
|
|
1196
|
+
if (this.isFrozenStartBoundaryOppositeEdge('row', corners[2]) || this.isFrozenBottomBoundaryEdge(corners[2])) {
|
|
1197
|
+
adjustHandles.styles.bottom.display = 'none';
|
|
1198
|
+
}
|
|
1199
|
+
if (this.isFrozenStartBoundaryOppositeEdge('column', corners[3])) {
|
|
1200
|
+
adjustHandles.styles.end.display = 'none';
|
|
1201
|
+
}
|
|
1202
|
+
} else if (this.adjustHandles) {
|
|
1203
|
+
this.adjustHandles.styles.top.display = 'none';
|
|
1204
|
+
this.adjustHandles.styles.bottom.display = 'none';
|
|
1205
|
+
this.adjustHandles.styles.start.display = 'none';
|
|
1206
|
+
this.adjustHandles.styles.end.display = 'none';
|
|
1207
|
+
}
|
|
1208
|
+
let moveEnabled = this.settings.border?.moveEnabled;
|
|
1209
|
+
moveEnabled = typeof moveEnabled === 'function' ? moveEnabled(this.settings.layerLevel) : moveEnabled;
|
|
1210
|
+
if (!(0, _browser.isMobileBrowser)() && moveEnabled && this.wot.getSetting('isDataViewInstance')) {
|
|
1211
|
+
if (!this.moveZone) {
|
|
1212
|
+
this.createMoveZone();
|
|
1213
|
+
}
|
|
1214
|
+
this.positionMoveZone(top, inlineStartPos, width, height);
|
|
1215
|
+
} else if (this.moveZone) {
|
|
1216
|
+
this.moveZone.styles.top.display = 'none';
|
|
1217
|
+
this.moveZone.styles.bottom.display = 'none';
|
|
1218
|
+
this.moveZone.styles.start.display = 'none';
|
|
1219
|
+
this.moveZone.styles.end.display = 'none';
|
|
1220
|
+
}
|
|
489
1221
|
}
|
|
490
1222
|
/**
|
|
491
1223
|
* Check whether an entire column of cells is selected.
|
|
@@ -518,6 +1250,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
518
1250
|
* @param {number} containerOffset Offset of the container.
|
|
519
1251
|
* @returns {Array|boolean} Returns an array of [headerElement, left, width] or [headerElement, top, height], depending on `direction` (`false` in case of an error getting the headers).
|
|
520
1252
|
*/ getDimensionsFromHeader(direction, fromIndex, toIndex, headerIndex, containerOffset) {
|
|
1253
|
+
const { geometryReader } = this.wot.domBindings;
|
|
521
1254
|
const { wtTable } = this.wot;
|
|
522
1255
|
const rootHotElement = wtTable.wtRootElement.parentNode;
|
|
523
1256
|
let getHeaderFn = null;
|
|
@@ -531,13 +1264,13 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
531
1264
|
switch(direction){
|
|
532
1265
|
case 'rows':
|
|
533
1266
|
getHeaderFn = (...args)=>wtTable.getRowHeader(args[0], args[1]);
|
|
534
|
-
dimensionFn = (el)=>
|
|
1267
|
+
dimensionFn = (el)=>geometryReader.outerHeight(el);
|
|
535
1268
|
entireSelectionClassname = 'ht__selection--rows';
|
|
536
1269
|
dimensionProperty = 'top';
|
|
537
1270
|
break;
|
|
538
1271
|
case 'columns':
|
|
539
1272
|
getHeaderFn = (...args)=>wtTable.getColumnHeader(args[0], args[1]);
|
|
540
|
-
dimensionFn = (el)=>
|
|
1273
|
+
dimensionFn = (el)=>geometryReader.outerWidth(el);
|
|
541
1274
|
entireSelectionClassname = 'ht__selection--columns';
|
|
542
1275
|
dimensionProperty = 'left';
|
|
543
1276
|
break;
|
|
@@ -550,8 +1283,8 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
550
1283
|
if (!startHeader || !endHeader) {
|
|
551
1284
|
return false;
|
|
552
1285
|
}
|
|
553
|
-
const startHeaderOffset =
|
|
554
|
-
const endOffset =
|
|
1286
|
+
const startHeaderOffset = geometryReader.offset(startHeader);
|
|
1287
|
+
const endOffset = geometryReader.offset(endHeader);
|
|
555
1288
|
const startOff = startHeaderOffset[dimensionProperty];
|
|
556
1289
|
const endOff = endOffset[dimensionProperty];
|
|
557
1290
|
const contOff = containerOffset[dimensionProperty];
|
|
@@ -566,6 +1299,72 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
566
1299
|
return false;
|
|
567
1300
|
}
|
|
568
1301
|
/**
|
|
1302
|
+
* Positions the four edge-adjustment handles at the midpoint of each edge, hiding any handle
|
|
1303
|
+
* whose edge is flush with the grid boundary. Called at the end of `appear()` when the
|
|
1304
|
+
* `selectionHandles` feature is enabled for this highlight.
|
|
1305
|
+
*
|
|
1306
|
+
* Handle dimensions are sourced from the `--ht-cell-selection-handle-size` and
|
|
1307
|
+
* `--ht-cell-selection-handle-length` CSS tokens via a cached stylesHandler read
|
|
1308
|
+
* (no layout-forcing DOM access). Top/bottom handles are horizontal pills
|
|
1309
|
+
* (width = length, height = size); start/end handles are vertical pills (width = size, height = length).
|
|
1310
|
+
*
|
|
1311
|
+
* @private
|
|
1312
|
+
* @param {number} top The selection border top (px, container-relative).
|
|
1313
|
+
* @param {number} inlineStart The selection border inline-start (px, container-relative).
|
|
1314
|
+
* @param {number} width The selection border width (px).
|
|
1315
|
+
* @param {number} height The selection border height (px).
|
|
1316
|
+
* @param {number[]} corners The raw `[fromRow, fromColumn, toRow, toColumn]` visual corners.
|
|
1317
|
+
*/ positionAdjustHandles(top, inlineStart, width, height, corners) {
|
|
1318
|
+
const isRtl = this.wot.wtSettings.getSetting('rtlMode');
|
|
1319
|
+
const inlineProp = isRtl ? 'right' : 'left';
|
|
1320
|
+
const [fromRow, fromColumn, toRow, toColumn] = corners;
|
|
1321
|
+
const lastRow = this.wot.getSetting('totalRows') - 1;
|
|
1322
|
+
const lastColumn = this.wot.getSetting('totalColumns') - 1;
|
|
1323
|
+
// Handle dimensions are read from the CSS token cache (not computed style — that would be a
|
|
1324
|
+
// layout-forcing read). Visual sizing lives in the stylesheet; JS reads the resolved token values.
|
|
1325
|
+
const stylesHandler = this.wot.wtSettings.getSetting('stylesHandler');
|
|
1326
|
+
const sizeRaw = stylesHandler.getCSSVariableValue('cell-selection-handle-size');
|
|
1327
|
+
const lengthRaw = stylesHandler.getCSSVariableValue('cell-selection-handle-length');
|
|
1328
|
+
const size = parseInt(sizeRaw !== null && sizeRaw !== undefined ? String(sizeRaw) : '8', 10);
|
|
1329
|
+
const length = parseInt(lengthRaw !== null && lengthRaw !== undefined ? String(lengthRaw) : '24', 10);
|
|
1330
|
+
// top/bottom handles are horizontal pills: width = length, height = size.
|
|
1331
|
+
const topW = length;
|
|
1332
|
+
const topH = size;
|
|
1333
|
+
const bottomW = length;
|
|
1334
|
+
const bottomH = size;
|
|
1335
|
+
// start/end handles are vertical pills: width = size, height = length.
|
|
1336
|
+
const startW = size;
|
|
1337
|
+
const startH = length;
|
|
1338
|
+
const endW = size;
|
|
1339
|
+
const endH = length;
|
|
1340
|
+
// Only ever called from `appear()` after the handles have been created.
|
|
1341
|
+
const s = this.adjustHandles.styles;
|
|
1342
|
+
s.top.display = 'none';
|
|
1343
|
+
s.bottom.display = 'none';
|
|
1344
|
+
s.start.display = 'none';
|
|
1345
|
+
s.end.display = 'none';
|
|
1346
|
+
if (fromRow > 0) {
|
|
1347
|
+
s.top[inlineProp] = `${inlineStart + Math.round(width / 2) - Math.round(topW / 2)}px`;
|
|
1348
|
+
s.top.top = `${top - Math.round(topH / 2)}px`;
|
|
1349
|
+
s.top.display = 'block';
|
|
1350
|
+
}
|
|
1351
|
+
if (toRow < lastRow) {
|
|
1352
|
+
s.bottom[inlineProp] = `${inlineStart + Math.round(width / 2) - Math.round(bottomW / 2)}px`;
|
|
1353
|
+
s.bottom.top = `${top + height - Math.round(bottomH / 2)}px`;
|
|
1354
|
+
s.bottom.display = 'block';
|
|
1355
|
+
}
|
|
1356
|
+
if (fromColumn > 0) {
|
|
1357
|
+
s.start[inlineProp] = `${inlineStart - Math.round(startW / 2)}px`;
|
|
1358
|
+
s.start.top = `${top + Math.round(height / 2) - Math.round(startH / 2)}px`;
|
|
1359
|
+
s.start.display = 'block';
|
|
1360
|
+
}
|
|
1361
|
+
if (toColumn < lastColumn) {
|
|
1362
|
+
s.end[inlineProp] = `${inlineStart + width - Math.round(endW / 2)}px`;
|
|
1363
|
+
s.end.top = `${top + Math.round(height / 2) - Math.round(endH / 2)}px`;
|
|
1364
|
+
s.end.display = 'block';
|
|
1365
|
+
}
|
|
1366
|
+
}
|
|
1367
|
+
/**
|
|
569
1368
|
* Change border style.
|
|
570
1369
|
*
|
|
571
1370
|
* @private
|
|
@@ -628,12 +1427,24 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
628
1427
|
this.startStyle.display = 'none';
|
|
629
1428
|
this.endStyle.display = 'none';
|
|
630
1429
|
this.cornerStyle.display = 'none';
|
|
631
|
-
if ((0, _browser.isMobileBrowser)() && this.
|
|
1430
|
+
if ((0, _browser.isMobileBrowser)() && this.wot.getSetting('isDataViewInstance')) {
|
|
632
1431
|
this.selectionHandles.styles.top.display = 'none';
|
|
633
1432
|
this.selectionHandles.styles.topHitArea.display = 'none';
|
|
634
1433
|
this.selectionHandles.styles.bottom.display = 'none';
|
|
635
1434
|
this.selectionHandles.styles.bottomHitArea.display = 'none';
|
|
636
1435
|
}
|
|
1436
|
+
if (this.adjustHandles) {
|
|
1437
|
+
this.adjustHandles.styles.top.display = 'none';
|
|
1438
|
+
this.adjustHandles.styles.bottom.display = 'none';
|
|
1439
|
+
this.adjustHandles.styles.start.display = 'none';
|
|
1440
|
+
this.adjustHandles.styles.end.display = 'none';
|
|
1441
|
+
}
|
|
1442
|
+
if (this.moveZone) {
|
|
1443
|
+
this.moveZone.styles.top.display = 'none';
|
|
1444
|
+
this.moveZone.styles.bottom.display = 'none';
|
|
1445
|
+
this.moveZone.styles.start.display = 'none';
|
|
1446
|
+
this.moveZone.styles.end.display = 'none';
|
|
1447
|
+
}
|
|
637
1448
|
}
|
|
638
1449
|
/**
|
|
639
1450
|
* Cleans up all the DOM state related to a Border instance. Call this prior to deleting a Border instance.
|
|
@@ -652,7 +1463,6 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
652
1463
|
return;
|
|
653
1464
|
}
|
|
654
1465
|
this.eventManager = wotInstance.eventManager;
|
|
655
|
-
this.instance = wotInstance;
|
|
656
1466
|
this.wot = wotInstance;
|
|
657
1467
|
this.settings = settings;
|
|
658
1468
|
this.mouseDown = false;
|
|
@@ -665,7 +1475,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
665
1475
|
this.bottomStyle = null;
|
|
666
1476
|
this.startStyle = null;
|
|
667
1477
|
this.endStyle = null;
|
|
668
|
-
this.cornerDefaultStyle = (0, _utils.getCornerStyle)(this.
|
|
1478
|
+
this.cornerDefaultStyle = (0, _utils.getCornerStyle)(this.wot);
|
|
669
1479
|
// Offset to moving the corner to be centered relative to the grid.
|
|
670
1480
|
this.cornerCenterPointOffset = -Math.ceil(parseInt(String(this.cornerDefaultStyle.width), 10) / 2);
|
|
671
1481
|
this.corner = null;
|