@ui5/webcomponents-fiori 2.4.0-rc.0 → 2.4.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 (167) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/cypress/specs/BarcodeScannerDialog.cy.ts +349 -0
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/BarcodeScannerDialog.d.ts +49 -14
  5. package/dist/BarcodeScannerDialog.js +218 -65
  6. package/dist/BarcodeScannerDialog.js.map +1 -1
  7. package/dist/DynamicPage.d.ts +1 -1
  8. package/dist/FlexibleColumnLayout.d.ts +1 -1
  9. package/dist/NotificationListGroupItem.d.ts +1 -1
  10. package/dist/NotificationListGroupItem.js +1 -1
  11. package/dist/NotificationListGroupItem.js.map +1 -1
  12. package/dist/Page.d.ts +1 -0
  13. package/dist/Page.js +2 -0
  14. package/dist/Page.js.map +1 -1
  15. package/dist/Wizard.d.ts +1 -1
  16. package/dist/css/themes/BarcodeScannerDialog.css +1 -1
  17. package/dist/css/themes/DynamicPage.css +1 -1
  18. package/dist/css/themes/DynamicPageHeader.css +1 -1
  19. package/dist/css/themes/DynamicPageHeaderActions.css +1 -1
  20. package/dist/css/themes/DynamicPageTitle.css +1 -1
  21. package/dist/css/themes/FlexibleColumnLayout.css +1 -1
  22. package/dist/css/themes/MediaGallery.css +1 -1
  23. package/dist/css/themes/MediaGalleryItem.css +1 -1
  24. package/dist/css/themes/NotificationListGroupItem.css +1 -1
  25. package/dist/css/themes/NotificationListItem.css +1 -1
  26. package/dist/css/themes/NotificationListItemBase.css +1 -1
  27. package/dist/css/themes/NotificationStateIcon.css +1 -1
  28. package/dist/css/themes/Page.css +1 -1
  29. package/dist/css/themes/ProductSwitchItem.css +1 -1
  30. package/dist/css/themes/ShellBar.css +1 -1
  31. package/dist/css/themes/SideNavigation.css +1 -1
  32. package/dist/css/themes/SideNavigationGroup.css +1 -1
  33. package/dist/css/themes/SideNavigationItem.css +1 -1
  34. package/dist/css/themes/SideNavigationItemBase.css +1 -1
  35. package/dist/css/themes/SideNavigationPopover.css +1 -1
  36. package/dist/css/themes/SideNavigationSubItem.css +1 -1
  37. package/dist/css/themes/Timeline.css +1 -1
  38. package/dist/css/themes/TimelineGroupItem.css +1 -1
  39. package/dist/css/themes/TimelineItem.css +1 -1
  40. package/dist/css/themes/UploadCollection.css +1 -1
  41. package/dist/css/themes/UploadCollectionItem.css +1 -1
  42. package/dist/css/themes/ViewSettingsDialog.css +1 -1
  43. package/dist/css/themes/Wizard.css +1 -1
  44. package/dist/css/themes/WizardTab.css +1 -1
  45. package/dist/css/themes/sap_fiori_3/parameters-bundle.css +1 -1
  46. package/dist/css/themes/sap_fiori_3_dark/parameters-bundle.css +1 -1
  47. package/dist/css/themes/sap_fiori_3_hcb/parameters-bundle.css +1 -1
  48. package/dist/css/themes/sap_fiori_3_hcw/parameters-bundle.css +1 -1
  49. package/dist/css/themes/sap_horizon/parameters-bundle.css +1 -1
  50. package/dist/css/themes/sap_horizon_dark/parameters-bundle.css +1 -1
  51. package/dist/css/themes/sap_horizon_dark_exp/parameters-bundle.css +1 -1
  52. package/dist/css/themes/sap_horizon_exp/parameters-bundle.css +1 -1
  53. package/dist/css/themes/sap_horizon_hcb/parameters-bundle.css +1 -1
  54. package/dist/css/themes/sap_horizon_hcb_exp/parameters-bundle.css +1 -1
  55. package/dist/css/themes/sap_horizon_hcw/parameters-bundle.css +1 -1
  56. package/dist/css/themes/sap_horizon_hcw_exp/parameters-bundle.css +1 -1
  57. package/dist/custom-elements-internal.json +2 -1
  58. package/dist/generated/assets/themes/sap_fiori_3/parameters-bundle.css.json +1 -1
  59. package/dist/generated/assets/themes/sap_fiori_3_dark/parameters-bundle.css.json +1 -1
  60. package/dist/generated/assets/themes/sap_fiori_3_hcb/parameters-bundle.css.json +1 -1
  61. package/dist/generated/assets/themes/sap_fiori_3_hcw/parameters-bundle.css.json +1 -1
  62. package/dist/generated/assets/themes/sap_horizon/parameters-bundle.css.json +1 -1
  63. package/dist/generated/assets/themes/sap_horizon_dark/parameters-bundle.css.json +1 -1
  64. package/dist/generated/assets/themes/sap_horizon_dark_exp/parameters-bundle.css.json +1 -1
  65. package/dist/generated/assets/themes/sap_horizon_exp/parameters-bundle.css.json +1 -1
  66. package/dist/generated/assets/themes/sap_horizon_hcb/parameters-bundle.css.json +1 -1
  67. package/dist/generated/assets/themes/sap_horizon_hcb_exp/parameters-bundle.css.json +1 -1
  68. package/dist/generated/assets/themes/sap_horizon_hcw/parameters-bundle.css.json +1 -1
  69. package/dist/generated/assets/themes/sap_horizon_hcw_exp/parameters-bundle.css.json +1 -1
  70. package/dist/generated/templates/BarcodeScannerDialogTemplate.lit.js +1 -1
  71. package/dist/generated/templates/BarcodeScannerDialogTemplate.lit.js.map +1 -1
  72. package/dist/generated/templates/NotificationListGroupItemTemplate.lit.js +1 -1
  73. package/dist/generated/templates/NotificationListGroupItemTemplate.lit.js.map +1 -1
  74. package/dist/generated/themes/BarcodeScannerDialog.css.js +1 -1
  75. package/dist/generated/themes/BarcodeScannerDialog.css.js.map +1 -1
  76. package/dist/generated/themes/DynamicPage.css.js +1 -1
  77. package/dist/generated/themes/DynamicPage.css.js.map +1 -1
  78. package/dist/generated/themes/DynamicPageHeader.css.js +1 -1
  79. package/dist/generated/themes/DynamicPageHeader.css.js.map +1 -1
  80. package/dist/generated/themes/DynamicPageHeaderActions.css.js +1 -1
  81. package/dist/generated/themes/DynamicPageHeaderActions.css.js.map +1 -1
  82. package/dist/generated/themes/DynamicPageTitle.css.js +1 -1
  83. package/dist/generated/themes/DynamicPageTitle.css.js.map +1 -1
  84. package/dist/generated/themes/FlexibleColumnLayout.css.js +1 -1
  85. package/dist/generated/themes/FlexibleColumnLayout.css.js.map +1 -1
  86. package/dist/generated/themes/MediaGallery.css.js +1 -1
  87. package/dist/generated/themes/MediaGallery.css.js.map +1 -1
  88. package/dist/generated/themes/MediaGalleryItem.css.js +1 -1
  89. package/dist/generated/themes/MediaGalleryItem.css.js.map +1 -1
  90. package/dist/generated/themes/NotificationListGroupItem.css.js +1 -1
  91. package/dist/generated/themes/NotificationListGroupItem.css.js.map +1 -1
  92. package/dist/generated/themes/NotificationListItem.css.js +1 -1
  93. package/dist/generated/themes/NotificationListItem.css.js.map +1 -1
  94. package/dist/generated/themes/NotificationListItemBase.css.js +1 -1
  95. package/dist/generated/themes/NotificationListItemBase.css.js.map +1 -1
  96. package/dist/generated/themes/NotificationStateIcon.css.js +1 -1
  97. package/dist/generated/themes/NotificationStateIcon.css.js.map +1 -1
  98. package/dist/generated/themes/Page.css.js +1 -1
  99. package/dist/generated/themes/Page.css.js.map +1 -1
  100. package/dist/generated/themes/ProductSwitchItem.css.js +1 -1
  101. package/dist/generated/themes/ProductSwitchItem.css.js.map +1 -1
  102. package/dist/generated/themes/ShellBar.css.js +1 -1
  103. package/dist/generated/themes/ShellBar.css.js.map +1 -1
  104. package/dist/generated/themes/SideNavigation.css.js +1 -1
  105. package/dist/generated/themes/SideNavigation.css.js.map +1 -1
  106. package/dist/generated/themes/SideNavigationGroup.css.js +1 -1
  107. package/dist/generated/themes/SideNavigationGroup.css.js.map +1 -1
  108. package/dist/generated/themes/SideNavigationItem.css.js +1 -1
  109. package/dist/generated/themes/SideNavigationItem.css.js.map +1 -1
  110. package/dist/generated/themes/SideNavigationItemBase.css.js +1 -1
  111. package/dist/generated/themes/SideNavigationItemBase.css.js.map +1 -1
  112. package/dist/generated/themes/SideNavigationPopover.css.js +1 -1
  113. package/dist/generated/themes/SideNavigationPopover.css.js.map +1 -1
  114. package/dist/generated/themes/SideNavigationSubItem.css.js +1 -1
  115. package/dist/generated/themes/SideNavigationSubItem.css.js.map +1 -1
  116. package/dist/generated/themes/Timeline.css.js +1 -1
  117. package/dist/generated/themes/Timeline.css.js.map +1 -1
  118. package/dist/generated/themes/TimelineGroupItem.css.js +1 -1
  119. package/dist/generated/themes/TimelineGroupItem.css.js.map +1 -1
  120. package/dist/generated/themes/TimelineItem.css.js +1 -1
  121. package/dist/generated/themes/TimelineItem.css.js.map +1 -1
  122. package/dist/generated/themes/UploadCollection.css.js +1 -1
  123. package/dist/generated/themes/UploadCollection.css.js.map +1 -1
  124. package/dist/generated/themes/UploadCollectionItem.css.js +1 -1
  125. package/dist/generated/themes/UploadCollectionItem.css.js.map +1 -1
  126. package/dist/generated/themes/ViewSettingsDialog.css.js +1 -1
  127. package/dist/generated/themes/ViewSettingsDialog.css.js.map +1 -1
  128. package/dist/generated/themes/Wizard.css.js +1 -1
  129. package/dist/generated/themes/Wizard.css.js.map +1 -1
  130. package/dist/generated/themes/WizardTab.css.js +1 -1
  131. package/dist/generated/themes/WizardTab.css.js.map +1 -1
  132. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js +1 -1
  133. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js.map +1 -1
  134. package/dist/generated/themes/sap_fiori_3_dark/parameters-bundle.css.js +1 -1
  135. package/dist/generated/themes/sap_fiori_3_dark/parameters-bundle.css.js.map +1 -1
  136. package/dist/generated/themes/sap_fiori_3_hcb/parameters-bundle.css.js +1 -1
  137. package/dist/generated/themes/sap_fiori_3_hcb/parameters-bundle.css.js.map +1 -1
  138. package/dist/generated/themes/sap_fiori_3_hcw/parameters-bundle.css.js +1 -1
  139. package/dist/generated/themes/sap_fiori_3_hcw/parameters-bundle.css.js.map +1 -1
  140. package/dist/generated/themes/sap_horizon/parameters-bundle.css.js +1 -1
  141. package/dist/generated/themes/sap_horizon/parameters-bundle.css.js.map +1 -1
  142. package/dist/generated/themes/sap_horizon_dark/parameters-bundle.css.js +1 -1
  143. package/dist/generated/themes/sap_horizon_dark/parameters-bundle.css.js.map +1 -1
  144. package/dist/generated/themes/sap_horizon_dark_exp/parameters-bundle.css.js +1 -1
  145. package/dist/generated/themes/sap_horizon_dark_exp/parameters-bundle.css.js.map +1 -1
  146. package/dist/generated/themes/sap_horizon_exp/parameters-bundle.css.js +1 -1
  147. package/dist/generated/themes/sap_horizon_exp/parameters-bundle.css.js.map +1 -1
  148. package/dist/generated/themes/sap_horizon_hcb/parameters-bundle.css.js +1 -1
  149. package/dist/generated/themes/sap_horizon_hcb/parameters-bundle.css.js.map +1 -1
  150. package/dist/generated/themes/sap_horizon_hcb_exp/parameters-bundle.css.js +1 -1
  151. package/dist/generated/themes/sap_horizon_hcb_exp/parameters-bundle.css.js.map +1 -1
  152. package/dist/generated/themes/sap_horizon_hcw/parameters-bundle.css.js +1 -1
  153. package/dist/generated/themes/sap_horizon_hcw/parameters-bundle.css.js.map +1 -1
  154. package/dist/generated/themes/sap_horizon_hcw_exp/parameters-bundle.css.js +1 -1
  155. package/dist/generated/themes/sap_horizon_hcw_exp/parameters-bundle.css.js.map +1 -1
  156. package/dist/web-types.json +1 -1
  157. package/package.json +7 -7
  158. package/src/BarcodeScannerDialog.hbs +5 -13
  159. package/src/NotificationListGroupItem.hbs +2 -1
  160. package/src/themes/BarcodeScannerDialog.css +45 -34
  161. package/src/themes/NotificationListGroupItem.css +11 -1
  162. package/src/themes/base/NotificationListItem-parameters.css +1 -0
  163. package/src/themes/sap_horizon/NotificationListItem-parameters.css +0 -1
  164. package/src/themes/sap_horizon_dark/NotificationListItem-parameters.css +0 -1
  165. package/src/themes/sap_horizon_hcb/NotificationListItem-parameters.css +0 -1
  166. package/src/themes/sap_horizon_hcw/NotificationListItem-parameters.css +0 -1
  167. package/tsconfig.json +2 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,24 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [2.4.0-rc.1](https://github.com/SAP/ui5-webcomponents/compare/v2.4.0-rc.0...v2.4.0-rc.1) (2024-10-17)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **tools:** revert tsconfig moduleResolution to node ([#10014](https://github.com/SAP/ui5-webcomponents/issues/10014)) ([0724b92](https://github.com/SAP/ui5-webcomponents/commit/0724b9289ad04f88972d4978ed37e76f13abca13))
12
+ * **ui5-notification-list-group:** group header hight is shorter when collapsed ([#9953](https://github.com/SAP/ui5-webcomponents/issues/9953)) ([4c8a76e](https://github.com/SAP/ui5-webcomponents/commit/4c8a76edb5699810addd5c77fac2eabd507568f3)), closes [#9911](https://github.com/SAP/ui5-webcomponents/issues/9911)
13
+ * **ui5-page:** fix createElement error caused by adding new style property in the constructor ([#9998](https://github.com/SAP/ui5-webcomponents/issues/9998)) ([fd402e4](https://github.com/SAP/ui5-webcomponents/commit/fd402e41933da5e57456b736332872a0f0006cdf)), closes [#9981](https://github.com/SAP/ui5-webcomponents/issues/9981)
14
+
15
+
16
+ ### Features
17
+
18
+ * **ui5-barcode-scanner-dialog:** added capture region overlay ([#9646](https://github.com/SAP/ui5-webcomponents/issues/9646)) ([19475eb](https://github.com/SAP/ui5-webcomponents/commit/19475eb897d08c5f09ae2583678cc79decca5adc))
19
+
20
+
21
+
22
+
23
+
6
24
  # [2.4.0-rc.0](https://github.com/SAP/ui5-webcomponents/compare/v2.3.1-rc.0...v2.4.0-rc.0) (2024-10-10)
7
25
 
8
26
 
@@ -0,0 +1,349 @@
1
+ import { html } from "lit";
2
+ import "@ui5/webcomponents-icons/dist/camera.js";
3
+ import "../../src/BarcodeScannerDialog.js";
4
+ import type BarcodeScannerDialog from "../../src/BarcodeScannerDialog.js";
5
+
6
+ describe("BarcodeScannerDialog", () => {
7
+ let handleScanSuccess: (event: CustomEvent) => void;
8
+ let handleScanError: (event: CustomEvent) => void;
9
+
10
+ beforeEach(() => {
11
+ cy.mount(html`
12
+ <ui5-barcode-scanner-dialog id="dlgScan"></ui5-barcode-scanner-dialog>
13
+ <ui5-button id="btnScan" icon="camera">Open Scanner Dialog</ui5-button>
14
+
15
+ <div>
16
+ <ui5-label id="scanResult"></ui5-label>
17
+ <ui5-label id="scanError"></ui5-label>
18
+ </div>
19
+ `);
20
+
21
+ cy.get("#dlgScan").as("dialog");
22
+ cy.get("#btnScan").as("button");
23
+ cy.get("@dialog")
24
+ .shadow()
25
+ .find(".ui5-barcode-scanner-dialog-video")
26
+ .as("videoElement");
27
+
28
+ // Add event listener to the button to open the dialog
29
+ cy.document().then(doc => {
30
+ const dlgScan = doc.querySelector<BarcodeScannerDialog>("#dlgScan")!;
31
+ const btnScan = doc.querySelector("#btnScan")!;
32
+
33
+ btnScan.addEventListener("click", () => {
34
+ dlgScan.open = true;
35
+ });
36
+ });
37
+ });
38
+
39
+ afterEach(() => {
40
+ // Remove event listeners if they were added
41
+ cy.document().then(doc => {
42
+ const dlgScan = doc.querySelector<BarcodeScannerDialog>("#dlgScan")!;
43
+ if (handleScanSuccess) {
44
+ dlgScan.removeEventListener("scan-success", handleScanSuccess as EventListener);
45
+ handleScanSuccess = undefined!;
46
+ }
47
+ if (handleScanError) {
48
+ dlgScan.removeEventListener("scan-error", handleScanError as EventListener);
49
+ handleScanError = undefined!;
50
+ }
51
+
52
+ // Clear the scan result and error
53
+ const scanResultElement = doc.querySelector("#scanResult")!;
54
+ const scanErrorElement = doc.querySelector("#scanError")!;
55
+ scanResultElement.textContent = "";
56
+ scanErrorElement.textContent = "";
57
+ });
58
+ });
59
+
60
+ it("should open and close the dialog", () => {
61
+ // Before clicking, the dialog should not be open
62
+ cy.get("@dialog")
63
+ .shadow()
64
+ .find("ui5-dialog")
65
+ .should("not.have.attr", "open");
66
+
67
+ // Click the button to open the dialog
68
+ cy.get("@button").realClick();
69
+
70
+ // Wait for the video to be ready
71
+ cy.get("@videoElement").should($video => {
72
+ const videoEl = $video[0] as HTMLVideoElement;
73
+ expect(videoEl.readyState, "Video readyState should be >= 1").to.be.at.least(1);
74
+ });
75
+
76
+ // Assert that the dialog is open
77
+ cy.get("@dialog")
78
+ .shadow()
79
+ .find("ui5-dialog")
80
+ .should("have.attr", "open");
81
+
82
+ // Close the dialog using the close button
83
+ cy.get("@dialog")
84
+ .shadow()
85
+ .find("ui5-dialog [slot=footer] ui5-button")
86
+ .realClick();
87
+
88
+ // Verify the dialog is closed
89
+ cy.get("@dialog")
90
+ .shadow()
91
+ .find("ui5-dialog")
92
+ .should("not.have.attr", "open");
93
+ });
94
+
95
+ it("closes barcode scanner dialog with escape key", () => {
96
+ // Click the button to open the dialog
97
+ cy.get("@button").realClick();
98
+
99
+ // Wait for the video to be ready
100
+ cy.get("@videoElement").should($video => {
101
+ const videoEl = $video[0] as HTMLVideoElement;
102
+ expect(videoEl.readyState, "Video readyState should be >= 1").to.be.at.least(1);
103
+ });
104
+
105
+ // Assert that the dialog is open
106
+ cy.get("@dialog")
107
+ .shadow()
108
+ .find("ui5-dialog")
109
+ .should("have.attr", "open");
110
+
111
+ // Simulate pressing the Escape key
112
+ cy.get("@dialog").realPress("Escape");
113
+
114
+ // Verify the dialog is closed
115
+ cy.get("@dialog")
116
+ .shadow()
117
+ .find("ui5-dialog")
118
+ .should("not.have.attr", "open");
119
+ });
120
+
121
+ it("opens barcode scanner dialog and checks video stream", () => {
122
+ // Click the button to open the dialog
123
+ cy.get("@button").realClick();
124
+
125
+ // Wait for the video to be ready
126
+ cy.get("@videoElement").should($video => {
127
+ const videoEl = $video[0] as HTMLVideoElement;
128
+ expect(videoEl.readyState, "Video readyState should be >= 1").to.be.at.least(1);
129
+ });
130
+
131
+ // Assert that the dialog is open
132
+ cy.get("@dialog")
133
+ .shadow()
134
+ .find("ui5-dialog")
135
+ .should("have.attr", "open");
136
+
137
+ // Check that video.srcObject is not null
138
+ cy.get("@videoElement").should($video => {
139
+ const videoEl = $video[0] as HTMLVideoElement;
140
+ // eslint-disable-next-line no-unused-expressions
141
+ expect(videoEl.srcObject, "Video srcObject should not be null").to.not.be.null;
142
+ });
143
+
144
+ // Get the overlay canvas element
145
+ cy.get("@dialog")
146
+ .shadow()
147
+ .find(".ui5-barcode-scanner-dialog-overlay")
148
+ .as("overlayElement")
149
+ .should("be.visible");
150
+
151
+ // Check that the canvas dimensions match the video element's dimensions
152
+ cy.get("@videoElement").then($video => {
153
+ cy.get("@overlayElement").then($canvas => {
154
+ expect(
155
+ ($canvas[0] as HTMLCanvasElement).width,
156
+ "Canvas width should match video width",
157
+ ).to.equal($video[0].clientWidth);
158
+ expect(
159
+ ($canvas[0] as HTMLCanvasElement).height,
160
+ "Canvas height should match video height",
161
+ ).to.equal($video[0].clientHeight);
162
+ });
163
+ });
164
+ });
165
+
166
+ it("stops media tracks when the dialog is closed", () => {
167
+ // Click the button to open the dialog
168
+ cy.get("@button").realClick();
169
+
170
+ // Wait for the video to be ready
171
+ cy.get("@videoElement").should($video => {
172
+ const videoEl = $video[0] as HTMLVideoElement;
173
+ expect(videoEl.readyState, "Video readyState should be >= 1").to.be.at.least(1);
174
+ });
175
+
176
+ // Assert that the dialog is open
177
+ cy.get("@dialog")
178
+ .shadow()
179
+ .find("ui5-dialog")
180
+ .should("have.attr", "open");
181
+
182
+ // Save the media stream
183
+ cy.get("@videoElement").then($video => {
184
+ const videoEl = $video[0] as HTMLVideoElement;
185
+ cy.wrap(videoEl.srcObject).as("mediaStream");
186
+ });
187
+
188
+ // Close the dialog using the close button
189
+ cy.get("@dialog")
190
+ .shadow()
191
+ .find("ui5-dialog [slot=footer] ui5-button")
192
+ .realClick();
193
+
194
+ // Verify the dialog is closed
195
+ cy.get("@dialog")
196
+ .shadow()
197
+ .find("ui5-dialog")
198
+ .should("not.have.attr", "open");
199
+
200
+ // Check that media tracks are stopped
201
+ cy.get("@mediaStream").then(currentSubject => {
202
+ const mediaStream = currentSubject as unknown as MediaStream;
203
+ const tracksStopped = mediaStream
204
+ .getTracks()
205
+ .every(track => track.readyState === "ended");
206
+ // eslint-disable-next-line no-unused-expressions
207
+ expect(tracksStopped, "All media tracks should be stopped").to.be.true;
208
+ });
209
+
210
+ // Check that video srcObject is cleared
211
+ cy.get("@videoElement").then($video => {
212
+ const videoEl = $video[0] as HTMLVideoElement;
213
+ // eslint-disable-next-line no-unused-expressions
214
+ expect(videoEl.srcObject, "Video srcObject should be null").to.be.null;
215
+ });
216
+ });
217
+
218
+ it("displays the busy indicator while loading", () => {
219
+ // Stub the _getUserPermission method to simulate delay
220
+ cy.get("@dialog").then($dialog => {
221
+ const dlgScan = $dialog.get(0) as BarcodeScannerDialog;
222
+
223
+ const stub = cy
224
+ .stub(dlgScan, "_getUserPermission")
225
+ .callsFake(() => new Promise(() => { })); // Never resolves
226
+ cy.wrap(stub).as("getUserPermissionStub");
227
+ });
228
+
229
+ // Open the dialog
230
+ cy.get("@button").realClick();
231
+
232
+ // Check that the busy indicator is visible
233
+ cy.get("@dialog")
234
+ .shadow()
235
+ .find(".ui5-barcode-scanner-dialog-busy")
236
+ .should("be.visible");
237
+
238
+ // Restore the stub
239
+ cy.get("@getUserPermissionStub").then(stub => {
240
+ (stub as unknown as sinon.SinonStub).restore();
241
+ });
242
+ });
243
+
244
+ it("handles scan success event", () => {
245
+ // Define the event handler function
246
+ handleScanSuccess = (event: CustomEvent) => {
247
+ const detail = event.detail;
248
+ const scanResultElement = document.querySelector("#scanResult")!;
249
+ scanResultElement.textContent = detail.text;
250
+ };
251
+
252
+ // Get the scanResult element
253
+ cy.get("#scanResult").as("scanResult");
254
+
255
+ // Add event listener to display scan result
256
+ cy.get("@dialog").then($dialog => {
257
+ const dlgScan = $dialog.get(0) as BarcodeScannerDialog;
258
+ dlgScan.addEventListener("scan-success", handleScanSuccess as EventListener);
259
+ });
260
+
261
+ // Open the dialog
262
+ cy.get("@button").realClick();
263
+
264
+ // Simulate scan success
265
+ cy.get("@dialog").then($dialog => {
266
+ const dlgScan = $dialog.get(0) as BarcodeScannerDialog;
267
+
268
+ // Simulate the scan success
269
+ dlgScan.fireEvent("scan-success", {
270
+ text: "mocked-scan-result",
271
+ rawBytes: new Uint8Array(),
272
+ });
273
+ });
274
+
275
+ // Check that the scan result is displayed
276
+ cy.get("@scanResult").should("have.text", "mocked-scan-result");
277
+ });
278
+
279
+ it("handles scan error event", () => {
280
+ // Define the event handler function
281
+ handleScanError = (event: CustomEvent) => {
282
+ const detail = event.detail;
283
+ const scanErrorElement = document.querySelector("#scanError")!;
284
+ scanErrorElement.textContent = detail.message;
285
+ };
286
+
287
+ // Get the scanError element
288
+ cy.get("#scanError").as("scanError");
289
+
290
+ // Add event listener to display scan error
291
+ cy.get("@dialog").then($dialog => {
292
+ const dlgScan = $dialog.get(0) as BarcodeScannerDialog;
293
+ dlgScan.addEventListener("scan-error", handleScanError as EventListener);
294
+ });
295
+
296
+ // Open the dialog
297
+ cy.get("@button").realClick();
298
+
299
+ // Simulate scan error
300
+ cy.get("@dialog").then($dialog => {
301
+ const dlgScan = $dialog.get(0) as BarcodeScannerDialog;
302
+
303
+ // Simulate the scan error
304
+ dlgScan.fireEvent("scan-error", {
305
+ message: "mocked-scan-error",
306
+ });
307
+ });
308
+
309
+ // Check that the scan error is displayed
310
+ cy.get("@scanError").should("have.text", "mocked-scan-error");
311
+ });
312
+
313
+ it("handles permission denied error", () => {
314
+ // Define the event handler function
315
+ handleScanError = (event: CustomEvent) => {
316
+ const detail = event.detail;
317
+ const scanErrorElement = document.querySelector("#scanError")!;
318
+ scanErrorElement.textContent = detail.message;
319
+ };
320
+
321
+ // Get the scanError element
322
+ cy.get("#scanError").as("scanError");
323
+
324
+ // Stub getUserMedia to reject with "Permission denied"
325
+ cy.window().then(win => {
326
+ const stub = cy
327
+ .stub(win.navigator.mediaDevices, "getUserMedia")
328
+ .rejects(new DOMException("Permission denied", "NotAllowedError"));
329
+ cy.wrap(stub).as("getUserMediaStub");
330
+ });
331
+
332
+ // Add event listener to display scan error
333
+ cy.get("@dialog").then($dialog => {
334
+ const dlgScan = $dialog.get(0) as BarcodeScannerDialog;
335
+ dlgScan.addEventListener("scan-error", handleScanError as EventListener);
336
+ });
337
+
338
+ // Open the dialog
339
+ cy.get("@button").realClick();
340
+
341
+ // Check that the scan error is displayed
342
+ cy.get("@scanError").should("contain.text", "Permission denied");
343
+
344
+ // Restore the stub
345
+ cy.get("@getUserMediaStub").then(stub => {
346
+ (stub as unknown as sinon.SinonStub).restore();
347
+ });
348
+ });
349
+ });