@hmcts/ccd-case-ui-toolkit 7.0.13 → 7.0.14

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 +57 -20
  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 +103 -24
  8. package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
  9. package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs +97 -24
  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, BehaviorSubject, Observable, 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, switchMap, debounceTime, publish, refCount, delay, distinctUntilChanged, finalize, timeout, mergeMap, retryWhen, tap, delayWhen, publishReplay, take, first, takeUntil, filter } from 'rxjs/operators';
@@ -1333,9 +1333,14 @@ class HttpError {
1333
1333
  }
1334
1334
  static from(response) {
1335
1335
  const error = new HttpError();
1336
+ if ((response === null || response === void 0 ? void 0 : response.status) === 429) {
1337
+ error.error = HttpError.MESSAGE_ERROR_429;
1338
+ error.status = response.status;
1339
+ error.message = response.message;
1340
+ }
1336
1341
  // Check that the HttpErrorResponse contains an "error" object before mapping the error properties
1337
1342
  if (!!(response && response.error)) {
1338
- Object.keys(error).forEach(key => {
1343
+ Object.keys(error).forEach((key) => {
1339
1344
  error[key] = response.error.hasOwnProperty(key) && response.error[key] ? response.error[key] : error[key];
1340
1345
  });
1341
1346
  }
@@ -1352,6 +1357,7 @@ class HttpError {
1352
1357
  HttpError.DEFAULT_ERROR = 'Unknown error';
1353
1358
  HttpError.DEFAULT_MESSAGE = 'Something unexpected happened, our technical staff have been automatically notified';
1354
1359
  HttpError.DEFAULT_STATUS = 500;
1360
+ HttpError.MESSAGE_ERROR_429 = 'Your request was rate limited. Please wait a few seconds before retrying your document upload';
1355
1361
 
1356
1362
  class AbstractAppConfig {
1357
1363
  /**
@@ -4600,12 +4606,17 @@ class AbstractFormFieldComponent {
4600
4606
  return this.idPrefix + this.caseField.id;
4601
4607
  }
4602
4608
  registerControl(control, replace = false) {
4609
+ var _a;
4603
4610
  const container = this.parent || this.formGroup;
4604
4611
  if (!container) {
4605
4612
  return control;
4606
4613
  }
4607
4614
  const existing = container.controls[this.caseField.id];
4615
+ // update the field value which has been set in mid-event call back
4608
4616
  if (existing) {
4617
+ if (existing.value === null && ((_a = this.caseField) === null || _a === void 0 ? void 0 : _a.value)) {
4618
+ existing.value = this.caseField.value;
4619
+ }
4609
4620
  if (replace) {
4610
4621
  // Set the validators on the replacement with what already exists.
4611
4622
  control.setValidators(existing.validator);
@@ -6276,6 +6287,7 @@ class AddressesService {
6276
6287
  constructor(http, appConfig) {
6277
6288
  this.http = http;
6278
6289
  this.appConfig = appConfig;
6290
+ this.mandatoryError = new BehaviorSubject(false);
6279
6291
  }
6280
6292
  getAddressesForPostcode(postcode) {
6281
6293
  return this.http
@@ -6284,6 +6296,12 @@ class AddressesService {
6284
6296
  .pipe(map(res => res.results))
6285
6297
  .pipe(map(output => output.map(addresses => this.format(new AddressParser().parse(addresses[AddressType.DPA])))));
6286
6298
  }
6299
+ getMandatoryError() {
6300
+ return this.mandatoryError.asObservable();
6301
+ }
6302
+ setMandatoryError(value) {
6303
+ this.mandatoryError.next(value);
6304
+ }
6287
6305
  format(addressModel) {
6288
6306
  return this.formatAddressLines(this.shiftAddressLinesUp(addressModel));
6289
6307
  }
@@ -10006,7 +10024,7 @@ function CaseEditPageComponent_ccd_case_event_completion_11_Template(rf, ctx) {
10006
10024
  }
10007
10025
  }
10008
10026
  class CaseEditPageComponent {
10009
- constructor(caseEdit, route, formValueService, formErrorService, cdRef, pageValidationService, dialog, caseFieldService, caseEditDataService, loadingService, validPageListCaseFieldsService) {
10027
+ constructor(caseEdit, route, formValueService, formErrorService, cdRef, pageValidationService, dialog, caseFieldService, caseEditDataService, loadingService, validPageListCaseFieldsService, addressService) {
10010
10028
  this.caseEdit = caseEdit;
10011
10029
  this.route = route;
10012
10030
  this.formValueService = formValueService;
@@ -10018,6 +10036,7 @@ class CaseEditPageComponent {
10018
10036
  this.caseEditDataService = caseEditDataService;
10019
10037
  this.loadingService = loadingService;
10020
10038
  this.validPageListCaseFieldsService = validPageListCaseFieldsService;
10039
+ this.addressService = addressService;
10021
10040
  this.triggerTextStart = CaseEditPageComponent.TRIGGER_TEXT_START;
10022
10041
  this.triggerTextIgnoreWarnings = CaseEditPageComponent.TRIGGER_TEXT_CONTINUE;
10023
10042
  this.formValuesChanged = false;
@@ -10142,7 +10161,14 @@ class CaseEditPageComponent {
10142
10161
  }
10143
10162
  }
10144
10163
  if (fieldElement.hasError('required')) {
10145
- this.caseEditDataService.addFormValidationError({ id, message: `%FIELDLABEL% is required`, label });
10164
+ if (casefield.id === 'AddressLine1') {
10165
+ // EUI-1067 - Display more relevant error message to user and correctly navigate to the field
10166
+ this.addressService.setMandatoryError(true);
10167
+ this.caseEditDataService.addFormValidationError({ id: `${path}_${path}`, message: `An address is required` });
10168
+ }
10169
+ else {
10170
+ this.caseEditDataService.addFormValidationError({ id, message: `%FIELDLABEL% is required`, label });
10171
+ }
10146
10172
  fieldElement.markAsDirty();
10147
10173
  // For the JudicialUser field type, an error needs to be set on the component so that an error message
10148
10174
  // can be displayed at field level
@@ -10217,6 +10243,7 @@ class CaseEditPageComponent {
10217
10243
  }
10218
10244
  }
10219
10245
  if (!this.caseEdit.isSubmitting && !this.currentPageIsNotValid()) {
10246
+ this.addressService.setMandatoryError(false);
10220
10247
  console.log('Case Edit Error', this.caseEdit.error);
10221
10248
  if (this.caseEdit.validPageList.findIndex(page => page.id === this.currentPage.id) === -1) {
10222
10249
  this.caseEdit.validPageList.push(this.currentPage);
@@ -10512,7 +10539,7 @@ CaseEditPageComponent.RESUMED_FORM_SAVE = 'RESUMED_FORM_SAVE';
10512
10539
  CaseEditPageComponent.TRIGGER_TEXT_START = 'Continue';
10513
10540
  CaseEditPageComponent.TRIGGER_TEXT_SAVE = 'Save and continue';
10514
10541
  CaseEditPageComponent.TRIGGER_TEXT_CONTINUE = 'Ignore Warning and Continue';
10515
- 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)); };
10542
+ 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)); };
10516
10543
  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) {
10517
10544
  if (rf & 1) {
10518
10545
  i0.ɵɵtemplate(0, CaseEditPageComponent_ng_container_0_Template, 3, 2, "ng-container", 0);
@@ -10551,7 +10578,7 @@ CaseEditPageComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CaseE
10551
10578
  (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CaseEditPageComponent, [{
10552
10579
  type: Component,
10553
10580
  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"] }]
10554
- }], 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);
10581
+ }], 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);
10555
10582
  })();
10556
10583
 
10557
10584
  class CallbackErrorsContext {
@@ -11043,6 +11070,19 @@ class AddressOption {
11043
11070
  }
11044
11071
  }
11045
11072
 
11073
+ class AddressValidationConstants {
11074
+ }
11075
+ // allow alpha-numeric characters and spaces possibly between a connecting - character
11076
+ // this applies validation while allowing partial postcodes
11077
+ AddressValidationConstants.REGEX_POSTCODE = /^([A-Za-z0-9]-*| )+$/;
11078
+ AddressValidationConstants.ɵfac = function AddressValidationConstants_Factory(t) { return new (t || AddressValidationConstants)(); };
11079
+ AddressValidationConstants.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AddressValidationConstants, factory: AddressValidationConstants.ɵfac });
11080
+ (function () {
11081
+ (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AddressValidationConstants, [{
11082
+ type: Injectable
11083
+ }], null, null);
11084
+ })();
11085
+
11046
11086
  const _c0$U = ["writeComplexFieldComponent"];
11047
11087
  function WriteAddressFieldComponent_div_1_div_4_span_5_Template(rf, ctx) {
11048
11088
  if (rf & 1) {
@@ -11052,8 +11092,9 @@ function WriteAddressFieldComponent_div_1_div_4_span_5_Template(rf, ctx) {
11052
11092
  i0.ɵɵelementEnd();
11053
11093
  }
11054
11094
  if (rf & 2) {
11095
+ const ctx_r5 = i0.ɵɵnextContext(3);
11055
11096
  i0.ɵɵadvance(1);
11056
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 1, "Enter the Postcode"));
11097
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 1, ctx_r5.errorMessage));
11057
11098
  }
11058
11099
  }
11059
11100
  const _c1$n = function (a0) { return { "form-group-error": a0 }; };
@@ -11088,7 +11129,20 @@ function WriteAddressFieldComponent_div_1_div_4_Template(rf, ctx) {
11088
11129
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(9, 11, "Find address"));
11089
11130
  }
11090
11131
  }
11091
- function WriteAddressFieldComponent_div_1_div_5_option_6_Template(rf, ctx) {
11132
+ function WriteAddressFieldComponent_div_1_div_5_span_5_Template(rf, ctx) {
11133
+ if (rf & 1) {
11134
+ i0.ɵɵelementStart(0, "span", 14);
11135
+ i0.ɵɵtext(1);
11136
+ i0.ɵɵpipe(2, "rpxTranslate");
11137
+ i0.ɵɵelementEnd();
11138
+ }
11139
+ if (rf & 2) {
11140
+ const ctx_r8 = i0.ɵɵnextContext(3);
11141
+ i0.ɵɵadvance(1);
11142
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(2, 1, ctx_r8.errorMessage));
11143
+ }
11144
+ }
11145
+ function WriteAddressFieldComponent_div_1_div_5_option_7_Template(rf, ctx) {
11092
11146
  if (rf & 1) {
11093
11147
  i0.ɵɵelementStart(0, "option", 18);
11094
11148
  i0.ɵɵtext(1);
@@ -11096,31 +11150,35 @@ function WriteAddressFieldComponent_div_1_div_5_option_6_Template(rf, ctx) {
11096
11150
  i0.ɵɵelementEnd();
11097
11151
  }
11098
11152
  if (rf & 2) {
11099
- const addressOption_r9 = ctx.$implicit;
11100
- i0.ɵɵproperty("ngValue", addressOption_r9.value);
11153
+ const addressOption_r10 = ctx.$implicit;
11154
+ i0.ɵɵproperty("ngValue", addressOption_r10.value);
11101
11155
  i0.ɵɵadvance(1);
11102
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 2, addressOption_r9.description), " ");
11156
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 2, addressOption_r10.description), " ");
11103
11157
  }
11104
11158
  }
11105
11159
  function WriteAddressFieldComponent_div_1_div_5_Template(rf, ctx) {
11106
11160
  if (rf & 1) {
11107
- const _r11 = i0.ɵɵgetCurrentView();
11161
+ const _r12 = i0.ɵɵgetCurrentView();
11108
11162
  i0.ɵɵelementStart(0, "div", 15)(1, "label", 9)(2, "span", 10);
11109
11163
  i0.ɵɵtext(3);
11110
11164
  i0.ɵɵpipe(4, "rpxTranslate");
11111
11165
  i0.ɵɵelementEnd()();
11112
- i0.ɵɵelementStart(5, "select", 16);
11113
- 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()); });
11114
- i0.ɵɵtemplate(6, WriteAddressFieldComponent_div_1_div_5_option_6_Template, 3, 4, "option", 17);
11166
+ i0.ɵɵtemplate(5, WriteAddressFieldComponent_div_1_div_5_span_5_Template, 3, 3, "span", 11);
11167
+ i0.ɵɵelementStart(6, "select", 16);
11168
+ 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()); });
11169
+ i0.ɵɵtemplate(7, WriteAddressFieldComponent_div_1_div_5_option_7_Template, 3, 4, "option", 17);
11115
11170
  i0.ɵɵelementEnd()();
11116
11171
  }
11117
11172
  if (rf & 2) {
11118
11173
  const ctx_r3 = i0.ɵɵnextContext(2);
11174
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(9, _c1$n, ctx_r3.noAddressSelected));
11119
11175
  i0.ɵɵadvance(1);
11120
11176
  i0.ɵɵproperty("for", ctx_r3.createElementId("addressList"));
11121
11177
  i0.ɵɵadvance(2);
11122
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 5, "Select an address"));
11178
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 7, "Select an address"));
11123
11179
  i0.ɵɵadvance(2);
11180
+ i0.ɵɵproperty("ngIf", ctx_r3.noAddressSelected);
11181
+ i0.ɵɵadvance(1);
11124
11182
  i0.ɵɵproperty("id", ctx_r3.createElementId("addressList"))("formControl", ctx_r3.addressList);
11125
11183
  i0.ɵɵadvance(1);
11126
11184
  i0.ɵɵproperty("ngForOf", ctx_r3.addressOptions);
@@ -11128,9 +11186,9 @@ function WriteAddressFieldComponent_div_1_div_5_Template(rf, ctx) {
11128
11186
  }
11129
11187
  function WriteAddressFieldComponent_div_1_a_6_Template(rf, ctx) {
11130
11188
  if (rf & 1) {
11131
- const _r13 = i0.ɵɵgetCurrentView();
11189
+ const _r14 = i0.ɵɵgetCurrentView();
11132
11190
  i0.ɵɵelementStart(0, "a", 19);
11133
- 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()); });
11191
+ 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()); });
11134
11192
  i0.ɵɵtext(1);
11135
11193
  i0.ɵɵpipe(2, "rpxTranslate");
11136
11194
  i0.ɵɵelementEnd();
@@ -11147,7 +11205,7 @@ function WriteAddressFieldComponent_div_1_Template(rf, ctx) {
11147
11205
  i0.ɵɵpipe(3, "ccdFieldLabel");
11148
11206
  i0.ɵɵelementEnd();
11149
11207
  i0.ɵɵtemplate(4, WriteAddressFieldComponent_div_1_div_4_Template, 10, 17, "div", 5);
11150
- i0.ɵɵtemplate(5, WriteAddressFieldComponent_div_1_div_5_Template, 7, 7, "div", 6);
11208
+ i0.ɵɵtemplate(5, WriteAddressFieldComponent_div_1_div_5_Template, 8, 11, "div", 6);
11151
11209
  i0.ɵɵtemplate(6, WriteAddressFieldComponent_div_1_a_6_Template, 3, 3, "a", 7);
11152
11210
  i0.ɵɵelementEnd();
11153
11211
  }
@@ -11168,19 +11226,30 @@ class WriteAddressFieldComponent extends AbstractFieldWriteComponent {
11168
11226
  super();
11169
11227
  this.isCompoundPipe = isCompoundPipe;
11170
11228
  this.addressFormGroup = new FormGroup({});
11229
+ this.errorMessage = WriteAddressFieldComponent.REQUIRED_ERROR_MESSAGE;
11171
11230
  this.missingPostcode = false;
11231
+ this.noAddressSelected = false;
11172
11232
  this.addressesService = addressesService;
11173
11233
  }
11174
11234
  ngOnInit() {
11175
11235
  if (!this.isComplexWithHiddenFields()) {
11176
- this.postcode = new FormControl('');
11177
- this.addressFormGroup.addControl('postcode', this.postcode);
11236
+ this.postcode = new FormControl('', [Validators.required]);
11237
+ this.formGroup.addControl('postcode', this.postcode);
11178
11238
  this.addressList = new FormControl('');
11179
- this.addressFormGroup.addControl('address', this.addressList);
11239
+ this.formGroup.addControl('address', this.addressList);
11180
11240
  }
11241
+ this.addressesService.getMandatoryError().subscribe((value) => {
11242
+ this.updateErrorsOnContinue(value);
11243
+ });
11181
11244
  }
11182
11245
  findAddress() {
11246
+ this.noAddressSelected = false;
11183
11247
  if (!this.postcode.value) {
11248
+ this.errorMessage = WriteAddressFieldComponent.REQUIRED_ERROR_MESSAGE;
11249
+ this.missingPostcode = true;
11250
+ }
11251
+ else if (!this.postcode.value.trim().match(AddressValidationConstants.REGEX_POSTCODE)) {
11252
+ this.errorMessage = WriteAddressFieldComponent.INVALID_ERROR_MESSAGE;
11184
11253
  this.missingPostcode = true;
11185
11254
  }
11186
11255
  else {
@@ -11209,6 +11278,8 @@ class WriteAddressFieldComponent extends AbstractFieldWriteComponent {
11209
11278
  blankAddress() {
11210
11279
  this.caseField.value = new AddressModel();
11211
11280
  this.setFormValue();
11281
+ this.missingPostcode = false;
11282
+ this.noAddressSelected = false;
11212
11283
  }
11213
11284
  isComplexWithHiddenFields() {
11214
11285
  if (this.caseField.isComplex() && this.caseField.field_type.complex_fields
@@ -11240,6 +11311,7 @@ class WriteAddressFieldComponent extends AbstractFieldWriteComponent {
11240
11311
  addressSelected() {
11241
11312
  this.caseField.value = this.addressList.value;
11242
11313
  this.setFormValue();
11314
+ this.noAddressSelected = false;
11243
11315
  }
11244
11316
  ngOnChanges(changes) {
11245
11317
  super.ngOnChanges(changes);
@@ -11260,7 +11332,14 @@ class WriteAddressFieldComponent extends AbstractFieldWriteComponent {
11260
11332
  this.writeComplexFieldComponent.complexGroup.setValue(this.caseField.value);
11261
11333
  }
11262
11334
  }
11335
+ updateErrorsOnContinue(value) {
11336
+ this.missingPostcode = value && !this.shouldShowDetailFields() && !this.addressOptions;
11337
+ this.noAddressSelected = value && !this.shouldShowDetailFields() && !!this.addressOptions;
11338
+ this.errorMessage = this.noAddressSelected ? 'Select an address' : this.errorMessage;
11339
+ }
11263
11340
  }
11341
+ WriteAddressFieldComponent.REQUIRED_ERROR_MESSAGE = 'Enter a Postcode';
11342
+ WriteAddressFieldComponent.INVALID_ERROR_MESSAGE = 'Enter a valid Postcode';
11264
11343
  WriteAddressFieldComponent.ɵfac = function WriteAddressFieldComponent_Factory(t) { return new (t || WriteAddressFieldComponent)(i0.ɵɵdirectiveInject(AddressesService), i0.ɵɵdirectiveInject(IsCompoundPipe)); };
11265
11344
  WriteAddressFieldComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: WriteAddressFieldComponent, selectors: [["ccd-write-address-field"]], viewQuery: function WriteAddressFieldComponent_Query(rf, ctx) {
11266
11345
  if (rf & 1) {
@@ -11272,7 +11351,7 @@ WriteAddressFieldComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type:
11272
11351
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.writeComplexFieldComponent = _t.first);
11273
11352
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.focusElementDirectives = _t);
11274
11353
  }
11275
- }, 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) {
11354
+ }, 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) {
11276
11355
  if (rf & 1) {
11277
11356
  i0.ɵɵelementStart(0, "div", 0);
11278
11357
  i0.ɵɵtemplate(1, WriteAddressFieldComponent_div_1_Template, 7, 6, "div", 1);
@@ -11290,7 +11369,7 @@ WriteAddressFieldComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type:
11290
11369
  (function () {
11291
11370
  (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WriteAddressFieldComponent, [{
11292
11371
  type: Component,
11293
- 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"] }]
11372
+ 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"] }]
11294
11373
  }], function () { return [{ type: AddressesService }, { type: IsCompoundPipe }]; }, { writeComplexFieldComponent: [{
11295
11374
  type: ViewChild,
11296
11375
  args: ['writeComplexFieldComponent', { static: false }]