@sapudex/web-components 0.192.2 → 0.199.3

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 (258) hide show
  1. package/bundle.esm.js +2 -0
  2. package/dist/Button.d.ts +2 -1
  3. package/dist/Button.js +2 -1
  4. package/dist/Button.js.map +1 -1
  5. package/dist/ControlButton.d.ts +11 -6
  6. package/dist/ControlButton.js +19 -7
  7. package/dist/ControlButton.js.map +1 -1
  8. package/dist/CountrySelector.js +1 -1
  9. package/dist/CountrySelector.js.map +1 -1
  10. package/dist/Footer.d.ts +1 -6
  11. package/dist/Footer.js +2 -9
  12. package/dist/Footer.js.map +1 -1
  13. package/dist/Link.d.ts +5 -0
  14. package/dist/Link.js +6 -0
  15. package/dist/Link.js.map +1 -1
  16. package/dist/List.d.ts +3 -2
  17. package/dist/List.js +10 -5
  18. package/dist/List.js.map +1 -1
  19. package/dist/ListGroupHeader.d.ts +1 -1
  20. package/dist/ListGroupHeader.js +2 -1
  21. package/dist/ListGroupHeader.js.map +1 -1
  22. package/dist/ListGroupHeaderBase.js +3 -3
  23. package/dist/ListGroupHeaderBase.js.map +1 -1
  24. package/dist/ListItem.d.ts +1 -1
  25. package/dist/ListItem.js +8 -7
  26. package/dist/ListItem.js.map +1 -1
  27. package/dist/ListItemBase.d.ts +1 -1
  28. package/dist/ListItemBase.js +1 -1
  29. package/dist/ListItemBase.js.map +1 -1
  30. package/dist/ListSelectAll.js +4 -5
  31. package/dist/ListSelectAll.js.map +1 -1
  32. package/dist/MastheadItem.d.ts +1 -6
  33. package/dist/MastheadItem.js +3 -9
  34. package/dist/MastheadItem.js.map +1 -1
  35. package/dist/MastheadMenuItem.d.ts +8 -5
  36. package/dist/MastheadMenuItem.js +9 -7
  37. package/dist/MastheadMenuItem.js.map +1 -1
  38. package/dist/MastheadShell.js +2 -2
  39. package/dist/MastheadShell.js.map +1 -1
  40. package/dist/MediaPlayer.js +3 -2
  41. package/dist/MediaPlayer.js.map +1 -1
  42. package/dist/MessageStrip.d.ts +9 -38
  43. package/dist/MessageStrip.js +30 -56
  44. package/dist/MessageStrip.js.map +1 -1
  45. package/dist/PhoneNumberField.js +7 -2
  46. package/dist/PhoneNumberField.js.map +1 -1
  47. package/dist/Search.js +1 -0
  48. package/dist/Search.js.map +1 -1
  49. package/dist/SecondaryNavigation.d.ts +0 -1
  50. package/dist/SecondaryNavigation.js +3 -3
  51. package/dist/SecondaryNavigation.js.map +1 -1
  52. package/dist/SecondaryNavigationItemBase.d.ts +1 -6
  53. package/dist/SecondaryNavigationItemBase.js +3 -9
  54. package/dist/SecondaryNavigationItemBase.js.map +1 -1
  55. package/dist/SegmentedButton.d.ts +2 -2
  56. package/dist/SegmentedButton.js +3 -2
  57. package/dist/SegmentedButton.js.map +1 -1
  58. package/dist/SegmentedButtonItem.d.ts +2 -6
  59. package/dist/SegmentedButtonItem.js +2 -7
  60. package/dist/SegmentedButtonItem.js.map +1 -1
  61. package/dist/SelectBox.d.ts +9 -1
  62. package/dist/SelectBox.js +14 -1
  63. package/dist/SelectBox.js.map +1 -1
  64. package/dist/Tab.d.ts +1 -6
  65. package/dist/Tab.js +1 -7
  66. package/dist/Tab.js.map +1 -1
  67. package/dist/Upload.d.ts +110 -0
  68. package/dist/Upload.js +198 -0
  69. package/dist/Upload.js.map +1 -0
  70. package/dist/UploadItem.d.ts +101 -0
  71. package/dist/UploadItem.js +151 -0
  72. package/dist/UploadItem.js.map +1 -0
  73. package/dist/assets/{bundle-c5e3cbf2.css → bundle-7a4a3e16.css} +1 -1
  74. package/dist/assets/{bundle.esm-809b9769.js → bundle.esm-44fd7c69.js} +208 -191
  75. package/dist/assets/messagebundle_en-59e0affd.js +1 -0
  76. package/dist/css/themes/Avatar.css +1 -1
  77. package/dist/css/themes/Button.css +1 -1
  78. package/dist/css/themes/CountrySelector.css +1 -1
  79. package/dist/css/themes/Link.css +1 -1
  80. package/dist/css/themes/Pagination.css +1 -1
  81. package/dist/css/themes/RatingIndicator.css +1 -1
  82. package/dist/css/themes/Slider.css +1 -1
  83. package/dist/css/themes/StatusBadge.css +1 -1
  84. package/dist/css/themes/Tag.css +1 -1
  85. package/dist/css/themes/TagGroup.css +1 -1
  86. package/dist/css/themes/TextField.css +1 -1
  87. package/dist/css/themes/Upload.css +1 -0
  88. package/dist/css/themes/UploadItem.css +1 -0
  89. package/dist/custom-elements-internal.json +470 -26
  90. package/dist/custom-elements.json +431 -21
  91. package/dist/features/SearchSuggestionsPopover.js +1 -1
  92. package/dist/features/SearchSuggestionsPopover.js.map +1 -1
  93. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  94. package/dist/generated/i18n/i18n-defaults.d.ts +6 -1
  95. package/dist/generated/i18n/i18n-defaults.js +10 -5
  96. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  97. package/dist/generated/templates/ListItemTemplate.lit.js +4 -4
  98. package/dist/generated/templates/ListItemTemplate.lit.js.map +1 -1
  99. package/dist/generated/templates/ListTemplate.lit.js +2 -2
  100. package/dist/generated/templates/ListTemplate.lit.js.map +1 -1
  101. package/dist/generated/templates/MastheadMenuItemTemplate.lit.js +1 -1
  102. package/dist/generated/templates/MastheadMenuItemTemplate.lit.js.map +1 -1
  103. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +1 -1
  104. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
  105. package/dist/generated/templates/MessageStripTemplate.lit.js +1 -1
  106. package/dist/generated/templates/MessageStripTemplate.lit.js.map +1 -1
  107. package/dist/generated/templates/PhoneNumberFieldTemplate.lit.js +1 -1
  108. package/dist/generated/templates/PhoneNumberFieldTemplate.lit.js.map +1 -1
  109. package/dist/generated/templates/SelectBoxTemplate.lit.js +2 -2
  110. package/dist/generated/templates/SelectBoxTemplate.lit.js.map +1 -1
  111. package/dist/generated/templates/TagGroupTemplate.lit.js +2 -2
  112. package/dist/generated/templates/TagGroupTemplate.lit.js.map +1 -1
  113. package/dist/generated/templates/TileTemplate.lit.js +2 -2
  114. package/dist/generated/templates/TileTemplate.lit.js.map +1 -1
  115. package/dist/generated/templates/UploadItemTemplate.lit.d.ts +4 -0
  116. package/dist/generated/templates/UploadItemTemplate.lit.js +10 -0
  117. package/dist/generated/templates/UploadItemTemplate.lit.js.map +1 -0
  118. package/dist/generated/templates/UploadTemplate.lit.d.ts +4 -0
  119. package/dist/generated/templates/UploadTemplate.lit.js +8 -0
  120. package/dist/generated/templates/UploadTemplate.lit.js.map +1 -0
  121. package/dist/generated/themes/Avatar.css.js +1 -1
  122. package/dist/generated/themes/Avatar.css.js.map +1 -1
  123. package/dist/generated/themes/Button.css.js +1 -1
  124. package/dist/generated/themes/Button.css.js.map +1 -1
  125. package/dist/generated/themes/CountrySelector.css.js +1 -1
  126. package/dist/generated/themes/CountrySelector.css.js.map +1 -1
  127. package/dist/generated/themes/Link.css.js +1 -1
  128. package/dist/generated/themes/Link.css.js.map +1 -1
  129. package/dist/generated/themes/Pagination.css.js +1 -1
  130. package/dist/generated/themes/Pagination.css.js.map +1 -1
  131. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  132. package/dist/generated/themes/RatingIndicator.css.js.map +1 -1
  133. package/dist/generated/themes/Slider.css.js +1 -1
  134. package/dist/generated/themes/Slider.css.js.map +1 -1
  135. package/dist/generated/themes/StatusBadge.css.js +1 -1
  136. package/dist/generated/themes/StatusBadge.css.js.map +1 -1
  137. package/dist/generated/themes/Tag.css.js +1 -1
  138. package/dist/generated/themes/Tag.css.js.map +1 -1
  139. package/dist/generated/themes/TagGroup.css.js +1 -1
  140. package/dist/generated/themes/TagGroup.css.js.map +1 -1
  141. package/dist/generated/themes/TextField.css.js +1 -1
  142. package/dist/generated/themes/TextField.css.js.map +1 -1
  143. package/dist/generated/themes/Upload.css.d.ts +3 -0
  144. package/dist/generated/themes/Upload.css.js +9 -0
  145. package/dist/generated/themes/Upload.css.js.map +1 -0
  146. package/dist/generated/themes/UploadItem.css.d.ts +3 -0
  147. package/dist/generated/themes/UploadItem.css.js +9 -0
  148. package/dist/generated/themes/UploadItem.css.js.map +1 -0
  149. package/dist/i18n/messagebundle.properties +13 -4
  150. package/dist/i18n/messagebundle_en.properties +9 -4
  151. package/dist/types/ButtonSize.d.ts +6 -0
  152. package/dist/types/ButtonSize.js +8 -0
  153. package/dist/types/ButtonSize.js.map +1 -0
  154. package/dist/types/FileData.d.ts +5 -0
  155. package/dist/types/FileData.js +2 -0
  156. package/dist/types/FileData.js.map +1 -0
  157. package/dist/types/FileUploadState.d.ts +6 -0
  158. package/dist/types/FileUploadState.js +8 -0
  159. package/dist/types/FileUploadState.js.map +1 -0
  160. package/dist/types/MessageStrip.d.ts +12 -0
  161. package/dist/types/MessageStrip.js +15 -0
  162. package/dist/types/MessageStrip.js.map +1 -0
  163. package/dist/types/common.d.ts +6 -0
  164. package/dist/types/common.js +7 -0
  165. package/dist/types/common.js.map +1 -1
  166. package/dist/utils/Breakpoints.d.ts +33 -0
  167. package/dist/utils/Breakpoints.js +33 -0
  168. package/dist/utils/Breakpoints.js.map +1 -0
  169. package/dist/utils/convertBytesToMegabytes.d.ts +2 -0
  170. package/dist/utils/convertBytesToMegabytes.js +3 -0
  171. package/dist/utils/convertBytesToMegabytes.js.map +1 -0
  172. package/dist/vscode.html-custom-data.json +83 -1
  173. package/dist/web-types.json +191 -4
  174. package/package.json +2 -2
  175. package/src/Button.ts +5 -2
  176. package/src/ControlButton.ts +29 -8
  177. package/src/CountrySelector.ts +1 -1
  178. package/src/Footer.ts +3 -9
  179. package/src/Link.ts +12 -0
  180. package/src/List.hbs +4 -2
  181. package/src/List.ts +14 -8
  182. package/src/ListGroupHeader.ts +4 -2
  183. package/src/ListGroupHeaderBase.ts +12 -11
  184. package/src/ListItem.hbs +3 -1
  185. package/src/ListItem.ts +19 -15
  186. package/src/ListItemBase.ts +10 -10
  187. package/src/ListSelectAll.ts +5 -5
  188. package/src/MastheadItem.ts +3 -11
  189. package/src/MastheadMenuItem.hbs +1 -1
  190. package/src/MastheadMenuItem.ts +14 -7
  191. package/src/MastheadMobileMenu.hbs +1 -0
  192. package/src/MastheadShell.ts +2 -2
  193. package/src/MediaPlayer.ts +3 -3
  194. package/src/MessageStrip.hbs +1 -1
  195. package/src/MessageStrip.ts +38 -68
  196. package/src/PhoneNumberField.hbs +2 -2
  197. package/src/PhoneNumberField.ts +9 -4
  198. package/src/Search.ts +1 -0
  199. package/src/SecondaryNavigation.ts +3 -3
  200. package/src/SecondaryNavigationItemBase.ts +3 -9
  201. package/src/SegmentedButton.ts +4 -3
  202. package/src/SegmentedButtonItem.ts +3 -8
  203. package/src/SelectBox.hbs +19 -23
  204. package/src/SelectBox.ts +23 -1
  205. package/src/Tab.ts +1 -8
  206. package/src/TagGroup.hbs +20 -20
  207. package/src/Tile.hbs +3 -2
  208. package/src/Upload.hbs +21 -0
  209. package/src/Upload.ts +273 -0
  210. package/src/UploadItem.hbs +32 -0
  211. package/src/UploadItem.ts +218 -0
  212. package/src/features/SearchSuggestionsPopover.ts +1 -1
  213. package/src/generated/i18n/i18n-defaults.ts +2 -2
  214. package/src/generated/templates/ListItemTemplate.lit.ts +4 -4
  215. package/src/generated/templates/ListTemplate.lit.ts +2 -2
  216. package/src/generated/templates/MastheadMenuItemTemplate.lit.ts +1 -1
  217. package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +1 -1
  218. package/src/generated/templates/MessageStripTemplate.lit.ts +1 -1
  219. package/src/generated/templates/PhoneNumberFieldTemplate.lit.ts +1 -1
  220. package/src/generated/templates/SelectBoxTemplate.lit.ts +2 -2
  221. package/src/generated/templates/TagGroupTemplate.lit.ts +2 -2
  222. package/src/generated/templates/TileTemplate.lit.ts +2 -2
  223. package/src/generated/templates/UploadItemTemplate.lit.ts +15 -0
  224. package/src/generated/templates/UploadTemplate.lit.ts +13 -0
  225. package/src/generated/themes/Avatar.css.ts +1 -1
  226. package/src/generated/themes/Button.css.ts +1 -1
  227. package/src/generated/themes/CountrySelector.css.ts +1 -1
  228. package/src/generated/themes/Link.css.ts +1 -1
  229. package/src/generated/themes/Pagination.css.ts +1 -1
  230. package/src/generated/themes/RatingIndicator.css.ts +1 -1
  231. package/src/generated/themes/Slider.css.ts +1 -1
  232. package/src/generated/themes/StatusBadge.css.ts +1 -1
  233. package/src/generated/themes/Tag.css.ts +1 -1
  234. package/src/generated/themes/TagGroup.css.ts +1 -1
  235. package/src/generated/themes/TextField.css.ts +1 -1
  236. package/src/generated/themes/Upload.css.ts +13 -0
  237. package/src/generated/themes/UploadItem.css.ts +13 -0
  238. package/src/i18n/messagebundle.properties +13 -4
  239. package/src/i18n/messagebundle_en.properties +9 -4
  240. package/src/themes/Avatar.css +36 -45
  241. package/src/themes/Button.css +3 -3
  242. package/src/themes/CountrySelector.css +1 -0
  243. package/src/themes/Link.css +17 -4
  244. package/src/themes/Pagination.css +1 -1
  245. package/src/themes/StatusBadge.css +9 -9
  246. package/src/themes/Tag.css +6 -3
  247. package/src/themes/TagGroup.css +0 -4
  248. package/src/themes/TextField.css +2 -1
  249. package/src/themes/Upload.css +65 -0
  250. package/src/themes/UploadItem.css +131 -0
  251. package/src/types/ButtonSize.ts +7 -0
  252. package/src/types/FileData.ts +6 -0
  253. package/src/types/FileUploadState.ts +7 -0
  254. package/src/types/MessageStrip.ts +13 -0
  255. package/src/types/common.ts +7 -0
  256. package/src/utils/Breakpoints.ts +41 -0
  257. package/src/utils/convertBytesToMegabytes.ts +3 -0
  258. package/dist/assets/messagebundle_en-06c0dadc.js +0 -1
@@ -5,12 +5,7 @@ import SegmentedButtonItem from "@ui5/webcomponents/dist/SegmentedButtonItem.js"
5
5
  // Styles
6
6
  import property from "@ui5/webcomponents-base/dist/decorators/property.js";
7
7
  import SegmentedButtonItemCss from "./generated/themes/SegmentedButtonItem.css.js";
8
-
9
- export enum SegmentedButtonItemSize {
10
- Small = "Small",
11
- Medium = "Medium",
12
- Large = "Large",
13
- }
8
+ import UDExButtonSize from "./types/ButtonSize.js";
14
9
 
15
10
  /**
16
11
  * @class
@@ -41,8 +36,8 @@ class UDExSegmentedButtonItem extends SegmentedButtonItem {
41
36
  * @default "Medium"
42
37
  * @public
43
38
  */
44
- @property({ type: SegmentedButtonItemSize, defaultValue: SegmentedButtonItemSize.Medium })
45
- size!: `${SegmentedButtonItemSize}`;
39
+ @property({ type: UDExButtonSize, defaultValue: UDExButtonSize.Medium })
40
+ size!: `${UDExButtonSize}`;
46
41
  }
47
42
 
48
43
  UDExSegmentedButtonItem.define();
package/src/SelectBox.hbs CHANGED
@@ -13,13 +13,12 @@
13
13
  ?disabled="{{disabled}}"
14
14
  ?displayonly="{{displayonly}}"
15
15
  ?readonly="{{readonly}}"
16
- role="combobox"
17
16
  aria-label="{{accInfo.ariaLabel}}"
18
17
  aria-labelledby="{{accInfo.ariaLabelledBy}}"
19
18
  aria-readonly="{{isReadOrDisplayOnly}}"
20
19
  aria-disabled="{{disabled}}"
21
- aria-haspopup="listbox"
22
- aria-controls="udex-select-box__dropdown"
20
+ aria-haspopup="{{listboxRole}}"
21
+ aria-controls="{{popoverId}}"
23
22
  aria-expanded="{{tokenizerExpanded}}"
24
23
  aria-activedescendant>
25
24
  {{#if label}}
@@ -39,21 +38,21 @@
39
38
  {{/if}}
40
39
  {{#if showMultiSelectedOptions}}
41
40
  <udex-tag-group
42
- class="udex-tag-group"
43
- ?displayonly="{{displayonly}}"
44
- ?readonly="{{readonly}}"
45
- ?disabled="{{disabled}}"
46
- tooltip-placement="{{tooltipPlacement}}"
47
- @ui5-tag-click="{{handleTagPress}}"
48
- @ui5-show-more-tags="{{getHandlerShowMoreItems}}"
49
- @ui5-tag-keydown="{{handleKeyDownTag}}"
50
- ?expanded="{{tokenizerExpanded}}">
41
+ class="udex-tag-group"
42
+ ?displayonly="{{displayonly}}"
43
+ ?readonly="{{readonly}}"
44
+ ?disabled="{{disabled}}"
45
+ tooltip-placement="{{tooltipPlacement}}"
46
+ @ui5-tag-click="{{handleTagPress}}"
47
+ @ui5-show-more-tags="{{getHandlerShowMoreItems}}"
48
+ @ui5-tag-keydown="{{handleKeyDownTag}}"
49
+ ?expanded="{{tokenizerExpanded}}">
51
50
  {{#each selectedItems}}
52
51
  {{#unless this.isGroup}}
53
52
  <udex-tag
54
- text="{{this.label}}"
55
- id="{{this._id}}"
56
- icon="decline">
53
+ text="{{this.label}}"
54
+ id="{{this._id}}"
55
+ icon="decline">
57
56
  </udex-tag>
58
57
  {{/unless}}
59
58
  {{/each}}
@@ -61,18 +60,15 @@
61
60
  {{/if}}
62
61
  {{#if showTrigger}}
63
62
  <udex-control-button
64
- tabindex="{{triggerTabIndex}}"
63
+ .accessibilityAttributes="{{accessibilityAttributes}}"
65
64
  class="udex-text-field__trigger"
66
- role="combobox"
67
65
  size="Large"
68
66
  icon="navigation-down-arrow"
67
+ tabindex="{{triggerTabIndex}}"
69
68
  accessible-name="{{iconAccessibleNameText}}"
70
- aria-label="{{iconAccessibleNameText}}"
71
- aria-haspopup="listbox"
72
- aria-expanded="{{_open}}"
73
- aria-controls="{{accInfo.ariaControls}}"
69
+ @keydown="{{handleKeyDownTrigger}}"
74
70
  @click="{{getHandleMultiSelectOpen}}"
75
- aria-activedescendant>
71
+ _is-combobox-role>
76
72
  </udex-control-button>
77
73
  {{/if}}
78
74
  </div>
@@ -87,7 +83,7 @@
87
83
  </div>
88
84
  <ui5-popover
89
85
  hide-arrow
90
- id="udex-select-box__dropdown"
86
+ id="{{popoverId}}"
91
87
  class="udex-select-box__dropdown"
92
88
  ?allow-target-overlap="{{allowTargetOverlap}}"
93
89
  @keydown="{{handleKeyDownDropdown}}"
package/src/SelectBox.ts CHANGED
@@ -48,6 +48,12 @@ import UDExStatusMessage from "./StatusMessage.js";
48
48
  import UDExControlButton from "./ControlButton.js";
49
49
  import UDExTagGroup from "./TagGroup.js";
50
50
 
51
+ export type SelectBoxAccessibilityAttributes = {
52
+ controls?: string,
53
+ expanded?: "true" | "false" | boolean,
54
+ hasPopup?: string,
55
+ ariaLabel?: string,
56
+ }
51
57
  /**
52
58
  * @class
53
59
  *
@@ -704,10 +710,26 @@ class UDExSelectBox extends UDExSearchableListBase {
704
710
  return {
705
711
  "ariaLabel": this.accessibleName || this.label || undefined,
706
712
  "ariaLabelledBy": this.accessibleNameRef || undefined,
707
- "ariaControls": this.shadowRoot?.querySelector("[udex-list]")?.getAttribute("id"),
708
713
  };
709
714
  }
710
715
 
716
+ get accessibilityAttributes(): SelectBoxAccessibilityAttributes {
717
+ return {
718
+ expanded: this._open,
719
+ controls: this.popoverId,
720
+ hasPopup: this.listboxRole,
721
+ ariaLabel: this.iconAccessibleNameText,
722
+ };
723
+ }
724
+
725
+ get popoverId(): string {
726
+ return `${this._id}_udex-select-box__dropdown`;
727
+ }
728
+
729
+ get listboxRole(): string {
730
+ return "listbox";
731
+ }
732
+
711
733
  static get searchableListBaseTemplate() {
712
734
  return SearchableListBaseTemplate;
713
735
  }
package/src/Tab.ts CHANGED
@@ -7,7 +7,7 @@ import executeTemplate from "@ui5/webcomponents-base/dist/renderer/executeTempla
7
7
  import I18nBundle, { getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js";
8
8
  import TabNavigation from "./TabNavigation.js";
9
9
  import UDExBadge from "./Badge.js";
10
-
10
+ import { Target } from "./types/common.js";
11
11
  import TabTemplate from "./generated/templates/TabTemplate.lit.js";
12
12
  import TabHeaderTemplate from "./generated/templates/TabHeaderTemplate.lit.js";
13
13
  import TabInOverflowTemplate from "./generated/templates/TabInOverflowTemplate.lit.js";
@@ -16,13 +16,6 @@ import { ATTENTION_BADGE } from "./generated/i18n/i18n-defaults.js";
16
16
  // Styles
17
17
  import TabInOverflowCss from "./generated/themes/TabInOverflow.css.js";
18
18
 
19
- export enum Target {
20
- _blank = "_blank",
21
- _parent = "_parent",
22
- _self = "_self",
23
- _top = "_top",
24
- }
25
-
26
19
  interface ITab extends UI5Element {
27
20
  getTabInHeaderDomRef: () => ITab | null;
28
21
  disabled?: boolean;
package/src/TagGroup.hbs CHANGED
@@ -25,24 +25,24 @@
25
25
 
26
26
  {{#*inline "TAG"}}
27
27
  <udex-tag
28
- role="{{../tagRole}}"
29
- accessible-role="option"
30
- class="udex-tag-group__tag"
31
- data-id="{{this.id}}"
32
- part="token-{{@index}}"
33
- ?read-only="{{../isReadOrDisplayOnly}}"
34
- tabindex="{{../tagTabIndex}}"
35
- id="{{_id}}-tag-group-tag"
36
- text="{{this.text}}"
37
- icon="{{this.icon}}"
38
- href="{{this.href}}"
39
- design="{{this.design}}"
40
- size="{{this.size}}"
41
- icon-placement="{{this.iconPlacement}}"
42
- accessible-name="{{this.accessibleName}}"
43
- ?non-selectable="{{this.nonSelectable}}"
44
- ?data-overflows="{{this.overflows}}"
45
- @keydown="{{../handleTagKeyDown}}"
46
- @ui5-iconClick="{{../tagIconClickHandler}}">
47
- ></udex-tag>
28
+ role="{{../tagRole}}"
29
+ accessible-role="option"
30
+ class="udex-tag-group__tag"
31
+ data-id="{{this.id}}"
32
+ part="token-{{@index}}"
33
+ ?read-only="{{../isReadOrDisplayOnly}}"
34
+ tabindex="{{../tagTabIndex}}"
35
+ id="{{_id}}-tag-group-tag"
36
+ text="{{this.text}}"
37
+ icon="{{this.icon}}"
38
+ href="{{this.href}}"
39
+ design="{{this.design}}"
40
+ size="{{this.size}}"
41
+ icon-placement="{{this.iconPlacement}}"
42
+ accessible-name="{{this.accessibleName}}"
43
+ ?non-selectable="{{this.nonSelectable}}"
44
+ ?data-overflows="{{this.overflows}}"
45
+ @keydown="{{../handleTagKeyDown}}"
46
+ @ui5-iconClick="{{../tagIconClickHandler}}">
47
+ </udex-tag>
48
48
  {{/inline}}
package/src/Tile.hbs CHANGED
@@ -1,17 +1,18 @@
1
1
  {{#if interactive}}
2
2
  <a
3
3
  class="udex-tile"
4
+ part="tile"
4
5
  href="{{href}}"
5
6
  target="{{target}}"
6
7
  aria-label="{{accessibleName}}"
7
8
  @keydown={{_onkeydown}}
8
- @click={{_onclick}}
9
- >
9
+ @click={{_onclick}}>
10
10
  <slot></slot>
11
11
  </a>
12
12
  {{else}}
13
13
  <div
14
14
  class="udex-tile"
15
+ part="tile"
15
16
  @click={{_onclick}}>
16
17
  <slot></slot>
17
18
  </div>
package/src/Upload.hbs ADDED
@@ -0,0 +1,21 @@
1
+ <div @ui5-request-delete="{{handleRemoveFile}}" class="udex-upload__wrapper">
2
+ {{#if uploadTitle}}
3
+ <h1 class="udex-upload__title">{{uploadTitle}}</h1>
4
+ {{/if}}
5
+ {{#if additionalText}}
6
+ <p class="udex-upload__additional-text">{{additionalText}}</p>
7
+ {{/if}}
8
+ <div class="udex-upload__upload-button-container">
9
+ <ui5-file-uploader id="fileUploader" hide-input accept="{{accept}}" ?multiple="{{multiple}}" @change="{{handleUploadFile}}" @click="{{handleUploadClick}}">
10
+ <udex-button design="Secondary" aria-label="{{uploadButtonAriaLabel}}" size="{{_buttonSize}}">{{uploadButtonText}}</udex-button>
11
+ </ui5-file-uploader>
12
+ {{#if _filesFull}}
13
+ <p class="udex-upload__error">{{errorText}}</p>
14
+ {{/if}}
15
+ </div>
16
+ <div class="udex-upload__files-wrapper">
17
+ <udex-list aria-busy="{{listBusy}}" mode="MultiSelect" @ui5-selection-change="{{handleSelectionChange}}">
18
+ <slot></slot>
19
+ </udex-list>
20
+ </div>
21
+ </div>
package/src/Upload.ts ADDED
@@ -0,0 +1,273 @@
1
+ import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
+
3
+ import customElement from "@ui5/webcomponents-base/dist/decorators/customElement.js";
4
+ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
5
+ import { event, slot } from "@ui5/webcomponents-base/dist/decorators.js";
6
+ import ResizeHandler, { ResizeObserverCallback } from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
7
+ import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
8
+
9
+ import Integer from "@ui5/webcomponents-base/dist/types/Integer.js";
10
+ import FileUploader from "@ui5/webcomponents/dist/FileUploader.js";
11
+ import I18nBundle, { getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js";
12
+ import { UPLOAD_BUTTON_LABEL } from "./generated/i18n/i18n-defaults.js";
13
+ import UDExButton from "./Button.js";
14
+ import UDExButtonSize from "./types/ButtonSize.js";
15
+ import UDExList from "./List.js";
16
+ import UDExUploadItem from "./UploadItem.js";
17
+ import UploadTemplate from "./generated/templates/UploadTemplate.lit.js";
18
+ import FileData from "./types/FileData.js";
19
+
20
+ // Styles
21
+ import UploadCss from "./generated/themes/Upload.css.js";
22
+
23
+ const convertBytesToMegabytes = (bytes: number) => (bytes / 1024) / 1024;
24
+ const BreakpointSizeS: number = 979;
25
+
26
+ /**
27
+ * @class
28
+ *
29
+ * <h3 class="comment-api-title">Overview</h3>
30
+ *
31
+ *
32
+ * <h3>Usage</h3>
33
+ *
34
+ * For the <code>udex-upload</code>
35
+ * <h3>ES6 Module Import</h3>
36
+ *
37
+ * <code>import "@udex/web-components/dist/Upload.js";</code>
38
+ *
39
+ * @constructor
40
+ * @extends UI5Element
41
+ * @public
42
+ */
43
+ @customElement({
44
+ tag: "udex-upload",
45
+ renderer: litRender,
46
+ styles: UploadCss,
47
+ template: UploadTemplate,
48
+ dependencies: [FileUploader, UDExList, UDExButton, UDExUploadItem],
49
+ })
50
+
51
+ /**
52
+ * Triggered when the uploaded file exceeds the maximum allowed size.
53
+ *
54
+ * @public
55
+ */
56
+ @event("file-size-exceed", {
57
+ detail:
58
+ {
59
+ files:
60
+ { type: Array },
61
+ },
62
+ })
63
+
64
+ /**
65
+ * Triggered when the user deletes the uploaded item.
66
+ *
67
+ * @public
68
+ */
69
+ @event("file-delete", {
70
+ detail:
71
+ {
72
+ file:
73
+ { type: UDExUploadItem },
74
+ },
75
+ })
76
+
77
+ /**
78
+ * Triggered when the user uploads the item.
79
+ *
80
+ * @public
81
+ */
82
+ @event("file-change", {
83
+ detail:
84
+ {
85
+ files:
86
+ { type: Array },
87
+ },
88
+ })
89
+
90
+ class UDExUpload extends UI5Element {
91
+ /**
92
+ * Defines the title of the upload.
93
+ *
94
+ * @public
95
+ */
96
+ @property({ type: String })
97
+ uploadTitle!: string;
98
+
99
+ /**
100
+ * Defines the error message shown when more than one file is uploaded with multiple set to false.
101
+ *
102
+ * @public
103
+ */
104
+ @property({ type: String })
105
+ errorText!: string;
106
+
107
+ /**
108
+ * Defines if uploader is required.
109
+ *
110
+ * @public
111
+ */
112
+ @property({ type: Boolean })
113
+ required!: boolean;
114
+
115
+ /**
116
+ * Defines if uploading multiple files is allowed.
117
+ *
118
+ * @public
119
+ */
120
+ @property({ type: Boolean })
121
+ multiple!: boolean;
122
+
123
+ /**
124
+ * Defines the acceptable file formats for uploading.
125
+ *
126
+ * @public
127
+ */
128
+ @property({ type: String })
129
+ accept!: string;
130
+
131
+ /**
132
+ * Defines the maximum allowed size of the file for uploading.
133
+ *
134
+ * @default undefined
135
+ * @public
136
+ */
137
+ @property({ type: Number, validator: Integer })
138
+ maxFileSize!: number;
139
+
140
+ /**
141
+ * Defines the additional text below the title of the upload.
142
+ *
143
+ * @public
144
+ */
145
+ @property({ type: String })
146
+ additionalText!: string;
147
+
148
+ /**
149
+ * Defines the text in the upload button.
150
+ *
151
+ * @public
152
+ */
153
+ @property({ type: String })
154
+ uploadButtonText!: string;
155
+
156
+ /**
157
+ * Defines if a file is already uploaded when multiple is false.
158
+ *
159
+ * @private
160
+ */
161
+ @property({ type: Boolean })
162
+ _filesFull: boolean = false;
163
+
164
+ /**
165
+ * Defines the uploaded files.
166
+ *
167
+ * @public
168
+ */
169
+ @slot({ type: HTMLElement, "default": true })
170
+ items!: Array<UDExUploadItem>;
171
+
172
+ /**
173
+ * Defines the percentage of the upload.
174
+ *
175
+ * @default "Large"
176
+ * @private
177
+ */
178
+ @property({ type: String, defaultValue: UDExButtonSize.Large })
179
+ _buttonSize!: `${UDExButtonSize}`;
180
+
181
+ static i18nBundle: I18nBundle;
182
+ _handleResizeBound: ResizeObserverCallback;
183
+
184
+ static async onDefine() {
185
+ UDExUpload.i18nBundle = await getI18nBundle("@udex/web-components");
186
+ }
187
+
188
+ constructor() {
189
+ super();
190
+ this._handleResizeBound = this._handleResize.bind(this);
191
+ }
192
+
193
+ onEnterDOM(): void {
194
+ ResizeHandler.register(this, this._handleResizeBound);
195
+ }
196
+
197
+ onExitDOM(): void {
198
+ ResizeHandler.deregister(this, this._handleResizeBound);
199
+ }
200
+
201
+ onAfterRendering(): void {
202
+ if (this._filesFull) {
203
+ this._filesFull = this.fileNumberExceeded;
204
+ }
205
+ }
206
+
207
+ handleUploadClick(e: Event) {
208
+ this._filesFull = this.fileNumberExceeded;
209
+ if (this.fileNumberExceeded) {
210
+ e.preventDefault();
211
+ }
212
+ }
213
+
214
+ handleUploadFile(e: Event) {
215
+ const newFiles = (e.target as HTMLInputElement).files;
216
+
217
+ if (!newFiles?.length || this.fileNumberExceeded) {
218
+ e.stopPropagation();
219
+ }
220
+
221
+ const exceededFilesData = this.maxFileSize ? this._getExceededFiles(newFiles!) : [];
222
+ if (exceededFilesData.length) {
223
+ e.stopPropagation();
224
+ this.fireEvent("file-size-exceed", {
225
+ files: exceededFilesData,
226
+ });
227
+ }
228
+ }
229
+
230
+ handleSelectionChange(e: CustomEvent) {
231
+ this.fireEvent("file-change", { files: e.detail.listItems as UDExUploadItem[] });
232
+ }
233
+
234
+ _handleResize() {
235
+ this._buttonSize = window.innerWidth <= BreakpointSizeS ? UDExButtonSize.Medium : UDExButtonSize.Large;
236
+ }
237
+
238
+ handleRemoveFile(e: CustomEvent) {
239
+ this.fireEvent("file-delete", { file: e.target as UDExUploadItem });
240
+ }
241
+
242
+ _getExceededFiles(files: FileList): Array<FileData> {
243
+ const filesArray = Array.from(files);
244
+ const exceededFiles: Array<FileData> = [];
245
+
246
+ for (let i = 0; i < filesArray.length; i++) {
247
+ const fileSize = convertBytesToMegabytes(filesArray[i].size);
248
+ if (fileSize > this.maxFileSize) {
249
+ exceededFiles.push({
250
+ fileName: filesArray[i].name,
251
+ fileSize,
252
+ });
253
+ }
254
+ }
255
+ return exceededFiles;
256
+ }
257
+
258
+ get uploadButtonAriaLabel(): string {
259
+ return UDExUpload.i18nBundle.getText(UPLOAD_BUTTON_LABEL);
260
+ }
261
+
262
+ get listBusy(): boolean {
263
+ return !this.items.length;
264
+ }
265
+
266
+ get fileNumberExceeded(): boolean {
267
+ return !this.multiple && this.items.length >= 1;
268
+ }
269
+ }
270
+
271
+ UDExUpload.define();
272
+
273
+ export default UDExUpload;
@@ -0,0 +1,32 @@
1
+ <div class="udex-upload-item__wrapper">
2
+ <div class="udex-upload-item__info {{uploadItemClasses}}">
3
+ <div>
4
+ {{#if fileInteractive}}
5
+ <udex-link href="{{fileLink}}">{{fileName}}</udex-link>
6
+ {{else}}
7
+ <p class="udex-upload-item__name">{{fileName}}</p>
8
+ {{/if}}
9
+ <div class="{{additionalInfoClasses}}">
10
+ <slot></slot>
11
+ </div>
12
+ </div>
13
+ {{#if _breakpointM}}
14
+ {{> deleteButton}}
15
+ {{/if}}
16
+ </div>
17
+ <div class="udex-upload-item__progress-info-wrapper">
18
+ {{#if showUploadProgress}}
19
+ <div class="udex-upload-item__progress-info">
20
+ <udex-progress-bar role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="{{uploadPercentage}}" value="{{uploadPercentage}}" value-state="{{uploadProgressState}}" hide-value></udex-progress-bar>
21
+ <p class="udex-upload-item__progress-status">{{uploadStatus}}</p>
22
+ </div>
23
+ {{/if}}
24
+ {{#if _breakpointL}}
25
+ {{> deleteButton}}
26
+ {{/if}}
27
+ </div>
28
+ </div>
29
+
30
+ {{#*inline deleteButton}}
31
+ <udex-button accessible-name="{{removeButtonAccessibleName}}" @keydown="{{handleButtonKeydown}}" @click="{{handleButtonClick}}" size="{{_buttonSize}}" icon="decline" design="Tertiary"></udex-button>
32
+ {{/inline}}