diff --git a/feature-libs/asm/styles/components/_asm-create-customer-form.component.scss b/feature-libs/asm/styles/components/_asm-create-customer-form.component.scss
index db3561d1427..aa01009d7a6 100644
--- a/feature-libs/asm/styles/components/_asm-create-customer-form.component.scss
+++ b/feature-libs/asm/styles/components/_asm-create-customer-form.component.scss
@@ -10,6 +10,8 @@
max-width: 100%;
.cx-message-header {
+ padding: 0.25rem 1rem;
+ min-height: auto;
padding-inline-end: 1rem;
font-size: 14px;
font-family: '72';
@@ -17,10 +19,17 @@
font-weight: 400;
line-height: 16px;
text-align: start;
+ .cx-message-icon {
+ align-self: flex-start;
+ }
+ .cx-message-text {
+ padding: 0.25rem 0;
+ }
}
}
.close {
- align-self: center;
+ align-self: flex-start;
+ padding: 0.25rem 0;
margin-inline-start: auto;
position: unset;
color: #0064d8;
From ec2c50ca687f5defd63b49e2d41ebb632efe3a56 Mon Sep 17 00:00:00 2001
From: niehuayang <126219214+niehuayang@users.noreply.github.com>
Date: Tue, 16 May 2023 16:59:02 +0800
Subject: [PATCH 005/122] chore: Improve ASM Create New Customer and Add
cumulus traceability (#17376)
Closes:
https://jira.tools.sap/browse/CXSPA-2934 ( Improve ASM to show Create Account in drop list without accessibility issue );
https://jira.tools.sap/browse/CXSPA-3312 ( Develop automated accessibility tests for ASM Create Account )
https://jira.tools.sap/browse/CXSPA-3147 ( Accessibility issues for ASM Create New Customer UI )
https://jira.tools.sap/browse/CXSPA-3381 ( After ASM account is created successfully, redirect to homepage )
https://jira.tools.sap/browse/CXSPA-3347, https://jira.tools.sap/browse/CXSPA-3308 ( Add cumulus traceability to ASM new feature)
---
.../asm/assets/translations/en/asm.ts | 2 +-
.../asm-create-customer-form.component.ts | 2 +-
.../asm-main-ui/asm-main-ui.component.ts | 1 +
.../customer-selection.component.html | 72 ++++++++++++-------
.../customer-selection.component.spec.ts | 30 ++++++--
.../customer-selection.component.ts | 1 +
.../_customer-selection.component.scss | 18 ++++-
...b2b-customer-list-tabbling-order.e2e.cy.ts | 2 +-
.../accessibility/tabbing-order.e2e.asm.cy.ts | 11 ++-
.../vendor/asm/b2b/customer-list.e2e.cy.ts | 2 +-
.../asm/b2c/create-customer.e2e-flaky.cy.ts | 6 +-
.../accessibility/tabbing-order.config.ts | 22 ++++++
.../accessibility/tabbing-order/asm.ts | 16 +++++
.../cypress/helpers/asm.ts | 4 +-
14 files changed, 143 insertions(+), 46 deletions(-)
diff --git a/feature-libs/asm/assets/translations/en/asm.ts b/feature-libs/asm/assets/translations/en/asm.ts
index caa5897b675..344a6eeba2f 100644
--- a/feature-libs/asm/assets/translations/en/asm.ts
+++ b/feature-libs/asm/assets/translations/en/asm.ts
@@ -34,7 +34,7 @@ export const asm = {
},
submit: 'Start Session',
noMatch: 'No customer found.',
- noMatchResult: 'This account cannot be found. ',
+ noMatchResult: 'This account cannot be found.',
createCustomer: 'Create New Customer',
},
createCustomerForm: {
diff --git a/feature-libs/asm/components/asm-create-customer-form/asm-create-customer-form.component.ts b/feature-libs/asm/components/asm-create-customer-form/asm-create-customer-form.component.ts
index 72419faa69c..322ab17fb28 100644
--- a/feature-libs/asm/components/asm-create-customer-form/asm-create-customer-form.component.ts
+++ b/feature-libs/asm/components/asm-create-customer-form/asm-create-customer-form.component.ts
@@ -42,7 +42,7 @@ export class AsmCreateCustomerFormComponent {
focusConfig: FocusConfig = {
trap: true,
block: true,
- autofocus: 'button',
+ autofocus: true,
focusOnEscape: true,
};
diff --git a/feature-libs/asm/components/asm-main-ui/asm-main-ui.component.ts b/feature-libs/asm/components/asm-main-ui/asm-main-ui.component.ts
index 02dd4564511..39c95856f06 100644
--- a/feature-libs/asm/components/asm-main-ui/asm-main-ui.component.ts
+++ b/feature-libs/asm/components/asm-main-ui/asm-main-ui.component.ts
@@ -123,6 +123,7 @@ export class AsmMainUiComponent implements OnInit, OnDestroy {
customerId: result.customerId,
});
this.showCreateCustomerSuccessfullyAlert = true;
+ this.routingService.go('/');
}
if (
'actionType' in result &&
diff --git a/feature-libs/asm/components/customer-selection/customer-selection.component.html b/feature-libs/asm/components/customer-selection/customer-selection.component.html
index dcbb260d3b7..3b3f6392da7 100644
--- a/feature-libs/asm/components/customer-selection/customer-selection.component.html
+++ b/feature-libs/asm/components/customer-selection/customer-selection.component.html
@@ -39,35 +39,55 @@
{{ result.name }}
{{ result.uid }}
-
+
+
+ = 3 &&
+ !!results.entries &&
+ results.entries.length <= 0
+ "
+ >
{{ 'asm.customerSearch.noMatchResult' | cxTranslate }}
- {{
+ {{
'asm.customerSearch.createCustomer' | cxTranslate
- }}
-
-
+ }}
+
+
diff --git a/feature-libs/asm/components/customer-selection/customer-selection.component.spec.ts b/feature-libs/asm/components/customer-selection/customer-selection.component.spec.ts
index b936f2828ab..e2d9124df93 100644
--- a/feature-libs/asm/components/customer-selection/customer-selection.component.spec.ts
+++ b/feature-libs/asm/components/customer-selection/customer-selection.component.spec.ts
@@ -10,7 +10,13 @@ import { ReactiveFormsModule } from '@angular/forms';
import { By } from '@angular/platform-browser';
import { AsmService } from '@spartacus/asm/core';
import { AsmConfig, CustomerSearchPage } from '@spartacus/asm/root';
-import { GlobalMessageService, I18nTestingModule, User } from '@spartacus/core';
+import {
+ FeaturesConfig,
+ FeaturesConfigModule,
+ GlobalMessageService,
+ I18nTestingModule,
+ User,
+} from '@spartacus/core';
import {
DirectionMode,
DirectionService,
@@ -111,7 +117,12 @@ describe('CustomerSelectionComponent', () => {
customerSearchResultsLoading = new BehaviorSubject(false);
TestBed.configureTestingModule({
- imports: [ReactiveFormsModule, I18nTestingModule, FormErrorsModule],
+ imports: [
+ ReactiveFormsModule,
+ I18nTestingModule,
+ FormErrorsModule,
+ FeaturesConfigModule,
+ ],
declarations: [CustomerSelectionComponent],
providers: [
{ provide: AsmService, useClass: MockAsmService },
@@ -122,6 +133,12 @@ describe('CustomerSelectionComponent', () => {
useClass: MockDirectionService,
},
{ provide: LaunchDialogService, useClass: MockLaunchDialogService },
+ {
+ provide: FeaturesConfig,
+ useValue: {
+ features: { level: '*' },
+ },
+ },
],
}).compileComponents();
@@ -215,7 +232,7 @@ describe('CustomerSelectionComponent', () => {
expect(asmService.customerSearchReset).toHaveBeenCalled();
});
- it('should display no results message when no results are found', () => {
+ it('should display customer registration message if no result was found', () => {
spyOn(asmService, 'customerSearch').and.callFake(() => {
customerSearchResults.next({ entries: [] });
customerSearchResultsLoading.next(false);
@@ -226,10 +243,11 @@ describe('CustomerSelectionComponent', () => {
);
fixture.detectChanges();
expect(el.queryAll(By.css('div.asm-results button')).length).toEqual(1);
- // TODO(CXSPA-2935): Refactor customer lookup in ASM to get rid of buttons in drop list
- el.query(By.css('div.asm-results button')).nativeElement.dispatchEvent(
- new MouseEvent('click')
+ const createAccountButton = el.query(By.css('div.asm-results button'));
+ expect(createAccountButton.nativeElement.innerText).toEqual(
+ 'asm.customerSearch.noMatchResult asm.customerSearch.createCustomer'
);
+ createAccountButton.nativeElement.dispatchEvent(new MouseEvent('click'));
expect(asmService.customerSearchReset).toHaveBeenCalled();
});
diff --git a/feature-libs/asm/components/customer-selection/customer-selection.component.ts b/feature-libs/asm/components/customer-selection/customer-selection.component.ts
index 4d033b856e7..e5fb610c8b8 100644
--- a/feature-libs/asm/components/customer-selection/customer-selection.component.ts
+++ b/feature-libs/asm/components/customer-selection/customer-selection.component.ts
@@ -252,6 +252,7 @@ export class CustomerSelectionComponent implements OnInit, OnDestroy {
}
createCustomer(): void {
+ this.asmService.customerSearchReset();
this.launchDialogService?.openDialogAndSubscribe(
LAUNCH_CALLER.ASM_CREATE_CUSTOMER_FORM,
this.createCustomerLink
diff --git a/feature-libs/asm/styles/components/_customer-selection.component.scss b/feature-libs/asm/styles/components/_customer-selection.component.scss
index e719f336d9b..5f131c8d870 100644
--- a/feature-libs/asm/styles/components/_customer-selection.component.scss
+++ b/feature-libs/asm/styles/components/_customer-selection.component.scss
@@ -82,16 +82,24 @@
position: absolute;
line-height: 1.5rem;
left: 2rem;
- top: 4rem;
z-index: 11;
box-shadow: 0 5px 20px 0 #d9d9d9, 0 2px 8px 0 #ededed;
background-color: #fff;
border-radius: 4px;
- width: 100%;
max-width: 50vw;
max-height: 70vh;
overflow-y: auto;
+ @include forVersion(1, 6) {
+ top: 4rem;
+ width: 100%;
+ }
+
+ @include forVersion(6.1) {
+ top: 3.3rem;
+ width: 33%;
+ }
+
@media (max-width: 1200px) {
max-width: calc(100% - 4rem);
}
@@ -151,7 +159,11 @@
}
@include forVersion(6.1) {
- a {
+ .linkStyleLabel {
+ font-family: '72';
+ font-weight: 600;
+ font-size: 13px;
+ padding-inline-start: 8px;
color: #0064d9;
}
}
diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/accessibility/asm-b2b-customer-list-tabbling-order.e2e.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/accessibility/asm-b2b-customer-list-tabbling-order.e2e.cy.ts
index 99fe79a15d0..c5f036d494c 100644
--- a/projects/storefrontapp-e2e-cypress/cypress/e2e/accessibility/asm-b2b-customer-list-tabbling-order.e2e.cy.ts
+++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/accessibility/asm-b2b-customer-list-tabbling-order.e2e.cy.ts
@@ -20,7 +20,7 @@ context('Tabbing order for ASM B2b Customer List', () => {
});
describe('ASM', () => {
- it('should allow to navigate with tab key for customer List', () => {
+ it('should allow to navigate with tab key for customer List (CXSPA-2722)', () => {
cy.cxConfig({
context: {
baseSite: ['powertools-spa'],
diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/accessibility/tabbing-order.e2e.asm.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/accessibility/tabbing-order.e2e.asm.cy.ts
index 083a0eb72d1..31552db9c05 100644
--- a/projects/storefrontapp-e2e-cypress/cypress/e2e/accessibility/tabbing-order.e2e.asm.cy.ts
+++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/accessibility/tabbing-order.e2e.asm.cy.ts
@@ -5,7 +5,10 @@
*/
import { tabbingOrderConfig as config } from '../../helpers/accessibility/tabbing-order.config';
-import { asmTabbingOrderWithCustomerList } from '../../helpers/accessibility/tabbing-order/asm';
+import {
+ asmTabbingOrderWithCreateCustomerForm,
+ asmTabbingOrderWithCustomerList,
+} from '../../helpers/accessibility/tabbing-order/asm';
describe('Tabbing order for ASM', () => {
before(() => {
@@ -13,8 +16,12 @@ describe('Tabbing order for ASM', () => {
});
context('ASM', () => {
- it('should allow to navigate with tab key for customer List', () => {
+ it('should allow to navigate with tab key for customer List (CXSPA-1595)', () => {
asmTabbingOrderWithCustomerList(config.asmWithCustomerLists, 'asagent');
});
+
+ it('should allow to navigate with tab key for create customer form (CXSPA-1594)', () => {
+ asmTabbingOrderWithCreateCustomerForm(config.asmWithCreateCustomerForm);
+ });
});
});
diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2b/customer-list.e2e.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2b/customer-list.e2e.cy.ts
index fd013d5dab6..0200339bc44 100644
--- a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2b/customer-list.e2e.cy.ts
+++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2b/customer-list.e2e.cy.ts
@@ -20,7 +20,7 @@ context('Assisted Service Module', () => {
Cypress.env('BASE_SITE', ELECTRONICS_BASESITE);
});
describe('ASM Customer list', () => {
- it('checking custom list features (CXSPA-1595)', () => {
+ it('checking custom list features (CXSPA-2722)', () => {
cy.cxConfig({
context: {
baseSite: ['powertools-spa'],
diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2c/create-customer.e2e-flaky.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2c/create-customer.e2e-flaky.cy.ts
index e2c644cd533..c91f143da79 100644
--- a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2c/create-customer.e2e-flaky.cy.ts
+++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2c/create-customer.e2e-flaky.cy.ts
@@ -16,7 +16,7 @@ context('Assisted Service Module', () => {
});
describe('Create Customer', () => {
- it('should be able to create a new customer by agent click button', () => {
+ it('should be able to create a new customer by agent click button (CXSPA-1594)', () => {
cy.log('--> Agent logging in');
checkout.visitHomePage('asm=true');
@@ -126,7 +126,7 @@ context('Assisted Service Module', () => {
});
describe('Failed to Create Customer', () => {
- it('should display validation errors if form is empty', () => {
+ it('should display validation errors if form is empty (CXSPA-1594)', () => {
cy.log('--> Agent logging in');
checkout.visitHomePage('asm=true');
cy.get('cx-asm-main-ui').should('exist');
@@ -150,7 +150,7 @@ context('Assisted Service Module', () => {
asm.agentSignOut();
});
- it('should be not able to create a new customer with dupcated email by agent', () => {
+ it('should be not able to create a new customer with dupcated email by agent (CXSPA-1594)', () => {
cy.log('--> Agent logging in');
checkout.visitHomePage('asm=true');
cy.get('cx-asm-main-ui').should('exist');
diff --git a/projects/storefrontapp-e2e-cypress/cypress/helpers/accessibility/tabbing-order.config.ts b/projects/storefrontapp-e2e-cypress/cypress/helpers/accessibility/tabbing-order.config.ts
index d5aa5a7a810..e1c56232c84 100644
--- a/projects/storefrontapp-e2e-cypress/cypress/helpers/accessibility/tabbing-order.config.ts
+++ b/projects/storefrontapp-e2e-cypress/cypress/helpers/accessibility/tabbing-order.config.ts
@@ -2392,4 +2392,26 @@ export const tabbingOrderConfig: TabbingOrderConfig = {
value: 'Cancel',
},
],
+ asmWithCreateCustomerForm: [
+ {
+ type: TabbingOrderTypes.GENERIC_BUTTON,
+ },
+ {
+ type: TabbingOrderTypes.GENERIC_INPUT,
+ },
+ {
+ type: TabbingOrderTypes.GENERIC_INPUT,
+ },
+ {
+ type: TabbingOrderTypes.GENERIC_INPUT,
+ },
+ {
+ type: TabbingOrderTypes.BUTTON,
+ value: 'Create',
+ },
+ {
+ type: TabbingOrderTypes.GENERIC_BUTTON,
+ value: 'Cancel',
+ },
+ ],
};
diff --git a/projects/storefrontapp-e2e-cypress/cypress/helpers/accessibility/tabbing-order/asm.ts b/projects/storefrontapp-e2e-cypress/cypress/helpers/accessibility/tabbing-order/asm.ts
index a4a7f526aab..b20b27783c3 100644
--- a/projects/storefrontapp-e2e-cypress/cypress/helpers/accessibility/tabbing-order/asm.ts
+++ b/projects/storefrontapp-e2e-cypress/cypress/helpers/accessibility/tabbing-order/asm.ts
@@ -10,6 +10,7 @@ import * as asm from '../../../helpers/asm';
const containerSelector = 'cx-asm-main-ui';
const containerSelectorForCustomerLists = 'cx-customer-list';
+const containerSelectorForCreateCustomerForm = 'cx-asm-create-customer-form';
export function asmTabbingOrderNotLoggedIn(config: TabElement[]) {
cy.visit('/?asm=true');
@@ -64,3 +65,18 @@ export function asmTabbingOrderWithCustomerList(
verifyTabbingOrder(containerSelectorForCustomerLists, config);
}
+
+export function asmTabbingOrderWithCreateCustomerForm(config: TabElement[]) {
+ cy.visit('/?asm=true');
+ asm.agentLogin('asagent', 'pw4all');
+
+ cy.get('cx-asm-main-ui div.cx-asm-customer-list a').click();
+ cy.get('cx-customer-list').should('exist');
+ cy.get('cx-customer-list h2').should('exist');
+
+ cy.get('cx-customer-list div.cx-dialog-header button').click();
+ cy.get('cx-asm-create-customer-form').should('exist');
+ cy.get('cx-asm-create-customer-form form').should('exist');
+
+ verifyTabbingOrder(containerSelectorForCreateCustomerForm, config);
+}
diff --git a/projects/storefrontapp-e2e-cypress/cypress/helpers/asm.ts b/projects/storefrontapp-e2e-cypress/cypress/helpers/asm.ts
index 67ea358bd26..c9245b87c57 100644
--- a/projects/storefrontapp-e2e-cypress/cypress/helpers/asm.ts
+++ b/projects/storefrontapp-e2e-cypress/cypress/helpers/asm.ts
@@ -622,8 +622,8 @@ export function asmOpenCreateCustomerDialogOnCustomerSelectionDropdown(): void {
.its('response.statusCode')
.should('eq', 200);
- cy.get('cx-customer-selection div.asm-results a').should('exist');
- cy.get('cx-customer-selection div.asm-results a').click();
+ cy.get('cx-customer-selection div.asm-results button').should('exist');
+ cy.get('cx-customer-selection div.asm-results button').click();
cy.get('cx-asm-create-customer-form').should('exist');
cy.get('cx-asm-create-customer-form form').should('exist');
}
From 89e27d24879440d312d4be2786d49a8f11fa8530 Mon Sep 17 00:00:00 2001
From: Grace Dong <127385561+i53577@users.noreply.github.com>
Date: Wed, 17 May 2023 13:54:05 +0800
Subject: [PATCH 006/122] refactor: hide customer list table during loading new
page (#17416)
---
.../components/customer-list/customer-list.component.html | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/feature-libs/asm/components/customer-list/customer-list.component.html b/feature-libs/asm/components/customer-list/customer-list.component.html
index 3ba825e3664..8ff64c4f616 100644
--- a/feature-libs/asm/components/customer-list/customer-list.component.html
+++ b/feature-libs/asm/components/customer-list/customer-list.component.html
@@ -89,7 +89,12 @@
-
+
{{
'asm.customerList.title' | cxTranslate
From 29549e6986bcd60667f9954f2a835f05fef4e77c Mon Sep 17 00:00:00 2001
From: luoyifeng11 <127297696+luoyifeng11@users.noreply.github.com>
Date: Wed, 17 May 2023 15:56:49 +0800
Subject: [PATCH 007/122] fix: Improve cypress for asm customer list (#17420)
Co-authored-by: Yifeng Luo
---
.../vendor/asm/b2b/customer-list.e2e.cy.ts | 5 +-
.../asm/b2c/customer-list.e2e-flaky.cy.ts | 32 ++------
.../cypress/helpers/asm.ts | 79 ++++++++++++++++---
3 files changed, 77 insertions(+), 39 deletions(-)
diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2b/customer-list.e2e.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2b/customer-list.e2e.cy.ts
index 0200339bc44..9d41d80216f 100644
--- a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2b/customer-list.e2e.cy.ts
+++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2b/customer-list.e2e.cy.ts
@@ -20,14 +20,15 @@ context('Assisted Service Module', () => {
Cypress.env('BASE_SITE', ELECTRONICS_BASESITE);
});
describe('ASM Customer list', () => {
- it('checking custom list features (CXSPA-2722)', () => {
+ it('checking custom list features (CXSPA-1595)', () => {
cy.cxConfig({
context: {
baseSite: ['powertools-spa'],
currency: ['USD'],
},
});
- asm.addCartForB2BCustomer();
+ const productCode = '1979039';
+ asm.addProductToB2BCart('gi.sun@pronto-hw.com', 'pw4all', productCode);
checkout.visitHomePage('asm=true');
cy.get('cx-asm-main-ui').should('exist');
cy.get('cx-asm-main-ui').should('be.visible');
diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2c/customer-list.e2e-flaky.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2c/customer-list.e2e-flaky.cy.ts
index df5e32fc271..a8c1489e3bc 100644
--- a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2c/customer-list.e2e-flaky.cy.ts
+++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/asm/b2c/customer-list.e2e-flaky.cy.ts
@@ -15,32 +15,12 @@ context('Assisted Service Module', () => {
});
describe('ASM Customer list', () => {
- const productCode = '479742';
- it('Should be able to checkout a b2c order via API (CXSPA-1595)', function () {
- cy.login('aaron.customer@hybris.com', 'pw4all').then(() => {
- const auth = JSON.parse(localStorage.getItem('spartacus⚿⚿auth'));
- console.info(auth);
- cy.addToCart(productCode, 1, auth.token.access_token).then((cartId) => {
- cy.requireDeliveryAddressAdded(
- getSampleUser().address,
- auth.token,
- cartId
- );
- cy.requireDeliveryMethodSelected(auth.token, cartId);
- cy.requirePaymentMethodAdded(cartId);
- cy.requirePlacedOrder(auth.token, cartId);
- });
- });
- });
-
- it('Should be able to create a b2c cart via API (CXSPA-1595)', function () {
- cy.login('aaron.customer@hybris.com', 'pw4all').then(() => {
- const auth = JSON.parse(localStorage.getItem('spartacus⚿⚿auth'));
- cy.addToCart(productCode, 1, auth.token.access_token);
- });
- });
-
- it('checking custom list features', () => {
+ it('checking custom list features (CXSPA-1595)', () => {
+ const custom = 'aaron.customer@hybris.com';
+ const pwd = 'pw4all';
+ const productCode = '479742';
+ asm.placeOrderForB2CCustomer(custom, pwd, productCode);
+ asm.addProductToB2CCart(custom, pwd, productCode);
checkout.visitHomePage('asm=true');
cy.get('cx-asm-main-ui').should('exist');
cy.get('cx-asm-main-ui').should('be.visible');
diff --git a/projects/storefrontapp-e2e-cypress/cypress/helpers/asm.ts b/projects/storefrontapp-e2e-cypress/cypress/helpers/asm.ts
index c9245b87c57..c3d1113ed85 100644
--- a/projects/storefrontapp-e2e-cypress/cypress/helpers/asm.ts
+++ b/projects/storefrontapp-e2e-cypress/cypress/helpers/asm.ts
@@ -10,7 +10,7 @@ import * as checkout from '../helpers/checkout-flow';
import { fillShippingAddress } from '../helpers/checkout-forms';
import * as consent from '../helpers/consent-management';
import * as profile from '../helpers/update-profile';
-import { SampleUser } from '../sample-data/checkout-flow';
+import { getSampleUser, SampleUser } from '../sample-data/checkout-flow';
import {
interceptGet,
interceptPatch,
@@ -25,9 +25,47 @@ import {
} from './navigation';
import { generateMail, randomString } from './user';
-export function addCartForB2BCustomer(): void {
- const productCode = '1979039';
- cy.login('gi.sun@pronto-hw.com', 'pw4all').then(() => {
+const asmForB2CCustomer = 'aaron.customer@hybris.com';
+const asmForB2BCustomer = 'Gi Sun';
+
+export function placeOrderForB2CCustomer(
+ customer: string,
+ pwd: string,
+ productCode: string
+): void {
+ cy.login(customer, pwd).then(() => {
+ const auth = JSON.parse(localStorage.getItem('spartacus⚿⚿auth'));
+ console.info(auth);
+ cy.addToCart(productCode, 1, auth.token.access_token).then((cartId) => {
+ cy.requireDeliveryAddressAdded(
+ getSampleUser().address,
+ auth.token,
+ cartId
+ );
+ cy.requireDeliveryMethodSelected(auth.token, cartId);
+ cy.requirePaymentMethodAdded(cartId);
+ cy.requirePlacedOrder(auth.token, cartId);
+ });
+ });
+}
+
+export function addProductToB2CCart(
+ customer: string,
+ pwd: string,
+ productCode: string
+): void {
+ cy.login(customer, pwd).then(() => {
+ const auth = JSON.parse(localStorage.getItem('spartacus⚿⚿auth'));
+ cy.addToCart(productCode, 1, auth.token.access_token);
+ });
+}
+
+export function addProductToB2BCart(
+ customer: string,
+ pwd: string,
+ productCode: string
+): void {
+ cy.login(customer, pwd).then(() => {
const auth = JSON.parse(localStorage.getItem('spartacus⚿⚿auth'));
cy.addProductToB2BCart(productCode, 1, auth.token.access_token);
});
@@ -212,12 +250,21 @@ export function asmCustomerLists(): void {
cy.log('--> start emulation by click order');
asm.asmOpenCustomerList();
- cy.get('cx-customer-list')
- .find('.cx-btn-cell')
- .filter('[aria-label="Order"]')
- .then(($rows) => {
- expect($rows.length).to.eq(5);
- cy.wrap($rows[0]).click();
+ cy.get('cx-customer-list .cx-header-actions .search-wrapper input')
+ .should('exist')
+ .should('not.be.disabled')
+ .type(`${asmForB2CCustomer}{enter}`);
+
+ cy.wait(customerSearchRequestAlias)
+ .its('response.statusCode')
+ .should('eq', 200);
+
+ cy.get('cx-customer-list table')
+ .contains('tbody tr', asmForB2CCustomer)
+ .closest('tbody tr')
+ .find('td:nth-child(6)')
+ .then(($order) => {
+ cy.wrap($order).click();
cy.get('cx-customer-list').should('not.exist');
cy.get('cx-order-history').should('exist');
});
@@ -281,8 +328,18 @@ export function asmB2bCustomerLists(): void {
}
);
+ cy.log('--> click cart to jump to the cart view page.');
+ cy.get('cx-customer-list .cx-header-actions .search-wrapper input')
+ .should('exist')
+ .should('not.be.disabled')
+ .type(`${asmForB2BCustomer}{enter}`);
+
+ cy.wait(customerSearchRequestAlias)
+ .its('response.statusCode')
+ .should('eq', 200);
+
cy.get('cx-customer-list table')
- .contains('tbody tr', 'Gi Sun')
+ .contains('tbody tr', asmForB2BCustomer)
.closest('tbody tr')
.find('td:nth-child(5)')
.then(($cart) => {
From 0e405fd47c9f29561f15282ee1cfe02f5edefbd8 Mon Sep 17 00:00:00 2001
From: Christoph Hinssen <33626130+ChristophHi@users.noreply.github.com>
Date: Wed, 17 May 2023 10:32:08 +0200
Subject: [PATCH 008/122] chore: fix strict issues in templates in configurator
common endpoint (#17411)
---
...ator-cart-entry-bundle-info.component.html | 20 ++++++-------
...onfigurator-cart-entry-info.component.html | 23 +++++++-------
...gurator-issues-notification.component.html | 24 +++++++--------
.../configure-cart-entry.component.spec.ts | 30 ++++++++++++-------
4 files changed, 51 insertions(+), 46 deletions(-)
diff --git a/feature-libs/product-configurator/common/components/configurator-cart-entry-bundle-info/configurator-cart-entry-bundle-info.component.html b/feature-libs/product-configurator/common/components/configurator-cart-entry-bundle-info/configurator-cart-entry-bundle-info.component.html
index 8bfabc5d4ff..78e773c4d49 100644
--- a/feature-libs/product-configurator/common/components/configurator-cart-entry-bundle-info/configurator-cart-entry-bundle-info.component.html
+++ b/feature-libs/product-configurator/common/components/configurator-cart-entry-bundle-info/configurator-cart-entry-bundle-info.component.html
@@ -49,16 +49,14 @@
-
+
+
diff --git a/feature-libs/product-configurator/common/components/configurator-cart-entry-info/configurator-cart-entry-info.component.html b/feature-libs/product-configurator/common/components/configurator-cart-entry-info/configurator-cart-entry-info.component.html
index 9c3f8e7c646..45abbe83a46 100644
--- a/feature-libs/product-configurator/common/components/configurator-cart-entry-info/configurator-cart-entry-info.component.html
+++ b/feature-libs/product-configurator/common/components/configurator-cart-entry-info/configurator-cart-entry-info.component.html
@@ -2,7 +2,7 @@
0"
+ *ngIf="orderEntry.configurationInfos?.length ?? 0 > 0"
class="cx-intro cx-visually-hidden"
>
{{ 'configurator.a11y.cartEntryInfoIntro' | cxTranslate }}
@@ -33,17 +33,14 @@
-
-
+
+
diff --git a/feature-libs/product-configurator/common/components/configurator-issues-notification/configurator-issues-notification.component.html b/feature-libs/product-configurator/common/components/configurator-issues-notification/configurator-issues-notification.component.html
index 228ed46e18b..c11806a7921 100644
--- a/feature-libs/product-configurator/common/components/configurator-issues-notification/configurator-issues-notification.component.html
+++ b/feature-libs/product-configurator/common/components/configurator-issues-notification/configurator-issues-notification.component.html
@@ -6,18 +6,18 @@
'configurator.notificationBanner.numberOfIssues'
| cxTranslate: { count: getNumberOfIssues(orderEntry) }
}}
-
+
+
diff --git a/feature-libs/product-configurator/common/components/configure-cart-entry/configure-cart-entry.component.spec.ts b/feature-libs/product-configurator/common/components/configure-cart-entry/configure-cart-entry.component.spec.ts
index cd2f9a5c1b3..0b5b768d8d0 100644
--- a/feature-libs/product-configurator/common/components/configure-cart-entry/configure-cart-entry.component.spec.ts
+++ b/feature-libs/product-configurator/common/components/configure-cart-entry/configure-cart-entry.component.spec.ts
@@ -59,14 +59,22 @@ describe('ConfigureCartEntryComponent', () => {
);
});
- it('should find correct entity key for cart entry', () => {
- component.cartEntry = { entryNumber: 0 };
- expect(component.getEntityKey()).toBe('0');
- });
+ describe('getEntityKey', () => {
+ it('should find correct entity key for cart entry', () => {
+ component.cartEntry = { entryNumber: 0 };
+ expect(component.getEntityKey()).toBe('0');
+ });
+
+ it('should throw error if entry number not present in entry', () => {
+ component.cartEntry = {};
+ expect(() => component.getEntityKey()).toThrowError();
+ });
- it('should throw error if entry number not present in entry', () => {
- component.cartEntry = {};
- expect(() => component.getEntityKey()).toThrowError();
+ it('should take order code into account in case entry is from order', () => {
+ const orderCode = '01008765';
+ component.cartEntry = { entryNumber: 0, orderCode: orderCode };
+ expect(component.getEntityKey()).toBe(orderCode + '+0');
+ });
});
it('should compile correct route for cart entry', () => {
@@ -86,9 +94,11 @@ describe('ConfigureCartEntryComponent', () => {
expect(component.getRoute()).toBe('configureOverview' + configuratorType);
});
- it('should compile displayOnly method', () => {
- component.readOnly = true;
- expect(component.getDisplayOnly()).toBe(true);
+ describe('getDisplayOnly', () => {
+ it('should derive result from component if available', () => {
+ component.readOnly = true;
+ expect(component.getDisplayOnly()).toBe(true);
+ });
});
it("should return 'false' for disabled when readOnly true", () => {
From 463b6cd0ed5a0c5503785883329ccc001ecfc584 Mon Sep 17 00:00:00 2001
From: SebastianHamilton
Date: Wed, 17 May 2023 17:11:26 +0200
Subject: [PATCH 009/122] bugfix/CXCDS-7997: Fix flaky e2e tests for SPA
(#17422)
---
.../profile-tag-push-events.service.ts | 8 +--
.../profile-tag/default-events.core-e2e.cy.ts | 50 ++++++++++++-------
2 files changed, 36 insertions(+), 22 deletions(-)
diff --git a/integration-libs/cds/src/profiletag/services/profile-tag-push-events.service.ts b/integration-libs/cds/src/profiletag/services/profile-tag-push-events.service.ts
index 330137af65a..32ad1720eb7 100644
--- a/integration-libs/cds/src/profiletag/services/profile-tag-push-events.service.ts
+++ b/integration-libs/cds/src/profiletag/services/profile-tag-push-events.service.ts
@@ -148,9 +148,11 @@ export class ProfileTagPushEventsService {
currentCategoryPage.categoryCode &&
previousRoute.navigation.semanticRoute ===
currentRoute.navigation.semanticRoute
- ); // A true means that this item is not unique, so this is hard to wrap your head around.
- // What we are saying, is that if the categoryCode is the same AND the last emitted semantic route is the same
- // then this is a duplicate (I.E. via a facet change). In other words, no other page type was visited, and we are on the same categorycode
+ );
+ // A true means that this item is not unique, so this is hard to wrap your head around.
+ // What we are saying, is that if the category code is the same AND the last emitted semantic route is the
+ // same then this is a duplicate (i.e. via a facet change). In other words, no other page type was visited,
+ // and we are on the same category code.
}
),
map(
diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/cds/profile-tag/default-events.core-e2e.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/cds/profile-tag/default-events.core-e2e.cy.ts
index a7d549ae155..b810b4ea1df 100644
--- a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/cds/profile-tag/default-events.core-e2e.cy.ts
+++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/cds/profile-tag/default-events.core-e2e.cy.ts
@@ -313,26 +313,37 @@ describe('Profile-tag events', () => {
});
});
- it('should send 2 Category Views event when going to a Category, going to a different page type, and then back to the same category', () => {
+ it('should send 2 Category View events when going to a Category, going to a different page type, and then back to the same category', () => {
cy.intercept({ method: 'GET', path: `**/products/search**` }).as(
'lastRequest'
);
- createProductQuery(QUERY_ALIAS.CAMERA, 'camera', 12);
cy.get('cx-category-navigation cx-generic-link a')
.contains('Cameras')
.click({ force: true });
cy.location('pathname', { timeout: 10000 }).should('include', `c/575`);
- cy.wait('@lastRequest');
- cy.window().should((win) => {
- expect(
- profileTagHelper.eventCount(
- win,
- profileTagHelper.EventNames.CATEGORY_PAGE_VIEWED
- )
- ).to.equal(1);
+ cy.wait('@lastRequest').then(() => {
+ cy.window().should((win) => {
+ expect(
+ profileTagHelper.eventCount(
+ win,
+ profileTagHelper.EventNames.CATEGORY_PAGE_VIEWED
+ )
+ ).to.equal(1);
+ });
});
+
+ createProductQuery(QUERY_ALIAS.CAMERA, 'camera', 12);
cy.get('cx-searchbox input').type('camera{enter}');
- cy.wait(`@${QUERY_ALIAS.CAMERA}`);
+ cy.wait(`@${QUERY_ALIAS.CAMERA}`).then(() => {
+ cy.window().should((win: any) => {
+ expect(
+ profileTagHelper.eventCount(
+ win,
+ profileTagHelper.EventNames.KEYWORD_SEARCH
+ )
+ ).to.equal(1);
+ });
+ });
cy.intercept({ method: 'GET', path: `**/products/search**` }).as(
'lastRequest2'
@@ -341,14 +352,15 @@ describe('Profile-tag events', () => {
.contains('Cameras')
.click({ force: true });
cy.location('pathname', { timeout: 10000 }).should('include', `c/575`);
- cy.wait('@lastRequest2');
- cy.window().should((win2) => {
- expect(
- profileTagHelper.eventCount(
- win2,
- profileTagHelper.EventNames.CATEGORY_PAGE_VIEWED
- )
- ).to.equal(2);
+ cy.wait('@lastRequest2').then(() => {
+ cy.window().should((win: any) => {
+ expect(
+ profileTagHelper.eventCount(
+ win,
+ profileTagHelper.EventNames.CATEGORY_PAGE_VIEWED
+ )
+ ).to.equal(2);
+ });
});
});
From 115459626cfe0e91105654748efbfa5d45dc727b Mon Sep 17 00:00:00 2001
From: Sam Garland <52560012+sam-garland@users.noreply.github.com>
Date: Thu, 18 May 2023 15:03:12 +1200
Subject: [PATCH 010/122] fix: expose missing services in public API (#17369)
---
.../components/visual-picking/visual-picking-tab/index.ts | 1 +
.../visual-picking-tab/product-filter/index.ts | 1 +
.../visual-picking/visual-picking-tab/product-list/index.ts | 2 ++
.../toolbar/visual-viewer-animation-slider/index.ts | 1 +
integration-libs/epd-visualization/package.json | 2 +-
.../root/testing/epd-visualization-test-config.ts | 2 +-
.../add-epd-visualization/__snapshots__/index_spec.ts.snap | 6 +++---
package-lock.json | 4 ++--
package.json | 2 +-
projects/schematics/src/dependencies.json | 2 +-
.../lib-configs/integration-libs/epd-schematics-config.ts | 2 +-
.../epd-visualization/epd-visualization-feature.module.ts | 2 +-
12 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/integration-libs/epd-visualization/components/visual-picking/visual-picking-tab/index.ts b/integration-libs/epd-visualization/components/visual-picking/visual-picking-tab/index.ts
index c9a23a14a26..a27f8bc3b70 100644
--- a/integration-libs/epd-visualization/components/visual-picking/visual-picking-tab/index.ts
+++ b/integration-libs/epd-visualization/components/visual-picking/visual-picking-tab/index.ts
@@ -8,3 +8,4 @@ export * from './product-filter/index';
export * from './product-list/index';
export * from './visual-picking-tab.component';
export * from './visual-picking-tab.module';
+export * from './visual-picking-tab.service';
diff --git a/integration-libs/epd-visualization/components/visual-picking/visual-picking-tab/product-filter/index.ts b/integration-libs/epd-visualization/components/visual-picking/visual-picking-tab/product-filter/index.ts
index d72f555cffe..b4833ebf749 100644
--- a/integration-libs/epd-visualization/components/visual-picking/visual-picking-tab/product-filter/index.ts
+++ b/integration-libs/epd-visualization/components/visual-picking/visual-picking-tab/product-filter/index.ts
@@ -6,3 +6,4 @@
export * from './visual-picking-product-filter.component';
export * from './visual-picking-product-filter.module';
+export * from './visual-picking-product-filter.service';
diff --git a/integration-libs/epd-visualization/components/visual-picking/visual-picking-tab/product-list/index.ts b/integration-libs/epd-visualization/components/visual-picking/visual-picking-tab/product-list/index.ts
index faeb23c5920..89ff5f5b97f 100644
--- a/integration-libs/epd-visualization/components/visual-picking/visual-picking-tab/product-list/index.ts
+++ b/integration-libs/epd-visualization/components/visual-picking/visual-picking-tab/product-list/index.ts
@@ -6,5 +6,7 @@
export * from './compact-add-to-cart/index';
export * from './model/index';
+export * from './paged-list/index';
export * from './visual-picking-product-list.component';
export * from './visual-picking-product-list.module';
+export * from './visual-picking-product-list.service';
diff --git a/integration-libs/epd-visualization/components/visual-viewer/toolbar/visual-viewer-animation-slider/index.ts b/integration-libs/epd-visualization/components/visual-viewer/toolbar/visual-viewer-animation-slider/index.ts
index b6c733b5440..605c2abbda0 100644
--- a/integration-libs/epd-visualization/components/visual-viewer/toolbar/visual-viewer-animation-slider/index.ts
+++ b/integration-libs/epd-visualization/components/visual-viewer/toolbar/visual-viewer-animation-slider/index.ts
@@ -6,3 +6,4 @@
export * from './visual-viewer-animation-slider.component';
export * from './visual-viewer-animation-slider.module';
+export * from './visual-viewer-animation-slider.service';
diff --git a/integration-libs/epd-visualization/package.json b/integration-libs/epd-visualization/package.json
index 9e897c0ff3c..3a5d5919187 100644
--- a/integration-libs/epd-visualization/package.json
+++ b/integration-libs/epd-visualization/package.json
@@ -37,7 +37,7 @@
"@angular/core": "^15.2.4",
"@angular/forms": "^15.2.4",
"@angular/router": "^15.2.4",
- "@sapui5/ts-types-esm": "1.108.5",
+ "@sapui5/ts-types-esm": "1.108.14",
"@spartacus/cart": "5.0.0",
"@spartacus/core": "5.0.0",
"@spartacus/schematics": "5.0.0",
diff --git a/integration-libs/epd-visualization/root/testing/epd-visualization-test-config.ts b/integration-libs/epd-visualization/root/testing/epd-visualization-test-config.ts
index 4927baf05bf..9ae2ced1fef 100644
--- a/integration-libs/epd-visualization/root/testing/epd-visualization-test-config.ts
+++ b/integration-libs/epd-visualization/root/testing/epd-visualization-test-config.ts
@@ -15,7 +15,7 @@ export function getTestConfig(): EpdVisualizationConfig {
},
ui5: {
bootstrapUrl:
- 'https://sapui5.hana.ondemand.com/1.108.5/resources/sap-ui-core.js',
+ 'https://sapui5.hana.ondemand.com/1.108.14/resources/sap-ui-core.js',
},
},
};
diff --git a/integration-libs/epd-visualization/schematics/add-epd-visualization/__snapshots__/index_spec.ts.snap b/integration-libs/epd-visualization/schematics/add-epd-visualization/__snapshots__/index_spec.ts.snap
index 189acb3d51e..c3cf97a731b 100644
--- a/integration-libs/epd-visualization/schematics/add-epd-visualization/__snapshots__/index_spec.ts.snap
+++ b/integration-libs/epd-visualization/schematics/add-epd-visualization/__snapshots__/index_spec.ts.snap
@@ -22,7 +22,7 @@ import { EpdVisualizationConfig, EpdVisualizationRootModule } from "@spartacus/e
provideConfig({
epdVisualization: {
ui5: {
- bootstrapUrl: "https://sapui5.hana.ondemand.com/1.108.5/resources/sap-ui-core.js"
+ bootstrapUrl: "https://sapui5.hana.ondemand.com/1.108.14/resources/sap-ui-core.js"
},
apis: {
@@ -58,7 +58,7 @@ import { EpdVisualizationConfig, EpdVisualizationRootModule } from "@spartacus/e
provideConfig({
epdVisualization: {
ui5: {
- bootstrapUrl: "https://sapui5.hana.ondemand.com/1.108.5/resources/sap-ui-core.js"
+ bootstrapUrl: "https://sapui5.hana.ondemand.com/1.108.14/resources/sap-ui-core.js"
},
apis: {
@@ -100,7 +100,7 @@ import { EpdVisualizationConfig, EpdVisualizationRootModule, EPD_VISUALIZATION_F
provideConfig({
epdVisualization: {
ui5: {
- bootstrapUrl: "https://sapui5.hana.ondemand.com/1.108.5/resources/sap-ui-core.js"
+ bootstrapUrl: "https://sapui5.hana.ondemand.com/1.108.14/resources/sap-ui-core.js"
},
apis: {
diff --git a/package-lock.json b/package-lock.json
index a00fe27474d..0093e2d1672 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -65,7 +65,7 @@
"@nrwl/eslint-plugin-nx": "^15.9.2",
"@nrwl/jest": "^15.9.2",
"@nrwl/workspace": "15.9.2",
- "@sapui5/ts-types-esm": "1.108.5",
+ "@sapui5/ts-types-esm": "1.108.14",
"@schematics/angular": "^15.2.4",
"@types/express": "^4.17.17",
"@types/fs-extra": "^11.0.1",
@@ -5847,7 +5847,7 @@
}
},
"node_modules/@sapui5/ts-types-esm": {
- "version": "1.108.5",
+ "version": "1.108.14",
"dev": true,
"license": "SEE LICENSE IN LICENSE.txt",
"dependencies": {
diff --git a/package.json b/package.json
index 4f452af6c29..d8093886125 100644
--- a/package.json
+++ b/package.json
@@ -152,7 +152,7 @@
"@nrwl/eslint-plugin-nx": "^15.9.2",
"@nrwl/jest": "^15.9.2",
"@nrwl/workspace": "15.9.2",
- "@sapui5/ts-types-esm": "1.108.5",
+ "@sapui5/ts-types-esm": "1.108.14",
"@schematics/angular": "^15.2.4",
"@types/express": "^4.17.17",
"@types/fs-extra": "^11.0.1",
diff --git a/projects/schematics/src/dependencies.json b/projects/schematics/src/dependencies.json
index 016130d90f0..48413d084bb 100644
--- a/projects/schematics/src/dependencies.json
+++ b/projects/schematics/src/dependencies.json
@@ -307,7 +307,7 @@
"@angular/core": "^15.2.4",
"@angular/forms": "^15.2.4",
"@angular/router": "^15.2.4",
- "@sapui5/ts-types-esm": "1.108.5",
+ "@sapui5/ts-types-esm": "1.108.14",
"@spartacus/cart": "5.0.0",
"@spartacus/core": "5.0.0",
"@spartacus/schematics": "5.0.0",
diff --git a/projects/schematics/src/shared/lib-configs/integration-libs/epd-schematics-config.ts b/projects/schematics/src/shared/lib-configs/integration-libs/epd-schematics-config.ts
index 3c498ff553b..b8e6de53fc3 100644
--- a/projects/schematics/src/shared/lib-configs/integration-libs/epd-schematics-config.ts
+++ b/projects/schematics/src/shared/lib-configs/integration-libs/epd-schematics-config.ts
@@ -75,7 +75,7 @@ function buildCdsConfig(
content: `<${EPD_VISUALIZATION_CONFIG}>{
epdVisualization: {
ui5: {
- bootstrapUrl: "https://sapui5.hana.ondemand.com/1.108.5/resources/sap-ui-core.js"
+ bootstrapUrl: "https://sapui5.hana.ondemand.com/1.108.14/resources/sap-ui-core.js"
},
apis: {
diff --git a/projects/storefrontapp/src/app/spartacus/features/epd-visualization/epd-visualization-feature.module.ts b/projects/storefrontapp/src/app/spartacus/features/epd-visualization/epd-visualization-feature.module.ts
index 445c4f7c33c..9c246c62d90 100644
--- a/projects/storefrontapp/src/app/spartacus/features/epd-visualization/epd-visualization-feature.module.ts
+++ b/projects/storefrontapp/src/app/spartacus/features/epd-visualization/epd-visualization-feature.module.ts
@@ -25,7 +25,7 @@ const epdVisualizationConfig: EpdVisualizationConfig = {
ui5: {
bootstrapUrl:
- 'https://sapui5.hana.ondemand.com/1.108.5/resources/sap-ui-core.js',
+ 'https://sapui5.hana.ondemand.com/1.108.14/resources/sap-ui-core.js',
},
},
};
From 9f9b9befd44a7fe6924c418bdb507db4765eb976 Mon Sep 17 00:00:00 2001
From: Matthew <43279967+gladius-mtl@users.noreply.github.com>
Date: Fri, 19 May 2023 12:43:37 -0400
Subject: [PATCH 011/122] Add missing image to self publishing libs doc
(#17434)
---
docs/assets/github-branch-selector.png | Bin 0 -> 96001 bytes
docs/self-publishing-spartacus-libraries.md | 4 ++--
2 files changed, 2 insertions(+), 2 deletions(-)
create mode 100644 docs/assets/github-branch-selector.png
diff --git a/docs/assets/github-branch-selector.png b/docs/assets/github-branch-selector.png
new file mode 100644
index 0000000000000000000000000000000000000000..88545b95b4d219cc0d41e384133e16d1663076d3
GIT binary patch
literal 96001
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