diff --git a/package.json b/package.json index 51863c3260..222366e7cd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@hmcts/ccd-case-ui-toolkit", - "version": "7.3.0", + "version": "7.2.58-exui-3545-rc4", "engines": { "node": ">=20.19.0" }, diff --git a/projects/ccd-case-ui-toolkit/package.json b/projects/ccd-case-ui-toolkit/package.json index 21cc23514e..3f128c4eee 100644 --- a/projects/ccd-case-ui-toolkit/package.json +++ b/projects/ccd-case-ui-toolkit/package.json @@ -1,6 +1,6 @@ { "name": "@hmcts/ccd-case-ui-toolkit", - "version": "7.3.0", + "version": "7.2.58-exui-3545-rc4", "engines": { "node": ">=20.19.0" }, diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit/case-edit.component.ts b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit/case-edit.component.ts index 770f60c85e..75718b265f 100644 --- a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit/case-edit.component.ts +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/case-edit/case-edit.component.ts @@ -263,7 +263,7 @@ export class CaseEditComponent implements OnInit, OnDestroy { const userId = userInfo.id ? userInfo.id : userInfo.uid; const eventDetails: EventDetails = {eventId, caseId, userId, assignNeeded}; if (this.taskExistsForThisEvent(taskInSessionStorage, taskEventCompletionInfo, eventDetails)) { - this.abstractConfig.logMessage(`task exist for this event for caseId and eventId as ${caseId} ${eventId}`); + this.abstractConfig.logMessage(`task ${taskInSessionStorage?.id} exist for this event for caseId and eventId as ${caseId} ${eventId}`); // Show event completion component to perform event completion checks this.eventCompletionParams = ({ caseId, @@ -281,6 +281,7 @@ export class CaseEditComponent implements OnInit, OnDestroy { this.sessionStorageService.setItem(CaseEditComponent.TASK_EVENT_COMPLETION_INFO, JSON.stringify(taskEventCompletionInfo)); this.isEventCompletionChecksRequired = true; } else { + this.abstractConfig.logMessage(`task does not exist for caseId and eventId as ${caseId} ${eventId}`); // Task not in session storage, proceed to submit const caseEventData = this.generateCaseEventData({ eventTrigger, @@ -462,11 +463,13 @@ export class CaseEditComponent implements OnInit, OnDestroy { this.sessionStorageService.setItem('taskCompletionError', 'false'); submit(caseEventData).pipe(switchMap((response) => { eventResponse = response; + this.abstractConfig.logMessage(`Event ${this.eventCompletionParams?.eventId} of case Id ${this.eventCompletionParams?.caseId} and taskId ${this.eventCompletionParams?.task?.id}`); return this.postCompleteTaskIfRequired(); }),finalize(() => { this.loadingService.unregister(loadingSpinnerToken); // on event completion ensure the previous event clientContext/taskEventCompletionInfo removed // Note - Not removeTaskFromClientContext because could interfere with other logic + this.abstractConfig.logMessage(`Clearing client context and task event completion info after event ${this.eventCompletionParams?.eventId} submission of case Id ${this.eventCompletionParams?.caseId} and task Id ${this.eventCompletionParams?.task?.id}`); this.sessionStorageService.removeItem(CaseEditComponent.CLIENT_CONTEXT); this.sessionStorageService.removeItem(CaseEditComponent.TASK_EVENT_COMPLETION_INFO) this.isSubmitting = false; @@ -476,6 +479,7 @@ export class CaseEditComponent implements OnInit, OnDestroy { this.finishEventCompletionLogic(eventResponse); }, error => { + this.abstractConfig.logMessage(`An error occurred while submission of event ${this.eventCompletionParams?.eventId} and case Id ${this.eventCompletionParams?.caseId} and taskId ${this.eventCompletionParams?.task?.id}`); if (!eventResponse) { // event submission error this.error = error; @@ -504,12 +508,13 @@ export class CaseEditComponent implements OnInit, OnDestroy { const [task, taskToBeCompleted] = userTask ? [userTask.task_data, userTask.complete_task] : [null, false]; const assignNeeded = this.sessionStorageService.getItem('assignNeeded') === 'true'; if (task && assignNeeded && taskToBeCompleted) { - this.abstractConfig.logMessage(`postCompleteTaskIfRequired with assignNeeded: taskId ${task.id} and event name ${this.eventTrigger.name}`); + this.abstractConfig.logMessage(`postCompleteTaskIfRequired with assignNeeded: taskId ${task.id} and event name ${this.eventTrigger?.name}`); return this.workAllocationService.assignAndCompleteTask(task.id, this.eventTrigger.name); } else if (task && taskToBeCompleted) { - this.abstractConfig.logMessage(`postCompleteTaskIfRequired: taskId ${task.id} and event name ${this.eventTrigger.name}`); + this.abstractConfig.logMessage(`postCompleteTaskIfRequired: taskId ${task.id} and event name ${this.eventTrigger?.name}`); return this.workAllocationService.completeTask(task.id, this.eventTrigger.name); } + this.abstractConfig.logMessage(`postCompleteTaskIfRequired: no task to complete for event name ${this.eventTrigger?.name} and caseId ${this.caseDetails?.case_id}`); return of(true); } diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/services/event-completion-state-machine.service.spec.ts b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/services/event-completion-state-machine.service.spec.ts index 7802a72b38..dd8d24181e 100644 --- a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/services/event-completion-state-machine.service.spec.ts +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/services/event-completion-state-machine.service.spec.ts @@ -133,6 +133,8 @@ describe('EventCompletionStateMachineService', () => { component: eventCompletionComponentEmitter }; + let mockStateMachineConfig: any; + beforeEach(async () => { TestBed.configureTestingModule({ imports: [RouterTestingModule], @@ -143,7 +145,8 @@ describe('EventCompletionStateMachineService', () => { { provide: CaseNotifier, useValue: mockCaseNotifier } ] }); - service = new EventCompletionStateMachineService(); + mockStateMachineConfig = { logMessage: jasmine.createSpy('logMessage') }; // added + service = new EventCompletionStateMachineService(mockStateMachineConfig); // pass config }); it('should initialise state machine', () => { diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/services/event-completion-state-machine.service.ts b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/services/event-completion-state-machine.service.ts index 2a38ddfe7c..7ebee515b0 100644 --- a/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/services/event-completion-state-machine.service.ts +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/components/case-editor/services/event-completion-state-machine.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { State, StateMachine } from '@edium/fsm'; import { throwError } from 'rxjs'; +import { AbstractAppConfig } from '../../../../app.config'; import { TaskState } from '../../../domain/work-allocation/Task'; import { FieldsUtils } from '../../../services'; import { EventCompletionStateMachineContext } from '../domain/event-completion-state-machine-context.model'; @@ -23,6 +24,8 @@ export class EventCompletionStateMachineService { public stateTaskUnassigned: State; public stateFinal: State; + constructor(private readonly abstractConfig: AbstractAppConfig) {} + public initialiseStateMachine(context: EventCompletionStateMachineContext): StateMachine { return new StateMachine(EVENT_COMPLETION_STATE_MACHINE, context); } @@ -80,10 +83,11 @@ export class EventCompletionStateMachineService { this.addTransitionsForStateTaskUnassigned(); } - public entryActionForStateCheckTasksCanBeCompleted(state: State, context: EventCompletionStateMachineContext): void { + public entryActionForStateCheckTasksCanBeCompleted = (state: State, context: EventCompletionStateMachineContext): void => { const assignNeeded = context.sessionStorageService.getItem('assignNeeded'); context.workAllocationService.getTask(context.task.id).subscribe( taskResponse => { + this.abstractConfig?.logMessage?.(`entryActionForStateCheckTasksCanBeCompleted: task_state ${taskResponse?.task?.task_state} for task id ${context?.task?.id}`); if (taskResponse?.task?.task_state) { switch (taskResponse.task.task_state.toUpperCase()) { case TaskState.Unassigned: @@ -119,9 +123,11 @@ export class EventCompletionStateMachineService { } else if (!taskResponse?.task) { context.alertService.setPreserveAlerts(true); context.alertService.warning({ phrase: 'Task statecheck : no task available for completion', replacements: {} }); + this.abstractConfig?.logMessage?.(`Task statecheck : no task available for completion`); } else { context.alertService.setPreserveAlerts(true); context.alertService.warning({ phrase: 'Task statecheck : no task state available for completion', replacements: {} }); + this.abstractConfig?.logMessage?.(`Task statecheck : no task state available for completion`); } }, error => { @@ -137,11 +143,12 @@ export class EventCompletionStateMachineService { context.component.setTaskState(EventCompletionTaskStates.TaskCancelled); } - public entryActionForStateCompleteEventAndTask(state: State, context: EventCompletionStateMachineContext): void { + public entryActionForStateCompleteEventAndTask = (state: State, context: EventCompletionStateMachineContext): void => { // Trigger final state to complete processing of state machine state.trigger(EventCompletionStates.Final); const clientContextStr = context.sessionStorageService.getItem(CaseEditComponent.CLIENT_CONTEXT); const userTask = FieldsUtils.getUserTaskFromClientContext(clientContextStr); + this.abstractConfig?.logMessage?.(`entryActionForStateCompleteEventAndTask: userTask task_data ${JSON.stringify(userTask?.task_data?.id)}`); if (userTask?.task_data) { context.sessionStorageService.setItem('assignNeeded', 'false'); // just set event can be completed diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/event-guard/event-start.guard.ts b/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/event-guard/event-start.guard.ts index abf8d29894..066bb37a22 100644 --- a/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/event-guard/event-start.guard.ts +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/event-guard/event-start.guard.ts @@ -134,6 +134,7 @@ export class EventStartGuard implements CanActivate { } private checkForTasks(payload: TaskPayload, caseId: string, eventId: string, taskId: string, userId: string): Observable { + this.abstractConfig.logMessage(`checkForTasks: for caseId ${caseId} and eventId ${eventId} and taskId ${taskId} and userId ${userId}`); if (taskId && payload?.tasks?.length > 0) { const task = payload.tasks.find((t) => t.id == taskId); if (task) { @@ -181,5 +182,6 @@ export class EventStartGuard implements CanActivate { }; this.sessionStorageService.setItem(CaseEditComponent.TASK_EVENT_COMPLETION_INFO, JSON.stringify(taskEventCompletionInfo)); this.sessionStorageService.setItem(CaseEditComponent.CLIENT_CONTEXT, JSON.stringify(storeClientContext)); + this.abstractConfig.logMessage(`EventStartGuard:setClientContextStorage: set task ${task?.id} in client context for caseId ${caseId} and eventId ${eventId}`); } } diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/event-start.component.spec.ts b/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/event-start.component.spec.ts index 7c641b3af0..67c37699a5 100644 --- a/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/event-start.component.spec.ts +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/event-start.component.spec.ts @@ -2,6 +2,7 @@ import { CUSTOM_ELEMENTS_SCHEMA, DebugElement } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ActivatedRoute, Router } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; +import { AbstractAppConfig } from '../../../app.config'; import { Task } from '../../domain/work-allocation/Task'; import { SessionStorageService } from '../../services'; import { EventStartComponent } from './event-start.component'; @@ -76,6 +77,10 @@ describe('EventStartComponent', () => { 'addTransitions', 'startStateMachine', ]); + const mockAppConfig: Partial = { + // add only the methods EventStartComponent uses + getCaseDataUrl: () => '' + }; TestBed.configureTestingModule({ imports: [RouterTestingModule], declarations: [EventStartComponent], @@ -85,6 +90,7 @@ describe('EventStartComponent', () => { { provide: Router, useValue: mockRouter }, { provide: ActivatedRoute, useValue: mockRoute }, { provide: EventStartStateMachineService, useValue: eventStartStateMachineService }, + { provide: AbstractAppConfig, useValue: mockAppConfig } ], }).compileComponents(); diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/event-start.component.ts b/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/event-start.component.ts index 3006ea206c..f3697f1a8c 100644 --- a/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/event-start.component.ts +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/event-start.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { StateMachine } from '@edium/fsm'; +import { AbstractAppConfig } from '../../../app.config'; import { Task } from '../../domain/work-allocation/Task'; import { ReadCookieService } from '../../services/cookie/read-cookie-service'; import { SessionStorageService } from '../../services/session/session-storage.service'; @@ -21,7 +22,8 @@ export class EventStartComponent implements OnInit { private readonly router: Router, private readonly route: ActivatedRoute, private readonly sessionStorageService: SessionStorageService, - private readonly cookieService: ReadCookieService) { + private readonly cookieService: ReadCookieService, + private readonly abstractConfig: AbstractAppConfig) { } public ngOnInit(): void { @@ -44,7 +46,7 @@ export class EventStartComponent implements OnInit { }; // Initialise state machine - this.service = new EventStartStateMachineService(); + this.service = new EventStartStateMachineService(this.abstractConfig); this.stateMachine = this.service.initialiseStateMachine(this.context); // Create states this.service.createStates(this.stateMachine); diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/services/event-start-state-machine.service.spec.ts b/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/services/event-start-state-machine.service.spec.ts index 972d276b00..09c19e1229 100644 --- a/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/services/event-start-state-machine.service.spec.ts +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/services/event-start-state-machine.service.spec.ts @@ -125,14 +125,21 @@ describe('EventStartStateMachineService', () => { cookieService: mockReadCookieService }; + let mockStateMachineConfig: any; + beforeEach(async () => { TestBed.configureTestingModule({ imports: [RouterTestingModule], providers: [ - { provide: Router, useValue: mockRouter } + { provide: Router, useValue: mockRouter }, + { + provide: EventStartStateMachineService, + useFactory: () => new EventStartStateMachineService(mockStateMachineConfig) + } ] }); - service = new EventStartStateMachineService(); + mockStateMachineConfig = { logMessage: jasmine.createSpy('logMessage') }; // minimal stub + service = TestBed.inject(EventStartStateMachineService); }); it('should initialise state machine', () => { diff --git a/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/services/event-start-state-machine.service.ts b/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/services/event-start-state-machine.service.ts index f4099dceba..aca909de2c 100644 --- a/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/services/event-start-state-machine.service.ts +++ b/projects/ccd-case-ui-toolkit/src/lib/shared/components/event-start/services/event-start-state-machine.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { Params } from '@angular/router'; import { State, StateMachine } from '@edium/fsm'; +import { AbstractAppConfig } from '../../../../app.config'; import { EventStartStateMachineContext, EventStartStates } from '../models'; import { TaskEventCompletionInfo } from '../../../domain/work-allocation/Task'; import { UserInfo } from '../../../domain/user/user-info.model'; @@ -20,6 +21,8 @@ export class EventStartStateMachineService { public stateTaskUnassigned: State; public stateFinal: State; + constructor(private readonly abstractConfig: AbstractAppConfig) {} + public initialiseStateMachine(context: EventStartStateMachineContext): StateMachine { return new StateMachine(EVENT_STATE_MACHINE, context); } @@ -174,7 +177,7 @@ export class EventStartStateMachineService { context.router.navigate([`${navigationURL}`], { queryParams: theQueryParams, relativeTo: context.route }); } - public entryActionForStateOneTaskAssignedToUser(state: State, context: EventStartStateMachineContext): void { + public entryActionForStateOneTaskAssignedToUser = (state: State, context: EventStartStateMachineContext): void => { // Trigger final state to complete processing of state machine state.trigger(EventStartStates.FINAL); @@ -185,6 +188,7 @@ export class EventStartStateMachineService { } const taskStr = JSON.stringify(task); + this.abstractConfig?.logMessage?.(`entryActionForStateOneTaskAssignedToUser: task_state ${task?.task_state} for task id ${task?.id}`); console.log('entryActionForStateOneTaskAssignedToUser: setting client context task_data to ' + taskStr); // Store task to session const currentLanguage = context.cookieService.getCookie('exui-preferred-language');