handsontable 13.1.0 → 14.0.0-next-d97b156-20231027
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/calculator/constants.js +3 -6
- package/3rdparty/walkontable/src/calculator/viewportColumns.js +1 -2
- package/3rdparty/walkontable/src/calculator/viewportRows.js +1 -2
- package/3rdparty/walkontable/src/cell/coords.d.ts +8 -1
- package/3rdparty/walkontable/src/cell/coords.js +81 -13
- package/3rdparty/walkontable/src/cell/coords.mjs +80 -11
- package/3rdparty/walkontable/src/cell/range.d.ts +9 -2
- package/3rdparty/walkontable/src/cell/range.js +39 -9
- package/3rdparty/walkontable/src/cell/range.mjs +38 -7
- package/3rdparty/walkontable/src/core/_base.js +9 -3
- package/3rdparty/walkontable/src/core/_base.mjs +9 -3
- package/3rdparty/walkontable/src/core/clone.js +2 -2
- package/3rdparty/walkontable/src/core/clone.mjs +2 -2
- package/3rdparty/walkontable/src/core/core.js +3 -2
- package/3rdparty/walkontable/src/core/core.mjs +3 -2
- package/3rdparty/walkontable/src/event.js +13 -12
- package/3rdparty/walkontable/src/event.mjs +12 -10
- package/3rdparty/walkontable/src/facade/core.js +2 -2
- package/3rdparty/walkontable/src/facade/core.mjs +2 -2
- package/3rdparty/walkontable/src/filter/column.js +1 -2
- package/3rdparty/walkontable/src/filter/row.js +1 -2
- package/3rdparty/walkontable/src/index.js +12 -4
- package/3rdparty/walkontable/src/index.mjs +2 -2
- package/3rdparty/walkontable/src/overlay/_base.js +13 -2
- package/3rdparty/walkontable/src/overlay/_base.mjs +14 -3
- package/3rdparty/walkontable/src/overlay/constants.js +7 -14
- package/3rdparty/walkontable/src/overlay/inlineStart.js +2 -6
- package/3rdparty/walkontable/src/overlay/inlineStart.mjs +2 -6
- package/3rdparty/walkontable/src/overlay/top.js +2 -6
- package/3rdparty/walkontable/src/overlay/top.mjs +2 -6
- package/3rdparty/walkontable/src/overlays.js +1 -2
- package/3rdparty/walkontable/src/renderer/cells.js +10 -0
- package/3rdparty/walkontable/src/renderer/cells.mjs +11 -1
- package/3rdparty/walkontable/src/renderer/columnHeaders.js +13 -0
- package/3rdparty/walkontable/src/renderer/columnHeaders.mjs +14 -1
- package/3rdparty/walkontable/src/renderer/rowHeaders.js +8 -0
- package/3rdparty/walkontable/src/renderer/rowHeaders.mjs +8 -0
- package/3rdparty/walkontable/src/renderer/rows.js +13 -0
- package/3rdparty/walkontable/src/renderer/rows.mjs +13 -0
- package/3rdparty/walkontable/src/renderer/table.js +9 -0
- package/3rdparty/walkontable/src/renderer/table.mjs +9 -0
- package/3rdparty/walkontable/src/scroll.js +3 -2
- package/3rdparty/walkontable/src/scroll.mjs +2 -0
- package/3rdparty/walkontable/src/{border.js → selection/border/border.js} +8 -14
- package/3rdparty/walkontable/src/{border.mjs → selection/border/border.mjs} +7 -12
- package/3rdparty/walkontable/src/selection/border/constants.js +15 -0
- package/3rdparty/walkontable/src/selection/border/constants.mjs +12 -0
- package/3rdparty/walkontable/src/selection/constants.js +54 -0
- package/3rdparty/walkontable/src/selection/constants.mjs +51 -0
- package/3rdparty/walkontable/src/selection/index.js +26 -0
- package/3rdparty/walkontable/src/selection/index.mjs +5 -0
- package/3rdparty/walkontable/src/selection/manager.js +274 -0
- package/3rdparty/walkontable/src/selection/manager.mjs +269 -0
- package/3rdparty/walkontable/src/selection/scanner.js +270 -0
- package/3rdparty/walkontable/src/selection/scanner.mjs +267 -0
- package/3rdparty/walkontable/src/selection/selection.js +100 -0
- package/3rdparty/walkontable/src/selection/selection.mjs +96 -0
- package/3rdparty/walkontable/src/settings.js +13 -4
- package/3rdparty/walkontable/src/settings.mjs +13 -4
- package/3rdparty/walkontable/src/table/bottom.js +1 -2
- package/3rdparty/walkontable/src/table/bottomInlineStartCorner.js +1 -2
- package/3rdparty/walkontable/src/table/inlineStart.js +1 -2
- package/3rdparty/walkontable/src/table/master.js +3 -6
- package/3rdparty/walkontable/src/table/master.mjs +2 -4
- package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +10 -2
- package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +9 -0
- package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +10 -2
- package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +9 -0
- package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +10 -2
- package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +9 -0
- package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +10 -2
- package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +9 -0
- package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +10 -2
- package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +9 -0
- package/3rdparty/walkontable/src/table/top.js +1 -2
- package/3rdparty/walkontable/src/table/topInlineStartCorner.js +1 -2
- package/3rdparty/walkontable/src/table.js +20 -80
- package/3rdparty/walkontable/src/table.mjs +20 -79
- package/3rdparty/walkontable/src/utils/orderView/constants.js +3 -6
- package/3rdparty/walkontable/src/viewport.js +1 -2
- package/CHANGELOG.md +51 -0
- package/base.js +3 -4
- package/base.mjs +2 -2
- package/cellTypes/autocompleteType/autocompleteType.js +3 -5
- package/cellTypes/checkboxType/checkboxType.js +3 -5
- package/cellTypes/dateType/dateType.d.ts +3 -3
- package/cellTypes/dateType/dateType.js +5 -7
- package/cellTypes/dateType/dateType.mjs +2 -2
- package/cellTypes/dropdownType/dropdownType.js +3 -5
- package/cellTypes/handsontableType/handsontableType.d.ts +3 -3
- package/cellTypes/handsontableType/handsontableType.js +5 -7
- package/cellTypes/handsontableType/handsontableType.mjs +2 -2
- package/cellTypes/index.d.ts +3 -0
- package/cellTypes/index.js +4 -0
- package/cellTypes/index.mjs +3 -1
- package/cellTypes/numericType/numericType.js +3 -5
- package/cellTypes/passwordType/passwordType.js +3 -5
- package/cellTypes/selectType/index.d.ts +1 -0
- package/cellTypes/selectType/index.js +6 -0
- package/cellTypes/selectType/index.mjs +1 -0
- package/cellTypes/selectType/selectType.d.ts +14 -0
- package/cellTypes/selectType/selectType.js +11 -0
- package/cellTypes/selectType/selectType.mjs +8 -0
- package/cellTypes/textType/textType.js +3 -5
- package/cellTypes/timeType/timeType.js +3 -5
- package/common.d.ts +1 -1
- package/core/focusCatcher/focusDetector.js +63 -0
- package/core/focusCatcher/focusDetector.mjs +59 -0
- package/core/focusCatcher/index.js +148 -0
- package/core/focusCatcher/index.mjs +144 -0
- package/core/index.js +9 -0
- package/core/index.mjs +1 -0
- package/core.d.ts +10 -5
- package/core.js +327 -359
- package/core.mjs +327 -359
- package/dataMap/dataMap.js +1 -2
- package/dataMap/dataSource.js +1 -2
- package/dataMap/metaManager/metaSchema.js +65 -0
- package/dataMap/metaManager/metaSchema.mjs +65 -0
- package/dataMap/metaManager/mods/extendMetaProperties.js +7 -1
- package/dataMap/metaManager/mods/extendMetaProperties.mjs +7 -1
- package/dataMap/replaceData.js +5 -0
- package/dataMap/replaceData.mjs +5 -0
- package/dist/handsontable.css +94 -76
- package/dist/handsontable.full.css +94 -76
- package/dist/handsontable.full.js +21236 -14104
- package/dist/handsontable.full.min.css +8 -8
- package/dist/handsontable.full.min.js +170 -152
- package/dist/handsontable.js +22016 -15254
- package/dist/handsontable.min.css +7 -7
- package/dist/handsontable.min.js +31 -23
- package/dist/languages/all.js +47 -40
- package/dist/languages/all.min.js +1 -1
- package/dist/languages/ar-AR.js +1 -2
- package/dist/languages/cs-CZ.js +1 -2
- package/dist/languages/de-CH.js +1 -2
- package/dist/languages/de-DE.js +1 -2
- package/dist/languages/en-US.js +15 -3
- package/dist/languages/en-US.min.js +1 -1
- package/dist/languages/es-MX.js +1 -2
- package/dist/languages/fr-FR.js +1 -2
- package/dist/languages/it-IT.js +1 -2
- package/dist/languages/ja-JP.js +1 -2
- package/dist/languages/ko-KR.js +1 -2
- package/dist/languages/lv-LV.js +1 -2
- package/dist/languages/nb-NO.js +1 -2
- package/dist/languages/nl-NL.js +1 -2
- package/dist/languages/pl-PL.js +15 -3
- package/dist/languages/pl-PL.min.js +1 -1
- package/dist/languages/pt-BR.js +1 -2
- package/dist/languages/ru-RU.js +1 -2
- package/dist/languages/sr-SP.js +1 -2
- package/dist/languages/zh-CN.js +1 -2
- package/dist/languages/zh-TW.js +1 -2
- package/editorManager.js +17 -91
- package/editorManager.mjs +16 -87
- package/editors/autocompleteEditor/autocompleteEditor.js +65 -11
- package/editors/autocompleteEditor/autocompleteEditor.mjs +65 -10
- package/editors/baseEditor/baseEditor.js +19 -13
- package/editors/baseEditor/baseEditor.mjs +16 -7
- package/editors/checkboxEditor/checkboxEditor.js +1 -2
- package/editors/dateEditor/dateEditor.js +27 -9
- package/editors/dateEditor/dateEditor.mjs +27 -8
- package/editors/dropdownEditor/dropdownEditor.js +1 -2
- package/editors/handsontableEditor/handsontableEditor.js +14 -7
- package/editors/handsontableEditor/handsontableEditor.mjs +14 -6
- package/editors/numericEditor/numericEditor.js +1 -2
- package/editors/passwordEditor/passwordEditor.js +1 -2
- package/editors/selectEditor/selectEditor.js +1 -2
- package/editors/textEditor/textEditor.js +20 -29
- package/editors/textEditor/textEditor.mjs +22 -30
- package/editors/timeEditor/timeEditor.js +1 -2
- package/eventManager.js +1 -2
- package/focusManager.d.ts +12 -0
- package/focusManager.js +265 -0
- package/focusManager.mjs +261 -0
- package/helpers/a11y.js +81 -0
- package/helpers/a11y.mjs +39 -0
- package/helpers/dom/element.js +224 -12
- package/helpers/dom/element.mjs +216 -10
- package/helpers/dom/event.d.ts +1 -0
- package/helpers/dom/event.js +25 -0
- package/helpers/dom/event.mjs +24 -0
- package/helpers/mixed.js +2 -2
- package/helpers/mixed.mjs +2 -2
- package/helpers/number.d.ts +1 -0
- package/helpers/number.js +18 -0
- package/helpers/number.mjs +17 -0
- package/helpers/unicode.js +1 -2
- package/i18n/constants.js +97 -160
- package/i18n/constants.mjs +17 -1
- package/i18n/languages/ar-AR.js +3 -4
- package/i18n/languages/cs-CZ.js +3 -4
- package/i18n/languages/de-CH.js +3 -4
- package/i18n/languages/de-DE.js +3 -4
- package/i18n/languages/en-US.js +17 -5
- package/i18n/languages/en-US.mjs +14 -1
- package/i18n/languages/es-MX.js +3 -4
- package/i18n/languages/fr-FR.js +3 -4
- package/i18n/languages/it-IT.js +3 -4
- package/i18n/languages/ja-JP.js +3 -4
- package/i18n/languages/ko-KR.js +3 -4
- package/i18n/languages/lv-LV.js +3 -4
- package/i18n/languages/nb-NO.js +3 -4
- package/i18n/languages/nl-NL.js +3 -4
- package/i18n/languages/pl-PL.js +17 -5
- package/i18n/languages/pl-PL.mjs +14 -1
- package/i18n/languages/pt-BR.js +3 -4
- package/i18n/languages/ru-RU.js +3 -4
- package/i18n/languages/sr-SP.js +3 -4
- package/i18n/languages/zh-CN.js +3 -4
- package/i18n/languages/zh-TW.js +3 -4
- package/i18n/registry.js +4 -6
- package/index.js +3 -4
- package/languages/all.js +47 -40
- package/languages/ar-AR.js +1 -2
- package/languages/cs-CZ.js +1 -2
- package/languages/de-CH.js +1 -2
- package/languages/de-DE.js +1 -2
- package/languages/en-US.js +15 -3
- package/languages/en-US.mjs +14 -1
- package/languages/es-MX.js +1 -2
- package/languages/fr-FR.js +1 -2
- package/languages/index.js +47 -40
- package/languages/it-IT.js +1 -2
- package/languages/ja-JP.js +1 -2
- package/languages/ko-KR.js +1 -2
- package/languages/lv-LV.js +1 -2
- package/languages/nb-NO.js +1 -2
- package/languages/nl-NL.js +1 -2
- package/languages/pl-PL.js +15 -3
- package/languages/pl-PL.mjs +14 -1
- package/languages/pt-BR.js +1 -2
- package/languages/ru-RU.js +1 -2
- package/languages/sr-SP.js +1 -2
- package/languages/zh-CN.js +1 -2
- package/languages/zh-TW.js +1 -2
- package/mixins/hooksRefRegisterer.js +1 -2
- package/mixins/localHooks.js +1 -2
- package/package.json +119 -96
- package/pluginHooks.d.ts +42 -7
- package/pluginHooks.js +301 -65
- package/pluginHooks.mjs +300 -63
- package/plugins/autoColumnSize/autoColumnSize.d.ts +2 -0
- package/plugins/autoColumnSize/autoColumnSize.js +2 -4
- package/plugins/autoRowSize/autoRowSize.d.ts +2 -0
- package/plugins/autoRowSize/autoRowSize.js +15 -10
- package/plugins/autoRowSize/autoRowSize.mjs +13 -6
- package/plugins/autofill/autofill.js +2 -4
- package/plugins/autofill/utils.js +1 -2
- package/plugins/base/base.js +1 -2
- package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.js +2 -4
- package/plugins/bindRowsWithHeaders/maps/looseBindsMap.js +1 -2
- package/plugins/bindRowsWithHeaders/maps/strictBindsMap.js +1 -2
- package/plugins/collapsibleColumns/collapsibleColumns.js +77 -8
- package/plugins/collapsibleColumns/collapsibleColumns.mjs +76 -5
- package/plugins/columnSorting/columnSorting.js +71 -6
- package/plugins/columnSorting/columnSorting.mjs +70 -3
- package/plugins/columnSorting/index.js +3 -1
- package/plugins/columnSorting/index.mjs +1 -1
- package/plugins/columnSorting/sortFunction/checkbox.js +1 -2
- package/plugins/columnSorting/sortFunction/date.js +1 -2
- package/plugins/columnSorting/sortFunction/default.js +1 -2
- package/plugins/columnSorting/sortFunction/numeric.js +1 -2
- package/plugins/columnSorting/sortService/engine.js +3 -6
- package/plugins/columnSorting/utils.js +3 -6
- package/plugins/columnSummary/columnSummary.js +2 -4
- package/plugins/columnSummary/endpoints.js +1 -2
- package/plugins/comments/commentEditor.js +2 -2
- package/plugins/comments/commentEditor.mjs +1 -0
- package/plugins/comments/comments.js +254 -197
- package/plugins/comments/comments.mjs +251 -190
- package/plugins/comments/contextMenuItem/addEditComment.js +41 -0
- package/plugins/comments/contextMenuItem/addEditComment.mjs +35 -0
- package/plugins/comments/contextMenuItem/readOnlyComment.js +49 -0
- package/plugins/comments/contextMenuItem/readOnlyComment.mjs +43 -0
- package/plugins/comments/contextMenuItem/removeComment.js +38 -0
- package/plugins/comments/contextMenuItem/removeComment.mjs +32 -0
- package/plugins/comments/displaySwitch.js +1 -2
- package/plugins/contextMenu/commandExecutor.js +2 -3
- package/plugins/contextMenu/commandExecutor.mjs +2 -3
- package/plugins/contextMenu/contextMenu.d.ts +1 -1
- package/plugins/contextMenu/contextMenu.js +77 -40
- package/plugins/contextMenu/contextMenu.mjs +74 -35
- package/plugins/contextMenu/itemsFactory.js +2 -3
- package/plugins/contextMenu/itemsFactory.mjs +3 -4
- package/plugins/contextMenu/{cursor.mjs → menu/cursor.js} +6 -4
- package/plugins/contextMenu/{cursor.js → menu/cursor.mjs} +4 -10
- package/plugins/contextMenu/menu/defaultShortcutsList.js +88 -0
- package/plugins/contextMenu/menu/defaultShortcutsList.mjs +84 -0
- package/plugins/contextMenu/menu/index.js +9 -0
- package/plugins/contextMenu/menu/index.mjs +1 -0
- package/plugins/contextMenu/{menu.js → menu/menu.js} +145 -421
- package/plugins/contextMenu/{menu.mjs → menu/menu.mjs} +146 -422
- package/plugins/contextMenu/menu/menuItemRenderer.js +70 -0
- package/plugins/contextMenu/menu/menuItemRenderer.mjs +66 -0
- package/plugins/contextMenu/menu/navigator.js +27 -0
- package/plugins/contextMenu/menu/navigator.mjs +23 -0
- package/plugins/contextMenu/menu/positioner.js +213 -0
- package/plugins/contextMenu/menu/positioner.mjs +209 -0
- package/plugins/contextMenu/menu/shortcuts.js +114 -0
- package/plugins/contextMenu/menu/shortcuts.mjs +110 -0
- package/plugins/contextMenu/menu/utils.js +177 -0
- package/plugins/contextMenu/menu/utils.mjs +163 -0
- package/plugins/contextMenu/predefinedItems/alignment.js +10 -4
- package/plugins/contextMenu/predefinedItems/alignment.mjs +7 -0
- package/plugins/contextMenu/predefinedItems/clearColumn.js +8 -7
- package/plugins/contextMenu/predefinedItems/clearColumn.mjs +5 -3
- package/plugins/contextMenu/predefinedItems/columnLeft.js +8 -7
- package/plugins/contextMenu/predefinedItems/columnLeft.mjs +5 -3
- package/plugins/contextMenu/predefinedItems/columnRight.js +8 -7
- package/plugins/contextMenu/predefinedItems/columnRight.mjs +5 -3
- package/plugins/contextMenu/predefinedItems/index.js +75 -0
- package/plugins/contextMenu/predefinedItems/index.mjs +68 -0
- package/plugins/contextMenu/predefinedItems/noItems.js +1 -2
- package/plugins/contextMenu/predefinedItems/readOnly.js +10 -4
- package/plugins/contextMenu/predefinedItems/readOnly.mjs +7 -0
- package/plugins/contextMenu/predefinedItems/redo.js +3 -4
- package/plugins/contextMenu/predefinedItems/removeColumn.js +10 -9
- package/plugins/contextMenu/predefinedItems/removeColumn.mjs +5 -3
- package/plugins/contextMenu/predefinedItems/removeRow.js +10 -9
- package/plugins/contextMenu/predefinedItems/removeRow.mjs +5 -3
- package/plugins/contextMenu/predefinedItems/rowAbove.js +8 -7
- package/plugins/contextMenu/predefinedItems/rowAbove.mjs +5 -3
- package/plugins/contextMenu/predefinedItems/rowBelow.js +8 -7
- package/plugins/contextMenu/predefinedItems/rowBelow.mjs +5 -3
- package/plugins/contextMenu/predefinedItems/separator.js +1 -2
- package/plugins/contextMenu/predefinedItems/undo.js +3 -4
- package/plugins/contextMenu/utils.js +35 -151
- package/plugins/contextMenu/utils.mjs +35 -144
- package/plugins/copyPaste/clipboardData/clipboardData.js +516 -0
- package/plugins/copyPaste/clipboardData/clipboardData.mjs +512 -0
- package/plugins/copyPaste/clipboardData/copyClipboardData.js +69 -0
- package/plugins/copyPaste/clipboardData/copyClipboardData.mjs +65 -0
- package/plugins/copyPaste/clipboardData/index.js +9 -0
- package/plugins/copyPaste/clipboardData/index.mjs +4 -0
- package/plugins/copyPaste/clipboardData/pasteClipboardData.js +81 -0
- package/plugins/copyPaste/clipboardData/pasteClipboardData.mjs +77 -0
- package/plugins/copyPaste/contextMenuItem/copy.js +7 -0
- package/plugins/copyPaste/contextMenuItem/copy.mjs +7 -0
- package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +9 -1
- package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +9 -1
- package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +9 -1
- package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +9 -1
- package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +9 -1
- package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +9 -1
- package/plugins/copyPaste/contextMenuItem/cut.js +9 -2
- package/plugins/copyPaste/contextMenuItem/cut.mjs +7 -0
- package/plugins/copyPaste/copyPaste.js +160 -167
- package/plugins/copyPaste/copyPaste.mjs +161 -166
- package/plugins/customBorders/contextMenuItem/bottom.js +2 -2
- package/plugins/customBorders/contextMenuItem/left.js +2 -2
- package/plugins/customBorders/contextMenuItem/noBorders.js +2 -2
- package/plugins/customBorders/contextMenuItem/right.js +2 -2
- package/plugins/customBorders/contextMenuItem/top.js +2 -2
- package/plugins/customBorders/customBorders.js +27 -26
- package/plugins/customBorders/customBorders.mjs +24 -21
- package/plugins/dragToScroll/dragToScroll.js +2 -4
- package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
- package/plugins/dropdownMenu/dropdownMenu.js +130 -44
- package/plugins/dropdownMenu/dropdownMenu.mjs +127 -39
- package/plugins/exportFile/dataProvider.js +1 -2
- package/plugins/exportFile/exportFile.js +4 -6
- package/plugins/exportFile/typeFactory.js +5 -8
- package/plugins/exportFile/types/_base.js +1 -2
- package/plugins/exportFile/types/csv.js +1 -2
- package/plugins/filters/component/_base.js +23 -8
- package/plugins/filters/component/_base.mjs +23 -8
- package/plugins/filters/component/actionBar.js +31 -29
- package/plugins/filters/component/actionBar.mjs +26 -23
- package/plugins/filters/component/condition.js +48 -61
- package/plugins/filters/component/condition.mjs +40 -52
- package/plugins/filters/component/operators.js +21 -22
- package/plugins/filters/component/operators.mjs +18 -18
- package/plugins/filters/component/value.js +37 -28
- package/plugins/filters/component/value.mjs +32 -22
- package/plugins/filters/condition/beginsWith.js +3 -4
- package/plugins/filters/condition/between.js +3 -4
- package/plugins/filters/condition/byValue.js +1 -2
- package/plugins/filters/condition/contains.js +3 -4
- package/plugins/filters/condition/date/after.js +3 -4
- package/plugins/filters/condition/date/before.js +3 -4
- package/plugins/filters/condition/date/today.js +3 -4
- package/plugins/filters/condition/date/tomorrow.js +3 -4
- package/plugins/filters/condition/date/yesterday.js +3 -4
- package/plugins/filters/condition/empty.js +3 -4
- package/plugins/filters/condition/endsWith.js +3 -4
- package/plugins/filters/condition/equal.js +3 -4
- package/plugins/filters/condition/false.js +1 -2
- package/plugins/filters/condition/greaterThan.js +3 -4
- package/plugins/filters/condition/greaterThanOrEqual.js +3 -4
- package/plugins/filters/condition/lessThan.js +3 -4
- package/plugins/filters/condition/lessThanOrEqual.js +3 -4
- package/plugins/filters/condition/none.js +3 -4
- package/plugins/filters/condition/notBetween.js +3 -4
- package/plugins/filters/condition/notContains.js +3 -4
- package/plugins/filters/condition/notEmpty.js +3 -4
- package/plugins/filters/condition/notEqual.js +3 -4
- package/plugins/filters/condition/true.js +1 -2
- package/plugins/filters/conditionCollection.d.ts +3 -2
- package/plugins/filters/conditionCollection.js +1 -2
- package/plugins/filters/conditionRegisterer.js +1 -2
- package/plugins/filters/conditionUpdateObserver.js +1 -2
- package/plugins/filters/constants.js +4 -8
- package/plugins/filters/constants.mjs +1 -1
- package/plugins/filters/dataFilter.js +1 -2
- package/plugins/filters/filters.d.ts +3 -5
- package/plugins/filters/filters.js +108 -66
- package/plugins/filters/filters.mjs +99 -55
- package/plugins/filters/logicalOperationRegisterer.js +1 -2
- package/plugins/filters/logicalOperations/conjunction.js +4 -6
- package/plugins/filters/logicalOperations/disjunction.js +4 -6
- package/plugins/filters/logicalOperations/disjunctionWithExtraCondition.js +4 -6
- package/plugins/filters/menu/focusController.js +123 -0
- package/plugins/filters/menu/focusController.mjs +119 -0
- package/plugins/filters/menu/focusNavigator.js +30 -0
- package/plugins/filters/menu/focusNavigator.mjs +26 -0
- package/plugins/filters/ui/_base.js +37 -15
- package/plugins/filters/ui/_base.mjs +35 -13
- package/plugins/filters/ui/input.js +43 -35
- package/plugins/filters/ui/input.mjs +42 -33
- package/plugins/filters/ui/link.js +44 -12
- package/plugins/filters/ui/link.mjs +44 -11
- package/plugins/filters/ui/multipleSelect.js +237 -133
- package/plugins/filters/ui/multipleSelect.mjs +232 -127
- package/plugins/filters/ui/radioInput.js +42 -18
- package/plugins/filters/ui/radioInput.mjs +42 -17
- package/plugins/filters/ui/select.js +152 -77
- package/plugins/filters/ui/select.mjs +148 -72
- package/plugins/formulas/engine/settings.js +2 -4
- package/plugins/formulas/formulas.js +3 -6
- package/plugins/formulas/indexSyncer/axisSyncer.js +1 -2
- package/plugins/formulas/indexSyncer/index.js +1 -2
- package/plugins/hiddenColumns/contextMenuItem/hideColumn.js +2 -2
- package/plugins/hiddenColumns/contextMenuItem/showColumn.js +2 -2
- package/plugins/hiddenColumns/hiddenColumns.d.ts +1 -0
- package/plugins/hiddenColumns/hiddenColumns.js +49 -6
- package/plugins/hiddenColumns/hiddenColumns.mjs +48 -3
- package/plugins/hiddenRows/contextMenuItem/hideRow.js +2 -2
- package/plugins/hiddenRows/contextMenuItem/showRow.js +2 -2
- package/plugins/hiddenRows/hiddenRows.d.ts +1 -0
- package/plugins/hiddenRows/hiddenRows.js +49 -6
- package/plugins/hiddenRows/hiddenRows.mjs +48 -3
- package/plugins/manualColumnFreeze/contextMenuItem/freezeColumn.js +2 -2
- package/plugins/manualColumnFreeze/contextMenuItem/unfreezeColumn.js +2 -2
- package/plugins/manualColumnFreeze/manualColumnFreeze.js +2 -4
- package/plugins/manualColumnMove/manualColumnMove.js +9 -17
- package/plugins/manualColumnMove/manualColumnMove.mjs +7 -13
- package/plugins/manualColumnMove/ui/_base.js +1 -2
- package/plugins/manualColumnMove/ui/backlight.js +1 -2
- package/plugins/manualColumnMove/ui/guideline.js +1 -2
- package/plugins/manualColumnResize/manualColumnResize.js +2 -4
- package/plugins/manualRowMove/manualRowMove.js +6 -23
- package/plugins/manualRowMove/manualRowMove.mjs +4 -19
- package/plugins/manualRowMove/ui/_base.js +1 -2
- package/plugins/manualRowMove/ui/backlight.js +1 -2
- package/plugins/manualRowMove/ui/guideline.js +1 -2
- package/plugins/manualRowResize/manualRowResize.js +2 -4
- package/plugins/mergeCells/calculations/autofill.js +1 -2
- package/plugins/mergeCells/calculations/selection.js +1 -2
- package/plugins/mergeCells/cellCoords.js +1 -2
- package/plugins/mergeCells/cellsCollection.js +1 -2
- package/plugins/mergeCells/contextMenuItem/toggleMerge.js +2 -2
- package/plugins/mergeCells/mergeCells.js +7 -20
- package/plugins/mergeCells/mergeCells.mjs +5 -16
- package/plugins/multiColumnSorting/multiColumnSorting.js +60 -6
- package/plugins/multiColumnSorting/multiColumnSorting.mjs +59 -3
- package/plugins/multipleSelectionHandles/multipleSelectionHandles.js +2 -4
- package/plugins/nestedHeaders/nestedHeaders.js +263 -36
- package/plugins/nestedHeaders/nestedHeaders.mjs +262 -33
- package/plugins/nestedHeaders/stateManager/index.js +102 -3
- package/plugins/nestedHeaders/stateManager/index.mjs +102 -3
- package/plugins/nestedHeaders/stateManager/sourceSettings.js +1 -2
- package/plugins/nestedHeaders/utils/ghostTable.js +1 -2
- package/plugins/nestedRows/data/dataManager.js +1 -2
- package/plugins/nestedRows/nestedRows.js +47 -10
- package/plugins/nestedRows/nestedRows.mjs +45 -6
- package/plugins/nestedRows/ui/_base.js +1 -2
- package/plugins/nestedRows/ui/collapsing.js +1 -2
- package/plugins/nestedRows/ui/contextMenu.js +3 -4
- package/plugins/nestedRows/ui/headers.js +13 -3
- package/plugins/nestedRows/ui/headers.mjs +13 -2
- package/plugins/persistentState/persistentState.js +2 -4
- package/plugins/persistentState/storage.js +1 -2
- package/plugins/search/search.js +2 -4
- package/plugins/touchScroll/touchScroll.js +2 -4
- package/plugins/trimRows/trimRows.js +2 -4
- package/plugins/undoRedo/index.js +2 -2
- package/plugins/undoRedo/undoRedo.js +2 -4
- package/renderers/autocompleteRenderer/autocompleteRenderer.js +9 -2
- package/renderers/autocompleteRenderer/autocompleteRenderer.mjs +8 -0
- package/renderers/baseRenderer/baseRenderer.js +18 -2
- package/renderers/baseRenderer/baseRenderer.mjs +18 -1
- package/renderers/checkboxRenderer/checkboxRenderer.js +10 -6
- package/renderers/checkboxRenderer/checkboxRenderer.mjs +9 -4
- package/renderers/dateRenderer/dateRenderer.d.ts +5 -0
- package/renderers/dateRenderer/dateRenderer.js +28 -0
- package/renderers/dateRenderer/dateRenderer.mjs +24 -0
- package/renderers/dateRenderer/index.d.ts +1 -0
- package/renderers/dateRenderer/index.js +6 -0
- package/renderers/dateRenderer/index.mjs +1 -0
- package/renderers/handsontableRenderer/handsontableRenderer.d.ts +5 -0
- package/renderers/handsontableRenderer/handsontableRenderer.js +28 -0
- package/renderers/handsontableRenderer/handsontableRenderer.mjs +24 -0
- package/renderers/handsontableRenderer/index.d.ts +1 -0
- package/renderers/handsontableRenderer/index.js +6 -0
- package/renderers/handsontableRenderer/index.mjs +1 -0
- package/renderers/htmlRenderer/htmlRenderer.js +1 -2
- package/renderers/index.d.ts +9 -0
- package/renderers/numericRenderer/numericRenderer.js +1 -2
- package/renderers/passwordRenderer/passwordRenderer.js +1 -2
- package/renderers/selectRenderer/index.d.ts +1 -0
- package/renderers/selectRenderer/index.js +6 -0
- package/renderers/selectRenderer/index.mjs +1 -0
- package/renderers/selectRenderer/selectRenderer.d.ts +5 -0
- package/renderers/selectRenderer/selectRenderer.js +26 -0
- package/renderers/selectRenderer/selectRenderer.mjs +22 -0
- package/renderers/textRenderer/textRenderer.js +1 -2
- package/renderers/timeRenderer/timeRenderer.js +1 -2
- package/selection/highlight/highlight.js +257 -73
- package/selection/highlight/highlight.mjs +250 -71
- package/selection/highlight/types/activeHeader.js +10 -8
- package/selection/highlight/types/activeHeader.mjs +10 -8
- package/selection/highlight/types/area.js +6 -18
- package/selection/highlight/types/area.mjs +6 -18
- package/selection/highlight/types/areaLayered.js +31 -0
- package/selection/highlight/types/areaLayered.mjs +26 -0
- package/selection/highlight/types/column.js +27 -0
- package/selection/highlight/types/column.mjs +22 -0
- package/selection/highlight/types/customSelection.js +7 -9
- package/selection/highlight/types/customSelection.mjs +7 -9
- package/selection/highlight/types/fill.js +5 -7
- package/selection/highlight/types/fill.mjs +5 -7
- package/selection/highlight/types/{cell.js → focus.js} +5 -7
- package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
- package/selection/highlight/types/header.js +9 -18
- package/selection/highlight/types/header.mjs +9 -18
- package/selection/highlight/types/row.js +27 -0
- package/selection/highlight/types/row.mjs +22 -0
- package/selection/highlight/visualSelection.js +32 -29
- package/selection/highlight/visualSelection.mjs +31 -27
- package/selection/index.js +4 -7
- package/selection/index.mjs +2 -3
- package/selection/mouseEventHandler.js +7 -1
- package/selection/mouseEventHandler.mjs +7 -1
- package/selection/range.js +9 -10
- package/selection/range.mjs +8 -8
- package/selection/selection.js +334 -154
- package/selection/selection.mjs +330 -151
- package/selection/transformation.js +233 -94
- package/selection/transformation.mjs +232 -92
- package/selection/utils.js +20 -31
- package/selection/utils.mjs +16 -21
- package/settings.d.ts +4 -0
- package/shortcutContexts/commands/editor/closeAndSave.js +11 -0
- package/shortcutContexts/commands/editor/closeAndSave.mjs +8 -0
- package/shortcutContexts/commands/editor/closeWithoutSaving.js +11 -0
- package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
- package/shortcutContexts/commands/editor/fastOpen.js +15 -0
- package/shortcutContexts/commands/editor/fastOpen.mjs +12 -0
- package/shortcutContexts/commands/editor/index.js +16 -0
- package/shortcutContexts/commands/editor/index.mjs +12 -0
- package/shortcutContexts/commands/editor/open.js +26 -0
- package/shortcutContexts/commands/editor/open.mjs +23 -0
- package/shortcutContexts/commands/emptySelectedCells.js +10 -0
- package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
- package/shortcutContexts/commands/extendCellsSelection/down.js +14 -0
- package/shortcutContexts/commands/extendCellsSelection/down.mjs +11 -0
- package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +24 -0
- package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +21 -0
- package/shortcutContexts/commands/extendCellsSelection/index.js +26 -0
- package/shortcutContexts/commands/extendCellsSelection/index.mjs +22 -0
- package/shortcutContexts/commands/extendCellsSelection/left.js +14 -0
- package/shortcutContexts/commands/extendCellsSelection/left.mjs +11 -0
- package/shortcutContexts/commands/extendCellsSelection/right.js +14 -0
- package/shortcutContexts/commands/extendCellsSelection/right.mjs +11 -0
- package/shortcutContexts/commands/extendCellsSelection/toColumns.js +18 -0
- package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +15 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +28 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +25 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +18 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +15 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +18 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +15 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +28 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +25 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +28 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +25 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +28 -0
- package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +25 -0
- package/shortcutContexts/commands/extendCellsSelection/toRows.js +18 -0
- package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +15 -0
- package/shortcutContexts/commands/extendCellsSelection/up.js +14 -0
- package/shortcutContexts/commands/extendCellsSelection/up.mjs +11 -0
- package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +24 -0
- package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +21 -0
- package/shortcutContexts/commands/index.js +35 -0
- package/shortcutContexts/commands/index.mjs +31 -0
- package/shortcutContexts/commands/moveCellSelection/down.js +12 -0
- package/shortcutContexts/commands/moveCellSelection/down.mjs +9 -0
- package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +32 -0
- package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +29 -0
- package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
- package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
- package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +11 -0
- package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
- package/shortcutContexts/commands/moveCellSelection/inlineStart.js +11 -0
- package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
- package/shortcutContexts/commands/moveCellSelection/left.js +9 -0
- package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
- package/shortcutContexts/commands/moveCellSelection/right.js +9 -0
- package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
- package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +16 -0
- package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +13 -0
- package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +17 -0
- package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +14 -0
- package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +13 -0
- package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +10 -0
- package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +16 -0
- package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +13 -0
- package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +18 -0
- package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +15 -0
- package/shortcutContexts/commands/moveCellSelection/toMostRight.js +20 -0
- package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +17 -0
- package/shortcutContexts/commands/moveCellSelection/toMostTop.js +16 -0
- package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +13 -0
- package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +18 -0
- package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +15 -0
- package/shortcutContexts/commands/moveCellSelection/up.js +12 -0
- package/shortcutContexts/commands/moveCellSelection/up.mjs +9 -0
- package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +32 -0
- package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +29 -0
- package/shortcutContexts/commands/populateSelectedCellsData.js +28 -0
- package/shortcutContexts/commands/populateSelectedCellsData.mjs +25 -0
- package/shortcutContexts/commands/scrollToFocusedCell.js +34 -0
- package/shortcutContexts/commands/scrollToFocusedCell.mjs +31 -0
- package/shortcutContexts/commands/selectAll.js +11 -0
- package/shortcutContexts/commands/selectAll.mjs +8 -0
- package/shortcutContexts/constants.js +11 -0
- package/shortcutContexts/constants.mjs +8 -0
- package/shortcutContexts/editor.js +25 -0
- package/shortcutContexts/editor.mjs +21 -0
- package/shortcutContexts/grid.js +167 -0
- package/shortcutContexts/grid.mjs +163 -0
- package/shortcutContexts/index.js +24 -0
- package/shortcutContexts/index.mjs +11 -0
- package/shortcuts/context.d.ts +1 -0
- package/shortcuts/context.js +23 -4
- package/shortcuts/context.mjs +23 -5
- package/shortcuts/manager.js +31 -7
- package/shortcuts/manager.mjs +32 -7
- package/shortcuts/recorder.js +30 -14
- package/shortcuts/recorder.mjs +30 -14
- package/shortcuts/utils.js +19 -5
- package/shortcuts/utils.mjs +18 -4
- package/tableView.js +113 -16
- package/tableView.mjs +113 -15
- package/utils/dataStructures/linkedList.js +1 -2
- package/utils/dataStructures/priorityMap.js +2 -4
- package/utils/dataStructures/queue.js +1 -2
- package/utils/dataStructures/stack.js +1 -2
- package/utils/dataStructures/tree.js +3 -6
- package/utils/ghostTable.js +32 -17
- package/utils/ghostTable.mjs +31 -15
- package/utils/interval.js +1 -2
- package/utils/paginator.js +151 -0
- package/utils/paginator.mjs +147 -0
- package/utils/parseTable.js +527 -83
- package/utils/parseTable.mjs +523 -82
- package/utils/rootInstance.js +2 -4
- package/utils/samplesGenerator.js +21 -13
- package/utils/samplesGenerator.mjs +20 -11
- package/utils/staticRegister.js +1 -2
- package/validators/autocompleteValidator/autocompleteValidator.js +1 -2
- package/validators/dateValidator/dateValidator.js +1 -2
- package/validators/numericValidator/numericValidator.js +1 -2
- package/validators/timeValidator/timeValidator.js +1 -2
- package/3rdparty/walkontable/src/selection.js +0 -295
- package/3rdparty/walkontable/src/selection.mjs +0 -290
- package/plugins/contextMenu/predefinedItems.js +0 -76
- package/plugins/contextMenu/predefinedItems.mjs +0 -68
- package/plugins/copyPaste/clipboardData.js +0 -18
- package/plugins/copyPaste/clipboardData.mjs +0 -14
- package/plugins/copyPaste/focusableElement.js +0 -186
- package/plugins/copyPaste/focusableElement.mjs +0 -180
- package/plugins/copyPaste/pasteEvent.js +0 -14
- package/plugins/copyPaste/pasteEvent.mjs +0 -9
- package/selection/highlight/constants.js +0 -15
- package/selection/highlight/constants.mjs +0 -6
- package/selection/highlight/types/index.js +0 -35
- package/selection/highlight/types/index.mjs +0 -31
package/helpers/dom/element.js
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
exports.__esModule = true;
|
4
4
|
exports.addClass = addClass;
|
5
5
|
exports.addEvent = addEvent;
|
6
|
+
exports.appendElement = appendElement;
|
6
7
|
exports.clearTextSelection = clearTextSelection;
|
7
8
|
exports.closest = closest;
|
8
9
|
exports.closestDown = closestDown;
|
@@ -36,23 +37,30 @@ exports.isChildOf = isChildOf;
|
|
36
37
|
exports.isDetached = isDetached;
|
37
38
|
exports.isInput = isInput;
|
38
39
|
exports.isOutsideInput = isOutsideInput;
|
40
|
+
exports.isThisHotChild = isThisHotChild;
|
39
41
|
exports.isVisible = isVisible;
|
42
|
+
exports.makeElementContentEditableAndSelectItsContent = makeElementContentEditableAndSelectItsContent;
|
40
43
|
exports.matchesCSSRules = matchesCSSRules;
|
41
44
|
exports.observeVisibilityChangeOnce = observeVisibilityChangeOnce;
|
42
45
|
exports.offset = offset;
|
43
46
|
exports.outerHeight = outerHeight;
|
44
47
|
exports.outerWidth = outerWidth;
|
45
48
|
exports.overlayContainsElement = overlayContainsElement;
|
49
|
+
exports.removeAttribute = removeAttribute;
|
46
50
|
exports.removeClass = removeClass;
|
51
|
+
exports.removeContentEditableFromElementAndDeselect = removeContentEditableFromElementAndDeselect;
|
47
52
|
exports.removeEvent = removeEvent;
|
48
53
|
exports.removeTextNodes = removeTextNodes;
|
49
54
|
exports.resetCssTransform = resetCssTransform;
|
55
|
+
exports.runWithSelectedContendEditableElement = runWithSelectedContendEditableElement;
|
50
56
|
exports.selectElementIfAllowed = selectElementIfAllowed;
|
57
|
+
exports.setAttribute = setAttribute;
|
51
58
|
exports.setCaretPosition = setCaretPosition;
|
52
59
|
exports.setOverlayPosition = setOverlayPosition;
|
53
60
|
require("core-js/modules/es.array.push.js");
|
54
61
|
require("core-js/modules/es.error.cause.js");
|
55
62
|
var _string = require("../string");
|
63
|
+
var _a11y = require("../a11y");
|
56
64
|
/**
|
57
65
|
* Get the parent of the specified node in the DOM tree.
|
58
66
|
*
|
@@ -80,6 +88,18 @@ function getParent(element) {
|
|
80
88
|
return parent;
|
81
89
|
}
|
82
90
|
|
91
|
+
/**
|
92
|
+
* Check if the provided element is a child of the provided Handsontable container.
|
93
|
+
*
|
94
|
+
* @param {HTMLElement} element Element to be analyzed.
|
95
|
+
* @param {HTMLElement} thisHotContainer The Handsontable container.
|
96
|
+
* @returns {boolean}
|
97
|
+
*/
|
98
|
+
function isThisHotChild(element, thisHotContainer) {
|
99
|
+
const closestHandsontableContainer = element.closest('.handsontable');
|
100
|
+
return !!closestHandsontableContainer && (closestHandsontableContainer.parentNode === thisHotContainer || closestHandsontableContainer === thisHotContainer);
|
101
|
+
}
|
102
|
+
|
83
103
|
/**
|
84
104
|
* Gets `frameElement` of the specified frame. Returns null if it is a top frame or if script has no access to read property.
|
85
105
|
*
|
@@ -93,7 +113,7 @@ function getFrameElement(frame) {
|
|
93
113
|
/**
|
94
114
|
* Gets parent frame of the specified frame. Returns null if it is a top frame or if script has no access to read property.
|
95
115
|
*
|
96
|
-
* @param {Window} frame Frame from which should
|
116
|
+
* @param {Window} frame Frame from which should get frameElement in a safe way.
|
97
117
|
* @returns {Window|null}
|
98
118
|
*/
|
99
119
|
function getParentWindow(frame) {
|
@@ -103,7 +123,7 @@ function getParentWindow(frame) {
|
|
103
123
|
/**
|
104
124
|
* Checks if script has access to read from parent frame of specified frame.
|
105
125
|
*
|
106
|
-
* @param {Window} frame Frame from which should
|
126
|
+
* @param {Window} frame Frame from which should get frameElement in a safe way.
|
107
127
|
* @returns {boolean}
|
108
128
|
*/
|
109
129
|
function hasAccessToParentWindow(frame) {
|
@@ -238,7 +258,7 @@ function overlayContainsElement(overlayType, element, root) {
|
|
238
258
|
}
|
239
259
|
|
240
260
|
/**
|
241
|
-
* @param {string} classNames The element "class" attribute string.
|
261
|
+
* @param {string[]} classNames The element "class" attribute string.
|
242
262
|
* @returns {string[]}
|
243
263
|
*/
|
244
264
|
function filterEmptyClassNames(classNames) {
|
@@ -248,6 +268,35 @@ function filterEmptyClassNames(classNames) {
|
|
248
268
|
return classNames.filter(x => !!x);
|
249
269
|
}
|
250
270
|
|
271
|
+
/**
|
272
|
+
* Filter out the RegExp entries from an array.
|
273
|
+
*
|
274
|
+
* @param {(string|RegExp)[]} list Array of either strings, Regexes or a mix of both.
|
275
|
+
* @param {boolean} [returnBoth] If `true`, both the array without regexes and an array of regexes will be returned.
|
276
|
+
* @returns {string[]|{regexFree: string[], regexes: RegExp[]}}
|
277
|
+
*/
|
278
|
+
function filterRegexes(list, returnBoth) {
|
279
|
+
if (!list || !list.length) {
|
280
|
+
return returnBoth ? {
|
281
|
+
regexFree: [],
|
282
|
+
regexes: []
|
283
|
+
} : [];
|
284
|
+
}
|
285
|
+
const regexes = [];
|
286
|
+
const regexFree = [];
|
287
|
+
regexFree.push(...list.filter(entry => {
|
288
|
+
const isRegex = entry instanceof RegExp;
|
289
|
+
if (isRegex && returnBoth) {
|
290
|
+
regexes.push(entry);
|
291
|
+
}
|
292
|
+
return !isRegex;
|
293
|
+
}));
|
294
|
+
return returnBoth ? {
|
295
|
+
regexFree,
|
296
|
+
regexes
|
297
|
+
} : regexFree;
|
298
|
+
}
|
299
|
+
|
251
300
|
/**
|
252
301
|
* Checks if element has class name.
|
253
302
|
*
|
@@ -282,16 +331,86 @@ function addClass(element, className) {
|
|
282
331
|
* Remove class name from an element.
|
283
332
|
*
|
284
333
|
* @param {HTMLElement} element An element to process.
|
285
|
-
* @param {string|Array} className Class name as string or array of strings.
|
334
|
+
* @param {string|Array<string|RegExp>} className Class name as string or array of strings.
|
286
335
|
*/
|
287
336
|
function removeClass(element, className) {
|
288
337
|
if (typeof className === 'string') {
|
289
338
|
className = className.split(' ');
|
339
|
+
} else if (className instanceof RegExp) {
|
340
|
+
className = [className];
|
290
341
|
}
|
291
|
-
|
292
|
-
|
293
|
-
|
342
|
+
let {
|
343
|
+
regexFree: stringClasses,
|
344
|
+
// eslint-disable-next-line prefer-const
|
345
|
+
regexes: regexClasses
|
346
|
+
} = filterRegexes(className, true);
|
347
|
+
stringClasses = filterEmptyClassNames(stringClasses);
|
348
|
+
if (stringClasses.length > 0) {
|
349
|
+
element.classList.remove(...stringClasses);
|
294
350
|
}
|
351
|
+
regexClasses.forEach(regexClassName => {
|
352
|
+
element.classList.forEach(currentClassName => {
|
353
|
+
if (regexClassName.test(currentClassName)) {
|
354
|
+
element.classList.remove(currentClassName);
|
355
|
+
}
|
356
|
+
});
|
357
|
+
});
|
358
|
+
}
|
359
|
+
|
360
|
+
/**
|
361
|
+
* Set a single attribute or multiple attributes at once.
|
362
|
+
*
|
363
|
+
* @param {HTMLElement} domElement The HTML element to be modified.
|
364
|
+
* @param {Array[]|string} attributes If setting multiple attributes at once, `attributes` holds an array containing the
|
365
|
+
* attributes to be added. Each element of the array should be an array in a form of `[attributeName,
|
366
|
+
* attributeValue]`. If setting a single attribute, `attributes` holds the name of the attribute.
|
367
|
+
* @param {string|number|undefined} [attributeValue] If setting a single attribute, `attributeValue` holds the attribute
|
368
|
+
* value.
|
369
|
+
*/
|
370
|
+
function setAttribute(domElement) {
|
371
|
+
let attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
372
|
+
let attributeValue = arguments.length > 2 ? arguments[2] : undefined;
|
373
|
+
if (!Array.isArray(attributes)) {
|
374
|
+
attributes = [[attributes, attributeValue]];
|
375
|
+
}
|
376
|
+
attributes.forEach(attributeInfo => {
|
377
|
+
if (Array.isArray(attributeInfo) && attributeInfo[0] !== '') {
|
378
|
+
domElement.setAttribute(...attributeInfo);
|
379
|
+
}
|
380
|
+
});
|
381
|
+
}
|
382
|
+
|
383
|
+
/**
|
384
|
+
* Remove a single attribute or multiple attributes from the provided element at once.
|
385
|
+
*
|
386
|
+
* @param {HTMLElement} domElement The HTML element to be processed.
|
387
|
+
* @param {Array<string|RegExp>|string} attributesToRemove If removing multiple attributes, `attributesToRemove`
|
388
|
+
* holds an array of attribute names to be removed from the provided element. If removing a single attribute, it
|
389
|
+
* holds the attribute name.
|
390
|
+
*/
|
391
|
+
function removeAttribute(domElement) {
|
392
|
+
let attributesToRemove = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
393
|
+
if (typeof attributesToRemove === 'string') {
|
394
|
+
attributesToRemove = attributesToRemove.split(' ');
|
395
|
+
} else if (attributesToRemove instanceof RegExp) {
|
396
|
+
attributesToRemove = [attributesToRemove];
|
397
|
+
}
|
398
|
+
const {
|
399
|
+
regexFree: stringAttributes,
|
400
|
+
regexes: regexAttributes
|
401
|
+
} = filterRegexes(attributesToRemove, true);
|
402
|
+
stringAttributes.forEach(attributeNameToRemove => {
|
403
|
+
if (attributeNameToRemove !== '') {
|
404
|
+
domElement.removeAttribute(attributeNameToRemove);
|
405
|
+
}
|
406
|
+
});
|
407
|
+
regexAttributes.forEach(attributeRegex => {
|
408
|
+
domElement.getAttributeNames().forEach(attributeName => {
|
409
|
+
if (attributeRegex.test(attributeName)) {
|
410
|
+
domElement.removeAttribute(attributeName);
|
411
|
+
}
|
412
|
+
});
|
413
|
+
});
|
295
414
|
}
|
296
415
|
|
297
416
|
/**
|
@@ -309,7 +428,7 @@ function removeTextNodes(element) {
|
|
309
428
|
}
|
310
429
|
|
311
430
|
/**
|
312
|
-
* Remove
|
431
|
+
* Remove children function
|
313
432
|
* WARNING - this doesn't unload events and data attached by jQuery
|
314
433
|
* http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/9
|
315
434
|
* http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/11 - no siginificant improvement with Chrome remove() method.
|
@@ -324,16 +443,15 @@ function empty(element) {
|
|
324
443
|
element.removeChild(child);
|
325
444
|
}
|
326
445
|
}
|
327
|
-
const HTML_CHARACTERS = /(<(.*)>|&(.*);)/;
|
446
|
+
const HTML_CHARACTERS = exports.HTML_CHARACTERS = /(<(.*)>|&(.*);)/;
|
328
447
|
|
329
448
|
/**
|
330
|
-
* Insert content into element trying avoid innerHTML method.
|
449
|
+
* Insert content into element trying to avoid innerHTML method.
|
331
450
|
*
|
332
451
|
* @param {HTMLElement} element An element to write into.
|
333
452
|
* @param {string} content The text to write.
|
334
453
|
* @param {boolean} [sanitizeContent=true] If `true`, the content will be sanitized before writing to the element.
|
335
454
|
*/
|
336
|
-
exports.HTML_CHARACTERS = HTML_CHARACTERS;
|
337
455
|
function fastInnerHTML(element, content) {
|
338
456
|
let sanitizeContent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
339
457
|
if (HTML_CHARACTERS.test(content)) {
|
@@ -391,7 +509,7 @@ function isVisible(element) {
|
|
391
509
|
} else {
|
392
510
|
return false; // this is a node detached from document in IE8
|
393
511
|
}
|
394
|
-
} else if (next.
|
512
|
+
} else if (getComputedStyle(next).display === 'none') {
|
395
513
|
return false;
|
396
514
|
}
|
397
515
|
next = next.parentNode;
|
@@ -423,6 +541,11 @@ function offset(element) {
|
|
423
541
|
if (elementToCheck === rootDocument.body) {
|
424
542
|
break;
|
425
543
|
}
|
544
|
+
// If the element is inside an SVG context, the `offsetParent` can be
|
545
|
+
// a <foreignObject> that does not have properties `offsetLeft` and `offsetTop` defined.
|
546
|
+
if (!('offsetLeft' in elementToCheck)) {
|
547
|
+
break;
|
548
|
+
}
|
426
549
|
offsetLeft += elementToCheck.offsetLeft;
|
427
550
|
offsetTop += elementToCheck.offsetTop;
|
428
551
|
lastElem = elementToCheck;
|
@@ -952,4 +1075,93 @@ function observeVisibilityChangeOnce(elementToBeObserved, callback) {
|
|
952
1075
|
root: elementToBeObserved.ownerDocument.body
|
953
1076
|
});
|
954
1077
|
visibilityObserver.observe(elementToBeObserved);
|
1078
|
+
}
|
1079
|
+
|
1080
|
+
/**
|
1081
|
+
* Add a `contenteditable` attribute, select the contents and optionally add the `invisibleSelection`
|
1082
|
+
* class to the provided element.
|
1083
|
+
*
|
1084
|
+
* @param {HTMLElement} element Element to be processed.
|
1085
|
+
* @param {boolean} [invisibleSelection=true] `true` if the class should be added to the element.
|
1086
|
+
* @param {boolean} [ariaHidden=true] `true` if the `aria-hidden` attribute should be added to the processed element.
|
1087
|
+
*/
|
1088
|
+
function makeElementContentEditableAndSelectItsContent(element) {
|
1089
|
+
let invisibleSelection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
1090
|
+
let ariaHidden = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
1091
|
+
const ownerDocument = element.ownerDocument;
|
1092
|
+
const range = ownerDocument.createRange();
|
1093
|
+
const sel = ownerDocument.defaultView.getSelection();
|
1094
|
+
setAttribute(element, 'contenteditable', true);
|
1095
|
+
if (ariaHidden) {
|
1096
|
+
setAttribute(element, ...(0, _a11y.A11Y_HIDDEN)());
|
1097
|
+
}
|
1098
|
+
if (invisibleSelection) {
|
1099
|
+
addClass(element, 'invisibleSelection');
|
1100
|
+
}
|
1101
|
+
range.selectNodeContents(element);
|
1102
|
+
sel.removeAllRanges();
|
1103
|
+
sel.addRange(range);
|
1104
|
+
}
|
1105
|
+
|
1106
|
+
/**
|
1107
|
+
* Remove the `contenteditable` attribute, deselect the contents and optionally remove the `invisibleSelection`
|
1108
|
+
* class from the provided element.
|
1109
|
+
*
|
1110
|
+
* @param {HTMLElement} selectedElement The element to be deselected.
|
1111
|
+
* @param {boolean} [removeInvisibleSelectionClass=true] `true` if the class should be removed from the element.
|
1112
|
+
*/
|
1113
|
+
function removeContentEditableFromElementAndDeselect(selectedElement) {
|
1114
|
+
let removeInvisibleSelectionClass = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
1115
|
+
const sel = selectedElement.ownerDocument.defaultView.getSelection();
|
1116
|
+
if (selectedElement.hasAttribute('aria-hidden')) {
|
1117
|
+
selectedElement.removeAttribute('aria-hidden');
|
1118
|
+
}
|
1119
|
+
sel.removeAllRanges();
|
1120
|
+
if (removeInvisibleSelectionClass) {
|
1121
|
+
removeClass(selectedElement, 'invisibleSelection');
|
1122
|
+
}
|
1123
|
+
selectedElement.removeAttribute('contenteditable');
|
1124
|
+
}
|
1125
|
+
|
1126
|
+
/**
|
1127
|
+
* Run the provided callback while the provided element is selected and modified to have the `contenteditable`
|
1128
|
+
* attribute added. Optionally, the selection can be configured to be invisible.
|
1129
|
+
*
|
1130
|
+
* @param {HTMLElement} element Element to be selected.
|
1131
|
+
* @param {Function} callback Callback to be called.
|
1132
|
+
* @param {boolean} [invisibleSelection=true] `true` if the selection should be invisible.
|
1133
|
+
*/
|
1134
|
+
function runWithSelectedContendEditableElement(element, callback) {
|
1135
|
+
let invisibleSelection = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
1136
|
+
makeElementContentEditableAndSelectItsContent(element, invisibleSelection);
|
1137
|
+
callback();
|
1138
|
+
removeContentEditableFromElementAndDeselect(element, invisibleSelection);
|
1139
|
+
}
|
1140
|
+
|
1141
|
+
/**
|
1142
|
+
* Creates a new DOM element and appends it to the parent element with the provided class name(s) and attributes.
|
1143
|
+
*
|
1144
|
+
* @param {HTMLElement} parentElement The parent element.
|
1145
|
+
* @param {object} properties The properties object.
|
1146
|
+
* @param {string} properties.tagName The type of the new element.
|
1147
|
+
* @param {string|string[]} properties.className Class name as string or array of strings.
|
1148
|
+
* @param {Array[]} properties.attributes An array containing the attributes to be added. Each element of the array
|
1149
|
+
* should be an array in a form of `[attributeName, attributeValue]`.
|
1150
|
+
* @returns {HTMLElement} The created div element.
|
1151
|
+
*/
|
1152
|
+
function appendElement(parentElement, _ref) {
|
1153
|
+
let {
|
1154
|
+
tagName,
|
1155
|
+
className,
|
1156
|
+
attributes
|
1157
|
+
} = _ref;
|
1158
|
+
const element = parentElement.ownerDocument.createElement(tagName);
|
1159
|
+
if (className) {
|
1160
|
+
addClass(element, className);
|
1161
|
+
}
|
1162
|
+
if (attributes && attributes.length) {
|
1163
|
+
setAttribute(element, attributes);
|
1164
|
+
}
|
1165
|
+
parentElement.appendChild(element);
|
1166
|
+
return element;
|
955
1167
|
}
|
package/helpers/dom/element.mjs
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import "core-js/modules/es.array.push.js";
|
2
2
|
import "core-js/modules/es.error.cause.js";
|
3
3
|
import { sanitize } from "../string.mjs";
|
4
|
+
import { A11Y_HIDDEN } from "../a11y.mjs";
|
4
5
|
/**
|
5
6
|
* Get the parent of the specified node in the DOM tree.
|
6
7
|
*
|
@@ -28,6 +29,18 @@ export function getParent(element) {
|
|
28
29
|
return parent;
|
29
30
|
}
|
30
31
|
|
32
|
+
/**
|
33
|
+
* Check if the provided element is a child of the provided Handsontable container.
|
34
|
+
*
|
35
|
+
* @param {HTMLElement} element Element to be analyzed.
|
36
|
+
* @param {HTMLElement} thisHotContainer The Handsontable container.
|
37
|
+
* @returns {boolean}
|
38
|
+
*/
|
39
|
+
export function isThisHotChild(element, thisHotContainer) {
|
40
|
+
const closestHandsontableContainer = element.closest('.handsontable');
|
41
|
+
return !!closestHandsontableContainer && (closestHandsontableContainer.parentNode === thisHotContainer || closestHandsontableContainer === thisHotContainer);
|
42
|
+
}
|
43
|
+
|
31
44
|
/**
|
32
45
|
* Gets `frameElement` of the specified frame. Returns null if it is a top frame or if script has no access to read property.
|
33
46
|
*
|
@@ -41,7 +54,7 @@ export function getFrameElement(frame) {
|
|
41
54
|
/**
|
42
55
|
* Gets parent frame of the specified frame. Returns null if it is a top frame or if script has no access to read property.
|
43
56
|
*
|
44
|
-
* @param {Window} frame Frame from which should
|
57
|
+
* @param {Window} frame Frame from which should get frameElement in a safe way.
|
45
58
|
* @returns {Window|null}
|
46
59
|
*/
|
47
60
|
export function getParentWindow(frame) {
|
@@ -51,7 +64,7 @@ export function getParentWindow(frame) {
|
|
51
64
|
/**
|
52
65
|
* Checks if script has access to read from parent frame of specified frame.
|
53
66
|
*
|
54
|
-
* @param {Window} frame Frame from which should
|
67
|
+
* @param {Window} frame Frame from which should get frameElement in a safe way.
|
55
68
|
* @returns {boolean}
|
56
69
|
*/
|
57
70
|
export function hasAccessToParentWindow(frame) {
|
@@ -186,7 +199,7 @@ export function overlayContainsElement(overlayType, element, root) {
|
|
186
199
|
}
|
187
200
|
|
188
201
|
/**
|
189
|
-
* @param {string} classNames The element "class" attribute string.
|
202
|
+
* @param {string[]} classNames The element "class" attribute string.
|
190
203
|
* @returns {string[]}
|
191
204
|
*/
|
192
205
|
function filterEmptyClassNames(classNames) {
|
@@ -196,6 +209,35 @@ function filterEmptyClassNames(classNames) {
|
|
196
209
|
return classNames.filter(x => !!x);
|
197
210
|
}
|
198
211
|
|
212
|
+
/**
|
213
|
+
* Filter out the RegExp entries from an array.
|
214
|
+
*
|
215
|
+
* @param {(string|RegExp)[]} list Array of either strings, Regexes or a mix of both.
|
216
|
+
* @param {boolean} [returnBoth] If `true`, both the array without regexes and an array of regexes will be returned.
|
217
|
+
* @returns {string[]|{regexFree: string[], regexes: RegExp[]}}
|
218
|
+
*/
|
219
|
+
function filterRegexes(list, returnBoth) {
|
220
|
+
if (!list || !list.length) {
|
221
|
+
return returnBoth ? {
|
222
|
+
regexFree: [],
|
223
|
+
regexes: []
|
224
|
+
} : [];
|
225
|
+
}
|
226
|
+
const regexes = [];
|
227
|
+
const regexFree = [];
|
228
|
+
regexFree.push(...list.filter(entry => {
|
229
|
+
const isRegex = entry instanceof RegExp;
|
230
|
+
if (isRegex && returnBoth) {
|
231
|
+
regexes.push(entry);
|
232
|
+
}
|
233
|
+
return !isRegex;
|
234
|
+
}));
|
235
|
+
return returnBoth ? {
|
236
|
+
regexFree,
|
237
|
+
regexes
|
238
|
+
} : regexFree;
|
239
|
+
}
|
240
|
+
|
199
241
|
/**
|
200
242
|
* Checks if element has class name.
|
201
243
|
*
|
@@ -230,16 +272,86 @@ export function addClass(element, className) {
|
|
230
272
|
* Remove class name from an element.
|
231
273
|
*
|
232
274
|
* @param {HTMLElement} element An element to process.
|
233
|
-
* @param {string|Array} className Class name as string or array of strings.
|
275
|
+
* @param {string|Array<string|RegExp>} className Class name as string or array of strings.
|
234
276
|
*/
|
235
277
|
export function removeClass(element, className) {
|
236
278
|
if (typeof className === 'string') {
|
237
279
|
className = className.split(' ');
|
280
|
+
} else if (className instanceof RegExp) {
|
281
|
+
className = [className];
|
238
282
|
}
|
239
|
-
|
240
|
-
|
241
|
-
|
283
|
+
let {
|
284
|
+
regexFree: stringClasses,
|
285
|
+
// eslint-disable-next-line prefer-const
|
286
|
+
regexes: regexClasses
|
287
|
+
} = filterRegexes(className, true);
|
288
|
+
stringClasses = filterEmptyClassNames(stringClasses);
|
289
|
+
if (stringClasses.length > 0) {
|
290
|
+
element.classList.remove(...stringClasses);
|
242
291
|
}
|
292
|
+
regexClasses.forEach(regexClassName => {
|
293
|
+
element.classList.forEach(currentClassName => {
|
294
|
+
if (regexClassName.test(currentClassName)) {
|
295
|
+
element.classList.remove(currentClassName);
|
296
|
+
}
|
297
|
+
});
|
298
|
+
});
|
299
|
+
}
|
300
|
+
|
301
|
+
/**
|
302
|
+
* Set a single attribute or multiple attributes at once.
|
303
|
+
*
|
304
|
+
* @param {HTMLElement} domElement The HTML element to be modified.
|
305
|
+
* @param {Array[]|string} attributes If setting multiple attributes at once, `attributes` holds an array containing the
|
306
|
+
* attributes to be added. Each element of the array should be an array in a form of `[attributeName,
|
307
|
+
* attributeValue]`. If setting a single attribute, `attributes` holds the name of the attribute.
|
308
|
+
* @param {string|number|undefined} [attributeValue] If setting a single attribute, `attributeValue` holds the attribute
|
309
|
+
* value.
|
310
|
+
*/
|
311
|
+
export function setAttribute(domElement) {
|
312
|
+
let attributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
313
|
+
let attributeValue = arguments.length > 2 ? arguments[2] : undefined;
|
314
|
+
if (!Array.isArray(attributes)) {
|
315
|
+
attributes = [[attributes, attributeValue]];
|
316
|
+
}
|
317
|
+
attributes.forEach(attributeInfo => {
|
318
|
+
if (Array.isArray(attributeInfo) && attributeInfo[0] !== '') {
|
319
|
+
domElement.setAttribute(...attributeInfo);
|
320
|
+
}
|
321
|
+
});
|
322
|
+
}
|
323
|
+
|
324
|
+
/**
|
325
|
+
* Remove a single attribute or multiple attributes from the provided element at once.
|
326
|
+
*
|
327
|
+
* @param {HTMLElement} domElement The HTML element to be processed.
|
328
|
+
* @param {Array<string|RegExp>|string} attributesToRemove If removing multiple attributes, `attributesToRemove`
|
329
|
+
* holds an array of attribute names to be removed from the provided element. If removing a single attribute, it
|
330
|
+
* holds the attribute name.
|
331
|
+
*/
|
332
|
+
export function removeAttribute(domElement) {
|
333
|
+
let attributesToRemove = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
334
|
+
if (typeof attributesToRemove === 'string') {
|
335
|
+
attributesToRemove = attributesToRemove.split(' ');
|
336
|
+
} else if (attributesToRemove instanceof RegExp) {
|
337
|
+
attributesToRemove = [attributesToRemove];
|
338
|
+
}
|
339
|
+
const {
|
340
|
+
regexFree: stringAttributes,
|
341
|
+
regexes: regexAttributes
|
342
|
+
} = filterRegexes(attributesToRemove, true);
|
343
|
+
stringAttributes.forEach(attributeNameToRemove => {
|
344
|
+
if (attributeNameToRemove !== '') {
|
345
|
+
domElement.removeAttribute(attributeNameToRemove);
|
346
|
+
}
|
347
|
+
});
|
348
|
+
regexAttributes.forEach(attributeRegex => {
|
349
|
+
domElement.getAttributeNames().forEach(attributeName => {
|
350
|
+
if (attributeRegex.test(attributeName)) {
|
351
|
+
domElement.removeAttribute(attributeName);
|
352
|
+
}
|
353
|
+
});
|
354
|
+
});
|
243
355
|
}
|
244
356
|
|
245
357
|
/**
|
@@ -257,7 +369,7 @@ export function removeTextNodes(element) {
|
|
257
369
|
}
|
258
370
|
|
259
371
|
/**
|
260
|
-
* Remove
|
372
|
+
* Remove children function
|
261
373
|
* WARNING - this doesn't unload events and data attached by jQuery
|
262
374
|
* http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/9
|
263
375
|
* http://jsperf.com/jquery-html-vs-empty-vs-innerhtml/11 - no siginificant improvement with Chrome remove() method.
|
@@ -275,7 +387,7 @@ export function empty(element) {
|
|
275
387
|
export const HTML_CHARACTERS = /(<(.*)>|&(.*);)/;
|
276
388
|
|
277
389
|
/**
|
278
|
-
* Insert content into element trying avoid innerHTML method.
|
390
|
+
* Insert content into element trying to avoid innerHTML method.
|
279
391
|
*
|
280
392
|
* @param {HTMLElement} element An element to write into.
|
281
393
|
* @param {string} content The text to write.
|
@@ -338,7 +450,7 @@ export function isVisible(element) {
|
|
338
450
|
} else {
|
339
451
|
return false; // this is a node detached from document in IE8
|
340
452
|
}
|
341
|
-
} else if (next.
|
453
|
+
} else if (getComputedStyle(next).display === 'none') {
|
342
454
|
return false;
|
343
455
|
}
|
344
456
|
next = next.parentNode;
|
@@ -370,6 +482,11 @@ export function offset(element) {
|
|
370
482
|
if (elementToCheck === rootDocument.body) {
|
371
483
|
break;
|
372
484
|
}
|
485
|
+
// If the element is inside an SVG context, the `offsetParent` can be
|
486
|
+
// a <foreignObject> that does not have properties `offsetLeft` and `offsetTop` defined.
|
487
|
+
if (!('offsetLeft' in elementToCheck)) {
|
488
|
+
break;
|
489
|
+
}
|
373
490
|
offsetLeft += elementToCheck.offsetLeft;
|
374
491
|
offsetTop += elementToCheck.offsetTop;
|
375
492
|
lastElem = elementToCheck;
|
@@ -899,4 +1016,93 @@ export function observeVisibilityChangeOnce(elementToBeObserved, callback) {
|
|
899
1016
|
root: elementToBeObserved.ownerDocument.body
|
900
1017
|
});
|
901
1018
|
visibilityObserver.observe(elementToBeObserved);
|
1019
|
+
}
|
1020
|
+
|
1021
|
+
/**
|
1022
|
+
* Add a `contenteditable` attribute, select the contents and optionally add the `invisibleSelection`
|
1023
|
+
* class to the provided element.
|
1024
|
+
*
|
1025
|
+
* @param {HTMLElement} element Element to be processed.
|
1026
|
+
* @param {boolean} [invisibleSelection=true] `true` if the class should be added to the element.
|
1027
|
+
* @param {boolean} [ariaHidden=true] `true` if the `aria-hidden` attribute should be added to the processed element.
|
1028
|
+
*/
|
1029
|
+
export function makeElementContentEditableAndSelectItsContent(element) {
|
1030
|
+
let invisibleSelection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
1031
|
+
let ariaHidden = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
1032
|
+
const ownerDocument = element.ownerDocument;
|
1033
|
+
const range = ownerDocument.createRange();
|
1034
|
+
const sel = ownerDocument.defaultView.getSelection();
|
1035
|
+
setAttribute(element, 'contenteditable', true);
|
1036
|
+
if (ariaHidden) {
|
1037
|
+
setAttribute(element, ...A11Y_HIDDEN());
|
1038
|
+
}
|
1039
|
+
if (invisibleSelection) {
|
1040
|
+
addClass(element, 'invisibleSelection');
|
1041
|
+
}
|
1042
|
+
range.selectNodeContents(element);
|
1043
|
+
sel.removeAllRanges();
|
1044
|
+
sel.addRange(range);
|
1045
|
+
}
|
1046
|
+
|
1047
|
+
/**
|
1048
|
+
* Remove the `contenteditable` attribute, deselect the contents and optionally remove the `invisibleSelection`
|
1049
|
+
* class from the provided element.
|
1050
|
+
*
|
1051
|
+
* @param {HTMLElement} selectedElement The element to be deselected.
|
1052
|
+
* @param {boolean} [removeInvisibleSelectionClass=true] `true` if the class should be removed from the element.
|
1053
|
+
*/
|
1054
|
+
export function removeContentEditableFromElementAndDeselect(selectedElement) {
|
1055
|
+
let removeInvisibleSelectionClass = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
1056
|
+
const sel = selectedElement.ownerDocument.defaultView.getSelection();
|
1057
|
+
if (selectedElement.hasAttribute('aria-hidden')) {
|
1058
|
+
selectedElement.removeAttribute('aria-hidden');
|
1059
|
+
}
|
1060
|
+
sel.removeAllRanges();
|
1061
|
+
if (removeInvisibleSelectionClass) {
|
1062
|
+
removeClass(selectedElement, 'invisibleSelection');
|
1063
|
+
}
|
1064
|
+
selectedElement.removeAttribute('contenteditable');
|
1065
|
+
}
|
1066
|
+
|
1067
|
+
/**
|
1068
|
+
* Run the provided callback while the provided element is selected and modified to have the `contenteditable`
|
1069
|
+
* attribute added. Optionally, the selection can be configured to be invisible.
|
1070
|
+
*
|
1071
|
+
* @param {HTMLElement} element Element to be selected.
|
1072
|
+
* @param {Function} callback Callback to be called.
|
1073
|
+
* @param {boolean} [invisibleSelection=true] `true` if the selection should be invisible.
|
1074
|
+
*/
|
1075
|
+
export function runWithSelectedContendEditableElement(element, callback) {
|
1076
|
+
let invisibleSelection = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
1077
|
+
makeElementContentEditableAndSelectItsContent(element, invisibleSelection);
|
1078
|
+
callback();
|
1079
|
+
removeContentEditableFromElementAndDeselect(element, invisibleSelection);
|
1080
|
+
}
|
1081
|
+
|
1082
|
+
/**
|
1083
|
+
* Creates a new DOM element and appends it to the parent element with the provided class name(s) and attributes.
|
1084
|
+
*
|
1085
|
+
* @param {HTMLElement} parentElement The parent element.
|
1086
|
+
* @param {object} properties The properties object.
|
1087
|
+
* @param {string} properties.tagName The type of the new element.
|
1088
|
+
* @param {string|string[]} properties.className Class name as string or array of strings.
|
1089
|
+
* @param {Array[]} properties.attributes An array containing the attributes to be added. Each element of the array
|
1090
|
+
* should be an array in a form of `[attributeName, attributeValue]`.
|
1091
|
+
* @returns {HTMLElement} The created div element.
|
1092
|
+
*/
|
1093
|
+
export function appendElement(parentElement, _ref) {
|
1094
|
+
let {
|
1095
|
+
tagName,
|
1096
|
+
className,
|
1097
|
+
attributes
|
1098
|
+
} = _ref;
|
1099
|
+
const element = parentElement.ownerDocument.createElement(tagName);
|
1100
|
+
if (className) {
|
1101
|
+
addClass(element, className);
|
1102
|
+
}
|
1103
|
+
if (attributes && attributes.length) {
|
1104
|
+
setAttribute(element, attributes);
|
1105
|
+
}
|
1106
|
+
parentElement.appendChild(element);
|
1107
|
+
return element;
|
902
1108
|
}
|
package/helpers/dom/event.d.ts
CHANGED
@@ -2,3 +2,4 @@ export function stopImmediatePropagation(event: Event): void;
|
|
2
2
|
export function isImmediatePropagationStopped(event: Event): boolean;
|
3
3
|
export function isRightClick(event: Event): boolean;
|
4
4
|
export function isLeftClick(event: Event): boolean;
|
5
|
+
export function offsetRelativeTo(event: Event, untilElement: HTMLElement | undefined): { x: number, y: number };
|