UNPKG

framework7

Version:

Full featured mobile HTML framework for building iOS & Android apps

660 lines (521 loc) 19.7 kB
"use strict"; exports.__esModule = true; exports.default = void 0; var _ssrWindow = require("ssr-window"); var _dom = _interopRequireDefault(require("../../shared/dom7")); var _utils = require("../../shared/utils"); var _class = _interopRequireDefault(require("../../shared/class")); var _swipePanel = _interopRequireDefault(require("./swipe-panel")); var _resizablePanel = _interopRequireDefault(require("./resizable-panel")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var Panel = /*#__PURE__*/function (_Framework7Class) { _inheritsLoose(Panel, _Framework7Class); function Panel(app, params) { var _this; if (params === void 0) { params = {}; } var extendedParams = (0, _utils.extend)({ on: {} }, app.params.panel, params); _this = _Framework7Class.call(this, extendedParams, [app]) || this; var panel = _assertThisInitialized(_this); panel.params = extendedParams; panel.$containerEl = panel.params.containerEl ? (0, _dom.default)(panel.params.containerEl).eq(0) : app.$el; panel.containerEl = panel.$containerEl[0]; if (!panel.containerEl) { panel.$containerEl = app.$el; panel.containerEl = app.$el[0]; } var $el; if (panel.params.el) { $el = (0, _dom.default)(panel.params.el).eq(0); } else if (panel.params.content) { $el = (0, _dom.default)(panel.params.content).filter(function (node) { return node.nodeType === 1; }).eq(0); } if ($el.length === 0) return panel || _assertThisInitialized(_this); if ($el[0].f7Panel) return $el[0].f7Panel || _assertThisInitialized(_this); $el[0].f7Panel = panel; var _panel$params = panel.params, side = _panel$params.side, effect = _panel$params.effect, resizable = _panel$params.resizable; if (typeof side === 'undefined') side = $el.hasClass('panel-left') ? 'left' : 'right'; if (typeof effect === 'undefined') // eslint-disable-next-line effect = $el.hasClass('panel-cover') ? 'cover' : $el.hasClass('panel-push') ? 'push' : 'reveal'; if (typeof resizable === 'undefined') resizable = $el.hasClass('panel-resizable'); var $backdropEl; if (panel.params.backdrop && panel.params.backdropEl) { $backdropEl = (0, _dom.default)(panel.params.backdropEl); } else if (panel.params.backdrop) { $backdropEl = panel.$containerEl.children('.panel-backdrop'); if ($backdropEl.length === 0) { $backdropEl = (0, _dom.default)('<div class="panel-backdrop"></div>'); panel.$containerEl.prepend($backdropEl); } } (0, _utils.extend)(panel, { app: app, side: side, effect: effect, resizable: resizable, $el: $el, el: $el[0], opened: false, $backdropEl: $backdropEl, backdropEl: $backdropEl && $backdropEl[0] }); // Install Modules panel.useModules(); // Init panel.init(); return panel || _assertThisInitialized(_this); } var _proto = Panel.prototype; _proto.getViewEl = function getViewEl() { var panel = this; var viewEl; if (panel.$containerEl.children('.views').length > 0) { viewEl = panel.$containerEl.children('.views')[0]; } else { viewEl = panel.$containerEl.children('.view')[0]; } return viewEl; }; _proto.setStateClasses = function setStateClasses(state) { var panel = this; var side = panel.side, el = panel.el; var viewEl = panel.getViewEl(); var panelInView = viewEl && viewEl.contains(el); var $targetEl = !viewEl || panelInView ? panel.$containerEl : (0, _dom.default)('html'); if (state === 'open') { $targetEl.addClass("with-panel with-panel-" + panel.side + "-" + panel.effect); } if (state === 'before-closing') { $targetEl.addClass('with-panel-closing'); } if (state === 'closing') { $targetEl.addClass('with-panel-closing'); $targetEl.removeClass("with-panel with-panel-" + panel.side + "-" + panel.effect); } if (state === 'after-closing') { $targetEl.removeClass('with-panel-closing'); } if (state === 'closed') { $targetEl.removeClass("with-panel-" + side + "-reveal with-panel-" + side + "-cover with-panel-" + side + "-push with-panel"); } }; _proto.enableVisibleBreakpoint = function enableVisibleBreakpoint() { var panel = this; panel.visibleBreakpointDisabled = false; panel.setVisibleBreakpoint(); return panel; }; _proto.disableVisibleBreakpoint = function disableVisibleBreakpoint() { var panel = this; panel.visibleBreakpointDisabled = true; panel.setVisibleBreakpoint(); return panel; }; _proto.toggleVisibleBreakpoint = function toggleVisibleBreakpoint() { var panel = this; panel.visibleBreakpointDisabled = !panel.visibleBreakpointDisabled; panel.setVisibleBreakpoint(); return panel; }; _proto.setVisibleBreakpoint = function setVisibleBreakpoint(emitEvents) { if (emitEvents === void 0) { emitEvents = true; } var panel = this; var app = panel.app; if (!panel.visibleBreakpointResizeHandler) { panel.visibleBreakpointResizeHandler = function visibleBreakpointResizeHandler() { panel.setVisibleBreakpoint(); }; app.on('resize', panel.visibleBreakpointResizeHandler); } var side = panel.side, $el = panel.$el, $containerEl = panel.$containerEl, params = panel.params, visibleBreakpointDisabled = panel.visibleBreakpointDisabled; var breakpoint = params.visibleBreakpoint; var $viewEl = (0, _dom.default)(panel.getViewEl()); var wasVisible = $el.hasClass('panel-in-breakpoint'); if ($containerEl && $containerEl.hasClass('page')) { $viewEl.add($containerEl.children('.page-content, .tabs, .fab')); } if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null && !visibleBreakpointDisabled) { if (!wasVisible) { var _$viewEl$css; panel.setStateClasses('closed'); $el.addClass('panel-in-breakpoint').removeClass('panel-in panel-in-collapsed'); panel.onOpen(false); panel.onOpened(); $viewEl.css((_$viewEl$css = {}, _$viewEl$css["margin-" + side] = $el.width() + "px", _$viewEl$css)); app.allowPanelOpen = true; if (emitEvents) { panel.emit('local::breakpoint panelBreakpoint', panel); panel.$el.trigger('panel:breakpoint'); } } else { var _$viewEl$css2; $viewEl.css((_$viewEl$css2 = {}, _$viewEl$css2["margin-" + side] = $el.width() + "px", _$viewEl$css2)); } } else if (wasVisible) { var _$viewEl$css3; $el.removeClass('panel-in-breakpoint panel-in'); panel.onClose(); panel.onClosed(); $viewEl.css((_$viewEl$css3 = {}, _$viewEl$css3["margin-" + side] = '', _$viewEl$css3)); if (emitEvents) { panel.emit('local::breakpoint panelBreakpoint', panel); panel.$el.trigger('panel:breakpoint'); } } }; _proto.enableCollapsedBreakpoint = function enableCollapsedBreakpoint() { var panel = this; panel.collapsedBreakpointDisabled = false; panel.setCollapsedBreakpoint(); return panel; }; _proto.disableCollapsedBreakpoint = function disableCollapsedBreakpoint() { var panel = this; panel.collapsedBreakpointDisabled = true; panel.setCollapsedBreakpoint(); return panel; }; _proto.toggleCollapsedBreakpoint = function toggleCollapsedBreakpoint() { var panel = this; panel.collapsedBreakpointDisabled = !panel.collapsedBreakpointDisabled; panel.setCollapsedBreakpoint(); return panel; }; _proto.setCollapsedBreakpoint = function setCollapsedBreakpoint(emitEvents) { if (emitEvents === void 0) { emitEvents = true; } var panel = this; var app = panel.app; if (!panel.collapsedBreakpointResizeHandler) { panel.collapsedBreakpointResizeHandler = function collapsedBreakpointResizeHandler() { panel.setCollapsedBreakpoint(); }; app.on('resize', panel.collapsedBreakpointResizeHandler); } var $el = panel.$el, params = panel.params, collapsedBreakpointDisabled = panel.collapsedBreakpointDisabled; if ($el.hasClass('panel-in-breakpoint')) return; var breakpoint = params.collapsedBreakpoint; var wasVisible = $el.hasClass('panel-in-collapsed'); if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null && !collapsedBreakpointDisabled) { if (!wasVisible) { panel.setStateClasses('closed'); $el.addClass('panel-in-collapsed').removeClass('panel-in'); panel.collapsed = true; app.allowPanelOpen = true; if (emitEvents) { panel.emit('local::collapsedBreakpoint panelCollapsedBreakpoint', panel); panel.$el.trigger('panel:collapsedbreakpoint'); } } } else if (wasVisible) { $el.removeClass('panel-in-collapsed panel-in'); panel.collapsed = false; if (emitEvents) { panel.emit('local::collapsedBreakpoint panelCollapsedBreakpoint', panel); panel.$el.trigger('panel:collapsedbreakpoint'); } } }; _proto.enableResizable = function enableResizable() { var panel = this; if (panel.resizableInitialized) { panel.resizable = true; panel.$el.addClass('panel-resizable'); } else { (0, _resizablePanel.default)(panel); } return panel; }; _proto.disableResizable = function disableResizable() { var panel = this; panel.resizable = false; panel.$el.removeClass('panel-resizable'); return panel; }; _proto.enableSwipe = function enableSwipe() { var panel = this; if (panel.swipeInitialized) { panel.swipeable = true; } else { (0, _swipePanel.default)(panel); } return panel; }; _proto.disableSwipe = function disableSwipe() { var panel = this; panel.swipeable = false; return panel; }; _proto.onOpen = function onOpen(modifyHtmlClasses) { if (modifyHtmlClasses === void 0) { modifyHtmlClasses = true; } var panel = this; var app = panel.app; panel.opened = true; app.panel.allowOpen = false; panel.$el.trigger('panel:beforeopen'); panel.emit('local::beforeOpen panelBeforeOpen', panel); if (modifyHtmlClasses) { panel.setStateClasses('open'); } panel.$el.trigger('panel:open'); panel.emit('local::open panelOpen', panel); }; _proto.onOpened = function onOpened() { var panel = this; var app = panel.app; app.panel.allowOpen = true; panel.$el.trigger('panel:opened'); panel.emit('local::opened panelOpened', panel); }; _proto.onClose = function onClose() { var panel = this; var app = panel.app; panel.opened = false; app.panel.allowOpen = false; panel.$el.trigger('panel:beforeclose'); panel.emit('local::beforeClose panelBeforeClose', panel); panel.setStateClasses('closing'); panel.$el.trigger('panel:close'); panel.emit('local::close panelClose', panel); }; _proto.onClosed = function onClosed() { var panel = this; var app = panel.app; app.panel.allowOpen = true; panel.setStateClasses('after-closing'); panel.$el.removeClass('panel-out'); if (panel.$backdropEl) { var otherPanel = app.panel.get('.panel-in'); var shouldHideBackdrop = !otherPanel || otherPanel && !otherPanel.$backdropEl; if (shouldHideBackdrop) { panel.$backdropEl.removeClass('panel-backdrop-in'); } } panel.$el.trigger('panel:closed'); panel.emit('local::closed panelClosed', panel); }; _proto.toggle = function toggle(animate) { if (animate === void 0) { animate = true; } var panel = this; var breakpoint = panel.params.visibleBreakpoint; var app = panel.app; if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null) { return panel.toggleVisibleBreakpoint(); } if (panel.opened) panel.close(animate);else panel.open(animate); return panel; }; _proto.insertToRoot = function insertToRoot() { var panel = this; var document = (0, _ssrWindow.getDocument)(); var $el = panel.$el, $backdropEl = panel.$backdropEl, $containerEl = panel.$containerEl; var $panelParentEl = $el.parent(); var wasInDom = $el.parents(document).length > 0; if (!$panelParentEl.is($containerEl) || $el.prevAll('.views, .view').length) { var $insertBeforeEl = $containerEl.children('.panel, .views, .view').eq(0); var $insertAfterEl = $containerEl.children('.panel-backdrop').eq(0); if ($insertBeforeEl.length) { $el.insertBefore($insertBeforeEl); } else if ($insertAfterEl) { $el.insertBefore($insertAfterEl); } else { $containerEl.prepend($el); } if ($backdropEl && $backdropEl.length && (!$backdropEl.parent().is($containerEl) && $backdropEl.nextAll('.panel').length === 0 || $backdropEl.parent().is($containerEl) && $backdropEl.nextAll('.panel').length === 0)) { $backdropEl.insertBefore($el); } panel.once('panelClosed', function () { if (wasInDom) { $panelParentEl.append($el); } else { $el.remove(); } }); } }; _proto.open = function open(animate) { if (animate === void 0) { animate = true; } var panel = this; var app = panel.app; if (!app.panel.allowOpen) return false; var effect = panel.effect, $el = panel.$el, $backdropEl = panel.$backdropEl, opened = panel.opened, $containerEl = panel.$containerEl; if (!$el || $el.hasClass('panel-in')) { return panel; } panel.insertToRoot(); // Ignore if opened if (opened || $el.hasClass('panel-in-breakpoint') || $el.hasClass('panel-in')) return false; // Close if some panel is opened var otherOpenedPanel = app.panel.get('.panel-in'); if (otherOpenedPanel && otherOpenedPanel !== panel) { otherOpenedPanel.close(animate); } $el[animate ? 'removeClass' : 'addClass']('not-animated'); $el.addClass('panel-in'); if ($backdropEl) { $backdropEl.addClass('panel-backdrop-in'); $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated'); } if (panel.effect === 'cover' || panel.effect === 'push') { /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */ panel._clientLeft = $el[0].clientLeft; } // Transitionend var $viewEl = (0, _dom.default)(panel.getViewEl()); if ($containerEl && $containerEl.hasClass('page')) { $viewEl.add($containerEl.children('.page-content, .tabs')); } var transitionEndTarget = effect === 'reveal' ? $viewEl : $el; function panelTransitionEnd() { transitionEndTarget.transitionEnd(function (e) { if ((0, _dom.default)(e.target).is(transitionEndTarget)) { if ($el.hasClass('panel-out')) { panel.onClosed(); } else { panel.onOpened(); } } else panelTransitionEnd(); }); } if (animate) { if ($backdropEl) { $backdropEl.removeClass('not-animated'); } panelTransitionEnd(); $el.removeClass('panel-out not-animated').addClass('panel-in'); panel.onOpen(); } else { if ($backdropEl) { $backdropEl.addClass('not-animated'); } $el.removeClass('panel-out').addClass('panel-in not-animated'); panel.onOpen(); panel.onOpened(); } return true; }; _proto.close = function close(animate) { if (animate === void 0) { animate = true; } var panel = this; var effect = panel.effect, $el = panel.$el, $backdropEl = panel.$backdropEl, opened = panel.opened, $containerEl = panel.$containerEl; if (!opened || $el.hasClass('panel-in-breakpoint') || !$el.hasClass('panel-in')) return panel; $el[animate ? 'removeClass' : 'addClass']('not-animated'); if ($backdropEl) { $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated'); } var $viewEl = (0, _dom.default)(panel.getViewEl()); if ($containerEl && $containerEl.hasClass('page')) { $viewEl.add($containerEl.children('.page-content, .tabs')); } var transitionEndTarget = effect === 'reveal' ? $viewEl : $el; function transitionEnd() { if ($el.hasClass('panel-out')) { panel.onClosed(); } else if ($el.hasClass('panel-in')) { panel.onOpened(); } panel.setStateClasses('after-closing'); } if (animate) { transitionEndTarget.transitionEnd(function () { transitionEnd(); }); $el.removeClass('panel-in').addClass('panel-out'); // Emit close panel.onClose(); } else { $el.addClass('not-animated').removeClass('panel-in').addClass('panel-out'); // Emit close panel.onClose(); panel.onClosed(); } return panel; }; _proto.init = function init() { var panel = this; // const app = panel.app; if (typeof panel.params.visibleBreakpoint !== 'undefined') { panel.setVisibleBreakpoint(); } if (typeof panel.params.collapsedBreakpoint !== 'undefined') { panel.setCollapsedBreakpoint(); } if (panel.params.swipe) { panel.enableSwipe(); } if (panel.resizable) { panel.enableResizable(); } }; _proto.destroy = function destroy() { var panel = this; var app = panel.app; var _panel = panel, $containerEl = _panel.$containerEl; if (!panel.$el) { // Panel already destroyed return; } panel.emit('local::beforeDestroy panelBeforeDestroy', panel); panel.$el.trigger('panel:beforedestroy'); if (panel.visibleBreakpointResizeHandler) { app.off('resize', panel.visibleBreakpointResizeHandler); } if (panel.collapsedBreakpointResizeHandler) { app.off('resize', panel.collapsedBreakpointResizeHandler); } if (panel.$el.hasClass('panel-in-breakpoint') || panel.$el.hasClass('panel-in-collapsed')) { var _$viewEl$css4; var $viewEl = (0, _dom.default)(panel.getViewEl()); if ($containerEl && $containerEl.hasClass('page')) { $viewEl.add($containerEl.children('.page-content, .tabs')); } panel.$el.removeClass('panel-in-breakpoint panel-in-collapsed panel-in'); $viewEl.css((_$viewEl$css4 = {}, _$viewEl$css4["margin-" + panel.side] = '', _$viewEl$css4)); panel.emit('local::breakpoint panelBreakpoint', panel); panel.$el.trigger('panel:breakpoint'); } panel.$el.trigger('panel:destroy'); panel.emit('local::destroy panelDestroy', panel); if (panel.el) { panel.el.f7Panel = null; delete panel.el.f7Panel; } (0, _utils.deleteProps)(panel); panel = null; }; return Panel; }(_class.default); var _default = Panel; exports.default = _default;