You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

0 lines
11 KiB

1 month ago
  1. {"ast":null,"code":"import { shallowRef, onMounted, onUpdated, watch } from 'vue';\nimport { useEventListener } from '@vueuse/core';\nimport { useNamespace } from '../../../../hooks/use-namespace/index.mjs';\nimport { EVENT_CODE } from '../../../../constants/aria.mjs';\nfunction useKeydown({\n el$\n}, store) {\n const ns = useNamespace(\"tree\");\n const treeItems = shallowRef([]);\n const checkboxItems = shallowRef([]);\n onMounted(() => {\n initTabIndex();\n });\n onUpdated(() => {\n treeItems.value = Array.from(el$.value.querySelectorAll(\"[role=treeitem]\"));\n checkboxItems.value = Array.from(el$.value.querySelectorAll(\"input[type=checkbox]\"));\n });\n watch(checkboxItems, val => {\n val.forEach(checkbox => {\n checkbox.setAttribute(\"tabindex\", \"-1\");\n });\n });\n const handleKeydown = ev => {\n const currentItem = ev.target;\n if (!currentItem.className.includes(ns.b(\"node\"))) return;\n const code = ev.code;\n treeItems.value = Array.from(el$.value.querySelectorAll(`.${ns.is(\"focusable\")}[role=treeitem]`));\n const currentIndex = treeItems.value.indexOf(currentItem);\n let nextIndex;\n if ([EVENT_CODE.up, EVENT_CODE.down].includes(code)) {\n ev.preventDefault();\n if (code === EVENT_CODE.up) {\n nextIndex = currentIndex === -1 ? 0 : currentIndex !== 0 ? currentIndex - 1 : treeItems.value.length - 1;\n const startIndex = nextIndex;\n while (true) {\n if (store.value.getNode(treeItems.value[nextIndex].dataset.key).canFocus) break;\n nextIndex--;\n if (nextIndex === startIndex) {\n nextIndex = -1;\n break;\n }\n if (nextIndex < 0) {\n nextIndex = treeItems.value.length - 1;\n }\n }\n } else {\n nextIndex = currentIndex === -1 ? 0 : currentIndex < treeItems.value.length - 1 ? currentIndex + 1 : 0;\n const startIndex = nextIndex;\n while (true) {\n if (store.value.getNode(treeItems.value[nextIndex].dataset.key).canFocus) break;\n nextIndex++;\n if (nextIndex === startIndex) {\n nextIndex = -1;\n break;\n }\n if (nextIndex >= treeItems.value.length) {\n nextIndex = 0;\n }\n }\n }\n nextIndex !== -1 && treeItems.value[nextIndex].focus();\n }\n if ([EVENT_CODE.left, EVENT_CODE.right].includes(code)) {\n ev.preventDefault();\n currentItem.click();\n }\n const hasInput = currentItem.querySelector('[type=\"checkbox\"]');\n if ([EVENT_CODE.enter, EVENT_CODE.numpadEnter, EVENT_CODE.space].includes(code) && hasInput) {\n ev.preventDefault();\n hasInput.click();\n }\n };\n useEventListener(el$, \"keydown\", handleKeydown);\n const initTabIndex = () => {\n var _a;\n treeItems.value = Array.from(el$.value.querySelectorAll(`.${ns.is(\"focusable\")}[role=treeitem]`));\n checkboxItems.value = Array.from(el$.value.querySelectorAll(\"input[type=checkbox]\"));\n const checkedItem = el$.value.querySelectorAll(`.${ns.is(\"checked\")}[role=treeitem]`);\n if (checkedItem.length) {\n checkedItem[0].setAttribute(\"tabindex\", \"0\");\n return;\n }\n (_a = treeItems.value[0]) == null ? void 0 : _a.setAttribute(\"tabindex\", \"0\");\n };\n}\nexport { useKeydown };","map":{"version":3,"names":["useKeydown","el$","store","ns","useNamespace","treeItems","shallowRef","checkboxItems","onMounted","initTabIndex","onUpdated","value","Array","from","querySelectorAll","watch","val","forEach","checkbox","setAttribute","handleKeydown","ev","currentItem","target","className","includes","b","code","is","currentIndex","indexOf","nextIndex","EVENT_CODE","up","down","preventDefault","length","startIndex","getNode","dataset","key","canFocus","focus","left","right","click","hasInput","querySelector","enter","numpadEnter","space","useEventListener","_a","checkedItem"],"sources":["../../../../../../../packages/components/tree/src/model/useKeydown.ts"],"sourcesContent":["// @ts-noch