Files

52 lines
2.0 KiB
JavaScript

import { correctNodes } from './utils/correctFocus';
import { pickFocusable } from './utils/firstFocus';
import { isGuard } from './utils/is';
export var NEW_FOCUS = 'NEW_FOCUS';
export var newFocus = function (innerNodes, outerNodes, activeElement, lastNode) {
var cnt = innerNodes.length;
var firstFocus = innerNodes[0];
var lastFocus = innerNodes[cnt - 1];
var isOnGuard = isGuard(activeElement);
if (innerNodes.indexOf(activeElement) >= 0) {
return undefined;
}
var activeIndex = outerNodes.indexOf(activeElement);
var lastIndex = lastNode ? outerNodes.indexOf(lastNode) : activeIndex;
var lastNodeInside = lastNode ? innerNodes.indexOf(lastNode) : -1;
var indexDiff = activeIndex - lastIndex;
var firstNodeIndex = outerNodes.indexOf(firstFocus);
var lastNodeIndex = outerNodes.indexOf(lastFocus);
var correctedNodes = correctNodes(outerNodes);
var correctedIndexDiff = correctedNodes.indexOf(activeElement) - (lastNode ? correctedNodes.indexOf(lastNode) : activeIndex);
var returnFirstNode = pickFocusable(innerNodes, 0);
var returnLastNode = pickFocusable(innerNodes, cnt - 1);
if (activeIndex === -1 || lastNodeInside === -1) {
return NEW_FOCUS;
}
if (!indexDiff && lastNodeInside >= 0) {
return lastNodeInside;
}
if (activeIndex <= firstNodeIndex && isOnGuard && Math.abs(indexDiff) > 1) {
return returnLastNode;
}
if (activeIndex >= lastNodeIndex && isOnGuard && Math.abs(indexDiff) > 1) {
return returnFirstNode;
}
if (indexDiff && Math.abs(correctedIndexDiff) > 1) {
return lastNodeInside;
}
if (activeIndex <= firstNodeIndex) {
return returnLastNode;
}
if (activeIndex > lastNodeIndex) {
return returnFirstNode;
}
if (indexDiff) {
if (Math.abs(indexDiff) > 1) {
return lastNodeInside;
}
return (cnt + lastNodeInside + indexDiff) % cnt;
}
return undefined;
};