@falcon-ui/falcon-ui 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +182 -0
- package/cjs/JsBarcode-BlUjuVmB.cjs +3519 -0
- package/cjs/JsBarcode-BlUjuVmB.cjs.map +1 -0
- package/cjs/chunk-D4y6LrGi.cjs +40 -0
- package/cjs/components/JsBarcode-BOXEZn4Q.cjs +3519 -0
- package/cjs/components/JsBarcode-BOXEZn4Q.cjs.map +1 -0
- package/cjs/components/barcode/JsBarcode-BOXEZn4Q.cjs +3519 -0
- package/cjs/components/barcode/JsBarcode-BOXEZn4Q.cjs.map +1 -0
- package/cjs/components/barcode/chunk-D4y6LrGi.cjs +40 -0
- package/cjs/components/barcode/index.cjs +211 -0
- package/cjs/components/barcode/index.cjs.map +1 -0
- package/cjs/components/barcode/src/JsBarcode-BOXEZn4Q.cjs +3519 -0
- package/cjs/components/barcode/src/JsBarcode-BOXEZn4Q.cjs.map +1 -0
- package/cjs/components/barcode/src/barcode.cjs +102 -0
- package/cjs/components/barcode/src/barcode.cjs.map +1 -0
- package/cjs/components/barcode/src/barcode.vue.cjs +200 -0
- package/cjs/components/barcode/src/barcode.vue.cjs.map +1 -0
- package/cjs/components/barcode/src/chunk-D4y6LrGi.cjs +40 -0
- package/cjs/components/button/index.cjs +135 -0
- package/cjs/components/button/index.cjs.map +1 -0
- package/cjs/components/button/src/button.cjs +16 -0
- package/cjs/components/button/src/button.cjs.map +1 -0
- package/cjs/components/button/src/button.vue.cjs +124 -0
- package/cjs/components/button/src/button.vue.cjs.map +1 -0
- package/cjs/components/chunk-D4y6LrGi.cjs +40 -0
- package/cjs/components/date-picker/index.cjs +164 -0
- package/cjs/components/date-picker/index.cjs.map +1 -0
- package/cjs/components/date-picker/src/date-picker.cjs +25 -0
- package/cjs/components/date-picker/src/date-picker.cjs.map +1 -0
- package/cjs/components/date-picker/src/date-picker.vue.cjs +153 -0
- package/cjs/components/date-picker/src/date-picker.vue.cjs.map +1 -0
- package/cjs/components/dialog/index.cjs +346 -0
- package/cjs/components/dialog/index.cjs.map +1 -0
- package/cjs/components/dialog/src/dialog.cjs +40 -0
- package/cjs/components/dialog/src/dialog.cjs.map +1 -0
- package/cjs/components/dialog/src/dialog.vue.cjs +343 -0
- package/cjs/components/dialog/src/dialog.vue.cjs.map +1 -0
- package/cjs/components/index.cjs +9450 -0
- package/cjs/components/index.cjs.map +1 -0
- package/cjs/components/input/index.cjs +175 -0
- package/cjs/components/input/index.cjs.map +1 -0
- package/cjs/components/input/src/input.cjs +27 -0
- package/cjs/components/input/src/input.cjs.map +1 -0
- package/cjs/components/input/src/input.vue.cjs +164 -0
- package/cjs/components/input/src/input.vue.cjs.map +1 -0
- package/cjs/components/input-number/index.cjs +374 -0
- package/cjs/components/input-number/index.cjs.map +1 -0
- package/cjs/components/input-number/src/input-number.cjs +48 -0
- package/cjs/components/input-number/src/input-number.cjs.map +1 -0
- package/cjs/components/input-number/src/input-number.vue.cjs +363 -0
- package/cjs/components/input-number/src/input-number.vue.cjs.map +1 -0
- package/cjs/components/input-search/index.cjs +286 -0
- package/cjs/components/input-search/index.cjs.map +1 -0
- package/cjs/components/input-search/src/input-search.cjs +55 -0
- package/cjs/components/input-search/src/input-search.cjs.map +1 -0
- package/cjs/components/input-search/src/input-search.vue.cjs +275 -0
- package/cjs/components/input-search/src/input-search.vue.cjs.map +1 -0
- package/cjs/components/qr-code/index.cjs +1975 -0
- package/cjs/components/qr-code/index.cjs.map +1 -0
- package/cjs/components/qr-code/src/qr-code.cjs +63 -0
- package/cjs/components/qr-code/src/qr-code.cjs.map +1 -0
- package/cjs/components/qr-code/src/qr-code.vue.cjs +1964 -0
- package/cjs/components/qr-code/src/qr-code.vue.cjs.map +1 -0
- package/cjs/components/radial-menu/index.cjs +983 -0
- package/cjs/components/radial-menu/index.cjs.map +1 -0
- package/cjs/components/radial-menu/src/radial-menu.cjs +96 -0
- package/cjs/components/radial-menu/src/radial-menu.cjs.map +1 -0
- package/cjs/components/radial-menu/src/radial-menu.vue.cjs +921 -0
- package/cjs/components/radial-menu/src/radial-menu.vue.cjs.map +1 -0
- package/cjs/components/select/index.cjs +163 -0
- package/cjs/components/select/index.cjs.map +1 -0
- package/cjs/components/select/src/select.cjs +16 -0
- package/cjs/components/select/src/select.cjs.map +1 -0
- package/cjs/components/select/src/select.vue.cjs +152 -0
- package/cjs/components/select/src/select.vue.cjs.map +1 -0
- package/cjs/components/table/index.cjs +3351 -0
- package/cjs/components/table/index.cjs.map +1 -0
- package/cjs/components/table/src/table.cjs +62 -0
- package/cjs/components/table/src/table.cjs.map +1 -0
- package/cjs/components/table/src/table.vue.cjs +3085 -0
- package/cjs/components/table/src/table.vue.cjs.map +1 -0
- package/cjs/dialog-CJU00aEV.cjs +614 -0
- package/cjs/dialog-CJU00aEV.cjs.map +1 -0
- package/cjs/dialog-DcH26KbE.cjs +2 -0
- package/cjs/hooks/dialog-DpYPBcKV.cjs +266 -0
- package/cjs/hooks/dialog-DpYPBcKV.cjs.map +1 -0
- package/cjs/hooks/hooks-D2Jaq5kO.cjs +328 -0
- package/cjs/hooks/hooks-D2Jaq5kO.cjs.map +1 -0
- package/cjs/hooks/index.cjs +8 -0
- package/cjs/icons/index.cjs +86 -0
- package/cjs/icons/index.cjs.map +1 -0
- package/cjs/index.cjs +9141 -0
- package/cjs/index.cjs.map +1 -0
- package/cjs/utils/index.cjs +69 -0
- package/cjs/utils/index.cjs.map +1 -0
- package/esm/JsBarcode-kVJER62m.js +3514 -0
- package/esm/JsBarcode-kVJER62m.js.map +1 -0
- package/esm/chunk-BuRq7rDw.js +23 -0
- package/esm/components/JsBarcode-CzzxrEd_.js +3514 -0
- package/esm/components/JsBarcode-CzzxrEd_.js.map +1 -0
- package/esm/components/barcode/JsBarcode-C5ux6wsb.js +3514 -0
- package/esm/components/barcode/JsBarcode-C5ux6wsb.js.map +1 -0
- package/esm/components/barcode/chunk--em_ddB3.js +23 -0
- package/esm/components/barcode/index.mjs +204 -0
- package/esm/components/barcode/index.mjs.map +1 -0
- package/esm/components/barcode/src/JsBarcode-C5ux6wsb.js +3514 -0
- package/esm/components/barcode/src/JsBarcode-C5ux6wsb.js.map +1 -0
- package/esm/components/barcode/src/barcode.mjs +98 -0
- package/esm/components/barcode/src/barcode.mjs.map +1 -0
- package/esm/components/barcode/src/barcode.vue.mjs +194 -0
- package/esm/components/barcode/src/barcode.vue.mjs.map +1 -0
- package/esm/components/barcode/src/chunk--em_ddB3.js +23 -0
- package/esm/components/button/index.mjs +126 -0
- package/esm/components/button/index.mjs.map +1 -0
- package/esm/components/button/src/button.mjs +14 -0
- package/esm/components/button/src/button.mjs.map +1 -0
- package/esm/components/button/src/button.vue.mjs +117 -0
- package/esm/components/button/src/button.vue.mjs.map +1 -0
- package/esm/components/chunk-BuRq7rDw.js +23 -0
- package/esm/components/date-picker/index.mjs +155 -0
- package/esm/components/date-picker/index.mjs.map +1 -0
- package/esm/components/date-picker/src/date-picker.mjs +23 -0
- package/esm/components/date-picker/src/date-picker.mjs.map +1 -0
- package/esm/components/date-picker/src/date-picker.vue.mjs +146 -0
- package/esm/components/date-picker/src/date-picker.vue.mjs.map +1 -0
- package/esm/components/dialog/index.mjs +335 -0
- package/esm/components/dialog/index.mjs.map +1 -0
- package/esm/components/dialog/src/dialog.mjs +38 -0
- package/esm/components/dialog/src/dialog.mjs.map +1 -0
- package/esm/components/dialog/src/dialog.vue.mjs +334 -0
- package/esm/components/dialog/src/dialog.vue.mjs.map +1 -0
- package/esm/components/index.mjs +9386 -0
- package/esm/components/index.mjs.map +1 -0
- package/esm/components/input/index.mjs +166 -0
- package/esm/components/input/index.mjs.map +1 -0
- package/esm/components/input/src/input.mjs +25 -0
- package/esm/components/input/src/input.mjs.map +1 -0
- package/esm/components/input/src/input.vue.mjs +157 -0
- package/esm/components/input/src/input.vue.mjs.map +1 -0
- package/esm/components/input-number/index.mjs +365 -0
- package/esm/components/input-number/index.mjs.map +1 -0
- package/esm/components/input-number/src/input-number.mjs +45 -0
- package/esm/components/input-number/src/input-number.mjs.map +1 -0
- package/esm/components/input-number/src/input-number.vue.mjs +356 -0
- package/esm/components/input-number/src/input-number.vue.mjs.map +1 -0
- package/esm/components/input-search/index.mjs +277 -0
- package/esm/components/input-search/index.mjs.map +1 -0
- package/esm/components/input-search/src/input-search.mjs +53 -0
- package/esm/components/input-search/src/input-search.mjs.map +1 -0
- package/esm/components/input-search/src/input-search.vue.mjs +268 -0
- package/esm/components/input-search/src/input-search.vue.mjs.map +1 -0
- package/esm/components/qr-code/index.mjs +1967 -0
- package/esm/components/qr-code/index.mjs.map +1 -0
- package/esm/components/qr-code/src/qr-code.mjs +59 -0
- package/esm/components/qr-code/src/qr-code.mjs.map +1 -0
- package/esm/components/qr-code/src/qr-code.vue.mjs +1958 -0
- package/esm/components/qr-code/src/qr-code.vue.mjs.map +1 -0
- package/esm/components/radial-menu/index.mjs +974 -0
- package/esm/components/radial-menu/index.mjs.map +1 -0
- package/esm/components/radial-menu/src/radial-menu.mjs +94 -0
- package/esm/components/radial-menu/src/radial-menu.mjs.map +1 -0
- package/esm/components/radial-menu/src/radial-menu.vue.mjs +916 -0
- package/esm/components/radial-menu/src/radial-menu.vue.mjs.map +1 -0
- package/esm/components/select/index.mjs +154 -0
- package/esm/components/select/index.mjs.map +1 -0
- package/esm/components/select/src/select.mjs +14 -0
- package/esm/components/select/src/select.mjs.map +1 -0
- package/esm/components/select/src/select.vue.mjs +145 -0
- package/esm/components/select/src/select.vue.mjs.map +1 -0
- package/esm/components/table/index.mjs +3342 -0
- package/esm/components/table/index.mjs.map +1 -0
- package/esm/components/table/src/table.mjs +60 -0
- package/esm/components/table/src/table.mjs.map +1 -0
- package/esm/components/table/src/table.vue.mjs +3080 -0
- package/esm/components/table/src/table.vue.mjs.map +1 -0
- package/esm/dialog-Cm3Px-Bu.js +537 -0
- package/esm/dialog-Cm3Px-Bu.js.map +1 -0
- package/esm/dialog-CzZm50XM.js +2 -0
- package/esm/hooks/dialog-d4SMZWbw.js +261 -0
- package/esm/hooks/dialog-d4SMZWbw.js.map +1 -0
- package/esm/hooks/hooks-DdjieG2I.js +281 -0
- package/esm/hooks/hooks-DdjieG2I.js.map +1 -0
- package/esm/hooks/index.mjs +2 -0
- package/esm/icons/index.mjs +79 -0
- package/esm/icons/index.mjs.map +1 -0
- package/esm/index.mjs +9065 -0
- package/esm/index.mjs.map +1 -0
- package/esm/utils/index.mjs +65 -0
- package/esm/utils/index.mjs.map +1 -0
- package/global.d.ts +39 -0
- package/package.json +131 -0
- package/theme/index.css +1 -0
- package/theme/index.scss +16 -0
- package/theme/src/barcode.scss +14 -0
- package/theme/src/button.scss +65 -0
- package/theme/src/date-picker.scss +87 -0
- package/theme/src/dialog.scss +146 -0
- package/theme/src/ep-vars.scss +11 -0
- package/theme/src/input-number.scss +66 -0
- package/theme/src/input-search.scss +78 -0
- package/theme/src/input.scss +66 -0
- package/theme/src/mixins/bem.scss +35 -0
- package/theme/src/mixins/color.scss +8 -0
- package/theme/src/qr-code.scss +23 -0
- package/theme/src/radial-menu.scss +346 -0
- package/theme/src/select.scss +44 -0
- package/theme/src/table.scss +143 -0
- package/theme/src/tokens.scss +26 -0
- package/theme/src/tree-select.scss +45 -0
- package/theme/src/tree.scss +369 -0
- package/types/components/barcode/index.d.ts +183 -0
- package/types/components/barcode/src/barcode.d.ts +147 -0
- package/types/components/barcode/src/barcode.vue.d.ts +184 -0
- package/types/components/button/index.d.ts +135 -0
- package/types/components/button/src/button.d.ts +33 -0
- package/types/components/button/src/button.vue.d.ts +138 -0
- package/types/components/date-picker/index.d.ts +508 -0
- package/types/components/date-picker/src/date-picker.d.ts +35 -0
- package/types/components/date-picker/src/date-picker.vue.d.ts +509 -0
- package/types/components/dialog/index.d.ts +630 -0
- package/types/components/dialog/src/dialog.d.ts +70 -0
- package/types/components/dialog/src/dialog.vue.d.ts +257 -0
- package/types/components/index.d.ts +27 -0
- package/types/components/input/index.d.ts +233 -0
- package/types/components/input/src/input.d.ts +65 -0
- package/types/components/input/src/input.vue.d.ts +239 -0
- package/types/components/input-number/index.d.ts +713 -0
- package/types/components/input-number/src/input-number.d.ts +101 -0
- package/types/components/input-number/src/input-number.vue.d.ts +283 -0
- package/types/components/input-search/index.d.ts +113 -0
- package/types/components/input-search/src/input-search.d.ts +128 -0
- package/types/components/input-search/src/input-search.vue.d.ts +114 -0
- package/types/components/qr-code/index.d.ts +109 -0
- package/types/components/qr-code/src/qr-code.d.ts +93 -0
- package/types/components/qr-code/src/qr-code.vue.d.ts +109 -0
- package/types/components/radial-menu/index.d.ts +499 -0
- package/types/components/radial-menu/src/radial-menu-item.d.ts +40 -0
- package/types/components/radial-menu/src/radial-menu-item.vue.d.ts +95 -0
- package/types/components/radial-menu/src/radial-menu.d.ts +92 -0
- package/types/components/radial-menu/src/radial-menu.vue.d.ts +200 -0
- package/types/components/radial-menu/src/types.d.ts +48 -0
- package/types/components/radial-menu/src/use-radial-menu-items.d.ts +19 -0
- package/types/components/radial-menu/src/use-radial-menu-keyboard.d.ts +17 -0
- package/types/components/radial-menu/src/use-radial-menu-position.d.ts +45 -0
- package/types/components/radial-menu/src/use-radial-menu-shortcut.d.ts +8 -0
- package/types/components/radial-menu/src/use-radial-menu-state.d.ts +15 -0
- package/types/components/select/index.d.ts +5 -0
- package/types/components/select/src/select.d.ts +30 -0
- package/types/components/select/src/select.vue.d.ts +25 -0
- package/types/components/table/index.d.ts +8 -0
- package/types/components/table/src/editor-registry.d.ts +24 -0
- package/types/components/table/src/proxy-data.d.ts +10 -0
- package/types/components/table/src/table-editor.d.ts +18 -0
- package/types/components/table/src/table-editor.vue.d.ts +43 -0
- package/types/components/table/src/table.d.ts +179 -0
- package/types/components/table/src/table.vue.d.ts +121 -0
- package/types/components/tree/index.d.ts +5 -0
- package/types/components/tree/src/tree-node.vue.d.ts +88 -0
- package/types/components/tree/src/tree-types.d.ts +90 -0
- package/types/components/tree/src/tree.d.ts +448 -0
- package/types/components/tree/src/tree.vue.d.ts +301 -0
- package/types/components/tree/src/use-tree-check-conduct.d.ts +43 -0
- package/types/components/tree/src/use-tree-checked-state.d.ts +34 -0
- package/types/components/tree/src/use-tree-drag.d.ts +45 -0
- package/types/components/tree/src/use-tree-expanded-state.d.ts +41 -0
- package/types/components/tree/src/use-tree-keyboard.d.ts +21 -0
- package/types/components/tree/src/use-tree-load.d.ts +25 -0
- package/types/components/tree/src/use-tree-scroll.d.ts +17 -0
- package/types/components/tree/src/use-tree-selected-state.d.ts +29 -0
- package/types/components/tree-select/index.d.ts +5 -0
- package/types/components/tree-select/src/tree-select.d.ts +26 -0
- package/types/components/tree-select/src/tree-select.vue.d.ts +25 -0
- package/types/falcon-ui/index.d.ts +8 -0
- package/types/hooks/index.d.ts +3 -0
- package/types/hooks/src/use-clearable-state.d.ts +10 -0
- package/types/hooks/src/use-component.d.ts +15 -0
- package/types/hooks/src/use-dialog.d.ts +49 -0
- package/types/icons/index.d.ts +1 -0
- package/types/icons/src/components/holder-outlined.vue.d.ts +3 -0
- package/types/icons/src/components/index.d.ts +3 -0
- package/types/icons/src/components/minus-square-outlined.vue.d.ts +3 -0
- package/types/icons/src/components/plus-square-outlined.vue.d.ts +3 -0
- package/types/utils/index.d.ts +3 -0
- package/types/utils/src/bem.d.ts +11 -0
- package/types/utils/src/component.d.ts +6 -0
- package/types/utils/src/install.d.ts +5 -0
- package/umd/falcon-ui.umd.js +13297 -0
- package/umd/falcon-ui.umd.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.vue.cjs","names":["r","o","index","ghostEl","pluginEvent","defaults","rootEl","cloneEl","oldIndex","newIndex","oldDraggableIndex","newDraggableIndex","putSortable","_detectDirection","_dragElInRowColumn","_detectNearestEmptySortable","_prepareGroup","dragEl","_hideGhostForTarget","_unhideGhostForTarget","nearestEmptyInsertDetectEvent","_checkOutsideTargetEl","dragStartFn","target","after","plugins","drop","autoScroll","cache: PathAwareCache","runtime: ProxyRuntime","record: EditorRecord","candidates: TableEditorEndpoint[]"],"sources":["../../../../../../node_modules/.pnpm/sortablejs@1.15.7/node_modules/sortablejs/modular/sortable.esm.js","../../../../../../packages/utils/src/bem.ts","../../../../../../packages/utils/src/component.ts","../../../../../../packages/hooks/src/use-component.ts","../../../../../../packages/components/table/src/table.ts","../../../../../../packages/components/table/src/proxy-data.ts","../../../../../../packages/components/table/src/editor-registry.ts","../../../../../../packages/components/table/src/table.vue","../../../../../../packages/components/table/src/table.vue"],"sourcesContent":["/**!\n * Sortable 1.15.7\n * @author\tRubaXa <trash@rubaxa.org>\n * @author\towenm <owen23355@gmail.com>\n * @license MIT\n */\nfunction _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return _arrayLikeToArray(r);\n}\nfunction _defineProperty(e, r, t) {\n return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nfunction _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nfunction _objectWithoutProperties(e, t) {\n if (null == e) return {};\n var o,\n r,\n i = _objectWithoutPropertiesLoose(e, t);\n if (Object.getOwnPropertySymbols) {\n var n = Object.getOwnPropertySymbols(e);\n for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);\n }\n return i;\n}\nfunction _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nfunction _toConsumableArray(r) {\n return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n}\n\nvar version = \"1.15.7\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n return false;\n}\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType && el.host !== el ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\nfunction css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n } while (!selfOnly && (el = el.parentNode));\n }\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n return list;\n }\n return [];\n}\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect();\n\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n } while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n\n /* jshint boss:true */\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n currentChild++;\n }\n i++;\n }\n return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) {\n return -1;\n }\n\n /* jshint boss:true */\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n } while (elem = elem.parentNode);\n return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function (child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n }\n\n // if fromRect != toRect: animate\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) {\n time = _this.options.animation;\n }\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction repaint(target) {\n return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n\n // Add default options from plugin\n _extends(defaults, initialized.defaults);\n });\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\n ghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n\n _silent = false,\n savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return;\n // false when <= IE11\n if (IE11OrLess) {\n return false;\n }\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n }(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n },\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n },\n /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\n _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n },\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n },\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n },\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[expando]._onDragOver(event);\n }\n }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n this.el = el; // root element\n this.options = options = _extends({}, options);\n\n // Export instance\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n // Disabled on Safari: #1571; Enabled on Safari IOS: #2244\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && (!Safari || IOS),\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults);\n\n // Set default options\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n _prepareGroup(options);\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n }\n\n // Bind events\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n sortables.push(this.el);\n\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n // Add animation state manager\n _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n if (!evt.cancelable) return;\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n _saveInputCheckedState(el);\n\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if (dragEl) {\n return;\n }\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n }\n\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) {\n return;\n }\n\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n target = closest(target, options.draggable, el, false);\n if (target && target.animated) {\n return;\n }\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n }\n\n // Get the index of the dragged element within its parent\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable);\n\n // Check filter\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n }\n\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n }\n\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n\n // Drag start event\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n });\n\n // Chosen item\n toggleClass(dragEl, options.chosenClass, true);\n };\n\n // Disable \"draggable\"\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n if (options.supportPointer) {\n on(ownerDocument, 'pointerup', _this._onDrop);\n // Native D&D triggers pointercancel\n !this.nativeDraggable && on(ownerDocument, 'pointercancel', _this._onDrop);\n } else {\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop);\n }\n\n // Make dragEl draggable (must be before delay for FireFox)\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n pluginEvent('delayStart', this, {\n evt: evt\n });\n\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n if (options.supportPointer) {\n on(ownerDocument, 'pointerup', _this._disableDelayedDrag);\n on(ownerDocument, 'pointercancel', _this._disableDelayedDrag);\n } else {\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n }\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'pointerup', this._disableDelayedDrag);\n off(ownerDocument, 'pointercancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n try {\n if (document.selection) {\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n awaitingDragStarted = false;\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n var options = this.options;\n\n // Apply effect\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost();\n\n // Drag start event\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n _hideGhostForTarget();\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n target = parent; // store last element\n }\n /* jshint boss:true */ while (parent = getParentOrHost(parent));\n }\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n // only set the status to dragging, when we are actually dragging\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n this._onDragStart(evt, true);\n }\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options;\n\n // Position absolutely\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl);\n\n // Set transform-origin\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n pluginEvent('setupClone', this);\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.removeAttribute(\"id\");\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n this._hideClone();\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n }\n\n // #1143: IFrame support workaround\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n _this._hideClone();\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true);\n\n // Set proper drop events\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n on(document, 'drop', _this);\n\n // #1276 fix:\n css(dragEl, 'transform', 'translateZ(0)');\n }\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n window.getSelection().removeAllRanges();\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver( /**Event*/evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n if (_silent) return;\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n\n // Capture animation state\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n _this.captureAnimationState();\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n }\n\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n }\n\n // Animation\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n\n // Null lastTarget if it is not inside a previously swapped element\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n }\n\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n // Do not detect for empty insert if already inserted\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n\n // Call when dragEl has been inserted\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n if (revert) {\n parentEl = rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent('revert');\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n return completed(true);\n }\n var elLastChild = lastChild(el, options.draggable);\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n }\n\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n if (target) {\n targetRect = getRect(target);\n }\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) {\n // the last draggable element is not the last node\n el.insertBefore(dragEl, elLastChild.nextSibling);\n } else {\n el.appendChild(dragEl);\n }\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n if (firstChild === dragEl) {\n return completed(false);\n }\n target = firstChild;\n targetRect = getRect(target);\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n }\n\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n parentEl = dragEl.parentNode; // actualization\n\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n changed();\n return completed(true);\n }\n }\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'pointercancel', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop( /**Event*/evt) {\n var el = this.el,\n options = this.options;\n\n // Get the index of the dragged element within its parent\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode;\n\n // Get again after plugin event\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n if (Sortable.eventCanceled) {\n this._nulling();\n return;\n }\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n _cancelNextTick(this.cloneId);\n _cancelNextTick(this._dragStartId);\n\n // Unbind events\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n css(dragEl, 'transform', '');\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n _disableDraggable(dragEl);\n dragEl.style['will-change'] = '';\n\n // Remove classes\n // ghostClass is added in dragStarted\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n toggleClass(dragEl, this.options.chosenClass, false);\n\n // Drag stop event\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n // Remove event\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // drag from one list and drop into another\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n var el = this.el;\n savedInputChecked.forEach(function (checkEl) {\n if (el.contains(checkEl)) {\n checkEl.checked = true;\n }\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent( /**Event*/evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n break;\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n _globalDragOver(evt);\n }\n break;\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n for (; i < n; i++) {\n el = children[i];\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\n option: function option(name, value) {\n var options = this.options;\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n /**\r\n * Destroy\r\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n return;\n }\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return;\n\n // show clone at dragEl or original position\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\nfunction _globalDragOver( /**Event*/evt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n return retVal;\n}\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\nfunction _unsilent() {\n _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n while (i--) {\n sum += str.charCodeAt(i);\n }\n return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n}\n\n// Export utils\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild,\n expando: expando\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\nSortable.get = function (element) {\n return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt;\n\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback);\n\n // Listener for pointer element change\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn;\n\n // New scroll root, set scrollEl\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n var layersOut = 0;\n var currentParent = scrollEl;\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n }\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction Revert() {}\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n this.sortable.animateAll();\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\n multiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\n folding = false,\n // Folding any other time\n dragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n }\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n dataTransfer.setData('Text', data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n });\n\n // Sort multi-drag elements\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n\n sortable.captureAnimationState();\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n }\n\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute);\n\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n }\n\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n activeSortable._showClone(sortable);\n\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children;\n\n // Multi-drag selection\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n (function () {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n var filter = options.filter;\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n // Check if element is draggable\n if (!closest(children[i], options.draggable, parentEl, false)) continue;\n // Check if element is filtered\n var filtered = filter && (typeof filter === 'function' ? filter.call(sortable, evt, children[i], sortable) : filter.split(',').some(function (criteria) {\n return closest(children[i], criteria.trim(), parentEl, false);\n }));\n if (filtered) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvent: evt\n });\n }\n })();\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n }\n }\n\n // Multi-drag drop\n if (dragStarted && this.isMultiDrag) {\n folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n multiDragIndex++;\n });\n\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent('update');\n dispatchSortableEvent('sort');\n }\n }\n }\n\n // Must be done after capturing individual rects (scroll bar)\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n multiDragSortable = toSortable;\n }\n\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n // Only deselect if selection is in this sortable\n if (multiDragSortable !== this.sortable) return;\n\n // Only deselect if target is not item in this sortable\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n multiDragSortable = sortable;\n }\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n\n // multiDragElements will already be sorted if folding\n var newIndex;\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n return key;\n }\n }\n });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n","const defaultNamespace = 'fl'\r\nconst statePrefix = 'is-'\r\n\r\nconst buildBemName = (\r\n namespace: string,\r\n block: string,\r\n blockSuffix = '',\r\n element = '',\r\n modifier = ''\r\n) => {\r\n let className = `${namespace}-${block}`\r\n\r\n if (blockSuffix) {\r\n className += `-${blockSuffix}`\r\n }\r\n\r\n if (element) {\r\n className += `__${element}`\r\n }\r\n\r\n if (modifier) {\r\n className += `--${modifier}`\r\n }\r\n\r\n return className\r\n}\r\n\r\nexport const useNamespace = (block: string, namespace = defaultNamespace) => {\r\n const b = (blockSuffix = '') => buildBemName(namespace, block, blockSuffix)\r\n\r\n const e = (element?: string) => (element ? buildBemName(namespace, block, '', element) : '')\r\n\r\n const m = (modifier?: string) =>\r\n modifier ? buildBemName(namespace, block, '', '', modifier) : ''\r\n\r\n const be = (blockSuffix?: string, element?: string) => {\r\n if (!blockSuffix || !element) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, element)\r\n }\r\n\r\n const em = (element?: string, modifier?: string) => {\r\n if (!element || !modifier) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, '', element, modifier)\r\n }\r\n\r\n const bm = (blockSuffix?: string, modifier?: string) => {\r\n if (!blockSuffix || !modifier) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, '', modifier)\r\n }\r\n\r\n const bem = (blockSuffix?: string, element?: string, modifier?: string) => {\r\n if (!blockSuffix && !element && !modifier) {\r\n return b()\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, element, modifier)\r\n }\r\n\r\n const is = (name: string, state = true) => (state ? `${statePrefix}${name}` : '')\r\n\r\n return {\r\n namespace,\r\n b,\r\n e,\r\n m,\r\n be,\r\n em,\r\n bm,\r\n bem,\r\n is\r\n }\r\n}\r\n","type ExposedTarget = {\r\n exposed?: Record<string, unknown> | null\r\n} | null\r\n\r\nexport const mergeComponentExpose = (\r\n vm: ExposedTarget,\r\n exposed: unknown,\r\n extras: Record<string, unknown> = {}\r\n) => {\r\n if (!vm?.exposed || !exposed || (typeof exposed !== 'object' && typeof exposed !== 'function')) {\r\n return\r\n }\r\n\r\n Object.assign(vm.exposed, extras, exposed)\r\n}\r\n\r\nexport const invokeListener = (listener: unknown, ...args: unknown[]) => {\r\n if (typeof listener === 'function') {\r\n listener(...args)\r\n return\r\n }\r\n\r\n if (!Array.isArray(listener)) {\r\n return\r\n }\r\n\r\n for (const item of listener) {\r\n if (typeof item === 'function') {\r\n item(...args)\r\n }\r\n }\r\n}\r\n","import { computed, getCurrentInstance } from 'vue'\r\nimport { invokeListener, mergeComponentExpose, useNamespace } from '@falcon-ui/utils'\r\n\r\ntype UseMergedAttrsOptions = {\r\n attrs: Record<string, unknown>\r\n block: string\r\n listenerName: string\r\n onListener?: (...args: unknown[]) => void\r\n}\r\n\r\nexport const useMergedAttrs = ({\r\n attrs,\r\n block,\r\n listenerName,\r\n onListener\r\n}: UseMergedAttrsOptions) => {\r\n const ns = useNamespace(block)\r\n const className = ns.b()\r\n\r\n const mergedAttrs = computed(() => {\r\n const next = { ...attrs }\r\n const originalListener = next[listenerName]\r\n next.class = [className, next.class]\r\n\r\n next[listenerName] = (...args: unknown[]) => {\r\n onListener?.(...args)\r\n invokeListener(originalListener, ...args)\r\n }\r\n\r\n return next\r\n })\r\n\r\n return {\r\n mergedAttrs\r\n }\r\n}\r\n\r\nexport const useMergedExpose = <TExpose extends Record<string, unknown>>(extras: TExpose) => {\r\n const vm = getCurrentInstance()\r\n\r\n const changeRef = (exposed: unknown) => {\r\n mergeComponentExpose(vm, exposed, extras)\r\n }\r\n\r\n return {\r\n changeRef\r\n }\r\n}\r\n","import type { ExtractPublicPropTypes, PropType } from 'vue'\r\n\r\nexport type RowData = Record<string, unknown>\r\n\r\nexport type EmitTrigger = 'row-click' | 'selection-change' | 'proxy-set'\r\n\r\nexport interface SelectionRowToggleEvent {\r\n row: RowData\r\n rowIndex: number\r\n selected: boolean\r\n selectionBefore: RowData[]\r\n selectionAfter: RowData[]\r\n trigger: Exclude<EmitTrigger, 'proxy-set'>\r\n}\r\n\r\nexport interface SelectionSingleConflictEvent {\r\n reason: 'multiple-selected' | 'select-all-disabled'\r\n selection: RowData[]\r\n}\r\n\r\nexport interface CellChangeEvent {\r\n rowIndex: number\r\n rowKey: string | number\r\n columnKey: string\r\n path: string\r\n prevValue: unknown\r\n nextValue: unknown\r\n trigger: 'proxy-set'\r\n}\r\n\r\nexport interface RowDragEvent {\r\n oldIndex: number | null\r\n newIndex: number | null\r\n row: RowData | null\r\n}\r\n\r\nexport interface RowOrderChangeEvent {\r\n oldIndex: number\r\n newIndex: number\r\n row: RowData\r\n data: RowData[]\r\n}\r\n\r\nexport interface ColumnDragEvent {\r\n oldIndex: number | null\r\n newIndex: number | null\r\n columnIndex: number | null\r\n}\r\n\r\nexport interface ColumnOrderChangeEvent {\r\n oldIndex: number\r\n newIndex: number\r\n columnIndex: number\r\n order: number[]\r\n}\r\n\r\nexport interface FlTableExpose {\r\n clearSelection: () => void\r\n getSelectionRows: () => RowData[]\r\n toggleRowSelection: (row: RowData, selected?: boolean, ignoreSelectable?: boolean) => void\r\n toggleAllSelection: () => void\r\n toggleRowExpansion: (row: RowData, expanded?: boolean) => void\r\n setCurrentRow: (row?: RowData) => void\r\n clearSort: () => void\r\n clearFilter: (columnKeys?: string | string[]) => void\r\n doLayout: () => void\r\n sort: (prop: string, order: 'ascending' | 'descending' | null) => void\r\n scrollTo: {\r\n (options: ScrollToOptions): void\r\n (xCoord: number, yCoord?: number): void\r\n }\r\n setScrollTop: (top: number) => void\r\n setScrollLeft: (left: number) => void\r\n}\r\n\r\nexport const tableProps = {\r\n /**\r\n * Enable row click to toggle selection when selection column exists.\r\n */\r\n selectionRowClick: {\r\n type: Boolean,\r\n default: true\r\n },\r\n /**\r\n * Restrict selection to one row in selection-table mode.\r\n */\r\n selectionSingle: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * Enable editable cell mode with proxy intercept for row field assignments.\r\n */\r\n isEdit: {\r\n type: Boolean,\r\n default: true\r\n },\r\n /**\r\n * Maximum proxy depth for nested row fields.\r\n */\r\n cellProxyMaxDepth: {\r\n type: Number,\r\n default: 4,\r\n validator: (value: number) => Number.isInteger(value) && value >= 1\r\n },\r\n /**\r\n * Extend clicked data cells with row and column cross highlight.\r\n */\r\n crossHighlight: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * Enable row drag sorting.\r\n */\r\n rowDraggable: {\r\n type: Boolean,\r\n default: true\r\n },\r\n /**\r\n * Enable column drag sorting.\r\n */\r\n columnDraggable: {\r\n type: Boolean,\r\n default: true\r\n },\r\n /**\r\n * Which column index should act as row drag handle.\r\n */\r\n rowDragHandleColumnIndex: {\r\n type: Number,\r\n default: 0,\r\n validator: (value: number) => Number.isInteger(value) && value >= 0\r\n },\r\n /**\r\n * Field name used as row key in emitted payload.\r\n */\r\n rowKeyField: {\r\n type: String,\r\n default: 'id'\r\n },\r\n /**\r\n * Bound data source. Falls through to ElTable `data`.\r\n */\r\n data: {\r\n type: Array as PropType<RowData[]>,\r\n default: () => []\r\n }\r\n} as const\r\n\r\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\r\n value !== null && typeof value === 'object'\r\n\r\nconst isNumber = (value: unknown): value is number => typeof value === 'number'\r\n\r\nexport const tableEmits = {\r\n /**\r\n * Emit when row click triggers selection toggle.\r\n */\r\n 'selection-row-toggle': (payload: SelectionRowToggleEvent) =>\r\n isRecord(payload) &&\r\n isRecord(payload.row) &&\r\n isNumber(payload.rowIndex) &&\r\n typeof payload.selected === 'boolean' &&\r\n Array.isArray(payload.selectionBefore) &&\r\n Array.isArray(payload.selectionAfter) &&\r\n (payload.trigger === 'row-click' || payload.trigger === 'selection-change'),\r\n /**\r\n * Emit when single-selection rule conflicts with native selection behavior.\r\n */\r\n 'selection-single-conflict': (payload: SelectionSingleConflictEvent) =>\r\n isRecord(payload) &&\r\n (payload.reason === 'multiple-selected' || payload.reason === 'select-all-disabled') &&\r\n Array.isArray(payload.selection),\r\n /**\r\n * Emit when proxy-tracked row field value is changed.\r\n */\r\n 'cell-change': (payload: CellChangeEvent) =>\r\n isRecord(payload) &&\r\n isNumber(payload.rowIndex) &&\r\n (typeof payload.rowKey === 'string' || typeof payload.rowKey === 'number') &&\r\n typeof payload.columnKey === 'string' &&\r\n typeof payload.path === 'string' &&\r\n payload.trigger === 'proxy-set',\r\n /**\r\n * Emit when row drag starts.\r\n */\r\n 'row-drag-start': (payload: RowDragEvent) =>\r\n isRecord(payload) &&\r\n (payload.oldIndex === null || isNumber(payload.oldIndex)) &&\r\n (payload.newIndex === null || isNumber(payload.newIndex)),\r\n /**\r\n * Emit when row drag ends.\r\n */\r\n 'row-drag-end': (payload: RowDragEvent) =>\r\n isRecord(payload) &&\r\n (payload.oldIndex === null || isNumber(payload.oldIndex)) &&\r\n (payload.newIndex === null || isNumber(payload.newIndex)),\r\n /**\r\n * Emit when row order has changed.\r\n */\r\n 'row-order-change': (payload: RowOrderChangeEvent) =>\r\n isRecord(payload) &&\r\n isNumber(payload.oldIndex) &&\r\n isNumber(payload.newIndex) &&\r\n isRecord(payload.row) &&\r\n Array.isArray(payload.data),\r\n /**\r\n * Emit when column drag starts.\r\n */\r\n 'column-drag-start': (payload: ColumnDragEvent) =>\r\n isRecord(payload) &&\r\n (payload.oldIndex === null || isNumber(payload.oldIndex)) &&\r\n (payload.newIndex === null || isNumber(payload.newIndex)) &&\r\n (payload.columnIndex === null || isNumber(payload.columnIndex)),\r\n /**\r\n * Emit when column drag ends.\r\n */\r\n 'column-drag-end': (payload: ColumnDragEvent) =>\r\n isRecord(payload) &&\r\n (payload.oldIndex === null || isNumber(payload.oldIndex)) &&\r\n (payload.newIndex === null || isNumber(payload.newIndex)) &&\r\n (payload.columnIndex === null || isNumber(payload.columnIndex)),\r\n /**\r\n * Emit when column order has changed.\r\n */\r\n 'column-order-change': (payload: ColumnOrderChangeEvent) =>\r\n isRecord(payload) &&\r\n isNumber(payload.oldIndex) &&\r\n isNumber(payload.newIndex) &&\r\n isNumber(payload.columnIndex) &&\r\n Array.isArray(payload.order)\r\n} as const\r\n\r\nexport type TableProps = ExtractPublicPropTypes<typeof tableProps>\r\nexport type TableEmits = typeof tableEmits\r\nexport type TableExpose = FlTableExpose\r\n","import type { CellChangeEvent, RowData } from './table'\r\n\r\ntype ProxyRuntime = {\r\n onCellChange: (payload: CellChangeEvent) => void\r\n resolveRowIndex: (row: RowData) => number\r\n rowKeyField: string\r\n maxDepth: number\r\n}\r\n\r\ntype BuildProxyDataOptions = {\r\n data: RowData[]\r\n onCellChange: (payload: CellChangeEvent) => void\r\n resolveRowIndex: (row: RowData) => number\r\n rowKeyField: string\r\n maxDepth: number\r\n}\r\n\r\ntype PathAwareCache = WeakMap<object, Map<string, unknown>>\r\n\r\nconst isObjectLike = (value: unknown): value is Record<PropertyKey, unknown> =>\r\n value !== null && typeof value === 'object'\r\n\r\nconst composePath = (base: string, key: PropertyKey) => {\r\n const keyText = typeof key === 'symbol' ? '' : String(key)\r\n if (!keyText) {\r\n return base\r\n }\r\n\r\n return base ? `${base}.${keyText}` : keyText\r\n}\r\n\r\nconst resolveRowKey = (row: RowData, rowIndex: number, rowKeyField: string): string | number => {\r\n const candidate = row[rowKeyField]\r\n if (typeof candidate === 'string' || typeof candidate === 'number') {\r\n return candidate\r\n }\r\n\r\n return rowIndex\r\n}\r\n\r\nconst resolveColumnKey = (path: string): string => {\r\n if (!path) {\r\n return ''\r\n }\r\n\r\n const [first] = path.split('.')\r\n return first || path\r\n}\r\n\r\nexport const createTableProxyDataBuilder = () => {\r\n const cache: PathAwareCache = new WeakMap()\r\n\r\n const runtime: ProxyRuntime = {\r\n onCellChange: () => undefined,\r\n resolveRowIndex: () => -1,\r\n rowKeyField: 'id',\r\n maxDepth: 4\r\n }\r\n\r\n const getCachedProxy = (target: object, path: string) => cache.get(target)?.get(path)\r\n\r\n const setCachedProxy = (target: object, path: string, proxy: unknown) => {\r\n if (!cache.has(target)) {\r\n cache.set(target, new Map())\r\n }\r\n\r\n cache.get(target)?.set(path, proxy)\r\n }\r\n\r\n const toNullableRow = (value: unknown): RowData | null => {\r\n if (!isObjectLike(value)) {\r\n return null\r\n }\r\n\r\n return value as RowData\r\n }\r\n\r\n const createProxy = (\r\n target: Record<PropertyKey, unknown>,\r\n rootRow: RowData,\r\n path: string,\r\n depth: number\r\n ): unknown => {\r\n const cached = getCachedProxy(target, path)\r\n if (cached) {\r\n return cached\r\n }\r\n\r\n const proxy = new Proxy(target, {\r\n get(currentTarget, key) {\r\n const value = Reflect.get(currentTarget, key)\r\n\r\n if (!isObjectLike(value)) {\r\n return value\r\n }\r\n\r\n if (depth >= runtime.maxDepth) {\r\n return value\r\n }\r\n\r\n const nextPath = composePath(path, key)\r\n return createProxy(value, rootRow, nextPath, depth + 1)\r\n },\r\n set(currentTarget, key, value) {\r\n const previousValue = Reflect.get(currentTarget, key)\r\n const result = Reflect.set(currentTarget, key, value)\r\n\r\n if (!result || typeof key === 'symbol' || Object.is(previousValue, value)) {\r\n return result\r\n }\r\n\r\n const nextPath = composePath(path, key)\r\n const rowIndex = runtime.resolveRowIndex(rootRow)\r\n\r\n runtime.onCellChange({\r\n rowIndex,\r\n rowKey: resolveRowKey(rootRow, rowIndex, runtime.rowKeyField),\r\n columnKey: resolveColumnKey(nextPath),\r\n path: nextPath,\r\n prevValue: previousValue,\r\n nextValue: value,\r\n trigger: 'proxy-set'\r\n })\r\n\r\n return result\r\n }\r\n })\r\n\r\n setCachedProxy(target, path, proxy)\r\n return proxy\r\n }\r\n\r\n return ({\r\n data,\r\n onCellChange,\r\n resolveRowIndex,\r\n rowKeyField,\r\n maxDepth\r\n }: BuildProxyDataOptions) => {\r\n runtime.onCellChange = onCellChange\r\n runtime.resolveRowIndex = resolveRowIndex\r\n runtime.rowKeyField = rowKeyField\r\n runtime.maxDepth = maxDepth\r\n\r\n return data.map((row) => {\r\n const rawRow = toNullableRow(row)\r\n if (!rawRow) {\r\n return row\r\n }\r\n\r\n return createProxy(rawRow, rawRow, '', 0) as RowData\r\n })\r\n }\r\n}\r\n","import type { ComponentPublicInstance } from 'vue'\r\n\r\nexport type TableEditorMode = 'text' | 'controlled'\r\n\r\nexport type TableEditorTarget = ComponentPublicInstance | HTMLElement | null\r\n\r\nexport type TableEditorEndpoint = {\r\n id: symbol\r\n getRootEl: () => HTMLElement | null\r\n focus: () => void | Promise<void>\r\n blur: () => void | Promise<void>\r\n handoffFirstKey: (event: KeyboardEvent) => Promise<boolean>\r\n isPanelOpen?: () => boolean\r\n open?: () => void | Promise<void>\r\n close?: () => void | Promise<void>\r\n isFixedClone?: boolean\r\n priority?: number\r\n}\r\n\r\nexport type TableEditorRegistry = {\r\n register: (endpoint: TableEditorEndpoint) => () => void\r\n getEditors: () => TableEditorEndpoint[]\r\n getEditorsInCells: (cells: HTMLElement[]) => TableEditorEndpoint[]\r\n invalidate: () => void\r\n refresh: () => void\r\n}\r\n\r\nexport const tableEditorRegistryDomKey = Symbol('fl-table-editor-registry')\r\n\r\ntype EditorRecord = {\r\n endpoint: TableEditorEndpoint\r\n cell: HTMLElement | null\r\n}\r\n\r\nconst resolveEditorCell = (endpoint: TableEditorEndpoint): HTMLElement | null => {\r\n const cell = endpoint.getRootEl()?.closest('td.el-table__cell')\r\n return cell instanceof HTMLElement ? cell : null\r\n}\r\n\r\nexport const createTableEditorRegistry = (): TableEditorRegistry => {\r\n const records = new Map<symbol, EditorRecord>()\r\n const unindexedIds = new Set<symbol>()\r\n let idsByCell = new WeakMap<HTMLElement, Set<symbol>>()\r\n let isIndexDirty = false\r\n\r\n const detachRecord = (record: EditorRecord) => {\r\n if (!record.cell) {\r\n unindexedIds.delete(record.endpoint.id)\r\n return\r\n }\r\n\r\n const ids = idsByCell.get(record.cell)\r\n ids?.delete(record.endpoint.id)\r\n if (ids?.size === 0) {\r\n idsByCell.delete(record.cell)\r\n }\r\n record.cell = null\r\n }\r\n\r\n const indexRecord = (record: EditorRecord) => {\r\n detachRecord(record)\r\n const cell = resolveEditorCell(record.endpoint)\r\n record.cell = cell\r\n\r\n if (!cell) {\r\n unindexedIds.add(record.endpoint.id)\r\n return\r\n }\r\n\r\n const ids = idsByCell.get(cell) ?? new Set<symbol>()\r\n ids.add(record.endpoint.id)\r\n idsByCell.set(cell, ids)\r\n }\r\n\r\n const refresh = () => {\r\n idsByCell = new WeakMap<HTMLElement, Set<symbol>>()\r\n unindexedIds.clear()\r\n for (const record of records.values()) {\r\n record.cell = null\r\n indexRecord(record)\r\n }\r\n isIndexDirty = false\r\n }\r\n\r\n const refreshUnindexed = () => {\r\n for (const id of [...unindexedIds]) {\r\n const record = records.get(id)\r\n if (record) {\r\n indexRecord(record)\r\n } else {\r\n unindexedIds.delete(id)\r\n }\r\n }\r\n }\r\n\r\n return {\r\n register(endpoint) {\r\n const previous = records.get(endpoint.id)\r\n if (previous) {\r\n detachRecord(previous)\r\n }\r\n\r\n const record: EditorRecord = { endpoint, cell: null }\r\n records.set(endpoint.id, record)\r\n indexRecord(record)\r\n\r\n return () => {\r\n const current = records.get(endpoint.id)\r\n if (current?.endpoint !== endpoint) {\r\n return\r\n }\r\n\r\n detachRecord(current)\r\n records.delete(endpoint.id)\r\n }\r\n },\r\n getEditors: () => [...records.values()].map((record) => record.endpoint),\r\n getEditorsInCells(cells) {\r\n if (cells.length === 0) {\r\n return []\r\n }\r\n if (isIndexDirty) {\r\n refresh()\r\n } else if (unindexedIds.size > 0) {\r\n refreshUnindexed()\r\n }\r\n\r\n const cellSet = new Set(cells)\r\n const candidateIds = new Set<symbol>()\r\n for (const cell of cells) {\r\n for (const id of idsByCell.get(cell) ?? []) {\r\n candidateIds.add(id)\r\n }\r\n }\r\n\r\n const candidates: TableEditorEndpoint[] = []\r\n for (const id of candidateIds) {\r\n const record = records.get(id)\r\n if (!record) {\r\n continue\r\n }\r\n\r\n const root = record.endpoint.getRootEl()\r\n if (root && cells.some((cell) => cell.contains(root))) {\r\n candidates.push(record.endpoint)\r\n continue\r\n }\r\n\r\n indexRecord(record)\r\n if (record.cell && cellSet.has(record.cell)) {\r\n candidates.push(record.endpoint)\r\n }\r\n }\r\n\r\n return candidates\r\n },\r\n invalidate: () => {\r\n isIndexDirty = true\r\n },\r\n refresh\r\n }\r\n}\r\n","<template>\r\n <component :is=\"h(ElTable, { ...mergedTableAttrs, ref: setTableRef }, tableSlots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport Sortable from 'sortablejs'\r\nimport type { SortableEvent } from 'sortablejs'\r\nimport { ElTable } from 'element-plus'\r\nimport type { VNode } from 'vue'\r\nimport {\r\n Comment,\r\n Fragment,\r\n Text,\r\n cloneVNode,\r\n computed,\r\n isVNode,\r\n nextTick,\r\n onBeforeUnmount,\r\n onMounted,\r\n ref,\r\n shallowRef,\r\n useAttrs,\r\n useSlots,\r\n h,\r\n watch\r\n} from 'vue'\r\nimport { useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener, useNamespace } from '@falcon-ui/utils'\r\nimport type {\r\n CellChangeEvent,\r\n ColumnDragEvent,\r\n ColumnOrderChangeEvent,\r\n FlTableExpose,\r\n RowData,\r\n RowDragEvent,\r\n RowOrderChangeEvent,\r\n SelectionRowToggleEvent\r\n} from './table'\r\nimport { tableEmits, tableProps } from './table'\r\nimport { createTableProxyDataBuilder } from './proxy-data'\r\nimport type { TableEditorEndpoint, TableEditorRegistry } from './editor-registry'\r\nimport { createTableEditorRegistry, tableEditorRegistryDomKey } from './editor-registry'\r\n\r\ndefineOptions({\r\n name: 'FlTable',\r\n inheritAttrs: false\r\n})\r\n\r\ntype CellClassNameScope = {\r\n row: RowData\r\n column: ColumnState\r\n rowIndex: number\r\n columnIndex: number\r\n}\r\n\r\ntype HeaderCellClassNameScope = {\r\n column: ColumnState\r\n rowIndex: number\r\n columnIndex: number\r\n}\r\n\r\ntype ColumnState = {\r\n type?: string\r\n columnKey?: string\r\n rawColumnKey?: string\r\n}\r\n\r\ntype ActiveCell = {\r\n rowKey: string | number\r\n columnKey: string\r\n}\r\n\r\ntype ClientPoint = {\r\n x: number\r\n y: number\r\n}\r\n\r\ntype ColumnDragIndicatorSide = 'left' | 'right'\r\n\r\ntype ColumnDropState = {\r\n dropDisplayIndex: number\r\n targetDisplayIndex: number\r\n side: ColumnDragIndicatorSide\r\n}\r\n\r\ntype DirectionKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight'\r\n\r\ntype VisibleColumnEntry = {\r\n displayIndex: number\r\n columnKey: string\r\n column: ColumnState\r\n}\r\n\r\ntype ActiveCellPosition = {\r\n rowIndex: number\r\n row: RowData\r\n column: VisibleColumnEntry\r\n columns: VisibleColumnEntry[]\r\n}\r\n\r\nconst COLUMN_RESIZE_HOTZONE_PX = 8\r\nconst ROW_DRAG_HANDLE_HOTZONE_PX = 24\r\nconst CONTROL_COLUMN_TYPES = new Set(['selection', 'index', 'expand'])\r\n\r\nconst props = defineProps(tableProps)\r\nconst emit = defineEmits(tableEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst ns = useNamespace('table')\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst tableRef = shallowRef<FlTableExpose | null>(null)\r\nconst rowSortable = shallowRef<Sortable | null>(null)\r\nconst columnSortable = shallowRef<Sortable | null>(null)\r\nconst columnOrder = ref<number[]>([])\r\nconst columnDragCount = ref<number | null>(null)\r\nconst visibleColumnCount = ref<number>(0)\r\nconst draggingColumnOldDisplayIndex = ref<number | null>(null)\r\nconst pendingColumnDropDisplayIndex = ref<number | null>(null)\r\nconst columnDragIndicatorDisplayIndex = ref<number | null>(null)\r\nconst columnDragIndicatorSide = ref<ColumnDragIndicatorSide | null>(null)\r\nconst isColumnDragging = ref<boolean>(false)\r\nconst columnDragPointerMoveListener = ref<((event: Event) => void) | null>(null)\r\nconst isColumnResizeGesture = ref<boolean>(false)\r\nconst columnResizeGuardHeaderRow = shallowRef<HTMLElement | null>(null)\r\nconst columnResizePointerDownListener = ref<((event: Event) => void) | null>(null)\r\nconst columnResizePointerUpListener = ref<((event: Event) => void) | null>(null)\r\nconst activeCell = ref<ActiveCell | null>(null)\r\nconst isEditing = ref(false)\r\nconst outsidePointerDownListener = ref<((event: Event) => void) | null>(null)\r\nconst keyboardListener = ref<((event: KeyboardEvent) => void) | null>(null)\r\nconst editorFocusInListener = ref<((event: FocusEvent) => void) | null>(null)\r\nconst buildProxyData = createTableProxyDataBuilder()\r\nconst editorRegistry = createTableEditorRegistry()\r\n\r\nlet activeCellClassSnapshot: ActiveCell | null = null\r\nlet renderedActiveCell: ActiveCell | null = null\r\nlet renderedCrossHighlight = props.crossHighlight\r\nlet activeCellClassSyncVersion = 0\r\nlet shouldResetActiveCellClasses = false\r\n\r\nconst { changeRef } = useMergedExpose({})\r\n\r\nconst setTableRef = (instance: unknown) => {\r\n tableRef.value = instance as FlTableExpose | null\r\n changeRef(instance)\r\n}\r\n\r\nconst flattenSlotNodes = (nodes: unknown): VNode[] => {\r\n const flatNodes: VNode[] = []\r\n const list = Array.isArray(nodes) ? nodes : []\r\n\r\n const visit = (node: unknown) => {\r\n if (!isVNode(node)) {\r\n return\r\n }\r\n\r\n if (node.type === Comment || node.type === Text) {\r\n return\r\n }\r\n\r\n if (node.type === Fragment && Array.isArray(node.children)) {\r\n for (const child of node.children) {\r\n visit(child)\r\n }\r\n return\r\n }\r\n\r\n flatNodes.push(node)\r\n }\r\n\r\n for (const node of list) {\r\n visit(node)\r\n }\r\n\r\n return flatNodes\r\n}\r\n\r\nconst getInternalColumnKey = (sourceIndex: number) => `column-${sourceIndex}`\r\n\r\nconst createColumnOrder = (count: number): number[] =>\r\n Array.from({ length: count }, (_, index) => index)\r\n\r\nconst resolveColumnOrder = (\r\n count: number,\r\n currentOrder: number[] = columnOrder.value\r\n): number[] => {\r\n if (\r\n count <= 0 ||\r\n currentOrder.length !== count ||\r\n new Set(currentOrder).size !== count ||\r\n currentOrder.some((index) => index < 0 || index >= count)\r\n ) {\r\n return createColumnOrder(count)\r\n }\r\n\r\n return currentOrder\r\n}\r\n\r\nconst reorderColumnOrder = (order: number[], oldIndex: number, newIndex: number): number[] => {\r\n if (oldIndex === newIndex) {\r\n return [...order]\r\n }\r\n\r\n const nextOrder = [...order]\r\n const [moved] = nextOrder.splice(oldIndex, 1)\r\n if (moved === undefined) {\r\n return [...order]\r\n }\r\n\r\n nextOrder.splice(newIndex, 0, moved)\r\n return nextOrder\r\n}\r\n\r\nconst tableSlots = computed(() => {\r\n const orderSnapshot = columnOrder.value\r\n const userDefaultSlot = slots.default\r\n\r\n if (!userDefaultSlot) {\r\n return slots\r\n }\r\n\r\n return {\r\n ...slots,\r\n default: (...args: unknown[]) => {\r\n const rawNodes = userDefaultSlot(...args)\r\n const columnNodes = flattenSlotNodes(rawNodes)\r\n if (columnNodes.length === 0) {\r\n return rawNodes\r\n }\r\n\r\n const activeOrder = resolveColumnOrder(columnNodes.length, orderSnapshot)\r\n return activeOrder\r\n .map((sourceIndex) => {\r\n const node = columnNodes[sourceIndex]\r\n if (!node) {\r\n return null\r\n }\r\n\r\n return cloneVNode(node, {\r\n key: node.key ?? `fl-table-column-${sourceIndex}`,\r\n columnKey: getInternalColumnKey(sourceIndex)\r\n })\r\n })\r\n .filter((node): node is VNode => node !== null)\r\n }\r\n }\r\n})\r\n\r\nconst controlledAttrKeys = [\r\n 'class',\r\n 'data',\r\n 'border',\r\n 'stripe',\r\n 'highlightCurrentRow',\r\n 'highlight-current-row',\r\n 'headerRowClassName',\r\n 'header-row-class-name',\r\n 'cellClassName',\r\n 'cell-class-name',\r\n 'headerCellClassName',\r\n 'header-cell-class-name',\r\n 'onCellClick',\r\n 'onCell-click',\r\n 'onRowClick',\r\n 'onSelect',\r\n 'onSelectAll'\r\n]\r\n\r\nconst readAttr = <T = unknown,>(...keys: string[]): T | undefined => {\r\n for (const key of keys) {\r\n if (key in rawAttrs) {\r\n return rawAttrs[key] as T\r\n }\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nconst normalizeClass = (value: unknown): string[] => {\r\n if (!value) {\r\n return []\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return value\r\n .split(' ')\r\n .map((item) => item.trim())\r\n .filter(Boolean)\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.flatMap((item) => normalizeClass(item))\r\n }\r\n\r\n if (typeof value === 'object') {\r\n return Object.entries(value as Record<string, unknown>)\r\n .filter(([, enabled]) => Boolean(enabled))\r\n .map(([name]) => name)\r\n }\r\n\r\n return []\r\n}\r\n\r\nconst mergeClass = (...values: unknown[]): string => {\r\n const classSet = new Set<string>()\r\n for (const item of values.flatMap((value) => normalizeClass(value))) {\r\n classSet.add(item)\r\n }\r\n\r\n return Array.from(classSet).join(' ')\r\n}\r\n\r\nconst resolveBooleanAttr = (defaultValue: boolean, ...keys: string[]): boolean => {\r\n const value = readAttr(...keys)\r\n if (value === undefined) {\r\n return defaultValue\r\n }\r\n\r\n if (value === '') {\r\n return true\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value\r\n }\r\n\r\n return Boolean(value)\r\n}\r\n\r\nconst toNullableIndex = (value: unknown): number | null =>\r\n typeof value === 'number' && Number.isInteger(value) ? value : null\r\n\r\nconst reorderRows = (rows: RowData[], oldIndex: number, newIndex: number): RowData[] => {\r\n if (oldIndex === newIndex) {\r\n return [...rows]\r\n }\r\n\r\n const next = [...rows]\r\n const [moved] = next.splice(oldIndex, 1)\r\n if (!moved) {\r\n return [...rows]\r\n }\r\n\r\n next.splice(newIndex, 0, moved)\r\n return next\r\n}\r\n\r\nconst getTableElement = (): HTMLElement | null => {\r\n const candidate = (tableRef.value as unknown as { $el?: Element | null })?.$el\r\n return candidate instanceof HTMLElement ? candidate : null\r\n}\r\n\r\nconst bindEditorRegistryHost = () => {\r\n const tableElement = getTableElement() as\r\n | (HTMLElement & { [tableEditorRegistryDomKey]?: TableEditorRegistry })\r\n | null\r\n\r\n if (tableElement) {\r\n tableElement[tableEditorRegistryDomKey] = editorRegistry\r\n }\r\n}\r\n\r\nconst unbindEditorRegistryHost = () => {\r\n const tableElement = getTableElement() as\r\n | (HTMLElement & { [tableEditorRegistryDomKey]?: TableEditorRegistry })\r\n | null\r\n\r\n if (tableElement?.[tableEditorRegistryDomKey]) {\r\n delete tableElement[tableEditorRegistryDomKey]\r\n }\r\n}\r\n\r\nconst hasSelectionColumn = (): boolean => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return false\r\n }\r\n\r\n return (\r\n tableElement.querySelector('.el-table__header-wrapper th.el-table-column--selection') !== null\r\n )\r\n}\r\n\r\nconst getSelectionRows = (): RowData[] => {\r\n const rows = tableRef.value?.getSelectionRows?.()\r\n return Array.isArray(rows) ? (rows as RowData[]) : []\r\n}\r\n\r\nconst sourceData = computed<RowData[]>(() => props.data)\r\n\r\nconst tableData = computed<RowData[]>(() => {\r\n if (!props.isEdit) {\r\n return sourceData.value\r\n }\r\n\r\n return buildProxyData({\r\n data: sourceData.value,\r\n rowKeyField: props.rowKeyField,\r\n maxDepth: props.cellProxyMaxDepth,\r\n resolveRowIndex: (row) => sourceData.value.indexOf(row),\r\n onCellChange: (payload: CellChangeEvent) => {\r\n emit('cell-change', payload)\r\n }\r\n })\r\n})\r\n\r\nconst forwardedAttrs = computed(() => {\r\n const next = { ...rawAttrs }\r\n for (const key of controlledAttrKeys) {\r\n delete next[key]\r\n }\r\n\r\n return next\r\n})\r\n\r\nconst readRowKey = (row: RowData): string | number | null => {\r\n const candidate = row[props.rowKeyField]\r\n return typeof candidate === 'string' || typeof candidate === 'number' ? candidate : null\r\n}\r\n\r\nconst isControlColumn = (column: ColumnState | null | undefined): boolean =>\r\n typeof column?.type === 'string' && CONTROL_COLUMN_TYPES.has(column.type)\r\n\r\nconst resolveColumnKey = (\r\n column: ColumnState | null | undefined,\r\n displayIndex: number | null = null\r\n): string | null => {\r\n if (typeof column?.columnKey === 'string' && column.columnKey) {\r\n return column.columnKey\r\n }\r\n\r\n if (typeof column?.rawColumnKey === 'string' && column.rawColumnKey) {\r\n return column.rawColumnKey\r\n }\r\n\r\n if (displayIndex === null) {\r\n return null\r\n }\r\n\r\n const count = Math.max(columnOrder.value.length, displayIndex + 1, visibleColumnCount.value)\r\n const activeOrder = resolveColumnOrder(count)\r\n const sourceIndex = activeOrder[displayIndex] ?? displayIndex\r\n return getInternalColumnKey(sourceIndex)\r\n}\r\n\r\nconst resolveCellDisplayIndex = (cell: Element | null): number | null => {\r\n if (\r\n !(cell instanceof HTMLTableCellElement) ||\r\n !(cell.parentElement instanceof HTMLTableRowElement)\r\n ) {\r\n return null\r\n }\r\n\r\n return Array.from(cell.parentElement.children).indexOf(cell)\r\n}\r\n\r\nconst isRowDragHandleHotzone = (\r\n cell: Element | null,\r\n event: Event,\r\n displayIndex: number | null\r\n) => {\r\n if (\r\n !props.rowDraggable ||\r\n displayIndex !== props.rowDragHandleColumnIndex ||\r\n !(cell instanceof HTMLElement)\r\n ) {\r\n return false\r\n }\r\n\r\n const point = readClientPointFromEvent(event)\r\n if (!point) {\r\n return false\r\n }\r\n\r\n const rect = cell.getBoundingClientRect()\r\n if (rect.width <= 0 || rect.height <= 0) {\r\n return false\r\n }\r\n\r\n return point.x - rect.left <= Math.min(ROW_DRAG_HANDLE_HOTZONE_PX, rect.width)\r\n}\r\n\r\nconst commitActiveCell = (nextActiveCell: ActiveCell | null) => {\r\n activeCellClassSnapshot = nextActiveCell ? { ...nextActiveCell } : null\r\n activeCell.value = nextActiveCell ? { ...nextActiveCell } : null\r\n scheduleActiveCellClassSync()\r\n}\r\n\r\nconst setActiveCell = (\r\n row: RowData,\r\n column: ColumnState | null | undefined,\r\n displayIndex: number\r\n) => {\r\n if (isControlColumn(column)) {\r\n return\r\n }\r\n\r\n const rowKey = readRowKey(row)\r\n const columnKey = resolveColumnKey(column, displayIndex)\r\n\r\n if (rowKey === null || !columnKey) {\r\n return\r\n }\r\n\r\n commitActiveCell({\r\n rowKey,\r\n columnKey\r\n })\r\n}\r\n\r\nconst resolveVisibleColumns = (): VisibleColumnEntry[] => {\r\n const columns = readStoreColumns()\r\n if (!Array.isArray(columns)) {\r\n return []\r\n }\r\n\r\n return columns.flatMap((item, displayIndex) => {\r\n const column = item as ColumnState\r\n if (isControlColumn(column)) {\r\n return []\r\n }\r\n\r\n const columnKey = resolveColumnKey(column, displayIndex)\r\n if (!columnKey) {\r\n return []\r\n }\r\n\r\n return [\r\n {\r\n displayIndex,\r\n columnKey,\r\n column\r\n }\r\n ]\r\n })\r\n}\r\n\r\nconst resolveCellPosition = (\r\n cell: ActiveCell | null,\r\n rows: RowData[] = sourceData.value\r\n): ActiveCellPosition | null => {\r\n if (!cell) {\r\n return null\r\n }\r\n\r\n const rowIndex = rows.findIndex((row) => readRowKey(row) === cell.rowKey)\r\n if (rowIndex < 0) {\r\n return null\r\n }\r\n\r\n const columns = resolveVisibleColumns()\r\n const column = columns.find((item) => item.columnKey === cell.columnKey)\r\n if (!column) {\r\n return null\r\n }\r\n\r\n const row = rows[rowIndex]\r\n if (!row) {\r\n return null\r\n }\r\n\r\n return {\r\n rowIndex,\r\n row,\r\n column,\r\n columns\r\n }\r\n}\r\n\r\nconst resolveActiveCellPosition = (): ActiveCellPosition | null =>\r\n resolveCellPosition(activeCell.value)\r\n\r\nconst getBodyWrappers = (): HTMLElement[] => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return []\r\n }\r\n\r\n return Array.from(\r\n tableElement.querySelectorAll<HTMLElement>(\r\n '.el-table__body-wrapper, .el-table__fixed-body-wrapper'\r\n )\r\n )\r\n}\r\n\r\nconst isFixedCloneElement = (element: Element | null): boolean =>\r\n Boolean(element?.closest('.el-table__fixed, .el-table__fixed-right'))\r\n\r\nconst resolveBodyCellsByPosition = (rowIndex: number, displayIndex: number): HTMLElement[] =>\r\n getBodyWrappers().flatMap((wrapper) => {\r\n const rows = wrapper.querySelectorAll<HTMLTableRowElement>('tbody tr')\r\n const row = rows[rowIndex]\r\n if (!row) {\r\n return []\r\n }\r\n\r\n const cell = row.querySelectorAll<HTMLElement>('td.el-table__cell')[displayIndex]\r\n return cell ? [cell] : []\r\n })\r\n\r\nconst pickPrimaryCell = (cells: HTMLElement[]): HTMLElement | null =>\r\n cells.find((cell) => !isFixedCloneElement(cell)) ?? cells[0] ?? null\r\n\r\nconst activeCellClassNames = {\r\n active: ns.e('cross-active'),\r\n row: ns.e('cross-row'),\r\n column: ns.e('cross-column'),\r\n control: ns.e('cross-control-cell')\r\n} as const\r\n\r\ntype ActiveCellClassState = Map<HTMLElement, Set<string>>\r\n\r\nconst getHeaderWrappers = (): HTMLElement[] => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return []\r\n }\r\n\r\n return Array.from(\r\n tableElement.querySelectorAll<HTMLElement>(\r\n '.el-table__header-wrapper, .el-table__fixed-header-wrapper'\r\n )\r\n )\r\n}\r\n\r\nconst resolveHeaderCellsByPosition = (displayIndex: number): HTMLElement[] =>\r\n getHeaderWrappers().flatMap((wrapper) => {\r\n const rows = wrapper.querySelectorAll<HTMLTableRowElement>('thead tr')\r\n const row = rows[rows.length - 1]\r\n const cell = row?.querySelectorAll<HTMLElement>('th.el-table__cell')[displayIndex]\r\n return cell ? [cell] : []\r\n })\r\n\r\nconst createActiveCellDomLookup = () => {\r\n const bodyWrappers = getBodyWrappers().map((wrapper) => ({\r\n rows: wrapper.querySelectorAll<HTMLTableRowElement>('tbody tr'),\r\n rowCells: new Map<number, HTMLElement[]>()\r\n }))\r\n\r\n const readRowCells = (\r\n wrapper: (typeof bodyWrappers)[number],\r\n rowIndex: number\r\n ): HTMLElement[] | null => {\r\n const cached = wrapper.rowCells.get(rowIndex)\r\n if (cached) {\r\n return cached\r\n }\r\n\r\n const row = wrapper.rows[rowIndex]\r\n if (!row) {\r\n return null\r\n }\r\n\r\n const cells = Array.from(row.querySelectorAll<HTMLElement>('td.el-table__cell'))\r\n wrapper.rowCells.set(rowIndex, cells)\r\n return cells\r\n }\r\n\r\n return {\r\n resolveBodyCells(rowIndex: number, displayIndex: number) {\r\n return bodyWrappers.flatMap((wrapper) => {\r\n const cell = readRowCells(wrapper, rowIndex)?.[displayIndex]\r\n return cell ? [cell] : []\r\n })\r\n },\r\n resolveBodyRowCells(rowIndex: number) {\r\n return bodyWrappers.flatMap((wrapper) =>\r\n Array.from(readRowCells(wrapper, rowIndex) ?? []).map((cell, displayIndex) => ({\r\n cell,\r\n displayIndex\r\n }))\r\n )\r\n },\r\n resolveBodyColumnCells(displayIndex: number) {\r\n const selector = `tr > td.el-table__cell:nth-child(${displayIndex + 1})`\r\n return bodyWrappers.flatMap((wrapper) =>\r\n Array.from(wrapper.rows[0]?.parentElement?.querySelectorAll<HTMLElement>(selector) ?? [])\r\n )\r\n },\r\n resolveHeaderCells: resolveHeaderCellsByPosition\r\n }\r\n}\r\n\r\nconst addActiveCellClass = (\r\n state: ActiveCellClassState,\r\n elements: Iterable<HTMLElement>,\r\n className: string\r\n) => {\r\n for (const element of elements) {\r\n const classes = state.get(element) ?? new Set<string>()\r\n classes.add(className)\r\n state.set(element, classes)\r\n }\r\n}\r\n\r\nconst collectActiveCellClasses = (\r\n cell: ActiveCell | null,\r\n crossHighlight: boolean,\r\n lookup: ReturnType<typeof createActiveCellDomLookup>\r\n): ActiveCellClassState => {\r\n const state: ActiveCellClassState = new Map()\r\n const storeData = readStoreData()\r\n const position = resolveCellPosition(\r\n cell,\r\n Array.isArray(storeData) ? (storeData as RowData[]) : sourceData.value\r\n )\r\n if (!position) {\r\n return state\r\n }\r\n\r\n const activeCells = lookup.resolveBodyCells(position.rowIndex, position.column.displayIndex)\r\n addActiveCellClass(state, activeCells, activeCellClassNames.active)\r\n\r\n if (!crossHighlight) {\r\n return state\r\n }\r\n\r\n const columns = readStoreColumns()\r\n if (Array.isArray(columns)) {\r\n for (const { cell: rowCell, displayIndex } of lookup.resolveBodyRowCells(position.rowIndex)) {\r\n if (displayIndex === position.column.displayIndex) {\r\n continue\r\n }\r\n\r\n addActiveCellClass(\r\n state,\r\n [rowCell],\r\n isControlColumn(columns[displayIndex] as ColumnState)\r\n ? activeCellClassNames.control\r\n : activeCellClassNames.row\r\n )\r\n }\r\n }\r\n\r\n const activeCellSet = new Set(activeCells)\r\n addActiveCellClass(\r\n state,\r\n lookup\r\n .resolveBodyColumnCells(position.column.displayIndex)\r\n .filter((columnCell) => !activeCellSet.has(columnCell)),\r\n activeCellClassNames.column\r\n )\r\n addActiveCellClass(\r\n state,\r\n lookup.resolveHeaderCells(position.column.displayIndex),\r\n activeCellClassNames.column\r\n )\r\n\r\n return state\r\n}\r\n\r\nconst applyActiveCellClassDelta = (previous: ActiveCellClassState, next: ActiveCellClassState) => {\r\n for (const [element, classes] of previous) {\r\n const nextClasses = next.get(element)\r\n for (const className of classes) {\r\n if (!nextClasses?.has(className)) {\r\n element.classList.remove(className)\r\n }\r\n }\r\n }\r\n\r\n for (const [element, classes] of next) {\r\n const previousClasses = previous.get(element)\r\n for (const className of classes) {\r\n if (!previousClasses?.has(className)) {\r\n element.classList.add(className)\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst clearActiveCellClasses = () => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return\r\n }\r\n\r\n const selector = Object.values(activeCellClassNames)\r\n .map((className) => `.${className}`)\r\n .join(',')\r\n for (const element of tableElement.querySelectorAll<HTMLElement>(selector)) {\r\n element.classList.remove(...Object.values(activeCellClassNames))\r\n }\r\n}\r\n\r\nconst syncActiveCellClasses = () => {\r\n const nextActiveCell = activeCellClassSnapshot ? { ...activeCellClassSnapshot } : null\r\n const nextCrossHighlight = props.crossHighlight\r\n const lookup = createActiveCellDomLookup()\r\n const nextClasses = collectActiveCellClasses(nextActiveCell, nextCrossHighlight, lookup)\r\n\r\n if (shouldResetActiveCellClasses) {\r\n clearActiveCellClasses()\r\n applyActiveCellClassDelta(new Map(), nextClasses)\r\n } else {\r\n const previousClasses = collectActiveCellClasses(\r\n renderedActiveCell,\r\n renderedCrossHighlight,\r\n lookup\r\n )\r\n applyActiveCellClassDelta(previousClasses, nextClasses)\r\n }\r\n\r\n renderedActiveCell = nextActiveCell\r\n renderedCrossHighlight = nextCrossHighlight\r\n shouldResetActiveCellClasses = false\r\n}\r\n\r\nfunction scheduleActiveCellClassSync(shouldReset = false) {\r\n shouldResetActiveCellClasses ||= shouldReset\r\n const version = ++activeCellClassSyncVersion\r\n void nextTick(() => {\r\n if (version === activeCellClassSyncVersion) {\r\n syncActiveCellClasses()\r\n }\r\n })\r\n}\r\n\r\nconst sortEditorCandidates = (items: TableEditorEndpoint[]): TableEditorEndpoint[] =>\r\n [...items].sort((left, right) => {\r\n const fixedDelta = Number(Boolean(left.isFixedClone)) - Number(Boolean(right.isFixedClone))\r\n if (fixedDelta !== 0) {\r\n return fixedDelta\r\n }\r\n\r\n return (right.priority ?? 0) - (left.priority ?? 0)\r\n })\r\n\r\nconst findEditorsInCells = (cells: HTMLElement[]): TableEditorEndpoint[] =>\r\n sortEditorCandidates(editorRegistry.getEditorsInCells(cells))\r\n\r\nconst findEditorForActiveCell = (): TableEditorEndpoint | null => {\r\n const position = resolveActiveCellPosition()\r\n if (!position) {\r\n return null\r\n }\r\n\r\n const cells = resolveBodyCellsByPosition(position.rowIndex, position.column.displayIndex)\r\n return findEditorsInCells(cells)[0] ?? null\r\n}\r\n\r\nconst resolveNextActiveCell = (direction: DirectionKey): ActiveCell | null => {\r\n const position = resolveActiveCellPosition()\r\n if (!position) {\r\n return null\r\n }\r\n\r\n if (direction === 'ArrowUp' || direction === 'ArrowDown') {\r\n const nextRowIndex = position.rowIndex + (direction === 'ArrowDown' ? 1 : -1)\r\n const nextRow = sourceData.value[nextRowIndex]\r\n const nextRowKey = nextRow ? readRowKey(nextRow) : null\r\n if (nextRowIndex < 0 || !nextRow || nextRowKey === null) {\r\n return null\r\n }\r\n\r\n return {\r\n rowKey: nextRowKey,\r\n columnKey: position.column.columnKey\r\n }\r\n }\r\n\r\n const currentColumnIndex = position.columns.findIndex(\r\n (item) => item.columnKey === position.column.columnKey\r\n )\r\n if (currentColumnIndex < 0) {\r\n return null\r\n }\r\n\r\n const nextColumnIndex = currentColumnIndex + (direction === 'ArrowRight' ? 1 : -1)\r\n const nextColumn = position.columns[nextColumnIndex]\r\n if (!nextColumn) {\r\n return null\r\n }\r\n\r\n const rowKey = readRowKey(position.row)\r\n if (rowKey === null) {\r\n return null\r\n }\r\n\r\n return {\r\n rowKey,\r\n columnKey: nextColumn.columnKey\r\n }\r\n}\r\n\r\nconst scrollActiveCellIntoView = () => {\r\n const position = resolveActiveCellPosition()\r\n if (!position) {\r\n return\r\n }\r\n\r\n const targetCell = pickPrimaryCell(\r\n resolveBodyCellsByPosition(position.rowIndex, position.column.displayIndex)\r\n )\r\n targetCell?.scrollIntoView({\r\n block: 'nearest',\r\n inline: 'nearest'\r\n })\r\n}\r\n\r\nconst blurActiveEditor = async () => {\r\n const editor = findEditorForActiveCell()\r\n if (!editor) {\r\n return\r\n }\r\n\r\n await Promise.resolve(editor.close?.())\r\n await Promise.resolve(editor.blur())\r\n isEditing.value = false\r\n}\r\n\r\nconst isActiveEditorPanelOpen = () => {\r\n const editor = findEditorForActiveCell()\r\n if (!editor?.isPanelOpen) {\r\n return false\r\n }\r\n\r\n return Boolean(editor.isPanelOpen())\r\n}\r\n\r\nconst resolveSelectionTogglePayload = (\r\n row: RowData,\r\n selectionBefore: RowData[],\r\n selectionAfter: RowData[],\r\n trigger: SelectionRowToggleEvent['trigger']\r\n): SelectionRowToggleEvent => ({\r\n row,\r\n rowIndex: sourceData.value.indexOf(row),\r\n selected: selectionAfter.includes(row),\r\n selectionBefore,\r\n selectionAfter,\r\n trigger\r\n})\r\n\r\nconst handleRowClick = (row: RowData, column: unknown, event: Event) => {\r\n if (props.selectionRowClick && hasSelectionColumn() && tableRef.value) {\r\n const selectionBefore = getSelectionRows()\r\n\r\n if (props.selectionSingle) {\r\n tableRef.value.clearSelection()\r\n tableRef.value.toggleRowSelection(row, true)\r\n } else {\r\n const nextSelected = !selectionBefore.includes(row)\r\n tableRef.value.toggleRowSelection(row, nextSelected)\r\n }\r\n\r\n const selectionAfter = getSelectionRows()\r\n emit(\r\n 'selection-row-toggle',\r\n resolveSelectionTogglePayload(row, selectionBefore, selectionAfter, 'row-click')\r\n )\r\n }\r\n\r\n invokeListener(readAttr('onRowClick'), row, column, event)\r\n}\r\n\r\nconst handleCellClick = (row: RowData, column: ColumnState, cell: Element, event: Event) => {\r\n const displayIndex = resolveCellDisplayIndex(cell)\r\n const isHandleHotzone = isRowDragHandleHotzone(cell, event, displayIndex)\r\n\r\n if (!isHandleHotzone && displayIndex !== null) {\r\n setActiveCell(row, column, displayIndex)\r\n syncEditingStateFromTarget(event.target)\r\n }\r\n\r\n invokeListener(readAttr('onCellClick', 'onCell-click'), row, column, cell, event)\r\n}\r\n\r\nconst handleSelect = (selection: RowData[], row: RowData) => {\r\n if (props.selectionSingle && tableRef.value && selection.length > 1) {\r\n tableRef.value.clearSelection()\r\n tableRef.value.toggleRowSelection(row, true)\r\n\r\n const nextSelection = getSelectionRows()\r\n\r\n emit('selection-single-conflict', {\r\n reason: 'multiple-selected',\r\n selection\r\n })\r\n\r\n emit(\r\n 'selection-row-toggle',\r\n resolveSelectionTogglePayload(row, selection, nextSelection, 'selection-change')\r\n )\r\n\r\n invokeListener(readAttr('onSelect'), nextSelection, row)\r\n return\r\n }\r\n\r\n invokeListener(readAttr('onSelect'), selection, row)\r\n}\r\n\r\nconst handleSelectAll = (selection: RowData[]) => {\r\n if (props.selectionSingle && tableRef.value) {\r\n tableRef.value.clearSelection()\r\n\r\n emit('selection-single-conflict', {\r\n reason: 'select-all-disabled',\r\n selection\r\n })\r\n\r\n invokeListener(readAttr('onSelectAll'), [])\r\n return\r\n }\r\n\r\n invokeListener(readAttr('onSelectAll'), selection)\r\n}\r\n\r\nconst resolveHeaderRowClassName = () => {\r\n const baseClass = ns.e('header-row')\r\n const userClassName = readAttr('headerRowClassName', 'header-row-class-name')\r\n\r\n if (typeof userClassName === 'function') {\r\n return (...args: unknown[]) => mergeClass(userClassName(...args), baseClass)\r\n }\r\n\r\n return mergeClass(userClassName, baseClass)\r\n}\r\n\r\nconst resolveCellClassName = () => {\r\n const userCellClassName = readAttr('cellClassName', 'cell-class-name')\r\n\r\n const resolveCrossClass = (scope: CellClassNameScope): string | null => {\r\n const focusCell = activeCellClassSnapshot\r\n if (!focusCell) {\r\n return null\r\n }\r\n\r\n const rowKey = readRowKey(scope.row)\r\n if (rowKey === null) {\r\n return null\r\n }\r\n\r\n if (isControlColumn(scope.column)) {\r\n return props.crossHighlight && rowKey === focusCell.rowKey ? ns.e('cross-control-cell') : null\r\n }\r\n\r\n const columnKey = resolveColumnKey(scope.column, scope.columnIndex)\r\n if (!columnKey) {\r\n return null\r\n }\r\n\r\n const isActiveRow = rowKey === focusCell.rowKey\r\n const isActiveColumn = columnKey === focusCell.columnKey\r\n\r\n if (isActiveRow && isActiveColumn) {\r\n return ns.e('cross-active')\r\n }\r\n\r\n if (!props.crossHighlight) {\r\n return null\r\n }\r\n\r\n if (isActiveRow) {\r\n return ns.e('cross-row')\r\n }\r\n\r\n if (isActiveColumn) {\r\n return ns.e('cross-column')\r\n }\r\n\r\n return null\r\n }\r\n\r\n const resolveByScope = (scope: CellClassNameScope) =>\r\n mergeClass(\r\n typeof userCellClassName === 'function' ? userCellClassName(scope) : userCellClassName,\r\n props.rowDraggable &&\r\n scope.columnIndex === props.rowDragHandleColumnIndex &&\r\n ns.e('row-drag-cell'),\r\n resolveCrossClass(scope)\r\n )\r\n\r\n return (scope: CellClassNameScope) => resolveByScope(scope)\r\n}\r\n\r\nconst resolveHeaderCellClassName = () => {\r\n const userHeaderCellClassName = readAttr('headerCellClassName', 'header-cell-class-name')\r\n\r\n const resolveByScope = (scope: HeaderCellClassNameScope) => {\r\n const focusCell = activeCellClassSnapshot\r\n const columnClass =\r\n props.crossHighlight &&\r\n focusCell &&\r\n !isControlColumn(scope.column) &&\r\n resolveColumnKey(scope.column, scope.columnIndex) === focusCell.columnKey\r\n ? ns.e('cross-column')\r\n : null\r\n\r\n return mergeClass(\r\n typeof userHeaderCellClassName === 'function'\r\n ? userHeaderCellClassName(scope)\r\n : userHeaderCellClassName,\r\n columnClass\r\n )\r\n }\r\n\r\n return (scope: HeaderCellClassNameScope) => resolveByScope(scope)\r\n}\r\n\r\nconst syncVisibleColumnCount = (headerRow: HTMLElement) => {\r\n const cells = headerRow.querySelectorAll<HTMLElement>('th.el-table__cell')\r\n visibleColumnCount.value = cells.length\r\n}\r\n\r\nconst readStoreColumns = () =>\r\n (\r\n tableRef.value as unknown as {\r\n store?: {\r\n states?: {\r\n columns?: {\r\n value?: unknown[]\r\n }\r\n }\r\n }\r\n }\r\n )?.store?.states?.columns?.value\r\n\r\nconst readStoreData = () =>\r\n (\r\n tableRef.value as unknown as {\r\n store?: {\r\n states?: {\r\n data?: {\r\n value?: unknown[]\r\n }\r\n }\r\n }\r\n }\r\n )?.store?.states?.data?.value\r\n\r\nconst columnStoreSignature = computed(() => {\r\n const columns = readStoreColumns()\r\n if (!Array.isArray(columns)) {\r\n return ''\r\n }\r\n\r\n return columns\r\n .map((column, index) => {\r\n const current = column as ColumnState & { label?: unknown; property?: unknown }\r\n return [\r\n index,\r\n String(current.columnKey ?? ''),\r\n String(current.type ?? ''),\r\n String(current.label ?? ''),\r\n String(current.property ?? '')\r\n ].join(':')\r\n })\r\n .join('|')\r\n})\r\n\r\nconst readStoreColumnCount = (): number => {\r\n const columns = readStoreColumns()\r\n\r\n return Array.isArray(columns) ? columns.length : 0\r\n}\r\n\r\nconst resolveColumnCount = (headerRow: HTMLElement | null, minimumCount = 0): number => {\r\n const headerCount = headerRow?.querySelectorAll<HTMLElement>('th.el-table__cell').length ?? 0\r\n\r\n return Math.max(minimumCount, columnOrder.value.length, readStoreColumnCount(), headerCount)\r\n}\r\n\r\nconst destroyRowSortable = () => {\r\n rowSortable.value?.destroy()\r\n rowSortable.value = null\r\n}\r\n\r\nconst stopColumnResizeGestureReleaseTracking = () => {\r\n if (!columnResizePointerUpListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('pointerup', columnResizePointerUpListener.value)\r\n document.removeEventListener('mouseup', columnResizePointerUpListener.value)\r\n document.removeEventListener('touchend', columnResizePointerUpListener.value)\r\n document.removeEventListener('touchcancel', columnResizePointerUpListener.value)\r\n document.removeEventListener('dragend', columnResizePointerUpListener.value)\r\n columnResizePointerUpListener.value = null\r\n}\r\n\r\nconst clearColumnResizeGesture = () => {\r\n stopColumnResizeGestureReleaseTracking()\r\n columnSortable.value?.option?.('disabled', false)\r\n isColumnResizeGesture.value = false\r\n}\r\n\r\nconst unbindColumnResizeGuard = () => {\r\n if (columnResizeGuardHeaderRow.value && columnResizePointerDownListener.value) {\r\n columnResizeGuardHeaderRow.value.removeEventListener(\r\n 'pointerdown',\r\n columnResizePointerDownListener.value,\r\n true\r\n )\r\n columnResizeGuardHeaderRow.value.removeEventListener(\r\n 'mousedown',\r\n columnResizePointerDownListener.value,\r\n true\r\n )\r\n columnResizeGuardHeaderRow.value.removeEventListener(\r\n 'touchstart',\r\n columnResizePointerDownListener.value,\r\n true\r\n )\r\n }\r\n\r\n columnResizeGuardHeaderRow.value = null\r\n columnResizePointerDownListener.value = null\r\n}\r\n\r\nconst destroyColumnSortable = () => {\r\n clearColumnResizeGesture()\r\n unbindColumnResizeGuard()\r\n columnSortable.value?.destroy()\r\n columnSortable.value = null\r\n if (columnDragPointerMoveListener.value) {\r\n document.removeEventListener('dragover', columnDragPointerMoveListener.value)\r\n document.removeEventListener('pointermove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('mousemove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('touchmove', columnDragPointerMoveListener.value)\r\n columnDragPointerMoveListener.value = null\r\n }\r\n isColumnDragging.value = false\r\n columnDragCount.value = null\r\n draggingColumnOldDisplayIndex.value = null\r\n pendingColumnDropDisplayIndex.value = null\r\n columnDragIndicatorDisplayIndex.value = null\r\n columnDragIndicatorSide.value = null\r\n const tableElement = getTableElement()\r\n if (tableElement) {\r\n const leftClass = ns.e('column-drag-indicator-left')\r\n const rightClass = ns.e('column-drag-indicator-right')\r\n tableElement\r\n .querySelectorAll<HTMLElement>('th.el-table__cell, td.el-table__cell')\r\n .forEach((cell) => {\r\n cell.classList.remove(leftClass, rightClass)\r\n })\r\n }\r\n}\r\n\r\nconst unbindOutsidePointerDown = () => {\r\n if (!outsidePointerDownListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('pointerdown', outsidePointerDownListener.value, true)\r\n document.removeEventListener('mousedown', outsidePointerDownListener.value, true)\r\n document.removeEventListener('touchstart', outsidePointerDownListener.value, true)\r\n outsidePointerDownListener.value = null\r\n}\r\n\r\nconst bindOutsidePointerDown = () => {\r\n unbindOutsidePointerDown()\r\n\r\n const listener = (event: Event) => {\r\n if (!activeCell.value) {\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n const target = event.target\r\n const isOverlayTarget =\r\n target instanceof Element &&\r\n Boolean(target.closest('.el-select__popper, .el-picker__popper, .el-popper'))\r\n\r\n if (\r\n !tableElement ||\r\n !(target instanceof Node) ||\r\n tableElement.contains(target) ||\r\n (isEditing.value && isOverlayTarget)\r\n ) {\r\n return\r\n }\r\n\r\n void blurActiveEditor()\r\n isEditing.value = false\r\n commitActiveCell(null)\r\n }\r\n\r\n outsidePointerDownListener.value = listener\r\n document.addEventListener('pointerdown', listener, true)\r\n document.addEventListener('mousedown', listener, true)\r\n document.addEventListener('touchstart', listener, true)\r\n}\r\n\r\nconst isDirectionKey = (value: string): value is DirectionKey =>\r\n value === 'ArrowUp' || value === 'ArrowDown' || value === 'ArrowLeft' || value === 'ArrowRight'\r\n\r\nconst isInputActivationKey = (event: KeyboardEvent) =>\r\n event.key.length === 1 ||\r\n event.key === 'Backspace' ||\r\n event.key === 'Delete' ||\r\n event.key === 'Enter' ||\r\n event.key === 'F2'\r\n\r\nconst canHandleKeyEvent = (event: KeyboardEvent) => {\r\n if (!activeCell.value || event.isComposing || event.ctrlKey || event.metaKey || event.altKey) {\r\n return false\r\n }\r\n\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return false\r\n }\r\n\r\n if (isEditing.value) {\r\n return true\r\n }\r\n\r\n const target = event.target\r\n if (target instanceof Node && tableElement.contains(target)) {\r\n return true\r\n }\r\n\r\n const activeElement = document.activeElement\r\n return (\r\n activeElement === null ||\r\n activeElement === document.body ||\r\n activeElement === document.documentElement ||\r\n (activeElement instanceof Node && tableElement.contains(activeElement))\r\n )\r\n}\r\n\r\nconst syncEditingStateFromTarget = (target: EventTarget | null) => {\r\n if (!activeCell.value) {\r\n isEditing.value = false\r\n return\r\n }\r\n\r\n const editor = findEditorForActiveCell()\r\n const root = editor?.getRootEl()\r\n if (root && target instanceof Node && root.contains(target)) {\r\n isEditing.value = true\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n if (tableElement && target instanceof Node && tableElement.contains(target)) {\r\n isEditing.value = false\r\n }\r\n}\r\n\r\nconst unbindKeyboardListener = () => {\r\n if (!keyboardListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('keydown', keyboardListener.value, true)\r\n keyboardListener.value = null\r\n}\r\n\r\nconst bindKeyboardListener = () => {\r\n unbindKeyboardListener()\r\n\r\n const listener = async (event: KeyboardEvent) => {\r\n if (!canHandleKeyEvent(event)) {\r\n return\r\n }\r\n\r\n if (isDirectionKey(event.key)) {\r\n if (isActiveEditorPanelOpen()) {\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n const nextActive = resolveNextActiveCell(event.key)\r\n if (!nextActive) {\r\n return\r\n }\r\n\r\n await blurActiveEditor()\r\n commitActiveCell(nextActive)\r\n await nextTick()\r\n scrollActiveCellIntoView()\r\n return\r\n }\r\n\r\n if (isActiveEditorPanelOpen()) {\r\n return\r\n }\r\n\r\n if (!isInputActivationKey(event) || isEditing.value) {\r\n return\r\n }\r\n\r\n const editor = findEditorForActiveCell()\r\n if (!editor) {\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n const handled = await editor.handoffFirstKey(event)\r\n if (handled) {\r\n isEditing.value = true\r\n }\r\n }\r\n\r\n keyboardListener.value = listener\r\n document.addEventListener('keydown', listener, true)\r\n}\r\n\r\nconst unbindEditorFocusTracking = () => {\r\n if (!editorFocusInListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('focusin', editorFocusInListener.value, true)\r\n editorFocusInListener.value = null\r\n}\r\n\r\nconst bindEditorFocusTracking = () => {\r\n unbindEditorFocusTracking()\r\n\r\n const listener = (event: FocusEvent) => {\r\n syncEditingStateFromTarget(event.target)\r\n }\r\n\r\n editorFocusInListener.value = listener\r\n document.addEventListener('focusin', listener, true)\r\n}\r\n\r\nconst readClientPointFromEvent = (event: Event): ClientPoint | null => {\r\n const pointEvent = event as { clientX?: unknown; clientY?: unknown }\r\n if (typeof pointEvent.clientX === 'number' && typeof pointEvent.clientY === 'number') {\r\n return { x: pointEvent.clientX, y: pointEvent.clientY }\r\n }\r\n\r\n if (typeof MouseEvent !== 'undefined' && event instanceof MouseEvent) {\r\n return { x: event.clientX, y: event.clientY }\r\n }\r\n\r\n if (typeof TouchEvent !== 'undefined' && event instanceof TouchEvent) {\r\n const touch = event.touches[0] ?? event.changedTouches[0]\r\n return touch\r\n ? {\r\n x: touch.clientX,\r\n y: touch.clientY\r\n }\r\n : null\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst resolveHeaderCellFromEvent = (event: Event): HTMLElement | null => {\r\n const target = event.target\r\n if (!(target instanceof Element)) {\r\n return null\r\n }\r\n\r\n const headerCell = target.closest('th.el-table__cell')\r\n return headerCell instanceof HTMLElement ? headerCell : null\r\n}\r\n\r\nconst isColumnResizeHotzone = (headerCell: HTMLElement, clientX: number): boolean => {\r\n const rect = headerCell.getBoundingClientRect()\r\n if (rect.width <= 0) {\r\n return false\r\n }\r\n\r\n const hotzoneWidth = Math.min(COLUMN_RESIZE_HOTZONE_PX, rect.width / 2)\r\n return clientX - rect.left <= hotzoneWidth || rect.right - clientX <= hotzoneWidth\r\n}\r\n\r\nconst startColumnResizeGestureReleaseTracking = () => {\r\n stopColumnResizeGestureReleaseTracking()\r\n\r\n const listener = () => {\r\n clearColumnResizeGesture()\r\n }\r\n\r\n columnResizePointerUpListener.value = listener\r\n document.addEventListener('pointerup', listener)\r\n document.addEventListener('mouseup', listener)\r\n document.addEventListener('touchend', listener)\r\n document.addEventListener('touchcancel', listener)\r\n document.addEventListener('dragend', listener)\r\n}\r\n\r\nconst bindColumnResizeGuard = (headerRow: HTMLElement) => {\r\n unbindColumnResizeGuard()\r\n\r\n const listener = (event: Event) => {\r\n const point = readClientPointFromEvent(event)\r\n const headerCell = resolveHeaderCellFromEvent(event)\r\n const hitResizeHotzone =\r\n point !== null && headerCell !== null && isColumnResizeHotzone(headerCell, point.x)\r\n\r\n if (!hitResizeHotzone) {\r\n if (!isColumnDragging.value && isColumnResizeGesture.value) {\r\n clearColumnResizeGesture()\r\n }\r\n return\r\n }\r\n\r\n isColumnResizeGesture.value = true\r\n updateColumnDragState(null)\r\n columnSortable.value?.option?.('disabled', true)\r\n startColumnResizeGestureReleaseTracking()\r\n }\r\n\r\n columnResizeGuardHeaderRow.value = headerRow\r\n columnResizePointerDownListener.value = listener\r\n headerRow.addEventListener('pointerdown', listener, true)\r\n headerRow.addEventListener('mousedown', listener, true)\r\n headerRow.addEventListener('touchstart', listener, true)\r\n}\r\n\r\nconst updateColumnDragState = (state: ColumnDropState | null) => {\r\n const leftClass = ns.e('column-drag-indicator-left')\r\n const rightClass = ns.e('column-drag-indicator-right')\r\n const tableElement = getTableElement()\r\n if (tableElement) {\r\n tableElement\r\n .querySelectorAll<HTMLElement>('th.el-table__cell, td.el-table__cell')\r\n .forEach((cell) => {\r\n cell.classList.remove(leftClass, rightClass)\r\n })\r\n }\r\n if (!state) {\r\n pendingColumnDropDisplayIndex.value = null\r\n columnDragIndicatorDisplayIndex.value = null\r\n columnDragIndicatorSide.value = null\r\n return\r\n }\r\n pendingColumnDropDisplayIndex.value = state.dropDisplayIndex\r\n columnDragIndicatorDisplayIndex.value = state.targetDisplayIndex\r\n columnDragIndicatorSide.value = state.side\r\n if (!tableElement) {\r\n return\r\n }\r\n const indicatorClass = state.side === 'left' ? leftClass : rightClass\r\n const headerCells = Array.from(\r\n tableElement.querySelectorAll<HTMLElement>('.el-table__header-wrapper th.el-table__cell')\r\n )\r\n const headerCell = headerCells[state.targetDisplayIndex]\r\n headerCell?.classList.add(indicatorClass)\r\n\r\n const bodyRows = Array.from(\r\n tableElement.querySelectorAll<HTMLElement>('.el-table__body-wrapper tbody tr')\r\n )\r\n for (const row of bodyRows) {\r\n const bodyCells = Array.from(row.querySelectorAll<HTMLElement>('td.el-table__cell'))\r\n bodyCells[state.targetDisplayIndex]?.classList.add(indicatorClass)\r\n }\r\n}\r\n\r\nconst resolveColumnDropStateByClientPoint = (\r\n point: ClientPoint,\r\n oldIndex: number | null\r\n): ColumnDropState | null => {\r\n const tableElement = getTableElement()\r\n const headerRow = tableElement?.querySelector('.el-table__header-wrapper thead tr')\r\n if (!(headerRow instanceof HTMLElement)) {\r\n return null\r\n }\r\n\r\n const headerRowRect = headerRow.getBoundingClientRect()\r\n if (\r\n point.x < headerRowRect.left ||\r\n point.x > headerRowRect.right ||\r\n point.y < headerRowRect.top ||\r\n point.y > headerRowRect.bottom\r\n ) {\r\n return null\r\n }\r\n\r\n const cells = Array.from(headerRow.querySelectorAll<HTMLElement>('th.el-table__cell'))\r\n if (cells.length === 0) {\r\n return null\r\n }\r\n\r\n let targetDisplayIndex = cells.length - 1\r\n for (let index = 0; index < cells.length; index += 1) {\r\n const rect = cells[index].getBoundingClientRect()\r\n if (point.x <= rect.right) {\r\n targetDisplayIndex = index\r\n break\r\n }\r\n }\r\n\r\n const targetCellRect = cells[targetDisplayIndex]?.getBoundingClientRect()\r\n if (!targetCellRect) {\r\n return null\r\n }\r\n\r\n const targetCenterX = targetCellRect.left + targetCellRect.width / 2\r\n const side: ColumnDragIndicatorSide = point.x < targetCenterX ? 'left' : 'right'\r\n\r\n let dropDisplayIndex = targetDisplayIndex + (side === 'right' ? 1 : 0)\r\n if (oldIndex !== null && dropDisplayIndex > oldIndex) {\r\n dropDisplayIndex -= 1\r\n }\r\n const maxIndex = cells.length - 1\r\n return {\r\n dropDisplayIndex: Math.min(Math.max(dropDisplayIndex, 0), maxIndex),\r\n targetDisplayIndex,\r\n side\r\n }\r\n}\r\n\r\nconst startColumnDragPointerTracking = (oldIndex: number | null) => {\r\n if (columnDragPointerMoveListener.value) {\r\n document.removeEventListener('dragover', columnDragPointerMoveListener.value)\r\n document.removeEventListener('pointermove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('mousemove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('touchmove', columnDragPointerMoveListener.value)\r\n }\r\n\r\n const listener = (event: Event) => {\r\n const point = readClientPointFromEvent(event)\r\n if (!point) {\r\n return\r\n }\r\n\r\n updateColumnDragState(resolveColumnDropStateByClientPoint(point, oldIndex))\r\n }\r\n\r\n columnDragPointerMoveListener.value = listener\r\n document.addEventListener('dragover', listener)\r\n document.addEventListener('pointermove', listener)\r\n document.addEventListener('mousemove', listener)\r\n document.addEventListener('touchmove', listener)\r\n}\r\n\r\nconst initRowSortable = () => {\r\n destroyRowSortable()\r\n\r\n if (!props.rowDraggable) {\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n const body = tableElement?.querySelector('.el-table__body-wrapper tbody')\r\n\r\n if (!(body instanceof HTMLElement)) {\r\n return\r\n }\r\n\r\n rowSortable.value = Sortable.create(body, {\r\n animation: 180,\r\n draggable: 'tr',\r\n handle: `.${ns.e('row-drag-cell')}`,\r\n onStart: (event: SortableEvent) => {\r\n const oldIndex = toNullableIndex(event.oldIndex)\r\n const payload: RowDragEvent = {\r\n oldIndex,\r\n newIndex: null,\r\n row: oldIndex === null ? null : (sourceData.value[oldIndex] ?? null)\r\n }\r\n\r\n emit('row-drag-start', payload)\r\n },\r\n onEnd: (event: SortableEvent) => {\r\n const oldIndex = toNullableIndex(event.oldIndex)\r\n const newIndex = toNullableIndex(event.newIndex)\r\n const row = oldIndex === null ? null : (sourceData.value[oldIndex] ?? null)\r\n const payload: RowDragEvent = {\r\n oldIndex,\r\n newIndex,\r\n row\r\n }\r\n\r\n emit('row-drag-end', payload)\r\n\r\n if (row && oldIndex !== null && newIndex !== null && oldIndex !== newIndex) {\r\n const orderPayload: RowOrderChangeEvent = {\r\n oldIndex,\r\n newIndex,\r\n row,\r\n data: reorderRows(sourceData.value, oldIndex, newIndex)\r\n }\r\n emit('row-order-change', orderPayload)\r\n }\r\n }\r\n })\r\n}\r\n\r\nconst initColumnSortable = () => {\r\n destroyColumnSortable()\r\n\r\n if (!props.columnDraggable) {\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n const headerRow = tableElement?.querySelector('.el-table__header-wrapper thead tr')\r\n\r\n if (!(headerRow instanceof HTMLElement)) {\r\n return\r\n }\r\n\r\n syncVisibleColumnCount(headerRow)\r\n\r\n columnSortable.value = Sortable.create(headerRow, {\r\n animation: 180,\r\n draggable: 'th.el-table__cell',\r\n sort: false,\r\n onStart: (event: SortableEvent) => {\r\n if (isColumnResizeGesture.value) {\r\n return\r\n }\r\n\r\n const oldIndex = toNullableIndex(event.oldIndex)\r\n isColumnDragging.value = true\r\n draggingColumnOldDisplayIndex.value = oldIndex\r\n updateColumnDragState(null)\r\n startColumnDragPointerTracking(oldIndex)\r\n const count = resolveColumnCount(headerRow, (oldIndex ?? -1) + 1)\r\n columnDragCount.value = count\r\n const activeOrder = resolveColumnOrder(count)\r\n const payload: ColumnDragEvent = {\r\n oldIndex,\r\n newIndex: null,\r\n columnIndex: oldIndex === null ? null : (activeOrder[oldIndex] ?? oldIndex)\r\n }\r\n\r\n emit('column-drag-start', payload)\r\n },\r\n onEnd: (event: SortableEvent) => {\r\n if (isColumnResizeGesture.value) {\r\n clearColumnResizeGesture()\r\n return\r\n }\r\n\r\n if (columnDragPointerMoveListener.value) {\r\n document.removeEventListener('dragover', columnDragPointerMoveListener.value)\r\n document.removeEventListener('pointermove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('mousemove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('touchmove', columnDragPointerMoveListener.value)\r\n columnDragPointerMoveListener.value = null\r\n }\r\n const oldIndex = toNullableIndex(event.oldIndex) ?? draggingColumnOldDisplayIndex.value\r\n const fallbackNewIndex = toNullableIndex(event.newIndex)\r\n const originalEvent = (event as { originalEvent?: Event }).originalEvent\r\n const point = originalEvent ? readClientPointFromEvent(originalEvent) : null\r\n const pointerState =\r\n point === null\r\n ? null\r\n : resolveColumnDropStateByClientPoint(point, draggingColumnOldDisplayIndex.value)\r\n const newIndex =\r\n pointerState?.dropDisplayIndex ?? pendingColumnDropDisplayIndex.value ?? fallbackNewIndex\r\n const maxDragIndex = Math.max(oldIndex ?? -1, newIndex ?? -1)\r\n const latestHeaderRow = getTableElement()?.querySelector('.el-table__header-wrapper thead tr')\r\n const count = Math.max(\r\n columnDragCount.value ?? 0,\r\n resolveColumnCount(\r\n latestHeaderRow instanceof HTMLElement ? latestHeaderRow : headerRow,\r\n maxDragIndex + 1\r\n )\r\n )\r\n const activeOrder = resolveColumnOrder(count)\r\n const columnIndex = oldIndex === null ? null : (activeOrder[oldIndex] ?? oldIndex)\r\n const payload: ColumnDragEvent = {\r\n oldIndex,\r\n newIndex,\r\n columnIndex\r\n }\r\n\r\n emit('column-drag-end', payload)\r\n\r\n if (oldIndex !== null && newIndex !== null && oldIndex !== newIndex) {\r\n const nextOrder = reorderColumnOrder(activeOrder, oldIndex, newIndex)\r\n const movedColumnSourceIndex = activeOrder[oldIndex] ?? oldIndex\r\n columnOrder.value = nextOrder\r\n\r\n const orderPayload: ColumnOrderChangeEvent = {\r\n oldIndex,\r\n newIndex,\r\n columnIndex: movedColumnSourceIndex,\r\n order: nextOrder\r\n }\r\n\r\n emit('column-order-change', orderPayload)\r\n\r\n void nextTick(() => {\r\n const tableElement = getTableElement()\r\n const latestHeaderRow = tableElement?.querySelector('.el-table__header-wrapper thead tr')\r\n if (latestHeaderRow instanceof HTMLElement) {\r\n syncVisibleColumnCount(latestHeaderRow)\r\n }\r\n })\r\n }\r\n\r\n isColumnDragging.value = false\r\n columnDragCount.value = null\r\n draggingColumnOldDisplayIndex.value = null\r\n updateColumnDragState(null)\r\n }\r\n })\r\n\r\n bindColumnResizeGuard(headerRow)\r\n}\r\n\r\nconst refreshSortables = async () => {\r\n await nextTick()\r\n initRowSortable()\r\n initColumnSortable()\r\n}\r\n\r\nconst mergedTableAttrs = computed(() => ({\r\n ...forwardedAttrs.value,\r\n class: [ns.b(), readAttr('class')],\r\n data: tableData.value,\r\n border: resolveBooleanAttr(true, 'border'),\r\n stripe: resolveBooleanAttr(true, 'stripe'),\r\n highlightCurrentRow: resolveBooleanAttr(true, 'highlightCurrentRow', 'highlight-current-row'),\r\n headerRowClassName: resolveHeaderRowClassName(),\r\n cellClassName: resolveCellClassName(),\r\n headerCellClassName: resolveHeaderCellClassName(),\r\n onCellClick: handleCellClick,\r\n onRowClick: handleRowClick,\r\n onSelect: handleSelect,\r\n onSelectAll: handleSelectAll\r\n}))\r\n\r\nwatch(columnStoreSignature, (next, prev) => {\r\n if (prev !== undefined && next !== prev) {\r\n editorRegistry.invalidate()\r\n void blurActiveEditor()\r\n isEditing.value = false\r\n commitActiveCell(null)\r\n scheduleActiveCellClassSync(true)\r\n }\r\n})\r\n\r\nwatch(\r\n () => [sourceData.value.length, props.rowKeyField],\r\n () => {\r\n editorRegistry.invalidate()\r\n if (!activeCell.value) {\r\n scheduleActiveCellClassSync(true)\r\n return\r\n }\r\n\r\n const hasActiveRow = sourceData.value.some(\r\n (row) => readRowKey(row) === activeCell.value?.rowKey\r\n )\r\n if (!hasActiveRow) {\r\n void blurActiveEditor()\r\n isEditing.value = false\r\n commitActiveCell(null)\r\n }\r\n\r\n scheduleActiveCellClassSync(true)\r\n }\r\n)\r\n\r\nwatch(\r\n sourceData,\r\n () => {\r\n editorRegistry.invalidate()\r\n scheduleActiveCellClassSync(true)\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nwatch(\r\n () => props.crossHighlight,\r\n () => {\r\n scheduleActiveCellClassSync()\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nwatch(activeCell, (nextActiveCell) => {\r\n if (!nextActiveCell) {\r\n isEditing.value = false\r\n }\r\n})\r\n\r\nonMounted(() => {\r\n bindEditorRegistryHost()\r\n bindOutsidePointerDown()\r\n bindKeyboardListener()\r\n bindEditorFocusTracking()\r\n scheduleActiveCellClassSync(true)\r\n void refreshSortables()\r\n})\r\n\r\nwatch(\r\n () => [\r\n props.rowDraggable,\r\n props.columnDraggable,\r\n props.rowDragHandleColumnIndex,\r\n sourceData.value.length\r\n ],\r\n () => {\r\n void refreshSortables()\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n clearActiveCellClasses()\r\n unbindEditorRegistryHost()\r\n unbindOutsidePointerDown()\r\n unbindKeyboardListener()\r\n unbindEditorFocusTracking()\r\n destroyRowSortable()\r\n destroyColumnSortable()\r\n})\r\n\r\ndefineExpose({} as FlTableExpose)\r\n</script>\r\n","<template>\r\n <component :is=\"h(ElTable, { ...mergedTableAttrs, ref: setTableRef }, tableSlots)\" />\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport Sortable from 'sortablejs'\r\nimport type { SortableEvent } from 'sortablejs'\r\nimport { ElTable } from 'element-plus'\r\nimport type { VNode } from 'vue'\r\nimport {\r\n Comment,\r\n Fragment,\r\n Text,\r\n cloneVNode,\r\n computed,\r\n isVNode,\r\n nextTick,\r\n onBeforeUnmount,\r\n onMounted,\r\n ref,\r\n shallowRef,\r\n useAttrs,\r\n useSlots,\r\n h,\r\n watch\r\n} from 'vue'\r\nimport { useMergedExpose } from '@falcon-ui/hooks'\r\nimport { invokeListener, useNamespace } from '@falcon-ui/utils'\r\nimport type {\r\n CellChangeEvent,\r\n ColumnDragEvent,\r\n ColumnOrderChangeEvent,\r\n FlTableExpose,\r\n RowData,\r\n RowDragEvent,\r\n RowOrderChangeEvent,\r\n SelectionRowToggleEvent\r\n} from './table'\r\nimport { tableEmits, tableProps } from './table'\r\nimport { createTableProxyDataBuilder } from './proxy-data'\r\nimport type { TableEditorEndpoint, TableEditorRegistry } from './editor-registry'\r\nimport { createTableEditorRegistry, tableEditorRegistryDomKey } from './editor-registry'\r\n\r\ndefineOptions({\r\n name: 'FlTable',\r\n inheritAttrs: false\r\n})\r\n\r\ntype CellClassNameScope = {\r\n row: RowData\r\n column: ColumnState\r\n rowIndex: number\r\n columnIndex: number\r\n}\r\n\r\ntype HeaderCellClassNameScope = {\r\n column: ColumnState\r\n rowIndex: number\r\n columnIndex: number\r\n}\r\n\r\ntype ColumnState = {\r\n type?: string\r\n columnKey?: string\r\n rawColumnKey?: string\r\n}\r\n\r\ntype ActiveCell = {\r\n rowKey: string | number\r\n columnKey: string\r\n}\r\n\r\ntype ClientPoint = {\r\n x: number\r\n y: number\r\n}\r\n\r\ntype ColumnDragIndicatorSide = 'left' | 'right'\r\n\r\ntype ColumnDropState = {\r\n dropDisplayIndex: number\r\n targetDisplayIndex: number\r\n side: ColumnDragIndicatorSide\r\n}\r\n\r\ntype DirectionKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight'\r\n\r\ntype VisibleColumnEntry = {\r\n displayIndex: number\r\n columnKey: string\r\n column: ColumnState\r\n}\r\n\r\ntype ActiveCellPosition = {\r\n rowIndex: number\r\n row: RowData\r\n column: VisibleColumnEntry\r\n columns: VisibleColumnEntry[]\r\n}\r\n\r\nconst COLUMN_RESIZE_HOTZONE_PX = 8\r\nconst ROW_DRAG_HANDLE_HOTZONE_PX = 24\r\nconst CONTROL_COLUMN_TYPES = new Set(['selection', 'index', 'expand'])\r\n\r\nconst props = defineProps(tableProps)\r\nconst emit = defineEmits(tableEmits)\r\nconst attrs = useAttrs()\r\nconst slots = useSlots()\r\nconst ns = useNamespace('table')\r\nconst rawAttrs = attrs as Record<string, unknown>\r\n\r\nconst tableRef = shallowRef<FlTableExpose | null>(null)\r\nconst rowSortable = shallowRef<Sortable | null>(null)\r\nconst columnSortable = shallowRef<Sortable | null>(null)\r\nconst columnOrder = ref<number[]>([])\r\nconst columnDragCount = ref<number | null>(null)\r\nconst visibleColumnCount = ref<number>(0)\r\nconst draggingColumnOldDisplayIndex = ref<number | null>(null)\r\nconst pendingColumnDropDisplayIndex = ref<number | null>(null)\r\nconst columnDragIndicatorDisplayIndex = ref<number | null>(null)\r\nconst columnDragIndicatorSide = ref<ColumnDragIndicatorSide | null>(null)\r\nconst isColumnDragging = ref<boolean>(false)\r\nconst columnDragPointerMoveListener = ref<((event: Event) => void) | null>(null)\r\nconst isColumnResizeGesture = ref<boolean>(false)\r\nconst columnResizeGuardHeaderRow = shallowRef<HTMLElement | null>(null)\r\nconst columnResizePointerDownListener = ref<((event: Event) => void) | null>(null)\r\nconst columnResizePointerUpListener = ref<((event: Event) => void) | null>(null)\r\nconst activeCell = ref<ActiveCell | null>(null)\r\nconst isEditing = ref(false)\r\nconst outsidePointerDownListener = ref<((event: Event) => void) | null>(null)\r\nconst keyboardListener = ref<((event: KeyboardEvent) => void) | null>(null)\r\nconst editorFocusInListener = ref<((event: FocusEvent) => void) | null>(null)\r\nconst buildProxyData = createTableProxyDataBuilder()\r\nconst editorRegistry = createTableEditorRegistry()\r\n\r\nlet activeCellClassSnapshot: ActiveCell | null = null\r\nlet renderedActiveCell: ActiveCell | null = null\r\nlet renderedCrossHighlight = props.crossHighlight\r\nlet activeCellClassSyncVersion = 0\r\nlet shouldResetActiveCellClasses = false\r\n\r\nconst { changeRef } = useMergedExpose({})\r\n\r\nconst setTableRef = (instance: unknown) => {\r\n tableRef.value = instance as FlTableExpose | null\r\n changeRef(instance)\r\n}\r\n\r\nconst flattenSlotNodes = (nodes: unknown): VNode[] => {\r\n const flatNodes: VNode[] = []\r\n const list = Array.isArray(nodes) ? nodes : []\r\n\r\n const visit = (node: unknown) => {\r\n if (!isVNode(node)) {\r\n return\r\n }\r\n\r\n if (node.type === Comment || node.type === Text) {\r\n return\r\n }\r\n\r\n if (node.type === Fragment && Array.isArray(node.children)) {\r\n for (const child of node.children) {\r\n visit(child)\r\n }\r\n return\r\n }\r\n\r\n flatNodes.push(node)\r\n }\r\n\r\n for (const node of list) {\r\n visit(node)\r\n }\r\n\r\n return flatNodes\r\n}\r\n\r\nconst getInternalColumnKey = (sourceIndex: number) => `column-${sourceIndex}`\r\n\r\nconst createColumnOrder = (count: number): number[] =>\r\n Array.from({ length: count }, (_, index) => index)\r\n\r\nconst resolveColumnOrder = (\r\n count: number,\r\n currentOrder: number[] = columnOrder.value\r\n): number[] => {\r\n if (\r\n count <= 0 ||\r\n currentOrder.length !== count ||\r\n new Set(currentOrder).size !== count ||\r\n currentOrder.some((index) => index < 0 || index >= count)\r\n ) {\r\n return createColumnOrder(count)\r\n }\r\n\r\n return currentOrder\r\n}\r\n\r\nconst reorderColumnOrder = (order: number[], oldIndex: number, newIndex: number): number[] => {\r\n if (oldIndex === newIndex) {\r\n return [...order]\r\n }\r\n\r\n const nextOrder = [...order]\r\n const [moved] = nextOrder.splice(oldIndex, 1)\r\n if (moved === undefined) {\r\n return [...order]\r\n }\r\n\r\n nextOrder.splice(newIndex, 0, moved)\r\n return nextOrder\r\n}\r\n\r\nconst tableSlots = computed(() => {\r\n const orderSnapshot = columnOrder.value\r\n const userDefaultSlot = slots.default\r\n\r\n if (!userDefaultSlot) {\r\n return slots\r\n }\r\n\r\n return {\r\n ...slots,\r\n default: (...args: unknown[]) => {\r\n const rawNodes = userDefaultSlot(...args)\r\n const columnNodes = flattenSlotNodes(rawNodes)\r\n if (columnNodes.length === 0) {\r\n return rawNodes\r\n }\r\n\r\n const activeOrder = resolveColumnOrder(columnNodes.length, orderSnapshot)\r\n return activeOrder\r\n .map((sourceIndex) => {\r\n const node = columnNodes[sourceIndex]\r\n if (!node) {\r\n return null\r\n }\r\n\r\n return cloneVNode(node, {\r\n key: node.key ?? `fl-table-column-${sourceIndex}`,\r\n columnKey: getInternalColumnKey(sourceIndex)\r\n })\r\n })\r\n .filter((node): node is VNode => node !== null)\r\n }\r\n }\r\n})\r\n\r\nconst controlledAttrKeys = [\r\n 'class',\r\n 'data',\r\n 'border',\r\n 'stripe',\r\n 'highlightCurrentRow',\r\n 'highlight-current-row',\r\n 'headerRowClassName',\r\n 'header-row-class-name',\r\n 'cellClassName',\r\n 'cell-class-name',\r\n 'headerCellClassName',\r\n 'header-cell-class-name',\r\n 'onCellClick',\r\n 'onCell-click',\r\n 'onRowClick',\r\n 'onSelect',\r\n 'onSelectAll'\r\n]\r\n\r\nconst readAttr = <T = unknown,>(...keys: string[]): T | undefined => {\r\n for (const key of keys) {\r\n if (key in rawAttrs) {\r\n return rawAttrs[key] as T\r\n }\r\n }\r\n\r\n return undefined\r\n}\r\n\r\nconst normalizeClass = (value: unknown): string[] => {\r\n if (!value) {\r\n return []\r\n }\r\n\r\n if (typeof value === 'string') {\r\n return value\r\n .split(' ')\r\n .map((item) => item.trim())\r\n .filter(Boolean)\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.flatMap((item) => normalizeClass(item))\r\n }\r\n\r\n if (typeof value === 'object') {\r\n return Object.entries(value as Record<string, unknown>)\r\n .filter(([, enabled]) => Boolean(enabled))\r\n .map(([name]) => name)\r\n }\r\n\r\n return []\r\n}\r\n\r\nconst mergeClass = (...values: unknown[]): string => {\r\n const classSet = new Set<string>()\r\n for (const item of values.flatMap((value) => normalizeClass(value))) {\r\n classSet.add(item)\r\n }\r\n\r\n return Array.from(classSet).join(' ')\r\n}\r\n\r\nconst resolveBooleanAttr = (defaultValue: boolean, ...keys: string[]): boolean => {\r\n const value = readAttr(...keys)\r\n if (value === undefined) {\r\n return defaultValue\r\n }\r\n\r\n if (value === '') {\r\n return true\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value\r\n }\r\n\r\n return Boolean(value)\r\n}\r\n\r\nconst toNullableIndex = (value: unknown): number | null =>\r\n typeof value === 'number' && Number.isInteger(value) ? value : null\r\n\r\nconst reorderRows = (rows: RowData[], oldIndex: number, newIndex: number): RowData[] => {\r\n if (oldIndex === newIndex) {\r\n return [...rows]\r\n }\r\n\r\n const next = [...rows]\r\n const [moved] = next.splice(oldIndex, 1)\r\n if (!moved) {\r\n return [...rows]\r\n }\r\n\r\n next.splice(newIndex, 0, moved)\r\n return next\r\n}\r\n\r\nconst getTableElement = (): HTMLElement | null => {\r\n const candidate = (tableRef.value as unknown as { $el?: Element | null })?.$el\r\n return candidate instanceof HTMLElement ? candidate : null\r\n}\r\n\r\nconst bindEditorRegistryHost = () => {\r\n const tableElement = getTableElement() as\r\n | (HTMLElement & { [tableEditorRegistryDomKey]?: TableEditorRegistry })\r\n | null\r\n\r\n if (tableElement) {\r\n tableElement[tableEditorRegistryDomKey] = editorRegistry\r\n }\r\n}\r\n\r\nconst unbindEditorRegistryHost = () => {\r\n const tableElement = getTableElement() as\r\n | (HTMLElement & { [tableEditorRegistryDomKey]?: TableEditorRegistry })\r\n | null\r\n\r\n if (tableElement?.[tableEditorRegistryDomKey]) {\r\n delete tableElement[tableEditorRegistryDomKey]\r\n }\r\n}\r\n\r\nconst hasSelectionColumn = (): boolean => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return false\r\n }\r\n\r\n return (\r\n tableElement.querySelector('.el-table__header-wrapper th.el-table-column--selection') !== null\r\n )\r\n}\r\n\r\nconst getSelectionRows = (): RowData[] => {\r\n const rows = tableRef.value?.getSelectionRows?.()\r\n return Array.isArray(rows) ? (rows as RowData[]) : []\r\n}\r\n\r\nconst sourceData = computed<RowData[]>(() => props.data)\r\n\r\nconst tableData = computed<RowData[]>(() => {\r\n if (!props.isEdit) {\r\n return sourceData.value\r\n }\r\n\r\n return buildProxyData({\r\n data: sourceData.value,\r\n rowKeyField: props.rowKeyField,\r\n maxDepth: props.cellProxyMaxDepth,\r\n resolveRowIndex: (row) => sourceData.value.indexOf(row),\r\n onCellChange: (payload: CellChangeEvent) => {\r\n emit('cell-change', payload)\r\n }\r\n })\r\n})\r\n\r\nconst forwardedAttrs = computed(() => {\r\n const next = { ...rawAttrs }\r\n for (const key of controlledAttrKeys) {\r\n delete next[key]\r\n }\r\n\r\n return next\r\n})\r\n\r\nconst readRowKey = (row: RowData): string | number | null => {\r\n const candidate = row[props.rowKeyField]\r\n return typeof candidate === 'string' || typeof candidate === 'number' ? candidate : null\r\n}\r\n\r\nconst isControlColumn = (column: ColumnState | null | undefined): boolean =>\r\n typeof column?.type === 'string' && CONTROL_COLUMN_TYPES.has(column.type)\r\n\r\nconst resolveColumnKey = (\r\n column: ColumnState | null | undefined,\r\n displayIndex: number | null = null\r\n): string | null => {\r\n if (typeof column?.columnKey === 'string' && column.columnKey) {\r\n return column.columnKey\r\n }\r\n\r\n if (typeof column?.rawColumnKey === 'string' && column.rawColumnKey) {\r\n return column.rawColumnKey\r\n }\r\n\r\n if (displayIndex === null) {\r\n return null\r\n }\r\n\r\n const count = Math.max(columnOrder.value.length, displayIndex + 1, visibleColumnCount.value)\r\n const activeOrder = resolveColumnOrder(count)\r\n const sourceIndex = activeOrder[displayIndex] ?? displayIndex\r\n return getInternalColumnKey(sourceIndex)\r\n}\r\n\r\nconst resolveCellDisplayIndex = (cell: Element | null): number | null => {\r\n if (\r\n !(cell instanceof HTMLTableCellElement) ||\r\n !(cell.parentElement instanceof HTMLTableRowElement)\r\n ) {\r\n return null\r\n }\r\n\r\n return Array.from(cell.parentElement.children).indexOf(cell)\r\n}\r\n\r\nconst isRowDragHandleHotzone = (\r\n cell: Element | null,\r\n event: Event,\r\n displayIndex: number | null\r\n) => {\r\n if (\r\n !props.rowDraggable ||\r\n displayIndex !== props.rowDragHandleColumnIndex ||\r\n !(cell instanceof HTMLElement)\r\n ) {\r\n return false\r\n }\r\n\r\n const point = readClientPointFromEvent(event)\r\n if (!point) {\r\n return false\r\n }\r\n\r\n const rect = cell.getBoundingClientRect()\r\n if (rect.width <= 0 || rect.height <= 0) {\r\n return false\r\n }\r\n\r\n return point.x - rect.left <= Math.min(ROW_DRAG_HANDLE_HOTZONE_PX, rect.width)\r\n}\r\n\r\nconst commitActiveCell = (nextActiveCell: ActiveCell | null) => {\r\n activeCellClassSnapshot = nextActiveCell ? { ...nextActiveCell } : null\r\n activeCell.value = nextActiveCell ? { ...nextActiveCell } : null\r\n scheduleActiveCellClassSync()\r\n}\r\n\r\nconst setActiveCell = (\r\n row: RowData,\r\n column: ColumnState | null | undefined,\r\n displayIndex: number\r\n) => {\r\n if (isControlColumn(column)) {\r\n return\r\n }\r\n\r\n const rowKey = readRowKey(row)\r\n const columnKey = resolveColumnKey(column, displayIndex)\r\n\r\n if (rowKey === null || !columnKey) {\r\n return\r\n }\r\n\r\n commitActiveCell({\r\n rowKey,\r\n columnKey\r\n })\r\n}\r\n\r\nconst resolveVisibleColumns = (): VisibleColumnEntry[] => {\r\n const columns = readStoreColumns()\r\n if (!Array.isArray(columns)) {\r\n return []\r\n }\r\n\r\n return columns.flatMap((item, displayIndex) => {\r\n const column = item as ColumnState\r\n if (isControlColumn(column)) {\r\n return []\r\n }\r\n\r\n const columnKey = resolveColumnKey(column, displayIndex)\r\n if (!columnKey) {\r\n return []\r\n }\r\n\r\n return [\r\n {\r\n displayIndex,\r\n columnKey,\r\n column\r\n }\r\n ]\r\n })\r\n}\r\n\r\nconst resolveCellPosition = (\r\n cell: ActiveCell | null,\r\n rows: RowData[] = sourceData.value\r\n): ActiveCellPosition | null => {\r\n if (!cell) {\r\n return null\r\n }\r\n\r\n const rowIndex = rows.findIndex((row) => readRowKey(row) === cell.rowKey)\r\n if (rowIndex < 0) {\r\n return null\r\n }\r\n\r\n const columns = resolveVisibleColumns()\r\n const column = columns.find((item) => item.columnKey === cell.columnKey)\r\n if (!column) {\r\n return null\r\n }\r\n\r\n const row = rows[rowIndex]\r\n if (!row) {\r\n return null\r\n }\r\n\r\n return {\r\n rowIndex,\r\n row,\r\n column,\r\n columns\r\n }\r\n}\r\n\r\nconst resolveActiveCellPosition = (): ActiveCellPosition | null =>\r\n resolveCellPosition(activeCell.value)\r\n\r\nconst getBodyWrappers = (): HTMLElement[] => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return []\r\n }\r\n\r\n return Array.from(\r\n tableElement.querySelectorAll<HTMLElement>(\r\n '.el-table__body-wrapper, .el-table__fixed-body-wrapper'\r\n )\r\n )\r\n}\r\n\r\nconst isFixedCloneElement = (element: Element | null): boolean =>\r\n Boolean(element?.closest('.el-table__fixed, .el-table__fixed-right'))\r\n\r\nconst resolveBodyCellsByPosition = (rowIndex: number, displayIndex: number): HTMLElement[] =>\r\n getBodyWrappers().flatMap((wrapper) => {\r\n const rows = wrapper.querySelectorAll<HTMLTableRowElement>('tbody tr')\r\n const row = rows[rowIndex]\r\n if (!row) {\r\n return []\r\n }\r\n\r\n const cell = row.querySelectorAll<HTMLElement>('td.el-table__cell')[displayIndex]\r\n return cell ? [cell] : []\r\n })\r\n\r\nconst pickPrimaryCell = (cells: HTMLElement[]): HTMLElement | null =>\r\n cells.find((cell) => !isFixedCloneElement(cell)) ?? cells[0] ?? null\r\n\r\nconst activeCellClassNames = {\r\n active: ns.e('cross-active'),\r\n row: ns.e('cross-row'),\r\n column: ns.e('cross-column'),\r\n control: ns.e('cross-control-cell')\r\n} as const\r\n\r\ntype ActiveCellClassState = Map<HTMLElement, Set<string>>\r\n\r\nconst getHeaderWrappers = (): HTMLElement[] => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return []\r\n }\r\n\r\n return Array.from(\r\n tableElement.querySelectorAll<HTMLElement>(\r\n '.el-table__header-wrapper, .el-table__fixed-header-wrapper'\r\n )\r\n )\r\n}\r\n\r\nconst resolveHeaderCellsByPosition = (displayIndex: number): HTMLElement[] =>\r\n getHeaderWrappers().flatMap((wrapper) => {\r\n const rows = wrapper.querySelectorAll<HTMLTableRowElement>('thead tr')\r\n const row = rows[rows.length - 1]\r\n const cell = row?.querySelectorAll<HTMLElement>('th.el-table__cell')[displayIndex]\r\n return cell ? [cell] : []\r\n })\r\n\r\nconst createActiveCellDomLookup = () => {\r\n const bodyWrappers = getBodyWrappers().map((wrapper) => ({\r\n rows: wrapper.querySelectorAll<HTMLTableRowElement>('tbody tr'),\r\n rowCells: new Map<number, HTMLElement[]>()\r\n }))\r\n\r\n const readRowCells = (\r\n wrapper: (typeof bodyWrappers)[number],\r\n rowIndex: number\r\n ): HTMLElement[] | null => {\r\n const cached = wrapper.rowCells.get(rowIndex)\r\n if (cached) {\r\n return cached\r\n }\r\n\r\n const row = wrapper.rows[rowIndex]\r\n if (!row) {\r\n return null\r\n }\r\n\r\n const cells = Array.from(row.querySelectorAll<HTMLElement>('td.el-table__cell'))\r\n wrapper.rowCells.set(rowIndex, cells)\r\n return cells\r\n }\r\n\r\n return {\r\n resolveBodyCells(rowIndex: number, displayIndex: number) {\r\n return bodyWrappers.flatMap((wrapper) => {\r\n const cell = readRowCells(wrapper, rowIndex)?.[displayIndex]\r\n return cell ? [cell] : []\r\n })\r\n },\r\n resolveBodyRowCells(rowIndex: number) {\r\n return bodyWrappers.flatMap((wrapper) =>\r\n Array.from(readRowCells(wrapper, rowIndex) ?? []).map((cell, displayIndex) => ({\r\n cell,\r\n displayIndex\r\n }))\r\n )\r\n },\r\n resolveBodyColumnCells(displayIndex: number) {\r\n const selector = `tr > td.el-table__cell:nth-child(${displayIndex + 1})`\r\n return bodyWrappers.flatMap((wrapper) =>\r\n Array.from(wrapper.rows[0]?.parentElement?.querySelectorAll<HTMLElement>(selector) ?? [])\r\n )\r\n },\r\n resolveHeaderCells: resolveHeaderCellsByPosition\r\n }\r\n}\r\n\r\nconst addActiveCellClass = (\r\n state: ActiveCellClassState,\r\n elements: Iterable<HTMLElement>,\r\n className: string\r\n) => {\r\n for (const element of elements) {\r\n const classes = state.get(element) ?? new Set<string>()\r\n classes.add(className)\r\n state.set(element, classes)\r\n }\r\n}\r\n\r\nconst collectActiveCellClasses = (\r\n cell: ActiveCell | null,\r\n crossHighlight: boolean,\r\n lookup: ReturnType<typeof createActiveCellDomLookup>\r\n): ActiveCellClassState => {\r\n const state: ActiveCellClassState = new Map()\r\n const storeData = readStoreData()\r\n const position = resolveCellPosition(\r\n cell,\r\n Array.isArray(storeData) ? (storeData as RowData[]) : sourceData.value\r\n )\r\n if (!position) {\r\n return state\r\n }\r\n\r\n const activeCells = lookup.resolveBodyCells(position.rowIndex, position.column.displayIndex)\r\n addActiveCellClass(state, activeCells, activeCellClassNames.active)\r\n\r\n if (!crossHighlight) {\r\n return state\r\n }\r\n\r\n const columns = readStoreColumns()\r\n if (Array.isArray(columns)) {\r\n for (const { cell: rowCell, displayIndex } of lookup.resolveBodyRowCells(position.rowIndex)) {\r\n if (displayIndex === position.column.displayIndex) {\r\n continue\r\n }\r\n\r\n addActiveCellClass(\r\n state,\r\n [rowCell],\r\n isControlColumn(columns[displayIndex] as ColumnState)\r\n ? activeCellClassNames.control\r\n : activeCellClassNames.row\r\n )\r\n }\r\n }\r\n\r\n const activeCellSet = new Set(activeCells)\r\n addActiveCellClass(\r\n state,\r\n lookup\r\n .resolveBodyColumnCells(position.column.displayIndex)\r\n .filter((columnCell) => !activeCellSet.has(columnCell)),\r\n activeCellClassNames.column\r\n )\r\n addActiveCellClass(\r\n state,\r\n lookup.resolveHeaderCells(position.column.displayIndex),\r\n activeCellClassNames.column\r\n )\r\n\r\n return state\r\n}\r\n\r\nconst applyActiveCellClassDelta = (previous: ActiveCellClassState, next: ActiveCellClassState) => {\r\n for (const [element, classes] of previous) {\r\n const nextClasses = next.get(element)\r\n for (const className of classes) {\r\n if (!nextClasses?.has(className)) {\r\n element.classList.remove(className)\r\n }\r\n }\r\n }\r\n\r\n for (const [element, classes] of next) {\r\n const previousClasses = previous.get(element)\r\n for (const className of classes) {\r\n if (!previousClasses?.has(className)) {\r\n element.classList.add(className)\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst clearActiveCellClasses = () => {\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return\r\n }\r\n\r\n const selector = Object.values(activeCellClassNames)\r\n .map((className) => `.${className}`)\r\n .join(',')\r\n for (const element of tableElement.querySelectorAll<HTMLElement>(selector)) {\r\n element.classList.remove(...Object.values(activeCellClassNames))\r\n }\r\n}\r\n\r\nconst syncActiveCellClasses = () => {\r\n const nextActiveCell = activeCellClassSnapshot ? { ...activeCellClassSnapshot } : null\r\n const nextCrossHighlight = props.crossHighlight\r\n const lookup = createActiveCellDomLookup()\r\n const nextClasses = collectActiveCellClasses(nextActiveCell, nextCrossHighlight, lookup)\r\n\r\n if (shouldResetActiveCellClasses) {\r\n clearActiveCellClasses()\r\n applyActiveCellClassDelta(new Map(), nextClasses)\r\n } else {\r\n const previousClasses = collectActiveCellClasses(\r\n renderedActiveCell,\r\n renderedCrossHighlight,\r\n lookup\r\n )\r\n applyActiveCellClassDelta(previousClasses, nextClasses)\r\n }\r\n\r\n renderedActiveCell = nextActiveCell\r\n renderedCrossHighlight = nextCrossHighlight\r\n shouldResetActiveCellClasses = false\r\n}\r\n\r\nfunction scheduleActiveCellClassSync(shouldReset = false) {\r\n shouldResetActiveCellClasses ||= shouldReset\r\n const version = ++activeCellClassSyncVersion\r\n void nextTick(() => {\r\n if (version === activeCellClassSyncVersion) {\r\n syncActiveCellClasses()\r\n }\r\n })\r\n}\r\n\r\nconst sortEditorCandidates = (items: TableEditorEndpoint[]): TableEditorEndpoint[] =>\r\n [...items].sort((left, right) => {\r\n const fixedDelta = Number(Boolean(left.isFixedClone)) - Number(Boolean(right.isFixedClone))\r\n if (fixedDelta !== 0) {\r\n return fixedDelta\r\n }\r\n\r\n return (right.priority ?? 0) - (left.priority ?? 0)\r\n })\r\n\r\nconst findEditorsInCells = (cells: HTMLElement[]): TableEditorEndpoint[] =>\r\n sortEditorCandidates(editorRegistry.getEditorsInCells(cells))\r\n\r\nconst findEditorForActiveCell = (): TableEditorEndpoint | null => {\r\n const position = resolveActiveCellPosition()\r\n if (!position) {\r\n return null\r\n }\r\n\r\n const cells = resolveBodyCellsByPosition(position.rowIndex, position.column.displayIndex)\r\n return findEditorsInCells(cells)[0] ?? null\r\n}\r\n\r\nconst resolveNextActiveCell = (direction: DirectionKey): ActiveCell | null => {\r\n const position = resolveActiveCellPosition()\r\n if (!position) {\r\n return null\r\n }\r\n\r\n if (direction === 'ArrowUp' || direction === 'ArrowDown') {\r\n const nextRowIndex = position.rowIndex + (direction === 'ArrowDown' ? 1 : -1)\r\n const nextRow = sourceData.value[nextRowIndex]\r\n const nextRowKey = nextRow ? readRowKey(nextRow) : null\r\n if (nextRowIndex < 0 || !nextRow || nextRowKey === null) {\r\n return null\r\n }\r\n\r\n return {\r\n rowKey: nextRowKey,\r\n columnKey: position.column.columnKey\r\n }\r\n }\r\n\r\n const currentColumnIndex = position.columns.findIndex(\r\n (item) => item.columnKey === position.column.columnKey\r\n )\r\n if (currentColumnIndex < 0) {\r\n return null\r\n }\r\n\r\n const nextColumnIndex = currentColumnIndex + (direction === 'ArrowRight' ? 1 : -1)\r\n const nextColumn = position.columns[nextColumnIndex]\r\n if (!nextColumn) {\r\n return null\r\n }\r\n\r\n const rowKey = readRowKey(position.row)\r\n if (rowKey === null) {\r\n return null\r\n }\r\n\r\n return {\r\n rowKey,\r\n columnKey: nextColumn.columnKey\r\n }\r\n}\r\n\r\nconst scrollActiveCellIntoView = () => {\r\n const position = resolveActiveCellPosition()\r\n if (!position) {\r\n return\r\n }\r\n\r\n const targetCell = pickPrimaryCell(\r\n resolveBodyCellsByPosition(position.rowIndex, position.column.displayIndex)\r\n )\r\n targetCell?.scrollIntoView({\r\n block: 'nearest',\r\n inline: 'nearest'\r\n })\r\n}\r\n\r\nconst blurActiveEditor = async () => {\r\n const editor = findEditorForActiveCell()\r\n if (!editor) {\r\n return\r\n }\r\n\r\n await Promise.resolve(editor.close?.())\r\n await Promise.resolve(editor.blur())\r\n isEditing.value = false\r\n}\r\n\r\nconst isActiveEditorPanelOpen = () => {\r\n const editor = findEditorForActiveCell()\r\n if (!editor?.isPanelOpen) {\r\n return false\r\n }\r\n\r\n return Boolean(editor.isPanelOpen())\r\n}\r\n\r\nconst resolveSelectionTogglePayload = (\r\n row: RowData,\r\n selectionBefore: RowData[],\r\n selectionAfter: RowData[],\r\n trigger: SelectionRowToggleEvent['trigger']\r\n): SelectionRowToggleEvent => ({\r\n row,\r\n rowIndex: sourceData.value.indexOf(row),\r\n selected: selectionAfter.includes(row),\r\n selectionBefore,\r\n selectionAfter,\r\n trigger\r\n})\r\n\r\nconst handleRowClick = (row: RowData, column: unknown, event: Event) => {\r\n if (props.selectionRowClick && hasSelectionColumn() && tableRef.value) {\r\n const selectionBefore = getSelectionRows()\r\n\r\n if (props.selectionSingle) {\r\n tableRef.value.clearSelection()\r\n tableRef.value.toggleRowSelection(row, true)\r\n } else {\r\n const nextSelected = !selectionBefore.includes(row)\r\n tableRef.value.toggleRowSelection(row, nextSelected)\r\n }\r\n\r\n const selectionAfter = getSelectionRows()\r\n emit(\r\n 'selection-row-toggle',\r\n resolveSelectionTogglePayload(row, selectionBefore, selectionAfter, 'row-click')\r\n )\r\n }\r\n\r\n invokeListener(readAttr('onRowClick'), row, column, event)\r\n}\r\n\r\nconst handleCellClick = (row: RowData, column: ColumnState, cell: Element, event: Event) => {\r\n const displayIndex = resolveCellDisplayIndex(cell)\r\n const isHandleHotzone = isRowDragHandleHotzone(cell, event, displayIndex)\r\n\r\n if (!isHandleHotzone && displayIndex !== null) {\r\n setActiveCell(row, column, displayIndex)\r\n syncEditingStateFromTarget(event.target)\r\n }\r\n\r\n invokeListener(readAttr('onCellClick', 'onCell-click'), row, column, cell, event)\r\n}\r\n\r\nconst handleSelect = (selection: RowData[], row: RowData) => {\r\n if (props.selectionSingle && tableRef.value && selection.length > 1) {\r\n tableRef.value.clearSelection()\r\n tableRef.value.toggleRowSelection(row, true)\r\n\r\n const nextSelection = getSelectionRows()\r\n\r\n emit('selection-single-conflict', {\r\n reason: 'multiple-selected',\r\n selection\r\n })\r\n\r\n emit(\r\n 'selection-row-toggle',\r\n resolveSelectionTogglePayload(row, selection, nextSelection, 'selection-change')\r\n )\r\n\r\n invokeListener(readAttr('onSelect'), nextSelection, row)\r\n return\r\n }\r\n\r\n invokeListener(readAttr('onSelect'), selection, row)\r\n}\r\n\r\nconst handleSelectAll = (selection: RowData[]) => {\r\n if (props.selectionSingle && tableRef.value) {\r\n tableRef.value.clearSelection()\r\n\r\n emit('selection-single-conflict', {\r\n reason: 'select-all-disabled',\r\n selection\r\n })\r\n\r\n invokeListener(readAttr('onSelectAll'), [])\r\n return\r\n }\r\n\r\n invokeListener(readAttr('onSelectAll'), selection)\r\n}\r\n\r\nconst resolveHeaderRowClassName = () => {\r\n const baseClass = ns.e('header-row')\r\n const userClassName = readAttr('headerRowClassName', 'header-row-class-name')\r\n\r\n if (typeof userClassName === 'function') {\r\n return (...args: unknown[]) => mergeClass(userClassName(...args), baseClass)\r\n }\r\n\r\n return mergeClass(userClassName, baseClass)\r\n}\r\n\r\nconst resolveCellClassName = () => {\r\n const userCellClassName = readAttr('cellClassName', 'cell-class-name')\r\n\r\n const resolveCrossClass = (scope: CellClassNameScope): string | null => {\r\n const focusCell = activeCellClassSnapshot\r\n if (!focusCell) {\r\n return null\r\n }\r\n\r\n const rowKey = readRowKey(scope.row)\r\n if (rowKey === null) {\r\n return null\r\n }\r\n\r\n if (isControlColumn(scope.column)) {\r\n return props.crossHighlight && rowKey === focusCell.rowKey ? ns.e('cross-control-cell') : null\r\n }\r\n\r\n const columnKey = resolveColumnKey(scope.column, scope.columnIndex)\r\n if (!columnKey) {\r\n return null\r\n }\r\n\r\n const isActiveRow = rowKey === focusCell.rowKey\r\n const isActiveColumn = columnKey === focusCell.columnKey\r\n\r\n if (isActiveRow && isActiveColumn) {\r\n return ns.e('cross-active')\r\n }\r\n\r\n if (!props.crossHighlight) {\r\n return null\r\n }\r\n\r\n if (isActiveRow) {\r\n return ns.e('cross-row')\r\n }\r\n\r\n if (isActiveColumn) {\r\n return ns.e('cross-column')\r\n }\r\n\r\n return null\r\n }\r\n\r\n const resolveByScope = (scope: CellClassNameScope) =>\r\n mergeClass(\r\n typeof userCellClassName === 'function' ? userCellClassName(scope) : userCellClassName,\r\n props.rowDraggable &&\r\n scope.columnIndex === props.rowDragHandleColumnIndex &&\r\n ns.e('row-drag-cell'),\r\n resolveCrossClass(scope)\r\n )\r\n\r\n return (scope: CellClassNameScope) => resolveByScope(scope)\r\n}\r\n\r\nconst resolveHeaderCellClassName = () => {\r\n const userHeaderCellClassName = readAttr('headerCellClassName', 'header-cell-class-name')\r\n\r\n const resolveByScope = (scope: HeaderCellClassNameScope) => {\r\n const focusCell = activeCellClassSnapshot\r\n const columnClass =\r\n props.crossHighlight &&\r\n focusCell &&\r\n !isControlColumn(scope.column) &&\r\n resolveColumnKey(scope.column, scope.columnIndex) === focusCell.columnKey\r\n ? ns.e('cross-column')\r\n : null\r\n\r\n return mergeClass(\r\n typeof userHeaderCellClassName === 'function'\r\n ? userHeaderCellClassName(scope)\r\n : userHeaderCellClassName,\r\n columnClass\r\n )\r\n }\r\n\r\n return (scope: HeaderCellClassNameScope) => resolveByScope(scope)\r\n}\r\n\r\nconst syncVisibleColumnCount = (headerRow: HTMLElement) => {\r\n const cells = headerRow.querySelectorAll<HTMLElement>('th.el-table__cell')\r\n visibleColumnCount.value = cells.length\r\n}\r\n\r\nconst readStoreColumns = () =>\r\n (\r\n tableRef.value as unknown as {\r\n store?: {\r\n states?: {\r\n columns?: {\r\n value?: unknown[]\r\n }\r\n }\r\n }\r\n }\r\n )?.store?.states?.columns?.value\r\n\r\nconst readStoreData = () =>\r\n (\r\n tableRef.value as unknown as {\r\n store?: {\r\n states?: {\r\n data?: {\r\n value?: unknown[]\r\n }\r\n }\r\n }\r\n }\r\n )?.store?.states?.data?.value\r\n\r\nconst columnStoreSignature = computed(() => {\r\n const columns = readStoreColumns()\r\n if (!Array.isArray(columns)) {\r\n return ''\r\n }\r\n\r\n return columns\r\n .map((column, index) => {\r\n const current = column as ColumnState & { label?: unknown; property?: unknown }\r\n return [\r\n index,\r\n String(current.columnKey ?? ''),\r\n String(current.type ?? ''),\r\n String(current.label ?? ''),\r\n String(current.property ?? '')\r\n ].join(':')\r\n })\r\n .join('|')\r\n})\r\n\r\nconst readStoreColumnCount = (): number => {\r\n const columns = readStoreColumns()\r\n\r\n return Array.isArray(columns) ? columns.length : 0\r\n}\r\n\r\nconst resolveColumnCount = (headerRow: HTMLElement | null, minimumCount = 0): number => {\r\n const headerCount = headerRow?.querySelectorAll<HTMLElement>('th.el-table__cell').length ?? 0\r\n\r\n return Math.max(minimumCount, columnOrder.value.length, readStoreColumnCount(), headerCount)\r\n}\r\n\r\nconst destroyRowSortable = () => {\r\n rowSortable.value?.destroy()\r\n rowSortable.value = null\r\n}\r\n\r\nconst stopColumnResizeGestureReleaseTracking = () => {\r\n if (!columnResizePointerUpListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('pointerup', columnResizePointerUpListener.value)\r\n document.removeEventListener('mouseup', columnResizePointerUpListener.value)\r\n document.removeEventListener('touchend', columnResizePointerUpListener.value)\r\n document.removeEventListener('touchcancel', columnResizePointerUpListener.value)\r\n document.removeEventListener('dragend', columnResizePointerUpListener.value)\r\n columnResizePointerUpListener.value = null\r\n}\r\n\r\nconst clearColumnResizeGesture = () => {\r\n stopColumnResizeGestureReleaseTracking()\r\n columnSortable.value?.option?.('disabled', false)\r\n isColumnResizeGesture.value = false\r\n}\r\n\r\nconst unbindColumnResizeGuard = () => {\r\n if (columnResizeGuardHeaderRow.value && columnResizePointerDownListener.value) {\r\n columnResizeGuardHeaderRow.value.removeEventListener(\r\n 'pointerdown',\r\n columnResizePointerDownListener.value,\r\n true\r\n )\r\n columnResizeGuardHeaderRow.value.removeEventListener(\r\n 'mousedown',\r\n columnResizePointerDownListener.value,\r\n true\r\n )\r\n columnResizeGuardHeaderRow.value.removeEventListener(\r\n 'touchstart',\r\n columnResizePointerDownListener.value,\r\n true\r\n )\r\n }\r\n\r\n columnResizeGuardHeaderRow.value = null\r\n columnResizePointerDownListener.value = null\r\n}\r\n\r\nconst destroyColumnSortable = () => {\r\n clearColumnResizeGesture()\r\n unbindColumnResizeGuard()\r\n columnSortable.value?.destroy()\r\n columnSortable.value = null\r\n if (columnDragPointerMoveListener.value) {\r\n document.removeEventListener('dragover', columnDragPointerMoveListener.value)\r\n document.removeEventListener('pointermove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('mousemove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('touchmove', columnDragPointerMoveListener.value)\r\n columnDragPointerMoveListener.value = null\r\n }\r\n isColumnDragging.value = false\r\n columnDragCount.value = null\r\n draggingColumnOldDisplayIndex.value = null\r\n pendingColumnDropDisplayIndex.value = null\r\n columnDragIndicatorDisplayIndex.value = null\r\n columnDragIndicatorSide.value = null\r\n const tableElement = getTableElement()\r\n if (tableElement) {\r\n const leftClass = ns.e('column-drag-indicator-left')\r\n const rightClass = ns.e('column-drag-indicator-right')\r\n tableElement\r\n .querySelectorAll<HTMLElement>('th.el-table__cell, td.el-table__cell')\r\n .forEach((cell) => {\r\n cell.classList.remove(leftClass, rightClass)\r\n })\r\n }\r\n}\r\n\r\nconst unbindOutsidePointerDown = () => {\r\n if (!outsidePointerDownListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('pointerdown', outsidePointerDownListener.value, true)\r\n document.removeEventListener('mousedown', outsidePointerDownListener.value, true)\r\n document.removeEventListener('touchstart', outsidePointerDownListener.value, true)\r\n outsidePointerDownListener.value = null\r\n}\r\n\r\nconst bindOutsidePointerDown = () => {\r\n unbindOutsidePointerDown()\r\n\r\n const listener = (event: Event) => {\r\n if (!activeCell.value) {\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n const target = event.target\r\n const isOverlayTarget =\r\n target instanceof Element &&\r\n Boolean(target.closest('.el-select__popper, .el-picker__popper, .el-popper'))\r\n\r\n if (\r\n !tableElement ||\r\n !(target instanceof Node) ||\r\n tableElement.contains(target) ||\r\n (isEditing.value && isOverlayTarget)\r\n ) {\r\n return\r\n }\r\n\r\n void blurActiveEditor()\r\n isEditing.value = false\r\n commitActiveCell(null)\r\n }\r\n\r\n outsidePointerDownListener.value = listener\r\n document.addEventListener('pointerdown', listener, true)\r\n document.addEventListener('mousedown', listener, true)\r\n document.addEventListener('touchstart', listener, true)\r\n}\r\n\r\nconst isDirectionKey = (value: string): value is DirectionKey =>\r\n value === 'ArrowUp' || value === 'ArrowDown' || value === 'ArrowLeft' || value === 'ArrowRight'\r\n\r\nconst isInputActivationKey = (event: KeyboardEvent) =>\r\n event.key.length === 1 ||\r\n event.key === 'Backspace' ||\r\n event.key === 'Delete' ||\r\n event.key === 'Enter' ||\r\n event.key === 'F2'\r\n\r\nconst canHandleKeyEvent = (event: KeyboardEvent) => {\r\n if (!activeCell.value || event.isComposing || event.ctrlKey || event.metaKey || event.altKey) {\r\n return false\r\n }\r\n\r\n const tableElement = getTableElement()\r\n if (!tableElement) {\r\n return false\r\n }\r\n\r\n if (isEditing.value) {\r\n return true\r\n }\r\n\r\n const target = event.target\r\n if (target instanceof Node && tableElement.contains(target)) {\r\n return true\r\n }\r\n\r\n const activeElement = document.activeElement\r\n return (\r\n activeElement === null ||\r\n activeElement === document.body ||\r\n activeElement === document.documentElement ||\r\n (activeElement instanceof Node && tableElement.contains(activeElement))\r\n )\r\n}\r\n\r\nconst syncEditingStateFromTarget = (target: EventTarget | null) => {\r\n if (!activeCell.value) {\r\n isEditing.value = false\r\n return\r\n }\r\n\r\n const editor = findEditorForActiveCell()\r\n const root = editor?.getRootEl()\r\n if (root && target instanceof Node && root.contains(target)) {\r\n isEditing.value = true\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n if (tableElement && target instanceof Node && tableElement.contains(target)) {\r\n isEditing.value = false\r\n }\r\n}\r\n\r\nconst unbindKeyboardListener = () => {\r\n if (!keyboardListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('keydown', keyboardListener.value, true)\r\n keyboardListener.value = null\r\n}\r\n\r\nconst bindKeyboardListener = () => {\r\n unbindKeyboardListener()\r\n\r\n const listener = async (event: KeyboardEvent) => {\r\n if (!canHandleKeyEvent(event)) {\r\n return\r\n }\r\n\r\n if (isDirectionKey(event.key)) {\r\n if (isActiveEditorPanelOpen()) {\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n const nextActive = resolveNextActiveCell(event.key)\r\n if (!nextActive) {\r\n return\r\n }\r\n\r\n await blurActiveEditor()\r\n commitActiveCell(nextActive)\r\n await nextTick()\r\n scrollActiveCellIntoView()\r\n return\r\n }\r\n\r\n if (isActiveEditorPanelOpen()) {\r\n return\r\n }\r\n\r\n if (!isInputActivationKey(event) || isEditing.value) {\r\n return\r\n }\r\n\r\n const editor = findEditorForActiveCell()\r\n if (!editor) {\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n const handled = await editor.handoffFirstKey(event)\r\n if (handled) {\r\n isEditing.value = true\r\n }\r\n }\r\n\r\n keyboardListener.value = listener\r\n document.addEventListener('keydown', listener, true)\r\n}\r\n\r\nconst unbindEditorFocusTracking = () => {\r\n if (!editorFocusInListener.value) {\r\n return\r\n }\r\n\r\n document.removeEventListener('focusin', editorFocusInListener.value, true)\r\n editorFocusInListener.value = null\r\n}\r\n\r\nconst bindEditorFocusTracking = () => {\r\n unbindEditorFocusTracking()\r\n\r\n const listener = (event: FocusEvent) => {\r\n syncEditingStateFromTarget(event.target)\r\n }\r\n\r\n editorFocusInListener.value = listener\r\n document.addEventListener('focusin', listener, true)\r\n}\r\n\r\nconst readClientPointFromEvent = (event: Event): ClientPoint | null => {\r\n const pointEvent = event as { clientX?: unknown; clientY?: unknown }\r\n if (typeof pointEvent.clientX === 'number' && typeof pointEvent.clientY === 'number') {\r\n return { x: pointEvent.clientX, y: pointEvent.clientY }\r\n }\r\n\r\n if (typeof MouseEvent !== 'undefined' && event instanceof MouseEvent) {\r\n return { x: event.clientX, y: event.clientY }\r\n }\r\n\r\n if (typeof TouchEvent !== 'undefined' && event instanceof TouchEvent) {\r\n const touch = event.touches[0] ?? event.changedTouches[0]\r\n return touch\r\n ? {\r\n x: touch.clientX,\r\n y: touch.clientY\r\n }\r\n : null\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst resolveHeaderCellFromEvent = (event: Event): HTMLElement | null => {\r\n const target = event.target\r\n if (!(target instanceof Element)) {\r\n return null\r\n }\r\n\r\n const headerCell = target.closest('th.el-table__cell')\r\n return headerCell instanceof HTMLElement ? headerCell : null\r\n}\r\n\r\nconst isColumnResizeHotzone = (headerCell: HTMLElement, clientX: number): boolean => {\r\n const rect = headerCell.getBoundingClientRect()\r\n if (rect.width <= 0) {\r\n return false\r\n }\r\n\r\n const hotzoneWidth = Math.min(COLUMN_RESIZE_HOTZONE_PX, rect.width / 2)\r\n return clientX - rect.left <= hotzoneWidth || rect.right - clientX <= hotzoneWidth\r\n}\r\n\r\nconst startColumnResizeGestureReleaseTracking = () => {\r\n stopColumnResizeGestureReleaseTracking()\r\n\r\n const listener = () => {\r\n clearColumnResizeGesture()\r\n }\r\n\r\n columnResizePointerUpListener.value = listener\r\n document.addEventListener('pointerup', listener)\r\n document.addEventListener('mouseup', listener)\r\n document.addEventListener('touchend', listener)\r\n document.addEventListener('touchcancel', listener)\r\n document.addEventListener('dragend', listener)\r\n}\r\n\r\nconst bindColumnResizeGuard = (headerRow: HTMLElement) => {\r\n unbindColumnResizeGuard()\r\n\r\n const listener = (event: Event) => {\r\n const point = readClientPointFromEvent(event)\r\n const headerCell = resolveHeaderCellFromEvent(event)\r\n const hitResizeHotzone =\r\n point !== null && headerCell !== null && isColumnResizeHotzone(headerCell, point.x)\r\n\r\n if (!hitResizeHotzone) {\r\n if (!isColumnDragging.value && isColumnResizeGesture.value) {\r\n clearColumnResizeGesture()\r\n }\r\n return\r\n }\r\n\r\n isColumnResizeGesture.value = true\r\n updateColumnDragState(null)\r\n columnSortable.value?.option?.('disabled', true)\r\n startColumnResizeGestureReleaseTracking()\r\n }\r\n\r\n columnResizeGuardHeaderRow.value = headerRow\r\n columnResizePointerDownListener.value = listener\r\n headerRow.addEventListener('pointerdown', listener, true)\r\n headerRow.addEventListener('mousedown', listener, true)\r\n headerRow.addEventListener('touchstart', listener, true)\r\n}\r\n\r\nconst updateColumnDragState = (state: ColumnDropState | null) => {\r\n const leftClass = ns.e('column-drag-indicator-left')\r\n const rightClass = ns.e('column-drag-indicator-right')\r\n const tableElement = getTableElement()\r\n if (tableElement) {\r\n tableElement\r\n .querySelectorAll<HTMLElement>('th.el-table__cell, td.el-table__cell')\r\n .forEach((cell) => {\r\n cell.classList.remove(leftClass, rightClass)\r\n })\r\n }\r\n if (!state) {\r\n pendingColumnDropDisplayIndex.value = null\r\n columnDragIndicatorDisplayIndex.value = null\r\n columnDragIndicatorSide.value = null\r\n return\r\n }\r\n pendingColumnDropDisplayIndex.value = state.dropDisplayIndex\r\n columnDragIndicatorDisplayIndex.value = state.targetDisplayIndex\r\n columnDragIndicatorSide.value = state.side\r\n if (!tableElement) {\r\n return\r\n }\r\n const indicatorClass = state.side === 'left' ? leftClass : rightClass\r\n const headerCells = Array.from(\r\n tableElement.querySelectorAll<HTMLElement>('.el-table__header-wrapper th.el-table__cell')\r\n )\r\n const headerCell = headerCells[state.targetDisplayIndex]\r\n headerCell?.classList.add(indicatorClass)\r\n\r\n const bodyRows = Array.from(\r\n tableElement.querySelectorAll<HTMLElement>('.el-table__body-wrapper tbody tr')\r\n )\r\n for (const row of bodyRows) {\r\n const bodyCells = Array.from(row.querySelectorAll<HTMLElement>('td.el-table__cell'))\r\n bodyCells[state.targetDisplayIndex]?.classList.add(indicatorClass)\r\n }\r\n}\r\n\r\nconst resolveColumnDropStateByClientPoint = (\r\n point: ClientPoint,\r\n oldIndex: number | null\r\n): ColumnDropState | null => {\r\n const tableElement = getTableElement()\r\n const headerRow = tableElement?.querySelector('.el-table__header-wrapper thead tr')\r\n if (!(headerRow instanceof HTMLElement)) {\r\n return null\r\n }\r\n\r\n const headerRowRect = headerRow.getBoundingClientRect()\r\n if (\r\n point.x < headerRowRect.left ||\r\n point.x > headerRowRect.right ||\r\n point.y < headerRowRect.top ||\r\n point.y > headerRowRect.bottom\r\n ) {\r\n return null\r\n }\r\n\r\n const cells = Array.from(headerRow.querySelectorAll<HTMLElement>('th.el-table__cell'))\r\n if (cells.length === 0) {\r\n return null\r\n }\r\n\r\n let targetDisplayIndex = cells.length - 1\r\n for (let index = 0; index < cells.length; index += 1) {\r\n const rect = cells[index].getBoundingClientRect()\r\n if (point.x <= rect.right) {\r\n targetDisplayIndex = index\r\n break\r\n }\r\n }\r\n\r\n const targetCellRect = cells[targetDisplayIndex]?.getBoundingClientRect()\r\n if (!targetCellRect) {\r\n return null\r\n }\r\n\r\n const targetCenterX = targetCellRect.left + targetCellRect.width / 2\r\n const side: ColumnDragIndicatorSide = point.x < targetCenterX ? 'left' : 'right'\r\n\r\n let dropDisplayIndex = targetDisplayIndex + (side === 'right' ? 1 : 0)\r\n if (oldIndex !== null && dropDisplayIndex > oldIndex) {\r\n dropDisplayIndex -= 1\r\n }\r\n const maxIndex = cells.length - 1\r\n return {\r\n dropDisplayIndex: Math.min(Math.max(dropDisplayIndex, 0), maxIndex),\r\n targetDisplayIndex,\r\n side\r\n }\r\n}\r\n\r\nconst startColumnDragPointerTracking = (oldIndex: number | null) => {\r\n if (columnDragPointerMoveListener.value) {\r\n document.removeEventListener('dragover', columnDragPointerMoveListener.value)\r\n document.removeEventListener('pointermove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('mousemove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('touchmove', columnDragPointerMoveListener.value)\r\n }\r\n\r\n const listener = (event: Event) => {\r\n const point = readClientPointFromEvent(event)\r\n if (!point) {\r\n return\r\n }\r\n\r\n updateColumnDragState(resolveColumnDropStateByClientPoint(point, oldIndex))\r\n }\r\n\r\n columnDragPointerMoveListener.value = listener\r\n document.addEventListener('dragover', listener)\r\n document.addEventListener('pointermove', listener)\r\n document.addEventListener('mousemove', listener)\r\n document.addEventListener('touchmove', listener)\r\n}\r\n\r\nconst initRowSortable = () => {\r\n destroyRowSortable()\r\n\r\n if (!props.rowDraggable) {\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n const body = tableElement?.querySelector('.el-table__body-wrapper tbody')\r\n\r\n if (!(body instanceof HTMLElement)) {\r\n return\r\n }\r\n\r\n rowSortable.value = Sortable.create(body, {\r\n animation: 180,\r\n draggable: 'tr',\r\n handle: `.${ns.e('row-drag-cell')}`,\r\n onStart: (event: SortableEvent) => {\r\n const oldIndex = toNullableIndex(event.oldIndex)\r\n const payload: RowDragEvent = {\r\n oldIndex,\r\n newIndex: null,\r\n row: oldIndex === null ? null : (sourceData.value[oldIndex] ?? null)\r\n }\r\n\r\n emit('row-drag-start', payload)\r\n },\r\n onEnd: (event: SortableEvent) => {\r\n const oldIndex = toNullableIndex(event.oldIndex)\r\n const newIndex = toNullableIndex(event.newIndex)\r\n const row = oldIndex === null ? null : (sourceData.value[oldIndex] ?? null)\r\n const payload: RowDragEvent = {\r\n oldIndex,\r\n newIndex,\r\n row\r\n }\r\n\r\n emit('row-drag-end', payload)\r\n\r\n if (row && oldIndex !== null && newIndex !== null && oldIndex !== newIndex) {\r\n const orderPayload: RowOrderChangeEvent = {\r\n oldIndex,\r\n newIndex,\r\n row,\r\n data: reorderRows(sourceData.value, oldIndex, newIndex)\r\n }\r\n emit('row-order-change', orderPayload)\r\n }\r\n }\r\n })\r\n}\r\n\r\nconst initColumnSortable = () => {\r\n destroyColumnSortable()\r\n\r\n if (!props.columnDraggable) {\r\n return\r\n }\r\n\r\n const tableElement = getTableElement()\r\n const headerRow = tableElement?.querySelector('.el-table__header-wrapper thead tr')\r\n\r\n if (!(headerRow instanceof HTMLElement)) {\r\n return\r\n }\r\n\r\n syncVisibleColumnCount(headerRow)\r\n\r\n columnSortable.value = Sortable.create(headerRow, {\r\n animation: 180,\r\n draggable: 'th.el-table__cell',\r\n sort: false,\r\n onStart: (event: SortableEvent) => {\r\n if (isColumnResizeGesture.value) {\r\n return\r\n }\r\n\r\n const oldIndex = toNullableIndex(event.oldIndex)\r\n isColumnDragging.value = true\r\n draggingColumnOldDisplayIndex.value = oldIndex\r\n updateColumnDragState(null)\r\n startColumnDragPointerTracking(oldIndex)\r\n const count = resolveColumnCount(headerRow, (oldIndex ?? -1) + 1)\r\n columnDragCount.value = count\r\n const activeOrder = resolveColumnOrder(count)\r\n const payload: ColumnDragEvent = {\r\n oldIndex,\r\n newIndex: null,\r\n columnIndex: oldIndex === null ? null : (activeOrder[oldIndex] ?? oldIndex)\r\n }\r\n\r\n emit('column-drag-start', payload)\r\n },\r\n onEnd: (event: SortableEvent) => {\r\n if (isColumnResizeGesture.value) {\r\n clearColumnResizeGesture()\r\n return\r\n }\r\n\r\n if (columnDragPointerMoveListener.value) {\r\n document.removeEventListener('dragover', columnDragPointerMoveListener.value)\r\n document.removeEventListener('pointermove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('mousemove', columnDragPointerMoveListener.value)\r\n document.removeEventListener('touchmove', columnDragPointerMoveListener.value)\r\n columnDragPointerMoveListener.value = null\r\n }\r\n const oldIndex = toNullableIndex(event.oldIndex) ?? draggingColumnOldDisplayIndex.value\r\n const fallbackNewIndex = toNullableIndex(event.newIndex)\r\n const originalEvent = (event as { originalEvent?: Event }).originalEvent\r\n const point = originalEvent ? readClientPointFromEvent(originalEvent) : null\r\n const pointerState =\r\n point === null\r\n ? null\r\n : resolveColumnDropStateByClientPoint(point, draggingColumnOldDisplayIndex.value)\r\n const newIndex =\r\n pointerState?.dropDisplayIndex ?? pendingColumnDropDisplayIndex.value ?? fallbackNewIndex\r\n const maxDragIndex = Math.max(oldIndex ?? -1, newIndex ?? -1)\r\n const latestHeaderRow = getTableElement()?.querySelector('.el-table__header-wrapper thead tr')\r\n const count = Math.max(\r\n columnDragCount.value ?? 0,\r\n resolveColumnCount(\r\n latestHeaderRow instanceof HTMLElement ? latestHeaderRow : headerRow,\r\n maxDragIndex + 1\r\n )\r\n )\r\n const activeOrder = resolveColumnOrder(count)\r\n const columnIndex = oldIndex === null ? null : (activeOrder[oldIndex] ?? oldIndex)\r\n const payload: ColumnDragEvent = {\r\n oldIndex,\r\n newIndex,\r\n columnIndex\r\n }\r\n\r\n emit('column-drag-end', payload)\r\n\r\n if (oldIndex !== null && newIndex !== null && oldIndex !== newIndex) {\r\n const nextOrder = reorderColumnOrder(activeOrder, oldIndex, newIndex)\r\n const movedColumnSourceIndex = activeOrder[oldIndex] ?? oldIndex\r\n columnOrder.value = nextOrder\r\n\r\n const orderPayload: ColumnOrderChangeEvent = {\r\n oldIndex,\r\n newIndex,\r\n columnIndex: movedColumnSourceIndex,\r\n order: nextOrder\r\n }\r\n\r\n emit('column-order-change', orderPayload)\r\n\r\n void nextTick(() => {\r\n const tableElement = getTableElement()\r\n const latestHeaderRow = tableElement?.querySelector('.el-table__header-wrapper thead tr')\r\n if (latestHeaderRow instanceof HTMLElement) {\r\n syncVisibleColumnCount(latestHeaderRow)\r\n }\r\n })\r\n }\r\n\r\n isColumnDragging.value = false\r\n columnDragCount.value = null\r\n draggingColumnOldDisplayIndex.value = null\r\n updateColumnDragState(null)\r\n }\r\n })\r\n\r\n bindColumnResizeGuard(headerRow)\r\n}\r\n\r\nconst refreshSortables = async () => {\r\n await nextTick()\r\n initRowSortable()\r\n initColumnSortable()\r\n}\r\n\r\nconst mergedTableAttrs = computed(() => ({\r\n ...forwardedAttrs.value,\r\n class: [ns.b(), readAttr('class')],\r\n data: tableData.value,\r\n border: resolveBooleanAttr(true, 'border'),\r\n stripe: resolveBooleanAttr(true, 'stripe'),\r\n highlightCurrentRow: resolveBooleanAttr(true, 'highlightCurrentRow', 'highlight-current-row'),\r\n headerRowClassName: resolveHeaderRowClassName(),\r\n cellClassName: resolveCellClassName(),\r\n headerCellClassName: resolveHeaderCellClassName(),\r\n onCellClick: handleCellClick,\r\n onRowClick: handleRowClick,\r\n onSelect: handleSelect,\r\n onSelectAll: handleSelectAll\r\n}))\r\n\r\nwatch(columnStoreSignature, (next, prev) => {\r\n if (prev !== undefined && next !== prev) {\r\n editorRegistry.invalidate()\r\n void blurActiveEditor()\r\n isEditing.value = false\r\n commitActiveCell(null)\r\n scheduleActiveCellClassSync(true)\r\n }\r\n})\r\n\r\nwatch(\r\n () => [sourceData.value.length, props.rowKeyField],\r\n () => {\r\n editorRegistry.invalidate()\r\n if (!activeCell.value) {\r\n scheduleActiveCellClassSync(true)\r\n return\r\n }\r\n\r\n const hasActiveRow = sourceData.value.some(\r\n (row) => readRowKey(row) === activeCell.value?.rowKey\r\n )\r\n if (!hasActiveRow) {\r\n void blurActiveEditor()\r\n isEditing.value = false\r\n commitActiveCell(null)\r\n }\r\n\r\n scheduleActiveCellClassSync(true)\r\n }\r\n)\r\n\r\nwatch(\r\n sourceData,\r\n () => {\r\n editorRegistry.invalidate()\r\n scheduleActiveCellClassSync(true)\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nwatch(\r\n () => props.crossHighlight,\r\n () => {\r\n scheduleActiveCellClassSync()\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nwatch(activeCell, (nextActiveCell) => {\r\n if (!nextActiveCell) {\r\n isEditing.value = false\r\n }\r\n})\r\n\r\nonMounted(() => {\r\n bindEditorRegistryHost()\r\n bindOutsidePointerDown()\r\n bindKeyboardListener()\r\n bindEditorFocusTracking()\r\n scheduleActiveCellClassSync(true)\r\n void refreshSortables()\r\n})\r\n\r\nwatch(\r\n () => [\r\n props.rowDraggable,\r\n props.columnDraggable,\r\n props.rowDragHandleColumnIndex,\r\n sourceData.value.length\r\n ],\r\n () => {\r\n void refreshSortables()\r\n },\r\n { flush: 'post' }\r\n)\r\n\r\nonBeforeUnmount(() => {\r\n clearActiveCellClasses()\r\n unbindEditorRegistryHost()\r\n unbindOutsidePointerDown()\r\n unbindKeyboardListener()\r\n unbindEditorFocusTracking()\r\n destroyRowSortable()\r\n destroyColumnSortable()\r\n})\r\n\r\ndefineExpose({} as FlTableExpose)\r\n</script>\r\n"],"x_google_ignoreList":[0],"mappings":"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"}
|