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
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { addClass, hasClass, removeClass, getTrimmingContainer,
|
|
2
|
-
import { stopImmediatePropagation } from '../../../../../helpers/dom/event.mjs';
|
|
1
|
+
import { addClass, hasClass, removeClass, getTrimmingContainer, isHTMLElement } from '../../../../../helpers/dom/element.mjs';
|
|
2
|
+
import { stopImmediatePropagation, isRightClick } from '../../../../../helpers/dom/event.mjs';
|
|
3
3
|
import { isMobileBrowser } from '../../../../../helpers/browser.mjs';
|
|
4
4
|
import { getCornerStyle } from './utils.mjs';
|
|
5
|
+
import { CUSTOM_SELECTION_TYPE } from '../constants.mjs';
|
|
5
6
|
const BORDER_STYLE_CLASS_PREFIX = 'ht-border-style-';
|
|
7
|
+
const MOVE_ZONE_THICKNESS = 6;
|
|
6
8
|
const BORDER_STYLE_VERTICAL_SUFFIX = '-vertical';
|
|
7
9
|
const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
8
10
|
/**
|
|
@@ -14,6 +16,11 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
14
16
|
const documentBody = this.wot.rootDocument.body;
|
|
15
17
|
this.eventManager.addEventListener(documentBody, 'mousedown', ()=>this.onMouseDown());
|
|
16
18
|
this.eventManager.addEventListener(documentBody, 'mouseup', ()=>this.onMouseUp());
|
|
19
|
+
// Only the five border divs created by `createBorders` are present at this point, which is
|
|
20
|
+
// exactly the set that wants the fragment-selection hide-on-enter behavior. The lazily created
|
|
21
|
+
// `selectionHandles`/`moveCells` elements must NOT get it — `onMouseEnter` restores with an
|
|
22
|
+
// unconditional `display = 'block'`, which would un-hide a handle the visibility predicate
|
|
23
|
+
// wants hidden. Their own listeners are attached in their `create*` methods instead.
|
|
17
24
|
if (this.main) {
|
|
18
25
|
for(let c = 0, len = this.main.childNodes.length; c < len; c++){
|
|
19
26
|
const mainNode = this.main;
|
|
@@ -49,7 +56,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
49
56
|
event.preventDefault();
|
|
50
57
|
stopImmediatePropagation(event);
|
|
51
58
|
const documentBody = this.wot.rootDocument.body;
|
|
52
|
-
const bounds =
|
|
59
|
+
const bounds = this.wot.domBindings.geometryReader.getBoundingClientRect(parentElement);
|
|
53
60
|
// Hide border to prevents selection jumping when fragmentSelection is enabled.
|
|
54
61
|
parentElement.style.display = 'none';
|
|
55
62
|
/**
|
|
@@ -97,6 +104,13 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
97
104
|
style.position = 'absolute';
|
|
98
105
|
style.top = '0';
|
|
99
106
|
style.left = '0';
|
|
107
|
+
// Custom borders can overlap (e.g. two configured ranges sharing a cell). Each EDGE is stacked by
|
|
108
|
+
// its own width so overlapping ranges paint deterministically - the thicker (more emphasized) edge
|
|
109
|
+
// consistently sits on top. Stacking per edge, not per whole border, keeps a single visual line
|
|
110
|
+
// uniform where it crosses a shared cell (that cell's merged border mixes a thin and a thick side).
|
|
111
|
+
// The `main` wrapper must NOT carry a z-index, or it would create a stacking context and trap each
|
|
112
|
+
// edge's z-index inside its own border instead of ordering edges across overlapping borders.
|
|
113
|
+
const isCustomBorder = settings.selectionType === CUSTOM_SELECTION_TYPE;
|
|
100
114
|
const createdDivs = [];
|
|
101
115
|
for(let i = 0; i < 5; i++){
|
|
102
116
|
const position = borderDivs[i];
|
|
@@ -127,6 +141,9 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
127
141
|
}
|
|
128
142
|
style.height = `${getSettingsProperty('width')}px`;
|
|
129
143
|
style.width = `${getSettingsProperty('width')}px`;
|
|
144
|
+
if (isCustomBorder) {
|
|
145
|
+
style.zIndex = `${getSettingsProperty('width') ?? 1}`;
|
|
146
|
+
}
|
|
130
147
|
createdDivs.push(div);
|
|
131
148
|
this.main.appendChild(div);
|
|
132
149
|
}
|
|
@@ -148,9 +165,13 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
148
165
|
this.cornerDefaultStyle.borderStyle,
|
|
149
166
|
this.cornerDefaultStyle.borderColor
|
|
150
167
|
].join(' ');
|
|
151
|
-
if (isMobileBrowser() && this.
|
|
168
|
+
if (isMobileBrowser() && this.wot.getSetting('isDataViewInstance')) {
|
|
152
169
|
this.createMultipleSelectorHandles();
|
|
153
170
|
}
|
|
171
|
+
// The `selectionHandles` and `moveCells` elements are created lazily, on the first `appear()`
|
|
172
|
+
// whose visibility predicate resolves truthy. Creating them here would add 8 divs and their
|
|
173
|
+
// listeners to every border of every highlight in every overlay, for every instance — including
|
|
174
|
+
// the majority that leave both options off. See `appear()`.
|
|
154
175
|
this.disappear();
|
|
155
176
|
const { wtTable } = this.wot;
|
|
156
177
|
let bordersHolder = wtTable.bordersHolder;
|
|
@@ -213,6 +234,153 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
213
234
|
handleStyleTarget.background = `color-mix(in srgb, ${cellMobileHandleBackgroundColor} ${cellMobileHandleBackgroundOpacity}%, transparent)`;
|
|
214
235
|
handleStyleTarget.border = `${cellMobileHandleBorderWidth}px solid ${cellMobileHandleBorderColor}`;
|
|
215
236
|
}
|
|
237
|
+
this.main.appendChild(this.selectionHandles.top);
|
|
238
|
+
this.main.appendChild(this.selectionHandles.bottom);
|
|
239
|
+
this.main.appendChild(this.selectionHandles.topHitArea);
|
|
240
|
+
this.main.appendChild(this.selectionHandles.bottomHitArea);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Creates the four edge-adjustment handle elements used by the `selectionHandles` feature.
|
|
244
|
+
* Visual styling (size, background, border, border-radius, cursor, z-index) is driven entirely
|
|
245
|
+
* by CSS via the `--ht-cell-selection-handle-*` tokens defined in the theme stylesheets.
|
|
246
|
+
* JS sets only `display:none` (initial hidden state) and the positioning `top`/`left` values
|
|
247
|
+
* during `positionAdjustHandles`. Class names (`wtSelectionHandle--<edge>`) carry orientation.
|
|
248
|
+
*
|
|
249
|
+
* Called lazily from `appear()` on the first draw whose `adjustHandlesVisible` predicate resolves
|
|
250
|
+
* truthy, so the elements never exist for instances that leave `selectionHandles` off. Because
|
|
251
|
+
* `registerListeners` has already run by then, each handle attaches its own `mousedown` listener
|
|
252
|
+
* here.
|
|
253
|
+
*
|
|
254
|
+
* @returns {AdjustHandles} The created handle set, so the caller can use it without a null check.
|
|
255
|
+
*/ createAdjustHandles() {
|
|
256
|
+
const { rootDocument } = this.wot;
|
|
257
|
+
const make = (edge)=>{
|
|
258
|
+
const el = rootDocument.createElement('div');
|
|
259
|
+
el.className = `wtSelectionHandle wtSelectionHandle--${edge}`;
|
|
260
|
+
el.style.display = 'none';
|
|
261
|
+
this.main.appendChild(el);
|
|
262
|
+
this.eventManager.addEventListener(el, 'mousedown', (event)=>{
|
|
263
|
+
// A right-press must fall through to the context menu without starting a resize drag.
|
|
264
|
+
if (isRightClick(event)) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
stopImmediatePropagation(event);
|
|
268
|
+
event.preventDefault();
|
|
269
|
+
this.wot.getSetting('onSelectionHandleMouseDown', event, edge);
|
|
270
|
+
});
|
|
271
|
+
return el;
|
|
272
|
+
};
|
|
273
|
+
const top = make('top');
|
|
274
|
+
const bottom = make('bottom');
|
|
275
|
+
const start = make('start');
|
|
276
|
+
const end = make('end');
|
|
277
|
+
this.adjustHandles = {
|
|
278
|
+
top,
|
|
279
|
+
bottom,
|
|
280
|
+
start,
|
|
281
|
+
end,
|
|
282
|
+
styles: {
|
|
283
|
+
top: top.style,
|
|
284
|
+
bottom: bottom.style,
|
|
285
|
+
start: start.style,
|
|
286
|
+
end: end.style
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
return this.adjustHandles;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Creates the four edge move-zone band elements. Each band is a thin overlay div positioned along
|
|
293
|
+
* one selection edge. Hovering a band shows a `grab` cursor; a `mousedown` on a band calls the
|
|
294
|
+
* `onSelectionEdgeMouseDown` Walkontable setting so the core can initiate a move drag.
|
|
295
|
+
*
|
|
296
|
+
* Bands sit at z-index 100 — below the resize pills (z-index 115) and below the autofill fill
|
|
297
|
+
* handle (`.wtBorder.corner`, z-index 110), so both keep winning their own pixels in the corner
|
|
298
|
+
* regions where the bands overlap them. All four bands are created hidden; `positionMoveZone`
|
|
299
|
+
* + `appear` control their visibility.
|
|
300
|
+
*
|
|
301
|
+
* Called lazily from `appear()` on the first draw whose `moveEnabled` predicate resolves truthy,
|
|
302
|
+
* so the bands never exist for instances that leave `moveCells` off.
|
|
303
|
+
*
|
|
304
|
+
* @private
|
|
305
|
+
*/ createMoveZone() {
|
|
306
|
+
const { rootDocument } = this.wot;
|
|
307
|
+
const make = (edge)=>{
|
|
308
|
+
const el = rootDocument.createElement('div');
|
|
309
|
+
el.className = 'wtMoveZone';
|
|
310
|
+
el.style.position = 'absolute';
|
|
311
|
+
el.style.display = 'none';
|
|
312
|
+
el.style.zIndex = '100';
|
|
313
|
+
el.style.pointerEvents = 'auto';
|
|
314
|
+
el.style.cursor = 'grab';
|
|
315
|
+
this.main.appendChild(el);
|
|
316
|
+
this.eventManager.addEventListener(el, 'mousedown', (event)=>{
|
|
317
|
+
// A right-press must fall through to the context menu without starting a move drag.
|
|
318
|
+
if (isRightClick(event)) {
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
stopImmediatePropagation(event);
|
|
322
|
+
event.preventDefault();
|
|
323
|
+
this.wot.getSetting('onSelectionEdgeMouseDown', event, edge);
|
|
324
|
+
});
|
|
325
|
+
return el;
|
|
326
|
+
};
|
|
327
|
+
const top = make('top');
|
|
328
|
+
const bottom = make('bottom');
|
|
329
|
+
const start = make('start');
|
|
330
|
+
const end = make('end');
|
|
331
|
+
this.moveZone = {
|
|
332
|
+
top,
|
|
333
|
+
bottom,
|
|
334
|
+
start,
|
|
335
|
+
end,
|
|
336
|
+
styles: {
|
|
337
|
+
top: top.style,
|
|
338
|
+
bottom: bottom.style,
|
|
339
|
+
start: start.style,
|
|
340
|
+
end: end.style
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Positions the four move-zone bands along the selection edges. Each band is `MOVE_ZONE_THICKNESS`
|
|
346
|
+
* pixels tall (or wide for the vertical bands) and centered on its respective edge line. RTL layout
|
|
347
|
+
* is handled by using `right` instead of `left` for the inline axis, mirroring `positionAdjustHandles`.
|
|
348
|
+
*
|
|
349
|
+
* @private
|
|
350
|
+
* @param {number} top The selection border top (px, container-relative).
|
|
351
|
+
* @param {number} inlineStart The selection border inline-start (px, container-relative).
|
|
352
|
+
* @param {number} width The selection border width (px).
|
|
353
|
+
* @param {number} height The selection border height (px).
|
|
354
|
+
*/ positionMoveZone(top, inlineStart, width, height) {
|
|
355
|
+
const isRtl = this.wot.wtSettings.getSetting('rtlMode');
|
|
356
|
+
const inlineProp = isRtl ? 'right' : 'left';
|
|
357
|
+
// Only ever called from `appear()` after the bands have been created.
|
|
358
|
+
const s = this.moveZone.styles;
|
|
359
|
+
const half = Math.floor(MOVE_ZONE_THICKNESS / 2);
|
|
360
|
+
// Top band — full width, centered on the top edge.
|
|
361
|
+
s.top[inlineProp] = `${inlineStart}px`;
|
|
362
|
+
s.top.top = `${top - half}px`;
|
|
363
|
+
s.top.width = `${width}px`;
|
|
364
|
+
s.top.height = `${MOVE_ZONE_THICKNESS}px`;
|
|
365
|
+
s.top.display = 'block';
|
|
366
|
+
// Bottom band — full width, centered on the bottom edge.
|
|
367
|
+
s.bottom[inlineProp] = `${inlineStart}px`;
|
|
368
|
+
s.bottom.top = `${top + height - half}px`;
|
|
369
|
+
s.bottom.width = `${width}px`;
|
|
370
|
+
s.bottom.height = `${MOVE_ZONE_THICKNESS}px`;
|
|
371
|
+
s.bottom.display = 'block';
|
|
372
|
+
// Start band — full height, centered on the inline-start edge.
|
|
373
|
+
s.start[inlineProp] = `${inlineStart - half}px`;
|
|
374
|
+
s.start.top = `${top}px`;
|
|
375
|
+
s.start.width = `${MOVE_ZONE_THICKNESS}px`;
|
|
376
|
+
s.start.height = `${height}px`;
|
|
377
|
+
s.start.display = 'block';
|
|
378
|
+
// End band — full height, centered on the inline-end edge.
|
|
379
|
+
s.end[inlineProp] = `${inlineStart + width - half}px`;
|
|
380
|
+
s.end.top = `${top}px`;
|
|
381
|
+
s.end.width = `${MOVE_ZONE_THICKNESS}px`;
|
|
382
|
+
s.end.height = `${height}px`;
|
|
383
|
+
s.end.display = 'block';
|
|
216
384
|
}
|
|
217
385
|
/**
|
|
218
386
|
* Checks if the given coordinates are south-east of the area selection. If `true` then
|
|
@@ -288,20 +456,512 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
288
456
|
}
|
|
289
457
|
}
|
|
290
458
|
/**
|
|
459
|
+
* Tells whether a selection edge lands exactly on a frozen-pane boundary and is therefore owned by
|
|
460
|
+
* the frozen overlay. Depends only on the fixed-pane settings and the raw corner, so every overlay
|
|
461
|
+
* evaluates it on identical inputs.
|
|
462
|
+
*
|
|
463
|
+
* @private
|
|
464
|
+
* @param {'row'|'column'} axis The freeze axis to test (`row` → `fixedRowsTop`, `column` → `fixedColumnsStart`).
|
|
465
|
+
* @param {number} fromIndex The selection's top (`row`) or inline-start (`column`) corner index.
|
|
466
|
+
* @returns {boolean}
|
|
467
|
+
*/ isFrozenBoundaryEdge(axis, fromIndex) {
|
|
468
|
+
if (axis === 'row') {
|
|
469
|
+
const fixedRowsTop = this.wot.getSetting('fixedRowsTop');
|
|
470
|
+
return fixedRowsTop > 0 && fromIndex === fixedRowsTop;
|
|
471
|
+
}
|
|
472
|
+
const fixedColumnsStart = this.wot.getSetting('fixedColumnsStart');
|
|
473
|
+
return fixedColumnsStart > 0 && fromIndex === fixedColumnsStart;
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Tells whether a selection's bottom or end edge lands immediately before a top or start frozen pane.
|
|
477
|
+
*
|
|
478
|
+
* @private
|
|
479
|
+
* @param {'row'|'column'} axis The freeze axis to test.
|
|
480
|
+
* @param {number} toIndex The selection's bottom (`row`) or inline-end (`column`) corner index.
|
|
481
|
+
* @returns {boolean}
|
|
482
|
+
*/ isFrozenStartBoundaryOppositeEdge(axis, toIndex) {
|
|
483
|
+
if (axis === 'row') {
|
|
484
|
+
const fixedRowsTop = this.wot.getSetting('fixedRowsTop');
|
|
485
|
+
return fixedRowsTop > 0 && toIndex === fixedRowsTop - 1;
|
|
486
|
+
}
|
|
487
|
+
const fixedColumnsStart = this.wot.getSetting('fixedColumnsStart');
|
|
488
|
+
return fixedColumnsStart > 0 && toIndex === fixedColumnsStart - 1;
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Tells whether the selection's boundary corner (the cell flush with a frozen-pane line) has
|
|
492
|
+
* scrolled behind the frozen pane in the master viewport. The frozen overlay can't detect this
|
|
493
|
+
* itself (its rendered range is sticky), so we consult the scroll-aware master and stop drawing the
|
|
494
|
+
* edge once the cell is occluded by the pane.
|
|
495
|
+
*
|
|
496
|
+
* @private
|
|
497
|
+
* @param {'row'|'column'} axis The freeze axis to test (`row` → vertical, `column` → horizontal).
|
|
498
|
+
* @param {number} fromIndex The selection's boundary corner index on that axis.
|
|
499
|
+
* @returns {boolean} `true` when the boundary corner is scrolled out (edge must not be drawn).
|
|
500
|
+
*/ isBoundaryCornerScrolledOut(axis, fromIndex) {
|
|
501
|
+
const masterTable = this.wot.cloneSource?.wtTable;
|
|
502
|
+
if (!masterTable) {
|
|
503
|
+
return false;
|
|
504
|
+
}
|
|
505
|
+
const firstVisible = axis === 'row' ? masterTable.getFirstVisibleRow() : masterTable.getFirstVisibleColumn();
|
|
506
|
+
return firstVisible >= 0 && fromIndex < firstVisible;
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Mirror of {@link Border#isFrozenBoundaryEdge} for the bottom freeze line: tells whether the
|
|
510
|
+
* selection's bottom edge lands exactly on the `fixedRowsBottom` boundary (the line between the last
|
|
511
|
+
* non-frozen row and the first bottom-frozen row), and is therefore owned by the bottom overlay.
|
|
512
|
+
*
|
|
513
|
+
* @private
|
|
514
|
+
* @param {number} toIndex The selection's bottom corner row index.
|
|
515
|
+
* @returns {boolean}
|
|
516
|
+
*/ isFrozenBottomBoundaryEdge(toIndex) {
|
|
517
|
+
const fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');
|
|
518
|
+
const totalRows = this.wot.getSetting('totalRows');
|
|
519
|
+
return fixedRowsBottom > 0 && toIndex === totalRows - fixedRowsBottom - 1;
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Mirror of {@link Border#isFrozenStartBoundaryOppositeEdge} for the bottom freeze line: tells
|
|
523
|
+
* whether the selection's top edge lands exactly on the `fixedRowsBottom` boundary (the selection
|
|
524
|
+
* starts at the first bottom-frozen row), so the top handle sits on the freeze line and must be
|
|
525
|
+
* suppressed there like every other frozen-seam edge.
|
|
526
|
+
*
|
|
527
|
+
* @private
|
|
528
|
+
* @param {number} fromIndex The selection's top corner row index.
|
|
529
|
+
* @returns {boolean}
|
|
530
|
+
*/ isFrozenBottomBoundaryOppositeEdge(fromIndex) {
|
|
531
|
+
const fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');
|
|
532
|
+
const totalRows = this.wot.getSetting('totalRows');
|
|
533
|
+
return fixedRowsBottom > 0 && fromIndex === totalRows - fixedRowsBottom;
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Mirror of {@link Border#isBoundaryCornerScrolledOut} for the bottom freeze line: tells whether the
|
|
537
|
+
* selection's bottom boundary cell has scrolled behind the bottom frozen pane in the master viewport
|
|
538
|
+
* (it then drops below the last visible master row), so the edge must not be drawn.
|
|
539
|
+
*
|
|
540
|
+
* @private
|
|
541
|
+
* @param {number} toIndex The selection's bottom boundary corner row index.
|
|
542
|
+
* @returns {boolean} `true` when the boundary corner is scrolled out (edge must not be drawn).
|
|
543
|
+
*/ isBottomBoundaryCornerScrolledOut(toIndex) {
|
|
544
|
+
const masterTable = this.wot.cloneSource?.wtTable;
|
|
545
|
+
if (!masterTable) {
|
|
546
|
+
return false;
|
|
547
|
+
}
|
|
548
|
+
const lastVisible = masterTable.getLastVisibleRow();
|
|
549
|
+
return lastVisible >= 0 && toIndex > lastVisible;
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* Draws the selection-border edge(s) that lie exactly on a frozen-pane boundary, where the master
|
|
553
|
+
* renders them on the freeze line under the occluding frozen overlay. Re-draws each such edge
|
|
554
|
+
* inside the frozen overlay(s) that own it (clamped to each overlay's rendered range), while
|
|
555
|
+
* `appear` hides the matching master edge so exactly one line is drawn per segment.
|
|
556
|
+
*
|
|
557
|
+
* @param {number[]} corners The selection corners `[fromRow, fromColumn, toRow, toColumn]`.
|
|
558
|
+
* @returns {boolean} `true` when a boundary edge was drawn (regular drawing should be skipped).
|
|
559
|
+
*/ drawFrozenBoundaryEdge(corners) {
|
|
560
|
+
const { wtTable } = this.wot;
|
|
561
|
+
const overlayName = wtTable.name;
|
|
562
|
+
const isTopOverlay = overlayName === 'top';
|
|
563
|
+
const isInlineStartOverlay = overlayName === 'inline_start';
|
|
564
|
+
const isCornerOverlay = overlayName === 'top_inline_start_corner';
|
|
565
|
+
const isBottomOverlay = overlayName === 'bottom';
|
|
566
|
+
const isBottomCornerOverlay = overlayName === 'bottom_inline_start_corner';
|
|
567
|
+
if (!isTopOverlay && !isInlineStartOverlay && !isCornerOverlay && !isBottomOverlay && !isBottomCornerOverlay) {
|
|
568
|
+
return false;
|
|
569
|
+
}
|
|
570
|
+
// In RTL the horizontal axis is mirrored: edges are anchored with `right`, like the regular flow
|
|
571
|
+
// in `appear`. Row-freeze (vertical) geometry is direction-agnostic.
|
|
572
|
+
const isRtl = this.wot.wtSettings.getSetting('rtlMode');
|
|
573
|
+
const [fromRow, fromColumn, toRow, toColumn] = corners;
|
|
574
|
+
const borderWidth = this.settings.border?.width ?? 0;
|
|
575
|
+
// Along-axis length extension mirroring `appear`'s `ceil(borderWidth / 2)`, so corners meet.
|
|
576
|
+
// Without it the line falls short of the master's side edges for borders thicker than 1px.
|
|
577
|
+
const delta = Math.ceil(borderWidth / 2);
|
|
578
|
+
// `rowEdgeOwned`/`columnEdgeOwned` are true when the selection's top/start edge lands on the
|
|
579
|
+
// freeze line AND its boundary cell is still visible. Resolved once and reused by every branch
|
|
580
|
+
// below.
|
|
581
|
+
const rowEdgeOwned = this.isFrozenBoundaryEdge('row', fromRow) && !this.isBoundaryCornerScrolledOut('row', fromRow);
|
|
582
|
+
const columnEdgeOwned = this.isFrozenBoundaryEdge('column', fromColumn) && !this.isBoundaryCornerScrolledOut('column', fromColumn);
|
|
583
|
+
// The bottom-freeze counterpart of `rowEdgeOwned`: the selection's bottom edge lands on the
|
|
584
|
+
// `fixedRowsBottom` line and its boundary cell is still visible in the master.
|
|
585
|
+
const bottomRowEdgeOwned = this.isFrozenBottomBoundaryEdge(toRow) && !this.isBottomBoundaryCornerScrolledOut(toRow);
|
|
586
|
+
// The row-freeze edge straddles the freeze line: the master draws its lower half (below the seam)
|
|
587
|
+
// and the frozen overlay its upper half (above the seam, on top of the opaque pane), so together
|
|
588
|
+
// they show the full thickness in both selection and edit modes. Split between the `top` overlay
|
|
589
|
+
// (non-frozen columns) and the corner overlay (frozen columns), each clamped to its rendered range.
|
|
590
|
+
if (rowEdgeOwned && (isTopOverlay || isCornerOverlay)) {
|
|
591
|
+
const firstColumn = Math.max(fromColumn, wtTable.getFirstRenderedColumn());
|
|
592
|
+
const lastColumn = Math.min(toColumn, wtTable.getLastRenderedColumn());
|
|
593
|
+
if (this.drawRowFreezeEdge(firstColumn, lastColumn, isRtl, delta)) {
|
|
594
|
+
return true;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
// The column-freeze edge is split between the `inline_start` overlay (non-frozen rows) and the
|
|
598
|
+
// top/bottom corner overlays (top-frozen / bottom-frozen rows), each clamped to its own rendered
|
|
599
|
+
// row range so together they cover the edge without overlap. Mirror of the row-freeze branch on
|
|
600
|
+
// the column axis. Without the bottom corner the slice that reaches down into the bottom-frozen
|
|
601
|
+
// rows would be occluded by that overlay and left undrawn.
|
|
602
|
+
if (columnEdgeOwned && (isInlineStartOverlay || isCornerOverlay || isBottomCornerOverlay)) {
|
|
603
|
+
const firstRow = Math.max(fromRow, wtTable.getFirstRenderedRow());
|
|
604
|
+
const lastRow = Math.min(toRow, wtTable.getLastRenderedRow());
|
|
605
|
+
if (this.drawColumnFreezeEdge(firstRow, lastRow, isRtl, delta)) {
|
|
606
|
+
return true;
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
// The bottom-freeze edge is split between the `bottom` overlay (non-frozen columns) and the bottom
|
|
610
|
+
// corner overlay (frozen columns), mirroring the row-freeze branch on the bottom axis. The bottom
|
|
611
|
+
// overlay occludes the master's edge on the freeze line, so re-draw it here.
|
|
612
|
+
if (bottomRowEdgeOwned && (isBottomOverlay || isBottomCornerOverlay)) {
|
|
613
|
+
const firstColumn = Math.max(fromColumn, wtTable.getFirstRenderedColumn());
|
|
614
|
+
const lastColumn = Math.min(toColumn, wtTable.getLastRenderedColumn());
|
|
615
|
+
if (this.drawRowFreezeBottomEdge(firstColumn, lastColumn, isRtl, delta)) {
|
|
616
|
+
return true;
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
// When the corner lands on BOTH freeze lines, the top and start edges meet in the frozen×frozen
|
|
620
|
+
// square owned by the corner overlay, which occludes both their tips and leaves a gap. Draw that
|
|
621
|
+
// connecting square here to close it.
|
|
622
|
+
if (isCornerOverlay && rowEdgeOwned && columnEdgeOwned) {
|
|
623
|
+
if (this.drawFrozenBoundaryCorner(isRtl, borderWidth)) {
|
|
624
|
+
return true;
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
// Bottom mirror of the branch above: when the corner lands on BOTH the bottom and column freeze
|
|
628
|
+
// lines, the bottom and start edges meet in the bottom corner overlay's frozen×frozen square,
|
|
629
|
+
// which occludes their tips. Draw that connecting square here to close the gap.
|
|
630
|
+
if (isBottomCornerOverlay && bottomRowEdgeOwned && columnEdgeOwned) {
|
|
631
|
+
if (this.drawFrozenBottomBoundaryCorner(isRtl, borderWidth)) {
|
|
632
|
+
return true;
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
return false;
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* Shared inline-axis writer for the row/bottom freeze edges. Given the boundary cells and an
|
|
639
|
+
* already-resolved vertical position, writes the horizontal anchor + width (RTL-aware) on the
|
|
640
|
+
* supplied border element and reveals it. The top and bottom freeze edges differ only in which
|
|
641
|
+
* gridline they sit on and which element they reuse, so they delegate the identical inline math
|
|
642
|
+
* here. Cheap range/cell-lookup guards run before any reflow-forcing `geometryReader.offset()`, so non-drawing
|
|
643
|
+
* calls leave the styles untouched.
|
|
644
|
+
*
|
|
645
|
+
* @private
|
|
646
|
+
* @param {number} boundaryRow The row whose edge carries the freeze line.
|
|
647
|
+
* @param {CSSStyleDeclaration} style The border element to position (`topStyle` or `bottomStyle`).
|
|
648
|
+
* @param {number} firstColumn The first column index to span (clamped to the overlay).
|
|
649
|
+
* @param {number} lastColumn The last column index to span (clamped to the overlay).
|
|
650
|
+
* @param {boolean} isRtl Whether the grid is rendered right-to-left.
|
|
651
|
+
* @param {number} delta The along-axis length extension (`ceil(borderWidth / 2)`).
|
|
652
|
+
* @param {Function} resolveTop Resolves the edge's `top` (px) from the boundary cell and offsets.
|
|
653
|
+
* @returns {boolean} `true` when the edge was drawn.
|
|
654
|
+
*/ drawHorizontalFreezeEdge(boundaryRow, style, firstColumn, lastColumn, isRtl, delta, resolveTop) {
|
|
655
|
+
const { geometryReader } = this.wot.domBindings;
|
|
656
|
+
if (lastColumn < firstColumn) {
|
|
657
|
+
return false;
|
|
658
|
+
}
|
|
659
|
+
const { wtTable } = this.wot;
|
|
660
|
+
const boundaryTD = wtTable.getCell(this.wot.createCellCoords(boundaryRow, firstColumn));
|
|
661
|
+
const boundaryEndTD = wtTable.getCell(this.wot.createCellCoords(boundaryRow, lastColumn));
|
|
662
|
+
if (!isHTMLElement(boundaryTD) || !isHTMLElement(boundaryEndTD)) {
|
|
663
|
+
return false;
|
|
664
|
+
}
|
|
665
|
+
const containerOffset = geometryReader.offset(wtTable.TABLE);
|
|
666
|
+
const boundaryOffset = geometryReader.offset(boundaryTD);
|
|
667
|
+
const endOffset = geometryReader.offset(boundaryEndTD);
|
|
668
|
+
// The `-1` overlaps the border shared with the previous column, mirroring `appear`. At column 0
|
|
669
|
+
// there is no previous column, so drop the shift and shorten the line to avoid protruding past
|
|
670
|
+
// the pane edge.
|
|
671
|
+
const startShift = firstColumn === 0 ? 0 : 1;
|
|
672
|
+
this.disappear();
|
|
673
|
+
style.top = `${resolveTop(boundaryTD, boundaryOffset, containerOffset.top)}px`;
|
|
674
|
+
if (isRtl) {
|
|
675
|
+
// `firstColumn` (lowest index) is the visual-right cell, `lastColumn` the visual-left one.
|
|
676
|
+
const spanRightX = boundaryOffset.left + geometryReader.outerWidth(boundaryTD);
|
|
677
|
+
const tableRightX = containerOffset.left + geometryReader.outerWidth(wtTable.TABLE);
|
|
678
|
+
style.right = `${tableRightX - spanRightX - startShift}px`;
|
|
679
|
+
style.width = `${spanRightX - endOffset.left + delta - (1 - startShift)}px`;
|
|
680
|
+
} else {
|
|
681
|
+
style.left = `${boundaryOffset.left - containerOffset.left - startShift}px`;
|
|
682
|
+
const edgeWidth = endOffset.left + geometryReader.outerWidth(boundaryEndTD) - boundaryOffset.left + delta - (1 - startShift);
|
|
683
|
+
style.width = `${edgeWidth}px`;
|
|
684
|
+
}
|
|
685
|
+
style.display = 'block';
|
|
686
|
+
return true;
|
|
687
|
+
}
|
|
688
|
+
/**
|
|
689
|
+
* Draws the selection's top edge on the row freeze line across the given (clamped) column span,
|
|
690
|
+
* anchored one pixel inside the freeze line by a constant so borders of different widths line up.
|
|
691
|
+
*
|
|
692
|
+
* @private
|
|
693
|
+
* @param {number} firstColumn The first column index to span (clamped to the overlay).
|
|
694
|
+
* @param {number} lastColumn The last column index to span (clamped to the overlay).
|
|
695
|
+
* @param {boolean} isRtl Whether the grid is rendered right-to-left.
|
|
696
|
+
* @param {number} delta The along-axis length extension (`ceil(borderWidth / 2)`).
|
|
697
|
+
* @returns {boolean} `true` when the edge was drawn.
|
|
698
|
+
*/ drawRowFreezeEdge(firstColumn, lastColumn, isRtl, delta) {
|
|
699
|
+
const boundaryRow = this.wot.getSetting('fixedRowsTop') - 1;
|
|
700
|
+
// The seam sits on the boundary cell's BOTTOM edge, one pixel up to overlap the shared gridline.
|
|
701
|
+
return this.drawHorizontalFreezeEdge(boundaryRow, this.topStyle, firstColumn, lastColumn, isRtl, delta, (boundaryTD, boundaryOffset, containerTop)=>boundaryOffset.top + this.wot.domBindings.geometryReader.outerHeight(boundaryTD) - containerTop - 1);
|
|
702
|
+
}
|
|
703
|
+
/**
|
|
704
|
+
* Mirror of {@link Border#drawRowFreezeEdge} for the bottom freeze line: draws the selection's
|
|
705
|
+
* bottom edge on the `fixedRowsBottom` line across the given (clamped) column span. The boundary
|
|
706
|
+
* cell is the FIRST bottom-frozen row, and the freeze line is its TOP edge (= bottom of the last
|
|
707
|
+
* non-frozen row). Uses the `bottom` border element.
|
|
708
|
+
*
|
|
709
|
+
* @private
|
|
710
|
+
* @param {number} firstColumn The first column index to span (clamped to the overlay).
|
|
711
|
+
* @param {number} lastColumn The last column index to span (clamped to the overlay).
|
|
712
|
+
* @param {boolean} isRtl Whether the grid is rendered right-to-left.
|
|
713
|
+
* @param {number} delta The along-axis length extension (`ceil(borderWidth / 2)`).
|
|
714
|
+
* @returns {boolean} `true` when the edge was drawn.
|
|
715
|
+
*/ drawRowFreezeBottomEdge(firstColumn, lastColumn, isRtl, delta) {
|
|
716
|
+
const fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');
|
|
717
|
+
const totalRows = this.wot.getSetting('totalRows');
|
|
718
|
+
const boundaryRow = totalRows - fixedRowsBottom;
|
|
719
|
+
// The freeze line is the boundary cell's TOP edge; position like `appear`'s bottom border
|
|
720
|
+
// (`cellBottom - thickness + delta`, where `cellBottom` is the freeze line) so borders of
|
|
721
|
+
// different widths stay aligned on the gridline.
|
|
722
|
+
return this.drawHorizontalFreezeEdge(boundaryRow, this.bottomStyle, firstColumn, lastColumn, isRtl, delta, (_boundaryTD, boundaryOffset, containerTop)=>boundaryOffset.top - containerTop - parseInt(this.bottomStyle.height, 10) + delta);
|
|
723
|
+
}
|
|
724
|
+
/**
|
|
725
|
+
* Draws the selection's inline-start edge on the column freeze line across the given (clamped) row
|
|
726
|
+
* span, anchored one pixel inside the freeze line by a constant so borders of different widths line
|
|
727
|
+
* up. Guard/reflow behavior mirrors `drawRowFreezeEdge`.
|
|
728
|
+
*
|
|
729
|
+
* @private
|
|
730
|
+
* @param {number} firstRow The first row index to span (clamped to the overlay).
|
|
731
|
+
* @param {number} lastRow The last row index to span (clamped to the overlay).
|
|
732
|
+
* @param {boolean} isRtl Whether the grid is rendered right-to-left.
|
|
733
|
+
* @param {number} delta The along-axis length extension (`ceil(borderWidth / 2)`).
|
|
734
|
+
* @returns {boolean} `true` when the edge was drawn.
|
|
735
|
+
*/ drawColumnFreezeEdge(firstRow, lastRow, isRtl, delta) {
|
|
736
|
+
if (lastRow < firstRow) {
|
|
737
|
+
return false;
|
|
738
|
+
}
|
|
739
|
+
const { geometryReader } = this.wot.domBindings;
|
|
740
|
+
const { wtTable } = this.wot;
|
|
741
|
+
const boundaryColumn = this.wot.getSetting('fixedColumnsStart') - 1;
|
|
742
|
+
const boundaryTD = wtTable.getCell(this.wot.createCellCoords(firstRow, boundaryColumn));
|
|
743
|
+
const boundaryEndTD = wtTable.getCell(this.wot.createCellCoords(lastRow, boundaryColumn));
|
|
744
|
+
if (!isHTMLElement(boundaryTD) || !isHTMLElement(boundaryEndTD)) {
|
|
745
|
+
return false;
|
|
746
|
+
}
|
|
747
|
+
const containerOffset = geometryReader.offset(wtTable.TABLE);
|
|
748
|
+
const boundaryOffset = geometryReader.offset(boundaryTD);
|
|
749
|
+
const endOffset = geometryReader.offset(boundaryEndTD);
|
|
750
|
+
// The `-1` overlaps the border shared with the row above, like `appear`. At row 0 there is no row
|
|
751
|
+
// above, so drop the shift and shorten the line to avoid protruding past the pane top.
|
|
752
|
+
const atFirstRow = firstRow === 0;
|
|
753
|
+
let edgeTop = boundaryOffset.top - containerOffset.top - 1;
|
|
754
|
+
let edgeHeight = endOffset.top + geometryReader.outerHeight(boundaryEndTD) - boundaryOffset.top + delta;
|
|
755
|
+
if (atFirstRow) {
|
|
756
|
+
edgeTop += 1;
|
|
757
|
+
edgeHeight = Math.max(edgeHeight - 1, 0);
|
|
758
|
+
}
|
|
759
|
+
this.disappear();
|
|
760
|
+
this.startStyle.top = `${edgeTop}px`;
|
|
761
|
+
if (isRtl) {
|
|
762
|
+
// RTL: the frozen pane sits on the right, so the freeze line is the boundary cell's LEFT edge,
|
|
763
|
+
// and the edge is drawn one pixel inside it (to the right) via the `right` anchor.
|
|
764
|
+
const tableRightX = containerOffset.left + geometryReader.outerWidth(wtTable.TABLE);
|
|
765
|
+
this.startStyle.right = `${tableRightX - boundaryOffset.left - 1}px`;
|
|
766
|
+
} else {
|
|
767
|
+
const freezeLineX = boundaryOffset.left + geometryReader.outerWidth(boundaryTD);
|
|
768
|
+
this.startStyle.left = `${freezeLineX - containerOffset.left - 1}px`;
|
|
769
|
+
}
|
|
770
|
+
this.startStyle.height = `${edgeHeight}px`;
|
|
771
|
+
this.startStyle.display = 'block';
|
|
772
|
+
return true;
|
|
773
|
+
}
|
|
774
|
+
/**
|
|
775
|
+
* Shared writer for the freeze-corner squares. Draws the `borderWidth`-sized square bridging a
|
|
776
|
+
* row/bottom edge and the inline-start edge where a selection corner lands on both freeze lines,
|
|
777
|
+
* since that square sits in the corner overlay's frozen×frozen region that occludes both edges'
|
|
778
|
+
* tips. Anchored one pixel inside the freeze column; the caller resolves the vertical position and
|
|
779
|
+
* the border element to reuse. Reflow/guard behavior mirrors the freeze-edge helpers.
|
|
780
|
+
*
|
|
781
|
+
* @private
|
|
782
|
+
* @param {number} boundaryRow The row whose edge carries the freeze line.
|
|
783
|
+
* @param {CSSStyleDeclaration} style The border element to position (`topStyle` or `bottomStyle`).
|
|
784
|
+
* @param {boolean} isRtl Whether the grid is rendered right-to-left.
|
|
785
|
+
* @param {number} borderWidth The configured border width in pixels.
|
|
786
|
+
* @param {Function} resolveTop Resolves the square's `top` (px) from the boundary cell and offsets.
|
|
787
|
+
* @returns {boolean} `true` when the corner square was drawn.
|
|
788
|
+
*/ drawFreezeCorner(boundaryRow, style, isRtl, borderWidth, resolveTop) {
|
|
789
|
+
const { geometryReader } = this.wot.domBindings;
|
|
790
|
+
const { wtTable } = this.wot;
|
|
791
|
+
const boundaryColumn = this.wot.getSetting('fixedColumnsStart') - 1;
|
|
792
|
+
const boundaryTD = wtTable.getCell(this.wot.createCellCoords(boundaryRow, boundaryColumn));
|
|
793
|
+
if (!isHTMLElement(boundaryTD)) {
|
|
794
|
+
return false;
|
|
795
|
+
}
|
|
796
|
+
const containerOffset = geometryReader.offset(wtTable.TABLE);
|
|
797
|
+
const boundaryOffset = geometryReader.offset(boundaryTD);
|
|
798
|
+
this.disappear();
|
|
799
|
+
style.top = `${resolveTop(boundaryTD, boundaryOffset, containerOffset.top)}px`;
|
|
800
|
+
style.height = `${borderWidth}px`;
|
|
801
|
+
style.width = `${borderWidth}px`;
|
|
802
|
+
if (isRtl) {
|
|
803
|
+
// RTL: the frozen pane is on the right, so the freeze line is the boundary cell's LEFT edge;
|
|
804
|
+
// the square sits one pixel inside it (to the right) via the `right` anchor.
|
|
805
|
+
const tableRightX = containerOffset.left + geometryReader.outerWidth(wtTable.TABLE);
|
|
806
|
+
style.right = `${tableRightX - boundaryOffset.left - 1}px`;
|
|
807
|
+
} else {
|
|
808
|
+
const freezeLineX = boundaryOffset.left + geometryReader.outerWidth(boundaryTD);
|
|
809
|
+
style.left = `${freezeLineX - containerOffset.left - 1}px`;
|
|
810
|
+
}
|
|
811
|
+
style.display = 'block';
|
|
812
|
+
return true;
|
|
813
|
+
}
|
|
814
|
+
/**
|
|
815
|
+
* Draws the corner square bridging the top and inline-start edges where a selection corner lands on
|
|
816
|
+
* both the `fixedRowsTop` and `fixedColumnsStart` freeze lines. Reuses the `top` border element.
|
|
817
|
+
*
|
|
818
|
+
* @private
|
|
819
|
+
* @param {boolean} isRtl Whether the grid is rendered right-to-left.
|
|
820
|
+
* @param {number} borderWidth The configured border width in pixels.
|
|
821
|
+
* @returns {boolean} `true` when the corner square was drawn.
|
|
822
|
+
*/ drawFrozenBoundaryCorner(isRtl, borderWidth) {
|
|
823
|
+
const boundaryRow = this.wot.getSetting('fixedRowsTop') - 1;
|
|
824
|
+
// The square sits on the boundary cell's BOTTOM edge (the top freeze line), one pixel up.
|
|
825
|
+
return this.drawFreezeCorner(boundaryRow, this.topStyle, isRtl, borderWidth, (boundaryTD, boundaryOffset, containerTop)=>boundaryOffset.top + this.wot.domBindings.geometryReader.outerHeight(boundaryTD) - containerTop - 1);
|
|
826
|
+
}
|
|
827
|
+
/**
|
|
828
|
+
* Bottom mirror of {@link Border#drawFrozenBoundaryCorner}: draws the corner square bridging the
|
|
829
|
+
* bottom and inline-start edges where a selection corner lands on both the `fixedRowsBottom` and
|
|
830
|
+
* `fixedColumnsStart` freeze lines. The boundary cell is the FIRST bottom-frozen row and the bottom
|
|
831
|
+
* freeze line is its TOP edge. Reuses the `bottom` border element.
|
|
832
|
+
*
|
|
833
|
+
* @private
|
|
834
|
+
* @param {boolean} isRtl Whether the grid is rendered right-to-left.
|
|
835
|
+
* @param {number} borderWidth The configured border width in pixels.
|
|
836
|
+
* @returns {boolean} `true` when the corner square was drawn.
|
|
837
|
+
*/ drawFrozenBottomBoundaryCorner(isRtl, borderWidth) {
|
|
838
|
+
const fixedRowsBottom = this.wot.getSetting('fixedRowsBottom');
|
|
839
|
+
const totalRows = this.wot.getSetting('totalRows');
|
|
840
|
+
const boundaryRow = totalRows - fixedRowsBottom;
|
|
841
|
+
const delta = Math.ceil(borderWidth / 2);
|
|
842
|
+
// Align with the bottom edge's vertical position (`cellBottom - thickness + delta`, where
|
|
843
|
+
// `cellBottom` is the freeze line = the boundary cell's TOP edge) so it joins seamlessly.
|
|
844
|
+
return this.drawFreezeCorner(boundaryRow, this.bottomStyle, isRtl, borderWidth, (_boundaryTD, boundaryOffset, containerTop)=>boundaryOffset.top - containerTop - borderWidth + delta);
|
|
845
|
+
}
|
|
846
|
+
/**
|
|
847
|
+
* Resolves the position the fill handle's overflow checks measure from, in the same space as the
|
|
848
|
+
* trimming container they compare against: viewport coordinates when the window trims the grid,
|
|
849
|
+
* otherwise the offset inside the scrollable content.
|
|
850
|
+
*
|
|
851
|
+
* A cell's own `offsetLeft`/`offsetTop` are relative to the `<table>`, and the master shifts that
|
|
852
|
+
* table through the spreader by the frozen-pane size and by the first rendered column/row offset.
|
|
853
|
+
* That shift is missing from the cell offsets, so the handle could measure as "inside" while it
|
|
854
|
+
* protruded past the content edge and forced a spurious scrollbar. The hider spans the whole
|
|
855
|
+
* scrollable content, so measuring from it puts the shift back.
|
|
856
|
+
*
|
|
857
|
+
* @private
|
|
858
|
+
* @param {HTMLElement} TD The cell that carries the fill handle (the selection's bottom-end cell).
|
|
859
|
+
* @param {{ top: number, left: number }} TDOffset The cell's already-measured document offset.
|
|
860
|
+
* @param {boolean} trimToWindow Whether the grid is trimmed by the window rather than an element.
|
|
861
|
+
* @returns {{ top: number, left: number }}
|
|
862
|
+
*/ getFillHandleAnchor(TD, TDOffset, trimToWindow) {
|
|
863
|
+
const { geometryReader } = this.wot.domBindings;
|
|
864
|
+
if (trimToWindow) {
|
|
865
|
+
const { top, left } = geometryReader.getBoundingClientRect(TD);
|
|
866
|
+
return {
|
|
867
|
+
top,
|
|
868
|
+
left
|
|
869
|
+
};
|
|
870
|
+
}
|
|
871
|
+
const hiderOffset = geometryReader.offset(this.wot.wtTable.hider);
|
|
872
|
+
return {
|
|
873
|
+
top: TDOffset.top - hiderOffset.top,
|
|
874
|
+
left: TDOffset.left - hiderOffset.left
|
|
875
|
+
};
|
|
876
|
+
}
|
|
877
|
+
/**
|
|
878
|
+
* Tells whether the fill handle must be pulled back inside the selection's inline-end edge instead
|
|
879
|
+
* of straddling it. Only the grid's last column needs that, where the overhang would spill out of
|
|
880
|
+
* the trimming container and force a scrollbar. A selection ending on the last frozen-start column
|
|
881
|
+
* does not: the frozen overlay draws that handle itself and already lands it flush against its own
|
|
882
|
+
* edge, which `border.spec.js` pins to the pixel — lifting it there moves it off that line.
|
|
883
|
+
*
|
|
884
|
+
* @private
|
|
885
|
+
* @param {number} toColumn The selection's inline-end column index.
|
|
886
|
+
* @param {number} anchorInlineStart The fill handle anchor's inline-start offset.
|
|
887
|
+
* @param {HTMLElement} TD The cell that carries the fill handle.
|
|
888
|
+
* @param {HTMLElement | Window} trimmingContainer The container that clips the grid.
|
|
889
|
+
* @param {boolean} isRtl Whether the grid renders right-to-left.
|
|
890
|
+
* @returns {boolean}
|
|
891
|
+
*/ isCornerLiftedAtInlineEnd(toColumn, anchorInlineStart, TD, trimmingContainer, isRtl) {
|
|
892
|
+
if (toColumn !== this.wot.getSetting('totalColumns') - 1) {
|
|
893
|
+
return false;
|
|
894
|
+
}
|
|
895
|
+
const { geometryReader } = this.wot.domBindings;
|
|
896
|
+
const cornerHalfWidth = parseInt(String(this.cornerDefaultStyle.width), 10) / 2;
|
|
897
|
+
if (isRtl) {
|
|
898
|
+
return anchorInlineStart - cornerHalfWidth < 0;
|
|
899
|
+
}
|
|
900
|
+
return anchorInlineStart + geometryReader.outerWidth(TD) + cornerHalfWidth >= geometryReader.innerWidth(trimmingContainer);
|
|
901
|
+
}
|
|
902
|
+
/**
|
|
903
|
+
* Block-axis mirror of {@link Border#isCornerLiftedAtInlineEnd}. Two rows pull the fill handle back
|
|
904
|
+
* inside the selection's bottom edge: the grid's last row, where the overhang would spill out of
|
|
905
|
+
* the trimming container, and the last scrollable row above the `fixedRowsBottom` line, where the
|
|
906
|
+
* bottom overlay is painted above the master and would cover the overhang. The last frozen-top row
|
|
907
|
+
* is not one of them — like the frozen-start column, that handle is drawn by the overlay itself and
|
|
908
|
+
* already sits flush against its edge.
|
|
909
|
+
*
|
|
910
|
+
* @private
|
|
911
|
+
* @param {number} toRow The selection's bottom row index.
|
|
912
|
+
* @param {number} anchorTop The fill handle anchor's top offset.
|
|
913
|
+
* @param {HTMLElement} TD The cell that carries the fill handle.
|
|
914
|
+
* @param {HTMLElement | Window} trimmingContainer The container that clips the grid.
|
|
915
|
+
* @returns {boolean}
|
|
916
|
+
*/ isCornerLiftedAtBlockEnd(toRow, anchorTop, TD, trimmingContainer) {
|
|
917
|
+
if (this.isFrozenBottomBoundaryEdge(toRow)) {
|
|
918
|
+
return true;
|
|
919
|
+
}
|
|
920
|
+
if (toRow !== this.wot.getSetting('totalRows') - 1) {
|
|
921
|
+
return false;
|
|
922
|
+
}
|
|
923
|
+
const { geometryReader } = this.wot.domBindings;
|
|
924
|
+
const cornerHalfHeight = parseInt(String(this.cornerDefaultStyle.height), 10) / 2;
|
|
925
|
+
return anchorTop + geometryReader.outerHeight(TD) + cornerHalfHeight >= geometryReader.innerHeight(trimmingContainer);
|
|
926
|
+
}
|
|
927
|
+
/**
|
|
291
928
|
* Show border around one or many cells.
|
|
292
929
|
*
|
|
930
|
+
* The fill handle is normally centered on the selection's bottom-end corner, so half of it hangs
|
|
931
|
+
* past that corner. Where that overhang cannot survive — a container edge, or a frozen pane that
|
|
932
|
+
* clips or covers it — the handle is pulled back inside instead, and `wtCornerInlineEndEdge` /
|
|
933
|
+
* `wtCornerBlockEndEdge` pull its hit area along. See {@link Border#isCornerLiftedAtInlineEnd} and
|
|
934
|
+
* {@link Border#isCornerLiftedAtBlockEnd} for which edges those are.
|
|
935
|
+
*
|
|
293
936
|
* @param {Array} corners The corner coordinates.
|
|
294
937
|
*/ appear(corners) {
|
|
295
938
|
if (this.disabled) {
|
|
296
939
|
return;
|
|
297
940
|
}
|
|
941
|
+
// A selection flush against a frozen-pane boundary has its top/inline-start edge rendered by the
|
|
942
|
+
// master on the freeze line, where the frozen overlay occludes it. Re-draw it inside the frozen
|
|
943
|
+
// overlay so it stays visible; no-op unless `fixedRowsTop`/`fixedColumnsStart` is used.
|
|
944
|
+
//
|
|
945
|
+
// When it draws, we return early and intentionally skip the rest of `appear` (corner/fill handle,
|
|
946
|
+
// the other edges): in these overlays the selection's cell isn't rendered here — only the seam
|
|
947
|
+
// edge slice is — so there is nothing else to draw.
|
|
948
|
+
if (this.drawFrozenBoundaryEdge(corners)) {
|
|
949
|
+
return;
|
|
950
|
+
}
|
|
298
951
|
let [fromRow, fromColumn, toRow, toColumn] = corners;
|
|
952
|
+
// Capture the top-start corner before the clamping below mutates it — used to suppress the
|
|
953
|
+
// master's boundary edge (so it isn't doubled by the frozen overlay's edge).
|
|
954
|
+
const originalFromRow = fromRow;
|
|
955
|
+
const originalFromColumn = fromColumn;
|
|
956
|
+
const originalToRow = toRow;
|
|
957
|
+
const originalToColumn = toColumn;
|
|
299
958
|
// borders can not be rendered on headers so hide them
|
|
300
959
|
if (fromRow < 0 && toRow < 0 || fromColumn < 0 && toColumn < 0) {
|
|
301
960
|
this.disappear();
|
|
302
961
|
return;
|
|
303
962
|
}
|
|
304
963
|
const { wtTable, rootDocument, rootWindow } = this.wot;
|
|
964
|
+
const { geometryReader } = this.wot.domBindings;
|
|
305
965
|
const isMultiple = fromRow !== toRow || fromColumn !== toColumn;
|
|
306
966
|
const firstRenderedRow = wtTable.getFirstRenderedRow();
|
|
307
967
|
const lastRenderedRow = wtTable.getLastRenderedRow();
|
|
@@ -337,22 +997,22 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
337
997
|
const toTD = isMultiple ? wtTable.getCell(this.wot.createCellCoords(toRow, toColumn)) : fromTD;
|
|
338
998
|
const fromTDEl = fromTD;
|
|
339
999
|
const toTDEl = isHTMLElement(toTD) ? toTD : fromTDEl;
|
|
340
|
-
const fromOffset = offset(fromTDEl);
|
|
341
|
-
const toOffset = isMultiple ? offset(toTDEl) : fromOffset;
|
|
342
|
-
const containerOffset = offset(wtTable.TABLE);
|
|
1000
|
+
const fromOffset = geometryReader.offset(fromTDEl);
|
|
1001
|
+
const toOffset = isMultiple ? geometryReader.offset(toTDEl) : fromOffset;
|
|
1002
|
+
const containerOffset = geometryReader.offset(wtTable.TABLE);
|
|
343
1003
|
const minTop = fromOffset.top;
|
|
344
1004
|
const minLeft = fromOffset.left;
|
|
345
1005
|
const isRtl = this.wot.wtSettings.getSetting('rtlMode');
|
|
346
1006
|
let inlineStartPos = 0;
|
|
347
1007
|
let width = 0;
|
|
348
1008
|
if (isRtl) {
|
|
349
|
-
const containerWidth = outerWidth(wtTable.TABLE);
|
|
350
|
-
const fromWidth = outerWidth(fromTDEl);
|
|
1009
|
+
const containerWidth = geometryReader.outerWidth(wtTable.TABLE);
|
|
1010
|
+
const fromWidth = geometryReader.outerWidth(fromTDEl);
|
|
351
1011
|
const gridRightPos = rootWindow.innerWidth - containerOffset.left - containerWidth;
|
|
352
1012
|
width = minLeft + fromWidth - toOffset.left;
|
|
353
1013
|
inlineStartPos = rootWindow.innerWidth - minLeft - fromWidth - gridRightPos - 1;
|
|
354
1014
|
} else {
|
|
355
|
-
width = toOffset.left + outerWidth(toTDEl) - minLeft;
|
|
1015
|
+
width = toOffset.left + geometryReader.outerWidth(toTDEl) - minLeft;
|
|
356
1016
|
inlineStartPos = minLeft - containerOffset.left - 1;
|
|
357
1017
|
}
|
|
358
1018
|
if (this.isEntireColumnSelected(fromRow, toRow)) {
|
|
@@ -367,7 +1027,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
367
1027
|
}
|
|
368
1028
|
}
|
|
369
1029
|
let top = minTop - containerOffset.top - 1;
|
|
370
|
-
let height = toOffset.top + outerHeight(toTDEl) - minTop;
|
|
1030
|
+
let height = toOffset.top + geometryReader.outerHeight(toTDEl) - minTop;
|
|
371
1031
|
if (this.isEntireRowSelected(fromColumn, toColumn)) {
|
|
372
1032
|
const columnHeader = fromColumn;
|
|
373
1033
|
const modifiedValues = this.getDimensionsFromHeader('rows', fromRow, toRow, columnHeader, containerOffset);
|
|
@@ -379,7 +1039,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
379
1039
|
fromTD = fromTH;
|
|
380
1040
|
}
|
|
381
1041
|
}
|
|
382
|
-
const style =
|
|
1042
|
+
const style = geometryReader.getComputedStyle(fromTDEl);
|
|
383
1043
|
if (parseInt(style.borderTopWidth, 10) > 0) {
|
|
384
1044
|
top += 1;
|
|
385
1045
|
height = height > 0 ? height - 1 : 0;
|
|
@@ -389,23 +1049,70 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
389
1049
|
width = width > 0 ? width - 1 : 0;
|
|
390
1050
|
}
|
|
391
1051
|
const inlinePosProperty = isRtl ? 'right' : 'left';
|
|
392
|
-
|
|
1052
|
+
// Corner geometry is resolved per edge rather than from a single `settings.border.width` delta,
|
|
1053
|
+
// which misaligns edges whose own width differs from the border-object default - e.g. a cell
|
|
1054
|
+
// shared by two overlapping custom-border ranges of different widths. Two distinct roles:
|
|
1055
|
+
// - POSITION offset (bottom `top`, end inline-start) uses the edge's OWN half-thickness, so a
|
|
1056
|
+
// straight run of same-width edges stays level across a shared cell.
|
|
1057
|
+
// - LENGTH extension (so a corner is filled) uses the PERPENDICULAR edge's half-thickness - the
|
|
1058
|
+
// edge it meets at that corner - so the horizontal line reaches, but does not overshoot, the
|
|
1059
|
+
// vertical one. Using its own half-thickness would make a thick edge stick out past a thinner
|
|
1060
|
+
// perpendicular edge.
|
|
1061
|
+
// For uniform-width borders every per-edge delta equals the old shared delta, so regular
|
|
1062
|
+
// selections are unaffected.
|
|
1063
|
+
// A corner is only filled when the perpendicular edge is actually drawn there. A horizontal edge
|
|
1064
|
+
// extends toward the end corner only if this cell has a visible end edge, and toward the bottom
|
|
1065
|
+
// only if it has a visible bottom edge. Without this, a per-cell custom border whose end/bottom
|
|
1066
|
+
// side is hidden (an interior or split-range edge) would still extend into the empty neighbour and
|
|
1067
|
+
// stick out. For regular selections the side settings are absent, so `!undefined?.hide` is `true`
|
|
1068
|
+
// and the extension behaves exactly as before.
|
|
1069
|
+
const extendToEnd = !this.settings.end?.hide;
|
|
1070
|
+
const extendToBottom = !this.settings.bottom?.hide;
|
|
1071
|
+
const bottomThickness = parseInt(this.bottomStyle.height, 10);
|
|
1072
|
+
const endThickness = parseInt(this.endStyle.width, 10);
|
|
1073
|
+
const bottomDelta = Math.ceil(bottomThickness / 2);
|
|
1074
|
+
const endDelta = Math.ceil(endThickness / 2);
|
|
1075
|
+
const horizontalExtension = extendToEnd ? endDelta : 0;
|
|
1076
|
+
const verticalExtension = extendToBottom ? bottomDelta : 0;
|
|
393
1077
|
this.topStyle.top = `${top}px`;
|
|
394
1078
|
this.topStyle[inlinePosProperty] = `${inlineStartPos}px`;
|
|
395
|
-
this.topStyle.width = `${width +
|
|
1079
|
+
this.topStyle.width = `${width + horizontalExtension}px`;
|
|
396
1080
|
this.topStyle.display = 'block';
|
|
397
1081
|
this.startStyle.top = `${top}px`;
|
|
398
1082
|
this.startStyle[inlinePosProperty] = `${inlineStartPos}px`;
|
|
399
|
-
this.startStyle.height = `${height +
|
|
1083
|
+
this.startStyle.height = `${height + verticalExtension}px`;
|
|
400
1084
|
this.startStyle.display = 'block';
|
|
401
|
-
this.bottomStyle.top = `${top + height -
|
|
1085
|
+
this.bottomStyle.top = `${top + height - bottomThickness + bottomDelta}px`;
|
|
402
1086
|
this.bottomStyle[inlinePosProperty] = `${inlineStartPos}px`;
|
|
403
|
-
this.bottomStyle.width = `${width +
|
|
1087
|
+
this.bottomStyle.width = `${width + horizontalExtension}px`;
|
|
404
1088
|
this.bottomStyle.display = 'block';
|
|
405
1089
|
this.endStyle.top = `${top}px`;
|
|
406
|
-
this.endStyle[inlinePosProperty] = `${inlineStartPos + width -
|
|
407
|
-
this.endStyle.height = `${height +
|
|
1090
|
+
this.endStyle[inlinePosProperty] = `${inlineStartPos + width - endThickness + endDelta}px`;
|
|
1091
|
+
this.endStyle.height = `${height + verticalExtension}px`;
|
|
408
1092
|
this.endStyle.display = 'block';
|
|
1093
|
+
// A boundary edge owned by the frozen overlay must be hidden on every other overlay that would
|
|
1094
|
+
// redraw it in its regular flow, so the lines don't stack into a doubled border. The row-freeze
|
|
1095
|
+
// edge is hidden on the master and `inline_start`; the column-freeze edge on the master and `top`.
|
|
1096
|
+
const overlayName = wtTable.name;
|
|
1097
|
+
// The master keeps drawing the seam top edge (its straddling lower half stays visible below the
|
|
1098
|
+
// frozen pane / editor); the frozen overlay adds the upper half on top of the pane. Only hide the
|
|
1099
|
+
// master when the whole selection is in frozen columns (then the inline-start pane occludes it and
|
|
1100
|
+
// the corner overlay owns the edge). `inline_start` always hides its row-edge duplicate.
|
|
1101
|
+
const seamAllFrozenCols = originalToColumn < this.wot.getSetting('fixedColumnsStart');
|
|
1102
|
+
if (this.isFrozenBoundaryEdge('row', originalFromRow) && (overlayName === 'inline_start' || wtTable.isMaster && seamAllFrozenCols)) {
|
|
1103
|
+
this.topStyle.display = 'none';
|
|
1104
|
+
}
|
|
1105
|
+
if (this.isFrozenBoundaryEdge('column', originalFromColumn) && (wtTable.isMaster || overlayName === 'top' || overlayName === 'bottom')) {
|
|
1106
|
+
this.startStyle.display = 'none';
|
|
1107
|
+
}
|
|
1108
|
+
// The bottom-freeze edge straddles its seam: the master draws the half above the freeze line and
|
|
1109
|
+
// the `bottom` overlay the half below it (on top of the opaque bottom pane), so together they show
|
|
1110
|
+
// the full thickness in both selection and edit modes. Hide the master only when the whole
|
|
1111
|
+
// selection is in frozen columns (then the inline-start pane occludes it and the bottom corner owns
|
|
1112
|
+
// the edge); `inline_start` always hides its duplicate.
|
|
1113
|
+
if (this.isFrozenBottomBoundaryEdge(originalToRow) && (overlayName === 'inline_start' || wtTable.isMaster && seamAllFrozenCols)) {
|
|
1114
|
+
this.bottomStyle.display = 'none';
|
|
1115
|
+
}
|
|
409
1116
|
let cornerVisibleSetting = this.settings.border?.cornerVisible;
|
|
410
1117
|
cornerVisibleSetting = typeof cornerVisibleSetting === 'function' ? cornerVisibleSetting(this.settings.layerLevel) : cornerVisibleSetting;
|
|
411
1118
|
const hookResult = this.wot.getSetting('onModifyGetCellCoords', toRow, toColumn, false, 'render');
|
|
@@ -439,43 +1146,68 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
439
1146
|
const cornerBorderCompensation = parseInt(String(this.cornerDefaultStyle.borderWidth), 10) - 1;
|
|
440
1147
|
const cornerHalfWidth = Math.ceil(parseInt(String(this.cornerDefaultStyle.width), 10) / 2);
|
|
441
1148
|
const cornerHalfHeight = Math.ceil(parseInt(String(this.cornerDefaultStyle.height), 10) / 2);
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
cornerOverlappingContainer = cornerEdge < 0;
|
|
449
|
-
} else {
|
|
450
|
-
cornerEdge = toTdOffsetLeft + outerWidth(toTDEl) + parseInt(String(this.cornerDefaultStyle.width), 10) / 2;
|
|
451
|
-
cornerOverlappingContainer = cornerEdge >= innerWidth(trimmingContainer);
|
|
452
|
-
}
|
|
453
|
-
if (cornerOverlappingContainer) {
|
|
454
|
-
const inlineStartPosition = Math.floor(inlineStartPos + width + this.cornerCenterPointOffset - cornerHalfWidth - cornerBorderCompensation);
|
|
455
|
-
addClass(this.corner, 'wtCornerInlineEndEdge');
|
|
456
|
-
this.cornerStyle[inlinePosProperty] = `${inlineStartPosition - 1}px`;
|
|
457
|
-
}
|
|
1149
|
+
const fillHandleAnchor = this.getFillHandleAnchor(toTDEl, toOffset, trimToWindow);
|
|
1150
|
+
const liftsAtInlineEnd = this.isCornerLiftedAtInlineEnd(toColumn, fillHandleAnchor.left, toTDEl, trimmingContainer, isRtl);
|
|
1151
|
+
if (liftsAtInlineEnd) {
|
|
1152
|
+
const inlineStartPosition = Math.floor(inlineStartPos + width + this.cornerCenterPointOffset - cornerHalfWidth - cornerBorderCompensation);
|
|
1153
|
+
addClass(this.corner, 'wtCornerInlineEndEdge');
|
|
1154
|
+
this.cornerStyle[inlinePosProperty] = `${inlineStartPosition - 1}px`;
|
|
458
1155
|
} else {
|
|
459
1156
|
removeClass(this.corner, 'wtCornerInlineEndEdge');
|
|
460
1157
|
}
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
const
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
if (cornerOverlappingContainer) {
|
|
467
|
-
const cornerTopPosition = Math.floor(top + height + this.cornerCenterPointOffset - cornerHalfHeight - cornerBorderCompensation);
|
|
468
|
-
addClass(this.corner, 'wtCornerBlockEndEdge');
|
|
469
|
-
this.cornerStyle.top = `${cornerTopPosition - 1}px`;
|
|
470
|
-
}
|
|
1158
|
+
const liftsAtBlockEnd = this.isCornerLiftedAtBlockEnd(toRow, fillHandleAnchor.top, toTDEl, trimmingContainer);
|
|
1159
|
+
if (liftsAtBlockEnd) {
|
|
1160
|
+
const cornerTopPosition = Math.floor(top + height + this.cornerCenterPointOffset - cornerHalfHeight - cornerBorderCompensation);
|
|
1161
|
+
addClass(this.corner, 'wtCornerBlockEndEdge');
|
|
1162
|
+
this.cornerStyle.top = `${cornerTopPosition - 1}px`;
|
|
471
1163
|
} else {
|
|
472
1164
|
removeClass(this.corner, 'wtCornerBlockEndEdge');
|
|
473
1165
|
}
|
|
474
1166
|
this.cornerStyle.display = 'block';
|
|
475
1167
|
}
|
|
476
|
-
if (isMobileBrowser() && this.
|
|
1168
|
+
if (isMobileBrowser() && this.wot.getSetting('isDataViewInstance')) {
|
|
477
1169
|
this.updateMultipleSelectionHandlesPosition(toRow, toColumn, top, inlineStartPos, width, height);
|
|
478
1170
|
}
|
|
1171
|
+
let adjustVisible = this.settings.border?.adjustHandlesVisible;
|
|
1172
|
+
adjustVisible = typeof adjustVisible === 'function' ? adjustVisible(this.settings.layerLevel) : adjustVisible;
|
|
1173
|
+
if (!isMobileBrowser() && adjustVisible && this.wot.getSetting('isDataViewInstance')) {
|
|
1174
|
+
const adjustHandles = this.adjustHandles ?? this.createAdjustHandles();
|
|
1175
|
+
this.positionAdjustHandles(top, inlineStartPos, width, height, corners);
|
|
1176
|
+
// Hide handles on an edge that lands on a frozen-pane line. This boundary rule is
|
|
1177
|
+
// intentionally Walkontable-local: Walkontable cannot import core helpers, so the
|
|
1178
|
+
// matching core-side check was removed as dead code — this is the single
|
|
1179
|
+
// authoritative enforcement point.
|
|
1180
|
+
if (this.isFrozenBoundaryEdge('row', corners[0]) || this.isFrozenBottomBoundaryOppositeEdge(corners[0])) {
|
|
1181
|
+
adjustHandles.styles.top.display = 'none';
|
|
1182
|
+
}
|
|
1183
|
+
if (this.isFrozenBoundaryEdge('column', corners[1])) {
|
|
1184
|
+
adjustHandles.styles.start.display = 'none';
|
|
1185
|
+
}
|
|
1186
|
+
if (this.isFrozenStartBoundaryOppositeEdge('row', corners[2]) || this.isFrozenBottomBoundaryEdge(corners[2])) {
|
|
1187
|
+
adjustHandles.styles.bottom.display = 'none';
|
|
1188
|
+
}
|
|
1189
|
+
if (this.isFrozenStartBoundaryOppositeEdge('column', corners[3])) {
|
|
1190
|
+
adjustHandles.styles.end.display = 'none';
|
|
1191
|
+
}
|
|
1192
|
+
} else if (this.adjustHandles) {
|
|
1193
|
+
this.adjustHandles.styles.top.display = 'none';
|
|
1194
|
+
this.adjustHandles.styles.bottom.display = 'none';
|
|
1195
|
+
this.adjustHandles.styles.start.display = 'none';
|
|
1196
|
+
this.adjustHandles.styles.end.display = 'none';
|
|
1197
|
+
}
|
|
1198
|
+
let moveEnabled = this.settings.border?.moveEnabled;
|
|
1199
|
+
moveEnabled = typeof moveEnabled === 'function' ? moveEnabled(this.settings.layerLevel) : moveEnabled;
|
|
1200
|
+
if (!isMobileBrowser() && moveEnabled && this.wot.getSetting('isDataViewInstance')) {
|
|
1201
|
+
if (!this.moveZone) {
|
|
1202
|
+
this.createMoveZone();
|
|
1203
|
+
}
|
|
1204
|
+
this.positionMoveZone(top, inlineStartPos, width, height);
|
|
1205
|
+
} else if (this.moveZone) {
|
|
1206
|
+
this.moveZone.styles.top.display = 'none';
|
|
1207
|
+
this.moveZone.styles.bottom.display = 'none';
|
|
1208
|
+
this.moveZone.styles.start.display = 'none';
|
|
1209
|
+
this.moveZone.styles.end.display = 'none';
|
|
1210
|
+
}
|
|
479
1211
|
}
|
|
480
1212
|
/**
|
|
481
1213
|
* Check whether an entire column of cells is selected.
|
|
@@ -508,6 +1240,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
508
1240
|
* @param {number} containerOffset Offset of the container.
|
|
509
1241
|
* @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).
|
|
510
1242
|
*/ getDimensionsFromHeader(direction, fromIndex, toIndex, headerIndex, containerOffset) {
|
|
1243
|
+
const { geometryReader } = this.wot.domBindings;
|
|
511
1244
|
const { wtTable } = this.wot;
|
|
512
1245
|
const rootHotElement = wtTable.wtRootElement.parentNode;
|
|
513
1246
|
let getHeaderFn = null;
|
|
@@ -521,13 +1254,13 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
521
1254
|
switch(direction){
|
|
522
1255
|
case 'rows':
|
|
523
1256
|
getHeaderFn = (...args)=>wtTable.getRowHeader(args[0], args[1]);
|
|
524
|
-
dimensionFn = (el)=>outerHeight(el);
|
|
1257
|
+
dimensionFn = (el)=>geometryReader.outerHeight(el);
|
|
525
1258
|
entireSelectionClassname = 'ht__selection--rows';
|
|
526
1259
|
dimensionProperty = 'top';
|
|
527
1260
|
break;
|
|
528
1261
|
case 'columns':
|
|
529
1262
|
getHeaderFn = (...args)=>wtTable.getColumnHeader(args[0], args[1]);
|
|
530
|
-
dimensionFn = (el)=>outerWidth(el);
|
|
1263
|
+
dimensionFn = (el)=>geometryReader.outerWidth(el);
|
|
531
1264
|
entireSelectionClassname = 'ht__selection--columns';
|
|
532
1265
|
dimensionProperty = 'left';
|
|
533
1266
|
break;
|
|
@@ -540,8 +1273,8 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
540
1273
|
if (!startHeader || !endHeader) {
|
|
541
1274
|
return false;
|
|
542
1275
|
}
|
|
543
|
-
const startHeaderOffset = offset(startHeader);
|
|
544
|
-
const endOffset = offset(endHeader);
|
|
1276
|
+
const startHeaderOffset = geometryReader.offset(startHeader);
|
|
1277
|
+
const endOffset = geometryReader.offset(endHeader);
|
|
545
1278
|
const startOff = startHeaderOffset[dimensionProperty];
|
|
546
1279
|
const endOff = endOffset[dimensionProperty];
|
|
547
1280
|
const contOff = containerOffset[dimensionProperty];
|
|
@@ -556,6 +1289,72 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
556
1289
|
return false;
|
|
557
1290
|
}
|
|
558
1291
|
/**
|
|
1292
|
+
* Positions the four edge-adjustment handles at the midpoint of each edge, hiding any handle
|
|
1293
|
+
* whose edge is flush with the grid boundary. Called at the end of `appear()` when the
|
|
1294
|
+
* `selectionHandles` feature is enabled for this highlight.
|
|
1295
|
+
*
|
|
1296
|
+
* Handle dimensions are sourced from the `--ht-cell-selection-handle-size` and
|
|
1297
|
+
* `--ht-cell-selection-handle-length` CSS tokens via a cached stylesHandler read
|
|
1298
|
+
* (no layout-forcing DOM access). Top/bottom handles are horizontal pills
|
|
1299
|
+
* (width = length, height = size); start/end handles are vertical pills (width = size, height = length).
|
|
1300
|
+
*
|
|
1301
|
+
* @private
|
|
1302
|
+
* @param {number} top The selection border top (px, container-relative).
|
|
1303
|
+
* @param {number} inlineStart The selection border inline-start (px, container-relative).
|
|
1304
|
+
* @param {number} width The selection border width (px).
|
|
1305
|
+
* @param {number} height The selection border height (px).
|
|
1306
|
+
* @param {number[]} corners The raw `[fromRow, fromColumn, toRow, toColumn]` visual corners.
|
|
1307
|
+
*/ positionAdjustHandles(top, inlineStart, width, height, corners) {
|
|
1308
|
+
const isRtl = this.wot.wtSettings.getSetting('rtlMode');
|
|
1309
|
+
const inlineProp = isRtl ? 'right' : 'left';
|
|
1310
|
+
const [fromRow, fromColumn, toRow, toColumn] = corners;
|
|
1311
|
+
const lastRow = this.wot.getSetting('totalRows') - 1;
|
|
1312
|
+
const lastColumn = this.wot.getSetting('totalColumns') - 1;
|
|
1313
|
+
// Handle dimensions are read from the CSS token cache (not computed style — that would be a
|
|
1314
|
+
// layout-forcing read). Visual sizing lives in the stylesheet; JS reads the resolved token values.
|
|
1315
|
+
const stylesHandler = this.wot.wtSettings.getSetting('stylesHandler');
|
|
1316
|
+
const sizeRaw = stylesHandler.getCSSVariableValue('cell-selection-handle-size');
|
|
1317
|
+
const lengthRaw = stylesHandler.getCSSVariableValue('cell-selection-handle-length');
|
|
1318
|
+
const size = parseInt(sizeRaw !== null && sizeRaw !== undefined ? String(sizeRaw) : '8', 10);
|
|
1319
|
+
const length = parseInt(lengthRaw !== null && lengthRaw !== undefined ? String(lengthRaw) : '24', 10);
|
|
1320
|
+
// top/bottom handles are horizontal pills: width = length, height = size.
|
|
1321
|
+
const topW = length;
|
|
1322
|
+
const topH = size;
|
|
1323
|
+
const bottomW = length;
|
|
1324
|
+
const bottomH = size;
|
|
1325
|
+
// start/end handles are vertical pills: width = size, height = length.
|
|
1326
|
+
const startW = size;
|
|
1327
|
+
const startH = length;
|
|
1328
|
+
const endW = size;
|
|
1329
|
+
const endH = length;
|
|
1330
|
+
// Only ever called from `appear()` after the handles have been created.
|
|
1331
|
+
const s = this.adjustHandles.styles;
|
|
1332
|
+
s.top.display = 'none';
|
|
1333
|
+
s.bottom.display = 'none';
|
|
1334
|
+
s.start.display = 'none';
|
|
1335
|
+
s.end.display = 'none';
|
|
1336
|
+
if (fromRow > 0) {
|
|
1337
|
+
s.top[inlineProp] = `${inlineStart + Math.round(width / 2) - Math.round(topW / 2)}px`;
|
|
1338
|
+
s.top.top = `${top - Math.round(topH / 2)}px`;
|
|
1339
|
+
s.top.display = 'block';
|
|
1340
|
+
}
|
|
1341
|
+
if (toRow < lastRow) {
|
|
1342
|
+
s.bottom[inlineProp] = `${inlineStart + Math.round(width / 2) - Math.round(bottomW / 2)}px`;
|
|
1343
|
+
s.bottom.top = `${top + height - Math.round(bottomH / 2)}px`;
|
|
1344
|
+
s.bottom.display = 'block';
|
|
1345
|
+
}
|
|
1346
|
+
if (fromColumn > 0) {
|
|
1347
|
+
s.start[inlineProp] = `${inlineStart - Math.round(startW / 2)}px`;
|
|
1348
|
+
s.start.top = `${top + Math.round(height / 2) - Math.round(startH / 2)}px`;
|
|
1349
|
+
s.start.display = 'block';
|
|
1350
|
+
}
|
|
1351
|
+
if (toColumn < lastColumn) {
|
|
1352
|
+
s.end[inlineProp] = `${inlineStart + width - Math.round(endW / 2)}px`;
|
|
1353
|
+
s.end.top = `${top + Math.round(height / 2) - Math.round(endH / 2)}px`;
|
|
1354
|
+
s.end.display = 'block';
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1357
|
+
/**
|
|
559
1358
|
* Change border style.
|
|
560
1359
|
*
|
|
561
1360
|
* @private
|
|
@@ -618,12 +1417,24 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
618
1417
|
this.startStyle.display = 'none';
|
|
619
1418
|
this.endStyle.display = 'none';
|
|
620
1419
|
this.cornerStyle.display = 'none';
|
|
621
|
-
if (isMobileBrowser() && this.
|
|
1420
|
+
if (isMobileBrowser() && this.wot.getSetting('isDataViewInstance')) {
|
|
622
1421
|
this.selectionHandles.styles.top.display = 'none';
|
|
623
1422
|
this.selectionHandles.styles.topHitArea.display = 'none';
|
|
624
1423
|
this.selectionHandles.styles.bottom.display = 'none';
|
|
625
1424
|
this.selectionHandles.styles.bottomHitArea.display = 'none';
|
|
626
1425
|
}
|
|
1426
|
+
if (this.adjustHandles) {
|
|
1427
|
+
this.adjustHandles.styles.top.display = 'none';
|
|
1428
|
+
this.adjustHandles.styles.bottom.display = 'none';
|
|
1429
|
+
this.adjustHandles.styles.start.display = 'none';
|
|
1430
|
+
this.adjustHandles.styles.end.display = 'none';
|
|
1431
|
+
}
|
|
1432
|
+
if (this.moveZone) {
|
|
1433
|
+
this.moveZone.styles.top.display = 'none';
|
|
1434
|
+
this.moveZone.styles.bottom.display = 'none';
|
|
1435
|
+
this.moveZone.styles.start.display = 'none';
|
|
1436
|
+
this.moveZone.styles.end.display = 'none';
|
|
1437
|
+
}
|
|
627
1438
|
}
|
|
628
1439
|
/**
|
|
629
1440
|
* Cleans up all the DOM state related to a Border instance. Call this prior to deleting a Border instance.
|
|
@@ -642,7 +1453,6 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
642
1453
|
return;
|
|
643
1454
|
}
|
|
644
1455
|
this.eventManager = wotInstance.eventManager;
|
|
645
|
-
this.instance = wotInstance;
|
|
646
1456
|
this.wot = wotInstance;
|
|
647
1457
|
this.settings = settings;
|
|
648
1458
|
this.mouseDown = false;
|
|
@@ -655,7 +1465,7 @@ const BORDER_STYLE_HORIZONTAL_SUFFIX = '-horizontal';
|
|
|
655
1465
|
this.bottomStyle = null;
|
|
656
1466
|
this.startStyle = null;
|
|
657
1467
|
this.endStyle = null;
|
|
658
|
-
this.cornerDefaultStyle = getCornerStyle(this.
|
|
1468
|
+
this.cornerDefaultStyle = getCornerStyle(this.wot);
|
|
659
1469
|
// Offset to moving the corner to be centered relative to the grid.
|
|
660
1470
|
this.cornerCenterPointOffset = -Math.ceil(parseInt(String(this.cornerDefaultStyle.width), 10) / 2);
|
|
661
1471
|
this.corner = null;
|