{"version":3,"sources":["webpack://jrs-ui/./src/components/components.tooltip.js","webpack://jrs-ui/./src/components/list.base.js"],"names":["JSTooltip","element","options","this","srcElement","label","text","offsets","showBelow","templateId","loadTextCallback","loadTextExecuted","disabled","removed","_toAttribute","TOOLTIP_TEMPLATE","id","_fromAttribute","length","TOOLTIP_TEMPLATE_ID","TOOLTIP_LABEL","TOOLTIP_TEXT","_escapeText","jsTooltip","tooltipModule","tooltips","push","addVar","addMethod","attrName","value","xssUtil","writeAttribute","isArray","join","SEPARATOR","hasAttribute","readAttribute","include","split","elements","values","each","index","_","update","getElementZIndex","elem","parseInt","jQuery","css","initialZIndex","parents","toArray","memo","parent","zIndex","Math","max","txt","tooltipOffsets","_element","getBoxOffsets","clientHeight","getScrollLeft","getScrollTop","setStyle","position","left","top","_calculateZIndex","labelElements","select","LABEL_PATTERN","textElements","TEXT_PATTERN","_setValues","removeClass","layoutModule","clientWidth","window","width","leftOffset","height","topOffset","addClass","hideJSTooltip","showJSTooltip","indexOf","splice","TOOLTIP_PATTERN","ELEMENT_WITH_TOOLTIP_PATTERN","actualX","actualY","cleanUp","appearDelay","attr","timer","clearTimeout","setTimeout","show","on","evt","clientX","clientY","enableTooltips","forEach","tooltip","enable","disableTooltips","disable","hide","off","testId","document","getElementById","setAttribute","removeAttribute","reject","t","baseList","item","buttonManager","isOpen","hasClass","dynamicList","lists","activeListId","_templateHash","messages","getDynamicListForElement","$list","is","_itemId","undefined","_list","first","last","isIconClicked","_value","_label","_subList","subList","_cssClassName","cssClassName","_templateDomId","templateDomId","_respondOnItemEvents","Object","isUndefined","respondOnItemEvents","_excludeFromEventHandling","excludeFromEventHandling","_excludeFromSelectionTriggers","excludeFromSelectionTriggers","FAVORITE_ICON_PATTERN","favoriteIconPattern","SCHEDULE_ICON_PATTERN","scheduleIconPattern","ListItem","list","getList","getNextItemId","container","processTemplate","_getTemplate","_getElement","_generateId","tabindex","getValue","isLabel","getId","getLabel","listItem","refreshStyle","siblings","childElements","afterIndex","children","isCompositeSubList","posinset","insert","after","hadFocus","activeElement","focus","remove","templateClassName","className","isSelected","isDisabled","getCssClassName","isComposite","cursor","isNotNullORUndefined","wrapper","cleanWhitespace","elementsCount","childNodes","data","removeItems","isItemSelected","selectItem","deselectItem","getItems","e","isElement","clone","DEFAULT_ITEM_ID_PREFIX","event","matchAny","target","CompositeItem","call","_items","items","_openUp","openUp","_subListOptions","listOptions","_listTagName","OPEN_HANDLER_PATTERN","openHandlerPattern","CLOSE_HANDLER_PATTERN","closeHandlerPattern","prototype","deepClone","tagName","_showSubList","_getSubListId","subListElement","Element","bottom","opts","List","allowSelections","_allowSelections","responsive","_responsive","selectionDefaultsToCursor","_selectionDefaultsToCursor","collapsible","_collapsible","multiSelect","_multiSelect","listTemplateDomId","_listTemplateDomId","itemTemplateDomId","_itemTemplateDomId","itemCssClassName","_itemCssClassName","comparator","_comparator","_initEvents","_parentList","parentItem","bind","refresh","DEFAULT_SUB_LIST_ID_SUFFIX","TemplatedListItem","tooltipText","tempFunc","constructor","UnderscoreTemplatedListItem","_template","template","tempFunction","_id","_selectedItems","_lastSelectedItem","_nextId","draggables","listOrientation","_selectOnMousedown","selectOnMousedown","_setCursorOnMousedown","setCursorOnMousedown","dragPattern","scroll","setItems","_createFromTemplate","_registerCustomScroll","_msgNItemsSelected","Template","ITEM_SELECTED","ITEM_UNSELECTED","ITEM_MOUSEUP","ITEM_MOUSEDOWN","ITEM_CLICK","ITEM_DBLCLICK","ITEM_OPEN","ITEM_CLOSED","ITEM_CONTEXTMENU","ITEM_BEFORE_SELECT_OR_UNSELECT","newCursor","oldCursor","listEl","resetSelected","addItems","getCursor","compact","_prepareListItem","sort","pos","apply","concat","setList","getTemplateDomId","setTemplateDomId","setCssClassName","_removeItemFromSelected","getNextItem","getPreviousItem","unsetList","setCursor","scrollUpTo","getSelectedItems","closest","isCtrlHeld","isShiftKeyHeld","isContextMenu","fire","Event","stopSelectOrUnselect","isContextMenuOnSelected","reset","deselect","selectRange","start","end","min","i","_addItemToSelected","isShiftKey","findAll","skipParent","cursorEl","thatList","scrollEl","parentNode","scrollTop","scrollPortHeight","offsetHeight","correction","offsetTop","itemYPos","currentIndex","baseEvent","targetEvent","subItem","nextItem","preventDefault","stopPropagation","selectNext","isShiftHeld","previousItem","selectPrevious","stdnav","headerHack","newScrollTop","iterItem","outItem","source","gridItem","dataCellElement","currentCell","isFirstCellVisible","find","dataCell","itemsAmount","itemElements","isRendered","wasOpened","cursorWasFocus","getCursorElement","clean","eventName","handler","observe","stopObserving","itemList","idsAreEqual","parentListContainsChild","contains","_getTemplateElement","disableSelectionWithoutCursorStyle","currentElement","cloneCustomAttributes","remember","without","evaluate","count","scrollBar","up","identify","thisElem","matchingElem","getItemByEvent","Draggable","superghosting","mouseOffset","onStart","setDragStartState","onEnd","setDragEndState","draggable","slice","_buildDnDOverlay","scrollSensitivity","Draggables","regionID","matchMeOrUp","_isElementInExcluded","listEvent","isInvoked","_isExcludedFromSelectionTriggers","isCtrlHeldValue","isMetaHeld","isShiftHeldValue","isContextMenuValue","isRightClick","isSelect","TouchController","isSupportsTouch","changedTouches","deselectOthers","twofingers","node","createDraggableIfNeeded","type","iconEvent","_itemPreventEvent","touches","_isCloseHandler","_isOpenHandler","_mousedownHandler","bindAsEventListener","_mouseupHandler","isIPad","_mouseoverHandler","_clickHandler","_dblclickHandler","selectInwards","selectOutwards","selectPageDown","selectPageUp","selectFirst","selectLast","isFavHandler","isFavIcon","isOpenOrCloseHandler","which","_isFavoriteHandler","UnderscoreTemplatedList","arguments","temporaryFunc"],"mappings":"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","file":"_chunks/chunk.6461.js","sourcesContent":["/*\n * Copyright (C) 2005 - 2022 TIBCO Software Inc. All rights reserved.\n * http://www.jaspersoft.com.\n *\n * Unless you have purchased a commercial license agreement from Jaspersoft,\n * the following license terms apply:\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n */\n\n\n/**\n * @version: $Id$\n */\n\nimport _ from 'underscore';\nimport {\n isArray,\n getBoxOffsets,\n getScrollLeft,\n getScrollTop\n} from '../util/utils.common';\nimport jQuery from 'jquery';\n\nimport xssUtil from 'js-sdk/src/common/util/xssUtil';\n\nimport layoutModule from '../core/core.layout';\n\n/**\n * Usage:\n * Within HTML markup. (Not working with button element)\n *\n * \n * <li tooltiptext=\"Hello\">Item 1</li>\n * <li tooltiptext=\"Hello\" tooltiplabel=\"URA!\">Item 1</li>\n * <li tooltiptext=\"Hello\" tooltiplabel=\"URA!\" tooltiptemplate=\"tID\">Item 1</li>\n * \n *\n * Within JavaScript\n * \n * new JSTooltip(element, { text: \"tooltipText\" }).show();\n * new JSTooltip(element, { text: \"tooltipText\", offsets: [100, 50] }).show();\n * new JSTooltip(element, { text: \"tooltipText\" }).show([100, 50]);\n * new JSTooltip(element, { label: \"tooltipLabel\", text: \"tooltipText\", templateId: \"templateId\" });\n * new JSTooltip(element, { label: [\"tooltipLabel1\", \"tooltipLabel2\"], text: [\"tooltipText1\", \"tooltipText2\", \"tooltipText3\"], templateId: \"templateId\" });\n *\n * tooltipModule.showJSTooltip(element, [100, 50]);\n * tooltipModule.hideJSTooltip(element);\n * \n * @param element\n * @param options {Object}\n * \n *\n */\nfunction JSTooltip(element, options) {\n if (element) {\n this.srcElement = element;\n\n if (options) {\n this.label = options.label;\n this.text = options.text;\n this.offsets = options.offsets;\n this.showBelow = !! options.showBelow;\n this.templateId = options.templateId;\n this.loadTextCallback = options.loadTextCallback;\n this.loadTextExecuted = false;\n }\n\n this.disabled = false;\n this.removed = false;\n\n if (this.templateId) {\n this._toAttribute(this.TOOLTIP_TEMPLATE, this.templateId);\n } else {\n var id = this._fromAttribute(this.TOOLTIP_TEMPLATE);\n this.templateId = (id && id.length > 0) ? id : this.TOOLTIP_TEMPLATE_ID;\n }\n if (this.label) {\n this._toAttribute(this.TOOLTIP_LABEL, this.label);\n } else {\n this.label = this._fromAttribute(this.TOOLTIP_LABEL);\n }\n if (this.text) {\n this._toAttribute(this.TOOLTIP_TEXT, this.text);\n } else {\n this.text = this._fromAttribute(this.TOOLTIP_TEXT);\n }\n\n // escape against XSS\n if (this.label)\n this.label = this._escapeText(this.label);\n if (this.text)\n this.text = this._escapeText(this.text);\n\n this.srcElement.jsTooltip = this;\n\n tooltipModule.tooltips.push(this);\n }\n}\n\nJSTooltip.addVar(\"SEPARATOR\", \"@@\");\nJSTooltip.addVar(\"TOOLTIP_LABEL\", \"tooltiplabel\");\nJSTooltip.addVar(\"TOOLTIP_TEXT\", \"tooltiptext\");\nJSTooltip.addVar(\"TOOLTIP_TEMPLATE\", \"tooltiptemplate\");\nJSTooltip.addVar(\"TOOLTIP_TEMPLATE_ID\", \"jsTooltip\");\nJSTooltip.addVar(\"LABEL_PATTERN\", \".message.label\");\nJSTooltip.addVar(\"TEXT_PATTERN\", \".message:not(.label)\");\n\nJSTooltip.addMethod(\"_toAttribute\", function(attrName, value) {\n if(this.srcElement) {\n value = xssUtil.hardEscape(value);\n this.srcElement.writeAttribute(attrName, isArray(value) ? value.join(this.SEPARATOR) : value);\n }\n});\n\nJSTooltip.addMethod(\"_fromAttribute\", function(attrName) {\n if(this.srcElement && this.srcElement.hasAttribute(attrName)) {\n var value = this.srcElement.readAttribute(attrName);\n return value.include(this.SEPARATOR) ? value.split(this.SEPARATOR) : value;\n }\n\n return null;\n});\n\nJSTooltip.addMethod(\"_setValues\", function(elements, values) {\n elements.each(function (element, index) {\n if (_.isString(values[index]) || _.isNumber(values[index])) {\n element.update(xssUtil.hardEscape(values[index]));\n }\n });\n});\n\nJSTooltip.addMethod(\"_calculateZIndex\", function(element) {\n function getElementZIndex(elem) {\n return parseInt(jQuery(elem).css(\"z-index\"));\n }\n\n // Get tooltip element zIndex.\n var initialZIndex = getElementZIndex(element);\n if (!_.isNumber(initialZIndex) || _.isNaN(initialZIndex)) {\n initialZIndex = 1000;\n }\n\n var parents = _.flatten([this.srcElement, jQuery(this.srcElement).parents().toArray()]);\n\n // Calculates max z-index between tooltip element and parent elements.\n var maxZIndex = _.reduce(parents, function(memo, parent) {\n var zIndex = getElementZIndex(parent);\n\n if (_.isNumber(zIndex) && !_.isNaN(zIndex)) {\n memo = Math.max(memo, zIndex);\n }\n\n return memo;\n }, initialZIndex);\n\n return maxZIndex + 1;\n});\n\nJSTooltip.addMethod(\"_escapeText\", function(text) {\n return _.isArray(text)\n ? _.map(text, function (txt) { return xssUtil.hardEscape(txt)})\n : xssUtil.hardEscape(text);\n});\n\nJSTooltip.addMethod(\"show\", function(tooltipOffsets) {\n if(tooltipOffsets) {\n this.offsets = tooltipOffsets;\n }\n\n this._element = jQuery('#' + this.templateId)[0];\n\n var offsets;\n if (this.showBelow) {\n offsets = getBoxOffsets(this.srcElement);\n offsets[1] += this.srcElement.clientHeight + 5;\n } else {\n offsets = [getScrollLeft() + 5, getScrollTop() + 5];\n }\n\n if (this.offsets) {\n offsets[0] += this.offsets[0];\n offsets[1] += this.offsets[1];\n }\n\n this._element.setStyle({\n position: \"absolute\",\n left: offsets[0] + 'px',\n top: offsets[1] + 'px',\n zIndex: this._calculateZIndex(this._element)\n });\n\n var labelElements = this._element.select(this.LABEL_PATTERN);\n var textElements = this._element.select(this.TEXT_PATTERN);\n\n if(this.label) {\n this._setValues(labelElements, isArray(this.label) ? this.label : [this.label]);\n }\n if(this.text) {\n this._setValues(textElements, isArray(this.text) ? this.text : [this.text]);\n }\n\n jQuery(this._element).removeClass(layoutModule.HIDDEN_CLASS);\n\n if (offsets[0] + this._element.clientWidth > jQuery(window).width()) {\n var leftOffset = offsets[0] - this._element.clientWidth > 0 ? offsets[0] - this._element.clientWidth : 15;\n\n this._element.setStyle({ left: leftOffset + \"px\"});\n }\n if (offsets[1] + this._element.clientHeight > jQuery(window).height()) {\n var topOffset = offsets[1] - this._element.clientHeight - 10;\n this._element.setStyle({ top: topOffset + \"px\"});\n }\n\n if (this.loadTextCallback && !this.loadTextExecuted) {\n this.loadTextExecuted = true;\n\n this.loadTextCallback(this);\n }\n\n return this;\n});\n\nJSTooltip.addMethod(\"updateText\", function(text) {\n this.text = this._escapeText(text);\n\n if (this._element) {\n var textElements = this._element.select(this.TEXT_PATTERN);\n\n this._setValues(textElements, isArray(this.text) ? this.text : [this.text]);\n }\n});\n\nJSTooltip.addMethod(\"hide\", function() {\n if (this._element) {\n jQuery(this._element).addClass(layoutModule.HIDDEN_CLASS);\n }\n});\n\nJSTooltip.addMethod(\"disable\", function() {\n tooltipModule.hideJSTooltip(this.srcElement);\n this.disabled = true;\n});\n\nJSTooltip.addMethod(\"enable\", function() {\n this.disabled = false;\n tooltipModule.showJSTooltip(this.srcElement, this.offsets);\n});\n\nJSTooltip.addMethod(\"remove\", function() {\n var index = tooltipModule.tooltips.indexOf(this.srcElement.jsTooltip);\n if (index !== -1) {\n tooltipModule.hideJSTooltip(this.srcElement);\n tooltipModule.tooltips.splice(index, 1);\n }\n this.removed = true;\n});\n\nJSTooltip.addMethod(\"isRemoved\", function() {\n return this.removed;\n});\n\nvar tooltipModule = {\n TOOLTIP_PATTERN: \"*[tooltiptext] > *\",\n ELEMENT_WITH_TOOLTIP_PATTERN: \"*[tooltiptext]\",\n\n tooltips: [],\n\n showJSTooltip: function(element, offsets) {\n if (!element.jsTooltip) {\n element.jsTooltip = new JSTooltip(element, {});\n } else if (!element.jsTooltip.disabled && offsets) {\n var actualX = offsets[0];\n var actualY = offsets[1];\n\n this.cleanUp();\n\n var appearDelay = jQuery(element).attr(\"tooltipappeardelay\");\n appearDelay = appearDelay ? parseInt(appearDelay) : 1000;\n\n element.jsTooltip.timer && clearTimeout(element.jsTooltip.timer);\n element.jsTooltip.timer = setTimeout(function() {\n element.jsTooltip.show([actualX, actualY]);\n }, appearDelay);\n\n jQuery(element).on(\"mousemove\", function(evt){\n actualX = evt.clientX;\n actualY = evt.clientY;\n });\n }\n },\n\n enableTooltips: function() {\n var tooltips = this.tooltips || [];\n\n tooltips.forEach(function(tooltip) {\n tooltip.enable();\n });\n },\n\n disableTooltips: function() {\n var tooltips = this.tooltips || [];\n\n tooltips.forEach(function(tooltip) {\n tooltip.disable();\n });\n },\n\n hideJSTooltip: function(element) {\n if (element && element.jsTooltip) {\n element.jsTooltip.timer && clearTimeout(element.jsTooltip.timer);\n\n element.jsTooltip.hide();\n\n jQuery(element).off(\"mousemove\");\n }\n },\n\n cleanUp: function() {\n if (this.tooltips && this.tooltips.length > 0) {\n var removed = [];\n var testId = \"fuigasuifdughaiadbvguaidbapvuwbev\";\n this.tooltips.each(function(tooltip) {\n if (!(tooltip.srcElement.id && document.getElementById(tooltip.srcElement.id))){\n tooltip.srcElement.setAttribute(\"id\",testId);\n if (!document.getElementById(testId)){\n tooltip.hide();\n removed.push(tooltip);\n }\n tooltip.srcElement.removeAttribute(\"id\");\n }\n });\n\n if (removed.length > 0) {\n this.tooltips = this.tooltips.reject(function(t) {\n return removed.include(t);\n });\n }\n }\n }\n};\n\nexport {JSTooltip, tooltipModule};\n","/*\n * Copyright (C) 2005 - 2022 TIBCO Software Inc. All rights reserved.\n * http://www.jaspersoft.com.\n *\n * Unless you have purchased a commercial license agreement from Jaspersoft,\n * the following license terms apply:\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n */\n/**\n * @version: $Id$\n */\nimport {Draggables, Draggable} from 'dragdropextra';\nimport {Template} from 'prototype';\nimport layoutModule from '../core/core.layout';\nimport buttonManager from '../core/core.events.bis';\nimport {\n isNotNullORUndefined,\n matchAny,\n deepClone,\n isArray,\n isShiftHeld,\n disableSelectionWithoutCursorStyle,\n cloneCustomAttributes,\n matchMeOrUp,\n isMetaHeld,\n isRightClick,\n isSupportsTouch,\n isIPad\n} from '../util/utils.common';\n\nimport TouchController from '../util/touch.controller';\nimport {JSTooltip} from \"./components.tooltip\";\nimport _ from 'underscore';\nimport xssUtil from 'js-sdk/src/common/util/xssUtil';\nimport jQuery from 'jquery';\nimport stdnav from 'js-sdk/src/common/stdnav/stdnav';\n\nvar baseList = {\n isResponsive: function (item) {\n return jQuery(item).parent().hasClass(layoutModule.RESPONSIVE_CLASS);\n },\n isCollapsible: function (item) {\n return jQuery(item).parent().hasClass(layoutModule.COLLAPSIBLE_CLASS);\n },\n selectItem: function (item) {\n if (this._allowSelections) {\n if (this.isItemDisabled(item)) {\n return;\n }\n jQuery(item).addClass(layoutModule.SELECTED_CLASS);\n }\n },\n deselectItem: function (item) {\n jQuery(item).removeClass(layoutModule.SELECTED_CLASS);\n },\n isItemSelected: function (item) {\n return jQuery(item).hasClass(layoutModule.SELECTED_CLASS);\n },\n disableItem: function (item) {\n buttonManager.disable(item);\n },\n enableItem: function (item) {\n buttonManager.enable(item);\n },\n isItemDisabled: function (item) {\n return buttonManager.isDisabled(item);\n },\n openItem: function (item) {\n jQuery(item).removeClass(layoutModule.CLOSED_CLASS).addClass(layoutModule.OPEN_CLASS)[0].isOpen = true;\n },\n isItemOpen: function (item) {\n return jQuery(item).hasClass(layoutModule.OPEN_CLASS) || jQuery(item)[0].isOpen && !jQuery(item).hasClass(layoutModule.CLOSED_CLASS);\n },\n closeItem: function (item) {\n jQuery(item).removeClass(layoutModule.OPEN_CLASS).addClass(layoutModule.CLOSED_CLASS)[0].isOpen = false;\n }\n}; ///////////////////////////////////////////////////////\n// Global module for all list related code\n///////////////////////////////////////////////////////\n///////////////////////////////////////////////////////\n// Global module for all list related code\n///////////////////////////////////////////////////////\nvar dynamicList = {\n /**\n * Map of all created lists on current page\n */\n lists: {},\n /**\n * Id of last active list\n */\n activeListId: null,\n _templateHash: {},\n messages: { 'listNItemsSelected': '#{count} items selected' },\n /**\n * @return {dynamicList}\n */\n getDynamicListForElement: function (element) {\n var $list = jQuery(element)[0];\n if (!jQuery($list).is('ul,ol')) {\n $list = jQuery($list).parent('ul,ol');\n if ($list.length === 0) {\n return null;\n }\n }\n return dynamicList.lists[$list.id];\n }\n}; ///////////////////////////////////////////////////////\n// ListItem\n///////////////////////////////////////////////////////\n/**\n * Respond on events: dblclick, click, mouseover, mousedown, mouseup, key:down and key:up\n * Options:\n * respondOnItemEvents - when false all event will be ignored\n * excludeFromEventHandling - [selectorPattern1, selectorPattern2]\n * excludeFromSelectionTriggers - []\n *\n * @param options\n */\n///////////////////////////////////////////////////////\n// ListItem\n///////////////////////////////////////////////////////\n/**\n * Respond on events: dblclick, click, mouseover, mousedown, mouseup, key:down and key:up\n * Options:\n * respondOnItemEvents - when false all event will be ignored\n * excludeFromEventHandling - [selectorPattern1, selectorPattern2]\n * excludeFromSelectionTriggers - []\n *\n * @param options\n */\ndynamicList.ListItem = function (options) {\n this._itemId = undefined;\n this._list = undefined;\n this.first = false;\n this.last = false;\n if (options) {\n this.isIconClicked = true;\n this._value = options.value ? options.value : {};\n this._label = options.label ? options.label : '';\n this._subList = options.subList;\n this._cssClassName = 'cssClassName' in options ? options.cssClassName : undefined;\n this._templateDomId = 'templateDomId' in options ? options.templateDomId : undefined;\n this._respondOnItemEvents = !Object.isUndefined(options.respondOnItemEvents) ? options.respondOnItemEvents : true;\n this._excludeFromEventHandling = 'excludeFromEventHandling' in options ? options.excludeFromEventHandling : undefined;\n this._excludeFromSelectionTriggers = 'excludeFromSelectionTriggers' in options ? options.excludeFromSelectionTriggers : undefined;\n this.FAVORITE_ICON_PATTERN= options.favoriteIconPattern ;\n this.SCHEDULE_ICON_PATTERN= options.scheduleIconPattern ;\n\n }\n}; /**\n *\n */\n/**\n *\n */\ndynamicList.ListItem.addVar('DEFAULT_TEMPLATE_DOM_ID', 'dynamicListItemTemplate');\ndynamicList.ListItem.addVar('DEFAULT_ITEM_ID_PREFIX', 'item');\ndynamicList.ListItem.addVar('DEFAULT_SUB_LIST_ID_SUFFIX', 'SubList'); ///////////////////////////////////////////////////////\n// Public ListItem methods\n///////////////////////////////////////////////////////\n/**\n * Gets ID of the item, which is being generated by the list.\n * @return {Number} ID of the item\n */\n///////////////////////////////////////////////////////\n// Public ListItem methods\n///////////////////////////////////////////////////////\n/**\n * Gets ID of the item, which is being generated by the list.\n * @return {Number} ID of the item\n */\ndynamicList.ListItem.addMethod('getId', function () {\n return this._itemId;\n}); /*\n * Sets the list and generates new id in that list.\n * This method is used by the list to set reference on itself.\n *\n * @param list {{@see dynamicList.List}}\n */\n/*\n * Sets the list and generates new id in that list.\n * This method is used by the list to set reference on itself.\n *\n * @param list {{@see dynamicList.List}}\n */\ndynamicList.ListItem.addMethod('setList', function (list) {\n this._list = list;\n // This function should no longer be used for this purpose.\n // Use \"unsetList\" instead.\n // FIXME: Turn this on when logging is added to this module!\n // this.logger.warn(\"deprecated use case\");\n if (this.getList()) {\n this._itemId = this.getList().getNextItemId();\n }\n}); /*\n * Explicitly clears the item's link to its previous list.\n * Use this function instead of setList(null) or setList(undefined).\n *\n * @param list {{@see dynamicList.List}}\n */\n/*\n * Explicitly clears the item's link to its previous list.\n * Use this function instead of setList(null) or setList(undefined).\n *\n * @param list {{@see dynamicList.List}}\n */\ndynamicList.ListItem.addMethod('unsetList', function () {\n this._list = null; // listItem IDs depend on their assigned list.\n // listItem IDs depend on their assigned list.\n this._itemId = undefined;\n}); /*\n * Gets the list where this item is listed.\n *\n * @return {{@see dynamicList.List}}\n */\n/*\n * Gets the list where this item is listed.\n *\n * @return {{@see dynamicList.List}}\n */\ndynamicList.ListItem.addMethod('getList', function () {\n return this._list;\n}); /**\n * Sets value of the item.\n *\n * @param {String}\n */\n/**\n * Sets value of the item.\n *\n * @param {String}\n */\ndynamicList.ListItem.addMethod('setValue', function (value) {\n return this._value = value;\n}); /**\n * Gets value of the item.\n *\n * @return {String}\n */\n/**\n * Gets value of the item.\n *\n * @return {String}\n */\ndynamicList.ListItem.addMethod('getValue', function () {\n return this._value;\n}); /**\n * Sets label defined by user.\n *\n * @param {Object}\n */\n/**\n * Sets label defined by user.\n *\n * @param {Object}\n */\ndynamicList.ListItem.addMethod('setLabel', function (label) {\n return this._label = label;\n}); /**\n * Gets label of the item defined by user.\n *\n * @return {Object}\n */\n/**\n * Gets label of the item defined by user.\n *\n * @return {Object}\n */\ndynamicList.ListItem.addMethod('getLabel', function () {\n return this._label;\n}); /**\n * Setter and getter for the style of the item.\n * Changes of the style will be applied after call of method {@see dynamicList.ListItem#refresh}\n */\n/**\n * Setter and getter for the style of the item.\n * Changes of the style will be applied after call of method {@see dynamicList.ListItem#refresh}\n */\ndynamicList.ListItem.addMethod('setCssClassName', function (cssClassName) {\n this._cssClassName = cssClassName;\n}).addMethod('getCssClassName', function () {\n return this._cssClassName;\n}); /**\n * Sets the ID of DOM element which will be used for rendering of mark up.\n * Changes of the style will be applied after call of method {@see dynamicList.ListItem#refresh}\n *\n * @param templateDomId {String}\n */\n/**\n * Sets the ID of DOM element which will be used for rendering of mark up.\n * Changes of the style will be applied after call of method {@see dynamicList.ListItem#refresh}\n *\n * @param templateDomId {String}\n */\ndynamicList.ListItem.addMethod('setTemplateDomId', function (templateDomId) {\n this._templateDomId = templateDomId;\n}); /**\n * Gets the ID of the current template of the item.\n * Attr\n * @return {String}\n */\n/**\n * Gets the ID of the current template of the item.\n * Attr\n * @return {String}\n */\ndynamicList.ListItem.addMethod('getTemplateDomId', function () {\n return this._templateDomId;\n}); /**\n * Render the item specified container.\n * Use this method when you need re-render item.\n *\n * @param container {DOMElement}\n */\n/**\n * Render the item specified container.\n * Use this method when you need re-render item.\n *\n * @param container {DOMElement}\n */\ndynamicList.ListItem.addMethod('show', function (container) {\n if (!container) {\n return;\n }\n this._element = this.processTemplate(this._getTemplate());\n this._getElement().setAttribute('id', this._generateId());\n this._getElement().setAttribute('tabindex', -1);\n this.first && this.getList().tabindex && jQuery(this._getElement()).attr('tabindex', this.getList().tabindex);\n this.first && this.getValue().isLabel && jQuery('#'+this.getList().getId()).attr('aria-label', this.getLabel().split(':')[0]);\n this._getElement().listItem = this;\n this.refreshStyle();\n let siblings = container.childElements();\n let itemIndex = this.index();\n let afterIndex = itemIndex - 1;\n\n if(jQuery(this._element.children).attr('role') === 'row'){\n jQuery(this._element).children('[role=\"row\"]').attr('aria-posinset',this.getId());\n jQuery(this._element).children('[role=\"row\"]').attr('aria-level',1);\n jQuery(this._element).children('[role=\"row\"]').attr('aria-setsize',-1);\n }\n if(this._list.isCompositeSubList){\n let posinset = parseInt(jQuery(this._element).children('[role=\"row\"]').attr('aria-posinset'));\n jQuery(this._element).children('[role=\"row\"]').attr('aria-level',posinset+1)\n jQuery(this._element).children('[role=\"row\"]').attr('aria-setsize',-1);\n }\n\n afterIndex > -1 && afterIndex < siblings.length ? this._getElement().insert({ after: siblings[afterIndex] }) : jQuery(container)[0].insert(this._getElement());\n}); /**\n *\n */\n/**\n *\n */\ndynamicList.ListItem.addMethod('refresh', function () {\n var hadFocus = false; // NOTE: _getElement is not just a simple accessor, and apparently has\n // side-effects which are required elsewhere.\n // NOTE: _getElement is not just a simple accessor, and apparently has\n // side-effects which are required elsewhere.\n if (!this._getElement()) {\n return;\n }\n if (this.getList()) {\n if (document.activeElement === this._getElement()) {\n hadFocus = true;\n }\n this._element = this.processTemplate(this._getElement());\n this.refreshStyle();\n if (hadFocus) {\n jQuery(this._getElement()).focus();\n }\n } else {\n this._getElement().remove();\n this._element = null;\n }\n}); /**\n *\n */\n/**\n *\n */\ndynamicList.ListItem.addMethod('refreshStyle', function () {\n var element = this._getElement(); // List may not have been rendered yet.\n // List may not have been rendered yet.\n if (!element) {\n return;\n }\n if (element.templateClassName) {\n element.className = element.templateClassName;\n }\n if (this.first) {\n jQuery(element).addClass(layoutModule.FIRST_CLASS);\n }\n if (this.last) {\n jQuery(element).addClass(layoutModule.LAST_CLASS);\n }\n if (this.isSelected()) {\n jQuery(element).addClass(layoutModule.SELECTED_CLASS);\n }\n if (this.isDisabled()) {\n jQuery(element).addClass(layoutModule.DISABLED_CLASS);\n }\n if (this.getCssClassName()) {\n jQuery(element).addClass(this.getCssClassName());\n } // Update cursor styles. Note that cursor logic for composite items will\n // be done after this call.\n // Update cursor styles. Note that cursor logic for composite items will\n // be done after this call.\n if (!this.isComposite) {\n if (this === this.getList().cursor) {\n jQuery(element).addClass('cursor');\n }\n }\n}); /**\n *\n */\n/**\n *\n */\ndynamicList.ListItem.addMethod('isRendered', function () {\n return isNotNullORUndefined(this._getElement());\n}); /**\n *\n */\n/**\n *\n */\ndynamicList.ListItem.addMethod('disable', function () {\n baseList.disableItem(this._getElement());\n}).addMethod('enable', function () {\n baseList.enableItem(this._getElement());\n}).addMethod('isDisabled', function () {\n return baseList.isItemDisabled(this._getElement());\n}); /**\n * Prepare mark up template of the item before render or process existing mark up when refresh the item.\n * If template was changed method should be overridden.\n *\n * @param {DOMElement} - current item element\n * @return {DOMElement} - element ready for use\n */\n/**\n * Prepare mark up template of the item before render or process existing mark up when refresh the item.\n * If template was changed method should be overridden.\n *\n * @param {DOMElement} - current item element\n * @return {DOMElement} - element ready for use\n */\ndynamicList.ListItem.addMethod('processTemplate', function (element) {\n var wrapper = element.childElements()[0];\n wrapper.cleanWhitespace();\n var elementsCount = wrapper.childElements().length;\n if (elementsCount == wrapper.childNodes.length) {\n wrapper.insert(xssUtil.hardEscape(this.getLabel()));\n } else {\n wrapper.childNodes[elementsCount].data = this.getLabel();\n } // $(wrapper.parentNode).writeAttribute(\"tabIndex\",-1);\n // $(wrapper.parentNode).writeAttribute(\"tabIndex\",-1);\n return element;\n}); /**\n * focus on this node's element\n */\n/**\n * focus on this node's element\n */\ndynamicList.ListItem.addMethod('focus', function () {\n this._getElement().focus();\n}); /**\n * Removes it self from the list.\n */\n/**\n * Removes it self from the list.\n */\ndynamicList.ListItem.addMethod('remove', function () {\n this.getList().removeItems([this]);\n}); /**\n *\n */\n/**\n *\n */\ndynamicList.ListItem.addMethod('isSelected', function () {\n return this.getList().isItemSelected(this);\n}); /**\n *\n */\n/**\n *\n */\ndynamicList.ListItem.addMethod('select', function () {\n this.getList().selectItem(this, true);\n}); /**\n *\n */\n/**\n *\n */\ndynamicList.ListItem.addMethod('deselect', function () {\n this.getList().deselectItem(this);\n});\ndynamicList.ListItem.addMethod('index', function () {\n this.getList().getItems().indexOf(this);\n}); ///////////////////////////////////////////////////////\n// Private ListItem methods\n///////////////////////////////////////////////////////\n/**\n * Gets or looking for DOM element of this item.\n *\n * @return {DOMElement}\n */\n///////////////////////////////////////////////////////\n// Private ListItem methods\n///////////////////////////////////////////////////////\n/**\n * Gets or looking for DOM element of this item.\n *\n * @return {DOMElement}\n */\ndynamicList.ListItem.addMethod('_getElement', function () {\n if (!this._element) {\n var e = jQuery('#' + this._generateId())[0];\n this._element = Object.isElement(e) ? e : undefined;\n }\n return this._element;\n});\ndynamicList.ListItem.addMethod('_getTemplate', function () {\n var id = this._templateDomId;\n if (!dynamicList._templateHash[id]) {\n dynamicList._templateHash[id] = id;\n }\n var clone = document.getElementById(dynamicList._templateHash[id]).clone(true);\n clone.templateId = id;\n clone.templateClassName = clone.className;\n return clone;\n});\ndynamicList.ListItem.addMethod('_generateId', function () {\n // There are some weird situations where this can get called due to a\n // refresh while deleting an item. In these situations, the item may no\n // longer be assigned to a list. In this case, this function returns\n // null.\n if (!this.getList() || !this.getList().getId()) {\n return null;\n }\n return this.getList().getId() + '_' + this.DEFAULT_ITEM_ID_PREFIX + this.getId();\n});\ndynamicList.ListItem.addMethod('_isElementInExcluded', function (event, item) {\n var element = event.element();\n return this._excludeFromEventHandling && matchAny(element, this._excludeFromEventHandling) != null;\n});\ndynamicList.ListItem.addMethod('_isExcludedFromSelectionTriggers', function (event) {\n var element = event.target;\n return this._excludeFromSelectionTriggers && matchAny(element, this._excludeFromSelectionTriggers) != null;\n});\ndynamicList.ListItem.addMethod('_isFavoriteHandler', function (element) {\n return jQuery(element).is(this.FAVORITE_ICON_PATTERN);\n});\ndynamicList.ListItem.addMethod('_isScheduleHandler', function (element) {\n return jQuery(element).is(this.SCHEDULE_ICON_PATTERN);\n})///////////////////////////////////////////////////////\n// Composite List Item\n///////////////////////////////////////////////////////\n///////////////////////////////////////////////////////\n// Composite List Item\n///////////////////////////////////////////////////////\ndynamicList.CompositeItem = function (options) {\n dynamicList.ListItem.call(this, options);\n this.isComposite = true;\n this._items = options.items;\n this._openUp = options.openUp;\n this._subList = null;\n this._subListOptions = options.listOptions ? options.listOptions : {};\n this._listTagName = 'ul';\n this.FAVORITE_ICON_PATTERN = options.favoriteIconPattern ;\n this.SCHEDULE_ICON_PATTERN = options.scheduleIconPattern;\n this.OPEN_HANDLER_PATTERN = options.openHandlerPattern ? options.openHandlerPattern : this.OPEN_HANDLER_PATTERN;\n this.CLOSE_HANDLER_PATTERN = options.closeHandlerPattern ? options.closeHandlerPattern : this.CLOSE_HANDLER_PATTERN;\n};\ndynamicList.CompositeItem.prototype = deepClone(dynamicList.ListItem.prototype);\ndynamicList.CompositeItem.addVar('OPEN_HANDLER_PATTERN', '[openHandler=openHandler]');\ndynamicList.CompositeItem.addVar('CLOSE_HANDLER_PATTERN', '[closeHandler=closeHandler]');\ndynamicList.CompositeItem.addMethod('getItems', function () {\n return this._items;\n});\ndynamicList.CompositeItem.addMethod('setItems', function (items) {\n this._items = items;\n});\ndynamicList.CompositeItem.addMethod('addItem', function (item) {\n this._items.push(item);\n});\ndynamicList.CompositeItem.addMethod('removeItems', function (items) {\n this._items = this._items.reject(function (item) {\n return items.include(item);\n });\n this._subList.removeItems(items);\n});\ndynamicList.CompositeItem.addMethod('show', function (container) {\n this._listTagName = container.tagName;\n dynamicList.ListItem.prototype.show.call(this, container);\n baseList.closeItem(this._getElement());\n if (!this._items) {\n return;\n }\n this._showSubList();\n});\ndynamicList.CompositeItem.addMethod('_showSubList', function () {\n var id = this._getSubListId();\n var subListElement = new Element(this._listTagName, { id: id });\n this._getElement().insert(this._openUp ? { top: subListElement } : { bottom: subListElement });\n var opts = this._subListOptions;\n this._subList = new dynamicList.List(id, {\n allowSelections: 'allowSelections' in opts ? opts.allowSelections : this.getList()._allowSelections,\n responsive: 'responsive' in opts ? opts.responsive : this.getList()._responsive,\n selectionDefaultsToCursor: 'selectionDefaultsToCursor' in opts ? opts.selectionDefaultsToCursor : this.getList()._selectionDefaultsToCursor,\n collapsible: 'collapsible' in opts ? opts.collapsible : this.getList()._collapsible,\n multiSelect: 'multiSelect' in opts ? opts.multiSelect : this.getList()._multiSelect,\n cssClassName: 'cssClassName' in opts ? opts.cssClassName : this.getList()._cssClassName,\n listTemplateDomId: 'listTemplateDomId' in opts ? opts.listTemplateDomId : this.getList()._listTemplateDomId,\n itemTemplateDomId: 'itemTemplateDomId' in opts ? opts.itemTemplateDomId : this.getList()._itemTemplateDomId,\n itemCssClassName: 'itemCssClassName' in opts ? opts.itemCssClassName : this.getList()._itemCssClassName,\n comparator: 'comparator' in opts ? opts.comparator : this.getList()._comparator,\n items: this._items,\n isCompositeSubList: true\n\n });\n this._subList._initEvents = function () {\n };\n this._subList.show();\n this._subList._parentList = this.getList();\n this._subList.getItems().each(function (item) {\n item.parentItem = this;\n }.bind(this));\n});\ndynamicList.CompositeItem.addMethod('refresh', function () {\n dynamicList.ListItem.prototype.refresh.call(this);\n if (!this._items) {\n return;\n }\n if (this._subList) {\n this._subList.refresh();\n } else {\n this._showSubList();\n }\n});\ndynamicList.CompositeItem.addMethod('getFirstChild', function () {\n if (this._subList.getItems().length < 1) {\n // No children, OR, children still loading.\n return null;\n }\n return this._subList.getItems()[0];\n});\ndynamicList.CompositeItem.addMethod('refreshStyle', function () {\n dynamicList.ListItem.prototype.refreshStyle.call(this);\n if (!this._getElement()) {\n // List has not been rendered yet.\n return;\n }\n if (baseList.isItemOpen(this._getElement())) {\n baseList.openItem(this._getElement());\n if (this === this.getList().cursor) {\n if (this._subList && this._subList.cursor) {\n // Sublist is open, and an item is an active cursor.\n jQuery(this._getElement()).addClass('supercursor');\n } else {\n // Sublist is open, but has no active cursor.\n jQuery(this._getElement()).addClass('cursor');\n }\n }\n } else {\n baseList.closeItem(this._getElement());\n if (this === this.getList().cursor) {\n jQuery(this._getElement()).addClass('cursor');\n }\n }\n if (!this._subList) {\n return;\n }\n this._subList.refreshStyle();\n});\ndynamicList.CompositeItem.addMethod('_isOpenHandler', function (element) {\n return jQuery(element).is(this.OPEN_HANDLER_PATTERN);\n}).addMethod('_isCloseHandler', function (element) {\n return jQuery(element).is(this.CLOSE_HANDLER_PATTERN);\n}).addMethod('_isFavoriteHandler', function (element) {\n return jQuery(element).is(this.FAVORITE_ICON_PATTERN);\n}).addMethod('_isScheduleHandler', function (element) {\n return jQuery(element).is(this.SCHEDULE_ICON_PATTERN);\n});\ndynamicList.CompositeItem.addMethod('_getSubListId', function () {\n return this._generateId() + '_' + this.DEFAULT_SUB_LIST_ID_SUFFIX;\n}); ///////////////////////////////////////////////////////\n// Templated list item - uses Mustache to process item content as a template. Takes fields of item.getValue() to fill the template\n///////////////////////////////////////////////////////\n///////////////////////////////////////////////////////\n// Templated list item - uses Mustache to process item content as a template. Takes fields of item.getValue() to fill the template\n///////////////////////////////////////////////////////\ndynamicList.TemplatedListItem = function (options) {\n if (options) {\n this.tooltipText = 'tooltipText' in options ? options.tooltipText : null;\n }\n dynamicList.ListItem.call(this, options);\n};\nvar tempFunc = function () {\n};\ntempFunc.prototype = dynamicList.ListItem.prototype;\ndynamicList.TemplatedListItem.prototype = new tempFunc();\ndynamicList.TemplatedListItem.prototype.constructor = dynamicList.TemplatedListItem;\ndynamicList.TemplatedListItem.prototype.processTemplate = function (element) {};\n// List element that is rendered from Underscore template string passed as an option\ndynamicList.UnderscoreTemplatedListItem = function (options) {\n dynamicList.TemplatedListItem.call(this, options);\n if (options) {\n this._template = 'template' in options ? options.template : '';\n }\n};\nvar tempFunction = function () {\n};\ntempFunction.prototype = dynamicList.TemplatedListItem.prototype;\ndynamicList.UnderscoreTemplatedListItem.prototype = new tempFunction();\ndynamicList.UnderscoreTemplatedListItem.prototype.constructor = dynamicList.UnderscoreTemplatedListItem;\ndynamicList.UnderscoreTemplatedListItem.prototype._getTemplate = function () {\n return this._template;\n};\ndynamicList.UnderscoreTemplatedListItem.prototype.processTemplate = function () {\n var element = jQuery(_.template(this._template, xssUtil.hardEscape(this.getValue())))[0];\n element.templateClassName = element.className;\n if (this.tooltipText != null) {\n new JSTooltip(element, { text: xssUtil.hardEscape(this.tooltipText) });\n }\n return element;\n}; ///////////////////////////////////////////////////////\n// List Component\n///////////////////////////////////////////////////////\n/*\n * Dynamically creates items on specified UL element. Supports sorting and ...\n *\n * @param id {String} - ID of the UL element, this id will be used as ID of the list.\n * @param options {JSON Object}\n * \n */\n///////////////////////////////////////////////////////\n// List Component\n///////////////////////////////////////////////////////\n/*\n * Dynamically creates items on specified UL element. Supports sorting and ...\n *\n * @param id {String} - ID of the UL element, this id will be used as ID of the list.\n * @param options {JSON Object}\n * \n */\ndynamicList.List = function (id, options) {\n this._id = id;\n this._items = [];\n this._selectedItems = [];\n this._lastSelectedItem = null;\n this.cursor = null;\n this._nextId = 1; // private static var\n // private static var\n this.draggables = [];\n this._parentList = null;\n this.listOrientation = null;\n if (options) {\n // Options with defaults.\n this._selectionDefaultsToCursor = 'selectionDefaultsToCursor' in options ? options.selectionDefaultsToCursor : true;\n this._allowSelections = 'allowSelections' in options ? options.allowSelections : true;\n this._cssClassName = 'cssClassName' in options ? options.cssClassName : '';\n this._excludeFromEventHandling = 'excludeFromEventHandling' in options ? options.excludeFromEventHandling : false;\n this._excludeFromSelectionTriggers = 'excludeFromSelectionTriggers' in options ? options.excludeFromSelectionTriggers : false;\n this._multiSelect = 'multiSelect' in options ? options.multiSelect : false;\n this._selectOnMousedown = 'selectOnMousedown' in options ? options.selectOnMousedown : true;\n this._setCursorOnMousedown = 'setCursorOnMousedown' in options ? options.setCursorOnMousedown : true; // Options with no default other than \"undefined\".\n // Options with no default other than \"undefined\".\n this._listTemplateDomId = options.listTemplateDomId;\n this._itemTemplateDomId = options.itemTemplateDomId;\n this._itemCssClassName = options.itemCssClassName;\n this._comparator = options.comparator;\n this.listOrientation = options.listOrientation;\n this.dragPattern = options.dragPattern;\n this.scroll = options.scroll; // An initial set of items may be passed in with the options hash.\n // An initial set of items may be passed in with the options hash.\n this.isCompositeSubList= options.isCompositeSubList;\n this.setItems(options.items);\n }\n this._createFromTemplate();\n this._registerCustomScroll();\n dynamicList.activeListId = this.getId();\n this._msgNItemsSelected = new Template(dynamicList.messages['listNItemsSelected']);\n dynamicList.lists[this._id] = this;\n};\ndynamicList.List.addVar('Event', {\n ITEM_SELECTED: 'item:selected',\n ITEM_UNSELECTED: 'item:unselected',\n ITEM_MOUSEUP: 'item:mouseup',\n ITEM_MOUSEDOWN: 'item:mousedown',\n ITEM_CLICK: 'item:click',\n ITEM_DBLCLICK: 'item:dblclick',\n ITEM_OPEN: 'item:open',\n ITEM_CLOSED: 'item:closed',\n ITEM_CONTEXTMENU: 'item:contextmenu',\n ITEM_BEFORE_SELECT_OR_UNSELECT: 'item:beforeSelectOrUnselect'\n});\ndynamicList.List.addVar('DND_WRAPPER_TEMPLATE', 'column_two');\ndynamicList.List.addVar('DND_ITEM_TEMPLATE', 'column_two:resourceName'); ///////////////////////////////////////////////////////\n// List public methods\n///////////////////////////////////////////////////////\n///////////////////////////////////////////////////////\n// List public methods\n///////////////////////////////////////////////////////\ndynamicList.List.addMethod('getNextItemId', function () {\n return this._nextId++;\n}); /**\n * Gets ID of the list which can be used to find this list in map {@see dynamicList.lists}\n *\n * @return {String} - ID for the list and DOM element\n */\n/**\n * Gets ID of the list which can be used to find this list in map {@see dynamicList.lists}\n *\n * @return {String} - ID for the list and DOM element\n */\ndynamicList.List.addMethod('getId', function () {\n return this._id;\n}); /**\n * @return {Array}\n */\n/**\n * @return {Array}\n */\ndynamicList.List.addMethod('getItems', function () {\n return this._items;\n}); /**\n * Resets list items with new items and sorts items, if comparator is defined.\n * @param items {Array} - new array of {@link dynamicList.ListItem}\n */\n/**\n * Resets list items with new items and sorts items, if comparator is defined.\n * @param items {Array} - new array of {@link dynamicList.ListItem}\n */\ndynamicList.List.addMethod('setItems', function (items) {\n if (!items) {\n return;\n } // If the list had a cursor, a new cursor will need to be assigned.\n // Likewise, if focus is lost, focus will need to be reassigned to prevent\n // missing blur events when elements are dropped.\n // NOTE: Do NOT use getCursor here, as it will attempt to assign a cursor\n // if none exists, which in turn may add the cursor to the selection set,\n // depending on list options. THAT, in turn, could fire user callbacks\n // that appear to run on items that are about to be replaced. That could\n // (and did) cause Filter problems on the Search Results page.\n // If the list had a cursor, a new cursor will need to be assigned.\n // Likewise, if focus is lost, focus will need to be reassigned to prevent\n // missing blur events when elements are dropped.\n // NOTE: Do NOT use getCursor here, as it will attempt to assign a cursor\n // if none exists, which in turn may add the cursor to the selection set,\n // depending on list options. THAT, in turn, could fire user callbacks\n // that appear to run on items that are about to be replaced. That could\n // (and did) cause Filter problems on the Search Results page.\n var oldCursor = this.cursor;\n var listEl = this._getElement();\n var hadFocus = false;\n if (listEl && (listEl === document.activeElement || jQuery.contains(listEl, document.activeElement))) {\n hadFocus = true;\n }\n this._items = [];\n this.resetSelected();\n this.addItems(items);\n var newCursor;\n if (oldCursor) {\n // A new cursor will be assigned, if any items exist.\n newCursor = this.getCursor();\n }\n if (hadFocus) {\n if (newCursor && newCursor._getElement()) {\n // NOTE: StdNav plugin for dynamicList will auto-promote focus when\n // available (accessibility extensions are on) and possible (items\n // exist), but this is more efficient.\n jQuery(newCursor._getElement()).focus();\n } else if (listEl) {\n // No items, no suitable cursor, or cursor has not been rendered\n // yet-- focus the list itself.\n jQuery(listEl).focus();\n } // FIXME: Enable when logger is added\n // this.logger.error(\"Focus has been abandoned; region tabindex may be lost\");\n //console.error(\"Focus has been abandoned; region tabindex may be lost\");\n }\n}); /**\n * Adds items to array items of list and sorts it, if comparator is defined.\n * @param items {Array} - array of {@link dynamicList.ListItem}\n */\n/**\n * Adds items to array items of list and sorts it, if comparator is defined.\n * @param items {Array} - array of {@link dynamicList.ListItem}\n */\ndynamicList.List.addMethod('addItems', function (items) {\n if (!items) {\n return;\n }\n items = _.isArray(items) ? items : [items];\n items.compact().each(function (item) {\n this._prepareListItem(item);\n this._items.push(item);\n }.bind(this));\n if (this._comparator) {\n this._items = this._items.sort(this._comparator);\n }\n}); /**\n * Inserts items to appropriate position in array items of list.\n *\n * WARNING: Using this function with sortable lists may cause unexpected results\n *\n * @param pos {int} - position of element after which new items will be inserted.\n * @param items {Array} - array of {@link dynamicList.ListItem}\n */\n/**\n * Inserts items to appropriate position in array items of list.\n *\n * WARNING: Using this function with sortable lists may cause unexpected results\n *\n * @param pos {int} - position of element after which new items will be inserted.\n * @param items {Array} - array of {@link dynamicList.ListItem}\n */\ndynamicList.List.addMethod('insertItems', function (pos, items) {\n if (!items) {\n return;\n }\n items = _.isArray(items) ? items : [items];\n items = items.compact();\n items.each(function (item) {\n this._prepareListItem(item);\n }.bind(this));\n this._items.splice.apply(this._items, [\n pos,\n 0\n ].concat(items));\n if (this._comparator) {\n this._items = this._items.sort(this._comparator);\n }\n}); /**\n * Prepare List Item for adding to list. Set List reference, template DOM ID and css class name.\n */\n/**\n * Prepare List Item for adding to list. Set List reference, template DOM ID and css class name.\n */\ndynamicList.List.addMethod('_prepareListItem', function (item) {\n if (!item) {\n return;\n }\n item.setList(this);\n if (this._itemTemplateDomId && !item.getTemplateDomId()) {\n // If list has specified template for all items and there is no other template\n item.setTemplateDomId(this._itemTemplateDomId);\n }\n if (this._itemCssClassName && !item.getCssClassName()) {\n // If list has specified CSS class for all items and the item don't has CSS class\n item.setCssClassName(this._itemCssClassName);\n }\n if (this._excludeFromEventHandling && !item._excludeFromEventHandling) {\n item._excludeFromEventHandling = this._excludeFromEventHandling;\n }\n if (this._excludeFromSelectionTriggers && !item._excludeFromSelectionTriggers) {\n item._excludeFromSelectionTriggers = this._excludeFromSelectionTriggers;\n }\n}); /**\n * Removes specified items from list\n * @param items {Array} - array of {@link dynamicList.ListItem}\n */\n/**\n * Removes specified items from list\n * @param items {Array} - array of {@link dynamicList.ListItem}\n */\ndynamicList.List.addMethod('removeItems', function (items) {\n if (!items || !isArray(items)) {\n return;\n } // The current cursor and/or browser focus may be lost as a result of this\n // operation. Deleting the current focus does NOT fire blur events!\n // Therefore it is critical to MOVE focus prior to deleting the element, if\n // it is focused.\n // The current cursor and/or browser focus may be lost as a result of this\n // operation. Deleting the current focus does NOT fire blur events!\n // Therefore it is critical to MOVE focus prior to deleting the element, if\n // it is focused.\n var newCursor = this.getCursor();\n var lostFocus = false; // Deselect items PRIOR to removal.\n // Deselect items PRIOR to removal.\n items.each(function (item) {\n // Note that _removeItemFromSelected is used instead of deselectItem to\n // avoid changing the cursor prematurely. This avoids callers reacting\n // to selection/deselection events (which occur as a result of the cursor\n // change on lists with alwaysSelectCursor style) on items that do not\n // exist by the time they attempt to handle those events.\n this._removeItemFromSelected(item);\n if (newCursor === item) {\n // If we are removing the cursor (or the prospective new cursor),\n // ensure a new cursor is assigned.\n newCursor = this.getNextItem(item);\n if (!newCursor) {\n newCursor = this.getPreviousItem(item);\n }\n }\n }.bind(this));\n this._items = this._items.reject(function (item) {\n return items.include(item);\n });\n items.each(function (item) {\n // Sanity check; remove when tested.\n if (newCursor === item) {\n } // FIXME: Turn this on once the logger is in use.\n // logger.error(\"Focus has been abandoned\");\n //console.error(\"Focus has been abandoned\");\n item.unsetList();\n item.refresh();\n }); // Update the cursor, if needed. Note that lists with NO cursor should\n // continue to have no cursor.\n // Update the cursor, if needed. Note that lists with NO cursor should\n // continue to have no cursor.\n if (newCursor !== this.getCursor()) {\n this.setCursor(newCursor);\n } // If focus has been lost, focus the new cursor.\n // If focus has been lost, focus the new cursor.\n if (lostFocus) {\n if (this.getCursor() && this.getCursor()._getElement()) {\n jQuery(this.getCursor()._getElement().focus());\n } else if (this._getElement()) {\n // No cursor, or cursor has not been rendered yet.\n // Set focus to the list, if possible.\n jQuery(this._getElement().focus());\n }\n }\n}); /**\n * @param comparator {Function} -\n */\n/**\n * @param comparator {Function} -\n */\ndynamicList.List.addMethod('sort', function (comparator) {\n comparator && (this._comparator = comparator);\n if (this._comparator) {\n this.getItems().sort(this._comparator);\n }\n}); /** Note that it is not possible to set the cursor to null to remove it. All\n * lists have cursors, and those cursors need to be set. You may not think\n * you need one, but you do-- this is how visually-disabled users read through\n * your list entries.\n *\n * If you really want to disable a visual cursor indication for a particular\n * list, use an ID-based CSS style rule to do so. If the user tabs into the\n * list, they will still be able to navigate using the arrow keys, and will\n * see the usual :focus and .subfocus visual cues when doing so.\n */\n/** Note that it is not possible to set the cursor to null to remove it. All\n * lists have cursors, and those cursors need to be set. You may not think\n * you need one, but you do-- this is how visually-disabled users read through\n * your list entries.\n *\n * If you really want to disable a visual cursor indication for a particular\n * list, use an ID-based CSS style rule to do so. If the user tabs into the\n * list, they will still be able to navigate using the arrow keys, and will\n * see the usual :focus and .subfocus visual cues when doing so.\n */\ndynamicList.List.addMethod('setCursor', function (newCursor) {\n // Other parts of the UI may move the cursor without wanting to move focus;\n // do not grab keyboard focus when this happens.\n var hadFocus = false;\n if (document.activeElement && jQuery.contains(this._getElement(), document.activeElement)) {\n hadFocus = true;\n } // The old cursor, if any (and if rendered), needs the CSS class removed.\n // The old cursor, if any (and if rendered), needs the CSS class removed.\n if (this.cursor && this.cursor.getList() && this.cursor._getElement()) {\n jQuery(this.cursor._getElement()).removeClass('cursor');\n } // Whether it's been rendered or not, this is the new cursor.\n // Whether it's been rendered or not, this is the new cursor.\n this.cursor = newCursor; // Keep in mind the cursor may not have been assigned to list yet, or\n // rendered yet. If it has been, assign the CSS class.\n // Keep in mind the cursor may not have been assigned to list yet, or\n // rendered yet. If it has been, assign the CSS class.\n if (newCursor && newCursor.getList() && newCursor._getElement()) {\n this.scrollUpTo(newCursor);\n if (this._allowSelections && this._selectionDefaultsToCursor) {\n if (this.getSelectedItems().length < 1) {\n this.selectItem(newCursor);\n }\n }\n if (hadFocus) {\n jQuery(this.cursor._getElement()).focus();\n }\n jQuery(this.cursor._getElement()).addClass('cursor');\n }\n}); /**\n */\n/**\n */\ndynamicList.List.addMethod('getCursor', function () {\n if (this.cursor && this.cursor.getList() && this.cursor._getElement()) {\n // When filtering results, we can wind up with cursors that aren't\n // actually visible anymore, because the list has been refreshed with\n // filtered results. However, checking for that is deferred until this\n // point, to avoid interrupting an extended rendering sequence in a\n // detached subtree that has not yet been appended to the DOM.\n //\n // TODO: Evaluate whether this would more appropriately check for the\n // visibility within the list container itself, rather than the overall\n // document. Ensure headless testing does not break, however.\n if (jQuery(this.cursor._getElement()).closest('BODY').length > 0) {\n return this.cursor;\n }\n } // No suitable cursor; use the most recently selected item, if any.\n // No suitable cursor; use the most recently selected item, if any.\n if (this._selectedItems.length > 0) {\n if (this._selectedItems[this._selectedItems.length - 1]._getElement()) {\n this.setCursor(this._selectedItems[this._selectedItems.length - 1]); // Again, as in the case above, this is only useful if the item has\n // not been filtered out, although this should not occur.\n // Again, as in the case above, this is only useful if the item has\n // not been filtered out, although this should not occur.\n if (jQuery(this.cursor._getElement()).closest('BODY').length > 0) {\n return this.cursor;\n }\n }\n } // No cursor or selected items, or possibly, no items in the list.\n // Promote the first list item, if one exists.\n // No cursor or selected items, or possibly, no items in the list.\n // Promote the first list item, if one exists.\n if (this._items.length > 0) {\n this.setCursor(this._items[0]);\n return this.cursor;\n } // No items in the list.\n // No items in the list.\n return null;\n}); /**\n * @return {Array}\n */\n/**\n * @return {Array}\n */\ndynamicList.List.addMethod('getCursorElement', function () {\n // No items in the list, return null.\n if (this.getCursor()) {\n return this.getCursor()._getElement();\n } else {\n return null;\n }\n}); /**\n * @return {Array}\n */\n/**\n * @return {Array}\n */\ndynamicList.List.addMethod('getSelectedItems', function () {\n return this._selectedItems;\n}); /**\n * @param item {dynamicList.ListItem} -\n */\n/**\n * @param item {dynamicList.ListItem} -\n */\ndynamicList.List.addMethod('isItemSelected', function (item) {\n return this.getSelectedItems().include(item);\n}); /**\n * @param item {dynamicList.ListItem} -\n */\n/**\n * @param item {dynamicList.ListItem} -\n */\ndynamicList.List.addMethod('selectItem', function (item, isCtrlHeld, isShiftKeyHeld, isContextMenu) {\n var event = this.fire(this.Event.ITEM_BEFORE_SELECT_OR_UNSELECT, { item: item });\n if (event.stopSelectOrUnselect) {\n return;\n } // Fix for multiple DnD.\n // If couple items selected and _selectOnMousedown enabled\n // we need deselect items on mouse up to be able Drag them.\n // Fix for multiple DnD.\n // If couple items selected and _selectOnMousedown enabled\n // we need deselect items on mouse up to be able Drag them.\n if (this._multiSelect && this._selectedItems.length > 1 && this.isItemSelected(item) && !(isCtrlHeld || isShiftKeyHeld || isContextMenu)) {\n return;\n }\n var isContextMenuOnSelected = this.isItemSelected(item) && isContextMenu;\n var reset = !(this._multiSelect && isCtrlHeld) && !isContextMenuOnSelected;\n var deselect = this.isItemSelected(item) && isCtrlHeld && !isContextMenuOnSelected;\n var selectRange = this._multiSelect && !deselect && isNotNullORUndefined(this._lastSelectedItem) && isShiftKeyHeld;\n var select = !deselect && !selectRange;\n if (reset) {\n this.resetSelected();\n }\n if (deselect && !reset) {\n this._removeItemFromSelected(item);\n }\n if (selectRange) {\n var start = this._items.indexOf(this._lastSelectedItem);\n var end = this._items.indexOf(item);\n var min = Math.min(start, end), max = Math.max(start, end);\n if (min > -1) {\n for (var i = min; i <= max; i++) {\n this._addItemToSelected(this._items[i], false);\n }\n } else {\n this._addItemToSelected(this._items[max], false);\n }\n }\n if (select) {\n this._addItemToSelected(item, !(isShiftKeyHeld && this._multiSelect));\n } // Move the cursor to the most recently selected or deselected item.\n // Move the cursor to the most recently selected or deselected item.\n this.setCursor(item);\n jQuery(item._getElement()).children('[role=\"row\"]').attr(\"aria-selected\", \"true\");\n}); /**\n * @param item {dynamicList.ListItem} -\n */\n/**\n * @param item {dynamicList.ListItem} -\n */\ndynamicList.List.addMethod('deselectItem', function (item) {\n this._removeItemFromSelected(item); // Move the cursor to the most recently selected or deselected item.\n // Move the cursor to the most recently selected or deselected item.\n this.setCursor(item);\n});\ndynamicList.List.addMethod('deselectOthers', function (item, isCtrlHeld, isShiftKey, isContextMenu) {\n var event = this.fire(this.Event.ITEM_BEFORE_SELECT_OR_UNSELECT, { item: item });\n if (event.stopSelectOrUnselect) {\n return;\n } // Fix for multiple DnD.\n // If couple items selected and _selectOnMousedown enabled\n // we need deselect items on mouse up to be able Drag them.\n // Fix for multiple DnD.\n // If couple items selected and _selectOnMousedown enabled\n // we need deselect items on mouse up to be able Drag them.\n if (this._multiSelect && this._selectedItems.length > 1 && this.isItemSelected(item) && !(isCtrlHeld || isShiftKey || isContextMenu)) {\n var items = this._selectedItems.findAll(function (i) {\n return i != item;\n });\n items.each(function (i) {\n this._removeItemFromSelected(i);\n }.bind(this));\n }\n}); /**\n *\n */\n/**\n *\n */\ndynamicList.List.addMethod('resetSelected', function (skipParent) {\n var items = this._selectedItems;\n let itemsLength = items.length;\n if(!itemsLength && this.cursor){\n let cursorEl = this.cursor._getElement();\n jQuery(cursorEl).removeClass('selected');\n }\n this._selectedItems = [];\n items.each(function (item) {\n var thatList = item.getList();\n if (thatList) {\n if (thatList !== this) {\n thatList.resetSelected(true);\n }\n }\n item.refreshStyle();\n this.fire(this.Event.ITEM_UNSELECTED, { item: item });\n jQuery(item._getElement()).children('[role=\"row\"]').attr(\"aria-selected\", \"false\");\n }.bind(this));\n if (this._parentList && !skipParent) {\n this._parentList.resetSelected();\n }\n}); /** Ensure the item is visible in the viewport, to avoid scroll jumps when it\n * is focused. If the item is fully visible, regardless of absolute position\n * on the screen, nothing happens. If the item is offscreen, or partially\n * offscreen, the scrollbar position moves down just far enough to fully show\n * the item. If the item is actually larger than the viewport (which is\n * presumed to be possible, if subitems are expanded), than the top of the\n * item is scrolled to the top of the viewport.\n *\n */\n/** Ensure the item is visible in the viewport, to avoid scroll jumps when it\n * is focused. If the item is fully visible, regardless of absolute position\n * on the screen, nothing happens. If the item is offscreen, or partially\n * offscreen, the scrollbar position moves down just far enough to fully show\n * the item. If the item is actually larger than the viewport (which is\n * presumed to be possible, if subitems are expanded), than the top of the\n * item is scrolled to the top of the viewport.\n *\n */\ndynamicList.List.addMethod('scrollDownTo', function (item) {\n var scrollEl = this._getElement().parentNode;\n if (!scrollEl || !item || !item._getElement()) {\n // Keep the testing framework happy; normally these would never be\n // detatched from the DOM.\n return;\n }\n var scrollTop = scrollEl.scrollTop;\n var scrollPortHeight = scrollEl.offsetHeight;\n var itemYPos = item._getElement().offsetTop;\n var itemHeight = item._getElement().offsetHeight; // TODO: more work if the item is actually taller than the scroll viewport\n // (might happen for expanded items with many subitems).\n // TODO: more work if the item is actually taller than the scroll viewport\n // (might happen for expanded items with many subitems).\n var correction = itemYPos + itemHeight - (scrollTop + scrollPortHeight);\n if (correction > 0) {\n scrollEl.scrollTop += correction;\n }\n}); /** Ensure the item is visible in the viewport, to avoid scroll jumps when it\n * is focused. If the item is fully visible, regardless of absolute position\n * on the screen, nothing happens. If the item is offscreen, or partially\n * offscreen, the scrollbar position moves down just far enough to fully show\n * the item. If the item is actually larger than the viewport (which is\n * presumed to be possible, if subitems are expanded), than the top of the\n * item is scrolled to the top of the viewport.\n */\n/** Ensure the item is visible in the viewport, to avoid scroll jumps when it\n * is focused. If the item is fully visible, regardless of absolute position\n * on the screen, nothing happens. If the item is offscreen, or partially\n * offscreen, the scrollbar position moves down just far enough to fully show\n * the item. If the item is actually larger than the viewport (which is\n * presumed to be possible, if subitems are expanded), than the top of the\n * item is scrolled to the top of the viewport.\n */\ndynamicList.List.addMethod('scrollUpTo', function (item) {\n var scrollEl = this._getElement().parentNode;\n if (!scrollEl || !item || !item._getElement()) {\n // Keep the testing framework happy; normally these would never be\n // detatched from the DOM.\n return;\n }\n var scrollTop = scrollEl.scrollTop;\n var itemYPos = item._getElement().offsetTop; // Hack to try and deal with column headers. The header should NOT have\n // been included in the scrollable region.\n // FIXME-- remove the header from the scrollable region, then remove this\n // hack. Note the potentially invalid assumption that the header has the\n // same height as an item.\n // Hack to try and deal with column headers. The header should NOT have\n // been included in the scrollable region.\n // FIXME-- remove the header from the scrollable region, then remove this\n // hack. Note the potentially invalid assumption that the header has the\n // same height as an item.\n var headerHeight = item._getElement().offsetHeight; // TODO: more work if the item is actually taller than the scroll viewport\n // (might happen for expanded items with many subitems).\n // TODO: more work if the item is actually taller than the scroll viewport\n // (might happen for expanded items with many subitems).\n var correction = scrollTop + headerHeight - itemYPos;\n if (correction > 0) {\n scrollEl.scrollTop -= correction;\n }\n}); /**\n * @param item - reference item\n */\n/**\n * @param item - reference item\n */\ndynamicList.List.addMethod('getNextItem', function (item) {\n var items = this.getItems();\n var currentIndex = items.indexOf(item);\n return ~currentIndex ? this.getItems()[currentIndex + 1] : null;\n}); /**\n * @param item - reference item\n */\n/**\n * @param item - reference item\n */\ndynamicList.List.addMethod('getPreviousItem', function (item) {\n var items = this.getItems();\n var currentIndex = items.indexOf(item);\n return ~currentIndex ? this.getItems()[currentIndex - 1] : null;\n}); /**\n * @param event\n */\n/**\n * @param event\n */\ndynamicList.List.addMethod('selectNext', function (event) {\n var baseEvent = event.memo.targetEvent;\n var item = this.getCursor();\n var subItem = null, nextItem = null; // See if there is a sublist open; if so, transfer responsibility there,\n // unless we were already on the last subitem, in which case, fall through.\n // See if there is a sublist open; if so, transfer responsibility there,\n // unless we were already on the last subitem, in which case, fall through.\n if (item._subList && item._getElement() && jQuery(item._getElement()).hasClass(layoutModule.OPEN_CLASS)) {\n // If we're moving into the sublist directly from the parent, ensure we\n // go to the first item.\n if (!jQuery(item._getElement()).hasClass('supercursor')) {\n if (item._subList.getItems().length > 0) {\n nextItem = item._subList.getItems()[0];\n jQuery(item._getElement()).addClass('supercursor');\n baseEvent.preventDefault();\n baseEvent.stopPropagation();\n item._subList.setCursor(nextItem);\n jQuery(item._subList.cursor._getElement()).focus();\n return;\n }\n }\n subItem = item._subList.getCursor();\n nextItem = subItem.getList().getNextItem(subItem);\n if (nextItem) {\n // Yes, another subitem is available. Go deal with it.\n return subItem.getList().selectNext(event);\n }\n } // Either no sublist, sublist is closed, or out of subitems; select next\n // peer.\n // Either no sublist, sublist is closed, or out of subitems; select next\n // peer.\n jQuery(item._getElement()).removeClass('supercursor');\n if (item._subList) {\n item._subList.cursor = null;\n }\n nextItem = item.getList().getNextItem(item);\n if (nextItem) {\n if (this._multiSelect && isShiftHeld(baseEvent)) {\n if (this.isItemSelected(nextItem)) {\n item.getList().deselectItem(item);\n } else {\n this._addItemToSelected(nextItem, false);\n }\n } else {\n this.resetSelected();\n item.getList().selectItem(nextItem);\n } // NOTE: Implies scroll, refresh, and possibly selection.\n // NOTE: Implies scroll, refresh, and possibly selection.\n this.setCursor(nextItem);\n }\n baseEvent.preventDefault();\n baseEvent.stopPropagation();\n}); /**\n * @param event\n */\n/**\n * @param event\n */\ndynamicList.List.addMethod('selectPrevious', function (event) {\n var baseEvent = event.memo.targetEvent;\n var item = this.getCursor();\n var subItem = null, previousItem = null; // See if there is a sublist open; if so, transfer responsibility there,\n // unless we were already on main item, in which case, fall through; or we\n // were on the first subitem, in which case, move focus to the main item.\n // See if there is a sublist open; if so, transfer responsibility there,\n // unless we were already on main item, in which case, fall through; or we\n // were on the first subitem, in which case, move focus to the main item.\n if (jQuery(item._getElement()).hasClass('supercursor')) {\n subItem = item._subList.getCursor();\n previousItem = subItem.getList().getPreviousItem(subItem);\n if (previousItem) {\n // Yes, a previous subitem is available. Go deal with it.\n return subItem.getList().selectPrevious(event);\n } else {\n // No previous subitem is available. Select the main item instead.\n if (item._subList.cursor) {\n if (item._subList.cursor._element) {\n jQuery(item._subList.cursor._element).removeClass('cursor');\n }\n item._subList.cursor = null;\n }\n if (!(isShiftHeld(baseEvent) && this._multiSelect)) {\n item._subList.resetSelected();\n }\n jQuery(item._getElement()).removeClass('supercursor');\n this.setCursor(item);\n stdnav.forceFocus(jQuery(item._getElement()))\n }\n } else {\n // Normal case-- no sublist, or main item selected.\n previousItem = item.getList().getPreviousItem(item);\n if (previousItem) {\n if (this._multiSelect && isShiftHeld(baseEvent)) {\n if (this.isItemSelected(previousItem)) {\n item.getList().deselectItem(item);\n } else {\n this._addItemToSelected(previousItem, false);\n }\n } else {\n const isLabelItem = previousItem.first && previousItem._value.isLabel;\n if(isLabelItem) {\n return;\n }\n this.resetSelected();\n item.getList().selectItem(previousItem);\n // previous item has sublist and its open then iterate through it\n if (previousItem?._subList?.getItems().length > 0 &&\n jQuery(previousItem._getElement()).hasClass(layoutModule.OPEN_CLASS)) {\n item = previousItem;\n previousItem = _.last(item._subList.getItems());\n jQuery(item._getElement()).addClass('supercursor');\n baseEvent.preventDefault();\n baseEvent.stopPropagation();\n item._subList.setCursor(previousItem);\n stdnav.forceFocus(jQuery(item._subList.cursor._getElement()))\n //jQuery(item._subList.cursor._getElement()).focus();\n return;\n }\n\n }// NOTE: Implies scroll, refresh, and possibly selection.\n this.setCursor(previousItem);\n }\n }\n baseEvent.preventDefault();\n baseEvent.stopPropagation();\n}); /**\n * @param event\n */\n/**\n * @param event\n */\ndynamicList.List.addMethod('selectPageDown', function (event) {\n var baseEvent = event.memo.targetEvent;\n baseEvent.preventDefault();\n baseEvent.stopPropagation();\n var item = this.getCursor(); // FIXME-- the header is part of the scrollable region; it shouldn't be.\n // Use the height of whatever item is handy to stand in for the header.\n // FIXME-- the header is part of the scrollable region; it shouldn't be.\n // Use the height of whatever item is handy to stand in for the header.\n var headerHack = item._getElement().offsetHeight; // Since items may vary in height, figure out the scroll offset of the next\n // page disregarding the items, then figure out the most sensible item to\n // reposition to.\n // Since items may vary in height, figure out the scroll offset of the next\n // page disregarding the items, then figure out the most sensible item to\n // reposition to.\n var scrollEl = this._getElement().parentNode;\n var newScrollTop = scrollEl.scrollTop + (scrollEl.offsetHeight - headerHack);\n if (newScrollTop > scrollEl.offsetHeight) {\n newScrollTop = scrollEl.offsetHeight;\n }\n scrollEl.scrollTop = newScrollTop;\n var iterItem = item, nextItem = null;\n while (iterItem && iterItem._getElement().offsetTop + iterItem._getElement().offsetHeight < scrollEl.scrollTop + scrollEl.offsetHeight) {\n nextItem = iterItem;\n if (isShiftHeld(baseEvent)) {\n if (this.isItemSelected(nextItem)) {\n item.getList().deselectItem(item);\n } else {\n this._addItemToSelected(nextItem, false);\n }\n }\n iterItem = nextItem.getList().getNextItem(nextItem);\n }\n if (nextItem) {\n if (!(this._multiSelect && isShiftHeld(baseEvent))) {\n this.resetSelected();\n item.getList().selectItem(nextItem);\n } // NOTE: Implies scroll, refresh, and possibly selection.\n // NOTE: Implies scroll, refresh, and possibly selection.\n this.setCursor(nextItem);\n }\n});\ndynamicList.List.addMethod('selectPageUp', function (event) {\n var baseEvent = event.memo.targetEvent;\n baseEvent.preventDefault();\n baseEvent.stopPropagation();\n var item = this.getCursor(); // FIXME-- the header is part of the scrollable region; it shouldn't be.\n // Use the height of whatever item is handy to stand in for the header.\n // FIXME-- the header is part of the scrollable region; it shouldn't be.\n // Use the height of whatever item is handy to stand in for the header.\n var headerHack = item._getElement().offsetHeight; // Since items may vary in height, figure out the scroll offset of the next\n // page disregarding the items, then figure out the most sensible item to\n // reposition to.\n // Since items may vary in height, figure out the scroll offset of the next\n // page disregarding the items, then figure out the most sensible item to\n // reposition to.\n var scrollEl = this._getElement().parentNode;\n var newScrollTop = scrollEl.scrollTop + (scrollEl.offsetHeight - headerHack);\n if (newScrollTop > scrollEl.offsetHeight) {\n newScrollTop = scrollEl.offsetHeight;\n }\n scrollEl.scrollTop = newScrollTop;\n var iterItem = item, previousItem = null;\n while (iterItem && iterItem._getElement().offsetTop > scrollEl.scrollTop - scrollEl.offsetHeight) {\n previousItem = iterItem;\n if (this._multiSelect && isShiftHeld(baseEvent)) {\n if (this.isItemSelected(previousItem)) {\n item.getList().deselectItem(item);\n } else {\n this._addItemToSelected(previousItem, false);\n }\n }\n iterItem = previousItem.getList().getPreviousItem(previousItem);\n }\n if (previousItem) {\n if (!(this._multiSelect && isShiftHeld(baseEvent))) {\n this.resetSelected();\n item.getList().selectItem(previousItem);\n } // NOTE: Implies scroll, refresh, and possibly selection.\n // NOTE: Implies scroll, refresh, and possibly selection.\n this.setCursor(previousItem);\n }\n});\ndynamicList.List.addMethod('selectFirst', function () {\n if (this._items[0]) {\n this.resetSelected();\n this.setCursor(this._items[0]);\n }\n});\n\n\ndynamicList.List.addMethod('selectLast', function () {\n if (this._items[this._items.length - 1]) {\n this.resetSelected();\n this.setCursor(this._items[this._items.length - 1]);\n }\n});\n\n/**\n * @param event\n */\ndynamicList.List.addMethod('selectOutwards', function (event) {\n let item = this.getSelectedItems()[0];\n\n if (!item) {\n item = this.cursor;\n }\n\n if (!item) {\n return;\n }\n\n let element = item._getElement();\n let outItem = !baseList.isItemOpen(element) && item.parentItem;\n\n let source = event.target;\n let isRoleRow = jQuery(source).attr(\"role\")===\"row\"\n\n // Todo : fix left key press on sublist focus move to parent list and collapse list\n\n if(isRoleRow) {\n if (outItem) {\n // focus should go on parent on first press of right arrow\n this.resetSelected();\n outItem.select();\n outItem._getElement().focus();\n jQuery('.subfocus').removeClass('subfocus');\n jQuery(outItem._getElement()).addClass('subfocus').addClass('focus-visible').removeClass(\"supercursor\");\n } else {\n let source = event.target;\n jQuery(source).attr('aria-expanded', false);\n baseList.closeItem(element);\n item.getList().selectItem(item);\n item._getElement().focus();\n jQuery('.subfocus').removeClass('subfocus');\n jQuery(item._getElement()).addClass('subfocus').addClass('focus-visible');\n this.fire(this.Event.ITEM_CLOSED, {\n targetEvent: event,\n item: item\n });\n }\n }else {\n let gridItem;\n let dataCellElement = jQuery(source).is('[data-cell]')? jQuery(source) : jQuery(source).closest('[data-cell]');\n let currentCell = dataCellElement? parseInt(jQuery(dataCellElement).attr('data-cell')) : null;\n let parent = jQuery(source).closest('[role =\"row\"]');\n let isFirstCellVisible = jQuery(parent).find(\"[data-cell=0]\").first().css(\"visibility\") !== \"hidden\";\n if (currentCell === 0 && isFirstCellVisible) {\n gridItem = parent\n } else if (currentCell === 1 && !isFirstCellVisible) {\n gridItem = parent\n } else {\n do {\n gridItem = jQuery(parent).find(`[data-cell='${--currentCell}']`).first();\n } while (gridItem.length === 1 && gridItem.css(\"visibility\") === \"hidden\");\n }\n if (gridItem.length > 0) stdnav.forceFocus(gridItem);\n }\n}); /**\n * @param event\n */\n/**\n * @param event\n */\ndynamicList.List.addMethod('selectInwards', function (event) {\n /*\n 1.If there is no cursor for some reason (possibly during construction?)\n then use the first selected item. If there is neither a cursor nor any\n selected items, abort.\n 2.if sublist exists and its not expanded then sublist will open first\n 3.if sublist is expaned then on next right click parentlist item get focused.\n\n Note : refer right keyboard navigation treegrid sample :\n https://www.w3.org/TR/wai-aria-practices-1.1/examples/treegrid/treegrid-1.html\n */\n\n let item = this.cursor;\n let source = event.target;\n\n if (!item) {\n if (this.getSelectedItems().length < 1) {\n return;\n }\n item = this.getSelectedItems()[0];\n }\n let element = item._getElement();\n if (item.isComposite && !baseList.isItemOpen(element)) {\n baseList.openItem(element);\n\n jQuery(source).attr('aria-expanded', true);\n this.fire(this.Event.ITEM_OPEN, {\n targetEvent: event,\n item: item\n });\n }else{\n let isRoleRow = jQuery(source).attr(\"role\")===\"row\";\n let gridItem;\n\n if (isRoleRow) {\n gridItem = jQuery(source).find(\"[data-cell=0]\").css(\"visibility\") === \"hidden\" ?\n jQuery(source).find(\"[data-cell=1]\").first() :\n jQuery(source).find(\"[data-cell=0]\").first();\n } else {\n let dataCell = +jQuery(source).attr('data-cell');\n let parent = jQuery(source).closest('[role =\"row\"]');\n\n do {\n gridItem =jQuery(parent).find(`[data-cell='${++dataCell}']`).first();\n } while(gridItem.length === 1 && gridItem.css(\"visibility\") === \"hidden\");\n }\n if(gridItem.length > 0) stdnav.forceFocus(gridItem);\n\n }\n}); /**\n * Render list items. Use this method when you need to re-render list.\n */\n/**\n * Render list items. Use this method when you need to re-render list.\n */\ndynamicList.List.addMethod('show', function () {\n dynamicList.activeListId = this.getId();\n this._getElement().update();\n var items = this.getItems();\n var itemsAmount = items.length;\n items.each(function (item, index) {\n item.first = index === 0;\n item.last = index === itemsAmount - 1;\n item.show(this._getElement());\n }.bind(this));\n this.draggables = [];\n this.scroll && this.scroll.refresh();\n this._initEvents();\n}); /**\n * Updates UI from value of the item and remove unused DOM elements (li elements)\n */\n/**\n * Updates UI from value of the item and remove unused DOM elements (li elements)\n */\ndynamicList.List.addMethod('refresh', function () {\n if (!this._getElement()) {\n // List has not been rendered yet.\n return;\n }\n let elements = this._getElement().childElements(), itemElements = [];\n this.getItems().each(function (item, index) {\n item.first = index === 0;\n item.last = index === this.getItems().length - 1;\n if (item.isRendered()) {\n if (item.index() != elements.indexOf(item._getElement())) {\n var wasOpened = baseList.isItemOpen(item._getElement());\n item._getElement().remove();\n item.show(this._getElement());\n if (wasOpened) {\n baseList.openItem(item._getElement());\n }\n } else {\n item.refresh();\n }\n } else {\n item.show(this._getElement());\n }\n itemElements.push(item._getElement());\n }.bind(this));\n elements.each(function (e) {\n if (!itemElements.include(e) && e.parentNode) {\n e.remove();\n }\n });\n // Ensure that the list has a cursor.\n this.getCursor();\n // Get the current scroll offset, so it can be sustained after refreshing\n // the list.\n var scrollEl = this._getElement().parentNode, scrollTop;\n if (!scrollEl) {\n // Keep the testing framework happy; normally these would never be\n // detatched from the DOM.\n scrollTop = 0;\n } else {\n scrollTop = scrollEl.scrollTop;\n }\n this.refreshStyle();\n let cursor = this.getCursor(), cursorWasFocus = false;\n if (cursor && cursor.getList() && cursor._getElement()) {\n if (document.activeElement === cursor._getElement() || jQuery.contains(cursor._getElement(), document.activeElement)) {\n cursorWasFocus = true;\n }\n }\n //this.scroll && this.scroll.refresh();\n this.setCursor(cursor); // Refresh can result in loss of focus under certain circumstances.\n // Refresh can result in loss of focus under certain circumstances.\n if (cursorWasFocus) {\n jQuery(this.getCursorElement())[0].focus();\n }\n // Finally, restore the scroll offset. This is necessary if the list was\n // manually scrolled so that the cursor is no longer visible.\n if (scrollEl) {\n scrollEl.scrollTop = scrollTop;\n }\n}); /**\n * Refreshing classname of the list\n */\n/**\n * Refreshing classname of the list\n */\ndynamicList.List.addMethod('refreshStyle', function (clean) {\n var element = this._getElement();\n if (!element) {\n // List has not been rendered yet.\n return;\n }\n if (element.templateClassName) {\n element.className = element.templateClassName;\n }\n if (this._cssClassName) {\n jQuery(element).addClass(this._cssClassName);\n }\n}); /**\n * Generates custom event of the list.\n *\n * @param eventName\n */\n/**\n * Generates custom event of the list.\n *\n * @param eventName\n */\ndynamicList.List.addMethod('fire', function (eventName, memo) {\n var element = jQuery(this._getElement())[0];\n if (element) {\n return element.fire(eventName, memo);\n } else {\n return null;\n }\n}); /**\n * @param eventName\n */\n/**\n * @param eventName\n */\ndynamicList.List.addMethod('observe', function (eventName, handler) {\n this._getElement().observe(eventName, handler);\n}); /**\n * @param eventName\n */\n/**\n * @param eventName\n */\ndynamicList.List.addMethod('stopObserving', function (eventName, handler) {\n this._getElement().stopObserving(eventName, handler);\n}); ///////////////////////////////////////////////////////\n// List private methods\n///////////////////////////////////////////////////////\n/**\n * Gets list container\n * @return {DOMElement}\n */\n///////////////////////////////////////////////////////\n// List private methods\n///////////////////////////////////////////////////////\n/**\n * Gets list container\n * @return {DOMElement}\n */\ndynamicList.List.addMethod('_getElement', function () {\n if (!this._element) {\n // TODO: Improve performance by using a jQuery lookup specifically on\n // the list subdom, rather than the whole page.\n this._element = jQuery('#' + this.getId())[0];\n }\n return this._element;\n}); /**\n * Gets the item from the event in list\n *\n * @paran {Event}\n */\n/**\n * Gets the item from the event in list\n *\n * @paran {Event}\n */\ndynamicList.List.addMethod('getItemByEvent', function (event) {\n if (event) {\n var element = Event.element(event); //event.originalTarget || event.srcElement;\n //event.originalTarget || event.srcElement;\n while (element && element.readAttribute && jQuery(element).attr('id') !== this.getId()) {\n var item = element.listItem;\n if (item && item.getList() != null) {\n var itemList = item.getList(), idsAreEqual = itemList.getId() == this.getId(), parentListContainsChild = this._getElement().contains(itemList._getElement());\n if (idsAreEqual || parentListContainsChild) {\n item._label = xssUtil.unescape(item._label);\n return item;\n } else {\n break;\n }\n } else {\n element = jQuery( element.parentNode)[0];\n }\n }\n }\n return null;\n});\ndynamicList.List.addMethod('_createFromTemplate', function () {\n var tabindex = jQuery(this._getElement()).attr('tabindex');\n this.tabindex = parseInt(tabindex && tabindex.length > 0 ? tabindex : -1);\n this._getElement().insert({ after: this._getTemplateElement(this._getElement()) });\n this._getElement().remove();\n this._element = null;\n this._getElement().update();\n this.tabindex && this.tabindex.length > 0 && jQuery(this._getElement()).attr('tabindex', this.tabindex);\n disableSelectionWithoutCursorStyle(this._getElement());\n});\ndynamicList.List.addMethod('_getTemplateElement', function (currentElement) {\n var id = this._listTemplateDomId;\n if (!dynamicList._templateHash[id]) {\n dynamicList._templateHash[id] = id;\n }\n var clone = document.getElementById(dynamicList._templateHash[id]).clone(true);\n jQuery(clone).attr('id', this.getId()); //clone.down().writeAttribute(\"tabIndex\", -1);\n //clone.down().writeAttribute(\"tabIndex\", -1);\n clone.templateId = id;\n clone.templateClassName = clone.className;\n cloneCustomAttributes(currentElement, clone);\n return clone;\n});\ndynamicList.List.addMethod('_addItemToSelected', function (item, remember) {\n if (item && !this.isItemSelected(item)) {\n this._selectedItems.push(item);\n if (remember) {\n this._lastSelectedItem = item;\n } // item.focus();\n // item.focus();\n item.refreshStyle();\n if (this._parentList) {\n this._parentList._addItemToSelected(item, remember);\n } else {\n this.fire(this.Event.ITEM_SELECTED, { item: item });\n }\n }\n});\ndynamicList.List.addMethod('_removeItemFromSelected', function (item) {\n if (item && this.isItemSelected(item)) {\n this._selectedItems = this._selectedItems.without(item);\n item.refreshStyle();\n if (this._parentList) {\n this._parentList._removeItemFromSelected(item);\n } else {\n this.fire(this.Event.ITEM_UNSELECTED, { item: item });\n }\n }\n});\ndynamicList.List.addMethod('_buildDnDOverlay', function (element) {\n // var wrapper = $(this.DND_WRAPPER_TEMPLATE).cloneNode(true), template = $(this.DND_ITEM_TEMPLATE).cloneNode(true);\n element.setStyle({\n width: null,\n height: null\n });\n if (element.items.length > 1) {\n element.update(this._msgNItemsSelected.evaluate({ count: element.items.length }));\n } else if (element.items.length == 1) {\n element.update(xssUtil.hardEscape(element.items[0].getLabel()));\n }\n});\ndynamicList.List.addMethod('_registerCustomScroll', function () {\n if (!this.scroll && this._getElement()) {\n var scrollBar = this._getElement().up(layoutModule.SWIPE_SCROLL_PATTERN);\n if (scrollBar) {\n var scroll = layoutModule.scrolls.get(scrollBar.identify());\n scroll && (this.scroll = scroll);\n }\n }\n}); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// List DnD\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// List DnD\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\ndynamicList.List.addMethod('createDraggableIfNeeded', function (event) {\n //make draggable - test in this order - for efficiency\n //test 1) does the tree have any drag patterns?\n //test 2) is a draggable already created for the clicked element?\n //test 3) does clicked element or its ancestors match any draggable patterns?\n //test 4) is a draggable already created for the clicked element or matching ancestor?\n //5) if it's complex markup then we go up to parent which matching pattern\n var thisElem = event.element ? event.element() : event.target;\n if (this.dragPattern && !this.draggables[thisElem.identify()]) {\n var matchingElem = matchAny(thisElem, [this.dragPattern], true);\n if (matchingElem) {\n //matchingElem = matchingElem.up(this.dragPattern);\n if (!matchingElem || this.draggables[matchingElem.identify()]) {\n return;\n }\n var item = this.getItemByEvent(event);\n this.draggables[matchingElem.identify()] = new Draggable(matchingElem, {\n superghosting: true,\n mouseOffset: true,\n onStart: this.setDragStartState.bind(this, item),\n onEnd: this.setDragEndState.bind(this, item)\n });\n }\n }\n});\ndynamicList.List.addMethod('setDragStartState', function (item, draggable, event) {\n var templateClassName = item._getElement().templateClassName;\n if (templateClassName) {\n jQuery(draggable.element).addClass(templateClassName);\n }\n jQuery(draggable.element).addClass(layoutModule.DRAGGING_CLASS).addClass(this.getId());\n draggable.element.items = this.getSelectedItems().slice(0);\n this._buildDnDOverlay(draggable.element);\n draggable.options.scroll = this._getElement();\n draggable.options.scrollSensitivity = layoutModule.SCROLL_SENSITIVITY;\n Draggables.dragging = this.regionID || true;\n});\ndynamicList.List.addMethod('setDragEndState', function (draggable, event, item) {\n Draggables.dragging = null;\n}); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// List event handling\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n// List event handling\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\ndynamicList.List.addMethod('_mouseupHandler', function (event) {\n var element = event.target;\n var item = matchMeOrUp(element, layoutModule.BUTTON_PATTERN) && this.getItemByEvent(event);\n if (!item || item._isElementInExcluded(event)) {\n return;\n }\n event.listEvent = true;\n if (item._respondOnItemEvents && !event.isInvoked) {\n this.fire(this.Event.ITEM_MOUSEUP, {\n targetEvent: event,\n item: item\n });\n if (!item._isExcludedFromSelectionTriggers(event)) {\n var isCtrlHeldValue = isMetaHeld(event), isShiftHeldValue = isShiftHeld(event), isContextMenuValue = isRightClick(event); // NOTE: See also comments and logic for drag-and-drop, as these\n // functions overlap\n // NOTE: See also comments and logic for drag-and-drop, as these\n // functions overlap\n var isSelect = !this._selectOnMousedown && !TouchController.element_scrolled && (!isSupportsTouch() || event.changedTouches.length >= 1);\n isSelect && item.getList().selectItem(item, isCtrlHeldValue, isShiftHeldValue, isContextMenuValue); // Fix for Shift key multiple selection if we change selection inside selected range.\n // We need to remember the position of current item as last selected even if selectItem method\n // did not do it. This will help to correctly determine select range start on next selectItem call.\n // Fix for Shift key multiple selection if we change selection inside selected range.\n // We need to remember the position of current item as last selected even if selectItem method\n // did not do it. This will help to correctly determine select range start on next selectItem call.\n if (!isSelect && this._multiSelect && this._selectedItems.length > 1 && this.isItemSelected(item) && !(isCtrlHeldValue || isShiftHeldValue || isContextMenuValue)) {\n this._lastSelectedItem = item;\n }\n item.getList().deselectOthers(item, isMetaHeld(event), isShiftHeld(event), isRightClick(event));\n if (this.twofingers) {\n this.twofingers = false;\n var li = jQuery(element).parents('li:first');\n li.hasClass('selected') && document.fire(layoutModule.ELEMENT_CONTEXTMENU, {\n targetEvent: event,\n node: element\n });\n }\n }\n this.createDraggableIfNeeded(event);\n }\n event.isInvoked = true;\n});\ndynamicList.List.addMethod('_mousedownHandler', function (event) {\n event = event.type == 'dataavailable' ? event.memo.targetEvent : event;\n var element = event.target;\n var item = matchMeOrUp(element, layoutModule.BUTTON_PATTERN + ',' + layoutModule.LIST_ITEM_WRAP_PATTERN) && this.getItemByEvent(event);\n if (!item || item._isElementInExcluded(event)) {\n return;\n }\n event.listEvent = true;\n let iconEvent = this._itemPreventEvent(item,event);\n if (event.touches && event.touches.length == 2) {\n this.twofingers = true; //var li = jQuery(element).parents('li:first');\n //li.hasClass('selected') && document.fire(layoutModule.ELEMENT_CONTEXTMENU, {targetEvent: event, node: element});\n //return;\n } else {\n this.twofingers = false;\n }\n if (iconEvent){\n // Do not focus items that have only had their expanders clicked--\n // this will result in a fixFocus call to the current selection\n // (clicking on the expander will not change the selection), which\n // in turn will fix focus on the current selection, which may move\n // the newly-expanded item out of view. (Clicking on the actual\n // item selects it prior to focusing, which avoids the problem.)\n event.stopPropagation();\n event.preventDefault();\n }\n else {\n if (item._respondOnItemEvents && !event.isInvoked) {\n this.fire(this.Event.ITEM_MOUSEDOWN, {\n targetEvent: event,\n item: item\n });\n if (!item._isExcludedFromSelectionTriggers(event)) {\n // FIXME: See if this can be moved into setCursor\n if (this._selectOnMousedown) {\n // && (!isSupportsTouch() || event.touches.length == 1);\n item.getList().selectItem(item, isMetaHeld(event), isShiftHeld(event), isRightClick(event));\n }\n if (this._setCursorOnMousedown && !isMetaHeld(event)) {\n item.getList().setCursor(item);\n }\n }\n item.focus();\n }\n }\n event.isInvoked = true;\n});\ndynamicList.List.addMethod('_mouseoverHandler', function (event) {\n matchMeOrUp(event.target, layoutModule.BUTTON_PATTERN) && this.createDraggableIfNeeded(event);\n});\ndynamicList.List.addMethod('_clickHandler', function (event) {\n var item = matchMeOrUp(event.target, layoutModule.BUTTON_PATTERN) && this.getItemByEvent(event);\n if (!item || item._isElementInExcluded(event)) {\n return;\n }\n if (!event.isInvoked) {\n if (item._respondOnItemEvents) {\n this.fire(this.Event.ITEM_CLICK, {\n targetEvent: event,\n item: item\n });\n }\n if (!item.isComposite)\n return;\n var element = item._getElement(), source = event.target;\n if (item._isCloseHandler(source) && baseList.isItemOpen(element)) {\n jQuery(source).attr('aria-expanded', false);\n baseList.closeItem(element);\n this.fire(this.Event.ITEM_CLOSED, {\n targetEvent: event,\n item: item\n });\n } else if (item._isOpenHandler(source) && !baseList.isItemOpen(element)) {\n jQuery(source).attr('aria-expanded', true);\n baseList.openItem(element);\n this.fire(this.Event.ITEM_OPEN, {\n targetEvent: event,\n item: item\n });\n }\n }\n event.isInvoked = true;\n});\ndynamicList.List.addMethod('_dblclickHandler', function (event) {\n var item = matchMeOrUp(event.target, layoutModule.BUTTON_PATTERN) && this.getItemByEvent(event);\n if (!item || item._isElementInExcluded(event)) {\n return;\n }\n if (item._respondOnItemEvents && !event.isInvoked) {\n this.fire(this.Event.ITEM_DBLCLICK, {\n targetEvent: event,\n item: item\n });\n }\n event.isInvoked = true;\n});\ndynamicList.List.addMethod('_initEvents', function () {\n var container = this._getElement();\n this.draggables = [];\n if (isSupportsTouch()) {\n container.stopObserving('touchstart').observe('touchstart', this._mousedownHandler.bindAsEventListener(this)); //scriptaculous stopped mousedown event but we made it throw this instead\n //scriptaculous stopped mousedown event but we made it throw this instead\n container.stopObserving('drag:touchstart').observe('drag:touchstart', this._mousedownHandler.bindAsEventListener(this));\n container.stopObserving('touchend').observe('touchend', this._mouseupHandler.bindAsEventListener(this));\n } else {\n container.stopObserving('mouseup').observe('mouseup', this._mouseupHandler.bindAsEventListener(this));\n container.stopObserving('mousedown').observe('mousedown', this._mousedownHandler.bindAsEventListener(this)); //scriptaculous stopped mousedown event but we made it throw this instead\n //scriptaculous stopped mousedown event but we made it throw this instead\n container.stopObserving('drag:mousedown').observe('drag:mousedown', this._mousedownHandler.bindAsEventListener(this));\n }\n if (!isIPad){\n container.stopObserving('mouseover').observe('mouseover', this._mouseoverHandler.bindAsEventListener(this));\n }\n if (this.listOrientation === \"horizontal\"){\n container.stopObserving('key:right').observe('key:right', this.selectNext.bindAsEventListener(this));\n container.stopObserving('key:left').observe('key:left', this.selectPrevious.bindAsEventListener(this));\n }else {\n container.stopObserving('click').observe('click', this._clickHandler.bindAsEventListener(this));\n container.stopObserving('dblclick').observe('dblclick', this._dblclickHandler.bindAsEventListener(this));\n container.stopObserving('key:down').observe('key:down', this.selectNext.bindAsEventListener(this));\n container.stopObserving('key:up').observe('key:up', this.selectPrevious.bindAsEventListener(this));\n container.stopObserving('key:right').observe('key:right', this.selectInwards.bindAsEventListener(this));\n container.stopObserving('key:left').observe('key:left', this.selectOutwards.bindAsEventListener(this));\n container.stopObserving('key:pagedown').observe('key:pagedown', this.selectPageDown.bindAsEventListener(this));\n container.stopObserving('key:pageup').observe('key:pageup', this.selectPageUp.bindAsEventListener(this));\n container.stopObserving('key:home').observe('key:home', this.selectFirst.bindAsEventListener(this));\n container.stopObserving('key:end').observe('key:end', this.selectLast.bindAsEventListener(this));\n }\n});\ndynamicList.List.addMethod('_itemPreventEvent',function(item , event){\n let isComposite = item.isComposite,\n isFavIcon = item.isIconClicked,\n isOpenOrCloseHandler = isComposite && (item._isOpenHandler(event.target) || item._isCloseHandler(event.target)),\n isFavHandler;\n if ( event.which !== 3 ) {\n isFavHandler = item._isFavoriteHandler(event.target);\n }\n\n const compositeItemSelectable = isComposite && ( isOpenOrCloseHandler||isFavHandler);\n const listItemSelectable = isFavIcon && isFavHandler;\n\n return compositeItemSelectable || listItemSelectable ;\n});\n// List element that is rendered from Underscore template string passed as an option\n// List element that is rendered from Underscore template string passed as an option\ndynamicList.UnderscoreTemplatedList = function (id, options) {\n if (options) {\n this._template = 'template' in options ? options.template : '';\n }\n dynamicList.List.apply(this, arguments);\n};\nvar temporaryFunc = function () {\n};\ntemporaryFunc.prototype = dynamicList.List.prototype;\ndynamicList.UnderscoreTemplatedList.prototype = new temporaryFunc();\ndynamicList.UnderscoreTemplatedList.prototype.constructor = dynamicList.UnderscoreTemplatedList;\ndynamicList.UnderscoreTemplatedList.prototype._getTemplateElement = function (currentElement) {\n var element = jQuery(_.template(this._template, {}))[0];\n jQuery(element).attr('id', this.getId());\n element.templateClassName = element.className;\n cloneCustomAttributes(currentElement, element);\n return element;\n};\n\nexport {dynamicList, baseList};\n"],"sourceRoot":""}