UNPKG

test-isc

Version:

An Ionic component similar to Ionic Select, that allows to search items, including async search, group, add, edit, delete items, and much more.

547 lines (546 loc) 28 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; import { r as registerInstance, d as createEvent, h, H as Host, e as getElement } from './index-b6f64b02.js'; import { c as config, g as getIonMode } from './ionic-global-5d790111.js'; import { i as isEndSide, b as assert, c as clamp } from './helpers-4a6bd295.js'; import './animation-3124e2ad.js'; import { g as getTimeGivenProgression } from './cubic-bezier-89113939.js'; import { GESTURE_CONTROLLER } from './index-9b41fcc6.js'; import './hardware-back-button-b3b61715.js'; import { m as menuController } from './index-59323445.js'; var menuIosCss = ":host{--width:304px;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--background:var(--ion-background-color, #fff);left:0;right:0;top:0;bottom:0;display:none;position:absolute;contain:strict}:host(.show-menu){display:block}.menu-inner{left:0;right:auto;top:0;bottom:0;-webkit-transform:translate3d(-9999px, 0, 0);transform:translate3d(-9999px, 0, 0);display:-ms-flexbox;display:flex;position:absolute;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:justify;justify-content:space-between;width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);background:var(--background);contain:strict}[dir=rtl] .menu-inner,:host-context([dir=rtl]) .menu-inner{left:unset;right:unset;left:auto;right:0}[dir=rtl] .menu-inner,:host-context([dir=rtl]) .menu-inner{-webkit-transform:translate3d(calc(-1 * -9999px), 0, 0);transform:translate3d(calc(-1 * -9999px), 0, 0)}:host(.menu-side-start) .menu-inner{--ion-safe-area-right:0px;right:auto;left:0}:host(.menu-side-end) .menu-inner{--ion-safe-area-left:0px;right:0;left:auto;}ion-backdrop{display:none;opacity:0.01;z-index:-1}@media (max-width: 340px){.menu-inner{--width:264px}}:host(.menu-type-reveal){z-index:0}:host(.menu-type-reveal.show-menu) .menu-inner{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}:host(.menu-type-overlay){z-index:1000}:host(.menu-type-overlay) .show-backdrop{display:block;cursor:pointer}:host(.menu-pane-visible){width:var(--width);min-width:var(--min-width);max-width:var(--max-width)}:host(.menu-pane-visible) .menu-inner{left:0;right:0;width:auto;-webkit-transform:none !important;transform:none !important;-webkit-box-shadow:none !important;box-shadow:none !important}:host(.menu-pane-visible) ion-backdrop{display:hidden !important;}:host(.menu-type-push){z-index:1000}:host(.menu-type-push) .show-backdrop{display:block}"; var menuMdCss = ":host{--width:304px;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--background:var(--ion-background-color, #fff);left:0;right:0;top:0;bottom:0;display:none;position:absolute;contain:strict}:host(.show-menu){display:block}.menu-inner{left:0;right:auto;top:0;bottom:0;-webkit-transform:translate3d(-9999px, 0, 0);transform:translate3d(-9999px, 0, 0);display:-ms-flexbox;display:flex;position:absolute;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:justify;justify-content:space-between;width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);background:var(--background);contain:strict}[dir=rtl] .menu-inner,:host-context([dir=rtl]) .menu-inner{left:unset;right:unset;left:auto;right:0}[dir=rtl] .menu-inner,:host-context([dir=rtl]) .menu-inner{-webkit-transform:translate3d(calc(-1 * -9999px), 0, 0);transform:translate3d(calc(-1 * -9999px), 0, 0)}:host(.menu-side-start) .menu-inner{--ion-safe-area-right:0px;right:auto;left:0}:host(.menu-side-end) .menu-inner{--ion-safe-area-left:0px;right:0;left:auto;}ion-backdrop{display:none;opacity:0.01;z-index:-1}@media (max-width: 340px){.menu-inner{--width:264px}}:host(.menu-type-reveal){z-index:0}:host(.menu-type-reveal.show-menu) .menu-inner{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}:host(.menu-type-overlay){z-index:1000}:host(.menu-type-overlay) .show-backdrop{display:block;cursor:pointer}:host(.menu-pane-visible){width:var(--width);min-width:var(--min-width);max-width:var(--max-width)}:host(.menu-pane-visible) .menu-inner{left:0;right:0;width:auto;-webkit-transform:none !important;transform:none !important;-webkit-box-shadow:none !important;box-shadow:none !important}:host(.menu-pane-visible) ion-backdrop{display:hidden !important;}:host(.menu-type-overlay) .menu-inner{-webkit-box-shadow:4px 0px 16px rgba(0, 0, 0, 0.18);box-shadow:4px 0px 16px rgba(0, 0, 0, 0.18)}"; var iosEasing = 'cubic-bezier(0.32,0.72,0,1)'; var mdEasing = 'cubic-bezier(0.0,0.0,0.2,1)'; var iosEasingReverse = 'cubic-bezier(1, 0, 0.68, 0.28)'; var mdEasingReverse = 'cubic-bezier(0.4, 0, 0.6, 1)'; var Menu = /** @class */ (function () { function class_1(hostRef) { registerInstance(this, hostRef); this.lastOnEnd = 0; this.blocker = GESTURE_CONTROLLER.createBlocker({ disableScroll: true }); this.isAnimating = false; this._isOpen = false; this.isPaneVisible = false; this.isEndSide = false; /** * If `true`, the menu is disabled. */ this.disabled = false; /** * Which side of the view the menu should be placed. */ this.side = 'start'; /** * If `true`, swiping the menu is enabled. */ this.swipeGesture = true; /** * The edge threshold for dragging the menu open. * If a drag/swipe happens over this value, the menu is not triggered. */ this.maxEdgeStart = 50; this.ionWillOpen = createEvent(this, "ionWillOpen", 7); this.ionWillClose = createEvent(this, "ionWillClose", 7); this.ionDidOpen = createEvent(this, "ionDidOpen", 7); this.ionDidClose = createEvent(this, "ionDidClose", 7); this.ionMenuChange = createEvent(this, "ionMenuChange", 7); } class_1.prototype.typeChanged = function (type, oldType) { var contentEl = this.contentEl; if (contentEl) { if (oldType !== undefined) { contentEl.classList.remove("menu-content-" + oldType); } contentEl.classList.add("menu-content-" + type); contentEl.removeAttribute('style'); } if (this.menuInnerEl) { // Remove effects of previous animations this.menuInnerEl.removeAttribute('style'); } this.animation = undefined; }; class_1.prototype.disabledChanged = function () { this.updateState(); this.ionMenuChange.emit({ disabled: this.disabled, open: this._isOpen }); }; class_1.prototype.sideChanged = function () { this.isEndSide = isEndSide(this.side); }; class_1.prototype.swipeGestureChanged = function () { this.updateState(); }; class_1.prototype.connectedCallback = function () { return __awaiter(this, void 0, void 0, function () { var el, parent, content, _a; var _this = this; return __generator(this, function (_b) { switch (_b.label) { case 0: if (this.type === undefined) { this.type = config.get('menuType', 'overlay'); } el = this.el; parent = el.parentNode; if (this.contentId === undefined) { console.warn("[DEPRECATED][ion-menu] Using the [main] attribute is deprecated, please use the \"contentId\" property instead:\nBEFORE:\n <ion-menu>...</ion-menu>\n <div main>...</div>\n\nAFTER:\n <ion-menu contentId=\"main-content\"></ion-menu>\n <div id=\"main-content\">...</div>\n"); } content = this.contentId !== undefined ? document.getElementById(this.contentId) : parent && parent.querySelector && parent.querySelector('[main]'); if (!content || !content.tagName) { // requires content element console.error('Menu: must have a "content" element to listen for drag events on.'); return [2 /*return*/]; } this.contentEl = content; // add menu's content classes content.classList.add('menu-content'); this.typeChanged(this.type, undefined); this.sideChanged(); // register this menu with the app's menu controller menuController._register(this); _a = this; return [4 /*yield*/, import('./index-9b41fcc6.js')]; case 1: _a.gesture = (_b.sent()).createGesture({ el: document, gestureName: 'menu-swipe', gesturePriority: 30, threshold: 10, blurOnStart: true, canStart: function (ev) { return _this.canStart(ev); }, onWillStart: function () { return _this.onWillStart(); }, onStart: function () { return _this.onStart(); }, onMove: function (ev) { return _this.onMove(ev); }, onEnd: function (ev) { return _this.onEnd(ev); }, }); this.updateState(); return [2 /*return*/]; } }); }); }; class_1.prototype.componentDidLoad = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { this.ionMenuChange.emit({ disabled: this.disabled, open: this._isOpen }); this.updateState(); return [2 /*return*/]; }); }); }; class_1.prototype.disconnectedCallback = function () { this.blocker.destroy(); menuController._unregister(this); if (this.animation) { this.animation.destroy(); } if (this.gesture) { this.gesture.destroy(); this.gesture = undefined; } this.animation = undefined; this.contentEl = this.backdropEl = this.menuInnerEl = undefined; }; class_1.prototype.onSplitPaneChanged = function (ev) { this.isPaneVisible = ev.detail.isPane(this.el); this.updateState(); }; class_1.prototype.onBackdropClick = function (ev) { if (this._isOpen && this.lastOnEnd < ev.timeStamp - 100) { var shouldClose = (ev.composedPath) ? !ev.composedPath().includes(this.menuInnerEl) : false; if (shouldClose) { ev.preventDefault(); ev.stopPropagation(); this.close(); } } }; /** * Returns `true` is the menu is open. */ class_1.prototype.isOpen = function () { return Promise.resolve(this._isOpen); }; /** * Returns `true` is the menu is active. * * A menu is active when it can be opened or closed, meaning it's enabled * and it's not part of a `ion-split-pane`. */ class_1.prototype.isActive = function () { return Promise.resolve(this._isActive()); }; /** * Opens the menu. If the menu is already open or it can't be opened, * it returns `false`. */ class_1.prototype.open = function (animated) { if (animated === void 0) { animated = true; } return this.setOpen(true, animated); }; /** * Closes the menu. If the menu is already closed or it can't be closed, * it returns `false`. */ class_1.prototype.close = function (animated) { if (animated === void 0) { animated = true; } return this.setOpen(false, animated); }; /** * Toggles the menu. If the menu is already open, it will try to close, otherwise it will try to open it. * If the operation can't be completed successfully, it returns `false`. */ class_1.prototype.toggle = function (animated) { if (animated === void 0) { animated = true; } return this.setOpen(!this._isOpen, animated); }; /** * Opens or closes the button. * If the operation can't be completed successfully, it returns `false`. */ class_1.prototype.setOpen = function (shouldOpen, animated) { if (animated === void 0) { animated = true; } return menuController._setOpen(this, shouldOpen, animated); }; class_1.prototype._setOpen = function (shouldOpen, animated) { if (animated === void 0) { animated = true; } return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: // If the menu is disabled or it is currently being animated, let's do nothing if (!this._isActive() || this.isAnimating || shouldOpen === this._isOpen) { return [2 /*return*/, false]; } this.beforeAnimation(shouldOpen); return [4 /*yield*/, this.loadAnimation()]; case 1: _a.sent(); return [4 /*yield*/, this.startAnimation(shouldOpen, animated)]; case 2: _a.sent(); this.afterAnimation(shouldOpen); return [2 /*return*/, true]; } }); }); }; class_1.prototype.loadAnimation = function () { return __awaiter(this, void 0, void 0, function () { var width, _a; return __generator(this, function (_b) { switch (_b.label) { case 0: width = this.menuInnerEl.offsetWidth; if (width === this.width && this.animation !== undefined) { return [2 /*return*/]; } this.width = width; // Destroy existing animation if (this.animation) { this.animation.destroy(); this.animation = undefined; } // Create new animation _a = this; return [4 /*yield*/, menuController._createAnimation(this.type, this)]; case 1: // Create new animation _a.animation = _b.sent(); if (!config.getBoolean('animated', true)) { this.animation.duration(0); } this.animation.fill('both'); return [2 /*return*/]; } }); }); }; class_1.prototype.startAnimation = function (shouldOpen, animated) { return __awaiter(this, void 0, void 0, function () { var isReversed, mode, easing, easingReverse, ani; return __generator(this, function (_a) { switch (_a.label) { case 0: isReversed = !shouldOpen; mode = getIonMode(this); easing = mode === 'ios' ? iosEasing : mdEasing; easingReverse = mode === 'ios' ? iosEasingReverse : mdEasingReverse; ani = this.animation .direction((isReversed) ? 'reverse' : 'normal') .easing((isReversed) ? easingReverse : easing) .onFinish(function () { if (ani.getDirection() === 'reverse') { ani.direction('normal'); } }); if (!animated) return [3 /*break*/, 2]; return [4 /*yield*/, ani.play()]; case 1: _a.sent(); return [3 /*break*/, 3]; case 2: ani.play({ sync: true }); _a.label = 3; case 3: return [2 /*return*/]; } }); }); }; class_1.prototype._isActive = function () { return !this.disabled && !this.isPaneVisible; }; class_1.prototype.canSwipe = function () { return this.swipeGesture && !this.isAnimating && this._isActive(); }; class_1.prototype.canStart = function (detail) { // Do not allow swipe gesture if a modal is open var isModalPresented = !!document.querySelector('ion-modal.show-modal'); if (isModalPresented || !this.canSwipe()) { return false; } if (this._isOpen) { return true; // TODO error } else if (menuController._getOpenSync()) { return false; } return checkEdgeSide(window, detail.currentX, this.isEndSide, this.maxEdgeStart); }; class_1.prototype.onWillStart = function () { this.beforeAnimation(!this._isOpen); return this.loadAnimation(); }; class_1.prototype.onStart = function () { if (!this.isAnimating || !this.animation) { assert(false, 'isAnimating has to be true'); return; } // the cloned animation should not use an easing curve during seek this.animation.progressStart(true, (this._isOpen) ? 1 : 0); }; class_1.prototype.onMove = function (detail) { if (!this.isAnimating || !this.animation) { assert(false, 'isAnimating has to be true'); return; } var delta = computeDelta(detail.deltaX, this._isOpen, this.isEndSide); var stepValue = delta / this.width; this.animation.progressStep((this._isOpen) ? 1 - stepValue : stepValue); }; class_1.prototype.onEnd = function (detail) { var _this = this; if (!this.isAnimating || !this.animation) { assert(false, 'isAnimating has to be true'); return; } var isOpen = this._isOpen; var isEndSide = this.isEndSide; var delta = computeDelta(detail.deltaX, isOpen, isEndSide); var width = this.width; var stepValue = delta / width; var velocity = detail.velocityX; var z = width / 2.0; var shouldCompleteRight = velocity >= 0 && (velocity > 0.2 || detail.deltaX > z); var shouldCompleteLeft = velocity <= 0 && (velocity < -0.2 || detail.deltaX < -z); var shouldComplete = isOpen ? isEndSide ? shouldCompleteRight : shouldCompleteLeft : isEndSide ? shouldCompleteLeft : shouldCompleteRight; var shouldOpen = !isOpen && shouldComplete; if (isOpen && !shouldComplete) { shouldOpen = true; } this.lastOnEnd = detail.currentTime; // Account for rounding errors in JS var newStepValue = (shouldComplete) ? 0.001 : -0.001; /** * TODO: stepValue can sometimes return a negative * value, but you can't have a negative time value * for the cubic bezier curve (at least with web animations) * Not sure if the negative step value is an error or not */ var adjustedStepValue = (stepValue < 0) ? 0.01 : stepValue; /** * Animation will be reversed here, so need to * reverse the easing curve as well * * Additionally, we need to account for the time relative * to the new easing curve, as `stepValue` is going to be given * in terms of a linear curve. */ newStepValue += getTimeGivenProgression([0, 0], [0.4, 0], [0.6, 1], [1, 1], clamp(0, adjustedStepValue, 0.9999))[0] || 0; var playTo = (this._isOpen) ? !shouldComplete : shouldComplete; this.animation .easing('cubic-bezier(0.4, 0.0, 0.6, 1)') .onFinish(function () { return _this.afterAnimation(shouldOpen); }, { oneTimeCallback: true }) .progressEnd((playTo) ? 1 : 0, (this._isOpen) ? 1 - newStepValue : newStepValue, 300); }; class_1.prototype.beforeAnimation = function (shouldOpen) { assert(!this.isAnimating, '_before() should not be called while animating'); // this places the menu into the correct location before it animates in // this css class doesn't actually kick off any animations this.el.classList.add(SHOW_MENU); if (this.backdropEl) { this.backdropEl.classList.add(SHOW_BACKDROP); } this.blocker.block(); this.isAnimating = true; if (shouldOpen) { this.ionWillOpen.emit(); } else { this.ionWillClose.emit(); } }; class_1.prototype.afterAnimation = function (isOpen) { assert(this.isAnimating, '_before() should be called while animating'); // keep opening/closing the menu disabled for a touch more yet // only add listeners/css if it's enabled and isOpen // and only remove listeners/css if it's not open // emit opened/closed events this._isOpen = isOpen; this.isAnimating = false; if (!this._isOpen) { this.blocker.unblock(); } if (isOpen) { // add css class if (this.contentEl) { this.contentEl.classList.add(MENU_CONTENT_OPEN); } // emit open event this.ionDidOpen.emit(); } else { // remove css classes this.el.classList.remove(SHOW_MENU); if (this.contentEl) { this.contentEl.classList.remove(MENU_CONTENT_OPEN); } if (this.backdropEl) { this.backdropEl.classList.remove(SHOW_BACKDROP); } if (this.animation) { this.animation.stop(); } // emit close event this.ionDidClose.emit(); } }; class_1.prototype.updateState = function () { var isActive = this._isActive(); if (this.gesture) { this.gesture.enable(isActive && this.swipeGesture); } // Close menu immediately if (!isActive && this._isOpen) { // close if this menu is open, and should not be enabled this.forceClosing(); } if (!this.disabled) { menuController._setActiveMenu(this); } assert(!this.isAnimating, 'can not be animating'); }; class_1.prototype.forceClosing = function () { assert(this._isOpen, 'menu cannot be closed'); this.isAnimating = true; var ani = this.animation.direction('reverse'); ani.play({ sync: true }); this.afterAnimation(false); }; class_1.prototype.render = function () { var _a; var _this = this; var _b = this, isEndSide = _b.isEndSide, type = _b.type, disabled = _b.disabled, isPaneVisible = _b.isPaneVisible; var mode = getIonMode(this); return (h(Host, { role: "navigation", class: (_a = {}, _a[mode] = true, _a["menu-type-" + type] = true, _a['menu-enabled'] = !disabled, _a['menu-side-end'] = isEndSide, _a['menu-side-start'] = !isEndSide, _a['menu-pane-visible'] = isPaneVisible, _a) }, h("div", { class: "menu-inner", part: "container", ref: function (el) { return _this.menuInnerEl = el; } }, h("slot", null)), h("ion-backdrop", { ref: function (el) { return _this.backdropEl = el; }, class: "menu-backdrop", tappable: false, stopPropagation: false, part: "backdrop" }))); }; Object.defineProperty(class_1.prototype, "el", { get: function () { return getElement(this); }, enumerable: true, configurable: true }); Object.defineProperty(class_1, "watchers", { get: function () { return { "type": ["typeChanged"], "disabled": ["disabledChanged"], "side": ["sideChanged"], "swipeGesture": ["swipeGestureChanged"] }; }, enumerable: true, configurable: true }); return class_1; }()); var computeDelta = function (deltaX, isOpen, isEndSide) { return Math.max(0, isOpen !== isEndSide ? -deltaX : deltaX); }; var checkEdgeSide = function (win, posX, isEndSide, maxEdgeStart) { if (isEndSide) { return posX >= win.innerWidth - maxEdgeStart; } else { return posX <= maxEdgeStart; } }; var SHOW_MENU = 'show-menu'; var SHOW_BACKDROP = 'show-backdrop'; var MENU_CONTENT_OPEN = 'menu-content-open'; Menu.style = { /*STENCIL:MODE:ios*/ ios: menuIosCss, /*STENCIL:MODE:md*/ md: menuMdCss }; export { Menu as ion_menu };