@hmcts/ccd-case-ui-toolkit 7.3.53-polling → 7.3.54-4300

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';
@@ -8,10 +8,11 @@ import * as i1$1 from '@angular/router';
8
8
  import { RouterModule, NavigationStart, NavigationEnd } from '@angular/router';
9
9
  import * as i4 from '@angular/forms';
10
10
  import { NG_VALUE_ACCESSOR, NG_VALIDATORS, FormArray, FormGroup, FormControl, Validators, ReactiveFormsModule, FormsModule } from '@angular/forms';
11
- import { BehaviorSubject, throwError, Subject, EMPTY, concat, defer, timer, Observable, skip, of, forkJoin, fromEvent, Subscription, combineLatest } from 'rxjs';
12
- import { distinctUntilChanged, catchError, map, switchMap, repeat, retry, publish, refCount, debounceTime, delay, finalize, timeout, mergeMap, retryWhen, tap, delayWhen, publishReplay, take, first, takeUntil, filter } from 'rxjs/operators';
11
+ import { BehaviorSubject, throwError, Subject, EMPTY, Observable, skip, of, timer, forkJoin, fromEvent, Subscription, combineLatest } from 'rxjs';
13
12
  import * as i1$2 from '@angular/common/http';
14
13
  import { HttpErrorResponse, HttpHeaders, HttpParams } from '@angular/common/http';
14
+ import { distinctUntilChanged, catchError, map, publish, refCount, switchMap, debounceTime, delay, finalize, timeout, mergeMap, retryWhen, tap, delayWhen, publishReplay, take, first, takeUntil, filter } from 'rxjs/operators';
15
+ import { polling } from 'rx-polling-hmcts';
15
16
  import { Type, Exclude, Expose, plainToClassFromExist, plainToClass } from 'class-transformer';
16
17
  import moment from 'moment';
17
18
  import { __decorate, __metadata } from 'tslib';
@@ -1637,23 +1638,89 @@ class SessionStorageService {
1637
1638
  sessionStorage.clear();
1638
1639
  }
1639
1640
  static ɵfac = function SessionStorageService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || SessionStorageService)(); };
1640
- static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SessionStorageService, factory: SessionStorageService.ɵfac });
1641
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SessionStorageService, factory: SessionStorageService.ɵfac, providedIn: 'root' });
1641
1642
  }
1642
1643
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SessionStorageService, [{
1643
- type: Injectable
1644
+ type: Injectable,
1645
+ args: [{
1646
+ providedIn: 'root',
1647
+ }]
1644
1648
  }], null, null); })();
1645
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
+
1646
1718
  const USER_DETAILS = 'userDetails';
1647
1719
  const PUI_CASE_MANAGER = 'pui-case-manager';
1648
1720
  const JUDGE = 'judge';
1649
1721
  function getUserDetails(sessionStorageService) {
1650
- try {
1651
- const item = sessionStorageService?.getItem(USER_DETAILS);
1652
- return item ? JSON.parse(item) : null;
1653
- }
1654
- catch {
1655
- return null;
1656
- }
1722
+ const item = sessionStorageService?.getItem(USER_DETAILS);
1723
+ return safeJsonParse(item, null);
1657
1724
  }
1658
1725
  function isInternalUser(sessionStorageService) {
1659
1726
  const userDetails = getUserDetails(sessionStorageService);
@@ -1692,8 +1759,11 @@ class ActivityService {
1692
1759
  return error;
1693
1760
  }
1694
1761
  getOptions() {
1695
- const userDetails = JSON.parse(this.sessionStorageService.getItem(USER_DETAILS));
1696
- 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
+ }
1697
1767
  return {
1698
1768
  headers,
1699
1769
  withCredentials: true,
@@ -1759,7 +1829,8 @@ class ActivityPollingService {
1759
1829
  this.config = config;
1760
1830
  this.pollConfig = {
1761
1831
  interval: config.getActivityNexPollRequestMs(),
1762
- attempts: config.getActivityRetry()
1832
+ attempts: config.getActivityRetry(),
1833
+ backgroundPolling: true
1763
1834
  };
1764
1835
  this.batchCollectionDelayMs = config.getActivityBatchCollectionDelayMs();
1765
1836
  this.maxRequestsPerBatch = config.getActivityMaxRequestPerBatch();
@@ -1776,19 +1847,17 @@ class ActivityPollingService {
1776
1847
  subject.subscribe(done);
1777
1848
  }
1778
1849
  else {
1779
- // Only the first pending request should start the batch collection timer.
1780
- const wasEmpty = this.pendingRequests.size === 0;
1781
1850
  subject = new Subject();
1782
1851
  subject.subscribe(done);
1783
- this.addPendingRequest(caseId, subject);
1784
- if (wasEmpty) {
1785
- this.ngZone.runOutsideAngular(() => {
1786
- this.currentTimeoutHandle = setTimeout(() => this.ngZone.run(() => {
1787
- // console.log('timeout: flushing requests')
1788
- this.flushRequests();
1789
- }), this.batchCollectionDelayMs);
1790
- });
1791
- }
1852
+ this.pendingRequests.set(caseId, subject);
1853
+ }
1854
+ if (this.pendingRequests.size === 1) {
1855
+ this.ngZone.runOutsideAngular(() => {
1856
+ this.currentTimeoutHandle = setTimeout(() => this.ngZone.run(() => {
1857
+ // console.log('timeout: flushing requests')
1858
+ this.flushRequests();
1859
+ }), this.batchCollectionDelayMs);
1860
+ });
1792
1861
  }
1793
1862
  if (this.pendingRequests.size >= this.maxRequestsPerBatch) {
1794
1863
  // console.log('max pending hit: flushing requests');
@@ -1806,9 +1875,6 @@ class ActivityPollingService {
1806
1875
  clearTimeout(this.currentTimeoutHandle);
1807
1876
  this.currentTimeoutHandle = undefined;
1808
1877
  }
1809
- if (!this.pendingRequests.size) {
1810
- return;
1811
- }
1812
1878
  const requests = new Map(this.pendingRequests);
1813
1879
  this.pendingRequests.clear();
1814
1880
  this.performBatchRequest(requests);
@@ -1817,7 +1883,7 @@ class ActivityPollingService {
1817
1883
  if (!this.isEnabled) {
1818
1884
  return EMPTY;
1819
1885
  }
1820
- return this.polling(this.activityService.getActivities(...caseIds), this.pollConfig);
1886
+ return polling(this.activityService.getActivities(...caseIds), this.pollConfig);
1821
1887
  }
1822
1888
  postViewActivity(caseId) {
1823
1889
  return this.postActivity(caseId, ActivityService.ACTIVITY_VIEW);
@@ -1830,20 +1896,17 @@ class ActivityPollingService {
1830
1896
  // console.log('issuing batch request for cases: ' + caseIds);
1831
1897
  this.ngZone.runOutsideAngular(() => {
1832
1898
  // run polling outside angular zone so it does not trigger change detection
1833
- this.pollActivitiesSubscription = this.pollActivities(caseIds).subscribe({
1834
- // process activity inside zone so it triggers change detection for activity.component.ts
1835
- next: (activities) => this.ngZone.run(() => {
1836
- activities.forEach((activity) => {
1837
- // console.log('pushing activity: ' + activity.caseId);
1838
- // Ignore activities returned for cases outside this local batch.
1839
- requests.get(activity.caseId)?.next(activity);
1840
- });
1841
- }),
1842
- error: (err) => this.ngZone.run(() => {
1843
- console.log(`error: ${err}`);
1844
- Array.from(requests.values()).forEach((subject) => subject.error(err));
1845
- })
1846
- });
1899
+ this.pollActivitiesSubscription = this.pollActivities(caseIds).subscribe(
1900
+ // process activity inside zone so it triggers change detection for activity.component.ts
1901
+ (activities) => this.ngZone.run(() => {
1902
+ activities.forEach((activity) => {
1903
+ // console.log('pushing activity: ' + activity.caseId);
1904
+ requests.get(activity.caseId).next(activity);
1905
+ });
1906
+ }, (err) => {
1907
+ console.log(`error: ${err}`);
1908
+ Array.from(requests.values()).forEach((subject) => subject.error(err));
1909
+ }));
1847
1910
  });
1848
1911
  }
1849
1912
  postActivity(caseId, activityType) {
@@ -1854,42 +1917,7 @@ class ActivityPollingService {
1854
1917
  ...this.pollConfig,
1855
1918
  interval: 5000 // inline with CCD Backend
1856
1919
  };
1857
- return this.polling(this.activityService.postActivity(caseId, activityType), pollingConfig);
1858
- }
1859
- addPendingRequest(caseId, subject) {
1860
- this.pendingRequests.set(caseId, subject);
1861
- // Components complete their returned Subject on destroy; remove it so a later same-case subscription gets a fresh Subject.
1862
- subject.subscribe({
1863
- complete: () => this.removePendingRequest(caseId, subject),
1864
- error: () => this.removePendingRequest(caseId, subject)
1865
- });
1866
- }
1867
- removePendingRequest(caseId, subject) {
1868
- if (this.pendingRequests.get(caseId) !== subject) {
1869
- return;
1870
- }
1871
- this.pendingRequests.delete(caseId);
1872
- if (!this.pendingRequests.size && this.currentTimeoutHandle) {
1873
- clearTimeout(this.currentTimeoutHandle);
1874
- this.currentTimeoutHandle = undefined;
1875
- }
1876
- }
1877
- polling(request$, options) {
1878
- const pollingOptions = {
1879
- interval: options.interval,
1880
- attempts: options.attempts ?? 9,
1881
- exponentialUnit: options.exponentialUnit ?? 1000
1882
- };
1883
- return concat(request$, defer(() => timer(pollingOptions.interval).pipe(switchMap(() => request$))).pipe(repeat())).pipe(
1884
- // Preserve consecutive-failure retry behaviour using the current RxJS retry config.
1885
- retry({
1886
- count: pollingOptions.attempts,
1887
- delay: (_error, retryCount) => timer(this.getExponentialRetryDelay(retryCount, pollingOptions.exponentialUnit)),
1888
- resetOnSuccess: true
1889
- }));
1890
- }
1891
- getExponentialRetryDelay(consecutiveErrorsCount, exponentialUnit) {
1892
- return Math.pow(2, consecutiveErrorsCount - 1) * exponentialUnit;
1920
+ return polling(this.activityService.postActivity(caseId, activityType), pollingConfig);
1893
1921
  }
1894
1922
  static ɵfac = function ActivityPollingService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ActivityPollingService)(i0.ɵɵinject(ActivityService), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(AbstractAppConfig)); };
1895
1923
  static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ActivityPollingService, factory: ActivityPollingService.ɵfac });
@@ -4544,11 +4572,8 @@ class FieldsUtils {
4544
4572
  }
4545
4573
  }
4546
4574
  static getUserTaskFromClientContext(clientContextStr) {
4547
- if (clientContextStr) {
4548
- let clientContext = JSON.parse(clientContextStr);
4549
- return clientContext.client_context.user_task;
4550
- }
4551
- return null;
4575
+ const clientContext = safeJsonParse(clientContextStr, null);
4576
+ return clientContext?.client_context?.user_task || null;
4552
4577
  }
4553
4578
  buildCanShowPredicate(eventTrigger, form) {
4554
4579
  const currentState = this.getCurrentEventState(eventTrigger, form);
@@ -5508,6 +5533,10 @@ class ConditionalShowFormDirective {
5508
5533
  }
5509
5534
  buildPath(c, field) {
5510
5535
  if (c && c instanceof AbstractFieldWriteComponent) {
5536
+ const parentPrefix = c.parent?.['component']?.idPrefix;
5537
+ if (parentPrefix) {
5538
+ return parentPrefix + field.id;
5539
+ }
5511
5540
  if (c.idPrefix) {
5512
5541
  return c.idPrefix + field.id;
5513
5542
  }
@@ -6008,17 +6037,15 @@ class FormValueService {
6008
6037
  return form[currentFieldId + FieldsUtils.LABEL_SUFFIX].join(', ');
6009
6038
  }
6010
6039
  else if (FieldsUtils.isCollectionOfSimpleTypes(currentForm)) {
6011
- return currentForm.map(fieldValue => fieldValue['value']).join(', ');
6040
+ return currentForm.map((fieldValue) => fieldValue.value).join(', ');
6012
6041
  }
6013
6042
  else if (FieldsUtils.isCollection(currentForm)) {
6014
- return this.getFieldValue(currentForm[colIndex]['value'], fieldIds.slice(1).join('.'), colIndex);
6043
+ return this.getFieldValue(currentForm[colIndex].value, fieldIds.slice(1).join('.'), colIndex);
6015
6044
  }
6016
6045
  else if (FieldsUtils.isNonEmptyObject(currentForm)) {
6017
6046
  return this.getFieldValue(currentForm, fieldIds.slice(1).join('.'), colIndex);
6018
6047
  }
6019
- else {
6020
- return currentForm;
6021
- }
6048
+ return currentForm;
6022
6049
  }
6023
6050
  /**
6024
6051
  * A recursive method to remove anything with a `---LABEL` suffix.
@@ -6056,9 +6083,7 @@ class FormValueService {
6056
6083
  if (field.field_type) {
6057
6084
  return field.field_type.type === 'Label';
6058
6085
  }
6059
- else {
6060
- return false;
6061
- }
6086
+ return false;
6062
6087
  }
6063
6088
  static isEmptyData(data) {
6064
6089
  if (data) {
@@ -6105,10 +6130,13 @@ class FormValueService {
6105
6130
  return s;
6106
6131
  }
6107
6132
  filterCurrentPageFields(caseFields, editForm) {
6108
- const cloneForm = JSON.parse(JSON.stringify(editForm));
6109
- Object.keys(cloneForm['data']).forEach((key) => {
6133
+ const cloneForm = {
6134
+ ...(editForm || {}),
6135
+ data: { ...((editForm && editForm.data) || {}) }
6136
+ };
6137
+ Object.keys(cloneForm.data).forEach((key) => {
6110
6138
  if (caseFields.findIndex((element) => element.id === key) < 0) {
6111
- delete cloneForm['data'][key];
6139
+ delete cloneForm.data[key];
6112
6140
  }
6113
6141
  });
6114
6142
  return cloneForm;
@@ -6152,7 +6180,7 @@ class FormValueService {
6152
6180
  if (!rawArray) {
6153
6181
  return rawArray;
6154
6182
  }
6155
- rawArray.forEach(item => {
6183
+ rawArray.forEach((item) => {
6156
6184
  if (item && item.hasOwnProperty('value')) {
6157
6185
  item.value = this.sanitiseValue(item.value, isCaseFlagJourney);
6158
6186
  }
@@ -6161,8 +6189,8 @@ class FormValueService {
6161
6189
  // association of a value. In addition, if the array contains items with a "value" object property, return only
6162
6190
  // those whose value object contains non-empty values, including for any descendant objects
6163
6191
  return rawArray
6164
- .filter(item => !!item)
6165
- .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);
6166
6194
  }
6167
6195
  sanitiseValue(rawValue, isCaseFlagJourney = false) {
6168
6196
  if (Array.isArray(rawValue)) {
@@ -6181,7 +6209,7 @@ class FormValueService {
6181
6209
  }
6182
6210
  clearNonCaseFields(data, caseFields) {
6183
6211
  for (const dataKey in data) {
6184
- if (!caseFields.find(cf => cf.id === dataKey)) {
6212
+ if (!caseFields.find((cf) => cf.id === dataKey)) {
6185
6213
  delete data[dataKey];
6186
6214
  }
6187
6215
  }
@@ -6379,7 +6407,7 @@ class FormValueService {
6379
6407
  */
6380
6408
  removeCaseFieldsOfType(data, caseFields, types) {
6381
6409
  if (data && caseFields && caseFields.length > 0 && types.length > 0) {
6382
- const caseFieldsToRemove = caseFields.filter(caseField => FieldsUtils.isCaseFieldOfType(caseField, types));
6410
+ const caseFieldsToRemove = caseFields.filter((caseField) => FieldsUtils.isCaseFieldOfType(caseField, types));
6383
6411
  for (const caseField of caseFieldsToRemove) {
6384
6412
  delete data[caseField.id];
6385
6413
  }
@@ -6398,10 +6426,10 @@ class FormValueService {
6398
6426
  */
6399
6427
  repopulateFormDataFromCaseFieldValues(data, caseFields) {
6400
6428
  if (data && caseFields && caseFields.length > 0 &&
6401
- caseFields.findIndex(caseField => FieldsUtils.isCaseFieldOfType(caseField, ['FlagLauncher'])) > -1) {
6429
+ caseFields.findIndex((caseField) => FieldsUtils.isCaseFieldOfType(caseField, ['FlagLauncher'])) > -1) {
6402
6430
  // Ignore the FlagLauncher CaseField because it does not hold any values
6403
- caseFields.filter(caseField => !FieldsUtils.isCaseFieldOfType(caseField, ['FlagLauncher']))
6404
- .forEach(caseField => {
6431
+ caseFields.filter((caseField) => !FieldsUtils.isCaseFieldOfType(caseField, ['FlagLauncher']))
6432
+ .forEach((caseField) => {
6405
6433
  // Ensure that the data object is populated for all CaseField keys it contains, even if for a given
6406
6434
  // CaseField key, the data object has a falsy value (hence the use of hasOwnProperty() for the check below)
6407
6435
  // See https://tools.hmcts.net/jira/browse/EUI-7377
@@ -6433,8 +6461,8 @@ class FormValueService {
6433
6461
  */
6434
6462
  populateLinkedCasesDetailsFromCaseFields(data, caseFields) {
6435
6463
  if (data && caseFields && caseFields.length > 0) {
6436
- caseFields.filter(caseField => !FieldsUtils.isCaseFieldOfType(caseField, ['ComponentLauncher']))
6437
- .forEach(caseField => {
6464
+ caseFields.filter((caseField) => !FieldsUtils.isCaseFieldOfType(caseField, ['ComponentLauncher']))
6465
+ .forEach((caseField) => {
6438
6466
  if (data.hasOwnProperty('caseLinks') && caseField.value) {
6439
6467
  data[caseField.id] = caseField.value;
6440
6468
  }
@@ -9576,7 +9604,7 @@ class CaseEditComponent {
9576
9604
  ngOnInit() {
9577
9605
  this.wizard = this.wizardFactory.create(this.eventTrigger);
9578
9606
  this.initialUrl = this.sessionStorageService.getItem('eventUrl');
9579
- this.isPageRefreshed = JSON.parse(this.sessionStorageService.getItem('isPageRefreshed'));
9607
+ this.isPageRefreshed = safeJsonParse(this.sessionStorageService.getItem('isPageRefreshed'), false);
9580
9608
  this.checkPageRefresh();
9581
9609
  this.form = this.fb.group({
9582
9610
  data: new FormGroup({}),
@@ -9700,15 +9728,11 @@ class CaseEditComponent {
9700
9728
  const taskEventCompletionStr = this.sessionStorageService.getItem(CaseEditComponent.TASK_EVENT_COMPLETION_INFO);
9701
9729
  const userInfoStr = this.sessionStorageService.getItem('userDetails');
9702
9730
  const assignNeeded = this.sessionStorageService.getItem('assignNeeded');
9703
- if (taskEventCompletionStr) {
9704
- taskEventCompletionInfo = JSON.parse(taskEventCompletionStr);
9705
- }
9706
- if (userInfoStr) {
9707
- userInfo = JSON.parse(userInfoStr);
9708
- }
9731
+ taskEventCompletionInfo = safeJsonParse(taskEventCompletionStr, null);
9732
+ userInfo = safeJsonParse(userInfoStr, null);
9709
9733
  const eventId = this.getEventId(form);
9710
9734
  const caseId = this.getCaseId(caseDetails);
9711
- const userId = userInfo.id ? userInfo.id : userInfo.uid;
9735
+ const userId = userInfo?.id ? userInfo.id : userInfo?.uid;
9712
9736
  const eventDetails = { eventId, caseId, userId, assignNeeded };
9713
9737
  if (this.taskExistsForThisEvent(taskInSessionStorage, taskEventCompletionInfo, eventDetails)) {
9714
9738
  this.abstractConfig.logMessage(`task ${taskInSessionStorage?.id} exist for this event for caseId and eventId as ${caseId} ${eventId}`);
@@ -9937,6 +9961,11 @@ class CaseEditComponent {
9937
9961
  const userTask = FieldsUtils.getUserTaskFromClientContext(clientContextStr);
9938
9962
  const [task, taskToBeCompleted] = userTask ? [userTask.task_data, userTask.complete_task] : [null, false];
9939
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
+ }
9940
9969
  if (task && assignNeeded && taskToBeCompleted) {
9941
9970
  this.abstractConfig.logMessage(`postCompleteTaskIfRequired with assignNeeded: taskId ${task.id} and event name ${this.eventTrigger?.name}`);
9942
9971
  return this.workAllocationService.assignAndCompleteTask(task.id, this.eventTrigger.name);
@@ -10070,7 +10099,7 @@ class CaseEditComponent {
10070
10099
  }], submitted: [{
10071
10100
  type: Output
10072
10101
  }] }); })();
10073
- (() => { (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 }); })();
10074
10103
 
10075
10104
  function convertNonASCIICharacter(character) {
10076
10105
  if (character === '£') {
@@ -11683,6 +11712,10 @@ class CaseEditPageComponent {
11683
11712
  updateEventTriggerCaseFields(caseFieldId, jsonData, eventTrigger) {
11684
11713
  /* istanbul ignore else */
11685
11714
  if (eventTrigger?.case_fields) {
11715
+ const isCaseFlagJourney = eventTrigger.case_fields.some((caseField) => FieldsUtils.isCaseFieldOfType(caseField, ['FlagLauncher']));
11716
+ if (isCaseFlagJourney) {
11717
+ return;
11718
+ }
11686
11719
  eventTrigger.case_fields
11687
11720
  .filter(element => element.id === caseFieldId)
11688
11721
  .forEach(element => {
@@ -12129,6 +12162,42 @@ class CallbackErrorsComponent {
12129
12162
  }] }); })();
12130
12163
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CallbackErrorsComponent, { className: "CallbackErrorsComponent", filePath: "lib/shared/components/error/callback-errors.component.ts", lineNumber: 11 }); })();
12131
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
+
12132
12201
  function CaseEventCompletionComponent_app_case_event_completion_task_cancelled_0_Template(rf, ctx) { if (rf & 1) {
12133
12202
  const _r1 = i0.ɵɵgetCurrentView();
12134
12203
  i0.ɵɵelementStart(0, "app-case-event-completion-task-cancelled", 2);
@@ -13380,9 +13449,10 @@ class CaseFileViewFieldComponent {
13380
13449
  error: _ => this.getCategoriesAndDocumentsError = true
13381
13450
  });
13382
13451
  // EXUI-8000
13383
- const userInfo = JSON.parse(this.sessionStorageService.getItem('userDetails'));
13452
+ const userInfo = safeJsonParse(this.sessionStorageService.getItem('userDetails'), null);
13453
+ const userRoles = userInfo?.roles || [];
13384
13454
  // Get acls that intersects from acl roles and user roles
13385
- const acls = this.caseField.acls.filter(acl => userInfo.roles.includes(acl.role));
13455
+ const acls = this.caseField.acls.filter(acl => userRoles.includes(acl.role));
13386
13456
  // As there can be more than one intersecting role, if any acls are update: true
13387
13457
  this.allowMoving = acls.some(acl => acl.update);
13388
13458
  this.icp_jurisdictions = this.abstractConfig.getIcpJurisdictions();
@@ -13473,7 +13543,7 @@ class CaseFileViewFieldComponent {
13473
13543
  type: Component,
13474
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"] }]
13475
13545
  }], () => [{ type: i0.ElementRef }, { type: i1$1.ActivatedRoute }, { type: CaseFileViewService }, { type: DocumentManagementService }, { type: LoadingService }, { type: SessionStorageService }, { type: WindowService }, { type: CaseNotifier }, { type: AbstractAppConfig }], null); })();
13476
- (() => { (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 }); })();
13477
13547
 
13478
13548
  const PVP_FLAG_CODE = 'PF0021';
13479
13549
  const PVP_DISPLAY_TEXT = 'POTENTIALLY VIOLENT PERSON';
@@ -15033,7 +15103,7 @@ function WriteCollectionFieldComponent_div_7_Template(rf, ctx) { if (rf & 1) {
15033
15103
  const ctx_r0 = i0.ɵɵnextContext();
15034
15104
  i0.ɵɵproperty("hidden", ctx_r0.caseField.hidden);
15035
15105
  i0.ɵɵadvance(2);
15036
- i0.ɵɵproperty("ngForOf", ctx_r0.collItems);
15106
+ i0.ɵɵproperty("ngForOf", ctx_r0.collItems)("ngForTrackBy", ctx_r0.trackByCollectionItem);
15037
15107
  } }
15038
15108
  function WriteCollectionFieldComponent_button_8_Template(rf, ctx) { if (rf & 1) {
15039
15109
  const _r5 = i0.ɵɵgetCurrentView();
@@ -15059,6 +15129,7 @@ class WriteCollectionFieldComponent extends AbstractFieldWriteComponent {
15059
15129
  profileSubscription;
15060
15130
  items;
15061
15131
  collItems = [];
15132
+ collectionItemUidCounter = 0;
15062
15133
  constructor(dialog, scrollToService, profileNotifier, cdRef) {
15063
15134
  super();
15064
15135
  this.dialog = dialog;
@@ -15081,7 +15152,7 @@ class WriteCollectionFieldComponent extends AbstractFieldWriteComponent {
15081
15152
  if (this.collItems.length <= index) {
15082
15153
  this.collItems.length = index + 1;
15083
15154
  }
15084
- this.collItems[index] = { caseField, item, prefix, index, container };
15155
+ this.collItems[index] = { uid: this.createCollectionItemUid(), caseField, item, prefix, index, container };
15085
15156
  });
15086
15157
  }
15087
15158
  ngOnDestroy() {
@@ -15190,7 +15261,7 @@ class WriteCollectionFieldComponent extends AbstractFieldWriteComponent {
15190
15261
  const caseField = this.buildCaseField(item, index, true);
15191
15262
  const prefix = this.buildIdPrefix(index);
15192
15263
  const container = this.getContainer(index);
15193
- this.collItems.push({ caseField, item, index, prefix, container });
15264
+ this.collItems.push({ uid: this.createCollectionItemUid(), caseField, item, index, prefix, container });
15194
15265
  // Update DOM required after pushing a new item to do the next steps (i.e. scrolling and focusing)
15195
15266
  this.cdRef.detectChanges();
15196
15267
  if (doScroll) {
@@ -15249,6 +15320,12 @@ class WriteCollectionFieldComponent extends AbstractFieldWriteComponent {
15249
15320
  this.caseField.value.splice(index, 1);
15250
15321
  this.formArray.removeAt(index);
15251
15322
  }
15323
+ trackByCollectionItem(_, item) {
15324
+ return item.uid;
15325
+ }
15326
+ createCollectionItemUid() {
15327
+ return `collection-item-${this.collectionItemUidCounter++}`;
15328
+ }
15252
15329
  resetIds(index) {
15253
15330
  for (let i = index; i < this.collItems.length; i++) {
15254
15331
  const counter = i + 1;
@@ -15355,7 +15432,7 @@ class WriteCollectionFieldComponent extends AbstractFieldWriteComponent {
15355
15432
  } if (rf & 2) {
15356
15433
  let _t;
15357
15434
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.items = _t);
15358
- } }, 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) {
15359
15436
  i0.ɵɵelementStart(0, "div", 1)(1, "div", 2);
15360
15437
  i0.ɵɵtemplate(2, WriteCollectionFieldComponent_h2_2_Template, 3, 3, "h2", 3);
15361
15438
  i0.ɵɵelementStart(3, "button", 4);
@@ -15363,7 +15440,7 @@ class WriteCollectionFieldComponent extends AbstractFieldWriteComponent {
15363
15440
  i0.ɵɵtext(4);
15364
15441
  i0.ɵɵpipe(5, "rpxTranslate");
15365
15442
  i0.ɵɵelementEnd();
15366
- 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);
15367
15444
  i0.ɵɵelementEnd()();
15368
15445
  } if (rf & 2) {
15369
15446
  i0.ɵɵproperty("id", ctx.id());
@@ -15383,14 +15460,14 @@ class WriteCollectionFieldComponent extends AbstractFieldWriteComponent {
15383
15460
  }
15384
15461
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(WriteCollectionFieldComponent, [{
15385
15462
  type: Component,
15386
- 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"] }]
15387
15464
  }], () => [{ type: i1$3.MatLegacyDialog }, { type: i2.ScrollToService }, { type: ProfileNotifier }, { type: i0.ChangeDetectorRef }], { caseFields: [{
15388
15465
  type: Input
15389
15466
  }], items: [{
15390
15467
  type: ViewChildren,
15391
15468
  args: ['collectionItem']
15392
15469
  }] }); })();
15393
- (() => { (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 }); })();
15394
15471
 
15395
15472
  function ReadComplexFieldComponent_ccd_read_complex_field_raw_1_Template(rf, ctx) { if (rf & 1) {
15396
15473
  i0.ɵɵelement(0, "ccd-read-complex-field-raw", 4);
@@ -16331,11 +16408,13 @@ class MarkdownComponent {
16331
16408
  }
16332
16409
  renderUrlToText() {
16333
16410
  const renderer = new marked.Renderer();
16334
- renderer.link = (href, title, text) => {
16335
- if (!text || text === href) {
16336
- 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;
16337
16416
  }
16338
- return this.detectMarkdownLinks(this.content) ? `<a href="${href}">${text}</a>` : text;
16417
+ return this.detectMarkdownLinks(this.content) ? `<a href="${linkHref}">${text}</a>` : text;
16339
16418
  };
16340
16419
  marked.setOptions({
16341
16420
  renderer: renderer
@@ -16370,7 +16449,7 @@ class MarkdownComponent {
16370
16449
  }], renderUrlToTextFeature: [{
16371
16450
  type: Input
16372
16451
  }] }); })();
16373
- (() => { (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 }); })();
16374
16453
 
16375
16454
  class FixedListPipe {
16376
16455
  static EMPTY = '';
@@ -20821,14 +20900,14 @@ class PaymentField extends AbstractFieldReadComponent {
20821
20900
  return this.appConfig.getNotificationUrl();
20822
20901
  }
20823
20902
  getUserRoles() {
20824
- const userDetails = JSON.parse(this.sessionStorage.getItem('userDetails') || null);
20903
+ const userDetails = safeJsonParse(this.sessionStorage.getItem('userDetails'), null);
20825
20904
  if (!userDetails || !userDetails.hasOwnProperty('roles')) {
20826
20905
  return [];
20827
20906
  }
20828
20907
  return userDetails.roles;
20829
20908
  }
20830
20909
  getUserEmail() {
20831
- const userDetails = JSON.parse(this.sessionStorage.getItem('userDetails') || null);
20910
+ const userDetails = safeJsonParse(this.sessionStorage.getItem('userDetails'), null);
20832
20911
  if (!userDetails || !userDetails.hasOwnProperty('sub')) {
20833
20912
  return '';
20834
20913
  }
@@ -21554,7 +21633,7 @@ class QueryManagementService {
21554
21633
  ) {
21555
21634
  let currentUserDetails;
21556
21635
  try {
21557
- currentUserDetails = JSON.parse(this.sessionStorageService.getItem(USER_DETAILS));
21636
+ currentUserDetails = safeJsonParse(this.sessionStorageService.getItem(USER_DETAILS), {});
21558
21637
  }
21559
21638
  catch (e) {
21560
21639
  console.error('Could not parse USER_DETAILS from session storage:', e);
@@ -25016,6 +25095,7 @@ class FieldWriteComponent extends AbstractFieldWriteComponent {
25016
25095
  canHaveGreyBar = false;
25017
25096
  caseFields = [];
25018
25097
  fieldContainer;
25098
+ componentRef;
25019
25099
  constructor(resolver, paletteService) {
25020
25100
  super();
25021
25101
  this.resolver = resolver;
@@ -25027,7 +25107,7 @@ class FieldWriteComponent extends AbstractFieldWriteComponent {
25027
25107
  ngOnInit() {
25028
25108
  const componentClass = this.paletteService.getFieldComponentClass(this.caseField, true);
25029
25109
  const injector = Injector.create([], this.fieldContainer.parentInjector);
25030
- const component = this.resolver.resolveComponentFactory(componentClass).create(injector);
25110
+ this.componentRef = this.resolver.resolveComponentFactory(componentClass).create(injector);
25031
25111
  // Only Fixed list use plainToClassFromExist
25032
25112
  // Better performance
25033
25113
  // TODO AW 30/12/20 figure out why FixedLists need plainToClassFromExist
@@ -25036,28 +25116,41 @@ class FieldWriteComponent extends AbstractFieldWriteComponent {
25036
25116
  if (FIX_CASEFIELD_FOR.indexOf(this.caseField.field_type.type) > -1 && !(this.caseField instanceof CaseField)) {
25037
25117
  this.caseField = plainToClassFromExist(new CaseField(), this.caseField);
25038
25118
  }
25039
- component.instance['caseField'] = this.caseField;
25040
- component.instance['caseFields'] = this.caseFields;
25041
- component.instance['formGroup'] = this.formGroup;
25042
- component.instance['parent'] = this.parent;
25043
- component.instance['idPrefix'] = this.idPrefix;
25119
+ this.applyInputsToChild();
25044
25120
  if (this.caseField.field_type.id === 'AddressGlobal') {
25045
- component.instance['ignoreMandatory'] = true;
25121
+ this.componentRef.instance['ignoreMandatory'] = true;
25046
25122
  }
25047
- component.instance['isExpanded'] = this.isExpanded;
25048
- component.instance['isInSearchBlock'] = this.isInSearchBlock;
25049
- this.fieldContainer.insert(component.hostView);
25123
+ this.fieldContainer.insert(this.componentRef.hostView);
25050
25124
  // EUI-3267.
25051
25125
  // Set up the flag for whether this can have a grey bar.
25052
25126
  this.canHaveGreyBar = this.caseField.show_condition && this.caseField.field_type.type !== 'Collection';
25053
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
+ }
25054
25147
  static ɵfac = function FieldWriteComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FieldWriteComponent)(i0.ɵɵdirectiveInject(i0.ComponentFactoryResolver), i0.ɵɵdirectiveInject(PaletteService)); };
25055
25148
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FieldWriteComponent, selectors: [["ccd-field-write"]], viewQuery: function FieldWriteComponent_Query(rf, ctx) { if (rf & 1) {
25056
25149
  i0.ɵɵviewQuery(_c0$y, 7, ViewContainerRef);
25057
25150
  } if (rf & 2) {
25058
25151
  let _t;
25059
25152
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.fieldContainer = _t.first);
25060
- } }, 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) {
25061
25154
  i0.ɵɵelementStart(0, "div", 1);
25062
25155
  i0.ɵɵelementContainer(1, null, 0);
25063
25156
  i0.ɵɵelementEnd();
@@ -30513,7 +30606,9 @@ class EventLogTableComponent {
30513
30606
  }
30514
30607
  ngOnInit() {
30515
30608
  this.isPartOfCaseTimeline = this.onCaseHistory.observers.length > 0;
30516
- 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');
30517
30612
  }
30518
30613
  select(event) {
30519
30614
  this.selected = event;
@@ -30602,7 +30697,7 @@ class EventLogTableComponent {
30602
30697
  }], onCaseHistory: [{
30603
30698
  type: Output
30604
30699
  }] }); })();
30605
- (() => { (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 }); })();
30606
30701
 
30607
30702
  function EventLogComponent_ccd_event_log_table_3_Template(rf, ctx) { if (rf & 1) {
30608
30703
  const _r1 = i0.ɵɵgetCurrentView();
@@ -30830,6 +30925,101 @@ class ReadFieldsFilterPipe {
30830
30925
  static isCompound(field) {
30831
30926
  return ReadFieldsFilterPipe.NESTED_TYPES[field.field_type.type];
30832
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
+ }
30833
31023
  static isValidCompound(field, value, checkConditionalShowAgainst) {
30834
31024
  return ReadFieldsFilterPipe.isCompound(field)
30835
31025
  && ReadFieldsFilterPipe.NESTED_TYPES[field.field_type.type](field, value, checkConditionalShowAgainst);
@@ -30901,46 +31091,11 @@ class ReadFieldsFilterPipe {
30901
31091
  }
30902
31092
  const fields = complexField.field_type.complex_fields || [];
30903
31093
  const values = complexField.value || {};
30904
- let checkConditionalShowAgainst = values;
30905
- let formGroupAvailable = false;
30906
- if (formGroup) {
30907
- checkConditionalShowAgainst = formGroup.value ? formGroup.parent.getRawValue().data : formGroup;
30908
- formGroupAvailable = true;
30909
- if (idPrefix !== undefined) {
30910
- if (idPrefix !== '') {
30911
- const fieldId = idPrefix.substring(0, idPrefix.indexOf('_'));
30912
- if (checkConditionalShowAgainst[fieldId]) {
30913
- checkConditionalShowAgainst = values;
30914
- formGroupAvailable = false;
30915
- }
30916
- }
30917
- else {
30918
- checkConditionalShowAgainst = Object.assign(checkConditionalShowAgainst, values);
30919
- formGroupAvailable = false;
30920
- }
30921
- }
30922
- }
31094
+ const conditionalShowContext = ReadFieldsFilterPipe.getConditionalShowContext(complexField, formGroup, path, idPrefix, values);
30923
31095
  return fields
30924
- .map(f => {
30925
- const clone = FieldsUtils.cloneObject(f);
30926
- const value = ReadFieldsFilterPipe.getValue(f, values, index);
30927
- if (!ReadFieldsFilterPipe.isEmpty(value)) {
30928
- clone.value = value;
30929
- }
30930
- return clone;
30931
- })
30932
- .map(f => {
30933
- if (!f.display_context) {
30934
- if (FieldsUtils.isValidDisplayContext(complexField.display_context)) {
30935
- f.display_context = complexField.display_context;
30936
- }
30937
- }
30938
- if (setupHidden) {
30939
- ReadFieldsFilterPipe.evaluateConditionalShow(f, checkConditionalShowAgainst, path, formGroupAvailable, complexField.id);
30940
- }
30941
- return f;
30942
- })
30943
- .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));
30944
31099
  }
30945
31100
  static ɵfac = function ReadFieldsFilterPipe_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ReadFieldsFilterPipe)(); };
30946
31101
  static ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "ccdReadFieldsFilter", type: ReadFieldsFilterPipe, pure: true, standalone: false });
@@ -35384,7 +35539,7 @@ class CaseResolver {
35384
35539
  // as discussed for EUI-5456, need functionality to go to default page
35385
35540
  goToDefaultPage() {
35386
35541
  console.info('Going to default page!');
35387
- const userDetails = JSON.parse(this.sessionStorage.getItem(USER_DETAILS));
35542
+ const userDetails = safeJsonParse(this.sessionStorage.getItem(USER_DETAILS));
35388
35543
  userDetails && userDetails.roles
35389
35544
  && !userDetails.roles.includes(PUI_CASE_MANAGER)
35390
35545
  &&
@@ -35437,7 +35592,7 @@ class EventTriggerResolver {
35437
35592
  const query = route.queryParams;
35438
35593
  // If jurisdiction or caseType are missing, redirect to correct URL
35439
35594
  if (!jurisdiction || !caseType) {
35440
- const caseInfo = JSON.parse(this.sessionStorageService.getItem('caseInfo') || '{}');
35595
+ const caseInfo = safeJsonParse(this.sessionStorageService.getItem('caseInfo'), {});
35441
35596
  const jurisdictionId = caseInfo?.jurisdiction;
35442
35597
  const caseTypeId = caseInfo?.caseType;
35443
35598
  const caseId = caseInfo?.caseId;
@@ -39714,7 +39869,7 @@ class CreateCaseFiltersComponent {
39714
39869
  return events.filter(event => event.pre_states.length === 0);
39715
39870
  }
39716
39871
  retainEventsWithCreateRights(events) {
39717
- const userProfile = JSON.parse(this.sessionStorageService.getItem(USER_DETAILS));
39872
+ const userProfile = safeJsonParse(this.sessionStorageService.getItem(USER_DETAILS), null);
39718
39873
  return events.filter(event => userProfile && userProfile.roles &&
39719
39874
  !!userProfile.roles.find(role => this.hasCreateAccess(event, role)));
39720
39875
  }
@@ -39852,7 +40007,7 @@ class CreateCaseFiltersComponent {
39852
40007
  }], selectionChanged: [{
39853
40008
  type: Output
39854
40009
  }] }); })();
39855
- (() => { (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 }); })();
39856
40011
 
39857
40012
  class CreateCaseFiltersModule {
39858
40013
  static ɵfac = function CreateCaseFiltersModule_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CreateCaseFiltersModule)(); };
@@ -41473,5 +41628,5 @@ class TestRouteSnapshotBuilder {
41473
41628
  * Generated bundle index. Do not edit.
41474
41629
  */
41475
41630
 
41476
- 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 };
41477
41632
  //# sourceMappingURL=hmcts-ccd-case-ui-toolkit.mjs.map