@sapudex/web-components 2.40.0 → 2.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/cypress/specs/Dropdown.cy.tsx +90 -0
  2. package/cypress/specs/PasswordField.cy.tsx +37 -0
  3. package/cypress/specs/Search.cy.tsx +244 -138
  4. package/cypress/specs/SelectBox.cy.tsx +184 -5
  5. package/cypress/support/component-imports.instrumented.ts +2 -0
  6. package/cypress/support/component-imports.src.ts +2 -0
  7. package/dist/Dropdown.d.ts +5 -0
  8. package/dist/Dropdown.js +56 -0
  9. package/dist/Dropdown.js.map +1 -1
  10. package/dist/List.d.ts +1 -6
  11. package/dist/List.js +2 -10
  12. package/dist/List.js.map +1 -1
  13. package/dist/MastheadCountrySelector.d.ts +7 -0
  14. package/dist/MastheadCountrySelector.js +3 -0
  15. package/dist/MastheadCountrySelector.js.map +1 -1
  16. package/dist/PasswordField.d.ts +10 -0
  17. package/dist/PasswordField.js +17 -2
  18. package/dist/PasswordField.js.map +1 -1
  19. package/dist/PasswordFieldTemplate.js +1 -1
  20. package/dist/PasswordFieldTemplate.js.map +1 -1
  21. package/dist/Search.d.ts +1 -1
  22. package/dist/Search.js +13 -9
  23. package/dist/Search.js.map +1 -1
  24. package/dist/SearchTemplate.js +3 -3
  25. package/dist/SearchTemplate.js.map +1 -1
  26. package/dist/SearchableListBase.d.ts +1 -6
  27. package/dist/SearchableListBase.js.map +1 -1
  28. package/dist/SearchableListBaseTemplate.js +1 -1
  29. package/dist/SearchableListBaseTemplate.js.map +1 -1
  30. package/dist/SelectBase.d.ts +7 -1
  31. package/dist/SelectBase.js +114 -17
  32. package/dist/SelectBase.js.map +1 -1
  33. package/dist/TextField.d.ts +1 -1
  34. package/dist/TextField.js +2 -2
  35. package/dist/TextField.js.map +1 -1
  36. package/dist/TextFieldTemplate.js +1 -1
  37. package/dist/TextFieldTemplate.js.map +1 -1
  38. package/dist/assets/{InputSuggestions-DAElWNvY.js → InputSuggestions-BSg7bjcx.js} +1 -1
  39. package/dist/assets/{ListItemStandardExpandableTextTemplate-B2fGcGW7.js → ListItemStandardExpandableTextTemplate-CCEQur_J.js} +1 -1
  40. package/dist/assets/{bundle.esm-DPVxY8xv.js → bundle.esm-I7iOjLgn.js} +232 -232
  41. package/dist/assets/messagebundle_en-BZqDcZHN.js +1 -0
  42. package/dist/assets/messagebundle_hu-CBV3ISbF.js +1 -0
  43. package/dist/css/themes/MastheadCountrySelector.css +1 -1
  44. package/dist/css/themes/MastheadProfileMenu.css +1 -1
  45. package/dist/css/themes/StatusMessage.css +1 -1
  46. package/dist/css/themes/TextField.css +1 -1
  47. package/dist/css/themes/Toast.css +1 -1
  48. package/dist/custom-elements-internal.json +38 -146
  49. package/dist/custom-elements.json +38 -114
  50. package/dist/features/SearchSuggestionsPopover.d.ts +6 -9
  51. package/dist/features/SearchSuggestionsPopover.js +47 -163
  52. package/dist/features/SearchSuggestionsPopover.js.map +1 -1
  53. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  54. package/dist/generated/assets/i18n/messagebundle_hu.json +1 -1
  55. package/dist/generated/i18n/i18n-defaults.d.ts +3 -2
  56. package/dist/generated/i18n/i18n-defaults.js +3 -2
  57. package/dist/generated/i18n/i18n-defaults.js.map +1 -1
  58. package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js +6 -5
  59. package/dist/generated/templates/MastheadCountrySelectorTemplate.lit.js.map +1 -1
  60. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js +1 -1
  61. package/dist/generated/templates/MastheadMobileMenuTemplate.lit.js.map +1 -1
  62. package/dist/generated/themes/MastheadCountrySelector.css.d.ts +1 -1
  63. package/dist/generated/themes/MastheadCountrySelector.css.js +1 -1
  64. package/dist/generated/themes/MastheadCountrySelector.css.js.map +1 -1
  65. package/dist/generated/themes/MastheadProfileMenu.css.d.ts +1 -1
  66. package/dist/generated/themes/MastheadProfileMenu.css.js +1 -1
  67. package/dist/generated/themes/MastheadProfileMenu.css.js.map +1 -1
  68. package/dist/generated/themes/StatusMessage.css.d.ts +1 -1
  69. package/dist/generated/themes/StatusMessage.css.js +1 -1
  70. package/dist/generated/themes/StatusMessage.css.js.map +1 -1
  71. package/dist/generated/themes/TextField.css.d.ts +1 -1
  72. package/dist/generated/themes/TextField.css.js +1 -1
  73. package/dist/generated/themes/TextField.css.js.map +1 -1
  74. package/dist/generated/themes/Toast.css.d.ts +1 -1
  75. package/dist/generated/themes/Toast.css.js +1 -1
  76. package/dist/generated/themes/Toast.css.js.map +1 -1
  77. package/dist/messagebundle.properties +2 -1
  78. package/dist/messagebundle_en.properties +2 -1
  79. package/dist/messagebundle_hu.properties +125 -0
  80. package/dist/vscode.html-custom-data.json +10 -25
  81. package/dist/web-types.json +21 -41
  82. package/package.json +1 -1
  83. package/src/Dropdown.ts +62 -0
  84. package/src/List.ts +3 -18
  85. package/src/MastheadCountrySelector.hbs +2 -0
  86. package/src/MastheadCountrySelector.ts +9 -0
  87. package/src/MastheadMobileMenu.hbs +1 -0
  88. package/src/PasswordField.ts +24 -0
  89. package/src/PasswordFieldTemplate.tsx +2 -2
  90. package/src/Search.ts +13 -9
  91. package/src/SearchTemplate.tsx +0 -3
  92. package/src/SearchableListBase.ts +1 -6
  93. package/src/SearchableListBaseTemplate.tsx +0 -1
  94. package/src/SelectBase.ts +114 -19
  95. package/src/TextField.ts +1 -1
  96. package/src/TextFieldTemplate.tsx +1 -1
  97. package/src/features/SearchSuggestionsPopover.ts +55 -177
  98. package/src/generated/i18n/i18n-defaults.ts +2 -2
  99. package/src/generated/templates/MastheadCountrySelectorTemplate.lit.ts +6 -5
  100. package/src/generated/templates/MastheadMobileMenuTemplate.lit.ts +1 -1
  101. package/src/generated/themes/MastheadCountrySelector.css.ts +1 -1
  102. package/src/generated/themes/MastheadProfileMenu.css.ts +1 -1
  103. package/src/generated/themes/StatusMessage.css.ts +1 -1
  104. package/src/generated/themes/TextField.css.ts +1 -1
  105. package/src/generated/themes/Toast.css.ts +1 -1
  106. package/src/i18n/messagebundle.properties +2 -1
  107. package/src/i18n/messagebundle_en.properties +2 -1
  108. package/src/i18n/messagebundle_hu.properties +125 -0
  109. package/src/themes/MastheadCountrySelector.css +5 -2
  110. package/src/themes/MastheadProfileMenu.css +0 -5
  111. package/src/themes/StatusMessage.css +4 -4
  112. package/src/themes/TextField.css +3 -0
  113. package/src/themes/Toast.css +14 -2
  114. package/dist/assets/messagebundle_en-BxjFAY2S.js +0 -1
  115. package/dist/assets/messagebundle_hu-BEMbu-EE.js +0 -1
@@ -516,11 +516,6 @@
516
516
  "name": "show-search-input",
517
517
  "description": "Defines if the search input is visible.",
518
518
  "values": []
519
- },
520
- {
521
- "name": "tab-navigation-enabled",
522
- "description": "Enables tab navigation for the list.",
523
- "values": []
524
519
  }
525
520
  ],
526
521
  "references": []
@@ -914,11 +909,6 @@
914
909
  "description": "Defines if the search input is visible.",
915
910
  "values": []
916
911
  },
917
- {
918
- "name": "tab-navigation-enabled",
919
- "description": "Enables tab navigation for the list.",
920
- "values": []
921
- },
922
912
  {
923
913
  "name": "trigger-accessible-role",
924
914
  "description": "Allows setting a custom role for dropdown trigger.",
@@ -1672,11 +1662,6 @@
1672
1662
  { "name": "RadioGroup" }
1673
1663
  ]
1674
1664
  },
1675
- {
1676
- "name": "tab-navigation-enabled",
1677
- "description": "Enables tab navigation for the list.",
1678
- "values": []
1679
- },
1680
1665
  {
1681
1666
  "name": "type",
1682
1667
  "description": "Defines the type of the item.",
@@ -2282,6 +2267,11 @@
2282
2267
  "description": "Defines title of the countries menu",
2283
2268
  "values": []
2284
2269
  },
2270
+ {
2271
+ "name": "hide-search",
2272
+ "description": "Hides the search field in the country list view.",
2273
+ "values": []
2274
+ },
2285
2275
  {
2286
2276
  "name": "language-voice",
2287
2277
  "description": "Defines the language voice of the search",
@@ -2883,6 +2873,11 @@
2883
2873
  "description": "Defines the inner stored displayonly state.",
2884
2874
  "values": []
2885
2875
  },
2876
+ {
2877
+ "name": "hide-button-tooltip",
2878
+ "description": "Defines the tooltip for the hide password button.",
2879
+ "values": []
2880
+ },
2886
2881
  {
2887
2882
  "name": "label",
2888
2883
  "description": "Defines label text for the input field.",
@@ -3396,11 +3391,6 @@
3396
3391
  "name": "show-search-input",
3397
3392
  "description": "Defines if the search input is visible.",
3398
3393
  "values": []
3399
- },
3400
- {
3401
- "name": "tab-navigation-enabled",
3402
- "description": "Enables tab navigation for the list.",
3403
- "values": []
3404
3394
  }
3405
3395
  ],
3406
3396
  "references": []
@@ -3694,11 +3684,6 @@
3694
3684
  "description": "Defines if the search input is visible.",
3695
3685
  "values": []
3696
3686
  },
3697
- {
3698
- "name": "tab-navigation-enabled",
3699
- "description": "Enables tab navigation for the list.",
3700
- "values": []
3701
- },
3702
3687
  {
3703
3688
  "name": "tooltip-placement",
3704
3689
  "description": "Determines on which side of the component the Tooltip is displayed.",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "name": "@sapudex/web-components",
4
- "version": "2.40.0",
4
+ "version": "2.41.0",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -971,11 +971,6 @@
971
971
  "name": "show-search-input",
972
972
  "description": "Defines if the search input is visible.",
973
973
  "value": { "type": "boolean", "default": "false" }
974
- },
975
- {
976
- "name": "tab-navigation-enabled",
977
- "description": "Enables tab navigation for the list.",
978
- "value": { "type": "boolean | undefined", "default": "\"\"" }
979
974
  }
980
975
  ],
981
976
  "slots": [
@@ -1085,11 +1080,6 @@
1085
1080
  "name": "show-search-input",
1086
1081
  "description": "Defines if the search input is visible.",
1087
1082
  "value": { "type": "boolean" }
1088
- },
1089
- {
1090
- "name": "tab-navigation-enabled",
1091
- "description": "Enables tab navigation for the list.",
1092
- "value": { "type": "boolean | undefined" }
1093
1083
  }
1094
1084
  ],
1095
1085
  "events": [
@@ -1789,11 +1779,6 @@
1789
1779
  "description": "Defines if the search input is visible.",
1790
1780
  "value": { "type": "boolean", "default": "false" }
1791
1781
  },
1792
- {
1793
- "name": "tab-navigation-enabled",
1794
- "description": "Enables tab navigation for the list.",
1795
- "value": { "type": "boolean | undefined", "default": "\"\"" }
1796
- },
1797
1782
  {
1798
1783
  "name": "trigger-accessible-role",
1799
1784
  "description": "Allows setting a custom role for dropdown trigger.",
@@ -1985,11 +1970,6 @@
1985
1970
  "description": "Defines if the search input is visible.",
1986
1971
  "value": { "type": "boolean" }
1987
1972
  },
1988
- {
1989
- "name": "tab-navigation-enabled",
1990
- "description": "Enables tab navigation for the list.",
1991
- "value": { "type": "boolean | undefined" }
1992
- },
1993
1973
  {
1994
1974
  "name": "trigger-accessible-role",
1995
1975
  "description": "Allows setting a custom role for dropdown trigger.",
@@ -3749,11 +3729,6 @@
3749
3729
  "default": "\"SingleSelect\""
3750
3730
  }
3751
3731
  },
3752
- {
3753
- "name": "tab-navigation-enabled",
3754
- "description": "Enables tab navigation for the list.",
3755
- "value": { "type": "boolean | undefined", "default": "\"\"" }
3756
- },
3757
3732
  {
3758
3733
  "name": "type",
3759
3734
  "description": "Defines the type of the item.",
@@ -3811,11 +3786,6 @@
3811
3786
  "type": "\"SingleSelect\" | \"MultiSelect\" | \"SingleContent\" | \"RadioGroup\""
3812
3787
  }
3813
3788
  },
3814
- {
3815
- "name": "tab-navigation-enabled",
3816
- "description": "Enables tab navigation for the list.",
3817
- "value": { "type": "boolean | undefined" }
3818
- },
3819
3789
  {
3820
3790
  "name": "type",
3821
3791
  "description": "Defines the type of the item.",
@@ -4683,6 +4653,11 @@
4683
4653
  "description": "Defines title of the countries menu",
4684
4654
  "value": { "type": "string", "default": "\"\"" }
4685
4655
  },
4656
+ {
4657
+ "name": "hide-search",
4658
+ "description": "Hides the search field in the country list view.",
4659
+ "value": { "type": "boolean", "default": "false" }
4660
+ },
4686
4661
  {
4687
4662
  "name": "language-voice",
4688
4663
  "description": "Defines the language voice of the search",
@@ -4740,6 +4715,11 @@
4740
4715
  "description": "Defines title of the countries menu",
4741
4716
  "value": { "type": "string" }
4742
4717
  },
4718
+ {
4719
+ "name": "hide-search",
4720
+ "description": "Hides the search field in the country list view.",
4721
+ "value": { "type": "boolean" }
4722
+ },
4743
4723
  {
4744
4724
  "name": "language-voice",
4745
4725
  "description": "Defines the language voice of the search",
@@ -6216,6 +6196,11 @@
6216
6196
  "description": "Defines the inner stored displayonly state.",
6217
6197
  "value": { "type": "boolean", "default": "false" }
6218
6198
  },
6199
+ {
6200
+ "name": "hide-button-tooltip",
6201
+ "description": "Defines the tooltip for the hide password button.",
6202
+ "value": { "type": "string", "default": "\"\"" }
6203
+ },
6219
6204
  {
6220
6205
  "name": "label",
6221
6206
  "description": "Defines label text for the input field.",
@@ -6315,6 +6300,11 @@
6315
6300
  "description": "Defines the inner stored displayonly state.",
6316
6301
  "value": { "type": "boolean" }
6317
6302
  },
6303
+ {
6304
+ "name": "hide-button-tooltip",
6305
+ "description": "Defines the tooltip for the hide password button.",
6306
+ "value": { "type": "string" }
6307
+ },
6318
6308
  {
6319
6309
  "name": "label",
6320
6310
  "description": "Defines label text for the input field.",
@@ -7767,11 +7757,6 @@
7767
7757
  "description": "Defines if the search input is visible.",
7768
7758
  "value": { "type": "boolean", "default": "false" }
7769
7759
  },
7770
- {
7771
- "name": "tab-navigation-enabled",
7772
- "description": "Enables tab navigation for the list.",
7773
- "value": { "type": "boolean | undefined", "default": "\"\"" }
7774
- },
7775
7760
  {
7776
7761
  "name": "tooltip-placement",
7777
7762
  "description": "Determines on which side of the component the Tooltip is displayed.",
@@ -7887,11 +7872,6 @@
7887
7872
  "description": "Defines if the search input is visible.",
7888
7873
  "value": { "type": "boolean" }
7889
7874
  },
7890
- {
7891
- "name": "tab-navigation-enabled",
7892
- "description": "Enables tab navigation for the list.",
7893
- "value": { "type": "boolean | undefined" }
7894
- },
7895
7875
  {
7896
7876
  "name": "tooltip-placement",
7897
7877
  "description": "Determines on which side of the component the Tooltip is displayed.",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@sapudex/web-components",
4
- "version": "2.40.0",
4
+ "version": "2.41.0",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
7
7
  },
package/src/Dropdown.ts CHANGED
@@ -7,6 +7,8 @@ import property from "@ui5/webcomponents-base/dist/decorators/property.js";
7
7
  import DropdownCss from "./generated/themes/Dropdown.css.js";
8
8
  import getEffectiveScrollbarStyle from "./utils/getEffectiveScrollbarStyle.js";
9
9
 
10
+ type HTMLElementWithDisabled = HTMLElement & { disabled?: boolean };
11
+
10
12
  /**
11
13
  * @class
12
14
  *
@@ -59,6 +61,66 @@ class UDExDropdown extends Popover {
59
61
  content.style.maxHeight = this.height;
60
62
  }
61
63
  }
64
+
65
+ // Shift+Tab from first focusable element: close and return focus to opener
66
+ forwardToLast(): Promise<void> {
67
+ this.closePopup(false, false, true);
68
+ const openerEl = this.getOpenerHTMLElement(this.opener);
69
+ if (openerEl) {
70
+ openerEl.focus();
71
+ }
72
+ return Promise.resolve();
73
+ }
74
+
75
+ // Tab from last focusable element: close and move focus to next element after opener
76
+ forwardToFirst(): Promise<void> {
77
+ const openerHost = this._getOpenerHost();
78
+ this.closePopup(false, false, true);
79
+ if (openerHost) {
80
+ this._moveFocusAfter(openerHost);
81
+ }
82
+ return Promise.resolve();
83
+ }
84
+
85
+ private _getOpenerHost(): HTMLElement | null {
86
+ const opener = this.opener;
87
+ if (!opener) { return null; }
88
+ if (opener instanceof HTMLElement) { return opener; }
89
+ const root = this.getRootNode() as Document | ShadowRoot;
90
+ return (root as Document).getElementById?.(opener) ?? document.getElementById(opener);
91
+ }
92
+
93
+ private _moveFocusAfter(from: Element): void {
94
+ let node: Element | null = from;
95
+ while (node && node !== document.documentElement) {
96
+ let sibling = node.nextElementSibling;
97
+ while (sibling) {
98
+ const focusable = this._firstFocusableIn(sibling as HTMLElement);
99
+ if (focusable) {
100
+ focusable.focus();
101
+ return;
102
+ }
103
+ sibling = sibling.nextElementSibling;
104
+ }
105
+ node = node.parentElement;
106
+ }
107
+ }
108
+
109
+ private _firstFocusableIn(el: HTMLElement): HTMLElement | null {
110
+ if (!el) { return null; }
111
+ if (
112
+ el.tabIndex >= 0
113
+ && !el.hidden
114
+ && !(el as HTMLElementWithDisabled).disabled
115
+ && (!!el.offsetParent || el.matches("body"))
116
+ ) {
117
+ return el;
118
+ }
119
+ return Array.from(el.children).reduce<HTMLElement | null>(
120
+ (found, child) => found ?? this._firstFocusableIn(child as HTMLElement),
121
+ null,
122
+ );
123
+ }
62
124
  }
63
125
 
64
126
  UDExDropdown.define();
package/src/List.ts CHANGED
@@ -146,12 +146,7 @@ class UDExList extends UI5Element {
146
146
  @property({ type: String })
147
147
  itemIcon: string = "";
148
148
 
149
- /**
150
- * Enables tab navigation for the list.
151
- *
152
- * @default ""
153
- * @public
154
- */
149
+ /** @deprecated Tab keyboard navigation is no longer allowed. */
155
150
  @property({ type: Boolean })
156
151
  tabNavigationEnabled?: boolean;
157
152
 
@@ -190,10 +185,6 @@ class UDExList extends UI5Element {
190
185
  }
191
186
 
192
187
  handleKeyDown(e: KeyboardEvent): void {
193
- if (this.tabNavigationEnabled) {
194
- return;
195
- }
196
-
197
188
  if (isRight(e)) {
198
189
  this.handleArrowRight(e);
199
190
  }
@@ -398,10 +389,8 @@ class UDExList extends UI5Element {
398
389
  clickedItem.selected = true;
399
390
  }
400
391
 
401
- if (!this.tabNavigationEnabled) {
402
- this.resetTabIndexes();
403
- clickedItem._tabIndex = "0";
404
- }
392
+ this.resetTabIndexes();
393
+ clickedItem._tabIndex = "0";
405
394
 
406
395
  this.fireDecoratorEvent("selection-change", {
407
396
  listItems: this.getItemsFromList(),
@@ -487,10 +476,6 @@ class UDExList extends UI5Element {
487
476
  }
488
477
 
489
478
  getTabIndex(index: number, item: UDExListItemBase): string {
490
- if (this.tabNavigationEnabled) {
491
- return "0";
492
- }
493
-
494
479
  const isFirstItem = this.modeSelected && index === 0;
495
480
  const isFirstItemInGroupList = this.isGroupList && index === 1;
496
481
  const listGroupHeader = item.closest("[udex-list-group-header]") as UDExListGroupHeader;
@@ -14,6 +14,7 @@
14
14
  icon-start>
15
15
  </udex-masthead-menu-item>
16
16
  {{/unless}}
17
+ {{#unless hideSearch}}
17
18
  <udex-search
18
19
  class="udex-masthead-country-selector__search"
19
20
  @ui5-handle-value-search="{{handleSearch}}"
@@ -27,6 +28,7 @@
27
28
  show-submit-button>
28
29
  </udex-search>
29
30
  <span aria-live="polite" aria-atomic="true" class="hidden">{{_accSearchResultInfo}}</span>
31
+ {{/unless}}
30
32
  <div class="udex-masthead-country-selector__list-container">
31
33
  <div class="udex-masthead-country-selector__list-wrap" @scroll={{this.handleCountryListShadowVisible}}>
32
34
  <ul class="udex-masthead-country-selector__list udex-masthead-country-selector__list_countries" role="menu">
@@ -192,6 +192,15 @@ class UDExMastheadCountrySelector extends UI5Element {
192
192
  @property({ type: Boolean })
193
193
  showSearchVoiceButton!: boolean;
194
194
 
195
+ /**
196
+ * Hides the search field in the country list view.
197
+ *
198
+ * @default false
199
+ * @public
200
+ */
201
+ @property({ type: Boolean })
202
+ hideSearch!: boolean;
203
+
195
204
  /**
196
205
  * Defines the language voice of the search
197
206
  *
@@ -243,6 +243,7 @@
243
243
  @click="{{../handleMobileCategoryItemEvent}}"
244
244
  label="{{this.title}}"
245
245
  url="{{this.url}}"
246
+ has-border
246
247
  third-level>
247
248
  </udex-masthead-menu-item>
248
249
  </li>
@@ -8,6 +8,8 @@ import type I18nBundle from "@ui5/webcomponents-base/dist/i18nBundle.js";
8
8
  import UDExTextField from "./TextField.js";
9
9
  import UDExValueState from "./types/common.js";
10
10
  import PasswordFieldTemplate from "./PasswordFieldTemplate.js";
11
+ import { SHOW_PASSWORD, HIDE_PASSWORD } from "./generated/i18n/i18n-defaults.js";
12
+ import translate from "./utils/translate.js";
11
13
 
12
14
  export enum UDExInputType {
13
15
  Password = "Password",
@@ -233,6 +235,16 @@ class UDExPasswordField extends UI5Element {
233
235
  @property({ type: String })
234
236
  showButtonTooltip!: string;
235
237
 
238
+ /**
239
+ * Defines the tooltip for the hide password button.
240
+ *
241
+ * @default ""
242
+ * @public
243
+ */
244
+
245
+ @property({ type: String })
246
+ hideButtonTooltip!: string;
247
+
236
248
  /**
237
249
  * Defines the inner stored readonly state.
238
250
  *
@@ -309,6 +321,18 @@ class UDExPasswordField extends UI5Element {
309
321
  get iconButton(): string | undefined {
310
322
  return this.renderShowButton ? this.icon : undefined;
311
323
  }
324
+
325
+ get activeButtonTooltip(): string {
326
+ return this.passwordVisible ? this.hideButtonTooltipText : this.showButtonTooltipText;
327
+ }
328
+
329
+ get hideButtonTooltipText(): string {
330
+ return this.hideButtonTooltip || translate(UDExPasswordField, HIDE_PASSWORD);
331
+ }
332
+
333
+ get showButtonTooltipText(): string {
334
+ return this.showButtonTooltip || translate(UDExPasswordField, SHOW_PASSWORD);
335
+ }
312
336
  }
313
337
 
314
338
  UDExPasswordField.define();
@@ -19,8 +19,8 @@ export default function PasswordFieldTemplate(this: UDExPasswordField) {
19
19
  supporting-text={this.supportingText}
20
20
  accessible-name={this.accessibleName}
21
21
  accessible-name-ref={this.accessibleNameRef}
22
- accessible-icon-name={this.showButtonTooltip}
23
- show-button-tooltip={this.showButtonTooltip}
22
+ accessible-icon-name={this.activeButtonTooltip}
23
+ button-tooltip={this.activeButtonTooltip}
24
24
  onui5-input={this.handleInput}
25
25
  onui5-change={this.handleChange}
26
26
  onui5-blur={this.handleBlur}
package/src/Search.ts CHANGED
@@ -1005,7 +1005,7 @@ class UDExSearch extends UI5Element {
1005
1005
  e.stopPropagation();
1006
1006
  this.handleEnterKey(e);
1007
1007
  this.handleTabKey(e);
1008
- this.handleShiftTabKey(e);
1008
+ this.handleDownKey(e);
1009
1009
  this.handleEscapeKey(e);
1010
1010
  this.fireDecoratorEvent("search-keydown", { e });
1011
1011
  };
@@ -1022,14 +1022,21 @@ class UDExSearch extends UI5Element {
1022
1022
  }
1023
1023
 
1024
1024
  handleTabKey(e: KeyboardEvent) {
1025
- if (isTabNext(e) && this.open) {
1026
- this.Suggestion?.onTab(e);
1025
+ if (!this.open || this.openSuggestionPopup) {
1026
+ return;
1027
+ }
1028
+ if (isTabNext(e) || isTabPrevious(e)) {
1029
+ this.onClosePopover();
1027
1030
  }
1028
1031
  }
1029
1032
 
1030
- handleShiftTabKey(e: KeyboardEvent) {
1031
- if (isTabPrevious(e) && this.open) {
1032
- this.Suggestion?.onShiftTab(e);
1033
+ handleDownKey(e: KeyboardEvent) {
1034
+ if (isDown(e) && this.showSuggestedPopover) {
1035
+ e.preventDefault();
1036
+ if (!this.open) {
1037
+ this.onOpenPopover();
1038
+ }
1039
+ this.Suggestion?.onKeyDown(e);
1033
1040
  }
1034
1041
  }
1035
1042
 
@@ -1104,9 +1111,6 @@ class UDExSearch extends UI5Element {
1104
1111
  }
1105
1112
 
1106
1113
  handleKeyDownReset(e: KeyboardEvent) {
1107
- if (isTabPrevious(e) && this.open) {
1108
- this.Suggestion?.handlePrevTabReset(e);
1109
- }
1110
1114
  if (isEnter(e) || isSpace(e)) {
1111
1115
  e.preventDefault();
1112
1116
  e.stopPropagation();
@@ -232,7 +232,6 @@ function renderSearchSuggestionPopover(this: UDExSearch) {
232
232
  style={this.popoverStyles}
233
233
  id={this.getSuggestionsPopoverId}
234
234
  aria-orientation="vertical"
235
- accessible-role="Dialog"
236
235
  onKeyDown={this.handleKeyPressSuggestionList}
237
236
  accessible-name={this.suggestionsAccessibleName}
238
237
  >
@@ -277,7 +276,6 @@ function renderSearchSuggestionPopoverResultsSuggestedList(this: UDExSearch) {
277
276
  <div class="udex-search-suggestions__list"
278
277
  role="listbox"
279
278
  aria-labelledby="suggested-heading"
280
- tabindex={0}
281
279
  onKeyDown={this.handleKeyDownPopover}
282
280
  >
283
281
  {
@@ -317,7 +315,6 @@ function renderSearchSuggestionPopoverResultsRecommendedList(this: UDExSearch) {
317
315
  <div class="udex-search-suggestions__list"
318
316
  role="listbox"
319
317
  aria-labelledby="recommended-heading"
320
- tabindex={0}
321
318
  onKeyDown={this.handleKeyDownPopover}
322
319
  >
323
320
  {
@@ -125,12 +125,7 @@ export type UDExSearchableListBaseEvents = {
125
125
 
126
126
  class UDExSearchableListBase extends UI5Element {
127
127
  eventDetails!: UDExSearchableListBaseEvents;
128
- /**
129
- * Enables tab navigation for the list.
130
- *
131
- * @default ""
132
- * @public
133
- */
128
+ /** @deprecated Tab keyboard navigation is no longer allowed. */
134
129
  @property({ type: Boolean })
135
130
  tabNavigationEnabled?: boolean;
136
131
 
@@ -50,7 +50,6 @@ export default function SearchableListBaseTemplate(this: UDExSearchableListBase)
50
50
  role={this.roleForGroupList as AriaRole}
51
51
  accessible-role={this.accessibleRoleForList}
52
52
  class="udex-filter-menu__list"
53
- tab-navigation-enabled={this.tabNavigationEnabled}
54
53
  controlled={this.isControlled}
55
54
  mode={this.mode}>
56
55
  {this._filteredItems.map((processedItem, index) => (