Skip to content
Draft
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
acf4b32
fix: (CXSPA-9504) support Chinese address in address book
espada945 Mar 20, 2026
5768599
fix: (CXSPA-9504) update existing unit tests for new dependencies
espada945 Mar 23, 2026
1fa348c
Merge branch 'develop' into bugfix/CXSPA-9504
espada945 Mar 23, 2026
bb54f99
fix: add unit tests for China address logic to meet coverage threshold
espada945 Mar 23, 2026
8a57374
fix: format spec file with prettier
espada945 Mar 23, 2026
6055a54
Merge branch 'develop' into bugfix/CXSPA-9504
espada945 Mar 24, 2026
01fe95b
fix: add null fallback for async pipe in ng-select items
espada945 Mar 24, 2026
068cc2e
fix: (CXSPA-9504) address code review feedback for Chinese address su…
espada945 Mar 26, 2026
a512114
fix: (CXSPA-9504) disable city/district dropdowns until parent selected
espada945 Mar 26, 2026
9a5bd91
fix: (CXSPA-9504) add zh/zh_TW translations, fix tests and formatting
espada945 Mar 30, 2026
cb57b67
fix: (CXSPA-9504) format address-form component with prettier
espada945 Mar 30, 2026
17fb9be
Merge branch 'develop' into bugfix/CXSPA-9504
espada945 Mar 31, 2026
a823920
fix: (CXSPA-9504) reduce complexity in getCardContent, fix unnecessar…
espada945 Mar 31, 2026
5915982
fix: (CXSPA-9504) trigger CI retry
espada945 Mar 31, 2026
28c6b99
fix: (CXSPA-9504) trigger CI retry
espada945 Mar 31, 2026
1982b2b
fix: (CXSPA-9504) trigger CI retry
espada945 Mar 31, 2026
91a1228
Merge branch 'develop' into bugfix/CXSPA-9504
espada945 Apr 1, 2026
6a83f92
fix: (CXSPA-9504) use country isocode for address card display to mat…
espada945 Apr 1, 2026
becc9fe
fix: (CXSPA-9504) use region isocode instead of name in address card …
espada945 Apr 1, 2026
b1f7053
Merge branch 'develop' into bugfix/CXSPA-9504
espada945 Apr 7, 2026
d7248ae
Merge branch 'develop' into bugfix/CXSPA-9504
espada945 Apr 7, 2026
4ec0863
Merge branch 'develop' into bugfix/CXSPA-9504
i53577 Apr 7, 2026
6212cc8
refactor: (CXSPA-9504) move Chinese address API calls to UserProfileA…
espada945 Apr 9, 2026
c1129eb
fix: (CXSPA-9504) move getCities/getDistricts to UserAddressService v…
espada945 Apr 9, 2026
da98c45
fix: (CXSPA-9504) restore JSDoc comments in SiteAdapter
espada945 Apr 9, 2026
306ecd5
fix: (CXSPA-9504) fix CI failures - OPF spec missing SiteAdapter prov…
espada945 Apr 10, 2026
c90a80b
Merge branch 'develop' into bugfix/CXSPA-9504
espada945 Apr 10, 2026
4fd7273
fix: (CXSPA-9504) fix CI failures - OPF spec missing SiteAdapter prov…
espada945 Apr 10, 2026
e420c1d
fix: (CXSPA-9504) add SiteAdapter mock provider to UserAddressService…
espada945 Apr 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
"placeholder": "City"
},
"state": "State",
"province": "Province",
"district": "District",
"zipCode": {
"label": "Zip code",
"placeholder": "Postal Code/Zip"
Expand All @@ -36,6 +38,8 @@
"streetAddress": "Street Address",
"aptSuite": "Apartment Number",
"selectOne": "Select One...",
"selectProvinceFirst": "Please select a province first",
"selectCityFirst": "Please select a city first",
"setAsDefault": "Set as default delivery address",
"titleRequired": "Title is required.",
"userAddressAddSuccess": "New address was added successfully!",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
"placeholder": "城市"
},
"state": "州/省",
"province": "省份",
"district": "区/县",
"zipCode": {
"label": "邮政编码",
"placeholder": "邮政编码"
Expand All @@ -36,6 +38,8 @@
"streetAddress": "街道地址",
"aptSuite": "公寓号",
"selectOne": "选择一个...",
"selectProvinceFirst": "请先选择省份",
"selectCityFirst": "请先选择城市",
"setAsDefault": "设置默认送货地址",
"titleRequired": "标题为必填项。",
"userAddressAddSuccess": "新地址添加成功!",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
"placeholder": "城市"
},
"state": "州",
"province": "省份",
"district": "區/縣",
"zipCode": {
"label": "郵遞區號",
"placeholder": "郵遞區號/ZIP"
Expand All @@ -36,6 +38,8 @@
"streetAddress": "街道地址",
"aptSuite": "公寓號碼",
"selectOne": "選擇一個...",
"selectProvinceFirst": "請先選擇省份",
"selectCityFirst": "請先選擇城市",
"setAsDefault": "設定為預設交貨地址",
"titleRequired": "稱謂為必要。",
"userAddressAddSuccess": "已成功新增地址!",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,12 @@ export class AddressBookComponent implements OnInit {
textPhone,
textMobile,
]) => {
let region = '';

if (address.region && address.region.isocode) {
region = address.region.isocode + ', ';
}
const region = this.buildRegion(address);
const countryName =
address.country?.name || address.country?.isocode || '';
const townName = address.city?.name || address.town || '';
const districtName =
address.cityDistrict?.name || address.district || '';

const actions: { name: string; event: string }[] = [];
if (!address.defaultAddress) {
Expand All @@ -125,16 +126,21 @@ export class AddressBookComponent implements OnInit {

const numbers = getAddressNumbers(address, textPhone, textMobile);

const locationParts = [townName, region, countryName]
.filter(Boolean)
.join(', ');

return {
role: 'application',
textBold: address.firstName + ' ' + address.lastName,
text: [
address.line1,
address.line2,
address.town + ', ' + region + address.country?.isocode,
locationParts,
districtName,
address.postalCode,
numbers,
],
].filter(Boolean) as string[],
actions: actions,
header: address.defaultAddress ? `✓ ${defaultText}` : '',
deleteMsg: textVerifyDeleteMsg,
Expand All @@ -147,6 +153,10 @@ export class AddressBookComponent implements OnInit {
);
}

private buildRegion(address: Address): string {
return address.region?.name || address.region?.isocode || '';
}

setAddressAsDefault(address: Address): void {
this.service.setAddressAsDefault(address.id ?? '');
this.globalMessageService.add(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,24 +158,87 @@
</label>
</div>
<div class="row">
<ng-container *ngIf="regions$ | async as regions" formGroupName="region">
<ng-container *ngIf="regions.length !== 0">
<div class="form-group col-md-6">
<label>
<span class="label-content required"
>{{
isChineseAddress
? ('addressForm.province' | cxTranslate)
: ('addressForm.state' | cxTranslate)
}}
<cx-form-required-asterisks />
</span>
<ng-select
[inputAttrs]="{ required: 'true' }"
class="region-select"
formControlName="isocode"
[searchable]="true"
[clearable]="false"
[items]="regions"
bindLabel="{{ regions[0].name ? 'name' : 'isocode' }}"
bindValue="{{ regions[0].name ? 'isocode' : 'region' }}"
placeholder="{{ 'addressForm.selectOne' | cxTranslate }}"
(change)="regionSelected($event)"
id="region-select"
ariaLabelDropdown="{{
'common.ngSelectDropdownOptionsList' | cxTranslate
}}"
[cxNgSelectA11y]="{
ariaLabel: 'addressForm.state' | cxTranslate,
}"
>
</ng-select>
<cx-form-errors
[control]="addressForm.get('region.isocode')"
></cx-form-errors>
</label>
</div>
</ng-container>
</ng-container>
<div class="form-group col-sm-6">
<label>
<span class="label-content required"
>{{ 'addressForm.city.label' | cxTranslate }}

<cx-form-required-asterisks />
</span>
<input
required="true"
type="text"
class="form-control"
placeholder="{{ 'addressForm.city.placeholder' | cxTranslate }}"
<ng-select
*ngIf="isChineseAddress; else cityTextInput"
class="city-select"
id="city-select"
formControlName="town"
[attr.aria-invalid]="
addressForm.get('town')?.touched && addressForm.get('town')?.invalid
"
[attr.aria-errormessage]="'townError'"
/>
[searchable]="true"
[clearable]="false"
[items]="cities"
bindLabel="name"
bindValue="isocode"
placeholder="{{
selectedRegion$.value
? ('addressForm.selectOne' | cxTranslate)
: ('addressForm.selectProvinceFirst' | cxTranslate)
}}"
(change)="citySelected($event)"
[cxNgSelectA11y]="{
ariaLabel: 'addressForm.city.label' | cxTranslate,
}"
>
</ng-select>
<ng-template #cityTextInput>
<input
required="true"
type="text"
class="form-control"
placeholder="{{ 'addressForm.city.placeholder' | cxTranslate }}"
formControlName="town"
[attr.aria-invalid]="
addressForm.get('town')?.touched &&
addressForm.get('town')?.invalid
"
[attr.aria-errormessage]="'townError'"
/>
</ng-template>
<cx-form-errors
id="townError"
[translationParams]="{
Expand All @@ -185,6 +248,39 @@
></cx-form-errors>
</label>
</div>
<div class="form-group col-md-6" *ngIf="isChineseAddress">
<label>
<span class="label-content required"
>{{ 'addressForm.district' | cxTranslate }}
<cx-form-required-asterisks />
</span>
<ng-select
class="district-select"
id="district-select"
formControlName="district"
[searchable]="true"
[clearable]="false"
[items]="districts"
bindLabel="name"
bindValue="isocode"
placeholder="{{
selectedCity$.value
? ('addressForm.selectOne' | cxTranslate)
: ('addressForm.selectCityFirst' | cxTranslate)
}}"
[cxNgSelectA11y]="{
ariaLabel: 'addressForm.district' | cxTranslate,
}"
>
</ng-select>
<cx-form-errors
[translationParams]="{
label: 'addressForm.district' | cxTranslate,
}"
[control]="addressForm.get('district')"
></cx-form-errors>
</label>
</div>
<div class="form-group col-sm-6">
<label>
<span class="label-content required"
Expand Down Expand Up @@ -213,40 +309,6 @@
></cx-form-errors>
</label>
</div>
<ng-container *ngIf="regions$ | async as regions" formGroupName="region">
<ng-container *ngIf="regions.length !== 0">
<div class="form-group col-md-6">
<label>
<span class="label-content required"
>{{ 'addressForm.state' | cxTranslate }}
<cx-form-required-asterisks />
</span>
<ng-select
[inputAttrs]="{ required: 'true' }"
class="region-select"
formControlName="isocode"
[searchable]="true"
[clearable]="false"
[items]="regions"
bindLabel="{{ regions[0].name ? 'name' : 'isocode' }}"
bindValue="{{ regions[0].name ? 'isocode' : 'region' }}"
placeholder="{{ 'addressForm.selectOne' | cxTranslate }}"
id="region-select"
ariaLabelDropdown="{{
'common.ngSelectDropdownOptionsList' | cxTranslate
}}"
[cxNgSelectA11y]="{
ariaLabel: 'addressForm.state' | cxTranslate,
}"
>
</ng-select>
<cx-form-errors
[control]="addressForm.get('region.isocode')"
></cx-form-errors>
</label>
</div>
</ng-container>
</ng-container>
</div>

<div class="row">
Expand All @@ -267,15 +329,23 @@
</div>
<div class="form-group col-md-6">
<label>
<span class="label-content">{{
'addressForm.cellphone.label' | cxTranslate
}}</span>
<span class="label-content" [class.required]="isChineseAddress"
>{{ 'addressForm.cellphone.label' | cxTranslate }}
<cx-form-required-asterisks *ngIf="isChineseAddress" />
</span>
<input
type="tel"
class="form-control"
placeholder="{{ 'addressForm.cellphone.placeholder' | cxTranslate }}"
formControlName="cellphone"
/>
<cx-form-errors
*ngIf="isChineseAddress"
[translationParams]="{
label: 'addressForm.cellphone.label' | cxTranslate,
}"
[control]="addressForm.get('cellphone')"
></cx-form-errors>
</label>
</div>
</div>
Expand Down
Loading
Loading