UNPKG

@syncfusion/ej2-navigations

Version:

A package of Essential JS 2 navigation components such as Tree-view, Tab, Toolbar, Context-menu, and Accordion which is used to navigate from one page to another

1,258 lines (1,254 loc) 925 kB
import { Browser, getUniqueID, Touch, EventHandler, isNullOrUndefined, selectAll, detach, classList, Property, NotifyPropertyChanges, Component, createElement, removeClass, select, ChildProperty, Collection, Animation, getValue, setValue, append, closest, addClass, isBlazor, rippleEffect, KeyboardEvents, getInstance, isVisible, SanitizeHtmlHelper, Event, Complex, formatUnit, setStyleAttribute, attributes, compile, isRippleEnabled, animationMode, remove, getRandomId, L10n, Draggable, isUndefined, getElement, Droppable, matches, extend, merge, initializeCSPTemplate } from '@syncfusion/ej2-base'; import { ListBase } from '@syncfusion/ej2-lists'; import { getScrollableParent, Popup, getZindexPartial, fit, isCollide, calculatePosition, createSpinner, showSpinner, hideSpinner, Tooltip } from '@syncfusion/ej2-popups'; import { Button, createCheckBox, rippleMouseHandler } from '@syncfusion/ej2-buttons'; import { DataManager, Query } from '@syncfusion/ej2-data'; import { Input } from '@syncfusion/ej2-inputs'; var __extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var CLS_ROOT = 'e-hscroll'; var CLS_RTL = 'e-rtl'; var CLS_DISABLE = 'e-overlay'; var CLS_HSCROLLBAR = 'e-hscroll-bar'; var CLS_HSCROLLCON = 'e-hscroll-content'; var CLS_NAVARROW = 'e-nav-arrow'; var CLS_NAVRIGHTARROW = 'e-nav-right-arrow'; var CLS_NAVLEFTARROW = 'e-nav-left-arrow'; var CLS_HSCROLLNAV = 'e-scroll-nav'; var CLS_HSCROLLNAVRIGHT = 'e-scroll-right-nav'; var CLS_HSCROLLNAVLEFT = 'e-scroll-left-nav'; var CLS_DEVICE = 'e-scroll-device'; var CLS_OVERLAY = 'e-scroll-overlay'; var CLS_RIGHTOVERLAY = 'e-scroll-right-overlay'; var CLS_LEFTOVERLAY = 'e-scroll-left-overlay'; var OVERLAY_MAXWID = 40; /** * HScroll module is introduces horizontal scroller when content exceeds the current viewing area. * It can be useful for the components like Toolbar, Tab which needs horizontal scrolling alone. * Hidden content can be view by touch moving or icon click. * ```html * <div id="scroll"/> * <script> * var scrollObj = new HScroll(); * scrollObj.appendTo("#scroll"); * </script> * ``` */ var HScroll = /** @__PURE__ @class */ (function (_super) { __extends(HScroll, _super); /** * Initializes a new instance of the HScroll class. * * @param {HScrollModel} options - Specifies HScroll model properties as options. * @param {string | HTMLElement} element - Specifies the element for which horizontal scrolling applies. */ function HScroll(options, element) { return _super.call(this, options, element) || this; } /** * Initialize the event handler * * @private * @returns {void} */ HScroll.prototype.preRender = function () { this.browser = Browser.info.name; this.browserCheck = this.browser === 'mozilla'; this.isDevice = Browser.isDevice; this.customStep = true; var element = this.element; this.ieCheck = this.browser === 'edge' || this.browser === 'msie'; this.initialize(); if (element.id === '') { element.id = getUniqueID('hscroll'); this.uniqueId = true; } element.style.display = 'block'; if (this.enableRtl) { element.classList.add(CLS_RTL); } }; /** * To Initialize the horizontal scroll rendering * * @private * @returns {void} */ HScroll.prototype.render = function () { this.touchModule = new Touch(this.element, { scroll: this.touchHandler.bind(this), swipe: this.swipeHandler.bind(this) }); EventHandler.add(this.scrollEle, 'scroll', this.scrollHandler, this); if (!this.isDevice) { this.createNavIcon(this.element); } else { this.element.classList.add(CLS_DEVICE); this.createOverlay(this.element); } this.setScrollState(); }; HScroll.prototype.setScrollState = function () { if (isNullOrUndefined(this.scrollStep) || this.scrollStep < 0) { this.scrollStep = this.scrollEle.offsetWidth; this.customStep = false; } else { this.customStep = true; } }; HScroll.prototype.initialize = function () { var scrollEle = this.createElement('div', { className: CLS_HSCROLLCON }); var scrollDiv = this.createElement('div', { className: CLS_HSCROLLBAR }); scrollDiv.setAttribute('tabindex', '-1'); var ele = this.element; var innerEle = [].slice.call(ele.children); for (var _i = 0, innerEle_1 = innerEle; _i < innerEle_1.length; _i++) { var ele_1 = innerEle_1[_i]; scrollEle.appendChild(ele_1); } scrollDiv.appendChild(scrollEle); ele.appendChild(scrollDiv); scrollDiv.style.overflowX = 'hidden'; this.scrollEle = scrollDiv; this.scrollItems = scrollEle; }; HScroll.prototype.getPersistData = function () { var keyEntity = ['scrollStep']; return this.addOnPersist(keyEntity); }; /** * Returns the current module name. * * @returns {string} - It returns the current module name. * @private */ HScroll.prototype.getModuleName = function () { return 'hScroll'; }; /** * Removes the control from the DOM and also removes all its related events. * * @returns {void} */ HScroll.prototype.destroy = function () { var ele = this.element; ele.style.display = ''; ele.classList.remove(CLS_ROOT); ele.classList.remove(CLS_DEVICE); ele.classList.remove(CLS_RTL); var nav = selectAll('.e-' + ele.id + '_nav.' + CLS_HSCROLLNAV, ele); var overlay = selectAll('.' + CLS_OVERLAY, ele); [].slice.call(overlay).forEach(function (ele) { detach(ele); }); for (var _i = 0, _a = [].slice.call(this.scrollItems.children); _i < _a.length; _i++) { var elem = _a[_i]; ele.appendChild(elem); } if (this.uniqueId) { this.element.removeAttribute('id'); } detach(this.scrollEle); if (nav.length > 0) { detach(nav[0]); if (!isNullOrUndefined(nav[1])) { detach(nav[1]); } } EventHandler.remove(this.scrollEle, 'scroll', this.scrollHandler); this.touchModule.destroy(); this.touchModule = null; _super.prototype.destroy.call(this); }; /** * Specifies the value to disable/enable the HScroll component. * When set to `true` , the component will be disabled. * * @param {boolean} value - Based on this Boolean value, HScroll will be enabled (false) or disabled (true). * @returns {void}. */ HScroll.prototype.disable = function (value) { var navEles = selectAll('.e-scroll-nav:not(.' + CLS_DISABLE + ')', this.element); if (value) { this.element.classList.add(CLS_DISABLE); } else { this.element.classList.remove(CLS_DISABLE); } [].slice.call(navEles).forEach(function (el) { el.setAttribute('tabindex', !value ? '0' : '-1'); }); }; HScroll.prototype.createOverlay = function (element) { var id = element.id.concat('_nav'); var rightOverlayEle = this.createElement('div', { className: CLS_OVERLAY + ' ' + CLS_RIGHTOVERLAY }); var clsRight = 'e-' + element.id.concat('_nav ' + CLS_HSCROLLNAV + ' ' + CLS_HSCROLLNAVRIGHT); var rightEle = this.createElement('div', { id: id.concat('_right'), className: clsRight }); var navItem = this.createElement('div', { className: CLS_NAVRIGHTARROW + ' ' + CLS_NAVARROW + ' e-icons' }); rightEle.appendChild(navItem); var leftEle = this.createElement('div', { className: CLS_OVERLAY + ' ' + CLS_LEFTOVERLAY }); if (this.ieCheck) { rightEle.classList.add('e-ie-align'); } element.appendChild(rightOverlayEle); element.appendChild(rightEle); element.insertBefore(leftEle, element.firstChild); this.eventBinding([rightEle]); }; HScroll.prototype.createNavIcon = function (element) { var id = element.id.concat('_nav'); var clsRight = 'e-' + element.id.concat('_nav ' + CLS_HSCROLLNAV + ' ' + CLS_HSCROLLNAVRIGHT); var rightAttributes = { 'role': 'button', 'id': id.concat('_right'), 'aria-label': 'Scroll right' }; var nav = this.createElement('div', { className: clsRight, attrs: rightAttributes }); nav.setAttribute('aria-disabled', 'false'); var navItem = this.createElement('div', { className: CLS_NAVRIGHTARROW + ' ' + CLS_NAVARROW + ' e-icons' }); var clsLeft = 'e-' + element.id.concat('_nav ' + CLS_HSCROLLNAV + ' ' + CLS_HSCROLLNAVLEFT); var leftAttributes = { 'role': 'button', 'id': id.concat('_left'), 'aria-label': 'Scroll left' }; var navEle = this.createElement('div', { className: clsLeft + ' ' + CLS_DISABLE, attrs: leftAttributes }); navEle.setAttribute('aria-disabled', 'true'); var navLeftItem = this.createElement('div', { className: CLS_NAVLEFTARROW + ' ' + CLS_NAVARROW + ' e-icons' }); navEle.appendChild(navLeftItem); nav.appendChild(navItem); element.appendChild(nav); element.insertBefore(navEle, element.firstChild); if (this.ieCheck) { nav.classList.add('e-ie-align'); navEle.classList.add('e-ie-align'); } this.eventBinding([nav, navEle]); }; HScroll.prototype.onKeyPress = function (e) { var _this = this; if (e.key === 'Enter') { var timeoutFun_1 = function () { _this.keyTimeout = true; _this.eleScrolling(10, e.target, true); }; this.keyTimer = window.setTimeout(function () { timeoutFun_1(); }, 100); } }; HScroll.prototype.onKeyUp = function (e) { if (e.key !== 'Enter') { return; } if (this.keyTimeout) { this.keyTimeout = false; } else { e.target.click(); } clearTimeout(this.keyTimer); }; HScroll.prototype.eventBinding = function (ele) { var _this = this; [].slice.call(ele).forEach(function (el) { new Touch(el, { tapHold: _this.tabHoldHandler.bind(_this), tapHoldThreshold: 500 }); el.addEventListener('keydown', _this.onKeyPress.bind(_this)); el.addEventListener('keyup', _this.onKeyUp.bind(_this)); el.addEventListener('mouseup', _this.repeatScroll.bind(_this)); el.addEventListener('touchend', _this.repeatScroll.bind(_this)); el.addEventListener('contextmenu', function (e) { e.preventDefault(); }); EventHandler.add(el, 'click', _this.clickEventHandler, _this); }); }; HScroll.prototype.repeatScroll = function () { clearInterval(this.timeout); }; HScroll.prototype.tabHoldHandler = function (e) { var _this = this; var trgt = e.originalEvent.target; trgt = this.contains(trgt, CLS_HSCROLLNAV) ? trgt.firstElementChild : trgt; var scrollDis = 10; var timeoutFun = function () { _this.eleScrolling(scrollDis, trgt, true); }; this.timeout = window.setInterval(function () { timeoutFun(); }, 50); }; HScroll.prototype.contains = function (ele, className) { return ele.classList.contains(className); }; HScroll.prototype.eleScrolling = function (scrollDis, trgt, isContinuous) { var rootEle = this.element; var classList = trgt.classList; if (classList.contains(CLS_HSCROLLNAV)) { classList = trgt.querySelector('.' + CLS_NAVARROW).classList; } if (this.contains(rootEle, CLS_RTL) && this.browserCheck) { scrollDis = -scrollDis; } if ((!this.contains(rootEle, CLS_RTL) || this.browserCheck) || this.ieCheck) { if (classList.contains(CLS_NAVRIGHTARROW)) { this.frameScrollRequest(scrollDis, 'add', isContinuous); } else { this.frameScrollRequest(scrollDis, '', isContinuous); } } else { if (classList.contains(CLS_NAVLEFTARROW)) { this.frameScrollRequest(scrollDis, 'add', isContinuous); } else { this.frameScrollRequest(scrollDis, '', isContinuous); } } }; HScroll.prototype.clickEventHandler = function (e) { this.eleScrolling(this.scrollStep, e.target, false); }; HScroll.prototype.swipeHandler = function (e) { var swipeEle = this.scrollEle; var distance; if (e.velocity <= 1) { distance = e.distanceX / (e.velocity * 10); } else { distance = e.distanceX / e.velocity; } var start = 0.5; var animate = function () { var step = Math.sin(start); if (step <= 0) { window.cancelAnimationFrame(step); } else { if (e.swipeDirection === 'Left') { swipeEle.scrollLeft += distance * step; } else if (e.swipeDirection === 'Right') { swipeEle.scrollLeft -= distance * step; } start -= 0.5; window.requestAnimationFrame(animate); } }; animate(); }; HScroll.prototype.scrollUpdating = function (scrollVal, action) { if (action === 'add') { this.scrollEle.scrollLeft += scrollVal; } else { this.scrollEle.scrollLeft -= scrollVal; } if (this.enableRtl && this.scrollEle.scrollLeft > 0) { this.scrollEle.scrollLeft = 0; } }; HScroll.prototype.frameScrollRequest = function (scrollVal, action, isContinuous) { var _this = this; var step = 10; if (isContinuous) { this.scrollUpdating(scrollVal, action); return; } if (!this.customStep) { [].slice.call(selectAll('.' + CLS_OVERLAY, this.element)).forEach(function (el) { scrollVal -= el.offsetWidth; }); } var animate = function () { var scrollValue; var scrollStep; if (_this.contains(_this.element, CLS_RTL) && _this.browserCheck) { scrollValue = -scrollVal; scrollStep = -step; } else { scrollValue = scrollVal; scrollStep = step; } if (scrollValue < step) { window.cancelAnimationFrame(scrollStep); } else { _this.scrollUpdating(scrollStep, action); scrollVal -= scrollStep; window.requestAnimationFrame(animate); } }; animate(); }; HScroll.prototype.touchHandler = function (e) { var ele = this.scrollEle; var distance = e.distanceX; if ((this.ieCheck) && this.contains(this.element, CLS_RTL)) { distance = -distance; } if (e.scrollDirection === 'Left') { ele.scrollLeft = ele.scrollLeft + distance; } else if (e.scrollDirection === 'Right') { ele.scrollLeft = ele.scrollLeft - distance; } }; HScroll.prototype.arrowDisabling = function (addDisable, removeDisable) { if (this.isDevice) { var arrowEle = isNullOrUndefined(addDisable) ? removeDisable : addDisable; var arrowIcon = arrowEle.querySelector('.' + CLS_NAVARROW); if (isNullOrUndefined(addDisable)) { classList(arrowIcon, [CLS_NAVRIGHTARROW], [CLS_NAVLEFTARROW]); } else { classList(arrowIcon, [CLS_NAVLEFTARROW], [CLS_NAVRIGHTARROW]); } } else if (addDisable && removeDisable) { addDisable.classList.add(CLS_DISABLE); addDisable.setAttribute('aria-disabled', 'true'); addDisable.removeAttribute('tabindex'); removeDisable.classList.remove(CLS_DISABLE); removeDisable.setAttribute('aria-disabled', 'false'); removeDisable.setAttribute('tabindex', '0'); } this.repeatScroll(); }; HScroll.prototype.scrollHandler = function (e) { var target = e.target; var width = target.offsetWidth; var rootEle = this.element; var navLeftEle = this.element.querySelector('.' + CLS_HSCROLLNAVLEFT); var navRightEle = this.element.querySelector('.' + CLS_HSCROLLNAVRIGHT); var leftOverlay = this.element.querySelector('.' + CLS_LEFTOVERLAY); var rightOverlay = this.element.querySelector('.' + CLS_RIGHTOVERLAY); var scrollLeft = target.scrollLeft; if (scrollLeft <= 0) { scrollLeft = -scrollLeft; } if (this.isDevice) { if (this.enableRtl && !(this.browserCheck || this.ieCheck)) { leftOverlay = this.element.querySelector('.' + CLS_RIGHTOVERLAY); rightOverlay = this.element.querySelector('.' + CLS_LEFTOVERLAY); } if (scrollLeft < OVERLAY_MAXWID) { leftOverlay.style.width = scrollLeft + 'px'; } else { leftOverlay.style.width = '40px'; } if ((target.scrollWidth - Math.ceil(width + scrollLeft)) < OVERLAY_MAXWID) { rightOverlay.style.width = (target.scrollWidth - Math.ceil(width + scrollLeft)) + 'px'; } else { rightOverlay.style.width = '40px'; } } if (scrollLeft === 0) { this.arrowDisabling(navLeftEle, navRightEle); } else if (Math.ceil(width + scrollLeft + .1) >= target.scrollWidth) { this.arrowDisabling(navRightEle, navLeftEle); } else { var disEle = this.element.querySelector('.' + CLS_HSCROLLNAV + '.' + CLS_DISABLE); if (disEle) { disEle.classList.remove(CLS_DISABLE); disEle.setAttribute('aria-disabled', 'false'); disEle.setAttribute('tabindex', '0'); } } }; /** * Gets called when the model property changes.The data that describes the old and new values of property that changed. * * @param {HScrollModel} newProp - It contains the new value of data. * @param {HScrollModel} oldProp - It contains the old value of data. * @returns {void} * @private */ HScroll.prototype.onPropertyChanged = function (newProp, oldProp) { for (var _i = 0, _a = Object.keys(newProp); _i < _a.length; _i++) { var prop = _a[_i]; switch (prop) { case 'scrollStep': this.setScrollState(); break; case 'enableRtl': newProp.enableRtl ? this.element.classList.add(CLS_RTL) : this.element.classList.remove(CLS_RTL); break; } } }; __decorate([ Property(null) ], HScroll.prototype, "scrollStep", void 0); HScroll = __decorate([ NotifyPropertyChanges ], HScroll); return HScroll; }(Component)); var __extends$1 = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate$1 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var CLS_ROOT$1 = 'e-vscroll'; var CLS_RTL$1 = 'e-rtl'; var CLS_DISABLE$1 = 'e-overlay'; var CLS_VSCROLLBAR = 'e-vscroll-bar'; var CLS_VSCROLLCON = 'e-vscroll-content'; var CLS_NAVARROW$1 = 'e-nav-arrow'; var CLS_NAVUPARROW = 'e-nav-up-arrow'; var CLS_NAVDOWNARROW = 'e-nav-down-arrow'; var CLS_VSCROLLNAV = 'e-scroll-nav'; var CLS_VSCROLLNAVUP = 'e-scroll-up-nav'; var CLS_VSCROLLNAVDOWN = 'e-scroll-down-nav'; var CLS_DEVICE$1 = 'e-scroll-device'; var CLS_OVERLAY$1 = 'e-scroll-overlay'; var CLS_UPOVERLAY = 'e-scroll-up-overlay'; var CLS_DOWNOVERLAY = 'e-scroll-down-overlay'; var OVERLAY_MAXWID$1 = 40; /** * VScroll module is introduces vertical scroller when content exceeds the current viewing area. * It can be useful for the components like Toolbar, Tab which needs vertical scrolling alone. * Hidden content can be view by touch moving or icon click. * ```html * <div id="scroll"/> * <script> * var scrollObj = new VScroll(); * scrollObj.appendTo("#scroll"); * </script> * ``` */ var VScroll = /** @__PURE__ @class */ (function (_super) { __extends$1(VScroll, _super); /** * Initializes a new instance of the VScroll class. * * @param {VScrollModel} options - Specifies VScroll model properties as options. * @param {string | HTMLElement} element - Specifies the element for which vertical scrolling applies. */ function VScroll(options, element) { return _super.call(this, options, element) || this; } /** * Initialize the event handler * * @private * @returns {void} */ VScroll.prototype.preRender = function () { this.browser = Browser.info.name; this.browserCheck = this.browser === 'mozilla'; this.isDevice = Browser.isDevice; this.customStep = true; var ele = this.element; this.ieCheck = this.browser === 'edge' || this.browser === 'msie'; this.initialize(); if (ele.id === '') { ele.id = getUniqueID('vscroll'); this.uniqueId = true; } ele.style.display = 'block'; if (this.enableRtl) { ele.classList.add(CLS_RTL$1); } }; /** * To Initialize the vertical scroll rendering * * @private * @returns {void} */ VScroll.prototype.render = function () { this.touchModule = new Touch(this.element, { scroll: this.touchHandler.bind(this), swipe: this.swipeHandler.bind(this) }); EventHandler.add(this.scrollEle, 'scroll', this.scrollEventHandler, this); if (!this.isDevice) { this.createNavIcon(this.element); } else { this.element.classList.add(CLS_DEVICE$1); this.createOverlayElement(this.element); } this.setScrollState(); EventHandler.add(this.element, 'wheel', this.wheelEventHandler, this); }; VScroll.prototype.setScrollState = function () { if (isNullOrUndefined(this.scrollStep) || this.scrollStep < 0) { this.scrollStep = this.scrollEle.offsetHeight; this.customStep = false; } else { this.customStep = true; } }; VScroll.prototype.initialize = function () { var scrollCnt = createElement('div', { className: CLS_VSCROLLCON }); var scrollBar = createElement('div', { className: CLS_VSCROLLBAR }); scrollBar.setAttribute('tabindex', '-1'); var ele = this.element; var innerEle = [].slice.call(ele.children); for (var _i = 0, innerEle_1 = innerEle; _i < innerEle_1.length; _i++) { var ele_1 = innerEle_1[_i]; scrollCnt.appendChild(ele_1); } scrollBar.appendChild(scrollCnt); ele.appendChild(scrollBar); scrollBar.style.overflow = 'hidden'; this.scrollEle = scrollBar; this.scrollItems = scrollCnt; }; VScroll.prototype.getPersistData = function () { var keyEntity = ['scrollStep']; return this.addOnPersist(keyEntity); }; /** * Returns the current module name. * * @returns {string} - It returns the current module name. * @private */ VScroll.prototype.getModuleName = function () { return 'vScroll'; }; /** * Removes the control from the DOM and also removes all its related events. * * @returns {void} */ VScroll.prototype.destroy = function () { var el = this.element; el.style.display = ''; removeClass([this.element], [CLS_ROOT$1, CLS_DEVICE$1, CLS_RTL$1]); var navs = selectAll('.e-' + el.id + '_nav.' + CLS_VSCROLLNAV, el); var overlays = selectAll('.' + CLS_OVERLAY$1, el); [].slice.call(overlays).forEach(function (ele) { detach(ele); }); for (var _i = 0, _a = [].slice.call(this.scrollItems.children); _i < _a.length; _i++) { var elem = _a[_i]; el.appendChild(elem); } if (this.uniqueId) { this.element.removeAttribute('id'); } detach(this.scrollEle); if (navs.length > 0) { detach(navs[0]); if (!isNullOrUndefined(navs[1])) { detach(navs[1]); } } EventHandler.remove(this.scrollEle, 'scroll', this.scrollEventHandler); this.touchModule.destroy(); this.touchModule = null; _super.prototype.destroy.call(this); }; /** * Specifies the value to disable/enable the VScroll component. * When set to `true` , the component will be disabled. * * @param {boolean} value - Based on this Boolean value, VScroll will be enabled (false) or disabled (true). * @returns {void}. */ VScroll.prototype.disable = function (value) { var navEle = selectAll('.e-scroll-nav:not(.' + CLS_DISABLE$1 + ')', this.element); if (value) { this.element.classList.add(CLS_DISABLE$1); } else { this.element.classList.remove(CLS_DISABLE$1); } [].slice.call(navEle).forEach(function (el) { el.setAttribute('tabindex', !value ? '0' : '-1'); }); }; VScroll.prototype.createOverlayElement = function (element) { var id = element.id.concat('_nav'); var downOverlayEle = createElement('div', { className: CLS_OVERLAY$1 + ' ' + CLS_DOWNOVERLAY }); var clsDown = 'e-' + element.id.concat('_nav ' + CLS_VSCROLLNAV + ' ' + CLS_VSCROLLNAVDOWN); var downEle = createElement('div', { id: id.concat('down'), className: clsDown }); var navItem = createElement('div', { className: CLS_NAVDOWNARROW + ' ' + CLS_NAVARROW$1 + ' e-icons' }); downEle.appendChild(navItem); var upEle = createElement('div', { className: CLS_OVERLAY$1 + ' ' + CLS_UPOVERLAY }); if (this.ieCheck) { downEle.classList.add('e-ie-align'); } element.appendChild(downOverlayEle); element.appendChild(downEle); element.insertBefore(upEle, element.firstChild); this.eventBinding([downEle]); }; VScroll.prototype.createNavIcon = function (element) { var id = element.id.concat('_nav'); var clsDown = 'e-' + element.id.concat('_nav ' + CLS_VSCROLLNAV + ' ' + CLS_VSCROLLNAVDOWN); var nav = createElement('div', { id: id.concat('_down'), className: clsDown }); nav.setAttribute('aria-disabled', 'false'); var navItem = createElement('div', { className: CLS_NAVDOWNARROW + ' ' + CLS_NAVARROW$1 + ' e-icons' }); var clsUp = 'e-' + element.id.concat('_nav ' + CLS_VSCROLLNAV + ' ' + CLS_VSCROLLNAVUP); var navElement = createElement('div', { id: id.concat('_up'), className: clsUp + ' ' + CLS_DISABLE$1 }); navElement.setAttribute('aria-disabled', 'true'); var navUpItem = createElement('div', { className: CLS_NAVUPARROW + ' ' + CLS_NAVARROW$1 + ' e-icons' }); navElement.appendChild(navUpItem); nav.appendChild(navItem); nav.setAttribute('tabindex', '0'); element.appendChild(nav); element.insertBefore(navElement, element.firstChild); if (this.ieCheck) { nav.classList.add('e-ie-align'); navElement.classList.add('e-ie-align'); } this.eventBinding([nav, navElement]); }; VScroll.prototype.onKeyPress = function (ev) { var _this = this; if (ev.key === 'Enter') { var timeoutFun_1 = function () { _this.keyTimeout = true; _this.eleScrolling(10, ev.target, true); }; this.keyTimer = window.setTimeout(function () { timeoutFun_1(); }, 100); } }; VScroll.prototype.onKeyUp = function (ev) { if (ev.key !== 'Enter') { return; } if (this.keyTimeout) { this.keyTimeout = false; } else { ev.target.click(); } clearTimeout(this.keyTimer); }; VScroll.prototype.eventBinding = function (element) { var _this = this; [].slice.call(element).forEach(function (ele) { new Touch(ele, { tapHold: _this.tabHoldHandler.bind(_this), tapHoldThreshold: 500 }); ele.addEventListener('keydown', _this.onKeyPress.bind(_this)); ele.addEventListener('keyup', _this.onKeyUp.bind(_this)); ele.addEventListener('mouseup', _this.repeatScroll.bind(_this)); ele.addEventListener('touchend', _this.repeatScroll.bind(_this)); ele.addEventListener('contextmenu', function (e) { e.preventDefault(); }); EventHandler.add(ele, 'click', _this.clickEventHandler, _this); }); }; VScroll.prototype.repeatScroll = function () { clearInterval(this.timeout); }; VScroll.prototype.tabHoldHandler = function (ev) { var _this = this; var trgt = ev.originalEvent.target; trgt = this.contains(trgt, CLS_VSCROLLNAV) ? trgt.firstElementChild : trgt; var scrollDistance = 10; var timeoutFun = function () { _this.eleScrolling(scrollDistance, trgt, true); }; this.timeout = window.setInterval(function () { timeoutFun(); }, 50); }; VScroll.prototype.contains = function (element, className) { return element.classList.contains(className); }; VScroll.prototype.eleScrolling = function (scrollDis, trgt, isContinuous) { var classList = trgt.classList; if (classList.contains(CLS_VSCROLLNAV)) { classList = trgt.querySelector('.' + CLS_NAVARROW$1).classList; } if (classList.contains(CLS_NAVDOWNARROW)) { this.frameScrollRequest(scrollDis, 'add', isContinuous); } else if (classList.contains(CLS_NAVUPARROW)) { this.frameScrollRequest(scrollDis, '', isContinuous); } }; VScroll.prototype.clickEventHandler = function (event) { this.eleScrolling(this.scrollStep, event.target, false); }; VScroll.prototype.wheelEventHandler = function (e) { e.preventDefault(); this.frameScrollRequest(this.scrollStep, (e.deltaY > 0 ? 'add' : ''), false); }; VScroll.prototype.swipeHandler = function (e) { var swipeElement = this.scrollEle; var distance; if (e.velocity <= 1) { distance = e.distanceY / (e.velocity * 10); } else { distance = e.distanceY / e.velocity; } var start = 0.5; var animate = function () { var step = Math.sin(start); if (step <= 0) { window.cancelAnimationFrame(step); } else { if (e.swipeDirection === 'Up') { swipeElement.scrollTop += distance * step; } else if (e.swipeDirection === 'Down') { swipeElement.scrollTop -= distance * step; } start -= 0.02; window.requestAnimationFrame(animate); } }; animate(); }; VScroll.prototype.scrollUpdating = function (scrollVal, action) { if (action === 'add') { this.scrollEle.scrollTop += scrollVal; } else { this.scrollEle.scrollTop -= scrollVal; } }; VScroll.prototype.frameScrollRequest = function (scrollValue, action, isContinuous) { var _this = this; var step = 10; if (isContinuous) { this.scrollUpdating(scrollValue, action); return; } if (!this.customStep) { [].slice.call(selectAll('.' + CLS_OVERLAY$1, this.element)).forEach(function (el) { scrollValue -= el.offsetHeight; }); } var animate = function () { if (scrollValue < step) { window.cancelAnimationFrame(step); } else { _this.scrollUpdating(step, action); scrollValue -= step; window.requestAnimationFrame(animate); } }; animate(); }; VScroll.prototype.touchHandler = function (e) { var el = this.scrollEle; var distance = e.distanceY; if (e.scrollDirection === 'Up') { el.scrollTop = el.scrollTop + distance; } else if (e.scrollDirection === 'Down') { el.scrollTop = el.scrollTop - distance; } }; VScroll.prototype.arrowDisabling = function (addDisableCls, removeDisableCls) { if (this.isDevice) { var arrowEle = isNullOrUndefined(addDisableCls) ? removeDisableCls : addDisableCls; var arrowIcon = arrowEle.querySelector('.' + CLS_NAVARROW$1); if (isNullOrUndefined(addDisableCls)) { classList(arrowIcon, [CLS_NAVDOWNARROW], [CLS_NAVUPARROW]); } else { classList(arrowIcon, [CLS_NAVUPARROW], [CLS_NAVDOWNARROW]); } } else { addDisableCls.classList.add(CLS_DISABLE$1); addDisableCls.setAttribute('aria-disabled', 'true'); addDisableCls.removeAttribute('tabindex'); removeDisableCls.classList.remove(CLS_DISABLE$1); removeDisableCls.setAttribute('aria-disabled', 'false'); removeDisableCls.setAttribute('tabindex', '0'); } this.repeatScroll(); }; VScroll.prototype.scrollEventHandler = function (e) { var target = e.target; var height = target.offsetHeight; var navUpEle = this.element.querySelector('.' + CLS_VSCROLLNAVUP); var navDownEle = this.element.querySelector('.' + CLS_VSCROLLNAVDOWN); var upOverlay = this.element.querySelector('.' + CLS_UPOVERLAY); var downOverlay = this.element.querySelector('.' + CLS_DOWNOVERLAY); var scrollTop = target.scrollTop; if (scrollTop <= 0) { scrollTop = -scrollTop; } if (this.isDevice) { if (scrollTop < OVERLAY_MAXWID$1) { upOverlay.style.height = scrollTop + 'px'; } else { upOverlay.style.height = '40px'; } if ((target.scrollHeight - Math.ceil(height + scrollTop)) < OVERLAY_MAXWID$1) { downOverlay.style.height = (target.scrollHeight - Math.ceil(height + scrollTop)) + 'px'; } else { downOverlay.style.height = '40px'; } } if (scrollTop === 0) { this.arrowDisabling(navUpEle, navDownEle); } else if (Math.ceil(height + scrollTop + .1) >= target.scrollHeight) { this.arrowDisabling(navDownEle, navUpEle); } else { var disEle = this.element.querySelector('.' + CLS_VSCROLLNAV + '.' + CLS_DISABLE$1); if (disEle) { disEle.classList.remove(CLS_DISABLE$1); disEle.setAttribute('aria-disabled', 'false'); disEle.setAttribute('tabindex', '0'); } } }; /** * Gets called when the model property changes.The data that describes the old and new values of property that changed. * * @param {VScrollModel} newProp - It contains the new value of data. * @param {VScrollModel} oldProp - It contains the old value of data. * @returns {void} * @private */ VScroll.prototype.onPropertyChanged = function (newProp, oldProp) { for (var _i = 0, _a = Object.keys(newProp); _i < _a.length; _i++) { var prop = _a[_i]; switch (prop) { case 'scrollStep': this.setScrollState(); break; case 'enableRtl': if (newProp.enableRtl) { this.element.classList.add(CLS_RTL$1); } else { this.element.classList.remove(CLS_RTL$1); } break; } } }; __decorate$1([ Property(null) ], VScroll.prototype, "scrollStep", void 0); VScroll = __decorate$1([ NotifyPropertyChanges ], VScroll); return VScroll; }(Component)); /** * Used to add scroll in menu. * * @param {createElementType} createElement - Specifies the create element model * @param {HTMLElement} container - Specifies the element container * @param {HTMLElement} content - Specifies the content element * @param {string} scrollType - Specifies the scroll type * @param {boolean} enableRtl - Specifies the enable RTL property * @param {boolean} offset - Specifies the offset value * @returns {HTMLElement} - Element * @hidden */ function addScrolling(createElement, container, content, scrollType, enableRtl, offset) { var containerOffset; var contentOffset; var parentElem = container.parentElement; if (scrollType === 'vscroll') { containerOffset = offset || container.getBoundingClientRect().height; contentOffset = content.getBoundingClientRect().height; } else { containerOffset = container.getBoundingClientRect().width; contentOffset = content.getBoundingClientRect().width; } if (containerOffset < contentOffset) { return createScrollbar(createElement, container, content, scrollType, enableRtl, offset); } else if (parentElem) { var width = parentElem.getBoundingClientRect().width; if (width < containerOffset && scrollType === 'hscroll') { contentOffset = width; container.style.maxWidth = width + 'px'; return createScrollbar(createElement, container, content, scrollType, enableRtl, offset); } return content; } else { return content; } } /** * Used to create scroll bar in menu. * * @param {createElementType} createElement - Specifies the create element model * @param {HTMLElement} container - Specifies the element container * @param {HTMLElement} content - Specifies the content element * @param {string} scrollType - Specifies the scroll type * @param {boolean} enableRtl - Specifies the enable RTL property * @param {boolean} offset - Specifies the offset value * @returns {HTMLElement} - Element * @hidden */ function createScrollbar(createElement, container, content, scrollType, enableRtl, offset) { var scrollEle = createElement('div', { className: 'e-menu-' + scrollType }); container.appendChild(scrollEle); scrollEle.appendChild(content); if (offset) { scrollEle.style.overflow = 'hidden'; scrollEle.style.height = offset + 'px'; } else { scrollEle.style.maxHeight = container.style.maxHeight; container.style.overflow = 'hidden'; } var scrollObj; if (scrollType === 'vscroll') { scrollObj = new VScroll({ enableRtl: enableRtl }, scrollEle); scrollObj.scrollStep = select('.e-' + scrollType + '-bar', container).offsetHeight / 2; } else { scrollObj = new HScroll({ enableRtl: enableRtl }, scrollEle); scrollObj.scrollStep = select('.e-' + scrollType + '-bar', container).offsetWidth; } return scrollEle; } /** * Used to destroy the scroll option. * * @param {VScroll | HScroll} scrollObj - Specifies the scroller object * @param {Element} element - Specifies the element * @param {HTMLElement} skipEle - Specifies the skip element * @returns {void} * @hidden */ function destroyScroll(scrollObj, element, skipEle) { if (scrollObj) { var menu = select('.e-menu-parent', element); if (menu) { if (!skipEle || skipEle === menu) { scrollObj.destroy(); element.parentElement.appendChild(menu); detach(element); } } else { scrollObj.destroy(); detach(element); } } } var __extends$2 = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __decorate$2 = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var ENTER = 'enter'; var ESCAPE = 'escape'; var FOCUSED = 'e-focused'; var HEADER = 'e-menu-header'; var SELECTED = 'e-selected'; var SEPARATOR = 'e-separator'; var UPARROW = 'uparrow'; var DOWNARROW = 'downarrow'; var LEFTARROW = 'leftarrow'; var RIGHTARROW = 'rightarrow'; var HOME = 'home'; var END = 'end'; var TAB = 'tab'; var CARET = 'e-caret'; var ITEM = 'e-menu-item'; var DISABLED = 'e-disabled'; var HIDE = 'e-menu-hide'; var ICONS = 'e-icons'; var RTL = 'e-rtl'; var POPUP = 'e-menu-popup'; var TEMPLATE_PROPERTY = 'Template'; /** * Configures the field options of the Menu. */ var FieldSettings = /** @__PURE__ @class */ (function (_super) { __extends$2(FieldSettings, _super); function FieldSettings() { return _super !== null && _super.apply(this, arguments) || this; } __decorate$2([ Property('id') ], FieldSettings.prototype, "itemId", void 0); __decorate$2([ Property('parentId') ], FieldSettings.prototype, "parentId", void 0); __decorate$2([ Property('text') ], FieldSettings.prototype, "text", void 0); __decorate$2([ Property('iconCss') ], FieldSettings.prototype, "iconCss", void 0); __decorate$2([ Property('url') ], FieldSettings.prototype, "url", void 0); __decorate$2([ Property('separator') ], FieldSettings.prototype, "separator", void 0); __decorate$2([ Property('items') ], FieldSettings.prototype, "children", void 0); return FieldSettings; }(ChildProperty)); /** * Specifies menu items. */ var MenuItem = /** @__PURE__ @class */ (function (_super) { __extends$2(MenuItem, _super); function MenuItem() { return _super !== null && _super.apply(this, arguments) || this; } __decorate$2([ Property(null) ], MenuItem.prototype, "iconCss", void 0); __decorate$2([ Property('') ], MenuItem.prototype, "id", void 0); __decorate$2([ Property(false) ], MenuItem.prototype, "separator", void 0); __decorate$2([ Collection([], MenuItem) ], MenuItem.prototype, "items", void 0); __decorate$2([ Property('') ], MenuItem.prototype, "text", void 0); __decorate$2([ Property('') ], MenuItem.prototype, "url", void 0); __decorate$2([ Property() ], MenuItem.prototype, "htmlAttributes", void 0); return MenuItem; }(ChildProperty)); /** * Animation configuration settings. */ var MenuAnimationSettings = /** @__PURE__ @class */ (function (_super) { __extends$2(MenuAnimationSettings, _super); function MenuAnimationSettings() { return _super !== null && _super.apply(this, arguments) || this; } __decorate$2([ Property('SlideDown') ], MenuAnimationSettings.prototype, "effect", void 0); __decorate$2([ Property(400) ], MenuAnimationSettings.prototype, "duration", void 0); __decorate$2([ Property('ease') ], MenuAnimationSettings.prototype, "easing", void 0); return MenuAnimationSettings; }(ChildProperty)); /** * Base class for Menu and ContextMenu components. * * @private */ var MenuBase = /** @__PURE__ @class */ (function (_super) { __extends$2(MenuBase, _super); /** * Constructor for creating the widget. * * @private * @param {MenuBaseModel} options - Specifies the menu base model * @param {string | HTMLUListElement} element - Specifies the element */ function MenuBase(options, element) { var _this = _super.call(this, options, element) || this; _this.navIdx = []; _this.animation = new Animation({}); _this.isTapHold = false; _this.tempItem = []; _this.showSubMenuOn = 'Auto'; _this.isAnimationNone = false; _this.isKBDAction = false; return _this; } /** * Initialized third party configuration settings. * * @private * @returns {void} */ MenuBase.prototype.preRender = function () { if (!this.isMenu) { var ul = void 0; if (this.element.tagName === 'EJS-CONTEXTMENU') { ul = this.createElement('ul', { id: getUniqueID(this.getModuleName()), className: 'e-control e-lib e-' + this.getModuleName() }); var ejInst = getValue('ej2_instances', this.element); removeClass([this.element], ['e-control', 'e-lib', 'e-' + this.getModuleName()]); this.clonedElement = this.element; this.element = ul; setValue('ej2_instances', ejInst, this.element); } else { ul = this.createElement('ul', { id: getUniqueID(this.getModuleName()) }); append([].slice.call(this.element.cloneNode(true).children), ul); var refEle = this.element.nextElementSibling; if (refEle) { this.element.parentElement.insertBefore(ul, refEle); } else { this.element.parentElement.appendChild(ul); } this.clonedElement = ul; } this.clonedElement.style.display = 'none'; } if (this.element.tagName === 'EJS-MENU') { var ele = this.element; var ejInstance = getValue('ej2_instances', ele); var ul = this.createElement('ul'); var wrapper = this.createElement('EJS-MENU', { className: 'e-' + this.getModuleName() + '-wrapper' }); for (var idx = 0, len = ele.attributes.length; idx < len; idx++) { ul.se