@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,217 lines • 59.2 kB
JavaScript
var __extends = (this && this.__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 = (this && this.__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;
};
/* eslint-disable @typescript-eslint/no-explicit-any */
import { Component, EventHandler, Property, Event, KeyboardEvents, rippleEffect, animationMode } from '@syncfusion/ej2-base';
import { getUniqueID, compile as templateCompiler } from '@syncfusion/ej2-base';
import { isVisible, closest, attributes, detach, select, addClass, removeClass, append } from '@syncfusion/ej2-base';
import { NotifyPropertyChanges, ChildProperty, Collection, Animation } from '@syncfusion/ej2-base';
import { setStyleAttribute as setStyle, Complex } from '@syncfusion/ej2-base';
import { isNullOrUndefined as isNOU, formatUnit, selectAll, SanitizeHtmlHelper, isRippleEnabled } from '@syncfusion/ej2-base';
var CLS_ACRDN_ROOT = 'e-acrdn-root';
var CLS_ROOT = 'e-accordion';
var CLS_ITEM = 'e-acrdn-item';
var CLS_ITEMFOCUS = 'e-item-focus';
var CLS_ITEMHIDE = 'e-hide';
var CLS_HEADER = 'e-acrdn-header';
var CLS_HEADERICN = 'e-acrdn-header-icon';
var CLS_HEADERCTN = 'e-acrdn-header-content';
var CLS_CONTENT = 'e-acrdn-panel';
var CLS_CTENT = 'e-acrdn-content';
var CLS_TOOGLEICN = 'e-toggle-icon';
var CLS_COLLAPSEICN = 'e-tgl-collapse-icon e-icons';
var CLS_EXPANDICN = 'e-expand-icon';
var CLS_RTL = 'e-rtl';
var CLS_CTNHIDE = 'e-content-hide';
var CLS_SLCT = 'e-select';
var CLS_SLCTED = 'e-selected';
var CLS_ACTIVE = 'e-active';
var CLS_ANIMATE = 'e-animate';
var CLS_DISABLE = 'e-overlay';
var CLS_TOGANIMATE = 'e-toggle-animation';
var CLS_NEST = 'e-nested';
var CLS_EXPANDSTATE = 'e-expand-state';
var CLS_CONTAINER = 'e-accordion-container';
/**
* Objects used for configuring the Accordion expanding item action properties.
*/
var AccordionActionSettings = /** @class */ (function (_super) {
__extends(AccordionActionSettings, _super);
function AccordionActionSettings() {
return _super !== null && _super.apply(this, arguments) || this;
}
__decorate([
Property('SlideDown')
], AccordionActionSettings.prototype, "effect", void 0);
__decorate([
Property(400)
], AccordionActionSettings.prototype, "duration", void 0);
__decorate([
Property('linear')
], AccordionActionSettings.prototype, "easing", void 0);
return AccordionActionSettings;
}(ChildProperty));
export { AccordionActionSettings };
/**
* Objects used for configuring the Accordion animation properties.
*/
var AccordionAnimationSettings = /** @class */ (function (_super) {
__extends(AccordionAnimationSettings, _super);
function AccordionAnimationSettings() {
return _super !== null && _super.apply(this, arguments) || this;
}
__decorate([
Complex({ effect: 'SlideUp', duration: 400, easing: 'linear' }, AccordionActionSettings)
], AccordionAnimationSettings.prototype, "collapse", void 0);
__decorate([
Complex({ effect: 'SlideDown', duration: 400, easing: 'linear' }, AccordionActionSettings)
], AccordionAnimationSettings.prototype, "expand", void 0);
return AccordionAnimationSettings;
}(ChildProperty));
export { AccordionAnimationSettings };
/**
* An item object that is used to configure Accordion items.
*/
var AccordionItem = /** @class */ (function (_super) {
__extends(AccordionItem, _super);
function AccordionItem() {
return _super !== null && _super.apply(this, arguments) || this;
}
__decorate([
Property(null)
], AccordionItem.prototype, "content", void 0);
__decorate([
Property(null)
], AccordionItem.prototype, "header", void 0);
__decorate([
Property(null)
], AccordionItem.prototype, "cssClass", void 0);
__decorate([
Property(null)
], AccordionItem.prototype, "iconCss", void 0);
__decorate([
Property(false)
], AccordionItem.prototype, "expanded", void 0);
__decorate([
Property(true)
], AccordionItem.prototype, "visible", void 0);
__decorate([
Property(false)
], AccordionItem.prototype, "disabled", void 0);
__decorate([
Property()
], AccordionItem.prototype, "id", void 0);
return AccordionItem;
}(ChildProperty));
export { AccordionItem };
/**
* The Accordion is a vertically collapsible content panel that displays one or more panels at a time within the available space.
* ```html
* <div id='accordion'/>
* <script>
* var accordionObj = new Accordion();
* accordionObj.appendTo('#accordion');
* </script>
* ```
*/
var Accordion = /** @class */ (function (_super) {
__extends(Accordion, _super);
/**
* Initializes a new instance of the Accordion class.
*
* @param {AccordionModel} options - Specifies Accordion model properties as options.
* @param {string | HTMLElement} element - Specifies the element that is rendered as an Accordion.
*/
function Accordion(options, element) {
var _this = _super.call(this, options, element) || this;
/**
* Contains the keyboard configuration of the Accordion.
*/
_this.keyConfigs = {
moveUp: 'uparrow',
moveDown: 'downarrow',
enter: 'enter',
space: 'space',
home: 'home',
end: 'end'
};
return _this;
}
/**
* Removes the control from the DOM and also removes all its related events.
*
* @returns {void}
*/
Accordion.prototype.destroy = function () {
if (this.isReact || this.isAngular || this.isVue) {
this.clearTemplate();
}
var ele = this.element;
_super.prototype.destroy.call(this);
this.unWireEvents();
this.isDestroy = true;
this.restoreContent(null);
[].slice.call(ele.children).forEach(function (el) {
ele.removeChild(el);
});
if (this.trgtEle) {
this.trgtEle = null;
while (this.ctrlTem.firstElementChild) {
ele.appendChild(this.ctrlTem.firstElementChild);
}
this.ctrlTem = null;
}
ele.classList.remove(CLS_ACRDN_ROOT);
ele.removeAttribute('style');
this.element.removeAttribute('data-ripple');
if (!this.isNested && isRippleEnabled) {
this.removeRippleEffect();
}
};
Accordion.prototype.preRender = function () {
var nested = closest(this.element, '.' + CLS_CONTENT);
this.isNested = false;
this.templateEle = [];
if (!this.isDestroy) {
this.isDestroy = false;
}
if (nested && nested.firstElementChild && nested.firstElementChild.firstElementChild) {
if (nested.firstElementChild.firstElementChild.classList.contains(CLS_ROOT)) {
nested.classList.add(CLS_NEST);
this.isNested = true;
}
}
else {
this.element.classList.add(CLS_ACRDN_ROOT);
}
if (this.enableRtl) {
this.add(this.element, CLS_RTL);
}
};
Accordion.prototype.add = function (ele, val) {
ele.classList.add(val);
};
Accordion.prototype.remove = function (ele, val) {
ele.classList.remove(val);
};
/**
* To initialize the control rendering
*
* @private
* @returns {void}
*/
Accordion.prototype.render = function () {
this.initializeHeaderTemplate();
this.initializeItemTemplate();
this.initialize();
this.renderControl();
this.wireEvents();
this.renderComplete();
};
Accordion.prototype.initialize = function () {
var width = formatUnit(this.width);
var height = formatUnit(this.height);
setStyle(this.element, { 'width': width, 'height': height });
if (isNOU(this.initExpand)) {
this.initExpand = [];
}
if (!isNOU(this.expandedIndices) && this.expandedIndices.length > 0) {
this.initExpand = this.expandedIndices;
}
};
Accordion.prototype.renderControl = function () {
this.trgtEle = (this.element.children.length > 0) ? select('div', this.element) : null;
this.renderItems();
this.initItemExpand();
};
Accordion.prototype.wireFocusEvents = function () {
var acrdItem = [].slice.call(this.element.querySelectorAll('.' + CLS_ITEM));
for (var _i = 0, acrdItem_1 = acrdItem; _i < acrdItem_1.length; _i++) {
var item = acrdItem_1[_i];
var headerEle = item.querySelector('.' + CLS_HEADER);
if (item.childElementCount > 0 && headerEle) {
EventHandler.clearEvents(headerEle);
EventHandler.add(headerEle, 'focus', this.focusIn, this);
EventHandler.add(headerEle, 'blur', this.focusOut, this);
}
}
};
Accordion.prototype.unWireEvents = function () {
EventHandler.remove(this.element, 'click', this.clickHandler);
if (!isNOU(this.keyModule)) {
this.keyModule.destroy();
}
};
Accordion.prototype.wireEvents = function () {
EventHandler.add(this.element, 'click', this.clickHandler, this);
if (!this.isNested && !this.isDestroy) {
this.removeRippleEffect = rippleEffect(this.element, { selector: '.' + CLS_HEADER });
}
if (!this.isNested) {
this.keyModule = new KeyboardEvents(this.element, {
keyAction: this.keyActionHandler.bind(this),
keyConfigs: this.keyConfigs,
eventName: 'keydown'
});
}
};
Accordion.prototype.templateParser = function (template) {
if (template) {
try {
if (typeof template !== 'function' && document.querySelectorAll(template).length) {
return templateCompiler(document.querySelector(template).innerHTML.trim());
}
else {
return templateCompiler(template);
}
}
catch (error) {
return templateCompiler(template);
}
}
return undefined;
};
Accordion.prototype.initializeHeaderTemplate = function () {
if (this.headerTemplate) {
this.headerTemplateFn = this.templateParser(this.headerTemplate);
}
};
Accordion.prototype.initializeItemTemplate = function () {
if (this.itemTemplate) {
this.itemTemplateFn = this.templateParser(this.itemTemplate);
}
};
Accordion.prototype.getHeaderTemplate = function () {
return this.headerTemplateFn;
};
Accordion.prototype.getItemTemplate = function () {
return this.itemTemplateFn;
};
Accordion.prototype.focusIn = function (e) {
e.target.parentElement.classList.add(CLS_ITEMFOCUS);
};
Accordion.prototype.focusOut = function (e) {
e.target.parentElement.classList.remove(CLS_ITEMFOCUS);
};
Accordion.prototype.ctrlTemplate = function () {
this.ctrlTem = this.element.cloneNode(true);
var innerEles;
var rootEle = select('.' + CLS_CONTAINER, this.element);
if (rootEle) {
innerEles = rootEle.children;
}
else {
innerEles = this.element.children;
}
var items = [];
[].slice.call(innerEles).forEach(function (el) {
items.push({
header: (el.childElementCount > 0 && el.children[0]) ? (el.children[0]) : '',
content: (el.childElementCount > 1 && el.children[1]) ? (el.children[1]) : ''
});
el.parentNode.removeChild(el);
});
if (rootEle) {
this.element.removeChild(rootEle);
}
this.setProperties({ items: items }, true);
};
Accordion.prototype.toggleIconGenerate = function () {
var tglIcon = this.createElement('div', { className: CLS_TOOGLEICN });
var hdrColIcon = this.createElement('span', { className: CLS_COLLAPSEICN });
tglIcon.appendChild(hdrColIcon);
return tglIcon;
};
Accordion.prototype.initItemExpand = function () {
var len = this.initExpand.length;
if (len === 0) {
return;
}
if (this.expandMode === 'Single') {
this.expandItem(true, this.initExpand[len - 1]);
}
else {
for (var i = 0; i < len; i++) {
this.expandItem(true, this.initExpand[parseInt(i.toString(), 10)]);
}
}
if (this.isReact) {
this.renderReactTemplates();
}
};
Accordion.prototype.renderItems = function () {
var _this = this;
var ele = this.element;
var innerItem;
var innerDataSourceItem;
if (!isNOU(this.trgtEle)) {
this.ctrlTemplate();
}
if (!isNOU(this.dataSource) && this.dataSource.length > 0) {
this.dataSource.forEach(function (item, index) {
innerDataSourceItem = _this.renderInnerItem(item, index);
ele.appendChild(innerDataSourceItem);
if (innerDataSourceItem.childElementCount > 0) {
EventHandler.add(innerDataSourceItem.querySelector('.' + CLS_HEADER), 'focus', _this.focusIn, _this);
EventHandler.add(innerDataSourceItem.querySelector('.' + CLS_HEADER), 'blur', _this.focusOut, _this);
}
});
}
else {
var items = this.items;
if (ele && items.length > 0) {
items.forEach(function (item, index) {
innerItem = _this.renderInnerItem(item, index);
ele.appendChild(innerItem);
if (innerItem.childElementCount > 0) {
EventHandler.add(innerItem.querySelector('.' + CLS_HEADER), 'focus', _this.focusIn, _this);
EventHandler.add(innerItem.querySelector('.' + CLS_HEADER), 'blur', _this.focusOut, _this);
}
});
}
}
if (this.isReact) {
this.renderReactTemplates();
}
};
Accordion.prototype.clickHandler = function (e) {
var trgt = e.target;
var items = this.getItems();
var eventArgs = {};
var tglIcon;
var acrdEle = closest(trgt, '.' + CLS_ROOT);
if (acrdEle !== this.element) {
return;
}
trgt.classList.add('e-target');
var acrdnItem = closest(trgt, '.' + CLS_ITEM);
var acrdnHdr = closest(trgt, '.' + CLS_HEADER);
var acrdnCtn = closest(trgt, '.' + CLS_CONTENT);
if (acrdnItem && (isNOU(acrdnHdr) || isNOU(acrdnCtn))) {
acrdnHdr = acrdnItem.children[0];
acrdnCtn = acrdnItem.children[1];
}
if (acrdnHdr) {
tglIcon = select('.' + CLS_TOOGLEICN, acrdnHdr);
}
var acrdnCtnItem;
if (acrdnHdr) {
acrdnCtnItem = closest(acrdnHdr, '.' + CLS_ITEM);
}
else if (acrdnCtn) {
acrdnCtnItem = closest(acrdnCtn, '.' + CLS_ITEM);
}
var index = this.getIndexByItem(acrdnItem);
if (acrdnCtnItem) {
eventArgs.item = items[this.getIndexByItem(acrdnCtnItem)];
}
eventArgs.originalEvent = e;
var ctnCheck = !isNOU(tglIcon) && acrdnItem.childElementCount <= 1;
if (ctnCheck && (isNOU(acrdnCtn) || !isNOU(select('.' + CLS_HEADER + ' .' + CLS_TOOGLEICN, acrdnCtnItem)))) {
acrdnItem.appendChild(this.contentRendering(index));
this.ariaAttrUpdate(acrdnItem);
this.afterContentRender(trgt, eventArgs, acrdnItem, acrdnHdr, acrdnCtn, acrdnCtnItem);
}
else {
this.afterContentRender(trgt, eventArgs, acrdnItem, acrdnHdr, acrdnCtn, acrdnCtnItem);
}
if (this.isReact) {
this.renderReactTemplates();
}
};
Accordion.prototype.afterContentRender = function (trgt, eventArgs, acrdnItem, acrdnHdr, acrdnCtn, acrdnCtnItem) {
var _this = this;
var acrdActive = [];
this.trigger('clicked', eventArgs, function (eventArgs) {
if (eventArgs.cancel) {
return;
}
var cntclkCheck = (acrdnCtn && !isNOU(select('.e-target', acrdnCtn)));
var inlineAcrdnSel = '.' + CLS_CONTENT + ' .' + CLS_ROOT;
var inlineEleAcrdn = acrdnCtn && !isNOU(select('.' + CLS_ROOT, acrdnCtn)) && isNOU(closest(trgt, inlineAcrdnSel));
var nestContCheck = acrdnCtn && isNOU(select('.' + CLS_ROOT, acrdnCtn)) || !(closest(trgt, '.' + CLS_ROOT) === _this.element);
cntclkCheck = cntclkCheck && (inlineEleAcrdn || nestContCheck);
trgt.classList.remove('e-target');
if (trgt.classList.contains(CLS_CONTENT) || trgt.classList.contains(CLS_CTENT) || cntclkCheck) {
return;
}
var acrdcontainer = _this.element.querySelector('.' + CLS_CONTAINER);
var acrdnchild = (acrdcontainer) ? acrdcontainer.children : _this.element.children;
[].slice.call(acrdnchild).forEach(function (el) {
if (el.classList.contains(CLS_ACTIVE)) {
acrdActive.push(el);
}
});
var acrdAniEle = [].slice.call(_this.element.querySelectorAll('.' + CLS_ITEM + ' [' + CLS_ANIMATE + ']'));
if (acrdAniEle.length > 0) {
for (var _i = 0, acrdAniEle_1 = acrdAniEle; _i < acrdAniEle_1.length; _i++) {
var el = acrdAniEle_1[_i];
acrdActive.push(el.parentElement);
}
}
var sameContentCheck = acrdActive.indexOf(acrdnCtnItem) !== -1 && acrdnCtn.getAttribute('e-animate') === 'true';
var sameHeader = false;
if (!isNOU(acrdnItem) && !isNOU(acrdnHdr)) {
var acrdnCtn_1 = select('.' + CLS_CONTENT, acrdnItem);
var acrdnRoot = closest(acrdnItem, '.' + CLS_ACRDN_ROOT);
var expandState = acrdnRoot.querySelector('.' + CLS_EXPANDSTATE);
if (isNOU(acrdnCtn_1)) {
return;
}
sameHeader = (expandState === acrdnItem);
if (isVisible(acrdnCtn_1) && (!sameContentCheck || acrdnCtnItem.classList.contains(CLS_SLCTED))) {
_this.collapse(acrdnCtn_1);
}
else {
if ((acrdActive.length > 0) && _this.expandMode === 'Single' && !sameContentCheck) {
acrdActive.forEach(function (el) {
_this.collapse(select('.' + CLS_CONTENT, el));
el.classList.remove(CLS_EXPANDSTATE);
});
}
_this.expand(acrdnCtn_1);
}
if (!isNOU(expandState) && !sameHeader) {
expandState.classList.remove(CLS_EXPANDSTATE);
}
}
});
};
Accordion.prototype.eleMoveFocus = function (action, root, trgt) {
var clst;
var clstItem = closest(trgt, '.' + CLS_ITEM);
if (trgt === root) {
clst = ((action === 'moveUp' ? trgt.lastElementChild : trgt).querySelector('.' + CLS_HEADER));
}
else if (trgt.classList.contains(CLS_HEADER)) {
clstItem = (action === 'moveUp' ? clstItem.previousElementSibling : clstItem.nextElementSibling);
if (clstItem) {
clst = select('.' + CLS_HEADER, clstItem);
}
}
if (clst) {
clst.focus();
}
};
Accordion.prototype.keyActionHandler = function (e) {
var trgt = e.target;
var header = closest(e.target, CLS_HEADER);
if (isNOU(header) && !trgt.classList.contains(CLS_ROOT) && !trgt.classList.contains(CLS_HEADER)) {
return;
}
var clst;
var root = this.element;
var content;
switch (e.action) {
case 'moveUp':
this.eleMoveFocus(e.action, root, trgt);
break;
case 'moveDown':
this.eleMoveFocus(e.action, root, trgt);
break;
case 'space':
case 'enter':
content = trgt.nextElementSibling;
if (!isNOU(content) && content.classList.contains(CLS_CONTENT)) {
if (content.getAttribute('e-animate') !== 'true') {
trgt.click();
}
}
else {
trgt.click();
}
e.preventDefault();
break;
case 'home':
case 'end':
clst = e.action === 'home' ? root.firstElementChild.children[0] : root.lastElementChild.children[0];
clst.focus();
e.preventDefault();
break;
}
};
Accordion.prototype.headerEleGenerate = function () {
var header = this.createElement('div', { className: CLS_HEADER, id: getUniqueID('acrdn_header') });
var ariaAttr = {
'tabindex': '0', 'role': 'button', 'aria-disabled': 'false', 'aria-expanded': 'false'
};
attributes(header, ariaAttr);
return header;
};
Accordion.prototype.renderInnerItem = function (item, index) {
var innerEle = this.createElement('div', {
className: CLS_ITEM, id: item.id || getUniqueID('acrdn_item')
});
if (this.headerTemplate) {
var ctnEle = this.headerEleGenerate();
var hdrEle = this.createElement('div', { className: CLS_HEADERCTN });
ctnEle.appendChild(hdrEle);
append(this.getHeaderTemplate()(item, this, 'headerTemplate', this.element.id + '_headerTemplate', false), hdrEle);
innerEle.appendChild(ctnEle);
ctnEle.appendChild(this.toggleIconGenerate());
this.add(innerEle, CLS_SLCT);
return innerEle;
}
if (item.header && this.angularnativeCondiCheck(item, 'header')) {
var header = item.header;
if (this.enableHtmlSanitizer && typeof (item.header) === 'string') {
header = SanitizeHtmlHelper.sanitize(item.header);
}
var ctnEle = this.headerEleGenerate();
var hdrEle = this.createElement('div', { className: CLS_HEADERCTN });
ctnEle.appendChild(hdrEle);
ctnEle.appendChild(this.fetchElement(hdrEle, header, index));
innerEle.appendChild(ctnEle);
}
var hdr = select('.' + CLS_HEADER, innerEle);
if (item.expanded && !isNOU(index) && (!this.enablePersistence)) {
if (this.initExpand.indexOf(index) === -1) {
this.initExpand.push(index);
}
}
if (item.cssClass) {
addClass([innerEle], item.cssClass.split(' '));
}
if (item.disabled) {
addClass([innerEle], CLS_DISABLE);
}
if (item.visible === false) {
addClass([innerEle], CLS_ITEMHIDE);
}
if (item.iconCss) {
var hdrIcnEle = this.createElement('div', { className: CLS_HEADERICN });
var icon = this.createElement('span', { className: item.iconCss + ' e-icons' });
hdrIcnEle.appendChild(icon);
if (isNOU(hdr)) {
hdr = this.headerEleGenerate();
hdr.appendChild(hdrIcnEle);
innerEle.appendChild(hdr);
}
else {
hdr.insertBefore(hdrIcnEle, hdr.childNodes[0]);
}
}
if (item.content && this.angularnativeCondiCheck(item, 'content')) {
var hdrIcon = this.toggleIconGenerate();
if (isNOU(hdr)) {
hdr = this.headerEleGenerate();
innerEle.appendChild(hdr);
}
hdr.appendChild(hdrIcon);
this.add(innerEle, CLS_SLCT);
}
return innerEle;
};
Accordion.prototype.angularnativeCondiCheck = function (item, prop) {
var property = prop === 'content' ? item.content : item.header;
var content = property;
if (this.isAngular && !isNOU(content.elementRef)) {
var data = content.elementRef.nativeElement.data;
if (isNOU(data) || data === '' || (data.indexOf('bindings=') === -1)) {
return true;
}
var parseddata = JSON.parse(content.elementRef.nativeElement.data.replace('bindings=', ''));
if (!isNOU(parseddata) && parseddata['ng-reflect-ng-if'] === 'false') {
return false;
}
else {
return true;
}
}
else {
return true;
}
};
Accordion.prototype.fetchElement = function (ele, value, index) {
var templateFn;
var temString;
try {
if (document.querySelectorAll(value).length && value !== 'Button') {
var eleVal = document.querySelector(value);
temString = eleVal.outerHTML.trim();
ele.appendChild(eleVal);
eleVal.style.display = '';
}
else {
templateFn = templateCompiler(value);
}
}
catch (e) {
if (typeof (value) === 'string') {
ele.innerHTML = this.enableHtmlSanitizer ? SanitizeHtmlHelper.sanitize(value) : value;
}
else if (value instanceof (HTMLElement)) {
ele.appendChild(value);
if (this.trgtEle) {
ele.firstElementChild.style.display = '';
}
}
else {
templateFn = templateCompiler(value);
}
}
var tempArray;
if (!isNOU(templateFn)) {
if (this.isReact) {
this.renderReactTemplates();
}
var templateProps = void 0;
var templateName = void 0;
if (ele.classList.contains(CLS_HEADERCTN)) {
templateProps = this.element.id + index + '_header';
templateName = 'header';
}
else if (ele.classList.contains(CLS_CTENT)) {
templateProps = this.element.id + index + '_content';
templateName = 'content';
}
tempArray = templateFn({}, this, templateName, templateProps, this.isStringTemplate);
}
if (!isNOU(tempArray) && tempArray.length > 0 && !(isNOU(tempArray[0].tagName) && tempArray.length === 1)) {
[].slice.call(tempArray).forEach(function (el) {
if (!isNOU(el.tagName)) {
el.style.display = '';
}
ele.appendChild(el);
});
}
else if (ele.childElementCount === 0) {
ele.innerHTML = this.enableHtmlSanitizer ? SanitizeHtmlHelper.sanitize(value) : value;
}
if (!isNOU(temString)) {
if (this.templateEle.indexOf(value) === -1) {
this.templateEle.push(value);
}
}
return ele;
};
Accordion.prototype.ariaAttrUpdate = function (itemEle) {
var header = select('.' + CLS_HEADER, itemEle);
var content = select('.' + CLS_CONTENT, itemEle);
header.setAttribute('aria-controls', content.id);
content.setAttribute('aria-labelledby', header.id);
content.setAttribute('role', 'region');
};
Accordion.prototype.contentRendering = function (index) {
var itemcnt = this.createElement('div', { className: CLS_CONTENT + ' ' + CLS_CTNHIDE, id: getUniqueID('acrdn_panel') });
attributes(itemcnt, { 'aria-hidden': 'true' });
var ctn = this.createElement('div', { className: CLS_CTENT });
if (!isNOU(this.dataSource) && this.dataSource.length > 0) {
if (this.isReact) {
this.renderReactTemplates();
}
append(this.getItemTemplate()(this.dataSource[parseInt(index.toString(), 10)], this, 'itemTemplate', this.element.id + '_itemTemplate', false), ctn);
itemcnt.appendChild(ctn);
}
else {
var content = this.items[parseInt(index.toString(), 10)].content;
if (this.enableHtmlSanitizer && typeof (content) === 'string') {
content = SanitizeHtmlHelper.sanitize(content);
}
itemcnt.appendChild(this.fetchElement(ctn, content, index));
}
return itemcnt;
};
Accordion.prototype.expand = function (trgt) {
var _this = this;
var items = this.getItems();
var trgtItemEle = closest(trgt, '.' + CLS_ITEM);
if (isNOU(trgt) || (isVisible(trgt) && trgt.getAttribute('e-animate') !== 'true') || trgtItemEle.classList.contains(CLS_DISABLE)) {
return;
}
var acrdnRoot = closest(trgtItemEle, '.' + CLS_ACRDN_ROOT);
var expandState = acrdnRoot.querySelector('.' + CLS_EXPANDSTATE);
var animation = {
name: this.animation.expand.effect,
duration: this.animation.expand.duration,
timingFunction: this.animation.expand.easing
};
var icon = select('.' + CLS_TOOGLEICN, trgtItemEle).firstElementChild;
var eventArgs = {
element: trgtItemEle,
item: items[this.getIndexByItem(trgtItemEle)],
index: this.getIndexByItem(trgtItemEle),
content: trgtItemEle.querySelector('.' + CLS_CONTENT),
isExpanded: true
};
this.trigger('expanding', eventArgs, function (expandArgs) {
if (!expandArgs.cancel) {
icon.classList.add(CLS_TOGANIMATE);
_this.expandedItemsPush(trgtItemEle);
if (!isNOU(expandState)) {
expandState.classList.remove(CLS_EXPANDSTATE);
}
trgtItemEle.classList.add(CLS_EXPANDSTATE);
if ((animation.name === 'None' && animationMode !== 'Enable') || (animationMode === 'Disable')) {
_this.expandProgress('begin', icon, trgt, trgtItemEle, expandArgs);
_this.expandProgress('end', icon, trgt, trgtItemEle, expandArgs);
}
else {
_this.expandAnimation(animation.name, icon, trgt, trgtItemEle, animation, expandArgs);
}
}
});
};
Accordion.prototype.expandAnimation = function (ef, icn, trgt, trgtItemEle, animate, args) {
var _this = this;
if (ef === 'None' && animationMode === 'Enable') {
ef = 'SlideDown';
animate.name = 'SlideDown';
}
var height;
this.lastActiveItemId = trgtItemEle.id;
if (ef === 'SlideDown') {
animate.begin = function () {
_this.expandProgress('begin', icn, trgt, trgtItemEle, args);
trgt.style.position = 'absolute';
height = trgtItemEle.offsetHeight;
trgt.style.maxHeight = (trgt.offsetHeight) + 'px';
trgtItemEle.style.maxHeight = '';
};
animate.progress = function () {
trgtItemEle.style.minHeight = (height + trgt.offsetHeight) + 'px';
};
animate.end = function () {
setStyle(trgt, { 'position': '', 'maxHeight': '' });
trgtItemEle.style.minHeight = '';
_this.expandProgress('end', icn, trgt, trgtItemEle, args);
};
}
else {
animate.begin = function () {
_this.expandProgress('begin', icn, trgt, trgtItemEle, args);
};
animate.end = function () {
_this.expandProgress('end', icn, trgt, trgtItemEle, args);
};
}
new Animation(animate).animate(trgt);
};
Accordion.prototype.expandProgress = function (progress, icon, trgt, trgtItemEle, eventArgs) {
this.remove(trgt, CLS_CTNHIDE);
this.add(trgtItemEle, CLS_SLCTED);
this.add(icon, CLS_EXPANDICN);
if (progress === 'end') {
this.add(trgtItemEle, CLS_ACTIVE);
trgt.setAttribute('aria-hidden', 'false');
attributes(trgt.previousElementSibling, { 'aria-expanded': 'true' });
icon.classList.remove(CLS_TOGANIMATE);
this.trigger('expanded', eventArgs);
}
};
Accordion.prototype.expandedItemsPush = function (item) {
var index = this.getIndexByItem(item);
if (this.expandedIndices.indexOf(index) === -1) {
var temp = [].slice.call(this.expandedIndices);
temp.push(index);
this.setProperties({ expandedIndices: temp }, true);
}
};
Accordion.prototype.getIndexByItem = function (item) {
var itemEle = this.getItemElements();
return [].slice.call(itemEle).indexOf(item);
};
Accordion.prototype.getItemElements = function () {
var itemEle = [];
var itemCollection = this.element.children;
[].slice.call(itemCollection).forEach(function (el) {
if (el.classList.contains(CLS_ITEM)) {
itemEle.push(el);
}
});
return itemEle;
};
Accordion.prototype.expandedItemsPop = function (item) {
var index = this.getIndexByItem(item);
var temp = [].slice.call(this.expandedIndices);
temp.splice(temp.indexOf(index), 1);
this.setProperties({ expandedIndices: temp }, true);
};
Accordion.prototype.collapse = function (trgt) {
var _this = this;
if (isNOU(trgt)) {
return;
}
var items = this.getItems();
var trgtItemEle = closest(trgt, '.' + CLS_ITEM);
if (!isVisible(trgt) || trgtItemEle.classList.contains(CLS_DISABLE)) {
return;
}
var animation = {
name: this.animation.collapse.effect,
duration: this.animation.collapse.duration,
timingFunction: this.animation.collapse.easing
};
var icon = select('.' + CLS_TOOGLEICN, trgtItemEle).firstElementChild;
var eventArgs = {
element: trgtItemEle,
item: items[this.getIndexByItem(trgtItemEle)],
index: this.getIndexByItem(trgtItemEle),
content: trgtItemEle.querySelector('.' + CLS_CONTENT),
isExpanded: false
};
this.trigger('expanding', eventArgs, function (expandArgs) {
if (!expandArgs.cancel) {
_this.expandedItemsPop(trgtItemEle);
trgtItemEle.classList.remove(CLS_EXPANDSTATE);
icon.classList.add(CLS_TOGANIMATE);
if ((animation.name === 'None' && animationMode !== 'Enable') || (animationMode === 'Disable')) {
_this.collapseProgress('begin', icon, trgt, trgtItemEle, expandArgs);
_this.collapseProgress('end', icon, trgt, trgtItemEle, expandArgs);
}
else {
_this.collapseAnimation(animation.name, trgt, trgtItemEle, icon, animation, expandArgs);
}
}
});
};
Accordion.prototype.collapseAnimation = function (ef, trgt, trgtItEl, icn, animate, args) {
var _this = this;
if (ef === 'None' && animationMode === 'Enable') {
ef = 'SlideUp';
animate.name = 'SlideUp';
}
var height;
var trgtHeight;
var itemHeight;
var remain;
this.lastActiveItemId = trgtItEl.id;
if (ef === 'SlideUp') {
animate.begin = function () {
itemHeight = trgtItEl.offsetHeight;
trgtItEl.style.minHeight = itemHeight + 'px';
trgt.style.position = 'absolute';
height = trgtItEl.offsetHeight;
trgtHeight = trgt.offsetHeight;
trgt.style.maxHeight = trgtHeight + 'px';
_this.collapseProgress('begin', icn, trgt, trgtItEl, args);
};
animate.progress = function () {
remain = ((height - (trgtHeight - trgt.offsetHeight)));
if (remain < itemHeight) {
trgtItEl.style.minHeight = remain + 'px';
}
};
animate.end = function () {
trgt.style.display = 'none';
_this.collapseProgress('end', icn, trgt, trgtItEl, args);
trgtItEl.style.minHeight = '';
setStyle(trgt, { 'position': '', 'maxHeight': '', 'display': '' });
};
}
else {
animate.begin = function () {
_this.collapseProgress('begin', icn, trgt, trgtItEl, args);
};
animate.end = function () {
_this.collapseProgress('end', icn, trgt, trgtItEl, args);
};
}
new Animation(animate).animate(trgt);
};
Accordion.prototype.collapseProgress = function (progress, icon, trgt, trgtItemEle, eventArgs) {
this.remove(icon, CLS_EXPANDICN);
this.remove(trgtItemEle, CLS_SLCTED);
if (progress === 'end') {
this.add(trgt, CLS_CTNHIDE);
icon.classList.remove(CLS_TOGANIMATE);
this.remove(trgtItemEle, CLS_ACTIVE);
trgt.setAttribute('aria-hidden', 'true');
attributes(trgt.previousElementSibling, { 'aria-expanded': 'false' });
this.trigger('expanded', eventArgs);
}
};
/**
* Returns the current module name.
*
* @returns {string} - It returns the current module name.
* @private
*/
Accordion.prototype.getModuleName = function () {
return 'accordion';
};
Accordion.prototype.getItems = function () {
var items;
if (this.itemTemplate && this.headerTemplate) {
items = this.dataSource;
}
else {
items = this.items;
}
return items;
};
/**
* Adds new item to the Accordion with the specified index of the Accordion.
*
* @param {AccordionItemModel | AccordionItemModel[] | Object | Object[]} item - Item array that is to be added to the Accordion.
* @param {number} index - Number value that determines where the item should be added.
* By default, item is added at the last index if the index is not specified.
* @returns {void}
*/
Accordion.prototype.addItem = function (item, index) {
var _this = this;
var ele = this.element;
var itemEle = this.getItemElements();
var items = this.getItems();
if (isNOU(index)) {
index = items.length;
}
if (ele.childElementCount >= index) {
var addItems = (item instanceof Array) ? item : [item];
addItems.forEach(function (addItem, i) {
var itemIndex = index + i;
items.splice(itemIndex, 0, addItem);
var innerItemEle = _this.renderInnerItem(addItem, itemIndex);
if (ele.childElementCount === itemIndex) {
ele.appendChild(innerItemEle);
}
else {
ele.insertBefore(innerItemEle, itemEle[parseInt(itemIndex.toString(), 10)]);
}
EventHandler.add(innerItemEle.querySelector('.' + CLS_HEADER), 'focus', _this.focusIn, _this);
EventHandler.add(innerItemEle.querySelector('.' + CLS_HEADER), 'blur', _this.focusOut, _this);
_this.expandedIndices = [];
_this.expandedItemRefresh();
if (addItem && addItem.expanded) {
_this.expandItem(true, itemIndex);
}
});
}
if (this.isReact) {
this.renderReactTemplates();
}
};
Accordion.prototype.expandedItemRefresh = function () {
var _this = this;
var itemEle = this.getItemElements();
[].slice.call(itemEle).forEach(function (el) {
if (el.classList.contains(CLS_SLCTED)) {
_this.expandedItemsPush(el);
}
});
};
/**
* Dynamically removes item from Accordion.
*
* @param {number} index - Number value that determines which item should be removed.
* @returns {void}.
*/
Accordion.prototype.removeItem = function (index) {
if (this.isReact || this.isAngular) {
var item = selectAll('.' + CLS_ITEM, this.element)[parseInt(index.toString(), 10)];
var header = select('.' + CLS_HEADERCTN, item);
var content = select('.' + CLS_CTENT, item);
this.clearAccordionTemplate(header, this.dataSource.length > 0 ? 'headerTemplate' : 'header', CLS_HEADERCTN);
this.clearAccordionTemplate(content, this.dataSource.length > 0 ? 'itemTemplate' : 'content', CLS_CTENT);
}
var itemEle = this.getItemElements();
var ele = itemEle[parseInt(index.toString(), 10)];
var items = this.getItems();
if (isNOU(ele)) {
return;
}
this.restoreContent(index);
detach(ele);
items.splice(index, 1);
this.expandedIndices = [];
this.expandedItemRefresh();
};
/**
* Sets focus to the specified index item header in Accordion.
*
* @param {number} index - Number value that determines which item should be focused.
* @returns {void}.
*/
Accordion.prototype.select = function (index) {
var itemEle = this.getItemElements();
var ele = itemEle[parseInt(index.toString(), 10)];
if (isNOU(ele) || isNOU(select('.' + CLS_HEADER, ele))) {
return;
}
ele.children[0].focus();
};
/**
* Shows or hides the specified item from Accordion.
*
* @param {number} index - Number value that determines which item should be hidden/shown.
* @param {boolean} isHidden - Boolean value that determines the action either hide (true) or show (false). Default value is false.
* If the `isHidden` value is false, the item is shown or else item it is hidden.
* @returns {void}.
*/
Accordion.prototype.hideItem = function (index, isHidden) {
var itemEle = this.getItemElements();
var ele = itemEle[parseInt(index.toString(), 10)];
if (isNOU(ele)) {
return;
}
if (isNOU(isHidden)) {
isHidden = true;
}
if (isHidden) {
this.add(ele, CLS_ITEMHIDE);
}
else {
this.remove(ele, CLS_ITEMHIDE);
}
};
/**
* Enables/Disables the specified Accordion item.
*
* @param {number} index - Number value that determines which item should be enabled/disabled.
* @param {boolean} isEnable - Boolean value that determines the action as enable (true) or disable (false).
* If the `isEnable` value is true, the item is enabled or else it is disabled.
* @returns {void}.
*/
Accordion.prototype.enableItem = function (index, isEnable) {
var itemEle = this.getItemElements();
var ele = itemEle[parseInt(index.toString(), 10)];
if (isNOU(ele)) {
return;
}
var eleHeader = ele.firstElementChild;
if (isEnable) {
this.remove(ele, CLS_DISABLE);
attributes(eleHeader, { 'tabindex': '0', 'aria-disabled': 'false' });
eleHeader.focus();
}
else {
if (ele.classList.contains(CLS_ACTIVE)) {
this.expandItem(false, index);
this.eleMoveFocus('movedown', this.element, eleHeader);
}
this.add(ele, CLS_DISABLE);
eleHeader.setAttribute('aria-disabled', 'true');
eleHeader.removeAttribute('tabindex');
}
};
/**
* Expands/Collapses the specified Accordion item.
*
* @param {boolean} isExpand - Boolean value that determines the action as expand or collapse.
* @param {number} index - Number value that determines which item should be expanded/collapsed.`index` is optional parameter.
* Without Specifying index, based on the `isExpand` value all Accordion item can be expanded or collapsed.
* @returns {void}.
*/
Accordion.prototype.expandItem = function (isExpand, index) {
var _this = this;
var itemEle = this.getItemElements();
if (isNOU(index)) {
if (this.expandMode === 'Single' && isExpand) {
var ele = itemEle[itemEle.length - 1];
this.itemExpand(isExpand, ele, this.getIndexByItem(ele));
}
else {
var item = select('#' + this.lastActiveItemId, this.element);
[].slice.call(itemEle).forEach(function (el) {
_this.itemExpand(isExpand, el, _this.getIndexByItem(el));
el.classList.remove(CLS_EXPANDSTATE);
});
var expandedItem = select('.' + CLS_EXPANDSTATE, this.element);
if (expandedItem) {
expandedItem.classList.remove(CLS_EXPANDSTATE);
}
if (item) {
item.classList.add(CLS_EXPANDSTATE);
}
}
}
else {
var ele = itemEle[parseInt(index.toString(), 10)];
if (isNOU(ele) || !ele.classList.contains(CLS_SLCT) || (ele.classList.contains(CLS_ACTIVE) && isExpand)) {
return;
}
else {
if (this.expandMode === 'Single') {
this.expandItem(false);
}
this.itemExpand(isExpand, ele, index);
}
}
};
Accordion.prototype.itemExpand = function (isExpand, ele, index) {
var ctn = ele.children[1];
if (ele.classList.contains(CLS_DISABLE)) {
return;
}
if (isNOU(ctn) && isExpand) {
ctn = this.contentRendering(index);
ele.appendChild(ctn);
this.ariaAttrUpdate(ele);
this.expand(ctn);
}
else if (!isNOU(ctn)) {
if (isExpand) {
this.expand(ctn);
}
else {
this.collapse(ctn);
}
}
if (this.isReact) {
this.renderReactTemplates();
}
};
Accordion.prototype.destroyItems = function () {
this.restoreContent(null);
if (this.isReact || this.isAngular || this.isVue) {
this.clearTemplate();
}
[].slice.call(this.element.querySelectorAll('.' + CLS_ITEM)).forEach(function (el) {
detach(el);
});
};
Accordion.prototype.restoreContent = function (index) {
var ctnElePos;
if (isNOU(index)) {
ctnElePos = this.element;
}
else {
ctnElePos = this.element.querySelectorAll('.' + CLS_ITEM)[parseInt(index.toString(), 10)];
}
this.templateEle.forEach(function (eleStr) {
if (!isNOU(ctnElePos.querySelector(eleStr))) {
document.body.appendChild(ctnElePos.querySelector(eleStr)).style.display = 'none';
}
});
};
Accordion.prototype.updateItem = function (item, index) {
if (!isNOU(item)) {
var items = this.getItems();
var itemObj = items[parseInt(index.toString(), 10)];
items.splice(index, 1);
this.restoreContent(index);
var header = select('.' + CLS_HEADERCTN, item);
var content = select('.' + CLS_CTENT, item);
if (this.isReact || this.isAngular) {
this.clearAccordionTemplate(header, 'header', CLS_HEADERCTN);
this.clearAccordionTemplate(content, 'content', CLS_CTENT);
}
detach(item);
this.addItem(itemObj, index);
}
};
Accordion.prototype.setTemplate = function (template, toElement, index) {
this.fetchElement(toElement, template, index);
if (this.isReact) {
this.renderReactTemplates();
}
};
Accordion.prototype.clearAccordionTemplate = function (templateEle, templateName, className) {
if (this.registeredTemplate && this.registeredTemplate["" + templateName]) {
var registeredTemplates = this.registeredTemplate