@hmcts/ccd-case-ui-toolkit 7.0.13 → 7.0.14-address-field-check

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 (22) hide show
  1. package/esm2020/lib/shared/commons/address-validation-constants.mjs +13 -0
  2. package/esm2020/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.mjs +15 -6
  3. package/esm2020/lib/shared/components/palette/address/write-address-field.component.mjs +55 -18
  4. package/esm2020/lib/shared/components/palette/base-field/abstract-form-field.component.mjs +5 -1
  5. package/esm2020/lib/shared/domain/http/http-error.model.mjs +8 -2
  6. package/esm2020/lib/shared/services/addresses/addresses.service.mjs +9 -1
  7. package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs +101 -22
  8. package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
  9. package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs +95 -22
  10. package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
  11. package/lib/shared/commons/address-validation-constants.d.ts +7 -0
  12. package/lib/shared/commons/address-validation-constants.d.ts.map +1 -0
  13. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts +3 -2
  14. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts.map +1 -1
  15. package/lib/shared/components/palette/address/write-address-field.component.d.ts +5 -0
  16. package/lib/shared/components/palette/address/write-address-field.component.d.ts.map +1 -1
  17. package/lib/shared/components/palette/base-field/abstract-form-field.component.d.ts.map +1 -1
  18. package/lib/shared/domain/http/http-error.model.d.ts +1 -0
  19. package/lib/shared/domain/http/http-error.model.d.ts.map +1 -1
  20. package/lib/shared/services/addresses/addresses.service.d.ts +3 -0
  21. package/lib/shared/services/addresses/addresses.service.d.ts.map +1 -1
  22. package/package.json +1 -1
@@ -8,7 +8,7 @@ import * as i1$1 from '@angular/router';
8
8
  import { RouterModule, NavigationStart, NavigationEnd } from '@angular/router';
9
9
  import * as i3 from '@angular/forms';
10
10
  import { NG_VALUE_ACCESSOR, NG_VALIDATORS, FormArray, FormGroup, FormControl, Validators, ReactiveFormsModule, FormsModule } from '@angular/forms';
11
- import { throwError, Subject, EMPTY, Observable, of, BehaviorSubject, timer, fromEvent, forkJoin, Subscription, combineLatest } from 'rxjs';
11
+ import { throwError, Subject, EMPTY, Observable, BehaviorSubject, of, timer, fromEvent, forkJoin, Subscription, combineLatest } from 'rxjs';
12
12
  import * as i1$2 from '@angular/common/http';
13
13
  import { HttpErrorResponse, HttpHeaders, HttpParams } from '@angular/common/http';
14
14
  import { catchError, map, publish, refCount, switchMap, debounceTime, delay, distinctUntilChanged, finalize, timeout, mergeMap, retryWhen, tap, delayWhen, publishReplay, take, first, takeUntil, filter } from 'rxjs/operators';
@@ -1241,9 +1241,14 @@ class HttpError {
1241
1241
  }
1242
1242
  static from(response) {
1243
1243
  const error = new HttpError();
1244
+ if (response?.status === 429) {
1245
+ error.error = HttpError.MESSAGE_ERROR_429;
1246
+ error.status = response.status;
1247
+ error.message = response.message;
1248
+ }
1244
1249
  // Check that the HttpErrorResponse contains an "error" object before mapping the error properties
1245
1250
  if (!!(response && response.error)) {
1246
- Object.keys(error).forEach(key => {
1251
+ Object.keys(error).forEach((key) => {
1247
1252
  error[key] = response.error.hasOwnProperty(key) && response.error[key] ? response.error[key] : error[key];
1248
1253
  });
1249
1254
  }
@@ -1260,6 +1265,7 @@ class HttpError {
1260
1265
  HttpError.DEFAULT_ERROR = 'Unknown error';
1261
1266
  HttpError.DEFAULT_MESSAGE = 'Something unexpected happened, our technical staff have been automatically notified';
1262
1267
  HttpError.DEFAULT_STATUS = 500;
1268
+ HttpError.MESSAGE_ERROR_429 = 'Your request was rate limited. Please wait a few seconds before retrying your document upload';
1263
1269
 
1264
1270
  /**
1265
1271
  * `Oauth2Service` and `AuthService` cannot be merged as it creates a cyclic dependency on `AuthService` through `HttpErrorService`.
@@ -4606,7 +4612,11 @@ class AbstractFormFieldComponent {
4606
4612
  return control;
4607
4613
  }
4608
4614
  const existing = container.controls[this.caseField.id];
4615
+ // update the field value which has been set in mid-event call back
4609
4616
  if (existing) {
4617
+ if (existing.value === null && this.caseField?.value) {
4618
+ existing.value = this.caseField.value;
4619
+ }
4610
4620
  if (replace) {
4611
4621
  // Set the validators on the replacement with what already exists.
4612
4622
  control.setValidators(existing.validator);
@@ -6253,6 +6263,7 @@ class AddressesService {
6253
6263
  constructor(http, appConfig) {
6254
6264
  this.http = http;
6255
6265
  this.appConfig = appConfig;
6266
+ this.mandatoryError = new BehaviorSubject(false);
6256
6267
  }
6257
6268
  getAddressesForPostcode(postcode) {
6258
6269
  return this.http
@@ -6261,6 +6272,12 @@ class AddressesService {
6261
6272
  .pipe(map(res => res.results))
6262
6273
  .pipe(map(output => output.map(addresses => this.format(new AddressParser().parse(addresses[AddressType.DPA])))));
6263
6274
  }
6275
+ getMandatoryError() {
6276
+ return this.mandatoryError.asObservable();
6277
+ }
6278
+ setMandatoryError(value) {
6279
+ this.mandatoryError.next(value);
6280
+ }
6264
6281
  format(addressModel) {
6265
6282
  return this.formatAddressLines(this.shiftAddressLinesUp(addressModel));
6266
6283
  }
@@ -9616,7 +9633,7 @@ function CaseEditPageComponent_ccd_case_event_completion_11_Template(rf, ctx) {
9616
9633
  i0.ɵɵproperty("eventCompletionParams", ctx_r8.caseEdit.eventCompletionParams);
9617
9634
  } }
9618
9635
  class CaseEditPageComponent {
9619
- constructor(caseEdit, route, formValueService, formErrorService, cdRef, pageValidationService, dialog, caseFieldService, caseEditDataService, loadingService, validPageListCaseFieldsService) {
9636
+ constructor(caseEdit, route, formValueService, formErrorService, cdRef, pageValidationService, dialog, caseFieldService, caseEditDataService, loadingService, validPageListCaseFieldsService, addressService) {
9620
9637
  this.caseEdit = caseEdit;
9621
9638
  this.route = route;
9622
9639
  this.formValueService = formValueService;
@@ -9628,6 +9645,7 @@ class CaseEditPageComponent {
9628
9645
  this.caseEditDataService = caseEditDataService;
9629
9646
  this.loadingService = loadingService;
9630
9647
  this.validPageListCaseFieldsService = validPageListCaseFieldsService;
9648
+ this.addressService = addressService;
9631
9649
  this.triggerTextStart = CaseEditPageComponent.TRIGGER_TEXT_START;
9632
9650
  this.triggerTextIgnoreWarnings = CaseEditPageComponent.TRIGGER_TEXT_CONTINUE;
9633
9651
  this.formValuesChanged = false;
@@ -9750,7 +9768,14 @@ class CaseEditPageComponent {
9750
9768
  }
9751
9769
  }
9752
9770
  if (fieldElement.hasError('required')) {
9753
- this.caseEditDataService.addFormValidationError({ id, message: `%FIELDLABEL% is required`, label });
9771
+ if (casefield.id === 'AddressLine1') {
9772
+ // EUI-1067 - Display more relevant error message to user and correctly navigate to the field
9773
+ this.addressService.setMandatoryError(true);
9774
+ this.caseEditDataService.addFormValidationError({ id: `${path}_${path}`, message: `An address is required` });
9775
+ }
9776
+ else {
9777
+ this.caseEditDataService.addFormValidationError({ id, message: `%FIELDLABEL% is required`, label });
9778
+ }
9754
9779
  fieldElement.markAsDirty();
9755
9780
  // For the JudicialUser field type, an error needs to be set on the component so that an error message
9756
9781
  // can be displayed at field level
@@ -9825,6 +9850,7 @@ class CaseEditPageComponent {
9825
9850
  }
9826
9851
  }
9827
9852
  if (!this.caseEdit.isSubmitting && !this.currentPageIsNotValid()) {
9853
+ this.addressService.setMandatoryError(false);
9828
9854
  console.log('Case Edit Error', this.caseEdit.error);
9829
9855
  if (this.caseEdit.validPageList.findIndex(page => page.id === this.currentPage.id) === -1) {
9830
9856
  this.caseEdit.validPageList.push(this.currentPage);
@@ -10124,7 +10150,7 @@ CaseEditPageComponent.RESUMED_FORM_SAVE = 'RESUMED_FORM_SAVE';
10124
10150
  CaseEditPageComponent.TRIGGER_TEXT_START = 'Continue';
10125
10151
  CaseEditPageComponent.TRIGGER_TEXT_SAVE = 'Save and continue';
10126
10152
  CaseEditPageComponent.TRIGGER_TEXT_CONTINUE = 'Ignore Warning and Continue';
10127
- CaseEditPageComponent.ɵfac = function CaseEditPageComponent_Factory(t) { return new (t || CaseEditPageComponent)(i0.ɵɵdirectiveInject(CaseEditComponent), i0.ɵɵdirectiveInject(i1$1.ActivatedRoute), i0.ɵɵdirectiveInject(FormValueService), i0.ɵɵdirectiveInject(FormErrorService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(PageValidationService), i0.ɵɵdirectiveInject(i1$3.MatLegacyDialog), i0.ɵɵdirectiveInject(CaseFieldService), i0.ɵɵdirectiveInject(CaseEditDataService), i0.ɵɵdirectiveInject(LoadingService), i0.ɵɵdirectiveInject(ValidPageListCaseFieldsService)); };
10153
+ CaseEditPageComponent.ɵfac = function CaseEditPageComponent_Factory(t) { return new (t || CaseEditPageComponent)(i0.ɵɵdirectiveInject(CaseEditComponent), i0.ɵɵdirectiveInject(i1$1.ActivatedRoute), i0.ɵɵdirectiveInject(FormValueService), i0.ɵɵdirectiveInject(FormErrorService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(PageValidationService), i0.ɵɵdirectiveInject(i1$3.MatLegacyDialog), i0.ɵɵdirectiveInject(CaseFieldService), i0.ɵɵdirectiveInject(CaseEditDataService), i0.ɵɵdirectiveInject(LoadingService), i0.ɵɵdirectiveInject(ValidPageListCaseFieldsService), i0.ɵɵdirectiveInject(AddressesService)); };
10128
10154
  CaseEditPageComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CaseEditPageComponent, selectors: [["ccd-case-edit-page"]], decls: 12, vars: 11, consts: [[4, "ngIf"], [4, "ngIf", "ngIfThen", "ngIfElse"], ["titleBlock", ""], ["idBlock", ""], ["class", "govuk-error-summary", "aria-labelledby", "error-summary-title", "role", "alert", "tabindex", "-1", "data-module", "govuk-error-summary", 4, "ngIf"], [3, "error"], [3, "triggerTextContinue", "triggerTextIgnore", "callbackErrorsSubject", "callbackErrorsContext"], [1, "width-50"], ["class", "form", 3, "formGroup", "submit", 4, "ngIf"], [3, "eventCompletionParams", "eventCanBeCompleted", 4, "ngIf"], ["class", "govuk-heading-l", 4, "ngIf"], [1, "govuk-heading-l"], [1, "govuk-caption-l"], [3, "content"], ["class", "heading-h2", 4, "ngIf"], [1, "heading-h2"], ["aria-labelledby", "error-summary-title", "role", "alert", "tabindex", "-1", "data-module", "govuk-error-summary", 1, "govuk-error-summary"], ["id", "error-summary-title", 1, "govuk-error-summary__title"], ["class", "govuk-error-summary__body", 4, "ngFor", "ngForOf"], [1, "govuk-error-summary__body"], [1, "govuk-list", "govuk-error-summary__list"], [1, "validation-error", 3, "click"], [1, "form", 3, "formGroup", "submit"], ["id", "fieldset-case-data"], [2, "display", "none"], ["id", "caseEditForm", 3, "fields", "formGroup", "caseFields", "pageChangeSubject", "valuesChanged", 4, "ngIf"], ["class", "grid-row", 4, "ngIf"], [1, "form-group", "form-group-related"], ["type", "button", 1, "button", "button-secondary", 3, "disabled", "click"], ["type", "submit", 1, "button", 3, "disabled"], [1, "cancel"], ["href", "javascript:void(0)", 3, "click"], ["id", "caseEditForm", 3, "fields", "formGroup", "caseFields", "pageChangeSubject", "valuesChanged"], [1, "grid-row"], [1, "column-two-thirds", "rightBorderSeparator"], ["id", "caseEditForm1", 3, "fields", "formGroup", "caseFields"], [1, "column-one-third"], ["id", "caseEditForm2", 3, "fields", "formGroup", "caseFields"], [3, "eventCompletionParams", "eventCanBeCompleted"]], template: function CaseEditPageComponent_Template(rf, ctx) { if (rf & 1) {
10129
10155
  i0.ɵɵtemplate(0, CaseEditPageComponent_ng_container_0_Template, 3, 2, "ng-container", 0);
10130
10156
  i0.ɵɵtemplate(1, CaseEditPageComponent_div_1_Template, 1, 0, "div", 1);
@@ -10159,7 +10185,7 @@ CaseEditPageComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CaseE
10159
10185
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CaseEditPageComponent, [{
10160
10186
  type: Component,
10161
10187
  args: [{ selector: 'ccd-case-edit-page', template: "<ng-container *ngIf=\"currentPage\">\n <h1 *ngIf=\"!currentPage.label\" class=\"govuk-heading-l\">{{eventTrigger.name | rpxTranslate}}</h1>\n <ng-container *ngIf=\"currentPage.label\">\n <span class=\"govuk-caption-l\">{{ eventTrigger.name | rpxTranslate}}</span>\n <h1 class=\"govuk-heading-l\">{{currentPage.label | rpxTranslate}}</h1>\n </ng-container>\n</ng-container>\n\n<!--Case ID or Title -->\n<div *ngIf=\"getCaseTitle(); then titleBlock; else idBlock\"></div>\n<ng-template #titleBlock>\n <ccd-markdown [content]=\"getCaseTitle() | ccdCaseTitle: caseFields : editForm.controls['data']\"></ccd-markdown>\n</ng-template>\n<ng-template #idBlock>\n <h2 *ngIf=\"getCaseId()\" class=\"heading-h2\">#{{ getCaseId() | ccdCaseReference }}</h2>\n</ng-template>\n\n<!-- Error message summary -->\n<div *ngIf=\"validationErrors.length > 0\" class=\"govuk-error-summary\" aria-labelledby=\"error-summary-title\" role=\"alert\" tabindex=\"-1\" data-module=\"govuk-error-summary\">\n <h2 class=\"govuk-error-summary__title\" id=\"error-summary-title\">\n {{'There is a problem' | rpxTranslate}}\n </h2>\n <div *ngFor=\"let validationError of validationErrors\" class=\"govuk-error-summary__body\">\n <ul class=\"govuk-list govuk-error-summary__list\">\n <li>\n <a (click)=\"navigateToErrorElement(validationError.id)\" class=\"validation-error\">\n {{ validationError.message | rpxTranslate: getRpxTranslatePipeArgs(validationError.label | rpxTranslate): null }}\n </a>\n </li>\n </ul>\n </div>\n</div>\n\n<ccd-case-edit-generic-errors [error]=\"caseEdit.error\"></ccd-case-edit-generic-errors>\n\n<ccd-callback-errors\n [triggerTextContinue]=\"triggerTextStart\"\n [triggerTextIgnore]=\"triggerTextIgnoreWarnings\"\n [callbackErrorsSubject]=\"caseEdit.callbackErrorsSubject\"\n (callbackErrorsContext)=\"callbackErrorsNotify($event)\">\n</ccd-callback-errors>\n<div class=\"width-50\">\n <form *ngIf=\"currentPage\" class=\"form\" [formGroup]=\"editForm\" (submit)=\"submit()\">\n <fieldset id=\"fieldset-case-data\">\n <legend style=\"display: none;\"></legend>\n <!-- single column -->\n <ccd-case-edit-form id='caseEditForm' *ngIf=\"!currentPage.isMultiColumn()\" [fields]=\"currentPage.getCol1Fields()\"\n [formGroup]=\"editForm.controls['data']\" [caseFields]=\"caseFields\"\n [pageChangeSubject]=\"pageChangeSubject\"\n (valuesChanged)=\"applyValuesChanged($event)\"></ccd-case-edit-form>\n <!-- two columns -->\n <div *ngIf=\"currentPage.isMultiColumn()\" class=\"grid-row\">\n <div class=\"column-two-thirds rightBorderSeparator\">\n <ccd-case-edit-form id='caseEditForm1' [fields]=\"currentPage.getCol1Fields()\"\n [formGroup]=\"editForm.controls['data']\" [caseFields]=\"caseFields\"></ccd-case-edit-form>\n </div>\n <div class=\"column-one-third\">\n <ccd-case-edit-form id='caseEditForm2' [fields]=\"currentPage.getCol2Fields()\"\n [formGroup]=\"editForm.controls['data']\" [caseFields]=\"caseFields\"></ccd-case-edit-form>\n </div>\n </div>\n </fieldset>\n\n <div class=\"form-group form-group-related\">\n <button class=\"button button-secondary\" type=\"button\" [disabled]=\"!(hasPreviousPage$ | async)\" (click)=\"toPreviousPage()\">\n {{'Previous' | rpxTranslate}}\n </button>\n <button class=\"button\" type=\"submit\" [disabled]=\"submitting()\">{{triggerText | rpxTranslate}}</button>\n </div>\n\n <p class=\"cancel\"><a (click)=\"cancel()\" href=\"javascript:void(0)\">{{getCancelText() | rpxTranslate}}</a></p>\n </form>\n</div>\n\n<ccd-case-event-completion *ngIf=\"caseEdit.isEventCompletionChecksRequired\"\n [eventCompletionParams]=\"caseEdit.eventCompletionParams\"\n (eventCanBeCompleted)=\"onEventCanBeCompleted($event)\">\n</ccd-case-event-completion>\n", styles: [".rightBorderSeparator{border-right-width:4px;border-right-color:#ffcc02;border-right-style:solid}.validation-error{cursor:pointer;text-decoration:underline;color:#d4351c}\n"] }]
10162
- }], function () { return [{ type: CaseEditComponent }, { type: i1$1.ActivatedRoute }, { type: FormValueService }, { type: FormErrorService }, { type: i0.ChangeDetectorRef }, { type: PageValidationService }, { type: i1$3.MatLegacyDialog }, { type: CaseFieldService }, { type: CaseEditDataService }, { type: LoadingService }, { type: ValidPageListCaseFieldsService }]; }, null); })();
10188
+ }], function () { return [{ type: CaseEditComponent }, { type: i1$1.ActivatedRoute }, { type: FormValueService }, { type: FormErrorService }, { type: i0.ChangeDetectorRef }, { type: PageValidationService }, { type: i1$3.MatLegacyDialog }, { type: CaseFieldService }, { type: CaseEditDataService }, { type: LoadingService }, { type: ValidPageListCaseFieldsService }, { type: AddressesService }]; }, null); })();
10163
10189
 
10164
10190
  class CallbackErrorsContext {
10165
10191
  }
@@ -10606,6 +10632,17 @@ class AddressOption {
10606
10632
  }
10607
10633
  }
10608
10634
 
10635
+ class AddressValidationConstants {
10636
+ }
10637
+ // allow alpha-numeric characters and spaces possibly between a connecting - character
10638
+ // this applies validation while allowing partial postcodes
10639
+ AddressValidationConstants.REGEX_POSTCODE = /^([A-Za-z0-9]-*| )+$/;
10640
+ AddressValidationConstants.ɵfac = function AddressValidationConstants_Factory(t) { return new (t || AddressValidationConstants)(); };
10641
+ AddressValidationConstants.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AddressValidationConstants, factory: AddressValidationConstants.ɵfac });
10642
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AddressValidationConstants, [{
10643
+ type: Injectable
10644
+ }], null, null); })();
10645
+
10609
10646
  class FieldsFilterPipe {
10610
10647
  /**
10611
10648
  * Complex type should have at least on simple field descendant with a value.
@@ -10872,8 +10909,9 @@ function WriteAddressFieldComponent_div_1_div_4_span_5_Template(rf, ctx) { if (r
10872
10909
  i0.ɵɵpipe(2, "rpxTranslate");
10873
10910
  i0.ɵɵelementEnd();
10874
10911
  } if (rf & 2) {
10912
+ const ctx_r5 = i0.ɵɵnextContext(3);
10875
10913
  i0.ɵɵadvance(1);
10876
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 1, "Enter the Postcode"));
10914
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 1, ctx_r5.errorMessage));
10877
10915
  } }
10878
10916
  const _c1$n = function (a0) { return { "form-group-error": a0 }; };
10879
10917
  const _c2$2 = function (a0) { return { "govuk-input--error": a0 }; };
@@ -10904,42 +10942,56 @@ function WriteAddressFieldComponent_div_1_div_4_Template(rf, ctx) { if (rf & 1)
10904
10942
  i0.ɵɵadvance(2);
10905
10943
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(9, 11, "Find address"));
10906
10944
  } }
10907
- function WriteAddressFieldComponent_div_1_div_5_option_6_Template(rf, ctx) { if (rf & 1) {
10945
+ function WriteAddressFieldComponent_div_1_div_5_span_5_Template(rf, ctx) { if (rf & 1) {
10946
+ i0.ɵɵelementStart(0, "span", 14);
10947
+ i0.ɵɵtext(1);
10948
+ i0.ɵɵpipe(2, "rpxTranslate");
10949
+ i0.ɵɵelementEnd();
10950
+ } if (rf & 2) {
10951
+ const ctx_r8 = i0.ɵɵnextContext(3);
10952
+ i0.ɵɵadvance(1);
10953
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 1, ctx_r8.errorMessage));
10954
+ } }
10955
+ function WriteAddressFieldComponent_div_1_div_5_option_7_Template(rf, ctx) { if (rf & 1) {
10908
10956
  i0.ɵɵelementStart(0, "option", 18);
10909
10957
  i0.ɵɵtext(1);
10910
10958
  i0.ɵɵpipe(2, "rpxTranslate");
10911
10959
  i0.ɵɵelementEnd();
10912
10960
  } if (rf & 2) {
10913
- const addressOption_r9 = ctx.$implicit;
10914
- i0.ɵɵproperty("ngValue", addressOption_r9.value);
10961
+ const addressOption_r10 = ctx.$implicit;
10962
+ i0.ɵɵproperty("ngValue", addressOption_r10.value);
10915
10963
  i0.ɵɵadvance(1);
10916
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 2, addressOption_r9.description), " ");
10964
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 2, addressOption_r10.description), " ");
10917
10965
  } }
10918
10966
  function WriteAddressFieldComponent_div_1_div_5_Template(rf, ctx) { if (rf & 1) {
10919
- const _r11 = i0.ɵɵgetCurrentView();
10967
+ const _r12 = i0.ɵɵgetCurrentView();
10920
10968
  i0.ɵɵelementStart(0, "div", 15)(1, "label", 9)(2, "span", 10);
10921
10969
  i0.ɵɵtext(3);
10922
10970
  i0.ɵɵpipe(4, "rpxTranslate");
10923
10971
  i0.ɵɵelementEnd()();
10924
- i0.ɵɵelementStart(5, "select", 16);
10925
- i0.ɵɵlistener("change", function WriteAddressFieldComponent_div_1_div_5_Template_select_change_5_listener() { i0.ɵɵrestoreView(_r11); const ctx_r10 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r10.addressSelected()); });
10926
- i0.ɵɵtemplate(6, WriteAddressFieldComponent_div_1_div_5_option_6_Template, 3, 4, "option", 17);
10972
+ i0.ɵɵtemplate(5, WriteAddressFieldComponent_div_1_div_5_span_5_Template, 3, 3, "span", 11);
10973
+ i0.ɵɵelementStart(6, "select", 16);
10974
+ i0.ɵɵlistener("change", function WriteAddressFieldComponent_div_1_div_5_Template_select_change_6_listener() { i0.ɵɵrestoreView(_r12); const ctx_r11 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r11.addressSelected()); });
10975
+ i0.ɵɵtemplate(7, WriteAddressFieldComponent_div_1_div_5_option_7_Template, 3, 4, "option", 17);
10927
10976
  i0.ɵɵelementEnd()();
10928
10977
  } if (rf & 2) {
10929
10978
  const ctx_r3 = i0.ɵɵnextContext(2);
10979
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(9, _c1$n, ctx_r3.noAddressSelected));
10930
10980
  i0.ɵɵadvance(1);
10931
10981
  i0.ɵɵproperty("for", ctx_r3.createElementId("addressList"));
10932
10982
  i0.ɵɵadvance(2);
10933
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 5, "Select an address"));
10983
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 7, "Select an address"));
10934
10984
  i0.ɵɵadvance(2);
10985
+ i0.ɵɵproperty("ngIf", ctx_r3.noAddressSelected);
10986
+ i0.ɵɵadvance(1);
10935
10987
  i0.ɵɵproperty("id", ctx_r3.createElementId("addressList"))("formControl", ctx_r3.addressList);
10936
10988
  i0.ɵɵadvance(1);
10937
10989
  i0.ɵɵproperty("ngForOf", ctx_r3.addressOptions);
10938
10990
  } }
10939
10991
  function WriteAddressFieldComponent_div_1_a_6_Template(rf, ctx) { if (rf & 1) {
10940
- const _r13 = i0.ɵɵgetCurrentView();
10992
+ const _r14 = i0.ɵɵgetCurrentView();
10941
10993
  i0.ɵɵelementStart(0, "a", 19);
10942
- i0.ɵɵlistener("click", function WriteAddressFieldComponent_div_1_a_6_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r12 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r12.blankAddress()); });
10994
+ i0.ɵɵlistener("click", function WriteAddressFieldComponent_div_1_a_6_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r13 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r13.blankAddress()); });
10943
10995
  i0.ɵɵtext(1);
10944
10996
  i0.ɵɵpipe(2, "rpxTranslate");
10945
10997
  i0.ɵɵelementEnd();
@@ -10953,7 +11005,7 @@ function WriteAddressFieldComponent_div_1_Template(rf, ctx) { if (rf & 1) {
10953
11005
  i0.ɵɵpipe(3, "ccdFieldLabel");
10954
11006
  i0.ɵɵelementEnd();
10955
11007
  i0.ɵɵtemplate(4, WriteAddressFieldComponent_div_1_div_4_Template, 10, 17, "div", 5);
10956
- i0.ɵɵtemplate(5, WriteAddressFieldComponent_div_1_div_5_Template, 7, 7, "div", 6);
11008
+ i0.ɵɵtemplate(5, WriteAddressFieldComponent_div_1_div_5_Template, 8, 11, "div", 6);
10957
11009
  i0.ɵɵtemplate(6, WriteAddressFieldComponent_div_1_a_6_Template, 3, 3, "a", 7);
10958
11010
  i0.ɵɵelementEnd();
10959
11011
  } if (rf & 2) {
@@ -10972,19 +11024,30 @@ class WriteAddressFieldComponent extends AbstractFieldWriteComponent {
10972
11024
  super();
10973
11025
  this.isCompoundPipe = isCompoundPipe;
10974
11026
  this.addressFormGroup = new FormGroup({});
11027
+ this.errorMessage = WriteAddressFieldComponent.REQUIRED_ERROR_MESSAGE;
10975
11028
  this.missingPostcode = false;
11029
+ this.noAddressSelected = false;
10976
11030
  this.addressesService = addressesService;
10977
11031
  }
10978
11032
  ngOnInit() {
10979
11033
  if (!this.isComplexWithHiddenFields()) {
10980
- this.postcode = new FormControl('');
11034
+ this.postcode = new FormControl('', [Validators.required]);
10981
11035
  this.addressFormGroup.addControl('postcode', this.postcode);
10982
11036
  this.addressList = new FormControl('');
10983
11037
  this.addressFormGroup.addControl('address', this.addressList);
10984
11038
  }
11039
+ this.addressesService.getMandatoryError().subscribe((value) => {
11040
+ this.updateErrorsOnContinue(value);
11041
+ });
10985
11042
  }
10986
11043
  findAddress() {
11044
+ this.noAddressSelected = false;
10987
11045
  if (!this.postcode.value) {
11046
+ this.errorMessage = WriteAddressFieldComponent.REQUIRED_ERROR_MESSAGE;
11047
+ this.missingPostcode = true;
11048
+ }
11049
+ else if (!this.postcode.value.trim().match(AddressValidationConstants.REGEX_POSTCODE)) {
11050
+ this.errorMessage = WriteAddressFieldComponent.INVALID_ERROR_MESSAGE;
10988
11051
  this.missingPostcode = true;
10989
11052
  }
10990
11053
  else {
@@ -11013,6 +11076,8 @@ class WriteAddressFieldComponent extends AbstractFieldWriteComponent {
11013
11076
  blankAddress() {
11014
11077
  this.caseField.value = new AddressModel();
11015
11078
  this.setFormValue();
11079
+ this.missingPostcode = false;
11080
+ this.noAddressSelected = false;
11016
11081
  }
11017
11082
  isComplexWithHiddenFields() {
11018
11083
  if (this.caseField.isComplex() && this.caseField.field_type.complex_fields
@@ -11044,6 +11109,7 @@ class WriteAddressFieldComponent extends AbstractFieldWriteComponent {
11044
11109
  addressSelected() {
11045
11110
  this.caseField.value = this.addressList.value;
11046
11111
  this.setFormValue();
11112
+ this.noAddressSelected = false;
11047
11113
  }
11048
11114
  ngOnChanges(changes) {
11049
11115
  super.ngOnChanges(changes);
@@ -11064,7 +11130,14 @@ class WriteAddressFieldComponent extends AbstractFieldWriteComponent {
11064
11130
  this.writeComplexFieldComponent.complexGroup.setValue(this.caseField.value);
11065
11131
  }
11066
11132
  }
11133
+ updateErrorsOnContinue(value) {
11134
+ this.missingPostcode = value && !this.shouldShowDetailFields() && !this.addressOptions;
11135
+ this.noAddressSelected = value && !this.shouldShowDetailFields() && !!this.addressOptions;
11136
+ this.errorMessage = this.noAddressSelected ? 'Select an address' : this.errorMessage;
11137
+ }
11067
11138
  }
11139
+ WriteAddressFieldComponent.REQUIRED_ERROR_MESSAGE = 'Enter a Postcode';
11140
+ WriteAddressFieldComponent.INVALID_ERROR_MESSAGE = 'Enter a valid Postcode';
11068
11141
  WriteAddressFieldComponent.ɵfac = function WriteAddressFieldComponent_Factory(t) { return new (t || WriteAddressFieldComponent)(i0.ɵɵdirectiveInject(AddressesService), i0.ɵɵdirectiveInject(IsCompoundPipe)); };
11069
11142
  WriteAddressFieldComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: WriteAddressFieldComponent, selectors: [["ccd-write-address-field"]], viewQuery: function WriteAddressFieldComponent_Query(rf, ctx) { if (rf & 1) {
11070
11143
  i0.ɵɵviewQuery(_c0$U, 5);
@@ -11073,7 +11146,7 @@ WriteAddressFieldComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type:
11073
11146
  let _t;
11074
11147
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.writeComplexFieldComponent = _t.first);
11075
11148
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.focusElementDirectives = _t);
11076
- } }, inputs: { formGroup: "formGroup" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 4, vars: 9, consts: [[1, "form-group", 3, "id"], [4, "ngIf"], [3, "hidden", "caseField", "renderLabel", "parent", "formGroup", "ignoreMandatory", "idPrefix"], ["writeComplexFieldComponent", ""], [1, "heading-h2"], ["class", "form-group bottom-30 postcodeLookup", 3, "id", "ngClass", 4, "ngIf"], ["class", "form-group", "id", "selectAddress", 4, "ngIf"], ["class", "manual-link bottom-30", "href", "javascript:void(0)", 3, "click", 4, "ngIf"], [1, "form-group", "bottom-30", "postcodeLookup", 3, "id", "ngClass"], [3, "for"], [1, "form-label"], ["class", "error-message", 4, "ngIf"], ["type", "text", "name", "postcode", 1, "form-control", "postcodeinput", "inline-block", 3, "ngClass", "id", "formControl"], ["type", "button", 1, "button", "button-30", 3, "click"], [1, "error-message"], ["id", "selectAddress", 1, "form-group"], ["name", "address", "focusElement", "", 1, "form-control", "ccd-dropdown", "addressList", 3, "id", "formControl", "change"], [3, "ngValue", 4, "ngFor", "ngForOf"], [3, "ngValue"], ["href", "javascript:void(0)", 1, "manual-link", "bottom-30", 3, "click"]], template: function WriteAddressFieldComponent_Template(rf, ctx) { if (rf & 1) {
11149
+ } }, inputs: { formGroup: "formGroup" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 4, vars: 9, consts: [[1, "form-group", 3, "id"], [4, "ngIf"], [3, "hidden", "caseField", "renderLabel", "parent", "formGroup", "ignoreMandatory", "idPrefix"], ["writeComplexFieldComponent", ""], [1, "heading-h2"], ["class", "form-group bottom-30 postcodeLookup", 3, "id", "ngClass", 4, "ngIf"], ["class", "form-group", "id", "selectAddress", 3, "ngClass", 4, "ngIf"], ["class", "manual-link bottom-30", "href", "javascript:void(0)", 3, "click", 4, "ngIf"], [1, "form-group", "bottom-30", "postcodeLookup", 3, "id", "ngClass"], [3, "for"], [1, "form-label"], ["class", "error-message", 4, "ngIf"], ["type", "text", "name", "postcode", 1, "form-control", "postcodeinput", "inline-block", 3, "ngClass", "id", "formControl"], ["type", "button", 1, "button", "button-30", 3, "click"], [1, "error-message"], ["id", "selectAddress", 1, "form-group", 3, "ngClass"], ["name", "address", "focusElement", "", 1, "form-control", "ccd-dropdown", "addressList", 3, "id", "formControl", "change"], [3, "ngValue", 4, "ngFor", "ngForOf"], [3, "ngValue"], ["href", "javascript:void(0)", 1, "manual-link", "bottom-30", 3, "click"]], template: function WriteAddressFieldComponent_Template(rf, ctx) { if (rf & 1) {
11077
11150
  i0.ɵɵelementStart(0, "div", 0);
11078
11151
  i0.ɵɵtemplate(1, WriteAddressFieldComponent_div_1_Template, 7, 6, "div", 1);
11079
11152
  i0.ɵɵelement(2, "ccd-write-complex-type-field", 2, 3);
@@ -11087,7 +11160,7 @@ WriteAddressFieldComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type:
11087
11160
  } }, styles: [".manual-link[_ngcontent-%COMP%]{cursor:pointer;display:block;text-decoration:underline}"] });
11088
11161
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WriteAddressFieldComponent, [{
11089
11162
  type: Component,
11090
- args: [{ selector: 'ccd-write-address-field', template: "<div class=\"form-group\" [id]=\"id()\">\n <div *ngIf=\"!isComplexWithHiddenFields()\">\n <h2 class=\"heading-h2\">{{caseField | ccdFieldLabel}}</h2>\n\n <div class=\"form-group bottom-30 postcodeLookup\" [id]=\"createElementId('postcodeLookup')\" [ngClass]=\"{'form-group-error': missingPostcode}\" *ngIf=\"!isExpanded\">\n <label [for]=\"createElementId('postcodeInput')\">\n <span class=\"form-label\">{{'Enter a UK postcode' | rpxTranslate}}</span>\n </label>\n <span class=\"error-message\" *ngIf=\"missingPostcode\">{{'Enter the Postcode' | rpxTranslate}}</span>\n <input type=\"text\" [ngClass]=\"{'govuk-input--error': missingPostcode}\"\n [id]=\"createElementId('postcodeInput')\" name=\"postcode\" class=\"form-control postcodeinput inline-block\" [formControl]=\"postcode\">\n <button type=\"button\" class=\"button button-30\" (click)=\"findAddress()\">{{'Find address' | rpxTranslate}}</button>\n </div>\n\n <div class=\"form-group\" *ngIf=\"addressOptions\" id=\"selectAddress\">\n <label [for]=\"createElementId('addressList')\">\n <span class=\"form-label\">{{'Select an address' | rpxTranslate}}</span>\n </label>\n\n <select class=\"form-control ccd-dropdown addressList\" [id]=\"createElementId('addressList')\" name=\"address\" [formControl]=\"addressList\" (change)=\"addressSelected()\" focusElement>\n <option *ngFor=\"let addressOption of addressOptions\" [ngValue]=\"addressOption.value\">\n {{addressOption.description | rpxTranslate}}\n </option>\n </select>\n </div>\n\n <a class=\"manual-link bottom-30\" *ngIf=\"!shouldShowDetailFields()\" (click)=\"blankAddress()\" href=\"javascript:void(0)\">\n {{\"I can't enter a UK postcode\" | rpxTranslate}}\n </a>\n </div>\n\n <ccd-write-complex-type-field\n [hidden]=\"!shouldShowDetailFields()\"\n [caseField]=\"caseField\"\n [renderLabel]=\"false\"\n [parent]=\"parent\"\n [formGroup]=\"formGroup\"\n [ignoreMandatory]=\"true\"\n [idPrefix]=\"buildIdPrefix('detail')\"\n #writeComplexFieldComponent>\n </ccd-write-complex-type-field>\n</div>\n", styles: [".manual-link{cursor:pointer;display:block;text-decoration:underline}\n"] }]
11163
+ args: [{ selector: 'ccd-write-address-field', template: "<div class=\"form-group\" [id]=\"id()\">\n <div *ngIf=\"!isComplexWithHiddenFields()\">\n <h2 class=\"heading-h2\">{{caseField | ccdFieldLabel}}</h2>\n\n <div class=\"form-group bottom-30 postcodeLookup\" [id]=\"createElementId('postcodeLookup')\" [ngClass]=\"{'form-group-error': missingPostcode}\" *ngIf=\"!isExpanded\">\n <label [for]=\"createElementId('postcodeInput')\">\n <span class=\"form-label\">{{'Enter a UK postcode' | rpxTranslate}}</span>\n </label>\n <span class=\"error-message\" *ngIf=\"missingPostcode\">{{errorMessage | rpxTranslate}}</span>\n <input type=\"text\" [ngClass]=\"{'govuk-input--error': missingPostcode}\"\n [id]=\"createElementId('postcodeInput')\" name=\"postcode\" class=\"form-control postcodeinput inline-block\" [formControl]=\"postcode\">\n <button type=\"button\" class=\"button button-30\" (click)=\"findAddress()\">{{'Find address' | rpxTranslate}}</button>\n </div>\n\n <div class=\"form-group\" *ngIf=\"addressOptions\" id=\"selectAddress\" [ngClass]=\"{'form-group-error': noAddressSelected}\">\n <label [for]=\"createElementId('addressList')\">\n <span class=\"form-label\">{{'Select an address' | rpxTranslate}}</span>\n </label>\n <span class=\"error-message\" *ngIf=\"noAddressSelected\">{{errorMessage | rpxTranslate}}</span>\n <select class=\"form-control ccd-dropdown addressList\" [id]=\"createElementId('addressList')\" name=\"address\" [formControl]=\"addressList\" (change)=\"addressSelected()\" focusElement>\n <option *ngFor=\"let addressOption of addressOptions\" [ngValue]=\"addressOption.value\">\n {{addressOption.description | rpxTranslate}}\n </option>\n </select>\n </div>\n\n <a class=\"manual-link bottom-30\" *ngIf=\"!shouldShowDetailFields()\" (click)=\"blankAddress()\" href=\"javascript:void(0)\">\n {{\"I can't enter a UK postcode\" | rpxTranslate}}\n </a>\n </div>\n\n <ccd-write-complex-type-field\n [hidden]=\"!shouldShowDetailFields()\"\n [caseField]=\"caseField\"\n [renderLabel]=\"false\"\n [parent]=\"parent\"\n [formGroup]=\"formGroup\"\n [ignoreMandatory]=\"true\"\n [idPrefix]=\"buildIdPrefix('detail')\"\n #writeComplexFieldComponent>\n </ccd-write-complex-type-field>\n</div>\n", styles: [".manual-link{cursor:pointer;display:block;text-decoration:underline}\n"] }]
11091
11164
  }], function () { return [{ type: AddressesService }, { type: IsCompoundPipe }]; }, { writeComplexFieldComponent: [{
11092
11165
  type: ViewChild,
11093
11166
  args: ['writeComplexFieldComponent', { static: false }]