@siemens/ix 2.2.0 → 2.2.1

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 (45) hide show
  1. package/components/dropdown.js +5 -2
  2. package/components/dropdown.js.map +1 -1
  3. package/components/ix-category-filter.js +1 -1
  4. package/components/ix-category-filter.js.map +1 -1
  5. package/components/ix-form-field.js +1 -1
  6. package/components/ix-form-field.js.map +1 -1
  7. package/components/time-picker.js +1 -1
  8. package/components/time-picker.js.map +1 -1
  9. package/dist/cjs/ix-category-filter.cjs.entry.js +1 -1
  10. package/dist/cjs/ix-category-filter.cjs.entry.js.map +1 -1
  11. package/dist/cjs/ix-dropdown.cjs.entry.js +5 -2
  12. package/dist/cjs/ix-dropdown.cjs.entry.js.map +1 -1
  13. package/dist/cjs/ix-form-field.cjs.entry.js +1 -1
  14. package/dist/cjs/ix-form-field.cjs.entry.js.map +1 -1
  15. package/dist/cjs/ix-time-picker.cjs.entry.js +1 -1
  16. package/dist/cjs/ix-time-picker.cjs.entry.js.map +1 -1
  17. package/dist/collection/components/category-filter/category-filter.css +60 -24
  18. package/dist/collection/components/dropdown/dropdown.js +5 -2
  19. package/dist/collection/components/dropdown/dropdown.js.map +1 -1
  20. package/dist/collection/components/form-field/form-field.css +30 -12
  21. package/dist/collection/components/time-picker/time-picker.css +30 -12
  22. package/dist/esm/ix-category-filter.entry.js +1 -1
  23. package/dist/esm/ix-category-filter.entry.js.map +1 -1
  24. package/dist/esm/ix-dropdown.entry.js +5 -2
  25. package/dist/esm/ix-dropdown.entry.js.map +1 -1
  26. package/dist/esm/ix-form-field.entry.js +1 -1
  27. package/dist/esm/ix-form-field.entry.js.map +1 -1
  28. package/dist/esm/ix-time-picker.entry.js +1 -1
  29. package/dist/esm/ix-time-picker.entry.js.map +1 -1
  30. package/dist/siemens-ix/p-4290098e.entry.js +2 -0
  31. package/dist/siemens-ix/{p-cb1c0d63.entry.js.map → p-4290098e.entry.js.map} +1 -1
  32. package/dist/siemens-ix/p-43a58a77.entry.js +2 -0
  33. package/dist/siemens-ix/{p-7289b0be.entry.js.map → p-43a58a77.entry.js.map} +1 -1
  34. package/dist/siemens-ix/p-6e63a875.entry.js +2 -0
  35. package/dist/siemens-ix/{p-04e5773b.entry.js.map → p-6e63a875.entry.js.map} +1 -1
  36. package/dist/siemens-ix/{p-1506f9ed.entry.js → p-a039faa9.entry.js} +2 -2
  37. package/dist/siemens-ix/{p-1506f9ed.entry.js.map → p-a039faa9.entry.js.map} +1 -1
  38. package/dist/siemens-ix/siemens-ix-core.css +1 -1
  39. package/dist/siemens-ix/siemens-ix.css +30 -12
  40. package/dist/siemens-ix/siemens-ix.esm.js +1 -1
  41. package/package.json +1 -1
  42. package/scss/components/form/_input.scss +11 -8
  43. package/dist/siemens-ix/p-04e5773b.entry.js +0 -2
  44. package/dist/siemens-ix/p-7289b0be.entry.js +0 -2
  45. package/dist/siemens-ix/p-cb1c0d63.entry.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"names":["categoryFilterCss","IxCategoryFilterStyle0","CategoryFilter","this","ID_CUSTOM_FILTER_VALUE","LogicalFilterOperator","EQUAL","watchFilterState","newValue","setFilterState","componentDidLoad","filterState","undefined","setTimeout","_a","hostElement","addEventListener","handleFormElementKeyDown","bind","_b","formElement","e","preventDefault","textInput","console","warn","hasFocus","inputValue","value","inputState","InputState","category","inputChanged","emit","handleInputElementKeyDown","state","filterTokens","token","tokens","addToken","categoryLogicalOperator","categories","id","operator","emitFilterEvent","closeDropdown","disabled","readonly","shadowRoot","querySelector","show","code","document","activeElement","classList","contains","getAttribute","hasCategorySelection","selectCategory","focusPreviousItem","showDropdown","focusNextItem","sibling","previousSibling","HTMLElement","focus","nextSibling","selector","item","stopPropagation","suggestions","length","tokenCount","removeToken","filter","map","filterChanged","emitEvent","newToken","trim","hasToken","pair","isScrollStateDirty","index","_","i","getCategoryIds","ids","Object","prototype","hasOwnProperty","call","push","categoryChanged","resetFilter","filterMultiples","repeatCategories","isCategoryAlreadySet","find","some","filterToken","hasSameValue","filterDuplicateTokens","filterByInput","toLowerCase","indexOf","toggleCategoryOperator","NOT_EQUAL","getFilterChipLabel","operatorString","label","_c","nonSelectableCategories","getFilteredSuggestions","renderPlainSuggestions","h","class","suggestion","onClick","key","title","renderOperatorButton","staticOperator","params","type","variant","outline","ghost","iconOnly","iconOval","selected","loading","icon","extraClasses","BaseButton","assign","getFilterOperatorString","renderCategoryValues","options","renderDropdownContent","renderCategorySelection","tabindex","getDropdownHeader","labelCategories","i18nPlainText","componentDidRender","tmpDisableScrollIntoView","scrollIntoView","getResetButton","oval","size","getIconColor","render","Host","ref","el","hideIcon","color","name","toString","animate__animated","animate__fadein","onCloseClick","autocomplete","placeholder","closeBehavior","offset","mainAxis","anchor","trigger","header"],"sources":["src/components/category-filter/category-filter.scss?tag=ix-category-filter&encapsulation=shadow","src/components/category-filter/category-filter.tsx"],"sourcesContent":["/*\n * SPDX-FileCopyrightText: 2023 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n@import 'common-variables';\n@import 'legacy/mixins/fonts';\n@import 'mixins/hover';\n@import 'mixins/shadows';\n@import 'mixins/shadow-dom/component';\n@import 'mixins/text-truncation';\n@import '../button/button';\n@import 'legacy/components/dropdown';\n@import 'legacy/components/forms';\n@import 'components/form/input';\n\n:host {\n @include ix-component;\n\n display: block;\n position: relative;\n height: auto;\n\n @include host-focus-visible {\n border-color: var(--theme-color-primary);\n box-shadow: 0 0 $tiny-space 0 var(--theme-color-primary) !important;\n }\n\n .reset-button {\n position: absolute;\n top: $tiny-space;\n right: $tiny-space;\n }\n\n .reset-button.hide-reset-button {\n display: none;\n }\n\n .input-container {\n &:not(.readonly):not(.disabled) {\n @include element-input('false');\n }\n\n &.disabled {\n color: var(--theme-input--color--disabled);\n border-bottom: var(--theme-input--border-thickness, 1px) solid\n var(--theme-input--border-color-bottom--disabled);\n }\n\n &.readonly {\n @include element-input;\n }\n\n display: flex;\n height: auto;\n max-height: 3.75rem;\n padding: 1px $large-space 1px 1.75rem !important;\n\n &.no-icon {\n padding-left: $tiny-space;\n }\n }\n\n .token-container {\n flex-grow: 1;\n overflow: hidden;\n }\n\n .text-input {\n @include ellipsis;\n @include text-default;\n width: auto;\n height: 1.75rem;\n min-height: $large-space;\n background: transparent;\n flex-grow: 1;\n box-shadow: none;\n\n &,\n &:hover,\n &:focus-visible {\n border: none;\n outline: none;\n }\n\n &.hide-placeholder::placeholder {\n opacity: 0;\n }\n }\n\n .list-unstyled {\n display: flex;\n flex-wrap: wrap;\n list-style: none;\n padding: 0;\n margin: 0;\n overflow-y: auto;\n }\n\n ix-icon {\n position: absolute;\n top: $small-space;\n left: $small-space;\n }\n\n ix-filter-chip {\n margin-right: $tiny-space;\n }\n\n .category-preview {\n display: flex;\n align-items: center;\n height: $large-space;\n background-color: var(--theme-bg-3);\n border-top-left-radius: $default-space;\n border-bottom-left-radius: $default-space;\n padding: $small-space;\n margin: 2px 0;\n }\n\n ul {\n height: 100%;\n }\n\n ul > li,\n input {\n padding-inline-start: 0;\n padding-top: 2px;\n padding-bottom: 2px;\n }\n\n ix-dropdown {\n min-width: 10rem !important;\n\n .dropdown-item-container {\n display: flex;\n flex-direction: column;\n\n .dropdown-item {\n @include text-default-single;\n @include ellipsis;\n @include focus-visible {\n border-color: var(--theme-color-focus-bdr);\n }\n\n height: $large-control-height;\n margin: $tiny-space $small-space;\n padding-inline: $small-space;\n border: 1px solid transparent;\n border-radius: 100rem;\n width: auto;\n justify-content: flex-start;\n flex-grow: 1;\n }\n\n .category-item {\n border-end-end-radius: 0;\n border-start-end-radius: 0;\n }\n\n .category-item-value {\n border-start-start-radius: 0;\n border-end-start-radius: 0;\n }\n }\n\n .btn-toggle-operator {\n width: 2rem;\n height: 2rem;\n margin-inline: $small-space;\n }\n }\n\n .d-none {\n display: none;\n }\n}\n","/*\n * SPDX-FileCopyrightText: 2023 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { BaseButton, BaseButtonProps } from '../button/base-button';\nimport { FilterState } from './filter-state';\nimport { InputState } from './input-state';\nimport { LogicalFilterOperator } from './logical-filter-operator';\n\n@Component({\n tag: 'ix-category-filter',\n styleUrl: 'category-filter.scss',\n shadow: true,\n})\nexport class CategoryFilter {\n private readonly ID_CUSTOM_FILTER_VALUE = 'CW_CUSTOM_FILTER_VALUE';\n\n @State() showDropdown: boolean;\n @State() private textInput?: HTMLInputElement;\n private formElement?: HTMLFormElement;\n private isScrollStateDirty: boolean;\n\n @Element() hostElement: HTMLIxCategoryFilterElement;\n\n @State() hasFocus: boolean;\n @State() categoryLogicalOperator = LogicalFilterOperator.EQUAL;\n @State() inputValue: string;\n @State() category: string;\n @State() filterTokens: Array<{\n id: string;\n value: string;\n operator: LogicalFilterOperator;\n }> = [];\n\n /**\n * If true the filter will be in disabled state\n */\n @Prop() disabled = false;\n\n /**\n * If true the filter will be in readonly mode\n */\n @Prop() readonly = false;\n\n /**\n * A set of search criteria to populate the component with.\n */\n @Prop() filterState: FilterState;\n\n /**\n * Placeholder text to be displayed in an empty input field.\n */\n @Prop() placeholder: string;\n\n /**\n * Configuration object hash used to populate the dropwdown menu for typeahead and quick selection functionality.\n * Each ID maps to an object with a label and an array of options to select from.\n */\n @Prop() categories: {\n [id: string]: {\n label: string;\n options: string[];\n };\n };\n\n /**\n * In certain use cases some categories may not be available for selection anymore.\n * To allow proper display of set filters with these categories this ID to label mapping can be populated.\n *\n * Configuration object hash used to supply labels to the filter chips in the input field.\n * Each ID maps to a string representing the label to display.\n */\n @Prop() nonSelectableCategories?: {\n [id: string]: string;\n } = {};\n\n /**\n * A list of strings that will be supplied as typeahead suggestions not tied to any categories.\n */\n @Prop() suggestions: string[];\n\n /**\n * The icon next to the actual text input\n * Defaults to 'search'\n */\n @Prop() icon = 'search';\n\n /**\n * Allows to hide the icon inside the text input.\n * Defaults to false\n */\n @Prop() hideIcon: boolean;\n\n /**\n * If set categories will always be filtered via the respective logical operator.\n * Toggling of the operator will not be available to the user.\n *\n * @since 2.2.0\n */\n @Prop() staticOperator?: LogicalFilterOperator;\n\n /**\n * If set to true allows that a single category can be set more than once.\n * An already set category will not appear in the category dropdown if set to false.\n *\n * Defaults to true\n */\n @Prop() repeatCategories = true;\n\n /**\n * @internal For debugging purposes only!\n */\n @Prop() tmpDisableScrollIntoView = true;\n\n /**\n * i18n\n */\n @Prop() labelCategories = 'Categories';\n\n /**\n * i18n\n */\n @Prop() i18nPlainText = 'Filter by text';\n\n /**\n * Event dispatched whenever the a category gets selected in the dropdown\n */\n @Event() categoryChanged: EventEmitter<string>;\n\n /**\n * Event dispatched whenever the text input changes.\n */\n @Event() inputChanged: EventEmitter<InputState>;\n\n /**\n * Event dispatched whenever the filter state changes.\n */\n @Event() filterChanged: EventEmitter<FilterState>;\n\n @Watch('filterState')\n watchFilterState(newValue) {\n this.setFilterState(newValue);\n }\n\n componentDidLoad() {\n if (this.filterState !== undefined) {\n setTimeout(() => this.setFilterState(this.filterState));\n }\n\n this.hostElement?.addEventListener(\n 'keydown',\n this.handleFormElementKeyDown.bind(this)\n );\n\n this.formElement?.addEventListener('submit', (e) => e.preventDefault());\n\n if (this.textInput == null) {\n console.warn(\n 'ix-category-filter - unable to add event listeners to native input element'\n );\n return;\n }\n\n this.textInput.addEventListener('focusin', () => {\n this.hasFocus = true;\n });\n this.textInput.addEventListener('focusout', () => (this.hasFocus = false));\n this.textInput.addEventListener('input', () => {\n this.inputValue = this.textInput.value;\n const inputState = new InputState(this.inputValue, this.category);\n this.inputChanged.emit(inputState);\n });\n this.textInput.addEventListener(\n 'keydown',\n this.handleInputElementKeyDown.bind(this)\n );\n }\n\n private setFilterState(state: FilterState) {\n this.filterTokens = [];\n\n for (const token of state.tokens) {\n this.addToken(\n token,\n this.ID_CUSTOM_FILTER_VALUE,\n this.categoryLogicalOperator,\n false\n );\n }\n\n for (const category of state.categories) {\n this.addToken(category.value, category.id, category.operator, false);\n }\n\n this.emitFilterEvent();\n }\n\n private closeDropdown() {\n if (this.disabled || this.readonly) {\n return;\n }\n\n this.hostElement.shadowRoot.querySelector('ix-dropdown').show = false;\n }\n\n private handleFormElementKeyDown(e: KeyboardEvent) {\n switch (e.code) {\n case 'Enter':\n case 'NumpadEnter':\n if (!document.activeElement.classList.contains('dropdown-item')) {\n return;\n }\n\n const token = document.activeElement.getAttribute('data-id');\n\n if (this.hasCategorySelection()) {\n if (this.category !== undefined) {\n this.addToken(token, this.category);\n } else if (\n document.activeElement.classList.contains('category-item-id')\n ) {\n this.selectCategory(token);\n }\n } else {\n this.addToken(token);\n }\n\n e.preventDefault();\n break;\n\n case 'ArrowUp':\n this.focusPreviousItem();\n e.preventDefault();\n break;\n\n case 'ArrowDown':\n this.showDropdown = true;\n this.focusNextItem();\n e.preventDefault();\n break;\n\n case 'Escape':\n this.closeDropdown();\n break;\n }\n }\n\n private focusPreviousItem() {\n const sibling = document.activeElement.previousSibling;\n if (sibling instanceof HTMLElement) {\n sibling.focus();\n }\n }\n\n private focusNextItem() {\n const sibling = document.activeElement.nextSibling;\n if (sibling instanceof HTMLElement) {\n sibling.focus();\n }\n }\n\n private handleInputElementKeyDown(e: KeyboardEvent) {\n switch (e.code) {\n case 'ArrowDown':\n const selector = `.category-item-${\n this.category !== undefined ? 'value' : 'id'\n }`;\n let item = this.hostElement.shadowRoot.querySelector(selector);\n\n if (item instanceof HTMLElement) {\n item.focus();\n e.stopPropagation();\n } else if (this.suggestions?.length) {\n item = this.hostElement.shadowRoot.querySelector('.category-item');\n if (item instanceof HTMLElement) {\n item.focus();\n e.stopPropagation();\n }\n }\n break;\n\n case 'Backspace':\n if (this.textInput.value !== '') {\n return;\n }\n\n if (this.category !== undefined) {\n this.category = undefined;\n return;\n }\n\n const tokenCount = this.filterTokens.length;\n if (tokenCount > 0) {\n this.removeToken(tokenCount - 1);\n }\n break;\n\n case 'Enter':\n case 'NumpadEnter':\n this.addToken(this.inputValue, this.category);\n e.preventDefault();\n break;\n }\n }\n\n private emitFilterEvent() {\n const tokens = this.filterTokens\n .filter((item) => item.id === this.ID_CUSTOM_FILTER_VALUE)\n .map((item) => item.value);\n const categories = this.filterTokens.filter(\n (item) => item.id !== this.ID_CUSTOM_FILTER_VALUE\n );\n const filterState: FilterState = {\n tokens,\n categories,\n };\n\n this.filterChanged.emit(filterState);\n }\n\n private addToken(\n token: string,\n category: string = this.ID_CUSTOM_FILTER_VALUE,\n operator = this.categoryLogicalOperator,\n emitEvent = true\n ) {\n if (token === undefined || token === null) {\n return;\n }\n\n const newToken = token.trim();\n\n if (newToken === '') {\n return;\n }\n\n if (this.hasToken(newToken)) {\n return;\n }\n\n const pair = { id: category, value: newToken, operator };\n this.filterTokens = [...this.filterTokens, pair];\n this.textInput.value = '';\n this.inputValue = '';\n this.categoryLogicalOperator = LogicalFilterOperator.EQUAL;\n\n if (this.category !== undefined) {\n this.category = undefined;\n }\n\n this.isScrollStateDirty = true;\n\n this.textInput.focus();\n\n if (emitEvent) {\n this.emitFilterEvent();\n }\n\n this.closeDropdown();\n }\n\n private removeToken(index: number) {\n this.filterTokens = this.filterTokens.filter((_, i) => i !== index);\n this.emitFilterEvent();\n }\n\n private getCategoryIds() {\n const ids = [];\n for (const id in this.categories) {\n if (Object.prototype.hasOwnProperty.call(this.categories, id)) {\n ids.push(id);\n }\n }\n\n return ids;\n }\n\n private selectCategory(category: string) {\n this.category = category;\n this.textInput.value = '';\n this.inputValue = '';\n this.textInput.focus();\n this.categoryChanged.emit(category);\n }\n\n private resetFilter(e: Event) {\n e.stopPropagation();\n this.closeDropdown();\n this.filterTokens = [];\n this.emitFilterEvent();\n }\n\n private filterMultiples(value: string) {\n if (this.repeatCategories) {\n return true;\n }\n\n const isCategoryAlreadySet = this.filterTokens.find(\n (token) => token.id === value\n );\n\n return !isCategoryAlreadySet;\n }\n\n private hasToken(token: string) {\n return this.filterTokens.some((filterToken) => {\n const hasSameValue = filterToken.value === token;\n\n if (!hasSameValue) {\n return false;\n }\n\n if (this.category !== undefined) {\n return this.category === filterToken.id;\n }\n\n if (filterToken.id) {\n return filterToken.id === this.ID_CUSTOM_FILTER_VALUE;\n }\n\n return hasSameValue;\n });\n }\n\n private filterDuplicateTokens(value: string) {\n return !this.hasToken(value);\n }\n\n private filterByInput(value: string) {\n if (this.inputValue === undefined || this.inputValue === '') {\n return true;\n }\n\n return value.toLowerCase().indexOf(this.inputValue.toLowerCase()) !== -1;\n }\n\n private toggleCategoryOperator() {\n switch (this.categoryLogicalOperator) {\n case LogicalFilterOperator.EQUAL:\n this.categoryLogicalOperator = LogicalFilterOperator.NOT_EQUAL;\n break;\n\n case LogicalFilterOperator.NOT_EQUAL:\n this.categoryLogicalOperator = LogicalFilterOperator.EQUAL;\n break;\n }\n }\n\n private getFilterChipLabel(value: {\n id: string;\n value: string;\n operator: LogicalFilterOperator;\n }): string {\n if (value.id === this.ID_CUSTOM_FILTER_VALUE) {\n return value.value;\n }\n\n const operatorString =\n value.operator === LogicalFilterOperator.EQUAL ? '=' : '!=';\n const label =\n this.categories[value.id]?.label ??\n this.nonSelectableCategories[value.id] ??\n value.id;\n\n return `${label} ${operatorString} ${value.value}`;\n }\n\n private getFilteredSuggestions() {\n if (!this.suggestions?.length) {\n return [];\n }\n\n return this.suggestions\n ?.filter((value) => this.filterByInput(value))\n .filter((value) => this.filterDuplicateTokens(value));\n }\n\n private hasCategorySelection() {\n return this.categories !== undefined;\n }\n\n private renderPlainSuggestions() {\n return (\n <div class=\"dropdown-item-container\">\n {this.getFilteredSuggestions().map((suggestion) => (\n <button\n class=\"dropdown-item\"\n data-id={suggestion}\n onClick={() => this.addToken(suggestion)}\n key={suggestion}\n title={suggestion}\n >\n {suggestion}\n </button>\n ))}\n </div>\n );\n }\n\n private renderOperatorButton() {\n if (this.staticOperator) {\n return '';\n }\n\n const params: BaseButtonProps = {\n type: 'button',\n variant: 'secondary',\n outline: false,\n ghost: true,\n iconOnly: true,\n iconOval: false,\n selected: false,\n disabled: this.disabled || this.staticOperator !== undefined,\n loading: false,\n icon: '',\n onClick: (e: Event) => {\n e.stopPropagation();\n this.toggleCategoryOperator();\n },\n extraClasses: {\n 'btn-icon-32': true,\n 'btn-toggle-operator': true,\n },\n };\n\n return (\n <BaseButton {...params}>\n {this.categoryLogicalOperator === LogicalFilterOperator.NOT_EQUAL\n ? '='\n : '!='}\n </BaseButton>\n );\n }\n\n private getFilterOperatorString() {\n let operator: LogicalFilterOperator;\n if (this.staticOperator !== undefined) {\n operator = this.staticOperator;\n } else {\n operator = this.categoryLogicalOperator;\n }\n return `${operator === LogicalFilterOperator.EQUAL ? '=' : '!='} `;\n }\n\n private renderCategoryValues() {\n return (\n <div class=\"dropdown-item-container\">\n {this.renderOperatorButton()}\n <div class=\"dropdown-header\">\n {this.categories[this.category]?.label}\n </div>\n {this.categories[this.category]?.options\n .filter((value) => this.filterByInput(value))\n .filter((value) => this.filterDuplicateTokens(value))\n .map((id) => (\n <button\n class=\"dropdown-item category-item-value\"\n data-id={id}\n title={id}\n key={id}\n onClick={() => this.addToken(id, this.category)}\n >\n {`${this.getFilterOperatorString()} ${id}`}\n </button>\n ))}\n </div>\n );\n }\n\n private renderDropdownContent() {\n if (this.hasCategorySelection()) {\n if (this.category !== undefined) {\n return this.renderCategoryValues();\n } else {\n return this.renderCategorySelection();\n }\n } else return this.renderPlainSuggestions();\n }\n\n private renderCategorySelection() {\n return (\n <div class=\"dropdown-item-container\">\n {this.getCategoryIds()\n ?.filter((id) => this.filterByInput(this.categories[id].label))\n .filter((id) => this.filterMultiples(id))\n .map((id) => (\n <button\n class=\"dropdown-item category-item category-item-id\"\n data-id={id}\n title={this.categories[id].label}\n key={id}\n onClick={(e) => {\n e.preventDefault();\n this.selectCategory(id);\n }}\n tabindex=\"0\"\n >\n {this.categories[id]?.label}\n </button>\n ))}\n </div>\n );\n }\n\n private getDropdownHeader() {\n if (this.categories !== undefined) {\n if (this.category !== undefined) {\n return null;\n } else {\n return this.labelCategories;\n }\n }\n\n return this.i18nPlainText;\n }\n\n componentDidRender() {\n if (this.isScrollStateDirty) {\n if (!this.tmpDisableScrollIntoView) {\n this.textInput.scrollIntoView();\n }\n this.isScrollStateDirty = false;\n }\n }\n\n private getResetButton() {\n return (\n <ix-icon-button\n onClick={(e) => this.resetFilter(e)}\n class={{\n 'reset-button': true,\n 'hide-reset-button':\n !this.filterTokens.length && this.category === undefined,\n }}\n ghost\n oval\n icon={'clear'}\n size=\"16\"\n ></ix-icon-button>\n );\n }\n\n private getIconColor() {\n if (this.disabled) {\n return 'color-componentn-1';\n }\n\n if (this.readonly) {\n return 'color-std-txt';\n }\n\n return 'color-primary';\n }\n\n render() {\n return (\n <Host>\n <form ref={(el) => (this.formElement = el)}>\n <div\n read-only={this.readonly}\n class={{\n 'input-container': true,\n disabled: this.disabled,\n focus: this.hasFocus,\n readonly: this.readonly,\n 'no-icon': this.hideIcon,\n }}\n >\n <ix-icon\n color={this.getIconColor()}\n class={{ 'd-none': this.hideIcon }}\n name={this.icon}\n size=\"16\"\n ></ix-icon>\n <div class=\"token-container\">\n <ul class=\"list-unstyled\">\n {this.filterTokens.map((value, index) => (\n <li\n key={value.toString()}\n class={{\n animate__animated: true,\n animate__fadein: true,\n }}\n >\n <ix-filter-chip\n disabled={this.disabled}\n readonly={this.readonly}\n onClick={(e) => e.stopPropagation()}\n onCloseClick={() => this.removeToken(index)}\n >\n {this.getFilterChipLabel(value)}\n </ix-filter-chip>\n </li>\n ))}\n {this.categories === undefined ? (\n ''\n ) : (\n <li\n class={{\n 'category-preview': true,\n 'd-none': this.category === undefined,\n }}\n >\n {this.categories[this.category]?.label}\n </li>\n )}\n <input\n class={{\n 'text-input': true,\n 'hide-placeholder':\n this.readonly ||\n this.disabled ||\n this.category !== undefined,\n }}\n autocomplete=\"off\"\n name=\"category-filter-input\"\n disabled={this.disabled}\n readonly={this.readonly}\n ref={(el) => (this.textInput = el)}\n type=\"text\"\n placeholder={this.placeholder}\n ></input>\n </ul>\n </div>\n {!this.readonly && !this.disabled && this.getResetButton()}\n </div>\n </form>\n\n {this.disabled || this.readonly ? (\n ''\n ) : (\n <ix-dropdown\n show={this.showDropdown}\n closeBehavior=\"outside\"\n offset={{ mainAxis: 2 }}\n anchor={this.textInput}\n trigger={this.hostElement}\n header={this.getDropdownHeader()}\n >\n {this.renderDropdownContent()}\n </ix-dropdown>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["categoryFilterCss","IxCategoryFilterStyle0","CategoryFilter","this","ID_CUSTOM_FILTER_VALUE","LogicalFilterOperator","EQUAL","watchFilterState","newValue","setFilterState","componentDidLoad","filterState","undefined","setTimeout","_a","hostElement","addEventListener","handleFormElementKeyDown","bind","_b","formElement","e","preventDefault","textInput","console","warn","hasFocus","inputValue","value","inputState","InputState","category","inputChanged","emit","handleInputElementKeyDown","state","filterTokens","token","tokens","addToken","categoryLogicalOperator","categories","id","operator","emitFilterEvent","closeDropdown","disabled","readonly","shadowRoot","querySelector","show","code","document","activeElement","classList","contains","getAttribute","hasCategorySelection","selectCategory","focusPreviousItem","showDropdown","focusNextItem","sibling","previousSibling","HTMLElement","focus","nextSibling","selector","item","stopPropagation","suggestions","length","tokenCount","removeToken","filter","map","filterChanged","emitEvent","newToken","trim","hasToken","pair","isScrollStateDirty","index","_","i","getCategoryIds","ids","Object","prototype","hasOwnProperty","call","push","categoryChanged","resetFilter","filterMultiples","repeatCategories","isCategoryAlreadySet","find","some","filterToken","hasSameValue","filterDuplicateTokens","filterByInput","toLowerCase","indexOf","toggleCategoryOperator","NOT_EQUAL","getFilterChipLabel","operatorString","label","_c","nonSelectableCategories","getFilteredSuggestions","renderPlainSuggestions","h","class","suggestion","onClick","key","title","renderOperatorButton","staticOperator","params","type","variant","outline","ghost","iconOnly","iconOval","selected","loading","icon","extraClasses","BaseButton","assign","getFilterOperatorString","renderCategoryValues","options","renderDropdownContent","renderCategorySelection","tabindex","getDropdownHeader","labelCategories","i18nPlainText","componentDidRender","tmpDisableScrollIntoView","scrollIntoView","getResetButton","oval","size","getIconColor","render","Host","ref","el","hideIcon","color","name","toString","animate__animated","animate__fadein","onCloseClick","autocomplete","placeholder","closeBehavior","offset","mainAxis","anchor","trigger","header"],"sources":["src/components/category-filter/category-filter.scss?tag=ix-category-filter&encapsulation=shadow","src/components/category-filter/category-filter.tsx"],"sourcesContent":["/*\n * SPDX-FileCopyrightText: 2023 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n@import 'common-variables';\n@import 'legacy/mixins/fonts';\n@import 'mixins/hover';\n@import 'mixins/shadows';\n@import 'mixins/shadow-dom/component';\n@import 'mixins/text-truncation';\n@import '../button/button';\n@import 'legacy/components/dropdown';\n@import 'legacy/components/forms';\n@import 'components/form/input';\n\n:host {\n @include ix-component;\n\n display: block;\n position: relative;\n height: auto;\n\n @include host-focus-visible {\n border-color: var(--theme-color-primary);\n box-shadow: 0 0 $tiny-space 0 var(--theme-color-primary) !important;\n }\n\n .reset-button {\n position: absolute;\n top: $tiny-space;\n right: $tiny-space;\n }\n\n .reset-button.hide-reset-button {\n display: none;\n }\n\n .input-container {\n &:not(.readonly):not(.disabled) {\n @include element-input('false');\n }\n\n &.disabled {\n color: var(--theme-input--color--disabled);\n border-bottom: var(--theme-input--border-thickness, 1px) solid\n var(--theme-input--border-color-bottom--disabled);\n }\n\n &.readonly {\n @include element-input;\n }\n\n display: flex;\n height: auto;\n max-height: 3.75rem;\n padding: 1px $large-space 1px 1.75rem !important;\n\n &.no-icon {\n padding-left: $tiny-space;\n }\n }\n\n .token-container {\n flex-grow: 1;\n overflow: hidden;\n }\n\n .text-input {\n @include ellipsis;\n @include text-default;\n width: auto;\n height: 1.75rem;\n min-height: $large-space;\n background: transparent;\n flex-grow: 1;\n box-shadow: none;\n\n &,\n &:hover,\n &:focus-visible {\n border: none;\n outline: none;\n }\n\n &.hide-placeholder::placeholder {\n opacity: 0;\n }\n }\n\n .list-unstyled {\n display: flex;\n flex-wrap: wrap;\n list-style: none;\n padding: 0;\n margin: 0;\n overflow-y: auto;\n }\n\n ix-icon {\n position: absolute;\n top: $small-space;\n left: $small-space;\n }\n\n ix-filter-chip {\n margin-right: $tiny-space;\n }\n\n .category-preview {\n display: flex;\n align-items: center;\n height: $large-space;\n background-color: var(--theme-bg-3);\n border-top-left-radius: $default-space;\n border-bottom-left-radius: $default-space;\n padding: $small-space;\n margin: 2px 0;\n }\n\n ul {\n height: 100%;\n }\n\n ul > li,\n input {\n padding-inline-start: 0;\n padding-top: 2px;\n padding-bottom: 2px;\n }\n\n ix-dropdown {\n min-width: 10rem !important;\n\n .dropdown-item-container {\n display: flex;\n flex-direction: column;\n\n .dropdown-item {\n @include text-default-single;\n @include ellipsis;\n @include focus-visible {\n border-color: var(--theme-color-focus-bdr);\n }\n\n height: $large-control-height;\n margin: $tiny-space $small-space;\n padding-inline: $small-space;\n border: 1px solid transparent;\n border-radius: 100rem;\n width: auto;\n justify-content: flex-start;\n flex-grow: 1;\n }\n\n .category-item {\n border-end-end-radius: 0;\n border-start-end-radius: 0;\n }\n\n .category-item-value {\n border-start-start-radius: 0;\n border-end-start-radius: 0;\n }\n }\n\n .btn-toggle-operator {\n width: 2rem;\n height: 2rem;\n margin-inline: $small-space;\n }\n }\n\n .d-none {\n display: none;\n }\n}\n","/*\n * SPDX-FileCopyrightText: 2023 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { BaseButton, BaseButtonProps } from '../button/base-button';\nimport { FilterState } from './filter-state';\nimport { InputState } from './input-state';\nimport { LogicalFilterOperator } from './logical-filter-operator';\n\n@Component({\n tag: 'ix-category-filter',\n styleUrl: 'category-filter.scss',\n shadow: true,\n})\nexport class CategoryFilter {\n private readonly ID_CUSTOM_FILTER_VALUE = 'CW_CUSTOM_FILTER_VALUE';\n\n @State() showDropdown: boolean;\n @State() private textInput?: HTMLInputElement;\n private formElement?: HTMLFormElement;\n private isScrollStateDirty: boolean;\n\n @Element() hostElement: HTMLIxCategoryFilterElement;\n\n @State() hasFocus: boolean;\n @State() categoryLogicalOperator = LogicalFilterOperator.EQUAL;\n @State() inputValue: string;\n @State() category: string;\n @State() filterTokens: Array<{\n id: string;\n value: string;\n operator: LogicalFilterOperator;\n }> = [];\n\n /**\n * If true the filter will be in disabled state\n */\n @Prop() disabled = false;\n\n /**\n * If true the filter will be in readonly mode\n */\n @Prop() readonly = false;\n\n /**\n * A set of search criteria to populate the component with.\n */\n @Prop() filterState: FilterState;\n\n /**\n * Placeholder text to be displayed in an empty input field.\n */\n @Prop() placeholder: string;\n\n /**\n * Configuration object hash used to populate the dropwdown menu for typeahead and quick selection functionality.\n * Each ID maps to an object with a label and an array of options to select from.\n */\n @Prop() categories: {\n [id: string]: {\n label: string;\n options: string[];\n };\n };\n\n /**\n * In certain use cases some categories may not be available for selection anymore.\n * To allow proper display of set filters with these categories this ID to label mapping can be populated.\n *\n * Configuration object hash used to supply labels to the filter chips in the input field.\n * Each ID maps to a string representing the label to display.\n */\n @Prop() nonSelectableCategories?: {\n [id: string]: string;\n } = {};\n\n /**\n * A list of strings that will be supplied as typeahead suggestions not tied to any categories.\n */\n @Prop() suggestions: string[];\n\n /**\n * The icon next to the actual text input\n * Defaults to 'search'\n */\n @Prop() icon = 'search';\n\n /**\n * Allows to hide the icon inside the text input.\n * Defaults to false\n */\n @Prop() hideIcon: boolean;\n\n /**\n * If set categories will always be filtered via the respective logical operator.\n * Toggling of the operator will not be available to the user.\n *\n * @since 2.2.0\n */\n @Prop() staticOperator?: LogicalFilterOperator;\n\n /**\n * If set to true allows that a single category can be set more than once.\n * An already set category will not appear in the category dropdown if set to false.\n *\n * Defaults to true\n */\n @Prop() repeatCategories = true;\n\n /**\n * @internal For debugging purposes only!\n */\n @Prop() tmpDisableScrollIntoView = true;\n\n /**\n * i18n\n */\n @Prop() labelCategories = 'Categories';\n\n /**\n * i18n\n */\n @Prop() i18nPlainText = 'Filter by text';\n\n /**\n * Event dispatched whenever the a category gets selected in the dropdown\n */\n @Event() categoryChanged: EventEmitter<string>;\n\n /**\n * Event dispatched whenever the text input changes.\n */\n @Event() inputChanged: EventEmitter<InputState>;\n\n /**\n * Event dispatched whenever the filter state changes.\n */\n @Event() filterChanged: EventEmitter<FilterState>;\n\n @Watch('filterState')\n watchFilterState(newValue) {\n this.setFilterState(newValue);\n }\n\n componentDidLoad() {\n if (this.filterState !== undefined) {\n setTimeout(() => this.setFilterState(this.filterState));\n }\n\n this.hostElement?.addEventListener(\n 'keydown',\n this.handleFormElementKeyDown.bind(this)\n );\n\n this.formElement?.addEventListener('submit', (e) => e.preventDefault());\n\n if (this.textInput == null) {\n console.warn(\n 'ix-category-filter - unable to add event listeners to native input element'\n );\n return;\n }\n\n this.textInput.addEventListener('focusin', () => {\n this.hasFocus = true;\n });\n this.textInput.addEventListener('focusout', () => (this.hasFocus = false));\n this.textInput.addEventListener('input', () => {\n this.inputValue = this.textInput.value;\n const inputState = new InputState(this.inputValue, this.category);\n this.inputChanged.emit(inputState);\n });\n this.textInput.addEventListener(\n 'keydown',\n this.handleInputElementKeyDown.bind(this)\n );\n }\n\n private setFilterState(state: FilterState) {\n this.filterTokens = [];\n\n for (const token of state.tokens) {\n this.addToken(\n token,\n this.ID_CUSTOM_FILTER_VALUE,\n this.categoryLogicalOperator,\n false\n );\n }\n\n for (const category of state.categories) {\n this.addToken(category.value, category.id, category.operator, false);\n }\n\n this.emitFilterEvent();\n }\n\n private closeDropdown() {\n if (this.disabled || this.readonly) {\n return;\n }\n\n this.hostElement.shadowRoot.querySelector('ix-dropdown').show = false;\n }\n\n private handleFormElementKeyDown(e: KeyboardEvent) {\n switch (e.code) {\n case 'Enter':\n case 'NumpadEnter':\n if (!document.activeElement.classList.contains('dropdown-item')) {\n return;\n }\n\n const token = document.activeElement.getAttribute('data-id');\n\n if (this.hasCategorySelection()) {\n if (this.category !== undefined) {\n this.addToken(token, this.category);\n } else if (\n document.activeElement.classList.contains('category-item-id')\n ) {\n this.selectCategory(token);\n }\n } else {\n this.addToken(token);\n }\n\n e.preventDefault();\n break;\n\n case 'ArrowUp':\n this.focusPreviousItem();\n e.preventDefault();\n break;\n\n case 'ArrowDown':\n this.showDropdown = true;\n this.focusNextItem();\n e.preventDefault();\n break;\n\n case 'Escape':\n this.closeDropdown();\n break;\n }\n }\n\n private focusPreviousItem() {\n const sibling = document.activeElement.previousSibling;\n if (sibling instanceof HTMLElement) {\n sibling.focus();\n }\n }\n\n private focusNextItem() {\n const sibling = document.activeElement.nextSibling;\n if (sibling instanceof HTMLElement) {\n sibling.focus();\n }\n }\n\n private handleInputElementKeyDown(e: KeyboardEvent) {\n switch (e.code) {\n case 'ArrowDown':\n const selector = `.category-item-${\n this.category !== undefined ? 'value' : 'id'\n }`;\n let item = this.hostElement.shadowRoot.querySelector(selector);\n\n if (item instanceof HTMLElement) {\n item.focus();\n e.stopPropagation();\n } else if (this.suggestions?.length) {\n item = this.hostElement.shadowRoot.querySelector('.category-item');\n if (item instanceof HTMLElement) {\n item.focus();\n e.stopPropagation();\n }\n }\n break;\n\n case 'Backspace':\n if (this.textInput.value !== '') {\n return;\n }\n\n if (this.category !== undefined) {\n this.category = undefined;\n return;\n }\n\n const tokenCount = this.filterTokens.length;\n if (tokenCount > 0) {\n this.removeToken(tokenCount - 1);\n }\n break;\n\n case 'Enter':\n case 'NumpadEnter':\n this.addToken(this.inputValue, this.category);\n e.preventDefault();\n break;\n }\n }\n\n private emitFilterEvent() {\n const tokens = this.filterTokens\n .filter((item) => item.id === this.ID_CUSTOM_FILTER_VALUE)\n .map((item) => item.value);\n const categories = this.filterTokens.filter(\n (item) => item.id !== this.ID_CUSTOM_FILTER_VALUE\n );\n const filterState: FilterState = {\n tokens,\n categories,\n };\n\n this.filterChanged.emit(filterState);\n }\n\n private addToken(\n token: string,\n category: string = this.ID_CUSTOM_FILTER_VALUE,\n operator = this.categoryLogicalOperator,\n emitEvent = true\n ) {\n if (token === undefined || token === null) {\n return;\n }\n\n const newToken = token.trim();\n\n if (newToken === '') {\n return;\n }\n\n if (this.hasToken(newToken)) {\n return;\n }\n\n const pair = { id: category, value: newToken, operator };\n this.filterTokens = [...this.filterTokens, pair];\n this.textInput.value = '';\n this.inputValue = '';\n this.categoryLogicalOperator = LogicalFilterOperator.EQUAL;\n\n if (this.category !== undefined) {\n this.category = undefined;\n }\n\n this.isScrollStateDirty = true;\n\n this.textInput.focus();\n\n if (emitEvent) {\n this.emitFilterEvent();\n }\n\n this.closeDropdown();\n }\n\n private removeToken(index: number) {\n this.filterTokens = this.filterTokens.filter((_, i) => i !== index);\n this.emitFilterEvent();\n }\n\n private getCategoryIds() {\n const ids = [];\n for (const id in this.categories) {\n if (Object.prototype.hasOwnProperty.call(this.categories, id)) {\n ids.push(id);\n }\n }\n\n return ids;\n }\n\n private selectCategory(category: string) {\n this.category = category;\n this.textInput.value = '';\n this.inputValue = '';\n this.textInput.focus();\n this.categoryChanged.emit(category);\n }\n\n private resetFilter(e: Event) {\n e.stopPropagation();\n this.closeDropdown();\n this.filterTokens = [];\n this.emitFilterEvent();\n }\n\n private filterMultiples(value: string) {\n if (this.repeatCategories) {\n return true;\n }\n\n const isCategoryAlreadySet = this.filterTokens.find(\n (token) => token.id === value\n );\n\n return !isCategoryAlreadySet;\n }\n\n private hasToken(token: string) {\n return this.filterTokens.some((filterToken) => {\n const hasSameValue = filterToken.value === token;\n\n if (!hasSameValue) {\n return false;\n }\n\n if (this.category !== undefined) {\n return this.category === filterToken.id;\n }\n\n if (filterToken.id) {\n return filterToken.id === this.ID_CUSTOM_FILTER_VALUE;\n }\n\n return hasSameValue;\n });\n }\n\n private filterDuplicateTokens(value: string) {\n return !this.hasToken(value);\n }\n\n private filterByInput(value: string) {\n if (this.inputValue === undefined || this.inputValue === '') {\n return true;\n }\n\n return value.toLowerCase().indexOf(this.inputValue.toLowerCase()) !== -1;\n }\n\n private toggleCategoryOperator() {\n switch (this.categoryLogicalOperator) {\n case LogicalFilterOperator.EQUAL:\n this.categoryLogicalOperator = LogicalFilterOperator.NOT_EQUAL;\n break;\n\n case LogicalFilterOperator.NOT_EQUAL:\n this.categoryLogicalOperator = LogicalFilterOperator.EQUAL;\n break;\n }\n }\n\n private getFilterChipLabel(value: {\n id: string;\n value: string;\n operator: LogicalFilterOperator;\n }): string {\n if (value.id === this.ID_CUSTOM_FILTER_VALUE) {\n return value.value;\n }\n\n const operatorString =\n value.operator === LogicalFilterOperator.EQUAL ? '=' : '!=';\n const label =\n this.categories[value.id]?.label ??\n this.nonSelectableCategories[value.id] ??\n value.id;\n\n return `${label} ${operatorString} ${value.value}`;\n }\n\n private getFilteredSuggestions() {\n if (!this.suggestions?.length) {\n return [];\n }\n\n return this.suggestions\n ?.filter((value) => this.filterByInput(value))\n .filter((value) => this.filterDuplicateTokens(value));\n }\n\n private hasCategorySelection() {\n return this.categories !== undefined;\n }\n\n private renderPlainSuggestions() {\n return (\n <div class=\"dropdown-item-container\">\n {this.getFilteredSuggestions().map((suggestion) => (\n <button\n class=\"dropdown-item\"\n data-id={suggestion}\n onClick={() => this.addToken(suggestion)}\n key={suggestion}\n title={suggestion}\n >\n {suggestion}\n </button>\n ))}\n </div>\n );\n }\n\n private renderOperatorButton() {\n if (this.staticOperator) {\n return '';\n }\n\n const params: BaseButtonProps = {\n type: 'button',\n variant: 'secondary',\n outline: false,\n ghost: true,\n iconOnly: true,\n iconOval: false,\n selected: false,\n disabled: this.disabled || this.staticOperator !== undefined,\n loading: false,\n icon: '',\n onClick: (e: Event) => {\n e.stopPropagation();\n this.toggleCategoryOperator();\n },\n extraClasses: {\n 'btn-icon-32': true,\n 'btn-toggle-operator': true,\n },\n };\n\n return (\n <BaseButton {...params}>\n {this.categoryLogicalOperator === LogicalFilterOperator.NOT_EQUAL\n ? '='\n : '!='}\n </BaseButton>\n );\n }\n\n private getFilterOperatorString() {\n let operator: LogicalFilterOperator;\n if (this.staticOperator !== undefined) {\n operator = this.staticOperator;\n } else {\n operator = this.categoryLogicalOperator;\n }\n return `${operator === LogicalFilterOperator.EQUAL ? '=' : '!='} `;\n }\n\n private renderCategoryValues() {\n return (\n <div class=\"dropdown-item-container\">\n {this.renderOperatorButton()}\n <div class=\"dropdown-header\">\n {this.categories[this.category]?.label}\n </div>\n {this.categories[this.category]?.options\n .filter((value) => this.filterByInput(value))\n .filter((value) => this.filterDuplicateTokens(value))\n .map((id) => (\n <button\n class=\"dropdown-item category-item-value\"\n data-id={id}\n title={id}\n key={id}\n onClick={() => this.addToken(id, this.category)}\n >\n {`${this.getFilterOperatorString()} ${id}`}\n </button>\n ))}\n </div>\n );\n }\n\n private renderDropdownContent() {\n if (this.hasCategorySelection()) {\n if (this.category !== undefined) {\n return this.renderCategoryValues();\n } else {\n return this.renderCategorySelection();\n }\n } else return this.renderPlainSuggestions();\n }\n\n private renderCategorySelection() {\n return (\n <div class=\"dropdown-item-container\">\n {this.getCategoryIds()\n ?.filter((id) => this.filterByInput(this.categories[id].label))\n .filter((id) => this.filterMultiples(id))\n .map((id) => (\n <button\n class=\"dropdown-item category-item category-item-id\"\n data-id={id}\n title={this.categories[id].label}\n key={id}\n onClick={(e) => {\n e.preventDefault();\n this.selectCategory(id);\n }}\n tabindex=\"0\"\n >\n {this.categories[id]?.label}\n </button>\n ))}\n </div>\n );\n }\n\n private getDropdownHeader() {\n if (this.categories !== undefined) {\n if (this.category !== undefined) {\n return null;\n } else {\n return this.labelCategories;\n }\n }\n\n return this.i18nPlainText;\n }\n\n componentDidRender() {\n if (this.isScrollStateDirty) {\n if (!this.tmpDisableScrollIntoView) {\n this.textInput.scrollIntoView();\n }\n this.isScrollStateDirty = false;\n }\n }\n\n private getResetButton() {\n return (\n <ix-icon-button\n onClick={(e) => this.resetFilter(e)}\n class={{\n 'reset-button': true,\n 'hide-reset-button':\n !this.filterTokens.length && this.category === undefined,\n }}\n ghost\n oval\n icon={'clear'}\n size=\"16\"\n ></ix-icon-button>\n );\n }\n\n private getIconColor() {\n if (this.disabled) {\n return 'color-componentn-1';\n }\n\n if (this.readonly) {\n return 'color-std-txt';\n }\n\n return 'color-primary';\n }\n\n render() {\n return (\n <Host>\n <form ref={(el) => (this.formElement = el)}>\n <div\n read-only={this.readonly}\n class={{\n 'input-container': true,\n disabled: this.disabled,\n focus: this.hasFocus,\n readonly: this.readonly,\n 'no-icon': this.hideIcon,\n }}\n >\n <ix-icon\n color={this.getIconColor()}\n class={{ 'd-none': this.hideIcon }}\n name={this.icon}\n size=\"16\"\n ></ix-icon>\n <div class=\"token-container\">\n <ul class=\"list-unstyled\">\n {this.filterTokens.map((value, index) => (\n <li\n key={value.toString()}\n class={{\n animate__animated: true,\n animate__fadein: true,\n }}\n >\n <ix-filter-chip\n disabled={this.disabled}\n readonly={this.readonly}\n onClick={(e) => e.stopPropagation()}\n onCloseClick={() => this.removeToken(index)}\n >\n {this.getFilterChipLabel(value)}\n </ix-filter-chip>\n </li>\n ))}\n {this.categories === undefined ? (\n ''\n ) : (\n <li\n class={{\n 'category-preview': true,\n 'd-none': this.category === undefined,\n }}\n >\n {this.categories[this.category]?.label}\n </li>\n )}\n <input\n class={{\n 'text-input': true,\n 'hide-placeholder':\n this.readonly ||\n this.disabled ||\n this.category !== undefined,\n }}\n autocomplete=\"off\"\n name=\"category-filter-input\"\n disabled={this.disabled}\n readonly={this.readonly}\n ref={(el) => (this.textInput = el)}\n type=\"text\"\n placeholder={this.placeholder}\n ></input>\n </ul>\n </div>\n {!this.readonly && !this.disabled && this.getResetButton()}\n </div>\n </form>\n\n {this.disabled || this.readonly ? (\n ''\n ) : (\n <ix-dropdown\n show={this.showDropdown}\n closeBehavior=\"outside\"\n offset={{ mainAxis: 2 }}\n anchor={this.textInput}\n trigger={this.hostElement}\n header={this.getDropdownHeader()}\n >\n {this.renderDropdownContent()}\n </ix-dropdown>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{r as t,c as i,h as s,H as e,g as r}from"./p-26e9d40e.js";import{f as h,i as n,s as o,o as a,a as d,c}from"./p-b3f35666.js";import{A as l}from"./p-c09553f3.js";function u(t){return t&&t.getDropdownItemElement!==undefined&&typeof t.getDropdownItemElement==="function"}class f{constructor(){this.dropdowns=new Map;this.submenuIds={};this.isWindowListenerActive=false}connected(t){if(!this.isWindowListenerActive){this.addOverlayListeners()}this.dropdowns.set(t.getId(),t);if(t.discoverAllSubmenus){this.discoverSubmenus()}}disconnected(t){this.dropdowns.delete(t.getId())}discoverSubmenus(){this.dropdowns.forEach((t=>{t.discoverSubmenu()}))}present(t){if(!t.isPresent()&&t.willPresent()){this.submenuIds[t.getId()]=t.getAssignedSubmenuIds();t.present()}}dismissChildren(t){const i=this.submenuIds[t]||[];for(const t of i){this.dismiss(this.dropdowns.get(t))}}dismiss(t){if(t.isPresent()&&t.willDismiss()){this.dismissChildren(t.getId());t.dismiss();delete this.submenuIds[t.getId()]}}dismissAll(t=[]){this.dropdowns.forEach((i=>{if(!t.includes(i.getId())&&(i.closeBehavior==="inside"||i.closeBehavior===false)){return}this.dismiss(i)}))}dismissOthers(t){let i=this.buildComposedPath(t,new Set);this.dropdowns.forEach((t=>{if(t.closeBehavior!=="inside"&&t.closeBehavior!==false&&!i.has(t.getId())){this.dismiss(t)}}))}pathIncludesTrigger(t){for(let i of t){if(i instanceof HTMLElement){if(i.hasAttribute("data-ix-dropdown-trigger")){return true}}}return false}pathIncludesDropdown(t){return!!t.find((t=>t.tagName==="IX-DROPDOWN"))}buildComposedPath(t,i){if(this.submenuIds[t]){i.add(t)}for(const s of Object.keys(this.submenuIds)){if(this.submenuIds[s].includes(t)){this.buildComposedPath(s,i).forEach((t=>i.add(t)))}}return i}addOverlayListeners(){this.isWindowListenerActive=true;window.addEventListener("click",(t=>{const i=this.pathIncludesTrigger(t.composedPath());const s=this.pathIncludesDropdown(t.composedPath());if(!i&&!s){this.dismissAll()}}));window.addEventListener("keydown",(t=>{if(t.key==="Escape"){this.dismissAll([...this.dropdowns.keys()])}}))}}const m=(t,i,s)=>{t.addEventListener(i,s);return()=>{t.removeEventListener(i,s)}};const b=new f;const w=":host{background-color:var(--theme-color-2);border-radius:var(--theme-default-border-radius);min-width:0px;z-index:var(--theme-z-index-dropdown);box-shadow:var(--theme-shadow-4);padding:0.25rem 0px}:host *,:host *::after,:host *::before{box-sizing:border-box}:host ::-webkit-scrollbar-button{display:none}:host ::-webkit-scrollbar{width:0.5rem;height:0.5rem}:host ::-webkit-scrollbar-track{border-radius:5px;background:var(--theme-scrollbar-track--background)}:host ::-webkit-scrollbar-track:hover{background:var(--theme-scrollbar-track--background--hover)}:host ::-webkit-scrollbar-thumb{border-radius:5px;background:var(--theme-scrollbar-thumb--background)}:host ::-webkit-scrollbar-thumb:hover{background:var(--theme-scrollbar-thumb--background--hover)}:host ::-webkit-scrollbar-corner{display:none}:host .dropdown-header{display:flex;align-items:center;height:2.5rem;color:var(--theme-menu-header--color);padding:0 1rem}:host(.overflow){max-height:50vh;overflow-y:auto}:host(:not(.show)){display:none}";const p=w;let g=0;const v=class{constructor(s){t(this,s);this.showChanged=i(this,"showChanged",7);this.autoUpdateCleanup=null;this.localUId=`dropdown-${g++}`;this.assignedSubmenu=[];this.focusDropdownItemBind=this.focusDropdownItem.bind(this);this.itemObserver=new MutationObserver((()=>{this.arrowFocusController.items=this.dropdownItems}));this.suppressAutomaticPlacement=false;this.show=false;this.trigger=undefined;this.anchor=undefined;this.closeBehavior="both";this.placement="bottom-start";this.positioningStrategy="fixed";this.header=undefined;this.offset=undefined;this.overwriteDropdownStyle=undefined;this.discoverAllSubmenus=false}connectedCallback(){b.connected(this);if(this.trigger!=undefined){this.registerListener(this.trigger)}}cacheSubmenuId(t){t.stopImmediatePropagation();t.preventDefault();const{detail:i}=t;if(this.assignedSubmenu.indexOf(i)===-1){this.assignedSubmenu.push(i)}}disconnectedCallback(){b.dismiss(this);b.disconnected(this);if(this.disposeClickListener){this.disposeClickListener()}if(this.disposeKeyListener){this.disposeKeyListener()}if(this.autoUpdateCleanup){this.autoUpdateCleanup()}}getAssignedSubmenuIds(){return this.assignedSubmenu}isPresent(){return this.show}present(){this.show=true}dismiss(){this.show=false}getId(){return this.localUId}willDismiss(){const{defaultPrevented:t}=this.showChanged.emit(false);return!t}willPresent(){const{defaultPrevented:t}=this.showChanged.emit(true);return!t}get dropdownItems(){return Array.from(this.hostElement.querySelectorAll("ix-dropdown-item"))}get slotElement(){return this.hostElement.shadowRoot.querySelector("slot")}addEventListenersFor(){var t,i,s;(t=this.disposeClickListener)===null||t===void 0?void 0:t.call(this);(i=this.disposeKeyListener)===null||i===void 0?void 0:i.call(this);const e=()=>{if(!this.isPresent()){b.present(this)}else{b.dismiss(this)}b.dismissOthers(this.getId())};this.disposeClickListener=m(this.triggerElement,"click",(t=>{if(!t.defaultPrevented){e()}}));(s=this.triggerElement)===null||s===void 0?void 0:s.setAttribute("data-ix-dropdown-trigger",this.localUId)}async discoverSubmenu(){var t;(t=this.triggerElement)===null||t===void 0?void 0:t.dispatchEvent(new CustomEvent("ix-assign-sub-menu",{bubbles:true,composed:false,cancelable:true,detail:this.localUId}))}registerKeyListener(){this.disposeKeyListener=m(this.triggerElement,"keydown",(t=>{if(t.key!=="ArrowDown"){return}if(document.activeElement!==this.triggerElement){return}b.present(this);setTimeout((()=>{this.focusDropdownItem(0)}))}))}async registerListener(t){this.triggerElement=await this.resolveElement(t);if(this.triggerElement){this.addEventListenersFor();this.discoverSubmenu()}}async resolveElement(t){const i=await this.findElement(t);return this.checkForSubmenuAnchor(i)}async checkForSubmenuAnchor(t){if(!t){return null}if(u(t)){const i=await t.getDropdownItemElement();i.isSubMenu=true;this.hostElement.style.zIndex=`var(--theme-z-index-dropdown)`}if(t.tagName==="IX-DROPDOWN-ITEM"){t.isSubMenu=true;this.hostElement.style.zIndex=`var(--theme-z-index-dropdown)`}return t}findElement(t){if(t instanceof Promise){return t}if(typeof t==="object"){return Promise.resolve(t)}if(typeof t!="string"){return}const i=`#${t}`;return new Promise((t=>{if(document.querySelector(i)){return t(document.querySelector(i))}const s=new MutationObserver((()=>{if(document.querySelector(i)){t(document.querySelector(i));s.disconnect()}}));s.observe(document.body,{childList:true,subtree:true})}))}async changedShow(t){var i;if(t){this.anchorElement=await(this.anchor?this.resolveElement(this.anchor):this.resolveElement(this.trigger));if(this.anchorElement){this.applyDropdownPosition()}this.arrowFocusController=new l(this.dropdownItems,this.dropdownRef,this.focusDropdownItemBind);this.itemObserver.observe(this.dropdownRef,{childList:true,subtree:true});this.registerKeyListener()}else{this.arrowFocusController.disconnect();this.itemObserver.disconnect();(i=this.disposeKeyListener)===null||i===void 0?void 0:i.call(this)}}changedTrigger(t){this.registerListener(t)}isAnchorSubmenu(){var t;if(!u(this.anchorElement)){return!!((t=this.anchorElement)===null||t===void 0?void 0:t.closest("ix-dropdown-item"))}return true}async applyDropdownPosition(){if(!this.show){return}if(!this.anchorElement){return}if(!this.dropdownRef){return}const t=this.isAnchorSubmenu();let i={strategy:this.positioningStrategy,middleware:[]};if(!this.suppressAutomaticPlacement){i.middleware.push(h({fallbackStrategy:"initialPlacement"}))}i.placement=t?"right-start":this.placement;i.middleware=[...i.middleware,n(),o()];if(this.offset){i.middleware.push(a(this.offset))}if(this.autoUpdateCleanup){this.autoUpdateCleanup();this.autoUpdateCleanup=null}this.autoUpdateCleanup=d(this.anchorElement,this.dropdownRef,(async()=>{const t=await c(this.anchorElement,this.dropdownRef,i);Object.assign(this.dropdownRef.style,{top:"0",left:"0",transform:`translate(${Math.round(t.x)}px,${Math.round(t.y)}px)`});if(this.overwriteDropdownStyle){const t=await this.overwriteDropdownStyle({dropdownRef:this.dropdownRef,triggerRef:this.triggerElement});Object.assign(this.dropdownRef.style,t)}}),{ancestorResize:true,ancestorScroll:true,elementResize:true})}focusDropdownItem(t){requestAnimationFrame((()=>{var i;(i=this.dropdownItems[t])===null||i===void 0?void 0:i.shadowRoot.querySelector("button").focus()}))}async componentDidLoad(){this.changedTrigger(this.trigger)}async componentDidRender(){await this.applyDropdownPosition();this.anchorElement=await(this.anchor?this.resolveElement(this.anchor):this.resolveElement(this.trigger))}isTriggerElement(t){const i=!!t.hasAttribute("data-ix-dropdown-trigger");return i}onDropdownClick(t){if(b.pathIncludesTrigger(t.composedPath())){t.preventDefault();if(this.isTriggerElement(t.target)){return}}if(this.closeBehavior==="inside"||this.closeBehavior==="both"){b.dismissAll([this.getId()])}b.dismissOthers(this.getId())}async updatePosition(){this.applyDropdownPosition()}render(){return s(e,{key:"6c86b142d9963a895cfde491883f6a68e3ff9c6d","data-ix-dropdown":this.localUId,ref:t=>this.dropdownRef=t,class:{"dropdown-menu":true,show:this.show,overflow:true},style:{margin:"0",minWidth:"0px",position:this.positioningStrategy},role:"list",onClick:t=>this.onDropdownClick(t)},s("div",{key:"2dea0ac7c557fcd1ec0eaaf1939920c12773b6b4",style:{display:"contents"}},this.header&&s("div",{class:"dropdown-header"},this.header),s("slot",{key:"3ba4873f1241bd87c55dfb8e46b5f678efd0c514"})))}get hostElement(){return r(this)}static get watchers(){return{show:["changedShow"],trigger:["changedTrigger"]}}};v.style=p;export{v as ix_dropdown};
2
- //# sourceMappingURL=p-1506f9ed.entry.js.map
1
+ import{r as t,c as i,h as s,H as e,g as r}from"./p-26e9d40e.js";import{f as h,i as n,s as o,o as a,a as d,c}from"./p-b3f35666.js";import{A as u}from"./p-c09553f3.js";function l(t){return t&&t.getDropdownItemElement!==undefined&&typeof t.getDropdownItemElement==="function"}class f{constructor(){this.dropdowns=new Map;this.submenuIds={};this.isWindowListenerActive=false}connected(t){if(!this.isWindowListenerActive){this.addOverlayListeners()}this.dropdowns.set(t.getId(),t);if(t.discoverAllSubmenus){this.discoverSubmenus()}}disconnected(t){this.dropdowns.delete(t.getId())}discoverSubmenus(){this.dropdowns.forEach((t=>{t.discoverSubmenu()}))}present(t){if(!t.isPresent()&&t.willPresent()){this.submenuIds[t.getId()]=t.getAssignedSubmenuIds();t.present()}}dismissChildren(t){const i=this.submenuIds[t]||[];for(const t of i){this.dismiss(this.dropdowns.get(t))}}dismiss(t){if(t.isPresent()&&t.willDismiss()){this.dismissChildren(t.getId());t.dismiss();delete this.submenuIds[t.getId()]}}dismissAll(t=[]){this.dropdowns.forEach((i=>{if(!t.includes(i.getId())&&(i.closeBehavior==="inside"||i.closeBehavior===false)){return}this.dismiss(i)}))}dismissOthers(t){let i=this.buildComposedPath(t,new Set);this.dropdowns.forEach((t=>{if(t.closeBehavior!=="inside"&&t.closeBehavior!==false&&!i.has(t.getId())){this.dismiss(t)}}))}pathIncludesTrigger(t){for(let i of t){if(i instanceof HTMLElement){if(i.hasAttribute("data-ix-dropdown-trigger")){return true}}}return false}pathIncludesDropdown(t){return!!t.find((t=>t.tagName==="IX-DROPDOWN"))}buildComposedPath(t,i){if(this.submenuIds[t]){i.add(t)}for(const s of Object.keys(this.submenuIds)){if(this.submenuIds[s].includes(t)){this.buildComposedPath(s,i).forEach((t=>i.add(t)))}}return i}addOverlayListeners(){this.isWindowListenerActive=true;window.addEventListener("click",(t=>{const i=this.pathIncludesTrigger(t.composedPath());const s=this.pathIncludesDropdown(t.composedPath());if(!i&&!s){this.dismissAll()}}));window.addEventListener("keydown",(t=>{if(t.key==="Escape"){this.dismissAll([...this.dropdowns.keys()])}}))}}const b=(t,i,s)=>{t.addEventListener(i,s);return()=>{t.removeEventListener(i,s)}};const m=new f;const w=":host{background-color:var(--theme-color-2);border-radius:var(--theme-default-border-radius);min-width:0px;z-index:var(--theme-z-index-dropdown);box-shadow:var(--theme-shadow-4);padding:0.25rem 0px}:host *,:host *::after,:host *::before{box-sizing:border-box}:host ::-webkit-scrollbar-button{display:none}:host ::-webkit-scrollbar{width:0.5rem;height:0.5rem}:host ::-webkit-scrollbar-track{border-radius:5px;background:var(--theme-scrollbar-track--background)}:host ::-webkit-scrollbar-track:hover{background:var(--theme-scrollbar-track--background--hover)}:host ::-webkit-scrollbar-thumb{border-radius:5px;background:var(--theme-scrollbar-thumb--background)}:host ::-webkit-scrollbar-thumb:hover{background:var(--theme-scrollbar-thumb--background--hover)}:host ::-webkit-scrollbar-corner{display:none}:host .dropdown-header{display:flex;align-items:center;height:2.5rem;color:var(--theme-menu-header--color);padding:0 1rem}:host(.overflow){max-height:50vh;overflow-y:auto}:host(:not(.show)){display:none}";const p=w;let g=0;const v=class{constructor(s){t(this,s);this.showChanged=i(this,"showChanged",7);this.autoUpdateCleanup=null;this.localUId=`dropdown-${g++}`;this.assignedSubmenu=[];this.focusDropdownItemBind=this.focusDropdownItem.bind(this);this.itemObserver=new MutationObserver((()=>{this.arrowFocusController.items=this.dropdownItems}));this.suppressAutomaticPlacement=false;this.show=false;this.trigger=undefined;this.anchor=undefined;this.closeBehavior="both";this.placement="bottom-start";this.positioningStrategy="fixed";this.header=undefined;this.offset=undefined;this.overwriteDropdownStyle=undefined;this.discoverAllSubmenus=false}connectedCallback(){m.connected(this);if(this.trigger!=undefined){this.registerListener(this.trigger)}}cacheSubmenuId(t){t.stopImmediatePropagation();t.preventDefault();const{detail:i}=t;if(this.assignedSubmenu.indexOf(i)===-1){this.assignedSubmenu.push(i)}}disconnectedCallback(){m.dismiss(this);m.disconnected(this);if(this.disposeClickListener){this.disposeClickListener()}if(this.disposeKeyListener){this.disposeKeyListener()}if(this.autoUpdateCleanup){this.autoUpdateCleanup()}}getAssignedSubmenuIds(){return this.assignedSubmenu}isPresent(){return this.show}present(){this.show=true}dismiss(){this.show=false}getId(){return this.localUId}willDismiss(){const{defaultPrevented:t}=this.showChanged.emit(false);return!t}willPresent(){const{defaultPrevented:t}=this.showChanged.emit(true);return!t}get dropdownItems(){return Array.from(this.hostElement.querySelectorAll("ix-dropdown-item"))}get slotElement(){return this.hostElement.shadowRoot.querySelector("slot")}addEventListenersFor(){var t,i,s;(t=this.disposeClickListener)===null||t===void 0?void 0:t.call(this);(i=this.disposeKeyListener)===null||i===void 0?void 0:i.call(this);const e=()=>{if(!this.isPresent()){m.present(this)}else{m.dismiss(this)}m.dismissOthers(this.getId())};this.disposeClickListener=b(this.triggerElement,"click",(t=>{if(!t.defaultPrevented){e()}}));(s=this.triggerElement)===null||s===void 0?void 0:s.setAttribute("data-ix-dropdown-trigger",this.localUId)}async discoverSubmenu(){var t;(t=this.triggerElement)===null||t===void 0?void 0:t.dispatchEvent(new CustomEvent("ix-assign-sub-menu",{bubbles:true,composed:false,cancelable:true,detail:this.localUId}))}registerKeyListener(){if(!this.triggerElement){return}this.disposeKeyListener=b(this.triggerElement,"keydown",(t=>{if(t.key!=="ArrowDown"){return}if(document.activeElement!==this.triggerElement){return}m.present(this);setTimeout((()=>{this.focusDropdownItem(0)}))}))}async registerListener(t){this.triggerElement=await this.resolveElement(t);if(this.triggerElement){this.addEventListenersFor();this.discoverSubmenu()}}async resolveElement(t){const i=await this.findElement(t);return this.checkForSubmenuAnchor(i)}async checkForSubmenuAnchor(t){if(!t){return null}if(l(t)){const i=await t.getDropdownItemElement();i.isSubMenu=true;this.hostElement.style.zIndex=`var(--theme-z-index-dropdown)`}if(t.tagName==="IX-DROPDOWN-ITEM"){t.isSubMenu=true;this.hostElement.style.zIndex=`var(--theme-z-index-dropdown)`}return t}findElement(t){if(t instanceof Promise){return t}if(typeof t==="object"){return Promise.resolve(t)}if(typeof t!="string"){return}const i=`#${t}`;return new Promise((t=>{if(document.querySelector(i)){return t(document.querySelector(i))}const s=new MutationObserver((()=>{if(document.querySelector(i)){t(document.querySelector(i));s.disconnect()}}));s.observe(document.body,{childList:true,subtree:true})}))}async changedShow(t){var i;if(t){this.anchorElement=await(this.anchor?this.resolveElement(this.anchor):this.resolveElement(this.trigger));if(this.anchorElement){this.applyDropdownPosition()}this.arrowFocusController=new u(this.dropdownItems,this.dropdownRef,this.focusDropdownItemBind);this.itemObserver.observe(this.dropdownRef,{childList:true,subtree:true});this.registerKeyListener()}else{this.arrowFocusController.disconnect();this.itemObserver.disconnect();(i=this.disposeKeyListener)===null||i===void 0?void 0:i.call(this)}}changedTrigger(t){this.registerListener(t)}isAnchorSubmenu(){var t;if(!l(this.anchorElement)){return!!((t=this.anchorElement)===null||t===void 0?void 0:t.closest("ix-dropdown-item"))}return true}async applyDropdownPosition(){if(!this.show){return}if(!this.anchorElement){return}if(!this.dropdownRef){return}const t=this.isAnchorSubmenu();let i={strategy:this.positioningStrategy,middleware:[]};if(!this.suppressAutomaticPlacement){i.middleware.push(h({fallbackStrategy:"initialPlacement"}))}i.placement=t?"right-start":this.placement;i.middleware=[...i.middleware,n(),o()];if(this.offset){i.middleware.push(a(this.offset))}if(this.autoUpdateCleanup){this.autoUpdateCleanup();this.autoUpdateCleanup=null}this.autoUpdateCleanup=d(this.anchorElement,this.dropdownRef,(async()=>{const t=await c(this.anchorElement,this.dropdownRef,i);Object.assign(this.dropdownRef.style,{top:"0",left:"0",transform:`translate(${Math.round(t.x)}px,${Math.round(t.y)}px)`});if(this.overwriteDropdownStyle){const t=await this.overwriteDropdownStyle({dropdownRef:this.dropdownRef,triggerRef:this.triggerElement});Object.assign(this.dropdownRef.style,t)}}),{ancestorResize:true,ancestorScroll:true,elementResize:true})}focusDropdownItem(t){requestAnimationFrame((()=>{var i;(i=this.dropdownItems[t])===null||i===void 0?void 0:i.shadowRoot.querySelector("button").focus()}))}async componentDidLoad(){this.changedTrigger(this.trigger)}async componentDidRender(){await this.applyDropdownPosition();this.anchorElement=await(this.anchor?this.resolveElement(this.anchor):this.resolveElement(this.trigger))}isTriggerElement(t){const i=!!t.hasAttribute("data-ix-dropdown-trigger");return i}onDropdownClick(t){if(m.pathIncludesTrigger(t.composedPath())){t.preventDefault();if(this.isTriggerElement(t.target)){return}}if(this.closeBehavior==="inside"||this.closeBehavior==="both"){m.dismissAll([this.getId()])}m.dismissOthers(this.getId())}async updatePosition(){this.applyDropdownPosition()}render(){return s(e,{key:"afb0bd3099fd4e5363c4b48f9a718d6b58a29570","data-ix-dropdown":this.localUId,ref:t=>this.dropdownRef=t,class:{"dropdown-menu":true,show:this.show,overflow:true},style:{margin:"0",minWidth:"0px",position:this.positioningStrategy},role:"list",onClick:t=>this.onDropdownClick(t)},s("div",{key:"19fd27ae702d808e76cf7484c2bca3a7cab38b53",style:{display:"contents"}},this.header&&s("div",{class:"dropdown-header"},this.header),s("slot",{key:"cfaf1630739aba4c96fabf38a7d59780ba7b7a7c"})))}get hostElement(){return r(this)}static get watchers(){return{show:["changedShow"],trigger:["changedTrigger"]}}};v.style=p;export{v as ix_dropdown};
2
+ //# sourceMappingURL=p-a039faa9.entry.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["hasDropdownItemWrapperImplemented","item","getDropdownItemElement","undefined","DropdownController","constructor","this","dropdowns","Map","submenuIds","isWindowListenerActive","connected","dropdown","addOverlayListeners","set","getId","discoverAllSubmenus","discoverSubmenus","disconnected","delete","forEach","discoverSubmenu","present","isPresent","willPresent","getAssignedSubmenuIds","dismissChildren","uid","childIds","id","dismiss","get","willDismiss","dismissAll","ignoreBehaviorForIds","includes","closeBehavior","dismissOthers","path","buildComposedPath","Set","has","pathIncludesTrigger","eventTargets","eventTarget","HTMLElement","hasAttribute","pathIncludesDropdown","find","element","tagName","add","ruleKey","Object","keys","key","window","addEventListener","event","hasTrigger","composedPath","hasDropdown","addDisposableEventListener","eventType","callback","removeEventListener","dropdownController","dropdownCss","IxDropdownStyle0","sequenceId","Dropdown","autoUpdateCleanup","localUId","assignedSubmenu","focusDropdownItemBind","focusDropdownItem","bind","itemObserver","MutationObserver","arrowFocusController","items","dropdownItems","connectedCallback","trigger","registerListener","cacheSubmenuId","stopImmediatePropagation","preventDefault","detail","indexOf","push","disconnectedCallback","disposeClickListener","disposeKeyListener","show","defaultPrevented","showChanged","emit","Array","from","hostElement","querySelectorAll","slotElement","shadowRoot","querySelector","addEventListenersFor","_a","call","_b","toggleController","triggerElement","_c","setAttribute","dispatchEvent","CustomEvent","bubbles","composed","cancelable","registerKeyListener","document","activeElement","setTimeout","resolveElement","el","findElement","checkForSubmenuAnchor","dropdownItem","isSubMenu","style","zIndex","Promise","resolve","selector","observer","disconnect","observe","body","childList","subtree","changedShow","newShow","anchorElement","anchor","applyDropdownPosition","ArrowFocusController","dropdownRef","changedTrigger","newTriggerValue","isAnchorSubmenu","closest","isSubmenu","positionConfig","strategy","positioningStrategy","middleware","suppressAutomaticPlacement","flip","fallbackStrategy","placement","inline","shift","offset","autoUpdate","async","computeResponse","computePosition","assign","top","left","transform","Math","round","x","y","overwriteDropdownStyle","overwriteStyle","triggerRef","ancestorResize","ancestorScroll","elementResize","index","requestAnimationFrame","focus","componentDidLoad","componentDidRender","isTriggerElement","onDropdownClick","target","updatePosition","render","h","Host","ref","class","overflow","margin","minWidth","position","role","onClick","display","header"],"sources":["src/components/dropdown/dropdown-controller.ts","src/components/dropdown/dropdown.scss?tag=ix-dropdown&encapsulation=shadow","src/components/dropdown/dropdown.tsx"],"sourcesContent":["/*\n * SPDX-FileCopyrightText: 2024 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { IxComponent } from '../utils/internal';\nexport type CloseBehavior = 'inside' | 'outside' | 'both' | boolean;\n\nexport interface DropdownInterface extends IxComponent {\n closeBehavior: CloseBehavior;\n discoverAllSubmenus: boolean;\n\n getAssignedSubmenuIds(): string[];\n getId(): string;\n\n discoverSubmenu(): void;\n\n isPresent(): boolean;\n\n willPresent?(): boolean;\n willDismiss?(): boolean;\n\n present(): void;\n dismiss(): void;\n}\n\nexport function hasDropdownItemWrapperImplemented(\n item: unknown\n): item is DropdownItemWrapper {\n return (\n item &&\n (item as DropdownItemWrapper).getDropdownItemElement !== undefined &&\n typeof (item as DropdownItemWrapper).getDropdownItemElement === 'function'\n );\n}\n\nexport interface DropdownItemWrapper {\n getDropdownItemElement(): Promise<HTMLIxDropdownItemElement>;\n}\n\ntype SubmenuIds = Record<string, string[]>;\n\nclass DropdownController {\n private dropdowns: Map<string, DropdownInterface> = new Map<\n string,\n DropdownInterface\n >();\n private submenuIds: SubmenuIds = {};\n\n private isWindowListenerActive = false;\n\n connected(dropdown: DropdownInterface) {\n if (!this.isWindowListenerActive) {\n this.addOverlayListeners();\n }\n this.dropdowns.set(dropdown.getId(), dropdown);\n\n if (dropdown.discoverAllSubmenus) {\n this.discoverSubmenus();\n }\n }\n\n disconnected(dropdown: DropdownInterface) {\n this.dropdowns.delete(dropdown.getId());\n }\n\n discoverSubmenus() {\n this.dropdowns.forEach((dropdown) => {\n dropdown.discoverSubmenu();\n });\n }\n\n present(dropdown: DropdownInterface) {\n if (!dropdown.isPresent() && dropdown.willPresent()) {\n this.submenuIds[dropdown.getId()] = dropdown.getAssignedSubmenuIds();\n dropdown.present();\n }\n }\n\n dismissChildren(uid: string) {\n const childIds = this.submenuIds[uid] || [];\n for (const id of childIds) {\n this.dismiss(this.dropdowns.get(id));\n }\n }\n\n dismiss(dropdown: DropdownInterface) {\n if (dropdown.isPresent() && dropdown.willDismiss()) {\n this.dismissChildren(dropdown.getId());\n dropdown.dismiss();\n delete this.submenuIds[dropdown.getId()];\n }\n }\n\n dismissAll(ignoreBehaviorForIds: string[] = []) {\n this.dropdowns.forEach((dropdown) => {\n if (\n !ignoreBehaviorForIds.includes(dropdown.getId()) &&\n (dropdown.closeBehavior === 'inside' ||\n dropdown.closeBehavior === false)\n ) {\n return;\n }\n\n this.dismiss(dropdown);\n });\n }\n\n dismissOthers(uid: string) {\n let path = this.buildComposedPath(uid, new Set<string>());\n\n this.dropdowns.forEach((dropdown) => {\n if (\n dropdown.closeBehavior !== 'inside' &&\n dropdown.closeBehavior !== false &&\n !path.has(dropdown.getId())\n ) {\n this.dismiss(dropdown);\n }\n });\n }\n\n pathIncludesTrigger(eventTargets: EventTarget[]) {\n for (let eventTarget of eventTargets) {\n if (eventTarget instanceof HTMLElement) {\n if (eventTarget.hasAttribute('data-ix-dropdown-trigger')) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n private pathIncludesDropdown(eventTargets: EventTarget[]) {\n return !!eventTargets.find(\n (element: HTMLElement) => element.tagName === 'IX-DROPDOWN'\n );\n }\n\n private buildComposedPath(id: string, path: Set<string>): Set<string> {\n if (this.submenuIds[id]) {\n path.add(id);\n }\n\n for (const ruleKey of Object.keys(this.submenuIds)) {\n if (this.submenuIds[ruleKey].includes(id)) {\n this.buildComposedPath(ruleKey, path).forEach((key) => path.add(key));\n }\n }\n\n return path;\n }\n\n private addOverlayListeners() {\n this.isWindowListenerActive = true;\n\n window.addEventListener('click', (event: PointerEvent) => {\n const hasTrigger = this.pathIncludesTrigger(event.composedPath());\n const hasDropdown = this.pathIncludesDropdown(event.composedPath());\n\n if (!hasTrigger && !hasDropdown) {\n this.dismissAll();\n }\n });\n\n window.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n this.dismissAll([...this.dropdowns.keys()]);\n }\n });\n }\n}\n\nexport const addDisposableEventListener = (\n element: Element | Window | Document,\n eventType: string,\n callback: EventListenerOrEventListenerObject\n) => {\n element.addEventListener(eventType, callback);\n\n return () => {\n element.removeEventListener(eventType, callback);\n };\n};\n\nexport const addDisposableEventListenerAsArray = (\n listener: {\n element: Element | Window | Document;\n eventType: string;\n callback: EventListenerOrEventListenerObject;\n }[]\n) => {\n const disposables = listener.map(({ callback, element, eventType }) =>\n addDisposableEventListener(element, eventType, callback)\n );\n\n return () => disposables.forEach((dispose) => dispose());\n};\n\nexport const dropdownController = new DropdownController();\n","/*\n * SPDX-FileCopyrightText: 2023 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n@import 'common-variables';\n\n@import 'legacy/mixins/fonts';\n@import 'mixins/text-truncation';\n@import 'mixins/shadow-dom/component';\n\n:host {\n background-color: var(--theme-color-2);\n border-radius: var(--theme-default-border-radius);\n @include ix-component;\n min-width: 0px;\n z-index: var(--theme-z-index-dropdown);\n box-shadow: var(--theme-shadow-4);\n\n padding: 0.25rem 0px;\n\n .dropdown-header {\n display: flex;\n align-items: center;\n height: $large-control-height;\n color: var(--theme-menu-header--color);\n padding: 0 $default-space;\n }\n}\n\n:host(.overflow) {\n max-height: 50vh;\n overflow-y: auto;\n}\n\n:host(:not(.show)) {\n display: none;\n}\n","/*\n * SPDX-FileCopyrightText: 2023 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport {\n autoUpdate,\n computePosition,\n ComputePositionConfig,\n flip,\n inline,\n offset,\n shift,\n} from '@floating-ui/dom';\nimport {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Method,\n Prop,\n Watch,\n} from '@stencil/core';\nimport { ComponentInterface } from '@stencil/core/internal';\nimport { ArrowFocusController } from '../utils/focus';\nimport {\n addDisposableEventListener,\n CloseBehavior,\n dropdownController,\n DropdownInterface,\n hasDropdownItemWrapperImplemented,\n} from './dropdown-controller';\nimport { AlignedPlacement } from './placement';\n\nlet sequenceId = 0;\n\n@Component({\n tag: 'ix-dropdown',\n styleUrl: 'dropdown.scss',\n shadow: true,\n})\nexport class Dropdown implements ComponentInterface, DropdownInterface {\n @Element() hostElement!: HTMLIxDropdownElement;\n\n /**\n * Suppress the automatic placement of the dropdown.\n *\n * @since 2.0.0\n */\n @Prop() suppressAutomaticPlacement = false;\n\n /**\n * Show dropdown\n */\n @Prop({ mutable: true, reflect: true }) show = false;\n\n /**\n * Define an element that triggers the dropdown.\n * A trigger can either be a string that will be interpreted as id attribute or a DOM element.\n */\n @Prop() trigger: string | HTMLElement | Promise<HTMLElement>;\n\n /**\n * Define an anchor element\n */\n @Prop() anchor: string | HTMLElement;\n\n /**\n * Controls if the dropdown will be closed in response to a click event depending on the position of the event relative to the dropdown.\n * If the dropdown is a child of another one, it will be closed with the parent, regardless of its own close behavior.\n */\n @Prop() closeBehavior: CloseBehavior = 'both';\n\n /**\n * Placement of the dropdown\n */\n @Prop() placement: AlignedPlacement = 'bottom-start';\n\n /**\n * Position strategy\n */\n @Prop() positioningStrategy: 'absolute' | 'fixed' = 'fixed';\n\n /**\n * An optional header shown at the top of the dropdown\n */\n @Prop() header?: string;\n\n /**\n * Move dropdown along main axis of alignment\n *\n * @internal\n */\n @Prop() offset: {\n mainAxis?: number;\n crossAxis?: number;\n alignmentAxis?: number;\n };\n\n /**\n * @internal\n */\n @Prop() overwriteDropdownStyle: (delegate: {\n dropdownRef: HTMLElement;\n triggerRef?: HTMLElement;\n }) => Promise<Partial<CSSStyleDeclaration>>;\n\n /**\n * @internal\n * If initialisation of this dropdown is expected to be defered submenu discovery will have to be re-run globally by the controller.\n * This property indicates the need for that to the controller.\n */\n @Prop() discoverAllSubmenus = false;\n\n /**\n * Fire event after visibility of dropdown has changed\n */\n @Event() showChanged: EventEmitter<boolean>;\n\n private autoUpdateCleanup: () => void = null;\n\n private triggerElement?: Element;\n private anchorElement?: Element;\n\n private dropdownRef: HTMLElement;\n private localUId = `dropdown-${sequenceId++}`;\n private assignedSubmenu: string[] = [];\n\n private arrowFocusController: ArrowFocusController;\n private focusDropdownItemBind = this.focusDropdownItem.bind(this);\n\n private itemObserver = new MutationObserver(() => {\n this.arrowFocusController.items = this.dropdownItems;\n });\n\n connectedCallback(): void {\n dropdownController.connected(this);\n\n if (this.trigger != undefined) {\n this.registerListener(this.trigger);\n }\n }\n\n @Listen('ix-assign-sub-menu')\n cacheSubmenuId(event: CustomEvent<string>) {\n event.stopImmediatePropagation();\n event.preventDefault();\n\n const { detail } = event;\n\n if (this.assignedSubmenu.indexOf(detail) === -1) {\n this.assignedSubmenu.push(detail);\n }\n }\n\n disconnectedCallback() {\n dropdownController.dismiss(this);\n dropdownController.disconnected(this);\n\n if (this.disposeClickListener) {\n this.disposeClickListener();\n }\n\n if (this.disposeKeyListener) {\n this.disposeKeyListener();\n }\n\n if (this.autoUpdateCleanup) {\n this.autoUpdateCleanup();\n }\n }\n\n getAssignedSubmenuIds() {\n return this.assignedSubmenu;\n }\n\n isPresent() {\n return this.show;\n }\n\n present() {\n this.show = true;\n }\n\n dismiss() {\n this.show = false;\n }\n\n getId() {\n return this.localUId;\n }\n\n willDismiss() {\n const { defaultPrevented } = this.showChanged.emit(false);\n return !defaultPrevented;\n }\n\n willPresent() {\n const { defaultPrevented } = this.showChanged.emit(true);\n return !defaultPrevented;\n }\n\n get dropdownItems() {\n return Array.from(this.hostElement.querySelectorAll('ix-dropdown-item'));\n }\n\n get slotElement() {\n return this.hostElement.shadowRoot.querySelector('slot');\n }\n\n private disposeClickListener?: () => void;\n private disposeKeyListener?: () => void;\n\n private addEventListenersFor() {\n this.disposeClickListener?.();\n this.disposeKeyListener?.();\n\n const toggleController = () => {\n if (!this.isPresent()) {\n dropdownController.present(this);\n } else {\n dropdownController.dismiss(this);\n }\n\n dropdownController.dismissOthers(this.getId());\n };\n\n this.disposeClickListener = addDisposableEventListener(\n this.triggerElement,\n 'click',\n (event: PointerEvent) => {\n if (!event.defaultPrevented) {\n toggleController();\n }\n }\n );\n\n this.triggerElement?.setAttribute(\n 'data-ix-dropdown-trigger',\n this.localUId\n );\n }\n\n /** @internal */\n @Method()\n async discoverSubmenu() {\n this.triggerElement?.dispatchEvent(\n new CustomEvent('ix-assign-sub-menu', {\n bubbles: true,\n composed: false,\n cancelable: true,\n detail: this.localUId,\n })\n );\n }\n\n private registerKeyListener() {\n this.disposeKeyListener = addDisposableEventListener(\n this.triggerElement,\n 'keydown',\n (event: KeyboardEvent) => {\n if (event.key !== 'ArrowDown') {\n return;\n }\n\n if (document.activeElement !== this.triggerElement) {\n return;\n }\n\n dropdownController.present(this);\n\n setTimeout(() => {\n this.focusDropdownItem(0);\n });\n }\n );\n }\n\n private async registerListener(\n element: string | HTMLElement | Promise<HTMLElement>\n ) {\n this.triggerElement = await this.resolveElement(element);\n if (this.triggerElement) {\n this.addEventListenersFor();\n this.discoverSubmenu();\n }\n }\n\n private async resolveElement(\n element: string | HTMLElement | Promise<HTMLElement>\n ) {\n const el = await this.findElement(element);\n\n return this.checkForSubmenuAnchor(el);\n }\n\n private async checkForSubmenuAnchor(element: Element) {\n if (!element) {\n return null;\n }\n\n if (hasDropdownItemWrapperImplemented(element)) {\n const dropdownItem = await element.getDropdownItemElement();\n dropdownItem.isSubMenu = true;\n this.hostElement.style.zIndex = `var(--theme-z-index-dropdown)`;\n }\n\n if (element.tagName === 'IX-DROPDOWN-ITEM') {\n (element as HTMLIxDropdownItemElement).isSubMenu = true;\n this.hostElement.style.zIndex = `var(--theme-z-index-dropdown)`;\n }\n\n return element;\n }\n\n private findElement(\n element: string | HTMLElement | Promise<HTMLElement>\n ): Promise<Element> {\n if (element instanceof Promise) {\n return element;\n }\n\n if (typeof element === 'object') {\n return Promise.resolve(element);\n }\n\n if (typeof element != 'string') {\n return;\n }\n\n const selector = `#${element}`;\n return new Promise((resolve) => {\n if (document.querySelector(selector)) {\n return resolve(document.querySelector(selector));\n }\n\n const observer = new MutationObserver(() => {\n if (document.querySelector(selector)) {\n resolve(document.querySelector(selector));\n observer.disconnect();\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n });\n }\n\n @Watch('show')\n async changedShow(newShow: boolean) {\n if (newShow) {\n this.anchorElement = await (this.anchor\n ? this.resolveElement(this.anchor)\n : this.resolveElement(this.trigger));\n\n if (this.anchorElement) {\n this.applyDropdownPosition();\n }\n\n this.arrowFocusController = new ArrowFocusController(\n this.dropdownItems,\n this.dropdownRef,\n this.focusDropdownItemBind\n );\n\n this.itemObserver.observe(this.dropdownRef, {\n childList: true,\n subtree: true,\n });\n\n this.registerKeyListener();\n } else {\n this.arrowFocusController.disconnect();\n this.itemObserver.disconnect();\n this.disposeKeyListener?.();\n }\n }\n\n @Watch('trigger')\n changedTrigger(newTriggerValue: string | HTMLElement | Promise<HTMLElement>) {\n this.registerListener(newTriggerValue);\n }\n\n private isAnchorSubmenu(): boolean {\n if (!hasDropdownItemWrapperImplemented(this.anchorElement)) {\n // Is no official dropdown-item, but check if any dropdown-item\n // is placed somewhere up the DOM\n return !!this.anchorElement?.closest('ix-dropdown-item');\n }\n\n return true;\n }\n\n private async applyDropdownPosition() {\n if (!this.show) {\n return;\n }\n if (!this.anchorElement) {\n return;\n }\n if (!this.dropdownRef) {\n return;\n }\n const isSubmenu = this.isAnchorSubmenu();\n\n let positionConfig: Partial<ComputePositionConfig> = {\n strategy: this.positioningStrategy,\n middleware: [],\n };\n\n if (!this.suppressAutomaticPlacement) {\n positionConfig.middleware.push(\n flip({ fallbackStrategy: 'initialPlacement' })\n );\n }\n\n positionConfig.placement = isSubmenu ? 'right-start' : this.placement;\n\n positionConfig.middleware = [\n ...positionConfig.middleware,\n inline(),\n shift(),\n ];\n\n if (this.offset) {\n positionConfig.middleware.push(offset(this.offset));\n }\n\n if (this.autoUpdateCleanup) {\n this.autoUpdateCleanup();\n this.autoUpdateCleanup = null;\n }\n\n this.autoUpdateCleanup = autoUpdate(\n this.anchorElement,\n this.dropdownRef,\n async () => {\n const computeResponse = await computePosition(\n this.anchorElement,\n this.dropdownRef,\n positionConfig\n );\n Object.assign(this.dropdownRef.style, {\n top: '0',\n left: '0',\n transform: `translate(${Math.round(computeResponse.x)}px,${Math.round(\n computeResponse.y\n )}px)`,\n });\n if (this.overwriteDropdownStyle) {\n const overwriteStyle = await this.overwriteDropdownStyle({\n dropdownRef: this.dropdownRef,\n triggerRef: this.triggerElement as HTMLElement,\n });\n\n Object.assign(this.dropdownRef.style, overwriteStyle);\n }\n },\n {\n ancestorResize: true,\n ancestorScroll: true,\n elementResize: true,\n }\n );\n }\n\n private focusDropdownItem(index: number) {\n requestAnimationFrame(() => {\n this.dropdownItems[index]?.shadowRoot.querySelector('button').focus();\n });\n }\n\n async componentDidLoad() {\n this.changedTrigger(this.trigger);\n }\n\n async componentDidRender() {\n await this.applyDropdownPosition();\n this.anchorElement = await (this.anchor\n ? this.resolveElement(this.anchor)\n : this.resolveElement(this.trigger));\n }\n\n private isTriggerElement(element: HTMLElement) {\n const trigger = !!element.hasAttribute('data-ix-dropdown-trigger');\n\n return trigger;\n }\n\n private onDropdownClick(event: PointerEvent) {\n if (dropdownController.pathIncludesTrigger(event.composedPath())) {\n event.preventDefault();\n\n if (this.isTriggerElement(event.target as HTMLElement)) {\n return;\n }\n }\n\n if (this.closeBehavior === 'inside' || this.closeBehavior === 'both') {\n dropdownController.dismissAll([this.getId()]);\n }\n\n dropdownController.dismissOthers(this.getId());\n }\n\n /**\n * Update position of dropdown\n */\n @Method()\n async updatePosition() {\n this.applyDropdownPosition();\n }\n\n render() {\n return (\n <Host\n data-ix-dropdown={this.localUId}\n ref={(ref) => (this.dropdownRef = ref)}\n class={{\n 'dropdown-menu': true,\n show: this.show,\n overflow: true,\n }}\n style={{\n margin: '0',\n minWidth: '0px',\n position: this.positioningStrategy,\n }}\n role=\"list\"\n onClick={(event: PointerEvent) => this.onDropdownClick(event)}\n >\n <div style={{ display: 'contents' }}>\n {this.header && <div class=\"dropdown-header\">{this.header}</div>}\n\n <slot></slot>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["hasDropdownItemWrapperImplemented","item","getDropdownItemElement","undefined","DropdownController","constructor","this","dropdowns","Map","submenuIds","isWindowListenerActive","connected","dropdown","addOverlayListeners","set","getId","discoverAllSubmenus","discoverSubmenus","disconnected","delete","forEach","discoverSubmenu","present","isPresent","willPresent","getAssignedSubmenuIds","dismissChildren","uid","childIds","id","dismiss","get","willDismiss","dismissAll","ignoreBehaviorForIds","includes","closeBehavior","dismissOthers","path","buildComposedPath","Set","has","pathIncludesTrigger","eventTargets","eventTarget","HTMLElement","hasAttribute","pathIncludesDropdown","find","element","tagName","add","ruleKey","Object","keys","key","window","addEventListener","event","hasTrigger","composedPath","hasDropdown","addDisposableEventListener","eventType","callback","removeEventListener","dropdownController","dropdownCss","IxDropdownStyle0","sequenceId","Dropdown","autoUpdateCleanup","localUId","assignedSubmenu","focusDropdownItemBind","focusDropdownItem","bind","itemObserver","MutationObserver","arrowFocusController","items","dropdownItems","connectedCallback","trigger","registerListener","cacheSubmenuId","stopImmediatePropagation","preventDefault","detail","indexOf","push","disconnectedCallback","disposeClickListener","disposeKeyListener","show","defaultPrevented","showChanged","emit","Array","from","hostElement","querySelectorAll","slotElement","shadowRoot","querySelector","addEventListenersFor","_a","call","_b","toggleController","triggerElement","_c","setAttribute","dispatchEvent","CustomEvent","bubbles","composed","cancelable","registerKeyListener","document","activeElement","setTimeout","resolveElement","el","findElement","checkForSubmenuAnchor","dropdownItem","isSubMenu","style","zIndex","Promise","resolve","selector","observer","disconnect","observe","body","childList","subtree","changedShow","newShow","anchorElement","anchor","applyDropdownPosition","ArrowFocusController","dropdownRef","changedTrigger","newTriggerValue","isAnchorSubmenu","closest","isSubmenu","positionConfig","strategy","positioningStrategy","middleware","suppressAutomaticPlacement","flip","fallbackStrategy","placement","inline","shift","offset","autoUpdate","async","computeResponse","computePosition","assign","top","left","transform","Math","round","x","y","overwriteDropdownStyle","overwriteStyle","triggerRef","ancestorResize","ancestorScroll","elementResize","index","requestAnimationFrame","focus","componentDidLoad","componentDidRender","isTriggerElement","onDropdownClick","target","updatePosition","render","h","Host","ref","class","overflow","margin","minWidth","position","role","onClick","display","header"],"sources":["src/components/dropdown/dropdown-controller.ts","src/components/dropdown/dropdown.scss?tag=ix-dropdown&encapsulation=shadow","src/components/dropdown/dropdown.tsx"],"sourcesContent":["/*\n * SPDX-FileCopyrightText: 2024 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { IxComponent } from '../utils/internal';\nexport type CloseBehavior = 'inside' | 'outside' | 'both' | boolean;\n\nexport interface DropdownInterface extends IxComponent {\n closeBehavior: CloseBehavior;\n discoverAllSubmenus: boolean;\n\n getAssignedSubmenuIds(): string[];\n getId(): string;\n\n discoverSubmenu(): void;\n\n isPresent(): boolean;\n\n willPresent?(): boolean;\n willDismiss?(): boolean;\n\n present(): void;\n dismiss(): void;\n}\n\nexport function hasDropdownItemWrapperImplemented(\n item: unknown\n): item is DropdownItemWrapper {\n return (\n item &&\n (item as DropdownItemWrapper).getDropdownItemElement !== undefined &&\n typeof (item as DropdownItemWrapper).getDropdownItemElement === 'function'\n );\n}\n\nexport interface DropdownItemWrapper {\n getDropdownItemElement(): Promise<HTMLIxDropdownItemElement>;\n}\n\ntype SubmenuIds = Record<string, string[]>;\n\nclass DropdownController {\n private dropdowns: Map<string, DropdownInterface> = new Map<\n string,\n DropdownInterface\n >();\n private submenuIds: SubmenuIds = {};\n\n private isWindowListenerActive = false;\n\n connected(dropdown: DropdownInterface) {\n if (!this.isWindowListenerActive) {\n this.addOverlayListeners();\n }\n this.dropdowns.set(dropdown.getId(), dropdown);\n\n if (dropdown.discoverAllSubmenus) {\n this.discoverSubmenus();\n }\n }\n\n disconnected(dropdown: DropdownInterface) {\n this.dropdowns.delete(dropdown.getId());\n }\n\n discoverSubmenus() {\n this.dropdowns.forEach((dropdown) => {\n dropdown.discoverSubmenu();\n });\n }\n\n present(dropdown: DropdownInterface) {\n if (!dropdown.isPresent() && dropdown.willPresent()) {\n this.submenuIds[dropdown.getId()] = dropdown.getAssignedSubmenuIds();\n dropdown.present();\n }\n }\n\n dismissChildren(uid: string) {\n const childIds = this.submenuIds[uid] || [];\n for (const id of childIds) {\n this.dismiss(this.dropdowns.get(id));\n }\n }\n\n dismiss(dropdown: DropdownInterface) {\n if (dropdown.isPresent() && dropdown.willDismiss()) {\n this.dismissChildren(dropdown.getId());\n dropdown.dismiss();\n delete this.submenuIds[dropdown.getId()];\n }\n }\n\n dismissAll(ignoreBehaviorForIds: string[] = []) {\n this.dropdowns.forEach((dropdown) => {\n if (\n !ignoreBehaviorForIds.includes(dropdown.getId()) &&\n (dropdown.closeBehavior === 'inside' ||\n dropdown.closeBehavior === false)\n ) {\n return;\n }\n\n this.dismiss(dropdown);\n });\n }\n\n dismissOthers(uid: string) {\n let path = this.buildComposedPath(uid, new Set<string>());\n\n this.dropdowns.forEach((dropdown) => {\n if (\n dropdown.closeBehavior !== 'inside' &&\n dropdown.closeBehavior !== false &&\n !path.has(dropdown.getId())\n ) {\n this.dismiss(dropdown);\n }\n });\n }\n\n pathIncludesTrigger(eventTargets: EventTarget[]) {\n for (let eventTarget of eventTargets) {\n if (eventTarget instanceof HTMLElement) {\n if (eventTarget.hasAttribute('data-ix-dropdown-trigger')) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n private pathIncludesDropdown(eventTargets: EventTarget[]) {\n return !!eventTargets.find(\n (element: HTMLElement) => element.tagName === 'IX-DROPDOWN'\n );\n }\n\n private buildComposedPath(id: string, path: Set<string>): Set<string> {\n if (this.submenuIds[id]) {\n path.add(id);\n }\n\n for (const ruleKey of Object.keys(this.submenuIds)) {\n if (this.submenuIds[ruleKey].includes(id)) {\n this.buildComposedPath(ruleKey, path).forEach((key) => path.add(key));\n }\n }\n\n return path;\n }\n\n private addOverlayListeners() {\n this.isWindowListenerActive = true;\n\n window.addEventListener('click', (event: PointerEvent) => {\n const hasTrigger = this.pathIncludesTrigger(event.composedPath());\n const hasDropdown = this.pathIncludesDropdown(event.composedPath());\n\n if (!hasTrigger && !hasDropdown) {\n this.dismissAll();\n }\n });\n\n window.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n this.dismissAll([...this.dropdowns.keys()]);\n }\n });\n }\n}\n\nexport const addDisposableEventListener = (\n element: Element | Window | Document,\n eventType: string,\n callback: EventListenerOrEventListenerObject\n) => {\n element.addEventListener(eventType, callback);\n\n return () => {\n element.removeEventListener(eventType, callback);\n };\n};\n\nexport const addDisposableEventListenerAsArray = (\n listener: {\n element: Element | Window | Document;\n eventType: string;\n callback: EventListenerOrEventListenerObject;\n }[]\n) => {\n const disposables = listener.map(({ callback, element, eventType }) =>\n addDisposableEventListener(element, eventType, callback)\n );\n\n return () => disposables.forEach((dispose) => dispose());\n};\n\nexport const dropdownController = new DropdownController();\n","/*\n * SPDX-FileCopyrightText: 2023 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n@import 'common-variables';\n\n@import 'legacy/mixins/fonts';\n@import 'mixins/text-truncation';\n@import 'mixins/shadow-dom/component';\n\n:host {\n background-color: var(--theme-color-2);\n border-radius: var(--theme-default-border-radius);\n @include ix-component;\n min-width: 0px;\n z-index: var(--theme-z-index-dropdown);\n box-shadow: var(--theme-shadow-4);\n\n padding: 0.25rem 0px;\n\n .dropdown-header {\n display: flex;\n align-items: center;\n height: $large-control-height;\n color: var(--theme-menu-header--color);\n padding: 0 $default-space;\n }\n}\n\n:host(.overflow) {\n max-height: 50vh;\n overflow-y: auto;\n}\n\n:host(:not(.show)) {\n display: none;\n}\n","/*\n * SPDX-FileCopyrightText: 2023 Siemens AG\n *\n * SPDX-License-Identifier: MIT\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport {\n autoUpdate,\n computePosition,\n ComputePositionConfig,\n flip,\n inline,\n offset,\n shift,\n} from '@floating-ui/dom';\nimport {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Method,\n Prop,\n Watch,\n} from '@stencil/core';\nimport { ComponentInterface } from '@stencil/core/internal';\nimport { ArrowFocusController } from '../utils/focus';\nimport {\n addDisposableEventListener,\n CloseBehavior,\n dropdownController,\n DropdownInterface,\n hasDropdownItemWrapperImplemented,\n} from './dropdown-controller';\nimport { AlignedPlacement } from './placement';\n\nlet sequenceId = 0;\n\n@Component({\n tag: 'ix-dropdown',\n styleUrl: 'dropdown.scss',\n shadow: true,\n})\nexport class Dropdown implements ComponentInterface, DropdownInterface {\n @Element() hostElement!: HTMLIxDropdownElement;\n\n /**\n * Suppress the automatic placement of the dropdown.\n *\n * @since 2.0.0\n */\n @Prop() suppressAutomaticPlacement = false;\n\n /**\n * Show dropdown\n */\n @Prop({ mutable: true, reflect: true }) show = false;\n\n /**\n * Define an element that triggers the dropdown.\n * A trigger can either be a string that will be interpreted as id attribute or a DOM element.\n */\n @Prop() trigger: string | HTMLElement | Promise<HTMLElement>;\n\n /**\n * Define an anchor element\n */\n @Prop() anchor: string | HTMLElement;\n\n /**\n * Controls if the dropdown will be closed in response to a click event depending on the position of the event relative to the dropdown.\n * If the dropdown is a child of another one, it will be closed with the parent, regardless of its own close behavior.\n */\n @Prop() closeBehavior: CloseBehavior = 'both';\n\n /**\n * Placement of the dropdown\n */\n @Prop() placement: AlignedPlacement = 'bottom-start';\n\n /**\n * Position strategy\n */\n @Prop() positioningStrategy: 'absolute' | 'fixed' = 'fixed';\n\n /**\n * An optional header shown at the top of the dropdown\n */\n @Prop() header?: string;\n\n /**\n * Move dropdown along main axis of alignment\n *\n * @internal\n */\n @Prop() offset: {\n mainAxis?: number;\n crossAxis?: number;\n alignmentAxis?: number;\n };\n\n /**\n * @internal\n */\n @Prop() overwriteDropdownStyle: (delegate: {\n dropdownRef: HTMLElement;\n triggerRef?: HTMLElement;\n }) => Promise<Partial<CSSStyleDeclaration>>;\n\n /**\n * @internal\n * If initialisation of this dropdown is expected to be defered submenu discovery will have to be re-run globally by the controller.\n * This property indicates the need for that to the controller.\n */\n @Prop() discoverAllSubmenus = false;\n\n /**\n * Fire event after visibility of dropdown has changed\n */\n @Event() showChanged: EventEmitter<boolean>;\n\n private autoUpdateCleanup: () => void = null;\n\n private triggerElement?: Element;\n private anchorElement?: Element;\n\n private dropdownRef: HTMLElement;\n private localUId = `dropdown-${sequenceId++}`;\n private assignedSubmenu: string[] = [];\n\n private arrowFocusController: ArrowFocusController;\n private focusDropdownItemBind = this.focusDropdownItem.bind(this);\n\n private itemObserver = new MutationObserver(() => {\n this.arrowFocusController.items = this.dropdownItems;\n });\n\n connectedCallback(): void {\n dropdownController.connected(this);\n\n if (this.trigger != undefined) {\n this.registerListener(this.trigger);\n }\n }\n\n @Listen('ix-assign-sub-menu')\n cacheSubmenuId(event: CustomEvent<string>) {\n event.stopImmediatePropagation();\n event.preventDefault();\n\n const { detail } = event;\n\n if (this.assignedSubmenu.indexOf(detail) === -1) {\n this.assignedSubmenu.push(detail);\n }\n }\n\n disconnectedCallback() {\n dropdownController.dismiss(this);\n dropdownController.disconnected(this);\n\n if (this.disposeClickListener) {\n this.disposeClickListener();\n }\n\n if (this.disposeKeyListener) {\n this.disposeKeyListener();\n }\n\n if (this.autoUpdateCleanup) {\n this.autoUpdateCleanup();\n }\n }\n\n getAssignedSubmenuIds() {\n return this.assignedSubmenu;\n }\n\n isPresent() {\n return this.show;\n }\n\n present() {\n this.show = true;\n }\n\n dismiss() {\n this.show = false;\n }\n\n getId() {\n return this.localUId;\n }\n\n willDismiss() {\n const { defaultPrevented } = this.showChanged.emit(false);\n return !defaultPrevented;\n }\n\n willPresent() {\n const { defaultPrevented } = this.showChanged.emit(true);\n return !defaultPrevented;\n }\n\n get dropdownItems() {\n return Array.from(this.hostElement.querySelectorAll('ix-dropdown-item'));\n }\n\n get slotElement() {\n return this.hostElement.shadowRoot.querySelector('slot');\n }\n\n private disposeClickListener?: () => void;\n private disposeKeyListener?: () => void;\n\n private addEventListenersFor() {\n this.disposeClickListener?.();\n this.disposeKeyListener?.();\n\n const toggleController = () => {\n if (!this.isPresent()) {\n dropdownController.present(this);\n } else {\n dropdownController.dismiss(this);\n }\n\n dropdownController.dismissOthers(this.getId());\n };\n\n this.disposeClickListener = addDisposableEventListener(\n this.triggerElement,\n 'click',\n (event: PointerEvent) => {\n if (!event.defaultPrevented) {\n toggleController();\n }\n }\n );\n\n this.triggerElement?.setAttribute(\n 'data-ix-dropdown-trigger',\n this.localUId\n );\n }\n\n /** @internal */\n @Method()\n async discoverSubmenu() {\n this.triggerElement?.dispatchEvent(\n new CustomEvent('ix-assign-sub-menu', {\n bubbles: true,\n composed: false,\n cancelable: true,\n detail: this.localUId,\n })\n );\n }\n\n private registerKeyListener() {\n if (!this.triggerElement) {\n return;\n }\n\n this.disposeKeyListener = addDisposableEventListener(\n this.triggerElement,\n 'keydown',\n (event: KeyboardEvent) => {\n if (event.key !== 'ArrowDown') {\n return;\n }\n\n if (document.activeElement !== this.triggerElement) {\n return;\n }\n\n dropdownController.present(this);\n\n setTimeout(() => {\n this.focusDropdownItem(0);\n });\n }\n );\n }\n\n private async registerListener(\n element: string | HTMLElement | Promise<HTMLElement>\n ) {\n this.triggerElement = await this.resolveElement(element);\n if (this.triggerElement) {\n this.addEventListenersFor();\n this.discoverSubmenu();\n }\n }\n\n private async resolveElement(\n element: string | HTMLElement | Promise<HTMLElement>\n ) {\n const el = await this.findElement(element);\n\n return this.checkForSubmenuAnchor(el);\n }\n\n private async checkForSubmenuAnchor(element: Element) {\n if (!element) {\n return null;\n }\n\n if (hasDropdownItemWrapperImplemented(element)) {\n const dropdownItem = await element.getDropdownItemElement();\n dropdownItem.isSubMenu = true;\n this.hostElement.style.zIndex = `var(--theme-z-index-dropdown)`;\n }\n\n if (element.tagName === 'IX-DROPDOWN-ITEM') {\n (element as HTMLIxDropdownItemElement).isSubMenu = true;\n this.hostElement.style.zIndex = `var(--theme-z-index-dropdown)`;\n }\n\n return element;\n }\n\n private findElement(\n element: string | HTMLElement | Promise<HTMLElement>\n ): Promise<Element> {\n if (element instanceof Promise) {\n return element;\n }\n\n if (typeof element === 'object') {\n return Promise.resolve(element);\n }\n\n if (typeof element != 'string') {\n return;\n }\n\n const selector = `#${element}`;\n return new Promise((resolve) => {\n if (document.querySelector(selector)) {\n return resolve(document.querySelector(selector));\n }\n\n const observer = new MutationObserver(() => {\n if (document.querySelector(selector)) {\n resolve(document.querySelector(selector));\n observer.disconnect();\n }\n });\n\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n });\n }\n\n @Watch('show')\n async changedShow(newShow: boolean) {\n if (newShow) {\n this.anchorElement = await (this.anchor\n ? this.resolveElement(this.anchor)\n : this.resolveElement(this.trigger));\n\n if (this.anchorElement) {\n this.applyDropdownPosition();\n }\n\n this.arrowFocusController = new ArrowFocusController(\n this.dropdownItems,\n this.dropdownRef,\n this.focusDropdownItemBind\n );\n\n this.itemObserver.observe(this.dropdownRef, {\n childList: true,\n subtree: true,\n });\n\n this.registerKeyListener();\n } else {\n this.arrowFocusController.disconnect();\n this.itemObserver.disconnect();\n this.disposeKeyListener?.();\n }\n }\n\n @Watch('trigger')\n changedTrigger(newTriggerValue: string | HTMLElement | Promise<HTMLElement>) {\n this.registerListener(newTriggerValue);\n }\n\n private isAnchorSubmenu(): boolean {\n if (!hasDropdownItemWrapperImplemented(this.anchorElement)) {\n // Is no official dropdown-item, but check if any dropdown-item\n // is placed somewhere up the DOM\n return !!this.anchorElement?.closest('ix-dropdown-item');\n }\n\n return true;\n }\n\n private async applyDropdownPosition() {\n if (!this.show) {\n return;\n }\n if (!this.anchorElement) {\n return;\n }\n if (!this.dropdownRef) {\n return;\n }\n const isSubmenu = this.isAnchorSubmenu();\n\n let positionConfig: Partial<ComputePositionConfig> = {\n strategy: this.positioningStrategy,\n middleware: [],\n };\n\n if (!this.suppressAutomaticPlacement) {\n positionConfig.middleware.push(\n flip({ fallbackStrategy: 'initialPlacement' })\n );\n }\n\n positionConfig.placement = isSubmenu ? 'right-start' : this.placement;\n\n positionConfig.middleware = [\n ...positionConfig.middleware,\n inline(),\n shift(),\n ];\n\n if (this.offset) {\n positionConfig.middleware.push(offset(this.offset));\n }\n\n if (this.autoUpdateCleanup) {\n this.autoUpdateCleanup();\n this.autoUpdateCleanup = null;\n }\n\n this.autoUpdateCleanup = autoUpdate(\n this.anchorElement,\n this.dropdownRef,\n async () => {\n const computeResponse = await computePosition(\n this.anchorElement,\n this.dropdownRef,\n positionConfig\n );\n Object.assign(this.dropdownRef.style, {\n top: '0',\n left: '0',\n transform: `translate(${Math.round(computeResponse.x)}px,${Math.round(\n computeResponse.y\n )}px)`,\n });\n if (this.overwriteDropdownStyle) {\n const overwriteStyle = await this.overwriteDropdownStyle({\n dropdownRef: this.dropdownRef,\n triggerRef: this.triggerElement as HTMLElement,\n });\n\n Object.assign(this.dropdownRef.style, overwriteStyle);\n }\n },\n {\n ancestorResize: true,\n ancestorScroll: true,\n elementResize: true,\n }\n );\n }\n\n private focusDropdownItem(index: number) {\n requestAnimationFrame(() => {\n this.dropdownItems[index]?.shadowRoot.querySelector('button').focus();\n });\n }\n\n async componentDidLoad() {\n this.changedTrigger(this.trigger);\n }\n\n async componentDidRender() {\n await this.applyDropdownPosition();\n this.anchorElement = await (this.anchor\n ? this.resolveElement(this.anchor)\n : this.resolveElement(this.trigger));\n }\n\n private isTriggerElement(element: HTMLElement) {\n const trigger = !!element.hasAttribute('data-ix-dropdown-trigger');\n\n return trigger;\n }\n\n private onDropdownClick(event: PointerEvent) {\n if (dropdownController.pathIncludesTrigger(event.composedPath())) {\n event.preventDefault();\n\n if (this.isTriggerElement(event.target as HTMLElement)) {\n return;\n }\n }\n\n if (this.closeBehavior === 'inside' || this.closeBehavior === 'both') {\n dropdownController.dismissAll([this.getId()]);\n }\n\n dropdownController.dismissOthers(this.getId());\n }\n\n /**\n * Update position of dropdown\n */\n @Method()\n async updatePosition() {\n this.applyDropdownPosition();\n }\n\n render() {\n return (\n <Host\n data-ix-dropdown={this.localUId}\n ref={(ref) => (this.dropdownRef = ref)}\n class={{\n 'dropdown-menu': true,\n show: this.show,\n overflow: true,\n }}\n style={{\n margin: '0',\n minWidth: '0px',\n position: this.positioningStrategy,\n }}\n role=\"list\"\n onClick={(event: PointerEvent) => this.onDropdownClick(event)}\n >\n <div style={{ display: 'contents' }}>\n {this.header && <div class=\"dropdown-header\">{this.header}</div>}\n\n <slot></slot>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}