151 lines
4.6 KiB
JavaScript
151 lines
4.6 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
|
|
var _warning = require('warning');
|
|
|
|
var _warning2 = _interopRequireDefault(_warning);
|
|
|
|
var _isWindow = require('dom-helpers/query/isWindow');
|
|
|
|
var _isWindow2 = _interopRequireDefault(_isWindow);
|
|
|
|
var _ownerDocument = require('dom-helpers/ownerDocument');
|
|
|
|
var _ownerDocument2 = _interopRequireDefault(_ownerDocument);
|
|
|
|
var _inDOM = require('dom-helpers/util/inDOM');
|
|
|
|
var _inDOM2 = _interopRequireDefault(_inDOM);
|
|
|
|
var _scrollbarSize = require('dom-helpers/util/scrollbarSize');
|
|
|
|
var _scrollbarSize2 = _interopRequireDefault(_scrollbarSize);
|
|
|
|
var _manageAriaHidden = require('../utils/manageAriaHidden');
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
// Taken from https://github.com/react-bootstrap/react-overlays/blob/master/src/ModalManager.js
|
|
|
|
function getPaddingRight(node) {
|
|
return parseInt(node.style.paddingRight || 0, 10);
|
|
}
|
|
|
|
// Do we have a scroll bar?
|
|
function bodyIsOverflowing(node) {
|
|
var doc = (0, _ownerDocument2.default)(node);
|
|
var win = (0, _isWindow2.default)(doc);
|
|
|
|
// Takes in account potential non zero margin on the body.
|
|
var style = window.getComputedStyle(doc.body);
|
|
var marginLeft = parseInt(style.getPropertyValue('margin-left'), 10);
|
|
var marginRight = parseInt(style.getPropertyValue('margin-right'), 10);
|
|
|
|
return marginLeft + doc.body.clientWidth + marginRight < win.innerWidth;
|
|
}
|
|
|
|
// The container shouldn't be used on the server.
|
|
var defaultContainer = _inDOM2.default ? window.document.body : {};
|
|
|
|
/**
|
|
* State management helper for modals/layers.
|
|
* Simplified, but inspired by react-overlay's ModalManager class
|
|
*
|
|
* @internal Used by the Modal to ensure proper focus management.
|
|
*/
|
|
function createModalManager() {
|
|
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
_ref$container = _ref.container,
|
|
container = _ref$container === undefined ? defaultContainer : _ref$container,
|
|
_ref$hideSiblingNodes = _ref.hideSiblingNodes,
|
|
hideSiblingNodes = _ref$hideSiblingNodes === undefined ? true : _ref$hideSiblingNodes;
|
|
|
|
process.env.NODE_ENV !== "production" ? (0, _warning2.default)(container !== null, '\nMaterial-UI: you are most likely evaluating the code before the\nbrowser has a chance to reach the <body>.\nPlease move the import at the end of the <body>.\n ') : void 0;
|
|
|
|
var modals = [];
|
|
|
|
var prevOverflow = void 0;
|
|
var prevPaddings = [];
|
|
|
|
function add(modal) {
|
|
var modalIdx = modals.indexOf(modal);
|
|
|
|
if (modalIdx !== -1) {
|
|
return modalIdx;
|
|
}
|
|
|
|
modalIdx = modals.length;
|
|
modals.push(modal);
|
|
|
|
if (hideSiblingNodes) {
|
|
(0, _manageAriaHidden.hideSiblings)(container, modal.mountNode);
|
|
}
|
|
|
|
if (modals.length === 1) {
|
|
// Save our current overflow so we can revert
|
|
// back to it when all modals are closed!
|
|
prevOverflow = container.style.overflow;
|
|
|
|
if (bodyIsOverflowing(container)) {
|
|
prevPaddings = [getPaddingRight(container)];
|
|
var scrollbarSize = (0, _scrollbarSize2.default)();
|
|
container.style.paddingRight = prevPaddings[0] + scrollbarSize + 'px';
|
|
|
|
var fixedNodes = document.querySelectorAll('.mui-fixed');
|
|
for (var i = 0; i < fixedNodes.length; i += 1) {
|
|
var paddingRight = getPaddingRight(fixedNodes[i]);
|
|
prevPaddings.push(paddingRight);
|
|
fixedNodes[i].style.paddingRight = paddingRight + scrollbarSize + 'px';
|
|
}
|
|
}
|
|
|
|
container.style.overflow = 'hidden';
|
|
}
|
|
|
|
return modalIdx;
|
|
}
|
|
|
|
function remove(modal) {
|
|
var modalIdx = modals.indexOf(modal);
|
|
|
|
if (modalIdx === -1) {
|
|
return modalIdx;
|
|
}
|
|
|
|
modals.splice(modalIdx, 1);
|
|
|
|
if (modals.length === 0) {
|
|
container.style.overflow = prevOverflow;
|
|
container.style.paddingRight = prevPaddings[0];
|
|
|
|
var fixedNodes = document.querySelectorAll('.mui-fixed');
|
|
for (var i = 0; i < fixedNodes.length; i += 1) {
|
|
fixedNodes[i].style.paddingRight = prevPaddings[i + 1] + 'px';
|
|
}
|
|
|
|
prevOverflow = undefined;
|
|
prevPaddings = [];
|
|
if (hideSiblingNodes) {
|
|
(0, _manageAriaHidden.showSiblings)(container, modal.mountNode);
|
|
}
|
|
} else if (hideSiblingNodes) {
|
|
// otherwise make sure the next top modal is visible to a SR
|
|
(0, _manageAriaHidden.ariaHidden)(false, modals[modals.length - 1].mountNode);
|
|
}
|
|
|
|
return modalIdx;
|
|
}
|
|
|
|
function isTopModal(modal) {
|
|
return !!modals.length && modals[modals.length - 1] === modal;
|
|
}
|
|
|
|
var modalManager = { add: add, remove: remove, isTopModal: isTopModal };
|
|
|
|
return modalManager;
|
|
}
|
|
|
|
exports.default = createModalManager; |