@sapudex/web-components 0.114.2 → 0.117.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 (216) hide show
  1. package/bundle.esm.js +3 -0
  2. package/dist/Avatar.d.ts +8 -1
  3. package/dist/Avatar.js +5 -2
  4. package/dist/Avatar.js.map +1 -1
  5. package/dist/CountrySelector.d.ts +1 -0
  6. package/dist/CountrySelector.js +3 -0
  7. package/dist/CountrySelector.js.map +1 -1
  8. package/dist/FilterMenu.d.ts +14 -4
  9. package/dist/FilterMenu.js +46 -7
  10. package/dist/FilterMenu.js.map +1 -1
  11. package/dist/InputGroup.js.map +1 -1
  12. package/dist/List.d.ts +7 -0
  13. package/dist/List.js +78 -18
  14. package/dist/List.js.map +1 -1
  15. package/dist/ListItem.d.ts +0 -1
  16. package/dist/ListItem.js +0 -6
  17. package/dist/ListItem.js.map +1 -1
  18. package/dist/ListItemBase.d.ts +3 -0
  19. package/dist/ListItemBase.js +12 -0
  20. package/dist/ListItemBase.js.map +1 -1
  21. package/dist/PhoneNumberField.js.map +1 -1
  22. package/dist/Search.d.ts +3 -0
  23. package/dist/Search.js +35 -10
  24. package/dist/Search.js.map +1 -1
  25. package/dist/SecondaryNavigation.d.ts +34 -46
  26. package/dist/SecondaryNavigation.js +140 -161
  27. package/dist/SecondaryNavigation.js.map +1 -1
  28. package/dist/SecondaryNavigationItem.d.ts +101 -0
  29. package/dist/SecondaryNavigationItem.js +287 -0
  30. package/dist/SecondaryNavigationItem.js.map +1 -0
  31. package/dist/SecondaryNavigationItemBase.d.ts +68 -0
  32. package/dist/SecondaryNavigationItemBase.js +78 -0
  33. package/dist/SecondaryNavigationItemBase.js.map +1 -0
  34. package/dist/SecondaryNavigationSubItem.d.ts +52 -0
  35. package/dist/SecondaryNavigationSubItem.js +102 -0
  36. package/dist/SecondaryNavigationSubItem.js.map +1 -0
  37. package/dist/SelectBox.d.ts +1 -0
  38. package/dist/SelectBox.js +13 -1
  39. package/dist/SelectBox.js.map +1 -1
  40. package/dist/StatusBadge.d.ts +67 -0
  41. package/dist/StatusBadge.js +104 -0
  42. package/dist/StatusBadge.js.map +1 -0
  43. package/dist/Tab.js +1 -1
  44. package/dist/Tab.js.map +1 -1
  45. package/dist/assets/{bundle.esm-ab45813e.js → bundle.esm-f65ae7da.js} +187 -184
  46. package/dist/assets/messagebundle_en-7249941b.js +1 -0
  47. package/dist/css/themes/Avatar.css +1 -1
  48. package/dist/css/themes/Checkbox.css +1 -1
  49. package/dist/css/themes/CountrySelector.css +1 -1
  50. package/dist/css/themes/Dropdown.css +1 -1
  51. package/dist/css/themes/FilterMenu.css +1 -1
  52. package/dist/css/themes/HeroBanner.css +1 -1
  53. package/dist/css/themes/MediaPlayer.css +1 -1
  54. package/dist/css/themes/PhoneNumberField.css +1 -1
  55. package/dist/css/themes/RatingIndicator.css +1 -1
  56. package/dist/css/themes/Search.css +1 -1
  57. package/dist/css/themes/SecondaryNavigation.css +1 -1
  58. package/dist/css/themes/SecondaryNavigationItem.css +1 -0
  59. package/dist/css/themes/SecondaryNavigationSubItem.css +1 -0
  60. package/dist/css/themes/Slider.css +1 -1
  61. package/dist/css/themes/StatusBadge.css +1 -0
  62. package/dist/custom-elements-internal.json +604 -2
  63. package/dist/custom-elements.json +574 -2
  64. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  65. package/dist/generated/i18n/i18n-defaults.d.ts +8 -1
  66. package/dist/generated/i18n/i18n-defaults.js +8 -1
  67. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  68. package/dist/generated/templates/CountrySelectorTemplate.lit.js +1 -1
  69. package/dist/generated/templates/CountrySelectorTemplate.lit.js.map +1 -1
  70. package/dist/generated/templates/DropdownTemplate.lit.js +1 -1
  71. package/dist/generated/templates/DropdownTemplate.lit.js.map +1 -1
  72. package/dist/generated/templates/FilterMenuTemplate.lit.js +3 -3
  73. package/dist/generated/templates/FilterMenuTemplate.lit.js.map +1 -1
  74. package/dist/generated/templates/HeroBannerTemplate.lit.js +2 -2
  75. package/dist/generated/templates/HeroBannerTemplate.lit.js.map +1 -1
  76. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js +4 -4
  77. package/dist/generated/templates/ListGroupHeaderTemplate.lit.js.map +1 -1
  78. package/dist/generated/templates/ListItemTemplate.lit.js +1 -1
  79. package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
  80. package/dist/generated/templates/ListSelectAllTemplate.lit.js +1 -1
  81. package/dist/generated/templates/ListSelectAllTemplate.lit.js.map +1 -1
  82. package/dist/generated/templates/SearchSuggestionsTemplate.lit.js +1 -1
  83. package/dist/generated/templates/SearchSuggestionsTemplate.lit.js.map +1 -1
  84. package/dist/generated/templates/SearchTemplate.lit.js +2 -2
  85. package/dist/generated/templates/SearchTemplate.lit.js.map +1 -1
  86. package/dist/generated/templates/SearchableListBaseTemplate.lit.js +2 -2
  87. package/dist/generated/templates/SearchableListBaseTemplate.lit.js.map +1 -1
  88. package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.d.ts +4 -0
  89. package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.js +11 -0
  90. package/dist/generated/templates/SecondaryNavigationItemTemplate.lit.js.map +1 -0
  91. package/dist/generated/templates/SecondaryNavigationSubItemTemplate.lit.d.ts +4 -0
  92. package/dist/generated/templates/SecondaryNavigationSubItemTemplate.lit.js +9 -0
  93. package/dist/generated/templates/SecondaryNavigationSubItemTemplate.lit.js.map +1 -0
  94. package/dist/generated/templates/SecondaryNavigationTemplate.lit.js +7 -10
  95. package/dist/generated/templates/SecondaryNavigationTemplate.lit.js.map +1 -1
  96. package/dist/generated/templates/SelectBoxTemplate.lit.js +1 -1
  97. package/dist/generated/templates/SelectBoxTemplate.lit.js.map +1 -1
  98. package/dist/generated/templates/StatusBadgeTemplate.lit.d.ts +4 -0
  99. package/dist/generated/templates/StatusBadgeTemplate.lit.js +5 -0
  100. package/dist/generated/templates/StatusBadgeTemplate.lit.js.map +1 -0
  101. package/dist/generated/themes/Avatar.css.js +1 -1
  102. package/dist/generated/themes/Avatar.css.js.map +1 -1
  103. package/dist/generated/themes/Checkbox.css.js +1 -1
  104. package/dist/generated/themes/Checkbox.css.js.map +1 -1
  105. package/dist/generated/themes/CountrySelector.css.js +1 -1
  106. package/dist/generated/themes/CountrySelector.css.js.map +1 -1
  107. package/dist/generated/themes/Dropdown.css.js +1 -1
  108. package/dist/generated/themes/Dropdown.css.js.map +1 -1
  109. package/dist/generated/themes/FilterMenu.css.js +1 -1
  110. package/dist/generated/themes/FilterMenu.css.js.map +1 -1
  111. package/dist/generated/themes/HeroBanner.css.js +1 -1
  112. package/dist/generated/themes/HeroBanner.css.js.map +1 -1
  113. package/dist/generated/themes/MediaPlayer.css.js +1 -1
  114. package/dist/generated/themes/MediaPlayer.css.js.map +1 -1
  115. package/dist/generated/themes/PhoneNumberField.css.js +1 -1
  116. package/dist/generated/themes/PhoneNumberField.css.js.map +1 -1
  117. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  118. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  119. package/dist/generated/themes/Search.css.js +1 -1
  120. package/dist/generated/themes/Search.css.js.map +1 -1
  121. package/dist/generated/themes/SecondaryNavigation.css.js +1 -1
  122. package/dist/generated/themes/SecondaryNavigation.css.js.map +1 -1
  123. package/dist/generated/themes/SecondaryNavigationItem.css.d.ts +3 -0
  124. package/dist/generated/themes/SecondaryNavigationItem.css.js +9 -0
  125. package/dist/generated/themes/SecondaryNavigationItem.css.js.map +1 -0
  126. package/dist/generated/themes/SecondaryNavigationSubItem.css.d.ts +3 -0
  127. package/dist/generated/themes/SecondaryNavigationSubItem.css.js +9 -0
  128. package/dist/generated/themes/SecondaryNavigationSubItem.css.js.map +1 -0
  129. package/dist/generated/themes/Slider.css.js +1 -1
  130. package/dist/generated/themes/Slider.css.js.map +1 -1
  131. package/dist/generated/themes/StatusBadge.css.d.ts +3 -0
  132. package/dist/generated/themes/StatusBadge.css.js +9 -0
  133. package/dist/generated/themes/StatusBadge.css.js.map +1 -0
  134. package/dist/i18n/messagebundle.properties +12 -1
  135. package/dist/i18n/messagebundle_en.properties +8 -1
  136. package/dist/vscode.html-custom-data.json +131 -3
  137. package/dist/web-types.json +203 -5
  138. package/package.json +1 -1
  139. package/src/Avatar.ts +12 -3
  140. package/src/CountrySelector.hbs +2 -1
  141. package/src/CountrySelector.ts +4 -1
  142. package/src/Dropdown.hbs +0 -1
  143. package/src/FilterMenu.hbs +5 -1
  144. package/src/FilterMenu.ts +60 -10
  145. package/src/HeroBanner.hbs +24 -21
  146. package/src/InputGroup.ts +6 -5
  147. package/src/List.ts +92 -21
  148. package/src/ListGroupHeader.hbs +9 -5
  149. package/src/ListItem.hbs +2 -1
  150. package/src/ListItem.ts +0 -7
  151. package/src/ListItemBase.ts +14 -0
  152. package/src/ListSelectAll.hbs +1 -0
  153. package/src/PhoneNumberField.ts +1 -1
  154. package/src/Search.hbs +3 -2
  155. package/src/Search.ts +37 -10
  156. package/src/SearchSuggestions.hbs +1 -1
  157. package/src/SearchableListBase.hbs +2 -0
  158. package/src/SecondaryNavigation.hbs +50 -72
  159. package/src/SecondaryNavigation.ts +171 -195
  160. package/src/SecondaryNavigationItem.hbs +63 -0
  161. package/src/SecondaryNavigationItem.ts +358 -0
  162. package/src/SecondaryNavigationItemBase.ts +115 -0
  163. package/src/SecondaryNavigationSubItem.hbs +41 -0
  164. package/src/SecondaryNavigationSubItem.ts +123 -0
  165. package/src/SelectBox.hbs +1 -0
  166. package/src/SelectBox.ts +16 -1
  167. package/src/StatusBadge.hbs +9 -0
  168. package/src/StatusBadge.ts +129 -0
  169. package/src/Tab.ts +1 -1
  170. package/src/generated/i18n/i18n-defaults.ts +2 -2
  171. package/src/generated/templates/CountrySelectorTemplate.lit.ts +1 -1
  172. package/src/generated/templates/DropdownTemplate.lit.ts +1 -1
  173. package/src/generated/templates/FilterMenuTemplate.lit.ts +3 -3
  174. package/src/generated/templates/HeroBannerTemplate.lit.ts +2 -2
  175. package/src/generated/templates/ListGroupHeaderTemplate.lit.ts +4 -4
  176. package/src/generated/templates/ListItemTemplate.lit.ts +1 -1
  177. package/src/generated/templates/ListSelectAllTemplate.lit.ts +1 -1
  178. package/src/generated/templates/SearchSuggestionsTemplate.lit.ts +1 -1
  179. package/src/generated/templates/SearchTemplate.lit.ts +2 -2
  180. package/src/generated/templates/SearchableListBaseTemplate.lit.ts +2 -2
  181. package/src/generated/templates/SecondaryNavigationItemTemplate.lit.ts +16 -0
  182. package/src/generated/templates/SecondaryNavigationSubItemTemplate.lit.ts +14 -0
  183. package/src/generated/templates/SecondaryNavigationTemplate.lit.ts +7 -10
  184. package/src/generated/templates/SelectBoxTemplate.lit.ts +1 -1
  185. package/src/generated/templates/StatusBadgeTemplate.lit.ts +10 -0
  186. package/src/generated/themes/Avatar.css.ts +1 -1
  187. package/src/generated/themes/Checkbox.css.ts +1 -1
  188. package/src/generated/themes/CountrySelector.css.ts +1 -1
  189. package/src/generated/themes/Dropdown.css.ts +1 -1
  190. package/src/generated/themes/FilterMenu.css.ts +1 -1
  191. package/src/generated/themes/HeroBanner.css.ts +1 -1
  192. package/src/generated/themes/MediaPlayer.css.ts +1 -1
  193. package/src/generated/themes/PhoneNumberField.css.ts +1 -1
  194. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  195. package/src/generated/themes/Search.css.ts +1 -1
  196. package/src/generated/themes/SecondaryNavigation.css.ts +1 -1
  197. package/src/generated/themes/SecondaryNavigationItem.css.ts +13 -0
  198. package/src/generated/themes/SecondaryNavigationSubItem.css.ts +13 -0
  199. package/src/generated/themes/Slider.css.ts +1 -1
  200. package/src/generated/themes/StatusBadge.css.ts +13 -0
  201. package/src/i18n/messagebundle.properties +12 -1
  202. package/src/i18n/messagebundle_en.properties +8 -1
  203. package/src/themes/Avatar.css +20 -0
  204. package/src/themes/Checkbox.css +12 -0
  205. package/src/themes/CountrySelector.css +4 -0
  206. package/src/themes/Dropdown.css +2 -0
  207. package/src/themes/FilterMenu.css +10 -0
  208. package/src/themes/HeroBanner.css +42 -6
  209. package/src/themes/MediaPlayer.css +3 -2
  210. package/src/themes/PhoneNumberField.css +4 -0
  211. package/src/themes/Search.css +11 -7
  212. package/src/themes/SecondaryNavigation.css +44 -302
  213. package/src/themes/SecondaryNavigationItem.css +220 -0
  214. package/src/themes/SecondaryNavigationSubItem.css +118 -0
  215. package/src/themes/StatusBadge.css +135 -0
  216. package/dist/assets/messagebundle_en-26cd7a92.js +0 -1
@@ -0,0 +1,358 @@
1
+ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
2
+ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
3
+ import slot from "@ui5/webcomponents-base/dist/decorators/slot.js";
4
+ import event from "@ui5/webcomponents-base/dist/decorators/event.js";
5
+ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
6
+ import UI5Icon from "@ui5/webcomponents/dist/Icon.js";
7
+ import {
8
+ isLeft,
9
+ isRight,
10
+ isUp,
11
+ isDown,
12
+ isEscape,
13
+ isSpace,
14
+ isEnter,
15
+ isHome,
16
+ isEnd,
17
+ } from "@ui5/webcomponents-base/dist/Keys.js";
18
+ import UDExSecondaryNavigationSubItem from "./SecondaryNavigationSubItem.js";
19
+ import UDExSecondaryNavigationItemBase, { NavItem } from "./SecondaryNavigationItemBase.js";
20
+ import "@ui5/webcomponents-icons/dist/slim-arrow-down.js";
21
+
22
+ import SecondaryNavigationItemTemplate from "./generated/templates/SecondaryNavigationItemTemplate.lit.js";
23
+
24
+ // Styles
25
+ import SecondaryNavigationItemCss from "./generated/themes/SecondaryNavigationItem.css.js";
26
+
27
+ export const menuItemRole: string = "menuitem";
28
+
29
+ /**
30
+ * @class
31
+ *
32
+ * <h3 class="comment-api-title">Overview</h3>
33
+ *
34
+ *
35
+ * <h3>Usage</h3>
36
+ *
37
+ * For the <code>udex-secondary-navigation-item</code>
38
+ * <h3>ES6 Module Import</h3>
39
+ *
40
+ * <code>import "@udex/web-components/dist/SecondaryNavigationItem.js";</code>
41
+ *
42
+ * @constructor
43
+ * @extends UDExSecondaryNavigationItemBase
44
+ * @tagname udex-secondary-navigation-item
45
+ * @private
46
+ */
47
+ @customElement({
48
+ tag: "udex-secondary-navigation-item",
49
+ renderer: litRender,
50
+ styles: SecondaryNavigationItemCss,
51
+ template: SecondaryNavigationItemTemplate,
52
+ dependencies: [UI5Icon, UDExSecondaryNavigationSubItem],
53
+ })
54
+
55
+ /**
56
+ * Fires when item is clicked
57
+ *
58
+ * @allowPreventDefault
59
+ * @public
60
+ */
61
+ @event("nav-item-click", {
62
+ detail: {
63
+ item: { type: HTMLElement },
64
+ },
65
+ })
66
+
67
+ /**
68
+ * Fires when dropdown item is clicked
69
+ *
70
+ * @allowPreventDefault
71
+ * @public
72
+ */
73
+ @event("sub-item-click", {
74
+ detail: {
75
+ item: { type: Array },
76
+ },
77
+ })
78
+
79
+ class UDExSecondaryNavigationItem extends UDExSecondaryNavigationItemBase {
80
+ /**
81
+ * Defines an aria label for item
82
+ *
83
+ * @public
84
+ */
85
+ @property({ type: String })
86
+ ariaLabel!: string;
87
+
88
+ /**
89
+ * Defines a role for item
90
+ *
91
+ * @public
92
+ */
93
+ @property({ type: String })
94
+ role!: string;
95
+
96
+ /**
97
+ * Defines the content of the item.
98
+ *
99
+ * @slot content
100
+ * @public
101
+ */
102
+ @slot({ type: HTMLElement })
103
+ buttons!: Array<HTMLElement>;
104
+
105
+ /**
106
+ * List of the sub items
107
+ *
108
+ * @default "[]"
109
+ * @public
110
+ */
111
+ @property({ type: Object, multiple: true })
112
+ subItems!: Array<NavItem>;
113
+
114
+ /**
115
+ * Defines if dropdown is opened.
116
+ *
117
+ * @public
118
+ * @default false
119
+ */
120
+ @property({ type: Boolean })
121
+ isOpen!: boolean;
122
+
123
+ /**
124
+ * Defines processed items.
125
+ *
126
+ * @private
127
+ * @default []
128
+ */
129
+ @property({ type: Object })
130
+ _processedItems: Array<NavItem> = [];
131
+
132
+ _dropdownHistory: Array<Array<NavItem>> = [];
133
+ _shouldFocusFirstSubItem!: boolean;
134
+ _subTitle!: string | undefined;
135
+
136
+ onAfterRendering(): void {
137
+ if (this._shouldFocusFirstSubItem && this.isOpen) {
138
+ this.onFirstSubItemFocus();
139
+ this._shouldFocusFirstSubItem = false;
140
+ }
141
+ }
142
+
143
+ onBeforeRendering() : void {
144
+ this._subTitle = this.subActiveItemTitle || this._subTitle;
145
+ }
146
+
147
+ onItemClick(): void {
148
+ if (this.hasNestedItems) {
149
+ this.setDropdownItems();
150
+ this.toggleDropdown();
151
+ }
152
+
153
+ this.fireEvent("nav-item-click", { item: this });
154
+ }
155
+
156
+ onSubItemClick(e: Event): void {
157
+ const { index } = e.target as UDExSecondaryNavigationSubItem;
158
+ const clickedItem = this._processedItems[index];
159
+
160
+ if (clickedItem.items) {
161
+ this.setDropdownHistory();
162
+ this.setNestedItems(clickedItem);
163
+ }
164
+
165
+ this.fireEvent("sub-item-click", {
166
+ item: clickedItem,
167
+ });
168
+ }
169
+
170
+ onBackClick(): void {
171
+ this.setPrevNestedItems();
172
+ }
173
+
174
+ toggleDropdown(): void {
175
+ this.isOpen = !this.isOpen;
176
+ }
177
+
178
+ closeDropdown(): void {
179
+ this.isOpen = false;
180
+ }
181
+
182
+ handleItemLinkKeyDown(e: KeyboardEvent): void {
183
+ if (isEnter(e) || isSpace(e)) {
184
+ e.preventDefault();
185
+ this.onItemClick();
186
+ }
187
+ }
188
+
189
+ handleItemButtonKeyDown(e: KeyboardEvent): void {
190
+ if (isEnter(e) || isSpace(e)) {
191
+ this.onShouldFocusFirstSubItem();
192
+ }
193
+ }
194
+
195
+ handleSubItemKeyDown(e: KeyboardEvent): void {
196
+ e.stopPropagation();
197
+ if (isEscape(e)) {
198
+ this.handleEscapeKey();
199
+ }
200
+ if (isLeft(e)) {
201
+ this.handleLeftArrow(e);
202
+ }
203
+ if (isRight(e)) {
204
+ this.handleRightArrow(e);
205
+ }
206
+ if (isUp(e)) {
207
+ e.preventDefault();
208
+ this.handleUpArrow(e);
209
+ }
210
+ if (isDown(e)) {
211
+ e.preventDefault();
212
+ this.handleDownArrow(e);
213
+ }
214
+ if (isHome(e)) {
215
+ e.preventDefault();
216
+ this.onFirstSubItemFocus();
217
+ }
218
+ if (isEnd(e)) {
219
+ e.preventDefault();
220
+ this.onLastSubItemFocus();
221
+ }
222
+ if (isEnter(e) || isSpace(e)) {
223
+ e.preventDefault();
224
+ this.handleEnterAndSpace(e);
225
+ }
226
+ }
227
+
228
+ handleUpArrow(e: KeyboardEvent): void {
229
+ const { index } = e.target as UDExSecondaryNavigationSubItem;
230
+ const lastIndex = this.domNavItems.length - 1;
231
+ const previousIndex = index - 1 < 0 ? lastIndex : index - 1;
232
+ if (!(lastIndex === previousIndex)) {
233
+ this.domNavItems[previousIndex].focus();
234
+ }
235
+ }
236
+
237
+ handleDownArrow(e: KeyboardEvent): void {
238
+ const { index } = e.target as UDExSecondaryNavigationSubItem;
239
+ const nextIndex = index + 1 > this.domNavItems.length - 1 ? 0 : index + 1;
240
+ if (!(nextIndex === 0)) {
241
+ this.domNavItems[nextIndex].focus();
242
+ }
243
+ }
244
+
245
+ handleLeftArrow(e: KeyboardEvent): void {
246
+ const { isBack } = e.target as UDExSecondaryNavigationSubItem;
247
+ if (isBack) {
248
+ this.setPrevNestedItems();
249
+ this.onShouldFocusFirstSubItem();
250
+ }
251
+ }
252
+
253
+ handleRightArrow(e: KeyboardEvent): void {
254
+ const { hasItems, isBack } = e.target as UDExSecondaryNavigationSubItem;
255
+ if (hasItems && !isBack) {
256
+ this.onSubItemClick(e);
257
+ this.onShouldFocusFirstSubItem();
258
+ }
259
+ }
260
+
261
+ handleEnterAndSpace(e: KeyboardEvent): void {
262
+ const { hasItems, isBack } = e.target as UDExSecondaryNavigationSubItem;
263
+ if (isBack) {
264
+ this.onBackClick();
265
+ this.onShouldFocusFirstSubItem();
266
+ return;
267
+ }
268
+
269
+ this.onSubItemClick(e);
270
+
271
+ if (hasItems) {
272
+ this.onShouldFocusFirstSubItem();
273
+ } else {
274
+ this.closeDropdown();
275
+ this.focus();
276
+ }
277
+ }
278
+
279
+ handleEscapeKey(): void {
280
+ this.closeDropdown();
281
+ this.focus();
282
+ }
283
+
284
+ setDropdownHistory(): void {
285
+ this._dropdownHistory.push(this._processedItems);
286
+ }
287
+
288
+ setPrevNestedItems(): void {
289
+ this._processedItems = this._dropdownHistory.pop()!;
290
+ }
291
+
292
+ setNestedItems({ title, items } : NavItem): void {
293
+ if (items) {
294
+ this._processedItems = [{ title, isBack: true }, ...items];
295
+ }
296
+ }
297
+
298
+ setDropdownItems(): void {
299
+ this._processedItems = this.subItems;
300
+ }
301
+
302
+ onFirstSubItemFocus(): void {
303
+ this.domNavItems[0].focus();
304
+ }
305
+
306
+ onLastSubItemFocus(): void {
307
+ this.domNavItems[this.domNavItems.length - 1].focus();
308
+ }
309
+
310
+ onShouldFocusFirstSubItem(): void {
311
+ this._shouldFocusFirstSubItem = true;
312
+ }
313
+
314
+ get domNavItems(): Array<UDExSecondaryNavigationSubItem> {
315
+ const domNavItems = this.shadowRoot?.querySelectorAll<UDExSecondaryNavigationSubItem>("udex-secondary-navigation-sub-item");
316
+ return domNavItems ? Array.from(domNavItems) : [];
317
+ }
318
+
319
+ get hasNestedItems(): boolean {
320
+ return this.subItems.length > 0;
321
+ }
322
+
323
+ get isSubItemActive(): boolean {
324
+ return !!this.subActiveItem?.active;
325
+ }
326
+
327
+ get isActive(): boolean {
328
+ return this.isSubItemActive || this.active;
329
+ }
330
+
331
+ get subActiveItemTitle(): string | undefined {
332
+ return this.subActiveItem?.title;
333
+ }
334
+
335
+ get subActiveItem(): NavItem | undefined {
336
+ return this.getActiveSubItem(this.subItems);
337
+ }
338
+
339
+ get isLink(): boolean {
340
+ return !this.hasNestedItems && !!this.path;
341
+ }
342
+
343
+ get itemRole(): string {
344
+ return this.role ? this.role : this.menuItemRole;
345
+ }
346
+
347
+ get menuItemRole(): string {
348
+ return menuItemRole;
349
+ }
350
+
351
+ get title(): string {
352
+ return this.label;
353
+ }
354
+ }
355
+
356
+ UDExSecondaryNavigationItem.define();
357
+
358
+ export default UDExSecondaryNavigationItem;
@@ -0,0 +1,115 @@
1
+ import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
+ import { isDesktop } from "@ui5/webcomponents-base/dist/Device.js";
3
+ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
4
+ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
5
+ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
6
+ import Integer from "@ui5/webcomponents-base/dist/types/Integer.js";
7
+
8
+ export enum Target {
9
+ _blank = "_blank",
10
+ _parent = "_parent",
11
+ _self = "_self",
12
+ _top = "_top",
13
+ }
14
+
15
+ export type NavItem = {
16
+ path?: string;
17
+ mobileLinkTitle?: string;
18
+ target?: Target;
19
+ title: string;
20
+ active?: boolean;
21
+ isBack?: boolean;
22
+ items?: Array<NavItem>;
23
+ }
24
+
25
+ /**
26
+ * @class
27
+ *
28
+ * A class to serve as a foundation
29
+ * for the <code>UDExSecondaryNavigationItem</code> and <code>UDExSecondaryNavigationSubItem</code> classes.
30
+ *
31
+ * @constructor
32
+ * @author SAP SE
33
+ * @extends UI5Element
34
+ * @public
35
+ */
36
+
37
+ @customElement({
38
+ renderer: litRender,
39
+ })
40
+
41
+ class UDExSecondaryNavigationItemBase extends UI5Element {
42
+ /**
43
+ * Defines active state for the item
44
+ *
45
+ * @public
46
+ */
47
+ @property({ type: Boolean })
48
+ active!: boolean;
49
+
50
+ /**
51
+ * Defines path for the item
52
+ *
53
+ * @public
54
+ */
55
+ @property({ type: String })
56
+ path!: string;
57
+
58
+ /**
59
+ * Defines target for the item
60
+ *
61
+ * @public
62
+ */
63
+ @property({ type: String })
64
+ target!: string;
65
+
66
+ /**
67
+ * Defines subTitle for the item
68
+ *
69
+ * @public
70
+ */
71
+ @property({ type: String })
72
+ subTitle!: string;
73
+
74
+ /**
75
+ * Defines label for the item
76
+ *
77
+ * @public
78
+ */
79
+ @property({ type: String })
80
+ label!: string;
81
+
82
+ /**
83
+ * Defines the index for the item.
84
+ *
85
+ * @public
86
+ */
87
+ @property({ validator: Integer })
88
+ index!: number;
89
+
90
+ onEnterDOM(): void {
91
+ if (isDesktop()) {
92
+ this.setAttribute("desktop", "");
93
+ }
94
+ }
95
+
96
+ getActiveSubItem(data: Array<NavItem>): NavItem | undefined {
97
+ let activeItem;
98
+ const findActiveItem = (array: Array<NavItem>) => {
99
+ array.forEach(item => {
100
+ if (item.active === true) {
101
+ activeItem = item;
102
+ return;
103
+ }
104
+ if (item.items) {
105
+ findActiveItem(item.items);
106
+ }
107
+ });
108
+ };
109
+
110
+ findActiveItem(data);
111
+ return activeItem;
112
+ }
113
+ }
114
+
115
+ export default UDExSecondaryNavigationItemBase;
@@ -0,0 +1,41 @@
1
+ {{#if isBack}}
2
+ <button
3
+ @click="{{onBackItemClick}}"
4
+ role="menuitem"
5
+ aria-label="{{backButtonLabel}}"
6
+ aria-haspopup="true"
7
+ is-back
8
+ class="udex-secondary-navigation__dropdown-item">
9
+ <ui5-icon
10
+ class="udex-secondary-navigation__dropdown-icon udex-secondary-navigation__dropdown-icon_back"
11
+ name="slim-arrow-left">
12
+ </ui5-icon>
13
+ {{label}}
14
+ </button>
15
+ {{else}}
16
+ {{#if hasItems}}
17
+ <button
18
+ @click="{{onItemClick}}"
19
+ role="menuitem"
20
+ aria-haspopup="true"
21
+ ?sub-active="{{isSubItemActive}}"
22
+ aria-label="{{label}}"
23
+ class="udex-secondary-navigation__dropdown-item">
24
+ {{label}}
25
+ <ui5-icon
26
+ class="udex-secondary-navigation__dropdown-icon"
27
+ name="slim-arrow-right">
28
+ </ui5-icon>
29
+ </button>
30
+ {{else}}
31
+ <a
32
+ @click="{{onItemClick}}"
33
+ role="menuitem"
34
+ href="{{path}}"
35
+ target="{{target}}"
36
+ ?active="{{isActive}}"
37
+ class="udex-secondary-navigation__dropdown-item">
38
+ {{label}}
39
+ </a>
40
+ {{/if}}
41
+ {{/if}}
@@ -0,0 +1,123 @@
1
+ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
2
+ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
3
+ import event from "@ui5/webcomponents-base/dist/decorators/event.js";
4
+ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
5
+ import UI5Icon from "@ui5/webcomponents/dist/Icon.js";
6
+ import { getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js";
7
+ import "@ui5/webcomponents-icons/dist/slim-arrow-right.js";
8
+ import "@ui5/webcomponents-icons/dist/slim-arrow-left.js";
9
+ import UDExSecondaryNavigationItemBase, { NavItem } from "./SecondaryNavigationItemBase.js";
10
+ import { BACK_BUTTON_LABEL } from "./generated/i18n/i18n-defaults.js";
11
+
12
+ import SecondaryNavigationSubItemTemplate from "./generated/templates/SecondaryNavigationSubItemTemplate.lit.js";
13
+
14
+ // Styles
15
+ import SecondaryNavigationSubItemCss from "./generated/themes/SecondaryNavigationSubItem.css.js";
16
+
17
+ /**
18
+ * @class
19
+ *
20
+ * <h3 class="comment-api-title">Overview</h3>
21
+ *
22
+ *
23
+ * <h3>Usage</h3>
24
+ *
25
+ * For the <code>udex-secondary-navigation-sub-item</code>
26
+ * <h3>ES6 Module Import</h3>
27
+ *
28
+ * <code>import "@udex/web-components/dist/SecondaryNavigationSubItem.js";</code>
29
+ *
30
+ * @constructor
31
+ * @extends UDExSecondaryNavigationItemBase
32
+ * @tagname udex-secondary-navigation-sub-item
33
+ * @public
34
+ */
35
+ @customElement({
36
+ tag: "udex-secondary-navigation-sub-item",
37
+ renderer: litRender,
38
+ styles: SecondaryNavigationSubItemCss,
39
+ template: SecondaryNavigationSubItemTemplate,
40
+ dependencies: [UI5Icon],
41
+ })
42
+
43
+ /**
44
+ * Fires when item is clicked
45
+ *
46
+ * @allowPreventDefault
47
+ * @public
48
+ */
49
+ @event("sub-item-click", {
50
+ detail: {
51
+ item: { type: HTMLElement },
52
+ },
53
+ })
54
+
55
+ /**
56
+ * Fires when back item is clicked
57
+ *
58
+ * @allowPreventDefault
59
+ * @public
60
+ */
61
+ @event("back-item-click")
62
+
63
+ class UDExSecondaryNavigationSubItem extends UDExSecondaryNavigationItemBase {
64
+ /**
65
+ * Defines active item.
66
+ *
67
+ * @public
68
+ * @default false
69
+ */
70
+ @property({ type: Boolean })
71
+ isActive!: boolean;
72
+
73
+ /**
74
+ * Defines back item.
75
+ *
76
+ * @public
77
+ * @default false
78
+ */
79
+ @property({ type: Boolean })
80
+ isBack!: boolean;
81
+
82
+ /**
83
+ * List of the nested items
84
+ *
85
+ * @default "[]"
86
+ * @public
87
+ */
88
+ @property({ type: Object, multiple: true })
89
+ nestedItems!: Array<NavItem>;
90
+
91
+ static i18nBundle: any;
92
+
93
+ static async onDefine(): Promise<void> {
94
+ UDExSecondaryNavigationSubItem.i18nBundle = await getI18nBundle("udex-secondary-navigation-sub-item");
95
+ }
96
+
97
+ onItemClick(): void {
98
+ this.fireEvent("sub-item-click", {
99
+ item: this,
100
+ });
101
+ }
102
+
103
+ onBackItemClick(): void {
104
+ this.fireEvent("back-item-click");
105
+ }
106
+
107
+ get hasItems(): boolean {
108
+ return !!this.nestedItems.length;
109
+ }
110
+
111
+ get isSubItemActive(): boolean {
112
+ return !!this.getActiveSubItem(this.nestedItems)?.active;
113
+ }
114
+
115
+ get backButtonLabel(): string {
116
+ const label = UDExSecondaryNavigationSubItem.i18nBundle.getText(BACK_BUTTON_LABEL) as string;
117
+ return `${label} ${this.label}`;
118
+ }
119
+ }
120
+
121
+ UDExSecondaryNavigationSubItem.define();
122
+
123
+ export default UDExSecondaryNavigationSubItem;
package/src/SelectBox.hbs CHANGED
@@ -102,6 +102,7 @@
102
102
  @ui5-handle-value-reset="{{handleResetSearch}}"
103
103
  @before-open="{{handleDropdownBeforeOpen}}"
104
104
  @after-close="{{handleDropdownAfterClose}}"
105
+ @search-keydown="{{handleKeyDownSearch}}"
105
106
  height="{{height}}"
106
107
  accessible-role="Dialog"
107
108
  horizontal-align="Left">
package/src/SelectBox.ts CHANGED
@@ -444,9 +444,22 @@ class UDExSelectBox extends UDExSearchableListBase {
444
444
  }
445
445
 
446
446
  handleKeyDownDropdown(e: KeyboardEvent) {
447
+ const isTabPrevPress = isTabPrevious(e) && !this._search;
448
+
447
449
  if (isEscape(e)) {
448
450
  this.trigger.focus();
449
451
  }
452
+
453
+ if (isTabNext(e) || isTabPrevPress) {
454
+ this.closeDropdown();
455
+ }
456
+ }
457
+
458
+ handleKeyDownSearch(e: CustomEvent) {
459
+ const keyEvent = e.detail as KeyboardEvent;
460
+ if (isTabPrevious(keyEvent) || isEscape(keyEvent)) {
461
+ this.closeDropdown();
462
+ }
450
463
  }
451
464
 
452
465
  handleOutsideClick(): void {
@@ -462,7 +475,9 @@ class UDExSelectBox extends UDExSearchableListBase {
462
475
  }
463
476
 
464
477
  closeDropdown() {
465
- this._dropdown.onClose();
478
+ if (this._dropdown.open) {
479
+ this._dropdown.onClose();
480
+ }
466
481
  }
467
482
 
468
483
  scrollToTag(index: number) {
@@ -0,0 +1,9 @@
1
+ <div
2
+ class="udex-status-badge"
3
+ title="{{ariaTitle}}">
4
+ <ui5-icon
5
+ name="{{iconFieldName}}"
6
+ class="udex-status-badge__icon"
7
+ accessible-name="{{badgeAccessibleName}}">
8
+ </ui5-icon>
9
+ </div>