@hmcts/ccd-case-ui-toolkit 7.0.22 → 7.0.23-exui-1717-rc2

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 (35) hide show
  1. package/esm2020/lib/shared/components/case-editor/case-edit/case-edit.component.mjs +2 -2
  2. package/esm2020/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.mjs +35 -7
  3. package/esm2020/lib/shared/components/case-editor/services/event-completion-state-machine.service.mjs +15 -3
  4. package/esm2020/lib/shared/components/case-editor/services/page-validation.service.mjs +10 -5
  5. package/esm2020/lib/shared/components/case-editor/services/work-allocation.service.mjs +5 -1
  6. package/esm2020/lib/shared/components/case-viewer/case-full-access-view/case-full-access-view.component.mjs +3 -3
  7. package/esm2020/lib/shared/components/palette/case-file-view/components/case-file-view-folder/case-file-view-folder.component.mjs +14 -12
  8. package/esm2020/lib/shared/components/palette/case-file-view/components/case-file-view-folder-selector/case-file-view-folder-selector.component.mjs +2 -2
  9. package/esm2020/lib/shared/components/palette/case-file-view/test-data/categories-and-documents-test-data.mjs +12 -12
  10. package/esm2020/lib/shared/components/palette/document/write-document-field.component.mjs +41 -16
  11. package/esm2020/lib/shared/domain/case-file-view/document-tree-node/document-tree-node.model.mjs +1 -1
  12. package/esm2020/lib/shared/domain/document/document-data.model.mjs +1 -1
  13. package/esm2020/lib/shared/domain/http/http-error.model.mjs +7 -1
  14. package/esm2020/lib/shared/services/fields/fields.purger.mjs +4 -3
  15. package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs +123 -45
  16. package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
  17. package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs +128 -45
  18. package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
  19. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts +2 -1
  20. package/lib/shared/components/case-editor/case-edit-page/case-edit-page.component.d.ts.map +1 -1
  21. package/lib/shared/components/case-editor/services/event-completion-state-machine.service.d.ts.map +1 -1
  22. package/lib/shared/components/case-editor/services/page-validation.service.d.ts +1 -1
  23. package/lib/shared/components/case-editor/services/page-validation.service.d.ts.map +1 -1
  24. package/lib/shared/components/case-editor/services/work-allocation.service.d.ts.map +1 -1
  25. package/lib/shared/components/palette/case-file-view/components/case-file-view-folder/case-file-view-folder.component.d.ts.map +1 -1
  26. package/lib/shared/components/palette/document/write-document-field.component.d.ts +2 -0
  27. package/lib/shared/components/palette/document/write-document-field.component.d.ts.map +1 -1
  28. package/lib/shared/domain/case-file-view/document-tree-node/document-tree-node.model.d.ts +1 -0
  29. package/lib/shared/domain/case-file-view/document-tree-node/document-tree-node.model.d.ts.map +1 -1
  30. package/lib/shared/domain/document/document-data.model.d.ts +1 -0
  31. package/lib/shared/domain/document/document-data.model.d.ts.map +1 -1
  32. package/lib/shared/domain/http/http-error.model.d.ts +1 -0
  33. package/lib/shared/domain/http/http-error.model.d.ts.map +1 -1
  34. package/lib/shared/services/fields/fields.purger.d.ts.map +1 -1
  35. package/package.json +1 -1
@@ -1241,6 +1241,11 @@ 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
1251
  Object.keys(error).forEach((key) => {
@@ -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`.
@@ -5026,8 +5032,9 @@ class FieldsPurger {
5026
5032
  }
5027
5033
  }
5028
5034
  else {
5029
- // Delete the field value
5030
- this.deleteFieldValue(form.get('data'), field);
5035
+ // Delete the field from formGroup
5036
+ const dataGroup = form.get('data');
5037
+ dataGroup.removeControl(field.id);
5031
5038
  }
5032
5039
  }
5033
5040
  resetPage(form, wizardPage) {
@@ -8251,7 +8258,7 @@ class EventCompletionStateMachineService {
8251
8258
  }
8252
8259
  entryActionForStateCheckTasksCanBeCompleted(state, context) {
8253
8260
  context.workAllocationService.getTask(context.task.id).subscribe(taskResponse => {
8254
- if (taskResponse && taskResponse.task && taskResponse.task.task_state) {
8261
+ if (taskResponse?.task?.task_state) {
8255
8262
  switch (taskResponse.task.task_state.toUpperCase()) {
8256
8263
  case TaskState.Unassigned:
8257
8264
  // Task unassigned
@@ -8281,6 +8288,14 @@ class EventCompletionStateMachineService {
8281
8288
  break;
8282
8289
  }
8283
8290
  }
8291
+ else if (!taskResponse?.task) {
8292
+ context.alertService.setPreserveAlerts(true);
8293
+ context.alertService.warning({ phrase: 'Task statecheck : no task available for completion', replacements: {} });
8294
+ }
8295
+ else {
8296
+ context.alertService.setPreserveAlerts(true);
8297
+ context.alertService.warning({ phrase: 'Task statecheck : no task state available for completion', replacements: {} });
8298
+ }
8284
8299
  }, error => {
8285
8300
  context.alertService.error(error.message);
8286
8301
  return throwError(error);
@@ -8302,6 +8317,8 @@ class EventCompletionStateMachineService {
8302
8317
  context.component.eventCanBeCompleted.emit(true);
8303
8318
  }
8304
8319
  else {
8320
+ context.alertService.setPreserveAlerts(true);
8321
+ context.alertService.warning({ phrase: 'CompleteEventAndTask : no task available for completion', replacements: {} });
8305
8322
  // Emit event cannot be completed event
8306
8323
  context.component.eventCanBeCompleted.emit(false);
8307
8324
  }
@@ -8322,7 +8339,9 @@ class EventCompletionStateMachineService {
8322
8339
  context.component.eventCanBeCompleted.emit(true);
8323
8340
  }
8324
8341
  else {
8325
- // Emit event cannot be completed event
8342
+ context.alertService.setPreserveAlerts(true);
8343
+ context.alertService.warning({ phrase: 'Unassigned task : no task available for completion', replacements: {} });
8344
+ // Emit event cannot be completed event
8326
8345
  context.component.eventCanBeCompleted.emit(false);
8327
8346
  }
8328
8347
  }
@@ -8385,16 +8404,21 @@ class PageValidationService {
8385
8404
  constructor(caseFieldService) {
8386
8405
  this.caseFieldService = caseFieldService;
8387
8406
  }
8388
- isPageValid(page, editForm) {
8389
- return page.case_fields
8407
+ getInvalidFields(page, editForm) {
8408
+ const failingCaseFields = [];
8409
+ page.case_fields
8390
8410
  .filter(caseField => !this.caseFieldService.isReadOnly(caseField))
8391
8411
  .filter(caseField => !this.isHidden(caseField, editForm))
8392
- .every(caseField => {
8412
+ .map(caseField => {
8393
8413
  const theControl = FieldsUtils.isCaseFieldOfType(caseField, ['JudicialUser'])
8394
8414
  ? editForm.controls['data'].get(`${caseField.id}_judicialUserControl`)
8395
8415
  : editForm.controls['data'].get(caseField.id);
8396
- return this.checkDocumentField(caseField, theControl) && this.checkOptionalField(caseField, theControl);
8416
+ if (!(this.checkDocumentField(caseField, theControl) && this.checkOptionalField(caseField, theControl))) {
8417
+ failingCaseFields.push(caseField);
8418
+ }
8419
+ ;
8397
8420
  });
8421
+ return failingCaseFields;
8398
8422
  }
8399
8423
  isHidden(caseField, editForm, path) {
8400
8424
  const formFields = editForm.getRawValue();
@@ -8500,6 +8524,8 @@ class WorkAllocationService {
8500
8524
  */
8501
8525
  completeTask(taskId) {
8502
8526
  if (!this.isWAEnabled()) {
8527
+ this.alertService.setPreserveAlerts(true);
8528
+ this.alertService.warning({ phrase: 'completeTask: Work Allocation is not enabled, so the task could not be completed. Please complete the task associated with the case manually.' });
8503
8529
  return of(null);
8504
8530
  }
8505
8531
  const url = `${this.appConfig.getWorkAllocationApiUrl()}/task/${taskId}/complete`;
@@ -8520,6 +8546,8 @@ class WorkAllocationService {
8520
8546
  */
8521
8547
  assignAndCompleteTask(taskId) {
8522
8548
  if (!this.isWAEnabled()) {
8549
+ this.alertService.setPreserveAlerts(true);
8550
+ this.alertService.warning({ phrase: 'assignAndCompleteTask: Work Allocation is not enabled, so the task could not be completed. Please complete the task associated with the case manually.' });
8523
8551
  return of(null);
8524
8552
  }
8525
8553
  const url = `${this.appConfig.getWorkAllocationApiUrl()}/task/${taskId}/complete`;
@@ -8928,7 +8956,7 @@ class CaseEditComponent {
8928
8956
  // If caseField.hidden is NOT truthy and also NOT equal to false, then it must be null/undefined (remember that
8929
8957
  // both null and undefined are equal to *neither false nor true*)
8930
8958
  if (caseField && caseField.retain_hidden_value &&
8931
- (caseField.hidden || (caseField.hidden !== false && parentField && parentField.hidden))) {
8959
+ (caseField.hidden || (caseField.hidden !== false && parentField?.hidden))) {
8932
8960
  if (caseField.field_type.type === 'Complex') {
8933
8961
  // Note: Deliberate use of equality (==) and non-equality (!=) operators for null checks throughout, to
8934
8962
  // handle both null and undefined values
@@ -9719,7 +9747,8 @@ class CaseEditPageComponent {
9719
9747
  return this.caseEdit.first();
9720
9748
  }
9721
9749
  currentPageIsNotValid() {
9722
- return !this.pageValidationService.isPageValid(this.currentPage, this.editForm) ||
9750
+ this.failingCaseFields = this.pageValidationService.getInvalidFields(this.currentPage, this.editForm);
9751
+ return this.failingCaseFields.length > 0 ||
9723
9752
  (this.isLinkedCasesJourney() && !this.isLinkedCasesJourneyAtFinalStep);
9724
9753
  }
9725
9754
  isLinkedCasesJourney() {
@@ -9741,9 +9770,15 @@ class CaseEditPageComponent {
9741
9770
  // Adding validation message to show it as Error Summary
9742
9771
  generateErrorMessage(fields, container, path) {
9743
9772
  const group = container || this.editForm.controls['data'];
9744
- fields.filter(casefield => !this.caseFieldService.isReadOnly(casefield))
9745
- .filter(casefield => !this.pageValidationService.isHidden(casefield, this.editForm, path))
9773
+ let validErrorFieldFound = false;
9774
+ let validationErrorAmount = this.validationErrors.length;
9775
+ const failingFields = fields.filter(casefield => !this.caseFieldService.isReadOnly(casefield))
9776
+ .filter(casefield => !this.pageValidationService.isHidden(casefield, this.editForm, path));
9777
+ // note that thougn these checks are on getinvalidfields they are needed for sub field checks
9778
+ failingFields
9746
9779
  .forEach(casefield => {
9780
+ let errorPresent = true;
9781
+ validErrorFieldFound = true;
9747
9782
  const fieldElement = FieldsUtils.isCaseFieldOfType(casefield, ['JudicialUser'])
9748
9783
  ? group.get(`${casefield.id}_judicialUserControl`)
9749
9784
  : group.get(casefield.id);
@@ -9788,7 +9823,7 @@ class CaseEditPageComponent {
9788
9823
  }
9789
9824
  else if (fieldElement.invalid) {
9790
9825
  if (casefield.isComplex()) {
9791
- this.generateErrorMessage(casefield.field_type.complex_fields, fieldElement, id);
9826
+ errorPresent = this.generateErrorMessage(casefield.field_type.complex_fields, fieldElement, id);
9792
9827
  }
9793
9828
  else if (casefield.isCollection() && casefield.field_type.collection_field_type.type === 'Complex') {
9794
9829
  const fieldArray = fieldElement;
@@ -9796,7 +9831,7 @@ class CaseEditPageComponent {
9796
9831
  id = `${fieldArray['component']['collItems'][0].prefix}`;
9797
9832
  }
9798
9833
  fieldArray.controls.forEach((c) => {
9799
- this.generateErrorMessage(casefield.field_type.collection_field_type.complex_fields, c.get('value'), id);
9834
+ errorPresent = this.generateErrorMessage(casefield.field_type.collection_field_type.complex_fields, c.get('value'), id);
9800
9835
  });
9801
9836
  }
9802
9837
  else if (FieldsUtils.isCaseFieldOfType(casefield, ['FlagLauncher'])) {
@@ -9811,8 +9846,29 @@ class CaseEditPageComponent {
9811
9846
  }
9812
9847
  }
9813
9848
  }
9849
+ else {
9850
+ validErrorFieldFound = false;
9851
+ }
9852
+ if (!errorPresent && this.validationErrors.length === validationErrorAmount) {
9853
+ // if no error messages have been added in internal field despite parent field failing
9854
+ this.validationErrors.push({ id: casefield.id, message: `A field that is causing an error is ${casefield.id} but it is not producing a valid error message. Please ensure all details are correct` });
9855
+ }
9814
9856
  });
9857
+ if (!validErrorFieldFound) {
9858
+ path ? this.validationErrors.push({ id: path, message: `There is an internal issue with ${path} fields. The field that is causing the error cannot be determined but there is an error present` })
9859
+ : this.validationErrors.push({ id: null, message: `The field that is causing the error cannot be determined but there is an error present` });
9860
+ }
9861
+ else if (this.validationErrors.length === validationErrorAmount) {
9862
+ // if no error messages have been generated
9863
+ if (path) {
9864
+ return false;
9865
+ }
9866
+ else {
9867
+ this.validationErrors.push({ id: null, message: `The field that is causing the error cannot be determined but there is an error present. Please fill in more of the form` });
9868
+ }
9869
+ }
9815
9870
  CaseEditPageComponent.scrollToTop();
9871
+ return true;
9816
9872
  }
9817
9873
  navigateToErrorElement(elementId) {
9818
9874
  /* istanbul ignore else */
@@ -9837,7 +9893,7 @@ class CaseEditPageComponent {
9837
9893
  CaseEditPageComponent.scrollToTop();
9838
9894
  }
9839
9895
  else {
9840
- this.generateErrorMessage(this.currentPage.case_fields);
9896
+ this.generateErrorMessage(this.failingCaseFields);
9841
9897
  }
9842
9898
  }
9843
9899
  if (!this.caseEdit.isSubmitting && !this.currentPageIsNotValid()) {
@@ -13490,6 +13546,9 @@ class WriteDocumentFieldComponent extends AbstractFieldWriteComponent {
13490
13546
  if (documentHash) {
13491
13547
  this.uploadedDocument.get(WriteDocumentFieldComponent.DOCUMENT_HASH).setValue(documentHash);
13492
13548
  }
13549
+ if (this.uploadedDocument.get(WriteDocumentFieldComponent.UPLOAD_TIMESTAMP)) {
13550
+ this.uploadedDocument.removeControl(WriteDocumentFieldComponent.UPLOAD_TIMESTAMP);
13551
+ }
13493
13552
  }
13494
13553
  createDocumentFormWithValidator(document) {
13495
13554
  let documentFormGroup = {
@@ -13497,6 +13556,12 @@ class WriteDocumentFieldComponent extends AbstractFieldWriteComponent {
13497
13556
  document_binary_url: new FormControl(document.document_binary_url, Validators.required),
13498
13557
  document_filename: new FormControl(document.document_filename, Validators.required)
13499
13558
  };
13559
+ if (document.upload_timestamp && (typeof document.upload_timestamp === 'string')) {
13560
+ documentFormGroup = {
13561
+ ...documentFormGroup,
13562
+ ...{ upload_timestamp: new FormControl(document.upload_timestamp) }
13563
+ };
13564
+ }
13500
13565
  documentFormGroup = this.secureModeOn ? {
13501
13566
  ...documentFormGroup,
13502
13567
  ...{ document_hash: new FormControl(document.document_hash) }
@@ -13509,6 +13574,12 @@ class WriteDocumentFieldComponent extends AbstractFieldWriteComponent {
13509
13574
  document_binary_url: new FormControl(document.document_binary_url),
13510
13575
  document_filename: new FormControl(document.document_filename)
13511
13576
  };
13577
+ if (document.upload_timestamp && (typeof document.upload_timestamp === 'string')) {
13578
+ documentFormGroup = {
13579
+ ...documentFormGroup,
13580
+ ...{ upload_timestamp: new FormControl(document.upload_timestamp) }
13581
+ };
13582
+ }
13512
13583
  documentFormGroup = this.secureModeOn ? {
13513
13584
  ...documentFormGroup,
13514
13585
  ...{ document_hash: new FormControl(document.document_hash) }
@@ -13516,23 +13587,31 @@ class WriteDocumentFieldComponent extends AbstractFieldWriteComponent {
13516
13587
  this.uploadedDocument = this.registerControl(new FormGroup(documentFormGroup), true);
13517
13588
  }
13518
13589
  getErrorMessage(error) {
13519
- // Document Management unavailable
13520
- if (0 === error.status || 502 === error.status) {
13521
- return WriteDocumentFieldComponent.UPLOAD_ERROR_NOT_AVAILABLE;
13522
- }
13523
- let errorMsg = 'Error uploading file';
13524
- if (error?.error) {
13525
- const fullError = error.error;
13526
- const start = fullError.indexOf('{');
13527
- if (start >= 0) {
13528
- const json = fullError.substring(start, fullError.length - 1).split('<EOL>').join('');
13529
- const obj = JSON.parse(json);
13530
- if (obj?.error) {
13531
- errorMsg = obj.error;
13590
+ switch (error.status) {
13591
+ case 0:
13592
+ case 502:
13593
+ return WriteDocumentFieldComponent.UPLOAD_ERROR_NOT_AVAILABLE;
13594
+ case 422:
13595
+ {
13596
+ let errorMsg = WriteDocumentFieldComponent.ERROR_UPLOADING_FILE;
13597
+ if (error?.error) {
13598
+ const fullError = error.error;
13599
+ const start = fullError.indexOf('{');
13600
+ if (start >= 0) {
13601
+ const json = fullError.substring(start, fullError.length - 1).split('<EOL>').join('');
13602
+ const obj = JSON.parse(json);
13603
+ if (obj?.error) {
13604
+ errorMsg = obj.error;
13605
+ }
13606
+ }
13607
+ }
13608
+ return errorMsg;
13532
13609
  }
13533
- }
13610
+ case 429:
13611
+ return error?.error;
13612
+ default:
13613
+ return WriteDocumentFieldComponent.ERROR_UPLOADING_FILE;
13534
13614
  }
13535
- return errorMsg;
13536
13615
  }
13537
13616
  buildDocumentUploadData(selectedFile) {
13538
13617
  const documentUpload = new FormData();
@@ -13584,9 +13663,11 @@ WriteDocumentFieldComponent.DOCUMENT_URL = 'document_url';
13584
13663
  WriteDocumentFieldComponent.DOCUMENT_BINARY_URL = 'document_binary_url';
13585
13664
  WriteDocumentFieldComponent.DOCUMENT_FILENAME = 'document_filename';
13586
13665
  WriteDocumentFieldComponent.DOCUMENT_HASH = 'document_hash';
13666
+ WriteDocumentFieldComponent.UPLOAD_TIMESTAMP = 'upload_timestamp';
13587
13667
  WriteDocumentFieldComponent.UPLOAD_ERROR_FILE_REQUIRED = 'File required';
13588
13668
  WriteDocumentFieldComponent.UPLOAD_ERROR_NOT_AVAILABLE = 'Document upload facility is not available at the moment';
13589
13669
  WriteDocumentFieldComponent.UPLOAD_WAITING_FILE_STATUS = 'Uploading...';
13670
+ WriteDocumentFieldComponent.ERROR_UPLOADING_FILE = 'Error Uploading File';
13590
13671
  WriteDocumentFieldComponent.ɵfac = function WriteDocumentFieldComponent_Factory(t) { return new (t || WriteDocumentFieldComponent)(i0.ɵɵdirectiveInject(AbstractAppConfig), i0.ɵɵdirectiveInject(CaseNotifier), i0.ɵɵdirectiveInject(DocumentManagementService), i0.ɵɵdirectiveInject(i1$3.MatLegacyDialog), i0.ɵɵdirectiveInject(FileUploadStateService), i0.ɵɵdirectiveInject(JurisdictionService)); };
13591
13672
  WriteDocumentFieldComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: WriteDocumentFieldComponent, selectors: [["ccd-write-document-field"]], viewQuery: function WriteDocumentFieldComponent_Query(rf, ctx) { if (rf & 1) {
13592
13673
  i0.ɵɵviewQuery(_c0$Q, 5);
@@ -20934,10 +21015,10 @@ CaseFileViewFolderSelectorComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent
20934
21015
  i0.ɵɵtextInterpolate1("Where do you want to move \"", ctx.data.document.document_filename, "\" file?");
20935
21016
  i0.ɵɵadvance(2);
20936
21017
  i0.ɵɵproperty("ngForOf", ctx.currentCategories);
20937
- } }, dependencies: [i4.NgForOf, i4.NgTemplateOutlet], styles: [":host{position:relative;display:block}.folders{margin-bottom:20px}.folder{display:none;border-top:1px solid #CCC;margin:0 0 -1px}.folder:last-child{border-bottom:1px solid #CCC}.folders>.folder{display:block}input:checked~.folder{display:block}.iconImg{position:relative;display:inline-block;height:28px}.folder>.folder{margin-left:20px}.folder label:before{top:3px}.folder label:after{top:13px}p{font-weight:700}button{margin-right:20px}.close{float:right;width:30px;height:30px;background:url(/assets/img/x.PNG) no-repeat center center;cursor:pointer}.cancel{cursor:pointer}.cdk-overlay-pane{overflow:auto}.cdk-overlay-pane::-webkit-scrollbar{width:7px}.cdk-overlay-pane::-webkit-scrollbar-thumb{border:4px solid rgba(0,0,0,0);background-clip:padding-box;border-radius:9999px;background-color:#aaa}.cdk-overlay-pane::-webkit-scrollbar-button{display:none}.cdk-overlay-pane::-webkit-scrollbar-track-piece{background:#EEE}.cdk-overlay-pane::-webkit-scrollbar-thumb{background:#CCC}\n"], encapsulation: 2 });
21018
+ } }, dependencies: [i4.NgForOf, i4.NgTemplateOutlet], styles: [":host{position:relative;display:block}.folders{margin-bottom:20px}.folder{display:none;border-top:1px solid #CCC;margin:0 0 -1px}.folder:last-child{border-bottom:1px solid #CCC}.folders>.folder{display:block}input:checked~.folder{display:block}.iconImg{position:relative;display:inline-block;height:28px}.folder>.folder{margin-left:20px}.folder label:before{top:3px}.folder label:after{top:13px}p{font-weight:700}button{margin-right:20px}.close{float:right;width:30px;height:30px;background:url(/assets/img/x.PNG) no-repeat center center;cursor:pointer}.cancel{cursor:pointer}.cdk-overlay-pane{overflow:auto;background:#fff}.cdk-overlay-pane::-webkit-scrollbar{width:7px}.cdk-overlay-pane::-webkit-scrollbar-thumb{border:4px solid rgba(0,0,0,0);background-clip:padding-box;border-radius:9999px;background-color:#aaa}.cdk-overlay-pane::-webkit-scrollbar-button{display:none}.cdk-overlay-pane::-webkit-scrollbar-track-piece{background:#EEE}.cdk-overlay-pane::-webkit-scrollbar-thumb{background:#CCC}\n"], encapsulation: 2 });
20938
21019
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CaseFileViewFolderSelectorComponent, [{
20939
21020
  type: Component,
20940
- args: [{ selector: 'xui-case-file-view-folder-selector', encapsulation: ViewEncapsulation.None, template: "<div class=\"close\" (click)=\"cancel()\"></div>\n<h2 class=\"govuk-heading-l\">Move File</h2>\n<p>Where do you want to move \"{{ data.document.document_filename }}\" file?</p>\n<div class=\"folders govuk-radios govuk-radios--conditional\">\n <ng-container *ngFor=\"let cat of currentCategories\">\n <ng-container *ngTemplateOutlet=\"folder;context:{cat:cat,level:1}\"></ng-container>\n </ng-container>\n</div>\n<div class=\"govuk-button-group\">\n <button class=\"button button-primary\" type=\"button\" (click)=\"save()\">Save</button>\n <a (click)=\"cancel()\" class=\"cancel\">Cancel</a>\n</div>\n\n<ng-template #folder let-cat=\"cat\" let-level=\"level\">\n <div class=\"folder govuk-radios__item\">\n <input class=\"govuk-radios__input\" type=\"radio\" name=\"level-{{level}}\" [id]=\"cat.category_id\" (click)=\"handleChange($event)\" />\n <label class=\"govuk-label govuk-radios__label\" [for]=\"cat.category_id\">\n <img class=\"iconImg\" src=\"/assets/images/folder.png\" alt=\"Folder icon\" />\n {{ cat.category_name }}\n </label>\n <ng-container *ngFor=\"let subcat of cat.sub_categories\">\n <ng-container *ngTemplateOutlet=\"folder;context:{cat:subcat,level:level+1}\"></ng-container>\n </ng-container>\n </div>\n</ng-template>", styles: [":host{position:relative;display:block}.folders{margin-bottom:20px}.folder{display:none;border-top:1px solid #CCC;margin:0 0 -1px}.folder:last-child{border-bottom:1px solid #CCC}.folders>.folder{display:block}input:checked~.folder{display:block}.iconImg{position:relative;display:inline-block;height:28px}.folder>.folder{margin-left:20px}.folder label:before{top:3px}.folder label:after{top:13px}p{font-weight:700}button{margin-right:20px}.close{float:right;width:30px;height:30px;background:url(/assets/img/x.PNG) no-repeat center center;cursor:pointer}.cancel{cursor:pointer}.cdk-overlay-pane{overflow:auto}.cdk-overlay-pane::-webkit-scrollbar{width:7px}.cdk-overlay-pane::-webkit-scrollbar-thumb{border:4px solid rgba(0,0,0,0);background-clip:padding-box;border-radius:9999px;background-color:#aaa}.cdk-overlay-pane::-webkit-scrollbar-button{display:none}.cdk-overlay-pane::-webkit-scrollbar-track-piece{background:#EEE}.cdk-overlay-pane::-webkit-scrollbar-thumb{background:#CCC}\n"] }]
21021
+ args: [{ selector: 'xui-case-file-view-folder-selector', encapsulation: ViewEncapsulation.None, template: "<div class=\"close\" (click)=\"cancel()\"></div>\n<h2 class=\"govuk-heading-l\">Move File</h2>\n<p>Where do you want to move \"{{ data.document.document_filename }}\" file?</p>\n<div class=\"folders govuk-radios govuk-radios--conditional\">\n <ng-container *ngFor=\"let cat of currentCategories\">\n <ng-container *ngTemplateOutlet=\"folder;context:{cat:cat,level:1}\"></ng-container>\n </ng-container>\n</div>\n<div class=\"govuk-button-group\">\n <button class=\"button button-primary\" type=\"button\" (click)=\"save()\">Save</button>\n <a (click)=\"cancel()\" class=\"cancel\">Cancel</a>\n</div>\n\n<ng-template #folder let-cat=\"cat\" let-level=\"level\">\n <div class=\"folder govuk-radios__item\">\n <input class=\"govuk-radios__input\" type=\"radio\" name=\"level-{{level}}\" [id]=\"cat.category_id\" (click)=\"handleChange($event)\" />\n <label class=\"govuk-label govuk-radios__label\" [for]=\"cat.category_id\">\n <img class=\"iconImg\" src=\"/assets/images/folder.png\" alt=\"Folder icon\" />\n {{ cat.category_name }}\n </label>\n <ng-container *ngFor=\"let subcat of cat.sub_categories\">\n <ng-container *ngTemplateOutlet=\"folder;context:{cat:subcat,level:level+1}\"></ng-container>\n </ng-container>\n </div>\n</ng-template>", styles: [":host{position:relative;display:block}.folders{margin-bottom:20px}.folder{display:none;border-top:1px solid #CCC;margin:0 0 -1px}.folder:last-child{border-bottom:1px solid #CCC}.folders>.folder{display:block}input:checked~.folder{display:block}.iconImg{position:relative;display:inline-block;height:28px}.folder>.folder{margin-left:20px}.folder label:before{top:3px}.folder label:after{top:13px}p{font-weight:700}button{margin-right:20px}.close{float:right;width:30px;height:30px;background:url(/assets/img/x.PNG) no-repeat center center;cursor:pointer}.cancel{cursor:pointer}.cdk-overlay-pane{overflow:auto;background:#fff}.cdk-overlay-pane::-webkit-scrollbar{width:7px}.cdk-overlay-pane::-webkit-scrollbar-thumb{border:4px solid rgba(0,0,0,0);background-clip:padding-box;border-radius:9999px;background-color:#aaa}.cdk-overlay-pane::-webkit-scrollbar-button{display:none}.cdk-overlay-pane::-webkit-scrollbar-track-piece{background:#EEE}.cdk-overlay-pane::-webkit-scrollbar-thumb{background:#CCC}\n"] }]
20941
21022
  }], function () { return [{ type: i1$3.MatLegacyDialogRef }, { type: undefined, decorators: [{
20942
21023
  type: Inject,
20943
21024
  args: [MAT_LEGACY_DIALOG_DATA]
@@ -21274,9 +21355,10 @@ function CaseFileViewFolderComponent_div_8_cdk_nested_tree_node_4_Template(rf, c
21274
21355
  i0.ɵɵelement(6, "br");
21275
21356
  i0.ɵɵelementStart(7, "span", 17);
21276
21357
  i0.ɵɵtext(8);
21358
+ i0.ɵɵpipe(9, "date");
21277
21359
  i0.ɵɵelementEnd()();
21278
- i0.ɵɵelementStart(9, "div", 18)(10, "ccd-case-file-view-folder-document-actions", 19);
21279
- i0.ɵɵlistener("changeFolderAction", function CaseFileViewFolderComponent_div_8_cdk_nested_tree_node_4_Template_ccd_case_file_view_folder_document_actions_changeFolderAction_10_listener() { const restoredCtx = i0.ɵɵrestoreView(_r6); const node_r4 = restoredCtx.$implicit; const ctx_r7 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r7.triggerDocumentAction("changeFolder", node_r4)); })("openInANewTabAction", function CaseFileViewFolderComponent_div_8_cdk_nested_tree_node_4_Template_ccd_case_file_view_folder_document_actions_openInANewTabAction_10_listener() { const restoredCtx = i0.ɵɵrestoreView(_r6); const node_r4 = restoredCtx.$implicit; const ctx_r8 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r8.triggerDocumentAction("openInANewTab", node_r4)); })("downloadAction", function CaseFileViewFolderComponent_div_8_cdk_nested_tree_node_4_Template_ccd_case_file_view_folder_document_actions_downloadAction_10_listener() { const restoredCtx = i0.ɵɵrestoreView(_r6); const node_r4 = restoredCtx.$implicit; const ctx_r9 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r9.triggerDocumentAction("download", node_r4)); })("printAction", function CaseFileViewFolderComponent_div_8_cdk_nested_tree_node_4_Template_ccd_case_file_view_folder_document_actions_printAction_10_listener() { const restoredCtx = i0.ɵɵrestoreView(_r6); const node_r4 = restoredCtx.$implicit; const ctx_r10 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r10.triggerDocumentAction("print", node_r4)); });
21360
+ i0.ɵɵelementStart(10, "div", 18)(11, "ccd-case-file-view-folder-document-actions", 19);
21361
+ i0.ɵɵlistener("changeFolderAction", function CaseFileViewFolderComponent_div_8_cdk_nested_tree_node_4_Template_ccd_case_file_view_folder_document_actions_changeFolderAction_11_listener() { const restoredCtx = i0.ɵɵrestoreView(_r6); const node_r4 = restoredCtx.$implicit; const ctx_r7 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r7.triggerDocumentAction("changeFolder", node_r4)); })("openInANewTabAction", function CaseFileViewFolderComponent_div_8_cdk_nested_tree_node_4_Template_ccd_case_file_view_folder_document_actions_openInANewTabAction_11_listener() { const restoredCtx = i0.ɵɵrestoreView(_r6); const node_r4 = restoredCtx.$implicit; const ctx_r8 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r8.triggerDocumentAction("openInANewTab", node_r4)); })("downloadAction", function CaseFileViewFolderComponent_div_8_cdk_nested_tree_node_4_Template_ccd_case_file_view_folder_document_actions_downloadAction_11_listener() { const restoredCtx = i0.ɵɵrestoreView(_r6); const node_r4 = restoredCtx.$implicit; const ctx_r9 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r9.triggerDocumentAction("download", node_r4)); })("printAction", function CaseFileViewFolderComponent_div_8_cdk_nested_tree_node_4_Template_ccd_case_file_view_folder_document_actions_printAction_11_listener() { const restoredCtx = i0.ɵɵrestoreView(_r6); const node_r4 = restoredCtx.$implicit; const ctx_r10 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r10.triggerDocumentAction("print", node_r4)); });
21280
21362
  i0.ɵɵelementEnd()()()();
21281
21363
  } if (rf & 2) {
21282
21364
  const node_r4 = ctx.$implicit;
@@ -21286,8 +21368,8 @@ function CaseFileViewFolderComponent_div_8_cdk_nested_tree_node_4_Template(rf, c
21286
21368
  i0.ɵɵadvance(4);
21287
21369
  i0.ɵɵtextInterpolate1(" ", node_r4.name, " ");
21288
21370
  i0.ɵɵadvance(3);
21289
- i0.ɵɵtextInterpolate(node_r4.upload_timestamp);
21290
- i0.ɵɵadvance(2);
21371
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(9, 5, node_r4.upload_timestamp, "dd MMM YYYY"));
21372
+ i0.ɵɵadvance(3);
21291
21373
  i0.ɵɵproperty("allowMoving", ctx_r2.allowMoving);
21292
21374
  } }
21293
21375
  function CaseFileViewFolderComponent_div_8_cdk_nested_tree_node_5_Template(rf, ctx) { if (rf & 1) {
@@ -21320,7 +21402,7 @@ function CaseFileViewFolderComponent_div_8_Template(rf, ctx) { if (rf & 1) {
21320
21402
  i0.ɵɵelementStart(0, "div", 7);
21321
21403
  i0.ɵɵtemplate(1, CaseFileViewFolderComponent_div_8_div_1_Template, 2, 0, "div", 8);
21322
21404
  i0.ɵɵelementStart(2, "div")(3, "cdk-tree", 9);
21323
- i0.ɵɵtemplate(4, CaseFileViewFolderComponent_div_8_cdk_nested_tree_node_4_Template, 11, 5, "cdk-nested-tree-node", 10);
21405
+ i0.ɵɵtemplate(4, CaseFileViewFolderComponent_div_8_cdk_nested_tree_node_4_Template, 12, 8, "cdk-nested-tree-node", 10);
21324
21406
  i0.ɵɵtemplate(5, CaseFileViewFolderComponent_div_8_cdk_nested_tree_node_5_Template, 10, 6, "cdk-nested-tree-node", 11);
21325
21407
  i0.ɵɵelementEnd()()();
21326
21408
  } if (rf & 2) {
@@ -21391,10 +21473,11 @@ class CaseFileViewFolderComponent {
21391
21473
  newDocumentTreeNode.name = node.category_name;
21392
21474
  newDocumentTreeNode.type = DocumentTreeNodeType.FOLDER;
21393
21475
  newDocumentTreeNode.children = [...this.generateTreeData(node.sub_categories), ...this.getDocuments(node.documents)];
21476
+ newDocumentTreeNode.category_order = node.category_order;
21394
21477
  return [
21395
21478
  ...tree,
21396
21479
  newDocumentTreeNode,
21397
- ];
21480
+ ].sort((a, b) => a.category_order - b.category_order);
21398
21481
  }, []);
21399
21482
  }
21400
21483
  getDocuments(documents) {
@@ -21407,7 +21490,7 @@ class CaseFileViewFolderComponent {
21407
21490
  documentTreeNode.document_binary_url = document.document_binary_url;
21408
21491
  documentTreeNode.attribute_path = document.attribute_path;
21409
21492
  documentTreeNode.upload_timestamp = this.appConfig.getEnableCaseFileViewVersion1_1()
21410
- && document.upload_timestamp ? moment$1(document.upload_timestamp).format('DD MMM YYYY') : '';
21493
+ && document.upload_timestamp ? moment$1(document.upload_timestamp).format('DD MMM YYYY HH:mm:ss') : '';
21411
21494
  documentsToReturn.push(documentTreeNode);
21412
21495
  });
21413
21496
  return documentsToReturn;
@@ -21422,7 +21505,7 @@ class CaseFileViewFolderComponent {
21422
21505
  documentTreeNode.document_binary_url = document.document_binary_url;
21423
21506
  documentTreeNode.attribute_path = document.attribute_path;
21424
21507
  documentTreeNode.upload_timestamp = this.appConfig.getEnableCaseFileViewVersion1_1()
21425
- && document.upload_timestamp ? moment$1(document.upload_timestamp).format('DD MMM YYYY') : '';
21508
+ && document.upload_timestamp ? moment$1(document.upload_timestamp).format('DD MMM YYYY HH:mm:ss') : '';
21426
21509
  documents.push(documentTreeNode);
21427
21510
  });
21428
21511
  const uncategorisedNode = new DocumentTreeNode();
@@ -21542,7 +21625,7 @@ CaseFileViewFolderComponent.UNCATEGORISED_DOCUMENTS_TITLE = 'Uncategorised docum
21542
21625
  CaseFileViewFolderComponent.DOCUMENT_SEARCH_FORM_CONTROL_NAME = 'documentSearchFormControl';
21543
21626
  CaseFileViewFolderComponent.MINIMUM_SEARCH_CHARACTERS = 1;
21544
21627
  CaseFileViewFolderComponent.ɵfac = function CaseFileViewFolderComponent_Factory(t) { return new (t || CaseFileViewFolderComponent)(i0.ɵɵdirectiveInject(WindowService), i0.ɵɵdirectiveInject(i1$1.Router), i0.ɵɵdirectiveInject(DocumentManagementService), i0.ɵɵdirectiveInject(i1$3.MatLegacyDialog), i0.ɵɵdirectiveInject(AbstractAppConfig)); };
21545
- CaseFileViewFolderComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CaseFileViewFolderComponent, selectors: [["ccd-case-file-view-folder"]], inputs: { categoriesAndDocuments: "categoriesAndDocuments", allowMoving: "allowMoving" }, outputs: { clickedDocument: "clickedDocument", moveDocument: "moveDocument" }, decls: 9, vars: 3, consts: [[1, "document-filter-container"], [1, "form-group", "document-filter", 3, "formGroup"], ["type", "search", "id", "document-search", "name", "documentSearchFormControl", "formControlName", "documentSearchFormControl", "placeholder", "Search by document name", 1, "form-control", "document-search"], [1, "document-folders-header"], [1, "document-folders-header__title"], [3, "sortAscending", "sortDescending"], ["class", "document-tree-container", 4, "ngIf"], [1, "document-tree-container"], [4, "ngIf"], [3, "dataSource", "treeControl"], ["class", "document-tree-container__node document-tree-container__node--document", 4, "cdkTreeNodeDef"], ["class", "document-tree-container__node document-tree-container__folder", 4, "cdkTreeNodeDef", "cdkTreeNodeDefWhen"], [1, "document-tree-container__node", "document-tree-container__node--document"], [1, "node", 3, "click"], ["disabled", "", 1, "node__icon"], ["src", "/assets/img/case-file-view/case-file-view-document.svg", "alt", "Document icon", 1, "node__iconImg"], [1, "node__name", "node-name-document"], [1, "node__document-upload-timestamp"], [1, "node__document-options"], [3, "allowMoving", "changeFolderAction", "openInANewTabAction", "downloadAction", "printAction"], [1, "document-tree-container__node", "document-tree-container__folder"], ["cdkTreeNodeToggle", "", 1, "node"], [1, "node__icon"], ["alt", "Folder icon", 1, "node__iconImg", 3, "src"], [1, "node__count"], [1, "node__name", "node__name--folder"], ["cdkTreeNodeOutlet", ""]], template: function CaseFileViewFolderComponent_Template(rf, ctx) { if (rf & 1) {
21628
+ CaseFileViewFolderComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CaseFileViewFolderComponent, selectors: [["ccd-case-file-view-folder"]], inputs: { categoriesAndDocuments: "categoriesAndDocuments", allowMoving: "allowMoving" }, outputs: { clickedDocument: "clickedDocument", moveDocument: "moveDocument" }, decls: 9, vars: 3, consts: [[1, "document-filter-container"], [1, "form-group", "document-filter", 3, "formGroup"], ["type", "search", "id", "document-search", "name", "documentSearchFormControl", "formControlName", "documentSearchFormControl", "placeholder", "Search by document name", "aria-label", "Search by document name", 1, "form-control", "document-search"], [1, "document-folders-header"], [1, "document-folders-header__title"], [3, "sortAscending", "sortDescending"], ["class", "document-tree-container", 4, "ngIf"], [1, "document-tree-container"], [4, "ngIf"], [3, "dataSource", "treeControl"], ["class", "document-tree-container__node document-tree-container__node--document", 4, "cdkTreeNodeDef"], ["class", "document-tree-container__node document-tree-container__folder", 4, "cdkTreeNodeDef", "cdkTreeNodeDefWhen"], [1, "document-tree-container__node", "document-tree-container__node--document"], [1, "node", 3, "click"], ["disabled", "", 1, "node__icon"], ["src", "/assets/img/case-file-view/case-file-view-document.svg", "alt", "Document icon", 1, "node__iconImg"], [1, "node__name", "node-name-document"], [1, "node__document-upload-timestamp"], [1, "node__document-options"], [3, "allowMoving", "changeFolderAction", "openInANewTabAction", "downloadAction", "printAction"], [1, "document-tree-container__node", "document-tree-container__folder"], ["cdkTreeNodeToggle", "", 1, "node"], [1, "node__icon"], ["alt", "Folder icon", 1, "node__iconImg", 3, "src"], [1, "node__count"], [1, "node__name", "node__name--folder"], ["cdkTreeNodeOutlet", ""]], template: function CaseFileViewFolderComponent_Template(rf, ctx) { if (rf & 1) {
21546
21629
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
21547
21630
  i0.ɵɵelement(2, "input", 2);
21548
21631
  i0.ɵɵelementEnd()();
@@ -21560,10 +21643,10 @@ CaseFileViewFolderComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type:
21560
21643
  i0.ɵɵtextInterpolate1("Documents (", ctx.documentCount, ")");
21561
21644
  i0.ɵɵadvance(3);
21562
21645
  i0.ɵɵproperty("ngIf", ctx.documentTreeData);
21563
- } }, dependencies: [i4.NgIf, i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgControlStatusGroup, i3.FormGroupDirective, i3.FormControlName, i7.CdkNestedTreeNode, i7.CdkTreeNodeDef, i7.CdkTreeNodeToggle, i7.CdkTree, i7.CdkTreeNodeOutlet, CaseFileViewFolderSortComponent, CaseFileViewFolderDocumentActionsComponent], styles: ["[_nghost-%COMP%]{display:flex;height:100%;flex-direction:column}[_nghost-%COMP%] .document-tree-container[_ngcontent-%COMP%]{flex:1 0}.document-filter-container[_ngcontent-%COMP%]{border-bottom:2px solid #C9C9C9}.document-filter-container[_ngcontent-%COMP%] .document-filter[_ngcontent-%COMP%]{padding:10px}.document-filter-container[_ngcontent-%COMP%] .document-filter[_ngcontent-%COMP%] .document-search[_ngcontent-%COMP%]{background:url(/assets/images/icon-search-black.svg) no-repeat right #FFF;background-position-x:calc(100% - 4px);padding-right:30px;width:100%}.document-filter-container[_ngcontent-%COMP%] .documents-title[_ngcontent-%COMP%]{height:30%;margin-left:8px;font-weight:700}.document-tree-container[_ngcontent-%COMP%]{padding:4px;overflow-x:hidden;overflow-y:scroll}.document-tree-container__node[_ngcontent-%COMP%]{display:block}.document-tree-container__node[_ngcontent-%COMP%] .document-tree-container__node[_ngcontent-%COMP%]{padding-left:40px}.document-tree-container[_ngcontent-%COMP%] .document-tree-invisible[_ngcontent-%COMP%]{display:none}.document-tree-container[_ngcontent-%COMP%]::-webkit-scrollbar{width:7px}.document-tree-container[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{border:4px solid rgba(0,0,0,0);background-clip:padding-box;border-radius:9999px;background-color:#aaa}.document-tree-container[_ngcontent-%COMP%]::-webkit-scrollbar-button{display:none}.document-tree-container[_ngcontent-%COMP%]::-webkit-scrollbar-track-piece{background:#EEE}.document-tree-container[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:#CCC}.document-folders-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;border-bottom:2px solid #C9C9C9;padding:10px}.document-folders-header__title[_ngcontent-%COMP%]{font-weight:700}.node[_ngcontent-%COMP%]{display:flex;align-items:center;width:100%;padding:10px;background:none;border:0;cursor:pointer;white-space:nowrap}.node--selected[_ngcontent-%COMP%]{background:#fff2cc}.node__icon[_ngcontent-%COMP%]{position:relative;display:inline-block}.node__count[_ngcontent-%COMP%]{color:#fff;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:.875rem;padding-top:4px}.node__iconImg[_ngcontent-%COMP%]{display:block;height:30px;width:30px}.node__name[_ngcontent-%COMP%]{margin-left:6px;font-size:1rem;overflow:hidden;text-overflow:ellipsis}.node__document-options[_ngcontent-%COMP%]{margin-left:auto;margin-right:0}.node__document-upload-timestamp[_ngcontent-%COMP%]{font-size:.8rem;float:left;padding-left:10px}"] });
21646
+ } }, dependencies: [i4.NgIf, i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgControlStatusGroup, i3.FormGroupDirective, i3.FormControlName, i7.CdkNestedTreeNode, i7.CdkTreeNodeDef, i7.CdkTreeNodeToggle, i7.CdkTree, i7.CdkTreeNodeOutlet, CaseFileViewFolderSortComponent, CaseFileViewFolderDocumentActionsComponent, i4.DatePipe], styles: ["[_nghost-%COMP%]{display:flex;height:100%;flex-direction:column}[_nghost-%COMP%] .document-tree-container[_ngcontent-%COMP%]{flex:1 0}.document-filter-container[_ngcontent-%COMP%]{border-bottom:2px solid #C9C9C9}.document-filter-container[_ngcontent-%COMP%] .document-filter[_ngcontent-%COMP%]{padding:10px}.document-filter-container[_ngcontent-%COMP%] .document-filter[_ngcontent-%COMP%] .document-search[_ngcontent-%COMP%]{background:url(/assets/images/icon-search-black.svg) no-repeat right #FFF;background-position-x:calc(100% - 4px);padding-right:30px;width:100%}.document-filter-container[_ngcontent-%COMP%] .documents-title[_ngcontent-%COMP%]{height:30%;margin-left:8px;font-weight:700}.document-tree-container[_ngcontent-%COMP%]{padding:4px;overflow-x:hidden;overflow-y:scroll}.document-tree-container__node[_ngcontent-%COMP%]{display:block}.document-tree-container__node[_ngcontent-%COMP%] .document-tree-container__node[_ngcontent-%COMP%]{padding-left:40px}.document-tree-container[_ngcontent-%COMP%] .document-tree-invisible[_ngcontent-%COMP%]{display:none}.document-tree-container[_ngcontent-%COMP%]::-webkit-scrollbar{width:7px}.document-tree-container[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{border:4px solid rgba(0,0,0,0);background-clip:padding-box;border-radius:9999px;background-color:#aaa}.document-tree-container[_ngcontent-%COMP%]::-webkit-scrollbar-button{display:none}.document-tree-container[_ngcontent-%COMP%]::-webkit-scrollbar-track-piece{background:#EEE}.document-tree-container[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:#CCC}.document-folders-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;border-bottom:2px solid #C9C9C9;padding:10px}.document-folders-header__title[_ngcontent-%COMP%]{font-weight:700}.node[_ngcontent-%COMP%]{display:flex;align-items:center;width:100%;padding:10px;background:none;border:0;cursor:pointer;white-space:nowrap}.node--selected[_ngcontent-%COMP%]{background:#fff2cc}.node__icon[_ngcontent-%COMP%]{position:relative;display:inline-block}.node__count[_ngcontent-%COMP%]{color:#fff;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:.875rem;padding-top:4px}.node__iconImg[_ngcontent-%COMP%]{display:block;height:30px;width:30px}.node__name[_ngcontent-%COMP%]{margin-left:6px;font-size:1rem;overflow:hidden;text-overflow:ellipsis}.node__document-options[_ngcontent-%COMP%]{margin-left:auto;margin-right:0}.node__document-upload-timestamp[_ngcontent-%COMP%]{font-size:.8rem;float:left;padding-left:10px}"] });
21564
21647
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CaseFileViewFolderComponent, [{
21565
21648
  type: Component,
21566
- args: [{ selector: 'ccd-case-file-view-folder', template: "<div class=\"document-filter-container\">\n <div class=\"form-group document-filter\" [formGroup]=\"documentFilterFormGroup\">\n <input class=\"form-control document-search\"\n type=\"search\"\n id=\"document-search\"\n name=\"documentSearchFormControl\"\n formControlName=\"documentSearchFormControl\"\n placeholder=\"Search by document name\">\n </div>\n</div>\n\n<div class=\"document-folders-header\">\n <div class=\"document-folders-header__title\">Documents ({{ documentCount }})</div>\n <div>\n <ccd-case-file-view-folder-sort\n (sortAscending)=\"sortDataSourceAscending($event)\"\n (sortDescending)=\"sortDataSourceDescending($event)\"\n ></ccd-case-file-view-folder-sort>\n </div>\n</div>\n\n<div class=\"document-tree-container\" *ngIf=\"documentTreeData\">\n <div *ngIf=\"!nestedDataSource || nestedDataSource.length === 0\">\n No results found\n </div>\n <div>\n <cdk-tree [dataSource]=\"nestedDataSource\" [treeControl]=\"nestedTreeControl\">\n <!-- document -->\n <cdk-nested-tree-node class=\"document-tree-container__node document-tree-container__node--document\" *cdkTreeNodeDef=\"let node\">\n <button class=\"node\" (click)=\"selectedNodeItem = node; clickedDocument.emit(node)\"\n [class.node--selected]=\"selectedNodeItem?.name === node.name\">\n <div class=\"node__icon\" disabled>\n <img src=\"/assets/img/case-file-view/case-file-view-document.svg\" class=\"node__iconImg\" alt=\"Document icon\">\n </div>\n <span class=\"node__name node-name-document\">\n {{node.name}}\n <br>\n <span class=\"node__document-upload-timestamp\">{{node.upload_timestamp}}</span>\n </span>\n <div class=\"node__document-options\">\n <ccd-case-file-view-folder-document-actions\n (changeFolderAction)=\"triggerDocumentAction('changeFolder', node)\"\n (openInANewTabAction)=\"triggerDocumentAction('openInANewTab', node)\"\n (downloadAction)=\"triggerDocumentAction('download', node)\"\n (printAction)=\"triggerDocumentAction('print', node)\"\n [allowMoving]=\"allowMoving\"\n >\n </ccd-case-file-view-folder-document-actions>\n </div>\n </button>\n </cdk-nested-tree-node>\n <!-- folder-->\n <cdk-nested-tree-node class=\"document-tree-container__node document-tree-container__folder\" *cdkTreeNodeDef=\"let node; when: nestedChildren\">\n <button class=\"node\" cdkTreeNodeToggle>\n <div class=\"node__icon\" [attr.aria-label]=\"'toggle ' + node.name\" >\n <img class=\"node__iconImg\"\n [src]=\"nestedTreeControl.isExpanded(node) ? '/assets/images/folder-open.png' : '/assets/images/folder.png'\" alt=\"Folder icon\">\n <span class=\"node__count\">{{node.childDocumentCount}}</span>\n </div>\n <span class=\"node__name node__name--folder\">{{node.name}}</span>\n </button>\n\n <div [class.document-tree-invisible]=\"!nestedTreeControl.isExpanded(node)\">\n <ng-container cdkTreeNodeOutlet></ng-container>\n </div>\n </cdk-nested-tree-node>\n </cdk-tree>\n </div>\n</div>\n", styles: [":host{display:flex;height:100%;flex-direction:column}:host .document-tree-container{flex:1 0}.document-filter-container{border-bottom:2px solid #C9C9C9}.document-filter-container .document-filter{padding:10px}.document-filter-container .document-filter .document-search{background:url(/assets/images/icon-search-black.svg) no-repeat right #FFF;background-position-x:calc(100% - 4px);padding-right:30px;width:100%}.document-filter-container .documents-title{height:30%;margin-left:8px;font-weight:700}.document-tree-container{padding:4px;overflow-x:hidden;overflow-y:scroll}.document-tree-container__node{display:block}.document-tree-container__node .document-tree-container__node{padding-left:40px}.document-tree-container .document-tree-invisible{display:none}.document-tree-container::-webkit-scrollbar{width:7px}.document-tree-container::-webkit-scrollbar-thumb{border:4px solid rgba(0,0,0,0);background-clip:padding-box;border-radius:9999px;background-color:#aaa}.document-tree-container::-webkit-scrollbar-button{display:none}.document-tree-container::-webkit-scrollbar-track-piece{background:#EEE}.document-tree-container::-webkit-scrollbar-thumb{background:#CCC}.document-folders-header{display:flex;align-items:center;justify-content:space-between;border-bottom:2px solid #C9C9C9;padding:10px}.document-folders-header__title{font-weight:700}.node{display:flex;align-items:center;width:100%;padding:10px;background:none;border:0;cursor:pointer;white-space:nowrap}.node--selected{background:#fff2cc}.node__icon{position:relative;display:inline-block}.node__count{color:#fff;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:.875rem;padding-top:4px}.node__iconImg{display:block;height:30px;width:30px}.node__name{margin-left:6px;font-size:1rem;overflow:hidden;text-overflow:ellipsis}.node__document-options{margin-left:auto;margin-right:0}.node__document-upload-timestamp{font-size:.8rem;float:left;padding-left:10px}\n"] }]
21649
+ args: [{ selector: 'ccd-case-file-view-folder', template: "<div class=\"document-filter-container\">\n <div class=\"form-group document-filter\" [formGroup]=\"documentFilterFormGroup\">\n <input class=\"form-control document-search\"\n type=\"search\"\n id=\"document-search\"\n name=\"documentSearchFormControl\"\n formControlName=\"documentSearchFormControl\"\n placeholder=\"Search by document name\"\n aria-label=\"Search by document name\">\n </div>\n</div>\n\n<div class=\"document-folders-header\">\n <div class=\"document-folders-header__title\">Documents ({{ documentCount }})</div>\n <div>\n <ccd-case-file-view-folder-sort\n (sortAscending)=\"sortDataSourceAscending($event)\"\n (sortDescending)=\"sortDataSourceDescending($event)\"\n ></ccd-case-file-view-folder-sort>\n </div>\n</div>\n\n<div class=\"document-tree-container\" *ngIf=\"documentTreeData\">\n <div *ngIf=\"!nestedDataSource || nestedDataSource.length === 0\">\n No results found\n </div>\n <div>\n <cdk-tree [dataSource]=\"nestedDataSource\" [treeControl]=\"nestedTreeControl\">\n <!-- document -->\n <cdk-nested-tree-node class=\"document-tree-container__node document-tree-container__node--document\" *cdkTreeNodeDef=\"let node\">\n <button class=\"node\" (click)=\"selectedNodeItem = node; clickedDocument.emit(node)\"\n [class.node--selected]=\"selectedNodeItem?.name === node.name\">\n <div class=\"node__icon\" disabled>\n <img src=\"/assets/img/case-file-view/case-file-view-document.svg\" class=\"node__iconImg\" alt=\"Document icon\">\n </div>\n <span class=\"node__name node-name-document\">\n {{node.name}}\n <br>\n <span class=\"node__document-upload-timestamp\">{{node.upload_timestamp | date:\"dd MMM YYYY\"}}</span>\n </span>\n <div class=\"node__document-options\">\n <ccd-case-file-view-folder-document-actions\n (changeFolderAction)=\"triggerDocumentAction('changeFolder', node)\"\n (openInANewTabAction)=\"triggerDocumentAction('openInANewTab', node)\"\n (downloadAction)=\"triggerDocumentAction('download', node)\"\n (printAction)=\"triggerDocumentAction('print', node)\"\n [allowMoving]=\"allowMoving\"\n >\n </ccd-case-file-view-folder-document-actions>\n </div>\n </button>\n </cdk-nested-tree-node>\n <!-- folder-->\n <cdk-nested-tree-node class=\"document-tree-container__node document-tree-container__folder\" *cdkTreeNodeDef=\"let node; when: nestedChildren\">\n <button class=\"node\" cdkTreeNodeToggle>\n <div class=\"node__icon\" [attr.aria-label]=\"'toggle ' + node.name\" >\n <img class=\"node__iconImg\"\n [src]=\"nestedTreeControl.isExpanded(node) ? '/assets/images/folder-open.png' : '/assets/images/folder.png'\" alt=\"Folder icon\">\n <span class=\"node__count\">{{node.childDocumentCount}}</span>\n </div>\n <span class=\"node__name node__name--folder\">{{node.name}}</span>\n </button>\n\n <div [class.document-tree-invisible]=\"!nestedTreeControl.isExpanded(node)\">\n <ng-container cdkTreeNodeOutlet></ng-container>\n </div>\n </cdk-nested-tree-node>\n </cdk-tree>\n </div>\n</div>\n", styles: [":host{display:flex;height:100%;flex-direction:column}:host .document-tree-container{flex:1 0}.document-filter-container{border-bottom:2px solid #C9C9C9}.document-filter-container .document-filter{padding:10px}.document-filter-container .document-filter .document-search{background:url(/assets/images/icon-search-black.svg) no-repeat right #FFF;background-position-x:calc(100% - 4px);padding-right:30px;width:100%}.document-filter-container .documents-title{height:30%;margin-left:8px;font-weight:700}.document-tree-container{padding:4px;overflow-x:hidden;overflow-y:scroll}.document-tree-container__node{display:block}.document-tree-container__node .document-tree-container__node{padding-left:40px}.document-tree-container .document-tree-invisible{display:none}.document-tree-container::-webkit-scrollbar{width:7px}.document-tree-container::-webkit-scrollbar-thumb{border:4px solid rgba(0,0,0,0);background-clip:padding-box;border-radius:9999px;background-color:#aaa}.document-tree-container::-webkit-scrollbar-button{display:none}.document-tree-container::-webkit-scrollbar-track-piece{background:#EEE}.document-tree-container::-webkit-scrollbar-thumb{background:#CCC}.document-folders-header{display:flex;align-items:center;justify-content:space-between;border-bottom:2px solid #C9C9C9;padding:10px}.document-folders-header__title{font-weight:700}.node{display:flex;align-items:center;width:100%;padding:10px;background:none;border:0;cursor:pointer;white-space:nowrap}.node--selected{background:#fff2cc}.node__icon{position:relative;display:inline-block}.node__count{color:#fff;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:.875rem;padding-top:4px}.node__iconImg{display:block;height:30px;width:30px}.node__name{margin-left:6px;font-size:1rem;overflow:hidden;text-overflow:ellipsis}.node__document-options{margin-left:auto;margin-right:0}.node__document-upload-timestamp{font-size:.8rem;float:left;padding-left:10px}\n"] }]
21567
21650
  }], function () { return [{ type: WindowService }, { type: i1$1.Router }, { type: DocumentManagementService }, { type: i1$3.MatLegacyDialog }, { type: AbstractAppConfig }]; }, { categoriesAndDocuments: [{
21568
21651
  type: Input
21569
21652
  }], allowMoving: [{
@@ -30875,7 +30958,7 @@ function CaseFullAccessViewComponent_ng_container_12_mat_tab_4_ng_template_2_Tem
30875
30958
  const tab_r20 = i0.ɵɵnextContext().$implicit;
30876
30959
  const ctx_r22 = i0.ɵɵnextContext(2);
30877
30960
  i0.ɵɵclassMap(tab_r20.id);
30878
- i0.ɵɵattribute("aria-describedby", i0.ɵɵpipeBind1(1, 4, "case viewer table"));
30961
+ i0.ɵɵattribute("aria-label", i0.ɵɵpipeBind1(1, 4, "case viewer table"));
30879
30962
  i0.ɵɵadvance(3);
30880
30963
  i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBindV(4, 6, i0.ɵɵpureFunction2(14, _c1$3, i0.ɵɵpipeBind1(5, 12, tab_r20), ctx_r22.formGroup.controls["data"])));
30881
30964
  } }
@@ -31340,7 +31423,7 @@ CaseFullAccessViewComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type:
31340
31423
  } }, styles: ["th[_ngcontent-%COMP%]{width:1%;white-space:nowrap;vertical-align:top}.compound-field[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{padding:0}.case-viewer-controls[_ngcontent-%COMP%]{margin-top:47px;margin-bottom:20px}ccd-case-header[_ngcontent-%COMP%]{float:left;margin-right:10px}ccd-event-trigger[_ngcontent-%COMP%]{float:right}.case-viewer-label[_ngcontent-%COMP%]{min-width:300px;white-space:normal}.markdown[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin-bottom:0}"] });
31341
31424
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CaseFullAccessViewComponent, [{
31342
31425
  type: Component,
31343
- args: [{ selector: 'ccd-case-full-access-view', template: "<!-- Generic error heading and error message to be displayed only if there are no specific callback errors or warnings, or no error details -->\n<div *ngIf=\"error && !(error.callbackErrors || error.callbackWarnings || error.details)\" class=\"error-summary\"\n role=\"group\" aria-labelledby=\"edit-case-event_error-summary-heading\" tabindex=\"-1\">\n <h1 class=\"heading-h1 error-summary-heading\" id=\"edit-case-event_error-summary-heading\">\n {{'Something went wrong' | rpxTranslate}}\n </h1>\n <div class=\"govuk-error-summary__body\" id=\"edit-case-event_error-summary-body\">\n <p>{{\"We're working to fix the problem. Try again shortly.\" | rpxTranslate}}</p>\n <p>\n <a href=\"get-help\" target=\"_blank\">\n {{\"Contact us\" | rpxTranslate}}</a> {{\"if you're still having problems.\" | rpxTranslate}}\n </p>\n </div>\n</div>\n<!-- Callback error heading and error message to be displayed if there are specific error details -->\n<div *ngIf=\"error && error.details\" class=\"error-summary\" role=\"group\"\n aria-labelledby=\"edit-case-event_error-summary-heading\" tabindex=\"-1\">\n <h2 class=\"heading-h2 error-summary-heading\" id=\"edit-case-event_error-summary-heading\">\n {{'The callback data failed validation' | rpxTranslate}}\n </h2>\n <p>{{error.message | rpxTranslate}}</p>\n <ul *ngIf=\"error.details?.field_errors\" class=\"error-summary-list\">\n <li *ngFor=\"let fieldError of error.details.field_errors\">\n {{fieldError.message | rpxTranslate}}\n </li>\n </ul>\n</div>\n<ccd-callback-errors\n [triggerTextContinue]=\"triggerTextStart\"\n [triggerTextIgnore]=\"triggerTextIgnoreWarnings\"\n [callbackErrorsSubject]=\"callbackErrorsSubject\"\n (callbackErrorsContext)=\"callbackErrorsNotify($event)\">\n</ccd-callback-errors>\n<ccd-activity [caseId]=\"caseDetails.case_id\" [displayMode]=\"BANNER\"></ccd-activity>\n<div class=\"grid-row\">\n <div class=\"column-one-half\">\n <ccd-case-header [caseDetails]=\"caseDetails\"></ccd-case-header>\n <div class=\"case-viewer-controls\" *ngIf=\"hasPrint && !isDraft() && isPrintEnabled()\">\n <a id=\"case-viewer-control-print\" routerLink=\"print\" class=\"button button-secondary\">{{'Print' | rpxTranslate}}</a>\n </div>\n </div>\n <div *ngIf=\"hasEventSelector\" class=\"column-one-half\">\n <ccd-event-trigger [isDisabled]=\"isTriggerButtonDisabled()\" [triggers]=\"caseDetails.triggers\"\n [triggerText]=\"triggerText\" (onTriggerChange)=\"clearErrorsAndWarnings()\"\n (onTriggerSubmit)=\"applyTrigger($event)\"></ccd-event-trigger>\n </div>\n</div>\n<div class=\"grid-row\" *ngIf=\"activeCaseFlags && !caseFlagsExternalUser\">\n <div class=\"column-full\">\n <ccd-notification-banner [notificationBannerConfig]=\"notificationBannerConfig\" (linkClicked)=\"onLinkClicked($event)\">\n </ccd-notification-banner>\n </div>\n</div>\n<div class=\"grid-row\">\n <div class=\"column-full\">\n <ng-container *ngIf=\"hasTabsPresent()\">\n <mat-tab-group #tabGroup animationDuration=\"0ms\" (selectedIndexChange)=\"tabChanged($event)\" [disableRipple]=\"true\"\n [selectedIndex]=\"selectedTabIndex\">\n <mat-tab *ngFor=\"let tab of prependedTabs\" [id]=\"tab.id\" [label]=\"tab.label | rpxTranslate\">\n </mat-tab>\n <mat-tab *ngFor=\"let tab of sortedTabs; let curIdx=index\" [id]=\"tab.id\" [label]=\"tab.label | rpxTranslate\">\n <ng-template matTabContent>\n <table [class]=\"tab.id\" [attr.aria-describedby]=\"'case viewer table' | rpxTranslate\">\n <tbody>\n <ng-container *ngFor=\"let field of tab | ccdTabFields | ccdReadFieldsFilter:false :undefined :true : formGroup.controls['data']\">\n <div ccdLabelSubstitutor [caseField]=\"field\" [contextFields]=\"caseFields\" [hidden]=\"field.hidden\">\n <ng-container [ngSwitch]=\"!(field | ccdIsCompound)\">\n <tr *ngSwitchCase=\"true\">\n <th id=\"case-viewer-field-label\" *ngIf=\"!isFieldToHaveNoLabel(field)\">\n <div class=\"case-viewer-label text-16\">\n {{field.label | rpxTranslate}}</div>\n </th>\n <td [id]=\"'case-viewer-field-read--' + field.id\" scope=\"col\">\n <span class=\"text-16\">\n <ccd-field-read [topLevelFormGroup]=\"formGroup.controls['data']\"\n [caseField]=\"field\" [caseReference]=\"caseDetails.case_id\"\n [markdownUseHrefAsRouterLink]=\"markdownUseHrefAsRouterLink\">\n </ccd-field-read>\n </span>\n </td>\n </tr>\n <tr *ngSwitchCase=\"false\" class=\"compound-field\">\n <th [id]=\"'case-viewer-field-read--' + field.id\" scope=\"col\">\n <span class=\"text-16\">\n <ccd-field-read [topLevelFormGroup]=\"formGroup.controls['data']\"\n [caseField]=\"field\" [caseReference]=\"caseDetails.case_id\"\n [markdownUseHrefAsRouterLink]=\"markdownUseHrefAsRouterLink\">\n </ccd-field-read>\n </span>\n </th>\n </tr>\n </ng-container>\n </div>\n </ng-container>\n </tbody>\n </table>\n </ng-template>\n </mat-tab>\n <mat-tab *ngFor=\"let tab of appendedTabs\" [id]=\"tab.id\" [label]=\"tab.label | rpxTranslate\">\n </mat-tab>\n </mat-tab-group>\n <router-outlet *ngIf=\"(prependedTabs && prependedTabs.length) || (appendedTabs && appendedTabs.length)\"></router-outlet>\n </ng-container>\n </div>\n</div>\n", styles: ["th{width:1%;white-space:nowrap;vertical-align:top}.compound-field th{padding:0}.case-viewer-controls{margin-top:47px;margin-bottom:20px}ccd-case-header{float:left;margin-right:10px}ccd-event-trigger{float:right}.case-viewer-label{min-width:300px;white-space:normal}.markdown h3{margin-bottom:0}\n"] }]
31426
+ args: [{ selector: 'ccd-case-full-access-view', template: "<!-- Generic error heading and error message to be displayed only if there are no specific callback errors or warnings, or no error details -->\n<div *ngIf=\"error && !(error.callbackErrors || error.callbackWarnings || error.details)\" class=\"error-summary\"\n role=\"group\" aria-labelledby=\"edit-case-event_error-summary-heading\" tabindex=\"-1\">\n <h1 class=\"heading-h1 error-summary-heading\" id=\"edit-case-event_error-summary-heading\">\n {{'Something went wrong' | rpxTranslate}}\n </h1>\n <div class=\"govuk-error-summary__body\" id=\"edit-case-event_error-summary-body\">\n <p>{{\"We're working to fix the problem. Try again shortly.\" | rpxTranslate}}</p>\n <p>\n <a href=\"get-help\" target=\"_blank\">\n {{\"Contact us\" | rpxTranslate}}</a> {{\"if you're still having problems.\" | rpxTranslate}}\n </p>\n </div>\n</div>\n<!-- Callback error heading and error message to be displayed if there are specific error details -->\n<div *ngIf=\"error && error.details\" class=\"error-summary\" role=\"group\"\n aria-labelledby=\"edit-case-event_error-summary-heading\" tabindex=\"-1\">\n <h2 class=\"heading-h2 error-summary-heading\" id=\"edit-case-event_error-summary-heading\">\n {{'The callback data failed validation' | rpxTranslate}}\n </h2>\n <p>{{error.message | rpxTranslate}}</p>\n <ul *ngIf=\"error.details?.field_errors\" class=\"error-summary-list\">\n <li *ngFor=\"let fieldError of error.details.field_errors\">\n {{fieldError.message | rpxTranslate}}\n </li>\n </ul>\n</div>\n<ccd-callback-errors\n [triggerTextContinue]=\"triggerTextStart\"\n [triggerTextIgnore]=\"triggerTextIgnoreWarnings\"\n [callbackErrorsSubject]=\"callbackErrorsSubject\"\n (callbackErrorsContext)=\"callbackErrorsNotify($event)\">\n</ccd-callback-errors>\n<ccd-activity [caseId]=\"caseDetails.case_id\" [displayMode]=\"BANNER\"></ccd-activity>\n<div class=\"grid-row\">\n <div class=\"column-one-half\">\n <ccd-case-header [caseDetails]=\"caseDetails\"></ccd-case-header>\n <div class=\"case-viewer-controls\" *ngIf=\"hasPrint && !isDraft() && isPrintEnabled()\">\n <a id=\"case-viewer-control-print\" routerLink=\"print\" class=\"button button-secondary\">{{'Print' | rpxTranslate}}</a>\n </div>\n </div>\n <div *ngIf=\"hasEventSelector\" class=\"column-one-half\">\n <ccd-event-trigger [isDisabled]=\"isTriggerButtonDisabled()\" [triggers]=\"caseDetails.triggers\"\n [triggerText]=\"triggerText\" (onTriggerChange)=\"clearErrorsAndWarnings()\"\n (onTriggerSubmit)=\"applyTrigger($event)\"></ccd-event-trigger>\n </div>\n</div>\n<div class=\"grid-row\" *ngIf=\"activeCaseFlags && !caseFlagsExternalUser\">\n <div class=\"column-full\">\n <ccd-notification-banner [notificationBannerConfig]=\"notificationBannerConfig\" (linkClicked)=\"onLinkClicked($event)\">\n </ccd-notification-banner>\n </div>\n</div>\n<div class=\"grid-row\">\n <div class=\"column-full\">\n <ng-container *ngIf=\"hasTabsPresent()\">\n <mat-tab-group #tabGroup animationDuration=\"0ms\" (selectedIndexChange)=\"tabChanged($event)\" [disableRipple]=\"true\"\n [selectedIndex]=\"selectedTabIndex\">\n <mat-tab *ngFor=\"let tab of prependedTabs\" [id]=\"tab.id\" [label]=\"tab.label | rpxTranslate\">\n </mat-tab>\n <mat-tab *ngFor=\"let tab of sortedTabs; let curIdx=index\" [id]=\"tab.id\" [label]=\"tab.label | rpxTranslate\">\n <ng-template matTabContent>\n <table [class]=\"tab.id\" [attr.aria-label]=\"'case viewer table' | rpxTranslate\">\n <tbody>\n <ng-container *ngFor=\"let field of tab | ccdTabFields | ccdReadFieldsFilter:false :undefined :true : formGroup.controls['data']\">\n <div ccdLabelSubstitutor [caseField]=\"field\" [contextFields]=\"caseFields\" [hidden]=\"field.hidden\">\n <ng-container [ngSwitch]=\"!(field | ccdIsCompound)\">\n <tr *ngSwitchCase=\"true\">\n <th id=\"case-viewer-field-label\" *ngIf=\"!isFieldToHaveNoLabel(field)\">\n <div class=\"case-viewer-label text-16\">\n {{field.label | rpxTranslate}}</div>\n </th>\n <td [id]=\"'case-viewer-field-read--' + field.id\" scope=\"col\">\n <span class=\"text-16\">\n <ccd-field-read [topLevelFormGroup]=\"formGroup.controls['data']\"\n [caseField]=\"field\" [caseReference]=\"caseDetails.case_id\"\n [markdownUseHrefAsRouterLink]=\"markdownUseHrefAsRouterLink\">\n </ccd-field-read>\n </span>\n </td>\n </tr>\n <tr *ngSwitchCase=\"false\" class=\"compound-field\">\n <th [id]=\"'case-viewer-field-read--' + field.id\" scope=\"col\">\n <span class=\"text-16\">\n <ccd-field-read [topLevelFormGroup]=\"formGroup.controls['data']\"\n [caseField]=\"field\" [caseReference]=\"caseDetails.case_id\"\n [markdownUseHrefAsRouterLink]=\"markdownUseHrefAsRouterLink\">\n </ccd-field-read>\n </span>\n </th>\n </tr>\n </ng-container>\n </div>\n </ng-container>\n </tbody>\n </table>\n </ng-template>\n </mat-tab>\n <mat-tab *ngFor=\"let tab of appendedTabs\" [id]=\"tab.id\" [label]=\"tab.label | rpxTranslate\">\n </mat-tab>\n </mat-tab-group>\n <router-outlet *ngIf=\"(prependedTabs && prependedTabs.length) || (appendedTabs && appendedTabs.length)\"></router-outlet>\n </ng-container>\n </div>\n</div>\n", styles: ["th{width:1%;white-space:nowrap;vertical-align:top}.compound-field th{padding:0}.case-viewer-controls{margin-top:47px;margin-bottom:20px}ccd-case-header{float:left;margin-right:10px}ccd-event-trigger{float:right}.case-viewer-label{min-width:300px;white-space:normal}.markdown h3{margin-bottom:0}\n"] }]
31344
31427
  }], function () { return [{ type: i0.NgZone }, { type: i1$1.ActivatedRoute }, { type: i1$1.Router }, { type: NavigationNotifierService }, { type: OrderService }, { type: ActivityPollingService }, { type: i1$3.MatLegacyDialog }, { type: AlertService }, { type: DraftService }, { type: ErrorNotifierService }, { type: ConvertHrefToRouterService }, { type: i4.Location }, { type: i0.ChangeDetectorRef }, { type: SessionStorageService }, { type: i1.RpxTranslatePipe }]; }, { hasPrint: [{
31345
31428
  type: Input
31346
31429
  }], hasEventSelector: [{