@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
@@ -3903,6 +3903,13 @@ class FieldsUtils {
3903
3903
  return '';
3904
3904
  }
3905
3905
  }
3906
+ static getUserTaskFromClientContext(clientContextStr) {
3907
+ if (clientContextStr) {
3908
+ let clientContext = JSON.parse(clientContextStr);
3909
+ return clientContext.client_context.user_task;
3910
+ }
3911
+ return null;
3912
+ }
3906
3913
  buildCanShowPredicate(eventTrigger, form) {
3907
3914
  const currentState = this.getCurrentEventState(eventTrigger, form);
3908
3915
  return (page) => {
@@ -7067,6 +7074,7 @@ class ProfileService {
7067
7074
  .set('experimental', 'true')
7068
7075
  .set('Accept', ProfileService.V2_MEDIATYPE_USER_PROFILE)
7069
7076
  .set('Content-Type', 'application/json');
7077
+ // Not adding client context header because header is added to call immediately afterwards
7070
7078
  return this.httpService
7071
7079
  .get(url, { headers, observe: 'body' })
7072
7080
  .pipe(map((p) => plainToClass(Profile, p)));
@@ -7961,6 +7969,7 @@ class CasesService {
7961
7969
  let headers = new HttpHeaders();
7962
7970
  headers = headers.set('experimental', 'true');
7963
7971
  headers = headers.set('Content-Type', 'application/json');
7972
+ headers = this.addClientContextHeader(headers);
7964
7973
  if (Draft.isDraft(caseId)) {
7965
7974
  headers = headers.set('Accept', CasesService.V2_MEDIATYPE_START_DRAFT_TRIGGER);
7966
7975
  }
@@ -7971,9 +7980,11 @@ class CasesService {
7971
7980
  headers = headers.set('Accept', CasesService.V2_MEDIATYPE_START_CASE_TRIGGER);
7972
7981
  }
7973
7982
  return this.http
7974
- .get(url, { headers, observe: 'body' })
7975
- .pipe(map(body => {
7976
- return FieldsUtils.handleNestedDynamicLists(body);
7983
+ .get(url, { headers, observe: 'response' })
7984
+ .pipe(map((response) => {
7985
+ console.log('response barking mad', response);
7986
+ this.updateClientContextStorage(response.headers);
7987
+ return FieldsUtils.handleNestedDynamicLists(response.body);
7977
7988
  }), catchError(error => {
7978
7989
  this.errorService.setError(error);
7979
7990
  return throwError(error);
@@ -7982,13 +7993,17 @@ class CasesService {
7982
7993
  createEvent(caseDetails, eventData) {
7983
7994
  const caseId = caseDetails.case_id;
7984
7995
  const url = `${this.appConfig.getCaseDataUrl()}/cases/${caseId}/events`;
7985
- const headers = new HttpHeaders()
7996
+ let headers = new HttpHeaders()
7986
7997
  .set('experimental', 'true')
7987
7998
  .set('Accept', CasesService.V2_MEDIATYPE_CREATE_EVENT)
7988
7999
  .set('Content-Type', 'application/json');
8000
+ headers = this.addClientContextHeader(headers);
7989
8001
  return this.http
7990
- .post(url, eventData, { headers, observe: 'body' })
7991
- .pipe(catchError(error => {
8002
+ .post(url, eventData, { headers, observe: 'response' })
8003
+ .pipe(map((response) => {
8004
+ this.updateClientContextStorage(response.headers);
8005
+ return response.body;
8006
+ }), catchError(error => {
7992
8007
  this.errorService.setError(error);
7993
8008
  return throwError(error);
7994
8009
  }));
@@ -7996,13 +8011,17 @@ class CasesService {
7996
8011
  validateCase(ctid, eventData, pageId) {
7997
8012
  const pageIdString = pageId ? `?pageId=${pageId}` : '';
7998
8013
  const url = `${this.appConfig.getCaseDataUrl()}/case-types/${ctid}/validate${pageIdString}`;
7999
- const headers = new HttpHeaders()
8014
+ let headers = new HttpHeaders()
8000
8015
  .set('experimental', 'true')
8001
8016
  .set('Accept', CasesService.V2_MEDIATYPE_CASE_DATA_VALIDATE)
8002
8017
  .set('Content-Type', 'application/json');
8018
+ headers = this.addClientContextHeader(headers);
8003
8019
  return this.http
8004
- .post(url, eventData, { headers, observe: 'body' })
8005
- .pipe(catchError(error => {
8020
+ .post(url, eventData, { headers, observe: 'response' })
8021
+ .pipe(map((response) => {
8022
+ this.updateClientContextStorage(response.headers);
8023
+ return response.body;
8024
+ }), catchError(error => {
8006
8025
  this.errorService.setError(error);
8007
8026
  return throwError(error);
8008
8027
  }));
@@ -8013,26 +8032,34 @@ class CasesService {
8013
8032
  ignoreWarning = 'true';
8014
8033
  }
8015
8034
  const url = `${this.appConfig.getCaseDataUrl()}/case-types/${ctid}/cases?ignore-warning=${ignoreWarning}`;
8016
- const headers = new HttpHeaders()
8035
+ let headers = new HttpHeaders()
8017
8036
  .set('experimental', 'true')
8018
8037
  .set('Accept', CasesService.V2_MEDIATYPE_CREATE_CASE)
8019
8038
  .set('Content-Type', 'application/json');
8039
+ headers = this.addClientContextHeader(headers);
8020
8040
  return this.http
8021
- .post(url, eventData, { headers, observe: 'body' })
8022
- .pipe(catchError(error => {
8041
+ .post(url, eventData, { headers, observe: 'response' })
8042
+ .pipe(map((response) => {
8043
+ this.updateClientContextStorage(response.headers);
8044
+ return response.body;
8045
+ }), catchError(error => {
8023
8046
  this.errorService.setError(error);
8024
8047
  return throwError(error);
8025
8048
  }));
8026
8049
  }
8027
8050
  getPrintDocuments(caseId) {
8028
8051
  const url = `${this.appConfig.getCaseDataUrl()}/cases/${caseId}/documents`;
8029
- const headers = new HttpHeaders()
8052
+ let headers = new HttpHeaders()
8030
8053
  .set('experimental', 'true')
8031
8054
  .set('Accept', CasesService.V2_MEDIATYPE_CASE_DOCUMENTS)
8032
8055
  .set('Content-Type', 'application/json');
8056
+ headers = this.addClientContextHeader(headers);
8033
8057
  return this.http
8034
- .get(url, { headers, observe: 'body' })
8035
- .pipe(map(body => body.documentResources), catchError(error => {
8058
+ .get(url, { headers, observe: 'response' })
8059
+ .pipe(map((response) => {
8060
+ this.updateClientContextStorage(response.headers);
8061
+ return response.body.documentResources;
8062
+ }), catchError(error => {
8036
8063
  this.errorService.setError(error);
8037
8064
  return throwError(error);
8038
8065
  }));
@@ -8065,17 +8092,6 @@ class CasesService {
8065
8092
  wizardPage.case_fields = this.orderService.sort(this.wizardPageFieldToCaseFieldMapper.mapAll(wizardPage.wizard_page_fields, eventTrigger.case_fields));
8066
8093
  });
8067
8094
  }
8068
- /*
8069
- Checks if the user has role of pui-case-manager and returns true or false
8070
- */
8071
- isPuiCaseManager() {
8072
- const userInfoStr = this.sessionStorageService.getItem('userDetails');
8073
- if (userInfoStr) {
8074
- const userInfo = JSON.parse(userInfoStr);
8075
- return userInfo && userInfo.roles && (userInfo.roles.indexOf(CasesService.PUI_CASE_MANAGER) !== -1);
8076
- }
8077
- return false;
8078
- }
8079
8095
  getCourtOrHearingCentreName(locationId) {
8080
8096
  return this.http.post(`/api/locations/getLocationsById`, { locations: [{ locationId }] });
8081
8097
  }
@@ -8120,6 +8136,25 @@ class CasesService {
8120
8136
  .get(url)
8121
8137
  .pipe(catchError(error => throwError(error)));
8122
8138
  }
8139
+ addClientContextHeader(headers) {
8140
+ const clientContextDetails = this.sessionStorageService.getItem('clientContext');
8141
+ if (clientContextDetails) {
8142
+ // may require URI encoding in certain circumstances
8143
+ const clientContext = window.btoa(clientContextDetails);
8144
+ if (clientContext) {
8145
+ headers = headers.set('Client-Context', clientContext);
8146
+ }
8147
+ }
8148
+ return headers;
8149
+ }
8150
+ updateClientContextStorage(headers) {
8151
+ // for mocking - TODO: Kasi Remove/Uncomment for testing
8152
+ // headers = this.setMockClientContextHeader(headers);
8153
+ if (headers && headers.get('Client-Context')) {
8154
+ const clientContextString = window.atob(headers.get('Client-Context'));
8155
+ this.sessionStorageService.setItem('clientContext', clientContextString);
8156
+ }
8157
+ }
8123
8158
  }
8124
8159
  // Internal (UI) API
8125
8160
  CasesService.V2_MEDIATYPE_CASE_VIEW = 'application/vnd.uk.gov.hmcts.ccd-data-store-api.ui-case-view.v2+json';
@@ -8633,8 +8668,7 @@ class EventCompletionStateMachineService {
8633
8668
  entryActionForStateCompleteEventAndTask(state, context) {
8634
8669
  // Trigger final state to complete processing of state machine
8635
8670
  state.trigger(EventCompletionStates.Final);
8636
- const taskStr = context.sessionStorageService.getItem('taskToComplete');
8637
- if (taskStr) {
8671
+ if (this.getTaskFromClientContext(context)) {
8638
8672
  context.sessionStorageService.setItem('assignNeeded', 'false');
8639
8673
  // just set event can be completed
8640
8674
  context.component.eventCanBeCompleted.emit(true);
@@ -8653,9 +8687,7 @@ class EventCompletionStateMachineService {
8653
8687
  entryActionForStateTaskUnassigned(state, context) {
8654
8688
  // Trigger final state to complete processing of state machine
8655
8689
  state.trigger(EventCompletionStates.Final);
8656
- // Get task details
8657
- const taskStr = context.sessionStorageService.getItem('taskToComplete');
8658
- if (taskStr) {
8690
+ if (this.getTaskFromClientContext(context)) {
8659
8691
  context.sessionStorageService.setItem('assignNeeded', 'true');
8660
8692
  context.component.eventCanBeCompleted.emit(true);
8661
8693
  }
@@ -8690,6 +8722,11 @@ class EventCompletionStateMachineService {
8690
8722
  addTransitionsForStateTaskUnassigned() {
8691
8723
  this.stateTaskUnassigned.addTransition(EventCompletionStates.Final, this.stateFinal);
8692
8724
  }
8725
+ getTaskFromClientContext(context) {
8726
+ const clientContextStr = context.sessionStorageService.getItem('clientContext');
8727
+ const userTask = FieldsUtils.getUserTaskFromClientContext(clientContextStr);
8728
+ return userTask ? userTask.task_data : null;
8729
+ }
8693
8730
  }
8694
8731
  EventCompletionStateMachineService.ɵfac = function EventCompletionStateMachineService_Factory(t) { return new (t || EventCompletionStateMachineService)(); };
8695
8732
  EventCompletionStateMachineService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: EventCompletionStateMachineService, factory: EventCompletionStateMachineService.ɵfac });
@@ -9158,11 +9195,9 @@ class CaseEditComponent {
9158
9195
  this.isSubmitting = true;
9159
9196
  // We have to run the event completion checks if task in session storage
9160
9197
  // and if the task is in session storage, then is it associated to the case
9161
- let taskInSessionStorage;
9162
- const taskStr = this.sessionStorageService.getItem('taskToComplete');
9163
- if (taskStr) {
9164
- taskInSessionStorage = JSON.parse(taskStr);
9165
- }
9198
+ const clientContextStr = this.sessionStorageService.getItem('clientContext');
9199
+ const userTask = FieldsUtils.getUserTaskFromClientContext(clientContextStr);
9200
+ const taskInSessionStorage = userTask ? userTask.task_data : null;
9166
9201
  if (taskInSessionStorage && taskInSessionStorage.case_id === this.getCaseId(caseDetails)) {
9167
9202
  // Show event completion component to perform event completion checks
9168
9203
  this.eventCompletionParams = ({
@@ -9361,14 +9396,16 @@ class CaseEditComponent {
9361
9396
  });
9362
9397
  }
9363
9398
  postCompleteTaskIfRequired() {
9364
- const taskStr = this.sessionStorageService.getItem('taskToComplete');
9399
+ const clientContextStr = this.sessionStorageService.getItem('clientContext');
9400
+ const userTask = FieldsUtils.getUserTaskFromClientContext(clientContextStr);
9401
+ const [task, taskToBeCompleted] = userTask ? [userTask.task_data, userTask.complete_task] : [null, false];
9365
9402
  const assignNeeded = this.sessionStorageService.getItem('assignNeeded') === 'true';
9366
- if (taskStr && assignNeeded) {
9367
- const task = JSON.parse(taskStr);
9403
+ if (task && assignNeeded && taskToBeCompleted) {
9404
+ // const task: Task = JSON.parse(taskStr);
9368
9405
  return this.workAllocationService.assignAndCompleteTask(task.id);
9369
9406
  }
9370
- else if (taskStr) {
9371
- const task = JSON.parse(taskStr);
9407
+ else if (task && taskToBeCompleted) {
9408
+ // const task: Task = JSON.parse(taskStr);
9372
9409
  return this.workAllocationService.completeTask(task.id);
9373
9410
  }
9374
9411
  return of(true);
@@ -11019,8 +11056,12 @@ class CaseEventCompletionTaskReassignedComponent {
11019
11056
  }
11020
11057
  onContinue() {
11021
11058
  // Get task details
11022
- const taskStr = this.sessionStorageService.getItem('taskToComplete');
11023
- if (taskStr) {
11059
+ const clientContextStr = this.sessionStorageService.getItem('clientContext');
11060
+ const userTask = FieldsUtils.getUserTaskFromClientContext(clientContextStr);
11061
+ const task = userTask ? userTask.task_data : null;
11062
+ // not complete_task not utilised here as related to event completion
11063
+ // service wanting task associated with event to not be completed not directly relevant
11064
+ if (task) {
11024
11065
  this.sessionStorageService.setItem('assignNeeded', 'true');
11025
11066
  // set event can be completed to true
11026
11067
  this.parentComponent.eventCanBeCompleted.emit(true);
@@ -35047,19 +35088,27 @@ class EventStartGuard {
35047
35088
  task = tasksAssignedToUser[0];
35048
35089
  }
35049
35090
  // if one task assigned to user, allow user to complete event
35050
- this.sessionStorageService.setItem(EventStartGuard.TASK_TO_COMPLETE, JSON.stringify(task));
35091
+ const storeClientContext = {
35092
+ client_context: {
35093
+ user_task: {
35094
+ task_data: task,
35095
+ complete_task: true
35096
+ }
35097
+ }
35098
+ };
35099
+ this.sessionStorageService.setItem(EventStartGuard.CLIENT_CONTEXT, JSON.stringify(storeClientContext));
35051
35100
  return true;
35052
35101
  }
35053
35102
  }
35054
35103
  removeTaskFromSessionStorage() {
35055
- this.sessionStorageService.removeItem(EventStartGuard.TASK_TO_COMPLETE);
35104
+ this.sessionStorageService.removeItem(EventStartGuard.CLIENT_CONTEXT);
35056
35105
  }
35057
35106
  checkForTasks(payload, caseId, eventId, taskId) {
35058
35107
  var _a;
35059
35108
  if (taskId && ((_a = payload === null || payload === void 0 ? void 0 : payload.tasks) === null || _a === void 0 ? void 0 : _a.length) > 0) {
35060
35109
  const task = payload.tasks.find((t) => t.id == taskId);
35061
35110
  if (task) {
35062
- this.sessionStorageService.setItem(EventStartGuard.TASK_TO_COMPLETE, JSON.stringify(task));
35111
+ this.sessionStorageService.setItem(EventStartGuard.CLIENT_CONTEXT, JSON.stringify(task));
35063
35112
  }
35064
35113
  else {
35065
35114
  this.removeTaskFromSessionStorage();
@@ -35081,7 +35130,7 @@ class EventStartGuard {
35081
35130
  }
35082
35131
  }
35083
35132
  }
35084
- EventStartGuard.TASK_TO_COMPLETE = 'taskToComplete';
35133
+ EventStartGuard.CLIENT_CONTEXT = 'clientContext';
35085
35134
  EventStartGuard.ɵfac = function EventStartGuard_Factory(t) { return new (t || EventStartGuard)(i0.ɵɵinject(WorkAllocationService), i0.ɵɵinject(i1$1.Router), i0.ɵɵinject(SessionStorageService)); };
35086
35135
  EventStartGuard.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: EventStartGuard, factory: EventStartGuard.ɵfac });
35087
35136
  (function () {
@@ -35221,9 +35270,17 @@ class EventStartStateMachineService {
35221
35270
  task = context.tasks[0];
35222
35271
  }
35223
35272
  const taskStr = JSON.stringify(task);
35224
- console.log('entryActionForStateOneTaskAssignedToUser: setting taskToComplete to ' + taskStr);
35273
+ console.log('entryActionForStateOneTaskAssignedToUser: setting client context task_data to ' + taskStr);
35225
35274
  // Store task to session
35226
- context.sessionStorageService.setItem('taskToComplete', taskStr);
35275
+ const clientContext = {
35276
+ client_context: {
35277
+ user_task: {
35278
+ task_data: task,
35279
+ complete_task: true
35280
+ }
35281
+ }
35282
+ };
35283
+ context.sessionStorageService.setItem('clientContext', JSON.stringify(clientContext));
35227
35284
  // Allow user to perform the event
35228
35285
  context.router.navigate([`/cases/case-details/${context.caseId}/trigger/${context.eventId}`], { relativeTo: context.route });
35229
35286
  }