This commit is contained in:
117
node_modules/react-modal/lib/helpers/focusManager.js
generated
vendored
Normal file
117
node_modules/react-modal/lib/helpers/focusManager.js
generated
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
"use strict";
|
||||
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.resetState = resetState;
|
||||
exports.log = log;
|
||||
exports.handleBlur = handleBlur;
|
||||
exports.handleFocus = handleFocus;
|
||||
exports.markForFocusLater = markForFocusLater;
|
||||
exports.returnFocus = returnFocus;
|
||||
exports.popWithoutFocus = popWithoutFocus;
|
||||
exports.setupScopedFocus = setupScopedFocus;
|
||||
exports.teardownScopedFocus = teardownScopedFocus;
|
||||
|
||||
var _tabbable = require("../helpers/tabbable");
|
||||
|
||||
var _tabbable2 = _interopRequireDefault(_tabbable);
|
||||
|
||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||||
|
||||
var focusLaterElements = [];
|
||||
var modalElement = null;
|
||||
var needToFocus = false;
|
||||
|
||||
/* eslint-disable no-console */
|
||||
/* istanbul ignore next */
|
||||
function resetState() {
|
||||
focusLaterElements = [];
|
||||
}
|
||||
|
||||
/* istanbul ignore next */
|
||||
function log() {
|
||||
if (process.env.NODE_ENV !== "production") {
|
||||
console.log("focusManager ----------");
|
||||
focusLaterElements.forEach(function (f) {
|
||||
var check = f || {};
|
||||
console.log(check.nodeName, check.className, check.id);
|
||||
});
|
||||
console.log("end focusManager ----------");
|
||||
}
|
||||
}
|
||||
/* eslint-enable no-console */
|
||||
|
||||
function handleBlur() {
|
||||
needToFocus = true;
|
||||
}
|
||||
|
||||
function handleFocus() {
|
||||
if (needToFocus) {
|
||||
needToFocus = false;
|
||||
if (!modalElement) {
|
||||
return;
|
||||
}
|
||||
// need to see how jQuery shims document.on('focusin') so we don't need the
|
||||
// setTimeout, firefox doesn't support focusin, if it did, we could focus
|
||||
// the element outside of a setTimeout. Side-effect of this implementation
|
||||
// is that the document.body gets focus, and then we focus our element right
|
||||
// after, seems fine.
|
||||
setTimeout(function () {
|
||||
if (modalElement.contains(document.activeElement)) {
|
||||
return;
|
||||
}
|
||||
var el = (0, _tabbable2.default)(modalElement)[0] || modalElement;
|
||||
el.focus();
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
|
||||
function markForFocusLater() {
|
||||
focusLaterElements.push(document.activeElement);
|
||||
}
|
||||
|
||||
/* eslint-disable no-console */
|
||||
function returnFocus() {
|
||||
var preventScroll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
||||
|
||||
var toFocus = null;
|
||||
try {
|
||||
if (focusLaterElements.length !== 0) {
|
||||
toFocus = focusLaterElements.pop();
|
||||
toFocus.focus({ preventScroll: preventScroll });
|
||||
}
|
||||
return;
|
||||
} catch (e) {
|
||||
console.warn(["You tried to return focus to", toFocus, "but it is not in the DOM anymore"].join(" "));
|
||||
}
|
||||
}
|
||||
/* eslint-enable no-console */
|
||||
|
||||
function popWithoutFocus() {
|
||||
focusLaterElements.length > 0 && focusLaterElements.pop();
|
||||
}
|
||||
|
||||
function setupScopedFocus(element) {
|
||||
modalElement = element;
|
||||
|
||||
if (window.addEventListener) {
|
||||
window.addEventListener("blur", handleBlur, false);
|
||||
document.addEventListener("focus", handleFocus, true);
|
||||
} else {
|
||||
window.attachEvent("onBlur", handleBlur);
|
||||
document.attachEvent("onFocus", handleFocus);
|
||||
}
|
||||
}
|
||||
|
||||
function teardownScopedFocus() {
|
||||
modalElement = null;
|
||||
|
||||
if (window.addEventListener) {
|
||||
window.removeEventListener("blur", handleBlur);
|
||||
document.removeEventListener("focus", handleFocus);
|
||||
} else {
|
||||
window.detachEvent("onBlur", handleBlur);
|
||||
document.detachEvent("onFocus", handleFocus);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user