slim-select 1.27.0 → 2.0.0

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.
Files changed (155) hide show
  1. package/.nvmrc +1 -0
  2. package/.prettierrc +6 -0
  3. package/.vscode/extensions.json +3 -0
  4. package/.vscode/settings.json +15 -5
  5. package/README.md +2 -1
  6. package/dist/helper.d.ts +1 -4
  7. package/dist/index.d.ts +38 -58
  8. package/dist/render.d.ts +109 -0
  9. package/dist/select.d.ts +31 -20
  10. package/dist/settings.d.ts +33 -0
  11. package/dist/slimselect.cjs.js +2 -0
  12. package/dist/slimselect.cjs.js.map +1 -0
  13. package/dist/slimselect.css +1 -2
  14. package/dist/slimselect.css.map +1 -0
  15. package/dist/slimselect.es.js +2 -0
  16. package/dist/slimselect.es.js.map +1 -0
  17. package/dist/slimselect.global.js +2 -0
  18. package/dist/slimselect.global.js.map +1 -0
  19. package/dist/slimselect.js +2 -1956
  20. package/dist/slimselect.js.map +1 -0
  21. package/dist/slimselect.umd.js +2 -0
  22. package/dist/slimselect.umd.js.map +1 -0
  23. package/dist/store.d.ts +71 -0
  24. package/docs/assets/check-mark.svg +6 -0
  25. package/docs/assets/data.js +59 -0
  26. package/docs/assets/home.css +1 -0
  27. package/docs/assets/home.js +1 -0
  28. package/docs/assets/index.css +1 -0
  29. package/docs/assets/index.js +16 -0
  30. package/docs/assets/index2.js +274 -0
  31. package/docs/assets/index3.js +126 -0
  32. package/docs/assets/index4.js +60 -0
  33. package/docs/assets/install.js +34 -0
  34. package/docs/assets/selects.js +55 -0
  35. package/docs/index.html +18 -5
  36. package/docs.go +3 -1
  37. package/index.html +16 -0
  38. package/jest.config.js +7 -0
  39. package/package.json +39 -39
  40. package/src/docs/app.vue +185 -76
  41. package/src/docs/assets/scss/_variables.scss +26 -10
  42. package/src/docs/assets/scss/alert.scss +12 -0
  43. package/src/docs/assets/scss/animations.scss +5 -3
  44. package/src/docs/assets/scss/button.scss +21 -0
  45. package/src/docs/assets/scss/index.scss +8 -6
  46. package/src/docs/assets/scss/input.scss +2 -2
  47. package/src/docs/assets/scss/layout.scss +195 -65
  48. package/src/docs/assets/scss/misc.scss +144 -34
  49. package/src/docs/assets/scss/prism.scss +155 -153
  50. package/src/docs/env.d.ts +12 -0
  51. package/src/docs/images/check-mark.svg +6 -0
  52. package/src/docs/images/chrome.svg +22 -0
  53. package/src/docs/images/firefox.svg +58 -0
  54. package/src/docs/images/github.png +0 -0
  55. package/src/docs/images/ie.svg +11 -0
  56. package/src/docs/images/npm.png +0 -0
  57. package/src/docs/images/opera.svg +15 -0
  58. package/src/docs/images/safari.svg +22 -0
  59. package/src/docs/main.ts +27 -0
  60. package/src/docs/pages/data.vue +130 -0
  61. package/src/docs/pages/events/addable.vue +79 -0
  62. package/src/docs/pages/events/before_after_change.vue +140 -0
  63. package/src/docs/pages/events/before_after_open_close.vue +122 -0
  64. package/src/docs/pages/events/error.vue +59 -0
  65. package/src/docs/pages/events/index.vue +33 -0
  66. package/src/docs/pages/events/search.vue +154 -0
  67. package/src/docs/pages/events/search_filter.vue +45 -0
  68. package/src/docs/pages/home.vue +96 -116
  69. package/src/docs/pages/install.vue +47 -74
  70. package/src/docs/pages/methods/destroy.vue +66 -0
  71. package/src/docs/pages/methods/enable_disable.vue +70 -0
  72. package/src/docs/pages/methods/get_data.vue +81 -0
  73. package/src/docs/pages/methods/get_selected.vue +78 -0
  74. package/src/docs/pages/methods/index.vue +36 -0
  75. package/src/docs/pages/methods/open_close.vue +63 -0
  76. package/src/docs/pages/methods/search.vue +62 -0
  77. package/src/docs/pages/methods/set_data.vue +106 -0
  78. package/src/docs/pages/methods/set_selected.vue +70 -0
  79. package/src/docs/pages/selects.vue +108 -114
  80. package/src/docs/pages/settings/always_open.vue +88 -0
  81. package/src/docs/pages/settings/close_on_select.vue +69 -0
  82. package/src/docs/pages/settings/content_location.vue +64 -0
  83. package/src/docs/pages/settings/content_position.vue +86 -0
  84. package/src/docs/pages/settings/css.vue +73 -0
  85. package/src/docs/pages/settings/data_attributes.vue +39 -0
  86. package/src/docs/pages/settings/deselect.vue +69 -0
  87. package/src/docs/pages/settings/display.vue +88 -0
  88. package/src/docs/pages/settings/hide_selected.vue +73 -0
  89. package/src/docs/pages/settings/html.vue +86 -0
  90. package/src/docs/pages/settings/index.vue +73 -0
  91. package/src/docs/pages/settings/mandatory.vue +91 -0
  92. package/src/docs/pages/settings/min_max.vue +61 -0
  93. package/src/docs/pages/settings/open_position.vue +60 -0
  94. package/src/docs/pages/settings/placeholder.vue +72 -0
  95. package/src/docs/pages/settings/search.vue +140 -0
  96. package/src/docs/pages/settings/select.vue +32 -0
  97. package/src/docs/pages/settings/select_by_group.vue +46 -0
  98. package/src/docs/pages/settings/show_tooltip.vue +44 -0
  99. package/src/docs/pages/settings/styles.vue +51 -0
  100. package/src/docs/router.ts +41 -13
  101. package/src/slim-select/helper.ts +25 -86
  102. package/src/slim-select/index.ts +318 -413
  103. package/src/slim-select/render.test.ts +39 -0
  104. package/src/slim-select/render.ts +1129 -0
  105. package/src/slim-select/rollup.config.mjs +39 -0
  106. package/src/slim-select/select.test.ts +155 -0
  107. package/src/slim-select/select.ts +280 -107
  108. package/src/slim-select/settings.ts +68 -0
  109. package/src/slim-select/slimselect.scss +263 -278
  110. package/src/slim-select/store.test.ts +220 -0
  111. package/src/slim-select/store.ts +320 -0
  112. package/src/slim-select/tsconfig.json +11 -5
  113. package/src/vue/slimselect.vue +61 -0
  114. package/tsconfig.json +10 -29
  115. package/vite.config.ts +18 -0
  116. package/.browserslistrc +0 -4
  117. package/.postcssrc.js +0 -5
  118. package/.travis.yml +0 -22
  119. package/babel.config.js +0 -5
  120. package/dist/config.d.ts +0 -83
  121. package/dist/data.d.ts +0 -50
  122. package/dist/slim.d.ts +0 -50
  123. package/dist/slimselect.min.css +0 -1
  124. package/dist/slimselect.min.js +0 -1
  125. package/dist/slimselect.min.mjs +0 -1
  126. package/docs/css/app.d5840d21.css +0 -1
  127. package/docs/css/chunk-vendors.4db6930d.css +0 -1
  128. package/docs/css/home.57020178.css +0 -1
  129. package/docs/css/install.baa5d3fb.css +0 -1
  130. package/docs/css/methods.728c742a.css +0 -1
  131. package/docs/css/options.b28a32ef.css +0 -1
  132. package/docs/css/selects.1a7e1e6a.css +0 -1
  133. package/docs/js/app.db13c724.js +0 -2
  134. package/docs/js/app.db13c724.js.map +0 -1
  135. package/docs/js/chunk-vendors.cc40aa28.js +0 -28
  136. package/docs/js/chunk-vendors.cc40aa28.js.map +0 -1
  137. package/docs/js/home.8bcb44fd.js +0 -2
  138. package/docs/js/home.8bcb44fd.js.map +0 -1
  139. package/docs/js/install.02f31028.js +0 -2
  140. package/docs/js/install.02f31028.js.map +0 -1
  141. package/docs/js/methods.1b31e988.js +0 -11
  142. package/docs/js/methods.1b31e988.js.map +0 -1
  143. package/docs/js/options.39fe1005.js +0 -2
  144. package/docs/js/options.39fe1005.js.map +0 -1
  145. package/docs/js/selects.f4d0b859.js +0 -2
  146. package/docs/js/selects.f4d0b859.js.map +0 -1
  147. package/src/docs/pages/methods.vue +0 -427
  148. package/src/docs/pages/options.vue +0 -1480
  149. package/src/main.ts +0 -29
  150. package/src/shims-vue.d.ts +0 -8
  151. package/src/slim-select/config.ts +0 -118
  152. package/src/slim-select/data.ts +0 -377
  153. package/src/slim-select/slim.ts +0 -770
  154. package/tslint.json +0 -26
  155. package/vue.config.js +0 -23
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slimselect.es.js","sources":["../src/src/slim-select/helper.ts","../src/src/slim-select/store.ts","../src/src/slim-select/render.ts","../src/src/slim-select/select.ts","../src/src/slim-select/settings.ts","../src/src/slim-select/index.ts"],"sourcesContent":["// Generate an 8 character random string\nexport function generateID(): string {\n return Math.random().toString(36).substring(2, 10)\n}\n\nexport function hasClassInTree(element: HTMLElement, className: string) {\n function hasClass(e: HTMLElement, c: string) {\n // If the element has the class return element\n if (c && e && e.classList && e.classList.contains(c)) {\n return e\n }\n\n // If the element has a dataset id of the class return element\n if (c && e && e.dataset && e.dataset.id && e.dataset.id === className) {\n return e\n }\n\n return null\n }\n\n function parentByClass(e: any, c: string): any {\n if (!e || e === (document as any)) {\n return null\n } else if (hasClass(e, c)) {\n return e\n } else {\n return parentByClass(e.parentNode, c)\n }\n }\n\n return hasClass(element, className) || parentByClass(element, className)\n}\n\nexport function debounce(func: (...params: any[]) => void, wait = 50, immediate = false): () => void {\n let timeout: any\n return function (this: any, ...args: any[]) {\n const context = self\n const later = () => {\n timeout = null\n if (!immediate) {\n func.apply(context, args)\n }\n }\n const callNow = immediate && !timeout\n clearTimeout(timeout)\n timeout = setTimeout(later, wait)\n if (callNow) {\n func.apply(context, args)\n }\n }\n}\n\nexport function kebabCase(str: string) {\n const result = str.replace(/[A-Z\\u00C0-\\u00D6\\u00D8-\\u00DE]/g, (match) => '-' + match.toLowerCase())\n return str[0] === str[0].toUpperCase() ? result.substring(1) : result\n}\n","import { generateID } from './helper'\n\nexport type DataArray = DataObject[]\nexport type DataObject = Optgroup | Option\n\nexport type DataArrayPartial = DataObjectPartial[]\nexport type DataObjectPartial = OptgroupOptional | OptionOptional\n\ntype selectType = 'single' | 'multiple'\n\nexport interface OptgroupOptional {\n id?: string\n label: string // Required\n options?: OptionOptional[]\n}\n\nexport class Optgroup {\n public id: string\n public label: string\n public options: Option[]\n\n constructor(optgroup: OptgroupOptional) {\n this.id = !optgroup.id || optgroup.id === '' ? generateID() : optgroup.id\n this.label = optgroup.label || ''\n\n // If options exist, loop through options and create new option class\n // and set the options to the optgroup options field\n this.options = []\n if (optgroup.options) {\n for (const o of optgroup.options) {\n this.options.push(new Option(o))\n }\n }\n }\n}\n\nexport interface OptionOptional {\n id?: string\n value?: string\n text: string // Required\n html?: string\n selected?: boolean\n display?: boolean\n disabled?: boolean\n mandatory?: boolean\n placeholder?: boolean\n class?: string\n style?: string\n data?: { [key: string]: string }\n}\n\nexport class Option {\n id: string\n value: string\n text: string\n html: string\n selected: boolean\n display: boolean\n disabled: boolean\n placeholder: boolean\n class: string\n style: string\n data: { [key: string]: string }\n mandatory: boolean\n\n constructor(option: OptionOptional) {\n this.id = !option.id || option.id === '' ? generateID() : option.id\n this.value = option.value === undefined ? option.text : option.value\n this.text = option.text || ''\n this.html = option.html || ''\n this.selected = option.selected !== undefined ? option.selected : false\n this.display = option.display !== undefined ? option.display : true\n this.disabled = option.disabled !== undefined ? option.disabled : false\n this.mandatory = option.mandatory !== undefined ? option.mandatory : false\n this.placeholder = option.placeholder !== undefined ? option.placeholder : false\n this.class = option.class || ''\n this.style = option.style || ''\n this.data = option.data || {}\n }\n}\n\nexport default class Store {\n private selectType: selectType = 'single'\n\n // Main data set, never null\n private data: DataArray = []\n\n constructor(type: selectType, data: DataArrayPartial) {\n this.selectType = type\n this.setData(data)\n }\n\n // Validate DataArrayPartial\n public validateDataArray(data: DataArray | DataArrayPartial): Error | null {\n if (!Array.isArray(data)) {\n return new Error('Data must be an array')\n }\n\n // Loop through each data object\n for (let dataObj of data) {\n // Optgroup\n if (dataObj instanceof Optgroup || 'label' in dataObj) {\n if (!('label' in dataObj)) {\n return new Error('Optgroup must have a label')\n }\n\n if ('options' in dataObj && dataObj.options) {\n for (let option of dataObj.options) {\n return this.validateOption(option)\n }\n }\n } else if (dataObj instanceof Option || 'text' in dataObj) {\n return this.validateOption(dataObj)\n } else {\n return new Error('Data object must be a valid optgroup or option')\n }\n }\n\n return null\n }\n\n // Validate Option\n public validateOption(option: Option | OptionOptional): Error | null {\n if (!('text' in option)) {\n return new Error('Option must have a text')\n }\n\n return null\n }\n\n public partialToFullData(data: DataArrayPartial): DataArray {\n let dataFinal: DataArray = []\n data.forEach((dataObj: DataObject | DataObjectPartial) => {\n // Optgroup\n if (dataObj instanceof Optgroup || 'label' in dataObj) {\n let optOptions: Option[] = []\n if ('options' in dataObj && dataObj.options) {\n dataObj.options.forEach((option: Option | OptionOptional) => {\n optOptions.push(new Option(option))\n })\n }\n\n if (optOptions.length > 0) {\n dataFinal.push(new Optgroup(dataObj))\n }\n }\n\n // Option\n if (dataObj instanceof Option || 'text' in dataObj) {\n dataFinal.push(new Option(dataObj))\n }\n })\n\n return dataFinal\n }\n\n public setData(data: DataArray | DataArrayPartial) {\n this.data = this.partialToFullData(data)\n\n // Run this.data through setSelected by value\n // to set the selected property and clean any wrong selected\n if (this.selectType === 'single') {\n this.setSelectedBy('value', this.getSelected())\n }\n }\n\n // Get data will return all the data\n public getData(): DataArray {\n return this.filter(null, true)\n }\n\n // Get data options will return the data as a\n // flat array of just options\n public getDataOptions(): Option[] {\n return this.filter(null, false) as Option[]\n }\n\n public addOption(option: OptionOptional) {\n this.setData(this.getData().concat(new Option(option)))\n }\n\n // Pass in an array of id that will loop through\n // each option and set the selected property to true\n // but also clean selected by determining selectType\n public setSelectedBy(selectedType: 'id' | 'value', selectedValues: string[]) {\n let firstOption: Option | null = null\n let hasSelected = false\n\n for (let dataObj of this.data) {\n // Optgroup\n if (dataObj instanceof Optgroup) {\n for (let option of dataObj.options) {\n if (!firstOption) {\n firstOption = option\n }\n\n option.selected = hasSelected ? false : selectedValues.includes(option[selectedType])\n\n // If the option is selected, set hasSelected to true\n // for single based selects\n if (option.selected && this.selectType === 'single') {\n hasSelected = true\n }\n }\n }\n\n // Option\n if (dataObj instanceof Option) {\n if (!firstOption) {\n firstOption = dataObj\n }\n\n dataObj.selected = hasSelected ? false : selectedValues.includes(dataObj[selectedType])\n\n // If the option is selected, set hasSelected to true\n // for single based selects\n if (dataObj.selected && this.selectType === 'single') {\n hasSelected = true\n }\n }\n }\n\n // If no options are selected, select the first option\n if (this.selectType === 'single' && firstOption && !hasSelected) {\n firstOption.selected = true\n }\n }\n\n public getSelected(): string[] {\n let selectedOptions = this.getSelectedOptions()\n let selectedValues: string[] = []\n\n // Loop through each option and get the value\n selectedOptions.forEach((option: Option) => {\n selectedValues.push(option.value)\n })\n\n return selectedValues\n }\n\n public getSelectedOptions(): Option[] {\n return this.filter((opt: Option) => {\n return opt.selected\n }, false) as Option[]\n }\n\n public getSelectedIDs(): string[] {\n let selectedOptions = this.getSelectedOptions()\n\n let selectedIDs: string[] = []\n selectedOptions.forEach((op: Option) => {\n selectedIDs.push(op.id)\n })\n\n return selectedIDs\n }\n\n public getOptionByID(id: string): Option | null {\n let options = this.filter((opt: Option) => {\n return opt.id === id\n }, false) as Option[]\n\n return options.length ? options[0] : null\n }\n\n // Take in search string and return filtered list of values\n public search(search: string, searchFilter: (opt: Option, search: string) => boolean): DataArray {\n search = search.trim()\n\n // If search is empty, return all data\n if (search === '') {\n return this.getData()\n }\n\n // Run filter with search function\n return this.filter((opt: Option): boolean => {\n return searchFilter(opt, search)\n }, true)\n }\n\n // Filter takes in a function that will be used to filter the data\n // This will also keep optgroups of sub options meet the filter requirements\n public filter(filter: { (opt: Option): boolean } | null, includeOptgroup: boolean): DataArray {\n const dataSearch: DataArray = []\n this.data.forEach((dataObj: DataObject) => {\n // Optgroup\n if (dataObj instanceof Optgroup) {\n // If you dont want to include optgroups\n if (!includeOptgroup) {\n // Loop through each option and check if it meets the filter requirements\n dataObj.options.forEach((option: Option) => {\n if (filter && filter(option)) {\n dataSearch.push(option)\n }\n })\n } else {\n let optOptions: Option[] = []\n dataObj.options.forEach((option: Option) => {\n if (!filter || filter(option)) {\n optOptions.push(new Option(option))\n }\n })\n\n if (optOptions.length > 0) {\n dataSearch.push(new Optgroup({ id: dataObj.id, label: dataObj.label, options: optOptions }))\n }\n }\n }\n\n // Option\n if (dataObj instanceof Option) {\n if (!filter || filter(dataObj)) {\n dataSearch.push(new Option(dataObj))\n }\n }\n })\n\n return dataSearch\n }\n}\n","import { debounce } from './helper'\nimport Settings from './settings'\nimport Store, { DataArray, Optgroup, Option, OptionOptional } from './store'\n\nexport interface Callbacks {\n open: () => void\n close: () => void\n addable?: (value: string) => OptionOptional | string\n setSelected: (value: string[]) => void\n addOption: (option: Option) => void\n search: (search: string) => void\n beforeChange?: (newVal: Option[], oldVal: Option[]) => boolean | void\n afterChange?: (newVal: Option[]) => void\n}\n\nexport interface Main {\n main: HTMLDivElement\n values: HTMLDivElement\n deselect: {\n main: HTMLDivElement\n svg: SVGSVGElement\n path: SVGPathElement\n }\n arrow: {\n main: SVGSVGElement\n path: SVGPathElement\n }\n}\n\nexport interface Content {\n main: HTMLDivElement\n search: Search\n list: HTMLDivElement\n}\n\nexport interface Search {\n main: HTMLDivElement\n input: HTMLInputElement\n addable?: {\n main: HTMLDivElement\n svg: SVGSVGElement\n path: SVGPathElement\n }\n}\n\nexport default class Render {\n public settings: Settings\n public store: Store\n public callbacks: Callbacks\n\n // Elements\n public main: Main\n public content: Content\n\n // Classes\n public classes = {\n // Main\n main: 'ss-main',\n\n // Placeholder\n placeholder: 'ss-placeholder',\n\n // Values\n values: 'ss-values',\n single: 'ss-single',\n value: 'ss-value',\n valueText: 'ss-value-text',\n valueDelete: 'ss-value-delete',\n valueOut: 'ss-value-out',\n\n // Deselect\n deselect: 'ss-deselect',\n deselectPath: 'M10,10 L90,90 M10,90 L90,10', // Not a class but whatever\n\n // Arrow\n arrow: 'ss-arrow',\n arrowClose: 'M10,30 L50,70 L90,30', // Not a class but whatever\n arrowOpen: 'M10,70 L50,30 L90,70', // Not a class but whatever\n\n // Content\n content: 'ss-content',\n openAbove: 'ss-open-above',\n openBelow: 'ss-open-below',\n\n // Search\n search: 'ss-search',\n searchHighlighter: 'ss-search-highlight',\n searching: 'ss-searching',\n addable: 'ss-addable',\n addablePath: 'M50,10 L50,90 M10,50 L90,50', // Not a class but whatever\n\n // List options\n list: 'ss-list',\n optgroup: 'ss-optgroup',\n optgroupLabel: 'ss-optgroup-label',\n optgroupSelectable: 'ss-optgroup-selectable',\n option: 'ss-option',\n optionSelected: 'ss-option-selected',\n optionDelete: 'M10,10 L90,90 M10,90 L90,10', // Not a class but whatever\n highlighted: 'ss-highlighted',\n\n // Misc\n error: 'ss-error',\n disabled: 'ss-disabled',\n hide: 'ss-hide',\n }\n\n constructor(settings: Required<Settings>, store: Store, callbacks: Callbacks) {\n this.store = store\n this.settings = settings\n this.callbacks = callbacks\n\n this.main = this.mainDiv()\n this.content = this.contentDiv()\n\n // Render the values\n this.renderValues()\n\n // Render the options\n this.renderOptions(this.store.getData())\n\n // Add content to the content location settings\n this.settings.contentLocation.appendChild(this.content.main)\n }\n\n // Remove disabled classes\n public enable(): void {\n // Remove disabled class\n this.main.main.classList.remove(this.classes.disabled)\n\n // Set search input to \"enabled\"\n this.content.search.input.disabled = false\n }\n\n // Set disabled classes\n public disable(): void {\n // Add disabled class\n this.main.main.classList.add(this.classes.disabled)\n\n // Set search input to disabled\n this.content.search.input.disabled = true\n }\n\n public open(): void {\n this.main.arrow.path.setAttribute('d', this.classes.arrowOpen)\n\n // Add class to main container\n this.main.main.classList.add(this.settings.openPosition === 'up' ? this.classes.openAbove : this.classes.openBelow)\n\n // move the content in to the right location\n this.moveContent()\n\n // Render the options\n this.renderOptions(this.store.getData())\n\n // Check showContent to see if they want to specifically show in a certain direction\n if (this.settings.contentPosition === 'relative') {\n this.moveContentBelow()\n } else if (this.settings.openPosition.toLowerCase() === 'up') {\n this.moveContentAbove()\n } else if (this.settings.openPosition.toLowerCase() === 'down') {\n this.moveContentBelow()\n } else {\n // Auto identify where to put it\n if (this.putContent(this.content.main, this.settings.isOpen) === 'up') {\n this.moveContentAbove()\n } else {\n this.moveContentBelow()\n }\n }\n\n // Move to last selected option\n const selectedOptions = this.store.getSelectedOptions()\n if (selectedOptions.length) {\n const selectedId = selectedOptions[selectedOptions.length - 1].id\n const selectedOption = this.content.list.querySelector('[data-id=\"' + selectedId + '\"]') as HTMLElement\n if (selectedOption) {\n this.ensureElementInView(this.content.list, selectedOption)\n }\n }\n }\n\n public close(): void {\n this.main.main.classList.remove(this.classes.openAbove)\n this.main.main.classList.remove(this.classes.openBelow)\n this.content.main.classList.remove(this.classes.openAbove)\n this.content.main.classList.remove(this.classes.openBelow)\n this.main.arrow.path.setAttribute('d', this.classes.arrowClose)\n }\n\n public mainDiv(): Main {\n // Create main container\n const main = document.createElement('div')\n\n // Set tabable to allow tabbing to the element\n main.tabIndex = 0\n\n // Add style and classes\n main.style.cssText = this.settings.style !== '' ? this.settings.style : ''\n\n // Clear out classlist\n main.className = ''\n\n // Loop through config class and add\n main.classList.add(this.settings.id)\n main.classList.add(this.classes.main)\n if (this.settings.class) {\n for (const c of this.settings.class) {\n if (c.trim() !== '') {\n main.classList.add(c.trim())\n }\n }\n }\n\n // If main gets focus, open the content\n main.onfocus = () => {\n if (this.settings.triggerFocus) {\n this.callbacks.open()\n }\n }\n\n // Deal with keyboard events on the main div\n // This is to allow for normal selecting\n // when you may not have a search bar\n main.onkeydown = (e: KeyboardEvent) => {\n // Convert above if else statemets to switch\n switch (e.key) {\n case 'ArrowUp':\n case 'ArrowDown':\n this.callbacks.open()\n e.key === 'ArrowDown' ? this.highlight('down') : this.highlight('up')\n return false\n case 'Tab':\n this.callbacks.close()\n return true // Continue doing normal tabbing\n case 'Enter':\n const highlighted = this.content.list.querySelector('.' + this.classes.highlighted) as HTMLDivElement\n if (highlighted) {\n highlighted.click()\n }\n return false\n case 'Escape':\n this.callbacks.close()\n return false\n }\n }\n\n // Add onclick for main div\n main.onclick = (e: Event) => {\n // Dont do anything if disabled\n if (!this.settings.isEnabled) {\n return\n }\n\n this.settings.isOpen ? this.callbacks.close() : this.callbacks.open()\n }\n\n // Add values\n const values = document.createElement('div')\n values.classList.add(this.classes.values)\n main.appendChild(values)\n\n // Add deselect\n const deselect = document.createElement('div')\n deselect.classList.add(this.classes.deselect)\n if (!this.settings.allowDeselect || this.settings.isMultiple) {\n deselect.classList.add(this.classes.hide)\n }\n deselect.onclick = (e: Event) => {\n e.stopPropagation()\n\n // Dont do anything if disabled\n if (!this.settings.isEnabled) {\n return\n }\n\n this.callbacks.setSelected([''])\n }\n\n // Add deselect svg\n const deselectSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n deselectSvg.setAttribute('viewBox', '0 0 100 100')\n const deselectPath = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n deselectPath.setAttribute('d', this.classes.deselectPath)\n deselectSvg.appendChild(deselectPath)\n deselect.appendChild(deselectSvg)\n main.appendChild(deselect)\n\n // Add arrow\n const arrow = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n arrow.classList.add(this.classes.arrow)\n arrow.setAttribute('viewBox', '0 0 100 100')\n const arrowPath = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n arrowPath.setAttribute('d', this.classes.arrowClose)\n if (this.settings.alwaysOpen) {\n arrow.classList.add(this.classes.hide)\n }\n arrow.appendChild(arrowPath)\n main.appendChild(arrow)\n\n return {\n main: main,\n values: values,\n deselect: {\n main: deselect,\n svg: deselectSvg,\n path: deselectPath,\n },\n arrow: {\n main: arrow,\n path: arrowPath,\n },\n }\n }\n\n public mainFocus(trigger: boolean): void {\n if (!trigger) {\n this.settings.triggerFocus = false\n }\n // Trigger focus but dont scroll to it\n this.main.main.focus({ preventScroll: true })\n this.settings.triggerFocus = true\n }\n\n public placeholder(): HTMLDivElement {\n // Figure out if there is a placeholder option\n const placeholderOption = this.store.filter((o) => o.placeholder, false) as Option[]\n\n // If there is a placeholder option use that\n // If placeholder has an html value, use that\n // If placeholder has a text, use that\n // If nothing is set, use the placeholder text\n let placeholderText = this.settings.placeholderText\n if (placeholderOption.length) {\n if (placeholderOption[0].html !== '') {\n placeholderText = placeholderOption[0].html\n } else if (placeholderOption[0].text !== '') {\n placeholderText = placeholderOption[0].text\n }\n }\n\n // Create placeholder div\n const placeholder = document.createElement('div')\n placeholder.classList.add(this.classes.placeholder)\n placeholder.innerHTML = placeholderText\n return placeholder\n }\n\n // Get selected values and append to multiSelected values container\n // and remove those who shouldnt exist\n public renderValues(): void {\n // If single select set placeholder or selected value\n if (!this.settings.isMultiple) {\n this.renderSingleValue()\n return\n }\n\n this.renderMultipleValues()\n }\n\n private renderSingleValue(): void {\n const selected = this.store.filter((o: Option): boolean => {\n return o.selected && !o.placeholder\n }, false) as Option[]\n const selectedSingle = selected.length > 0 ? selected[0] : null\n\n // If nothing is seleected use settings placeholder text\n if (!selectedSingle) {\n this.main.values.innerHTML = this.placeholder().outerHTML\n } else {\n // Create single value container\n const singleValue = document.createElement('div')\n singleValue.classList.add(this.classes.single)\n singleValue.innerHTML = selectedSingle.html ? selectedSingle.html : selectedSingle.text\n\n // If there is a selected value, set a single div\n this.main.values.innerHTML = singleValue.outerHTML\n }\n\n // If allowDeselect is false or selected value is empty just hide deslect\n if (!this.settings.allowDeselect || !selected.length) {\n this.main.deselect.main.classList.add(this.classes.hide)\n } else {\n this.main.deselect.main.classList.remove(this.classes.hide)\n }\n }\n\n private renderMultipleValues(): void {\n // Get various peices of data\n let currentNodes = this.main.values.childNodes as NodeListOf<HTMLDivElement>\n let selectedOptions = this.store.filter((opt: Option) => {\n // Only grab options that are selected and display is true\n return opt.selected && opt.display\n }, false) as Option[]\n\n // If selectedOptions is empty set placeholder\n if (selectedOptions.length === 0) {\n this.main.values.innerHTML = this.placeholder().outerHTML\n return\n } else {\n // If there is a placeholder, remove it\n const placeholder = this.main.values.querySelector('.' + this.classes.placeholder)\n if (placeholder) {\n placeholder.remove()\n }\n }\n\n // Loop through currentNodes and only include ones that are not in selectedIDs\n let removeNodes: HTMLDivElement[] = []\n for (let i = 0; i < currentNodes.length; i++) {\n const node = currentNodes[i]\n const id = node.getAttribute('data-id')\n if (id) {\n // Check if id is in selectedOptions\n const found = selectedOptions.filter((opt: Option) => {\n return opt.id === id\n }, false)\n\n // If not found, add to removeNodes\n if (!found.length) {\n removeNodes.push(node)\n }\n }\n }\n\n // Loop through and remove\n for (const n of removeNodes) {\n n.classList.add(this.classes.valueOut)\n setTimeout(() => {\n this.main.values.removeChild(n)\n }, 100)\n }\n\n // Add values that dont currently exist\n currentNodes = this.main.values.childNodes as NodeListOf<HTMLDivElement>\n for (let d = 0; d < selectedOptions.length; d++) {\n let shouldAdd = true\n for (let i = 0; i < currentNodes.length; i++) {\n if (selectedOptions[d].id === String(currentNodes[i].dataset.id)) {\n shouldAdd = false\n }\n }\n\n // If shouldAdd, insertAdjacentElement it to the values container in the order of the selectedOptions\n if (shouldAdd) {\n if (currentNodes.length === 0) {\n this.main.values.appendChild(this.multipleValue(selectedOptions[d]))\n } else if (d === 0) {\n this.main.values.insertBefore(this.multipleValue(selectedOptions[d]), currentNodes[d])\n } else {\n currentNodes[d - 1].insertAdjacentElement('afterend', this.multipleValue(selectedOptions[d]))\n }\n }\n }\n }\n\n public multipleValue(option: Option): HTMLDivElement {\n const value = document.createElement('div')\n value.classList.add(this.classes.value)\n value.dataset.id = option.id\n\n const text = document.createElement('div')\n text.classList.add(this.classes.valueText)\n text.innerHTML = option.text // For multiple values always use text\n value.appendChild(text)\n\n // Only add deletion if the option is not mandatory\n if (!option.mandatory) {\n const deleteDiv = document.createElement('div')\n deleteDiv.classList.add(this.classes.valueDelete)\n deleteDiv.onclick = (e: Event) => {\n e.preventDefault()\n e.stopPropagation()\n\n // By Default we will delete\n let shouldDelete = true\n const before = this.store.getSelectedOptions()\n const after = before.filter((o) => {\n return o.selected && o.id !== option.id\n }, true)\n\n // Check if minSelected is set and if after length so, return\n if (this.settings.minSelected && after.length < this.settings.minSelected) {\n return\n }\n\n // If there is a beforeDeselect function run it\n if (this.callbacks.beforeChange) {\n shouldDelete = this.callbacks.beforeChange(after, before) === true\n }\n\n if (shouldDelete) {\n // Loop through after and append values to a variable called selected\n let selectedValues: string[] = []\n for (const o of after) {\n if (o instanceof Optgroup) {\n for (const c of o.options) {\n selectedValues.push(c.value)\n }\n }\n\n if (o instanceof Option) {\n selectedValues.push(o.value)\n }\n }\n this.callbacks.setSelected(selectedValues)\n\n // Check if we need to close the dropdown\n if (this.settings.closeOnSelect) {\n this.callbacks.close()\n }\n\n // Run afterChange callback\n if (this.callbacks.afterChange) {\n this.callbacks.afterChange(after)\n }\n }\n }\n\n // Add delete svg\n const deleteSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n deleteSvg.setAttribute('viewBox', '0 0 100 100')\n const deletePath = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n deletePath.setAttribute('d', this.classes.optionDelete)\n deleteSvg.appendChild(deletePath)\n deleteDiv.appendChild(deleteSvg)\n\n value.appendChild(deleteDiv)\n }\n\n return value\n }\n\n public contentDiv(): Content {\n const main = document.createElement('div')\n main.classList.add(this.classes.content)\n\n // Add id to data-id\n main.dataset.id = this.settings.id\n\n // Add styles\n if (this.settings.style !== '') {\n main.style.cssText = this.settings.style\n }\n\n // Add classes\n if (this.settings.contentPosition === 'relative') {\n main.classList.add('ss-' + this.settings.contentPosition)\n }\n if (this.settings.class.length) {\n for (const c of this.settings.class) {\n if (c.trim() !== '') {\n main.classList.add(c.trim())\n }\n }\n }\n\n // Add search\n const search = this.searchDiv()\n main.appendChild(search.main)\n\n // Add list\n const list = this.listDiv()\n main.appendChild(list)\n\n return {\n main: main,\n search: search,\n list: list,\n }\n }\n\n public moveContent(): void {\n if (this.settings.contentPosition === 'relative') {\n return\n }\n\n const containerRect = this.main.main.getBoundingClientRect()\n this.content.main.style.top = containerRect.top + containerRect.height + window.scrollY + 'px'\n this.content.main.style.left = containerRect.left + window.scrollX + 'px'\n this.content.main.style.width = containerRect.width + 'px'\n }\n\n public searchDiv(): Search {\n const main = document.createElement('div')\n const input = document.createElement('input')\n const addable = document.createElement('div')\n main.classList.add(this.classes.search)\n\n // Setup search return object\n const searchReturn: Search = {\n main,\n input,\n }\n\n // We still want the search to be tabable but not shown\n if (!this.settings.showSearch) {\n main.classList.add(this.classes.hide)\n input.readOnly = true\n }\n\n input.type = 'search'\n input.placeholder = this.settings.searchPlaceholder\n input.tabIndex = -1\n input.setAttribute('aria-label', this.settings.searchPlaceholder)\n input.setAttribute('autocapitalize', 'off')\n input.setAttribute('autocomplete', 'off')\n input.setAttribute('autocorrect', 'off')\n\n input.oninput = debounce((e: Event) => {\n this.callbacks.search((e.target as HTMLInputElement).value)\n }, 100)\n\n // Deal with keyboard events on search input field\n input.onkeydown = (e: KeyboardEvent) => {\n // Convert above if else statemets to switch\n switch (e.key) {\n case 'ArrowUp':\n case 'ArrowDown':\n this.callbacks.open()\n e.key === 'ArrowDown' ? this.highlight('down') : this.highlight('up')\n return false\n case 'Tab':\n // When tabbing close the dropdown\n // which will also focus on main div\n // and then continuing normal tabbing\n this.callbacks.close()\n\n return true // Continue doing normal tabbing\n case 'Escape':\n this.callbacks.close()\n return false\n case 'Enter':\n if (this.callbacks.addable && e.ctrlKey) {\n addable.click()\n } else {\n const highlighted = this.content.list.querySelector('.' + this.classes.highlighted) as HTMLDivElement\n if (highlighted) {\n highlighted.click()\n }\n }\n return false\n }\n }\n\n // If focus is on the search input, open the dropdown\n input.onfocus = () => {\n // If we are already open, do nothing\n if (this.settings.isOpen) {\n return\n }\n\n this.callbacks.open()\n }\n main.appendChild(input)\n\n // If addable is enabled, add the addable div\n if (this.callbacks.addable) {\n addable.classList.add(this.classes.addable)\n const plus = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n plus.setAttribute('viewBox', '0 0 100 100')\n const plusPath = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n plusPath.setAttribute('d', this.classes.addablePath)\n plus.appendChild(plusPath)\n addable.appendChild(plus)\n addable.onclick = (e: Event) => {\n e.preventDefault()\n e.stopPropagation()\n\n // Do nothing if addable is not set\n if (!this.callbacks.addable) {\n return\n }\n\n // Grab input value\n const inputValue = this.content.search.input.value.trim()\n if (inputValue === '') {\n this.content.search.input.focus()\n return\n }\n\n // Call addable callback\n const addableValue = this.callbacks.addable(inputValue)\n\n // If the addableValue is a string, we will add it as a new option\n // Otherwise we will assume it is an option object\n if (typeof addableValue === 'string') {\n this.callbacks.addOption(\n new Option({\n text: addableValue,\n value: addableValue,\n }),\n )\n } else {\n this.callbacks.addOption(new Option(addableValue))\n }\n\n // Add option to selected\n this.callbacks.setSelected([inputValue])\n\n // Clear search\n this.callbacks.search('')\n\n // Close it only if closeOnSelect = true\n if (this.settings.closeOnSelect) {\n setTimeout(() => {\n // Give it a little padding for a better looking animation\n this.callbacks.close()\n }, 100)\n }\n }\n main.appendChild(addable)\n\n // Add the addable to the search return\n searchReturn.addable = {\n main: addable,\n svg: plus,\n path: plusPath,\n }\n }\n\n return searchReturn\n }\n\n public searchFocus(trigger: boolean): void {\n if (!trigger) {\n this.settings.triggerFocus = false\n }\n this.content.search.input.focus()\n this.settings.triggerFocus = true\n }\n\n public getOptions(notPlaceholder = false, notDisabled = false, notHidden = false): HTMLDivElement[] {\n // Put together query string\n let query = '.' + this.classes.option\n if (notPlaceholder) {\n query += ':not(.' + this.classes.placeholder + ')'\n }\n if (notDisabled) {\n query += ':not(.' + this.classes.disabled + ')'\n }\n if (notHidden) {\n query += ':not(.' + this.classes.hide + ')'\n }\n\n return Array.from(this.content.list.querySelectorAll(query))\n }\n\n // highlightUp is used to highlight the previous option in the list\n public highlight(dir: 'up' | 'down'): void {\n // Get full list of options in list\n const options = this.getOptions(true, true, true)\n\n // If there are no options, do nothing\n if (options.length === 0) {\n return\n }\n\n // If length is 1, highlight it\n if (options.length === 1) {\n // Check if option doesnt already has highlighted class\n if (!options[0].classList.contains(this.classes.highlighted)) {\n options[0].classList.add(this.classes.highlighted)\n return\n }\n }\n\n // Loop through options and find the highlighted one\n for (let i = 0; i < options.length; i++) {\n if (options[i].classList.contains(this.classes.highlighted)) {\n // Remove highlighted class from current one\n options[i].classList.remove(this.classes.highlighted)\n\n // Highlight the next one\n if (dir === 'down') {\n if (i + 1 < options.length) {\n options[i + 1].classList.add(this.classes.highlighted)\n this.ensureElementInView(this.content.list, options[i + 1])\n } else {\n options[0].classList.add(this.classes.highlighted)\n this.ensureElementInView(this.content.list, options[0])\n }\n } else {\n if (i - 1 >= 0) {\n options[i - 1].classList.add(this.classes.highlighted)\n this.ensureElementInView(this.content.list, options[i - 1])\n } else {\n options[options.length - 1].classList.add(this.classes.highlighted)\n this.ensureElementInView(this.content.list, options[options.length - 1])\n }\n }\n\n return\n }\n }\n\n // If we get here, there is no highlighted option\n // So we will highlight the first or last based upon direction\n options[dir === 'down' ? 0 : options.length - 1].classList.add(this.classes.highlighted)\n\n // Scroll to highlighted one\n this.ensureElementInView(this.content.list, options[dir === 'down' ? 0 : options.length - 1])\n }\n\n // Create main container that options will reside\n public listDiv(): HTMLDivElement {\n const options = document.createElement('div')\n options.classList.add(this.classes.list)\n options.setAttribute('role', 'listbox')\n\n return options\n }\n\n public renderError(error: string) {\n // Clear out innerHtml\n this.content.list.innerHTML = ''\n\n const errorDiv = document.createElement('div')\n errorDiv.classList.add(this.classes.error)\n errorDiv.textContent = error\n this.content.list.appendChild(errorDiv)\n }\n\n public renderSearching() {\n // Clear out innerHtml\n this.content.list.innerHTML = ''\n\n const searchingDiv = document.createElement('div')\n searchingDiv.classList.add(this.classes.searching)\n searchingDiv.textContent = this.settings.searchingText\n this.content.list.appendChild(searchingDiv)\n }\n\n // Take in data and add options to\n public renderOptions(data: DataArray): void {\n // Clear out innerHtml\n this.content.list.innerHTML = ''\n\n // If no results show no results text\n if (data.length === 0) {\n const noResults = document.createElement('div')\n noResults.classList.add(this.classes.option)\n noResults.classList.add(this.classes.disabled)\n noResults.innerHTML = this.settings.searchText\n this.content.list.appendChild(noResults)\n return\n }\n\n // Append individual options to div container\n for (const d of data) {\n // Create optgroup\n if (d instanceof Optgroup) {\n // Create optgroup\n const optgroupEl = document.createElement('div')\n optgroupEl.classList.add(this.classes.optgroup)\n\n // Create label\n const optgroupLabel = document.createElement('div')\n optgroupLabel.classList.add(this.classes.optgroupLabel)\n optgroupLabel.innerHTML = d.label\n\n // If selectByGroup is true and isMultiple then add click event to label\n if (this.settings.selectByGroup && this.settings.isMultiple) {\n optgroupLabel.classList.add(this.classes.optgroupSelectable)\n optgroupLabel.addEventListener('click', (e: MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n for (const childEl of optgroupEl.children as any as HTMLDivElement[]) {\n if (childEl.className.indexOf(this.classes.option) !== -1) {\n childEl.click()\n }\n }\n })\n }\n\n // Add optgroup label\n optgroupEl.appendChild(optgroupLabel)\n\n // Loop through options\n for (const o of d.options) {\n optgroupEl.appendChild(this.option(o))\n }\n\n // Add optgroup to list\n this.content.list.appendChild(optgroupEl)\n }\n\n // Create option\n if (d instanceof Option) {\n this.content.list.appendChild(this.option(d as Option))\n }\n }\n }\n\n // Create option div element\n public option(option: Option): HTMLDivElement {\n // Add hidden placeholder\n if (option.placeholder) {\n const placeholder = document.createElement('div')\n placeholder.classList.add(this.classes.option)\n placeholder.classList.add(this.classes.hide)\n return placeholder\n }\n\n // Create option\n const optionEl = document.createElement('div')\n optionEl.dataset.id = option.id // Dataset id for identifying an option\n optionEl.classList.add(this.classes.option)\n optionEl.setAttribute('role', 'option') // WCAG attribute\n if (option.class) {\n option.class.split(' ').forEach((dataClass: string) => {\n optionEl.classList.add(dataClass)\n })\n }\n if (option.style) {\n optionEl.style.cssText = option.style\n }\n\n // Set option content\n if (this.settings.searchHighlight && this.content.search.input.value.trim() !== '') {\n const textOrHtml = option.html !== '' ? option.html : option.text\n optionEl.innerHTML = this.highlightText(\n textOrHtml,\n this.content.search.input.value,\n this.classes.searchHighlighter,\n )\n } else if (option.html !== '') {\n optionEl.innerHTML = option.html\n } else {\n optionEl.textContent = option.text\n }\n\n // Set title attribute\n if (this.settings.showOptionTooltips && optionEl.textContent) {\n optionEl.setAttribute('title', optionEl.textContent)\n }\n\n // If allowed to deselect, null onclick and add disabled\n if ((option.selected && !this.settings.allowDeselect) || (option.disabled && !this.settings.allowDeselect)) {\n optionEl.classList.add(this.classes.disabled)\n }\n\n // If option is selected and hideSelectedOption is true, hide it\n if (option.selected && this.settings.hideSelected) {\n optionEl.classList.add(this.classes.hide)\n }\n\n // If option is selected\n if (option.selected) {\n optionEl.classList.add(this.classes.optionSelected)\n } else {\n optionEl.classList.remove(this.classes.optionSelected)\n }\n\n // Add click event listener\n optionEl.addEventListener('click', (e: MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n // Setup variables\n const selectedOptions = this.store.getSelected()\n const element = e.currentTarget as HTMLDivElement\n const elementID = String(element.dataset.id)\n\n // If the option is disabled or selected and the user isnt allowed to deselect\n if (option.disabled || (option.selected && !this.settings.allowDeselect)) {\n return\n }\n\n // Check limit and do nothing if limit is reached\n if (\n this.settings.isMultiple &&\n Array.isArray(selectedOptions) &&\n this.settings.maxSelected <= selectedOptions.length\n ) {\n return\n }\n\n // Setup variables\n let shouldUpdate = false\n const before = this.store.getSelectedOptions()\n let after = [] as Option[]\n\n // If multiple\n if (this.settings.isMultiple) {\n if (option.selected) {\n // If selected after would remove\n after = before.filter((o: Option) => o.id !== elementID)\n } else {\n // If not selected after would add\n after = before.concat(option)\n }\n }\n\n // If single\n if (!this.settings.isMultiple) {\n if (option.selected) {\n // If selected after would remove\n after = []\n } else {\n // If not selected after would add\n after = [option]\n }\n }\n\n // If no beforeOnChange is set automatically update at end\n if (!this.callbacks.beforeChange) {\n shouldUpdate = true\n }\n\n if (this.callbacks.beforeChange) {\n // Check if beforeChange returns false\n if (this.callbacks.beforeChange(after, before) === false) {\n shouldUpdate = false\n } else {\n shouldUpdate = true\n }\n }\n\n if (shouldUpdate) {\n // Check if the option exists in the store\n // if not run addOption callback\n if (!this.store.getOptionByID(elementID)) {\n this.callbacks.addOption(option)\n }\n\n // Get values from after and set as selected\n this.callbacks.setSelected(after.map((o: Option) => o.value))\n\n // If closeOnSelect is true\n if (this.settings.closeOnSelect) {\n this.callbacks.close()\n }\n\n // callback that the value has changed\n if (this.callbacks.afterChange) {\n this.callbacks.afterChange(after)\n }\n }\n })\n\n return optionEl\n }\n\n public destroy(): void {\n // Remove main\n this.main.main.remove()\n\n // Remove content\n this.content.main.remove()\n }\n\n private highlightText(str: string, search: any, className: string) {\n // the completed string will be itself if already set, otherwise, the string that was passed in\n let completedString: any = str\n const regex = new RegExp('(' + search.trim() + ')(?![^<]*>[^<>]*</)', 'i')\n\n // If the regex doesn't match the string just exit\n if (!str.match(regex)) {\n return str\n }\n\n // Otherwise, get to highlighting\n const matchStartPosition = (str.match(regex) as any).index\n const matchEndPosition = matchStartPosition + (str.match(regex) as any)[0].toString().length\n const originalTextFoundByRegex = str.substring(matchStartPosition, matchEndPosition)\n completedString = completedString.replace(regex, `<mark class=\"${className}\">${originalTextFoundByRegex}</mark>`)\n return completedString\n }\n\n public moveContentAbove(): void {\n let mainHeight: number = this.main.main.offsetHeight\n\n const contentHeight = this.content.main.offsetHeight\n const height = mainHeight + contentHeight - 1\n this.content.main.style.margin = '-' + height + 'px 0px 0px 0px'\n this.content.main.style.transformOrigin = 'center bottom'\n\n this.main.main.classList.remove(this.classes.openBelow)\n this.main.main.classList.add(this.classes.openAbove)\n this.content.main.classList.remove(this.classes.openBelow)\n this.content.main.classList.add(this.classes.openAbove)\n }\n\n public moveContentBelow(): void {\n this.content.main.style.margin = '-1px 0px 0px 0px'\n this.content.main.style.transformOrigin = 'center top'\n\n this.main.main.classList.remove(this.classes.openAbove)\n this.main.main.classList.add(this.classes.openBelow)\n this.content.main.classList.remove(this.classes.openAbove)\n this.content.main.classList.add(this.classes.openBelow)\n }\n\n public ensureElementInView(container: HTMLElement, element: HTMLElement): void {\n // Determine container top and bottom\n const cTop = container.scrollTop + container.offsetTop // Make sure to have offsetTop\n const cBottom = cTop + container.clientHeight\n\n // Determine element top and bottom\n const eTop = element.offsetTop\n const eBottom = eTop + element.clientHeight\n\n // Check if out of view\n if (eTop < cTop) {\n container.scrollTop -= cTop - eTop\n } else if (eBottom > cBottom) {\n container.scrollTop += eBottom - cBottom\n }\n }\n\n public putContent(el: HTMLElement, isOpen: boolean): 'up' | 'down' {\n const height = el.offsetHeight\n const rect = el.getBoundingClientRect()\n const elemTop = isOpen ? rect.top : rect.top - height\n const elemBottom = isOpen ? rect.bottom : rect.bottom + height\n\n if (elemTop <= 0) {\n return 'down'\n }\n if (elemBottom >= window.innerHeight) {\n return 'up'\n }\n\n // default to current position if we cant determine a perfect one\n return 'down'\n }\n}\n","import { generateID, kebabCase } from './helper'\nimport { DataArray, DataObject, Optgroup, Option } from './store'\n\nexport default class Select {\n public select: HTMLSelectElement\n public listen: boolean = false\n\n // Mutation observer fields\n public onSelectChange?: (data: DataArray) => void\n public onValueChange?: (value: string[]) => void\n private observer: MutationObserver | null = null\n\n constructor(select: HTMLSelectElement) {\n this.select = select\n }\n\n // Set to enabled\n public enable(): void {\n // Disable original select but dont trigger observer\n this.disconnectObserver()\n this.select.disabled = false\n this.connectObserver()\n }\n\n // Set to disabled\n public disable(): void {\n // Enable original select but dont trigger observer\n this.disconnectObserver()\n this.select.disabled = true\n this.connectObserver()\n }\n\n // Set misc attributes on the main select element\n public hideUI(): void {\n this.select.tabIndex = -1\n this.select.style.display = 'none'\n this.select.setAttribute('aria-hidden', 'true')\n }\n\n public showUI(): void {\n this.select.removeAttribute('tabindex')\n this.select.style.display = ''\n this.select.removeAttribute('aria-hidden')\n }\n\n public changeListen(on: boolean) {\n this.listen = on\n\n // Deal with some observer situations\n if (this.listen) {\n this.connectObserver()\n } else {\n this.disconnectObserver()\n }\n }\n\n // Add change listener to original select\n public addSelectChangeListener(func: (data: DataArray) => void): void {\n this.onSelectChange = func\n this.addObserver()\n this.connectObserver()\n this.changeListen(true) // Last start listening\n }\n\n // remove change listener from original select\n public removeSelectChangeListener(): void {\n this.changeListen(false) // First stop listening\n this.onSelectChange = undefined\n }\n\n public addValueChangeListener(func: (value: string[]) => void): void {\n this.onValueChange = func\n this.select.addEventListener('change', this.valueChange.bind(this))\n }\n\n public removeValueChangeListener(): void {\n this.onValueChange = undefined\n this.select.removeEventListener('change', this.valueChange.bind(this))\n }\n\n public valueChange(ev: Event): any {\n if (this.onValueChange) {\n this.onValueChange(this.getSelectedValues())\n }\n }\n\n private observeWrapper(mutations: MutationRecord[]): void {\n if (this.onSelectChange) {\n this.onSelectChange(this.getData())\n }\n }\n\n // Add MutationObserver to select\n private addObserver(): void {\n // If mutation observer already exists then disconnect and\n if (this.observer) {\n this.disconnectObserver()\n this.observer = null\n }\n\n // If anything changes in the select then update the data\n this.observer = new MutationObserver(this.observeWrapper)\n }\n\n private connectObserver(): void {\n if (this.observer) {\n this.observer.observe(this.select, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true,\n })\n }\n }\n\n private disconnectObserver(): void {\n if (this.observer) {\n this.observer.disconnect()\n }\n }\n\n // From the select element pull optgroup and options into data\n public getData(): DataArray {\n let data = []\n\n // Loop through nodes and get data\n const nodes = this.select.childNodes as any as HTMLOptGroupElement[] | HTMLOptionElement[]\n for (const n of nodes) {\n // Optgroup\n if (n.nodeName === 'OPTGROUP') {\n data.push(this.getDataFromOptgroup(n as HTMLOptGroupElement))\n }\n\n // Option\n if (n.nodeName === 'OPTION') {\n data.push(this.getDataFromOption(n as HTMLOptionElement))\n }\n }\n\n return data\n }\n\n public getDataFromOptgroup(optgroup: HTMLOptGroupElement): Optgroup {\n let data = {\n id: '',\n label: optgroup.label,\n options: [],\n } as Optgroup\n\n const options = optgroup.childNodes as any as HTMLOptionElement[]\n for (const o of options) {\n if (o.nodeName === 'OPTION') {\n data.options.push(this.getDataFromOption(o as HTMLOptionElement))\n }\n }\n\n return data\n }\n\n public getSelectedValues(): string[] {\n let values = []\n\n // Loop through options and set selected\n const options = this.select.childNodes as any as (HTMLOptGroupElement | HTMLOptionElement)[]\n for (const o of options) {\n if (o.nodeName === 'OPTGROUP') {\n const optgroupOptions = o.childNodes as any as HTMLOptionElement[]\n for (const oo of optgroupOptions) {\n if (oo.nodeName === 'OPTION') {\n const option = oo as HTMLOptionElement\n if (option.selected) {\n values.push(option.value)\n }\n }\n }\n }\n\n if (o.nodeName === 'OPTION') {\n const option = o as HTMLOptionElement\n if (option.selected) {\n values.push(option.value)\n }\n }\n }\n\n return values\n }\n\n // From passed in option pull pieces of usable information\n public getDataFromOption(option: HTMLOptionElement): Option {\n return {\n id: (option.dataset ? option.dataset.id : false) || generateID(),\n value: option.value,\n text: option.text,\n html: option.innerHTML,\n selected: option.selected,\n display: option.style.display === 'none' ? false : true,\n disabled: option.disabled,\n mandatory: option.dataset ? option.dataset.mandatory === 'true' : false,\n placeholder: option.dataset.placeholder === 'true',\n class: option.className,\n style: option.style.cssText,\n data: option.dataset,\n } as Option\n }\n\n public setSelected(value: string[]): void {\n // Loop through options and set selected\n const options = this.select.childNodes as any as (HTMLOptGroupElement | HTMLOptionElement)[]\n for (const o of options) {\n if (o.nodeName === 'OPTGROUP') {\n const optgroup = o as HTMLOptGroupElement\n const optgroupOptions = optgroup.childNodes as any as HTMLOptionElement[]\n for (const oo of optgroupOptions) {\n if (oo.nodeName === 'OPTION') {\n const option = oo as HTMLOptionElement\n option.selected = value.includes(option.value)\n }\n }\n }\n\n if (o.nodeName === 'OPTION') {\n const option = o as HTMLOptionElement\n option.selected = value.includes(option.value)\n }\n }\n }\n\n public updateSelect(id?: string, style?: string, classes?: string[]): void {\n // Stop listening to changes\n this.changeListen(false)\n\n // Update id\n if (id) {\n this.select.id = id\n }\n\n // Update style\n if (style) {\n this.select.style.cssText = style\n }\n\n // Update classes\n if (classes) {\n this.select.className = ''\n classes.forEach((c) => {\n if (c.trim() !== '') {\n this.select.classList.add(c.trim())\n }\n })\n }\n\n // Start listening to changes\n this.changeListen(true)\n }\n\n public updateOptions(data: DataArray): void {\n // Stop listening to changes\n this.changeListen(false)\n\n // Clear out select\n this.select.innerHTML = ''\n\n for (const d of data) {\n if (d instanceof Optgroup) {\n this.select.appendChild(this.createOptgroup(d))\n }\n\n if (d instanceof Option) {\n this.select.appendChild(this.createOption(d))\n }\n }\n\n // Start listening to changes\n this.changeListen(true)\n }\n\n public createOptgroup(optgroup: Optgroup): HTMLOptGroupElement {\n const optgroupEl = document.createElement('optgroup')\n optgroupEl.id = optgroup.id\n optgroupEl.label = optgroup.label\n if (optgroup.options) {\n for (const o of optgroup.options) {\n optgroupEl.appendChild(this.createOption(o))\n }\n }\n return optgroupEl\n }\n\n public createOption(info: Option): HTMLOptionElement {\n const optionEl = document.createElement('option')\n optionEl.value = info.value !== '' ? info.value : info.text\n optionEl.innerHTML = info.html || info.text\n if (info.selected) {\n optionEl.selected = info.selected\n }\n if (info.disabled) {\n optionEl.disabled = true\n }\n if (info.display === false) {\n optionEl.style.display = 'none'\n }\n if (info.placeholder) {\n optionEl.setAttribute('data-placeholder', 'true')\n }\n if (info.mandatory) {\n optionEl.setAttribute('data-mandatory', 'true')\n }\n if (info.class) {\n info.class.split(' ').forEach((optionClass: string) => {\n optionEl.classList.add(optionClass)\n })\n }\n if (info.data && typeof info.data === 'object') {\n Object.keys(info.data).forEach((key) => {\n optionEl.setAttribute('data-' + kebabCase(key), info.data[key])\n })\n }\n\n return optionEl\n }\n\n public destroy() {\n this.changeListen(false)\n this.disconnectObserver()\n this.removeSelectChangeListener()\n this.removeValueChangeListener()\n\n // show the original select\n this.showUI()\n }\n}\n","import { generateID } from './helper'\n\nexport type SettingsPartial = Partial<Settings>\n\nexport default class Settings {\n public id: string = '' // Primary ID for the select\n public style: string = '' // Style attribute from the select element\n public class: string[] = [] // Class attribute from the select element\n\n // Dynamic settings\n public isMultiple: boolean = false\n public isOpen: boolean = false\n public triggerFocus: boolean = true\n public intervalMove: NodeJS.Timeout | null = null\n\n // Fields set from constructor\n public mainHeight: number = 30\n public contentHeight: number = 0\n public isEnabled: boolean\n public alwaysOpen: boolean\n public showSearch: boolean\n public searchPlaceholder: string\n public searchText: string\n public searchingText: string\n public searchHighlight: boolean\n public closeOnSelect: boolean\n public contentLocation: HTMLElement\n public contentPosition: 'relative' | 'absolute'\n public openPosition: 'auto' | 'up' | 'down'\n public placeholderText: string\n public allowDeselect: boolean\n public hideSelected: boolean\n public showOptionTooltips: boolean\n public selectByGroup: boolean\n public minSelected: number\n public maxSelected: number\n public timeoutDelay: number\n\n constructor(settings?: SettingsPartial) {\n if (!settings) {\n settings = {}\n }\n\n this.id = 'ss-' + generateID()\n this.style = settings.style || ''\n this.class = settings.class || []\n\n this.isEnabled = settings.isEnabled !== undefined ? settings.isEnabled : true\n this.alwaysOpen = settings.alwaysOpen !== undefined ? settings.alwaysOpen : false\n this.showSearch = settings.showSearch !== undefined ? settings.showSearch : true\n this.searchPlaceholder = settings.searchPlaceholder || 'Search'\n this.searchText = settings.searchText || 'No Results'\n this.searchingText = settings.searchingText || 'Searching...'\n this.searchHighlight = settings.searchHighlight !== undefined ? settings.searchHighlight : false\n this.closeOnSelect = settings.closeOnSelect !== undefined ? settings.closeOnSelect : true\n this.contentLocation = settings.contentLocation || document.body\n this.contentPosition = settings.contentPosition || 'absolute'\n this.openPosition = settings.openPosition || 'auto' // options: auto, up, down\n this.placeholderText = settings.placeholderText || 'Select Value'\n this.allowDeselect = settings.allowDeselect !== undefined ? settings.allowDeselect : false\n this.hideSelected = settings.hideSelected !== undefined ? settings.hideSelected : false\n this.showOptionTooltips = settings.showOptionTooltips !== undefined ? settings.showOptionTooltips : false\n this.selectByGroup = settings.selectByGroup !== undefined ? settings.selectByGroup : false\n this.minSelected = settings.minSelected || 0\n this.maxSelected = settings.maxSelected || 1000\n this.timeoutDelay = settings.timeoutDelay || 200\n }\n}\n","import { debounce, hasClassInTree } from './helper'\nimport Render from './render'\nimport Select from './select'\nimport Settings, { SettingsPartial } from './settings'\nimport Store, { DataArray, DataArrayPartial, Option, OptionOptional } from './store'\n\n// Export everything except the \"export default\"\nexport * from './helper'\nexport * from './settings'\nexport * from './select'\nexport * from './store'\nexport * from './render'\n\n// Export all \"export defaults\"\nexport { Settings, Select, Store, Render }\n\nexport interface Config {\n select: string | Element\n data?: DataArrayPartial\n settings?: SettingsPartial\n events?: Events\n}\n\nexport interface Events {\n search?: (searchValue: string, currentData: DataArray) => Promise<DataArrayPartial> | DataArrayPartial\n searchFilter?: (option: Option, search: string) => boolean\n addable?: (value: string) => OptionOptional | string\n beforeChange?: (newVal: Option[], oldVal: Option[]) => boolean | void\n afterChange?: (newVal: Option[]) => void\n beforeOpen?: () => void\n afterOpen?: () => void\n beforeClose?: () => void\n afterClose?: () => void\n error?: (err: Error) => void\n}\n\nexport default class SlimSelect {\n public selectEl: HTMLSelectElement\n\n // Classes\n public settings!: Settings\n public select!: Select\n public store!: Store\n public render!: Render\n\n // Events\n public events = {\n search: undefined,\n searchFilter: (opt: Option, search: string) => {\n return opt.text.toLowerCase().indexOf(search.toLowerCase()) !== -1\n },\n addable: undefined,\n beforeChange: undefined,\n afterChange: undefined,\n beforeOpen: undefined,\n afterOpen: undefined,\n beforeClose: undefined,\n afterClose: undefined,\n } as Events\n\n constructor(config: Config) {\n // Make sure you get the right element\n this.selectEl = (\n typeof config.select === 'string' ? document.querySelector(config.select) : config.select\n ) as HTMLSelectElement\n if (!this.selectEl) {\n if (config.events && config.events.error) {\n config.events.error(new Error('Could not find select element'))\n }\n return\n }\n if (this.selectEl.tagName !== 'SELECT') {\n if (config.events && config.events.error) {\n config.events.error(new Error('Element isnt of type select'))\n }\n return\n }\n\n // If select already has a slim select id on it lets destroy it first\n if (this.selectEl.dataset.ssid) {\n this.destroy()\n }\n\n // Set settings\n this.settings = new Settings(config.settings)\n\n // Set events\n for (const key in config.events) {\n if (config.events.hasOwnProperty(key)) {\n ;(this.events as { [key: string]: any })[key] = (config.events as { [key: string]: any })[key]\n }\n }\n\n // Upate settings with type, style and classname\n this.settings.isMultiple = this.selectEl.multiple\n this.settings.style = this.selectEl.style.cssText\n this.settings.class = this.selectEl.className.split(' ')\n\n // Set select class\n this.select = new Select(this.selectEl)\n this.select.updateSelect(this.settings.id, this.settings.style, this.settings.class)\n this.select.hideUI() // Hide the original select element\n\n // Add select listeners\n this.select.addSelectChangeListener((data: DataArray) => {\n // Run set data from the values given\n this.setData(data)\n })\n this.select.addValueChangeListener((values: string[]) => {\n // Run set selected from the values given\n this.setSelected(values)\n })\n\n // Set store class\n this.store = new Store(\n this.settings.isMultiple ? 'multiple' : 'single',\n config.data ? config.data : this.select.getData(),\n )\n\n // If data is passed update the original select element\n if (config.data) {\n this.select.updateOptions(this.store.getData())\n }\n\n // Set render callbacks\n const callbacks = {\n open: this.open.bind(this),\n close: this.close.bind(this),\n addable: this.events.addable ? this.events.addable : undefined,\n setSelected: this.setSelected.bind(this),\n addOption: this.addOption.bind(this),\n search: this.search.bind(this),\n beforeChange: this.events.beforeChange,\n afterChange: this.events.afterChange,\n }\n\n // Setup render class\n this.render = new Render(this.settings, this.store, callbacks)\n\n // Add render after original select element\n if (this.selectEl.parentNode) {\n this.selectEl.parentNode.insertBefore(this.render.main.main, this.selectEl.nextSibling)\n }\n\n // Add onclick listener to document to closeContent if clicked outside\n document.addEventListener('click', this.documentClick)\n\n // Add window resize listener to moveContent if window size changes\n window.addEventListener('resize', this.windowResize, false)\n\n // If the user wants to show the content forcibly on a specific side,\n // there is no need to listen for scroll events\n if (this.settings.openPosition === 'auto') {\n window.addEventListener('scroll', this.windowScroll, false)\n }\n\n // If disabled lets call it\n if (!this.settings.isEnabled) {\n this.disable()\n }\n\n // If alwaysOpnen then open it\n if (this.settings.alwaysOpen) {\n this.open()\n }\n\n // Add SlimSelect to select element\n ;(this.selectEl as any).slim = this\n }\n\n // Set to enabled and remove disabled classes\n public enable(): void {\n this.settings.isEnabled = true\n\n this.select.enable()\n this.render.enable()\n }\n\n // Set to disabled and add disabled classes\n public disable(): void {\n this.settings.isEnabled = false\n\n this.select.disable()\n this.render.disable()\n }\n\n public getData(): DataArray {\n return this.store.getData()\n }\n\n public setData(data: DataArrayPartial): void {\n // Validate data\n const err = this.store.validateDataArray(data)\n if (err) {\n if (this.events.error) {\n this.events.error(err)\n }\n return\n }\n\n // Update the store\n this.store.setData(data)\n const dataClean = this.store.getData()\n\n // Update original select element\n this.select.updateOptions(dataClean)\n\n // Update the render\n this.render.renderValues()\n this.render.renderOptions(dataClean)\n }\n\n public getSelected(): string[] {\n return this.store.getSelected()\n }\n\n public setSelected(value: string | string[]): void {\n // Update the store\n this.store.setSelectedBy('value', Array.isArray(value) ? value : [value])\n const data = this.store.getData()\n\n // Update the select element\n this.select.updateOptions(data)\n\n // Update the render\n this.render.renderValues()\n this.render.renderOptions(data)\n }\n\n public addOption(option: OptionOptional): void {\n // Add option to store\n this.store.addOption(option)\n const data = this.store.getData()\n\n // Update the select element\n this.select.updateOptions(data)\n\n // Update the render\n this.render.renderValues()\n this.render.renderOptions(data)\n }\n\n public open(): void {\n // Dont open if disabled\n // Dont do anything if the content is already open\n if (!this.settings.isEnabled || this.settings.isOpen) {\n return\n }\n\n // Run beforeOpen callback\n if (this.events.beforeOpen) {\n this.events.beforeOpen()\n }\n\n // Tell render to open\n this.render.open()\n\n // Focus on input field only if search is enabled\n if (this.settings.showSearch) {\n this.render.searchFocus(false)\n }\n\n // setTimeout is for animation completion\n setTimeout(() => {\n // Run afterOpen callback\n if (this.events.afterOpen) {\n this.events.afterOpen()\n }\n\n // Update settings\n this.settings.isOpen = true\n }, this.settings.timeoutDelay)\n\n // Start an interval to check if main has moved\n // in order to keep content close to main\n if (this.settings.intervalMove) {\n clearInterval(this.settings.intervalMove)\n }\n this.settings.intervalMove = setInterval(this.render.moveContent.bind(this.render), 500)\n }\n\n public close(): void {\n // Dont do anything if the content is already closed\n // Dont do anything if alwaysOpen is true\n if (!this.settings.isOpen || this.settings.alwaysOpen) {\n return\n }\n\n // Run beforeClose calback\n if (this.events.beforeClose) {\n this.events.beforeClose()\n }\n\n // Tell render to close\n this.render.close()\n\n // Clear search\n this.search('') // Clear search\n\n // If we arent tabbing focus back on the main element\n this.render.mainFocus(false)\n\n // Reset the content below\n setTimeout(() => {\n // Run afterClose callback\n if (this.events.afterClose) {\n this.events.afterClose()\n }\n\n // Update settings\n this.settings.isOpen = false\n }, this.settings.timeoutDelay)\n\n if (this.settings.intervalMove) {\n clearInterval(this.settings.intervalMove)\n }\n }\n\n // Take in string value and search current options\n public search(value: string): void {\n // If the passed in value is not the same as the search input value\n // then lets update the search input value\n if (this.render.content.search.input.value !== value) {\n this.render.content.search.input.value = value\n }\n\n // If no search event run regular search\n if (!this.events.search) {\n // If value is empty then render all options\n this.render.renderOptions(\n value === '' ? this.store.getData() : this.store.search(value, this.events.searchFilter!),\n )\n return\n }\n\n // Search event exists so lets render the searching text\n this.render.renderSearching()\n\n // Based upon the search event deal with the response\n const searchResp = this.events.search(value, this.store.getSelectedOptions())\n\n // If the search event returns a promise\n if (searchResp instanceof Promise) {\n searchResp\n .then((data: DataArrayPartial) => {\n // Update the render with the new data\n this.render.renderOptions(this.store.partialToFullData(data))\n })\n .catch((err: Error | string) => {\n // Update the render with error\n this.render.renderError(typeof err === 'string' ? err : err.message)\n })\n\n return\n } else if (Array.isArray(searchResp)) {\n // Update the render options\n this.render.renderOptions(this.store.partialToFullData(searchResp))\n } else {\n // Update the render with error\n this.render.renderError('Search event must return a promise or an array of data')\n }\n }\n\n public destroy(): void {\n // Remove all event listeners\n document.removeEventListener('click', this.documentClick)\n window.removeEventListener('resize', this.windowResize, false)\n if (this.settings.openPosition === 'auto') {\n window.removeEventListener('scroll', this.windowScroll, false)\n }\n\n // Delete the store data\n this.store.setData([])\n\n // Remove the render\n this.render.destroy()\n\n // Show the original select element\n this.select.destroy()\n }\n\n private windowResize: (e: Event) => void = debounce(() => {\n if (!this.settings.isOpen) {\n return\n }\n\n this.render.moveContent()\n })\n\n // Event listener for window scrolling\n private windowScroll: (e: Event) => void = debounce(() => {\n // If the content is not open, there is no need to move it\n if (!this.settings.isOpen) {\n return\n }\n\n // If openContent is not auto set content\n if (this.settings.openPosition === 'down') {\n this.render.moveContentBelow()\n return\n } else if (this.settings.openPosition === 'up') {\n this.render.moveContentAbove()\n return\n }\n\n // Determine where to put the content\n if (this.settings.contentPosition === 'relative') {\n this.render.moveContentBelow()\n } else if (this.render.putContent(this.render.content.main, this.settings.isOpen) === 'up') {\n this.render.moveContentAbove()\n } else {\n this.render.moveContentBelow()\n }\n })\n\n // Event listener for document click\n private documentClick: (e: Event) => void = (e: Event) => {\n // If the content is not open, there is no need to close it\n if (!this.settings.isOpen) {\n return\n }\n\n // Check if the click was on the content by looking at the parents\n if (e.target && !hasClassInTree(e.target as HTMLElement, this.settings.id)) {\n this.close()\n }\n }\n}\n"],"names":["generateID","Math","random","toString","substring","hasClassInTree","element","className","hasClass","e","c","classList","contains","dataset","id","parentByClass","document","parentNode","debounce","func","wait","immediate","timeout","args","context","self","callNow","clearTimeout","setTimeout","apply","kebabCase","str","result","replace","match","toLowerCase","toUpperCase","Optgroup","constructor","optgroup","this","label","options","o","push","Option","option","value","undefined","text","html","selected","display","disabled","mandatory","placeholder","class","style","data","Store","type","selectType","setData","validateDataArray","Array","isArray","Error","dataObj","validateOption","partialToFullData","dataFinal","forEach","optOptions","length","setSelectedBy","getSelected","getData","filter","getDataOptions","addOption","concat","selectedType","selectedValues","firstOption","hasSelected","includes","selectedOptions","getSelectedOptions","opt","getSelectedIDs","selectedIDs","op","getOptionByID","search","searchFilter","trim","includeOptgroup","dataSearch","Render","settings","store","callbacks","classes","main","values","single","valueText","valueDelete","valueOut","deselect","deselectPath","arrow","arrowClose","arrowOpen","content","openAbove","openBelow","searchHighlighter","searching","addable","addablePath","list","optgroupLabel","optgroupSelectable","optionSelected","optionDelete","highlighted","error","hide","mainDiv","contentDiv","renderValues","renderOptions","contentLocation","appendChild","enable","remove","input","disable","add","open","path","setAttribute","openPosition","moveContent","contentPosition","moveContentBelow","moveContentAbove","putContent","isOpen","selectedId","selectedOption","querySelector","ensureElementInView","close","createElement","tabIndex","cssText","onfocus","triggerFocus","onkeydown","key","highlight","click","onclick","isEnabled","allowDeselect","isMultiple","stopPropagation","setSelected","deselectSvg","createElementNS","arrowPath","alwaysOpen","svg","mainFocus","trigger","focus","preventScroll","placeholderOption","placeholderText","innerHTML","renderMultipleValues","renderSingleValue","selectedSingle","singleValue","outerHTML","currentNodes","childNodes","removeNodes","i","node","getAttribute","n","removeChild","d","shouldAdd","String","multipleValue","insertBefore","insertAdjacentElement","deleteDiv","preventDefault","shouldDelete","before","after","minSelected","beforeChange","closeOnSelect","afterChange","deleteSvg","deletePath","searchDiv","listDiv","containerRect","getBoundingClientRect","top","height","window","scrollY","left","scrollX","width","searchReturn","showSearch","readOnly","searchPlaceholder","oninput","target","ctrlKey","plus","plusPath","inputValue","addableValue","searchFocus","getOptions","notPlaceholder","notDisabled","notHidden","query","from","querySelectorAll","dir","renderError","errorDiv","textContent","renderSearching","searchingDiv","searchingText","noResults","searchText","optgroupEl","selectByGroup","addEventListener","childEl","children","indexOf","optionEl","split","dataClass","searchHighlight","textOrHtml","highlightText","showOptionTooltips","hideSelected","currentTarget","elementID","maxSelected","shouldUpdate","map","destroy","completedString","regex","RegExp","matchStartPosition","index","matchEndPosition","originalTextFoundByRegex","offsetHeight","margin","transformOrigin","container","cTop","scrollTop","offsetTop","cBottom","clientHeight","eTop","eBottom","el","rect","elemTop","elemBottom","bottom","innerHeight","Select","select","listen","observer","disconnectObserver","connectObserver","hideUI","showUI","removeAttribute","changeListen","on","addSelectChangeListener","onSelectChange","addObserver","removeSelectChangeListener","addValueChangeListener","onValueChange","valueChange","bind","removeValueChangeListener","removeEventListener","ev","getSelectedValues","observeWrapper","mutations","MutationObserver","observe","attributes","childList","characterData","subtree","disconnect","nodes","nodeName","getDataFromOptgroup","getDataFromOption","optgroupOptions","oo","updateSelect","updateOptions","createOptgroup","createOption","info","optionClass","Object","keys","Settings","intervalMove","mainHeight","contentHeight","body","timeoutDelay","SlimSelect","config","events","beforeOpen","afterOpen","beforeClose","afterClose","windowResize","render","windowScroll","documentClick","selectEl","tagName","ssid","hasOwnProperty","multiple","nextSibling","slim","err","dataClean","clearInterval","setInterval","searchResp","Promise","then","catch","message"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var SlimSelect=function(e){"use strict";function t(){return Math.random().toString(36).substring(2,10)}function s(e,t){function s(e,s){return s&&e&&e.classList&&e.classList.contains(s)||s&&e&&e.dataset&&e.dataset.id&&e.dataset.id===t?e:null}return s(e,t)||function e(t,i){return t&&t!==document?s(t,i)?t:e(t.parentNode,i):null}(e,t)}function i(e,t=50,s=!1){let i;return function(...n){const a=self,l=s&&!i;clearTimeout(i),i=setTimeout((()=>{i=null,s||e.apply(a,n)}),t),l&&e.apply(a,n)}}function n(e){const t=e.replace(/[A-Z\u00C0-\u00D6\u00D8-\u00DE]/g,(e=>"-"+e.toLowerCase()));return e[0]===e[0].toUpperCase()?t.substring(1):t}class a{constructor(e){if(this.id=e.id&&""!==e.id?e.id:t(),this.label=e.label||"",this.options=[],e.options)for(const t of e.options)this.options.push(new l(t))}}class l{constructor(e){this.id=e.id&&""!==e.id?e.id:t(),this.value=void 0===e.value?e.text:e.value,this.text=e.text||"",this.html=e.html||"",this.selected=void 0!==e.selected&&e.selected,this.display=void 0===e.display||e.display,this.disabled=void 0!==e.disabled&&e.disabled,this.mandatory=void 0!==e.mandatory&&e.mandatory,this.placeholder=void 0!==e.placeholder&&e.placeholder,this.class=e.class||"",this.style=e.style||"",this.data=e.data||{}}}class o{constructor(e,t){this.selectType="single",this.data=[],this.selectType=e,this.setData(t)}validateDataArray(e){if(!Array.isArray(e))return new Error("Data must be an array");for(let t of e){if(!(t instanceof a||"label"in t))return t instanceof l||"text"in t?this.validateOption(t):new Error("Data object must be a valid optgroup or option");if(!("label"in t))return new Error("Optgroup must have a label");if("options"in t&&t.options)for(let e of t.options)return this.validateOption(e)}return null}validateOption(e){return"text"in e?null:new Error("Option must have a text")}partialToFullData(e){let t=[];return e.forEach((e=>{if(e instanceof a||"label"in e){let s=[];"options"in e&&e.options&&e.options.forEach((e=>{s.push(new l(e))})),s.length>0&&t.push(new a(e))}(e instanceof l||"text"in e)&&t.push(new l(e))})),t}setData(e){this.data=this.partialToFullData(e),"single"===this.selectType&&this.setSelectedBy("value",this.getSelected())}getData(){return this.filter(null,!0)}getDataOptions(){return this.filter(null,!1)}addOption(e){this.setData(this.getData().concat(new l(e)))}setSelectedBy(e,t){let s=null,i=!1;for(let n of this.data){if(n instanceof a)for(let a of n.options)s||(s=a),a.selected=!i&&t.includes(a[e]),a.selected&&"single"===this.selectType&&(i=!0);n instanceof l&&(s||(s=n),n.selected=!i&&t.includes(n[e]),n.selected&&"single"===this.selectType&&(i=!0))}"single"===this.selectType&&s&&!i&&(s.selected=!0)}getSelected(){let e=this.getSelectedOptions(),t=[];return e.forEach((e=>{t.push(e.value)})),t}getSelectedOptions(){return this.filter((e=>e.selected),!1)}getSelectedIDs(){let e=this.getSelectedOptions(),t=[];return e.forEach((e=>{t.push(e.id)})),t}getOptionByID(e){let t=this.filter((t=>t.id===e),!1);return t.length?t[0]:null}search(e,t){return""===(e=e.trim())?this.getData():this.filter((s=>t(s,e)),!0)}filter(e,t){const s=[];return this.data.forEach((i=>{if(i instanceof a)if(t){let t=[];i.options.forEach((s=>{e&&!e(s)||t.push(new l(s))})),t.length>0&&s.push(new a({id:i.id,label:i.label,options:t}))}else i.options.forEach((t=>{e&&e(t)&&s.push(t)}));i instanceof l&&(e&&!e(i)||s.push(new l(i)))})),s}}class h{constructor(e,t,s){this.classes={main:"ss-main",placeholder:"ss-placeholder",values:"ss-values",single:"ss-single",value:"ss-value",valueText:"ss-value-text",valueDelete:"ss-value-delete",valueOut:"ss-value-out",deselect:"ss-deselect",deselectPath:"M10,10 L90,90 M10,90 L90,10",arrow:"ss-arrow",arrowClose:"M10,30 L50,70 L90,30",arrowOpen:"M10,70 L50,30 L90,70",content:"ss-content",openAbove:"ss-open-above",openBelow:"ss-open-below",search:"ss-search",searchHighlighter:"ss-search-highlight",searching:"ss-searching",addable:"ss-addable",addablePath:"M50,10 L50,90 M10,50 L90,50",list:"ss-list",optgroup:"ss-optgroup",optgroupLabel:"ss-optgroup-label",optgroupSelectable:"ss-optgroup-selectable",option:"ss-option",optionSelected:"ss-option-selected",optionDelete:"M10,10 L90,90 M10,90 L90,10",highlighted:"ss-highlighted",error:"ss-error",disabled:"ss-disabled",hide:"ss-hide"},this.store=t,this.settings=e,this.callbacks=s,this.main=this.mainDiv(),this.content=this.contentDiv(),this.renderValues(),this.renderOptions(this.store.getData()),this.settings.contentLocation.appendChild(this.content.main)}enable(){this.main.main.classList.remove(this.classes.disabled),this.content.search.input.disabled=!1}disable(){this.main.main.classList.add(this.classes.disabled),this.content.search.input.disabled=!0}open(){this.main.arrow.path.setAttribute("d",this.classes.arrowOpen),this.main.main.classList.add("up"===this.settings.openPosition?this.classes.openAbove:this.classes.openBelow),this.moveContent(),this.renderOptions(this.store.getData()),"relative"===this.settings.contentPosition?this.moveContentBelow():"up"===this.settings.openPosition.toLowerCase()?this.moveContentAbove():"down"===this.settings.openPosition.toLowerCase()?this.moveContentBelow():"up"===this.putContent(this.content.main,this.settings.isOpen)?this.moveContentAbove():this.moveContentBelow();const e=this.store.getSelectedOptions();if(e.length){const t=e[e.length-1].id,s=this.content.list.querySelector('[data-id="'+t+'"]');s&&this.ensureElementInView(this.content.list,s)}}close(){this.main.main.classList.remove(this.classes.openAbove),this.main.main.classList.remove(this.classes.openBelow),this.content.main.classList.remove(this.classes.openAbove),this.content.main.classList.remove(this.classes.openBelow),this.main.arrow.path.setAttribute("d",this.classes.arrowClose)}mainDiv(){const e=document.createElement("div");if(e.tabIndex=0,e.style.cssText=""!==this.settings.style?this.settings.style:"",e.className="",e.classList.add(this.settings.id),e.classList.add(this.classes.main),this.settings.class)for(const t of this.settings.class)""!==t.trim()&&e.classList.add(t.trim());e.onfocus=()=>{this.settings.triggerFocus&&this.callbacks.open()},e.onkeydown=e=>{switch(e.key){case"ArrowUp":case"ArrowDown":return this.callbacks.open(),"ArrowDown"===e.key?this.highlight("down"):this.highlight("up"),!1;case"Tab":return this.callbacks.close(),!0;case"Enter":const t=this.content.list.querySelector("."+this.classes.highlighted);return t&&t.click(),!1;case"Escape":return this.callbacks.close(),!1}},e.onclick=e=>{this.settings.isEnabled&&(this.settings.isOpen?this.callbacks.close():this.callbacks.open())};const t=document.createElement("div");t.classList.add(this.classes.values),e.appendChild(t);const s=document.createElement("div");s.classList.add(this.classes.deselect),this.settings.allowDeselect&&!this.settings.isMultiple||s.classList.add(this.classes.hide),s.onclick=e=>{e.stopPropagation(),this.settings.isEnabled&&this.callbacks.setSelected([""])};const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.setAttribute("viewBox","0 0 100 100");const n=document.createElementNS("http://www.w3.org/2000/svg","path");n.setAttribute("d",this.classes.deselectPath),i.appendChild(n),s.appendChild(i),e.appendChild(s);const a=document.createElementNS("http://www.w3.org/2000/svg","svg");a.classList.add(this.classes.arrow),a.setAttribute("viewBox","0 0 100 100");const l=document.createElementNS("http://www.w3.org/2000/svg","path");return l.setAttribute("d",this.classes.arrowClose),this.settings.alwaysOpen&&a.classList.add(this.classes.hide),a.appendChild(l),e.appendChild(a),{main:e,values:t,deselect:{main:s,svg:i,path:n},arrow:{main:a,path:l}}}mainFocus(e){e||(this.settings.triggerFocus=!1),this.main.main.focus({preventScroll:!0}),this.settings.triggerFocus=!0}placeholder(){const e=this.store.filter((e=>e.placeholder),!1);let t=this.settings.placeholderText;e.length&&(""!==e[0].html?t=e[0].html:""!==e[0].text&&(t=e[0].text));const s=document.createElement("div");return s.classList.add(this.classes.placeholder),s.innerHTML=t,s}renderValues(){this.settings.isMultiple?this.renderMultipleValues():this.renderSingleValue()}renderSingleValue(){const e=this.store.filter((e=>e.selected&&!e.placeholder),!1),t=e.length>0?e[0]:null;if(t){const e=document.createElement("div");e.classList.add(this.classes.single),e.innerHTML=t.html?t.html:t.text,this.main.values.innerHTML=e.outerHTML}else this.main.values.innerHTML=this.placeholder().outerHTML;this.settings.allowDeselect&&e.length?this.main.deselect.main.classList.remove(this.classes.hide):this.main.deselect.main.classList.add(this.classes.hide)}renderMultipleValues(){let e=this.main.values.childNodes,t=this.store.filter((e=>e.selected&&e.display),!1);if(0===t.length)return void(this.main.values.innerHTML=this.placeholder().outerHTML);{const e=this.main.values.querySelector("."+this.classes.placeholder);e&&e.remove()}let s=[];for(let i=0;i<e.length;i++){const n=e[i],a=n.getAttribute("data-id");if(a){t.filter((e=>e.id===a),!1).length||s.push(n)}}for(const e of s)e.classList.add(this.classes.valueOut),setTimeout((()=>{this.main.values.removeChild(e)}),100);e=this.main.values.childNodes;for(let s=0;s<t.length;s++){let i=!0;for(let n=0;n<e.length;n++)t[s].id===String(e[n].dataset.id)&&(i=!1);i&&(0===e.length?this.main.values.appendChild(this.multipleValue(t[s])):0===s?this.main.values.insertBefore(this.multipleValue(t[s]),e[s]):e[s-1].insertAdjacentElement("afterend",this.multipleValue(t[s])))}}multipleValue(e){const t=document.createElement("div");t.classList.add(this.classes.value),t.dataset.id=e.id;const s=document.createElement("div");if(s.classList.add(this.classes.valueText),s.innerHTML=e.text,t.appendChild(s),!e.mandatory){const s=document.createElement("div");s.classList.add(this.classes.valueDelete),s.onclick=t=>{t.preventDefault(),t.stopPropagation();let s=!0;const i=this.store.getSelectedOptions(),n=i.filter((t=>t.selected&&t.id!==e.id),!0);if(!(this.settings.minSelected&&n.length<this.settings.minSelected)&&(this.callbacks.beforeChange&&(s=!0===this.callbacks.beforeChange(n,i)),s)){let e=[];for(const t of n){if(t instanceof a)for(const s of t.options)e.push(s.value);t instanceof l&&e.push(t.value)}this.callbacks.setSelected(e),this.settings.closeOnSelect&&this.callbacks.close(),this.callbacks.afterChange&&this.callbacks.afterChange(n)}};const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.setAttribute("viewBox","0 0 100 100");const n=document.createElementNS("http://www.w3.org/2000/svg","path");n.setAttribute("d",this.classes.optionDelete),i.appendChild(n),s.appendChild(i),t.appendChild(s)}return t}contentDiv(){const e=document.createElement("div");if(e.classList.add(this.classes.content),e.dataset.id=this.settings.id,""!==this.settings.style&&(e.style.cssText=this.settings.style),"relative"===this.settings.contentPosition&&e.classList.add("ss-"+this.settings.contentPosition),this.settings.class.length)for(const t of this.settings.class)""!==t.trim()&&e.classList.add(t.trim());const t=this.searchDiv();e.appendChild(t.main);const s=this.listDiv();return e.appendChild(s),{main:e,search:t,list:s}}moveContent(){if("relative"===this.settings.contentPosition)return;const e=this.main.main.getBoundingClientRect();this.content.main.style.top=e.top+e.height+window.scrollY+"px",this.content.main.style.left=e.left+window.scrollX+"px",this.content.main.style.width=e.width+"px"}searchDiv(){const e=document.createElement("div"),t=document.createElement("input"),s=document.createElement("div");e.classList.add(this.classes.search);const n={main:e,input:t};if(this.settings.showSearch||(e.classList.add(this.classes.hide),t.readOnly=!0),t.type="search",t.placeholder=this.settings.searchPlaceholder,t.tabIndex=-1,t.setAttribute("aria-label",this.settings.searchPlaceholder),t.setAttribute("autocapitalize","off"),t.setAttribute("autocomplete","off"),t.setAttribute("autocorrect","off"),t.oninput=i((e=>{this.callbacks.search(e.target.value)}),100),t.onkeydown=e=>{switch(e.key){case"ArrowUp":case"ArrowDown":return this.callbacks.open(),"ArrowDown"===e.key?this.highlight("down"):this.highlight("up"),!1;case"Tab":return this.callbacks.close(),!0;case"Escape":return this.callbacks.close(),!1;case"Enter":if(this.callbacks.addable&&e.ctrlKey)s.click();else{const e=this.content.list.querySelector("."+this.classes.highlighted);e&&e.click()}return!1}},t.onfocus=()=>{this.settings.isOpen||this.callbacks.open()},e.appendChild(t),this.callbacks.addable){s.classList.add(this.classes.addable);const t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttribute("viewBox","0 0 100 100");const i=document.createElementNS("http://www.w3.org/2000/svg","path");i.setAttribute("d",this.classes.addablePath),t.appendChild(i),s.appendChild(t),s.onclick=e=>{if(e.preventDefault(),e.stopPropagation(),!this.callbacks.addable)return;const t=this.content.search.input.value.trim();if(""===t)return void this.content.search.input.focus();const s=this.callbacks.addable(t);"string"==typeof s?this.callbacks.addOption(new l({text:s,value:s})):this.callbacks.addOption(new l(s)),this.callbacks.setSelected([t]),this.callbacks.search(""),this.settings.closeOnSelect&&setTimeout((()=>{this.callbacks.close()}),100)},e.appendChild(s),n.addable={main:s,svg:t,path:i}}return n}searchFocus(e){e||(this.settings.triggerFocus=!1),this.content.search.input.focus(),this.settings.triggerFocus=!0}getOptions(e=!1,t=!1,s=!1){let i="."+this.classes.option;return e&&(i+=":not(."+this.classes.placeholder+")"),t&&(i+=":not(."+this.classes.disabled+")"),s&&(i+=":not(."+this.classes.hide+")"),Array.from(this.content.list.querySelectorAll(i))}highlight(e){const t=this.getOptions(!0,!0,!0);if(0!==t.length)if(1!==t.length||t[0].classList.contains(this.classes.highlighted)){for(let s=0;s<t.length;s++)if(t[s].classList.contains(this.classes.highlighted))return t[s].classList.remove(this.classes.highlighted),void("down"===e?s+1<t.length?(t[s+1].classList.add(this.classes.highlighted),this.ensureElementInView(this.content.list,t[s+1])):(t[0].classList.add(this.classes.highlighted),this.ensureElementInView(this.content.list,t[0])):s-1>=0?(t[s-1].classList.add(this.classes.highlighted),this.ensureElementInView(this.content.list,t[s-1])):(t[t.length-1].classList.add(this.classes.highlighted),this.ensureElementInView(this.content.list,t[t.length-1])));t["down"===e?0:t.length-1].classList.add(this.classes.highlighted),this.ensureElementInView(this.content.list,t["down"===e?0:t.length-1])}else t[0].classList.add(this.classes.highlighted)}listDiv(){const e=document.createElement("div");return e.classList.add(this.classes.list),e.setAttribute("role","listbox"),e}renderError(e){this.content.list.innerHTML="";const t=document.createElement("div");t.classList.add(this.classes.error),t.textContent=e,this.content.list.appendChild(t)}renderSearching(){this.content.list.innerHTML="";const e=document.createElement("div");e.classList.add(this.classes.searching),e.textContent=this.settings.searchingText,this.content.list.appendChild(e)}renderOptions(e){if(this.content.list.innerHTML="",0===e.length){const e=document.createElement("div");return e.classList.add(this.classes.option),e.classList.add(this.classes.disabled),e.innerHTML=this.settings.searchText,void this.content.list.appendChild(e)}for(const t of e){if(t instanceof a){const e=document.createElement("div");e.classList.add(this.classes.optgroup);const s=document.createElement("div");s.classList.add(this.classes.optgroupLabel),s.innerHTML=t.label,this.settings.selectByGroup&&this.settings.isMultiple&&(s.classList.add(this.classes.optgroupSelectable),s.addEventListener("click",(t=>{t.preventDefault(),t.stopPropagation();for(const t of e.children)-1!==t.className.indexOf(this.classes.option)&&t.click()}))),e.appendChild(s);for(const s of t.options)e.appendChild(this.option(s));this.content.list.appendChild(e)}t instanceof l&&this.content.list.appendChild(this.option(t))}}option(e){if(e.placeholder){const e=document.createElement("div");return e.classList.add(this.classes.option),e.classList.add(this.classes.hide),e}const t=document.createElement("div");if(t.dataset.id=e.id,t.classList.add(this.classes.option),t.setAttribute("role","option"),e.class&&e.class.split(" ").forEach((e=>{t.classList.add(e)})),e.style&&(t.style.cssText=e.style),this.settings.searchHighlight&&""!==this.content.search.input.value.trim()){const s=""!==e.html?e.html:e.text;t.innerHTML=this.highlightText(s,this.content.search.input.value,this.classes.searchHighlighter)}else""!==e.html?t.innerHTML=e.html:t.textContent=e.text;return this.settings.showOptionTooltips&&t.textContent&&t.setAttribute("title",t.textContent),(e.selected&&!this.settings.allowDeselect||e.disabled&&!this.settings.allowDeselect)&&t.classList.add(this.classes.disabled),e.selected&&this.settings.hideSelected&&t.classList.add(this.classes.hide),e.selected?t.classList.add(this.classes.optionSelected):t.classList.remove(this.classes.optionSelected),t.addEventListener("click",(t=>{t.preventDefault(),t.stopPropagation();const s=this.store.getSelected(),i=t.currentTarget,n=String(i.dataset.id);if(e.disabled||e.selected&&!this.settings.allowDeselect)return;if(this.settings.isMultiple&&Array.isArray(s)&&this.settings.maxSelected<=s.length)return;let a=!1;const l=this.store.getSelectedOptions();let o=[];this.settings.isMultiple&&(o=e.selected?l.filter((e=>e.id!==n)):l.concat(e)),this.settings.isMultiple||(o=e.selected?[]:[e]),this.callbacks.beforeChange||(a=!0),this.callbacks.beforeChange&&(a=!1!==this.callbacks.beforeChange(o,l)),a&&(this.store.getOptionByID(n)||this.callbacks.addOption(e),this.callbacks.setSelected(o.map((e=>e.value))),this.settings.closeOnSelect&&this.callbacks.close(),this.callbacks.afterChange&&this.callbacks.afterChange(o))})),t}destroy(){this.main.main.remove(),this.content.main.remove()}highlightText(e,t,s){let i=e;const n=new RegExp("("+t.trim()+")(?![^<]*>[^<>]*</)","i");if(!e.match(n))return e;const a=e.match(n).index,l=a+e.match(n)[0].toString().length,o=e.substring(a,l);return i=i.replace(n,`<mark class="${s}">${o}</mark>`),i}moveContentAbove(){const e=this.main.main.offsetHeight+this.content.main.offsetHeight-1;this.content.main.style.margin="-"+e+"px 0px 0px 0px",this.content.main.style.transformOrigin="center bottom",this.main.main.classList.remove(this.classes.openBelow),this.main.main.classList.add(this.classes.openAbove),this.content.main.classList.remove(this.classes.openBelow),this.content.main.classList.add(this.classes.openAbove)}moveContentBelow(){this.content.main.style.margin="-1px 0px 0px 0px",this.content.main.style.transformOrigin="center top",this.main.main.classList.remove(this.classes.openAbove),this.main.main.classList.add(this.classes.openBelow),this.content.main.classList.remove(this.classes.openAbove),this.content.main.classList.add(this.classes.openBelow)}ensureElementInView(e,t){const s=e.scrollTop+e.offsetTop,i=s+e.clientHeight,n=t.offsetTop,a=n+t.clientHeight;n<s?e.scrollTop-=s-n:a>i&&(e.scrollTop+=a-i)}putContent(e,t){const s=e.offsetHeight,i=e.getBoundingClientRect(),n=t?i.top:i.top-s,a=t?i.bottom:i.bottom+s;return n<=0?"down":a>=window.innerHeight?"up":"down"}}class c{constructor(e){this.listen=!1,this.observer=null,this.select=e}enable(){this.disconnectObserver(),this.select.disabled=!1,this.connectObserver()}disable(){this.disconnectObserver(),this.select.disabled=!0,this.connectObserver()}hideUI(){this.select.tabIndex=-1,this.select.style.display="none",this.select.setAttribute("aria-hidden","true")}showUI(){this.select.removeAttribute("tabindex"),this.select.style.display="",this.select.removeAttribute("aria-hidden")}changeListen(e){this.listen=e,this.listen?this.connectObserver():this.disconnectObserver()}addSelectChangeListener(e){this.onSelectChange=e,this.addObserver(),this.connectObserver(),this.changeListen(!0)}removeSelectChangeListener(){this.changeListen(!1),this.onSelectChange=void 0}addValueChangeListener(e){this.onValueChange=e,this.select.addEventListener("change",this.valueChange.bind(this))}removeValueChangeListener(){this.onValueChange=void 0,this.select.removeEventListener("change",this.valueChange.bind(this))}valueChange(e){this.onValueChange&&this.onValueChange(this.getSelectedValues())}observeWrapper(e){this.onSelectChange&&this.onSelectChange(this.getData())}addObserver(){this.observer&&(this.disconnectObserver(),this.observer=null),this.observer=new MutationObserver(this.observeWrapper)}connectObserver(){this.observer&&this.observer.observe(this.select,{attributes:!0,childList:!0,characterData:!0,subtree:!0})}disconnectObserver(){this.observer&&this.observer.disconnect()}getData(){let e=[];const t=this.select.childNodes;for(const s of t)"OPTGROUP"===s.nodeName&&e.push(this.getDataFromOptgroup(s)),"OPTION"===s.nodeName&&e.push(this.getDataFromOption(s));return e}getDataFromOptgroup(e){let t={id:"",label:e.label,options:[]};const s=e.childNodes;for(const e of s)"OPTION"===e.nodeName&&t.options.push(this.getDataFromOption(e));return t}getSelectedValues(){let e=[];const t=this.select.childNodes;for(const s of t){if("OPTGROUP"===s.nodeName){const t=s.childNodes;for(const s of t)if("OPTION"===s.nodeName){const t=s;t.selected&&e.push(t.value)}}if("OPTION"===s.nodeName){const t=s;t.selected&&e.push(t.value)}}return e}getDataFromOption(e){return{id:!!e.dataset&&e.dataset.id||t(),value:e.value,text:e.text,html:e.innerHTML,selected:e.selected,display:"none"!==e.style.display,disabled:e.disabled,mandatory:!!e.dataset&&"true"===e.dataset.mandatory,placeholder:"true"===e.dataset.placeholder,class:e.className,style:e.style.cssText,data:e.dataset}}setSelected(e){const t=this.select.childNodes;for(const s of t){if("OPTGROUP"===s.nodeName){const t=s.childNodes;for(const s of t)if("OPTION"===s.nodeName){const t=s;t.selected=e.includes(t.value)}}if("OPTION"===s.nodeName){const t=s;t.selected=e.includes(t.value)}}}updateSelect(e,t,s){this.changeListen(!1),e&&(this.select.id=e),t&&(this.select.style.cssText=t),s&&(this.select.className="",s.forEach((e=>{""!==e.trim()&&this.select.classList.add(e.trim())}))),this.changeListen(!0)}updateOptions(e){this.changeListen(!1),this.select.innerHTML="";for(const t of e)t instanceof a&&this.select.appendChild(this.createOptgroup(t)),t instanceof l&&this.select.appendChild(this.createOption(t));this.changeListen(!0)}createOptgroup(e){const t=document.createElement("optgroup");if(t.id=e.id,t.label=e.label,e.options)for(const s of e.options)t.appendChild(this.createOption(s));return t}createOption(e){const t=document.createElement("option");return t.value=""!==e.value?e.value:e.text,t.innerHTML=e.html||e.text,e.selected&&(t.selected=e.selected),e.disabled&&(t.disabled=!0),!1===e.display&&(t.style.display="none"),e.placeholder&&t.setAttribute("data-placeholder","true"),e.mandatory&&t.setAttribute("data-mandatory","true"),e.class&&e.class.split(" ").forEach((e=>{t.classList.add(e)})),e.data&&"object"==typeof e.data&&Object.keys(e.data).forEach((s=>{t.setAttribute("data-"+n(s),e.data[s])})),t}destroy(){this.changeListen(!1),this.disconnectObserver(),this.removeSelectChangeListener(),this.removeValueChangeListener(),this.showUI()}}class r{constructor(e){this.id="",this.style="",this.class=[],this.isMultiple=!1,this.isOpen=!1,this.triggerFocus=!0,this.intervalMove=null,this.mainHeight=30,this.contentHeight=0,e||(e={}),this.id="ss-"+t(),this.style=e.style||"",this.class=e.class||[],this.isEnabled=void 0===e.isEnabled||e.isEnabled,this.alwaysOpen=void 0!==e.alwaysOpen&&e.alwaysOpen,this.showSearch=void 0===e.showSearch||e.showSearch,this.searchPlaceholder=e.searchPlaceholder||"Search",this.searchText=e.searchText||"No Results",this.searchingText=e.searchingText||"Searching...",this.searchHighlight=void 0!==e.searchHighlight&&e.searchHighlight,this.closeOnSelect=void 0===e.closeOnSelect||e.closeOnSelect,this.contentLocation=e.contentLocation||document.body,this.contentPosition=e.contentPosition||"absolute",this.openPosition=e.openPosition||"auto",this.placeholderText=e.placeholderText||"Select Value",this.allowDeselect=void 0!==e.allowDeselect&&e.allowDeselect,this.hideSelected=void 0!==e.hideSelected&&e.hideSelected,this.showOptionTooltips=void 0!==e.showOptionTooltips&&e.showOptionTooltips,this.selectByGroup=void 0!==e.selectByGroup&&e.selectByGroup,this.minSelected=e.minSelected||0,this.maxSelected=e.maxSelected||1e3,this.timeoutDelay=e.timeoutDelay||200}}return e.Optgroup=a,e.Option=l,e.Render=h,e.Select=c,e.Settings=r,e.Store=o,e.debounce=i,e.default=class{constructor(e){if(this.events={search:void 0,searchFilter:(e,t)=>-1!==e.text.toLowerCase().indexOf(t.toLowerCase()),addable:void 0,beforeChange:void 0,afterChange:void 0,beforeOpen:void 0,afterOpen:void 0,beforeClose:void 0,afterClose:void 0},this.windowResize=i((()=>{this.settings.isOpen&&this.render.moveContent()})),this.windowScroll=i((()=>{this.settings.isOpen&&("down"!==this.settings.openPosition?"up"!==this.settings.openPosition?"relative"===this.settings.contentPosition?this.render.moveContentBelow():"up"===this.render.putContent(this.render.content.main,this.settings.isOpen)?this.render.moveContentAbove():this.render.moveContentBelow():this.render.moveContentAbove():this.render.moveContentBelow())})),this.documentClick=e=>{this.settings.isOpen&&e.target&&!s(e.target,this.settings.id)&&this.close()},this.selectEl="string"==typeof e.select?document.querySelector(e.select):e.select,!this.selectEl)return void(e.events&&e.events.error&&e.events.error(new Error("Could not find select element")));if("SELECT"!==this.selectEl.tagName)return void(e.events&&e.events.error&&e.events.error(new Error("Element isnt of type select")));this.selectEl.dataset.ssid&&this.destroy(),this.settings=new r(e.settings);for(const t in e.events)e.events.hasOwnProperty(t)&&(this.events[t]=e.events[t]);this.settings.isMultiple=this.selectEl.multiple,this.settings.style=this.selectEl.style.cssText,this.settings.class=this.selectEl.className.split(" "),this.select=new c(this.selectEl),this.select.updateSelect(this.settings.id,this.settings.style,this.settings.class),this.select.hideUI(),this.select.addSelectChangeListener((e=>{this.setData(e)})),this.select.addValueChangeListener((e=>{this.setSelected(e)})),this.store=new o(this.settings.isMultiple?"multiple":"single",e.data?e.data:this.select.getData()),e.data&&this.select.updateOptions(this.store.getData());const t={open:this.open.bind(this),close:this.close.bind(this),addable:this.events.addable?this.events.addable:void 0,setSelected:this.setSelected.bind(this),addOption:this.addOption.bind(this),search:this.search.bind(this),beforeChange:this.events.beforeChange,afterChange:this.events.afterChange};this.render=new h(this.settings,this.store,t),this.selectEl.parentNode&&this.selectEl.parentNode.insertBefore(this.render.main.main,this.selectEl.nextSibling),document.addEventListener("click",this.documentClick),window.addEventListener("resize",this.windowResize,!1),"auto"===this.settings.openPosition&&window.addEventListener("scroll",this.windowScroll,!1),this.settings.isEnabled||this.disable(),this.settings.alwaysOpen&&this.open(),this.selectEl.slim=this}enable(){this.settings.isEnabled=!0,this.select.enable(),this.render.enable()}disable(){this.settings.isEnabled=!1,this.select.disable(),this.render.disable()}getData(){return this.store.getData()}setData(e){const t=this.store.validateDataArray(e);if(t)return void(this.events.error&&this.events.error(t));this.store.setData(e);const s=this.store.getData();this.select.updateOptions(s),this.render.renderValues(),this.render.renderOptions(s)}getSelected(){return this.store.getSelected()}setSelected(e){this.store.setSelectedBy("value",Array.isArray(e)?e:[e]);const t=this.store.getData();this.select.updateOptions(t),this.render.renderValues(),this.render.renderOptions(t)}addOption(e){this.store.addOption(e);const t=this.store.getData();this.select.updateOptions(t),this.render.renderValues(),this.render.renderOptions(t)}open(){this.settings.isEnabled&&!this.settings.isOpen&&(this.events.beforeOpen&&this.events.beforeOpen(),this.render.open(),this.settings.showSearch&&this.render.searchFocus(!1),setTimeout((()=>{this.events.afterOpen&&this.events.afterOpen(),this.settings.isOpen=!0}),this.settings.timeoutDelay),this.settings.intervalMove&&clearInterval(this.settings.intervalMove),this.settings.intervalMove=setInterval(this.render.moveContent.bind(this.render),500))}close(){this.settings.isOpen&&!this.settings.alwaysOpen&&(this.events.beforeClose&&this.events.beforeClose(),this.render.close(),this.search(""),this.render.mainFocus(!1),setTimeout((()=>{this.events.afterClose&&this.events.afterClose(),this.settings.isOpen=!1}),this.settings.timeoutDelay),this.settings.intervalMove&&clearInterval(this.settings.intervalMove))}search(e){if(this.render.content.search.input.value!==e&&(this.render.content.search.input.value=e),!this.events.search)return void this.render.renderOptions(""===e?this.store.getData():this.store.search(e,this.events.searchFilter));this.render.renderSearching();const t=this.events.search(e,this.store.getSelectedOptions());t instanceof Promise?t.then((e=>{this.render.renderOptions(this.store.partialToFullData(e))})).catch((e=>{this.render.renderError("string"==typeof e?e:e.message)})):Array.isArray(t)?this.render.renderOptions(this.store.partialToFullData(t)):this.render.renderError("Search event must return a promise or an array of data")}destroy(){document.removeEventListener("click",this.documentClick),window.removeEventListener("resize",this.windowResize,!1),"auto"===this.settings.openPosition&&window.removeEventListener("scroll",this.windowScroll,!1),this.store.setData([]),this.render.destroy(),this.select.destroy()}},e.generateID=t,e.hasClassInTree=s,e.kebabCase=n,Object.defineProperty(e,"__esModule",{value:!0}),e}({});
2
+ //# sourceMappingURL=slimselect.global.js.map