@hmcts/ccd-case-ui-toolkit 7.3.52-4435 → 7.3.52-4435-rc1

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, Input, EventEmitter, Output, NgModule, ViewEncapsulation, forwardRef, Pipe, ContentChildren, ViewChildren, DOCUMENT, Injectable, Inject, ChangeDetectorRef, Directive, InjectionToken, ViewChild, ChangeDetectionStrategy, Injector, ViewContainerRef, SecurityContext, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
2
+ import { Component, Input, EventEmitter, Output, NgModule, ViewEncapsulation, forwardRef, Pipe, ContentChildren, ViewChildren, DOCUMENT, Injectable, Inject, InjectionToken, Optional, ChangeDetectorRef, Directive, ViewChild, ChangeDetectionStrategy, Injector, ViewContainerRef, SecurityContext, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
3
3
  import * as i5 from '@angular/common';
4
4
  import { CommonModule, AsyncPipe, CurrencyPipe, formatDate } from '@angular/common';
5
5
  import * as i1 from 'rpx-xui-translation';
@@ -1638,23 +1638,89 @@ class SessionStorageService {
1638
1638
  sessionStorage.clear();
1639
1639
  }
1640
1640
  static ɵfac = function SessionStorageService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SessionStorageService)(); };
1641
- static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SessionStorageService, factory: SessionStorageService.ɵfac });
1641
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SessionStorageService, factory: SessionStorageService.ɵfac, providedIn: 'root' });
1642
1642
  }
1643
1643
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SessionStorageService, [{
1644
- type: Injectable
1644
+ type: Injectable,
1645
+ args: [{
1646
+ providedIn: 'root',
1647
+ }]
1645
1648
  }], null, null); })();
1646
1649
 
1650
+ function safeJsonParse(value, fallback = null) {
1651
+ if (!value) {
1652
+ return fallback;
1653
+ }
1654
+ try {
1655
+ return JSON.parse(value);
1656
+ }
1657
+ catch (error) {
1658
+ // Log for diagnostics, then return fallback to avoid UI crashes.
1659
+ // eslint-disable-next-line no-console
1660
+ console.error('safeJsonParse failed to parse JSON', error);
1661
+ return fallback;
1662
+ }
1663
+ }
1664
+
1665
+ const SessionErrorRoute = new InjectionToken('SessionErrorRoute');
1666
+ const SessionJsonErrorLogger = new InjectionToken('SessionJsonErrorLogger');
1667
+ class SessionStorageGuard {
1668
+ sessionStorageService;
1669
+ router;
1670
+ errorRoute;
1671
+ errorLogger;
1672
+ constructor(sessionStorageService, router, errorRoute, errorLogger) {
1673
+ this.sessionStorageService = sessionStorageService;
1674
+ this.router = router;
1675
+ this.errorRoute = errorRoute;
1676
+ this.errorLogger = errorLogger;
1677
+ }
1678
+ canActivate() {
1679
+ const userInfoStr = this.sessionStorageService.getItem('userDetails');
1680
+ if (!userInfoStr) {
1681
+ return true;
1682
+ }
1683
+ const parsed = safeJsonParse(userInfoStr, null);
1684
+ if (parsed !== null) {
1685
+ return true;
1686
+ }
1687
+ const error = new Error('Invalid userDetails in session storage');
1688
+ if (this.errorLogger) {
1689
+ this.errorLogger(error);
1690
+ }
1691
+ else {
1692
+ // eslint-disable-next-line no-console
1693
+ console.error('Invalid userDetails in session storage', error);
1694
+ }
1695
+ this.router.navigate([this.errorRoute || '/session-error']);
1696
+ return false;
1697
+ }
1698
+ static ɵfac = function SessionStorageGuard_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SessionStorageGuard)(i0.ɵɵinject(SessionStorageService), i0.ɵɵinject(i1$1.Router), i0.ɵɵinject(SessionErrorRoute, 8), i0.ɵɵinject(SessionJsonErrorLogger, 8)); };
1699
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SessionStorageGuard, factory: SessionStorageGuard.ɵfac, providedIn: 'root' });
1700
+ }
1701
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SessionStorageGuard, [{
1702
+ type: Injectable,
1703
+ args: [{
1704
+ providedIn: 'root',
1705
+ }]
1706
+ }], () => [{ type: SessionStorageService }, { type: i1$1.Router }, { type: undefined, decorators: [{
1707
+ type: Optional
1708
+ }, {
1709
+ type: Inject,
1710
+ args: [SessionErrorRoute]
1711
+ }] }, { type: SessionJsonErrorLogger, decorators: [{
1712
+ type: Optional
1713
+ }, {
1714
+ type: Inject,
1715
+ args: [SessionJsonErrorLogger]
1716
+ }] }], null); })();
1717
+
1647
1718
  const USER_DETAILS = 'userDetails';
1648
1719
  const PUI_CASE_MANAGER = 'pui-case-manager';
1649
1720
  const JUDGE = 'judge';
1650
1721
  function getUserDetails(sessionStorageService) {
1651
- try {
1652
- const item = sessionStorageService?.getItem(USER_DETAILS);
1653
- return item ? JSON.parse(item) : null;
1654
- }
1655
- catch {
1656
- return null;
1657
- }
1722
+ const item = sessionStorageService?.getItem(USER_DETAILS);
1723
+ return safeJsonParse(item, null);
1658
1724
  }
1659
1725
  function isInternalUser(sessionStorageService) {
1660
1726
  const userDetails = getUserDetails(sessionStorageService);
@@ -1693,8 +1759,11 @@ class ActivityService {
1693
1759
  return error;
1694
1760
  }
1695
1761
  getOptions() {
1696
- const userDetails = JSON.parse(this.sessionStorageService.getItem(USER_DETAILS));
1697
- const headers = new HttpHeaders().set('Content-Type', 'application/json').set('Authorization', userDetails.token);
1762
+ const userDetails = safeJsonParse(this.sessionStorageService.getItem(USER_DETAILS));
1763
+ let headers = new HttpHeaders().set('Content-Type', 'application/json');
1764
+ if (userDetails?.token) {
1765
+ headers = headers.set('Authorization', userDetails.token);
1766
+ }
1698
1767
  return {
1699
1768
  headers,
1700
1769
  withCredentials: true,
@@ -4503,11 +4572,8 @@ class FieldsUtils {
4503
4572
  }
4504
4573
  }
4505
4574
  static getUserTaskFromClientContext(clientContextStr) {
4506
- if (clientContextStr) {
4507
- let clientContext = JSON.parse(clientContextStr);
4508
- return clientContext.client_context.user_task;
4509
- }
4510
- return null;
4575
+ const clientContext = safeJsonParse(clientContextStr, null);
4576
+ return clientContext?.client_context?.user_task || null;
4511
4577
  }
4512
4578
  buildCanShowPredicate(eventTrigger, form) {
4513
4579
  const currentState = this.getCurrentEventState(eventTrigger, form);
@@ -5467,6 +5533,10 @@ class ConditionalShowFormDirective {
5467
5533
  }
5468
5534
  buildPath(c, field) {
5469
5535
  if (c && c instanceof AbstractFieldWriteComponent) {
5536
+ const parentPrefix = c.parent?.['component']?.idPrefix;
5537
+ if (parentPrefix) {
5538
+ return parentPrefix + field.id;
5539
+ }
5470
5540
  if (c.idPrefix) {
5471
5541
  return c.idPrefix + field.id;
5472
5542
  }
@@ -5967,17 +6037,15 @@ class FormValueService {
5967
6037
  return form[currentFieldId + FieldsUtils.LABEL_SUFFIX].join(', ');
5968
6038
  }
5969
6039
  else if (FieldsUtils.isCollectionOfSimpleTypes(currentForm)) {
5970
- return currentForm.map(fieldValue => fieldValue['value']).join(', ');
6040
+ return currentForm.map((fieldValue) => fieldValue.value).join(', ');
5971
6041
  }
5972
6042
  else if (FieldsUtils.isCollection(currentForm)) {
5973
- return this.getFieldValue(currentForm[colIndex]['value'], fieldIds.slice(1).join('.'), colIndex);
6043
+ return this.getFieldValue(currentForm[colIndex].value, fieldIds.slice(1).join('.'), colIndex);
5974
6044
  }
5975
6045
  else if (FieldsUtils.isNonEmptyObject(currentForm)) {
5976
6046
  return this.getFieldValue(currentForm, fieldIds.slice(1).join('.'), colIndex);
5977
6047
  }
5978
- else {
5979
- return currentForm;
5980
- }
6048
+ return currentForm;
5981
6049
  }
5982
6050
  /**
5983
6051
  * A recursive method to remove anything with a `---LABEL` suffix.
@@ -6015,9 +6083,7 @@ class FormValueService {
6015
6083
  if (field.field_type) {
6016
6084
  return field.field_type.type === 'Label';
6017
6085
  }
6018
- else {
6019
- return false;
6020
- }
6086
+ return false;
6021
6087
  }
6022
6088
  static isEmptyData(data) {
6023
6089
  if (data) {
@@ -6064,10 +6130,13 @@ class FormValueService {
6064
6130
  return s;
6065
6131
  }
6066
6132
  filterCurrentPageFields(caseFields, editForm) {
6067
- const cloneForm = JSON.parse(JSON.stringify(editForm));
6068
- Object.keys(cloneForm['data']).forEach((key) => {
6133
+ const cloneForm = {
6134
+ ...(editForm || {}),
6135
+ data: { ...((editForm && editForm.data) || {}) }
6136
+ };
6137
+ Object.keys(cloneForm.data).forEach((key) => {
6069
6138
  if (caseFields.findIndex((element) => element.id === key) < 0) {
6070
- delete cloneForm['data'][key];
6139
+ delete cloneForm.data[key];
6071
6140
  }
6072
6141
  });
6073
6142
  return cloneForm;
@@ -6111,7 +6180,7 @@ class FormValueService {
6111
6180
  if (!rawArray) {
6112
6181
  return rawArray;
6113
6182
  }
6114
- rawArray.forEach(item => {
6183
+ rawArray.forEach((item) => {
6115
6184
  if (item && item.hasOwnProperty('value')) {
6116
6185
  item.value = this.sanitiseValue(item.value, isCaseFlagJourney);
6117
6186
  }
@@ -6120,8 +6189,8 @@ class FormValueService {
6120
6189
  // association of a value. In addition, if the array contains items with a "value" object property, return only
6121
6190
  // those whose value object contains non-empty values, including for any descendant objects
6122
6191
  return rawArray
6123
- .filter(item => !!item)
6124
- .filter(item => item.hasOwnProperty('value') ? FieldsUtils.containsNonEmptyValues(item.value) : true);
6192
+ .filter((item) => !!item)
6193
+ .filter((item) => item.hasOwnProperty('value') ? FieldsUtils.containsNonEmptyValues(item.value) : true);
6125
6194
  }
6126
6195
  sanitiseValue(rawValue, isCaseFlagJourney = false) {
6127
6196
  if (Array.isArray(rawValue)) {
@@ -6140,7 +6209,7 @@ class FormValueService {
6140
6209
  }
6141
6210
  clearNonCaseFields(data, caseFields) {
6142
6211
  for (const dataKey in data) {
6143
- if (!caseFields.find(cf => cf.id === dataKey)) {
6212
+ if (!caseFields.find((cf) => cf.id === dataKey)) {
6144
6213
  delete data[dataKey];
6145
6214
  }
6146
6215
  }
@@ -6338,7 +6407,7 @@ class FormValueService {
6338
6407
  */
6339
6408
  removeCaseFieldsOfType(data, caseFields, types) {
6340
6409
  if (data && caseFields && caseFields.length > 0 && types.length > 0) {
6341
- const caseFieldsToRemove = caseFields.filter(caseField => FieldsUtils.isCaseFieldOfType(caseField, types));
6410
+ const caseFieldsToRemove = caseFields.filter((caseField) => FieldsUtils.isCaseFieldOfType(caseField, types));
6342
6411
  for (const caseField of caseFieldsToRemove) {
6343
6412
  delete data[caseField.id];
6344
6413
  }
@@ -6357,10 +6426,10 @@ class FormValueService {
6357
6426
  */
6358
6427
  repopulateFormDataFromCaseFieldValues(data, caseFields) {
6359
6428
  if (data && caseFields && caseFields.length > 0 &&
6360
- caseFields.findIndex(caseField => FieldsUtils.isCaseFieldOfType(caseField, ['FlagLauncher'])) > -1) {
6429
+ caseFields.findIndex((caseField) => FieldsUtils.isCaseFieldOfType(caseField, ['FlagLauncher'])) > -1) {
6361
6430
  // Ignore the FlagLauncher CaseField because it does not hold any values
6362
- caseFields.filter(caseField => !FieldsUtils.isCaseFieldOfType(caseField, ['FlagLauncher']))
6363
- .forEach(caseField => {
6431
+ caseFields.filter((caseField) => !FieldsUtils.isCaseFieldOfType(caseField, ['FlagLauncher']))
6432
+ .forEach((caseField) => {
6364
6433
  // Ensure that the data object is populated for all CaseField keys it contains, even if for a given
6365
6434
  // CaseField key, the data object has a falsy value (hence the use of hasOwnProperty() for the check below)
6366
6435
  // See https://tools.hmcts.net/jira/browse/EUI-7377
@@ -6392,8 +6461,8 @@ class FormValueService {
6392
6461
  */
6393
6462
  populateLinkedCasesDetailsFromCaseFields(data, caseFields) {
6394
6463
  if (data && caseFields && caseFields.length > 0) {
6395
- caseFields.filter(caseField => !FieldsUtils.isCaseFieldOfType(caseField, ['ComponentLauncher']))
6396
- .forEach(caseField => {
6464
+ caseFields.filter((caseField) => !FieldsUtils.isCaseFieldOfType(caseField, ['ComponentLauncher']))
6465
+ .forEach((caseField) => {
6397
6466
  if (data.hasOwnProperty('caseLinks') && caseField.value) {
6398
6467
  data[caseField.id] = caseField.value;
6399
6468
  }
@@ -9535,7 +9604,7 @@ class CaseEditComponent {
9535
9604
  ngOnInit() {
9536
9605
  this.wizard = this.wizardFactory.create(this.eventTrigger);
9537
9606
  this.initialUrl = this.sessionStorageService.getItem('eventUrl');
9538
- this.isPageRefreshed = JSON.parse(this.sessionStorageService.getItem('isPageRefreshed'));
9607
+ this.isPageRefreshed = safeJsonParse(this.sessionStorageService.getItem('isPageRefreshed'), false);
9539
9608
  this.checkPageRefresh();
9540
9609
  this.form = this.fb.group({
9541
9610
  data: new FormGroup({}),
@@ -9659,15 +9728,11 @@ class CaseEditComponent {
9659
9728
  const taskEventCompletionStr = this.sessionStorageService.getItem(CaseEditComponent.TASK_EVENT_COMPLETION_INFO);
9660
9729
  const userInfoStr = this.sessionStorageService.getItem('userDetails');
9661
9730
  const assignNeeded = this.sessionStorageService.getItem('assignNeeded');
9662
- if (taskEventCompletionStr) {
9663
- taskEventCompletionInfo = JSON.parse(taskEventCompletionStr);
9664
- }
9665
- if (userInfoStr) {
9666
- userInfo = JSON.parse(userInfoStr);
9667
- }
9731
+ taskEventCompletionInfo = safeJsonParse(taskEventCompletionStr, null);
9732
+ userInfo = safeJsonParse(userInfoStr, null);
9668
9733
  const eventId = this.getEventId(form);
9669
9734
  const caseId = this.getCaseId(caseDetails);
9670
- const userId = userInfo.id ? userInfo.id : userInfo.uid;
9735
+ const userId = userInfo?.id ? userInfo.id : userInfo?.uid;
9671
9736
  const eventDetails = { eventId, caseId, userId, assignNeeded };
9672
9737
  if (this.taskExistsForThisEvent(taskInSessionStorage, taskEventCompletionInfo, eventDetails)) {
9673
9738
  this.abstractConfig.logMessage(`task ${taskInSessionStorage?.id} exist for this event for caseId and eventId as ${caseId} ${eventId}`);
@@ -9896,6 +9961,11 @@ class CaseEditComponent {
9896
9961
  const userTask = FieldsUtils.getUserTaskFromClientContext(clientContextStr);
9897
9962
  const [task, taskToBeCompleted] = userTask ? [userTask.task_data, userTask.complete_task] : [null, false];
9898
9963
  const assignNeeded = this.sessionStorageService.getItem('assignNeeded') === 'true';
9964
+ if (this.caseDetails && (this.caseDetails.case_id !== task?.case_id)) {
9965
+ this.abstractConfig.logMessage(`postCompleteTaskIfRequired: task in session storage with taskId ${task?.id} has caseId: ${task?.case_id} which does not match case details case id ${this.caseDetails.case_id}, NOT completing task and clearing client context`);
9966
+ this.sessionStorageService.removeItem(CaseEditComponent.CLIENT_CONTEXT);
9967
+ return of(true);
9968
+ }
9899
9969
  if (task && assignNeeded && taskToBeCompleted) {
9900
9970
  this.abstractConfig.logMessage(`postCompleteTaskIfRequired with assignNeeded: taskId ${task.id} and event name ${this.eventTrigger?.name}`);
9901
9971
  return this.workAllocationService.assignAndCompleteTask(task.id, this.eventTrigger.name);
@@ -10029,7 +10099,7 @@ class CaseEditComponent {
10029
10099
  }], submitted: [{
10030
10100
  type: Output
10031
10101
  }] }); })();
10032
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CaseEditComponent, { className: "CaseEditComponent", filePath: "lib/shared/components/case-editor/case-edit/case-edit.component.ts", lineNumber: 38 }); })();
10102
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CaseEditComponent, { className: "CaseEditComponent", filePath: "lib/shared/components/case-editor/case-edit/case-edit.component.ts", lineNumber: 39 }); })();
10033
10103
 
10034
10104
  function convertNonASCIICharacter(character) {
10035
10105
  if (character === '£') {
@@ -11642,6 +11712,10 @@ class CaseEditPageComponent {
11642
11712
  updateEventTriggerCaseFields(caseFieldId, jsonData, eventTrigger) {
11643
11713
  /* istanbul ignore else */
11644
11714
  if (eventTrigger?.case_fields) {
11715
+ const isCaseFlagJourney = eventTrigger.case_fields.some((caseField) => FieldsUtils.isCaseFieldOfType(caseField, ['FlagLauncher']));
11716
+ if (isCaseFlagJourney) {
11717
+ return;
11718
+ }
11645
11719
  eventTrigger.case_fields
11646
11720
  .filter(element => element.id === caseFieldId)
11647
11721
  .forEach(element => {
@@ -12088,6 +12162,42 @@ class CallbackErrorsComponent {
12088
12162
  }] }); })();
12089
12163
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CallbackErrorsComponent, { className: "CallbackErrorsComponent", filePath: "lib/shared/components/error/callback-errors.component.ts", lineNumber: 11 }); })();
12090
12164
 
12165
+ class SessionErrorPageComponent {
12166
+ title = 'There is a problem with your session';
12167
+ primaryMessage = 'Go to landing page. Refreshing the page. If the problem persists, sign out and sign in again.';
12168
+ secondaryMessage = 'If you still cannot access the service, clear your browser data for this website.';
12169
+ static ɵfac = function SessionErrorPageComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SessionErrorPageComponent)(); };
12170
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SessionErrorPageComponent, selectors: [["ccd-session-error-page"]], inputs: { title: "title", primaryMessage: "primaryMessage", secondaryMessage: "secondaryMessage" }, decls: 10, vars: 3, consts: [[1, "govuk-width-container"], ["id", "content", "role", "main", 1, "govuk-main-wrapper", "govuk-main-wrapper--l"], [1, "govuk-grid-row"], [1, "govuk-grid-column-two-thirds"], [1, "govuk-heading-xl"], [1, "govuk-body"]], template: function SessionErrorPageComponent_Template(rf, ctx) { if (rf & 1) {
12171
+ i0.ɵɵdomElementStart(0, "div", 0)(1, "main", 1)(2, "div", 2)(3, "div", 3)(4, "h1", 4);
12172
+ i0.ɵɵtext(5);
12173
+ i0.ɵɵdomElementEnd();
12174
+ i0.ɵɵdomElementStart(6, "p", 5);
12175
+ i0.ɵɵtext(7);
12176
+ i0.ɵɵdomElementEnd();
12177
+ i0.ɵɵdomElementStart(8, "p", 5);
12178
+ i0.ɵɵtext(9);
12179
+ i0.ɵɵdomElementEnd()()()()();
12180
+ } if (rf & 2) {
12181
+ i0.ɵɵadvance(5);
12182
+ i0.ɵɵtextInterpolate(ctx.title);
12183
+ i0.ɵɵadvance(2);
12184
+ i0.ɵɵtextInterpolate(ctx.primaryMessage);
12185
+ i0.ɵɵadvance(2);
12186
+ i0.ɵɵtextInterpolate(ctx.secondaryMessage);
12187
+ } }, dependencies: [CommonModule], encapsulation: 2 });
12188
+ }
12189
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SessionErrorPageComponent, [{
12190
+ type: Component,
12191
+ args: [{ selector: 'ccd-session-error-page', standalone: true, imports: [CommonModule], template: "<div class=\"govuk-width-container\">\n <main class=\"govuk-main-wrapper govuk-main-wrapper--l\" id=\"content\" role=\"main\">\n <div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-two-thirds\">\n <h1 class=\"govuk-heading-xl\">{{ title }}</h1>\n <p class=\"govuk-body\">{{ primaryMessage }}</p>\n <p class=\"govuk-body\">{{ secondaryMessage }}</p>\n </div>\n </div>\n </main>\n</div>\n" }]
12192
+ }], null, { title: [{
12193
+ type: Input
12194
+ }], primaryMessage: [{
12195
+ type: Input
12196
+ }], secondaryMessage: [{
12197
+ type: Input
12198
+ }] }); })();
12199
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SessionErrorPageComponent, { className: "SessionErrorPageComponent", filePath: "lib/shared/components/error/session-error-page.component.ts", lineNumber: 10 }); })();
12200
+
12091
12201
  function CaseEventCompletionComponent_app_case_event_completion_task_cancelled_0_Template(rf, ctx) { if (rf & 1) {
12092
12202
  const _r1 = i0.ɵɵgetCurrentView();
12093
12203
  i0.ɵɵelementStart(0, "app-case-event-completion-task-cancelled", 2);
@@ -13339,9 +13449,10 @@ class CaseFileViewFieldComponent {
13339
13449
  error: _ => this.getCategoriesAndDocumentsError = true
13340
13450
  });
13341
13451
  // EXUI-8000
13342
- const userInfo = JSON.parse(this.sessionStorageService.getItem('userDetails'));
13452
+ const userInfo = safeJsonParse(this.sessionStorageService.getItem('userDetails'), null);
13453
+ const userRoles = userInfo?.roles || [];
13343
13454
  // Get acls that intersects from acl roles and user roles
13344
- const acls = this.caseField.acls.filter(acl => userInfo.roles.includes(acl.role));
13455
+ const acls = this.caseField.acls.filter(acl => userRoles.includes(acl.role));
13345
13456
  // As there can be more than one intersecting role, if any acls are update: true
13346
13457
  this.allowMoving = acls.some(acl => acl.update);
13347
13458
  this.icp_jurisdictions = this.abstractConfig.getIcpJurisdictions();
@@ -13432,7 +13543,7 @@ class CaseFileViewFieldComponent {
13432
13543
  type: Component,
13433
13544
  args: [{ selector: 'ccd-case-file-view-field', standalone: false, template: "<ng-container *ngIf=\"errorMessages?.length\">\n <div\n id=\"case-file-view-field-errors\"\n class=\"govuk-error-summary govuk-!-margin-bottom-4\"\n data-module=\"govuk-error-summary\"\n >\n <div role=\"alert\">\n <h2 class=\"govuk-error-summary__title\">There is a problem</h2>\n <div class=\"govuk-error-summary__body\">\n <ul class=\"govuk-list govuk-error-summary__list\">\n <li *ngFor=\"let errorMessage of errorMessages\">\n <button type=\"button\" class=\"govuk-js-link\">{{ errorMessage }}</button>\n </li>\n </ul>\n </div>\n </div>\n </div>\n</ng-container>\n\n<div\n *ngIf=\"getCategoriesAndDocumentsError\"\n class=\"govuk-grid-column-two-thirds\"\n>\n <h1 class=\"govuk-heading-xl\">Sorry, there is a problem with the service</h1>\n <p class=\"govuk-body\">Try again later.</p>\n</div>\n<div *ngIf=\"!getCategoriesAndDocumentsError\">\n <h2 class=\"govuk-heading-l\">Case file</h2>\n <div class=\"govuk-form-group\" id=\"case-file-view\">\n <!-- Document tree -->\n <div class=\"document-tree-container\">\n <ccd-case-file-view-folder \n class=\"document-tree-container__tree\"\n [categoriesAndDocuments]=\"categoriesAndDocuments$\"\n (clickedDocument)=\"setMediaViewerFile($event); resetErrorMessages()\" \n (moveDocument)=\"moveDocument($event)\"\n [allowMoving]=\"allowMoving\">\n </ccd-case-file-view-folder>\n </div>\n <!-- Slider -->\n <div class=\"slider\"></div>\n <!-- Media viewer -->\n <div class=\"media-viewer-container\">\n <ng-container *ngIf=\"currentDocument\">\n <mv-media-viewer\n [url]=\"currentDocument.document_binary_url\"\n [downloadFileName]=\"currentDocument.document_filename\"\n [showToolbar]=\"true\"\n [contentType]=\"currentDocument.content_type\"\n [enableAnnotations]=\"true\"\n [enableRedactions]=\"true\"\n [height]=\"'94.5vh'\"\n [caseId]=\"caseId\"\n [multimediaPlayerEnabled]=\"true\"\n [enableICP]=\"isIcpEnabled()\"\n >\n </mv-media-viewer>\n </ng-container>\n </div>\n </div>\n</div>\n", styles: ["#case-file-view{display:flex;border:2px solid #C9C9C9;height:100vh;position:relative}#case-file-view .document-tree-container{background-color:#faf8f8;width:30%;min-height:400px;min-width:10%}#case-file-view .slider{width:.2%;background-color:#6b6b6b}#case-file-view .slider:hover,#case-file-view .slider:focus{cursor:col-resize}#case-file-view .media-viewer-container{background-color:#dee0e2;flex:1 1 0;overflow:hidden}\n"] }]
13434
13545
  }], () => [{ type: i0.ElementRef }, { type: i1$1.ActivatedRoute }, { type: CaseFileViewService }, { type: DocumentManagementService }, { type: LoadingService }, { type: SessionStorageService }, { type: WindowService }, { type: CaseNotifier }, { type: AbstractAppConfig }], null); })();
13435
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CaseFileViewFieldComponent, { className: "CaseFileViewFieldComponent", filePath: "lib/shared/components/palette/case-file-view/case-file-view-field.component.ts", lineNumber: 18 }); })();
13546
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CaseFileViewFieldComponent, { className: "CaseFileViewFieldComponent", filePath: "lib/shared/components/palette/case-file-view/case-file-view-field.component.ts", lineNumber: 19 }); })();
13436
13547
 
13437
13548
  const PVP_FLAG_CODE = 'PF0021';
13438
13549
  const PVP_DISPLAY_TEXT = 'POTENTIALLY VIOLENT PERSON';
@@ -14992,7 +15103,7 @@ function WriteCollectionFieldComponent_div_7_Template(rf, ctx) { if (rf & 1) {
14992
15103
  const ctx_r0 = i0.ɵɵnextContext();
14993
15104
  i0.ɵɵproperty("hidden", ctx_r0.caseField.hidden);
14994
15105
  i0.ɵɵadvance(2);
14995
- i0.ɵɵproperty("ngForOf", ctx_r0.collItems);
15106
+ i0.ɵɵproperty("ngForOf", ctx_r0.collItems)("ngForTrackBy", ctx_r0.trackByCollectionItem);
14996
15107
  } }
14997
15108
  function WriteCollectionFieldComponent_button_8_Template(rf, ctx) { if (rf & 1) {
14998
15109
  const _r5 = i0.ɵɵgetCurrentView();
@@ -15018,6 +15129,7 @@ class WriteCollectionFieldComponent extends AbstractFieldWriteComponent {
15018
15129
  profileSubscription;
15019
15130
  items;
15020
15131
  collItems = [];
15132
+ collectionItemUidCounter = 0;
15021
15133
  constructor(dialog, scrollToService, profileNotifier, cdRef) {
15022
15134
  super();
15023
15135
  this.dialog = dialog;
@@ -15040,7 +15152,7 @@ class WriteCollectionFieldComponent extends AbstractFieldWriteComponent {
15040
15152
  if (this.collItems.length <= index) {
15041
15153
  this.collItems.length = index + 1;
15042
15154
  }
15043
- this.collItems[index] = { caseField, item, prefix, index, container };
15155
+ this.collItems[index] = { uid: this.createCollectionItemUid(), caseField, item, prefix, index, container };
15044
15156
  });
15045
15157
  }
15046
15158
  ngOnDestroy() {
@@ -15149,7 +15261,7 @@ class WriteCollectionFieldComponent extends AbstractFieldWriteComponent {
15149
15261
  const caseField = this.buildCaseField(item, index, true);
15150
15262
  const prefix = this.buildIdPrefix(index);
15151
15263
  const container = this.getContainer(index);
15152
- this.collItems.push({ caseField, item, index, prefix, container });
15264
+ this.collItems.push({ uid: this.createCollectionItemUid(), caseField, item, index, prefix, container });
15153
15265
  // Update DOM required after pushing a new item to do the next steps (i.e. scrolling and focusing)
15154
15266
  this.cdRef.detectChanges();
15155
15267
  if (doScroll) {
@@ -15208,6 +15320,12 @@ class WriteCollectionFieldComponent extends AbstractFieldWriteComponent {
15208
15320
  this.caseField.value.splice(index, 1);
15209
15321
  this.formArray.removeAt(index);
15210
15322
  }
15323
+ trackByCollectionItem(_, item) {
15324
+ return item.uid;
15325
+ }
15326
+ createCollectionItemUid() {
15327
+ return `collection-item-${this.collectionItemUidCounter++}`;
15328
+ }
15211
15329
  resetIds(index) {
15212
15330
  for (let i = index; i < this.collItems.length; i++) {
15213
15331
  const counter = i + 1;
@@ -15314,7 +15432,7 @@ class WriteCollectionFieldComponent extends AbstractFieldWriteComponent {
15314
15432
  } if (rf & 2) {
15315
15433
  let _t;
15316
15434
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.items = _t);
15317
- } }, inputs: { caseFields: "caseFields" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 9, vars: 9, consts: [["collectionItem", ""], [1, "form-group", 3, "id"], [1, "panel", "collection-indicator"], ["class", "heading-h2 error-spacing", 4, "ngIf"], ["type", "button", 1, "button", "write-collection-add-item__top", 3, "click", "disabled"], ["class", "form-group", 3, "hidden", 4, "ngIf"], ["class", "button write-collection-add-item__bottom", "type", "button", 3, "disabled", "click", 4, "ngIf"], [1, "heading-h2", "error-spacing"], ["class", "form-hint", 4, "ngIf"], ["class", "error-message", 4, "ngIf"], [1, "form-hint"], [3, "content"], [1, "error-message"], [1, "form-group", 3, "hidden"], [1, "govuk-fieldset"], ["class", "form-group", 3, "id", 4, "ngFor", "ngForOf"], [1, "collection-title"], [1, "float-left"], [1, "govuk-fieldset__legend"], [3, "for"], [1, "heading-h3"], [1, "float-right"], ["type", "button", 1, "button", "button-secondary", 3, "click", "disabled"], [3, "caseField", "caseFields", "formGroup", "parent", "idPrefix", "hidden", "isExpanded", "isInSearchBlock"], ["type", "button", 1, "button", "write-collection-add-item__bottom", 3, "click", "disabled"]], template: function WriteCollectionFieldComponent_Template(rf, ctx) { if (rf & 1) {
15435
+ } }, inputs: { caseFields: "caseFields" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 9, vars: 9, consts: [["collectionItem", ""], [1, "form-group", 3, "id"], [1, "panel", "collection-indicator"], ["class", "heading-h2 error-spacing", 4, "ngIf"], ["type", "button", 1, "button", "write-collection-add-item__top", 3, "click", "disabled"], ["class", "form-group", 3, "hidden", 4, "ngIf"], ["class", "button write-collection-add-item__bottom", "type", "button", 3, "disabled", "click", 4, "ngIf"], [1, "heading-h2", "error-spacing"], ["class", "form-hint", 4, "ngIf"], ["class", "error-message", 4, "ngIf"], [1, "form-hint"], [3, "content"], [1, "error-message"], [1, "form-group", 3, "hidden"], [1, "govuk-fieldset"], ["class", "form-group", 3, "id", 4, "ngFor", "ngForOf", "ngForTrackBy"], [1, "collection-title"], [1, "float-left"], [1, "govuk-fieldset__legend"], [3, "for"], [1, "heading-h3"], [1, "float-right"], ["type", "button", 1, "button", "button-secondary", 3, "click", "disabled"], [3, "caseField", "caseFields", "formGroup", "parent", "idPrefix", "hidden", "isExpanded", "isInSearchBlock"], ["type", "button", 1, "button", "write-collection-add-item__bottom", 3, "click", "disabled"]], template: function WriteCollectionFieldComponent_Template(rf, ctx) { if (rf & 1) {
15318
15436
  i0.ɵɵelementStart(0, "div", 1)(1, "div", 2);
15319
15437
  i0.ɵɵtemplate(2, WriteCollectionFieldComponent_h2_2_Template, 3, 3, "h2", 3);
15320
15438
  i0.ɵɵelementStart(3, "button", 4);
@@ -15322,7 +15440,7 @@ class WriteCollectionFieldComponent extends AbstractFieldWriteComponent {
15322
15440
  i0.ɵɵtext(4);
15323
15441
  i0.ɵɵpipe(5, "rpxTranslate");
15324
15442
  i0.ɵɵelementEnd();
15325
- i0.ɵɵtemplate(6, WriteCollectionFieldComponent_h2_6_Template, 3, 2, "h2", 3)(7, WriteCollectionFieldComponent_div_7_Template, 3, 2, "div", 5)(8, WriteCollectionFieldComponent_button_8_Template, 3, 4, "button", 6);
15443
+ i0.ɵɵtemplate(6, WriteCollectionFieldComponent_h2_6_Template, 3, 2, "h2", 3)(7, WriteCollectionFieldComponent_div_7_Template, 3, 3, "div", 5)(8, WriteCollectionFieldComponent_button_8_Template, 3, 4, "button", 6);
15326
15444
  i0.ɵɵelementEnd()();
15327
15445
  } if (rf & 2) {
15328
15446
  i0.ɵɵproperty("id", ctx.id());
@@ -15342,14 +15460,14 @@ class WriteCollectionFieldComponent extends AbstractFieldWriteComponent {
15342
15460
  }
15343
15461
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WriteCollectionFieldComponent, [{
15344
15462
  type: Component,
15345
- args: [{ selector: 'ccd-write-collection-field', standalone: false, template: "<div class=\"form-group\" [id]=\"id()\">\n\n <div class=\"panel collection-indicator\">\n\n <h2 class=\"heading-h2 error-spacing\" *ngIf=\"!caseField.hidden\">\n {{(caseField | ccdFieldLabel)}}\n </h2>\n <button class=\"button write-collection-add-item__top\" type=\"button\" (click)=\"addItem(true)\" [disabled]=\"isNotAuthorisedToCreate() || isSearchFilter()\">{{'Add new' | rpxTranslate}}</button>\n <h2 class=\"heading-h2 error-spacing\" *ngIf=\"caseField.hint_text || formArray.errors\">\n <span *ngIf=\"caseField.hint_text\" class=\"form-hint\">\n <ccd-markdown [content]=\"caseField.hint_text | rpxTranslate\"></ccd-markdown>\n </span>\n <span *ngIf=\"formArray.errors\" class=\"error-message\">\n {{(formArray.errors | ccdFirstError:caseField.label)}}\n </span>\n </h2>\n\n <div class=\"form-group\" [hidden]=\"caseField.hidden\" *ngIf=\"caseField.value && caseField.value.length\">\n <fieldset class=\"govuk-fieldset\">\n <div *ngFor=\"let item of collItems; let i = index\" #collectionItem\n [id]=\"this.buildIdPrefix(i) + i\" class=\"form-group\">\n <div class=\"collection-title\">\n <div class=\"float-left\">\n <legend class=\"govuk-fieldset__legend\">\n <label [for]=\"item.prefix + i\"><h3 class=\"heading-h3\">{{itemLabel(i) | rpxTranslate}}</h3></label>\n </legend>\n </div>\n <div class=\"float-right\">\n <button class=\"button button-secondary\" type=\"button\" (click)=\"openModal(i)\"\n [disabled]=\"isNotAuthorisedToDelete(i)\"\n attr.aria-label=\"Remove {{ itemLabel(i) }}\">{{'Remove' | rpxTranslate}}</button>\n </div>\n </div>\n <ccd-field-write [caseField]=\"item.caseField\"\n [caseFields]=\"caseFields\"\n [formGroup]=\"formGroup\"\n [parent]=\"item.container\"\n [idPrefix]=\"item.prefix\"\n [hidden]=\"item.caseField.hidden\"\n [isExpanded]=\"isExpanded\"\n [isInSearchBlock]=\"isInSearchBlock\">\n </ccd-field-write>\n </div>\n </fieldset>\n </div>\n\n <button class=\"button write-collection-add-item__bottom\" type=\"button\" (click)=\"addItem(false)\" [disabled]=\"isNotAuthorisedToCreate() || isSearchFilter()\" *ngIf=\"caseField.value && caseField.value.length\">{{'Add new' | rpxTranslate }}</button>\n\n </div>\n\n</div>\n", styles: [".collection-field-table tr:first-child>td{padding-top:0}.collection-field-table tr:last-child>td{border-bottom:none}.collection-field-table td.collection-actions{width:1px;white-space:nowrap}.error-spacing{margin-top:10px}.collection-title{height:51px}.float-left{float:left;padding-top:8px}.float-right{float:right}.complex-panel{margin:13px 0;border:1px solid #bfc1c3}.complex-panel .complex-panel-title{background-color:#dee0e2;padding:5px 5px 2px;border-bottom:1px solid #bfc1c3;display:block;color:#0b0c0c;font-family:nta,Arial,sans-serif;font-weight:700;text-transform:none;font-size:16px;line-height:1.25}@media(min-width:641px){.complex-panel .complex-panel-title{font-size:19px;line-height:1.3157894737}}.complex-panel .complex-panel-table>tbody>tr>th{vertical-align:top}.complex-panel .complex-panel-table>tbody>tr:last-child>th,.complex-panel .complex-panel-table>tbody>tr:last-child>td{border-bottom:none}.complex-panel .complex-panel-simple-field th{padding-left:5px;width:295px}.complex-panel .complex-panel-compound-field td{padding:5px}.collection-indicator{border-left:solid 5px #b1b4b6}\n"] }]
15463
+ args: [{ selector: 'ccd-write-collection-field', standalone: false, template: "<div class=\"form-group\" [id]=\"id()\">\n\n <div class=\"panel collection-indicator\">\n\n <h2 class=\"heading-h2 error-spacing\" *ngIf=\"!caseField.hidden\">\n {{(caseField | ccdFieldLabel)}}\n </h2>\n <button class=\"button write-collection-add-item__top\" type=\"button\" (click)=\"addItem(true)\" [disabled]=\"isNotAuthorisedToCreate() || isSearchFilter()\">{{'Add new' | rpxTranslate}}</button>\n <h2 class=\"heading-h2 error-spacing\" *ngIf=\"caseField.hint_text || formArray.errors\">\n <span *ngIf=\"caseField.hint_text\" class=\"form-hint\">\n <ccd-markdown [content]=\"caseField.hint_text | rpxTranslate\"></ccd-markdown>\n </span>\n <span *ngIf=\"formArray.errors\" class=\"error-message\">\n {{(formArray.errors | ccdFirstError:caseField.label)}}\n </span>\n </h2>\n\n <div class=\"form-group\" [hidden]=\"caseField.hidden\" *ngIf=\"caseField.value && caseField.value.length\">\n <fieldset class=\"govuk-fieldset\">\n <div *ngFor=\"let item of collItems; let i = index; trackBy: trackByCollectionItem\" #collectionItem\n [id]=\"this.buildIdPrefix(i) + i\" class=\"form-group\">\n <div class=\"collection-title\">\n <div class=\"float-left\">\n <legend class=\"govuk-fieldset__legend\">\n <label [for]=\"item.prefix + i\"><h3 class=\"heading-h3\">{{itemLabel(i) | rpxTranslate}}</h3></label>\n </legend>\n </div>\n <div class=\"float-right\">\n <button class=\"button button-secondary\" type=\"button\" (click)=\"openModal(i)\"\n [disabled]=\"isNotAuthorisedToDelete(i)\"\n attr.aria-label=\"Remove {{ itemLabel(i) }}\">{{'Remove' | rpxTranslate}}</button>\n </div>\n </div>\n <ccd-field-write [caseField]=\"item.caseField\"\n [caseFields]=\"caseFields\"\n [formGroup]=\"formGroup\"\n [parent]=\"item.container\"\n [idPrefix]=\"item.prefix\"\n [hidden]=\"item.caseField.hidden\"\n [isExpanded]=\"isExpanded\"\n [isInSearchBlock]=\"isInSearchBlock\">\n </ccd-field-write>\n </div>\n </fieldset>\n </div>\n\n <button class=\"button write-collection-add-item__bottom\" type=\"button\" (click)=\"addItem(false)\" [disabled]=\"isNotAuthorisedToCreate() || isSearchFilter()\" *ngIf=\"caseField.value && caseField.value.length\">{{'Add new' | rpxTranslate }}</button>\n\n </div>\n\n</div>\n", styles: [".collection-field-table tr:first-child>td{padding-top:0}.collection-field-table tr:last-child>td{border-bottom:none}.collection-field-table td.collection-actions{width:1px;white-space:nowrap}.error-spacing{margin-top:10px}.collection-title{height:51px}.float-left{float:left;padding-top:8px}.float-right{float:right}.complex-panel{margin:13px 0;border:1px solid #bfc1c3}.complex-panel .complex-panel-title{background-color:#dee0e2;padding:5px 5px 2px;border-bottom:1px solid #bfc1c3;display:block;color:#0b0c0c;font-family:nta,Arial,sans-serif;font-weight:700;text-transform:none;font-size:16px;line-height:1.25}@media(min-width:641px){.complex-panel .complex-panel-title{font-size:19px;line-height:1.3157894737}}.complex-panel .complex-panel-table>tbody>tr>th{vertical-align:top}.complex-panel .complex-panel-table>tbody>tr:last-child>th,.complex-panel .complex-panel-table>tbody>tr:last-child>td{border-bottom:none}.complex-panel .complex-panel-simple-field th{padding-left:5px;width:295px}.complex-panel .complex-panel-compound-field td{padding:5px}.collection-indicator{border-left:solid 5px #b1b4b6}\n"] }]
15346
15464
  }], () => [{ type: i1$3.MatLegacyDialog }, { type: i2.ScrollToService }, { type: ProfileNotifier }, { type: i0.ChangeDetectorRef }], { caseFields: [{
15347
15465
  type: Input
15348
15466
  }], items: [{
15349
15467
  type: ViewChildren,
15350
15468
  args: ['collectionItem']
15351
15469
  }] }); })();
15352
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(WriteCollectionFieldComponent, { className: "WriteCollectionFieldComponent", filePath: "lib/shared/components/palette/collection/write-collection-field.component.ts", lineNumber: 32 }); })();
15470
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(WriteCollectionFieldComponent, { className: "WriteCollectionFieldComponent", filePath: "lib/shared/components/palette/collection/write-collection-field.component.ts", lineNumber: 33 }); })();
15353
15471
 
15354
15472
  function ReadComplexFieldComponent_ccd_read_complex_field_raw_1_Template(rf, ctx) { if (rf & 1) {
15355
15473
  i0.ɵɵelement(0, "ccd-read-complex-field-raw", 4);
@@ -16290,11 +16408,13 @@ class MarkdownComponent {
16290
16408
  }
16291
16409
  renderUrlToText() {
16292
16410
  const renderer = new marked.Renderer();
16293
- renderer.link = (href, title, text) => {
16294
- if (!text || text === href) {
16295
- return this.isAllowedUrl(href) ? `<a href="${href}">${href}</a>` : href;
16411
+ renderer.link = ({ href, tokens }) => {
16412
+ const linkHref = href || '';
16413
+ const text = tokens?.map((token) => token.raw).join('') || linkHref;
16414
+ if (!text || text === linkHref) {
16415
+ return this.isAllowedUrl(linkHref) ? `<a href="${linkHref}">${linkHref}</a>` : linkHref;
16296
16416
  }
16297
- return this.detectMarkdownLinks(this.content) ? `<a href="${href}">${text}</a>` : text;
16417
+ return this.detectMarkdownLinks(this.content) ? `<a href="${linkHref}">${text}</a>` : text;
16298
16418
  };
16299
16419
  marked.setOptions({
16300
16420
  renderer: renderer
@@ -16329,7 +16449,7 @@ class MarkdownComponent {
16329
16449
  }], renderUrlToTextFeature: [{
16330
16450
  type: Input
16331
16451
  }] }); })();
16332
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MarkdownComponent, { className: "MarkdownComponent", filePath: "lib/shared/components/palette/markdown/markdown.component.ts", lineNumber: 11 }); })();
16452
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MarkdownComponent, { className: "MarkdownComponent", filePath: "lib/shared/components/palette/markdown/markdown.component.ts", lineNumber: 12 }); })();
16333
16453
 
16334
16454
  class FixedListPipe {
16335
16455
  static EMPTY = '';
@@ -20780,14 +20900,14 @@ class PaymentField extends AbstractFieldReadComponent {
20780
20900
  return this.appConfig.getNotificationUrl();
20781
20901
  }
20782
20902
  getUserRoles() {
20783
- const userDetails = JSON.parse(this.sessionStorage.getItem('userDetails') || null);
20903
+ const userDetails = safeJsonParse(this.sessionStorage.getItem('userDetails'), null);
20784
20904
  if (!userDetails || !userDetails.hasOwnProperty('roles')) {
20785
20905
  return [];
20786
20906
  }
20787
20907
  return userDetails.roles;
20788
20908
  }
20789
20909
  getUserEmail() {
20790
- const userDetails = JSON.parse(this.sessionStorage.getItem('userDetails') || null);
20910
+ const userDetails = safeJsonParse(this.sessionStorage.getItem('userDetails'), null);
20791
20911
  if (!userDetails || !userDetails.hasOwnProperty('sub')) {
20792
20912
  return '';
20793
20913
  }
@@ -21513,7 +21633,7 @@ class QueryManagementService {
21513
21633
  ) {
21514
21634
  let currentUserDetails;
21515
21635
  try {
21516
- currentUserDetails = JSON.parse(this.sessionStorageService.getItem(USER_DETAILS));
21636
+ currentUserDetails = safeJsonParse(this.sessionStorageService.getItem(USER_DETAILS), {});
21517
21637
  }
21518
21638
  catch (e) {
21519
21639
  console.error('Could not parse USER_DETAILS from session storage:', e);
@@ -24975,6 +25095,7 @@ class FieldWriteComponent extends AbstractFieldWriteComponent {
24975
25095
  canHaveGreyBar = false;
24976
25096
  caseFields = [];
24977
25097
  fieldContainer;
25098
+ componentRef;
24978
25099
  constructor(resolver, paletteService) {
24979
25100
  super();
24980
25101
  this.resolver = resolver;
@@ -24986,7 +25107,7 @@ class FieldWriteComponent extends AbstractFieldWriteComponent {
24986
25107
  ngOnInit() {
24987
25108
  const componentClass = this.paletteService.getFieldComponentClass(this.caseField, true);
24988
25109
  const injector = Injector.create([], this.fieldContainer.parentInjector);
24989
- const component = this.resolver.resolveComponentFactory(componentClass).create(injector);
25110
+ this.componentRef = this.resolver.resolveComponentFactory(componentClass).create(injector);
24990
25111
  // Only Fixed list use plainToClassFromExist
24991
25112
  // Better performance
24992
25113
  // TODO AW 30/12/20 figure out why FixedLists need plainToClassFromExist
@@ -24995,28 +25116,41 @@ class FieldWriteComponent extends AbstractFieldWriteComponent {
24995
25116
  if (FIX_CASEFIELD_FOR.indexOf(this.caseField.field_type.type) > -1 && !(this.caseField instanceof CaseField)) {
24996
25117
  this.caseField = plainToClassFromExist(new CaseField(), this.caseField);
24997
25118
  }
24998
- component.instance['caseField'] = this.caseField;
24999
- component.instance['caseFields'] = this.caseFields;
25000
- component.instance['formGroup'] = this.formGroup;
25001
- component.instance['parent'] = this.parent;
25002
- component.instance['idPrefix'] = this.idPrefix;
25119
+ this.applyInputsToChild();
25003
25120
  if (this.caseField.field_type.id === 'AddressGlobal') {
25004
- component.instance['ignoreMandatory'] = true;
25121
+ this.componentRef.instance['ignoreMandatory'] = true;
25005
25122
  }
25006
- component.instance['isExpanded'] = this.isExpanded;
25007
- component.instance['isInSearchBlock'] = this.isInSearchBlock;
25008
- this.fieldContainer.insert(component.hostView);
25123
+ this.fieldContainer.insert(this.componentRef.hostView);
25009
25124
  // EUI-3267.
25010
25125
  // Set up the flag for whether this can have a grey bar.
25011
25126
  this.canHaveGreyBar = this.caseField.show_condition && this.caseField.field_type.type !== 'Collection';
25012
25127
  }
25128
+ ngOnChanges(changes) {
25129
+ if (this.componentRef && (changes.caseField || changes.caseFields || changes.formGroup || changes.parent || changes.idPrefix
25130
+ || changes.isExpanded || changes.isInSearchBlock)) {
25131
+ this.applyInputsToChild();
25132
+ this.componentRef.changeDetectorRef.detectChanges();
25133
+ }
25134
+ }
25135
+ applyInputsToChild() {
25136
+ if (!this.componentRef) {
25137
+ return;
25138
+ }
25139
+ this.componentRef.instance['caseField'] = this.caseField;
25140
+ this.componentRef.instance['caseFields'] = this.caseFields;
25141
+ this.componentRef.instance['formGroup'] = this.formGroup;
25142
+ this.componentRef.instance['parent'] = this.parent;
25143
+ this.componentRef.instance['idPrefix'] = this.idPrefix;
25144
+ this.componentRef.instance['isExpanded'] = this.isExpanded;
25145
+ this.componentRef.instance['isInSearchBlock'] = this.isInSearchBlock;
25146
+ }
25013
25147
  static ɵfac = function FieldWriteComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FieldWriteComponent)(i0.ɵɵdirectiveInject(i0.ComponentFactoryResolver), i0.ɵɵdirectiveInject(PaletteService)); };
25014
25148
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FieldWriteComponent, selectors: [["ccd-field-write"]], viewQuery: function FieldWriteComponent_Query(rf, ctx) { if (rf & 1) {
25015
25149
  i0.ɵɵviewQuery(_c0$y, 7, ViewContainerRef);
25016
25150
  } if (rf & 2) {
25017
25151
  let _t;
25018
25152
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.fieldContainer = _t.first);
25019
- } }, inputs: { caseFields: "caseFields" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 3, consts: [["fieldContainer", ""], [3, "hidden"]], template: function FieldWriteComponent_Template(rf, ctx) { if (rf & 1) {
25153
+ } }, inputs: { caseFields: "caseFields" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 3, vars: 3, consts: [["fieldContainer", ""], [3, "hidden"]], template: function FieldWriteComponent_Template(rf, ctx) { if (rf & 1) {
25020
25154
  i0.ɵɵelementStart(0, "div", 1);
25021
25155
  i0.ɵɵelementContainer(1, null, 0);
25022
25156
  i0.ɵɵelementEnd();
@@ -30472,7 +30606,9 @@ class EventLogTableComponent {
30472
30606
  }
30473
30607
  ngOnInit() {
30474
30608
  this.isPartOfCaseTimeline = this.onCaseHistory.observers.length > 0;
30475
- this.isUserExternal = JSON.parse(this.sessionStorage.getItem('userDetails')).roles.includes('pui-case-manager');
30609
+ const userDetails = safeJsonParse(this.sessionStorage.getItem('userDetails'), null);
30610
+ const roles = userDetails?.roles || [];
30611
+ this.isUserExternal = roles.includes('pui-case-manager');
30476
30612
  }
30477
30613
  select(event) {
30478
30614
  this.selected = event;
@@ -30561,7 +30697,7 @@ class EventLogTableComponent {
30561
30697
  }], onCaseHistory: [{
30562
30698
  type: Output
30563
30699
  }] }); })();
30564
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EventLogTableComponent, { className: "EventLogTableComponent", filePath: "lib/shared/components/palette/history/event-log/event-log-table.component.ts", lineNumber: 12 }); })();
30700
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EventLogTableComponent, { className: "EventLogTableComponent", filePath: "lib/shared/components/palette/history/event-log/event-log-table.component.ts", lineNumber: 13 }); })();
30565
30701
 
30566
30702
  function EventLogComponent_ccd_event_log_table_3_Template(rf, ctx) { if (rf & 1) {
30567
30703
  const _r1 = i0.ɵɵgetCurrentView();
@@ -30789,6 +30925,101 @@ class ReadFieldsFilterPipe {
30789
30925
  static isCompound(field) {
30790
30926
  return ReadFieldsFilterPipe.NESTED_TYPES[field.field_type.type];
30791
30927
  }
30928
+ static findAncestorOfType(field, type) {
30929
+ let current = field?.parent;
30930
+ while (current) {
30931
+ if (current?.field_type?.type === type) {
30932
+ return current;
30933
+ }
30934
+ current = current.parent || undefined;
30935
+ }
30936
+ return undefined;
30937
+ }
30938
+ static getCollectionItemValue(field) {
30939
+ let current = field?.parent;
30940
+ while (current) {
30941
+ if (current?.field_type?.type === 'Complex' && current?.parent?.field_type?.type === 'Collection') {
30942
+ return current.value || {};
30943
+ }
30944
+ current = current.parent || undefined;
30945
+ }
30946
+ return {};
30947
+ }
30948
+ static getBaseConditionalShowContext(formGroup, values) {
30949
+ const currentValues = values || {};
30950
+ if (!formGroup) {
30951
+ return { checkConditionalShowAgainst: currentValues, formGroupAvailable: false };
30952
+ }
30953
+ return {
30954
+ checkConditionalShowAgainst: formGroup.value ? formGroup.parent.getRawValue().data : formGroup,
30955
+ formGroupAvailable: true
30956
+ };
30957
+ }
30958
+ static resolvePrefixedConditionalShowContext(checkConditionalShowAgainst, currentValues, idPrefix) {
30959
+ const fieldId = idPrefix.substring(0, idPrefix.indexOf('_'));
30960
+ if (checkConditionalShowAgainst[fieldId]) {
30961
+ return {
30962
+ checkConditionalShowAgainst: currentValues,
30963
+ formGroupAvailable: false
30964
+ };
30965
+ }
30966
+ return {
30967
+ checkConditionalShowAgainst,
30968
+ formGroupAvailable: true
30969
+ };
30970
+ }
30971
+ static resolveCollectionConditionalShowContext(complexField, checkConditionalShowAgainst, currentValues) {
30972
+ const collectionItemValue = ReadFieldsFilterPipe.getCollectionItemValue(complexField);
30973
+ if (Object.keys(collectionItemValue).length > 0) {
30974
+ return {
30975
+ checkConditionalShowAgainst: Object.assign(collectionItemValue, currentValues),
30976
+ formGroupAvailable: false
30977
+ };
30978
+ }
30979
+ return {
30980
+ checkConditionalShowAgainst: Object.assign(checkConditionalShowAgainst, currentValues),
30981
+ formGroupAvailable: false
30982
+ };
30983
+ }
30984
+ static resolveFallbackConditionalShowContext(checkConditionalShowAgainst, currentValues) {
30985
+ return {
30986
+ checkConditionalShowAgainst: Object.assign(checkConditionalShowAgainst, currentValues),
30987
+ formGroupAvailable: false
30988
+ };
30989
+ }
30990
+ static getConditionalShowContext(complexField, formGroup, path, idPrefix, values) {
30991
+ const currentValues = values || {};
30992
+ const baseContext = ReadFieldsFilterPipe.getBaseConditionalShowContext(formGroup, currentValues);
30993
+ let checkConditionalShowAgainst = baseContext.checkConditionalShowAgainst;
30994
+ let formGroupAvailable = baseContext.formGroupAvailable;
30995
+ if (!formGroup || idPrefix === undefined) {
30996
+ return { checkConditionalShowAgainst, formGroupAvailable };
30997
+ }
30998
+ if (idPrefix !== '') {
30999
+ return ReadFieldsFilterPipe.resolvePrefixedConditionalShowContext(checkConditionalShowAgainst, currentValues, idPrefix);
31000
+ }
31001
+ if (path === 'parent_value' && ReadFieldsFilterPipe.findAncestorOfType(complexField, 'Collection')) {
31002
+ return ReadFieldsFilterPipe.resolveCollectionConditionalShowContext(complexField, checkConditionalShowAgainst, currentValues);
31003
+ }
31004
+ return ReadFieldsFilterPipe.resolveFallbackConditionalShowContext(checkConditionalShowAgainst, currentValues);
31005
+ }
31006
+ static cloneFieldWithValue(field, values, index) {
31007
+ const clone = FieldsUtils.cloneObject(field);
31008
+ const value = ReadFieldsFilterPipe.getValue(field, values, index);
31009
+ if (!ReadFieldsFilterPipe.isEmpty(value)) {
31010
+ clone.value = value;
31011
+ }
31012
+ return clone;
31013
+ }
31014
+ static applyDisplayContextAndHidden(field, complexField, setupHidden, checkConditionalShowAgainst, formGroupAvailable, path) {
31015
+ if (!field.display_context && FieldsUtils.isValidDisplayContext(complexField.display_context)) {
31016
+ field.display_context = complexField.display_context;
31017
+ }
31018
+ if (setupHidden) {
31019
+ ReadFieldsFilterPipe.evaluateConditionalShow(field, checkConditionalShowAgainst, path, formGroupAvailable, complexField.id);
31020
+ }
31021
+ return field;
31022
+ }
30792
31023
  static isValidCompound(field, value, checkConditionalShowAgainst) {
30793
31024
  return ReadFieldsFilterPipe.isCompound(field)
30794
31025
  && ReadFieldsFilterPipe.NESTED_TYPES[field.field_type.type](field, value, checkConditionalShowAgainst);
@@ -30860,46 +31091,11 @@ class ReadFieldsFilterPipe {
30860
31091
  }
30861
31092
  const fields = complexField.field_type.complex_fields || [];
30862
31093
  const values = complexField.value || {};
30863
- let checkConditionalShowAgainst = values;
30864
- let formGroupAvailable = false;
30865
- if (formGroup) {
30866
- checkConditionalShowAgainst = formGroup.value ? formGroup.parent.getRawValue().data : formGroup;
30867
- formGroupAvailable = true;
30868
- if (idPrefix !== undefined) {
30869
- if (idPrefix !== '') {
30870
- const fieldId = idPrefix.substring(0, idPrefix.indexOf('_'));
30871
- if (checkConditionalShowAgainst[fieldId]) {
30872
- checkConditionalShowAgainst = values;
30873
- formGroupAvailable = false;
30874
- }
30875
- }
30876
- else {
30877
- checkConditionalShowAgainst = Object.assign(checkConditionalShowAgainst, values);
30878
- formGroupAvailable = false;
30879
- }
30880
- }
30881
- }
31094
+ const conditionalShowContext = ReadFieldsFilterPipe.getConditionalShowContext(complexField, formGroup, path, idPrefix, values);
30882
31095
  return fields
30883
- .map(f => {
30884
- const clone = FieldsUtils.cloneObject(f);
30885
- const value = ReadFieldsFilterPipe.getValue(f, values, index);
30886
- if (!ReadFieldsFilterPipe.isEmpty(value)) {
30887
- clone.value = value;
30888
- }
30889
- return clone;
30890
- })
30891
- .map(f => {
30892
- if (!f.display_context) {
30893
- if (FieldsUtils.isValidDisplayContext(complexField.display_context)) {
30894
- f.display_context = complexField.display_context;
30895
- }
30896
- }
30897
- if (setupHidden) {
30898
- ReadFieldsFilterPipe.evaluateConditionalShow(f, checkConditionalShowAgainst, path, formGroupAvailable, complexField.id);
30899
- }
30900
- return f;
30901
- })
30902
- .filter(f => keepEmpty || ReadFieldsFilterPipe.keepField(f, undefined, false, checkConditionalShowAgainst));
31096
+ .map(f => ReadFieldsFilterPipe.cloneFieldWithValue(f, values, index))
31097
+ .map(f => ReadFieldsFilterPipe.applyDisplayContextAndHidden(f, complexField, setupHidden, conditionalShowContext.checkConditionalShowAgainst, conditionalShowContext.formGroupAvailable, path))
31098
+ .filter(f => keepEmpty || ReadFieldsFilterPipe.keepField(f, undefined, false, conditionalShowContext.checkConditionalShowAgainst));
30903
31099
  }
30904
31100
  static ɵfac = function ReadFieldsFilterPipe_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ReadFieldsFilterPipe)(); };
30905
31101
  static ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "ccdReadFieldsFilter", type: ReadFieldsFilterPipe, pure: true, standalone: false });
@@ -35343,7 +35539,7 @@ class CaseResolver {
35343
35539
  // as discussed for EUI-5456, need functionality to go to default page
35344
35540
  goToDefaultPage() {
35345
35541
  console.info('Going to default page!');
35346
- const userDetails = JSON.parse(this.sessionStorage.getItem(USER_DETAILS));
35542
+ const userDetails = safeJsonParse(this.sessionStorage.getItem(USER_DETAILS));
35347
35543
  userDetails && userDetails.roles
35348
35544
  && !userDetails.roles.includes(PUI_CASE_MANAGER)
35349
35545
  &&
@@ -35396,7 +35592,7 @@ class EventTriggerResolver {
35396
35592
  const query = route.queryParams;
35397
35593
  // If jurisdiction or caseType are missing, redirect to correct URL
35398
35594
  if (!jurisdiction || !caseType) {
35399
- const caseInfo = JSON.parse(this.sessionStorageService.getItem('caseInfo') || '{}');
35595
+ const caseInfo = safeJsonParse(this.sessionStorageService.getItem('caseInfo'), {});
35400
35596
  const jurisdictionId = caseInfo?.jurisdiction;
35401
35597
  const caseTypeId = caseInfo?.caseType;
35402
35598
  const caseId = caseInfo?.caseId;
@@ -39673,7 +39869,7 @@ class CreateCaseFiltersComponent {
39673
39869
  return events.filter(event => event.pre_states.length === 0);
39674
39870
  }
39675
39871
  retainEventsWithCreateRights(events) {
39676
- const userProfile = JSON.parse(this.sessionStorageService.getItem(USER_DETAILS));
39872
+ const userProfile = safeJsonParse(this.sessionStorageService.getItem(USER_DETAILS), null);
39677
39873
  return events.filter(event => userProfile && userProfile.roles &&
39678
39874
  !!userProfile.roles.find(role => this.hasCreateAccess(event, role)));
39679
39875
  }
@@ -39811,7 +40007,7 @@ class CreateCaseFiltersComponent {
39811
40007
  }], selectionChanged: [{
39812
40008
  type: Output
39813
40009
  }] }); })();
39814
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CreateCaseFiltersComponent, { className: "CreateCaseFiltersComponent", filePath: "lib/shared/components/create-case-filters/create-case-filters.component.ts", lineNumber: 19 }); })();
40010
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CreateCaseFiltersComponent, { className: "CreateCaseFiltersComponent", filePath: "lib/shared/components/create-case-filters/create-case-filters.component.ts", lineNumber: 20 }); })();
39815
40011
 
39816
40012
  class CreateCaseFiltersModule {
39817
40013
  static ɵfac = function CreateCaseFiltersModule_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CreateCaseFiltersModule)(); };
@@ -41432,5 +41628,5 @@ class TestRouteSnapshotBuilder {
41432
41628
  * Generated bundle index. Do not edit.
41433
41629
  */
41434
41630
 
41435
- export { AbstractAppConfig, AbstractFieldReadComponent, AbstractFieldWriteComponent, AbstractFieldWriteJourneyComponent, AbstractJourneyComponent, Activity, ActivityBannerComponent, ActivityComponent, ActivityIconComponent, ActivityInfo, ActivityModule, ActivityPollingService, ActivityService, AddCommentsComponent, AddCommentsErrorMessage, AddCommentsStep, AddressModel, AddressOption, AddressesService, Alert, AlertComponent, AlertIconClassPipe, AlertMessageType, AlertModule, AlertService, AuthService, Banner, BannersService, BeforeYouStartComponent, BodyComponent, BrowserService, CCDCaseLinkType, COMPONENT_PORTAL_INJECTION_TOKEN, CallbackErrorsComponent, CallbackErrorsContext, CaseAccessUtils, CaseBasicAccessViewComponent, CaseChallengedAccessRequestComponent, CaseChallengedAccessSuccessComponent, CaseCreateComponent, CaseDetails, CaseEditComponent, CaseEditConfirmComponent, CaseEditDataModule, CaseEditDataService, CaseEditFormComponent, CaseEditPageComponent, CaseEditSubmitComponent, CaseEditWizardGuard, CaseEditorConfig, CaseEditorModule, CaseEvent, CaseEventCompletionComponent, CaseEventCompletionTaskCancelledComponent, CaseEventCompletionTaskReassignedComponent, CaseEventData, CaseEventTrigger, CaseEventTriggerComponent, CaseField, CaseFieldService, CaseFileViewFieldComponent, CaseFileViewFolderComponent, CaseFileViewFolderDocumentActionsComponent, CaseFileViewFolderSelectorComponent, CaseFileViewFolderSortComponent, CaseFileViewFolderToggleComponent, CaseFileViewOverlayMenuComponent, CaseFileViewService, CaseFlagCheckYourAnswersPageStep, CaseFlagDisplayContextParameter, CaseFlagErrorMessage, CaseFlagFieldState, CaseFlagFormFields, CaseFlagRefdataService, CaseFlagStatus, CaseFlagSummaryListComponent, CaseFlagSummaryListDisplayMode, CaseFlagTableComponent, CaseFlagWizardStepTitle, CaseFullAccessViewComponent, CaseHeaderComponent, CaseHeaderModule, CaseHistoryViewerFieldComponent, CaseLink, CaseLinkResponse, CaseListComponent, CaseListFiltersComponent, CaseListFiltersModule, CaseListModule, CaseNotifier, CasePaymentHistoryViewerFieldComponent, CasePrintDocument, CasePrinterComponent, CaseProgressComponent, CaseReferencePipe, CaseResolver, CaseSpecificAccessRequestComponent, CaseSpecificAccessSuccessComponent, CaseState, CaseTab, CaseTimelineComponent, CaseTimelineDisplayMode, CaseTimelineModule, CaseType, CaseTypeLite, CaseView, CaseViewComponent, CaseViewEvent, CaseViewTrigger, CaseViewerComponent, CaseViewerModule, CasesService, CaseworkerService, CcdCYAPageLabelFilterPipe, CcdCaseTitlePipe, CcdCollectionTableCaseFieldsFilterPipe, CcdPageFieldsPipe, CcdTabFieldsPipe, CheckYourAnswersComponent, CloseQueryComponent, ConditionalShowFormDirective, ConditionalShowModule, ConditionalShowRegistrarService, ConfirmFlagStatusComponent, ConfirmStatusErrorMessage, ConfirmStatusStep, Confirmation, ConvertHrefToRouterService, CreateCaseFiltersComponent, CreateCaseFiltersModule, CreateCaseFiltersSelection, DRAFT_PREFIX, DRAFT_QUERY_PARAM, DashPipe, DateInputComponent, DatePipe, DateTimeFormatUtils, DatetimePickerComponent, DefinitionsModule, DefinitionsService, DeleteOrCancelDialogComponent, DialogsModule, DisplayMode, Document, DocumentData, DocumentDialogComponent, DocumentLinks, DocumentManagementService, DocumentUrlPipe, Draft, DraftService, DynamicListPipe, DynamicRadioListPipe, ESQueryType, Embedded, EnumDisplayDescriptionPipe, ErrorMessageComponent, ErrorNotifierService, EventCaseField, EventCompletionReturnStates, EventCompletionStateMachineService, EventCompletionStates, EventLogComponent, EventLogDetailsComponent, EventLogTableComponent, EventMessageModule, EventStartComponent, EventStartModule, EventStartStateMachineService, EventStatusService, EventTriggerResolver, EventTriggerService, Fee, FeeValue, Field, FieldLabelPipe, FieldReadComponent, FieldReadLabelComponent, FieldType, FieldTypeSanitiser, FieldWriteComponent, FieldsFilterPipe, FieldsPurger, FieldsUtils, FirstErrorPipe, FixedListItem, FixedListPipe, FixedRadioListPipe, FlagFieldDisplayPipe, FocusElementDirective, FocusElementModule, FooterComponent, FormDocument, FormErrorService, FormValidatorsService, FormValueService, FormatTranslatorService, GreyBarService, HRef, HeaderBarComponent, HeadersModule, HttpError, HttpErrorService, HttpService, IsCompoundPipe, IsMandatoryPipe, IsReadOnlyAndNotCollectionPipe, IsReadOnlyPipe, JudicialworkerService, Jurisdiction, JurisdictionService, LabelFieldComponent, LabelSubstitutorDirective, LabelSubstitutorModule, LanguageInterpreterDisplayPipe, LinkCaseReason, LinkCasesComponent, LinkCasesFromReasonValuePipe, LinkCasesReasonValuePipe, LinkDetails, LinkFromReason, LinkReason, LinkedCasesErrorMessages, LinkedCasesEventTriggers, LinkedCasesFromTableComponent, LinkedCasesPages, LinkedCasesResponse, LinkedCasesToTableComponent, LoadingModule, LoadingService, LoadingSpinnerComponent, LoadingSpinnerModule, MEDIA_VIEWER_LOCALSTORAGE_KEY, MULTIPLE_TASKS_FOUND, ManageCaseFlagsComponent, ManageCaseFlagsLabelDisplayPipe, MarkdownComponent, MarkdownComponentModule, MoneyGbpInputComponent, MultipageComponentStateService, MultipleTasksExistComponent, NavigationComponent, NavigationItemComponent, NavigationNotifierService, NavigationOrigin, NoLinkedCasesComponent, NoTasksAvailableComponent, NotificationBannerComponent, NotificationBannerHeaderClass, NotificationBannerType, OrderService, OrderSummary, OrganisationConverter, OrganisationService, PageValidationService, PaginationComponent, PaginationMetadata, PaginationModule, PaletteContext, PaletteModule, PaletteService, PaletteUtilsModule, Patterns, PaymentField, PhaseComponent, PipesModule, PlaceholderService, PrintUrlPipe, Profile, ProfileNotifier, ProfileService, QualifyingQuestionDetailComponent, QualifyingQuestionOptionsComponent, QualifyingQuestionService, QualifyingQuestionsErrorMessage, QueryAttachmentsReadComponent, QueryCaseDetailsHeaderComponent, QueryCheckYourAnswersComponent, QueryConfirmationComponent, QueryCreateContext, QueryDetailsComponent, QueryEventCompletionComponent, QueryItemResponseStatus, QueryListComponent, QueryListData, QueryListItem, QueryManagementService, QueryWriteAddDocumentsComponent, QueryWriteDateInputComponent, QueryWriteRaiseQueryComponent, QueryWriteRespondToQueryComponent, RaiseQueryErrorMessage, ReadCaseFlagFieldComponent, ReadCaseLinkFieldComponent, ReadCollectionFieldComponent, ReadComplexFieldCollectionTableComponent, ReadComplexFieldComponent, ReadComplexFieldRawComponent, ReadComplexFieldTableComponent, ReadCookieService, ReadDateFieldComponent, ReadDocumentFieldComponent, ReadDynamicListFieldComponent, ReadDynamicMultiSelectListFieldComponent, ReadDynamicRadioListFieldComponent, ReadEmailFieldComponent, ReadFieldsFilterPipe, ReadFixedListFieldComponent, ReadFixedRadioListFieldComponent, ReadJudicialUserFieldComponent, ReadLinkedCasesFieldComponent, ReadMoneyGbpFieldComponent, ReadMultiSelectListFieldComponent, ReadNumberFieldComponent, ReadOrderSummaryFieldComponent, ReadOrderSummaryRowComponent, ReadOrganisationFieldComponent, ReadOrganisationFieldRawComponent, ReadOrganisationFieldTableComponent, ReadPhoneUKFieldComponent, ReadQueryManagementFieldComponent, ReadTextAreaFieldComponent, ReadTextFieldComponent, ReadYesNoFieldComponent, RefdataCaseFlagType, RemoveDialogComponent, RequestOptionsBuilder, RespondToQueryErrorMessages, RetryUtil, RouterHelperService, RouterLinkComponent, SaveOrDiscardDialogComponent, SearchFiltersComponent, SearchFiltersModule, SearchFiltersWrapperComponent, SearchInput, SearchLanguageInterpreterComponent, SearchLanguageInterpreterErrorMessage, SearchLanguageInterpreterStep, SearchResultComponent, SearchResultModule, SearchResultView, SearchResultViewColumn, SearchResultViewItem, SearchResultViewItemComparatorFactory, SearchService, SelectFlagErrorMessage, SelectFlagLocationComponent, SelectFlagLocationErrorMessage, SelectFlagTypeComponent, SelectFlagTypeErrorMessage, SessionStorageService, ShowCondition, SortOrder$1 as SortOrder, SortParameters, SortSearchResultPipe, TabComponent, TableColumnConfig, TableConfig, TabsComponent, TabsModule, TaskAssignedComponent, TaskCancelledComponent, TaskConflictComponent, TaskUnassignedComponent, Terms, TestRouteSnapshotBuilder, TranslatedMarkdownDirective, TranslatedMarkdownModule, UnLinkCasesComponent, UnsupportedFieldComponent, UpdateFlagAddTranslationErrorMessage, UpdateFlagAddTranslationFormComponent, UpdateFlagAddTranslationStep, UpdateFlagComponent, UpdateFlagErrorMessage, UpdateFlagStep, UpdateFlagTitleDisplayPipe, WaysToPayFieldComponent, WindowService, Wizard, WizardFactoryService, WizardPage, WizardPageField, WorkAllocationService, WorkbasketFiltersComponent, WorkbasketFiltersModule, WorkbasketInput, WorkbasketInputFilterService, WorkbasketInputModel, WriteAddressFieldComponent, WriteCaseFlagFieldComponent, WriteCaseLinkFieldComponent, WriteCollectionFieldComponent, WriteComplexFieldComponent, WriteDateContainerFieldComponent, WriteDateFieldComponent, WriteDocumentFieldComponent, WriteDynamicListFieldComponent, WriteDynamicMultiSelectListFieldComponent, WriteDynamicRadioListFieldComponent, WriteEmailFieldComponent, WriteFixedListFieldComponent, WriteFixedRadioListFieldComponent, WriteJudicialUserFieldComponent, WriteLinkedCasesFieldComponent, WriteMoneyGbpFieldComponent, WriteMultiSelectListFieldComponent, WriteNumberFieldComponent, WriteOrderSummaryFieldComponent, WriteOrganisationComplexFieldComponent, WriteOrganisationFieldComponent, WritePhoneUKFieldComponent, WriteTextAreaFieldComponent, WriteTextFieldComponent, WriteYesNoFieldComponent, YesNoService, aCaseField, caseMessagesMockData, createACL, createCaseEventTrigger, createCaseField, createComplexFieldOverride, createFieldType, createFixedListFieldType, createHiddenComplexFieldOverride, createMultiSelectListFieldType, createWizardPage, createWizardPageField, editorRouting, initDialog, newCaseField, textFieldType, viewerRouting };
41631
+ export { AbstractAppConfig, AbstractFieldReadComponent, AbstractFieldWriteComponent, AbstractFieldWriteJourneyComponent, AbstractJourneyComponent, Activity, ActivityBannerComponent, ActivityComponent, ActivityIconComponent, ActivityInfo, ActivityModule, ActivityPollingService, ActivityService, AddCommentsComponent, AddCommentsErrorMessage, AddCommentsStep, AddressModel, AddressOption, AddressesService, Alert, AlertComponent, AlertIconClassPipe, AlertMessageType, AlertModule, AlertService, AuthService, Banner, BannersService, BeforeYouStartComponent, BodyComponent, BrowserService, CCDCaseLinkType, COMPONENT_PORTAL_INJECTION_TOKEN, CallbackErrorsComponent, CallbackErrorsContext, CaseAccessUtils, CaseBasicAccessViewComponent, CaseChallengedAccessRequestComponent, CaseChallengedAccessSuccessComponent, CaseCreateComponent, CaseDetails, CaseEditComponent, CaseEditConfirmComponent, CaseEditDataModule, CaseEditDataService, CaseEditFormComponent, CaseEditPageComponent, CaseEditSubmitComponent, CaseEditWizardGuard, CaseEditorConfig, CaseEditorModule, CaseEvent, CaseEventCompletionComponent, CaseEventCompletionTaskCancelledComponent, CaseEventCompletionTaskReassignedComponent, CaseEventData, CaseEventTrigger, CaseEventTriggerComponent, CaseField, CaseFieldService, CaseFileViewFieldComponent, CaseFileViewFolderComponent, CaseFileViewFolderDocumentActionsComponent, CaseFileViewFolderSelectorComponent, CaseFileViewFolderSortComponent, CaseFileViewFolderToggleComponent, CaseFileViewOverlayMenuComponent, CaseFileViewService, CaseFlagCheckYourAnswersPageStep, CaseFlagDisplayContextParameter, CaseFlagErrorMessage, CaseFlagFieldState, CaseFlagFormFields, CaseFlagRefdataService, CaseFlagStatus, CaseFlagSummaryListComponent, CaseFlagSummaryListDisplayMode, CaseFlagTableComponent, CaseFlagWizardStepTitle, CaseFullAccessViewComponent, CaseHeaderComponent, CaseHeaderModule, CaseHistoryViewerFieldComponent, CaseLink, CaseLinkResponse, CaseListComponent, CaseListFiltersComponent, CaseListFiltersModule, CaseListModule, CaseNotifier, CasePaymentHistoryViewerFieldComponent, CasePrintDocument, CasePrinterComponent, CaseProgressComponent, CaseReferencePipe, CaseResolver, CaseSpecificAccessRequestComponent, CaseSpecificAccessSuccessComponent, CaseState, CaseTab, CaseTimelineComponent, CaseTimelineDisplayMode, CaseTimelineModule, CaseType, CaseTypeLite, CaseView, CaseViewComponent, CaseViewEvent, CaseViewTrigger, CaseViewerComponent, CaseViewerModule, CasesService, CaseworkerService, CcdCYAPageLabelFilterPipe, CcdCaseTitlePipe, CcdCollectionTableCaseFieldsFilterPipe, CcdPageFieldsPipe, CcdTabFieldsPipe, CheckYourAnswersComponent, CloseQueryComponent, ConditionalShowFormDirective, ConditionalShowModule, ConditionalShowRegistrarService, ConfirmFlagStatusComponent, ConfirmStatusErrorMessage, ConfirmStatusStep, Confirmation, ConvertHrefToRouterService, CreateCaseFiltersComponent, CreateCaseFiltersModule, CreateCaseFiltersSelection, DRAFT_PREFIX, DRAFT_QUERY_PARAM, DashPipe, DateInputComponent, DatePipe, DateTimeFormatUtils, DatetimePickerComponent, DefinitionsModule, DefinitionsService, DeleteOrCancelDialogComponent, DialogsModule, DisplayMode, Document, DocumentData, DocumentDialogComponent, DocumentLinks, DocumentManagementService, DocumentUrlPipe, Draft, DraftService, DynamicListPipe, DynamicRadioListPipe, ESQueryType, Embedded, EnumDisplayDescriptionPipe, ErrorMessageComponent, ErrorNotifierService, EventCaseField, EventCompletionReturnStates, EventCompletionStateMachineService, EventCompletionStates, EventLogComponent, EventLogDetailsComponent, EventLogTableComponent, EventMessageModule, EventStartComponent, EventStartModule, EventStartStateMachineService, EventStatusService, EventTriggerResolver, EventTriggerService, Fee, FeeValue, Field, FieldLabelPipe, FieldReadComponent, FieldReadLabelComponent, FieldType, FieldTypeSanitiser, FieldWriteComponent, FieldsFilterPipe, FieldsPurger, FieldsUtils, FirstErrorPipe, FixedListItem, FixedListPipe, FixedRadioListPipe, FlagFieldDisplayPipe, FocusElementDirective, FocusElementModule, FooterComponent, FormDocument, FormErrorService, FormValidatorsService, FormValueService, FormatTranslatorService, GreyBarService, HRef, HeaderBarComponent, HeadersModule, HttpError, HttpErrorService, HttpService, IsCompoundPipe, IsMandatoryPipe, IsReadOnlyAndNotCollectionPipe, IsReadOnlyPipe, JudicialworkerService, Jurisdiction, JurisdictionService, LabelFieldComponent, LabelSubstitutorDirective, LabelSubstitutorModule, LanguageInterpreterDisplayPipe, LinkCaseReason, LinkCasesComponent, LinkCasesFromReasonValuePipe, LinkCasesReasonValuePipe, LinkDetails, LinkFromReason, LinkReason, LinkedCasesErrorMessages, LinkedCasesEventTriggers, LinkedCasesFromTableComponent, LinkedCasesPages, LinkedCasesResponse, LinkedCasesToTableComponent, LoadingModule, LoadingService, LoadingSpinnerComponent, LoadingSpinnerModule, MEDIA_VIEWER_LOCALSTORAGE_KEY, MULTIPLE_TASKS_FOUND, ManageCaseFlagsComponent, ManageCaseFlagsLabelDisplayPipe, MarkdownComponent, MarkdownComponentModule, MoneyGbpInputComponent, MultipageComponentStateService, MultipleTasksExistComponent, NavigationComponent, NavigationItemComponent, NavigationNotifierService, NavigationOrigin, NoLinkedCasesComponent, NoTasksAvailableComponent, NotificationBannerComponent, NotificationBannerHeaderClass, NotificationBannerType, OrderService, OrderSummary, OrganisationConverter, OrganisationService, PageValidationService, PaginationComponent, PaginationMetadata, PaginationModule, PaletteContext, PaletteModule, PaletteService, PaletteUtilsModule, Patterns, PaymentField, PhaseComponent, PipesModule, PlaceholderService, PrintUrlPipe, Profile, ProfileNotifier, ProfileService, QualifyingQuestionDetailComponent, QualifyingQuestionOptionsComponent, QualifyingQuestionService, QualifyingQuestionsErrorMessage, QueryAttachmentsReadComponent, QueryCaseDetailsHeaderComponent, QueryCheckYourAnswersComponent, QueryConfirmationComponent, QueryCreateContext, QueryDetailsComponent, QueryEventCompletionComponent, QueryItemResponseStatus, QueryListComponent, QueryListData, QueryListItem, QueryManagementService, QueryWriteAddDocumentsComponent, QueryWriteDateInputComponent, QueryWriteRaiseQueryComponent, QueryWriteRespondToQueryComponent, RaiseQueryErrorMessage, ReadCaseFlagFieldComponent, ReadCaseLinkFieldComponent, ReadCollectionFieldComponent, ReadComplexFieldCollectionTableComponent, ReadComplexFieldComponent, ReadComplexFieldRawComponent, ReadComplexFieldTableComponent, ReadCookieService, ReadDateFieldComponent, ReadDocumentFieldComponent, ReadDynamicListFieldComponent, ReadDynamicMultiSelectListFieldComponent, ReadDynamicRadioListFieldComponent, ReadEmailFieldComponent, ReadFieldsFilterPipe, ReadFixedListFieldComponent, ReadFixedRadioListFieldComponent, ReadJudicialUserFieldComponent, ReadLinkedCasesFieldComponent, ReadMoneyGbpFieldComponent, ReadMultiSelectListFieldComponent, ReadNumberFieldComponent, ReadOrderSummaryFieldComponent, ReadOrderSummaryRowComponent, ReadOrganisationFieldComponent, ReadOrganisationFieldRawComponent, ReadOrganisationFieldTableComponent, ReadPhoneUKFieldComponent, ReadQueryManagementFieldComponent, ReadTextAreaFieldComponent, ReadTextFieldComponent, ReadYesNoFieldComponent, RefdataCaseFlagType, RemoveDialogComponent, RequestOptionsBuilder, RespondToQueryErrorMessages, RetryUtil, RouterHelperService, RouterLinkComponent, SaveOrDiscardDialogComponent, SearchFiltersComponent, SearchFiltersModule, SearchFiltersWrapperComponent, SearchInput, SearchLanguageInterpreterComponent, SearchLanguageInterpreterErrorMessage, SearchLanguageInterpreterStep, SearchResultComponent, SearchResultModule, SearchResultView, SearchResultViewColumn, SearchResultViewItem, SearchResultViewItemComparatorFactory, SearchService, SelectFlagErrorMessage, SelectFlagLocationComponent, SelectFlagLocationErrorMessage, SelectFlagTypeComponent, SelectFlagTypeErrorMessage, SessionErrorPageComponent, SessionErrorRoute, SessionJsonErrorLogger, SessionStorageGuard, SessionStorageService, ShowCondition, SortOrder$1 as SortOrder, SortParameters, SortSearchResultPipe, TabComponent, TableColumnConfig, TableConfig, TabsComponent, TabsModule, TaskAssignedComponent, TaskCancelledComponent, TaskConflictComponent, TaskUnassignedComponent, Terms, TestRouteSnapshotBuilder, TranslatedMarkdownDirective, TranslatedMarkdownModule, UnLinkCasesComponent, UnsupportedFieldComponent, UpdateFlagAddTranslationErrorMessage, UpdateFlagAddTranslationFormComponent, UpdateFlagAddTranslationStep, UpdateFlagComponent, UpdateFlagErrorMessage, UpdateFlagStep, UpdateFlagTitleDisplayPipe, WaysToPayFieldComponent, WindowService, Wizard, WizardFactoryService, WizardPage, WizardPageField, WorkAllocationService, WorkbasketFiltersComponent, WorkbasketFiltersModule, WorkbasketInput, WorkbasketInputFilterService, WorkbasketInputModel, WriteAddressFieldComponent, WriteCaseFlagFieldComponent, WriteCaseLinkFieldComponent, WriteCollectionFieldComponent, WriteComplexFieldComponent, WriteDateContainerFieldComponent, WriteDateFieldComponent, WriteDocumentFieldComponent, WriteDynamicListFieldComponent, WriteDynamicMultiSelectListFieldComponent, WriteDynamicRadioListFieldComponent, WriteEmailFieldComponent, WriteFixedListFieldComponent, WriteFixedRadioListFieldComponent, WriteJudicialUserFieldComponent, WriteLinkedCasesFieldComponent, WriteMoneyGbpFieldComponent, WriteMultiSelectListFieldComponent, WriteNumberFieldComponent, WriteOrderSummaryFieldComponent, WriteOrganisationComplexFieldComponent, WriteOrganisationFieldComponent, WritePhoneUKFieldComponent, WriteTextAreaFieldComponent, WriteTextFieldComponent, WriteYesNoFieldComponent, YesNoService, aCaseField, caseMessagesMockData, createACL, createCaseEventTrigger, createCaseField, createComplexFieldOverride, createFieldType, createFixedListFieldType, createHiddenComplexFieldOverride, createMultiSelectListFieldType, createWizardPage, createWizardPageField, editorRouting, initDialog, newCaseField, safeJsonParse, textFieldType, viewerRouting };
41436
41632
  //# sourceMappingURL=hmcts-ccd-case-ui-toolkit.mjs.map