@sapudex/web-components 2.22.0 → 2.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/cypress/specs/CountrySelector.cy.tsx +158 -144
  2. package/cypress/specs/EventRibbon.cy.tsx +3 -1
  3. package/cypress/specs/SelectBox.cy.tsx +173 -206
  4. package/cypress/specs/Tag.cy.tsx +1 -1
  5. package/cypress/specs/TextField.cy.tsx +15 -0
  6. package/cypress/specs/Textarea.cy.tsx +15 -33
  7. package/dist/Checkbox.js +4 -0
  8. package/dist/Checkbox.js.map +1 -1
  9. package/dist/CountrySelector.d.ts +25 -142
  10. package/dist/CountrySelector.js +91 -268
  11. package/dist/CountrySelector.js.map +1 -1
  12. package/dist/FilterMenu.d.ts +14 -2
  13. package/dist/FilterMenu.js +11 -1
  14. package/dist/FilterMenu.js.map +1 -1
  15. package/dist/Footer.js +2 -2
  16. package/dist/Footer.js.map +1 -1
  17. package/dist/FooterTemplate.js +1 -1
  18. package/dist/FooterTemplate.js.map +1 -1
  19. package/dist/List.js +2 -3
  20. package/dist/List.js.map +1 -1
  21. package/dist/ListGroupHeaderBase.d.ts +1 -0
  22. package/dist/ListGroupHeaderBase.js +3 -0
  23. package/dist/ListGroupHeaderBase.js.map +1 -1
  24. package/dist/ListItemBase.d.ts +12 -0
  25. package/dist/ListItemBase.js +17 -2
  26. package/dist/ListItemBase.js.map +1 -1
  27. package/dist/MediaPlayer.js +4 -0
  28. package/dist/MediaPlayer.js.map +1 -1
  29. package/dist/MediaPlayerTemplate.js +4 -4
  30. package/dist/MediaPlayerTemplate.js.map +1 -1
  31. package/dist/SearchableListBase.d.ts +23 -16
  32. package/dist/SearchableListBase.js +48 -72
  33. package/dist/SearchableListBase.js.map +1 -1
  34. package/dist/SelectBase.d.ts +193 -0
  35. package/dist/SelectBase.js +428 -0
  36. package/dist/SelectBase.js.map +1 -0
  37. package/dist/SelectBox.d.ts +30 -152
  38. package/dist/SelectBox.js +139 -348
  39. package/dist/SelectBox.js.map +1 -1
  40. package/dist/TagGroup.d.ts +23 -5
  41. package/dist/TagGroup.js +37 -16
  42. package/dist/TagGroup.js.map +1 -1
  43. package/dist/TagTemplate.js +4 -2
  44. package/dist/TagTemplate.js.map +1 -1
  45. package/dist/TextArea.d.ts +1 -1
  46. package/dist/TextArea.js +5 -5
  47. package/dist/TextArea.js.map +1 -1
  48. package/dist/TextAreaTemplate.d.ts +2 -0
  49. package/dist/TextAreaTemplate.js +13 -0
  50. package/dist/TextAreaTemplate.js.map +1 -0
  51. package/dist/TextField.d.ts +29 -4
  52. package/dist/TextField.js +32 -16
  53. package/dist/TextField.js.map +1 -1
  54. package/dist/TextFieldTemplate.d.ts +2 -0
  55. package/dist/TextFieldTemplate.js +14 -0
  56. package/dist/TextFieldTemplate.js.map +1 -0
  57. package/dist/assets/{InputSuggestions-By00xQan.js → InputSuggestions-63QG0i9j.js} +1 -1
  58. package/dist/assets/{ListItemStandardExpandableTextTemplate-BGtoxRbA.js → ListItemStandardExpandableTextTemplate-B1CpqSCb.js} +1 -1
  59. package/dist/assets/{bundle.esm-9yDdQqR5.js → bundle.esm-lUYJDofa.js} +218 -217
  60. package/dist/assets/fi-BGPAljj_.js +1 -0
  61. package/dist/assets/gl-DqaooM6m.js +1 -0
  62. package/dist/assets/{video.es-DIP_dh4I.js → video.es-BDeHzm02.js} +32 -32
  63. package/dist/css/themes/Checkbox.css +1 -1
  64. package/dist/css/themes/CountrySelector.css +1 -1
  65. package/dist/css/themes/EventRibbon.css +1 -1
  66. package/dist/css/themes/Footer.css +1 -1
  67. package/dist/css/themes/ImageGridTickerItem.css +1 -1
  68. package/dist/css/themes/InputGroup.css +1 -1
  69. package/dist/css/themes/Link.css +1 -1
  70. package/dist/css/themes/ListItem.css +1 -1
  71. package/dist/css/themes/MastheadItem.css +1 -1
  72. package/dist/css/themes/MastheadMobileMenu.css +1 -1
  73. package/dist/css/themes/RadioButton.css +1 -1
  74. package/dist/css/themes/RatingIndicator.css +1 -1
  75. package/dist/css/themes/Search.css +1 -1
  76. package/dist/css/themes/SelectBase.css +1 -0
  77. package/dist/css/themes/SelectBox.css +1 -1
  78. package/dist/css/themes/Slider.css +1 -1
  79. package/dist/css/themes/StatusMessage.css +1 -1
  80. package/dist/css/themes/TagGroup.css +1 -1
  81. package/dist/css/themes/TextField.css +1 -1
  82. package/dist/custom-elements-internal.json +1088 -1284
  83. package/dist/custom-elements.json +284 -934
  84. package/dist/generated/templates/CountrySelectorTemplate.lit.js +3 -3
  85. package/dist/generated/templates/CountrySelectorTemplate.lit.js.map +1 -1
  86. package/dist/generated/templates/ListItemTemplate.lit.js +1 -1
  87. package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
  88. package/dist/generated/templates/SelectBoxTemplate.lit.js +10 -9
  89. package/dist/generated/templates/SelectBoxTemplate.lit.js.map +1 -1
  90. package/dist/generated/themes/Checkbox.css.d.ts +1 -1
  91. package/dist/generated/themes/Checkbox.css.js +1 -1
  92. package/dist/generated/themes/Checkbox.css.js.map +1 -1
  93. package/dist/generated/themes/CountrySelector.css.d.ts +1 -1
  94. package/dist/generated/themes/CountrySelector.css.js +1 -1
  95. package/dist/generated/themes/CountrySelector.css.js.map +1 -1
  96. package/dist/generated/themes/EventRibbon.css.d.ts +1 -1
  97. package/dist/generated/themes/EventRibbon.css.js +1 -1
  98. package/dist/generated/themes/EventRibbon.css.js.map +1 -1
  99. package/dist/generated/themes/Footer.css.d.ts +1 -1
  100. package/dist/generated/themes/Footer.css.js +1 -1
  101. package/dist/generated/themes/Footer.css.js.map +1 -1
  102. package/dist/generated/themes/ImageGridTickerItem.css.d.ts +1 -1
  103. package/dist/generated/themes/ImageGridTickerItem.css.js +1 -1
  104. package/dist/generated/themes/ImageGridTickerItem.css.js.map +1 -1
  105. package/dist/generated/themes/InputGroup.css.d.ts +1 -1
  106. package/dist/generated/themes/InputGroup.css.js +1 -1
  107. package/dist/generated/themes/InputGroup.css.js.map +1 -1
  108. package/dist/generated/themes/Link.css.d.ts +1 -1
  109. package/dist/generated/themes/Link.css.js +1 -1
  110. package/dist/generated/themes/Link.css.js.map +1 -1
  111. package/dist/generated/themes/ListItem.css.d.ts +1 -1
  112. package/dist/generated/themes/ListItem.css.js +1 -1
  113. package/dist/generated/themes/ListItem.css.js.map +1 -1
  114. package/dist/generated/themes/MastheadItem.css.d.ts +1 -1
  115. package/dist/generated/themes/MastheadItem.css.js +1 -1
  116. package/dist/generated/themes/MastheadItem.css.js.map +1 -1
  117. package/dist/generated/themes/MastheadMobileMenu.css.d.ts +1 -1
  118. package/dist/generated/themes/MastheadMobileMenu.css.js +1 -1
  119. package/dist/generated/themes/MastheadMobileMenu.css.js.map +1 -1
  120. package/dist/generated/themes/RadioButton.css.d.ts +1 -1
  121. package/dist/generated/themes/RadioButton.css.js +1 -1
  122. package/dist/generated/themes/RadioButton.css.js.map +1 -1
  123. package/dist/generated/themes/RatingIndicator.css.d.ts +1 -1
  124. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  125. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  126. package/dist/generated/themes/Search.css.d.ts +1 -1
  127. package/dist/generated/themes/Search.css.js +1 -1
  128. package/dist/generated/themes/Search.css.js.map +1 -1
  129. package/dist/generated/themes/SelectBase.css.d.ts +2 -0
  130. package/dist/generated/themes/SelectBase.css.js +8 -0
  131. package/dist/generated/themes/SelectBase.css.js.map +1 -0
  132. package/dist/generated/themes/SelectBox.css.d.ts +1 -1
  133. package/dist/generated/themes/SelectBox.css.js +1 -1
  134. package/dist/generated/themes/SelectBox.css.js.map +1 -1
  135. package/dist/generated/themes/Slider.css.d.ts +1 -1
  136. package/dist/generated/themes/Slider.css.js +1 -1
  137. package/dist/generated/themes/Slider.css.js.map +1 -1
  138. package/dist/generated/themes/StatusMessage.css.d.ts +1 -1
  139. package/dist/generated/themes/StatusMessage.css.js +1 -1
  140. package/dist/generated/themes/StatusMessage.css.js.map +1 -1
  141. package/dist/generated/themes/TagGroup.css.d.ts +1 -1
  142. package/dist/generated/themes/TagGroup.css.js +1 -1
  143. package/dist/generated/themes/TagGroup.css.js.map +1 -1
  144. package/dist/generated/themes/TextField.css.d.ts +1 -1
  145. package/dist/generated/themes/TextField.css.js +1 -1
  146. package/dist/generated/themes/TextField.css.js.map +1 -1
  147. package/dist/types/common.d.ts +1 -1
  148. package/dist/types/common.js +1 -1
  149. package/dist/types/common.js.map +1 -1
  150. package/dist/vscode.html-custom-data.json +23 -234
  151. package/dist/web-types.json +256 -811
  152. package/package.json +2 -2
  153. package/src/Checkbox.ts +4 -0
  154. package/src/CountrySelector.hbs +6 -61
  155. package/src/CountrySelector.ts +93 -375
  156. package/src/FilterMenu.ts +13 -3
  157. package/src/Footer.ts +2 -2
  158. package/src/FooterTemplate.tsx +5 -4
  159. package/src/List.ts +2 -3
  160. package/src/ListGroupHeaderBase.ts +4 -0
  161. package/src/ListItem.hbs +0 -1
  162. package/src/ListItemBase.ts +17 -3
  163. package/src/MediaPlayer.ts +4 -0
  164. package/src/MediaPlayerTemplate.tsx +0 -1
  165. package/src/SearchableListBase.ts +68 -83
  166. package/src/SelectBase.ts +580 -0
  167. package/src/SelectBox.hbs +118 -107
  168. package/src/SelectBox.ts +155 -445
  169. package/src/TagGroup.ts +53 -19
  170. package/src/TagTemplate.tsx +4 -2
  171. package/src/TextArea.ts +5 -5
  172. package/src/TextAreaTemplate.tsx +67 -0
  173. package/src/TextField.ts +57 -24
  174. package/src/TextFieldTemplate.tsx +90 -0
  175. package/src/generated/templates/CountrySelectorTemplate.lit.ts +2 -2
  176. package/src/generated/templates/ListItemTemplate.lit.ts +1 -1
  177. package/src/generated/templates/SelectBoxTemplate.lit.ts +10 -9
  178. package/src/generated/themes/Checkbox.css.ts +1 -1
  179. package/src/generated/themes/CountrySelector.css.ts +1 -1
  180. package/src/generated/themes/EventRibbon.css.ts +1 -1
  181. package/src/generated/themes/Footer.css.ts +1 -1
  182. package/src/generated/themes/ImageGridTickerItem.css.ts +1 -1
  183. package/src/generated/themes/InputGroup.css.ts +1 -1
  184. package/src/generated/themes/Link.css.ts +1 -1
  185. package/src/generated/themes/ListItem.css.ts +1 -1
  186. package/src/generated/themes/MastheadItem.css.ts +1 -1
  187. package/src/generated/themes/MastheadMobileMenu.css.ts +1 -1
  188. package/src/generated/themes/RadioButton.css.ts +1 -1
  189. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  190. package/src/generated/themes/Search.css.ts +1 -1
  191. package/src/generated/themes/SelectBase.css.ts +9 -0
  192. package/src/generated/themes/SelectBox.css.ts +1 -1
  193. package/src/generated/themes/Slider.css.ts +1 -1
  194. package/src/generated/themes/StatusMessage.css.ts +1 -1
  195. package/src/generated/themes/TagGroup.css.ts +1 -1
  196. package/src/generated/themes/TextField.css.ts +1 -1
  197. package/src/themes/Checkbox.css +21 -15
  198. package/src/themes/CountrySelector.css +42 -115
  199. package/src/themes/EventRibbon.css +21 -13
  200. package/src/themes/Footer.css +3 -2
  201. package/src/themes/ImageGridTickerItem.css +1 -1
  202. package/src/themes/InputGroup.css +11 -6
  203. package/src/themes/Link.css +2 -0
  204. package/src/themes/ListItem.css +6 -0
  205. package/src/themes/MastheadItem.css +0 -2
  206. package/src/themes/MastheadMobileMenu.css +2 -0
  207. package/src/themes/RadioButton.css +29 -6
  208. package/src/themes/Search.css +0 -1
  209. package/src/themes/SelectBase.css +239 -0
  210. package/src/themes/SelectBox.css +13 -195
  211. package/src/themes/StatusMessage.css +1 -2
  212. package/src/themes/TagGroup.css +0 -1
  213. package/src/themes/TextField.css +7 -7
  214. package/src/types/common.ts +1 -1
  215. package/dist/assets/fi-hYXoEotT.js +0 -1
  216. package/dist/assets/gl-eZFVp-ap.js +0 -1
  217. package/dist/generated/templates/TextAreaTemplate.lit.d.ts +0 -3
  218. package/dist/generated/templates/TextAreaTemplate.lit.js +0 -13
  219. package/dist/generated/templates/TextAreaTemplate.lit.js.map +0 -1
  220. package/dist/generated/templates/TextFieldTemplate.lit.d.ts +0 -3
  221. package/dist/generated/templates/TextFieldTemplate.lit.js +0 -14
  222. package/dist/generated/templates/TextFieldTemplate.lit.js.map +0 -1
  223. package/src/TextArea.hbs +0 -54
  224. package/src/TextField.hbs +0 -78
  225. package/src/generated/templates/TextAreaTemplate.lit.ts +0 -17
  226. package/src/generated/templates/TextFieldTemplate.lit.ts +0 -18
package/src/SelectBox.ts CHANGED
@@ -1,18 +1,21 @@
1
1
  import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
2
2
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
3
- import property from "@ui5/webcomponents-base/dist/decorators/property.js";
4
3
  import event from "@ui5/webcomponents-base/dist/decorators/event-strict.js";
5
- import executeTemplate from "@ui5/webcomponents-base/dist/renderer/executeTemplate.js";
4
+ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
6
5
  import {
7
- isEnter, isSpace, isDelete, isTabPrevious, isTabNext, isLeft, isRight, isDown, isUp, isEscape, isBackSpace, isShift,
6
+ isEnter, isSpace, isDelete, isTabPrevious, isTabNext, isLeft, isRight, isDown, isUp, isBackSpace, isShift,
8
7
  } from "@ui5/webcomponents-base/dist/Keys.js";
8
+ import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
9
+ import type { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
9
10
  import type UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
10
- import Tokenizer from "@ui5/webcomponents/dist/Tokenizer.js";
11
+ import type { UDExItemFromList } from "./SearchableListBase.js";
12
+ import { UDExPopoverPart } from "./types/SearchableListBase.js";
13
+ import { Placement } from "./types/Dropdown.js";
14
+ import "@ui5/webcomponents-icons/dist/navigation-down-arrow.js";
15
+ import "@ui5/webcomponents-icons/dist/decline.js";
11
16
  import Icon from "@ui5/webcomponents/dist/Icon.js";
17
+ import Tokenizer from "@ui5/webcomponents/dist/Tokenizer.js";
12
18
  import Token from "@ui5/webcomponents/dist/Token.js";
13
- import type { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
14
- import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
15
- import { getAllAccessibleNameRefTexts } from "@ui5/webcomponents-base/dist/util/AccessibilityTextsHelper.js";
16
19
  import Popover from "@ui5/webcomponents/dist/Popover.js";
17
20
  import UDExList from "./List.js";
18
21
  import UDExListItem from "./ListItem.js";
@@ -20,30 +23,20 @@ import UDExListGroupHeader from "./ListGroupHeader.js";
20
23
  import UDExListSelectAll from "./ListSelectAll.js";
21
24
  import UDExSelectBoxItem from "./SelectBoxItem.js";
22
25
  import UDExSelectBoxGroupHeader from "./SelectBoxGroupHeader.js";
23
- import type { UDExItemFromList, UDExSearchableListBaseEvents } from "./SearchableListBase.js";
24
- import UDExSearchableListBase from "./SearchableListBase.js";
25
- import type { UDExSearchKeydownEventDetail } from "./Search.js";
26
- import UDExSearch from "./Search.js";
27
26
  import UDExTag from "./Tag.js";
28
- import UDExButton from "./Button.js";
29
- import UDExValueState from "./types/common.js";
30
27
  import UDExStatusMessage from "./StatusMessage.js";
31
- import UDExControlButton from "./ControlButton.js";
32
28
  import UDExBusyIndicator from "./BusyIndicator.js";
33
- import { Placement } from "./types/Dropdown.js";
34
- import { UDExPopoverPart } from "./types/SearchableListBase.js";
35
29
  import UDExTagGroup from "./TagGroup.js";
36
- import "@ui5/webcomponents-icons/dist/decline.js";
37
- import "@ui5/webcomponents-icons/dist/navigation-down-arrow.js";
38
- import { SELECT_OPTIONS } from "./generated/i18n/i18n-defaults.js";
30
+ import UDExSelectBase from "./SelectBase.js";
39
31
  import SelectBoxTemplate from "./generated/templates/SelectBoxTemplate.lit.js";
40
- import SearchableListBaseTemplate from "./generated/templates/SearchableListBaseTemplate.lit.js";
32
+ import getEffectiveScrollbarStyle from "./utils/getEffectiveScrollbarStyle.js";
33
+ import type { UDExSelectBaseEvents } from "./SelectBase.js";
41
34
 
42
35
  // Styles
43
- import SelectBoxCss from "./generated/themes/SelectBox.css.js";
44
36
  import TextFieldCss from "./generated/themes/TextField.css.js";
45
37
  import SearchableListCss from "./generated/themes/SearchableList.css.js";
46
- import getEffectiveScrollbarStyle from "./utils/getEffectiveScrollbarStyle.js";
38
+ import SelectBoxCss from "./generated/themes/SelectBox.css.js";
39
+ import SelectBaseCss from "./generated/themes/SelectBase.css.js";
47
40
 
48
41
  export type SelectBoxAccessibilityAttributes = {
49
42
  controls?: string,
@@ -77,7 +70,13 @@ type UDExSelectBoxRemoveEventDetail = {
77
70
  @customElement({
78
71
  tag: "udex-select-box",
79
72
  renderer: litRender,
80
- styles: [TextFieldCss, SelectBoxCss, SearchableListCss, getEffectiveScrollbarStyle()],
73
+ styles: [
74
+ TextFieldCss,
75
+ SelectBoxCss,
76
+ SelectBaseCss,
77
+ SearchableListCss,
78
+ getEffectiveScrollbarStyle(),
79
+ ],
81
80
  template: SelectBoxTemplate,
82
81
  dependencies: [
83
82
  UDExSelectBoxGroupHeader,
@@ -85,23 +84,20 @@ type UDExSelectBoxRemoveEventDetail = {
85
84
  UDExListSelectAll,
86
85
  UDExSelectBoxItem,
87
86
  UDExStatusMessage,
88
- UDExControlButton,
89
- UDExTagGroup,
90
87
  UDExBusyIndicator,
88
+ UDExTagGroup,
91
89
  UDExListItem,
92
90
  UDExList,
93
- UDExSearch,
94
- UDExButton,
95
91
  UDExTag,
96
92
  Tokenizer,
93
+ Popover,
97
94
  Token,
98
95
  Icon,
99
- Popover,
100
96
  ],
101
97
  })
102
98
 
103
99
  /**
104
- * Fired event when the user clicks on the reset button in the search.
100
+ * Fired event when the user remove tag.
105
101
  *
106
102
  * @public
107
103
  * @param {UDExItemFromList} item The removed item
@@ -115,19 +111,12 @@ type UDExSelectBoxRemoveEventDetail = {
115
111
  */
116
112
  @event("show-more", { bubbles: true })
117
113
 
118
- /**
119
- * Fired before the dropdown pane is opened.
120
- *
121
- * @public
122
- */
123
- @event("before-open", { bubbles: true })
124
-
125
- class UDExSelectBox extends UDExSearchableListBase {
114
+ class UDExSelectBox extends UDExSelectBase {
126
115
  eventDetails!: {
127
116
  "remove": UDExSelectBoxRemoveEventDetail,
128
117
  "show-more": void,
129
- "before-open": void,
130
- } & UDExSearchableListBaseEvents;
118
+ } & UDExSelectBaseEvents;
119
+
131
120
  /**
132
121
  * Determines if there is no enough space, the component can be placed
133
122
  * over the target.
@@ -138,86 +127,6 @@ class UDExSelectBox extends UDExSearchableListBase {
138
127
  @property({ type: Boolean })
139
128
  disableTargetOverlap?: boolean;
140
129
 
141
- /**
142
- * Defines whether the component is required.
143
- *
144
- * @default false
145
- * @public
146
- */
147
- @property({ type: Boolean })
148
- required!: boolean;
149
-
150
- /**
151
- * Defines whether the component is in disabled state.
152
- *
153
- * @default false
154
- * @public
155
- */
156
- @property({ type: Boolean })
157
- disabled!: boolean;
158
-
159
- /**
160
- * Defines label text for field container.
161
- *
162
- * @default ""
163
- * @public
164
- */
165
- @property({ type: String })
166
- label!: string;
167
-
168
- /**
169
- * Defines the accessible ARIA name of the component.
170
- *
171
- * @default undefined
172
- * @public
173
- */
174
- @property()
175
- accessibleName?: string;
176
-
177
- /**
178
- * Receives id (or many ids) of the elements that label the component.
179
- * @default undefined
180
- * @public
181
- */
182
- @property()
183
- accessibleNameRef?: string;
184
-
185
- /**
186
- * Defines whether the component is read-only.
187
- *
188
- * @default false
189
- * @public
190
- */
191
- @property({ type: Boolean })
192
- readonly!: boolean;
193
-
194
- /**
195
- * Defines whether the component is display-only.
196
- *
197
- * @default false
198
- * @public
199
- */
200
- @property({ type: Boolean })
201
- displayonly!: boolean;
202
-
203
- /**
204
- * Defines the value state of the trigger container.
205
- *
206
- * @default "Standard"
207
- * @public
208
- */
209
- @property()
210
- valueState: `${UDExValueState}` = UDExValueState.Standard;
211
-
212
- /**
213
- * Defines supporting text under the trigger container.
214
- *
215
- * @default undefined
216
- * @public
217
- */
218
- @property({ type: String })
219
- supportingText?: string;
220
-
221
130
  /**
222
131
  * Determines on which side of the component the Tooltip is displayed.
223
132
  *
@@ -227,26 +136,6 @@ class UDExSelectBox extends UDExSearchableListBase {
227
136
  @property()
228
137
  tooltipPlacement: `${Placement}` = Placement.Bottom;
229
138
 
230
- /**
231
- * @private
232
- */
233
- @property({ type: String, noAttribute: true })
234
- _direction?: string;
235
-
236
- /**
237
- * @default false
238
- * @private
239
- */
240
- @property({ type: Boolean })
241
- _focused!: boolean;
242
-
243
- /**
244
- * @default false
245
- * @private
246
- */
247
- @property({ type: Boolean })
248
- _open: boolean = false;
249
-
250
139
  /**
251
140
  * @default false
252
141
  * @private
@@ -254,78 +143,35 @@ class UDExSelectBox extends UDExSearchableListBase {
254
143
  @property({ type: Boolean })
255
144
  _showTagsDropdownContent!: boolean;
256
145
 
257
- _trigger!: HTMLElement;
258
- _triggerWrapper!: HTMLElement;
259
- _popover!: Popover;
260
- _tokenizer!: Tokenizer;
261
- _search!: UDExSearch;
262
- _singleSelectedOption!: string;
263
146
  _truncatableTag!: UDExTag;
264
- _tags!: Array<UDExTag>;
265
147
  _inactiveTabIndex: number = -1;
266
- _activeTabIndex: number = 0;
267
- _openedByTrigger: boolean = true;
268
- _shouldScrollToEnd: boolean = false;
269
- _handleResizeBound: ResizeObserverCallback;
148
+ _handleResizeTokenizerBound: ResizeObserverCallback;
270
149
 
271
150
  constructor() {
272
151
  super();
273
- this._shouldFilterItems = false;
274
- this._handleResizeBound = this._handleResize.bind(this);
275
- this._filteredItems = [];
152
+ this._handleResizeTokenizerBound = this.handleResizeTokenizer.bind(this);
276
153
  }
277
154
 
278
155
  onEnterDOM() {
279
- ResizeHandler.register(this, this._handleResizeBound);
156
+ super.onEnterDOM();
157
+ ResizeHandler.register(this, this._handleResizeTokenizerBound);
280
158
  }
281
159
 
282
160
  onExitDOM() {
283
- ResizeHandler.deregister(this, this._handleResizeBound);
161
+ super.onExitDOM();
162
+ ResizeHandler.deregister(this, this._handleResizeTokenizerBound);
284
163
  }
285
164
 
286
165
  onAfterRendering() {
287
- this._tokenizer = this.getTagGroup()?._tokenizer;
288
- this._popover = this.getPopover();
289
- this._search = this.getSearch();
290
- this._trigger = this.getTrigger();
291
- this._triggerWrapper = this.getTriggerWrapper();
292
- this._tags = this.getTags();
293
- this.handleDirection();
294
- if (this._tokenizer?.tokens.length > 0) {
295
- if (!this.displayonly) {
296
- this._tokenizer.moreLink?.setAttribute("tabindex", "-1");
297
- }
298
- if (this._shouldScrollToEnd) {
299
- this._tokenizer.scrollToEnd();
300
- }
301
- this.resetTagsTabIndexes();
302
- }
303
- this.handleOutsideClick();
304
- }
305
-
306
- onBeforeRendering() {
307
- super.onBeforeRendering();
308
-
309
- if (this.modeSingleSelect && this.hasSelectedItems) {
310
- this.handleSingleSelectMode();
166
+ super.onAfterRendering();
167
+ this.handleSelectBoxOutsideClick();
168
+ if (this.tagGroup) {
169
+ this.configureTokenizer();
311
170
  }
312
171
  }
313
172
 
314
- _handleResize() {
315
- this._popover.style.setProperty("--udex-dropdown-pane-width", `${this._triggerWrapper.offsetWidth}px`);
316
- }
317
-
318
- handleItemPress(e:CustomEvent) {
319
- this.onItemPress(e);
320
-
321
- if (this.modeSingleSelect) {
322
- this.handleSingleSelectMode();
323
- this.closeDropdown();
324
- }
325
- }
326
-
327
- handleSingleSelectMode() {
328
- this._singleSelectedOption = this.selectedItems[0]?.label;
173
+ handleResizeTokenizer() {
174
+ this.resizeTokenizer();
329
175
  }
330
176
 
331
177
  handleSelectAll(e:CustomEvent) {
@@ -333,33 +179,46 @@ class UDExSelectBox extends UDExSearchableListBase {
333
179
  }
334
180
 
335
181
  handleHeaderPress(e:CustomEvent) {
182
+ this._search.focus();
336
183
  this.onHeaderPress(e);
337
184
  }
338
185
 
339
- handleValueSearch(e:CustomEvent) {
340
- this.onSearch(e);
186
+ handleItemPress(e:CustomEvent) {
187
+ this.handleItemSelection(e);
341
188
  }
342
189
 
343
- handleSubmitSearch() {
344
- this.closeDropdown();
345
- this.onSubmitSearch();
190
+ handlerShowMoreItems(e: CustomEvent) {
191
+ if (!this.displayonly) {
192
+ this.showMoreItems(e);
193
+ this.handleUnselectTruncatableTag();
194
+ this.openDropdown();
195
+ }
196
+ this.fireDecoratorEvent("show-more");
346
197
  }
347
198
 
348
- handleResetSearch() {
349
- this.onResetSearch();
350
- }
199
+ handleInputFocusIn() {
200
+ this.inputFocusIn();
351
201
 
352
- handleFocusIn() {
353
- if (this.isDisabled) {
354
- return;
355
- }
356
- this._focused = true;
357
- if (this._tokenizer) {
358
- this._tokenizer.expanded = false;
202
+ if (this.tokenizer) {
203
+ this.tokenizer.expanded = true;
204
+ this._requestRender = true;
359
205
  }
360
206
  }
361
207
 
362
- handleFocusOut() {
208
+ handleInputFocusOut(e: FocusEvent) {
209
+ const relatedTarget = e.relatedTarget as HTMLElement;
210
+ const isInsideComponent = relatedTarget?.closest(`.${this._rootClass}`);
211
+ const hasTags = this.tokenizer?.tokens.length > 0;
212
+
213
+ if (!isInsideComponent) {
214
+ this.closeDropdown();
215
+ this.resetSearchState();
216
+
217
+ if (hasTags) {
218
+ this.collapseTokenizer();
219
+ }
220
+ }
221
+
363
222
  this._focused = false;
364
223
  }
365
224
 
@@ -368,35 +227,26 @@ class UDExSelectBox extends UDExSearchableListBase {
368
227
  this._managePopupListeners(UDExPopoverPart.Header, "addEventListener");
369
228
  }
370
229
 
371
- if (this.height) {
372
- this._setContentHeight();
373
- }
374
-
375
- this.fireDecoratorEvent("before-open");
230
+ this.dropdownBeforeOpen();
376
231
  }
377
232
 
378
- handleDropdownAfterClose() {
233
+ handleDropdownClose() {
379
234
  if (this.preventPageScroll) {
380
235
  this._managePopupListeners(UDExPopoverPart.Header, "removeEventListener");
381
236
  }
382
237
 
383
- if (this._tokenizer?._tokensCount > 0) {
384
- this._tokenizer.expanded = false;
238
+ if (this.modeMultiSelect) {
239
+ this.handleUnselectTruncatableTag();
385
240
  }
386
- this.handleUnselectTruncatableTag();
387
- this._open = false;
388
- }
389
241
 
390
- showMoreItems() {
391
- this._shouldScrollToEnd = true;
392
- this._showTagsDropdownContent = false;
393
- this.openDropdown();
394
- this.handleUnselectTruncatableTag();
242
+ this._open = false;
243
+ this.fireEventDropdownClose();
395
244
  }
396
245
 
397
246
  handleRemoveTag(e: CustomEvent | null, tag?: UI5Element) {
398
247
  tag = tag ?? (e?.detail.tag as UI5Element);
399
248
  const tagId: string = tag.getAttribute("data-id")!;
249
+ this.tokenizer.deleteToken(tag as Token, true);
400
250
  this.handleDropdownItemPress(tagId);
401
251
  this.fireDecoratorEventRemove(tagId);
402
252
  }
@@ -416,16 +266,7 @@ class UDExSelectBox extends UDExSearchableListBase {
416
266
  handleUnselectTruncatableTag() {
417
267
  if (this._truncatableTag?.selected) {
418
268
  this._truncatableTag.selected = false;
419
- }
420
- }
421
-
422
- handleKeyDownTrigger(e: KeyboardEvent) {
423
- if (!this.isDisabled && (isSpace(e) || isEnter(e))) {
424
- e.preventDefault();
425
- e.stopPropagation();
426
269
  this._showTagsDropdownContent = false;
427
- this._openedByTrigger = true;
428
- this.openDropdown();
429
270
  }
430
271
  }
431
272
 
@@ -434,18 +275,17 @@ class UDExSelectBox extends UDExSearchableListBase {
434
275
  const originalEvent: KeyboardEvent = e.detail.originalEvent;
435
276
  const tag = originalEvent.target as UDExTag;
436
277
  const token = originalEvent.target as Token;
437
- this.getTagContent(this._tags[0]).tabIndex = this._inactiveTabIndex;
438
- const tagsCount = this._tokenizer._tokensCount;
439
- this._tokenizer.expanded = (isLeft(originalEvent) || isRight(originalEvent) || isBackSpace(originalEvent) || isDelete(originalEvent)) && tagsCount > 0;
278
+ this.tokenizer.expanded = (isLeft(originalEvent) || isRight(originalEvent) || isBackSpace(originalEvent) || isDelete(originalEvent)) && this.tokenizer.tokens.length > 0;
279
+
440
280
  if (isTabNext(originalEvent)) {
441
- this._trigger.focus();
281
+ originalEvent.preventDefault();
282
+ this._search.focus();
442
283
  return;
443
284
  }
444
285
 
445
286
  if ((isDown(originalEvent) || isUp(originalEvent))) {
446
- this._tokenizer._preventCollapse = true;
447
- this._openedByTrigger = false;
448
- this.showMoreItems();
287
+ this._search.focus();
288
+ this.openDropdown();
449
289
  }
450
290
 
451
291
  if (isSpace(originalEvent) || isShift(originalEvent) || isEnter(originalEvent)) {
@@ -455,9 +295,9 @@ class UDExSelectBox extends UDExSearchableListBase {
455
295
  }
456
296
 
457
297
  if (isLeft(originalEvent) || isRight(originalEvent)) {
458
- const nextTokenIndex = this._tokenizer._calcNextTokenIndex(token, this._tokenizer.tokens, isRight(originalEvent));
459
- this.focusTag(nextTokenIndex);
460
- this.scrollToTag(nextTokenIndex);
298
+ const nextTokenIndex = this.tokenizer._calcNextTokenIndex(token, this.tokenizer.tokens, isRight(originalEvent));
299
+ this.focusTagByIndex(nextTokenIndex);
300
+ this.tokenizer._scrollToToken(this.tokenizer.tokens[nextTokenIndex]);
461
301
  return;
462
302
  }
463
303
 
@@ -469,70 +309,73 @@ class UDExSelectBox extends UDExSearchableListBase {
469
309
 
470
310
  if (isDelete(originalEvent) || isBackSpace(originalEvent)) {
471
311
  this.handleRemoveTag(null, tag);
472
- if (this._tokenizer.tokens.length === 1) {
473
- this._trigger.focus();
312
+ if (this.tokenizer.tokens.length === 1) {
313
+ this._search.focus();
474
314
  } else {
475
- this._tokenizer.deleteToken(token);
315
+ this.tokenizer.deleteToken(token, true);
476
316
  }
477
317
  }
478
318
  }
479
319
 
480
- handleKeyDownDropdown(e: KeyboardEvent) {
481
- if (this.tabNavigationEnabled) {
320
+ handleKeyDownSearch(e: KeyboardEvent) {
321
+ const tokenizer = this.tokenizer;
322
+ const hasTags = tokenizer?.tokens.length > 0;
323
+ const lastTagIndex = tokenizer?.tokens.length - 1;
324
+
325
+ if (isTabPrevious(e)) {
326
+ this.resetTagsTabIndexes();
482
327
  return;
483
328
  }
484
329
 
485
- const isTabPrevPress = isTabPrevious(e) && !this._search;
486
- const isTabNextPress = isTabNext(e);
487
- const isEscapePress = isEscape(e);
488
- const isSearchResetTrigger = e.target === this._search;
489
- if ((isTabNextPress && (!isSearchResetTrigger || this.isListEmpty)) || isTabPrevPress || isEscapePress) {
490
- this.closeDropdown(e);
330
+ if (isLeft(e) && hasTags) {
331
+ e.preventDefault();
332
+ this.focusTagByIndex(lastTagIndex);
333
+ return;
491
334
  }
492
- }
493
-
494
- handleKeyDownSearch(keyEvent: CustomEvent<UDExSearchKeydownEventDetail>) {
495
- const { detail: { e } } = keyEvent;
496
335
 
497
- if (isTabPrevious(e) || isEscape(e)) {
498
- this.closeDropdown(e);
336
+ if (isBackSpace(e) && this._inputValue === "" && hasTags) {
337
+ this.focusTagByIndex(lastTagIndex);
338
+ return;
499
339
  }
340
+
341
+ this.onKeyDownSearch(e);
500
342
  }
501
343
 
502
- handleOutsideClick(): void {
503
- document.addEventListener("click", (e: MouseEvent) => {
504
- if (this._tokenizer?.tokens.length > 0 && e.target !== this) {
505
- this._tokenizer.expanded = false;
344
+ handleSelectBoxOutsideClick() {
345
+ document.addEventListener("click", (e: Event) => {
346
+ if (e.target !== this) {
347
+ this._open = this._popover.open;
348
+ if (this.tokenizer?.tokens.length > 0) {
349
+ this.collapseTokenizer();
350
+ }
506
351
  }
507
- this._open = this._popover.open;
508
352
  });
509
353
  }
510
354
 
511
- openDropdown() {
512
- this._popover.opener = this._trigger;
513
- this._popover.open = true;
514
- this._open = true;
515
- if (this.showMultiSelectedOptions) {
516
- this._tokenizer.expanded = true;
355
+ focusTagByIndex(index: number) {
356
+ const token = this.tokenizer.tokens[index];
357
+ if (token) {
358
+ token.focus();
359
+ token.forcedTabIndex = "0";
517
360
  }
518
361
  }
519
362
 
520
- closeDropdown(e?: KeyboardEvent) {
521
- if (this._popover.open) {
522
- if (this._tokenizer) {
523
- this._tokenizer._preventCollapse = false;
524
- this._tokenizer.expanded = false;
525
- }
363
+ fireDecoratorEventRemove(id: string) {
364
+ this.fireDecoratorEvent("remove", {
365
+ item: this.getItemFromList(id),
366
+ });
367
+ }
526
368
 
527
- if (e && (isEscape(e) || isTabPrevious(e))) {
528
- e.preventDefault();
529
- if (this._openedByTrigger) {
530
- this._trigger.focus();
531
- }
532
- }
533
- this._open = false;
534
- this._popover.open = false;
535
- }
369
+ collapseTokenizer() {
370
+ this.tokenizer.expanded = false;
371
+ this._selectedOption = "";
372
+ }
373
+
374
+ showMoreItems(e: CustomEvent) {
375
+ e.preventDefault();
376
+ this._focused = true;
377
+ this._search.focus();
378
+ this._showTagsDropdownContent = false;
536
379
  }
537
380
 
538
381
  toggleTruncatedPopover(tag: UDExTag) {
@@ -549,86 +392,20 @@ class UDExSelectBox extends UDExSearchableListBase {
549
392
  }
550
393
  }
551
394
 
552
- scrollToTag(index: number) {
553
- this._tokenizer._scrollToToken(this._tokenizer.tokens[index]);
554
- }
555
-
556
- focusTag(index: number) {
557
- this._tokenizer.tokens[index].focus();
558
- this._tokenizer.tokens[index].forcedTabIndex = "0";
395
+ configureTokenizer() {
396
+ this.tagGroup._scrollToEnd = true;
397
+ this.resetTagsTabIndexes();
559
398
  }
560
399
 
561
- fireDecoratorEventRemove(id: string) {
562
- this.fireDecoratorEvent("remove", {
563
- item: this.getItemFromList(id),
400
+ resetTagsTabIndexes() {
401
+ this.tags.forEach(tag => {
402
+ this.getTagContent(tag).tabIndex = this._inactiveTabIndex;
564
403
  });
565
404
  }
566
405
 
567
- handleOpenMultiSelect() {
568
- if (this._popover.open) {
569
- this.closeDropdown();
570
- } else {
571
- this._showTagsDropdownContent = false;
572
- this.openDropdown();
573
- }
574
- }
575
-
576
- handleOpenSingleSelect() {
577
- if (this._popover.open) {
578
- this.closeDropdown();
579
- } else {
580
- this.openDropdown();
581
- }
582
- }
583
-
584
- getHandleMultiSelectOpen() {
585
- return !this.isDisabled && this.modeMultiSelect ? this.handleOpenMultiSelect() : undefined;
586
- }
587
-
588
- getHandleSingleSelectOpen() {
589
- return !this.isDisabled && this.modeSingleSelect ? this.handleOpenSingleSelect() : undefined;
590
- }
591
-
592
- getHandlerShowMoreItems(e: CustomEvent) {
593
- if (!this.displayonly) {
594
- e.preventDefault();
595
- this.showMoreItems();
596
- }
597
- this.fireDecoratorEvent("show-more");
598
- }
599
-
600
- getTrigger(): HTMLElement {
601
- return this.shadowRoot!.querySelector(".udex-text-field__input")!;
602
- }
603
-
604
- getTriggerWrapper(): HTMLElement {
605
- return this.shadowRoot!.querySelector(".udex-text-field__wrap")!;
606
- }
607
-
608
- getTagGroup(): UDExTagGroup {
609
- return this.shadowRoot!.querySelector<UDExTagGroup>("[udex-tag-group]")!;
610
- }
611
-
612
- getTags(): Array<UDExTag> {
613
- if (this.getTagGroup()) {
614
- return Array.from(this.getTagGroup().shadowRoot!.querySelectorAll<UDExTag>("[udex-tag]"));
615
- }
616
- return [];
617
- }
618
-
619
- getTagContent(tag: UDExTag): HTMLElement {
620
- return tag.shadowRoot!.querySelector(".udex-tag")!;
621
- }
622
-
623
- handleDirection() {
624
- const directionStyles: string = window
625
- .getComputedStyle(this)
626
- .getPropertyValue("direction");
627
-
628
- if (!directionStyles) {
629
- this._direction = "ltr";
630
- } else {
631
- this._direction = directionStyles;
406
+ resizeTokenizer() {
407
+ if (this.tokenizer) {
408
+ this.tokenizer._handleResize();
632
409
  }
633
410
  }
634
411
 
@@ -636,8 +413,8 @@ class UDExSelectBox extends UDExSearchableListBase {
636
413
  return isSpace(e) || isEnter(e);
637
414
  }
638
415
 
639
- resetTagsTabIndexes() {
640
- this._tags.forEach((tag, i) => { this.getTagContent(tag).tabIndex = (i === 0 && !this.isDisabled) ? this._activeTabIndex : this._inactiveTabIndex; });
416
+ getTagContent(tag: UDExTag): HTMLElement {
417
+ return tag.shadowRoot!.querySelector(".udex-tag")!;
641
418
  }
642
419
 
643
420
  /**
@@ -648,105 +425,38 @@ class UDExSelectBox extends UDExSearchableListBase {
648
425
  this.closeDropdown();
649
426
  }
650
427
 
651
- get allowTargetOverlap(): boolean {
652
- return !this.disableTargetOverlap;
428
+ get tokenizer(): Tokenizer {
429
+ return this.tagGroup?.tokenizer;
653
430
  }
654
431
 
655
- get isDisabled(): boolean {
656
- return this.readonly || this.displayonly || this.disabled;
432
+ get tagGroup(): UDExTagGroup {
433
+ return this.shadowRoot!.querySelector<UDExTagGroup>("[udex-tag-group]")!;
657
434
  }
658
435
 
659
- get truncatableTagLabel(): string {
660
- return this._truncatableTag.text.replace(/<\/?b>/gi, "");
436
+ get tags(): Array<UDExTag> {
437
+ return this.tagGroup ? Array.from(this.tagGroup.shadowRoot!.querySelectorAll<UDExTag>("[udex-tag]")) : [];
661
438
  }
662
439
 
663
- get showSingleSelectedOption(): boolean {
664
- return this._singleSelectedOption?.length > 0 && this.modeSingleSelect;
440
+ get truncatableTagLabel(): string {
441
+ return this._truncatableTag.text.replace(/<\/?b>/gi, "");
665
442
  }
666
443
 
667
444
  get showMultiSelectedOptions(): boolean {
668
445
  return this.hasSelectedItems && this.modeMultiSelect;
669
446
  }
670
447
 
671
- get labelClass(): string {
672
- const baseClass = "udex-text-field__label";
673
- const isActive = this._open || this._singleSelectedOption || this.hasSelectedItems;
674
- return isActive ? `${baseClass} ${baseClass}_active` : `${baseClass}`;
675
- }
676
-
677
- get isReadOrDisplayOnly(): boolean {
678
- return this.readonly || this.displayonly;
448
+ get allowTargetOverlap(): boolean {
449
+ return !this.disableTargetOverlap;
679
450
  }
680
451
 
681
- get tokenizerExpanded() {
452
+ get tokenizerExpanded(): boolean {
682
453
  if (this._showTagsDropdownContent && this._truncatableTag) {
683
454
  return false;
684
455
  }
685
456
 
686
- if (this._tokenizer) {
687
- return this._tokenizer.expanded;
688
- }
689
-
690
- return this._open;
691
- }
692
-
693
- get showTrigger(): boolean {
694
- return !this.displayonly;
695
- }
696
-
697
- get hasSelectedItems(): boolean {
698
- return this.selectedItems.length > 0;
699
- }
700
-
701
- get effectiveTabIndex(): string {
702
- const tabindex = this.getAttribute("tabindex");
703
- return this.disabled ? `${this._inactiveTabIndex}` : tabindex || `${this._inactiveTabIndex}`;
704
- }
705
-
706
- get triggerTabIndex(): string {
707
- return this.disabled || this.readonly ? `${this._inactiveTabIndex}` : "";
708
- }
709
-
710
- get iconAccessibleNameText(): string {
711
- const selectOptionsText = UDExSelectBox.i18nBundle.getText(SELECT_OPTIONS);
712
- const iconAccessibleNameTextSingleMode = this._singleSelectedOption || selectOptionsText;
713
- return this.modeMultiSelect ? selectOptionsText : iconAccessibleNameTextSingleMode;
714
- }
715
-
716
- get additionalClassName(): string {
717
- return `udex-list__sticky`;
718
- }
719
-
720
- get searchableList() {
721
- this.defaultAccessibleRole = "listbox";
722
- return executeTemplate(UDExSelectBox.searchableListBaseTemplate, this);
723
- }
724
-
725
- get accInfo() {
726
- return {
727
- "ariaLabel": getAllAccessibleNameRefTexts(this) || this.accessibleName || this.label || undefined,
728
- };
729
- }
730
-
731
- get accessibilityAttributes(): SelectBoxAccessibilityAttributes {
732
- return {
733
- expanded: `${this._open}`,
734
- controls: this.popoverId,
735
- hasPopup: this.listboxRole,
736
- ariaLabel: this.iconAccessibleNameText,
737
- };
738
- }
739
-
740
- get popoverId(): string {
741
- return `${this._id}_udex-select-box__dropdown`;
742
- }
743
-
744
- get listboxRole(): string {
745
- return "listbox";
746
- }
457
+ const isCurrentlyExpanded = this.tokenizer?.expanded;
747
458
 
748
- static get searchableListBaseTemplate() {
749
- return SearchableListBaseTemplate;
459
+ return this._focused || this._open || isCurrentlyExpanded;
750
460
  }
751
461
  }
752
462