Skip to content

Commit faddae7

Browse files
authored
fix(ui): do not refresh state if route changed before api response (#5115)
1 parent b189499 commit faddae7

14 files changed

+92
-23
lines changed

ui/src/app/shared/repomanager/from/repomanager.form.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { RouterTestingModule } from '@angular/router/testing';
66
import { TranslateLoader, TranslateModule, TranslateParser, TranslateService } from '@ngx-translate/core';
77
import { ToasterService } from 'angular2-toaster/angular2-toaster';
88
import { AuthenticationService } from 'app/service/authentication/authentication.service';
9-
import { MonitoringService } from 'app/service/services.module';
9+
import { MonitoringService, RouterService } from 'app/service/services.module';
1010
import { UserService } from 'app/service/user/user.service';
1111
import { WorkflowRunService } from 'app/service/workflow/run/workflow.run.service';
1212
import { WorkflowService } from 'app/service/workflow/workflow.service';
@@ -50,7 +50,7 @@ describe('CDS: Project RepoManager Form Component', () => {
5050
UserService,
5151
AuthenticationService,
5252
MonitoringService,
53-
WorkflowRunService
53+
RouterService
5454
],
5555
imports: [
5656
SharedModule,

ui/src/app/store/applications.state.spec.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import { WorkflowState } from './workflow.state';
2323
import { PipelineService } from 'app/service/pipeline/pipeline.service';
2424
import { EnvironmentService } from 'app/service/environment/environment.service';
2525
import { ApplicationService } from 'app/service/application/application.service';
26+
import { RouterService } from 'app/service/router/router.service';
27+
import { RouterTestingModule } from '@angular/router/testing';
2628

2729
describe('Applications', () => {
2830
let store: Store;
@@ -32,6 +34,7 @@ describe('Applications', () => {
3234
TestBed.configureTestingModule({
3335
providers: [
3436
{ provide: XHRBackend, useClass: MockBackend },
37+
RouterService,
3538
NavbarService,
3639
WorkflowService,
3740
WorkflowRunService,
@@ -43,7 +46,7 @@ describe('Applications', () => {
4346
],
4447
imports: [
4548
NgxsModule.forRoot([ApplicationsState, ProjectState, PipelinesState, WorkflowState]),
46-
HttpClientTestingModule
49+
HttpClientTestingModule, RouterTestingModule.withRoutes([]),
4750
],
4851
}).compileComponents();
4952

ui/src/app/store/pipelines.state.spec.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,21 @@ import { WorkflowState } from './workflow.state';
2222
import { PipelineService } from 'app/service/pipeline/pipeline.service';
2323
import { EnvironmentService } from 'app/service/environment/environment.service';
2424
import { ApplicationService } from 'app/service/application/application.service';
25+
import { RouterService } from 'app/service/router/router.service';
26+
import { Router } from '@angular/router';
27+
import { RouterTestingModule } from '@angular/router/testing';
2528

2629
describe('Pipelines', () => {
2730
let store: Store;
2831
let testProjectKey = 'test1';
2932

3033
beforeEach(async(() => {
3134
TestBed.configureTestingModule({
32-
providers: [NavbarService, WorkflowRunService, WorkflowService, ProjectStore,
35+
providers: [NavbarService, WorkflowRunService, WorkflowService, ProjectStore, RouterService,
3336
ProjectService, PipelineService, EnvironmentService, ApplicationService],
3437
imports: [
3538
NgxsModule.forRoot([ApplicationsState, ProjectState, PipelinesState, WorkflowState]),
36-
HttpClientTestingModule
39+
HttpClientTestingModule, RouterTestingModule.withRoutes([])
3740
],
3841
}).compileComponents();
3942

ui/src/app/store/project.state.spec.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,19 @@ import { WorkflowState } from './workflow.state';
2525
import { PipelineService } from 'app/service/pipeline/pipeline.service';
2626
import { EnvironmentService } from 'app/service/environment/environment.service';
2727
import { ApplicationService } from 'app/service/application/application.service';
28+
import { RouterService } from 'app/service/router/router.service';
29+
import { Router } from '@angular/router';
30+
import { RouterTestingModule } from '@angular/router/testing';
2831

2932
describe('Project', () => {
3033
let store: Store;
3134

3235
beforeEach(async(() => {
3336
TestBed.configureTestingModule({
34-
providers: [NavbarService, WorkflowService, WorkflowRunService, ProjectStore,
37+
providers: [NavbarService, WorkflowService, WorkflowRunService, ProjectStore, RouterService,
3538
ProjectService, PipelineService, EnvironmentService, ApplicationService],
3639
imports: [
37-
HttpClientTestingModule,
40+
HttpClientTestingModule, RouterTestingModule.withRoutes([]),
3841
NgxsModule.forRoot([ProjectState, ApplicationsState, PipelinesState, WorkflowState])
3942
],
4043
}).compileComponents();

ui/src/app/store/workflow.state.spec.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { ProjectService } from 'app/service/project/project.service';
1010
import { ProjectStore } from 'app/service/project/project.store';
1111
import { WorkflowRunService } from 'app/service/workflow/run/workflow.run.service';
1212
import { WorkflowService } from 'app/service/workflow/workflow.service';
13-
import { ApplicationsState } from './applications.state';
13+
import { ApplicationsState, ApplicationStateModel } from './applications.state';
1414
import { PipelinesState } from './pipelines.state';
1515
import { AddProject } from './project.action';
1616
import { ProjectState, ProjectStateModel } from './project.state';
@@ -19,29 +19,37 @@ import { WorkflowState, WorkflowStateModel } from './workflow.state';
1919
import { PipelineService } from 'app/service/pipeline/pipeline.service';
2020
import { EnvironmentService } from 'app/service/environment/environment.service';
2121
import { ApplicationService } from 'app/service/application/application.service';
22+
import { RouterService } from 'app/service/router/router.service';
23+
import { RouterTestingModule } from '@angular/router/testing';
24+
import { Router } from '@angular/router';
25+
import { Application } from 'app/model/application.model';
26+
import { Usage } from 'app/model/usage.model';
27+
import { of } from 'rxjs';
2228

2329
describe('Workflows', () => {
2430
let store: Store;
2531
let testProjectKey = 'test1';
26-
32+
let routerService: RouterService;
2733
beforeEach(async(() => {
2834
TestBed.configureTestingModule({
2935
providers: [
36+
RouterService,
3037
NavbarService,
3138
WorkflowService,
3239
WorkflowRunService,
3340
ProjectStore,
3441
ProjectService,
3542
PipelineService,
3643
EnvironmentService,
37-
ApplicationService
44+
ApplicationService,
3845
],
3946
imports: [
4047
NgxsModule.forRoot([ApplicationsState, ProjectState, PipelinesState, WorkflowState]),
41-
HttpClientTestingModule
48+
HttpClientTestingModule, RouterTestingModule.withRoutes([]),
4249
],
4350
}).compileComponents();
4451

52+
routerService = TestBed.get(RouterService);
4553
store = TestBed.get(Store);
4654
let project = <Project>{
4755
key: testProjectKey,
@@ -62,6 +70,9 @@ describe('Workflows', () => {
6270
}));
6371

6472
it('fetch workflow', async(() => {
73+
spyOn(routerService, 'getRouteSnapshotParams').and.callFake(() => {
74+
return {'key': testProjectKey, 'workflowName': 'wf1'};
75+
});
6576
const http = TestBed.get(HttpTestingController);
6677
store.dispatch(new workflowsActions.GetWorkflow({
6778
projectKey: testProjectKey,
@@ -277,6 +288,9 @@ describe('Workflows', () => {
277288
}));
278289

279290
it('fetch audits', async(() => {
291+
spyOn(routerService, 'getRouteSnapshotParams').and.callFake(() => {
292+
return {'key': testProjectKey, 'workflowName': 'wf1'};
293+
});
280294
const http = TestBed.get(HttpTestingController);
281295
let workflow = new Workflow();
282296
workflow.name = 'wf1';

ui/src/app/store/workflow.state.ts

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
2+
import { Router } from '@angular/router';
23
import { Action, createSelector, Selector, State, StateContext } from '@ngxs/store';
34
import { WNode, WNodeHook, WNodeTrigger, Workflow } from 'app/model/workflow.model';
45
import { WorkflowNodeJobRun, WorkflowNodeRun, WorkflowRun } from 'app/model/workflow.run.model';
56
import { NavbarService } from 'app/service/navbar/navbar.service';
7+
import { RouterService } from 'app/service/router/router.service';
68
import { WorkflowRunService } from 'app/service/workflow/run/workflow.run.service';
79
import { WorkflowService } from 'app/service/workflow/workflow.service';
810
import { WorkflowSidebarMode } from 'app/service/workflow/workflow.sidebar.store';
@@ -224,8 +226,8 @@ export class WorkflowState {
224226
};
225227
}
226228

227-
constructor(private _http: HttpClient, private _navbarService: NavbarService,
228-
private _workflowService: WorkflowService, private _workflowRunService: WorkflowRunService) {
229+
constructor(private _http: HttpClient, private _navbarService: NavbarService, private _routerService: RouterService,
230+
private _workflowService: WorkflowService, private _workflowRunService: WorkflowRunService, private _router: Router) {
229231
}
230232

231233
@Action(actionWorkflow.OpenEditModal)
@@ -1016,6 +1018,11 @@ export class WorkflowState {
10161018
resync(ctx: StateContext<WorkflowStateModel>, action: actionWorkflow.GetWorkflow) {
10171019
return this._workflowService.getWorkflow(action.payload.projectKey, action.payload.workflowName).pipe(first(),
10181020
tap(wf => {
1021+
let routeParams = this._routerService.getRouteSnapshotParams({}, this._router.routerState.snapshot.root);
1022+
if (wf.project_key !== routeParams['key'] || wf.name !== routeParams['workflowName']) {
1023+
return;
1024+
}
1025+
10191026
const state = ctx.getState();
10201027
let canEdit = wf.permissions.writable;
10211028
let editWorkflow: Workflow;
@@ -1131,12 +1138,18 @@ export class WorkflowState {
11311138
});
11321139
}),
11331140
tap((wr: WorkflowRun) => {
1134-
const stateRun = ctx.getState();
1135-
ctx.setState({
1136-
...stateRun,
1137-
projectKey: action.payload.projectKey,
1138-
workflowRun: wr
1139-
});
1141+
let routeParams = this._routerService.getRouteSnapshotParams({}, this._router.routerState.snapshot.root);
1142+
if (wr.workflow.project_key !== routeParams['key'] || wr.workflow.name !== routeParams['workflowName']) {
1143+
return;
1144+
}
1145+
if (routeParams['number'] && routeParams['number'] === wr.num.toString()) {
1146+
const stateRun = ctx.getState();
1147+
ctx.setState({
1148+
...stateRun,
1149+
projectKey: action.payload.projectKey,
1150+
workflowRun: wr
1151+
});
1152+
}
11401153
ctx.dispatch(new UpdateWorkflowRunList({ workflowRun: wr }));
11411154
return wr;
11421155
}));
@@ -1180,6 +1193,10 @@ export class WorkflowState {
11801193
});
11811194
}),
11821195
tap((wrs: Array<WorkflowRun>) => {
1196+
let routeParams = this._routerService.getRouteSnapshotParams({}, this._router.routerState.snapshot.root);
1197+
if (action.payload.projectKey !== routeParams['key'] || action.payload.workflowName !== routeParams['workflowName']) {
1198+
return;
1199+
}
11831200
const stateRun = ctx.getState();
11841201
ctx.setState({
11851202
...stateRun,
@@ -1207,6 +1224,17 @@ export class WorkflowState {
12071224
loadingWorkflowNodeRun: false
12081225
});
12091226
}), tap((wnr: WorkflowNodeRun) => {
1227+
let routeParams = this._routerService.getRouteSnapshotParams({}, this._router.routerState.snapshot.root);
1228+
if (action.payload.projectKey !== routeParams['key'] || action.payload.workflowName !== routeParams['workflowName']) {
1229+
return;
1230+
}
1231+
if (!routeParams['number'] || routeParams['number'] !== action.payload.num.toString()) {
1232+
return;
1233+
}
1234+
if (!routeParams['nodeId'] || routeParams['nodeId'] !== action.payload.nodeRunID.toString()) {
1235+
return;
1236+
}
1237+
12101238
const stateNR = ctx.getState();
12111239
let node = Workflow.getNodeByID(wnr.workflow_node_id, stateNR.workflowRun.workflow);
12121240
ctx.setState({

ui/src/app/views/application/show/admin/application.admin.component.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { ProjectService } from '../../../../service/project/project.service';
2222
import { ProjectStore } from '../../../../service/project/project.store';
2323
import { RepoManagerService } from '../../../../service/repomanager/project.repomanager.service';
2424
import {
25-
MonitoringService,
25+
MonitoringService, RouterService,
2626
ServicesModule,
2727
WorkflowRunService,
2828
WorkflowStore
@@ -72,6 +72,7 @@ describe('CDS: Application Admin Component', () => {
7272
{ provide: APP_BASE_HREF, useValue: '/' },
7373
Store,
7474
UserService,
75+
RouterService,
7576
AuthenticationService
7677
],
7778
imports: [

ui/src/app/views/application/show/admin/repository/application.repo.component.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { PipelineService } from 'app/service/pipeline/pipeline.service';
1919
import { ProjectService } from 'app/service/project/project.service';
2020
import { ProjectStore } from 'app/service/project/project.store';
2121
import { RepoManagerService } from 'app/service/repomanager/project.repomanager.service';
22-
import { MonitoringService, ThemeStore, UserService } from 'app/service/services.module';
22+
import { MonitoringService, RouterService, ThemeStore, UserService } from 'app/service/services.module';
2323
import { VariableService } from 'app/service/variable/variable.service';
2424
import { WorkflowRunService } from 'app/service/workflow/run/workflow.run.service';
2525
import { WorkflowService } from 'app/service/workflow/workflow.service';
@@ -66,6 +66,7 @@ describe('CDS: Application Repo Component', () => {
6666
Store,
6767
{ provide: APP_BASE_HREF, useValue: '/' },
6868
ThemeStore,
69+
RouterService,
6970
WorkflowRunService,
7071
WorkflowService,
7172
UserService,

ui/src/app/views/application/show/application.component.spec.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,13 @@ import { NavbarService } from '../../../service/navbar/navbar.service';
2525
import { PipelineService } from '../../../service/pipeline/pipeline.service';
2626
import { ProjectService } from '../../../service/project/project.service';
2727
import { ProjectStore } from '../../../service/project/project.store';
28-
import { MonitoringService, ServicesModule, WorkflowRunService, WorkflowStore } from '../../../service/services.module';
28+
import {
29+
MonitoringService,
30+
RouterService,
31+
ServicesModule,
32+
WorkflowRunService,
33+
WorkflowStore
34+
} from '../../../service/services.module';
2935
import { VariableService } from '../../../service/variable/variable.service';
3036
import { WorkflowService } from '../../../service/workflow/workflow.service';
3137
import { SharedModule } from '../../../shared/shared.module';
@@ -68,6 +74,7 @@ describe('CDS: Application', () => {
6874
WorkflowRunService,
6975
Store,
7076
UserService,
77+
RouterService,
7178
AuthenticationService
7279
],
7380
imports: [

ui/src/app/views/pipeline/add/pipeline.add.component.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { ToastService } from '../../../shared/toast/ToastService';
3030
import { PipelineModule } from '../pipeline.module';
3131
import { PipelineAddComponent } from './pipeline.add.component';
3232
import { ApplicationService } from 'app/service/application/application.service';
33+
import { RouterService } from 'app/service/router/router.service';
3334

3435
describe('CDS: Pipeline Add Component', () => {
3536

@@ -63,6 +64,7 @@ describe('CDS: Pipeline Add Component', () => {
6364
WorkflowService,
6465
WorkflowRunService,
6566
UserService,
67+
RouterService,
6668
AuthenticationService
6769
],
6870
imports: [

0 commit comments

Comments
 (0)