@hmcts/ccd-case-ui-toolkit 7.0.37-rc2 → 7.0.38-client-context

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/esm2020/lib/shared/components/case-editor/case-edit/case-edit.component.mjs +11 -11
  2. package/esm2020/lib/shared/components/case-editor/case-event-completion/components/case-event-completion-task-reassigned/case-event-completion-task-reassigned.component.mjs +16 -14
  3. package/esm2020/lib/shared/components/case-editor/services/cases.service.mjs +54 -27
  4. package/esm2020/lib/shared/components/case-editor/services/event-completion-state-machine.service.mjs +9 -6
  5. package/esm2020/lib/shared/components/event-start/event-guard/event-start.guard.mjs +13 -5
  6. package/esm2020/lib/shared/components/event-start/services/event-start-state-machine.service.mjs +11 -3
  7. package/esm2020/lib/shared/domain/work-allocation/Task.mjs +1 -1
  8. package/esm2020/lib/shared/services/fields/fields.utils.mjs +8 -1
  9. package/esm2020/lib/shared/services/profile/profile.service.mjs +2 -1
  10. package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs +106 -49
  11. package/fesm2015/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
  12. package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs +106 -49
  13. package/fesm2020/hmcts-ccd-case-ui-toolkit.mjs.map +1 -1
  14. package/lib/shared/components/case-editor/case-edit/case-edit.component.d.ts.map +1 -1
  15. package/lib/shared/components/case-editor/case-event-completion/components/case-event-completion-task-reassigned/case-event-completion-task-reassigned.component.d.ts +1 -2
  16. package/lib/shared/components/case-editor/case-event-completion/components/case-event-completion-task-reassigned/case-event-completion-task-reassigned.component.d.ts.map +1 -1
  17. package/lib/shared/components/case-editor/services/cases.service.d.ts +2 -1
  18. package/lib/shared/components/case-editor/services/cases.service.d.ts.map +1 -1
  19. package/lib/shared/components/case-editor/services/event-completion-state-machine.service.d.ts +1 -0
  20. package/lib/shared/components/case-editor/services/event-completion-state-machine.service.d.ts.map +1 -1
  21. package/lib/shared/components/event-start/event-guard/event-start.guard.d.ts +1 -1
  22. package/lib/shared/components/event-start/event-guard/event-start.guard.d.ts.map +1 -1
  23. package/lib/shared/components/event-start/services/event-start-state-machine.service.d.ts.map +1 -1
  24. package/lib/shared/domain/work-allocation/Task.d.ts +4 -0
  25. package/lib/shared/domain/work-allocation/Task.d.ts.map +1 -1
  26. package/lib/shared/services/fields/fields.utils.d.ts +2 -0
  27. package/lib/shared/services/fields/fields.utils.d.ts.map +1 -1
  28. package/package.json +1 -1
@@ -3909,6 +3909,13 @@ class FieldsUtils {
3909
3909
  return '';
3910
3910
  }
3911
3911
  }
3912
+ static getUserTaskFromClientContext(clientContextStr) {
3913
+ if (clientContextStr) {
3914
+ let clientContext = JSON.parse(clientContextStr);
3915
+ return clientContext.client_context.user_task;
3916
+ }
3917
+ return null;
3918
+ }
3912
3919
  buildCanShowPredicate(eventTrigger, form) {
3913
3920
  const currentState = this.getCurrentEventState(eventTrigger, form);
3914
3921
  return (page) => {
@@ -6801,6 +6808,7 @@ class ProfileService {
6801
6808
  .set('experimental', 'true')
6802
6809
  .set('Accept', ProfileService.V2_MEDIATYPE_USER_PROFILE)
6803
6810
  .set('Content-Type', 'application/json');
6811
+ // Not adding client context header because header is added to call immediately afterwards
6804
6812
  return this.httpService
6805
6813
  .get(url, { headers, observe: 'body' })
6806
6814
  .pipe(map((p) => plainToClass(Profile, p)));
@@ -7667,6 +7675,7 @@ class CasesService {
7667
7675
  let headers = new HttpHeaders();
7668
7676
  headers = headers.set('experimental', 'true');
7669
7677
  headers = headers.set('Content-Type', 'application/json');
7678
+ headers = this.addClientContextHeader(headers);
7670
7679
  if (Draft.isDraft(caseId)) {
7671
7680
  headers = headers.set('Accept', CasesService.V2_MEDIATYPE_START_DRAFT_TRIGGER);
7672
7681
  }
@@ -7677,9 +7686,11 @@ class CasesService {
7677
7686
  headers = headers.set('Accept', CasesService.V2_MEDIATYPE_START_CASE_TRIGGER);
7678
7687
  }
7679
7688
  return this.http
7680
- .get(url, { headers, observe: 'body' })
7681
- .pipe(map(body => {
7682
- return FieldsUtils.handleNestedDynamicLists(body);
7689
+ .get(url, { headers, observe: 'response' })
7690
+ .pipe(map((response) => {
7691
+ console.log('response barking mad', response);
7692
+ this.updateClientContextStorage(response.headers);
7693
+ return FieldsUtils.handleNestedDynamicLists(response.body);
7683
7694
  }), catchError(error => {
7684
7695
  this.errorService.setError(error);
7685
7696
  return throwError(error);
@@ -7688,13 +7699,17 @@ class CasesService {
7688
7699
  createEvent(caseDetails, eventData) {
7689
7700
  const caseId = caseDetails.case_id;
7690
7701
  const url = `${this.appConfig.getCaseDataUrl()}/cases/${caseId}/events`;
7691
- const headers = new HttpHeaders()
7702
+ let headers = new HttpHeaders()
7692
7703
  .set('experimental', 'true')
7693
7704
  .set('Accept', CasesService.V2_MEDIATYPE_CREATE_EVENT)
7694
7705
  .set('Content-Type', 'application/json');
7706
+ headers = this.addClientContextHeader(headers);
7695
7707
  return this.http
7696
- .post(url, eventData, { headers, observe: 'body' })
7697
- .pipe(catchError(error => {
7708
+ .post(url, eventData, { headers, observe: 'response' })
7709
+ .pipe(map((response) => {
7710
+ this.updateClientContextStorage(response.headers);
7711
+ return response.body;
7712
+ }), catchError(error => {
7698
7713
  this.errorService.setError(error);
7699
7714
  return throwError(error);
7700
7715
  }));
@@ -7702,13 +7717,17 @@ class CasesService {
7702
7717
  validateCase(ctid, eventData, pageId) {
7703
7718
  const pageIdString = pageId ? `?pageId=${pageId}` : '';
7704
7719
  const url = `${this.appConfig.getCaseDataUrl()}/case-types/${ctid}/validate${pageIdString}`;
7705
- const headers = new HttpHeaders()
7720
+ let headers = new HttpHeaders()
7706
7721
  .set('experimental', 'true')
7707
7722
  .set('Accept', CasesService.V2_MEDIATYPE_CASE_DATA_VALIDATE)
7708
7723
  .set('Content-Type', 'application/json');
7724
+ headers = this.addClientContextHeader(headers);
7709
7725
  return this.http
7710
- .post(url, eventData, { headers, observe: 'body' })
7711
- .pipe(catchError(error => {
7726
+ .post(url, eventData, { headers, observe: 'response' })
7727
+ .pipe(map((response) => {
7728
+ this.updateClientContextStorage(response.headers);
7729
+ return response.body;
7730
+ }), catchError(error => {
7712
7731
  this.errorService.setError(error);
7713
7732
  return throwError(error);
7714
7733
  }));
@@ -7719,26 +7738,34 @@ class CasesService {
7719
7738
  ignoreWarning = 'true';
7720
7739
  }
7721
7740
  const url = `${this.appConfig.getCaseDataUrl()}/case-types/${ctid}/cases?ignore-warning=${ignoreWarning}`;
7722
- const headers = new HttpHeaders()
7741
+ let headers = new HttpHeaders()
7723
7742
  .set('experimental', 'true')
7724
7743
  .set('Accept', CasesService.V2_MEDIATYPE_CREATE_CASE)
7725
7744
  .set('Content-Type', 'application/json');
7745
+ headers = this.addClientContextHeader(headers);
7726
7746
  return this.http
7727
- .post(url, eventData, { headers, observe: 'body' })
7728
- .pipe(catchError(error => {
7747
+ .post(url, eventData, { headers, observe: 'response' })
7748
+ .pipe(map((response) => {
7749
+ this.updateClientContextStorage(response.headers);
7750
+ return response.body;
7751
+ }), catchError(error => {
7729
7752
  this.errorService.setError(error);
7730
7753
  return throwError(error);
7731
7754
  }));
7732
7755
  }
7733
7756
  getPrintDocuments(caseId) {
7734
7757
  const url = `${this.appConfig.getCaseDataUrl()}/cases/${caseId}/documents`;
7735
- const headers = new HttpHeaders()
7758
+ let headers = new HttpHeaders()
7736
7759
  .set('experimental', 'true')
7737
7760
  .set('Accept', CasesService.V2_MEDIATYPE_CASE_DOCUMENTS)
7738
7761
  .set('Content-Type', 'application/json');
7762
+ headers = this.addClientContextHeader(headers);
7739
7763
  return this.http
7740
- .get(url, { headers, observe: 'body' })
7741
- .pipe(map(body => body.documentResources), catchError(error => {
7764
+ .get(url, { headers, observe: 'response' })
7765
+ .pipe(map((response) => {
7766
+ this.updateClientContextStorage(response.headers);
7767
+ return response.body.documentResources;
7768
+ }), catchError(error => {
7742
7769
  this.errorService.setError(error);
7743
7770
  return throwError(error);
7744
7771
  }));
@@ -7771,17 +7798,6 @@ class CasesService {
7771
7798
  wizardPage.case_fields = this.orderService.sort(this.wizardPageFieldToCaseFieldMapper.mapAll(wizardPage.wizard_page_fields, eventTrigger.case_fields));
7772
7799
  });
7773
7800
  }
7774
- /*
7775
- Checks if the user has role of pui-case-manager and returns true or false
7776
- */
7777
- isPuiCaseManager() {
7778
- const userInfoStr = this.sessionStorageService.getItem('userDetails');
7779
- if (userInfoStr) {
7780
- const userInfo = JSON.parse(userInfoStr);
7781
- return userInfo && userInfo.roles && (userInfo.roles.indexOf(CasesService.PUI_CASE_MANAGER) !== -1);
7782
- }
7783
- return false;
7784
- }
7785
7801
  getCourtOrHearingCentreName(locationId) {
7786
7802
  return this.http.post(`/api/locations/getLocationsById`, { locations: [{ locationId }] });
7787
7803
  }
@@ -7848,6 +7864,25 @@ class CasesService {
7848
7864
  .get(url)
7849
7865
  .pipe(catchError(error => throwError(error)));
7850
7866
  }
7867
+ addClientContextHeader(headers) {
7868
+ const clientContextDetails = this.sessionStorageService.getItem('clientContext');
7869
+ if (clientContextDetails) {
7870
+ // may require URI encoding in certain circumstances
7871
+ const clientContext = window.btoa(clientContextDetails);
7872
+ if (clientContext) {
7873
+ headers = headers.set('Client-Context', clientContext);
7874
+ }
7875
+ }
7876
+ return headers;
7877
+ }
7878
+ updateClientContextStorage(headers) {
7879
+ // for mocking - TODO: Kasi Remove/Uncomment for testing
7880
+ // headers = this.setMockClientContextHeader(headers);
7881
+ if (headers && headers.get('Client-Context')) {
7882
+ const clientContextString = window.atob(headers.get('Client-Context'));
7883
+ this.sessionStorageService.setItem('clientContext', clientContextString);
7884
+ }
7885
+ }
7851
7886
  }
7852
7887
  // Internal (UI) API
7853
7888
  CasesService.V2_MEDIATYPE_CASE_VIEW = 'application/vnd.uk.gov.hmcts.ccd-data-store-api.ui-case-view.v2+json';
@@ -8338,8 +8373,7 @@ class EventCompletionStateMachineService {
8338
8373
  entryActionForStateCompleteEventAndTask(state, context) {
8339
8374
  // Trigger final state to complete processing of state machine
8340
8375
  state.trigger(EventCompletionStates.Final);
8341
- const taskStr = context.sessionStorageService.getItem('taskToComplete');
8342
- if (taskStr) {
8376
+ if (this.getTaskFromClientContext(context)) {
8343
8377
  context.sessionStorageService.setItem('assignNeeded', 'false');
8344
8378
  // just set event can be completed
8345
8379
  context.component.eventCanBeCompleted.emit(true);
@@ -8358,9 +8392,7 @@ class EventCompletionStateMachineService {
8358
8392
  entryActionForStateTaskUnassigned(state, context) {
8359
8393
  // Trigger final state to complete processing of state machine
8360
8394
  state.trigger(EventCompletionStates.Final);
8361
- // Get task details
8362
- const taskStr = context.sessionStorageService.getItem('taskToComplete');
8363
- if (taskStr) {
8395
+ if (this.getTaskFromClientContext(context)) {
8364
8396
  context.sessionStorageService.setItem('assignNeeded', 'true');
8365
8397
  context.component.eventCanBeCompleted.emit(true);
8366
8398
  }
@@ -8395,6 +8427,11 @@ class EventCompletionStateMachineService {
8395
8427
  addTransitionsForStateTaskUnassigned() {
8396
8428
  this.stateTaskUnassigned.addTransition(EventCompletionStates.Final, this.stateFinal);
8397
8429
  }
8430
+ getTaskFromClientContext(context) {
8431
+ const clientContextStr = context.sessionStorageService.getItem('clientContext');
8432
+ const userTask = FieldsUtils.getUserTaskFromClientContext(clientContextStr);
8433
+ return userTask ? userTask.task_data : null;
8434
+ }
8398
8435
  }
8399
8436
  EventCompletionStateMachineService.ɵfac = function EventCompletionStateMachineService_Factory(t) { return new (t || EventCompletionStateMachineService)(); };
8400
8437
  EventCompletionStateMachineService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: EventCompletionStateMachineService, factory: EventCompletionStateMachineService.ɵfac });
@@ -8853,11 +8890,9 @@ class CaseEditComponent {
8853
8890
  this.isSubmitting = true;
8854
8891
  // We have to run the event completion checks if task in session storage
8855
8892
  // and if the task is in session storage, then is it associated to the case
8856
- let taskInSessionStorage;
8857
- const taskStr = this.sessionStorageService.getItem('taskToComplete');
8858
- if (taskStr) {
8859
- taskInSessionStorage = JSON.parse(taskStr);
8860
- }
8893
+ const clientContextStr = this.sessionStorageService.getItem('clientContext');
8894
+ const userTask = FieldsUtils.getUserTaskFromClientContext(clientContextStr);
8895
+ const taskInSessionStorage = userTask ? userTask.task_data : null;
8861
8896
  if (taskInSessionStorage && taskInSessionStorage.case_id === this.getCaseId(caseDetails)) {
8862
8897
  // Show event completion component to perform event completion checks
8863
8898
  this.eventCompletionParams = ({
@@ -9056,14 +9091,16 @@ class CaseEditComponent {
9056
9091
  });
9057
9092
  }
9058
9093
  postCompleteTaskIfRequired() {
9059
- const taskStr = this.sessionStorageService.getItem('taskToComplete');
9094
+ const clientContextStr = this.sessionStorageService.getItem('clientContext');
9095
+ const userTask = FieldsUtils.getUserTaskFromClientContext(clientContextStr);
9096
+ const [task, taskToBeCompleted] = userTask ? [userTask.task_data, userTask.complete_task] : [null, false];
9060
9097
  const assignNeeded = this.sessionStorageService.getItem('assignNeeded') === 'true';
9061
- if (taskStr && assignNeeded) {
9062
- const task = JSON.parse(taskStr);
9098
+ if (task && assignNeeded && taskToBeCompleted) {
9099
+ // const task: Task = JSON.parse(taskStr);
9063
9100
  return this.workAllocationService.assignAndCompleteTask(task.id);
9064
9101
  }
9065
- else if (taskStr) {
9066
- const task = JSON.parse(taskStr);
9102
+ else if (task && taskToBeCompleted) {
9103
+ // const task: Task = JSON.parse(taskStr);
9067
9104
  return this.workAllocationService.completeTask(task.id);
9068
9105
  }
9069
9106
  return of(true);
@@ -10587,8 +10624,12 @@ class CaseEventCompletionTaskReassignedComponent {
10587
10624
  }
10588
10625
  onContinue() {
10589
10626
  // Get task details
10590
- const taskStr = this.sessionStorageService.getItem('taskToComplete');
10591
- if (taskStr) {
10627
+ const clientContextStr = this.sessionStorageService.getItem('clientContext');
10628
+ const userTask = FieldsUtils.getUserTaskFromClientContext(clientContextStr);
10629
+ const task = userTask ? userTask.task_data : null;
10630
+ // not complete_task not utilised here as related to event completion
10631
+ // service wanting task associated with event to not be completed not directly relevant
10632
+ if (task) {
10592
10633
  this.sessionStorageService.setItem('assignNeeded', 'true');
10593
10634
  // set event can be completed to true
10594
10635
  this.parentComponent.eventCanBeCompleted.emit(true);
@@ -32312,18 +32353,26 @@ class EventStartGuard {
32312
32353
  task = tasksAssignedToUser[0];
32313
32354
  }
32314
32355
  // if one task assigned to user, allow user to complete event
32315
- this.sessionStorageService.setItem(EventStartGuard.TASK_TO_COMPLETE, JSON.stringify(task));
32356
+ const storeClientContext = {
32357
+ client_context: {
32358
+ user_task: {
32359
+ task_data: task,
32360
+ complete_task: true
32361
+ }
32362
+ }
32363
+ };
32364
+ this.sessionStorageService.setItem(EventStartGuard.CLIENT_CONTEXT, JSON.stringify(storeClientContext));
32316
32365
  return true;
32317
32366
  }
32318
32367
  }
32319
32368
  removeTaskFromSessionStorage() {
32320
- this.sessionStorageService.removeItem(EventStartGuard.TASK_TO_COMPLETE);
32369
+ this.sessionStorageService.removeItem(EventStartGuard.CLIENT_CONTEXT);
32321
32370
  }
32322
32371
  checkForTasks(payload, caseId, eventId, taskId) {
32323
32372
  if (taskId && payload?.tasks?.length > 0) {
32324
32373
  const task = payload.tasks.find((t) => t.id == taskId);
32325
32374
  if (task) {
32326
- this.sessionStorageService.setItem(EventStartGuard.TASK_TO_COMPLETE, JSON.stringify(task));
32375
+ this.sessionStorageService.setItem(EventStartGuard.CLIENT_CONTEXT, JSON.stringify(task));
32327
32376
  }
32328
32377
  else {
32329
32378
  this.removeTaskFromSessionStorage();
@@ -32345,7 +32394,7 @@ class EventStartGuard {
32345
32394
  }
32346
32395
  }
32347
32396
  }
32348
- EventStartGuard.TASK_TO_COMPLETE = 'taskToComplete';
32397
+ EventStartGuard.CLIENT_CONTEXT = 'clientContext';
32349
32398
  EventStartGuard.ɵfac = function EventStartGuard_Factory(t) { return new (t || EventStartGuard)(i0.ɵɵinject(WorkAllocationService), i0.ɵɵinject(i1$1.Router), i0.ɵɵinject(SessionStorageService)); };
32350
32399
  EventStartGuard.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: EventStartGuard, factory: EventStartGuard.ɵfac });
32351
32400
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(EventStartGuard, [{
@@ -32483,9 +32532,17 @@ class EventStartStateMachineService {
32483
32532
  task = context.tasks[0];
32484
32533
  }
32485
32534
  const taskStr = JSON.stringify(task);
32486
- console.log('entryActionForStateOneTaskAssignedToUser: setting taskToComplete to ' + taskStr);
32535
+ console.log('entryActionForStateOneTaskAssignedToUser: setting client context task_data to ' + taskStr);
32487
32536
  // Store task to session
32488
- context.sessionStorageService.setItem('taskToComplete', taskStr);
32537
+ const clientContext = {
32538
+ client_context: {
32539
+ user_task: {
32540
+ task_data: task,
32541
+ complete_task: true
32542
+ }
32543
+ }
32544
+ };
32545
+ context.sessionStorageService.setItem('clientContext', JSON.stringify(clientContext));
32489
32546
  // Allow user to perform the event
32490
32547
  context.router.navigate([`/cases/case-details/${context.caseId}/trigger/${context.eventId}`], { relativeTo: context.route });
32491
32548
  }