@danielgindi/selectbox 1.0.31 → 1.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib.cjs.js +18 -5
- package/dist/lib.cjs.js.map +1 -1
- package/dist/lib.cjs.min.js +2 -2
- package/dist/lib.cjs.min.js.map +1 -1
- package/dist/lib.es6.js +18 -5
- package/dist/lib.es6.js.map +1 -1
- package/dist/lib.es6.min.js +2 -2
- package/dist/lib.es6.min.js.map +1 -1
- package/dist/lib.umd.js +18 -5
- package/dist/lib.umd.js.map +1 -1
- package/dist/lib.umd.min.js +2 -2
- package/dist/lib.umd.min.js.map +1 -1
- package/lib/SelectBox.js +17 -4
- package/package.json +1 -1
package/dist/lib.es6.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["lib/utils/escapeRegex.js","lib/DropList.js","lib/utils/throttle.js","lib/SelectBox.js"],"sourcesContent":["export default value => value.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\r\n","import escapeRegex from './utils/escapeRegex';\r\nimport {\r\n closestUntil,\r\n createElement,\r\n} from '@danielgindi/dom-utils/lib/Dom';\r\nimport {\r\n remove,\r\n toggleClass,\r\n} from '@danielgindi/dom-utils/lib/DomCompat';\r\nimport {\r\n setCssProps,\r\n getElementHeight,\r\n getElementWidth,\r\n setElementHeight,\r\n setElementWidth, getElementOffset, anchoredPosition,\r\n} from '@danielgindi/dom-utils/lib/Css';\r\nimport DomEventsSink from '@danielgindi/dom-utils/lib/DomEventsSink';\r\nimport VirtualListHelper from '@danielgindi/virtual-list-helper';\r\nimport parseCssTransition from 'parse-css-transition';\r\nimport {\r\n VALUE_DOWN,\r\n VALUE_END,\r\n VALUE_ENTER, VALUE_ESCAPE,\r\n VALUE_HOME,\r\n VALUE_PAGE_DOWN,\r\n VALUE_PAGE_UP,\r\n VALUE_SPACE,\r\n VALUE_UP,\r\n} from 'keycode-js';\r\n\r\nconst ItemSymbol = Symbol('item');\r\nconst DestroyedSymbol = Symbol('destroyed');\r\nconst GhostSymbol = Symbol('ghost');\r\n\r\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\r\n\r\n/**\r\n * @typedef {Object} DropList.Options\r\n * @property {Element} [el] An element to attach to, instead of creating a new one\r\n * @property {string} [baseClassName='droplist'] class name for the menu root element\r\n * @property {string|string[]} [additionalClasses]\r\n * @property {number} [itemBlurDelay=300] How long to wait before deciding to blur the focused item?\r\n * @property {boolean} [capturesFocus=true] Should this DropList be added to the TAB-key stack?\r\n * @property {boolean} [multi=false] Does this DropList show checkboxes for multiple item selection?\r\n * @property {function} [keyDownHandler=null] An alternative \"keydown\" event handler. Return true to prevent default behaviour.\r\n * @property {boolean} [autoCheckGroupChildren=true] When a group is checked/unchecked - all items beneath it will update accordingly\r\n * @property {boolean} [useExactTargetWidth=false] Use the exact target's width, do not allow growing\r\n * @property {boolean} [constrainToWindow=true] Should the position be constrained to the window, attaching to window's borders if needed?\r\n * @property {Boolean} [autoFlipDirection=true] Should the position/anchor be flipped automatically when there's no space in the required direction?\r\n * @property {number} [estimatedItemHeight=20] An estimated row height, for approximating scroll height.\r\n * @property {boolean} [estimateWidth=false] Use an estimation for the width instead of measuring. May be faster - needs testing and may depend on the CSS.\r\n * @property {number} [virtualMinItems=100] Turns into a virtual list - with items being created and showing up on viewport only. The value specified the minimum item count where a virtual list will be created.\r\n * @property {string} [labelProp='label']\r\n * @property {string} [valueProp='value']\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderItem] Function to call when rendering an item element\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderItem] Function to call when rendering an item element\r\n * @property {function(name: string, data: *)} [on]\r\n * */\r\n/** */\r\n\r\n/**\r\n * @typedef {Object} DropList.PositionAnchor\r\n * @property {'left'|'center'|'right'|'start'|'end'|string|number} x - horizontal anchor specification (could be either `'left'|'center'|'right'|'start'|'end'` or a percentage `'50%'` or a fixed decimal `Number`)\r\n * @property {'top'|'center'|'bottom'|string|number} y - vertical anchor specification (could be either `'top'|'center'|'bottom'` or a percentage `'50%'` or a fixed decimal `Number`)\r\n * */\r\n/** */\r\n\r\n/**\r\n * @typedef {Object} DropList.PositionOptions\r\n * @property {Element} [target] Target element to act as anchor\r\n * @property {{left: number, top: number}} [targetOffset=undefined] Override the offset of target. Automatically calculated if unspecified.\r\n * @property {number} [targetHeight=undefined] Override height of the target\r\n * @property {number} [targetWidth=undefined] Override width of the target\r\n * @property {DropList.PositionAnchor} [position=undefined]\r\n * @property {DropList.PositionAnchor} [anchor=undefined]\r\n * @property {boolean} [updateWidth=false] Should update the width of the menu according to target\r\n * @property {string} [targetRtl=undefined] Override for rtl mode of the target\r\n * @property {{x: number, y: number}} [offset=undefined] Extra rtl-aware offset to the target\r\n * */\r\n/** */\r\n\r\n/**\r\n * @typedef {Object} DropList.ItemBase\r\n * @property {string} [value]\r\n * @property {string} [label]\r\n * @property {boolean} [_group=false]\r\n * @property {boolean} [_child=false]\r\n * @property {boolean} [_nocheck=false]\r\n * @property {boolean} [_nointeraction=false]\r\n * */\r\n\r\n/**\r\n * @typedef {DropList.ItemBase} DropList.Item\r\n * @property {boolean} [_checked=false]\r\n * */\r\n/** */\r\n\r\n/** @type {DropList.Options} */\r\nlet defaultOptions = {\r\n baseClassName: 'droplist',\r\n\r\n itemBlurDelay: 300,\r\n capturesFocus: true,\r\n multi: false,\r\n keyDownHandler: null,\r\n autoCheckGroupChildren: true,\r\n useExactTargetWidth: false,\r\n\r\n constrainToWindow: true,\r\n autoFlipDirection: true,\r\n\r\n estimateWidth: false,\r\n virtualMinItems: 100,\r\n\r\n labelProp: 'label',\r\n valueProp: 'value',\r\n\r\n on: null,\r\n};\r\n\r\n/*\r\nEmits the following events:\r\n---------------------------\r\n\r\n'itemfocus' {value, item}: item gained focus.\r\n'itemblur' {value, item}: item lost focus.\r\n'select' {value, item}: item was selected (in single mode).\r\n'show:before': the drop list will show.\r\n'show': the drop list has been shown.\r\n'hide:before': the drop list will hide.\r\n'hide': the drop list was hidden.\r\n'hide:after': emitted after the hide css transition has ended, or immediately after 'hide'.\r\n'check' {value, item, isCheckingGroup}: item was selected (in multi mode).\r\n'groupcheck' {value, item, affectedItems}: item was selected (in multi mode).\r\n */\r\n\r\n// noinspection JSUnusedGlobalSymbols\r\nclass DropList {\r\n\r\n /**\r\n * @param {DropList.Options} options\r\n */\r\n constructor(options) {\r\n const o = { ...defaultOptions };\r\n\r\n for (let [key, value] of Object.entries(/**@type Object*/options))\r\n if (value !== undefined)\r\n o[key] = value;\r\n\r\n const p = this._p = {\r\n ownsEl: true,\r\n elOriginalDisplay: '',\r\n\r\n baseClassName: o.baseClassName,\r\n additionalClasses: o.additionalClasses,\r\n itemBlurDelay: o.itemBlurDelay,\r\n capturesFocus: o.capturesFocus,\r\n multi: o.multi,\r\n keyDownHandler: o.keyDownHandler,\r\n autoCheckGroupChildren: o.autoCheckGroupChildren,\r\n useExactTargetWidth: o.useExactTargetWidth,\r\n constrainToWindow: o.constrainToWindow,\r\n autoFlipDirection: o.autoFlipDirection,\r\n estimateWidth: o.estimateWidth,\r\n virtualMinItems: o.virtualMinItems,\r\n labelProp: o.labelProp,\r\n valueProp: o.valueProp,\r\n renderItem: o.renderItem,\r\n unrenderItem: o.unrenderItem,\r\n on: o.on,\r\n\r\n focusItemIndex: -1,\r\n focusItemEl: null,\r\n\r\n sink: new DomEventsSink(),\r\n };\r\n\r\n let classes = [p.baseClassName];\r\n\r\n if (p.additionalClasses) {\r\n classes = classes.concat(p.additionalClasses);\r\n }\r\n\r\n const initialCss = {\r\n // make initial position not interfere with layout so it can be correctly calculated\r\n top: '-9999px',\r\n };\r\n\r\n let el = o.el;\r\n if (el instanceof Element) {\r\n p.elOriginalDisplay = el.style.display || '';\r\n el.classList.add(...classes);\r\n el.role = 'menu';\r\n setCssProps(/**@type ElementCSSInlineStyle*/el, initialCss);\r\n p.ownsEl = false;\r\n } else {\r\n el = createElement('ul', {\r\n class: classes.join(' '),\r\n role: 'menu',\r\n css: initialCss,\r\n });\r\n }\r\n\r\n p.el = el;\r\n\r\n p.items = [];\r\n\r\n p.groupCount = 0; // This will keep state of how many `group` items we have\r\n\r\n p.mouseHandled = false;\r\n\r\n p.virtualListHelper = new VirtualListHelper({\r\n list: p.el,\r\n virtual: true,\r\n buffer: 5,\r\n estimatedItemHeight: o.estimatedItemHeight || 20,\r\n itemElementCreatorFn: () => {\r\n return createElement('li',\r\n {\r\n role: 'menuitem',\r\n tabIndex: p.capturesFocus ? -1 : null,\r\n },\r\n );\r\n },\r\n onItemRender: (itemEl, index) => {\r\n let item;\r\n\r\n if ((/**@type any*/index) === GhostSymbol) {\r\n item = {\r\n [p.labelProp]: p.lastMeasureLongestLabelText,\r\n [p.valueProp]: 'Measure',\r\n };\r\n itemEl.setAttribute('aria-hidden', 'true');\r\n } else {\r\n item = p.items[index];\r\n }\r\n\r\n if (!item) {\r\n // eslint-disable-next-line no-console\r\n console.warn('onItemRender called for (' + index + ') which has no item');\r\n }\r\n\r\n itemEl.className = `${p.baseClassName}__item`;\r\n\r\n const classList = itemEl.classList;\r\n\r\n if (p.multi) {\r\n if (item._nocheck) {\r\n classList.add(`${p.baseClassName}__item_multi_nocheck`);\r\n } else {\r\n classList.add(`${p.baseClassName}__item_multi`);\r\n\r\n if (item._checked) {\r\n classList.add(`${p.baseClassName}__item_checked`);\r\n }\r\n }\r\n } else {\r\n classList.add(`${p.baseClassName}__item_single`);\r\n }\r\n\r\n if (item._group)\r\n classList.add(`${p.baseClassName}__item_group`);\r\n\r\n if (item._child)\r\n classList.add(`${p.baseClassName}__item_child`);\r\n\r\n if (item._nointeraction)\r\n classList.add(`${p.baseClassName}__item_nointeraction`);\r\n\r\n if (p.focusItemIndex === index) {\r\n p.focusItemEl = itemEl;\r\n classList.add(`${p.baseClassName}__item_focus`);\r\n }\r\n\r\n this._renderItemContent(item, itemEl);\r\n\r\n itemEl[ItemSymbol] = item;\r\n },\r\n });\r\n\r\n if (typeof p.unrenderItem === 'function') {\r\n const fn = p.unrenderItem;\r\n p.virtualListHelper.setOnItemUnrender(el => {\r\n try {\r\n fn(el[ItemSymbol], el);\r\n } catch (err) { console.error(err); } // eslint-disable-line no-console\r\n delete el[ItemSymbol];\r\n\r\n if (p.focusItemEl === el)\r\n p.focusItemEl = null;\r\n });\r\n } else {\r\n p.virtualListHelper.setOnItemUnrender(el => {\r\n delete el[ItemSymbol];\r\n\r\n if (p.focusItemEl === el)\r\n p.focusItemEl = null;\r\n });\r\n }\r\n\r\n if (p.capturesFocus) {\r\n el.tabIndex = 0;\r\n }\r\n\r\n this._hookMouseEvents();\r\n this._hookTouchEvents();\r\n this._hookFocusEvents();\r\n this._hookKeyEvents();\r\n }\r\n\r\n destroy() {\r\n if (this[DestroyedSymbol])\r\n return;\r\n this[DestroyedSymbol] = true;\r\n\r\n const p = this._p;\r\n\r\n clearTimeout(p.timer);\r\n clearTimeout(p.filterTimer);\r\n\r\n p.sink.remove();\r\n p.virtualListHelper.destroy();\r\n\r\n if (p.el) {\r\n remove(p.el);\r\n }\r\n\r\n if (!p.ownsEl) {\r\n for (let name of Array.from(p.el.classList)) {\r\n if (name.startsWith(p.baseClassName)) {\r\n p.el.classList.remove(name);\r\n }\r\n }\r\n p.el.removeAttribute('role');\r\n for (let key of ['position', 'left', 'top', 'right', 'bottom', 'z-index']) {\r\n p.el.style[key] = '';\r\n }\r\n p.el.style.display = p.elOriginalDisplay;\r\n }\r\n\r\n if (p.lastPositionTarget) {\r\n p.lastPositionTarget.classList.remove(\r\n `has_${p.baseClassName}`,\r\n `has_${p.baseClassName}_above`,\r\n `has_${p.baseClassName}_below`);\r\n delete p.lastPositionTarget;\r\n }\r\n\r\n this._p = null;\r\n }\r\n\r\n get el() {\r\n return this._p.el;\r\n }\r\n\r\n /**\r\n * @param {string|string[]} classes\r\n * @returns {DropList}\r\n */\r\n setAdditionalClasses(classes) {\r\n const p = this._p;\r\n p.additionalClasses = classes;\r\n this._syncBaseClasses();\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {DropList}\r\n */\r\n setLabelProp(prop) {\r\n const p = this._p;\r\n p.labelProp = prop;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {DropList}\r\n */\r\n setValueProp(prop) {\r\n const p = this._p;\r\n p.valueProp = prop;\r\n return this;\r\n }\r\n\r\n _syncBaseClasses() {\r\n const p = this._p, el = p.el;\r\n\r\n if (!el)\r\n return;\r\n\r\n let classes = [p.baseClassName];\r\n\r\n if (p.additionalClasses) {\r\n classes = classes.concat(p.additionalClasses);\r\n }\r\n\r\n el.className = classes.join(' ');\r\n }\r\n\r\n blurFocusedItem(fromFocus) {\r\n const p = this._p;\r\n\r\n if (!fromFocus) {\r\n clearTimeout(p.timer);\r\n }\r\n\r\n if (!this.hasFocusedItem()) {\r\n return;\r\n }\r\n\r\n let focusItemEl = p.focusItemEl;\r\n if (focusItemEl) {\r\n focusItemEl.classList.remove(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = null;\r\n }\r\n\r\n const item = p.items[p.focusItemIndex];\r\n p.focusItemIndex = -1;\r\n\r\n if (!item)\r\n return;\r\n\r\n this._trigger('itemblur', { value: item[p.valueProp], item: item });\r\n }\r\n\r\n nextPage(event) {\r\n this._move('next_page', event);\r\n }\r\n\r\n previousPage(event) {\r\n this._move('prev_page', event);\r\n }\r\n\r\n toggleFocusedItem() {\r\n const p = this._p;\r\n\r\n if (this.hasFocusedItem() && p.multi) {\r\n let item = p.items[p.focusItemIndex];\r\n if (item._nocheck || item._nointeraction) return this;\r\n\r\n item._checked = !item._checked;\r\n if (p.focusItemEl) {\r\n toggleClass(p.focusItemEl, `${p.baseClassName}__item_checked`, item._checked);\r\n }\r\n this._trigger('check', { value: item[p.valueProp], item: item });\r\n\r\n this._updateGroupStateForItem(item);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n triggerItemSelection(event) {\r\n const p = this._p;\r\n\r\n p.focusItemEl = p.focusItemEl || closestUntil(event.target, 'li', p.el);\r\n p.focusItemIndex = p.virtualListHelper.getItemIndexFromElement(p.focusItemEl);\r\n if (p.focusItemIndex === undefined)\r\n p.focusItemIndex = -1;\r\n\r\n let item = p.focusItemEl[ItemSymbol];\r\n if (item._nointeraction) {\r\n return false;\r\n }\r\n\r\n if (!p.multi) {\r\n this._setSingleSelectedItemEl(p.focusItemEl);\r\n }\r\n\r\n this._trigger('select', { value: item ? item[p.valueProp] : undefined, item: item });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.Item} item The item to add. It is copied.\r\n * @param {number} [atIndex=-1] The index to insert at (or -1)\r\n * @returns {DropList}\r\n */\r\n addItem(item, atIndex = -1) {\r\n return this.addItems([item], atIndex);\r\n }\r\n\r\n /**\r\n * Adds items to the menu and renders\r\n * @param {DropList.Item[]} itemsToAdd The items to add. These are copied.\r\n * @param {number} [atIndex=-1] The index to insert at (or -1)\r\n * @returns {DropList}\r\n */\r\n addItems(itemsToAdd, atIndex = -1) {\r\n const p = this._p, labelProp = p.labelProp, valueProp = p.valueProp;\r\n\r\n let isMulti = p.multi;\r\n let items = p.items;\r\n\r\n if (atIndex == null || atIndex < 0 || atIndex >= p.items.length) {\r\n atIndex = -1;\r\n }\r\n\r\n // Determine if the list is virtual or not\r\n this._determineVirtualMode(items.length + itemsToAdd.length);\r\n\r\n for (let i = 0, count = itemsToAdd.length; i < count; i++) {\r\n let oitem = itemsToAdd[i];\r\n //noinspection PointlessBooleanExpressionJS\r\n let item = {\r\n [ItemSymbol]: oitem,\r\n [labelProp]: oitem[labelProp],\r\n [valueProp]: oitem[valueProp],\r\n _nocheck: !!oitem._nocheck,\r\n _nointeraction: !!oitem._nointeraction,\r\n };\r\n\r\n if (isMulti) {\r\n item._checked = !!oitem._checked;\r\n }\r\n\r\n if (oitem._group) {\r\n item._group = true;\r\n p.groupCount++;\r\n }\r\n\r\n if (oitem._child) {\r\n // This is used for setting a child class,\r\n // But can be used to determine that current item is not part of above group,\r\n // mainly where the groups are oddly sorted.\r\n item._child = true;\r\n }\r\n\r\n // Add the item to the list of them\r\n if (atIndex !== -1) {\r\n items.splice(atIndex, 0, item);\r\n } else {\r\n items.push(item);\r\n }\r\n\r\n if (atIndex !== -1) {\r\n atIndex++;\r\n }\r\n }\r\n\r\n p.virtualListHelper\r\n .addItemsAt(itemsToAdd.length, atIndex === -1 ? atIndex : (atIndex - itemsToAdd.length))\r\n .render();\r\n\r\n return this;\r\n }\r\n\r\n updateItemByValue(value, newItem) {\r\n const p = this._p;\r\n\r\n // Look for the proper item\r\n let itemIndex = this.itemIndexByValue(value);\r\n if (itemIndex < -1) return this;\r\n\r\n let item = this.itemAtIndex(itemIndex);\r\n item[ItemSymbol] = newItem;\r\n\r\n if (hasOwnProperty.call(newItem, p.labelProp))\r\n item[p.labelProp] = newItem[p.labelProp];\r\n\r\n if (hasOwnProperty.call(newItem, p.valueProp))\r\n item[p.valueProp] = newItem[p.valueProp];\r\n\r\n if (hasOwnProperty.call(newItem, '_nocheck'))\r\n item._nocheck = !!newItem._nocheck;\r\n\r\n if (hasOwnProperty.call(newItem, '_nointeraction'))\r\n item._nointeraction = !!newItem._nointeraction;\r\n\r\n if (p.multi) {\r\n if (hasOwnProperty.call(newItem, '_checked'))\r\n item._checked = !!newItem._checked;\r\n }\r\n\r\n if (hasOwnProperty.call(newItem, '_group')) {\r\n if (!!newItem._group !== item._group) {\r\n if (item._group)\r\n p.groupCount--;\r\n else p.groupCount++;\r\n\r\n newItem._group = !!item._group;\r\n }\r\n }\r\n\r\n if (hasOwnProperty.call(newItem, '_child'))\r\n item._child = !!newItem._child;\r\n\r\n if (p.virtualListHelper.isItemRendered(itemIndex)) {\r\n p.virtualListHelper\r\n .refreshItemAt(itemIndex)\r\n .render();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n removeItem(value, label) {\r\n const p = this._p;\r\n\r\n // Look for the proper item\r\n let itemIndex = this.itemIndexByValueOrLabel(value, label);\r\n if (itemIndex < -1) return this;\r\n\r\n let spliced = p.items.splice(itemIndex, 1);\r\n if (spliced[0]._group) {\r\n p.groupCount--;\r\n }\r\n\r\n p.virtualListHelper\r\n .removeItemsAt(itemIndex, 1)\r\n .render();\r\n\r\n return this;\r\n }\r\n\r\n removeAllItems() {\r\n const p = this._p;\r\n\r\n p.items.length = 0;\r\n p.groupCount = 0;\r\n\r\n p.virtualListHelper\r\n .setCount(0)\r\n .render();\r\n\r\n return this;\r\n }\r\n\r\n itemDataByValue(value) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (item[valueProp] === value) {\r\n return item;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n itemIndexByValue(value) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (item[valueProp] === value) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n itemIndexByValueOrLabel(value, label) {\r\n const p = this._p, labelProp = p.labelProp, valueProp = p.valueProp;\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (item[valueProp] === value || item[labelProp] === label) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n items() {\r\n return this._p.items.slice(0);\r\n }\r\n\r\n itemsReference() {\r\n return this._p.items;\r\n }\r\n\r\n itemCount() {\r\n return this._p.items.length;\r\n }\r\n\r\n itemAtIndex(index) {\r\n return this._p.items[index];\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.PositionOptions} positionOptions\r\n * @returns {DropList}\r\n * @public\r\n */\r\n relayout(positionOptions) {\r\n const p = this._p, el = p.el;\r\n\r\n if (!this.isVisible()) return this;\r\n\r\n let w = window;\r\n\r\n let targetBox = {};\r\n\r\n let offset = positionOptions.targetOffset || getElementOffset(positionOptions.target);\r\n targetBox.left = offset.left;\r\n targetBox.top = offset.top;\r\n targetBox.height = positionOptions.targetHeight == null\r\n ? getElementHeight(positionOptions.target, true, true)\r\n : positionOptions.targetHeight;\r\n targetBox.width = positionOptions.targetWidth == null\r\n ? getElementWidth(positionOptions.target, true, true)\r\n : positionOptions.targetWidth;\r\n targetBox.bottom = targetBox.top + targetBox.height;\r\n\r\n let viewport = {};\r\n viewport.top = w.pageYOffset;\r\n viewport.left = w.pageXOffset;\r\n viewport.width = w.innerWidth;\r\n viewport.height = w.innerHeight;\r\n viewport.bottom = viewport.top + viewport.height;\r\n viewport.right = viewport.left + viewport.width;\r\n\r\n let defaultVerticalDirection = (positionOptions.position && positionOptions.position.y === 'bottom')\r\n ? 'above'\r\n : 'below';\r\n\r\n // Reset dropdown width\r\n el.style.width = '';\r\n\r\n // Make estimations\r\n if (p.estimateWidth ||\r\n p.virtualListHelper.isVirtual()) {\r\n this._measureItem();\r\n }\r\n\r\n // Calculate virtual viewport size\r\n if (p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.render();\r\n }\r\n\r\n // Now set the width of the dropdown\r\n if (positionOptions.updateWidth) {\r\n this._updateWidth(positionOptions);\r\n }\r\n\r\n // How much space is there above, and how much below?\r\n let roomAbove = targetBox.top - viewport.top;\r\n let roomBelow = viewport.bottom - targetBox.bottom;\r\n\r\n // Calculate height for dropdown\r\n\r\n let maxViewHeight;\r\n\r\n const elComputedStyle = getComputedStyle(el);\r\n\r\n let isBoxing = elComputedStyle.boxSizing === 'border-box';\r\n let verticalPadding = (parseFloat(elComputedStyle.paddingTop) || 0) +\r\n (parseFloat(elComputedStyle.paddingBottom) || 0);\r\n let verticalBorderWidth = (parseFloat(elComputedStyle.borderTopWidth) || 0) +\r\n (parseFloat(elComputedStyle.borderBottomWidth) || 0);\r\n\r\n if (p.virtualListHelper.isVirtual()) {\r\n maxViewHeight =\r\n p.virtualListHelper.estimateFullHeight() +\r\n verticalPadding +\r\n verticalBorderWidth;\r\n } else {\r\n // Another method to calculate height is measuring the whole thing at once.\r\n // This causes relayout of course.\r\n el.style.height = '';\r\n el.style.top = '-9999px';\r\n\r\n maxViewHeight = Math.max(getElementHeight(p.el), el.scrollHeight);\r\n maxViewHeight += verticalPadding + verticalBorderWidth;\r\n }\r\n\r\n // Consider css max-height\r\n\r\n let maxHeight = parseFloat(elComputedStyle.maxHeight);\r\n if (!isNaN(maxHeight)) {\r\n if (!isBoxing) {\r\n maxHeight += verticalPadding + verticalBorderWidth;\r\n }\r\n\r\n maxViewHeight = Math.min(maxViewHeight, maxHeight);\r\n }\r\n\r\n // Figure out the direction\r\n\r\n let enoughRoomAbove = roomAbove >= maxViewHeight;\r\n let enoughRoomBelow = roomBelow >= maxViewHeight;\r\n\r\n let newDirection = p.currentDirection || defaultVerticalDirection;\r\n if (newDirection === 'above' && !enoughRoomAbove && enoughRoomBelow) {\r\n newDirection = 'below';\r\n } else if (newDirection === 'below' && !enoughRoomBelow && enoughRoomAbove) {\r\n newDirection = 'above';\r\n } else if (enoughRoomAbove && enoughRoomBelow) {\r\n if (newDirection !== defaultVerticalDirection &&\r\n ((defaultVerticalDirection === 'above' && roomAbove >= roomBelow) ||\r\n (defaultVerticalDirection === 'below' && roomBelow >= roomAbove))) {\r\n newDirection = defaultVerticalDirection;\r\n }\r\n } else if (!enoughRoomAbove && !enoughRoomBelow) {\r\n if (roomAbove > roomBelow) {\r\n newDirection = 'above';\r\n } else if (roomBelow > roomAbove) {\r\n newDirection = 'below';\r\n }\r\n }\r\n p.currentDirection = newDirection;\r\n\r\n // Figure out that final view size\r\n let viewSize = {\r\n width: getElementWidth(el, true, true),\r\n height: Math.min(maxViewHeight, Math.max(roomAbove, roomBelow, 0)),\r\n };\r\n\r\n let isTargetRtl = positionOptions.targetRtl !== undefined ?\r\n positionOptions.targetRtl :\r\n (positionOptions.target == null ? false : getComputedStyle(positionOptions.target).direction === 'rtl');\r\n let isRtlDocument = getComputedStyle(document.documentElement).direction === 'rtl';\r\n\r\n let anchor = anchoredPosition(positionOptions.target,\r\n positionOptions.anchor ? positionOptions.anchor.x : 'start',\r\n positionOptions.anchor ? positionOptions.anchor.y : 'bottom',\r\n targetBox, isTargetRtl);\r\n let position = anchoredPosition(el,\r\n positionOptions.position ? positionOptions.position.x : 'start',\r\n positionOptions.position ? positionOptions.position.y : 'top',\r\n viewSize, isTargetRtl);\r\n\r\n // If it's not in the direction that the user expected, invert it\r\n let invertYPos =\r\n (position.specY === 'top' && newDirection === 'above') ||\r\n (position.specY === 'bottom' && newDirection === 'below') ||\r\n (position.specY !== 'bottom' && position.specY !== 'top' && newDirection === 'above');\r\n\r\n let scrollLeft =\r\n (w.pageXOffset !== undefined) ?\r\n w.pageXOffset :\r\n (document.documentElement || document.body.parentNode || document.body).scrollLeft;\r\n scrollLeft = Math.abs(scrollLeft);\r\n if (isRtlDocument) {\r\n scrollLeft = document.documentElement.scrollWidth - scrollLeft - document.documentElement.clientWidth;\r\n }\r\n\r\n let minX = scrollLeft,\r\n maxX = document.documentElement.clientWidth + scrollLeft - viewSize.width;\r\n\r\n let viewCss = {\r\n 'position': 'absolute',\r\n 'left': targetBox.left,\r\n 'top': targetBox.top + (invertYPos ? (anchor.bottom - position.bottom) : (anchor.top - position.top)),\r\n };\r\n\r\n if (isRtlDocument) {\r\n viewCss.left -= document.documentElement.clientWidth - document.documentElement.scrollWidth;\r\n }\r\n\r\n viewCss.left += anchor.left - position.left;\r\n\r\n if (positionOptions.offset) {\r\n if (positionOptions.offset.y) {\r\n if (invertYPos) {\r\n viewCss.top -= positionOptions.offset.y;\r\n } else {\r\n viewCss.top += positionOptions.offset.y;\r\n }\r\n }\r\n\r\n if (positionOptions.offset.x) {\r\n let rtl = elComputedStyle.direction === 'rtl';\r\n viewCss.left += rtl\r\n ? -positionOptions.offset.x\r\n : positionOptions.offset.x;\r\n }\r\n }\r\n\r\n if (p.autoFlipDirection) {\r\n if ((position.specX === 'right' &&\r\n viewCss.left < minX &&\r\n (Math.max(viewCss.left, minX) + viewSize.width - targetBox.left) / targetBox.width > 0.5) ||\r\n (position.specX === 'left' &&\r\n viewCss.left > maxX &&\r\n (Math.min(viewCss.left, maxX) - targetBox.left) / targetBox.width < 0.5)) {\r\n viewCss.left -= anchor.left - position.left;\r\n viewCss.left += anchor.right - position.right;\r\n }\r\n }\r\n\r\n // Constrain to the window if required\r\n if (p.constrainToWindow) {\r\n for (let which of (isRtlDocument ? ['min', 'max'] : ['max', 'min'])) {\r\n if (which === 'min' && viewCss.left < minX)\r\n viewCss.left = minX;\r\n else if (which === 'max' && viewCss.left > maxX)\r\n viewCss.left = maxX;\r\n }\r\n }\r\n\r\n // Set position CSS\r\n viewCss.left += 'px';\r\n viewCss.top += 'px';\r\n setCssProps(el, viewCss);\r\n setElementHeight(el, viewSize.height, true, true);\r\n\r\n // Update the scroll position for virtual lists\r\n p.virtualListHelper.render();\r\n\r\n // Update position classes\r\n if (positionOptions && positionOptions.target) {\r\n p.lastPositionTarget = positionOptions.target;\r\n\r\n toggleClass(positionOptions.target, `has_${p.baseClassName}`, true);\r\n toggleClass(positionOptions.target, `has_${p.baseClassName}_below`, newDirection === 'below');\r\n toggleClass(positionOptions.target, `has_${p.baseClassName}_above`, newDirection === 'above');\r\n\r\n toggleClass(el, `${p.baseClassName}__is_below`, newDirection === 'below');\r\n toggleClass(el, `${p.baseClassName}__is_above`, newDirection === 'above');\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the checked mode of a specific value.\r\n * @public\r\n * @param {*} value - array of values to check\r\n * @param {boolean} checked - will the value be checked?\r\n * @returns {DropList} self\r\n */\r\n setItemChecked(value, checked) {\r\n const p = this._p;\r\n\r\n checked = !!checked;\r\n\r\n let index = this.itemIndexByValue(value);\r\n if (index === -1) return this;\r\n\r\n let li = p.virtualListHelper.getItemElementAt(index);\r\n if (!li) return this;\r\n\r\n let item = li[ItemSymbol];\r\n\r\n checked = checked && !item._nocheck;\r\n\r\n if (item._checked !== checked) {\r\n item._checked = checked;\r\n\r\n toggleClass(li, `${p.baseClassName}__item_checked`, item._checked);\r\n\r\n this._updateGroupStateForItem(item);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the checked values. All the other values will be unchecked,\r\n * @public\r\n * @param {Array<*>} values - array of values to check\r\n * @returns {DropList} self\r\n */\r\n setCheckedValues(values) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n let groupIndexes = [];\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n let checked = !item._nocheck && values.indexOf(item[valueProp]) !== -1;\r\n\r\n if (item._group) {\r\n groupIndexes.push(i);\r\n }\r\n\r\n if (item._checked === checked) continue;\r\n\r\n item._checked = checked;\r\n\r\n let li = p.virtualListHelper.getItemElementAt(i);\r\n if (!li) continue;\r\n\r\n toggleClass(li, `${p.baseClassName}__item_checked`, item._checked);\r\n }\r\n\r\n if (p.autoCheckGroupChildren) {\r\n for (let i = 0, count = groupIndexes.length; i < count; i++) {\r\n this._updateGroupCheckedState(groupIndexes[i], false);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get all checked values. Returns array of item values.\r\n * @public\r\n * @param {boolean} excludeGroups=false Exclude group items\r\n * @returns {Array<*>} self\r\n */\r\n getCheckedValues(excludeGroups) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n excludeGroups = excludeGroups && p.groupCount > 0;\r\n\r\n let values = [];\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (!item._checked) continue;\r\n if (excludeGroups && item._group) continue;\r\n values.push(item[valueProp]);\r\n }\r\n\r\n return values;\r\n }\r\n\r\n /**\r\n * Get all checked items. Returns array of actual item data object.\r\n * @public\r\n * @param {boolean} excludeGroups=false Exclude group items\r\n * @returns {DropList.Item[]}\r\n */\r\n getCheckedItems(excludeGroups) {\r\n const p = this._p;\r\n\r\n excludeGroups = excludeGroups && p.groupCount > 0;\r\n\r\n let items = [];\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (!item._checked) continue;\r\n if (excludeGroups && item._group) continue;\r\n items.push(item);\r\n }\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.PositionOptions?} positionOptions\r\n * @returns {DropList}\r\n * @public\r\n */\r\n show(positionOptions) {\r\n const p = this._p;\r\n\r\n p.hiding = false;\r\n\r\n if (!this.isVisible()) {\r\n this._trigger('show:before');\r\n }\r\n\r\n p.mouseHandled = false;\r\n\r\n setTimeout(() => { // If it's from a click event, we do not want an immediate hide...\r\n if (this[DestroyedSymbol]) return;\r\n\r\n if (!p.onDocumentMouseDown) {\r\n p.sink.add(document, 'mousedown', p.onDocumentMouseDown = (event) => {\r\n if (closestUntil(event.target, `.${p.baseClassName}`, p.el) !== p.el) {\r\n this._delayBlur();\r\n }\r\n });\r\n }\r\n }, 0);\r\n\r\n const el = p.el;\r\n el.style.position = 'absolute';\r\n el.classList.remove(`${p.baseClassName}__is-hiding`);\r\n document.body.appendChild(el);\r\n\r\n p.visible = true;\r\n\r\n p.el.style.display = '';\r\n if (getComputedStyle(p.el).display === 'none')\r\n p.el.style.display = 'block';\r\n\r\n if (positionOptions) {\r\n const elComputedStyle = getComputedStyle(el);\r\n\r\n // Set max height to avoid adding scrollbars to page\r\n const originalMaxHeight = el.style.maxHeight;\r\n let maxHeight = document.body.clientHeight -\r\n (parseFloat(elComputedStyle.marginTop) || 0) -\r\n (parseFloat(elComputedStyle.marginBottom) || 0) -\r\n (elComputedStyle.boxSizing === 'border-box'\r\n ? 0\r\n : ((parseFloat(elComputedStyle.borderTopWidth) || 0) +\r\n (parseFloat(elComputedStyle.borderBottomWidth) || 0)));\r\n\r\n el.style.maxHeight = Math.min(maxHeight, parseFloat(elComputedStyle.maxHeight) || maxHeight) + 'px';\r\n\r\n this.relayout(positionOptions);\r\n\r\n // Restore original max-height\r\n el.style.maxHeight = originalMaxHeight;\r\n } else {\r\n // Calculate virtual viewport size\r\n if (p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.render();\r\n }\r\n }\r\n\r\n if (this.isVisible()) {\r\n this._trigger('show');\r\n }\r\n\r\n return this;\r\n }\r\n\r\n hide() {\r\n const p = this._p, el = p.el;\r\n\r\n if (p.onDocumentMouseDown) {\r\n p.sink.remove(document, 'mousedown', p.onDocumentMouseDown);\r\n p.onDocumentMouseDown = null;\r\n }\r\n\r\n if (this.isVisible()) {\r\n this._trigger('hide:before');\r\n\r\n p.hiding = true;\r\n\r\n if (el) {\r\n\r\n el.classList.add(`${p.baseClassName}__is-hiding`);\r\n\r\n // support for hide transition in css\r\n const maxTransitionDuration = parseCssTransition(getComputedStyle(p.el).transition)\r\n .reduce((p, v) => Math.max(p, v.delay + v.duration), 0);\r\n\r\n if (maxTransitionDuration > 0) {\r\n setTimeout(() => {\r\n if (this[DestroyedSymbol]) return;\r\n\r\n if (this._p && el.parentNode && p.hiding) {\r\n remove(el);\r\n el.classList.remove(`${p.baseClassName}__is-hiding`);\r\n p.visible = false;\r\n this._trigger('hide:after');\r\n }\r\n });\r\n } else {\r\n remove(el);\r\n el.classList.remove(`${p.baseClassName}__is-hiding`);\r\n }\r\n }\r\n\r\n p.visible = false;\r\n\r\n this.blurFocusedItem();\r\n this._trigger('hide');\r\n\r\n if (this[DestroyedSymbol]) return;\r\n this._trigger('hide:after');\r\n }\r\n\r\n if (p.lastPositionTarget) {\r\n p.lastPositionTarget.classList.remove(\r\n `has_${p.baseClassName}`,\r\n `has_${p.baseClassName}_above`,\r\n `has_${p.baseClassName}_below`);\r\n delete p.lastPositionTarget;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n isVisible() {\r\n const p = this._p;\r\n if (!p.visible)\r\n return false;\r\n return p.el.parentNode && getComputedStyle(p.el).display !== 'none';\r\n }\r\n\r\n hasFocusedItem() {\r\n return this._p.focusItemIndex > -1;\r\n }\r\n\r\n getFocusedItemIndex() {\r\n if (!this.hasFocusedItem())\r\n return -1;\r\n return this._p.focusItemIndex;\r\n }\r\n\r\n setFocusedItemAtIndex(itemIndex) {\r\n const p = this._p;\r\n\r\n p.focusItemIndex = itemIndex;\r\n\r\n let item = null;\r\n if (itemIndex > -1)\r\n item = p.items[itemIndex];\r\n if (item && item._nointeraction)\r\n item = null;\r\n if (itemIndex > -1) {\r\n this.scrollItemIndexIntoView(itemIndex);\r\n }\r\n let itemElement = item ? p.virtualListHelper.getItemElementAt(itemIndex) : null;\r\n\r\n if (p.focusItemEl !== itemElement) {\r\n if (p.focusItemEl) {\r\n p.focusItemEl.classList.remove(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = null;\r\n }\r\n\r\n if (itemElement) {\r\n itemElement.classList.add(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = itemElement;\r\n\r\n this._trigger('itemfocus', { value: itemElement[p.valueProp], item: itemElement[ItemSymbol] });\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n setFocusedItem(item) {\r\n const p = this._p;\r\n\r\n let itemIndex = item._nointeraction ? -1 : this._getItemIndex(item);\r\n\r\n if (itemIndex > -1 && p.items[itemIndex]._nointeraction)\r\n itemIndex = -1;\r\n\r\n return this.setFocusedItemAtIndex(itemIndex);\r\n }\r\n\r\n setFocusedItemByValue(value) {\r\n return this.setFocusedItemAtIndex(this.itemIndexByValue(value));\r\n }\r\n\r\n setSingleSelectedItemAtIndex(itemIndex) {\r\n const p = this._p;\r\n\r\n let itemEl = null;\r\n\r\n if (itemIndex > -1 && !p.items[itemIndex]._nointeraction) {\r\n itemEl = p.virtualListHelper.getItemElementAt(itemIndex);\r\n }\r\n\r\n this._setSingleSelectedItemEl(itemEl);\r\n\r\n return this;\r\n }\r\n\r\n setSingleSelectedItem(item) {\r\n const p = this._p;\r\n\r\n let itemIndex = item._nointeraction ? -1 : this._getItemIndex(item);\r\n\r\n if (itemIndex > -1 && p.items[itemIndex]._nointeraction)\r\n itemIndex = -1;\r\n\r\n return this.setSingleSelectedItemAtIndex(itemIndex);\r\n }\r\n\r\n setSingleSelectedItemByValue(value) {\r\n return this.setSingleSelectedItemAtIndex(this.itemIndexByValue(value));\r\n }\r\n\r\n next(event) {\r\n this._move('next', event);\r\n }\r\n\r\n previous(event) {\r\n this._move('prev', event);\r\n }\r\n\r\n isFirstItem() {\r\n const p = this._p;\r\n return p.focusItemIndex === 0 && p.focusItemIndex < p.items.length;\r\n }\r\n\r\n isLastItem() {\r\n const p = this._p;\r\n return p.focusItemIndex > -1 && p.focusItemIndex === p.items.length - 1;\r\n }\r\n\r\n scrollItemIndexIntoView(itemIndex) {\r\n const p = this._p;\r\n\r\n if (this._hasScroll()) {\r\n const el = p.el, scrollTop = el.scrollTop;\r\n\r\n let itemPos, previousPos = -1;\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n itemPos = p.virtualListHelper.getItemPosition(itemIndex);\r\n\r\n if (itemPos === previousPos)\r\n break;\r\n\r\n previousPos = itemPos;\r\n\r\n let itemSize = p.virtualListHelper.getItemSize(itemIndex);\r\n\r\n let listHeight = el.clientHeight;\r\n\r\n if (itemPos < scrollTop) {\r\n el.scrollTop = itemPos;\r\n } else if (itemPos + itemSize > scrollTop + listHeight) {\r\n el.scrollTop = itemPos + itemSize - listHeight;\r\n }\r\n\r\n // force update items, until the positions and sizes are final\r\n p.virtualListHelper.render();\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n _getItemIndex(item) {\r\n const p = this._p, labelProp = p.labelProp, valueProp = p.valueProp;\r\n\r\n let itemIndex = -1;\r\n\r\n if (item) {\r\n itemIndex = p.items.indexOf(item);\r\n if (itemIndex === -1) {\r\n let value = (item && item[valueProp] !== undefined) ? item[valueProp] : item;\r\n let label = (item && item[labelProp]) ? item[labelProp] : value;\r\n itemIndex = this.itemIndexByValueOrLabel(value, label);\r\n }\r\n }\r\n\r\n return itemIndex;\r\n }\r\n\r\n _setSingleSelectedItemEl(itemEl) {\r\n const p = this._p;\r\n\r\n if (p.singleSelectedItemEl) {\r\n p.singleSelectedItemEl.classList.remove(`${p.baseClassName}__item_checked`);\r\n p.singleSelectedItemEl = null;\r\n }\r\n\r\n if (itemEl) {\r\n itemEl.classList.add(`${p.baseClassName}__item_checked`);\r\n p.singleSelectedItemEl = itemEl;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} event\r\n * @param {*} [data]\r\n * @private\r\n */\r\n _trigger(event, data) {\r\n const p = this._p;\r\n if (p.on)\r\n p.on(event, ...(data === undefined ? [] : [data]));\r\n }\r\n\r\n _itemUpAction(event, itemEl) {\r\n if (closestUntil(event.target, '.requires-pointer-events,button', itemEl)) return;\r\n\r\n let p = this._p;\r\n\r\n if (!this._mouseHandled) {\r\n\r\n this.triggerItemSelection(event);\r\n\r\n if (!this[DestroyedSymbol]) { // If we are not destroyed in response to a click/select\r\n this.toggleFocusedItem();\r\n\r\n if (document.activeElement !== this.el) {\r\n if (p.focusItemEl) {\r\n clearTimeout(p.timer);\r\n }\r\n }\r\n }\r\n\r\n setTimeout(() => {\r\n this._mouseHandled = false;\r\n }, 0);\r\n }\r\n }\r\n\r\n _hookMouseEvents() {\r\n const p = this._p;\r\n\r\n p.sink\r\n .add(p.el, 'mousedown', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n event.preventDefault();\r\n })\r\n .add(p.el, 'mouseup', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n if (event.button !== 0) return;\r\n\r\n this._itemUpAction(event, li);\r\n })\r\n .add(p.el, 'mouseover', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n this._handleMouseOver(event, li);\r\n });\r\n }\r\n\r\n _handleMouseOver(event, itemEl) {\r\n this._focus(event, itemEl);\r\n }\r\n\r\n _hookTouchEvents() {\r\n const p = this._p;\r\n\r\n let currentTouchId;\r\n\r\n p.sink.add(p.el, 'touchstart', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n if (currentTouchId) return;\r\n if (closestUntil(event.target, '.requires-pointer-events,button', li)) return;\r\n\r\n currentTouchId = event.changedTouches[0].identifier;\r\n\r\n // Simulate mouseover event\r\n this._handleMouseOver(event, li);\r\n\r\n // Track scrolling\r\n let didScroll = false;\r\n let onScroll = () => { didScroll = true; };\r\n let onTouchCancel = () => {\r\n currentTouchId = null;\r\n p.sink.remove(null, '.dropdown_touchextra');\r\n };\r\n\r\n let elToTrackScroll = li.parentNode;\r\n while (elToTrackScroll) {\r\n p.sink.add(elToTrackScroll, 'scroll.dropdown_touchextra', onScroll);\r\n elToTrackScroll = elToTrackScroll.parentNode;\r\n }\r\n p.sink.add(window, 'scroll.dropdown_touchextra', onScroll);\r\n\r\n p.sink.add(window, 'touchcancel.dropdown_touchextra', onTouchCancel);\r\n\r\n p.sink.add(p.el, 'touchend.dropdown_touchextra', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return onTouchCancel();\r\n\r\n let touch = Array.prototype.find.call(event.changedTouches, (touch) => {\r\n return touch.identifier === currentTouchId;\r\n });\r\n if (!touch) return onTouchCancel();\r\n\r\n onTouchCancel();\r\n\r\n if (!didScroll) {\r\n this._itemUpAction(event, li);\r\n event.preventDefault();\r\n }\r\n });\r\n });\r\n }\r\n\r\n _hookFocusEvents() {\r\n const p = this._p;\r\n\r\n p.sink\r\n .add(p.el, 'focus', event => {\r\n let itemEl = p.focusItemEl || // focused item\r\n p.el.firstChild; // or the first item\r\n\r\n this._focus(event, itemEl);\r\n })\r\n .add(p.el, 'blur', () => {\r\n setTimeout(() => {\r\n if (this[DestroyedSymbol]) return;\r\n\r\n if (!p.el.contains(document.activeElement)) {\r\n this._delayBlur();\r\n }\r\n });\r\n });\r\n }\r\n\r\n _hookKeyEvents() {\r\n const p = this._p;\r\n\r\n p.sink.add(p.el, 'keydown', evt => this._keydown(evt));\r\n p.sink.add(p.el, 'keypress', evt => this._keydown(evt));\r\n }\r\n\r\n _keydown(event) {\r\n const p = this._p;\r\n\r\n if (p.keyDownHandler && p.keyDownHandler.call(this, event)) {\r\n return;\r\n }\r\n\r\n let preventDefault = true;\r\n\r\n switch (event.key) {\r\n case VALUE_PAGE_UP:\r\n case VALUE_PAGE_DOWN:\r\n case VALUE_HOME:\r\n case VALUE_END:\r\n case VALUE_UP:\r\n case VALUE_DOWN:\r\n event.preventDefault();\r\n\r\n switch (event.key) {\r\n case VALUE_PAGE_UP:\r\n this.previousPage(event);\r\n break;\r\n case VALUE_PAGE_DOWN:\r\n this.nextPage(event);\r\n break;\r\n case VALUE_HOME:\r\n this._move('first', event);\r\n break;\r\n case VALUE_END:\r\n this._move('last', event);\r\n break;\r\n case VALUE_UP:\r\n this.previous(event);\r\n break;\r\n case VALUE_DOWN:\r\n this.next(event);\r\n break;\r\n }\r\n break;\r\n\r\n case VALUE_ENTER:\r\n this.triggerItemSelection(event);\r\n event.preventDefault();\r\n break;\r\n\r\n case VALUE_SPACE:\r\n this.toggleFocusedItem();\r\n event.preventDefault();\r\n break;\r\n\r\n case VALUE_ESCAPE:\r\n event.preventDefault();\r\n this.hide();\r\n break;\r\n\r\n default: {\r\n if (event.type === 'keydown') return;\r\n this._keydownFreeType(event);\r\n preventDefault = false;\r\n }\r\n }\r\n }\r\n\r\n _keydownFreeType(evt) {\r\n const p = this._p, labelProp = p.labelProp;\r\n\r\n // noinspection JSDeprecatedSymbols\r\n let character = evt.key || String.fromCharCode(evt.keyCode);\r\n if (character.length !== 1) return;\r\n\r\n clearTimeout(p.filterTimer);\r\n\r\n // Accumulate text to find from keystrokes\r\n let keyword = (p.previousFilter || '') + character;\r\n\r\n let regex = new RegExp(`^${escapeRegex(keyword)}`, 'i');\r\n\r\n let matchIndices = [];\r\n let item;\r\n\r\n // These are all the possible matches\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n item = p.items[i];\r\n if (regex.test(item[labelProp])) {\r\n matchIndices.push(i);\r\n }\r\n }\r\n\r\n // Did we find anything?\r\n if (!matchIndices.length) {\r\n // No... So start over with this character as the only one.\r\n keyword = character;\r\n regex = new RegExp(`^${escapeRegex(keyword)}`, 'i');\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n item = p.items[i];\r\n if (regex.test(item[labelProp])) {\r\n matchIndices.push(i);\r\n }\r\n }\r\n }\r\n\r\n let focusItemIndex = p.focusItemIndex;\r\n let matchIndex = -1;\r\n\r\n // Find a match *after* the focused item\r\n for (let i = 0, count = matchIndices.length; i < count; i++) {\r\n if (matchIndices[i] >= focusItemIndex) {\r\n matchIndex = matchIndices[i];\r\n break;\r\n }\r\n }\r\n\r\n // Find a match from the beginning.\r\n if (matchIndex === -1 && matchIndices.length) {\r\n matchIndex = matchIndices[0];\r\n }\r\n\r\n if (matchIndex > -1) {\r\n let next = p.virtualListHelper.getItemElementAt(matchIndex);\r\n this._focus(evt, next || null, matchIndex);\r\n\r\n if (!this.isVisible()) {\r\n this.triggerItemSelection(evt);\r\n }\r\n\r\n // Record the last filter used\r\n p.previousFilter = keyword;\r\n\r\n // Clear the last filter - a second from now.\r\n p.filterTimer = setTimeout(() => {\r\n delete p.previousFilter;\r\n }, 1000);\r\n\r\n } else {\r\n delete p.previousFilter;\r\n }\r\n }\r\n\r\n _focus(event, itemEl, itemIndex) {\r\n const p = this._p;\r\n\r\n this.blurFocusedItem(!!event && event.type === 'focus');\r\n\r\n if (!itemIndex && itemEl) {\r\n itemIndex = p.virtualListHelper.getItemIndexFromElement(itemEl);\r\n }\r\n\r\n if (itemIndex > -1) {\r\n this.scrollItemIndexIntoView(itemIndex);\r\n } else if (itemIndex === undefined) {\r\n itemEl = null;\r\n }\r\n\r\n let focusItemEl = itemEl || p.virtualListHelper.getItemElementAt(itemIndex);\r\n\r\n if (focusItemEl) {\r\n if (focusItemEl[ItemSymbol]._nointeraction) {\r\n this.blurFocusedItem();\r\n } else {\r\n focusItemEl.classList.add(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = focusItemEl;\r\n p.focusItemIndex = itemIndex;\r\n\r\n const item = p.items[itemIndex];\r\n this._trigger('itemfocus', { value: item[p.valueProp], item: item });\r\n }\r\n } else {\r\n // This could happen if trying to focus a grouped item\r\n this.blurFocusedItem();\r\n }\r\n }\r\n\r\n _delayBlur() {\r\n if (this[DestroyedSymbol])\r\n return;\r\n\r\n const p = this._p;\r\n\r\n clearTimeout(p.timer);\r\n\r\n p.timer = setTimeout(() => {\r\n if (this[DestroyedSymbol]) return;\r\n this.blurFocusedItem();\r\n }, p.itemBlurDelay);\r\n }\r\n\r\n _move(direction, event) {\r\n const p = this._p;\r\n\r\n let next, nextIndex, directionUp = false;\r\n\r\n if (direction === 'first') {\r\n nextIndex = 0;\r\n directionUp = false;\r\n } else if (direction === 'last') {\r\n nextIndex = p.items.length - 1;\r\n directionUp = true;\r\n } else if (direction === 'prev') {\r\n if (!this.hasFocusedItem())\r\n return this._move('last', event);\r\n\r\n nextIndex = p.focusItemIndex - 1;\r\n if (nextIndex === -1) {\r\n nextIndex = p.items.length - 1;\r\n }\r\n\r\n directionUp = true;\r\n } else if (direction === 'next') {\r\n if (!this.hasFocusedItem())\r\n return this._move('first', event);\r\n\r\n nextIndex = p.focusItemIndex + 1;\r\n if (nextIndex === p.items.length) {\r\n nextIndex = 0;\r\n }\r\n\r\n directionUp = false;\r\n } else if (direction === 'prev_page' || direction === 'next_page') {\r\n\r\n if (!this.hasFocusedItem()) {\r\n return this._move(direction === 'prev_page' ? 'prev' : 'next', event);\r\n }\r\n\r\n if ((direction === 'prev_page' && this.isFirstItem()) ||\r\n (direction === 'next_page' && this.isLastItem())) return;\r\n\r\n if (this._hasScroll()) {\r\n\r\n if (p.virtualListHelper.isVirtual()) {\r\n let visibleItemCount = p.virtualListHelper.getVisibleItemCount();\r\n\r\n nextIndex = p.focusItemIndex;\r\n\r\n if (direction === 'prev_page') {\r\n nextIndex -= visibleItemCount;\r\n } else {\r\n nextIndex += visibleItemCount;\r\n }\r\n\r\n if (nextIndex < 0) {\r\n nextIndex = 0;\r\n } else if (nextIndex >= p.items.length) {\r\n nextIndex = p.items.length;\r\n }\r\n } else if (p.focusItemEl) {\r\n let base = getElementOffset(p.focusItemEl).top;\r\n let height = getElementHeight(p.el, true);\r\n\r\n while (true) { // eslint-disable-line no-constant-condition\r\n next = p.focusItemEl.nextElementSibling;\r\n if (!next) return;\r\n if (next.tagName !== 'LI') continue;\r\n\r\n if (direction === 'prev_page') {\r\n if (getElementOffset(next).top - base + height <= 0)\r\n break;\r\n } else {\r\n if (getElementOffset(next).top - base - height >= 0)\r\n break;\r\n }\r\n }\r\n\r\n if (next) {\r\n nextIndex = p.virtualListHelper.getItemIndexFromElement(next);\r\n\r\n if (nextIndex === undefined)\r\n nextIndex = -1;\r\n }\r\n }\r\n\r\n } else {\r\n return this._move(direction === 'prev_page' ? 'first' : 'last', event);\r\n }\r\n\r\n directionUp = direction === 'prev_page';\r\n } else {\r\n return;\r\n }\r\n\r\n let itemCount = p.items.length;\r\n\r\n if (nextIndex >= itemCount) {\r\n return;\r\n }\r\n\r\n let item = p.items[nextIndex];\r\n // noinspection UnnecessaryLocalVariableJS\r\n let startedAtIndex = nextIndex;\r\n\r\n while (item && item._nointeraction) {\r\n if (directionUp) {\r\n nextIndex--;\r\n if (nextIndex === -1) {\r\n nextIndex = itemCount;\r\n }\r\n } else {\r\n nextIndex++;\r\n if (nextIndex === itemCount) {\r\n nextIndex = 0;\r\n }\r\n }\r\n\r\n item = p.items[nextIndex];\r\n\r\n if (nextIndex === startedAtIndex) {\r\n break;\r\n }\r\n }\r\n\r\n next = p.virtualListHelper.getItemElementAt(nextIndex);\r\n this._focus(event, next || null, nextIndex);\r\n\r\n if (!this.isVisible()) {\r\n this.triggerItemSelection(event);\r\n }\r\n }\r\n\r\n _hasScroll() {\r\n return this.el.clientHeight < this.el.scrollHeight;\r\n }\r\n\r\n _updateGroupStateForItem(item) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (p.multi && p.autoCheckGroupChildren) {\r\n\r\n let items, groupIndex, itemIndex;\r\n\r\n if (item._group) {\r\n // Now loop through children below the group\r\n\r\n items = p.items;\r\n groupIndex = items.indexOf(item);\r\n\r\n let affectedItems = 0;\r\n\r\n for (let i = groupIndex + 1, len = items.length; i < len; i++) {\r\n let next = items[i];\r\n\r\n // Hit the next group, break out\r\n if (next._group || (!next._child && items[i - 1]._child))\r\n break;\r\n\r\n // No change, skip\r\n if (!!next._checked === item._checked)\r\n continue;\r\n\r\n // Update state\r\n next._checked = item._checked;\r\n\r\n affectedItems++;\r\n\r\n // Update DOM\r\n let nextEl = p.virtualListHelper.getItemElementAt(i);\r\n if (nextEl) {\r\n toggleClass(nextEl, `${p.baseClassName}__item_checked`, item._checked);\r\n }\r\n\r\n // Fire event\r\n this._trigger('check', { value: next[valueProp], item: next, isCheckingGroup: true });\r\n }\r\n\r\n // Fire event\r\n this._trigger('groupcheck', { value: item[valueProp], item: item, affectedItems: affectedItems });\r\n } else if (p.groupCount > 0) {\r\n items = p.items;\r\n itemIndex = items.indexOf(item);\r\n groupIndex = -1;\r\n\r\n // Find the group index\r\n for (let i = itemIndex - 1; i >= 0; i--) {\r\n if (items[i]._group) {\r\n groupIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (groupIndex > -1) {\r\n this._updateGroupCheckedState(groupIndex, true);\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n _updateGroupCheckedState(groupIndex, fireEvents) {\r\n const p = this._p;\r\n\r\n if (p.multi && p.autoCheckGroupChildren && groupIndex > -1) {\r\n\r\n let items = p.items;\r\n let groupItem = items[groupIndex];\r\n if (!groupItem || !groupItem._group) return this;\r\n\r\n let item, hasChecked = false, hasUnchecked = false;\r\n\r\n for (let i = groupIndex + 1, len = items.length; i < len; i++) {\r\n item = items[i];\r\n\r\n // Hit the next group, break out\r\n if (item._group || (!item._child && items[i - 1]._child))\r\n break;\r\n\r\n if (item._checked) {\r\n hasChecked = true;\r\n } else if (!item._checked) {\r\n hasUnchecked = true;\r\n }\r\n }\r\n\r\n // See if we need to update the group\r\n let shouldCheckGroup = hasChecked && !hasUnchecked;\r\n if (!!groupItem._checked !== shouldCheckGroup) {\r\n // Update state\r\n groupItem._checked = shouldCheckGroup;\r\n\r\n // Update DOM\r\n let nextEl = p.virtualListHelper.getItemElementAt(groupIndex);\r\n if (nextEl) {\r\n toggleClass(nextEl, `${p.baseClassName}__item_checked`, groupItem._checked);\r\n }\r\n\r\n if (fireEvents) {\r\n // Fire event\r\n this._trigger('check', { value: groupItem[p.valueProp], item: groupItem });\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @private\r\n * @returns {DropList} self\r\n */\r\n _measureItem() {\r\n const p = this._p;\r\n\r\n if (p.lastMeasureItemCount !== p.items.length) {\r\n const labelProp = p.labelProp, valueProp = p.valueProp;\r\n let longestLabel = p.lastMeasureLongestLabel || 1,\r\n longestLabelText = p.lastMeasureLongestLabelText || '';\r\n\r\n for (let i = 0, items = p.items, count = items.length;\r\n i < count;\r\n i++) {\r\n\r\n const item = items[i];\r\n let text = item[labelProp];\r\n if (text == null)\r\n text = item[valueProp];\r\n if (text == null)\r\n text = '';\r\n\r\n let length = text.length;\r\n if (length > longestLabel) {\r\n longestLabel = length;\r\n longestLabelText = text;\r\n }\r\n }\r\n\r\n p.lastMeasureItemCount = p.items.length;\r\n p.lastMeasureLongestLabel = longestLabel;\r\n p.lastMeasureLongestLabelText = longestLabelText;\r\n }\r\n\r\n if (p.estimateWidth || p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.createGhostItemElement(GhostSymbol, true, itemEl => {\r\n p.lastMeasureItemWidth = getElementWidth(itemEl, true, true);\r\n });\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Determines whether the list should be in virtual mode, depending on the item count.\r\n * @param {number?} targetItemCount - item count we are expecting. Defaults to current item count\r\n * @returns {DropList}\r\n * @private\r\n */\r\n _determineVirtualMode(targetItemCount) {\r\n const p = this._p;\r\n\r\n let items = p.items;\r\n if (targetItemCount === undefined) {\r\n targetItemCount = items.length;\r\n }\r\n\r\n let shouldBeVirtual = targetItemCount >= p.virtualMinItems;\r\n\r\n if (shouldBeVirtual !== p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.setVirtual(shouldBeVirtual).render();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n _renderItemContent(item, itemEl) {\r\n const p = this._p, labelProp = p.labelProp;\r\n\r\n // NOTE: a \"measure\" item will not have full data of original item.\r\n // so for a custom renderer - we try to send original item, and fallback to our private list item.\r\n\r\n if (!p.renderItem || p.renderItem(item[ItemSymbol] || item, itemEl) === false) {\r\n itemEl.appendChild(createElement('span', {\r\n class: `${p.baseClassName}__item_label`,\r\n textContent: item[labelProp],\r\n }));\r\n\r\n if (p.multi) {\r\n if (!item._nocheck) {\r\n itemEl.insertBefore(\r\n createElement('span', { class: 'checkbox' }),\r\n itemEl.firstChild,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.PositionOptions} [positionOptions=undefined]\r\n * @returns {number} new outer width\r\n * @private\r\n */\r\n _updateWidth(positionOptions) {\r\n const p = this._p, el = p.el;\r\n\r\n let targetWidth = 0;\r\n\r\n if (positionOptions) {\r\n // Measure target\r\n targetWidth = positionOptions.targetWidth;\r\n if (targetWidth == null) {\r\n targetWidth = getElementWidth(positionOptions.target, true, true);\r\n }\r\n }\r\n\r\n let autoWidth = 0;\r\n if (!p.useExactTargetWidth) {\r\n if (p.estimateWidth || p.virtualListHelper.isVirtual()) {\r\n autoWidth = p.lastMeasureItemWidth;\r\n } else {\r\n el.style.width = ''; // Reset width\r\n autoWidth = getElementWidth(el, true, true);\r\n }\r\n }\r\n\r\n let newOuterWidth = Math.max(autoWidth, targetWidth);\r\n\r\n setElementWidth(el, newOuterWidth, true, true);\r\n\r\n const elComputedStyle = getComputedStyle(el);\r\n let bordersWidth = (parseFloat(elComputedStyle.borderLeftWidth) || 0) + (parseFloat(elComputedStyle.borderRightWidth) || 0);\r\n let scrollWidth = el.scrollWidth + bordersWidth;\r\n if (scrollWidth > newOuterWidth) {\r\n // consider scrollWidth delta\r\n let delta = scrollWidth - newOuterWidth;\r\n el.style.width = `${parseFloat(el.style.width) + delta}px`;\r\n newOuterWidth = scrollWidth;\r\n }\r\n\r\n return newOuterWidth;\r\n }\r\n}\r\n\r\nexport default DropList;\r\n","const throttle = (func, wait, options) => {\r\n let timeout, context, args, result;\r\n let previous = 0;\r\n if (!options) options = {};\r\n\r\n const later = () => {\r\n previous = options.leading === false ? 0 : Date.now();\r\n timeout = null;\r\n result = func.apply(context, args);\r\n if (!timeout) context = args = null;\r\n };\r\n\r\n const throttled = function () {\r\n const now = Date.now();\r\n if (!previous && options.leading === false)\r\n previous = now;\r\n\r\n const remaining = wait - (now - previous);\r\n context = this;\r\n args = arguments;\r\n if (remaining <= 0 || remaining > wait) {\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n timeout = null;\r\n }\r\n previous = now;\r\n result = func.apply(context, args);\r\n if (!timeout) context = args = null;\r\n } else if (!timeout && options.trailing !== false) {\r\n timeout = setTimeout(later, remaining);\r\n }\r\n return result;\r\n };\r\n\r\n throttled.cancel = () => {\r\n clearTimeout(timeout);\r\n previous = 0;\r\n timeout = context = args = null;\r\n };\r\n\r\n throttled.isScheduled = () => {\r\n return !!timeout;\r\n };\r\n\r\n return throttled;\r\n};\r\n\r\nexport default throttle;\r\n","import {\r\n getCssProps,\r\n getElementWidth,\r\n setElementWidth,\r\n getPseudoElementWidth,\r\n setCssProps,\r\n} from '@danielgindi/dom-utils/lib/Css';\r\nimport escapeRegex from './utils/escapeRegex';\r\nimport {\r\n closestUntil,\r\n createElement,\r\n next,\r\n prev,\r\n setElementAttrs,\r\n} from '@danielgindi/dom-utils/lib/Dom';\r\nimport {\r\n append,\r\n getRootNode,\r\n before,\r\n remove,\r\n toggleClass,\r\n} from '@danielgindi/dom-utils/lib/DomCompat';\r\n\r\nimport DomEventsSink from '@danielgindi/dom-utils/lib/DomEventsSink';\r\nimport DropList from './DropList';\r\nimport throttle from './utils/throttle';\r\nimport {\r\n VALUE_BACK_SPACE,\r\n VALUE_DELETE, VALUE_DOWN, VALUE_ENTER,\r\n VALUE_ESCAPE,\r\n VALUE_LEFT, VALUE_PAGE_DOWN,\r\n VALUE_PAGE_UP,\r\n VALUE_RIGHT, VALUE_SPACE,\r\n VALUE_TAB,\r\n VALUE_UP,\r\n} from 'keycode-js';\r\n\r\nconst ItemSymbol = Symbol('item');\r\nconst DestroyedSymbol = Symbol('destroyed');\r\nconst NoResultsItemSymbol = Symbol('no_results_items');\r\nconst RestMultiItemsSymbol = Symbol('rest_multi_items');\r\n\r\nconst hasTouchCapability = !!('ontouchstart' in window\r\n || (window.DocumentTouch && window.document instanceof window.DocumentTouch)\r\n || window.navigator.maxTouchPoints\r\n);\r\n\r\n/**\r\n * @param {Element|EventTarget} el\r\n * @param {string} className\r\n * @returns {boolean}\r\n */\r\nconst hasClass = function (el, className) {\r\n if (el instanceof Element) {\r\n return el.classList.contains(className);\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst inputBackbufferCssProps = [\r\n 'font-family',\r\n 'font-size',\r\n 'font-weight',\r\n 'font-size',\r\n 'letter-spacing',\r\n 'text-transform',\r\n 'word-spacing',\r\n 'text-indent',\r\n 'box-sizing',\r\n 'padding-left',\r\n 'padding-right',\r\n];\r\n\r\n/**\r\n * @typedef {Object} SelectBox.Options\r\n * @property {DropList.Options} [listOptions] options to pass to the `DropList`\r\n * @property {Element} [el] An element to attach to, instead of creating a new one\r\n * @property {string} [baseClassName='selectbox'] class name for the menu root element\r\n * @property {boolean} [disabled=false] Should start as disabled?\r\n * @property {boolean} [clearable=true] Has clear button?\r\n * @property {boolean} [hasOpenIndicator=true] has open/close indicator?\r\n * @property {string} [placeholder=''] Placeholder text\r\n * @property {boolean} [sortSelectedItems=true] Should the selected items be sorted?\r\n * @property {boolean} [sortListItems=true] Sort list items\r\n * @property {boolean} [sortListCheckedFirst=true] When sorting - put checked items first (applicable to `multi` mode only)\r\n * @property {*[]} [stickyValues]\r\n * @property {function(a: DropList.ItemBase, b: DropList.ItemBase):number} [sortItemComparator]\r\n * @property {boolean} [splitListCheckedGroups=true] Split groups to \"checked\" and \"unchecked\", works with `sortCheckedFirst` only\r\n * @property {boolean|'touch'} [blurOnSingleSelection='touch']\r\n * @property {boolean} [multi=false] can multiple values be selected?\r\n * @property {boolean} [showSelection=true] show selection? if false, the placeholder will take effect\r\n * @property {function(items: DropList.ItemBase[]):string} [multiPlaceholderFormatter] formatter for placeholder for multi items mode\r\n * @property {boolean} [searchable=false] is it searchable?\r\n * @property {string} [noResultsText='No matching results'] text for no results (empty for none)\r\n * @property {number} [filterThrottleWindow=300] throttle time (milliseconds) for filtering\r\n * @property {boolean} [filterOnEmptyTerm=false] call the filter function on empty search term too\r\n * @property {string} [labelProp='label']\r\n * @property {string} [valueProp='value']\r\n * @property {string} [multiItemLabelProp='short_label']\r\n * @property {number} [maxMultiItems] maximum number of multi items. The rest will get a single item to represent.\r\n * @property {function(count: number, items: DropList.ItemBase[]):string} [multiItemsRestLabelProvider] label for the item representing the rest of the items.\r\n * @property {DropList.ItemBase[]|null} [items]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderSingleItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderSingleItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderRestMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderRestMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderNoResultsItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderNoResultsItem]\r\n * @property {function(items: DropList.ItemBase[], term: string):(DropList.ItemBase[]|null)} [filterFn]\r\n * @property {function(name: string, ...args)} [on]\r\n * @property {string|string[]} [additionalClasses]\r\n * @property {boolean} [isLoadingMode]\r\n * */\r\nconst defaultOptions = {\r\n el: null,\r\n baseClassName: 'selectbox',\r\n disabled: false,\r\n clearable: true,\r\n hasOpenIndicator: true,\r\n placeholder: '',\r\n sortSelectedItems: true,\r\n sortListItems: true,\r\n sortListCheckedFirst: true,\r\n stickyValues: null,\r\n sortItemComparator: null,\r\n splitListCheckedGroups: true,\r\n blurOnSingleSelection: 'touch',\r\n multi: false,\r\n showSelection: true,\r\n multiPlaceholderFormatter: null,\r\n searchable: true,\r\n noResultsText: 'No matching results',\r\n filterThrottleWindow: 300,\r\n filterOnEmptyTerm: false,\r\n labelProp: 'label',\r\n valueProp: 'value',\r\n multiItemLabelProp: 'short_label',\r\n maxMultiItems: null,\r\n multiItemsRestLabelProvider: null,\r\n items: [],\r\n isLoadingMode: false,\r\n};\r\n\r\n/**\r\n *\r\n * @param {DropList.ItemBase[]} items\r\n * @param {string} labelProp\r\n * @returns {string}\r\n */\r\nconst defaultMultiPlaceholderFormatter = (items, labelProp) => {\r\n if (items.length === 0)\r\n return '';\r\n\r\n let title = items[0][labelProp] + '';\r\n\r\n if (items.length > 1) {\r\n title += ` (+${items.length - 1})`;\r\n }\r\n\r\n return title;\r\n};\r\n\r\n/*\r\nEmits the following events:\r\n---------------------------\r\n\r\n'clear:before' {cancel: false}: will clear the whole selection. return false to abort.\r\n'clear': clearead the whole selection.\r\n'open' { list: DropList }: the drop list is opening\r\n'open:before' { list: DropList }: the drop list will open\r\n'close': the drop list is closing\r\n'addsel:before' {value, item, cancel: false}: an item selection is about to be added (in multi mode). return false to abort.\r\n'removesel:before' {value, item, cancel: false}: an item selection is about to be removed (in multi mode). return false to abort.\r\n'select:before' {value, item, cancel: false}: an item is about to be selected (in single mode). return false to abort.\r\n'addsel' {value, item}: an item selection has been added (in multi mode)\r\n'removesel' {value, item}: an item selection has been removed (in multi mode)\r\n'select' {value, item}: an item has been selected (in single mode)\r\n'search' {value}: input box value has changed\r\n'search:focus': input box has gained focus\r\n'search:blur': input box has lost focus\r\n'input:resize': input box resized\r\n'itemschanged' {term, mutated, count}: the current set of items has changed\r\n */\r\n\r\n// noinspection JSUnusedGlobalSymbols\r\nclass SelectBox {\r\n /**\r\n * @param {SelectBox.Options} options\r\n */\r\n constructor(options) {\r\n const o = { ...defaultOptions };\r\n\r\n for (let [key, value] of Object.entries(/**@type Object*/options))\r\n if (value !== undefined)\r\n o[key] = value;\r\n\r\n const p = this._p = {\r\n ownsEl: true,\r\n\r\n baseClassName: o.baseClassName,\r\n\r\n listOptions: o.listOptions,\r\n\r\n disabled: !!o.disabled,\r\n clearable: !!o.clearable,\r\n hasOpenIndicator: !!o.hasOpenIndicator,\r\n placeholder: o.placeholder,\r\n sortSelectedItems: !!o.sortSelectedItems,\r\n sortListItems: !!o.sortListItems,\r\n sortListCheckedFirst: !!o.sortListCheckedFirst,\r\n stickyValues: Array.isArray(o.stickyValues) ? new Set(o.stickyValues) : null,\r\n sortItemComparator: o.sortItemComparator,\r\n splitListCheckedGroups: !!o.splitListCheckedGroups,\r\n blurOnSingleSelection: o.blurOnSingleSelection,\r\n multi: o.multi,\r\n showSelection: o.showSelection,\r\n multiPlaceholderFormatter: o.multiPlaceholderFormatter,\r\n searchable: o.searchable,\r\n noResultsText: o.noResultsText,\r\n filterThrottleWindow: o.filterThrottleWindow,\r\n filterOnEmptyTerm: o.filterOnEmptyTerm,\r\n\r\n labelProp: o.labelProp,\r\n valueProp: o.valueProp,\r\n multiItemLabelProp: o.multiItemLabelProp,\r\n\r\n maxMultiItems: o.maxMultiItems,\r\n multiItemsRestLabelProvider: o.multiItemsRestLabelProvider,\r\n\r\n renderSingleItem: o.renderSingleItem,\r\n unrenderSingleItem: o.unrenderSingleItem,\r\n renderMultiItem: o.renderMultiItem,\r\n unrenderMultiItem: o.unrenderMultiItem,\r\n renderRestMultiItem: o.renderRestMultiItem,\r\n unrenderRestMultiItem: o.unrenderRestMultiItem,\r\n renderNoResultsItem: o.renderNoResultsItem,\r\n unrenderNoResultsItem: o.unrenderNoResultsItem,\r\n filterFn: o.filterFn,\r\n on: o.on,\r\n additionalClasses: o.additionalClasses,\r\n\r\n isLoadingMode: !!o.isLoadingMode,\r\n\r\n items: o.items || [],\r\n filteredItems: null,\r\n itemsChanged: true,\r\n\r\n sink: new DomEventsSink(),\r\n\r\n selectedItems: [],\r\n selectedValues: [],\r\n selectionChanged: true,\r\n resortBySelectionNeeded: false,\r\n\r\n throttledUpdateListItems: throttle(() => this._updateListItems(),\r\n o.filterThrottleWindow,\r\n { leading: true, trailing: true }),\r\n\r\n filterTerm: '',\r\n };\r\n\r\n let el = o.el;\r\n if (el instanceof Element) {\r\n p.ownsEl = false;\r\n } else {\r\n el = createElement('span');\r\n }\r\n\r\n setElementAttrs(el, {\r\n role: 'combobox',\r\n 'aria-haspopup': 'true',\r\n 'aria-expanded': 'false',\r\n });\r\n p.el = el;\r\n\r\n this._syncBaseClasses();\r\n this._renderBase();\r\n\r\n /** @type Element[] */\r\n p.multiItemEls = [];\r\n\r\n this.enable(!p.disabled);\r\n\r\n this._setupDropdownMenu();\r\n\r\n // --- Hook click\r\n p.sink\r\n .add(el, 'click', (evt) => {\r\n if (closestUntil(evt.target, `.${p.baseClassName}__clear`, evt.currentTarget)) {\r\n return;\r\n }\r\n\r\n if (!el.contains(document.activeElement)) {\r\n p.input.focus();\r\n // Go to end of input\r\n p.input.selectionStart = p.input.selectionEnd = p.input.value.length;\r\n }\r\n });\r\n\r\n // --- Handle default focus directly to search box\r\n p.sink.add(el, 'focus', evt => {\r\n const target = (/**Element*/evt.target);\r\n\r\n if (!el.contains(evt.relatedTarget) &&\r\n !hasClass(target, `${p.baseClassName}__search_field`) &&\r\n !hasClass(target, `${p.baseClassName}__item`)) {\r\n let field = el.querySelector(`.${p.baseClassName}__search_field`);\r\n field && field.focus();\r\n }\r\n }, true);\r\n\r\n p.sink\r\n .add(p.input, 'keydown', (/**KeyboardEvent*/event) => {\r\n this._handleInputKeydown(event);\r\n })\r\n .add(p.input, 'input', () => {\r\n this._resizeInput();\r\n });\r\n\r\n const focusInOutHandler = (() => {\r\n let t;\r\n return () => {\r\n if (t) {\r\n clearTimeout(t);\r\n }\r\n t = setTimeout(() => {\r\n toggleClass(el, `${p.baseClassName}__focus`, el.contains(document.activeElement));\r\n });\r\n };\r\n })();\r\n p.sink.add(el, 'focus', focusInOutHandler, true);\r\n p.sink.add(el, 'blur', focusInOutHandler, true);\r\n\r\n // --- Resize input on window change\r\n p.sink.add(window, 'resize', () => this._resizeInput());\r\n p.sink.add(window, 'orientationchange', () => this._resizeInput());\r\n\r\n this.setItems(p.items);\r\n\r\n this._scheduleSync();\r\n\r\n return this;\r\n }\r\n\r\n destroy() {\r\n if (this[DestroyedSymbol])\r\n return;\r\n this[DestroyedSymbol] = true;\r\n\r\n const p = this._p;\r\n\r\n if (p.syncTimeout) {\r\n clearTimeout(p.syncTimeout);\r\n delete p.syncTimeout;\r\n }\r\n\r\n this._stopTrackingPresence();\r\n\r\n p.sink.remove();\r\n p.dropList && p.dropList.destroy();\r\n\r\n if (p.throttledUpdateListItems)\r\n p.throttledUpdateListItems.cancel();\r\n\r\n this._cleanupSingleWrapper();\r\n\r\n if (p.unrenderMultiItem || p.unrenderRestMultiItem) {\r\n // Remove all item elements\r\n while (p.multiItemEls.length > 0) {\r\n // use fast path by removing in reverse\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n }\r\n }\r\n\r\n remove(p.list);\r\n remove(p.singleWrapper);\r\n remove(p.input);\r\n remove(p.inputBackBuffer);\r\n remove(p.clearButtonWrapper);\r\n remove(p.openIndicator);\r\n\r\n if (!p.ownsEl) {\r\n for (let name of Array.from(p.el.classList)) {\r\n if (name.startsWith(p.baseClassName)) {\r\n p.el.classList.remove(name);\r\n }\r\n }\r\n p.el.removeAttribute('role');\r\n p.el.removeAttribute('aria-haspopup');\r\n p.el.removeAttribute('aria-expanded');\r\n }\r\n\r\n this._p = null;\r\n }\r\n\r\n get el() {\r\n return this._p.el;\r\n }\r\n\r\n /**\r\n * Enables the control\r\n * @param {boolean=true} enabled Should the control be enabled?\r\n * @returns {SelectBox}\r\n */\r\n enable(enabled) {\r\n const p = this._p;\r\n\r\n if (enabled === undefined) {\r\n enabled = true;\r\n }\r\n p.disabled = !enabled;\r\n p.el.setAttribute('aria-disabled', p.disabled.toString());\r\n p.input.disabled = !!p.disabled;\r\n\r\n const multiItemEls = p.multiItemEls;\r\n\r\n for (let itemEl of multiItemEls) {\r\n if (p.disabled) {\r\n itemEl.removeAttribute('tabindex');\r\n } else {\r\n itemEl.setAttribute('tabindex', '0');\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Is the control enabled?\r\n * @returns {boolean}\r\n */\r\n isEnabled() {\r\n return !this._p.disabled;\r\n }\r\n\r\n /**\r\n * Disables the control\r\n * @param {boolean=true} disabled Should the control be disabled?\r\n * @returns {SelectBox}\r\n */\r\n disable(disabled) {\r\n return this.enable(disabled === undefined ? false : !disabled);\r\n }\r\n\r\n /**\r\n * Is the control disabled?\r\n * @returns {boolean}\r\n */\r\n isDisabled() {\r\n return this._p.disabled;\r\n }\r\n\r\n /**\r\n * @param {string|string[]} classes\r\n * @returns {SelectBox}\r\n */\r\n setAdditionalClasses(classes) {\r\n const p = this._p;\r\n p.additionalClasses = classes;\r\n this._syncBaseClasses();\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.ItemBase[]} [items]\r\n * @param {boolean} [resetValues=true] should reset values to current values (essentially refresh the data based on items & values). If set to false, use setValue to set a fresh value\r\n * @returns {SelectBox}\r\n */\r\n setItems(items, resetValues = true) {\r\n const p = this._p;\r\n\r\n if (!items)\r\n items = [];\r\n\r\n p.items = items.slice(0);\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n\r\n if (resetValues) {\r\n this.setSelectedValues(this.getSelectedValues());\r\n }\r\n\r\n this._trigger('itemschanged', { term: null, mutated: true, count: this.getFilteredItemCount() });\r\n\r\n return this;\r\n }\r\n\r\n getFilteredItemCount() {\r\n const p = this._p;\r\n\r\n if (p.filteredItems)\r\n return p.filteredItems.length;\r\n\r\n if (p.items)\r\n return p.items.length;\r\n\r\n return 0;\r\n }\r\n\r\n isFilterPending() {\r\n const p = this._p;\r\n\r\n return !!(p.throttledUpdateListItems.isScheduled() ||\r\n (!p.filteredItems && (p.filterTerm || (p.filterOnEmptyTerm && p.filterFn))));\r\n }\r\n\r\n updateItemByValue(value, newItem) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n let existingItem = p.items.find(x => x[valueProp] === value);\r\n if (existingItem)\r\n Object.assign(existingItem, newItem);\r\n\r\n if (p.dropList) {\r\n p.dropList.updateItemByValue(value, newItem);\r\n }\r\n }\r\n\r\n /**\r\n * @returns {DropList.ItemBase[]|*}\r\n */\r\n getItems() {\r\n const p = this._p;\r\n return p.items;\r\n }\r\n\r\n /**\r\n * @param {boolean} clearable\r\n * @returns {SelectBox}\r\n */\r\n setClearable(clearable) {\r\n clearable = !!clearable;\r\n\r\n if (this._p.clearable === clearable)\r\n return this;\r\n\r\n this._p.clearable = !!clearable;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getClearable() {\r\n return this._p.clearable;\r\n }\r\n\r\n /**\r\n * @param {boolean} enabled\r\n * @returns {SelectBox}\r\n */\r\n setHasOpenIndicator(enabled) {\r\n enabled = !!enabled;\r\n\r\n if (this._p.hasOpenIndicator === enabled)\r\n return this;\r\n\r\n this._p.hasOpenIndicator = enabled;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getHasOpenIndicator() {\r\n return this._p.hasOpenIndicator;\r\n }\r\n\r\n /**\r\n * @param {string} placeholder\r\n * @returns {SelectBox}\r\n */\r\n setPlaceholder(placeholder) {\r\n this._p.placeholder = placeholder == null ? '' : String(placeholder);\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {string}\r\n */\r\n getPlaceHolder() {\r\n return this._p.placeholder;\r\n }\r\n\r\n /**\r\n * @param {string} term\r\n * @param {boolean} [performSearch=false] should actually perform the search, or just set the input's text?\r\n * @returns {SelectBox}\r\n */\r\n setSearchTerm(term, performSearch = false) {\r\n const p = this._p;\r\n\r\n if (!p.input) return this;\r\n\r\n p.input.value = term;\r\n\r\n this._scheduleSync('resize_input');\r\n\r\n if (performSearch) {\r\n p.filterTerm = p.input.value.trim();\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n\r\n this._trigger('search', { value: p.input.value });\r\n p.throttledUpdateListItems();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {string}\r\n */\r\n getSearchTerm() {\r\n const p = this._p;\r\n if (p.input)\r\n return p.input.value;\r\n return '';\r\n }\r\n\r\n /**\r\n * @param {boolean} sortSelectedItems\r\n * @returns {SelectBox}\r\n */\r\n setSortSelectedItems(sortSelectedItems) {\r\n const p = this._p;\r\n sortSelectedItems = !!sortSelectedItems;\r\n if (p.sortSelectedItems === sortSelectedItems)\r\n return this;\r\n\r\n p.sortSelectedItems = sortSelectedItems;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSortSelectedItemsEnabled() {\r\n return this._p.sortSelectedItems;\r\n }\r\n\r\n /**\r\n * @param {boolean} sortListItems\r\n * @returns {SelectBox}\r\n */\r\n setSortListItems(sortListItems) {\r\n const p = this._p;\r\n sortListItems = !!sortListItems;\r\n if (p.sortListItems === sortListItems)\r\n return this;\r\n\r\n p.sortListItems = sortListItems;\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSortListItemsEnabled() {\r\n return this._p.sortListItems;\r\n }\r\n\r\n /**\r\n * @param {boolean} sortListCheckedFirst\r\n * @returns {SelectBox}\r\n */\r\n setSortListCheckedFirst(sortListCheckedFirst) {\r\n const p = this._p;\r\n sortListCheckedFirst = !!sortListCheckedFirst;\r\n if (p.sortCheckedFirst === sortListCheckedFirst)\r\n return this;\r\n\r\n p.sortCheckedFirst = sortListCheckedFirst;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSortListCheckedFirstEnabled() {\r\n return this._p.sortListCheckedFirst;\r\n }\r\n\r\n /**\r\n * @param {*[]} values\r\n * @returns {SelectBox}\r\n */\r\n setStickyValues(values) {\r\n const p = this._p;\r\n\r\n p.stickyValues = Array.isArray(values) ? new Set(values) : null;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {*[]}\r\n */\r\n getStickyValues() {\r\n return this._p.stickyValues ? Array.from(this._p.stickyValues) : null;\r\n }\r\n\r\n /**\r\n * @param {function(a: DropList.ItemBase, b: DropList.ItemBase):number} comparator\r\n * @returns {SelectBox}\r\n */\r\n setSortItemComparator(comparator) {\r\n const p = this._p;\r\n if (p.sortItemComparator === comparator)\r\n return this;\r\n\r\n p.sortItemComparator = comparator;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {function(a: DropList.ItemBase, b: DropList.ItemBase):number}\r\n */\r\n getSortItemComparator() {\r\n return this._p.sortItemComparator;\r\n }\r\n\r\n /**\r\n * @param {boolean} splitListCheckedGroups\r\n * @returns {SelectBox}\r\n */\r\n setSplitListCheckedGroups(splitListCheckedGroups) {\r\n const p = this._p;\r\n splitListCheckedGroups = !!splitListCheckedGroups;\r\n if (p.splitListCheckedGroups === splitListCheckedGroups)\r\n return this;\r\n\r\n p.splitListCheckedGroups = splitListCheckedGroups;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSplitListCheckedGroupsEnabled() {\r\n return this._p.splitListCheckedGroups;\r\n }\r\n\r\n /**\r\n * @param {boolean} showSelection\r\n * @returns {SelectBox}\r\n */\r\n setShowSelection(showSelection) {\r\n const p = this._p;\r\n showSelection = !!showSelection;\r\n if (p.showSelection === showSelection)\r\n return this;\r\n\r\n this._p.showSelection = showSelection;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isShowSelectionEnabled() {\r\n return this._p.showSelection;\r\n }\r\n\r\n /**\r\n * @param {function(items: DropList.ItemBase[]):string} formatter\r\n * @returns {SelectBox}\r\n */\r\n setMultiPlaceholderFormatter(formatter) {\r\n const p = this._p;\r\n\r\n if (p.multiPlaceholderFormatter === formatter)\r\n return this;\r\n\r\n this._p.multiPlaceholderFormatter = formatter;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {boolean|'touch'} value\r\n * @returns {SelectBox}\r\n */\r\n setBlurOnSingleSelection(value) {\r\n const p = this._p;\r\n if (p.blurOnSingleSelection === value)\r\n return this;\r\n\r\n this._p.blurOnSingleSelection = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean|'touch'}\r\n */\r\n getBlurOnSingleSelection() {\r\n return this._p.blurOnSingleSelection;\r\n }\r\n\r\n /**\r\n * @param {boolean} multi\r\n * @returns {SelectBox}\r\n */\r\n setMulti(multi) {\r\n const p = this._p;\r\n multi = !!multi;\r\n if (p.multi === multi)\r\n return this;\r\n\r\n p.multi = multi;\r\n\r\n this._setupDropdownMenu();\r\n\r\n // move to correct parent\r\n remove(p.clearButtonWrapper);\r\n delete p.clearButtonWrapper;\r\n\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isMultiEnabled() {\r\n return this._p.multi;\r\n }\r\n\r\n /**\r\n * @param {boolean} searchable\r\n * @returns {SelectBox}\r\n */\r\n setSearchable(searchable) {\r\n const p = this._p;\r\n searchable = !!searchable;\r\n if (p.searchable === searchable)\r\n return this;\r\n\r\n p.searchable = searchable;\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSearchableEnabled() {\r\n return this._p.searchable;\r\n }\r\n\r\n /**\r\n * @param {string} noResultsText\r\n * @returns {SelectBox}\r\n */\r\n setNoResultsText(noResultsText) {\r\n this._p.noResultsText = noResultsText;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {string}\r\n */\r\n getNoResultsText() {\r\n return this._p.noResultsText;\r\n }\r\n\r\n /**\r\n * @param {number} window\r\n * @returns {SelectBox}\r\n */\r\n setFilterThrottleWindow(window) {\r\n const p = this._p;\r\n p.filterThrottleWindow = window;\r\n\r\n let isScheduled = p.throttledUpdateListItems ? p.throttledUpdateListItems.isScheduled() : false;\r\n\r\n if (p.throttledUpdateListItems)\r\n p.throttledUpdateListItems.cancel();\r\n\r\n p.throttledUpdateListItems = throttle(() => this._updateListItems(), p.filterThrottleWindow, true);\r\n\r\n if (isScheduled)\r\n p.throttledUpdateListItems();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n getFilterThrottleWindow() {\r\n return this._p.filterThrottleWindow;\r\n }\r\n\r\n /**\r\n * @param {boolean} value\r\n * @returns {SelectBox}\r\n */\r\n setFilterOnEmptyTerm(value) {\r\n const p = this._p;\r\n p.filterOnEmptyTerm = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getFilterOnEmptyTerm() {\r\n return this._p.filterOnEmptyTerm;\r\n }\r\n\r\n /**\r\n * @param {DropList.Options} listOptions\r\n * @returns {SelectBox}\r\n */\r\n setListOptions(listOptions) {\r\n const p = this._p;\r\n p.listOptions = listOptions;\r\n this._setupDropdownMenu();\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox})|null\r\n */\r\n setRenderSingleItem(render, unrender) {\r\n const p = this._p;\r\n p.renderSingleItem = render;\r\n p.unrenderSingleItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox}\r\n */\r\n setRenderMultiItem(render, unrender) {\r\n const p = this._p;\r\n p.renderMultiItem = render;\r\n p.unrenderMultiItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox}\r\n */\r\n setRenderRestMultiItem(render, unrender) {\r\n const p = this._p;\r\n p.renderRestMultiItem = render;\r\n p.unrenderRestMultiItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox}\r\n */\r\n setRenderNoResultsItem(render, unrender) {\r\n const p = this._p;\r\n p.renderNoResultsItem = render;\r\n p.unrenderNoResultsItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {SelectBox}\r\n */\r\n setLabelProp(prop) {\r\n const p = this._p;\r\n p.labelProp = prop;\r\n\r\n\t\tif (p.dropList)\r\n\t\t\tp.dropList.setLabelProp(prop);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {SelectBox}\r\n */\r\n setValueProp(prop) {\r\n const p = this._p;\r\n p.valueProp = prop;\r\n\r\n\t\tif (p.dropList)\r\n\t\t\tp.dropList.setValueProp(prop);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {SelectBox}\r\n */\r\n setMultiItemLabelProp(prop) {\r\n const p = this._p;\r\n p.multiItemLabelProp = prop;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {number|null|undefined} value\r\n * @returns {SelectBox}\r\n */\r\n setMaxMultiItems(value) {\r\n const p = this._p;\r\n p.maxMultiItems = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {function(count: number, items: DropList.ItemBase[]):string|null|undefined} value\r\n * @returns {SelectBox}\r\n */\r\n setMultiItemsRestLabelProvider(value) {\r\n const p = this._p;\r\n p.multiItemsRestLabelProvider = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {function(items: DropList.ItemBase[], term: string):(DropList.ItemBase[]|null)} fn\r\n * @returns {SelectBox}\r\n */\r\n setFilterFn(fn) {\r\n const p = this._p;\r\n p.filterFn = fn;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {function(items: DropList.ItemBase[], term: string):(DropList.ItemBase[]|null)}\r\n */\r\n getFilterFn() {\r\n return this._p.filterFn;\r\n }\r\n\r\n /**\r\n * Focus on input element\r\n * @returns {SelectBox}\r\n */\r\n focusInput() {\r\n const p = this._p;\r\n\r\n if (p.input)\r\n p.input.focus();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remvoe focus from the input element\r\n * @returns {SelectBox}\r\n */\r\n blurInput() {\r\n const p = this._p;\r\n\r\n if (p.input)\r\n p.input.blur();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes all selected items\r\n * @returns {SelectBox}\r\n */\r\n clear() {\r\n const p = this._p;\r\n\r\n let clearEvt = { cancel: false };\r\n this._trigger('clear:before', clearEvt);\r\n if (clearEvt.cancel)\r\n return this;\r\n\r\n p.selectedItems = [];\r\n p.selectedValues = [];\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n\r\n this._trigger('clear');\r\n\r\n if (this[DestroyedSymbol]) return this; // destroyed by event handler\r\n\r\n this._updateListItems();\r\n\r\n this._setInputText('');\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a single value or an array of selected values - depending on `multi` prop\r\n * @public\r\n * @returns {*[]}\r\n */\r\n getValue() {\r\n const p = this._p;\r\n if (p.multi)\r\n return p.selectedValues.slice(0);\r\n else if (p.selectedValues.length > 0)\r\n return p.selectedValues[0];\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Selects the specified value or multiple values - depending on `multi` prop\r\n * @public\r\n * @param {*|*[]} value - if `multi`, then an array of values to select, otherwise - a single value to select\r\n * @returns {SelectBox}\r\n */\r\n setValue(value) {\r\n const p = this._p;\r\n if (p.multi)\r\n return this.setSelectedValues(Array.isArray(value) ? value : value !== undefined ? [value] : []);\r\n else\r\n return this.setSelectedValues(value !== undefined ? [value] : []);\r\n }\r\n\r\n /**\r\n * Returns an array of selected values\r\n * @public\r\n * @returns {*[]}\r\n */\r\n getSelectedValues() {\r\n const p = this._p;\r\n return p.selectedValues.slice(0);\r\n }\r\n\r\n /**\r\n * Selects the specified values\r\n * @public\r\n * @param {*[]} values - an array of *values* to select\r\n * @returns {SelectBox}\r\n */\r\n setSelectedValues(values) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (!p.multi) {\r\n values = values.slice(0, 1);\r\n }\r\n\r\n let set = new Set();\r\n let selectedValues = [];\r\n let selectedItems = [];\r\n\r\n for (let value of values) {\r\n if (set.has(value))\r\n continue;\r\n set.add(value);\r\n\r\n selectedValues.push(value);\r\n\r\n let item = p.items.find(x => x[valueProp] === value);\r\n if (item !== undefined) {\r\n selectedItems.push(item);\r\n } else {\r\n selectedItems.push({ [p.valueProp]: value });\r\n }\r\n }\r\n\r\n p.selectedValues = selectedValues;\r\n p.selectedItems = selectedItems;\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n\r\n this._updateListItems();\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the count of selected values\r\n * @public\r\n * @returns {number}\r\n */\r\n getSelectedValueCount() {\r\n const p = this._p;\r\n return p.selectedValues.length;\r\n }\r\n\r\n /**\r\n * Returns an array of selected items\r\n * @public\r\n * @returns {Array.<Object>}\r\n */\r\n getSelectedItems() {\r\n const p = this._p;\r\n return p.selectedItems.slice(0);\r\n }\r\n\r\n /**\r\n * Sets the specified items to \"checked\" mode.\r\n * An array of items is passed, not values, because we need to keep track if items,\r\n * and if we already have the array of items then this spares the process of searching for the items by values.\r\n * @public\r\n * @param {DropList.ItemBase[]} items - an array of *items* to select (not values)\r\n * @returns {SelectBox}\r\n */\r\n setSelectedItems(items) {\r\n this._setSelectedItems(items);\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {SelectBox}\r\n */\r\n openList() {\r\n const p = this._p;\r\n\r\n if (p.dropList.isVisible())\r\n return this;\r\n\r\n if (p.isLoadingMode && p.items.length === 0)\r\n return this;\r\n\r\n this._trigger('open:before', { list: p.dropList });\r\n\r\n p.dropList.show(this._getDropListPositionOptions());\r\n this._repositionDropList();\r\n\r\n // Another one in case the droplist position messed with screen layout.\r\n // If the out element's bounds stayed the same - nothing will be recalculated.\r\n // So this is *not* expensive.\r\n this._repositionDropList();\r\n\r\n if (p.dropList.hasFocusedItem()) {\r\n p.dropList.setFocusedItemAtIndex(p.dropList.getFocusedItemIndex());\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {SelectBox}\r\n */\r\n closeList() {\r\n const p = this._p;\r\n\r\n if (this[DestroyedSymbol])\r\n return this;\r\n\r\n if (!p.dropList.isVisible())\r\n return this;\r\n\r\n p.dropList.hide();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {boolean} [open]\r\n * @returns {SelectBox}\r\n */\r\n toggleList(open) {\r\n const p = this._p;\r\n\r\n let shouldOpen = open === undefined ? !p.dropList.isVisible() : !!open;\r\n\r\n if (shouldOpen)\r\n return this.openList();\r\n else return this.closeList();\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isListOpen() {\r\n return !!this._p.dropListVisible;\r\n }\r\n\r\n /**\r\n * @param {boolean} [on]\r\n * @returns {SelectBox}\r\n */\r\n toggleLoading(on) {\r\n return this.setIsLoadingMode(on === undefined ? !this.getIsLoadingMode() : !!on);\r\n }\r\n\r\n /**\r\n * @param {boolean} isLoadingMode\r\n * @returns {SelectBox}\r\n */\r\n setIsLoadingMode(isLoadingMode) {\r\n const p = this._p;\r\n\r\n isLoadingMode = isLoadingMode === undefined ? true : !!isLoadingMode;\r\n\r\n if (p.isLoadingMode === isLoadingMode)\r\n return this;\r\n\r\n p.isLoadingMode = isLoadingMode;\r\n\r\n if (p.isLoadingMode && p.items.length === 0 && this.isListOpen()) {\r\n this.closeList();\r\n } else if (!p.isLoadingMode && document.activeElement &&\r\n ((p.multi || p.searchable) && p.input.contains(document.activeElement) ||\r\n (!p.multi && !p.searchable) && p.el.contains(document.activeElement))) {\r\n this.openList();\r\n }\r\n\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getIsLoadingMode() {\r\n return this._p.isLoadingMode;\r\n }\r\n\r\n /**\r\n * Can be called in case that the selectbox was attached to the dom late and has a weird size.\r\n * @returns {SelectBox}\r\n */\r\n\trefreshSize() {\r\n\t\tthis._resizeInput();\r\n\t\treturn this;\r\n\t}\r\n\r\n /** @private */\r\n _renderBase() {\r\n const p = this._p;\r\n\r\n if (!p.inputBackBuffer) {\r\n p.inputBackBuffer = createElement('span', {\r\n css: {\r\n position: 'absolute',\r\n zIndex: -1,\r\n left: 0,\r\n top: '-9999px',\r\n whiteSpace: 'pre',\r\n },\r\n });\r\n }\r\n\r\n if (!p.input) {\r\n p.inputWrapper = createElement('span',\r\n {\r\n class: `${p.baseClassName}__search_wrapper`,\r\n },\r\n p.input = createElement('input', {\r\n class: `${p.baseClassName}__search_field`,\r\n type: 'search',\r\n autocomplete: 'off',\r\n autocorrect: 'off',\r\n autocapitalize: 'off',\r\n spellcheck: 'false',\r\n role: 'textbox',\r\n 'aria-autocomplete': 'list',\r\n readOnly: !(p.searchable || p.multi),\r\n }),\r\n );\r\n }\r\n\r\n if (p.multi) {\r\n if (p.singleWrapper) {\r\n this._cleanupSingleWrapper();\r\n remove(p.singleWrapper);\r\n delete p.singleWrapper;\r\n }\r\n\r\n if (!p.list) {\r\n // Moving `inputWrapper` to a new parent may cause a 'blur' event, and an unwanted chain reaction!\r\n // So we're unregistering those events here.\r\n this._unregisterDropdownEvents();\r\n\r\n // Restore focus to this one later if we affected it\r\n const lastActiveElement = document.activeElement;\r\n\r\n p.list = createElement('ul', {\r\n class: `${p.baseClassName}__list`,\r\n });\r\n p.el.appendChild(p.list);\r\n p.list.appendChild(p.inputWrapper);\r\n p.el.classList.remove(`${p.baseClassName}__single`);\r\n p.el.classList.add(`${p.baseClassName}__multi`);\r\n\r\n // Hook clear and remove\r\n p.sink\r\n .add(p.list, 'click', (evt) => {\r\n if (!closestUntil(evt.target, `.${p.baseClassName}__item_remove`, evt.currentTarget))\r\n return;\r\n\r\n if (p.disabled) return;\r\n\r\n this._removeMultiItemFromEvent(\r\n /**@type Element*/\r\n closestUntil(evt.target, `.${p.baseClassName}__item`, evt.currentTarget),\r\n evt);\r\n })\r\n .add(p.list, 'keydown', (/**KeyboardEvent*/evt) => {\r\n if (!closestUntil(evt.target, `.${p.baseClassName}__item`, evt.currentTarget))\r\n return;\r\n\r\n this._handleMultiKeydown(evt);\r\n });\r\n\r\n if (lastActiveElement === p.input)\r\n p.input.focus();\r\n\r\n this._registerDropdownEvents();\r\n }\r\n } else {\r\n if (p.list) {\r\n remove(p.list);\r\n p.sink.remove(p.list);\r\n delete p.list;\r\n }\r\n\r\n if (!p.singleWrapper) {\r\n // Moving `inputWrapper` to a new parent may cause a 'blur' event, and an unwanted chain reaction!\r\n // So we're unregistering those events here.\r\n this._unregisterDropdownEvents();\r\n\r\n // Restore focus to this one later if we affected it\r\n const lastActiveElement = document.activeElement;\r\n\r\n p.singleWrapper = createElement('div', {\r\n class: `${p.baseClassName}__single_wrapper`,\r\n });\r\n p.el.appendChild(p.singleWrapper);\r\n p.el.appendChild(p.inputWrapper);\r\n p.el.classList.remove(`${p.baseClassName}__multi`);\r\n p.el.classList.add(`${p.baseClassName}__single`);\r\n\r\n if (lastActiveElement === p.input)\r\n p.input.focus();\r\n\r\n this._registerDropdownEvents();\r\n }\r\n }\r\n\r\n if (p.hasOpenIndicator !== !!p.openIndicator) {\r\n if (p.hasOpenIndicator) {\r\n p.openIndicator = createElement('span', { class: `${p.baseClassName}__open_indicator` });\r\n p.el.appendChild(p.openIndicator);\r\n } else {\r\n remove(p.openIndicator);\r\n delete p.openIndicator;\r\n p.el.classList.remove(`${p.baseClassName}__has_open_indicator`);\r\n }\r\n }\r\n\r\n if (p.isLoadingMode !== !!p.spinner) {\r\n if (p.isLoadingMode) {\r\n p.spinner = createElement('span', { class: `${p.baseClassName}__spinner` });\r\n p.el.appendChild(p.spinner);\r\n p.el.classList.add(`${p.baseClassName}__has_spinner`);\r\n } else {\r\n remove(p.spinner);\r\n delete p.spinner;\r\n p.el.classList.remove(`${p.baseClassName}__has_spinner`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _syncBaseClasses() {\r\n const p = this._p, el = p.el;\r\n\r\n if (!el)\r\n return;\r\n\r\n let classes = [p.baseClassName];\r\n\r\n if (p.multi)\r\n classes.push(`${p.baseClassName}__multi`);\r\n else classes.push(`${p.baseClassName}__single`);\r\n\r\n if (this.isListOpen())\r\n classes.push(`${p.baseClassName}__open_list`);\r\n else classes.push(`${p.baseClassName}__closed_list`);\r\n\r\n if (p.hasOpenIndicator)\r\n classes.push(`${p.baseClassName}__has_open_indicator`);\r\n\r\n if (p.clearButtonWrapper)\r\n classes.push(`${p.baseClassName}__has_clear`);\r\n\r\n if (p.isLoadingMode)\r\n classes.push(`${p.baseClassName}__has_spinner`);\r\n\r\n if (p.selectedValues.length === 0)\r\n classes.push(`${p.baseClassName}__empty_selection`);\r\n\r\n if (p.selectedValues.length > 0)\r\n classes.push(`${p.baseClassName}__has_selection`);\r\n\r\n if (p.searchable || p.multi)\r\n classes.push(`${p.baseClassName}__searchable`);\r\n\r\n if (p.additionalClasses) {\r\n classes = classes.concat(p.additionalClasses);\r\n }\r\n\r\n el.className = classes.join(' ');\r\n }\r\n\r\n /** @private */\r\n _setupDropdownMenu() {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (p.dropList) {\r\n p.dropList.destroy();\r\n delete p.dropList;\r\n p.itemsChanged = true;\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n }\r\n\r\n const renderNoResultsItem = p.renderNoResultsItem;\r\n const unrenderNoResultsItem = p.unrenderNoResultsItem;\r\n const customRenderItem = (p.listOptions || {}).renderItem;\r\n const customUnrenderItem = (p.listOptions || {}).unrenderItem;\r\n\r\n const renderItem = (renderNoResultsItem || customRenderItem) ? (item, itemEl) => {\r\n if (item && item[valueProp] === NoResultsItemSymbol) {\r\n if (renderNoResultsItem && renderNoResultsItem(item, itemEl) !== false) {\r\n return true;\r\n }\r\n\r\n itemEl.appendChild(createElement('div', {\r\n class: 'droplist-no-results-content',\r\n textContent: p.noResultsText,\r\n }));\r\n return true;\r\n } else {\r\n if (customRenderItem)\r\n return customRenderItem(item, itemEl);\r\n }\r\n return false;\r\n } : null;\r\n\r\n const unrenderItem = (unrenderNoResultsItem || customRenderItem) ? (item, itemEl) => {\r\n if (item && item[valueProp] === NoResultsItemSymbol) {\r\n if (unrenderNoResultsItem)\r\n return unrenderNoResultsItem(item, itemEl);\r\n } else {\r\n if (customUnrenderItem)\r\n return customUnrenderItem(item, itemEl);\r\n }\r\n return false;\r\n } : null;\r\n\r\n const dropList = p.dropList = new DropList({\r\n virtualMinItems: 10,\r\n\r\n ...p.listOptions,\r\n\r\n renderItem: renderItem,\r\n unrenderItem: unrenderItem,\r\n\r\n multi: p.multi,\r\n capturesFocus: false,\r\n\r\n labelProp: p.labelProp,\r\n valueProp: p.valueProp,\r\n\r\n on: (name, event) => {\r\n switch (name) {\r\n case 'show:before': {\r\n p.dropListVisible = true;\r\n p.el.setAttribute('aria-expanded', 'true');\r\n p.el.classList.add(`${p.baseClassName}__open_list`);\r\n p.el.classList.remove(`${p.baseClassName}__closed_list`);\r\n\r\n if (p.resortBySelectionNeeded && (p.sortListCheckedFirst && p.multi))\r\n p.itemsChanged = true;\r\n\r\n this._updateListItems();\r\n this._trigger('open', { list: dropList });\r\n\r\n this._startTrackingPresence();\r\n\r\n p.sink.add(window, 'resize.trackposition', () => this._repositionDropList());\r\n\r\n let parent = p.el.parentNode;\r\n while (parent) {\r\n if (parent.scrollHeight > parent.offsetHeight ||\r\n parent.scrollWidth > parent.offsetWidth) {\r\n if (parent === document.documentElement) {\r\n parent = window;\r\n }\r\n p.sink.add(parent, 'scroll.trackposition', () => this._repositionDropList());\r\n }\r\n parent = parent.parentNode;\r\n }\r\n }\r\n break;\r\n\r\n case 'hide': {\r\n p.dropListVisible = false;\r\n p.el.setAttribute('aria-expanded', 'false');\r\n p.el.classList.remove(`${p.baseClassName}__open_list`);\r\n p.el.classList.add(`${p.baseClassName}__closed_list`);\r\n\r\n if (!p.multi) {\r\n this._setInputText('');\r\n this._scheduleSync();\r\n }\r\n\r\n this._trigger('close');\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n this._stopTrackingPresence();\r\n p.sink.remove(null, '.trackposition');\r\n }\r\n break;\r\n\r\n case 'check': {\r\n if (!p.multi) return;\r\n\r\n const item = /**@type DropList.Item*/event.item;\r\n const value = event.value;\r\n\r\n let checked = item._checked;\r\n if (item._group) return; // Ignore groups\r\n\r\n let selEvt = { value: value, item: item, cancel: false };\r\n this._trigger((checked ? 'addsel' : 'removesel') + ':before', selEvt);\r\n\r\n if (selEvt.cancel) {\r\n // Rollback that check\r\n p.dropList.setItemChecked(value, !checked);\r\n return;\r\n }\r\n\r\n if (checked) {\r\n p.selectedItems.push(item);\r\n p.selectedValues.push(value);\r\n } else {\r\n const idx = p.selectedValues.indexOf(value);\r\n if (idx !== -1) {\r\n p.selectedItems.splice(idx, 1);\r\n p.selectedValues.splice(idx, 1);\r\n }\r\n }\r\n\r\n // If we are in context of group, then there are lots of syncs coming, so do not do it now\r\n const hasGroupSync = !!event.isCheckingGroup;\r\n\r\n if (p.showSelection) {\r\n if (checked) {\r\n if (dropList.itemCount() === 1) {\r\n this._setInputText('');\r\n }\r\n\r\n if (p.sortSelectedItems) {\r\n if (!hasGroupSync)\r\n this._scheduleSync('full');\r\n } else {\r\n if (p.maxMultiItems != null &&\r\n p.selectedItems.filter(x => !x._group).length > p.maxMultiItems) {\r\n this._scheduleSync('addOrUpdateMultiItemRestElement');\r\n } else {\r\n this._scheduleSync('addMultiItemElement', item);\r\n }\r\n\r\n if (!hasGroupSync)\r\n this._scheduleSync();\r\n }\r\n } else {\r\n if (p.maxMultiItems != null &&\r\n p.selectedItems.filter(x => !x._group).length === p.maxMultiItems) {\r\n this._scheduleSync('removeMultiItemRestElement');\r\n } else {\r\n this._scheduleSync('removeMultiItemElement', item);\r\n }\r\n\r\n if (!hasGroupSync)\r\n this._scheduleSync();\r\n }\r\n }\r\n\r\n this._trigger(checked ? 'addsel' : 'removesel', { value: value, item: item });\r\n }\r\n break;\r\n\r\n case 'groupcheck': {\r\n if (!p.multi) return;\r\n\r\n if (event.affectedItems) {\r\n this._scheduleSync(p.sortSelectedItems ? 'full' : null);\r\n }\r\n }\r\n break;\r\n\r\n case 'select': {\r\n if (p.multi) return;\r\n\r\n const item = event.item;\r\n const value = event.value;\r\n\r\n let selectEvt = { value: value, item: item, cancel: false };\r\n this._trigger('select:before', selectEvt);\r\n\r\n if (selectEvt.cancel)\r\n return;\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n this._setSelectedItems([item]);\r\n this._trigger('select', { value: value, item: item });\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n this.closeList();\r\n\r\n if (p.blurOnSingleSelection === 'touch' && hasTouchCapability ||\r\n p.blurOnSingleSelection !== 'touch' && p.blurOnSingleSelection) {\r\n p.input && p.input.blur();\r\n }\r\n }\r\n break;\r\n }\r\n },\r\n });\r\n\r\n this._registerDropdownEvents();\r\n }\r\n\r\n _unregisterDropdownEvents() {\r\n const p = this._p;\r\n\r\n p.sink.remove(null, '.dropdown');\r\n }\r\n\r\n _registerDropdownEvents() {\r\n const p = this._p;\r\n\r\n this._unregisterDropdownEvents();\r\n\r\n const dropList = p.dropList;\r\n if (!dropList) return;\r\n\r\n let avoidToggleFromClick = false,\r\n currentTouchId = null,\r\n suppressKeyPress = false,\r\n suppressKeyPressRepeat = false;\r\n\r\n const keyEventsTarget = p.multi || p.searchable ? p.input : p.el;\r\n\r\n p.sink\r\n .add(keyEventsTarget, 'keydown.dropdown', evt => {\r\n if ((/**@type HTMLInputElement*/evt.currentTarget).readOnly)\r\n return;\r\n\r\n suppressKeyPress = false;\r\n suppressKeyPressRepeat = false;\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n case VALUE_PAGE_DOWN:\r\n case VALUE_UP:\r\n case VALUE_DOWN:\r\n suppressKeyPress = true;\r\n evt.preventDefault();\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n dropList.previousPage(evt);\r\n break;\r\n case VALUE_PAGE_DOWN:\r\n dropList.nextPage(evt);\r\n break;\r\n case VALUE_UP:\r\n dropList.previous(evt);\r\n break;\r\n case VALUE_DOWN:\r\n dropList.next(evt);\r\n break;\r\n\r\n }\r\n break;\r\n\r\n case VALUE_SPACE:\r\n if (p.lastKeyAllowsSpaceToggle) {\r\n if (dropList.hasFocusedItem()) {\r\n suppressKeyPress = true;\r\n suppressKeyPressRepeat = true;\r\n if (p.multi)\r\n dropList.toggleFocusedItem(evt);\r\n else dropList.triggerItemSelection(evt);\r\n evt.preventDefault();\r\n }\r\n }\r\n break;\r\n\r\n case VALUE_ENTER:\r\n if (dropList.isVisible() && dropList.hasFocusedItem()) {\r\n suppressKeyPress = true;\r\n suppressKeyPressRepeat = true;\r\n evt.preventDefault();\r\n dropList.triggerItemSelection(evt);\r\n }\r\n\r\n break;\r\n\r\n case VALUE_TAB:\r\n if (dropList.hasFocusedItem()) {\r\n dropList.triggerItemSelection(evt);\r\n }\r\n break;\r\n\r\n case VALUE_ESCAPE:\r\n if (dropList.isVisible()) {\r\n dropList.hide(evt);\r\n evt.preventDefault();\r\n }\r\n break;\r\n\r\n default:\r\n suppressKeyPressRepeat = true;\r\n dropList._keydownFreeType(evt);\r\n break;\r\n }\r\n\r\n p.lastKeyAllowsSpaceToggle = evt.key === VALUE_UP ||\r\n evt.key === VALUE_DOWN ||\r\n evt.key === VALUE_PAGE_UP ||\r\n evt.key === VALUE_PAGE_DOWN ||\r\n (evt.key === VALUE_SPACE && !!p.lastKeyAllowsSpaceToggle);\r\n })\r\n .add(keyEventsTarget, 'keypress.dropdown', evt => {\r\n if (suppressKeyPress) {\r\n suppressKeyPress = false;\r\n evt.preventDefault();\r\n return;\r\n }\r\n\r\n if (suppressKeyPressRepeat)\r\n return;\r\n\r\n if (evt.key === VALUE_ENTER ||\r\n (\r\n evt.key === VALUE_SPACE &&\r\n p.lastKeyAllowsSpaceToggle &&\r\n !p.multi &&\r\n !dropList.hasFocusedItem()\r\n )\r\n ) {\r\n this.toggleList();\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n return;\r\n }\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n case VALUE_PAGE_DOWN:\r\n case VALUE_UP:\r\n case VALUE_DOWN:\r\n evt.preventDefault();\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n dropList.previousPage(evt);\r\n break;\r\n case VALUE_PAGE_DOWN:\r\n dropList.nextPage(evt);\r\n break;\r\n case VALUE_UP:\r\n dropList.previous(evt);\r\n break;\r\n case VALUE_DOWN:\r\n dropList.next(evt);\r\n break;\r\n\r\n }\r\n break;\r\n }\r\n });\r\n\r\n if (p.input) {\r\n p.sink\r\n .add(p.input, 'input.dropdown', () => {\r\n p.filterTerm = p.input.value.trim();\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n\r\n this._trigger('search', { value: p.input.value });\r\n\r\n p.throttledUpdateListItems();\r\n })\r\n .add(p.input, 'click.dropdown', () => {\r\n if (!p.multi && p.searchable) {\r\n this.openList();\r\n }\r\n })\r\n .add(p.input, 'focus.dropdown', () => {\r\n this._trigger('search:focus');\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n avoidToggleFromClick = false;\r\n this.openList();\r\n\r\n avoidToggleFromClick = true;\r\n setTimeout(() => { avoidToggleFromClick = false; }, 10);\r\n })\r\n .add(p.input, 'blur.dropdown', () => {\r\n this._trigger('search:blur');\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n if (p.throttledUpdateListItems)\r\n p.throttledUpdateListItems.cancel();\r\n\r\n this.closeList();\r\n });\r\n }\r\n\r\n p.sink\r\n .add(p.el, 'mousedown.dropdown', () => {\r\n if (!p.multi && !p.searchable && !avoidToggleFromClick) {\r\n this.toggleList();\r\n }\r\n avoidToggleFromClick = false;\r\n })\r\n .add(p.el, 'touchstart.dropdown', evt => {\r\n if (currentTouchId) return;\r\n currentTouchId = evt.changedTouches[0].identifier;\r\n\r\n if (this.isDisabled())\r\n return;\r\n\r\n if (closestUntil(evt.target, `.${p.baseClassName}__item,.${p.baseClassName}__clear`, p.el))\r\n return;\r\n\r\n let onTouchCancel = () => {\r\n currentTouchId = null;\r\n p.sink.remove(p.el, '.dropdown_touchextra');\r\n };\r\n\r\n (p.input || p.el).focus();\r\n\r\n p.sink\r\n .add(p.el, 'touchend.dropdown_touchextra', (tevt) => {\r\n let touch = Array.prototype.find.call(evt.changedTouches,\r\n touch => touch.identifier === currentTouchId);\r\n if (!touch) return onTouchCancel();\r\n\r\n tevt.preventDefault();\r\n onTouchCancel();\r\n })\r\n .add(p.el, 'touchmove.dropdown_touchextra', (tevt) => {\r\n tevt.preventDefault();\r\n })\r\n .add(p.el, 'touchcancel.dropdown_touchextra', onTouchCancel);\r\n });\r\n }\r\n\r\n /** @private */\r\n _updateListItems() {\r\n const p = this._p;\r\n\r\n const dropList = p.dropList;\r\n if (!dropList || !p.dropListVisible)\r\n return;\r\n\r\n // For every search change, filteredItems is cleared.\r\n // If it's non-null here, then it means we have an extra call to _updateListItems, and not need to refilter.\r\n if (!p.filteredItems && (p.filterTerm || (p.filterOnEmptyTerm && p.filterFn))) {\r\n this._refilterItems();\r\n }\r\n\r\n if (p.itemsChanged || p.selectionChanged) {\r\n p.dropList._lastSerializedBox = null;\r\n }\r\n\r\n if (p.itemsChanged) {\r\n let items = p.filteredItems || p.items;\r\n if (p.sortListItems || (p.sortListCheckedFirst && p.multi)) {\r\n items = this._sortItems(items,\r\n p.sortListItems,\r\n p.sortListCheckedFirst && p.multi,\r\n p.splitListCheckedGroups);\r\n }\r\n dropList.removeAllItems();\r\n\r\n if (items.length === 0 && p.noResultsText) {\r\n items = [{\r\n [p.labelProp]: p.noResultsText,\r\n [p.valueProp]: NoResultsItemSymbol,\r\n _nointeraction: true,\r\n _nocheck: true,\r\n }];\r\n }\r\n\r\n dropList.addItems(items);\r\n p.itemsChanged = false;\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = false;\r\n }\r\n\r\n let hasRefocusedItem = false;\r\n\r\n if (p.selectionChanged) {\r\n if (p.multi) {\r\n p.dropList.setCheckedValues(p.selectedValues);\r\n } else {\r\n const singleItemIndex = p.dropList.itemIndexByValue(this.getValue());\r\n\r\n p.dropList\r\n .setFocusedItemAtIndex(singleItemIndex)\r\n .setSingleSelectedItemAtIndex(singleItemIndex);\r\n\r\n hasRefocusedItem = p.dropList.hasFocusedItem();\r\n }\r\n p.selectionChanged = false;\r\n }\r\n\r\n this._repositionDropList();\r\n\r\n if (hasRefocusedItem) {\r\n p.dropList.setFocusedItemAtIndex(p.dropList.getFocusedItemIndex());\r\n }\r\n }\r\n\r\n _refilterItems() {\r\n const p = this._p;\r\n\r\n const term = p.filterTerm;\r\n\r\n if (term || (p.filterOnEmptyTerm && p.filterFn)) {\r\n let fn = p.filterFn;\r\n\r\n let filteredItems;\r\n\r\n if (typeof fn === 'function') {\r\n filteredItems = p.filterFn(p.items, term);\r\n }\r\n\r\n // If there was no filter function, or it gave up on filtering.\r\n if (!Array.isArray(filteredItems)) {\r\n if (term) {\r\n const matcher = new RegExp(escapeRegex(term), 'i');\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n\r\n filteredItems = p.items.filter(x => {\r\n if (x._group) return true;\r\n return matcher.test(x[labelProp] || x[multiItemLabelProp]);\r\n });\r\n } else {\r\n filteredItems = null;\r\n }\r\n }\r\n\r\n p.filteredItems = filteredItems;\r\n\r\n if (filteredItems) {\r\n // Clean up groups without children\r\n\r\n let lastGroup = -1;\r\n let len = filteredItems.length;\r\n\r\n for (let i = 0; i < len; i++) {\r\n let item = filteredItems[i];\r\n\r\n if (item._group) {\r\n if (lastGroup !== -1 && lastGroup === i - 1) {\r\n // It was an empty group\r\n filteredItems.splice(lastGroup, 1);\r\n i--;\r\n len--;\r\n }\r\n\r\n lastGroup = i;\r\n }\r\n }\r\n\r\n if (lastGroup !== -1) {\r\n if (lastGroup === len - 1) {\r\n // It was an empty group\r\n filteredItems.splice(lastGroup, 1);\r\n }\r\n }\r\n }\r\n } else {\r\n p.filteredItems = null;\r\n }\r\n\r\n this._trigger('itemschanged', { term: term, mutated: false, count: this.getFilteredItemCount() });\r\n\r\n p.itemsChanged = true;\r\n }\r\n\r\n _setSelectedItems(items) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (p.multi) {\r\n p.selectedItems = items.filter(x => x[valueProp] !== undefined);\r\n p.selectedValues = p.selectedItems.map(x => x[valueProp]);\r\n } else {\r\n p.selectedItems = items.slice(0, 1);\r\n p.selectedValues = items.slice(0, 1).map(x => x[valueProp]);\r\n }\r\n\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n\r\n this._updateListItems();\r\n this._scheduleSync('full');\r\n }\r\n\r\n _scheduleSync(mode, data) {\r\n const p = this._p;\r\n\r\n if (!p.syncQueue)\r\n p.syncQueue = [];\r\n\r\n if (mode === 'full')\r\n p.syncQueue.length = 0;\r\n\r\n if (p.syncQueue.length === 0 || p.syncQueue[0].mode !== 'full')\r\n p.syncQueue.push({ mode: mode, data: data });\r\n\r\n if (p.syncTimeout)\r\n return;\r\n\r\n p.syncTimeout = setTimeout(() => {\r\n delete p.syncTimeout;\r\n let queue = p.syncQueue;\r\n delete p.syncQueue;\r\n this._performSync(queue);\r\n });\r\n }\r\n\r\n _performSync(queue) {\r\n const p = this._p;\r\n\r\n if (this[DestroyedSymbol])\r\n return;\r\n\r\n for (let op of queue) {\r\n switch (op.mode) {\r\n case 'full':\r\n this._syncFull(true);\r\n break;\r\n\r\n case 'singleItem':\r\n this._syncSingleItem();\r\n break;\r\n\r\n case 'removeMultiItemElement': {\r\n if (p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n const valueProp = p.valueProp;\r\n const item = op.data,\r\n value = item[valueProp];\r\n\r\n let idx = p.multiItemEls.findIndex(x => x[ItemSymbol][valueProp] === value);\r\n if (idx !== -1) {\r\n this._removeMultiItemElementByIndex(idx);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case 'addMultiItemElement': {\r\n if (!p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n this._addMultiItemElement(op.data);\r\n }\r\n }\r\n break;\r\n\r\n case 'addOrUpdateMultiItemRestElement': {\r\n if (!p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n this._addMultiItemRestElement();\r\n }\r\n }\r\n break;\r\n\r\n case 'removeMultiItemRestElement': {\r\n if (!p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n let itemEl = p.multiItemEls[p.multiItemEls.length - 1];\r\n if (itemEl?.[ItemSymbol]?.[p.valueProp] === RestMultiItemsSymbol) {\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case 'resize_input': {\r\n this._resizeInput();\r\n }\r\n break;\r\n\r\n default:\r\n this._syncFull(false);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n _cleanupSingleWrapper() {\r\n const p = this._p;\r\n\r\n if (!p.singleWrapper) return;\r\n\r\n if (p.unrenderSingleItem && p.singleWrapper.childNodes.length > 0) {\r\n try {\r\n p.unrenderSingleItem(p.singleWrapper[ItemSymbol], p.singleWrapper);\r\n } catch (err) { console.error(err); } // eslint-disable-line no-console\r\n }\r\n\r\n delete p.singleWrapper[ItemSymbol];\r\n p.singleWrapper.innerHTML = '';\r\n }\r\n\r\n /**\r\n * @param {number} index\r\n * @private\r\n */\r\n _removeMultiItemElementByIndex(index) {\r\n const p = this._p, multiItemEls = p.multiItemEls;\r\n\r\n if (multiItemEls.length > index) {\r\n const itemEl = multiItemEls[index];\r\n const item = itemEl[ItemSymbol];\r\n\r\n let unrender = item?.[p.valueProp] === RestMultiItemsSymbol\r\n ? p.unrenderRestMultiItem ?? p.unrenderMultiItem\r\n : p.unrenderMultiItem;\r\n\r\n if (unrender && itemEl.childNodes.length > 0) {\r\n try {\r\n unrender(item, itemEl);\r\n } catch (err) { console.error(err); } // eslint-disable-line no-console\r\n }\r\n remove(itemEl);\r\n\r\n // fastpath\r\n if (index === multiItemEls.length - 1) multiItemEls.pop();\r\n else multiItemEls.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @private\r\n */\r\n _renderSingleItemContent(item) {\r\n const p = this._p;\r\n\r\n if (!p.renderSingleItem || p.renderSingleItem(item, p.singleWrapper) === false) {\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n\r\n let label = item[multiItemLabelProp] || item[labelProp];\r\n if (label === null || label === undefined)\r\n label = '';\r\n\r\n p.singleWrapper.appendChild(document.createTextNode(label));\r\n }\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @param {Element} itemEl\r\n * @private\r\n */\r\n _renderMultiItemContent(item, itemEl) {\r\n const p = this._p;\r\n\r\n let render = item[p.valueProp] === RestMultiItemsSymbol\r\n ? p.renderRestMultiItem ?? p.renderMultiItem\r\n : p.renderMultiItem;\r\n\r\n if (!render || render(item, itemEl) === false) {\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n const label = item[multiItemLabelProp] || item[labelProp];\r\n itemEl.appendChild(createElement('span', {\r\n textContent: label,\r\n }));\r\n }\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @private\r\n */\r\n _addMultiItemElement(item) {\r\n const p = this._p;\r\n const itemEl = this._renderMultiItem(item);\r\n if (!itemEl) return;\r\n\r\n before(p.inputWrapper, itemEl);\r\n p.multiItemEls.push(itemEl);\r\n }\r\n\r\n /** @private */\r\n _addMultiItemRestElement() {\r\n const p = this._p;\r\n\r\n let items = p.selectedItems.slice(0);\r\n let count = items.filter(x => !x._group).length - p.maxMultiItems;\r\n let label = p.multiItemsRestLabelProvider\r\n ? p.multiItemsRestLabelProvider(count, items)\r\n : `+ ${count}`;\r\n\r\n this._addMultiItemElement({\r\n items: items,\r\n [p.valueProp]: RestMultiItemsSymbol,\r\n [p.labelProp]: label,\r\n });\r\n }\r\n\r\n /** @private */\r\n _syncClearButton() {\r\n const p = this._p;\r\n\r\n // Set clear button\r\n if (p.selectedItems.length > 0 && p.clearable && p.showSelection) {\r\n if (!p.clearButtonWrapper) {\r\n p.clearButtonWrapper = createElement(\r\n p.multi ? 'li' : 'span',\r\n { class: `${p.baseClassName}__clear` },\r\n p.clearButton = createElement('button'));\r\n if (p.multi)\r\n append(p.list, p.clearButtonWrapper);\r\n else append(p.el, p.clearButtonWrapper);\r\n p.el.classList.add(`${p.baseClassName}__has_clear`);\r\n\r\n p.sink.add(p.clearButton, 'click', () => {\r\n if (this.isDisabled()) return;\r\n this.clear();\r\n });\r\n }\r\n } else {\r\n if (p.clearButtonWrapper) {\r\n p.sink.remove(p.clearButton, 'click');\r\n\r\n remove(p.clearButtonWrapper);\r\n delete p.clearButtonWrapper;\r\n delete p.clearButton;\r\n p.el.classList.remove(`${p.baseClassName}__has_clear`);\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n _syncPlaceholder() {\r\n const p = this._p;\r\n\r\n let placeholder = '';\r\n\r\n if (p.multi && !p.showSelection) {\r\n if (typeof p.multiPlaceholderFormatter === 'function') {\r\n placeholder = p.multiPlaceholderFormatter(p.selectedItems);\r\n } else {\r\n placeholder = defaultMultiPlaceholderFormatter(p.selectedItems, p.labelProp);\r\n }\r\n } else if (p.selectedItems.length === 0 || !p.showSelection) {\r\n placeholder = p.placeholder == null ? '' : (p.placeholder + '');\r\n }\r\n\r\n // Set input placeholder\r\n p.input.setAttribute('placeholder', placeholder);\r\n }\r\n\r\n /** @private */\r\n _syncSingleItem() {\r\n const p = this._p;\r\n\r\n if (p.singleWrapper)\r\n this._cleanupSingleWrapper();\r\n\r\n const items = p.selectedItems;\r\n\r\n if (items.length > 0) {\r\n this._renderSingleItemContent(items[0]);\r\n p.singleWrapper[ItemSymbol] = items[0];\r\n }\r\n }\r\n\r\n /**\r\n * Syncs render state, selected items, and position\r\n * @param {boolean=false} fullItemsRender Should re-render all items?\r\n * @returns {SelectBox}\r\n */\r\n _syncFull(fullItemsRender) {\r\n const p = this._p;\r\n\r\n this._renderBase();\r\n this._syncClearButton();\r\n this._syncPlaceholder();\r\n\r\n fullItemsRender = p.multi && p.showSelection && (fullItemsRender || p.selectedItems.length !== p.multiItemEls.length);\r\n\r\n if (fullItemsRender || !p.showSelection || !p.multi) {\r\n // Remove all item elements\r\n while (p.multiItemEls.length > 0) {\r\n // use fast path by removing in reverse\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n }\r\n }\r\n\r\n if (p.multi) {\r\n if (fullItemsRender) {\r\n const items = p.selectedItems;\r\n\r\n // Sort these\r\n if (p.sortSelectedItems) {\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp,\r\n valueProp = p.valueProp,\r\n stickyValues = p.stickyValues;\r\n\r\n const comparator = p.sortItemComparator || ((a, b) => {\r\n if (stickyValues !== null) {\r\n let sa = stickyValues.has(a[valueProp]);\r\n let sb = stickyValues.has(b[valueProp]);\r\n if (sa && !sb) return -1;\r\n if (!sa && sb) return 1;\r\n }\r\n\r\n const aLabel = a[multiItemLabelProp] || a[labelProp];\r\n const bLabel = b[multiItemLabelProp] || b[labelProp];\r\n return aLabel < bLabel ? -1 : (aLabel > bLabel ? 1 : 0);\r\n });\r\n\r\n items.sort(comparator);\r\n\r\n p.selectedValues = items.map(x => x[valueProp]);\r\n }\r\n\r\n let actualItemCount = 0;\r\n let max = p.maxMultiItems;\r\n let addRestItem = false;\r\n\r\n // Add item elements\r\n for (let i = 0; i < items.length; i++) {\r\n if (items[i]._group) continue;\r\n\r\n if (max != null && actualItemCount === max) {\r\n addRestItem = true;\r\n break;\r\n }\r\n\r\n actualItemCount++;\r\n this._addMultiItemElement(items[i]);\r\n }\r\n\r\n if (addRestItem) {\r\n this._addMultiItemRestElement();\r\n }\r\n }\r\n } else if (!p.multi) {\r\n this._syncSingleItem();\r\n }\r\n\r\n if (getRootNode(p.el) !== document)\r\n return this;\r\n\r\n toggleClass(p.el, `${p.baseClassName}__empty_selection`, p.selectedValues.length === 0);\r\n toggleClass(p.el, `${p.baseClassName}__has_selection`, p.selectedValues.length > 0);\r\n\r\n if (p.searchable || p.multi) {\r\n if (p.input) p.input.readOnly = false;\r\n p.el.classList.add(`${p.baseClassName}__searchable`);\r\n } else {\r\n if (p.input) p.input.readOnly = true;\r\n p.el.classList.remove(`${p.baseClassName}__searchable`);\r\n }\r\n\r\n // Update input size\r\n this._resizeInput()._updateListItems();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} event\r\n * @param {*} [data]\r\n * @private\r\n */\r\n _trigger(event, data) {\r\n const p = this._p;\r\n if (p.on)\r\n p.on(event, ...(data === undefined ? [] : [data]));\r\n }\r\n\r\n /**\r\n * Render a multi item\r\n * @param {Object} item\r\n * @returns {Element|null}\r\n * @private\r\n */\r\n _renderMultiItem(item) {\r\n const p = this._p;\r\n\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n const label = item[multiItemLabelProp] ?? item[labelProp];\r\n if (label === false)\r\n return null;\r\n\r\n const itemEl = createElement('li',\r\n {\r\n class: `${p.baseClassName}__item`,\r\n tabindex: '0',\r\n title: label,\r\n },\r\n [\r\n createElement('span', {\r\n class: `${p.baseClassName}__item_remove`,\r\n role: 'presentation',\r\n }),\r\n ],\r\n );\r\n\r\n this._renderMultiItemContent(item, itemEl);\r\n\r\n itemEl[ItemSymbol] = item;\r\n\r\n return itemEl;\r\n }\r\n\r\n /**\r\n * Removes a specific multi item by user event\r\n * @param {Element} itemEl\r\n * @param {Event} originatingEvent\r\n * @returns {SelectBox}\r\n * @private\r\n */\r\n _removeMultiItemFromEvent(itemEl, originatingEvent) {\r\n const p = this._p;\r\n\r\n let nextFocus;\r\n if (/key/.test(originatingEvent.type)) {\r\n const kEvent = /**@type KeyboardEvent*/originatingEvent;\r\n if (kEvent.key === VALUE_DELETE) { // Delete\r\n nextFocus = next(itemEl, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n } else if (kEvent.key === VALUE_BACK_SPACE) { // Backspace\r\n nextFocus = prev(itemEl, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n }\r\n } else if (/click|mouse|touch/.test(originatingEvent.type)) {\r\n nextFocus = next(itemEl, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n }\r\n\r\n const item = itemEl[ItemSymbol], value = item[p.valueProp];\r\n\r\n if (item !== undefined) {\r\n if (value === RestMultiItemsSymbol) {\r\n let items = p.selectedItems.filter(x => !x._group).slice(p.maxMultiItems);\r\n let itemsToRemove = [];\r\n\r\n for (let item of items) {\r\n let removeselEvt = { value: value, item: item, cancel: false };\r\n this._trigger('removesel:before', removeselEvt);\r\n if (!removeselEvt.cancel)\r\n itemsToRemove.push(item);\r\n }\r\n\r\n if (itemsToRemove.length > 0) {\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n\r\n for (let item of itemsToRemove) {\r\n // sync selection\r\n let idx = p.selectedItems.indexOf(item);\r\n if (idx === -1)\r\n idx = p.selectedValues.indexOf(value[p.valueProp]);\r\n if (idx !== -1) {\r\n p.selectedItems.splice(idx, 1);\r\n p.selectedValues.splice(idx, 1);\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n }\r\n }\r\n }\r\n\r\n if (items.length > itemsToRemove.length) {\r\n this._addMultiItemRestElement();\r\n }\r\n\r\n if (itemsToRemove.length > 0) {\r\n this._scheduleSync();\r\n }\r\n } else {\r\n let removeselEvt = { value: value, item: item, cancel: false };\r\n this._trigger('removesel:before', removeselEvt);\r\n if (removeselEvt.cancel)\r\n return this;\r\n\r\n this._removeMultiItem(item);\r\n\r\n // trigger event\r\n this._trigger('removesel', { value: value, item: item });\r\n }\r\n }\r\n\r\n if (!nextFocus) {\r\n nextFocus = p.el.querySelector(`.${p.baseClassName}__item, .${p.baseClassName}__search_field`);\r\n }\r\n\r\n if (hasClass(nextFocus, `${p.baseClassName}__search_wrapper`)) {\r\n nextFocus = nextFocus.querySelector('input');\r\n }\r\n\r\n nextFocus && nextFocus.focus();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @param {boolean} [populate]\r\n * @private\r\n */\r\n _removeMultiItem(item, populate = false) {\r\n const p = this._p;\r\n const valueProp = p.valueProp,\r\n labelProp = p.labelProp;\r\n const value = item[valueProp];\r\n\r\n // sync selection\r\n let idx = p.selectedItems.indexOf(item);\r\n if (idx === -1)\r\n idx = p.selectedValues.indexOf(value);\r\n if (idx !== -1) {\r\n p.selectedItems.splice(idx, 1);\r\n p.selectedValues.splice(idx, 1);\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n }\r\n\r\n // sync multi item element\r\n idx = p.multiItemEls.findIndex(x => x[ItemSymbol] === item);\r\n if (idx === -1)\r\n idx = p.multiItemEls.findIndex(x => x[ItemSymbol][valueProp] === value);\r\n if (idx !== -1) {\r\n this._removeMultiItemElementByIndex(idx);\r\n }\r\n\r\n if (populate) {\r\n this._setInputText(item[p.multiItemLabelProp] || item[labelProp]);\r\n\r\n p.input.focus();\r\n\r\n // Go to end of input\r\n p.input.selectionStart = p.input.selectionEnd = p.input.value.length;\r\n }\r\n\r\n // sync\r\n this._scheduleSync();\r\n }\r\n\r\n /**\r\n * @param {*} value\r\n * @private\r\n */\r\n _setInputText(value) {\r\n const p = this._p;\r\n\r\n p.input.value = value == null ? '' : String(value);\r\n\r\n p.filterTerm = '';\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n }\r\n\r\n /**\r\n * Update input size to current state\r\n * @returns {SelectBox}\r\n * @private\r\n */\r\n _resizeInput() {\r\n const p = this._p;\r\n\r\n const input = p.input, backBufferEl = p.inputBackBuffer;\r\n\r\n let inputValue = input.value || input.placeholder;\r\n toggleClass(p.el, `${p.baseClassName}__has_input`, !!inputValue);\r\n toggleClass(p.el, `${p.baseClassName}__empty_input`, !inputValue);\r\n\r\n if (p.multi && p.multiItemEls.length === 0 && p.showSelection) {\r\n // Full width of list wrapper\r\n input.style.width = ''; // reset first\r\n\r\n let beforeWidth = 0, afterWidth = 0;\r\n\r\n let beforeStyle = getComputedStyle(p.list || p.el, '::before');\r\n if (beforeStyle.content &&\r\n beforeStyle.content !== 'none' &&\r\n beforeStyle.position !== 'absolute' &&\r\n beforeStyle.float !== 'none') {\r\n beforeWidth = getPseudoElementWidth(p.list || p.el, '::before', true, true, true);\r\n }\r\n\r\n let afterStyle = getComputedStyle(p.list || p.el, '::after');\r\n if (afterStyle.content &&\r\n afterStyle.content !== 'none' &&\r\n afterStyle.position !== 'absolute' &&\r\n afterStyle.float !== 'none') {\r\n afterWidth = getPseudoElementWidth(p.list || p.el, '::after', true, true, true);\r\n }\r\n\r\n let contentWidth = getElementWidth(p.list || p.el); // calculate width\r\n contentWidth -= beforeWidth + afterWidth;\r\n\r\n input.style.width = `${contentWidth}px`;\r\n } else {\r\n // Introduce backbuffer to DOM\r\n setCssProps(backBufferEl, getCssProps(input, inputBackbufferCssProps));\r\n backBufferEl.textContent = inputValue;\r\n p.el.appendChild(backBufferEl);\r\n\r\n // Measure these\r\n const computedStyle = getComputedStyle(input);\r\n const paddingTotal = (parseFloat(computedStyle.paddingLeft) || 0) + (parseFloat(computedStyle.paddingRight) || 0);\r\n const minWidth = (parseFloat(computedStyle['font-size']) || 0) * 0.75 + paddingTotal;\r\n const backBufferWidth = getElementWidth(backBufferEl, true, true);\r\n const currentWidth = getElementWidth(input, true, true);\r\n let newWidth = Math.max(backBufferWidth, minWidth);\r\n\r\n // Compare\r\n if (newWidth !== currentWidth) {\r\n // Update if needed\r\n setElementWidth(input, newWidth, true, true);\r\n\r\n let bordersWidth = (parseFloat(computedStyle.borderLeftWidth) || 0) + (parseFloat(computedStyle.borderRightWidth) || 0);\r\n let scrollWidth = input.scrollWidth + bordersWidth;\r\n\r\n if (scrollWidth > newWidth) {\r\n // consider scrollWidth delta\r\n let delta = scrollWidth - newWidth;\r\n input.style.width = `${parseFloat(input.style.width) + delta}px`;\r\n\r\n newWidth += delta;\r\n }\r\n\r\n // sync the single value wrapper.\r\n // it is meant as a preview or spacer for single selection value, so its appropriate to sync it with this width\r\n if (p.singleWrapper) {\r\n p.singleWrapper.style.width = '';\r\n\r\n if (inputValue) {\r\n let width = newWidth - paddingTotal - bordersWidth;\r\n if (getElementWidth(p.singleWrapper, false, false) < width) {\r\n setElementWidth(p.singleWrapper, width, false, false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Remove backbuffer from DOM\r\n remove(backBufferEl);\r\n }\r\n\r\n this._trigger('input:resize');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Update autocomplete position if needed\r\n * @returns {SelectBox}\r\n * @private\r\n */\r\n _repositionDropList() {\r\n const p = this._p, el = p.el;\r\n\r\n if (!p.dropList || !p.dropListVisible || !p.dropList.isVisible())\r\n return this;\r\n\r\n const box = el.getBoundingClientRect();\r\n const serialized = box.left + ',' + box.top + ',' + box.right + ',' + box.bottom;\r\n\r\n if (p.dropList._lastSerializedBox !== serialized) {\r\n p.dropList.relayout(this._getDropListPositionOptions());\r\n p.dropList._lastSerializedBox = serialized;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {KeyboardEvent} event\r\n * @private\r\n */\r\n _handleInputKeydown(event) {\r\n const p = this._p;\r\n\r\n const target = (/**@type HTMLInputElement*/event.target);\r\n\r\n if (event.key === VALUE_BACK_SPACE && event.ctrlKey && target.value.length === 0) {\r\n this.clear();\r\n\r\n event.preventDefault();\r\n } else if (event.key === VALUE_BACK_SPACE && target.value.length === 0) {\r\n const itemEl = p.multiItemEls[p.multiItemEls.length - 1];\r\n if (!itemEl || itemEl[ItemSymbol].value === undefined)\r\n return;\r\n\r\n const item = itemEl[ItemSymbol], value = item[p.valueProp];\r\n\r\n let removeselEvt = { value: value, item: item, cancel: false };\r\n this._trigger('removesel:before', removeselEvt);\r\n if (removeselEvt.cancel)\r\n return;\r\n\r\n this._removeMultiItem(item, true);\r\n\r\n // trigger event\r\n this._trigger('removesel', { value: value, item: item });\r\n\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * @param {KeyboardEvent} event\r\n * @private\r\n */\r\n _handleMultiKeydown(event) {\r\n const p = this._p;\r\n\r\n if (p.disabled) return;\r\n\r\n const isRtl = getComputedStyle(p.el).direction === 'rtl';\r\n\r\n let nextFocus;\r\n\r\n if (event.key === (isRtl ? VALUE_LEFT : VALUE_RIGHT)) { // Next arrow\r\n nextFocus = next(/**@type Element*/event.target, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n if (hasClass(nextFocus, `${p.baseClassName}__search_wrapper`)) {\r\n nextFocus = nextFocus.querySelector('input');\r\n }\r\n nextFocus && nextFocus.focus();\r\n\r\n event.preventDefault();\r\n } else if (event.key === (isRtl ? VALUE_RIGHT : VALUE_LEFT)) { // Prev arrow\r\n nextFocus = prev(/**@type Element*/event.target, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n if (hasClass(nextFocus, `${p.baseClassName}__search_wrapper`)) {\r\n nextFocus = nextFocus.querySelector('input');\r\n }\r\n nextFocus && nextFocus.focus();\r\n\r\n event.preventDefault();\r\n } else if (event.key === VALUE_BACK_SPACE && event.ctrlKey) { // Ctrl + Backspace\r\n const multiItemEls = [];\r\n let itemEl = event.target;\r\n while (itemEl) {\r\n multiItemEls.push(itemEl);\r\n itemEl = prev(/**@type Element*/itemEl, `.${p.baseClassName}__item`);\r\n }\r\n\r\n while (multiItemEls.length) {\r\n this._removeMultiItemFromEvent(multiItemEls.shift(), event);\r\n }\r\n\r\n event.preventDefault();\r\n } else if (event.key === VALUE_DELETE || event.key === VALUE_BACK_SPACE) { // Delete / Backspace\r\n this._removeMultiItemFromEvent(closestUntil(event.target, `.${p.baseClassName}__item`, p.el), event);\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * @returns {DropList.PositionOptions}\r\n * @private\r\n */\r\n _getDropListPositionOptions() {\r\n const p = this._p;\r\n\r\n return {\r\n target: /**@type Element*/p.el,\r\n offset: { x: 0, y: 0 },\r\n anchor: { x: 'start', y: 'bottom' },\r\n position: { x: 'start', y: 'top' },\r\n updateWidth: true,\r\n };\r\n }\r\n\r\n /** @private */\r\n _startTrackingPresence() {\r\n const p = this._p;\r\n\r\n this._stopTrackingPresence();\r\n\r\n p.presenceInt = setInterval(function () {\r\n if (getRootNode(p.el) !== document)\r\n this.hide();\r\n }, 200);\r\n }\r\n\r\n /** @private */\r\n _stopTrackingPresence() {\r\n const p = this._p;\r\n\r\n if (p.presenceInt) {\r\n clearInterval(p.presenceInt);\r\n p.presenceInt = null;\r\n }\r\n }\r\n\r\n /**\r\n * Handles sorting, and putting checked items first (according to selectedValues, not item.checked)\r\n * @private\r\n * @param {DropList.ItemBase[]} items\r\n * @param {boolean=false} sort\r\n * @param {boolean=false} sortCheckedFirst\r\n * @param {boolean=false} splitCheckedGroups\r\n * @returns {DropList.ItemBase[]}\r\n */\r\n _sortItems(items, sort, sortCheckedFirst, splitCheckedGroups) {\r\n const p = this._p;\r\n\r\n if (!sort && !sortCheckedFirst)\r\n return items; // Nothing to do\r\n\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp,\r\n valueProp = p.valueProp,\r\n stickyValues = p.stickyValues,\r\n comparator = p.sortItemComparator || ((a, b) => {\r\n if (stickyValues !== null) {\r\n let sa = stickyValues.has(a[valueProp]);\r\n let sb = stickyValues.has(b[valueProp]);\r\n if (sa && !sb) return -1;\r\n if (!sa && sb) return 1;\r\n }\r\n\r\n const aLabel = a[labelProp] || a[multiItemLabelProp];\r\n const bLabel = a[labelProp] || a[multiItemLabelProp];\r\n\r\n if (aLabel < bLabel) return -1;\r\n if (aLabel > bLabel) return 1;\r\n\r\n return 0;\r\n });\r\n\r\n let group = [], stickyGroup = null;\r\n let groups = [group];\r\n const selectedValuesSet = new Set(p.selectedValues);\r\n let item, i, len;\r\n\r\n // Split to groups\r\n for (i = 0, len = items.length; i < len; i++) {\r\n item = items[i];\r\n if (item._group && group.length) {\r\n group = [];\r\n groups.push(group);\r\n }\r\n group.push(item);\r\n }\r\n\r\n // Leftover\r\n if (!group.length) {\r\n groups.length = 0;\r\n }\r\n\r\n // Non-grouped sticky should be first\r\n if (stickyValues && items.length > 0 && !items[0]._group) {\r\n stickyGroup = groups[0].filter(x => stickyValues.has(x[valueProp]));\r\n if (stickyGroup.length > 0) {\r\n groups[0] = groups[0].filter(x => !stickyValues.has(x[valueProp]));\r\n }\r\n }\r\n\r\n if (sort) {\r\n // Sort the groups\r\n groups.sort((a, b) => {\r\n a = a[0];\r\n b = b[0];\r\n\r\n if (stickyValues !== null) {\r\n let sa = stickyValues.has(a[valueProp]);\r\n let sb = stickyValues.has(b[valueProp]);\r\n if (sa && !sb) return -1;\r\n if (!sa && sb) return 1;\r\n }\r\n\r\n // A \"group\" without a group item will come first\r\n if (!a._group && b._group) return -1;\r\n if (a._group && !b._group) return 1;\r\n\r\n return comparator(a, b);\r\n });\r\n }\r\n\r\n if (stickyGroup && stickyGroup.length > 0) {\r\n groups.unshift(stickyGroup);\r\n }\r\n\r\n // Now we have an array of groups, possibly sorted.\r\n // Each group is an array that begins with the group item (group name/id).\r\n // A group could possible start with a normal item, if it's a \"default group\", which had no group item.\r\n\r\n const checkedGroups = [], uncheckedGroups = [];\r\n\r\n // Iterate groups\r\n for (let g = 0, glen = groups.length; g < glen; g++) {\r\n group = groups[g];\r\n\r\n // Sort each group\r\n group.sort((a, b) => {\r\n\r\n // Grouping items come first\r\n if (a._group && !b._group) return -1;\r\n if (!a._group && b._group) return 1;\r\n\r\n if (sortCheckedFirst) {\r\n const aChecked = selectedValuesSet.has(a[valueProp]);\r\n const bChecked = selectedValuesSet.has(b[valueProp]);\r\n\r\n if (aChecked && !bChecked) return -1;\r\n if (!aChecked && bChecked) return 1;\r\n }\r\n\r\n if (sort) {\r\n return comparator(a, b);\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n uncheckedGroups.push(group);\r\n }\r\n\r\n if (sortCheckedFirst && splitCheckedGroups) {\r\n\r\n let virtualGroup;\r\n\r\n // Iterate groups\r\n for (let g = 0, glen = groups.length; g < glen; g++) {\r\n group = groups[g];\r\n\r\n if (group === stickyGroup) {\r\n checkedGroups.push(stickyGroup);\r\n let sgi = uncheckedGroups.indexOf(stickyGroup);\r\n if (sgi !== -1) {\r\n uncheckedGroups.splice(sgi, 1);\r\n }\r\n continue;\r\n }\r\n\r\n virtualGroup = null;\r\n\r\n for (let gi = 0, gilen = group.length; gi < gilen; gi++) {\r\n item = group[gi];\r\n if (item._group) continue;\r\n if (!selectedValuesSet.has(item[p.valueProp])) break;\r\n\r\n if (!virtualGroup) {\r\n virtualGroup = [];\r\n if (group[0]._group) {\r\n virtualGroup.push(group[0]);\r\n }\r\n }\r\n\r\n virtualGroup.push(item);\r\n group.splice(gi--, 1);\r\n gilen--;\r\n }\r\n\r\n if (virtualGroup) {\r\n checkedGroups.push(virtualGroup);\r\n if (group.length === 0 || (group.length === 1 && group[0]._group)) {\r\n groups.splice(g--, 1);\r\n glen--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Prepare the target array\r\n const joined = [];\r\n joined.length = items.length;\r\n let itemIndex = 0;\r\n\r\n groups = checkedGroups.length ?\r\n checkedGroups.concat(uncheckedGroups) : // Concat both lists\r\n uncheckedGroups; // No need for concat\r\n\r\n for (let g = 0, glen = groups.length; g < glen; g++) {\r\n group = groups[g];\r\n\r\n for (i = 0, len = group.length; i < len; i++) {\r\n joined[itemIndex++] = group[i];\r\n }\r\n }\r\n\r\n return joined;\r\n }\r\n}\r\n\r\nexport default SelectBox;\r\n"],"names":["value","replace","ItemSymbol","Symbol","DestroyedSymbol","GhostSymbol","hasOwnProperty","Object","prototype","defaultOptions","baseClassName","itemBlurDelay","capturesFocus","multi","keyDownHandler","autoCheckGroupChildren","useExactTargetWidth","constrainToWindow","autoFlipDirection","estimateWidth","virtualMinItems","labelProp","valueProp","on","DropList","[object Object]","options","o","key","entries","undefined","p","this","_p","ownsEl","elOriginalDisplay","additionalClasses","renderItem","unrenderItem","focusItemIndex","focusItemEl","sink","DomEventsSink","classes","concat","initialCss","top","el","Element","style","display","classList","add","role","setCssProps","createElement","class","join","css","items","groupCount","mouseHandled","virtualListHelper","VirtualListHelper","list","virtual","buffer","estimatedItemHeight","itemElementCreatorFn","tabIndex","onItemRender","itemEl","index","item","lastMeasureLongestLabelText","setAttribute","console","warn","className","_nocheck","_checked","_group","_child","_nointeraction","_renderItemContent","fn","setOnItemUnrender","err","error","_hookMouseEvents","_hookTouchEvents","_hookFocusEvents","_hookKeyEvents","clearTimeout","timer","filterTimer","remove","destroy","name","Array","from","startsWith","removeAttribute","lastPositionTarget","_syncBaseClasses","prop","fromFocus","hasFocusedItem","_trigger","event","_move","toggleClass","_updateGroupStateForItem","closestUntil","target","getItemIndexFromElement","_setSingleSelectedItemEl","atIndex","addItems","itemsToAdd","isMulti","length","_determineVirtualMode","i","count","oitem","splice","push","addItemsAt","render","newItem","itemIndex","itemIndexByValue","itemAtIndex","call","isItemRendered","refreshItemAt","label","itemIndexByValueOrLabel","removeItemsAt","setCount","slice","positionOptions","isVisible","w","window","targetBox","offset","targetOffset","getElementOffset","left","height","targetHeight","getElementHeight","width","targetWidth","getElementWidth","bottom","viewport","pageYOffset","pageXOffset","innerWidth","innerHeight","right","defaultVerticalDirection","position","y","isVirtual","_measureItem","updateWidth","_updateWidth","maxViewHeight","roomAbove","roomBelow","elComputedStyle","getComputedStyle","isBoxing","boxSizing","verticalPadding","parseFloat","paddingTop","paddingBottom","verticalBorderWidth","borderTopWidth","borderBottomWidth","estimateFullHeight","Math","max","scrollHeight","maxHeight","isNaN","min","enoughRoomAbove","enoughRoomBelow","newDirection","currentDirection","viewSize","isTargetRtl","targetRtl","direction","isRtlDocument","document","documentElement","anchor","anchoredPosition","x","invertYPos","specY","scrollLeft","body","parentNode","abs","scrollWidth","clientWidth","minX","maxX","viewCss","rtl","specX","which","setElementHeight","checked","li","getItemElementAt","values","groupIndexes","indexOf","_updateGroupCheckedState","excludeGroups","hiding","setTimeout","onDocumentMouseDown","_delayBlur","appendChild","visible","originalMaxHeight","clientHeight","marginTop","marginBottom","relayout","parseCssTransition","transition","reduce","v","delay","duration","blurFocusedItem","scrollItemIndexIntoView","itemElement","_getItemIndex","setFocusedItemAtIndex","setSingleSelectedItemAtIndex","_hasScroll","scrollTop","itemPos","previousPos","getItemPosition","itemSize","getItemSize","listHeight","singleSelectedItemEl","data","_mouseHandled","triggerItemSelection","toggleFocusedItem","activeElement","currentTarget","preventDefault","button","_itemUpAction","_handleMouseOver","_focus","currentTouchId","changedTouches","identifier","didScroll","onScroll","onTouchCancel","elToTrackScroll","find","touch","firstChild","contains","evt","_keydown","VALUE_PAGE_UP","VALUE_PAGE_DOWN","VALUE_HOME","VALUE_END","VALUE_UP","VALUE_DOWN","previousPage","nextPage","previous","next","VALUE_ENTER","VALUE_SPACE","VALUE_ESCAPE","hide","type","_keydownFreeType","character","String","fromCharCode","keyCode","keyword","previousFilter","regex","RegExp","escapeRegex","matchIndices","test","matchIndex","nextIndex","directionUp","isFirstItem","isLastItem","visibleItemCount","getVisibleItemCount","base","nextElementSibling","tagName","itemCount","startedAtIndex","groupIndex","affectedItems","len","nextEl","isCheckingGroup","fireEvents","groupItem","hasChecked","hasUnchecked","shouldCheckGroup","lastMeasureItemCount","longestLabel","lastMeasureLongestLabel","longestLabelText","text","createGhostItemElement","lastMeasureItemWidth","targetItemCount","shouldBeVirtual","setVirtual","textContent","insertBefore","autoWidth","newOuterWidth","setElementWidth","bordersWidth","borderLeftWidth","borderRightWidth","delta","throttle","func","wait","timeout","context","args","result","later","leading","Date","now","apply","throttled","remaining","arguments","trailing","cancel","isScheduled","NoResultsItemSymbol","RestMultiItemsSymbol","hasTouchCapability","DocumentTouch","navigator","maxTouchPoints","hasClass","inputBackbufferCssProps","disabled","clearable","hasOpenIndicator","placeholder","sortSelectedItems","sortListItems","sortListCheckedFirst","stickyValues","sortItemComparator","splitListCheckedGroups","blurOnSingleSelection","showSelection","multiPlaceholderFormatter","searchable","noResultsText","filterThrottleWindow","filterOnEmptyTerm","multiItemLabelProp","maxMultiItems","multiItemsRestLabelProvider","isLoadingMode","SelectBox","listOptions","isArray","Set","renderSingleItem","unrenderSingleItem","renderMultiItem","unrenderMultiItem","renderRestMultiItem","unrenderRestMultiItem","renderNoResultsItem","unrenderNoResultsItem","filterFn","filteredItems","itemsChanged","selectedItems","selectedValues","selectionChanged","resortBySelectionNeeded","throttledUpdateListItems","_updateListItems","filterTerm","setElementAttrs","aria-haspopup","aria-expanded","_renderBase","multiItemEls","enable","_setupDropdownMenu","input","focus","selectionStart","selectionEnd","relatedTarget","field","querySelector","_handleInputKeydown","_resizeInput","focusInOutHandler","t","setItems","_scheduleSync","syncTimeout","_stopTrackingPresence","dropList","_cleanupSingleWrapper","_removeMultiItemElementByIndex","singleWrapper","inputBackBuffer","clearButtonWrapper","openIndicator","enabled","toString","resetValues","setSelectedValues","getSelectedValues","term","mutated","getFilteredItemCount","existingItem","assign","updateItemByValue","performSearch","trim","sortCheckedFirst","comparator","formatter","unrender","setLabelProp","setValueProp","blur","clearEvt","_setInputText","set","has","_setSelectedItems","show","_getDropListPositionOptions","_repositionDropList","getFocusedItemIndex","open","openList","closeList","dropListVisible","setIsLoadingMode","getIsLoadingMode","isListOpen","zIndex","whiteSpace","inputWrapper","autocomplete","autocorrect","autocapitalize","spellcheck","aria-autocomplete","readOnly","_unregisterDropdownEvents","lastActiveElement","_removeMultiItemFromEvent","_handleMultiKeydown","_registerDropdownEvents","spinner","customRenderItem","customUnrenderItem","_startTrackingPresence","parent","offsetHeight","offsetWidth","selEvt","setItemChecked","idx","hasGroupSync","filter","selectEvt","avoidToggleFromClick","suppressKeyPress","suppressKeyPressRepeat","keyEventsTarget","lastKeyAllowsSpaceToggle","VALUE_TAB","toggleList","stopPropagation","isDisabled","tevt","_refilterItems","_lastSerializedBox","_sortItems","removeAllItems","hasRefocusedItem","setCheckedValues","singleItemIndex","getValue","matcher","lastGroup","map","mode","syncQueue","queue","_performSync","op","_syncFull","_syncSingleItem","_syncPlaceholder","findIndex","_addMultiItemElement","_addMultiItemRestElement","childNodes","innerHTML","pop","createTextNode","_renderMultiItem","before","clearButton","append","clear","title","defaultMultiPlaceholderFormatter","_renderSingleItemContent","fullItemsRender","_syncClearButton","a","b","sa","sb","aLabel","bLabel","sort","actualItemCount","addRestItem","getRootNode","tabindex","_renderMultiItemContent","originatingEvent","nextFocus","kEvent","VALUE_DELETE","VALUE_BACK_SPACE","prev","itemsToRemove","removeselEvt","_removeMultiItem","populate","backBufferEl","inputValue","beforeWidth","afterWidth","beforeStyle","content","float","getPseudoElementWidth","afterStyle","contentWidth","getCssProps","computedStyle","paddingTotal","paddingLeft","paddingRight","minWidth","backBufferWidth","currentWidth","newWidth","box","getBoundingClientRect","serialized","ctrlKey","isRtl","VALUE_LEFT","VALUE_RIGHT","shift","presenceInt","setInterval","clearInterval","splitCheckedGroups","group","stickyGroup","groups","selectedValuesSet","unshift","checkedGroups","uncheckedGroups","g","glen","aChecked","bChecked","virtualGroup","gi","gilen","sgi","joined"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["lib/utils/escapeRegex.js","lib/DropList.js","lib/utils/throttle.js","lib/SelectBox.js"],"sourcesContent":["export default value => value.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\r\n","import escapeRegex from './utils/escapeRegex';\r\nimport {\r\n closestUntil,\r\n createElement,\r\n} from '@danielgindi/dom-utils/lib/Dom';\r\nimport {\r\n remove,\r\n toggleClass,\r\n} from '@danielgindi/dom-utils/lib/DomCompat';\r\nimport {\r\n setCssProps,\r\n getElementHeight,\r\n getElementWidth,\r\n setElementHeight,\r\n setElementWidth, getElementOffset, anchoredPosition,\r\n} from '@danielgindi/dom-utils/lib/Css';\r\nimport DomEventsSink from '@danielgindi/dom-utils/lib/DomEventsSink';\r\nimport VirtualListHelper from '@danielgindi/virtual-list-helper';\r\nimport parseCssTransition from 'parse-css-transition';\r\nimport {\r\n VALUE_DOWN,\r\n VALUE_END,\r\n VALUE_ENTER, VALUE_ESCAPE,\r\n VALUE_HOME,\r\n VALUE_PAGE_DOWN,\r\n VALUE_PAGE_UP,\r\n VALUE_SPACE,\r\n VALUE_UP,\r\n} from 'keycode-js';\r\n\r\nconst ItemSymbol = Symbol('item');\r\nconst DestroyedSymbol = Symbol('destroyed');\r\nconst GhostSymbol = Symbol('ghost');\r\n\r\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\r\n\r\n/**\r\n * @typedef {Object} DropList.Options\r\n * @property {Element} [el] An element to attach to, instead of creating a new one\r\n * @property {string} [baseClassName='droplist'] class name for the menu root element\r\n * @property {string|string[]} [additionalClasses]\r\n * @property {number} [itemBlurDelay=300] How long to wait before deciding to blur the focused item?\r\n * @property {boolean} [capturesFocus=true] Should this DropList be added to the TAB-key stack?\r\n * @property {boolean} [multi=false] Does this DropList show checkboxes for multiple item selection?\r\n * @property {function} [keyDownHandler=null] An alternative \"keydown\" event handler. Return true to prevent default behaviour.\r\n * @property {boolean} [autoCheckGroupChildren=true] When a group is checked/unchecked - all items beneath it will update accordingly\r\n * @property {boolean} [useExactTargetWidth=false] Use the exact target's width, do not allow growing\r\n * @property {boolean} [constrainToWindow=true] Should the position be constrained to the window, attaching to window's borders if needed?\r\n * @property {Boolean} [autoFlipDirection=true] Should the position/anchor be flipped automatically when there's no space in the required direction?\r\n * @property {number} [estimatedItemHeight=20] An estimated row height, for approximating scroll height.\r\n * @property {boolean} [estimateWidth=false] Use an estimation for the width instead of measuring. May be faster - needs testing and may depend on the CSS.\r\n * @property {number} [virtualMinItems=100] Turns into a virtual list - with items being created and showing up on viewport only. The value specified the minimum item count where a virtual list will be created.\r\n * @property {string} [labelProp='label']\r\n * @property {string} [valueProp='value']\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderItem] Function to call when rendering an item element\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderItem] Function to call when rendering an item element\r\n * @property {function(name: string, data: *)} [on]\r\n * */\r\n/** */\r\n\r\n/**\r\n * @typedef {Object} DropList.PositionAnchor\r\n * @property {'left'|'center'|'right'|'start'|'end'|string|number} x - horizontal anchor specification (could be either `'left'|'center'|'right'|'start'|'end'` or a percentage `'50%'` or a fixed decimal `Number`)\r\n * @property {'top'|'center'|'bottom'|string|number} y - vertical anchor specification (could be either `'top'|'center'|'bottom'` or a percentage `'50%'` or a fixed decimal `Number`)\r\n * */\r\n/** */\r\n\r\n/**\r\n * @typedef {Object} DropList.PositionOptions\r\n * @property {Element} [target] Target element to act as anchor\r\n * @property {{left: number, top: number}} [targetOffset=undefined] Override the offset of target. Automatically calculated if unspecified.\r\n * @property {number} [targetHeight=undefined] Override height of the target\r\n * @property {number} [targetWidth=undefined] Override width of the target\r\n * @property {DropList.PositionAnchor} [position=undefined]\r\n * @property {DropList.PositionAnchor} [anchor=undefined]\r\n * @property {boolean} [updateWidth=false] Should update the width of the menu according to target\r\n * @property {string} [targetRtl=undefined] Override for rtl mode of the target\r\n * @property {{x: number, y: number}} [offset=undefined] Extra rtl-aware offset to the target\r\n * */\r\n/** */\r\n\r\n/**\r\n * @typedef {Object} DropList.ItemBase\r\n * @property {string} [value]\r\n * @property {string} [label]\r\n * @property {boolean} [_group=false]\r\n * @property {boolean} [_child=false]\r\n * @property {boolean} [_nocheck=false]\r\n * @property {boolean} [_nointeraction=false]\r\n * */\r\n\r\n/**\r\n * @typedef {DropList.ItemBase} DropList.Item\r\n * @property {boolean} [_checked=false]\r\n * */\r\n/** */\r\n\r\n/** @type {DropList.Options} */\r\nlet defaultOptions = {\r\n baseClassName: 'droplist',\r\n\r\n itemBlurDelay: 300,\r\n capturesFocus: true,\r\n multi: false,\r\n keyDownHandler: null,\r\n autoCheckGroupChildren: true,\r\n useExactTargetWidth: false,\r\n\r\n constrainToWindow: true,\r\n autoFlipDirection: true,\r\n\r\n estimateWidth: false,\r\n virtualMinItems: 100,\r\n\r\n labelProp: 'label',\r\n valueProp: 'value',\r\n\r\n on: null,\r\n};\r\n\r\n/*\r\nEmits the following events:\r\n---------------------------\r\n\r\n'itemfocus' {value, item}: item gained focus.\r\n'itemblur' {value, item}: item lost focus.\r\n'select' {value, item}: item was selected (in single mode).\r\n'show:before': the drop list will show.\r\n'show': the drop list has been shown.\r\n'hide:before': the drop list will hide.\r\n'hide': the drop list was hidden.\r\n'hide:after': emitted after the hide css transition has ended, or immediately after 'hide'.\r\n'check' {value, item, isCheckingGroup}: item was selected (in multi mode).\r\n'groupcheck' {value, item, affectedItems}: item was selected (in multi mode).\r\n */\r\n\r\n// noinspection JSUnusedGlobalSymbols\r\nclass DropList {\r\n\r\n /**\r\n * @param {DropList.Options} options\r\n */\r\n constructor(options) {\r\n const o = { ...defaultOptions };\r\n\r\n for (let [key, value] of Object.entries(/**@type Object*/options))\r\n if (value !== undefined)\r\n o[key] = value;\r\n\r\n const p = this._p = {\r\n ownsEl: true,\r\n elOriginalDisplay: '',\r\n\r\n baseClassName: o.baseClassName,\r\n additionalClasses: o.additionalClasses,\r\n itemBlurDelay: o.itemBlurDelay,\r\n capturesFocus: o.capturesFocus,\r\n multi: o.multi,\r\n keyDownHandler: o.keyDownHandler,\r\n autoCheckGroupChildren: o.autoCheckGroupChildren,\r\n useExactTargetWidth: o.useExactTargetWidth,\r\n constrainToWindow: o.constrainToWindow,\r\n autoFlipDirection: o.autoFlipDirection,\r\n estimateWidth: o.estimateWidth,\r\n virtualMinItems: o.virtualMinItems,\r\n labelProp: o.labelProp,\r\n valueProp: o.valueProp,\r\n renderItem: o.renderItem,\r\n unrenderItem: o.unrenderItem,\r\n on: o.on,\r\n\r\n focusItemIndex: -1,\r\n focusItemEl: null,\r\n\r\n sink: new DomEventsSink(),\r\n };\r\n\r\n let classes = [p.baseClassName];\r\n\r\n if (p.additionalClasses) {\r\n classes = classes.concat(p.additionalClasses);\r\n }\r\n\r\n const initialCss = {\r\n // make initial position not interfere with layout so it can be correctly calculated\r\n top: '-9999px',\r\n };\r\n\r\n let el = o.el;\r\n if (el instanceof Element) {\r\n p.elOriginalDisplay = el.style.display || '';\r\n el.classList.add(...classes);\r\n el.role = 'menu';\r\n setCssProps(/**@type ElementCSSInlineStyle*/el, initialCss);\r\n p.ownsEl = false;\r\n } else {\r\n el = createElement('ul', {\r\n class: classes.join(' '),\r\n role: 'menu',\r\n css: initialCss,\r\n });\r\n }\r\n\r\n p.el = el;\r\n\r\n p.items = [];\r\n\r\n p.groupCount = 0; // This will keep state of how many `group` items we have\r\n\r\n p.mouseHandled = false;\r\n\r\n p.virtualListHelper = new VirtualListHelper({\r\n list: p.el,\r\n virtual: true,\r\n buffer: 5,\r\n estimatedItemHeight: o.estimatedItemHeight || 20,\r\n itemElementCreatorFn: () => {\r\n return createElement('li',\r\n {\r\n role: 'menuitem',\r\n tabIndex: p.capturesFocus ? -1 : null,\r\n },\r\n );\r\n },\r\n onItemRender: (itemEl, index) => {\r\n let item;\r\n\r\n if ((/**@type any*/index) === GhostSymbol) {\r\n item = {\r\n [p.labelProp]: p.lastMeasureLongestLabelText,\r\n [p.valueProp]: 'Measure',\r\n };\r\n itemEl.setAttribute('aria-hidden', 'true');\r\n } else {\r\n item = p.items[index];\r\n }\r\n\r\n if (!item) {\r\n // eslint-disable-next-line no-console\r\n console.warn('onItemRender called for (' + index + ') which has no item');\r\n }\r\n\r\n itemEl.className = `${p.baseClassName}__item`;\r\n\r\n const classList = itemEl.classList;\r\n\r\n if (p.multi) {\r\n if (item._nocheck) {\r\n classList.add(`${p.baseClassName}__item_multi_nocheck`);\r\n } else {\r\n classList.add(`${p.baseClassName}__item_multi`);\r\n\r\n if (item._checked) {\r\n classList.add(`${p.baseClassName}__item_checked`);\r\n }\r\n }\r\n } else {\r\n classList.add(`${p.baseClassName}__item_single`);\r\n }\r\n\r\n if (item._group)\r\n classList.add(`${p.baseClassName}__item_group`);\r\n\r\n if (item._child)\r\n classList.add(`${p.baseClassName}__item_child`);\r\n\r\n if (item._nointeraction)\r\n classList.add(`${p.baseClassName}__item_nointeraction`);\r\n\r\n if (p.focusItemIndex === index) {\r\n p.focusItemEl = itemEl;\r\n classList.add(`${p.baseClassName}__item_focus`);\r\n }\r\n\r\n this._renderItemContent(item, itemEl);\r\n\r\n itemEl[ItemSymbol] = item;\r\n },\r\n });\r\n\r\n if (typeof p.unrenderItem === 'function') {\r\n const fn = p.unrenderItem;\r\n p.virtualListHelper.setOnItemUnrender(el => {\r\n try {\r\n fn(el[ItemSymbol], el);\r\n } catch (err) { console.error(err); } // eslint-disable-line no-console\r\n delete el[ItemSymbol];\r\n\r\n if (p.focusItemEl === el)\r\n p.focusItemEl = null;\r\n });\r\n } else {\r\n p.virtualListHelper.setOnItemUnrender(el => {\r\n delete el[ItemSymbol];\r\n\r\n if (p.focusItemEl === el)\r\n p.focusItemEl = null;\r\n });\r\n }\r\n\r\n if (p.capturesFocus) {\r\n el.tabIndex = 0;\r\n }\r\n\r\n this._hookMouseEvents();\r\n this._hookTouchEvents();\r\n this._hookFocusEvents();\r\n this._hookKeyEvents();\r\n }\r\n\r\n destroy() {\r\n if (this[DestroyedSymbol])\r\n return;\r\n this[DestroyedSymbol] = true;\r\n\r\n const p = this._p;\r\n\r\n clearTimeout(p.timer);\r\n clearTimeout(p.filterTimer);\r\n\r\n p.sink.remove();\r\n p.virtualListHelper.destroy();\r\n\r\n if (p.el) {\r\n remove(p.el);\r\n }\r\n\r\n if (!p.ownsEl) {\r\n for (let name of Array.from(p.el.classList)) {\r\n if (name.startsWith(p.baseClassName)) {\r\n p.el.classList.remove(name);\r\n }\r\n }\r\n p.el.removeAttribute('role');\r\n for (let key of ['position', 'left', 'top', 'right', 'bottom', 'z-index']) {\r\n p.el.style[key] = '';\r\n }\r\n p.el.style.display = p.elOriginalDisplay;\r\n }\r\n\r\n if (p.lastPositionTarget) {\r\n p.lastPositionTarget.classList.remove(\r\n `has_${p.baseClassName}`,\r\n `has_${p.baseClassName}_above`,\r\n `has_${p.baseClassName}_below`);\r\n delete p.lastPositionTarget;\r\n }\r\n\r\n this._p = null;\r\n }\r\n\r\n get el() {\r\n return this._p.el;\r\n }\r\n\r\n /**\r\n * @param {string|string[]} classes\r\n * @returns {DropList}\r\n */\r\n setAdditionalClasses(classes) {\r\n const p = this._p;\r\n p.additionalClasses = classes;\r\n this._syncBaseClasses();\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {DropList}\r\n */\r\n setLabelProp(prop) {\r\n const p = this._p;\r\n p.labelProp = prop;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {DropList}\r\n */\r\n setValueProp(prop) {\r\n const p = this._p;\r\n p.valueProp = prop;\r\n return this;\r\n }\r\n\r\n _syncBaseClasses() {\r\n const p = this._p, el = p.el;\r\n\r\n if (!el)\r\n return;\r\n\r\n let classes = [p.baseClassName];\r\n\r\n if (p.additionalClasses) {\r\n classes = classes.concat(p.additionalClasses);\r\n }\r\n\r\n el.className = classes.join(' ');\r\n }\r\n\r\n blurFocusedItem(fromFocus) {\r\n const p = this._p;\r\n\r\n if (!fromFocus) {\r\n clearTimeout(p.timer);\r\n }\r\n\r\n if (!this.hasFocusedItem()) {\r\n return;\r\n }\r\n\r\n let focusItemEl = p.focusItemEl;\r\n if (focusItemEl) {\r\n focusItemEl.classList.remove(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = null;\r\n }\r\n\r\n const item = p.items[p.focusItemIndex];\r\n p.focusItemIndex = -1;\r\n\r\n if (!item)\r\n return;\r\n\r\n this._trigger('itemblur', { value: item[p.valueProp], item: item });\r\n }\r\n\r\n nextPage(event) {\r\n this._move('next_page', event);\r\n }\r\n\r\n previousPage(event) {\r\n this._move('prev_page', event);\r\n }\r\n\r\n toggleFocusedItem() {\r\n const p = this._p;\r\n\r\n if (this.hasFocusedItem() && p.multi) {\r\n let item = p.items[p.focusItemIndex];\r\n if (item._nocheck || item._nointeraction) return this;\r\n\r\n item._checked = !item._checked;\r\n if (p.focusItemEl) {\r\n toggleClass(p.focusItemEl, `${p.baseClassName}__item_checked`, item._checked);\r\n }\r\n this._trigger('check', { value: item[p.valueProp], item: item });\r\n\r\n this._updateGroupStateForItem(item);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n triggerItemSelection(event) {\r\n const p = this._p;\r\n\r\n p.focusItemEl = p.focusItemEl || closestUntil(event.target, 'li', p.el);\r\n p.focusItemIndex = p.virtualListHelper.getItemIndexFromElement(p.focusItemEl);\r\n if (p.focusItemIndex === undefined)\r\n p.focusItemIndex = -1;\r\n\r\n let item = p.focusItemEl[ItemSymbol];\r\n if (item._nointeraction) {\r\n return false;\r\n }\r\n\r\n if (!p.multi) {\r\n this._setSingleSelectedItemEl(p.focusItemEl);\r\n }\r\n\r\n this._trigger('select', { value: item ? item[p.valueProp] : undefined, item: item });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.Item} item The item to add. It is copied.\r\n * @param {number} [atIndex=-1] The index to insert at (or -1)\r\n * @returns {DropList}\r\n */\r\n addItem(item, atIndex = -1) {\r\n return this.addItems([item], atIndex);\r\n }\r\n\r\n /**\r\n * Adds items to the menu and renders\r\n * @param {DropList.Item[]} itemsToAdd The items to add. These are copied.\r\n * @param {number} [atIndex=-1] The index to insert at (or -1)\r\n * @returns {DropList}\r\n */\r\n addItems(itemsToAdd, atIndex = -1) {\r\n const p = this._p, labelProp = p.labelProp, valueProp = p.valueProp;\r\n\r\n let isMulti = p.multi;\r\n let items = p.items;\r\n\r\n if (atIndex == null || atIndex < 0 || atIndex >= p.items.length) {\r\n atIndex = -1;\r\n }\r\n\r\n // Determine if the list is virtual or not\r\n this._determineVirtualMode(items.length + itemsToAdd.length);\r\n\r\n for (let i = 0, count = itemsToAdd.length; i < count; i++) {\r\n let oitem = itemsToAdd[i];\r\n //noinspection PointlessBooleanExpressionJS\r\n let item = {\r\n [ItemSymbol]: oitem,\r\n [labelProp]: oitem[labelProp],\r\n [valueProp]: oitem[valueProp],\r\n _nocheck: !!oitem._nocheck,\r\n _nointeraction: !!oitem._nointeraction,\r\n };\r\n\r\n if (isMulti) {\r\n item._checked = !!oitem._checked;\r\n }\r\n\r\n if (oitem._group) {\r\n item._group = true;\r\n p.groupCount++;\r\n }\r\n\r\n if (oitem._child) {\r\n // This is used for setting a child class,\r\n // But can be used to determine that current item is not part of above group,\r\n // mainly where the groups are oddly sorted.\r\n item._child = true;\r\n }\r\n\r\n // Add the item to the list of them\r\n if (atIndex !== -1) {\r\n items.splice(atIndex, 0, item);\r\n } else {\r\n items.push(item);\r\n }\r\n\r\n if (atIndex !== -1) {\r\n atIndex++;\r\n }\r\n }\r\n\r\n p.virtualListHelper\r\n .addItemsAt(itemsToAdd.length, atIndex === -1 ? atIndex : (atIndex - itemsToAdd.length))\r\n .render();\r\n\r\n return this;\r\n }\r\n\r\n updateItemByValue(value, newItem) {\r\n const p = this._p;\r\n\r\n // Look for the proper item\r\n let itemIndex = this.itemIndexByValue(value);\r\n if (itemIndex < -1) return this;\r\n\r\n let item = this.itemAtIndex(itemIndex);\r\n item[ItemSymbol] = newItem;\r\n\r\n if (hasOwnProperty.call(newItem, p.labelProp))\r\n item[p.labelProp] = newItem[p.labelProp];\r\n\r\n if (hasOwnProperty.call(newItem, p.valueProp))\r\n item[p.valueProp] = newItem[p.valueProp];\r\n\r\n if (hasOwnProperty.call(newItem, '_nocheck'))\r\n item._nocheck = !!newItem._nocheck;\r\n\r\n if (hasOwnProperty.call(newItem, '_nointeraction'))\r\n item._nointeraction = !!newItem._nointeraction;\r\n\r\n if (p.multi) {\r\n if (hasOwnProperty.call(newItem, '_checked'))\r\n item._checked = !!newItem._checked;\r\n }\r\n\r\n if (hasOwnProperty.call(newItem, '_group')) {\r\n if (!!newItem._group !== item._group) {\r\n if (item._group)\r\n p.groupCount--;\r\n else p.groupCount++;\r\n\r\n newItem._group = !!item._group;\r\n }\r\n }\r\n\r\n if (hasOwnProperty.call(newItem, '_child'))\r\n item._child = !!newItem._child;\r\n\r\n if (p.virtualListHelper.isItemRendered(itemIndex)) {\r\n p.virtualListHelper\r\n .refreshItemAt(itemIndex)\r\n .render();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n removeItem(value, label) {\r\n const p = this._p;\r\n\r\n // Look for the proper item\r\n let itemIndex = this.itemIndexByValueOrLabel(value, label);\r\n if (itemIndex < -1) return this;\r\n\r\n let spliced = p.items.splice(itemIndex, 1);\r\n if (spliced[0]._group) {\r\n p.groupCount--;\r\n }\r\n\r\n p.virtualListHelper\r\n .removeItemsAt(itemIndex, 1)\r\n .render();\r\n\r\n return this;\r\n }\r\n\r\n removeAllItems() {\r\n const p = this._p;\r\n\r\n p.items.length = 0;\r\n p.groupCount = 0;\r\n\r\n p.virtualListHelper\r\n .setCount(0)\r\n .render();\r\n\r\n return this;\r\n }\r\n\r\n itemDataByValue(value) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (item[valueProp] === value) {\r\n return item;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n itemIndexByValue(value) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (item[valueProp] === value) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n itemIndexByValueOrLabel(value, label) {\r\n const p = this._p, labelProp = p.labelProp, valueProp = p.valueProp;\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (item[valueProp] === value || item[labelProp] === label) {\r\n return i;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n items() {\r\n return this._p.items.slice(0);\r\n }\r\n\r\n itemsReference() {\r\n return this._p.items;\r\n }\r\n\r\n itemCount() {\r\n return this._p.items.length;\r\n }\r\n\r\n itemAtIndex(index) {\r\n return this._p.items[index];\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.PositionOptions} positionOptions\r\n * @returns {DropList}\r\n * @public\r\n */\r\n relayout(positionOptions) {\r\n const p = this._p, el = p.el;\r\n\r\n if (!this.isVisible()) return this;\r\n\r\n let w = window;\r\n\r\n let targetBox = {};\r\n\r\n let offset = positionOptions.targetOffset || getElementOffset(positionOptions.target);\r\n targetBox.left = offset.left;\r\n targetBox.top = offset.top;\r\n targetBox.height = positionOptions.targetHeight == null\r\n ? getElementHeight(positionOptions.target, true, true)\r\n : positionOptions.targetHeight;\r\n targetBox.width = positionOptions.targetWidth == null\r\n ? getElementWidth(positionOptions.target, true, true)\r\n : positionOptions.targetWidth;\r\n targetBox.bottom = targetBox.top + targetBox.height;\r\n\r\n let viewport = {};\r\n viewport.top = w.pageYOffset;\r\n viewport.left = w.pageXOffset;\r\n viewport.width = w.innerWidth;\r\n viewport.height = w.innerHeight;\r\n viewport.bottom = viewport.top + viewport.height;\r\n viewport.right = viewport.left + viewport.width;\r\n\r\n let defaultVerticalDirection = (positionOptions.position && positionOptions.position.y === 'bottom')\r\n ? 'above'\r\n : 'below';\r\n\r\n // Reset dropdown width\r\n el.style.width = '';\r\n\r\n // Make estimations\r\n if (p.estimateWidth ||\r\n p.virtualListHelper.isVirtual()) {\r\n this._measureItem();\r\n }\r\n\r\n // Calculate virtual viewport size\r\n if (p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.render();\r\n }\r\n\r\n // Now set the width of the dropdown\r\n if (positionOptions.updateWidth) {\r\n this._updateWidth(positionOptions);\r\n }\r\n\r\n // How much space is there above, and how much below?\r\n let roomAbove = targetBox.top - viewport.top;\r\n let roomBelow = viewport.bottom - targetBox.bottom;\r\n\r\n // Calculate height for dropdown\r\n\r\n let maxViewHeight;\r\n\r\n const elComputedStyle = getComputedStyle(el);\r\n\r\n let isBoxing = elComputedStyle.boxSizing === 'border-box';\r\n let verticalPadding = (parseFloat(elComputedStyle.paddingTop) || 0) +\r\n (parseFloat(elComputedStyle.paddingBottom) || 0);\r\n let verticalBorderWidth = (parseFloat(elComputedStyle.borderTopWidth) || 0) +\r\n (parseFloat(elComputedStyle.borderBottomWidth) || 0);\r\n\r\n if (p.virtualListHelper.isVirtual()) {\r\n maxViewHeight =\r\n p.virtualListHelper.estimateFullHeight() +\r\n verticalPadding +\r\n verticalBorderWidth;\r\n } else {\r\n // Another method to calculate height is measuring the whole thing at once.\r\n // This causes relayout of course.\r\n el.style.height = '';\r\n el.style.top = '-9999px';\r\n\r\n maxViewHeight = Math.max(getElementHeight(p.el), el.scrollHeight);\r\n maxViewHeight += verticalPadding + verticalBorderWidth;\r\n }\r\n\r\n // Consider css max-height\r\n\r\n let maxHeight = parseFloat(elComputedStyle.maxHeight);\r\n if (!isNaN(maxHeight)) {\r\n if (!isBoxing) {\r\n maxHeight += verticalPadding + verticalBorderWidth;\r\n }\r\n\r\n maxViewHeight = Math.min(maxViewHeight, maxHeight);\r\n }\r\n\r\n // Figure out the direction\r\n\r\n let enoughRoomAbove = roomAbove >= maxViewHeight;\r\n let enoughRoomBelow = roomBelow >= maxViewHeight;\r\n\r\n let newDirection = p.currentDirection || defaultVerticalDirection;\r\n if (newDirection === 'above' && !enoughRoomAbove && enoughRoomBelow) {\r\n newDirection = 'below';\r\n } else if (newDirection === 'below' && !enoughRoomBelow && enoughRoomAbove) {\r\n newDirection = 'above';\r\n } else if (enoughRoomAbove && enoughRoomBelow) {\r\n if (newDirection !== defaultVerticalDirection &&\r\n ((defaultVerticalDirection === 'above' && roomAbove >= roomBelow) ||\r\n (defaultVerticalDirection === 'below' && roomBelow >= roomAbove))) {\r\n newDirection = defaultVerticalDirection;\r\n }\r\n } else if (!enoughRoomAbove && !enoughRoomBelow) {\r\n if (roomAbove > roomBelow) {\r\n newDirection = 'above';\r\n } else if (roomBelow > roomAbove) {\r\n newDirection = 'below';\r\n }\r\n }\r\n p.currentDirection = newDirection;\r\n\r\n // Figure out that final view size\r\n let viewSize = {\r\n width: getElementWidth(el, true, true),\r\n height: Math.min(maxViewHeight, Math.max(roomAbove, roomBelow, 0)),\r\n };\r\n\r\n let isTargetRtl = positionOptions.targetRtl !== undefined ?\r\n positionOptions.targetRtl :\r\n (positionOptions.target == null ? false : getComputedStyle(positionOptions.target).direction === 'rtl');\r\n let isRtlDocument = getComputedStyle(document.documentElement).direction === 'rtl';\r\n\r\n let anchor = anchoredPosition(positionOptions.target,\r\n positionOptions.anchor ? positionOptions.anchor.x : 'start',\r\n positionOptions.anchor ? positionOptions.anchor.y : 'bottom',\r\n targetBox, isTargetRtl);\r\n let position = anchoredPosition(el,\r\n positionOptions.position ? positionOptions.position.x : 'start',\r\n positionOptions.position ? positionOptions.position.y : 'top',\r\n viewSize, isTargetRtl);\r\n\r\n // If it's not in the direction that the user expected, invert it\r\n let invertYPos =\r\n (position.specY === 'top' && newDirection === 'above') ||\r\n (position.specY === 'bottom' && newDirection === 'below') ||\r\n (position.specY !== 'bottom' && position.specY !== 'top' && newDirection === 'above');\r\n\r\n let scrollLeft =\r\n (w.pageXOffset !== undefined) ?\r\n w.pageXOffset :\r\n (document.documentElement || document.body.parentNode || document.body).scrollLeft;\r\n scrollLeft = Math.abs(scrollLeft);\r\n if (isRtlDocument) {\r\n scrollLeft = document.documentElement.scrollWidth - scrollLeft - document.documentElement.clientWidth;\r\n }\r\n\r\n let minX = scrollLeft,\r\n maxX = document.documentElement.clientWidth + scrollLeft - viewSize.width;\r\n\r\n let viewCss = {\r\n 'position': 'absolute',\r\n 'left': targetBox.left,\r\n 'top': targetBox.top + (invertYPos ? (anchor.bottom - position.bottom) : (anchor.top - position.top)),\r\n };\r\n\r\n if (isRtlDocument) {\r\n viewCss.left -= document.documentElement.clientWidth - document.documentElement.scrollWidth;\r\n }\r\n\r\n viewCss.left += anchor.left - position.left;\r\n\r\n if (positionOptions.offset) {\r\n if (positionOptions.offset.y) {\r\n if (invertYPos) {\r\n viewCss.top -= positionOptions.offset.y;\r\n } else {\r\n viewCss.top += positionOptions.offset.y;\r\n }\r\n }\r\n\r\n if (positionOptions.offset.x) {\r\n let rtl = elComputedStyle.direction === 'rtl';\r\n viewCss.left += rtl\r\n ? -positionOptions.offset.x\r\n : positionOptions.offset.x;\r\n }\r\n }\r\n\r\n if (p.autoFlipDirection) {\r\n if ((position.specX === 'right' &&\r\n viewCss.left < minX &&\r\n (Math.max(viewCss.left, minX) + viewSize.width - targetBox.left) / targetBox.width > 0.5) ||\r\n (position.specX === 'left' &&\r\n viewCss.left > maxX &&\r\n (Math.min(viewCss.left, maxX) - targetBox.left) / targetBox.width < 0.5)) {\r\n viewCss.left -= anchor.left - position.left;\r\n viewCss.left += anchor.right - position.right;\r\n }\r\n }\r\n\r\n // Constrain to the window if required\r\n if (p.constrainToWindow) {\r\n for (let which of (isRtlDocument ? ['min', 'max'] : ['max', 'min'])) {\r\n if (which === 'min' && viewCss.left < minX)\r\n viewCss.left = minX;\r\n else if (which === 'max' && viewCss.left > maxX)\r\n viewCss.left = maxX;\r\n }\r\n }\r\n\r\n // Set position CSS\r\n viewCss.left += 'px';\r\n viewCss.top += 'px';\r\n setCssProps(el, viewCss);\r\n setElementHeight(el, viewSize.height, true, true);\r\n\r\n // Update the scroll position for virtual lists\r\n p.virtualListHelper.render();\r\n\r\n // Update position classes\r\n if (positionOptions && positionOptions.target) {\r\n p.lastPositionTarget = positionOptions.target;\r\n\r\n toggleClass(positionOptions.target, `has_${p.baseClassName}`, true);\r\n toggleClass(positionOptions.target, `has_${p.baseClassName}_below`, newDirection === 'below');\r\n toggleClass(positionOptions.target, `has_${p.baseClassName}_above`, newDirection === 'above');\r\n\r\n toggleClass(el, `${p.baseClassName}__is_below`, newDirection === 'below');\r\n toggleClass(el, `${p.baseClassName}__is_above`, newDirection === 'above');\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the checked mode of a specific value.\r\n * @public\r\n * @param {*} value - array of values to check\r\n * @param {boolean} checked - will the value be checked?\r\n * @returns {DropList} self\r\n */\r\n setItemChecked(value, checked) {\r\n const p = this._p;\r\n\r\n checked = !!checked;\r\n\r\n let index = this.itemIndexByValue(value);\r\n if (index === -1) return this;\r\n\r\n let li = p.virtualListHelper.getItemElementAt(index);\r\n if (!li) return this;\r\n\r\n let item = li[ItemSymbol];\r\n\r\n checked = checked && !item._nocheck;\r\n\r\n if (item._checked !== checked) {\r\n item._checked = checked;\r\n\r\n toggleClass(li, `${p.baseClassName}__item_checked`, item._checked);\r\n\r\n this._updateGroupStateForItem(item);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the checked values. All the other values will be unchecked,\r\n * @public\r\n * @param {Array<*>} values - array of values to check\r\n * @returns {DropList} self\r\n */\r\n setCheckedValues(values) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n let groupIndexes = [];\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n let checked = !item._nocheck && values.indexOf(item[valueProp]) !== -1;\r\n\r\n if (item._group) {\r\n groupIndexes.push(i);\r\n }\r\n\r\n if (item._checked === checked) continue;\r\n\r\n item._checked = checked;\r\n\r\n let li = p.virtualListHelper.getItemElementAt(i);\r\n if (!li) continue;\r\n\r\n toggleClass(li, `${p.baseClassName}__item_checked`, item._checked);\r\n }\r\n\r\n if (p.autoCheckGroupChildren) {\r\n for (let i = 0, count = groupIndexes.length; i < count; i++) {\r\n this._updateGroupCheckedState(groupIndexes[i], false);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get all checked values. Returns array of item values.\r\n * @public\r\n * @param {boolean} excludeGroups=false Exclude group items\r\n * @returns {Array<*>} self\r\n */\r\n getCheckedValues(excludeGroups) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n excludeGroups = excludeGroups && p.groupCount > 0;\r\n\r\n let values = [];\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (!item._checked) continue;\r\n if (excludeGroups && item._group) continue;\r\n values.push(item[valueProp]);\r\n }\r\n\r\n return values;\r\n }\r\n\r\n /**\r\n * Get all checked items. Returns array of actual item data object.\r\n * @public\r\n * @param {boolean} excludeGroups=false Exclude group items\r\n * @returns {DropList.Item[]}\r\n */\r\n getCheckedItems(excludeGroups) {\r\n const p = this._p;\r\n\r\n excludeGroups = excludeGroups && p.groupCount > 0;\r\n\r\n let items = [];\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n let item = p.items[i];\r\n if (!item._checked) continue;\r\n if (excludeGroups && item._group) continue;\r\n items.push(item);\r\n }\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.PositionOptions?} positionOptions\r\n * @returns {DropList}\r\n * @public\r\n */\r\n show(positionOptions) {\r\n const p = this._p;\r\n\r\n p.hiding = false;\r\n\r\n if (!this.isVisible()) {\r\n this._trigger('show:before');\r\n }\r\n\r\n p.mouseHandled = false;\r\n\r\n setTimeout(() => { // If it's from a click event, we do not want an immediate hide...\r\n if (this[DestroyedSymbol]) return;\r\n\r\n if (!p.onDocumentMouseDown) {\r\n p.sink.add(document, 'mousedown', p.onDocumentMouseDown = (event) => {\r\n if (closestUntil(event.target, `.${p.baseClassName}`, p.el) !== p.el) {\r\n this._delayBlur();\r\n }\r\n });\r\n }\r\n }, 0);\r\n\r\n const el = p.el;\r\n el.style.position = 'absolute';\r\n el.classList.remove(`${p.baseClassName}__is-hiding`);\r\n document.body.appendChild(el);\r\n\r\n p.visible = true;\r\n\r\n p.el.style.display = '';\r\n if (getComputedStyle(p.el).display === 'none')\r\n p.el.style.display = 'block';\r\n\r\n if (positionOptions) {\r\n const elComputedStyle = getComputedStyle(el);\r\n\r\n // Set max height to avoid adding scrollbars to page\r\n const originalMaxHeight = el.style.maxHeight;\r\n let maxHeight = document.body.clientHeight -\r\n (parseFloat(elComputedStyle.marginTop) || 0) -\r\n (parseFloat(elComputedStyle.marginBottom) || 0) -\r\n (elComputedStyle.boxSizing === 'border-box'\r\n ? 0\r\n : ((parseFloat(elComputedStyle.borderTopWidth) || 0) +\r\n (parseFloat(elComputedStyle.borderBottomWidth) || 0)));\r\n\r\n el.style.maxHeight = Math.min(maxHeight, parseFloat(elComputedStyle.maxHeight) || maxHeight) + 'px';\r\n\r\n this.relayout(positionOptions);\r\n\r\n // Restore original max-height\r\n el.style.maxHeight = originalMaxHeight;\r\n } else {\r\n // Calculate virtual viewport size\r\n if (p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.render();\r\n }\r\n }\r\n\r\n if (this.isVisible()) {\r\n this._trigger('show');\r\n }\r\n\r\n return this;\r\n }\r\n\r\n hide() {\r\n const p = this._p, el = p.el;\r\n\r\n if (p.onDocumentMouseDown) {\r\n p.sink.remove(document, 'mousedown', p.onDocumentMouseDown);\r\n p.onDocumentMouseDown = null;\r\n }\r\n\r\n if (this.isVisible()) {\r\n this._trigger('hide:before');\r\n\r\n p.hiding = true;\r\n\r\n if (el) {\r\n\r\n el.classList.add(`${p.baseClassName}__is-hiding`);\r\n\r\n // support for hide transition in css\r\n const maxTransitionDuration = parseCssTransition(getComputedStyle(p.el).transition)\r\n .reduce((p, v) => Math.max(p, v.delay + v.duration), 0);\r\n\r\n if (maxTransitionDuration > 0) {\r\n setTimeout(() => {\r\n if (this[DestroyedSymbol]) return;\r\n\r\n if (this._p && el.parentNode && p.hiding) {\r\n remove(el);\r\n el.classList.remove(`${p.baseClassName}__is-hiding`);\r\n p.visible = false;\r\n this._trigger('hide:after');\r\n }\r\n });\r\n } else {\r\n remove(el);\r\n el.classList.remove(`${p.baseClassName}__is-hiding`);\r\n }\r\n }\r\n\r\n p.visible = false;\r\n\r\n this.blurFocusedItem();\r\n this._trigger('hide');\r\n\r\n if (this[DestroyedSymbol]) return;\r\n this._trigger('hide:after');\r\n }\r\n\r\n if (p.lastPositionTarget) {\r\n p.lastPositionTarget.classList.remove(\r\n `has_${p.baseClassName}`,\r\n `has_${p.baseClassName}_above`,\r\n `has_${p.baseClassName}_below`);\r\n delete p.lastPositionTarget;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n isVisible() {\r\n const p = this._p;\r\n if (!p.visible)\r\n return false;\r\n return p.el.parentNode && getComputedStyle(p.el).display !== 'none';\r\n }\r\n\r\n hasFocusedItem() {\r\n return this._p.focusItemIndex > -1;\r\n }\r\n\r\n getFocusedItemIndex() {\r\n if (!this.hasFocusedItem())\r\n return -1;\r\n return this._p.focusItemIndex;\r\n }\r\n\r\n setFocusedItemAtIndex(itemIndex) {\r\n const p = this._p;\r\n\r\n p.focusItemIndex = itemIndex;\r\n\r\n let item = null;\r\n if (itemIndex > -1)\r\n item = p.items[itemIndex];\r\n if (item && item._nointeraction)\r\n item = null;\r\n if (itemIndex > -1) {\r\n this.scrollItemIndexIntoView(itemIndex);\r\n }\r\n let itemElement = item ? p.virtualListHelper.getItemElementAt(itemIndex) : null;\r\n\r\n if (p.focusItemEl !== itemElement) {\r\n if (p.focusItemEl) {\r\n p.focusItemEl.classList.remove(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = null;\r\n }\r\n\r\n if (itemElement) {\r\n itemElement.classList.add(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = itemElement;\r\n\r\n this._trigger('itemfocus', { value: itemElement[p.valueProp], item: itemElement[ItemSymbol] });\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n setFocusedItem(item) {\r\n const p = this._p;\r\n\r\n let itemIndex = item._nointeraction ? -1 : this._getItemIndex(item);\r\n\r\n if (itemIndex > -1 && p.items[itemIndex]._nointeraction)\r\n itemIndex = -1;\r\n\r\n return this.setFocusedItemAtIndex(itemIndex);\r\n }\r\n\r\n setFocusedItemByValue(value) {\r\n return this.setFocusedItemAtIndex(this.itemIndexByValue(value));\r\n }\r\n\r\n setSingleSelectedItemAtIndex(itemIndex) {\r\n const p = this._p;\r\n\r\n let itemEl = null;\r\n\r\n if (itemIndex > -1 && !p.items[itemIndex]._nointeraction) {\r\n itemEl = p.virtualListHelper.getItemElementAt(itemIndex);\r\n }\r\n\r\n this._setSingleSelectedItemEl(itemEl);\r\n\r\n return this;\r\n }\r\n\r\n setSingleSelectedItem(item) {\r\n const p = this._p;\r\n\r\n let itemIndex = item._nointeraction ? -1 : this._getItemIndex(item);\r\n\r\n if (itemIndex > -1 && p.items[itemIndex]._nointeraction)\r\n itemIndex = -1;\r\n\r\n return this.setSingleSelectedItemAtIndex(itemIndex);\r\n }\r\n\r\n setSingleSelectedItemByValue(value) {\r\n return this.setSingleSelectedItemAtIndex(this.itemIndexByValue(value));\r\n }\r\n\r\n next(event) {\r\n this._move('next', event);\r\n }\r\n\r\n previous(event) {\r\n this._move('prev', event);\r\n }\r\n\r\n isFirstItem() {\r\n const p = this._p;\r\n return p.focusItemIndex === 0 && p.focusItemIndex < p.items.length;\r\n }\r\n\r\n isLastItem() {\r\n const p = this._p;\r\n return p.focusItemIndex > -1 && p.focusItemIndex === p.items.length - 1;\r\n }\r\n\r\n scrollItemIndexIntoView(itemIndex) {\r\n const p = this._p;\r\n\r\n if (this._hasScroll()) {\r\n const el = p.el, scrollTop = el.scrollTop;\r\n\r\n let itemPos, previousPos = -1;\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n itemPos = p.virtualListHelper.getItemPosition(itemIndex);\r\n\r\n if (itemPos === previousPos)\r\n break;\r\n\r\n previousPos = itemPos;\r\n\r\n let itemSize = p.virtualListHelper.getItemSize(itemIndex);\r\n\r\n let listHeight = el.clientHeight;\r\n\r\n if (itemPos < scrollTop) {\r\n el.scrollTop = itemPos;\r\n } else if (itemPos + itemSize > scrollTop + listHeight) {\r\n el.scrollTop = itemPos + itemSize - listHeight;\r\n }\r\n\r\n // force update items, until the positions and sizes are final\r\n p.virtualListHelper.render();\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n _getItemIndex(item) {\r\n const p = this._p, labelProp = p.labelProp, valueProp = p.valueProp;\r\n\r\n let itemIndex = -1;\r\n\r\n if (item) {\r\n itemIndex = p.items.indexOf(item);\r\n if (itemIndex === -1) {\r\n let value = (item && item[valueProp] !== undefined) ? item[valueProp] : item;\r\n let label = (item && item[labelProp]) ? item[labelProp] : value;\r\n itemIndex = this.itemIndexByValueOrLabel(value, label);\r\n }\r\n }\r\n\r\n return itemIndex;\r\n }\r\n\r\n _setSingleSelectedItemEl(itemEl) {\r\n const p = this._p;\r\n\r\n if (p.singleSelectedItemEl) {\r\n p.singleSelectedItemEl.classList.remove(`${p.baseClassName}__item_checked`);\r\n p.singleSelectedItemEl = null;\r\n }\r\n\r\n if (itemEl) {\r\n itemEl.classList.add(`${p.baseClassName}__item_checked`);\r\n p.singleSelectedItemEl = itemEl;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} event\r\n * @param {*} [data]\r\n * @private\r\n */\r\n _trigger(event, data) {\r\n const p = this._p;\r\n if (p.on)\r\n p.on(event, ...(data === undefined ? [] : [data]));\r\n }\r\n\r\n _itemUpAction(event, itemEl) {\r\n if (closestUntil(event.target, '.requires-pointer-events,button', itemEl)) return;\r\n\r\n let p = this._p;\r\n\r\n if (!this._mouseHandled) {\r\n\r\n this.triggerItemSelection(event);\r\n\r\n if (!this[DestroyedSymbol]) { // If we are not destroyed in response to a click/select\r\n this.toggleFocusedItem();\r\n\r\n if (document.activeElement !== this.el) {\r\n if (p.focusItemEl) {\r\n clearTimeout(p.timer);\r\n }\r\n }\r\n }\r\n\r\n setTimeout(() => {\r\n this._mouseHandled = false;\r\n }, 0);\r\n }\r\n }\r\n\r\n _hookMouseEvents() {\r\n const p = this._p;\r\n\r\n p.sink\r\n .add(p.el, 'mousedown', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n event.preventDefault();\r\n })\r\n .add(p.el, 'mouseup', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n if (event.button !== 0) return;\r\n\r\n this._itemUpAction(event, li);\r\n })\r\n .add(p.el, 'mouseover', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n this._handleMouseOver(event, li);\r\n });\r\n }\r\n\r\n _handleMouseOver(event, itemEl) {\r\n this._focus(event, itemEl);\r\n }\r\n\r\n _hookTouchEvents() {\r\n const p = this._p;\r\n\r\n let currentTouchId;\r\n\r\n p.sink.add(p.el, 'touchstart', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return;\r\n\r\n if (currentTouchId) return;\r\n if (closestUntil(event.target, '.requires-pointer-events,button', li)) return;\r\n\r\n currentTouchId = event.changedTouches[0].identifier;\r\n\r\n // Simulate mouseover event\r\n this._handleMouseOver(event, li);\r\n\r\n // Track scrolling\r\n let didScroll = false;\r\n let onScroll = () => { didScroll = true; };\r\n let onTouchCancel = () => {\r\n currentTouchId = null;\r\n p.sink.remove(null, '.dropdown_touchextra');\r\n };\r\n\r\n let elToTrackScroll = li.parentNode;\r\n while (elToTrackScroll) {\r\n p.sink.add(elToTrackScroll, 'scroll.dropdown_touchextra', onScroll);\r\n elToTrackScroll = elToTrackScroll.parentNode;\r\n }\r\n p.sink.add(window, 'scroll.dropdown_touchextra', onScroll);\r\n\r\n p.sink.add(window, 'touchcancel.dropdown_touchextra', onTouchCancel);\r\n\r\n p.sink.add(p.el, 'touchend.dropdown_touchextra', (event) => {\r\n const li = closestUntil(event.target, 'li', event.currentTarget);\r\n if (!li) return onTouchCancel();\r\n\r\n let touch = Array.prototype.find.call(event.changedTouches, (touch) => {\r\n return touch.identifier === currentTouchId;\r\n });\r\n if (!touch) return onTouchCancel();\r\n\r\n onTouchCancel();\r\n\r\n if (!didScroll) {\r\n this._itemUpAction(event, li);\r\n event.preventDefault();\r\n }\r\n });\r\n });\r\n }\r\n\r\n _hookFocusEvents() {\r\n const p = this._p;\r\n\r\n p.sink\r\n .add(p.el, 'focus', event => {\r\n let itemEl = p.focusItemEl || // focused item\r\n p.el.firstChild; // or the first item\r\n\r\n this._focus(event, itemEl);\r\n })\r\n .add(p.el, 'blur', () => {\r\n setTimeout(() => {\r\n if (this[DestroyedSymbol]) return;\r\n\r\n if (!p.el.contains(document.activeElement)) {\r\n this._delayBlur();\r\n }\r\n });\r\n });\r\n }\r\n\r\n _hookKeyEvents() {\r\n const p = this._p;\r\n\r\n p.sink.add(p.el, 'keydown', evt => this._keydown(evt));\r\n p.sink.add(p.el, 'keypress', evt => this._keydown(evt));\r\n }\r\n\r\n _keydown(event) {\r\n const p = this._p;\r\n\r\n if (p.keyDownHandler && p.keyDownHandler.call(this, event)) {\r\n return;\r\n }\r\n\r\n let preventDefault = true;\r\n\r\n switch (event.key) {\r\n case VALUE_PAGE_UP:\r\n case VALUE_PAGE_DOWN:\r\n case VALUE_HOME:\r\n case VALUE_END:\r\n case VALUE_UP:\r\n case VALUE_DOWN:\r\n event.preventDefault();\r\n\r\n switch (event.key) {\r\n case VALUE_PAGE_UP:\r\n this.previousPage(event);\r\n break;\r\n case VALUE_PAGE_DOWN:\r\n this.nextPage(event);\r\n break;\r\n case VALUE_HOME:\r\n this._move('first', event);\r\n break;\r\n case VALUE_END:\r\n this._move('last', event);\r\n break;\r\n case VALUE_UP:\r\n this.previous(event);\r\n break;\r\n case VALUE_DOWN:\r\n this.next(event);\r\n break;\r\n }\r\n break;\r\n\r\n case VALUE_ENTER:\r\n this.triggerItemSelection(event);\r\n event.preventDefault();\r\n break;\r\n\r\n case VALUE_SPACE:\r\n this.toggleFocusedItem();\r\n event.preventDefault();\r\n break;\r\n\r\n case VALUE_ESCAPE:\r\n event.preventDefault();\r\n this.hide();\r\n break;\r\n\r\n default: {\r\n if (event.type === 'keydown') return;\r\n this._keydownFreeType(event);\r\n preventDefault = false;\r\n }\r\n }\r\n }\r\n\r\n _keydownFreeType(evt) {\r\n const p = this._p, labelProp = p.labelProp;\r\n\r\n // noinspection JSDeprecatedSymbols\r\n let character = evt.key || String.fromCharCode(evt.keyCode);\r\n if (character.length !== 1) return;\r\n\r\n clearTimeout(p.filterTimer);\r\n\r\n // Accumulate text to find from keystrokes\r\n let keyword = (p.previousFilter || '') + character;\r\n\r\n let regex = new RegExp(`^${escapeRegex(keyword)}`, 'i');\r\n\r\n let matchIndices = [];\r\n let item;\r\n\r\n // These are all the possible matches\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n item = p.items[i];\r\n if (regex.test(item[labelProp])) {\r\n matchIndices.push(i);\r\n }\r\n }\r\n\r\n // Did we find anything?\r\n if (!matchIndices.length) {\r\n // No... So start over with this character as the only one.\r\n keyword = character;\r\n regex = new RegExp(`^${escapeRegex(keyword)}`, 'i');\r\n\r\n for (let i = 0, count = p.items.length; i < count; i++) {\r\n item = p.items[i];\r\n if (regex.test(item[labelProp])) {\r\n matchIndices.push(i);\r\n }\r\n }\r\n }\r\n\r\n let focusItemIndex = p.focusItemIndex;\r\n let matchIndex = -1;\r\n\r\n // Find a match *after* the focused item\r\n for (let i = 0, count = matchIndices.length; i < count; i++) {\r\n if (matchIndices[i] >= focusItemIndex) {\r\n matchIndex = matchIndices[i];\r\n break;\r\n }\r\n }\r\n\r\n // Find a match from the beginning.\r\n if (matchIndex === -1 && matchIndices.length) {\r\n matchIndex = matchIndices[0];\r\n }\r\n\r\n if (matchIndex > -1) {\r\n let next = p.virtualListHelper.getItemElementAt(matchIndex);\r\n this._focus(evt, next || null, matchIndex);\r\n\r\n if (!this.isVisible()) {\r\n this.triggerItemSelection(evt);\r\n }\r\n\r\n // Record the last filter used\r\n p.previousFilter = keyword;\r\n\r\n // Clear the last filter - a second from now.\r\n p.filterTimer = setTimeout(() => {\r\n delete p.previousFilter;\r\n }, 1000);\r\n\r\n } else {\r\n delete p.previousFilter;\r\n }\r\n }\r\n\r\n _focus(event, itemEl, itemIndex) {\r\n const p = this._p;\r\n\r\n this.blurFocusedItem(!!event && event.type === 'focus');\r\n\r\n if (!itemIndex && itemEl) {\r\n itemIndex = p.virtualListHelper.getItemIndexFromElement(itemEl);\r\n }\r\n\r\n if (itemIndex > -1) {\r\n this.scrollItemIndexIntoView(itemIndex);\r\n } else if (itemIndex === undefined) {\r\n itemEl = null;\r\n }\r\n\r\n let focusItemEl = itemEl || p.virtualListHelper.getItemElementAt(itemIndex);\r\n\r\n if (focusItemEl) {\r\n if (focusItemEl[ItemSymbol]._nointeraction) {\r\n this.blurFocusedItem();\r\n } else {\r\n focusItemEl.classList.add(`${p.baseClassName}__item_focus`);\r\n p.focusItemEl = focusItemEl;\r\n p.focusItemIndex = itemIndex;\r\n\r\n const item = p.items[itemIndex];\r\n this._trigger('itemfocus', { value: item[p.valueProp], item: item });\r\n }\r\n } else {\r\n // This could happen if trying to focus a grouped item\r\n this.blurFocusedItem();\r\n }\r\n }\r\n\r\n _delayBlur() {\r\n if (this[DestroyedSymbol])\r\n return;\r\n\r\n const p = this._p;\r\n\r\n clearTimeout(p.timer);\r\n\r\n p.timer = setTimeout(() => {\r\n if (this[DestroyedSymbol]) return;\r\n this.blurFocusedItem();\r\n }, p.itemBlurDelay);\r\n }\r\n\r\n _move(direction, event) {\r\n const p = this._p;\r\n\r\n let next, nextIndex, directionUp = false;\r\n\r\n if (direction === 'first') {\r\n nextIndex = 0;\r\n directionUp = false;\r\n } else if (direction === 'last') {\r\n nextIndex = p.items.length - 1;\r\n directionUp = true;\r\n } else if (direction === 'prev') {\r\n if (!this.hasFocusedItem())\r\n return this._move('last', event);\r\n\r\n nextIndex = p.focusItemIndex - 1;\r\n if (nextIndex === -1) {\r\n nextIndex = p.items.length - 1;\r\n }\r\n\r\n directionUp = true;\r\n } else if (direction === 'next') {\r\n if (!this.hasFocusedItem())\r\n return this._move('first', event);\r\n\r\n nextIndex = p.focusItemIndex + 1;\r\n if (nextIndex === p.items.length) {\r\n nextIndex = 0;\r\n }\r\n\r\n directionUp = false;\r\n } else if (direction === 'prev_page' || direction === 'next_page') {\r\n\r\n if (!this.hasFocusedItem()) {\r\n return this._move(direction === 'prev_page' ? 'prev' : 'next', event);\r\n }\r\n\r\n if ((direction === 'prev_page' && this.isFirstItem()) ||\r\n (direction === 'next_page' && this.isLastItem())) return;\r\n\r\n if (this._hasScroll()) {\r\n\r\n if (p.virtualListHelper.isVirtual()) {\r\n let visibleItemCount = p.virtualListHelper.getVisibleItemCount();\r\n\r\n nextIndex = p.focusItemIndex;\r\n\r\n if (direction === 'prev_page') {\r\n nextIndex -= visibleItemCount;\r\n } else {\r\n nextIndex += visibleItemCount;\r\n }\r\n\r\n if (nextIndex < 0) {\r\n nextIndex = 0;\r\n } else if (nextIndex >= p.items.length) {\r\n nextIndex = p.items.length;\r\n }\r\n } else if (p.focusItemEl) {\r\n let base = getElementOffset(p.focusItemEl).top;\r\n let height = getElementHeight(p.el, true);\r\n\r\n while (true) { // eslint-disable-line no-constant-condition\r\n next = p.focusItemEl.nextElementSibling;\r\n if (!next) return;\r\n if (next.tagName !== 'LI') continue;\r\n\r\n if (direction === 'prev_page') {\r\n if (getElementOffset(next).top - base + height <= 0)\r\n break;\r\n } else {\r\n if (getElementOffset(next).top - base - height >= 0)\r\n break;\r\n }\r\n }\r\n\r\n if (next) {\r\n nextIndex = p.virtualListHelper.getItemIndexFromElement(next);\r\n\r\n if (nextIndex === undefined)\r\n nextIndex = -1;\r\n }\r\n }\r\n\r\n } else {\r\n return this._move(direction === 'prev_page' ? 'first' : 'last', event);\r\n }\r\n\r\n directionUp = direction === 'prev_page';\r\n } else {\r\n return;\r\n }\r\n\r\n let itemCount = p.items.length;\r\n\r\n if (nextIndex >= itemCount) {\r\n return;\r\n }\r\n\r\n let item = p.items[nextIndex];\r\n // noinspection UnnecessaryLocalVariableJS\r\n let startedAtIndex = nextIndex;\r\n\r\n while (item && item._nointeraction) {\r\n if (directionUp) {\r\n nextIndex--;\r\n if (nextIndex === -1) {\r\n nextIndex = itemCount;\r\n }\r\n } else {\r\n nextIndex++;\r\n if (nextIndex === itemCount) {\r\n nextIndex = 0;\r\n }\r\n }\r\n\r\n item = p.items[nextIndex];\r\n\r\n if (nextIndex === startedAtIndex) {\r\n break;\r\n }\r\n }\r\n\r\n next = p.virtualListHelper.getItemElementAt(nextIndex);\r\n this._focus(event, next || null, nextIndex);\r\n\r\n if (!this.isVisible()) {\r\n this.triggerItemSelection(event);\r\n }\r\n }\r\n\r\n _hasScroll() {\r\n return this.el.clientHeight < this.el.scrollHeight;\r\n }\r\n\r\n _updateGroupStateForItem(item) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (p.multi && p.autoCheckGroupChildren) {\r\n\r\n let items, groupIndex, itemIndex;\r\n\r\n if (item._group) {\r\n // Now loop through children below the group\r\n\r\n items = p.items;\r\n groupIndex = items.indexOf(item);\r\n\r\n let affectedItems = 0;\r\n\r\n for (let i = groupIndex + 1, len = items.length; i < len; i++) {\r\n let next = items[i];\r\n\r\n // Hit the next group, break out\r\n if (next._group || (!next._child && items[i - 1]._child))\r\n break;\r\n\r\n // No change, skip\r\n if (!!next._checked === item._checked)\r\n continue;\r\n\r\n // Update state\r\n next._checked = item._checked;\r\n\r\n affectedItems++;\r\n\r\n // Update DOM\r\n let nextEl = p.virtualListHelper.getItemElementAt(i);\r\n if (nextEl) {\r\n toggleClass(nextEl, `${p.baseClassName}__item_checked`, item._checked);\r\n }\r\n\r\n // Fire event\r\n this._trigger('check', { value: next[valueProp], item: next, isCheckingGroup: true });\r\n }\r\n\r\n // Fire event\r\n this._trigger('groupcheck', { value: item[valueProp], item: item, affectedItems: affectedItems });\r\n } else if (p.groupCount > 0) {\r\n items = p.items;\r\n itemIndex = items.indexOf(item);\r\n groupIndex = -1;\r\n\r\n // Find the group index\r\n for (let i = itemIndex - 1; i >= 0; i--) {\r\n if (items[i]._group) {\r\n groupIndex = i;\r\n break;\r\n }\r\n }\r\n\r\n if (groupIndex > -1) {\r\n this._updateGroupCheckedState(groupIndex, true);\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n _updateGroupCheckedState(groupIndex, fireEvents) {\r\n const p = this._p;\r\n\r\n if (p.multi && p.autoCheckGroupChildren && groupIndex > -1) {\r\n\r\n let items = p.items;\r\n let groupItem = items[groupIndex];\r\n if (!groupItem || !groupItem._group) return this;\r\n\r\n let item, hasChecked = false, hasUnchecked = false;\r\n\r\n for (let i = groupIndex + 1, len = items.length; i < len; i++) {\r\n item = items[i];\r\n\r\n // Hit the next group, break out\r\n if (item._group || (!item._child && items[i - 1]._child))\r\n break;\r\n\r\n if (item._checked) {\r\n hasChecked = true;\r\n } else if (!item._checked) {\r\n hasUnchecked = true;\r\n }\r\n }\r\n\r\n // See if we need to update the group\r\n let shouldCheckGroup = hasChecked && !hasUnchecked;\r\n if (!!groupItem._checked !== shouldCheckGroup) {\r\n // Update state\r\n groupItem._checked = shouldCheckGroup;\r\n\r\n // Update DOM\r\n let nextEl = p.virtualListHelper.getItemElementAt(groupIndex);\r\n if (nextEl) {\r\n toggleClass(nextEl, `${p.baseClassName}__item_checked`, groupItem._checked);\r\n }\r\n\r\n if (fireEvents) {\r\n // Fire event\r\n this._trigger('check', { value: groupItem[p.valueProp], item: groupItem });\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @private\r\n * @returns {DropList} self\r\n */\r\n _measureItem() {\r\n const p = this._p;\r\n\r\n if (p.lastMeasureItemCount !== p.items.length) {\r\n const labelProp = p.labelProp, valueProp = p.valueProp;\r\n let longestLabel = p.lastMeasureLongestLabel || 1,\r\n longestLabelText = p.lastMeasureLongestLabelText || '';\r\n\r\n for (let i = 0, items = p.items, count = items.length;\r\n i < count;\r\n i++) {\r\n\r\n const item = items[i];\r\n let text = item[labelProp];\r\n if (text == null)\r\n text = item[valueProp];\r\n if (text == null)\r\n text = '';\r\n\r\n let length = text.length;\r\n if (length > longestLabel) {\r\n longestLabel = length;\r\n longestLabelText = text;\r\n }\r\n }\r\n\r\n p.lastMeasureItemCount = p.items.length;\r\n p.lastMeasureLongestLabel = longestLabel;\r\n p.lastMeasureLongestLabelText = longestLabelText;\r\n }\r\n\r\n if (p.estimateWidth || p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.createGhostItemElement(GhostSymbol, true, itemEl => {\r\n p.lastMeasureItemWidth = getElementWidth(itemEl, true, true);\r\n });\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Determines whether the list should be in virtual mode, depending on the item count.\r\n * @param {number?} targetItemCount - item count we are expecting. Defaults to current item count\r\n * @returns {DropList}\r\n * @private\r\n */\r\n _determineVirtualMode(targetItemCount) {\r\n const p = this._p;\r\n\r\n let items = p.items;\r\n if (targetItemCount === undefined) {\r\n targetItemCount = items.length;\r\n }\r\n\r\n let shouldBeVirtual = targetItemCount >= p.virtualMinItems;\r\n\r\n if (shouldBeVirtual !== p.virtualListHelper.isVirtual()) {\r\n p.virtualListHelper.setVirtual(shouldBeVirtual).render();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n _renderItemContent(item, itemEl) {\r\n const p = this._p, labelProp = p.labelProp;\r\n\r\n // NOTE: a \"measure\" item will not have full data of original item.\r\n // so for a custom renderer - we try to send original item, and fallback to our private list item.\r\n\r\n if (!p.renderItem || p.renderItem(item[ItemSymbol] || item, itemEl) === false) {\r\n itemEl.appendChild(createElement('span', {\r\n class: `${p.baseClassName}__item_label`,\r\n textContent: item[labelProp],\r\n }));\r\n\r\n if (p.multi) {\r\n if (!item._nocheck) {\r\n itemEl.insertBefore(\r\n createElement('span', { class: 'checkbox' }),\r\n itemEl.firstChild,\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.PositionOptions} [positionOptions=undefined]\r\n * @returns {number} new outer width\r\n * @private\r\n */\r\n _updateWidth(positionOptions) {\r\n const p = this._p, el = p.el;\r\n\r\n let targetWidth = 0;\r\n\r\n if (positionOptions) {\r\n // Measure target\r\n targetWidth = positionOptions.targetWidth;\r\n if (targetWidth == null) {\r\n targetWidth = getElementWidth(positionOptions.target, true, true);\r\n }\r\n }\r\n\r\n let autoWidth = 0;\r\n if (!p.useExactTargetWidth) {\r\n if (p.estimateWidth || p.virtualListHelper.isVirtual()) {\r\n autoWidth = p.lastMeasureItemWidth;\r\n } else {\r\n el.style.width = ''; // Reset width\r\n autoWidth = getElementWidth(el, true, true);\r\n }\r\n }\r\n\r\n let newOuterWidth = Math.max(autoWidth, targetWidth);\r\n\r\n setElementWidth(el, newOuterWidth, true, true);\r\n\r\n const elComputedStyle = getComputedStyle(el);\r\n let bordersWidth = (parseFloat(elComputedStyle.borderLeftWidth) || 0) + (parseFloat(elComputedStyle.borderRightWidth) || 0);\r\n let scrollWidth = el.scrollWidth + bordersWidth;\r\n if (scrollWidth > newOuterWidth) {\r\n // consider scrollWidth delta\r\n let delta = scrollWidth - newOuterWidth;\r\n el.style.width = `${parseFloat(el.style.width) + delta}px`;\r\n newOuterWidth = scrollWidth;\r\n }\r\n\r\n return newOuterWidth;\r\n }\r\n}\r\n\r\nexport default DropList;\r\n","const throttle = (func, wait, options) => {\r\n let timeout, context, args, result;\r\n let previous = 0;\r\n if (!options) options = {};\r\n\r\n const later = () => {\r\n previous = options.leading === false ? 0 : Date.now();\r\n timeout = null;\r\n result = func.apply(context, args);\r\n if (!timeout) context = args = null;\r\n };\r\n\r\n const throttled = function () {\r\n const now = Date.now();\r\n if (!previous && options.leading === false)\r\n previous = now;\r\n\r\n const remaining = wait - (now - previous);\r\n context = this;\r\n args = arguments;\r\n if (remaining <= 0 || remaining > wait) {\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n timeout = null;\r\n }\r\n previous = now;\r\n result = func.apply(context, args);\r\n if (!timeout) context = args = null;\r\n } else if (!timeout && options.trailing !== false) {\r\n timeout = setTimeout(later, remaining);\r\n }\r\n return result;\r\n };\r\n\r\n throttled.cancel = () => {\r\n clearTimeout(timeout);\r\n previous = 0;\r\n timeout = context = args = null;\r\n };\r\n\r\n throttled.isScheduled = () => {\r\n return !!timeout;\r\n };\r\n\r\n return throttled;\r\n};\r\n\r\nexport default throttle;\r\n","import {\r\n getCssProps,\r\n getElementWidth,\r\n setElementWidth,\r\n getPseudoElementWidth,\r\n setCssProps,\r\n} from '@danielgindi/dom-utils/lib/Css';\r\nimport escapeRegex from './utils/escapeRegex';\r\nimport {\r\n closestUntil,\r\n createElement,\r\n next,\r\n prev,\r\n setElementAttrs,\r\n} from '@danielgindi/dom-utils/lib/Dom';\r\nimport {\r\n append,\r\n getRootNode,\r\n before,\r\n remove,\r\n toggleClass,\r\n} from '@danielgindi/dom-utils/lib/DomCompat';\r\n\r\nimport DomEventsSink from '@danielgindi/dom-utils/lib/DomEventsSink';\r\nimport DropList from './DropList';\r\nimport throttle from './utils/throttle';\r\nimport {\r\n VALUE_BACK_SPACE,\r\n VALUE_DELETE, VALUE_DOWN, VALUE_ENTER,\r\n VALUE_ESCAPE,\r\n VALUE_LEFT, VALUE_PAGE_DOWN,\r\n VALUE_PAGE_UP,\r\n VALUE_RIGHT, VALUE_SPACE,\r\n VALUE_TAB,\r\n VALUE_UP,\r\n} from 'keycode-js';\r\n\r\nconst ItemSymbol = Symbol('item');\r\nconst DestroyedSymbol = Symbol('destroyed');\r\nconst NoResultsItemSymbol = Symbol('no_results_items');\r\nconst RestMultiItemsSymbol = Symbol('rest_multi_items');\r\n\r\nconst hasTouchCapability = !!('ontouchstart' in window\r\n || (window.DocumentTouch && window.document instanceof window.DocumentTouch)\r\n || window.navigator.maxTouchPoints\r\n);\r\n\r\n/**\r\n * @param {Element|EventTarget} el\r\n * @param {string} className\r\n * @returns {boolean}\r\n */\r\nconst hasClass = function (el, className) {\r\n if (el instanceof Element) {\r\n return el.classList.contains(className);\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst inputBackbufferCssProps = [\r\n 'font-family',\r\n 'font-size',\r\n 'font-weight',\r\n 'font-size',\r\n 'letter-spacing',\r\n 'text-transform',\r\n 'word-spacing',\r\n 'text-indent',\r\n 'box-sizing',\r\n 'padding-left',\r\n 'padding-right',\r\n];\r\n\r\n/**\r\n * @typedef {Object} SelectBox.Options\r\n * @property {DropList.Options} [listOptions] options to pass to the `DropList`\r\n * @property {Element} [el] An element to attach to, instead of creating a new one\r\n * @property {string} [baseClassName='selectbox'] class name for the menu root element\r\n * @property {boolean} [disabled=false] Should start as disabled?\r\n * @property {boolean} [clearable=true] Has clear button?\r\n * @property {boolean} [hasOpenIndicator=true] has open/close indicator?\r\n * @property {string} [placeholder=''] Placeholder text\r\n * @property {boolean} [sortSelectedItems=true] Should the selected items be sorted?\r\n * @property {boolean} [sortListItems=true] Sort list items\r\n * @property {boolean} [sortListCheckedFirst=true] When sorting - put checked items first (applicable to `multi` mode only)\r\n * @property {*[]} [stickyValues]\r\n * @property {function(a: DropList.ItemBase, b: DropList.ItemBase):number} [sortItemComparator]\r\n * @property {boolean} [splitListCheckedGroups=true] Split groups to \"checked\" and \"unchecked\", works with `sortCheckedFirst` only\r\n * @property {boolean|'touch'} [blurOnSingleSelection='touch']\r\n * @property {boolean} [multi=false] can multiple values be selected?\r\n * @property {boolean} [showSelection=true] show selection? if false, the placeholder will take effect\r\n * @property {function(items: DropList.ItemBase[]):string} [multiPlaceholderFormatter] formatter for placeholder for multi items mode\r\n * @property {boolean} [searchable=false] is it searchable?\r\n * @property {string} [noResultsText='No matching results'] text for no results (empty for none)\r\n * @property {number} [filterThrottleWindow=300] throttle time (milliseconds) for filtering\r\n * @property {boolean} [filterOnEmptyTerm=false] call the filter function on empty search term too\r\n * @property {string} [labelProp='label']\r\n * @property {string} [valueProp='value']\r\n * @property {string} [multiItemLabelProp='short_label']\r\n * @property {number} [maxMultiItems] maximum number of multi items. The rest will get a single item to represent.\r\n * @property {function(count: number, items: DropList.ItemBase[]):string} [multiItemsRestLabelProvider] label for the item representing the rest of the items.\r\n * @property {DropList.ItemBase[]|null} [items] initial items\r\n * @property {*[]|null} [selectedValues] initial selected values\r\n * @property {*|*[]|null} [value] initial selected value\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderSingleItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderSingleItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderRestMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderRestMultiItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element):(*|false)} [renderNoResultsItem]\r\n * @property {function(item: DropList.ItemBase, itemEl: Element)} [unrenderNoResultsItem]\r\n * @property {function(items: DropList.ItemBase[], term: string):(DropList.ItemBase[]|null)} [filterFn]\r\n * @property {function(name: string, ...args)} [on]\r\n * @property {string|string[]} [additionalClasses]\r\n * @property {boolean} [isLoadingMode]\r\n * */\r\nconst defaultOptions = {\r\n el: null,\r\n baseClassName: 'selectbox',\r\n disabled: false,\r\n clearable: true,\r\n hasOpenIndicator: true,\r\n placeholder: '',\r\n sortSelectedItems: true,\r\n sortListItems: true,\r\n sortListCheckedFirst: true,\r\n stickyValues: null,\r\n sortItemComparator: null,\r\n splitListCheckedGroups: true,\r\n blurOnSingleSelection: 'touch',\r\n multi: false,\r\n showSelection: true,\r\n multiPlaceholderFormatter: null,\r\n searchable: true,\r\n noResultsText: 'No matching results',\r\n filterThrottleWindow: 300,\r\n filterOnEmptyTerm: false,\r\n labelProp: 'label',\r\n valueProp: 'value',\r\n multiItemLabelProp: 'short_label',\r\n maxMultiItems: null,\r\n multiItemsRestLabelProvider: null,\r\n items: [],\r\n selectedValues: undefined,\r\n value: undefined,\r\n isLoadingMode: false,\r\n};\r\n\r\n/**\r\n *\r\n * @param {DropList.ItemBase[]} items\r\n * @param {string} labelProp\r\n * @returns {string}\r\n */\r\nconst defaultMultiPlaceholderFormatter = (items, labelProp) => {\r\n if (items.length === 0)\r\n return '';\r\n\r\n let title = items[0][labelProp] + '';\r\n\r\n if (items.length > 1) {\r\n title += ` (+${items.length - 1})`;\r\n }\r\n\r\n return title;\r\n};\r\n\r\n/*\r\nEmits the following events:\r\n---------------------------\r\n\r\n'clear:before' {cancel: false}: will clear the whole selection. return false to abort.\r\n'clear': clearead the whole selection.\r\n'open' { list: DropList }: the drop list is opening\r\n'open:before' { list: DropList }: the drop list will open\r\n'close': the drop list is closing\r\n'addsel:before' {value, item, cancel: false}: an item selection is about to be added (in multi mode). return false to abort.\r\n'removesel:before' {value, item, cancel: false}: an item selection is about to be removed (in multi mode). return false to abort.\r\n'select:before' {value, item, cancel: false}: an item is about to be selected (in single mode). return false to abort.\r\n'addsel' {value, item}: an item selection has been added (in multi mode)\r\n'removesel' {value, item}: an item selection has been removed (in multi mode)\r\n'select' {value, item}: an item has been selected (in single mode)\r\n'search' {value}: input box value has changed\r\n'search:focus': input box has gained focus\r\n'search:blur': input box has lost focus\r\n'input:resize': input box resized\r\n'itemschanged' {term, mutated, count}: the current set of items has changed\r\n */\r\n\r\n// noinspection JSUnusedGlobalSymbols\r\nclass SelectBox {\r\n /**\r\n * @param {SelectBox.Options} options\r\n */\r\n constructor(options) {\r\n const o = { ...defaultOptions };\r\n\r\n for (let [key, value] of Object.entries(/**@type Object*/options))\r\n if (value !== undefined)\r\n o[key] = value;\r\n\r\n const p = this._p = {\r\n ownsEl: true,\r\n\r\n baseClassName: o.baseClassName,\r\n\r\n listOptions: o.listOptions,\r\n\r\n disabled: !!o.disabled,\r\n clearable: !!o.clearable,\r\n hasOpenIndicator: !!o.hasOpenIndicator,\r\n placeholder: o.placeholder,\r\n sortSelectedItems: !!o.sortSelectedItems,\r\n sortListItems: !!o.sortListItems,\r\n sortListCheckedFirst: !!o.sortListCheckedFirst,\r\n stickyValues: Array.isArray(o.stickyValues) ? new Set(o.stickyValues) : null,\r\n sortItemComparator: o.sortItemComparator,\r\n splitListCheckedGroups: !!o.splitListCheckedGroups,\r\n blurOnSingleSelection: o.blurOnSingleSelection,\r\n multi: o.multi,\r\n showSelection: o.showSelection,\r\n multiPlaceholderFormatter: o.multiPlaceholderFormatter,\r\n searchable: o.searchable,\r\n noResultsText: o.noResultsText,\r\n filterThrottleWindow: o.filterThrottleWindow,\r\n filterOnEmptyTerm: o.filterOnEmptyTerm,\r\n\r\n labelProp: o.labelProp,\r\n valueProp: o.valueProp,\r\n multiItemLabelProp: o.multiItemLabelProp,\r\n\r\n maxMultiItems: o.maxMultiItems,\r\n multiItemsRestLabelProvider: o.multiItemsRestLabelProvider,\r\n\r\n renderSingleItem: o.renderSingleItem,\r\n unrenderSingleItem: o.unrenderSingleItem,\r\n renderMultiItem: o.renderMultiItem,\r\n unrenderMultiItem: o.unrenderMultiItem,\r\n renderRestMultiItem: o.renderRestMultiItem,\r\n unrenderRestMultiItem: o.unrenderRestMultiItem,\r\n renderNoResultsItem: o.renderNoResultsItem,\r\n unrenderNoResultsItem: o.unrenderNoResultsItem,\r\n filterFn: o.filterFn,\r\n on: null,\r\n additionalClasses: o.additionalClasses,\r\n\r\n isLoadingMode: !!o.isLoadingMode,\r\n\r\n items: [],\r\n filteredItems: null,\r\n itemsChanged: true,\r\n\r\n sink: new DomEventsSink(),\r\n\r\n selectedItems: [],\r\n selectedValues: [],\r\n selectionChanged: true,\r\n resortBySelectionNeeded: false,\r\n\r\n throttledUpdateListItems: throttle(() => this._updateListItems(),\r\n o.filterThrottleWindow,\r\n { leading: true, trailing: true }),\r\n\r\n filterTerm: '',\r\n };\r\n\r\n let el = o.el;\r\n if (el instanceof Element) {\r\n p.ownsEl = false;\r\n } else {\r\n el = createElement('span');\r\n }\r\n\r\n setElementAttrs(el, {\r\n role: 'combobox',\r\n 'aria-haspopup': 'true',\r\n 'aria-expanded': 'false',\r\n });\r\n p.el = el;\r\n\r\n this._syncBaseClasses();\r\n this._renderBase();\r\n\r\n /** @type Element[] */\r\n p.multiItemEls = [];\r\n\r\n this.enable(!p.disabled);\r\n\r\n this._setupDropdownMenu();\r\n\r\n // --- Hook click\r\n p.sink\r\n .add(el, 'click', (evt) => {\r\n if (closestUntil(evt.target, `.${p.baseClassName}__clear`, evt.currentTarget)) {\r\n return;\r\n }\r\n\r\n if (!el.contains(document.activeElement)) {\r\n p.input.focus();\r\n // Go to end of input\r\n p.input.selectionStart = p.input.selectionEnd = p.input.value.length;\r\n }\r\n });\r\n\r\n // --- Handle default focus directly to search box\r\n p.sink.add(el, 'focus', evt => {\r\n const target = (/**Element*/evt.target);\r\n\r\n if (!el.contains(evt.relatedTarget) &&\r\n !hasClass(target, `${p.baseClassName}__search_field`) &&\r\n !hasClass(target, `${p.baseClassName}__item`)) {\r\n let field = el.querySelector(`.${p.baseClassName}__search_field`);\r\n field && field.focus();\r\n }\r\n }, true);\r\n\r\n p.sink\r\n .add(p.input, 'keydown', (/**KeyboardEvent*/event) => {\r\n this._handleInputKeydown(event);\r\n })\r\n .add(p.input, 'input', () => {\r\n this._resizeInput();\r\n });\r\n\r\n const focusInOutHandler = (() => {\r\n let t;\r\n return () => {\r\n if (t) {\r\n clearTimeout(t);\r\n }\r\n t = setTimeout(() => {\r\n toggleClass(el, `${p.baseClassName}__focus`, el.contains(document.activeElement));\r\n });\r\n };\r\n })();\r\n p.sink.add(el, 'focus', focusInOutHandler, true);\r\n p.sink.add(el, 'blur', focusInOutHandler, true);\r\n\r\n // --- Resize input on window change\r\n p.sink.add(window, 'resize', () => this._resizeInput());\r\n p.sink.add(window, 'orientationchange', () => this._resizeInput());\r\n\r\n this.setItems(o.items);\r\n\r\n if (o.multi && Array.isArray(o.selectedValues)) {\r\n this.setSelectedValues(o.selectedValues);\r\n } else if (o.value != null) {\r\n this.setValue(o.value);\r\n }\r\n\r\n // Start firing events\r\n p.on = o.on || null;\r\n\r\n this._scheduleSync();\r\n\r\n return this;\r\n }\r\n\r\n destroy() {\r\n if (this[DestroyedSymbol])\r\n return;\r\n this[DestroyedSymbol] = true;\r\n\r\n const p = this._p;\r\n\r\n if (p.syncTimeout) {\r\n clearTimeout(p.syncTimeout);\r\n delete p.syncTimeout;\r\n }\r\n\r\n this._stopTrackingPresence();\r\n\r\n p.sink.remove();\r\n p.dropList && p.dropList.destroy();\r\n\r\n if (p.throttledUpdateListItems)\r\n p.throttledUpdateListItems.cancel();\r\n\r\n this._cleanupSingleWrapper();\r\n\r\n if (p.unrenderMultiItem || p.unrenderRestMultiItem) {\r\n // Remove all item elements\r\n while (p.multiItemEls.length > 0) {\r\n // use fast path by removing in reverse\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n }\r\n }\r\n\r\n remove(p.list);\r\n remove(p.singleWrapper);\r\n remove(p.input);\r\n remove(p.inputBackBuffer);\r\n remove(p.clearButtonWrapper);\r\n remove(p.openIndicator);\r\n\r\n if (!p.ownsEl) {\r\n for (let name of Array.from(p.el.classList)) {\r\n if (name.startsWith(p.baseClassName)) {\r\n p.el.classList.remove(name);\r\n }\r\n }\r\n p.el.removeAttribute('role');\r\n p.el.removeAttribute('aria-haspopup');\r\n p.el.removeAttribute('aria-expanded');\r\n }\r\n\r\n this._p = null;\r\n }\r\n\r\n get el() {\r\n return this._p.el;\r\n }\r\n\r\n /**\r\n * Enables the control\r\n * @param {boolean=true} enabled Should the control be enabled?\r\n * @returns {SelectBox}\r\n */\r\n enable(enabled) {\r\n const p = this._p;\r\n\r\n if (enabled === undefined) {\r\n enabled = true;\r\n }\r\n p.disabled = !enabled;\r\n p.el.setAttribute('aria-disabled', p.disabled.toString());\r\n p.input.disabled = !!p.disabled;\r\n\r\n const multiItemEls = p.multiItemEls;\r\n\r\n for (let itemEl of multiItemEls) {\r\n if (p.disabled) {\r\n itemEl.removeAttribute('tabindex');\r\n } else {\r\n itemEl.setAttribute('tabindex', '0');\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Is the control enabled?\r\n * @returns {boolean}\r\n */\r\n isEnabled() {\r\n return !this._p.disabled;\r\n }\r\n\r\n /**\r\n * Disables the control\r\n * @param {boolean=true} disabled Should the control be disabled?\r\n * @returns {SelectBox}\r\n */\r\n disable(disabled) {\r\n return this.enable(disabled === undefined ? false : !disabled);\r\n }\r\n\r\n /**\r\n * Is the control disabled?\r\n * @returns {boolean}\r\n */\r\n isDisabled() {\r\n return this._p.disabled;\r\n }\r\n\r\n /**\r\n * @param {string|string[]} classes\r\n * @returns {SelectBox}\r\n */\r\n setAdditionalClasses(classes) {\r\n const p = this._p;\r\n p.additionalClasses = classes;\r\n this._syncBaseClasses();\r\n return this;\r\n }\r\n\r\n /**\r\n *\r\n * @param {DropList.ItemBase[]} [items]\r\n * @param {boolean} [resetValues=true] should reset values to current values (essentially refresh the data based on items & values). If set to false, use setValue to set a fresh value\r\n * @returns {SelectBox}\r\n */\r\n setItems(items, resetValues = true) {\r\n const p = this._p;\r\n\r\n if (!items)\r\n items = [];\r\n\r\n p.items = items.slice(0);\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n\r\n if (resetValues) {\r\n this.setSelectedValues(this.getSelectedValues());\r\n }\r\n\r\n this._trigger('itemschanged', { term: null, mutated: true, count: this.getFilteredItemCount() });\r\n\r\n return this;\r\n }\r\n\r\n getFilteredItemCount() {\r\n const p = this._p;\r\n\r\n if (p.filteredItems)\r\n return p.filteredItems.length;\r\n\r\n if (p.items)\r\n return p.items.length;\r\n\r\n return 0;\r\n }\r\n\r\n isFilterPending() {\r\n const p = this._p;\r\n\r\n return !!(p.throttledUpdateListItems.isScheduled() ||\r\n (!p.filteredItems && (p.filterTerm || (p.filterOnEmptyTerm && p.filterFn))));\r\n }\r\n\r\n updateItemByValue(value, newItem) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n let existingItem = p.items.find(x => x[valueProp] === value);\r\n if (existingItem)\r\n Object.assign(existingItem, newItem);\r\n\r\n if (p.dropList) {\r\n p.dropList.updateItemByValue(value, newItem);\r\n }\r\n }\r\n\r\n /**\r\n * @returns {DropList.ItemBase[]|*}\r\n */\r\n getItems() {\r\n const p = this._p;\r\n return p.items;\r\n }\r\n\r\n /**\r\n * @param {boolean} clearable\r\n * @returns {SelectBox}\r\n */\r\n setClearable(clearable) {\r\n clearable = !!clearable;\r\n\r\n if (this._p.clearable === clearable)\r\n return this;\r\n\r\n this._p.clearable = !!clearable;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getClearable() {\r\n return this._p.clearable;\r\n }\r\n\r\n /**\r\n * @param {boolean} enabled\r\n * @returns {SelectBox}\r\n */\r\n setHasOpenIndicator(enabled) {\r\n enabled = !!enabled;\r\n\r\n if (this._p.hasOpenIndicator === enabled)\r\n return this;\r\n\r\n this._p.hasOpenIndicator = enabled;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getHasOpenIndicator() {\r\n return this._p.hasOpenIndicator;\r\n }\r\n\r\n /**\r\n * @param {string} placeholder\r\n * @returns {SelectBox}\r\n */\r\n setPlaceholder(placeholder) {\r\n this._p.placeholder = placeholder == null ? '' : String(placeholder);\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {string}\r\n */\r\n getPlaceHolder() {\r\n return this._p.placeholder;\r\n }\r\n\r\n /**\r\n * @param {string} term\r\n * @param {boolean} [performSearch=false] should actually perform the search, or just set the input's text?\r\n * @returns {SelectBox}\r\n */\r\n setSearchTerm(term, performSearch = false) {\r\n const p = this._p;\r\n\r\n if (!p.input) return this;\r\n\r\n p.input.value = term;\r\n\r\n this._scheduleSync('resize_input');\r\n\r\n if (performSearch) {\r\n p.filterTerm = p.input.value.trim();\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n\r\n this._trigger('search', { value: p.input.value });\r\n p.throttledUpdateListItems();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {string}\r\n */\r\n getSearchTerm() {\r\n const p = this._p;\r\n if (p.input)\r\n return p.input.value;\r\n return '';\r\n }\r\n\r\n /**\r\n * @param {boolean} sortSelectedItems\r\n * @returns {SelectBox}\r\n */\r\n setSortSelectedItems(sortSelectedItems) {\r\n const p = this._p;\r\n sortSelectedItems = !!sortSelectedItems;\r\n if (p.sortSelectedItems === sortSelectedItems)\r\n return this;\r\n\r\n p.sortSelectedItems = sortSelectedItems;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSortSelectedItemsEnabled() {\r\n return this._p.sortSelectedItems;\r\n }\r\n\r\n /**\r\n * @param {boolean} sortListItems\r\n * @returns {SelectBox}\r\n */\r\n setSortListItems(sortListItems) {\r\n const p = this._p;\r\n sortListItems = !!sortListItems;\r\n if (p.sortListItems === sortListItems)\r\n return this;\r\n\r\n p.sortListItems = sortListItems;\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSortListItemsEnabled() {\r\n return this._p.sortListItems;\r\n }\r\n\r\n /**\r\n * @param {boolean} sortListCheckedFirst\r\n * @returns {SelectBox}\r\n */\r\n setSortListCheckedFirst(sortListCheckedFirst) {\r\n const p = this._p;\r\n sortListCheckedFirst = !!sortListCheckedFirst;\r\n if (p.sortCheckedFirst === sortListCheckedFirst)\r\n return this;\r\n\r\n p.sortCheckedFirst = sortListCheckedFirst;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSortListCheckedFirstEnabled() {\r\n return this._p.sortListCheckedFirst;\r\n }\r\n\r\n /**\r\n * @param {*[]} values\r\n * @returns {SelectBox}\r\n */\r\n setStickyValues(values) {\r\n const p = this._p;\r\n\r\n p.stickyValues = Array.isArray(values) ? new Set(values) : null;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {*[]}\r\n */\r\n getStickyValues() {\r\n return this._p.stickyValues ? Array.from(this._p.stickyValues) : null;\r\n }\r\n\r\n /**\r\n * @param {function(a: DropList.ItemBase, b: DropList.ItemBase):number} comparator\r\n * @returns {SelectBox}\r\n */\r\n setSortItemComparator(comparator) {\r\n const p = this._p;\r\n if (p.sortItemComparator === comparator)\r\n return this;\r\n\r\n p.sortItemComparator = comparator;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {function(a: DropList.ItemBase, b: DropList.ItemBase):number}\r\n */\r\n getSortItemComparator() {\r\n return this._p.sortItemComparator;\r\n }\r\n\r\n /**\r\n * @param {boolean} splitListCheckedGroups\r\n * @returns {SelectBox}\r\n */\r\n setSplitListCheckedGroups(splitListCheckedGroups) {\r\n const p = this._p;\r\n splitListCheckedGroups = !!splitListCheckedGroups;\r\n if (p.splitListCheckedGroups === splitListCheckedGroups)\r\n return this;\r\n\r\n p.splitListCheckedGroups = splitListCheckedGroups;\r\n p.itemsChanged = true;\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSplitListCheckedGroupsEnabled() {\r\n return this._p.splitListCheckedGroups;\r\n }\r\n\r\n /**\r\n * @param {boolean} showSelection\r\n * @returns {SelectBox}\r\n */\r\n setShowSelection(showSelection) {\r\n const p = this._p;\r\n showSelection = !!showSelection;\r\n if (p.showSelection === showSelection)\r\n return this;\r\n\r\n this._p.showSelection = showSelection;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isShowSelectionEnabled() {\r\n return this._p.showSelection;\r\n }\r\n\r\n /**\r\n * @param {function(items: DropList.ItemBase[]):string} formatter\r\n * @returns {SelectBox}\r\n */\r\n setMultiPlaceholderFormatter(formatter) {\r\n const p = this._p;\r\n\r\n if (p.multiPlaceholderFormatter === formatter)\r\n return this;\r\n\r\n this._p.multiPlaceholderFormatter = formatter;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {boolean|'touch'} value\r\n * @returns {SelectBox}\r\n */\r\n setBlurOnSingleSelection(value) {\r\n const p = this._p;\r\n if (p.blurOnSingleSelection === value)\r\n return this;\r\n\r\n this._p.blurOnSingleSelection = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean|'touch'}\r\n */\r\n getBlurOnSingleSelection() {\r\n return this._p.blurOnSingleSelection;\r\n }\r\n\r\n /**\r\n * @param {boolean} multi\r\n * @returns {SelectBox}\r\n */\r\n setMulti(multi) {\r\n const p = this._p;\r\n multi = !!multi;\r\n if (p.multi === multi)\r\n return this;\r\n\r\n p.multi = multi;\r\n\r\n this._setupDropdownMenu();\r\n\r\n // move to correct parent\r\n remove(p.clearButtonWrapper);\r\n delete p.clearButtonWrapper;\r\n\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isMultiEnabled() {\r\n return this._p.multi;\r\n }\r\n\r\n /**\r\n * @param {boolean} searchable\r\n * @returns {SelectBox}\r\n */\r\n setSearchable(searchable) {\r\n const p = this._p;\r\n searchable = !!searchable;\r\n if (p.searchable === searchable)\r\n return this;\r\n\r\n p.searchable = searchable;\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isSearchableEnabled() {\r\n return this._p.searchable;\r\n }\r\n\r\n /**\r\n * @param {string} noResultsText\r\n * @returns {SelectBox}\r\n */\r\n setNoResultsText(noResultsText) {\r\n this._p.noResultsText = noResultsText;\r\n this._scheduleSync('full');\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {string}\r\n */\r\n getNoResultsText() {\r\n return this._p.noResultsText;\r\n }\r\n\r\n /**\r\n * @param {number} window\r\n * @returns {SelectBox}\r\n */\r\n setFilterThrottleWindow(window) {\r\n const p = this._p;\r\n p.filterThrottleWindow = window;\r\n\r\n let isScheduled = p.throttledUpdateListItems ? p.throttledUpdateListItems.isScheduled() : false;\r\n\r\n if (p.throttledUpdateListItems)\r\n p.throttledUpdateListItems.cancel();\r\n\r\n p.throttledUpdateListItems = throttle(() => this._updateListItems(), p.filterThrottleWindow, true);\r\n\r\n if (isScheduled)\r\n p.throttledUpdateListItems();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {number}\r\n */\r\n getFilterThrottleWindow() {\r\n return this._p.filterThrottleWindow;\r\n }\r\n\r\n /**\r\n * @param {boolean} value\r\n * @returns {SelectBox}\r\n */\r\n setFilterOnEmptyTerm(value) {\r\n const p = this._p;\r\n p.filterOnEmptyTerm = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getFilterOnEmptyTerm() {\r\n return this._p.filterOnEmptyTerm;\r\n }\r\n\r\n /**\r\n * @param {DropList.Options} listOptions\r\n * @returns {SelectBox}\r\n */\r\n setListOptions(listOptions) {\r\n const p = this._p;\r\n p.listOptions = listOptions;\r\n this._setupDropdownMenu();\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox})|null\r\n */\r\n setRenderSingleItem(render, unrender) {\r\n const p = this._p;\r\n p.renderSingleItem = render;\r\n p.unrenderSingleItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox}\r\n */\r\n setRenderMultiItem(render, unrender) {\r\n const p = this._p;\r\n p.renderMultiItem = render;\r\n p.unrenderMultiItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox}\r\n */\r\n setRenderRestMultiItem(render, unrender) {\r\n const p = this._p;\r\n p.renderRestMultiItem = render;\r\n p.unrenderRestMultiItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element):(*|false))|null} render\r\n * @param {(function(item: DropList.ItemBase, itemEl: Element))|null} unrender\r\n * @returns {SelectBox}\r\n */\r\n setRenderNoResultsItem(render, unrender) {\r\n const p = this._p;\r\n p.renderNoResultsItem = render;\r\n p.unrenderNoResultsItem = unrender;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {SelectBox}\r\n */\r\n setLabelProp(prop) {\r\n const p = this._p;\r\n p.labelProp = prop;\r\n\r\n\t\tif (p.dropList)\r\n\t\t\tp.dropList.setLabelProp(prop);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {SelectBox}\r\n */\r\n setValueProp(prop) {\r\n const p = this._p;\r\n p.valueProp = prop;\r\n\r\n\t\tif (p.dropList)\r\n\t\t\tp.dropList.setValueProp(prop);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} prop\r\n * @returns {SelectBox}\r\n */\r\n setMultiItemLabelProp(prop) {\r\n const p = this._p;\r\n p.multiItemLabelProp = prop;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {number|null|undefined} value\r\n * @returns {SelectBox}\r\n */\r\n setMaxMultiItems(value) {\r\n const p = this._p;\r\n p.maxMultiItems = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {function(count: number, items: DropList.ItemBase[]):string|null|undefined} value\r\n * @returns {SelectBox}\r\n */\r\n setMultiItemsRestLabelProvider(value) {\r\n const p = this._p;\r\n p.multiItemsRestLabelProvider = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {function(items: DropList.ItemBase[], term: string):(DropList.ItemBase[]|null)} fn\r\n * @returns {SelectBox}\r\n */\r\n setFilterFn(fn) {\r\n const p = this._p;\r\n p.filterFn = fn;\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {function(items: DropList.ItemBase[], term: string):(DropList.ItemBase[]|null)}\r\n */\r\n getFilterFn() {\r\n return this._p.filterFn;\r\n }\r\n\r\n /**\r\n * Focus on input element\r\n * @returns {SelectBox}\r\n */\r\n focusInput() {\r\n const p = this._p;\r\n\r\n if (p.input)\r\n p.input.focus();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Remvoe focus from the input element\r\n * @returns {SelectBox}\r\n */\r\n blurInput() {\r\n const p = this._p;\r\n\r\n if (p.input)\r\n p.input.blur();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes all selected items\r\n * @returns {SelectBox}\r\n */\r\n clear() {\r\n const p = this._p;\r\n\r\n let clearEvt = { cancel: false };\r\n this._trigger('clear:before', clearEvt);\r\n if (clearEvt.cancel)\r\n return this;\r\n\r\n p.selectedItems = [];\r\n p.selectedValues = [];\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n\r\n this._trigger('clear');\r\n\r\n if (this[DestroyedSymbol]) return this; // destroyed by event handler\r\n\r\n this._updateListItems();\r\n\r\n this._setInputText('');\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns a single value or an array of selected values - depending on `multi` prop\r\n * @public\r\n * @returns {*[]}\r\n */\r\n getValue() {\r\n const p = this._p;\r\n if (p.multi)\r\n return p.selectedValues.slice(0);\r\n else if (p.selectedValues.length > 0)\r\n return p.selectedValues[0];\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Selects the specified value or multiple values - depending on `multi` prop\r\n * @public\r\n * @param {*|*[]} value - if `multi`, then an array of values to select, otherwise - a single value to select\r\n * @returns {SelectBox}\r\n */\r\n setValue(value) {\r\n const p = this._p;\r\n if (p.multi)\r\n return this.setSelectedValues(Array.isArray(value) ? value : value !== undefined ? [value] : []);\r\n else\r\n return this.setSelectedValues(value !== undefined ? [value] : []);\r\n }\r\n\r\n /**\r\n * Returns an array of selected values\r\n * @public\r\n * @returns {*[]}\r\n */\r\n getSelectedValues() {\r\n const p = this._p;\r\n return p.selectedValues.slice(0);\r\n }\r\n\r\n /**\r\n * Selects the specified values\r\n * @public\r\n * @param {*[]} values - an array of *values* to select\r\n * @returns {SelectBox}\r\n */\r\n setSelectedValues(values) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (!p.multi) {\r\n values = values.slice(0, 1);\r\n }\r\n\r\n let set = new Set();\r\n let selectedValues = [];\r\n let selectedItems = [];\r\n\r\n for (let value of values) {\r\n if (set.has(value))\r\n continue;\r\n set.add(value);\r\n\r\n selectedValues.push(value);\r\n\r\n let item = p.items.find(x => x[valueProp] === value);\r\n if (item !== undefined) {\r\n selectedItems.push(item);\r\n } else {\r\n selectedItems.push({ [p.valueProp]: value });\r\n }\r\n }\r\n\r\n p.selectedValues = selectedValues;\r\n p.selectedItems = selectedItems;\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n\r\n this._updateListItems();\r\n this._scheduleSync('full');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Returns the count of selected values\r\n * @public\r\n * @returns {number}\r\n */\r\n getSelectedValueCount() {\r\n const p = this._p;\r\n return p.selectedValues.length;\r\n }\r\n\r\n /**\r\n * Returns an array of selected items\r\n * @public\r\n * @returns {Array.<Object>}\r\n */\r\n getSelectedItems() {\r\n const p = this._p;\r\n return p.selectedItems.slice(0);\r\n }\r\n\r\n /**\r\n * Sets the specified items to \"checked\" mode.\r\n * An array of items is passed, not values, because we need to keep track if items,\r\n * and if we already have the array of items then this spares the process of searching for the items by values.\r\n * @public\r\n * @param {DropList.ItemBase[]} items - an array of *items* to select (not values)\r\n * @returns {SelectBox}\r\n */\r\n setSelectedItems(items) {\r\n this._setSelectedItems(items);\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {SelectBox}\r\n */\r\n openList() {\r\n const p = this._p;\r\n\r\n if (p.dropList.isVisible())\r\n return this;\r\n\r\n if (p.isLoadingMode && p.items.length === 0)\r\n return this;\r\n\r\n this._trigger('open:before', { list: p.dropList });\r\n\r\n p.dropList.show(this._getDropListPositionOptions());\r\n this._repositionDropList();\r\n\r\n // Another one in case the droplist position messed with screen layout.\r\n // If the out element's bounds stayed the same - nothing will be recalculated.\r\n // So this is *not* expensive.\r\n this._repositionDropList();\r\n\r\n if (p.dropList.hasFocusedItem()) {\r\n p.dropList.setFocusedItemAtIndex(p.dropList.getFocusedItemIndex());\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {SelectBox}\r\n */\r\n closeList() {\r\n const p = this._p;\r\n\r\n if (this[DestroyedSymbol])\r\n return this;\r\n\r\n if (!p.dropList.isVisible())\r\n return this;\r\n\r\n p.dropList.hide();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {boolean} [open]\r\n * @returns {SelectBox}\r\n */\r\n toggleList(open) {\r\n const p = this._p;\r\n\r\n let shouldOpen = open === undefined ? !p.dropList.isVisible() : !!open;\r\n\r\n if (shouldOpen)\r\n return this.openList();\r\n else return this.closeList();\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n isListOpen() {\r\n return !!this._p.dropListVisible;\r\n }\r\n\r\n /**\r\n * @param {boolean} [on]\r\n * @returns {SelectBox}\r\n */\r\n toggleLoading(on) {\r\n return this.setIsLoadingMode(on === undefined ? !this.getIsLoadingMode() : !!on);\r\n }\r\n\r\n /**\r\n * @param {boolean} isLoadingMode\r\n * @returns {SelectBox}\r\n */\r\n setIsLoadingMode(isLoadingMode) {\r\n const p = this._p;\r\n\r\n isLoadingMode = isLoadingMode === undefined ? true : !!isLoadingMode;\r\n\r\n if (p.isLoadingMode === isLoadingMode)\r\n return this;\r\n\r\n p.isLoadingMode = isLoadingMode;\r\n\r\n if (p.isLoadingMode && p.items.length === 0 && this.isListOpen()) {\r\n this.closeList();\r\n } else if (!p.isLoadingMode && document.activeElement &&\r\n ((p.multi || p.searchable) && p.input.contains(document.activeElement) ||\r\n (!p.multi && !p.searchable) && p.el.contains(document.activeElement))) {\r\n this.openList();\r\n }\r\n\r\n this._scheduleSync();\r\n return this;\r\n }\r\n\r\n /**\r\n * @returns {boolean}\r\n */\r\n getIsLoadingMode() {\r\n return this._p.isLoadingMode;\r\n }\r\n\r\n /**\r\n * Can be called in case that the selectbox was attached to the dom late and has a weird size.\r\n * @returns {SelectBox}\r\n */\r\n\trefreshSize() {\r\n\t\tthis._resizeInput();\r\n\t\treturn this;\r\n\t}\r\n\r\n /** @private */\r\n _renderBase() {\r\n const p = this._p;\r\n\r\n if (!p.inputBackBuffer) {\r\n p.inputBackBuffer = createElement('span', {\r\n css: {\r\n position: 'absolute',\r\n zIndex: -1,\r\n left: 0,\r\n top: '-9999px',\r\n whiteSpace: 'pre',\r\n },\r\n });\r\n }\r\n\r\n if (!p.input) {\r\n p.inputWrapper = createElement('span',\r\n {\r\n class: `${p.baseClassName}__search_wrapper`,\r\n },\r\n p.input = createElement('input', {\r\n class: `${p.baseClassName}__search_field`,\r\n type: 'search',\r\n autocomplete: 'off',\r\n autocorrect: 'off',\r\n autocapitalize: 'off',\r\n spellcheck: 'false',\r\n role: 'textbox',\r\n 'aria-autocomplete': 'list',\r\n readOnly: !(p.searchable || p.multi),\r\n }),\r\n );\r\n }\r\n\r\n if (p.multi) {\r\n if (p.singleWrapper) {\r\n this._cleanupSingleWrapper();\r\n remove(p.singleWrapper);\r\n delete p.singleWrapper;\r\n }\r\n\r\n if (!p.list) {\r\n // Moving `inputWrapper` to a new parent may cause a 'blur' event, and an unwanted chain reaction!\r\n // So we're unregistering those events here.\r\n this._unregisterDropdownEvents();\r\n\r\n // Restore focus to this one later if we affected it\r\n const lastActiveElement = document.activeElement;\r\n\r\n p.list = createElement('ul', {\r\n class: `${p.baseClassName}__list`,\r\n });\r\n p.el.appendChild(p.list);\r\n p.list.appendChild(p.inputWrapper);\r\n p.el.classList.remove(`${p.baseClassName}__single`);\r\n p.el.classList.add(`${p.baseClassName}__multi`);\r\n\r\n // Hook clear and remove\r\n p.sink\r\n .add(p.list, 'click', (evt) => {\r\n if (!closestUntil(evt.target, `.${p.baseClassName}__item_remove`, evt.currentTarget))\r\n return;\r\n\r\n if (p.disabled) return;\r\n\r\n this._removeMultiItemFromEvent(\r\n /**@type Element*/\r\n closestUntil(evt.target, `.${p.baseClassName}__item`, evt.currentTarget),\r\n evt);\r\n })\r\n .add(p.list, 'keydown', (/**KeyboardEvent*/evt) => {\r\n if (!closestUntil(evt.target, `.${p.baseClassName}__item`, evt.currentTarget))\r\n return;\r\n\r\n this._handleMultiKeydown(evt);\r\n });\r\n\r\n if (lastActiveElement === p.input)\r\n p.input.focus();\r\n\r\n this._registerDropdownEvents();\r\n }\r\n } else {\r\n if (p.list) {\r\n remove(p.list);\r\n p.sink.remove(p.list);\r\n delete p.list;\r\n }\r\n\r\n if (!p.singleWrapper) {\r\n // Moving `inputWrapper` to a new parent may cause a 'blur' event, and an unwanted chain reaction!\r\n // So we're unregistering those events here.\r\n this._unregisterDropdownEvents();\r\n\r\n // Restore focus to this one later if we affected it\r\n const lastActiveElement = document.activeElement;\r\n\r\n p.singleWrapper = createElement('div', {\r\n class: `${p.baseClassName}__single_wrapper`,\r\n });\r\n p.el.appendChild(p.singleWrapper);\r\n p.el.appendChild(p.inputWrapper);\r\n p.el.classList.remove(`${p.baseClassName}__multi`);\r\n p.el.classList.add(`${p.baseClassName}__single`);\r\n\r\n if (lastActiveElement === p.input)\r\n p.input.focus();\r\n\r\n this._registerDropdownEvents();\r\n }\r\n }\r\n\r\n if (p.hasOpenIndicator !== !!p.openIndicator) {\r\n if (p.hasOpenIndicator) {\r\n p.openIndicator = createElement('span', { class: `${p.baseClassName}__open_indicator` });\r\n p.el.appendChild(p.openIndicator);\r\n } else {\r\n remove(p.openIndicator);\r\n delete p.openIndicator;\r\n p.el.classList.remove(`${p.baseClassName}__has_open_indicator`);\r\n }\r\n }\r\n\r\n if (p.isLoadingMode !== !!p.spinner) {\r\n if (p.isLoadingMode) {\r\n p.spinner = createElement('span', { class: `${p.baseClassName}__spinner` });\r\n p.el.appendChild(p.spinner);\r\n p.el.classList.add(`${p.baseClassName}__has_spinner`);\r\n } else {\r\n remove(p.spinner);\r\n delete p.spinner;\r\n p.el.classList.remove(`${p.baseClassName}__has_spinner`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _syncBaseClasses() {\r\n const p = this._p, el = p.el;\r\n\r\n if (!el)\r\n return;\r\n\r\n let classes = [p.baseClassName];\r\n\r\n if (p.multi)\r\n classes.push(`${p.baseClassName}__multi`);\r\n else classes.push(`${p.baseClassName}__single`);\r\n\r\n if (this.isListOpen())\r\n classes.push(`${p.baseClassName}__open_list`);\r\n else classes.push(`${p.baseClassName}__closed_list`);\r\n\r\n if (p.hasOpenIndicator)\r\n classes.push(`${p.baseClassName}__has_open_indicator`);\r\n\r\n if (p.clearButtonWrapper)\r\n classes.push(`${p.baseClassName}__has_clear`);\r\n\r\n if (p.isLoadingMode)\r\n classes.push(`${p.baseClassName}__has_spinner`);\r\n\r\n if (p.selectedValues.length === 0)\r\n classes.push(`${p.baseClassName}__empty_selection`);\r\n\r\n if (p.selectedValues.length > 0)\r\n classes.push(`${p.baseClassName}__has_selection`);\r\n\r\n if (p.searchable || p.multi)\r\n classes.push(`${p.baseClassName}__searchable`);\r\n\r\n if (p.additionalClasses) {\r\n classes = classes.concat(p.additionalClasses);\r\n }\r\n\r\n el.className = classes.join(' ');\r\n }\r\n\r\n /** @private */\r\n _setupDropdownMenu() {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (p.dropList) {\r\n p.dropList.destroy();\r\n delete p.dropList;\r\n p.itemsChanged = true;\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n }\r\n\r\n const renderNoResultsItem = p.renderNoResultsItem;\r\n const unrenderNoResultsItem = p.unrenderNoResultsItem;\r\n const customRenderItem = (p.listOptions || {}).renderItem;\r\n const customUnrenderItem = (p.listOptions || {}).unrenderItem;\r\n\r\n const renderItem = (renderNoResultsItem || customRenderItem) ? (item, itemEl) => {\r\n if (item && item[valueProp] === NoResultsItemSymbol) {\r\n if (renderNoResultsItem && renderNoResultsItem(item, itemEl) !== false) {\r\n return true;\r\n }\r\n\r\n itemEl.appendChild(createElement('div', {\r\n class: 'droplist-no-results-content',\r\n textContent: p.noResultsText,\r\n }));\r\n return true;\r\n } else {\r\n if (customRenderItem)\r\n return customRenderItem(item, itemEl);\r\n }\r\n return false;\r\n } : null;\r\n\r\n const unrenderItem = (unrenderNoResultsItem || customRenderItem) ? (item, itemEl) => {\r\n if (item && item[valueProp] === NoResultsItemSymbol) {\r\n if (unrenderNoResultsItem)\r\n return unrenderNoResultsItem(item, itemEl);\r\n } else {\r\n if (customUnrenderItem)\r\n return customUnrenderItem(item, itemEl);\r\n }\r\n return false;\r\n } : null;\r\n\r\n const dropList = p.dropList = new DropList({\r\n virtualMinItems: 10,\r\n\r\n ...p.listOptions,\r\n\r\n renderItem: renderItem,\r\n unrenderItem: unrenderItem,\r\n\r\n multi: p.multi,\r\n capturesFocus: false,\r\n\r\n labelProp: p.labelProp,\r\n valueProp: p.valueProp,\r\n\r\n on: (name, event) => {\r\n switch (name) {\r\n case 'show:before': {\r\n p.dropListVisible = true;\r\n p.el.setAttribute('aria-expanded', 'true');\r\n p.el.classList.add(`${p.baseClassName}__open_list`);\r\n p.el.classList.remove(`${p.baseClassName}__closed_list`);\r\n\r\n if (p.resortBySelectionNeeded && (p.sortListCheckedFirst && p.multi))\r\n p.itemsChanged = true;\r\n\r\n this._updateListItems();\r\n this._trigger('open', { list: dropList });\r\n\r\n this._startTrackingPresence();\r\n\r\n p.sink.add(window, 'resize.trackposition', () => this._repositionDropList());\r\n\r\n let parent = p.el.parentNode;\r\n while (parent) {\r\n if (parent.scrollHeight > parent.offsetHeight ||\r\n parent.scrollWidth > parent.offsetWidth) {\r\n if (parent === document.documentElement) {\r\n parent = window;\r\n }\r\n p.sink.add(parent, 'scroll.trackposition', () => this._repositionDropList());\r\n }\r\n parent = parent.parentNode;\r\n }\r\n }\r\n break;\r\n\r\n case 'hide': {\r\n p.dropListVisible = false;\r\n p.el.setAttribute('aria-expanded', 'false');\r\n p.el.classList.remove(`${p.baseClassName}__open_list`);\r\n p.el.classList.add(`${p.baseClassName}__closed_list`);\r\n\r\n if (!p.multi) {\r\n this._setInputText('');\r\n this._scheduleSync();\r\n }\r\n\r\n this._trigger('close');\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n this._stopTrackingPresence();\r\n p.sink.remove(null, '.trackposition');\r\n }\r\n break;\r\n\r\n case 'check': {\r\n if (!p.multi) return;\r\n\r\n const item = /**@type DropList.Item*/event.item;\r\n const value = event.value;\r\n\r\n let checked = item._checked;\r\n if (item._group) return; // Ignore groups\r\n\r\n let selEvt = { value: value, item: item, cancel: false };\r\n this._trigger((checked ? 'addsel' : 'removesel') + ':before', selEvt);\r\n\r\n if (selEvt.cancel) {\r\n // Rollback that check\r\n p.dropList.setItemChecked(value, !checked);\r\n return;\r\n }\r\n\r\n if (checked) {\r\n p.selectedItems.push(item);\r\n p.selectedValues.push(value);\r\n } else {\r\n const idx = p.selectedValues.indexOf(value);\r\n if (idx !== -1) {\r\n p.selectedItems.splice(idx, 1);\r\n p.selectedValues.splice(idx, 1);\r\n }\r\n }\r\n\r\n // If we are in context of group, then there are lots of syncs coming, so do not do it now\r\n const hasGroupSync = !!event.isCheckingGroup;\r\n\r\n if (p.showSelection) {\r\n if (checked) {\r\n if (dropList.itemCount() === 1) {\r\n this._setInputText('');\r\n }\r\n\r\n if (p.sortSelectedItems) {\r\n if (!hasGroupSync)\r\n this._scheduleSync('full');\r\n } else {\r\n if (p.maxMultiItems != null &&\r\n p.selectedItems.filter(x => !x._group).length > p.maxMultiItems) {\r\n this._scheduleSync('addOrUpdateMultiItemRestElement');\r\n } else {\r\n this._scheduleSync('addMultiItemElement', item);\r\n }\r\n\r\n if (!hasGroupSync)\r\n this._scheduleSync();\r\n }\r\n } else {\r\n if (p.maxMultiItems != null &&\r\n p.selectedItems.filter(x => !x._group).length === p.maxMultiItems) {\r\n this._scheduleSync('removeMultiItemRestElement');\r\n } else {\r\n this._scheduleSync('removeMultiItemElement', item);\r\n }\r\n\r\n if (!hasGroupSync)\r\n this._scheduleSync();\r\n }\r\n }\r\n\r\n this._trigger(checked ? 'addsel' : 'removesel', { value: value, item: item });\r\n }\r\n break;\r\n\r\n case 'groupcheck': {\r\n if (!p.multi) return;\r\n\r\n if (event.affectedItems) {\r\n this._scheduleSync(p.sortSelectedItems ? 'full' : null);\r\n }\r\n }\r\n break;\r\n\r\n case 'select': {\r\n if (p.multi) return;\r\n\r\n const item = event.item;\r\n const value = event.value;\r\n\r\n let selectEvt = { value: value, item: item, cancel: false };\r\n this._trigger('select:before', selectEvt);\r\n\r\n if (selectEvt.cancel)\r\n return;\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n this._setSelectedItems([item]);\r\n this._trigger('select', { value: value, item: item });\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n this.closeList();\r\n\r\n if (p.blurOnSingleSelection === 'touch' && hasTouchCapability ||\r\n p.blurOnSingleSelection !== 'touch' && p.blurOnSingleSelection) {\r\n p.input && p.input.blur();\r\n }\r\n }\r\n break;\r\n }\r\n },\r\n });\r\n\r\n this._registerDropdownEvents();\r\n }\r\n\r\n _unregisterDropdownEvents() {\r\n const p = this._p;\r\n\r\n p.sink.remove(null, '.dropdown');\r\n }\r\n\r\n _registerDropdownEvents() {\r\n const p = this._p;\r\n\r\n this._unregisterDropdownEvents();\r\n\r\n const dropList = p.dropList;\r\n if (!dropList) return;\r\n\r\n let avoidToggleFromClick = false,\r\n currentTouchId = null,\r\n suppressKeyPress = false,\r\n suppressKeyPressRepeat = false;\r\n\r\n const keyEventsTarget = p.multi || p.searchable ? p.input : p.el;\r\n\r\n p.sink\r\n .add(keyEventsTarget, 'keydown.dropdown', evt => {\r\n if ((/**@type HTMLInputElement*/evt.currentTarget).readOnly)\r\n return;\r\n\r\n suppressKeyPress = false;\r\n suppressKeyPressRepeat = false;\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n case VALUE_PAGE_DOWN:\r\n case VALUE_UP:\r\n case VALUE_DOWN:\r\n suppressKeyPress = true;\r\n evt.preventDefault();\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n dropList.previousPage(evt);\r\n break;\r\n case VALUE_PAGE_DOWN:\r\n dropList.nextPage(evt);\r\n break;\r\n case VALUE_UP:\r\n dropList.previous(evt);\r\n break;\r\n case VALUE_DOWN:\r\n dropList.next(evt);\r\n break;\r\n\r\n }\r\n break;\r\n\r\n case VALUE_SPACE:\r\n if (p.lastKeyAllowsSpaceToggle) {\r\n if (dropList.hasFocusedItem()) {\r\n suppressKeyPress = true;\r\n suppressKeyPressRepeat = true;\r\n if (p.multi)\r\n dropList.toggleFocusedItem(evt);\r\n else dropList.triggerItemSelection(evt);\r\n evt.preventDefault();\r\n }\r\n }\r\n break;\r\n\r\n case VALUE_ENTER:\r\n if (dropList.isVisible() && dropList.hasFocusedItem()) {\r\n suppressKeyPress = true;\r\n suppressKeyPressRepeat = true;\r\n evt.preventDefault();\r\n dropList.triggerItemSelection(evt);\r\n }\r\n\r\n break;\r\n\r\n case VALUE_TAB:\r\n if (dropList.hasFocusedItem()) {\r\n dropList.triggerItemSelection(evt);\r\n }\r\n break;\r\n\r\n case VALUE_ESCAPE:\r\n if (dropList.isVisible()) {\r\n dropList.hide(evt);\r\n evt.preventDefault();\r\n }\r\n break;\r\n\r\n default:\r\n suppressKeyPressRepeat = true;\r\n dropList._keydownFreeType(evt);\r\n break;\r\n }\r\n\r\n p.lastKeyAllowsSpaceToggle = evt.key === VALUE_UP ||\r\n evt.key === VALUE_DOWN ||\r\n evt.key === VALUE_PAGE_UP ||\r\n evt.key === VALUE_PAGE_DOWN ||\r\n (evt.key === VALUE_SPACE && !!p.lastKeyAllowsSpaceToggle);\r\n })\r\n .add(keyEventsTarget, 'keypress.dropdown', evt => {\r\n if (suppressKeyPress) {\r\n suppressKeyPress = false;\r\n evt.preventDefault();\r\n return;\r\n }\r\n\r\n if (suppressKeyPressRepeat)\r\n return;\r\n\r\n if (evt.key === VALUE_ENTER ||\r\n (\r\n evt.key === VALUE_SPACE &&\r\n p.lastKeyAllowsSpaceToggle &&\r\n !p.multi &&\r\n !dropList.hasFocusedItem()\r\n )\r\n ) {\r\n this.toggleList();\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n return;\r\n }\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n case VALUE_PAGE_DOWN:\r\n case VALUE_UP:\r\n case VALUE_DOWN:\r\n evt.preventDefault();\r\n\r\n switch (evt.key) {\r\n case VALUE_PAGE_UP:\r\n dropList.previousPage(evt);\r\n break;\r\n case VALUE_PAGE_DOWN:\r\n dropList.nextPage(evt);\r\n break;\r\n case VALUE_UP:\r\n dropList.previous(evt);\r\n break;\r\n case VALUE_DOWN:\r\n dropList.next(evt);\r\n break;\r\n\r\n }\r\n break;\r\n }\r\n });\r\n\r\n if (p.input) {\r\n p.sink\r\n .add(p.input, 'input.dropdown', () => {\r\n p.filterTerm = p.input.value.trim();\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n\r\n this._trigger('search', { value: p.input.value });\r\n\r\n p.throttledUpdateListItems();\r\n })\r\n .add(p.input, 'click.dropdown', () => {\r\n if (!p.multi && p.searchable) {\r\n this.openList();\r\n }\r\n })\r\n .add(p.input, 'focus.dropdown', () => {\r\n this._trigger('search:focus');\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n avoidToggleFromClick = false;\r\n this.openList();\r\n\r\n avoidToggleFromClick = true;\r\n setTimeout(() => { avoidToggleFromClick = false; }, 10);\r\n })\r\n .add(p.input, 'blur.dropdown', () => {\r\n this._trigger('search:blur');\r\n\r\n if (this[DestroyedSymbol]) return; // destroyed by event handler\r\n\r\n if (p.throttledUpdateListItems)\r\n p.throttledUpdateListItems.cancel();\r\n\r\n this.closeList();\r\n });\r\n }\r\n\r\n p.sink\r\n .add(p.el, 'mousedown.dropdown', () => {\r\n if (!p.multi && !p.searchable && !avoidToggleFromClick) {\r\n this.toggleList();\r\n }\r\n avoidToggleFromClick = false;\r\n })\r\n .add(p.el, 'touchstart.dropdown', evt => {\r\n if (currentTouchId) return;\r\n currentTouchId = evt.changedTouches[0].identifier;\r\n\r\n if (this.isDisabled())\r\n return;\r\n\r\n if (closestUntil(evt.target, `.${p.baseClassName}__item,.${p.baseClassName}__clear`, p.el))\r\n return;\r\n\r\n let onTouchCancel = () => {\r\n currentTouchId = null;\r\n p.sink.remove(p.el, '.dropdown_touchextra');\r\n };\r\n\r\n (p.input || p.el).focus();\r\n\r\n p.sink\r\n .add(p.el, 'touchend.dropdown_touchextra', (tevt) => {\r\n let touch = Array.prototype.find.call(evt.changedTouches,\r\n touch => touch.identifier === currentTouchId);\r\n if (!touch) return onTouchCancel();\r\n\r\n tevt.preventDefault();\r\n onTouchCancel();\r\n })\r\n .add(p.el, 'touchmove.dropdown_touchextra', (tevt) => {\r\n tevt.preventDefault();\r\n })\r\n .add(p.el, 'touchcancel.dropdown_touchextra', onTouchCancel);\r\n });\r\n }\r\n\r\n /** @private */\r\n _updateListItems() {\r\n const p = this._p;\r\n\r\n const dropList = p.dropList;\r\n if (!dropList || !p.dropListVisible)\r\n return;\r\n\r\n // For every search change, filteredItems is cleared.\r\n // If it's non-null here, then it means we have an extra call to _updateListItems, and not need to refilter.\r\n if (!p.filteredItems && (p.filterTerm || (p.filterOnEmptyTerm && p.filterFn))) {\r\n this._refilterItems();\r\n }\r\n\r\n if (p.itemsChanged || p.selectionChanged) {\r\n p.dropList._lastSerializedBox = null;\r\n }\r\n\r\n if (p.itemsChanged) {\r\n let items = p.filteredItems || p.items;\r\n if (p.sortListItems || (p.sortListCheckedFirst && p.multi)) {\r\n items = this._sortItems(items,\r\n p.sortListItems,\r\n p.sortListCheckedFirst && p.multi,\r\n p.splitListCheckedGroups);\r\n }\r\n dropList.removeAllItems();\r\n\r\n if (items.length === 0 && p.noResultsText) {\r\n items = [{\r\n [p.labelProp]: p.noResultsText,\r\n [p.valueProp]: NoResultsItemSymbol,\r\n _nointeraction: true,\r\n _nocheck: true,\r\n }];\r\n }\r\n\r\n dropList.addItems(items);\r\n p.itemsChanged = false;\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = false;\r\n }\r\n\r\n let hasRefocusedItem = false;\r\n\r\n if (p.selectionChanged) {\r\n if (p.multi) {\r\n p.dropList.setCheckedValues(p.selectedValues);\r\n } else {\r\n const singleItemIndex = p.dropList.itemIndexByValue(this.getValue());\r\n\r\n p.dropList\r\n .setFocusedItemAtIndex(singleItemIndex)\r\n .setSingleSelectedItemAtIndex(singleItemIndex);\r\n\r\n hasRefocusedItem = p.dropList.hasFocusedItem();\r\n }\r\n p.selectionChanged = false;\r\n }\r\n\r\n this._repositionDropList();\r\n\r\n if (hasRefocusedItem) {\r\n p.dropList.setFocusedItemAtIndex(p.dropList.getFocusedItemIndex());\r\n }\r\n }\r\n\r\n _refilterItems() {\r\n const p = this._p;\r\n\r\n const term = p.filterTerm;\r\n\r\n if (term || (p.filterOnEmptyTerm && p.filterFn)) {\r\n let fn = p.filterFn;\r\n\r\n let filteredItems;\r\n\r\n if (typeof fn === 'function') {\r\n filteredItems = p.filterFn(p.items, term);\r\n }\r\n\r\n // If there was no filter function, or it gave up on filtering.\r\n if (!Array.isArray(filteredItems)) {\r\n if (term) {\r\n const matcher = new RegExp(escapeRegex(term), 'i');\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n\r\n filteredItems = p.items.filter(x => {\r\n if (x._group) return true;\r\n return matcher.test(x[labelProp] || x[multiItemLabelProp]);\r\n });\r\n } else {\r\n filteredItems = null;\r\n }\r\n }\r\n\r\n p.filteredItems = filteredItems;\r\n\r\n if (filteredItems) {\r\n // Clean up groups without children\r\n\r\n let lastGroup = -1;\r\n let len = filteredItems.length;\r\n\r\n for (let i = 0; i < len; i++) {\r\n let item = filteredItems[i];\r\n\r\n if (item._group) {\r\n if (lastGroup !== -1 && lastGroup === i - 1) {\r\n // It was an empty group\r\n filteredItems.splice(lastGroup, 1);\r\n i--;\r\n len--;\r\n }\r\n\r\n lastGroup = i;\r\n }\r\n }\r\n\r\n if (lastGroup !== -1) {\r\n if (lastGroup === len - 1) {\r\n // It was an empty group\r\n filteredItems.splice(lastGroup, 1);\r\n }\r\n }\r\n }\r\n } else {\r\n p.filteredItems = null;\r\n }\r\n\r\n this._trigger('itemschanged', { term: term, mutated: false, count: this.getFilteredItemCount() });\r\n\r\n p.itemsChanged = true;\r\n }\r\n\r\n _setSelectedItems(items) {\r\n const p = this._p, valueProp = p.valueProp;\r\n\r\n if (p.multi) {\r\n p.selectedItems = items.filter(x => x[valueProp] !== undefined);\r\n p.selectedValues = p.selectedItems.map(x => x[valueProp]);\r\n } else {\r\n p.selectedItems = items.slice(0, 1);\r\n p.selectedValues = items.slice(0, 1).map(x => x[valueProp]);\r\n }\r\n\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n\r\n this._updateListItems();\r\n this._scheduleSync('full');\r\n }\r\n\r\n _scheduleSync(mode, data) {\r\n const p = this._p;\r\n\r\n if (!p.syncQueue)\r\n p.syncQueue = [];\r\n\r\n if (mode === 'full')\r\n p.syncQueue.length = 0;\r\n\r\n if (p.syncQueue.length === 0 || p.syncQueue[0].mode !== 'full')\r\n p.syncQueue.push({ mode: mode, data: data });\r\n\r\n if (p.syncTimeout)\r\n return;\r\n\r\n p.syncTimeout = setTimeout(() => {\r\n delete p.syncTimeout;\r\n let queue = p.syncQueue;\r\n delete p.syncQueue;\r\n this._performSync(queue);\r\n });\r\n }\r\n\r\n _performSync(queue) {\r\n const p = this._p;\r\n\r\n if (this[DestroyedSymbol])\r\n return;\r\n\r\n for (let op of queue) {\r\n switch (op.mode) {\r\n case 'full':\r\n this._syncFull(true);\r\n break;\r\n\r\n case 'singleItem':\r\n this._syncSingleItem();\r\n break;\r\n\r\n case 'removeMultiItemElement': {\r\n if (p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n const valueProp = p.valueProp;\r\n const item = op.data,\r\n value = item[valueProp];\r\n\r\n let idx = p.multiItemEls.findIndex(x => x[ItemSymbol][valueProp] === value);\r\n if (idx !== -1) {\r\n this._removeMultiItemElementByIndex(idx);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case 'addMultiItemElement': {\r\n if (!p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n this._addMultiItemElement(op.data);\r\n }\r\n }\r\n break;\r\n\r\n case 'addOrUpdateMultiItemRestElement': {\r\n if (!p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n this._addMultiItemRestElement();\r\n }\r\n }\r\n break;\r\n\r\n case 'removeMultiItemRestElement': {\r\n if (!p.showSelection) {\r\n this._syncPlaceholder();\r\n } else {\r\n let itemEl = p.multiItemEls[p.multiItemEls.length - 1];\r\n if (itemEl?.[ItemSymbol]?.[p.valueProp] === RestMultiItemsSymbol) {\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case 'resize_input': {\r\n this._resizeInput();\r\n }\r\n break;\r\n\r\n default:\r\n this._syncFull(false);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n _cleanupSingleWrapper() {\r\n const p = this._p;\r\n\r\n if (!p.singleWrapper) return;\r\n\r\n if (p.unrenderSingleItem && p.singleWrapper.childNodes.length > 0) {\r\n try {\r\n p.unrenderSingleItem(p.singleWrapper[ItemSymbol], p.singleWrapper);\r\n } catch (err) { console.error(err); } // eslint-disable-line no-console\r\n }\r\n\r\n delete p.singleWrapper[ItemSymbol];\r\n p.singleWrapper.innerHTML = '';\r\n }\r\n\r\n /**\r\n * @param {number} index\r\n * @private\r\n */\r\n _removeMultiItemElementByIndex(index) {\r\n const p = this._p, multiItemEls = p.multiItemEls;\r\n\r\n if (multiItemEls.length > index) {\r\n const itemEl = multiItemEls[index];\r\n const item = itemEl[ItemSymbol];\r\n\r\n let unrender = item?.[p.valueProp] === RestMultiItemsSymbol\r\n ? p.unrenderRestMultiItem ?? p.unrenderMultiItem\r\n : p.unrenderMultiItem;\r\n\r\n if (unrender && itemEl.childNodes.length > 0) {\r\n try {\r\n unrender(item, itemEl);\r\n } catch (err) { console.error(err); } // eslint-disable-line no-console\r\n }\r\n remove(itemEl);\r\n\r\n // fastpath\r\n if (index === multiItemEls.length - 1) multiItemEls.pop();\r\n else multiItemEls.splice(index, 1);\r\n }\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @private\r\n */\r\n _renderSingleItemContent(item) {\r\n const p = this._p;\r\n\r\n if (!p.renderSingleItem || p.renderSingleItem(item, p.singleWrapper) === false) {\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n\r\n let label = item[multiItemLabelProp] || item[labelProp];\r\n if (label === null || label === undefined)\r\n label = '';\r\n\r\n p.singleWrapper.appendChild(document.createTextNode(label));\r\n }\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @param {Element} itemEl\r\n * @private\r\n */\r\n _renderMultiItemContent(item, itemEl) {\r\n const p = this._p;\r\n\r\n let render = item[p.valueProp] === RestMultiItemsSymbol\r\n ? p.renderRestMultiItem ?? p.renderMultiItem\r\n : p.renderMultiItem;\r\n\r\n if (!render || render(item, itemEl) === false) {\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n const label = item[multiItemLabelProp] || item[labelProp];\r\n itemEl.appendChild(createElement('span', {\r\n textContent: label,\r\n }));\r\n }\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @private\r\n */\r\n _addMultiItemElement(item) {\r\n const p = this._p;\r\n const itemEl = this._renderMultiItem(item);\r\n if (!itemEl) return;\r\n\r\n before(p.inputWrapper, itemEl);\r\n p.multiItemEls.push(itemEl);\r\n }\r\n\r\n /** @private */\r\n _addMultiItemRestElement() {\r\n const p = this._p;\r\n\r\n let items = p.selectedItems.slice(0);\r\n let count = items.filter(x => !x._group).length - p.maxMultiItems;\r\n let label = p.multiItemsRestLabelProvider\r\n ? p.multiItemsRestLabelProvider(count, items)\r\n : `+ ${count}`;\r\n\r\n this._addMultiItemElement({\r\n items: items,\r\n [p.valueProp]: RestMultiItemsSymbol,\r\n [p.labelProp]: label,\r\n });\r\n }\r\n\r\n /** @private */\r\n _syncClearButton() {\r\n const p = this._p;\r\n\r\n // Set clear button\r\n if (p.selectedItems.length > 0 && p.clearable && p.showSelection) {\r\n if (!p.clearButtonWrapper) {\r\n p.clearButtonWrapper = createElement(\r\n p.multi ? 'li' : 'span',\r\n { class: `${p.baseClassName}__clear` },\r\n p.clearButton = createElement('button'));\r\n if (p.multi)\r\n append(p.list, p.clearButtonWrapper);\r\n else append(p.el, p.clearButtonWrapper);\r\n p.el.classList.add(`${p.baseClassName}__has_clear`);\r\n\r\n p.sink.add(p.clearButton, 'click', () => {\r\n if (this.isDisabled()) return;\r\n this.clear();\r\n });\r\n }\r\n } else {\r\n if (p.clearButtonWrapper) {\r\n p.sink.remove(p.clearButton, 'click');\r\n\r\n remove(p.clearButtonWrapper);\r\n delete p.clearButtonWrapper;\r\n delete p.clearButton;\r\n p.el.classList.remove(`${p.baseClassName}__has_clear`);\r\n }\r\n }\r\n }\r\n\r\n /** @private */\r\n _syncPlaceholder() {\r\n const p = this._p;\r\n\r\n let placeholder = '';\r\n\r\n if (p.multi && !p.showSelection) {\r\n if (typeof p.multiPlaceholderFormatter === 'function') {\r\n placeholder = p.multiPlaceholderFormatter(p.selectedItems);\r\n } else {\r\n placeholder = defaultMultiPlaceholderFormatter(p.selectedItems, p.labelProp);\r\n }\r\n } else if (p.selectedItems.length === 0 || !p.showSelection) {\r\n placeholder = p.placeholder == null ? '' : (p.placeholder + '');\r\n }\r\n\r\n // Set input placeholder\r\n p.input.setAttribute('placeholder', placeholder);\r\n }\r\n\r\n /** @private */\r\n _syncSingleItem() {\r\n const p = this._p;\r\n\r\n if (p.singleWrapper)\r\n this._cleanupSingleWrapper();\r\n\r\n const items = p.selectedItems;\r\n\r\n if (items.length > 0) {\r\n this._renderSingleItemContent(items[0]);\r\n p.singleWrapper[ItemSymbol] = items[0];\r\n }\r\n }\r\n\r\n /**\r\n * Syncs render state, selected items, and position\r\n * @param {boolean=false} fullItemsRender Should re-render all items?\r\n * @returns {SelectBox}\r\n */\r\n _syncFull(fullItemsRender) {\r\n const p = this._p;\r\n\r\n this._renderBase();\r\n this._syncClearButton();\r\n this._syncPlaceholder();\r\n\r\n fullItemsRender = p.multi && p.showSelection && (fullItemsRender || p.selectedItems.length !== p.multiItemEls.length);\r\n\r\n if (fullItemsRender || !p.showSelection || !p.multi) {\r\n // Remove all item elements\r\n while (p.multiItemEls.length > 0) {\r\n // use fast path by removing in reverse\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n }\r\n }\r\n\r\n if (p.multi) {\r\n if (fullItemsRender) {\r\n const items = p.selectedItems;\r\n\r\n // Sort these\r\n if (p.sortSelectedItems) {\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp,\r\n valueProp = p.valueProp,\r\n stickyValues = p.stickyValues;\r\n\r\n const comparator = p.sortItemComparator || ((a, b) => {\r\n if (stickyValues !== null) {\r\n let sa = stickyValues.has(a[valueProp]);\r\n let sb = stickyValues.has(b[valueProp]);\r\n if (sa && !sb) return -1;\r\n if (!sa && sb) return 1;\r\n }\r\n\r\n const aLabel = a[multiItemLabelProp] || a[labelProp];\r\n const bLabel = b[multiItemLabelProp] || b[labelProp];\r\n return aLabel < bLabel ? -1 : (aLabel > bLabel ? 1 : 0);\r\n });\r\n\r\n items.sort(comparator);\r\n\r\n p.selectedValues = items.map(x => x[valueProp]);\r\n }\r\n\r\n let actualItemCount = 0;\r\n let max = p.maxMultiItems;\r\n let addRestItem = false;\r\n\r\n // Add item elements\r\n for (let i = 0; i < items.length; i++) {\r\n if (items[i]._group) continue;\r\n\r\n if (max != null && actualItemCount === max) {\r\n addRestItem = true;\r\n break;\r\n }\r\n\r\n actualItemCount++;\r\n this._addMultiItemElement(items[i]);\r\n }\r\n\r\n if (addRestItem) {\r\n this._addMultiItemRestElement();\r\n }\r\n }\r\n } else if (!p.multi) {\r\n this._syncSingleItem();\r\n }\r\n\r\n if (getRootNode(p.el) !== document)\r\n return this;\r\n\r\n toggleClass(p.el, `${p.baseClassName}__empty_selection`, p.selectedValues.length === 0);\r\n toggleClass(p.el, `${p.baseClassName}__has_selection`, p.selectedValues.length > 0);\r\n\r\n if (p.searchable || p.multi) {\r\n if (p.input) p.input.readOnly = false;\r\n p.el.classList.add(`${p.baseClassName}__searchable`);\r\n } else {\r\n if (p.input) p.input.readOnly = true;\r\n p.el.classList.remove(`${p.baseClassName}__searchable`);\r\n }\r\n\r\n // Update input size\r\n this._resizeInput()._updateListItems();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {string} event\r\n * @param {*} [data]\r\n * @private\r\n */\r\n _trigger(event, data) {\r\n const p = this._p;\r\n if (p.on)\r\n p.on(event, ...(data === undefined ? [] : [data]));\r\n }\r\n\r\n /**\r\n * Render a multi item\r\n * @param {Object} item\r\n * @returns {Element|null}\r\n * @private\r\n */\r\n _renderMultiItem(item) {\r\n const p = this._p;\r\n\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp;\r\n const label = item[multiItemLabelProp] ?? item[labelProp];\r\n if (label === false)\r\n return null;\r\n\r\n const itemEl = createElement('li',\r\n {\r\n class: `${p.baseClassName}__item`,\r\n tabindex: '0',\r\n title: label,\r\n },\r\n [\r\n createElement('span', {\r\n class: `${p.baseClassName}__item_remove`,\r\n role: 'presentation',\r\n }),\r\n ],\r\n );\r\n\r\n this._renderMultiItemContent(item, itemEl);\r\n\r\n itemEl[ItemSymbol] = item;\r\n\r\n return itemEl;\r\n }\r\n\r\n /**\r\n * Removes a specific multi item by user event\r\n * @param {Element} itemEl\r\n * @param {Event} originatingEvent\r\n * @returns {SelectBox}\r\n * @private\r\n */\r\n _removeMultiItemFromEvent(itemEl, originatingEvent) {\r\n const p = this._p;\r\n\r\n let nextFocus;\r\n if (/key/.test(originatingEvent.type)) {\r\n const kEvent = /**@type KeyboardEvent*/originatingEvent;\r\n if (kEvent.key === VALUE_DELETE) { // Delete\r\n nextFocus = next(itemEl, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n } else if (kEvent.key === VALUE_BACK_SPACE) { // Backspace\r\n nextFocus = prev(itemEl, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n }\r\n } else if (/click|mouse|touch/.test(originatingEvent.type)) {\r\n nextFocus = next(itemEl, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n }\r\n\r\n const item = itemEl[ItemSymbol], value = item[p.valueProp];\r\n\r\n if (item !== undefined) {\r\n if (value === RestMultiItemsSymbol) {\r\n let items = p.selectedItems.filter(x => !x._group).slice(p.maxMultiItems);\r\n let itemsToRemove = [];\r\n\r\n for (let item of items) {\r\n let removeselEvt = { value: value, item: item, cancel: false };\r\n this._trigger('removesel:before', removeselEvt);\r\n if (!removeselEvt.cancel)\r\n itemsToRemove.push(item);\r\n }\r\n\r\n if (itemsToRemove.length > 0) {\r\n this._removeMultiItemElementByIndex(p.multiItemEls.length - 1);\r\n\r\n for (let item of itemsToRemove) {\r\n // sync selection\r\n let idx = p.selectedItems.indexOf(item);\r\n if (idx === -1)\r\n idx = p.selectedValues.indexOf(value[p.valueProp]);\r\n if (idx !== -1) {\r\n p.selectedItems.splice(idx, 1);\r\n p.selectedValues.splice(idx, 1);\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n }\r\n }\r\n }\r\n\r\n if (items.length > itemsToRemove.length) {\r\n this._addMultiItemRestElement();\r\n }\r\n\r\n if (itemsToRemove.length > 0) {\r\n this._scheduleSync();\r\n }\r\n } else {\r\n let removeselEvt = { value: value, item: item, cancel: false };\r\n this._trigger('removesel:before', removeselEvt);\r\n if (removeselEvt.cancel)\r\n return this;\r\n\r\n this._removeMultiItem(item);\r\n\r\n // trigger event\r\n this._trigger('removesel', { value: value, item: item });\r\n }\r\n }\r\n\r\n if (!nextFocus) {\r\n nextFocus = p.el.querySelector(`.${p.baseClassName}__item, .${p.baseClassName}__search_field`);\r\n }\r\n\r\n if (hasClass(nextFocus, `${p.baseClassName}__search_wrapper`)) {\r\n nextFocus = nextFocus.querySelector('input');\r\n }\r\n\r\n nextFocus && nextFocus.focus();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {DropList.ItemBase} item\r\n * @param {boolean} [populate]\r\n * @private\r\n */\r\n _removeMultiItem(item, populate = false) {\r\n const p = this._p;\r\n const valueProp = p.valueProp,\r\n labelProp = p.labelProp;\r\n const value = item[valueProp];\r\n\r\n // sync selection\r\n let idx = p.selectedItems.indexOf(item);\r\n if (idx === -1)\r\n idx = p.selectedValues.indexOf(value);\r\n if (idx !== -1) {\r\n p.selectedItems.splice(idx, 1);\r\n p.selectedValues.splice(idx, 1);\r\n p.selectionChanged = true;\r\n p.resortBySelectionNeeded = true;\r\n }\r\n\r\n // sync multi item element\r\n idx = p.multiItemEls.findIndex(x => x[ItemSymbol] === item);\r\n if (idx === -1)\r\n idx = p.multiItemEls.findIndex(x => x[ItemSymbol][valueProp] === value);\r\n if (idx !== -1) {\r\n this._removeMultiItemElementByIndex(idx);\r\n }\r\n\r\n if (populate) {\r\n this._setInputText(item[p.multiItemLabelProp] || item[labelProp]);\r\n\r\n p.input.focus();\r\n\r\n // Go to end of input\r\n p.input.selectionStart = p.input.selectionEnd = p.input.value.length;\r\n }\r\n\r\n // sync\r\n this._scheduleSync();\r\n }\r\n\r\n /**\r\n * @param {*} value\r\n * @private\r\n */\r\n _setInputText(value) {\r\n const p = this._p;\r\n\r\n p.input.value = value == null ? '' : String(value);\r\n\r\n p.filterTerm = '';\r\n p.filteredItems = null;\r\n p.itemsChanged = true;\r\n }\r\n\r\n /**\r\n * Update input size to current state\r\n * @returns {SelectBox}\r\n * @private\r\n */\r\n _resizeInput() {\r\n const p = this._p;\r\n\r\n const input = p.input, backBufferEl = p.inputBackBuffer;\r\n\r\n let inputValue = input.value || input.placeholder;\r\n toggleClass(p.el, `${p.baseClassName}__has_input`, !!inputValue);\r\n toggleClass(p.el, `${p.baseClassName}__empty_input`, !inputValue);\r\n\r\n if (p.multi && p.multiItemEls.length === 0 && p.showSelection) {\r\n // Full width of list wrapper\r\n input.style.width = ''; // reset first\r\n\r\n let beforeWidth = 0, afterWidth = 0;\r\n\r\n let beforeStyle = getComputedStyle(p.list || p.el, '::before');\r\n if (beforeStyle.content &&\r\n beforeStyle.content !== 'none' &&\r\n beforeStyle.position !== 'absolute' &&\r\n beforeStyle.float !== 'none') {\r\n beforeWidth = getPseudoElementWidth(p.list || p.el, '::before', true, true, true);\r\n }\r\n\r\n let afterStyle = getComputedStyle(p.list || p.el, '::after');\r\n if (afterStyle.content &&\r\n afterStyle.content !== 'none' &&\r\n afterStyle.position !== 'absolute' &&\r\n afterStyle.float !== 'none') {\r\n afterWidth = getPseudoElementWidth(p.list || p.el, '::after', true, true, true);\r\n }\r\n\r\n let contentWidth = getElementWidth(p.list || p.el); // calculate width\r\n contentWidth -= beforeWidth + afterWidth;\r\n\r\n input.style.width = `${contentWidth}px`;\r\n } else {\r\n // Introduce backbuffer to DOM\r\n setCssProps(backBufferEl, getCssProps(input, inputBackbufferCssProps));\r\n backBufferEl.textContent = inputValue;\r\n p.el.appendChild(backBufferEl);\r\n\r\n // Measure these\r\n const computedStyle = getComputedStyle(input);\r\n const paddingTotal = (parseFloat(computedStyle.paddingLeft) || 0) + (parseFloat(computedStyle.paddingRight) || 0);\r\n const minWidth = (parseFloat(computedStyle['font-size']) || 0) * 0.75 + paddingTotal;\r\n const backBufferWidth = getElementWidth(backBufferEl, true, true);\r\n const currentWidth = getElementWidth(input, true, true);\r\n let newWidth = Math.max(backBufferWidth, minWidth);\r\n\r\n // Compare\r\n if (newWidth !== currentWidth) {\r\n // Update if needed\r\n setElementWidth(input, newWidth, true, true);\r\n\r\n let bordersWidth = (parseFloat(computedStyle.borderLeftWidth) || 0) + (parseFloat(computedStyle.borderRightWidth) || 0);\r\n let scrollWidth = input.scrollWidth + bordersWidth;\r\n\r\n if (scrollWidth > newWidth) {\r\n // consider scrollWidth delta\r\n let delta = scrollWidth - newWidth;\r\n input.style.width = `${parseFloat(input.style.width) + delta}px`;\r\n\r\n newWidth += delta;\r\n }\r\n\r\n // sync the single value wrapper.\r\n // it is meant as a preview or spacer for single selection value, so its appropriate to sync it with this width\r\n if (p.singleWrapper) {\r\n p.singleWrapper.style.width = '';\r\n\r\n if (inputValue) {\r\n let width = newWidth - paddingTotal - bordersWidth;\r\n if (getElementWidth(p.singleWrapper, false, false) < width) {\r\n setElementWidth(p.singleWrapper, width, false, false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Remove backbuffer from DOM\r\n remove(backBufferEl);\r\n }\r\n\r\n this._trigger('input:resize');\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Update autocomplete position if needed\r\n * @returns {SelectBox}\r\n * @private\r\n */\r\n _repositionDropList() {\r\n const p = this._p, el = p.el;\r\n\r\n if (!p.dropList || !p.dropListVisible || !p.dropList.isVisible())\r\n return this;\r\n\r\n const box = el.getBoundingClientRect();\r\n const serialized = box.left + ',' + box.top + ',' + box.right + ',' + box.bottom;\r\n\r\n if (p.dropList._lastSerializedBox !== serialized) {\r\n p.dropList.relayout(this._getDropListPositionOptions());\r\n p.dropList._lastSerializedBox = serialized;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {KeyboardEvent} event\r\n * @private\r\n */\r\n _handleInputKeydown(event) {\r\n const p = this._p;\r\n\r\n const target = (/**@type HTMLInputElement*/event.target);\r\n\r\n if (event.key === VALUE_BACK_SPACE && event.ctrlKey && target.value.length === 0) {\r\n this.clear();\r\n\r\n event.preventDefault();\r\n } else if (event.key === VALUE_BACK_SPACE && target.value.length === 0) {\r\n const itemEl = p.multiItemEls[p.multiItemEls.length - 1];\r\n if (!itemEl || itemEl[ItemSymbol].value === undefined)\r\n return;\r\n\r\n const item = itemEl[ItemSymbol], value = item[p.valueProp];\r\n\r\n let removeselEvt = { value: value, item: item, cancel: false };\r\n this._trigger('removesel:before', removeselEvt);\r\n if (removeselEvt.cancel)\r\n return;\r\n\r\n this._removeMultiItem(item, true);\r\n\r\n // trigger event\r\n this._trigger('removesel', { value: value, item: item });\r\n\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * @param {KeyboardEvent} event\r\n * @private\r\n */\r\n _handleMultiKeydown(event) {\r\n const p = this._p;\r\n\r\n if (p.disabled) return;\r\n\r\n const isRtl = getComputedStyle(p.el).direction === 'rtl';\r\n\r\n let nextFocus;\r\n\r\n if (event.key === (isRtl ? VALUE_LEFT : VALUE_RIGHT)) { // Next arrow\r\n nextFocus = next(/**@type Element*/event.target, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n if (hasClass(nextFocus, `${p.baseClassName}__search_wrapper`)) {\r\n nextFocus = nextFocus.querySelector('input');\r\n }\r\n nextFocus && nextFocus.focus();\r\n\r\n event.preventDefault();\r\n } else if (event.key === (isRtl ? VALUE_RIGHT : VALUE_LEFT)) { // Prev arrow\r\n nextFocus = prev(/**@type Element*/event.target, `.${p.baseClassName}__item,.${p.baseClassName}__search_wrapper`);\r\n if (hasClass(nextFocus, `${p.baseClassName}__search_wrapper`)) {\r\n nextFocus = nextFocus.querySelector('input');\r\n }\r\n nextFocus && nextFocus.focus();\r\n\r\n event.preventDefault();\r\n } else if (event.key === VALUE_BACK_SPACE && event.ctrlKey) { // Ctrl + Backspace\r\n const multiItemEls = [];\r\n let itemEl = event.target;\r\n while (itemEl) {\r\n multiItemEls.push(itemEl);\r\n itemEl = prev(/**@type Element*/itemEl, `.${p.baseClassName}__item`);\r\n }\r\n\r\n while (multiItemEls.length) {\r\n this._removeMultiItemFromEvent(multiItemEls.shift(), event);\r\n }\r\n\r\n event.preventDefault();\r\n } else if (event.key === VALUE_DELETE || event.key === VALUE_BACK_SPACE) { // Delete / Backspace\r\n this._removeMultiItemFromEvent(closestUntil(event.target, `.${p.baseClassName}__item`, p.el), event);\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * @returns {DropList.PositionOptions}\r\n * @private\r\n */\r\n _getDropListPositionOptions() {\r\n const p = this._p;\r\n\r\n return {\r\n target: /**@type Element*/p.el,\r\n offset: { x: 0, y: 0 },\r\n anchor: { x: 'start', y: 'bottom' },\r\n position: { x: 'start', y: 'top' },\r\n updateWidth: true,\r\n };\r\n }\r\n\r\n /** @private */\r\n _startTrackingPresence() {\r\n const p = this._p;\r\n\r\n this._stopTrackingPresence();\r\n\r\n p.presenceInt = setInterval(function () {\r\n if (getRootNode(p.el) !== document)\r\n this.hide();\r\n }, 200);\r\n }\r\n\r\n /** @private */\r\n _stopTrackingPresence() {\r\n const p = this._p;\r\n\r\n if (p.presenceInt) {\r\n clearInterval(p.presenceInt);\r\n p.presenceInt = null;\r\n }\r\n }\r\n\r\n /**\r\n * Handles sorting, and putting checked items first (according to selectedValues, not item.checked)\r\n * @private\r\n * @param {DropList.ItemBase[]} items\r\n * @param {boolean=false} sort\r\n * @param {boolean=false} sortCheckedFirst\r\n * @param {boolean=false} splitCheckedGroups\r\n * @returns {DropList.ItemBase[]}\r\n */\r\n _sortItems(items, sort, sortCheckedFirst, splitCheckedGroups) {\r\n const p = this._p;\r\n\r\n if (!sort && !sortCheckedFirst)\r\n return items; // Nothing to do\r\n\r\n const labelProp = p.labelProp,\r\n multiItemLabelProp = p.multiItemLabelProp,\r\n valueProp = p.valueProp,\r\n stickyValues = p.stickyValues,\r\n comparator = p.sortItemComparator || ((a, b) => {\r\n if (stickyValues !== null) {\r\n let sa = stickyValues.has(a[valueProp]);\r\n let sb = stickyValues.has(b[valueProp]);\r\n if (sa && !sb) return -1;\r\n if (!sa && sb) return 1;\r\n }\r\n\r\n const aLabel = a[labelProp] || a[multiItemLabelProp];\r\n const bLabel = a[labelProp] || a[multiItemLabelProp];\r\n\r\n if (aLabel < bLabel) return -1;\r\n if (aLabel > bLabel) return 1;\r\n\r\n return 0;\r\n });\r\n\r\n let group = [], stickyGroup = null;\r\n let groups = [group];\r\n const selectedValuesSet = new Set(p.selectedValues);\r\n let item, i, len;\r\n\r\n // Split to groups\r\n for (i = 0, len = items.length; i < len; i++) {\r\n item = items[i];\r\n if (item._group && group.length) {\r\n group = [];\r\n groups.push(group);\r\n }\r\n group.push(item);\r\n }\r\n\r\n // Leftover\r\n if (!group.length) {\r\n groups.length = 0;\r\n }\r\n\r\n // Non-grouped sticky should be first\r\n if (stickyValues && items.length > 0 && !items[0]._group) {\r\n stickyGroup = groups[0].filter(x => stickyValues.has(x[valueProp]));\r\n if (stickyGroup.length > 0) {\r\n groups[0] = groups[0].filter(x => !stickyValues.has(x[valueProp]));\r\n }\r\n }\r\n\r\n if (sort) {\r\n // Sort the groups\r\n groups.sort((a, b) => {\r\n a = a[0];\r\n b = b[0];\r\n\r\n if (stickyValues !== null) {\r\n let sa = stickyValues.has(a[valueProp]);\r\n let sb = stickyValues.has(b[valueProp]);\r\n if (sa && !sb) return -1;\r\n if (!sa && sb) return 1;\r\n }\r\n\r\n // A \"group\" without a group item will come first\r\n if (!a._group && b._group) return -1;\r\n if (a._group && !b._group) return 1;\r\n\r\n return comparator(a, b);\r\n });\r\n }\r\n\r\n if (stickyGroup && stickyGroup.length > 0) {\r\n groups.unshift(stickyGroup);\r\n }\r\n\r\n // Now we have an array of groups, possibly sorted.\r\n // Each group is an array that begins with the group item (group name/id).\r\n // A group could possible start with a normal item, if it's a \"default group\", which had no group item.\r\n\r\n const checkedGroups = [], uncheckedGroups = [];\r\n\r\n // Iterate groups\r\n for (let g = 0, glen = groups.length; g < glen; g++) {\r\n group = groups[g];\r\n\r\n // Sort each group\r\n group.sort((a, b) => {\r\n\r\n // Grouping items come first\r\n if (a._group && !b._group) return -1;\r\n if (!a._group && b._group) return 1;\r\n\r\n if (sortCheckedFirst) {\r\n const aChecked = selectedValuesSet.has(a[valueProp]);\r\n const bChecked = selectedValuesSet.has(b[valueProp]);\r\n\r\n if (aChecked && !bChecked) return -1;\r\n if (!aChecked && bChecked) return 1;\r\n }\r\n\r\n if (sort) {\r\n return comparator(a, b);\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n uncheckedGroups.push(group);\r\n }\r\n\r\n if (sortCheckedFirst && splitCheckedGroups) {\r\n\r\n let virtualGroup;\r\n\r\n // Iterate groups\r\n for (let g = 0, glen = groups.length; g < glen; g++) {\r\n group = groups[g];\r\n\r\n if (group === stickyGroup) {\r\n checkedGroups.push(stickyGroup);\r\n let sgi = uncheckedGroups.indexOf(stickyGroup);\r\n if (sgi !== -1) {\r\n uncheckedGroups.splice(sgi, 1);\r\n }\r\n continue;\r\n }\r\n\r\n virtualGroup = null;\r\n\r\n for (let gi = 0, gilen = group.length; gi < gilen; gi++) {\r\n item = group[gi];\r\n if (item._group) continue;\r\n if (!selectedValuesSet.has(item[p.valueProp])) break;\r\n\r\n if (!virtualGroup) {\r\n virtualGroup = [];\r\n if (group[0]._group) {\r\n virtualGroup.push(group[0]);\r\n }\r\n }\r\n\r\n virtualGroup.push(item);\r\n group.splice(gi--, 1);\r\n gilen--;\r\n }\r\n\r\n if (virtualGroup) {\r\n checkedGroups.push(virtualGroup);\r\n if (group.length === 0 || (group.length === 1 && group[0]._group)) {\r\n groups.splice(g--, 1);\r\n glen--;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Prepare the target array\r\n const joined = [];\r\n joined.length = items.length;\r\n let itemIndex = 0;\r\n\r\n groups = checkedGroups.length ?\r\n checkedGroups.concat(uncheckedGroups) : // Concat both lists\r\n uncheckedGroups; // No need for concat\r\n\r\n for (let g = 0, glen = groups.length; g < glen; g++) {\r\n group = groups[g];\r\n\r\n for (i = 0, len = group.length; i < len; i++) {\r\n joined[itemIndex++] = group[i];\r\n }\r\n }\r\n\r\n return joined;\r\n }\r\n}\r\n\r\nexport default SelectBox;\r\n"],"names":["value","replace","ItemSymbol","Symbol","DestroyedSymbol","GhostSymbol","hasOwnProperty","Object","prototype","defaultOptions","baseClassName","itemBlurDelay","capturesFocus","multi","keyDownHandler","autoCheckGroupChildren","useExactTargetWidth","constrainToWindow","autoFlipDirection","estimateWidth","virtualMinItems","labelProp","valueProp","on","DropList","[object Object]","options","o","key","entries","undefined","p","this","_p","ownsEl","elOriginalDisplay","additionalClasses","renderItem","unrenderItem","focusItemIndex","focusItemEl","sink","DomEventsSink","classes","concat","initialCss","top","el","Element","style","display","classList","add","role","setCssProps","createElement","class","join","css","items","groupCount","mouseHandled","virtualListHelper","VirtualListHelper","list","virtual","buffer","estimatedItemHeight","itemElementCreatorFn","tabIndex","onItemRender","itemEl","index","item","lastMeasureLongestLabelText","setAttribute","console","warn","className","_nocheck","_checked","_group","_child","_nointeraction","_renderItemContent","fn","setOnItemUnrender","err","error","_hookMouseEvents","_hookTouchEvents","_hookFocusEvents","_hookKeyEvents","clearTimeout","timer","filterTimer","remove","destroy","name","Array","from","startsWith","removeAttribute","lastPositionTarget","_syncBaseClasses","prop","fromFocus","hasFocusedItem","_trigger","event","_move","toggleClass","_updateGroupStateForItem","closestUntil","target","getItemIndexFromElement","_setSingleSelectedItemEl","atIndex","addItems","itemsToAdd","isMulti","length","_determineVirtualMode","i","count","oitem","splice","push","addItemsAt","render","newItem","itemIndex","itemIndexByValue","itemAtIndex","call","isItemRendered","refreshItemAt","label","itemIndexByValueOrLabel","removeItemsAt","setCount","slice","positionOptions","isVisible","w","window","targetBox","offset","targetOffset","getElementOffset","left","height","targetHeight","getElementHeight","width","targetWidth","getElementWidth","bottom","viewport","pageYOffset","pageXOffset","innerWidth","innerHeight","right","defaultVerticalDirection","position","y","isVirtual","_measureItem","updateWidth","_updateWidth","maxViewHeight","roomAbove","roomBelow","elComputedStyle","getComputedStyle","isBoxing","boxSizing","verticalPadding","parseFloat","paddingTop","paddingBottom","verticalBorderWidth","borderTopWidth","borderBottomWidth","estimateFullHeight","Math","max","scrollHeight","maxHeight","isNaN","min","enoughRoomAbove","enoughRoomBelow","newDirection","currentDirection","viewSize","isTargetRtl","targetRtl","direction","isRtlDocument","document","documentElement","anchor","anchoredPosition","x","invertYPos","specY","scrollLeft","body","parentNode","abs","scrollWidth","clientWidth","minX","maxX","viewCss","rtl","specX","which","setElementHeight","checked","li","getItemElementAt","values","groupIndexes","indexOf","_updateGroupCheckedState","excludeGroups","hiding","setTimeout","onDocumentMouseDown","_delayBlur","appendChild","visible","originalMaxHeight","clientHeight","marginTop","marginBottom","relayout","parseCssTransition","transition","reduce","v","delay","duration","blurFocusedItem","scrollItemIndexIntoView","itemElement","_getItemIndex","setFocusedItemAtIndex","setSingleSelectedItemAtIndex","_hasScroll","scrollTop","itemPos","previousPos","getItemPosition","itemSize","getItemSize","listHeight","singleSelectedItemEl","data","_mouseHandled","triggerItemSelection","toggleFocusedItem","activeElement","currentTarget","preventDefault","button","_itemUpAction","_handleMouseOver","_focus","currentTouchId","changedTouches","identifier","didScroll","onScroll","onTouchCancel","elToTrackScroll","find","touch","firstChild","contains","evt","_keydown","VALUE_PAGE_UP","VALUE_PAGE_DOWN","VALUE_HOME","VALUE_END","VALUE_UP","VALUE_DOWN","previousPage","nextPage","previous","next","VALUE_ENTER","VALUE_SPACE","VALUE_ESCAPE","hide","type","_keydownFreeType","character","String","fromCharCode","keyCode","keyword","previousFilter","regex","RegExp","escapeRegex","matchIndices","test","matchIndex","nextIndex","directionUp","isFirstItem","isLastItem","visibleItemCount","getVisibleItemCount","base","nextElementSibling","tagName","itemCount","startedAtIndex","groupIndex","affectedItems","len","nextEl","isCheckingGroup","fireEvents","groupItem","hasChecked","hasUnchecked","shouldCheckGroup","lastMeasureItemCount","longestLabel","lastMeasureLongestLabel","longestLabelText","text","createGhostItemElement","lastMeasureItemWidth","targetItemCount","shouldBeVirtual","setVirtual","textContent","insertBefore","autoWidth","newOuterWidth","setElementWidth","bordersWidth","borderLeftWidth","borderRightWidth","delta","throttle","func","wait","timeout","context","args","result","later","leading","Date","now","apply","throttled","remaining","arguments","trailing","cancel","isScheduled","NoResultsItemSymbol","RestMultiItemsSymbol","hasTouchCapability","DocumentTouch","navigator","maxTouchPoints","hasClass","inputBackbufferCssProps","disabled","clearable","hasOpenIndicator","placeholder","sortSelectedItems","sortListItems","sortListCheckedFirst","stickyValues","sortItemComparator","splitListCheckedGroups","blurOnSingleSelection","showSelection","multiPlaceholderFormatter","searchable","noResultsText","filterThrottleWindow","filterOnEmptyTerm","multiItemLabelProp","maxMultiItems","multiItemsRestLabelProvider","selectedValues","isLoadingMode","SelectBox","listOptions","isArray","Set","renderSingleItem","unrenderSingleItem","renderMultiItem","unrenderMultiItem","renderRestMultiItem","unrenderRestMultiItem","renderNoResultsItem","unrenderNoResultsItem","filterFn","filteredItems","itemsChanged","selectedItems","selectionChanged","resortBySelectionNeeded","throttledUpdateListItems","_updateListItems","filterTerm","setElementAttrs","aria-haspopup","aria-expanded","_renderBase","multiItemEls","enable","_setupDropdownMenu","input","focus","selectionStart","selectionEnd","relatedTarget","field","querySelector","_handleInputKeydown","_resizeInput","focusInOutHandler","t","setItems","setSelectedValues","setValue","_scheduleSync","syncTimeout","_stopTrackingPresence","dropList","_cleanupSingleWrapper","_removeMultiItemElementByIndex","singleWrapper","inputBackBuffer","clearButtonWrapper","openIndicator","enabled","toString","resetValues","getSelectedValues","term","mutated","getFilteredItemCount","existingItem","assign","updateItemByValue","performSearch","trim","sortCheckedFirst","comparator","formatter","unrender","setLabelProp","setValueProp","blur","clearEvt","_setInputText","set","has","_setSelectedItems","show","_getDropListPositionOptions","_repositionDropList","getFocusedItemIndex","open","openList","closeList","dropListVisible","setIsLoadingMode","getIsLoadingMode","isListOpen","zIndex","whiteSpace","inputWrapper","autocomplete","autocorrect","autocapitalize","spellcheck","aria-autocomplete","readOnly","_unregisterDropdownEvents","lastActiveElement","_removeMultiItemFromEvent","_handleMultiKeydown","_registerDropdownEvents","spinner","customRenderItem","customUnrenderItem","_startTrackingPresence","parent","offsetHeight","offsetWidth","selEvt","setItemChecked","idx","hasGroupSync","filter","selectEvt","avoidToggleFromClick","suppressKeyPress","suppressKeyPressRepeat","keyEventsTarget","lastKeyAllowsSpaceToggle","VALUE_TAB","toggleList","stopPropagation","isDisabled","tevt","_refilterItems","_lastSerializedBox","_sortItems","removeAllItems","hasRefocusedItem","setCheckedValues","singleItemIndex","getValue","matcher","lastGroup","map","mode","syncQueue","queue","_performSync","op","_syncFull","_syncSingleItem","_syncPlaceholder","findIndex","_addMultiItemElement","_addMultiItemRestElement","childNodes","innerHTML","pop","createTextNode","_renderMultiItem","before","clearButton","append","clear","title","defaultMultiPlaceholderFormatter","_renderSingleItemContent","fullItemsRender","_syncClearButton","a","b","sa","sb","aLabel","bLabel","sort","actualItemCount","addRestItem","getRootNode","tabindex","_renderMultiItemContent","originatingEvent","nextFocus","kEvent","VALUE_DELETE","VALUE_BACK_SPACE","prev","itemsToRemove","removeselEvt","_removeMultiItem","populate","backBufferEl","inputValue","beforeWidth","afterWidth","beforeStyle","content","float","getPseudoElementWidth","afterStyle","contentWidth","getCssProps","computedStyle","paddingTotal","paddingLeft","paddingRight","minWidth","backBufferWidth","currentWidth","newWidth","box","getBoundingClientRect","serialized","ctrlKey","isRtl","VALUE_LEFT","VALUE_RIGHT","shift","presenceInt","setInterval","clearInterval","splitCheckedGroups","group","stickyGroup","groups","selectedValuesSet","unshift","checkedGroups","uncheckedGroups","g","glen","aChecked","bChecked","virtualGroup","gi","gilen","sgi","joined"],"mappings":"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"}
|