@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.
- package/CHANGELOG.md +18 -0
- package/cypress/specs/BarcodeScannerDialog.cy.ts +349 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/BarcodeScannerDialog.d.ts +49 -14
- package/dist/BarcodeScannerDialog.js +218 -65
- package/dist/BarcodeScannerDialog.js.map +1 -1
- package/dist/DynamicPage.d.ts +1 -1
- package/dist/FlexibleColumnLayout.d.ts +1 -1
- package/dist/NotificationListGroupItem.d.ts +1 -1
- package/dist/NotificationListGroupItem.js +1 -1
- package/dist/NotificationListGroupItem.js.map +1 -1
- package/dist/Page.d.ts +1 -0
- package/dist/Page.js +2 -0
- package/dist/Page.js.map +1 -1
- package/dist/Wizard.d.ts +1 -1
- package/dist/css/themes/BarcodeScannerDialog.css +1 -1
- package/dist/css/themes/DynamicPage.css +1 -1
- package/dist/css/themes/DynamicPageHeader.css +1 -1
- package/dist/css/themes/DynamicPageHeaderActions.css +1 -1
- package/dist/css/themes/DynamicPageTitle.css +1 -1
- package/dist/css/themes/FlexibleColumnLayout.css +1 -1
- package/dist/css/themes/MediaGallery.css +1 -1
- package/dist/css/themes/MediaGalleryItem.css +1 -1
- package/dist/css/themes/NotificationListGroupItem.css +1 -1
- package/dist/css/themes/NotificationListItem.css +1 -1
- package/dist/css/themes/NotificationListItemBase.css +1 -1
- package/dist/css/themes/NotificationStateIcon.css +1 -1
- package/dist/css/themes/Page.css +1 -1
- package/dist/css/themes/ProductSwitchItem.css +1 -1
- package/dist/css/themes/ShellBar.css +1 -1
- package/dist/css/themes/SideNavigation.css +1 -1
- package/dist/css/themes/SideNavigationGroup.css +1 -1
- package/dist/css/themes/SideNavigationItem.css +1 -1
- package/dist/css/themes/SideNavigationItemBase.css +1 -1
- package/dist/css/themes/SideNavigationPopover.css +1 -1
- package/dist/css/themes/SideNavigationSubItem.css +1 -1
- package/dist/css/themes/Timeline.css +1 -1
- package/dist/css/themes/TimelineGroupItem.css +1 -1
- package/dist/css/themes/TimelineItem.css +1 -1
- package/dist/css/themes/UploadCollection.css +1 -1
- package/dist/css/themes/UploadCollectionItem.css +1 -1
- package/dist/css/themes/ViewSettingsDialog.css +1 -1
- package/dist/css/themes/Wizard.css +1 -1
- package/dist/css/themes/WizardTab.css +1 -1
- package/dist/css/themes/sap_fiori_3/parameters-bundle.css +1 -1
- package/dist/css/themes/sap_fiori_3_dark/parameters-bundle.css +1 -1
- package/dist/css/themes/sap_fiori_3_hcb/parameters-bundle.css +1 -1
- package/dist/css/themes/sap_fiori_3_hcw/parameters-bundle.css +1 -1
- package/dist/css/themes/sap_horizon/parameters-bundle.css +1 -1
- package/dist/css/themes/sap_horizon_dark/parameters-bundle.css +1 -1
- package/dist/css/themes/sap_horizon_dark_exp/parameters-bundle.css +1 -1
- package/dist/css/themes/sap_horizon_exp/parameters-bundle.css +1 -1
- package/dist/css/themes/sap_horizon_hcb/parameters-bundle.css +1 -1
- package/dist/css/themes/sap_horizon_hcb_exp/parameters-bundle.css +1 -1
- package/dist/css/themes/sap_horizon_hcw/parameters-bundle.css +1 -1
- package/dist/css/themes/sap_horizon_hcw_exp/parameters-bundle.css +1 -1
- package/dist/custom-elements-internal.json +2 -1
- package/dist/generated/assets/themes/sap_fiori_3/parameters-bundle.css.json +1 -1
- package/dist/generated/assets/themes/sap_fiori_3_dark/parameters-bundle.css.json +1 -1
- package/dist/generated/assets/themes/sap_fiori_3_hcb/parameters-bundle.css.json +1 -1
- package/dist/generated/assets/themes/sap_fiori_3_hcw/parameters-bundle.css.json +1 -1
- package/dist/generated/assets/themes/sap_horizon/parameters-bundle.css.json +1 -1
- package/dist/generated/assets/themes/sap_horizon_dark/parameters-bundle.css.json +1 -1
- package/dist/generated/assets/themes/sap_horizon_dark_exp/parameters-bundle.css.json +1 -1
- package/dist/generated/assets/themes/sap_horizon_exp/parameters-bundle.css.json +1 -1
- package/dist/generated/assets/themes/sap_horizon_hcb/parameters-bundle.css.json +1 -1
- package/dist/generated/assets/themes/sap_horizon_hcb_exp/parameters-bundle.css.json +1 -1
- package/dist/generated/assets/themes/sap_horizon_hcw/parameters-bundle.css.json +1 -1
- package/dist/generated/assets/themes/sap_horizon_hcw_exp/parameters-bundle.css.json +1 -1
- package/dist/generated/templates/BarcodeScannerDialogTemplate.lit.js +1 -1
- package/dist/generated/templates/BarcodeScannerDialogTemplate.lit.js.map +1 -1
- package/dist/generated/templates/NotificationListGroupItemTemplate.lit.js +1 -1
- package/dist/generated/templates/NotificationListGroupItemTemplate.lit.js.map +1 -1
- package/dist/generated/themes/BarcodeScannerDialog.css.js +1 -1
- package/dist/generated/themes/BarcodeScannerDialog.css.js.map +1 -1
- package/dist/generated/themes/DynamicPage.css.js +1 -1
- package/dist/generated/themes/DynamicPage.css.js.map +1 -1
- package/dist/generated/themes/DynamicPageHeader.css.js +1 -1
- package/dist/generated/themes/DynamicPageHeader.css.js.map +1 -1
- package/dist/generated/themes/DynamicPageHeaderActions.css.js +1 -1
- package/dist/generated/themes/DynamicPageHeaderActions.css.js.map +1 -1
- package/dist/generated/themes/DynamicPageTitle.css.js +1 -1
- package/dist/generated/themes/DynamicPageTitle.css.js.map +1 -1
- package/dist/generated/themes/FlexibleColumnLayout.css.js +1 -1
- package/dist/generated/themes/FlexibleColumnLayout.css.js.map +1 -1
- package/dist/generated/themes/MediaGallery.css.js +1 -1
- package/dist/generated/themes/MediaGallery.css.js.map +1 -1
- package/dist/generated/themes/MediaGalleryItem.css.js +1 -1
- package/dist/generated/themes/MediaGalleryItem.css.js.map +1 -1
- package/dist/generated/themes/NotificationListGroupItem.css.js +1 -1
- package/dist/generated/themes/NotificationListGroupItem.css.js.map +1 -1
- package/dist/generated/themes/NotificationListItem.css.js +1 -1
- package/dist/generated/themes/NotificationListItem.css.js.map +1 -1
- package/dist/generated/themes/NotificationListItemBase.css.js +1 -1
- package/dist/generated/themes/NotificationListItemBase.css.js.map +1 -1
- package/dist/generated/themes/NotificationStateIcon.css.js +1 -1
- package/dist/generated/themes/NotificationStateIcon.css.js.map +1 -1
- package/dist/generated/themes/Page.css.js +1 -1
- package/dist/generated/themes/Page.css.js.map +1 -1
- package/dist/generated/themes/ProductSwitchItem.css.js +1 -1
- package/dist/generated/themes/ProductSwitchItem.css.js.map +1 -1
- package/dist/generated/themes/ShellBar.css.js +1 -1
- package/dist/generated/themes/ShellBar.css.js.map +1 -1
- package/dist/generated/themes/SideNavigation.css.js +1 -1
- package/dist/generated/themes/SideNavigation.css.js.map +1 -1
- package/dist/generated/themes/SideNavigationGroup.css.js +1 -1
- package/dist/generated/themes/SideNavigationGroup.css.js.map +1 -1
- package/dist/generated/themes/SideNavigationItem.css.js +1 -1
- package/dist/generated/themes/SideNavigationItem.css.js.map +1 -1
- package/dist/generated/themes/SideNavigationItemBase.css.js +1 -1
- package/dist/generated/themes/SideNavigationItemBase.css.js.map +1 -1
- package/dist/generated/themes/SideNavigationPopover.css.js +1 -1
- package/dist/generated/themes/SideNavigationPopover.css.js.map +1 -1
- package/dist/generated/themes/SideNavigationSubItem.css.js +1 -1
- package/dist/generated/themes/SideNavigationSubItem.css.js.map +1 -1
- package/dist/generated/themes/Timeline.css.js +1 -1
- package/dist/generated/themes/Timeline.css.js.map +1 -1
- package/dist/generated/themes/TimelineGroupItem.css.js +1 -1
- package/dist/generated/themes/TimelineGroupItem.css.js.map +1 -1
- package/dist/generated/themes/TimelineItem.css.js +1 -1
- package/dist/generated/themes/TimelineItem.css.js.map +1 -1
- package/dist/generated/themes/UploadCollection.css.js +1 -1
- package/dist/generated/themes/UploadCollection.css.js.map +1 -1
- package/dist/generated/themes/UploadCollectionItem.css.js +1 -1
- package/dist/generated/themes/UploadCollectionItem.css.js.map +1 -1
- package/dist/generated/themes/ViewSettingsDialog.css.js +1 -1
- package/dist/generated/themes/ViewSettingsDialog.css.js.map +1 -1
- package/dist/generated/themes/Wizard.css.js +1 -1
- package/dist/generated/themes/Wizard.css.js.map +1 -1
- package/dist/generated/themes/WizardTab.css.js +1 -1
- package/dist/generated/themes/WizardTab.css.js.map +1 -1
- package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js +1 -1
- package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js.map +1 -1
- package/dist/generated/themes/sap_fiori_3_dark/parameters-bundle.css.js +1 -1
- package/dist/generated/themes/sap_fiori_3_dark/parameters-bundle.css.js.map +1 -1
- package/dist/generated/themes/sap_fiori_3_hcb/parameters-bundle.css.js +1 -1
- package/dist/generated/themes/sap_fiori_3_hcb/parameters-bundle.css.js.map +1 -1
- package/dist/generated/themes/sap_fiori_3_hcw/parameters-bundle.css.js +1 -1
- package/dist/generated/themes/sap_fiori_3_hcw/parameters-bundle.css.js.map +1 -1
- package/dist/generated/themes/sap_horizon/parameters-bundle.css.js +1 -1
- package/dist/generated/themes/sap_horizon/parameters-bundle.css.js.map +1 -1
- package/dist/generated/themes/sap_horizon_dark/parameters-bundle.css.js +1 -1
- package/dist/generated/themes/sap_horizon_dark/parameters-bundle.css.js.map +1 -1
- package/dist/generated/themes/sap_horizon_dark_exp/parameters-bundle.css.js +1 -1
- package/dist/generated/themes/sap_horizon_dark_exp/parameters-bundle.css.js.map +1 -1
- package/dist/generated/themes/sap_horizon_exp/parameters-bundle.css.js +1 -1
- package/dist/generated/themes/sap_horizon_exp/parameters-bundle.css.js.map +1 -1
- package/dist/generated/themes/sap_horizon_hcb/parameters-bundle.css.js +1 -1
- package/dist/generated/themes/sap_horizon_hcb/parameters-bundle.css.js.map +1 -1
- package/dist/generated/themes/sap_horizon_hcb_exp/parameters-bundle.css.js +1 -1
- package/dist/generated/themes/sap_horizon_hcb_exp/parameters-bundle.css.js.map +1 -1
- package/dist/generated/themes/sap_horizon_hcw/parameters-bundle.css.js +1 -1
- package/dist/generated/themes/sap_horizon_hcw/parameters-bundle.css.js.map +1 -1
- package/dist/generated/themes/sap_horizon_hcw_exp/parameters-bundle.css.js +1 -1
- package/dist/generated/themes/sap_horizon_hcw_exp/parameters-bundle.css.js.map +1 -1
- package/dist/web-types.json +1 -1
- package/package.json +7 -7
- package/src/BarcodeScannerDialog.hbs +5 -13
- package/src/NotificationListGroupItem.hbs +2 -1
- package/src/themes/BarcodeScannerDialog.css +45 -34
- package/src/themes/NotificationListGroupItem.css +11 -1
- package/src/themes/base/NotificationListItem-parameters.css +1 -0
- package/src/themes/sap_horizon/NotificationListItem-parameters.css +0 -1
- package/src/themes/sap_horizon_dark/NotificationListItem-parameters.css +0 -1
- package/src/themes/sap_horizon_hcb/NotificationListItem-parameters.css +0 -1
- package/src/themes/sap_horizon_hcw/NotificationListItem-parameters.css +0 -1
- 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
|
+
});
|