jobiqo-cl
Version:
[](https://circleci.com/gh/jobiqo/jobiqo-cl)
180 lines (158 loc) • 5.51 kB
JavaScript
;
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;