@ui5/webcomponents-fiori 2.19.2 → 2.20.0-rc.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 (218) hide show
  1. package/CHANGELOG.md +12 -3
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/DynamicPage.js +8 -2
  4. package/dist/DynamicPage.js.map +1 -1
  5. package/dist/ShellBar.d.ts +231 -304
  6. package/dist/ShellBar.js +506 -980
  7. package/dist/ShellBar.js.map +1 -1
  8. package/dist/ShellBarItem.d.ts +15 -31
  9. package/dist/ShellBarItem.js +36 -25
  10. package/dist/ShellBarItem.js.map +1 -1
  11. package/dist/ShellBarItemTemplate.d.ts +2 -0
  12. package/dist/ShellBarItemTemplate.js +11 -0
  13. package/dist/ShellBarItemTemplate.js.map +1 -0
  14. package/dist/ShellBarTemplate.js +53 -55
  15. package/dist/ShellBarTemplate.js.map +1 -1
  16. package/dist/UserMenu.d.ts +10 -1
  17. package/dist/UserMenu.js +9 -1
  18. package/dist/UserMenu.js.map +1 -1
  19. package/dist/UserMenuAccount.js +0 -2
  20. package/dist/UserMenuAccount.js.map +1 -1
  21. package/dist/UserMenuItem.d.ts +0 -1
  22. package/dist/UserMenuItem.js +0 -1
  23. package/dist/UserMenuItem.js.map +1 -1
  24. package/dist/UserMenuItemGroup.d.ts +0 -1
  25. package/dist/UserMenuItemGroup.js +0 -1
  26. package/dist/UserMenuItemGroup.js.map +1 -1
  27. package/dist/UserMenuTemplate.js +3 -1
  28. package/dist/UserMenuTemplate.js.map +1 -1
  29. package/dist/UserSettingsAccountView.js +0 -2
  30. package/dist/UserSettingsAccountView.js.map +1 -1
  31. package/dist/UserSettingsAppearanceView.js +0 -2
  32. package/dist/UserSettingsAppearanceView.js.map +1 -1
  33. package/dist/UserSettingsAppearanceViewGroup.d.ts +0 -1
  34. package/dist/UserSettingsAppearanceViewGroup.js +0 -1
  35. package/dist/UserSettingsAppearanceViewGroup.js.map +1 -1
  36. package/dist/UserSettingsAppearanceViewItem.js +0 -2
  37. package/dist/UserSettingsAppearanceViewItem.js.map +1 -1
  38. package/dist/UserSettingsDialog.d.ts +0 -1
  39. package/dist/UserSettingsDialog.js +0 -1
  40. package/dist/UserSettingsDialog.js.map +1 -1
  41. package/dist/UserSettingsItem.d.ts +0 -1
  42. package/dist/UserSettingsItem.js +0 -1
  43. package/dist/UserSettingsItem.js.map +1 -1
  44. package/dist/UserSettingsView.d.ts +0 -1
  45. package/dist/UserSettingsView.js +0 -1
  46. package/dist/UserSettingsView.js.map +1 -1
  47. package/dist/css/themes/ShellBar.css +1 -1
  48. package/dist/css/themes/ShellBarItem.css +1 -0
  49. package/dist/css/themes/ShellBarLegacy.css +1 -0
  50. package/dist/css/themes/ShellBarSearchLegacy.css +1 -0
  51. package/dist/custom-elements-internal.json +363 -750
  52. package/dist/custom-elements.json +324 -609
  53. package/dist/generated/assets/i18n/messagebundle_ar.json +1 -1
  54. package/dist/generated/assets/i18n/messagebundle_bg.json +1 -1
  55. package/dist/generated/assets/i18n/messagebundle_ca.json +1 -1
  56. package/dist/generated/assets/i18n/messagebundle_cnr.json +1 -1
  57. package/dist/generated/assets/i18n/messagebundle_cs.json +1 -1
  58. package/dist/generated/assets/i18n/messagebundle_cy.json +1 -1
  59. package/dist/generated/assets/i18n/messagebundle_da.json +1 -1
  60. package/dist/generated/assets/i18n/messagebundle_de.json +1 -1
  61. package/dist/generated/assets/i18n/messagebundle_el.json +1 -1
  62. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  63. package/dist/generated/assets/i18n/messagebundle_en_GB.json +1 -1
  64. package/dist/generated/assets/i18n/messagebundle_en_US_sappsd.json +1 -1
  65. package/dist/generated/assets/i18n/messagebundle_en_US_saprigi.json +1 -1
  66. package/dist/generated/assets/i18n/messagebundle_en_US_saptrc.json +1 -1
  67. package/dist/generated/assets/i18n/messagebundle_es.json +1 -1
  68. package/dist/generated/assets/i18n/messagebundle_es_MX.json +1 -1
  69. package/dist/generated/assets/i18n/messagebundle_et.json +1 -1
  70. package/dist/generated/assets/i18n/messagebundle_fi.json +1 -1
  71. package/dist/generated/assets/i18n/messagebundle_fr.json +1 -1
  72. package/dist/generated/assets/i18n/messagebundle_fr_CA.json +1 -1
  73. package/dist/generated/assets/i18n/messagebundle_hi.json +1 -1
  74. package/dist/generated/assets/i18n/messagebundle_hr.json +1 -1
  75. package/dist/generated/assets/i18n/messagebundle_hu.json +1 -1
  76. package/dist/generated/assets/i18n/messagebundle_id.json +1 -1
  77. package/dist/generated/assets/i18n/messagebundle_it.json +1 -1
  78. package/dist/generated/assets/i18n/messagebundle_iw.json +1 -1
  79. package/dist/generated/assets/i18n/messagebundle_ja.json +1 -1
  80. package/dist/generated/assets/i18n/messagebundle_kk.json +1 -1
  81. package/dist/generated/assets/i18n/messagebundle_ko.json +1 -1
  82. package/dist/generated/assets/i18n/messagebundle_lt.json +1 -1
  83. package/dist/generated/assets/i18n/messagebundle_lv.json +1 -1
  84. package/dist/generated/assets/i18n/messagebundle_mk.json +1 -1
  85. package/dist/generated/assets/i18n/messagebundle_ms.json +1 -1
  86. package/dist/generated/assets/i18n/messagebundle_nl.json +1 -1
  87. package/dist/generated/assets/i18n/messagebundle_no.json +1 -1
  88. package/dist/generated/assets/i18n/messagebundle_pl.json +1 -1
  89. package/dist/generated/assets/i18n/messagebundle_pt.json +1 -1
  90. package/dist/generated/assets/i18n/messagebundle_pt_PT.json +1 -1
  91. package/dist/generated/assets/i18n/messagebundle_ro.json +1 -1
  92. package/dist/generated/assets/i18n/messagebundle_ru.json +1 -1
  93. package/dist/generated/assets/i18n/messagebundle_sh.json +1 -1
  94. package/dist/generated/assets/i18n/messagebundle_sk.json +1 -1
  95. package/dist/generated/assets/i18n/messagebundle_sl.json +1 -1
  96. package/dist/generated/assets/i18n/messagebundle_sr.json +1 -1
  97. package/dist/generated/assets/i18n/messagebundle_sv.json +1 -1
  98. package/dist/generated/assets/i18n/messagebundle_th.json +1 -1
  99. package/dist/generated/assets/i18n/messagebundle_tr.json +1 -1
  100. package/dist/generated/assets/i18n/messagebundle_uk.json +1 -1
  101. package/dist/generated/assets/i18n/messagebundle_vi.json +1 -1
  102. package/dist/generated/assets/i18n/messagebundle_zh_CN.json +1 -1
  103. package/dist/generated/assets/i18n/messagebundle_zh_TW.json +1 -1
  104. package/dist/generated/i18n/i18n-defaults.d.ts +2 -1
  105. package/dist/generated/i18n/i18n-defaults.js +2 -1
  106. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  107. package/dist/generated/themes/ShellBar.css.d.ts +1 -1
  108. package/dist/generated/themes/ShellBar.css.js +1 -1
  109. package/dist/generated/themes/ShellBar.css.js.map +1 -1
  110. package/dist/generated/themes/ShellBarItem.css.d.ts +2 -0
  111. package/dist/generated/themes/ShellBarItem.css.js +8 -0
  112. package/dist/generated/themes/ShellBarItem.css.js.map +1 -0
  113. package/dist/generated/themes/ShellBarLegacy.css.d.ts +2 -0
  114. package/dist/generated/themes/ShellBarLegacy.css.js +8 -0
  115. package/dist/generated/themes/ShellBarLegacy.css.js.map +1 -0
  116. package/dist/generated/themes/ShellBarSearchLegacy.css.d.ts +2 -0
  117. package/dist/generated/themes/ShellBarSearchLegacy.css.js +8 -0
  118. package/dist/generated/themes/ShellBarSearchLegacy.css.js.map +1 -0
  119. package/dist/shellbar/IShellBarSearchController.d.ts +28 -0
  120. package/dist/shellbar/IShellBarSearchController.js +2 -0
  121. package/dist/shellbar/IShellBarSearchController.js.map +1 -0
  122. package/dist/shellbar/ShellBarAccessibility.d.ts +42 -0
  123. package/dist/shellbar/ShellBarAccessibility.js +50 -0
  124. package/dist/shellbar/ShellBarAccessibility.js.map +1 -0
  125. package/dist/shellbar/ShellBarItemNavigation.d.ts +18 -0
  126. package/dist/shellbar/ShellBarItemNavigation.js +86 -0
  127. package/dist/shellbar/ShellBarItemNavigation.js.map +1 -0
  128. package/dist/shellbar/ShellBarLegacy.d.ts +46 -0
  129. package/dist/shellbar/ShellBarLegacy.js +138 -0
  130. package/dist/shellbar/ShellBarLegacy.js.map +1 -0
  131. package/dist/shellbar/ShellBarOverflow.d.ts +51 -0
  132. package/dist/shellbar/ShellBarOverflow.js +159 -0
  133. package/dist/shellbar/ShellBarOverflow.js.map +1 -0
  134. package/dist/shellbar/ShellBarSearch.d.ts +59 -0
  135. package/dist/shellbar/ShellBarSearch.js +145 -0
  136. package/dist/shellbar/ShellBarSearch.js.map +1 -0
  137. package/dist/shellbar/ShellBarSearchLegacy.d.ts +65 -0
  138. package/dist/shellbar/ShellBarSearchLegacy.js +116 -0
  139. package/dist/shellbar/ShellBarSearchLegacy.js.map +1 -0
  140. package/dist/shellbar/templates/ShellBarLegacyTemplate.d.ts +20 -0
  141. package/dist/shellbar/templates/ShellBarLegacyTemplate.js +71 -0
  142. package/dist/shellbar/templates/ShellBarLegacyTemplate.js.map +1 -0
  143. package/dist/shellbar/templates/ShellBarSearchLegacyTemplate.d.ts +5 -0
  144. package/dist/shellbar/templates/ShellBarSearchLegacyTemplate.js +18 -0
  145. package/dist/shellbar/templates/ShellBarSearchLegacyTemplate.js.map +1 -0
  146. package/dist/shellbar/templates/ShellBarSearchTemplate.d.ts +4 -0
  147. package/dist/shellbar/templates/ShellBarSearchTemplate.js +17 -0
  148. package/dist/shellbar/templates/ShellBarSearchTemplate.js.map +1 -0
  149. package/dist/vscode.html-custom-data.json +29 -79
  150. package/dist/web-types.json +75 -239
  151. package/package.json +8 -8
  152. package/src/ShellBarItemTemplate.tsx +36 -0
  153. package/src/ShellBarTemplate.tsx +222 -300
  154. package/src/UserMenuTemplate.tsx +11 -3
  155. package/src/i18n/messagebundle.properties +3 -0
  156. package/src/i18n/messagebundle_ar.properties +2 -0
  157. package/src/i18n/messagebundle_bg.properties +6 -4
  158. package/src/i18n/messagebundle_ca.properties +2 -0
  159. package/src/i18n/messagebundle_cnr.properties +2 -0
  160. package/src/i18n/messagebundle_cs.properties +2 -0
  161. package/src/i18n/messagebundle_cy.properties +2 -0
  162. package/src/i18n/messagebundle_da.properties +2 -0
  163. package/src/i18n/messagebundle_de.properties +2 -0
  164. package/src/i18n/messagebundle_el.properties +2 -0
  165. package/src/i18n/messagebundle_en.properties +2 -0
  166. package/src/i18n/messagebundle_en_GB.properties +2 -0
  167. package/src/i18n/messagebundle_en_US_sappsd.properties +2 -0
  168. package/src/i18n/messagebundle_en_US_saprigi.properties +2 -0
  169. package/src/i18n/messagebundle_en_US_saptrc.properties +2 -0
  170. package/src/i18n/messagebundle_es.properties +2 -0
  171. package/src/i18n/messagebundle_es_MX.properties +2 -0
  172. package/src/i18n/messagebundle_et.properties +2 -0
  173. package/src/i18n/messagebundle_fi.properties +2 -0
  174. package/src/i18n/messagebundle_fr.properties +2 -0
  175. package/src/i18n/messagebundle_fr_CA.properties +2 -0
  176. package/src/i18n/messagebundle_hi.properties +2 -0
  177. package/src/i18n/messagebundle_hr.properties +2 -0
  178. package/src/i18n/messagebundle_hu.properties +2 -0
  179. package/src/i18n/messagebundle_id.properties +3 -1
  180. package/src/i18n/messagebundle_it.properties +2 -0
  181. package/src/i18n/messagebundle_iw.properties +2 -0
  182. package/src/i18n/messagebundle_ja.properties +2 -0
  183. package/src/i18n/messagebundle_kk.properties +2 -0
  184. package/src/i18n/messagebundle_ko.properties +2 -0
  185. package/src/i18n/messagebundle_lt.properties +2 -0
  186. package/src/i18n/messagebundle_lv.properties +2 -0
  187. package/src/i18n/messagebundle_mk.properties +2 -0
  188. package/src/i18n/messagebundle_ms.properties +2 -0
  189. package/src/i18n/messagebundle_nl.properties +2 -0
  190. package/src/i18n/messagebundle_no.properties +2 -0
  191. package/src/i18n/messagebundle_pl.properties +2 -0
  192. package/src/i18n/messagebundle_pt.properties +2 -0
  193. package/src/i18n/messagebundle_pt_PT.properties +2 -0
  194. package/src/i18n/messagebundle_ro.properties +2 -0
  195. package/src/i18n/messagebundle_ru.properties +2 -0
  196. package/src/i18n/messagebundle_sh.properties +2 -0
  197. package/src/i18n/messagebundle_sk.properties +2 -0
  198. package/src/i18n/messagebundle_sl.properties +2 -0
  199. package/src/i18n/messagebundle_sr.properties +2 -0
  200. package/src/i18n/messagebundle_sv.properties +2 -0
  201. package/src/i18n/messagebundle_th.properties +2 -0
  202. package/src/i18n/messagebundle_tr.properties +2 -0
  203. package/src/i18n/messagebundle_uk.properties +2 -0
  204. package/src/i18n/messagebundle_vi.properties +2 -0
  205. package/src/i18n/messagebundle_zh_CN.properties +2 -0
  206. package/src/i18n/messagebundle_zh_TW.properties +2 -0
  207. package/src/shellbar/templates/ShellBarLegacyTemplate.tsx +190 -0
  208. package/src/shellbar/templates/ShellBarSearchLegacyTemplate.tsx +61 -0
  209. package/src/shellbar/templates/ShellBarSearchTemplate.tsx +40 -0
  210. package/src/themes/NavigationLayout.css +1 -0
  211. package/src/themes/ShellBar.css +189 -372
  212. package/src/themes/ShellBarItem.css +43 -0
  213. package/src/themes/ShellBarLegacy.css +174 -0
  214. package/src/themes/ShellBarSearchLegacy.css +44 -0
  215. package/dist/ShellBarPopoverTemplate.d.ts +0 -2
  216. package/dist/ShellBarPopoverTemplate.js +0 -9
  217. package/dist/ShellBarPopoverTemplate.js.map +0 -1
  218. package/src/ShellBarPopoverTemplate.tsx +0 -50
@@ -1,337 +1,259 @@
1
- import Icon from "@ui5/webcomponents/dist/Icon.js";
2
1
  import Button from "@ui5/webcomponents/dist/Button.js";
3
- import type ShellBar from "./ShellBar.js";
4
- import ShellBarPopoverTemplate from "./ShellBarPopoverTemplate.js";
5
- import slimArrowDown from "@ui5/webcomponents-icons/dist/slim-arrow-down.js";
6
2
  import ButtonBadge from "@ui5/webcomponents/dist/ButtonBadge.js";
3
+ import Popover from "@ui5/webcomponents/dist/Popover.js";
4
+ import List from "@ui5/webcomponents/dist/List.js";
5
+ import type ShellBar from "./ShellBar.js";
6
+ import ShellBarItem from "./ShellBarItem.js";
7
+
8
+ import {
9
+ ShellBarSearchField,
10
+ ShellBarSearchFieldFullWidth
11
+ } from "./shellbar/templates/ShellBarSearchTemplate.js";
12
+
13
+ import {
14
+ ShellBarSearchField as ShellBarSearchFieldLegacy,
15
+ ShellBarSearchButton as ShellBarSearchButtonLegacy,
16
+ ShellBarSearchFieldFullWidth as ShellBarSearchFieldFullWidthLegacy,
17
+ } from "./shellbar/templates/ShellBarSearchLegacyTemplate.js";
18
+
19
+ import {
20
+ ShellBarLegacyBrandingArea,
21
+ } from "./shellbar/templates/ShellBarLegacyTemplate.js";
7
22
 
8
23
  export default function ShellBarTemplate(this: ShellBar) {
24
+ const isLegacySearch = !this.isSelfCollapsibleSearch;
25
+
26
+ const SearchInBarTemplate = isLegacySearch ? ShellBarSearchFieldLegacy : ShellBarSearchField;
27
+ const SearchFullWidthTemplate = isLegacySearch ? ShellBarSearchFieldFullWidthLegacy : ShellBarSearchFieldFullWidth;
28
+
29
+ const profileAction = this.getAction("profile");
30
+ const overflowAction = this.getAction("overflow");
31
+ const assistantAction = this.getAction("assistant");
32
+ const notificationsAction = this.getAction("notifications");
33
+ const productSwitchAction = this.getAction("products");
34
+
35
+ const actionsAccInfo = this.actionsAccessibilityInfo;
36
+
9
37
  return (
10
38
  <>
11
- <header
12
- class={this.classes.wrapper}
13
- aria-label={this._shellbarText}
14
- onKeyDown={this._onKeyDown}
15
- part="root">
16
- <div class="ui5-shellbar-overflow-container ui5-shellbar-overflow-container-left">
17
- {this.startButton.length > 0 && <slot name="startButton"></slot>}
39
+ <header class="ui5-shellbar-root" part="root" onKeyDown={this._onKeyDown} aria-label={this.texts.shellbar}>
40
+ {/* Full-width search overlay */}
41
+ {this.showFullWidthSearch && SearchFullWidthTemplate.call(this)}
18
42
 
19
- {this.hasBranding && (
43
+ {this.enabledFeatures.startButton && (
44
+ <div class="ui5-shellbar-start-button ui5-shellbar-gap-end">
45
+ <slot name="startButton"></slot>
46
+ </div>
47
+ )}
48
+
49
+ {this.enabledFeatures.branding && (
50
+ <div class="ui5-shellbar-branding-area">
20
51
  <slot name="branding"></slot>
21
- )}
52
+ </div>
53
+ )}
22
54
 
23
- {this.hasMenuItems && !this.hasBranding && (
24
- <>
25
- {!this.showLogoInMenuButton && this.hasLogo && singleLogo.call(this)}
26
- {this.showTitleInMenuButton && <h1 class="ui5-hidden-text">{this.primaryTitle}</h1>}
27
- {this.showMenuButton && (
28
- <>
29
- <button
30
- class={{
31
- "ui5-shellbar-menu-button": true,
32
- ...this.classes.button,
33
- }}
34
- onClick={this._headerPress}
35
- aria-haspopup="menu"
36
- aria-expanded={this._menuPopoverExpanded}
37
- aria-label={this._brandingText}
38
- data-ui5-stable="menu"
39
- tabIndex={0}>
40
- {this.showLogoInMenuButton && (
41
- <span class="ui5-shellbar-logo" aria-label={this._logoText} title={this._logoText}>
42
- <slot name="logo"></slot>
43
- </span>
44
- )}
45
- {this.showTitleInMenuButton && (
46
- <div class="ui5-shellbar-menu-button-title">{this.primaryTitle}</div>
47
- )}
48
- <Icon class="ui5-shellbar-menu-button-arrow" name={slimArrowDown} />
49
- </button>
50
- </>
51
- )}
52
- </>
53
- )}
55
+ {/* Legacy branding (logo + primaryTitle) when no menu items */}
56
+ {!this.enabledFeatures.branding && ShellBarLegacyBrandingArea.call(this)}
54
57
 
55
- {this.hasMenuItems && (
56
- // The secondary title remains visible when both menu items and the branding slot are present,
57
- // as the branding slot has higher priority and takes precedence in visibility.
58
- <>
59
- {this.secondaryTitle && !this.isSBreakPoint && (
60
- <div style={{ display: "block" }} class="ui5-shellbar-secondary-title" data-ui5-stable="secondary-title">
61
- {this.secondaryTitle}
62
- </div>
63
- )}
64
- </>
65
- )}
58
+ <div class="ui5-shellbar-overflow-container">
59
+ <div class="ui5-shellbar-overflow-container-inner">
66
60
 
67
- {!this.hasMenuItems && (
68
- <>
69
- {this.isSBreakPoint && this.hasLogo && !this.hasBranding && singleLogo.call(this)}
70
- {!this.isSBreakPoint && (this.hasLogo || this.primaryTitle) && (
71
- <>
72
- {!this.hasBranding && combinedLogo.call(this)}
73
- {this.secondaryTitle && (this.primaryTitle || this.hasBranding) && (
74
- <h2 class="ui5-shellbar-secondary-title" data-ui5-stable="secondary-title">
75
- {this.secondaryTitle}
76
- </h2>
77
- )}
78
- </>
79
- )}
80
- </>
81
- )}
82
- </div>
83
- {this.hasMidContent && (
84
- <div class="ui5-shellbar-overflow-container ui5-shellbar-mid-content">
85
- <slot name="midContent"></slot>
86
- </div>
87
- )}
88
- <div class="ui5-shellbar-overflow-container ui5-shellbar-overflow-container-right">
89
- <div class="ui5-shellbar-overflow-container-right-inner">
90
- {this.hasContentItems && (
61
+ {this.enabledFeatures.content && (
91
62
  <div
92
- class="ui5-shellbar-content-items"
93
- role={this._contentItemsRole}
94
- aria-label={this._contentItemsText}
63
+ class="ui5-shellbar-content-area ui5-shellbar-content-items"
64
+ role={this.contentRole}
65
+ aria-label={this.texts.contentItems}
95
66
  >
96
- {this.showStartSeparator && (
97
- <div class={{
98
- "ui5-shellbar-separator": true,
99
- "ui5-shellbar-separator-start": true,
100
- }}></div>
67
+ {/* Start separator */}
68
+ {this.separatorConfig.showStartSeparator && (
69
+ <div class="ui5-shellbar-separator ui5-shellbar-separator-start"></div>
101
70
  )}
71
+
72
+ {/* Start content items */}
102
73
  {this.startContent.map(item => {
103
- const itemInfo = this._contentInfo.find(info => info.id === (item as any)._individualSlot);
74
+ const itemId = (item as any)._individualSlot as string;
75
+ const packedSep = this.getPackedSeparatorInfo(item, true);
104
76
  return (
105
- <div key={(item as any)._individualSlot} id={(item as any)._individualSlot} class={itemInfo?.classes}>
106
- {this.shouldIncludeSeparator(itemInfo, this.startContentInfoSorted) && (
107
- // never displayed, only "packed" with last item that was hidden, used for measurement purposes
108
- <div class={{
109
- "ui5-shellbar-separator": true,
110
- "ui5-shellbar-separator-start": true,
111
- }}></div>
77
+ <div
78
+ key={itemId}
79
+ id={itemId}
80
+ class={{
81
+ "ui5-shellbar-content-item ui5-shellbar-gap-start": true,
82
+ "ui5-shellbar-hidden": this.isHidden(itemId),
83
+ }}
84
+ >
85
+ {packedSep.shouldPack && (
86
+ <div class="ui5-shellbar-separator ui5-shellbar-separator-start"></div>
112
87
  )}
113
88
  <slot name={(item as any)._individualSlot}></slot>
114
89
  </div>
115
90
  );
116
91
  })}
92
+
93
+ {/* Spacer: Grows to fill available space, used to measure if space is tight, should be in DOM always */}
117
94
  <div class="ui5-shellbar-spacer"></div>
95
+
96
+ {/* End content items */}
118
97
  {this.endContent.map(item => {
119
- const itemInfo = this._contentInfo.find(info => info.id === (item as any)._individualSlot);
98
+ const itemId = (item as any)._individualSlot as string;
99
+ const packedSep = this.getPackedSeparatorInfo(item, false);
120
100
  return (
121
- <div key={(item as any)._individualSlot} id={(item as any)._individualSlot} class={itemInfo?.classes}>
122
- <slot name={(item as any)._individualSlot}></slot>
123
- {this.shouldIncludeSeparator(itemInfo, this.endContentInfoSorted) && (
124
- // never displayed, only "packed" with last item that was hidden, used for measurement purposes
125
- <div class={{
126
- "ui5-shellbar-separator": true,
127
- "ui5-shellbar-separator-end": true,
128
- }}></div>
101
+ <div
102
+ key={itemId}
103
+ id={itemId}
104
+ class={{
105
+ "ui5-shellbar-content-item ui5-shellbar-gap-start": true,
106
+ "ui5-shellbar-hidden": this.isHidden(itemId),
107
+ }}
108
+ >
109
+ <slot name={itemId}></slot>
110
+ {packedSep.shouldPack && (
111
+ <div class="ui5-shellbar-separator ui5-shellbar-separator-end ui5-shellbar-gap-start"></div>
129
112
  )}
130
113
  </div>
131
114
  );
132
115
  })}
133
- {this.showEndSeparator && (
134
- <div class={{
135
- "ui5-shellbar-separator": true,
136
- "ui5-shellbar-separator-end": true,
137
- }}></div>
116
+
117
+ {/* End separator */}
118
+ {this.separatorConfig.showEndSeparator && (
119
+ <div class="ui5-shellbar-separator ui5-shellbar-separator-end ui5-shellbar-gap-start"></div>
138
120
  )}
139
121
  </div>
140
122
  )}
141
- {!this.hasContentItems && <div class="ui5-shellbar-spacer"></div>}
142
- <div class="ui5-shellbar-overflow-container-right-child" role={this._rightChildRole}>
143
- {this.hasSearchField && (
144
- <>
145
- {this.showFullWidthSearch && (
146
- <div class="ui5-shellbar-search-full-width-wrapper" style={this.styles.searchField}>
147
- <div class="ui5-shellbar-search-full-field">
148
- <slot name="searchField"></slot>
149
- </div>
150
- <Button
151
- onClick={this._handleCancelButtonPress}
152
- class="ui5-shellbar-button ui5-shellbar-cancel-button"
153
- data-ui5-stable="cancel-search">
154
- {this._cancelBtnText}
155
- </Button>
156
- </div>
157
- )}
158
- <div id={this.hasSelfCollapsibleSearch ? `${this._id}-item-1` : undefined} class={this.classes.searchField} style={this.styles.searchField}>
159
- <slot name="searchField"></slot>
160
- </div>
161
- {!(this.hasSelfCollapsibleSearch || this.hideSearchButton) && (
162
- <Button
163
- id={`${this._id}-item-1`}
164
- class={{
165
- "ui5-shellbar-button": true,
166
- "ui5-shellbar-search-button": true,
167
- "ui5-shellbar-search-item-for-arrow-nav": true,
168
- ...this.classes.search,
169
- }}
170
- icon="sap-icon://search"
171
- data-ui5-text="Search"
172
- data-ui5-notifications-count={this.notificationsCount}
173
- data-ui5-stable="toggle-search"
174
- onClick={this._handleSearchIconPress}
175
- tooltip={this._searchBtnOpen}
176
- aria-label={this._searchBtnOpen}
177
- aria-expanded={this.showSearchField}
178
- accessibilityAttributes={this.accInfo.search.accessibilityAttributes}
179
- />
180
- )}
181
- </>
182
- )}
183
- {this.hasAssistant && (
184
- <div id={`${this._id}-assistant`} class={this.classes.assistant}>
185
- <slot name="assistant"></slot>
186
- </div>
187
- )}
188
- {this.showNotifications && (
189
- <Button
190
- id={`${this._id}-item-2`}
191
- class={{
192
- "ui5-shellbar-button": true,
193
- "ui5-shellbar-bell-button": true,
194
- "ui5-shellbar-items-for-arrow-nav": true,
195
- ...this.classes.notification,
196
- }}
197
- icon="sap-icon://bell"
198
- data-ui5-text="Notifications"
199
- onClick={this._handleNotificationsPress}
200
- tooltip={this._notificationsText}
201
- accessibilityAttributes={this.accInfo.notifications.accessibilityAttributes}
202
- data-ui5-stable="notifications"
203
- >
204
- {this.notificationsCount && (
205
- <ButtonBadge slot="badge" design="OverlayText" text={this.notificationsCount} />
206
- )}
207
- </Button>
208
- )}
209
- {this.customItemsInfo.map(item => (
210
- <Button
211
- key={item.id}
212
- id={item.id}
213
- class={`${item.classes} ui5-shellbar-items-for-arrow-nav`}
214
- icon={item.icon}
215
- tooltip={item.tooltip}
216
- data-ui5-notifications-count={this.notificationsCount}
217
- data-ui5-external-action-item-id={item.refItemid}
218
- data-ui5-stable={item.icon && !this.isIconHidden(item.icon) ? item.stableDomRef : undefined}
219
- onClick={item.press}
220
- accessibilityAttributes={item.accessibilityAttributes}
221
- >
222
- {item.count && (
223
- <ButtonBadge slot="badge" design="OverlayText" text={item.count} />
224
- )}
225
- </Button>
226
- ))}
227
- </div>
228
- </div>
229
- </div>
230
- <Button
231
- id={`${this._id}-item-5`}
232
- class={{
233
- "ui5-shellbar-button": true,
234
- "ui5-shellbar-overflow-button": true,
235
- "ui5-shellbar-items-for-arrow-nav": true,
236
- ...this.classes.overflow,
237
- }}
238
- icon="sap-icon://overflow"
239
- onClick={this._handleOverflowPress}
240
- tooltip={this._overflowText}
241
- accessibilityAttributes={this.accInfo.overflow.accessibilityAttributes}
242
- data-ui5-stable="overflow"
243
- >
244
- {this._overflowNotifications && (
245
- <ButtonBadge
246
- slot="badge"
247
- design={this._overflowNotifications === " " ? "AttentionDot" : "OverlayText"}
248
- text={this._overflowNotifications === " " ? "" : this._overflowNotifications}
249
- />
250
- )}
251
- </Button>
252
123
 
253
- {this.hasProfile && profileButton.call(this)}
254
- {this.showProductSwitch && (
255
- <Button
256
- id={`${this._id}-item-4`}
257
- class="ui5-shellbar-no-overflow-button ui5-shellbar-button ui5-shellbar-button-product-switch ui5-shellbar-items-for-arrow-nav"
258
- icon="sap-icon://grid"
259
- data-ui5-text="Product Switch"
260
- onClick={this._handleProductSwitchPress}
261
- tooltip={this._productsText}
262
- aria-label={this._productSwitchBtnText}
263
- aria-haspopup="dialog"
264
- aria-expanded={this.accInfo.products.accessibilityAttributes.expanded}
265
- accessibilityAttributes={this.accInfo.products.accessibilityAttributes}
266
- data-ui5-stable="product-switch"
267
- />
268
- )}
269
- </header>
270
- {ShellBarPopoverTemplate.call(this)}
271
- </>
272
- );
273
- }
124
+ {this.enabledFeatures.search && SearchInBarTemplate.call(this)}
125
+ {this.enabledFeatures.search && isLegacySearch && ShellBarSearchButtonLegacy.call(this)}
274
126
 
275
- function profileButton(this: ShellBar) {
276
- return (
277
- <Button
278
- data-profile-btn
279
- id={`${this._id}-item-3`}
280
- onClick={this._handleProfilePress}
281
- tooltip={this._profileText}
282
- class="ui5-shellbar-button ui5-shellbar-image-button ui5-shellbar-no-overflow-button ui5-shellbar-items-for-arrow-nav"
283
- aria-label={this.imageBtnText}
284
- aria-haspopup="dialog"
285
- accessibilityAttributes={this.accInfo.profile.accessibilityAttributes}
286
- data-ui5-stable="profile"
287
- >
288
- <slot name="profile"></slot>
289
- </Button>
290
- );
291
- }
127
+ {assistantAction && (
128
+ <div class={{
129
+ "ui5-shellbar-assistant-button ui5-shellbar-gap-start": true,
130
+ "ui5-shellbar-hidden": this.isHidden("assistant")
131
+ }}>
132
+ <slot name="assistant"></slot>
133
+ </div>
134
+ )}
292
135
 
293
- function singleLogo(this: ShellBar) {
294
- return (
295
- <span
296
- role={this.accLogoRole}
297
- class="ui5-shellbar-logo"
298
- aria-label={this._logoText}
299
- title={this._logoText}
300
- onClick={this._logoPress}
301
- onKeyDown={this._logoKeydown}
302
- onKeyUp={this._logoKeyup}
303
- tabIndex={0}
304
- data-ui5-stable="logo">
305
- <slot name="logo"></slot>
306
- </span>
307
- );
308
- }
136
+ {notificationsAction && (
137
+ <Button
138
+ data-ui5-stable={notificationsAction.stableDomRef}
139
+ class={{
140
+ "ui5-shellbar-bell-button ui5-shellbar-action-button ui5-shellbar-gap-start": true,
141
+ "ui5-shellbar-hidden": this.isHidden("notifications")
142
+ }}
143
+ icon={notificationsAction.icon}
144
+ design="Transparent"
145
+ onClick={this.handleNotificationsClick}
146
+ tooltip={actionsAccInfo.notifications.title}
147
+ accessibilityAttributes={actionsAccInfo.notifications.accessibilityAttributes}
148
+ >
149
+ {notificationsAction?.count && (
150
+ <ButtonBadge slot="badge" design="OverlayText" text={notificationsAction?.count} />
151
+ )}
152
+ </Button>
153
+ )}
309
154
 
310
- function combinedLogo(this: ShellBar) {
311
- return (
312
- <div
313
- role={this.accLogoRole}
314
- class="ui5-shellbar-logo-area"
315
- onClick={this._logoPress}
316
- tabIndex={0}
317
- onKeyDown={this._logoKeydown}
318
- onKeyUp={this._logoKeyup}
319
- aria-label={this.accessibilityAttributes.branding?.name || this._logoAreaText}>
320
- {this.hasLogo && (
321
- <span
322
- class="ui5-shellbar-logo"
323
- title={this._logoText}
324
- data-ui5-stable="logo">
325
- <slot name="logo"></slot>
326
- </span>
327
- )}
328
- <div class="ui5-shellbar-headings">
329
- {this.primaryTitle && (
330
- <h1 class="ui5-shellbar-title">
331
- <bdi>{this.primaryTitle}</bdi>
332
- </h1>
333
- )}
334
- </div>
335
- </div>
155
+ {/* Custom Items */}
156
+ {this.sortItems(this.items).map(item => (
157
+ <div
158
+ key={item._id}
159
+ class={{
160
+ "ui5-shellbar-custom-item ui5-shellbar-gap-start": true,
161
+ "ui5-shellbar-hidden": this.isHidden(item._id),
162
+ }}
163
+ data-ui5-stable={item.stableDomRef}
164
+ >
165
+ {!item.inOverflow ? <slot name={(item as any)._individualSlot}></slot> : null}
166
+ </div>
167
+ ))}
168
+
169
+ {overflowAction && (
170
+ <Button
171
+ data-ui5-stable={overflowAction.stableDomRef}
172
+ id="ui5-shellbar-overflow-button"
173
+ class={{
174
+ "ui5-shellbar-overflow-button ui5-shellbar-action-button ui5-shellbar-gap-start": true,
175
+ "ui5-shellbar-hidden": this.isHidden("overflow")
176
+ }}
177
+ icon={overflowAction.icon}
178
+ design="Transparent"
179
+ onClick={this.handleOverflowClick}
180
+ tooltip={actionsAccInfo.overflow.title}
181
+ accessibilityAttributes={actionsAccInfo.overflow.accessibilityAttributes}
182
+ >
183
+ {this.overflowBadge && (
184
+ <ButtonBadge
185
+ slot="badge"
186
+ design={this.overflowBadge === " " ? "AttentionDot" : "OverlayText"}
187
+ text={this.overflowBadge === " " ? "" : this.overflowBadge}
188
+ />
189
+ )}
190
+ </Button>
191
+ )}
192
+
193
+ {profileAction && (
194
+ <Button
195
+ data-profile-btn
196
+ data-ui5-stable={profileAction.stableDomRef}
197
+ class={{
198
+ "ui5-shellbar-image-button ui5-shellbar-action-button ui5-shellbar-gap-start": true,
199
+ "ui5-shellbar-hidden": this.isHidden("profile")
200
+ }}
201
+ design="Transparent"
202
+ onClick={this.handleProfileClick}
203
+ tooltip={actionsAccInfo.profile.title}
204
+ accessibilityAttributes={actionsAccInfo.profile.accessibilityAttributes}
205
+ >
206
+ <slot name="profile"></slot>
207
+ </Button>
208
+ )}
209
+
210
+ {productSwitchAction && (
211
+ <Button
212
+ data-ui5-stable={productSwitchAction.stableDomRef}
213
+ class={{
214
+ "ui5-shellbar-button-product-switch ui5-shellbar-action-button ui5-shellbar-gap-start": true,
215
+ "ui5-shellbar-hidden": this.isHidden("products")
216
+ }}
217
+ icon={productSwitchAction.icon}
218
+ design="Transparent"
219
+ onClick={this.handleProductSwitchClick}
220
+ tooltip={actionsAccInfo.products.title}
221
+ accessibilityAttributes={actionsAccInfo.products.accessibilityAttributes}
222
+ ></Button>
223
+ )}
224
+ </div>
225
+ </div>
226
+ </header>
227
+
228
+ {/* Overflow Popover */}
229
+ <Popover
230
+ class="ui5-shellbar-overflow-popover"
231
+ open={this.overflowPopoverOpen}
232
+ onClose={this.onPopoverClose}
233
+ opener="ui5-shellbar-overflow-button"
234
+ placement="Bottom"
235
+ hideArrow={true}
236
+ horizontalAlign={this.popoverHorizontalAlign} // TODO: add test
237
+ >
238
+ <List separators="None" onClick={this.handleOverflowItemClick}>
239
+ {this.overflowItems.map(item => {
240
+ if (item.type === "action") {
241
+ const actionData = item.data;
242
+ return (
243
+ <ShellBarItem
244
+ key={item.id}
245
+ icon={actionData.icon ? `sap-icon://${actionData.icon}` : ""}
246
+ data-action-id={item.id}
247
+ count={actionData.count}
248
+ inOverflow={true}
249
+ text={this.getActionOverflowText(item.id)}
250
+ />
251
+ );
252
+ }
253
+ return <slot key={item.id} name={item.data._individualSlot}></slot>;
254
+ })}
255
+ </List>
256
+ </Popover>
257
+ </>
336
258
  );
337
259
  }
@@ -84,9 +84,17 @@ export default function UserMenuTemplate(this: UserMenu) {
84
84
  </List>
85
85
  }
86
86
 
87
- <div slot="footer" class="ui5-user-menu-footer">
88
- <Button class="ui5-user-menu-sign-out-btn" design="Transparent" icon={log} onClick={this._handleSignOutClick}>{this._signOutButtonText}</Button>
89
- </div>
87
+ {this._hasCustomFooter &&
88
+ <div slot="footer" class="ui5-user-menu-footer">
89
+ <slot name="footer"></slot>
90
+ </div>
91
+ }
92
+
93
+ {this._showDefaultFooter &&
94
+ <div slot="footer" class="ui5-user-menu-footer">
95
+ <Button class="ui5-user-menu-sign-out-btn" design="Transparent" icon={log} onClick={this._handleSignOutClick}>{this._signOutButtonText}</Button>
96
+ </div>
97
+ }
90
98
  </ResponsivePopover>
91
99
  );
92
100
  }
@@ -206,6 +206,9 @@ SEARCH_ITEM_DELETE_BUTTON_TOOLTIP=Remove Suggestion
206
206
  #XACT: ARIA announcement for the more button
207
207
  SHELLBAR_OVERFLOW = More
208
208
 
209
+ #XACT: ARIA announcement for the assistant button
210
+ SHELLBAR_ASSISTANT=Assistant
211
+
209
212
  #XACT: ARIA announcement for the cancel button
210
213
  SHELLBAR_CANCEL = Cancel
211
214
 
@@ -71,6 +71,8 @@ NOTIFICATION_LIST_GROUP_EXPANDED=تم التوسيع
71
71
 
72
72
  TIMELINE_ARIA_LABEL=المخطط الزمني
73
73
 
74
+ TIMELINE_LOAD_MORE_BUTTON_TEXT=تحميل المزيد
75
+
74
76
  TIMELINE_ITEM_INFORMATION_STATE_TEXT=حالة المعلومات
75
77
  TIMELINE_ITEM_POSITIVE_STATE_TEXT=الحالة الإيجابية
76
78
  TIMELINE_ITEM_NEGATIVE_STATE_TEXT=الحالة السلبية
@@ -1,6 +1,6 @@
1
1
 
2
2
 
3
- BARCODE_SCANNER_DIALOG_CANCEL_BUTTON_TXT=Отмяна
3
+ BARCODE_SCANNER_DIALOG_CANCEL_BUTTON_TXT=Отказ
4
4
 
5
5
  BARCODE_SCANNER_DIALOG_LOADING_TXT=Зареждане
6
6
 
@@ -71,12 +71,14 @@ NOTIFICATION_LIST_GROUP_EXPANDED=Разгърнато
71
71
 
72
72
  TIMELINE_ARIA_LABEL=Времева линия
73
73
 
74
+ TIMELINE_LOAD_MORE_BUTTON_TEXT=Зареждане на още
75
+
74
76
  TIMELINE_ITEM_INFORMATION_STATE_TEXT=Състояние на информация
75
77
  TIMELINE_ITEM_POSITIVE_STATE_TEXT=Положително състояние
76
78
  TIMELINE_ITEM_NEGATIVE_STATE_TEXT=Отрицателно състояние
77
79
  TIMELINE_ITEM_CRITICAL_STATE_TEXT=Критично състояние
78
80
 
79
- UPLOADCOLLECTIONITEM_CANCELBUTTON_TEXT=Отмяна
81
+ UPLOADCOLLECTIONITEM_CANCELBUTTON_TEXT=Отказ
80
82
 
81
83
  UPLOADCOLLECTIONITEM_RENAMEBUTTON_TEXT=Преименуване
82
84
 
@@ -136,7 +138,7 @@ SEARCH_ITEM_DELETE_BUTTON_TOOLTIP=Премахване на предложени
136
138
 
137
139
  SHELLBAR_OVERFLOW=Още
138
140
 
139
- SHELLBAR_CANCEL=Отмяна
141
+ SHELLBAR_CANCEL=Отказ
140
142
 
141
143
  WIZARD_NAV_ARIA_LABEL=Лента за напредък на асистент
142
144
 
@@ -164,7 +166,7 @@ VSD_DIALOG_TITLE_SORT=Настройки на показването
164
166
 
165
167
  VSD_SUBMIT_BUTTON=ОК
166
168
 
167
- VSD_CANCEL_BUTTON=Отмяна
169
+ VSD_CANCEL_BUTTON=Отказ
168
170
 
169
171
  VSD_RESET_BUTTON=Нулиране
170
172
 
@@ -71,6 +71,8 @@ NOTIFICATION_LIST_GROUP_EXPANDED=Desplegat
71
71
 
72
72
  TIMELINE_ARIA_LABEL=Cronologia
73
73
 
74
+ TIMELINE_LOAD_MORE_BUTTON_TEXT=Carregar-ne més
75
+
74
76
  TIMELINE_ITEM_INFORMATION_STATE_TEXT=Estat d''informació
75
77
  TIMELINE_ITEM_POSITIVE_STATE_TEXT=Estat positiu
76
78
  TIMELINE_ITEM_NEGATIVE_STATE_TEXT=Estat negatiu
@@ -71,6 +71,8 @@ NOTIFICATION_LIST_GROUP_EXPANDED=Prošireno
71
71
 
72
72
  TIMELINE_ARIA_LABEL=Vremenska linija
73
73
 
74
+ TIMELINE_LOAD_MORE_BUTTON_TEXT=Učitaj još
75
+
74
76
  TIMELINE_ITEM_INFORMATION_STATE_TEXT=Informacije o stanju
75
77
  TIMELINE_ITEM_POSITIVE_STATE_TEXT=Pozitivno stanje
76
78
  TIMELINE_ITEM_NEGATIVE_STATE_TEXT=Negativno stanje
@@ -71,6 +71,8 @@ NOTIFICATION_LIST_GROUP_EXPANDED=Rozbaleno
71
71
 
72
72
  TIMELINE_ARIA_LABEL=Časová osa
73
73
 
74
+ TIMELINE_LOAD_MORE_BUTTON_TEXT=Načíst více
75
+
74
76
  TIMELINE_ITEM_INFORMATION_STATE_TEXT=Stav informací
75
77
  TIMELINE_ITEM_POSITIVE_STATE_TEXT=Pozitivní stav
76
78
  TIMELINE_ITEM_NEGATIVE_STATE_TEXT=Negativní stav