UNPKG

jobiqo-cl

Version:

[![CircleCI](https://circleci.com/gh/jobiqo/jobiqo-cl.svg?style=svg&circle-token=5a24efa5b8bbc4879276123e77d0d3f35ca7144c)](https://circleci.com/gh/jobiqo/jobiqo-cl)

180 lines (158 loc) 5.51 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var array = require('./utils/array.js'); var DOMutils = require('./utils/DOMutils.js'); var firstFocus = require('./utils/firstFocus.js'); var allAffected = require('./utils/all-affected.js'); var findAutoFocused = function findAutoFocused(autoFocusables) { return function (node) { return !!node.autofocus || node.dataset && !!node.dataset.autofocus || autoFocusables.indexOf(node) >= 0; }; }; var isGuard = function isGuard(node) { return node.dataset && node.dataset.focusGuard; }; var notAGuard = function notAGuard(node) { return !isGuard(node); }; var newFocus = function newFocus(innerNodes, outerNodes, activeElement, lastNode, autoFocused) { var cnt = innerNodes.length; var firstFocus$1 = innerNodes[0]; var lastFocus = innerNodes[cnt - 1]; // focus is inside if (innerNodes.indexOf(activeElement) >= 0) { return undefined; } var activeIndex = outerNodes.indexOf(activeElement); var lastIndex = outerNodes.indexOf(lastNode || activeIndex); var lastNodeInside = innerNodes.indexOf(lastNode); var indexDiff = activeIndex - lastIndex; var firstNodeIndex = outerNodes.indexOf(firstFocus$1); var lastNodeIndex = outerNodes.indexOf(lastFocus); // new focus if (activeIndex === -1 || lastNodeInside === -1) { return innerNodes.indexOf(autoFocused.length ? firstFocus.default(autoFocused) : firstFocus.default(innerNodes)); } // old focus if (!indexDiff && lastNodeInside >= 0) { return lastNodeInside; } // first element if (activeIndex <= firstNodeIndex && isGuard(activeElement) && Math.abs(indexDiff) > 1) { return 0; } // jump out if (indexDiff && Math.abs(indexDiff) > 1) { return lastNodeInside; } // focus above lock if (activeIndex <= firstNodeIndex) { return cnt - 1; } // focus below lock if (activeIndex > lastNodeIndex) { return 0; } // index is inside tab order, but outside Lock if (indexDiff) { if (Math.abs(indexDiff) > 1) { return lastNodeInside; } return (cnt + lastNodeInside + indexDiff) % cnt; } // do nothing return undefined; }; var getTopCommonParent = function getTopCommonParent(baseActiveElement, leftEntry, rightEntries) { var activeElements = array.asArray(baseActiveElement); var leftEntries = array.asArray(leftEntry); var activeElement = activeElements[0]; var topCommon = null; leftEntries.filter(Boolean).forEach(function (entry) { topCommon = DOMutils.getCommonParent(topCommon || entry, entry) || topCommon; rightEntries.filter(Boolean).forEach(function (subEntry) { var common = DOMutils.getCommonParent(activeElement, subEntry); if (common) { if (!topCommon || common.contains(topCommon)) { topCommon = common; } else { topCommon = DOMutils.getCommonParent(common, topCommon); } } }); }); return topCommon; }; var allParentAutofocusables = function allParentAutofocusables(entries) { return entries.reduce(function (acc, node) { return acc.concat(DOMutils.parentAutofocusables(node)); }, []); }; var reorderNodes = function reorderNodes(srcNodes, dstNodes) { var remap = new Map(); // no Set(dstNodes) for IE11 :( dstNodes.forEach(function (entity) { return remap.set(entity.node, entity); }); // remap to dstNodes return srcNodes.map(function (node) { return remap.get(node); }).filter(Boolean); }; var getFocusabledIn = function getFocusabledIn(topNode) { var entries = allAffected.default(topNode).filter(notAGuard); var commonParent = getTopCommonParent(topNode, topNode, entries); var outerNodes = DOMutils.getTabbableNodes([commonParent], true); var innerElements = DOMutils.getTabbableNodes(entries).filter(function (_ref) { var node = _ref.node; return notAGuard(node); }).map(function (_ref2) { var node = _ref2.node; return node; }); return outerNodes.map(function (_ref3) { var node = _ref3.node, index = _ref3.index; return { node: node, index: index, lockItem: innerElements.indexOf(node) >= 0, guard: isGuard(node) }; }); }; var getFocusMerge = function getFocusMerge(topNode, lastNode) { var activeElement = document && document.activeElement; var entries = allAffected.default(topNode).filter(notAGuard); var commonParent = getTopCommonParent(activeElement || topNode, topNode, entries); var innerElements = DOMutils.getTabbableNodes(entries).filter(function (_ref4) { var node = _ref4.node; return notAGuard(node); }); if (!innerElements[0]) { innerElements = DOMutils.getAllTabbableNodes(entries).filter(function (_ref5) { var node = _ref5.node; return notAGuard(node); }); if (!innerElements[0]) { return undefined; } } var outerNodes = DOMutils.getTabbableNodes([commonParent]).map(function (_ref6) { var node = _ref6.node; return node; }); var orderedInnerElements = reorderNodes(outerNodes, innerElements); var innerNodes = orderedInnerElements.map(function (_ref7) { var node = _ref7.node; return node; }); var newId = newFocus(innerNodes, outerNodes, activeElement, lastNode, innerNodes.filter(findAutoFocused(allParentAutofocusables(entries)))); if (newId === undefined) { return newId; } return orderedInnerElements[newId]; }; exports.default = getFocusMerge; exports.getFocusabledIn = getFocusabledIn; exports.newFocus = newFocus;