@hmcts/ccd-case-ui-toolkit 7.3.89 → 7.3.90-exui-3879

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.
@@ -22513,6 +22513,9 @@ var RaiseQueryErrorMessage;
22513
22513
  RaiseQueryErrorMessage["QUERY_HEARING_DATE"] = "Enter a valid date";
22514
22514
  RaiseQueryErrorMessage["QUERY_SUBJECT_MAX_LENGTH"] = "Query subject must be less than 201 characters in length";
22515
22515
  RaiseQueryErrorMessage["RESPOND_QUERY_BODY"] = "Add a response before continue";
22516
+ RaiseQueryErrorMessage["QUERY_SUBJECT_MARKDOWN"] = "The data entered is not valid for Query subject. Link mark up characters are not allowed in this field";
22517
+ RaiseQueryErrorMessage["QUERY_BODY_MARKDOWN"] = "The data entered is not valid for Query detail. Link mark up characters are not allowed in this field";
22518
+ RaiseQueryErrorMessage["RESPOND_QUERY_BODY_MARKDOWN"] = "The data entered is not valid for Response detail. Link mark up characters are not allowed in this field";
22516
22519
  })(RaiseQueryErrorMessage || (RaiseQueryErrorMessage = {}));
22517
22520
 
22518
22521
  var QueryItemResponseStatus;
@@ -24745,7 +24748,7 @@ function QueryWriteRaiseQueryComponent_div_11_p_29_Template(rf, ctx) { if (rf &
24745
24748
  i0.ɵɵadvance(2);
24746
24749
  i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(3, 2, "Error:"), " ");
24747
24750
  i0.ɵɵadvance(2);
24748
- i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(5, 4, ctx_r0.raiseQueryErrorMessage.QUERY_BODY), " ");
24751
+ i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(5, 4, ctx_r0.getBodyErrorMessage()), " ");
24749
24752
  } }
24750
24753
  function QueryWriteRaiseQueryComponent_div_11_p_38_Template(rf, ctx) { if (rf & 1) {
24751
24754
  i0.ɵɵelementStart(0, "p", 35)(1, "span", 11);
@@ -24857,23 +24860,23 @@ function QueryWriteRaiseQueryComponent_div_11_Template(rf, ctx) { if (rf & 1) {
24857
24860
  i0.ɵɵadvance(8);
24858
24861
  i0.ɵɵproperty("content", i0.ɵɵpipeBind1(10, 23, ctx_r0.serviceMessage));
24859
24862
  i0.ɵɵadvance(2);
24860
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(43, _c0$F, ctx_r0.submitted && ctx_r0.formGroup.get("subject").hasError("required")));
24863
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(43, _c0$F, ctx_r0.submitted && ctx_r0.formGroup.get("subject").invalid));
24861
24864
  i0.ɵɵadvance(3);
24862
24865
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(15, 25, "Query subject"), " ");
24863
24866
  i0.ɵɵadvance(3);
24864
24867
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(18, 27, "The subject should be a summary of your query"), " ");
24865
24868
  i0.ɵɵadvance(2);
24866
- i0.ɵɵproperty("ngIf", ctx_r0.submitted && (ctx_r0.formGroup.get("subject").hasError("required") || ctx_r0.formGroup.get("subject").hasError("maxlength")));
24869
+ i0.ɵɵproperty("ngIf", ctx_r0.submitted && ctx_r0.formGroup.get("subject").invalid);
24867
24870
  i0.ɵɵadvance(2);
24868
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(45, _c0$F, ctx_r0.submitted && ctx_r0.formGroup.get("body").hasError("required")));
24871
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(45, _c0$F, ctx_r0.submitted && ctx_r0.formGroup.get("body").invalid));
24869
24872
  i0.ɵɵadvance(3);
24870
24873
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(25, 29, "Query detail"), " ");
24871
24874
  i0.ɵɵadvance(3);
24872
24875
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(28, 31, "Include as many details as possible so case workers can respond to your query"), " ");
24873
24876
  i0.ɵɵadvance(2);
24874
- i0.ɵɵproperty("ngIf", ctx_r0.submitted && ctx_r0.formGroup.get("body").hasError("required"));
24877
+ i0.ɵɵproperty("ngIf", ctx_r0.submitted && ctx_r0.formGroup.get("body").invalid);
24875
24878
  i0.ɵɵadvance();
24876
- i0.ɵɵclassProp("govuk-textarea--error", ctx_r0.submitted && ctx_r0.formGroup.get("body").hasError("required"));
24879
+ i0.ɵɵclassProp("govuk-textarea--error", ctx_r0.submitted && ctx_r0.formGroup.get("body").invalid);
24877
24880
  i0.ɵɵproperty("formControlName", "body");
24878
24881
  i0.ɵɵadvance(2);
24879
24882
  i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(47, _c0$F, ctx_r0.submitted && ctx_r0.formGroup.get("isHearingRelated").hasError("required")));
@@ -24896,6 +24899,7 @@ class QueryWriteRaiseQueryComponent {
24896
24899
  queryManagementService;
24897
24900
  route;
24898
24901
  logger = new StructuredLoggerService();
24902
+ static MARKDOWN_VALIDATOR = FormValidatorsService.markDownPatternValidator();
24899
24903
  formGroup;
24900
24904
  submitted;
24901
24905
  caseDetails;
@@ -24915,10 +24919,11 @@ class QueryWriteRaiseQueryComponent {
24915
24919
  this.route = route;
24916
24920
  }
24917
24921
  ngOnChanges() {
24922
+ this.addMarkdownValidators();
24918
24923
  this.messageId = this.route.snapshot.params.dataid;
24919
24924
  const isCollectionDataSet = this.setCaseQueriesCollectionData();
24920
24925
  if (isCollectionDataSet) {
24921
- if (this.triggerSubmission) {
24926
+ if (this.triggerSubmission && this.formGroup.valid) {
24922
24927
  const data = this.generateCaseQueriesCollectionData();
24923
24928
  this.queryDataCreated.emit(data);
24924
24929
  }
@@ -24939,8 +24944,18 @@ class QueryWriteRaiseQueryComponent {
24939
24944
  if (control.hasError('maxlength')) {
24940
24945
  return this.raiseQueryErrorMessage.QUERY_SUBJECT_MAX_LENGTH;
24941
24946
  }
24947
+ if (control.hasError('markDownPattern')) {
24948
+ return this.raiseQueryErrorMessage.QUERY_SUBJECT_MARKDOWN;
24949
+ }
24942
24950
  return '';
24943
24951
  }
24952
+ getBodyErrorMessage() {
24953
+ const control = this.formGroup.get('body');
24954
+ if (control.hasError('markDownPattern')) {
24955
+ return this.raiseQueryErrorMessage.QUERY_BODY_MARKDOWN;
24956
+ }
24957
+ return this.raiseQueryErrorMessage.QUERY_BODY;
24958
+ }
24944
24959
  setCaseQueriesCollectionData() {
24945
24960
  if (!this.eventData) {
24946
24961
  this.logger.warn('Event data not available; skipping collection setup.');
@@ -24952,6 +24967,15 @@ class QueryWriteRaiseQueryComponent {
24952
24967
  generateCaseQueriesCollectionData() {
24953
24968
  return this.queryManagementService.generateCaseQueriesCollectionData(this.formGroup, this.queryCreateContext, this.queryItem, this.messageId);
24954
24969
  }
24970
+ addMarkdownValidators() {
24971
+ ['subject', 'body'].forEach((controlName) => {
24972
+ const control = this.formGroup?.get(controlName);
24973
+ if (control) {
24974
+ control.addValidators(QueryWriteRaiseQueryComponent.MARKDOWN_VALIDATOR);
24975
+ control.updateValueAndValidity({ emitEvent: false });
24976
+ }
24977
+ });
24978
+ }
24955
24979
  static ɵfac = function QueryWriteRaiseQueryComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || QueryWriteRaiseQueryComponent)(i0.ɵɵdirectiveInject(QueryManagementService), i0.ɵɵdirectiveInject(i1$1.ActivatedRoute)); };
24956
24980
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: QueryWriteRaiseQueryComponent, selectors: [["ccd-query-write-raise-query"]], inputs: { formGroup: "formGroup", submitted: "submitted", caseDetails: "caseDetails", showForm: "showForm", serviceMessage: "serviceMessage", queryCreateContext: "queryCreateContext", eventData: "eventData", queryItem: "queryItem", validate: "validate", triggerSubmission: "triggerSubmission" }, outputs: { queryDataCreated: "queryDataCreated" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 12, vars: 8, consts: [[1, "govuk-!-margin-bottom-6"], [1, "govuk-caption-l"], [1, "govuk-heading-l", "govuk-!-margin-bottom-4"], [3, "caseDetails", 4, "ngIf"], ["class", "govuk-!-margin-bottom-4", 4, "ngIf"], [3, "caseDetails"], [1, "govuk-!-margin-bottom-4"], [3, "formGroup"], [1, "govuk-warning-text"], ["aria-hidden", "true", 1, "govuk-warning-text__icon"], [1, "govuk-warning-text__text"], [1, "govuk-visually-hidden"], [3, "content"], [1, "govuk-form-group", 3, "ngClass"], [1, "govuk-label-wrapper"], ["for", "subject", 1, "govuk-label", "govuk-label--m", "govuk-!-font-weight-bold"], ["id", "subject-hint", 1, "govuk-hint"], ["id", "subject-error", "class", "govuk-error-message", 4, "ngIf"], ["type", "text", "id", "subject", "formControlName", "subject", "maxlength", "200", "aria-describedby", "subject-error", 1, "govuk-input", 3, "input"], ["for", "body", 1, "govuk-label", "govuk-label--m", "govuk-!-font-weight-bold"], ["id", "body-hint", 1, "govuk-hint"], ["id", "body-error", "class", "govuk-error-message", 4, "ngIf"], ["id", "body", "name", "body", "rows", "5", "aria-describedby", "body-hint body-error", 1, "govuk-textarea", 3, "formControlName"], [1, "govuk-fieldset"], [1, "govuk-label", "govuk-label--m", "govuk-!-font-weight-bold"], ["id", "isHearingRelated-error", "class", "govuk-error-message", 4, "ngIf"], ["data-module", "govuk-radios", 1, "govuk-radios", "govuk-radios--inline"], [1, "govuk-radios__item"], ["id", "isHearingRelated-yes", "name", "isHearingRelated", "type", "radio", "formControlName", "isHearingRelated", 1, "govuk-radios__input", 3, "checked", "value"], ["for", "isHearingRelated-yes", 1, "govuk-label", "govuk-radios__label"], ["id", "isHearingRelated-no", "name", "isHearingRelated", "type", "radio", "formControlName", "isHearingRelated", 1, "govuk-radios__input", 3, "checked", "value"], ["for", "isHearingRelated-no", 1, "govuk-label", "govuk-radios__label"], [4, "ngIf"], ["id", "subject-error", 1, "govuk-error-message"], ["id", "body-error", 1, "govuk-error-message"], ["id", "isHearingRelated-error", 1, "govuk-error-message"], [1, "govuk-radios__conditional", "govuk-!-margin-top-1", 3, "ngClass"], ["role", "group", 1, "govuk-fieldset"], [1, "govuk-label", "govuk-label--s"], ["id", "hearingDate-error", "class", "govuk-error-message", 4, "ngIf"], ["formControlName", "hearingDate"], ["id", "hearingDate-error", 1, "govuk-error-message"]], template: function QueryWriteRaiseQueryComponent_Template(rf, ctx) { if (rf & 1) {
24957
24981
  i0.ɵɵelementStart(0, "div")(1, "div", 0)(2, "div", 1);
@@ -24981,7 +25005,7 @@ class QueryWriteRaiseQueryComponent {
24981
25005
  }
24982
25006
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(QueryWriteRaiseQueryComponent, [{
24983
25007
  type: Component,
24984
- args: [{ selector: 'ccd-query-write-raise-query', standalone: false, template: "<div>\n <div class=\"govuk-!-margin-bottom-6\">\n <div class=\"govuk-caption-l\">{{ 'Raise a query' | rpxTranslate }}</div>\n <h1 class=\"govuk-heading-l govuk-!-margin-bottom-4\">{{ 'Enter query details' | rpxTranslate }}</h1>\n </div>\n\n <div>\n <ccd-query-case-details-header [caseDetails]=\"caseDetails\" *ngIf=\"caseDetails\"></ccd-query-case-details-header>\n </div>\n\n <hr>\n\n <div class=\"govuk-!-margin-bottom-4\" *ngIf=\"showForm\">\n <div [formGroup]=\"formGroup\">\n <div>\n <div class=\"govuk-warning-text\">\n <span class=\"govuk-warning-text__icon\" aria-hidden=\"true\">!</span>\n <strong class=\"govuk-warning-text__text\">\n <span class=\"govuk-visually-hidden\">Warning</span>\n <ccd-markdown\n [content]=\"serviceMessage | rpxTranslate\">\n </ccd-markdown>\n </strong>\n </div>\n <div class=\"govuk-form-group\" [ngClass]=\"{'govuk-form-group--error': submitted && formGroup.get('subject').hasError('required')}\">\n <div class=\"govuk-label-wrapper\">\n <label class=\"govuk-label govuk-label--m govuk-!-font-weight-bold\" for=\"subject\">\n {{ 'Query subject' | rpxTranslate }}\n </label>\n </div>\n <div id=\"subject-hint\" class=\"govuk-hint\">\n {{ 'The subject should be a summary of your query' | rpxTranslate }}\n </div>\n <p id=\"subject-error\" class=\"govuk-error-message\"\n *ngIf=\"submitted && (formGroup.get('subject').hasError('required') || formGroup.get('subject').hasError('maxlength'))\">\n <span class=\"govuk-visually-hidden\">{{ 'Error:' | rpxTranslate }}</span>\n {{ getSubjectErrorMessage() | rpxTranslate }}\n </p>\n\n <input type=\"text\"\n id=\"subject\"\n class=\"govuk-input\"\n formControlName=\"subject\"\n maxlength=\"200\"\n (input)=\"onSubjectInput()\"\n aria-describedby=\"subject-error\" />\n </div>\n\n <div class=\"govuk-form-group\"\n [ngClass]=\"{'govuk-form-group--error': submitted && formGroup.get('body').hasError('required')}\">\n <div class=\"govuk-label-wrapper\">\n <label class=\"govuk-label govuk-label--m govuk-!-font-weight-bold\" for=\"body\">\n {{ 'Query detail' | rpxTranslate }}\n </label>\n </div>\n <div id=\"body-hint\" class=\"govuk-hint\">\n {{ 'Include as many details as possible so case workers can respond to your query' | rpxTranslate }}\n </div>\n <p id=\"body-error\" class=\"govuk-error-message\"\n *ngIf=\"submitted && formGroup.get('body').hasError('required')\">\n <span class=\"govuk-visually-hidden\">{{ 'Error:' | rpxTranslate }} </span>{{ raiseQueryErrorMessage.QUERY_BODY | rpxTranslate }}\n </p>\n <textarea [formControlName]=\"'body'\"\n id=\"body\" name=\"body\" rows=\"5\"\n aria-describedby=\"body-hint body-error\"\n class=\"govuk-textarea\"\n [class.govuk-textarea--error]=\"submitted && formGroup.get('body').hasError('required')\"\n >\n </textarea>\n </div>\n\n <div class=\"govuk-form-group\"\n [ngClass]=\"{'govuk-form-group--error': submitted && formGroup.get('isHearingRelated').hasError('required')}\">\n <fieldset class=\"govuk-fieldset\">\n <legend>\n <label class=\"govuk-label govuk-label--m govuk-!-font-weight-bold\">\n {{ 'Is the query hearing related?' | rpxTranslate }}\n </label>\n </legend>\n <p id=\"isHearingRelated-error\" class=\"govuk-error-message\"\n *ngIf=\"submitted && formGroup.get('isHearingRelated').hasError('required')\">\n <span class=\"govuk-visually-hidden\">{{ 'Error:' | rpxTranslate }} </span>{{ raiseQueryErrorMessage.QUERY_HEARING_RELATED | rpxTranslate }}\n </p>\n <div class=\"govuk-radios govuk-radios--inline\" data-module=\"govuk-radios\">\n <div class=\"govuk-radios__item\">\n <input class=\"govuk-radios__input\" id=\"isHearingRelated-yes\" name=\"isHearingRelated\"\n type=\"radio\"\n formControlName=\"isHearingRelated\"\n [checked]=\"formGroup.get('isHearingRelated').value === true\" [value]=\"true\"\n >\n <label class=\"govuk-label govuk-radios__label\" for=\"isHearingRelated-yes\">\n {{ 'Is the query hearing related?' | rpxTranslate: null : 'Yes' }}\n </label>\n </div>\n <div class=\"govuk-radios__item\">\n <input class=\"govuk-radios__input\" id=\"isHearingRelated-no\" name=\"isHearingRelated\"\n type=\"radio\"\n formControlName=\"isHearingRelated\"\n [checked]=\"formGroup.get('isHearingRelated').value === false\" [value]=\"false\"\n >\n <label class=\"govuk-label govuk-radios__label\" for=\"isHearingRelated-no\">\n {{ 'Is the query hearing related?' | rpxTranslate: null : 'No' }}\n </label>\n </div>\n </div>\n </fieldset>\n\n <ng-container *ngIf=\"formGroup.get('isHearingRelated').value\">\n <div class=\"govuk-radios__conditional govuk-!-margin-top-1\"\n [ngClass]=\"{'govuk-form-group--error': submitted &&\n formGroup.get('isHearingRelated').value === true &&\n formGroup.get('hearingDate').value === null}\">\n <fieldset class=\"govuk-fieldset\" role=\"group\">\n <legend>\n <label class=\"govuk-label govuk-label--s\">\n {{ 'What is the date of the hearing?' | rpxTranslate }}\n </label>\n </legend>\n <p id=\"hearingDate-error\" class=\"govuk-error-message\"\n *ngIf=\"submitted && formGroup.get('isHearingRelated').value === true && formGroup.get('hearingDate').value === null\">\n <span class=\"govuk-visually-hidden\">{{ 'Error:' | rpxTranslate }} </span>{{ raiseQueryErrorMessage.QUERY_HEARING_DATE | rpxTranslate }}\n </p>\n <ccd-query-write-date-input formControlName=\"hearingDate\"></ccd-query-write-date-input>\n </fieldset>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n" }]
25008
+ args: [{ selector: 'ccd-query-write-raise-query', standalone: false, template: "<div>\n <div class=\"govuk-!-margin-bottom-6\">\n <div class=\"govuk-caption-l\">{{ 'Raise a query' | rpxTranslate }}</div>\n <h1 class=\"govuk-heading-l govuk-!-margin-bottom-4\">{{ 'Enter query details' | rpxTranslate }}</h1>\n </div>\n\n <div>\n <ccd-query-case-details-header [caseDetails]=\"caseDetails\" *ngIf=\"caseDetails\"></ccd-query-case-details-header>\n </div>\n\n <hr>\n\n <div class=\"govuk-!-margin-bottom-4\" *ngIf=\"showForm\">\n <div [formGroup]=\"formGroup\">\n <div>\n <div class=\"govuk-warning-text\">\n <span class=\"govuk-warning-text__icon\" aria-hidden=\"true\">!</span>\n <strong class=\"govuk-warning-text__text\">\n <span class=\"govuk-visually-hidden\">Warning</span>\n <ccd-markdown\n [content]=\"serviceMessage | rpxTranslate\">\n </ccd-markdown>\n </strong>\n </div>\n <div class=\"govuk-form-group\" [ngClass]=\"{'govuk-form-group--error': submitted && formGroup.get('subject').invalid}\">\n <div class=\"govuk-label-wrapper\">\n <label class=\"govuk-label govuk-label--m govuk-!-font-weight-bold\" for=\"subject\">\n {{ 'Query subject' | rpxTranslate }}\n </label>\n </div>\n <div id=\"subject-hint\" class=\"govuk-hint\">\n {{ 'The subject should be a summary of your query' | rpxTranslate }}\n </div>\n <p id=\"subject-error\" class=\"govuk-error-message\"\n *ngIf=\"submitted && formGroup.get('subject').invalid\">\n <span class=\"govuk-visually-hidden\">{{ 'Error:' | rpxTranslate }}</span>\n {{ getSubjectErrorMessage() | rpxTranslate }}\n </p>\n\n <input type=\"text\"\n id=\"subject\"\n class=\"govuk-input\"\n formControlName=\"subject\"\n maxlength=\"200\"\n (input)=\"onSubjectInput()\"\n aria-describedby=\"subject-error\" />\n </div>\n\n <div class=\"govuk-form-group\"\n [ngClass]=\"{'govuk-form-group--error': submitted && formGroup.get('body').invalid}\">\n <div class=\"govuk-label-wrapper\">\n <label class=\"govuk-label govuk-label--m govuk-!-font-weight-bold\" for=\"body\">\n {{ 'Query detail' | rpxTranslate }}\n </label>\n </div>\n <div id=\"body-hint\" class=\"govuk-hint\">\n {{ 'Include as many details as possible so case workers can respond to your query' | rpxTranslate }}\n </div>\n <p id=\"body-error\" class=\"govuk-error-message\"\n *ngIf=\"submitted && formGroup.get('body').invalid\">\n <span class=\"govuk-visually-hidden\">{{ 'Error:' | rpxTranslate }} </span>{{ getBodyErrorMessage() | rpxTranslate }}\n </p>\n <textarea [formControlName]=\"'body'\"\n id=\"body\" name=\"body\" rows=\"5\"\n aria-describedby=\"body-hint body-error\"\n class=\"govuk-textarea\"\n [class.govuk-textarea--error]=\"submitted && formGroup.get('body').invalid\"\n >\n </textarea>\n </div>\n\n <div class=\"govuk-form-group\"\n [ngClass]=\"{'govuk-form-group--error': submitted && formGroup.get('isHearingRelated').hasError('required')}\">\n <fieldset class=\"govuk-fieldset\">\n <legend>\n <label class=\"govuk-label govuk-label--m govuk-!-font-weight-bold\">\n {{ 'Is the query hearing related?' | rpxTranslate }}\n </label>\n </legend>\n <p id=\"isHearingRelated-error\" class=\"govuk-error-message\"\n *ngIf=\"submitted && formGroup.get('isHearingRelated').hasError('required')\">\n <span class=\"govuk-visually-hidden\">{{ 'Error:' | rpxTranslate }} </span>{{ raiseQueryErrorMessage.QUERY_HEARING_RELATED | rpxTranslate }}\n </p>\n <div class=\"govuk-radios govuk-radios--inline\" data-module=\"govuk-radios\">\n <div class=\"govuk-radios__item\">\n <input class=\"govuk-radios__input\" id=\"isHearingRelated-yes\" name=\"isHearingRelated\"\n type=\"radio\"\n formControlName=\"isHearingRelated\"\n [checked]=\"formGroup.get('isHearingRelated').value === true\" [value]=\"true\"\n >\n <label class=\"govuk-label govuk-radios__label\" for=\"isHearingRelated-yes\">\n {{ 'Is the query hearing related?' | rpxTranslate: null : 'Yes' }}\n </label>\n </div>\n <div class=\"govuk-radios__item\">\n <input class=\"govuk-radios__input\" id=\"isHearingRelated-no\" name=\"isHearingRelated\"\n type=\"radio\"\n formControlName=\"isHearingRelated\"\n [checked]=\"formGroup.get('isHearingRelated').value === false\" [value]=\"false\"\n >\n <label class=\"govuk-label govuk-radios__label\" for=\"isHearingRelated-no\">\n {{ 'Is the query hearing related?' | rpxTranslate: null : 'No' }}\n </label>\n </div>\n </div>\n </fieldset>\n\n <ng-container *ngIf=\"formGroup.get('isHearingRelated').value\">\n <div class=\"govuk-radios__conditional govuk-!-margin-top-1\"\n [ngClass]=\"{'govuk-form-group--error': submitted &&\n formGroup.get('isHearingRelated').value === true &&\n formGroup.get('hearingDate').value === null}\">\n <fieldset class=\"govuk-fieldset\" role=\"group\">\n <legend>\n <label class=\"govuk-label govuk-label--s\">\n {{ 'What is the date of the hearing?' | rpxTranslate }}\n </label>\n </legend>\n <p id=\"hearingDate-error\" class=\"govuk-error-message\"\n *ngIf=\"submitted && formGroup.get('isHearingRelated').value === true && formGroup.get('hearingDate').value === null\">\n <span class=\"govuk-visually-hidden\">{{ 'Error:' | rpxTranslate }} </span>{{ raiseQueryErrorMessage.QUERY_HEARING_DATE | rpxTranslate }}\n </p>\n <ccd-query-write-date-input formControlName=\"hearingDate\"></ccd-query-write-date-input>\n </fieldset>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</div>\n" }]
24985
25009
  }], () => [{ type: QueryManagementService }, { type: i1$1.ActivatedRoute }], { formGroup: [{
24986
25010
  type: Input
24987
25011
  }], submitted: [{
@@ -25005,7 +25029,7 @@ class QueryWriteRaiseQueryComponent {
25005
25029
  }], queryDataCreated: [{
25006
25030
  type: Output
25007
25031
  }] }); })();
25008
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QueryWriteRaiseQueryComponent, { className: "QueryWriteRaiseQueryComponent", filePath: "lib/shared/components/palette/query-management/components/query-write/query-write-raise-query/query-write-raise-query.component.ts", lineNumber: 21 }); })();
25032
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QueryWriteRaiseQueryComponent, { className: "QueryWriteRaiseQueryComponent", filePath: "lib/shared/components/palette/query-management/components/query-write/query-write-raise-query/query-write-raise-query.component.ts", lineNumber: 22 }); })();
25009
25033
 
25010
25034
  function QueryWriteRespondToQueryComponent_ccd_query_case_details_header_9_Template(rf, ctx) { if (rf & 1) {
25011
25035
  i0.ɵɵelement(0, "ccd-query-case-details-header", 8);
@@ -25026,7 +25050,7 @@ function QueryWriteRespondToQueryComponent_div_12_div_1_p_10_Template(rf, ctx) {
25026
25050
  i0.ɵɵadvance(2);
25027
25051
  i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(3, 2, "Error:"), " ");
25028
25052
  i0.ɵɵadvance(2);
25029
- i0.ɵɵtextInterpolate1("", ctx_r0.queryCreateContext === ctx_r0.queryCreateContextEnum.RESPOND ? ctx_r0.raiseQueryErrorMessages.RESPOND_QUERY_BODY : i0.ɵɵpipeBind1(5, 4, ctx_r0.raiseQueryErrorMessages.QUERY_BODY), " ");
25053
+ i0.ɵɵtextInterpolate1("", i0.ɵɵpipeBind1(5, 4, ctx_r0.getBodyErrorMessage()), " ");
25030
25054
  } }
25031
25055
  function QueryWriteRespondToQueryComponent_div_12_div_1_Template(rf, ctx) { if (rf & 1) {
25032
25056
  i0.ɵɵelementStart(0, "div")(1, "h1", 10);
@@ -25051,13 +25075,13 @@ function QueryWriteRespondToQueryComponent_div_12_div_1_Template(rf, ctx) { if (
25051
25075
  i0.ɵɵadvance(2);
25052
25076
  i0.ɵɵproperty("formGroup", ctx_r0.formGroup);
25053
25077
  i0.ɵɵadvance();
25054
- i0.ɵɵclassProp("govuk-form-group--error", ctx_r0.submitted && ((tmp_4_0 = ctx_r0.formGroup.get("body")) == null ? null : tmp_4_0.hasError("required")));
25078
+ i0.ɵɵclassProp("govuk-form-group--error", ctx_r0.submitted && ((tmp_4_0 = ctx_r0.formGroup.get("body")) == null ? null : tmp_4_0.invalid));
25055
25079
  i0.ɵɵadvance(3);
25056
25080
  i0.ɵɵtextInterpolate1(" ", ctx_r0.queryCreateContext === ctx_r0.queryCreateContextEnum.RESPOND ? "Response detail" : i0.ɵɵpipeBind1(9, 11, "Query Body"), " ");
25057
25081
  i0.ɵɵadvance(2);
25058
- i0.ɵɵproperty("ngIf", ctx_r0.submitted && ((tmp_6_0 = ctx_r0.formGroup.get("body")) == null ? null : tmp_6_0.hasError("required")));
25082
+ i0.ɵɵproperty("ngIf", ctx_r0.submitted && ((tmp_6_0 = ctx_r0.formGroup.get("body")) == null ? null : tmp_6_0.invalid));
25059
25083
  i0.ɵɵadvance();
25060
- i0.ɵɵclassProp("govuk-textarea--error", ctx_r0.submitted && ((tmp_7_0 = ctx_r0.formGroup.get("body")) == null ? null : tmp_7_0.hasError("required")));
25084
+ i0.ɵɵclassProp("govuk-textarea--error", ctx_r0.submitted && ((tmp_7_0 = ctx_r0.formGroup.get("body")) == null ? null : tmp_7_0.invalid));
25061
25085
  i0.ɵɵproperty("formControlName", "body");
25062
25086
  } }
25063
25087
  function QueryWriteRespondToQueryComponent_div_12_Template(rf, ctx) { if (rf & 1) {
@@ -25089,6 +25113,7 @@ class QueryWriteRespondToQueryComponent {
25089
25113
  route;
25090
25114
  queryManagementService;
25091
25115
  logger = new StructuredLoggerService();
25116
+ static MARKDOWN_VALIDATOR = FormValidatorsService.markDownPatternValidator();
25092
25117
  queryItem;
25093
25118
  formGroup;
25094
25119
  queryCreateContext;
@@ -25128,6 +25153,7 @@ class QueryWriteRespondToQueryComponent {
25128
25153
  });
25129
25154
  }
25130
25155
  ngOnChanges() {
25156
+ this.addMarkdownValidator();
25131
25157
  if (!this.caseQueriesCollections || this.caseQueriesCollections.length === 0) {
25132
25158
  // Silent return – this is not an error.
25133
25159
  return;
@@ -25157,7 +25183,7 @@ class QueryWriteRespondToQueryComponent {
25157
25183
  this.queryResponseStatus = this.queryListData?.responseStatus;
25158
25184
  const isCollectionDataSet = this.setCaseQueriesCollectionData();
25159
25185
  if (isCollectionDataSet) {
25160
- if (this.triggerSubmission) {
25186
+ if (this.triggerSubmission && this.formGroup.valid) {
25161
25187
  const data = this.generateCaseQueriesCollectionData();
25162
25188
  this.queryDataCreated.emit(data);
25163
25189
  }
@@ -25167,6 +25193,16 @@ class QueryWriteRespondToQueryComponent {
25167
25193
  this.hasRespondedToQuery = value;
25168
25194
  this.hasRespondedToQueryTask.emit(value);
25169
25195
  }
25196
+ getBodyErrorMessage() {
25197
+ if (this.formGroup.get('body')?.hasError('markDownPattern')) {
25198
+ return this.queryCreateContext === QueryCreateContext.RESPOND
25199
+ ? this.raiseQueryErrorMessages.RESPOND_QUERY_BODY_MARKDOWN
25200
+ : this.raiseQueryErrorMessages.QUERY_BODY_MARKDOWN;
25201
+ }
25202
+ return this.queryCreateContext === QueryCreateContext.RESPOND
25203
+ ? this.raiseQueryErrorMessages.RESPOND_QUERY_BODY
25204
+ : this.raiseQueryErrorMessages.QUERY_BODY;
25205
+ }
25170
25206
  setCaseQueriesCollectionData() {
25171
25207
  if (!this.eventData) {
25172
25208
  this.logger.warn('Event data not available; skipping collection setup.');
@@ -25178,6 +25214,13 @@ class QueryWriteRespondToQueryComponent {
25178
25214
  generateCaseQueriesCollectionData() {
25179
25215
  return this.queryManagementService.generateCaseQueriesCollectionData(this.formGroup, this.queryCreateContext, this.queryItem, this.messageId);
25180
25216
  }
25217
+ addMarkdownValidator() {
25218
+ const control = this.formGroup?.get('body');
25219
+ if (control) {
25220
+ control.addValidators(QueryWriteRespondToQueryComponent.MARKDOWN_VALIDATOR);
25221
+ control.updateValueAndValidity({ emitEvent: false });
25222
+ }
25223
+ }
25181
25224
  static ɵfac = function QueryWriteRespondToQueryComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || QueryWriteRespondToQueryComponent)(i0.ɵɵdirectiveInject(CaseNotifier), i0.ɵɵdirectiveInject(i1$1.ActivatedRoute), i0.ɵɵdirectiveInject(QueryManagementService)); };
25182
25225
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: QueryWriteRespondToQueryComponent, selectors: [["ccd-query-write-respond-to-query"]], inputs: { queryItem: "queryItem", formGroup: "formGroup", queryCreateContext: "queryCreateContext", submitted: "submitted", caseQueriesCollections: "caseQueriesCollections", showForm: "showForm", triggerSubmission: "triggerSubmission", eventData: "eventData" }, outputs: { queryDataCreated: "queryDataCreated", hasRespondedToQueryTask: "hasRespondedToQueryTask" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 14, vars: 11, consts: [[1, "govuk-!-margin-bottom-6"], [1, "govuk-caption-l"], [1, "govuk-heading-l", "govuk-!-margin-bottom-0"], [1, "govuk-!-margin-bottom-4"], [3, "caseDetails", 4, "ngIf"], [3, "hasResponded", "query", "queryResponseStatus"], ["class", "query-respond", 4, "ngIf"], [4, "ngIf"], [3, "caseDetails"], [1, "query-respond"], [1, "govuk-heading-m"], [3, "formGroup"], [1, "govuk-form-group", "body-textarea"], [1, "govuk-label-wrapper"], ["for", "body", 1, "govuk-label", "govuk-label--m", "govuk-!-font-weight-bold"], ["id", "body-error", "class", "govuk-error-message", 4, "ngIf"], ["id", "body", "name", "body", "rows", "5", "aria-describedby", "body-hint body-error", 1, "govuk-textarea", 3, "formControlName"], ["id", "body-error", 1, "govuk-error-message"], [1, "govuk-visually-hidden"], [3, "formGroup", 4, "ngIf"]], template: function QueryWriteRespondToQueryComponent_Template(rf, ctx) { if (rf & 1) {
25183
25226
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 0)(2, "div", 1);
@@ -25212,7 +25255,7 @@ class QueryWriteRespondToQueryComponent {
25212
25255
  }
25213
25256
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(QueryWriteRespondToQueryComponent, [{
25214
25257
  type: Component,
25215
- args: [{ selector: 'ccd-query-write-respond-to-query', standalone: false, template: "<div class=\"govuk-!-margin-bottom-6\">\n <div class=\"govuk-!-margin-bottom-6\">\n <div class=\"govuk-caption-l\">{{ 'Respond to a query' | rpxTranslate }}</div>\n <h1 class=\"govuk-heading-l govuk-!-margin-bottom-0\">{{ 'Query details' | rpxTranslate }}</h1>\n </div>\n\n <div class=\"govuk-!-margin-bottom-4\">\n <ccd-query-case-details-header [caseDetails]=\"caseDetails\" *ngIf=\"caseDetails\"></ccd-query-case-details-header>\n </div>\n\n <div>\n <ccd-query-details [query]=\"queryListData\"\n [queryResponseStatus]=\"queryResponseStatus\"\n (hasResponded)=\"hasResponded($event)\"></ccd-query-details>\n </div>\n</div>\n<div class=\"query-respond\" *ngIf=\"showForm\">\n <div *ngIf=\"!hasRespondedToQuery\">\n <h1 class=\"govuk-heading-m\">\n {{ queryCreateContext === queryCreateContextEnum.RESPOND ? 'Respond to a query' : 'Ask a follow-up question' | rpxTranslate }}\n </h1>\n\n <div [formGroup]=\"formGroup\">\n <div class=\"govuk-form-group body-textarea\"\n [class.govuk-form-group--error]=\"submitted && formGroup.get('body')?.hasError('required')\">\n <div class=\"govuk-label-wrapper\">\n <label class=\"govuk-label govuk-label--m govuk-!-font-weight-bold\" for=\"body\">\n {{ queryCreateContext === queryCreateContextEnum.RESPOND ? 'Response detail' : 'Query Body' | rpxTranslate }}\n </label>\n </div>\n <p id=\"body-error\" class=\"govuk-error-message\"\n *ngIf=\"submitted && formGroup.get('body')?.hasError('required')\">\n <span class=\"govuk-visually-hidden\">{{ 'Error:' | rpxTranslate }} </span>{{ queryCreateContext === queryCreateContextEnum.RESPOND ? raiseQueryErrorMessages.RESPOND_QUERY_BODY : raiseQueryErrorMessages.QUERY_BODY | rpxTranslate }}\n </p>\n <textarea [formControlName]=\"'body'\" class=\"govuk-textarea\"\n [class.govuk-textarea--error]=\"submitted && formGroup.get('body')?.hasError('required')\" id=\"body\"\n name=\"body\" rows=\"5\" aria-describedby=\"body-hint body-error\">\n </textarea>\n </div>\n </div>\n </div>\n</div>\n\n<ng-container *ngIf=\"queryCreateContext === queryCreateContextEnum.RESPOND\">\n <ccd-close-query *ngIf=\"!hasRespondedToQuery\"\n [formGroup]=\"formGroup\">\n </ccd-close-query>\n</ng-container>", styles: [".query-respond{width:100%;max-width:720px}\n"] }]
25258
+ args: [{ selector: 'ccd-query-write-respond-to-query', standalone: false, template: "<div class=\"govuk-!-margin-bottom-6\">\n <div class=\"govuk-!-margin-bottom-6\">\n <div class=\"govuk-caption-l\">{{ 'Respond to a query' | rpxTranslate }}</div>\n <h1 class=\"govuk-heading-l govuk-!-margin-bottom-0\">{{ 'Query details' | rpxTranslate }}</h1>\n </div>\n\n <div class=\"govuk-!-margin-bottom-4\">\n <ccd-query-case-details-header [caseDetails]=\"caseDetails\" *ngIf=\"caseDetails\"></ccd-query-case-details-header>\n </div>\n\n <div>\n <ccd-query-details [query]=\"queryListData\"\n [queryResponseStatus]=\"queryResponseStatus\"\n (hasResponded)=\"hasResponded($event)\"></ccd-query-details>\n </div>\n</div>\n<div class=\"query-respond\" *ngIf=\"showForm\">\n <div *ngIf=\"!hasRespondedToQuery\">\n <h1 class=\"govuk-heading-m\">\n {{ queryCreateContext === queryCreateContextEnum.RESPOND ? 'Respond to a query' : 'Ask a follow-up question' | rpxTranslate }}\n </h1>\n\n <div [formGroup]=\"formGroup\">\n <div class=\"govuk-form-group body-textarea\"\n [class.govuk-form-group--error]=\"submitted && formGroup.get('body')?.invalid\">\n <div class=\"govuk-label-wrapper\">\n <label class=\"govuk-label govuk-label--m govuk-!-font-weight-bold\" for=\"body\">\n {{ queryCreateContext === queryCreateContextEnum.RESPOND ? 'Response detail' : 'Query Body' | rpxTranslate }}\n </label>\n </div>\n <p id=\"body-error\" class=\"govuk-error-message\"\n *ngIf=\"submitted && formGroup.get('body')?.invalid\">\n <span class=\"govuk-visually-hidden\">{{ 'Error:' | rpxTranslate }} </span>{{ getBodyErrorMessage() | rpxTranslate }}\n </p>\n <textarea [formControlName]=\"'body'\" class=\"govuk-textarea\"\n [class.govuk-textarea--error]=\"submitted && formGroup.get('body')?.invalid\" id=\"body\"\n name=\"body\" rows=\"5\" aria-describedby=\"body-hint body-error\">\n </textarea>\n </div>\n </div>\n </div>\n</div>\n\n<ng-container *ngIf=\"queryCreateContext === queryCreateContextEnum.RESPOND\">\n <ccd-close-query *ngIf=\"!hasRespondedToQuery\"\n [formGroup]=\"formGroup\">\n </ccd-close-query>\n</ng-container>", styles: [".query-respond{width:100%;max-width:720px}\n"] }]
25216
25259
  }], () => [{ type: CaseNotifier }, { type: i1$1.ActivatedRoute }, { type: QueryManagementService }], { queryItem: [{
25217
25260
  type: Input
25218
25261
  }], formGroup: [{
@@ -25234,7 +25277,7 @@ class QueryWriteRespondToQueryComponent {
25234
25277
  }], hasRespondedToQueryTask: [{
25235
25278
  type: Output
25236
25279
  }] }); })();
25237
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QueryWriteRespondToQueryComponent, { className: "QueryWriteRespondToQueryComponent", filePath: "lib/shared/components/palette/query-management/components/query-write/query-write-respond-to-query/query-write-respond-to-query.component.ts", lineNumber: 20 }); })();
25280
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(QueryWriteRespondToQueryComponent, { className: "QueryWriteRespondToQueryComponent", filePath: "lib/shared/components/palette/query-management/components/query-write/query-write-respond-to-query/query-write-respond-to-query.component.ts", lineNumber: 21 }); })();
25238
25281
 
25239
25282
  function QueryConfirmationComponent_main_0_ng_container_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
25240
25283
  i0.ɵɵelementStart(0, "h1", 8);