Skip to content

Commit 61446a2

Browse files
dmitriy-borzenkoDmitriy Borzenko
and
Dmitriy Borzenko
authored
Kamu UI 590 flows tab fix loading state (#591)
* Added progress bar during initialization * added unit test * fixed angular zone outside warning --------- Co-authored-by: Dmitriy Borzenko <[email protected]>
1 parent 8b4380d commit 61446a2

File tree

4 files changed

+48
-6
lines changed

4 files changed

+48
-6
lines changed

src/app/dataset-view/additional-components/flows-component/flows.component.html

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<div class="search-result-container__content mb-20 container-main">
2-
<ng-container *ngIf="flowConnectionData$ | async as flowConnectionData">
2+
<ng-container *ngIf="flowConnectionData$ | async as flowConnectionData; else loading">
33
<ng-container *ngIf="flowConnectionData.flowsData.connectionDataForWidget.nodes.length; else noRuns">
44
<div class="d-flex justify-content-between">
55
<div class="mt-4">
@@ -122,4 +122,10 @@ <h2 class="title">
122122
</ng-container>
123123
</p>
124124
</ng-template>
125+
<ng-template #loading>
126+
<div class="position-relative">
127+
<mat-progress-bar data-test-id="init-progress-bar" class="position-absolute" mode="indeterminate" />
128+
</div>
129+
<div class="text-center mt-4">Loading...</div>
130+
</ng-template>
125131
</div>

src/app/dataset-view/additional-components/flows-component/flows.component.spec.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { mockDatasetBasicsRootFragment, mockDatasetMainDataId } from "src/app/se
1616
import { ToastrModule } from "ngx-toastr";
1717
import { findElementByDataTestId, registerMatSvgIcons } from "src/app/common/helpers/base-test.helpers.spec";
1818
import { DatasetFlowsService } from "./services/dataset-flows.service";
19-
import { of } from "rxjs";
19+
import { delay, of } from "rxjs";
2020
import { MatMenuModule } from "@angular/material/menu";
2121
import { PaginationComponent } from "src/app/common/components/pagination-component/pagination.component";
2222
import { MatTableModule } from "@angular/material/table";
@@ -36,6 +36,8 @@ import { mockFlowsTableData } from "src/app/api/mock/dataset-flow.mock";
3636
import { TileBaseWidgetComponent } from "src/app/dataset-flow/tile-base-widget/tile-base-widget.component";
3737
import { SettingsTabsEnum } from "../dataset-settings-component/dataset-settings.model";
3838
import { mockDatasetBasicsDerivedFragment } from "src/app/search/mock.data";
39+
import { MatProgressBarModule } from "@angular/material/progress-bar";
40+
import { AngularMultiSelectModule } from "angular2-multiselect-dropdown";
3941

4042
describe("FlowsComponent", () => {
4143
let component: FlowsComponent;
@@ -94,6 +96,8 @@ describe("FlowsComponent", () => {
9496
NgbTypeaheadModule,
9597
NgbPaginationModule,
9698
RouterModule,
99+
MatProgressBarModule,
100+
AngularMultiSelectModule,
97101
],
98102
}).compileComponents();
99103

@@ -208,4 +212,22 @@ describe("FlowsComponent", () => {
208212
component.datasetBasics = mockDatasetBasicsDerivedFragment;
209213
expect(component.redirectSection).toEqual(SettingsTabsEnum.TRANSFORM_SETTINGS);
210214
});
215+
216+
it("should check init loading block", fakeAsync(() => {
217+
fixture.detectChanges();
218+
mockFlowsTableData.connectionDataForWidget.nodes = [];
219+
spyOn(datasetFlowsService, "allFlowsPaused").and.returnValue(of(false));
220+
spyOn(datasetFlowsService, "datasetFlowsList").and.returnValue(of(mockFlowsTableData).pipe(delay(10)));
221+
spyOn(datasetFlowsService, "flowsInitiators").and.returnValue(of([]));
222+
tick(5);
223+
fixture.detectChanges();
224+
const progressBarBefore = findElementByDataTestId(fixture, "init-progress-bar");
225+
expect(progressBarBefore).toBeDefined();
226+
227+
tick(10);
228+
fixture.detectChanges();
229+
const progressBarAfter = findElementByDataTestId(fixture, "init-progress-bar");
230+
expect(progressBarAfter).toBeUndefined();
231+
discardPeriodicTasks();
232+
}));
211233
});

src/app/dataset-view/dataset-view.component.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,15 @@
66
*/
77

88
import { SessionStorageService } from "src/app/services/session-storage.service";
9-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, OnDestroy, OnInit } from "@angular/core";
9+
import {
10+
ChangeDetectionStrategy,
11+
ChangeDetectorRef,
12+
Component,
13+
inject,
14+
NgZone,
15+
OnDestroy,
16+
OnInit,
17+
} from "@angular/core";
1018
import { DatasetViewTypeEnum } from "./dataset-view.interface";
1119
import { NavigationEnd, Router } from "@angular/router";
1220
import { Node } from "@swimlane/ngx-graph/lib/models/node.model";
@@ -50,6 +58,7 @@ export class DatasetViewComponent extends BaseDatasetDataComponent implements On
5058
private sessionStorageService = inject(SessionStorageService);
5159
private clipboard = inject(Clipboard);
5260
private toastr = inject(ToastrService);
61+
private ngZone = inject(NgZone);
5362

5463
public ngOnInit(): void {
5564
const urlDatasetInfo = this.getDatasetInfoFromUrl();
@@ -343,7 +352,9 @@ export class DatasetViewComponent extends BaseDatasetDataComponent implements On
343352
.pipe(
344353
finalize(() => {
345354
this.sqlLoading = false;
346-
this.navigationService.navigateWithSqlQuery(params.query);
355+
this.ngZone.run(() => {
356+
this.navigationService.navigateWithSqlQuery(params.query);
357+
});
347358
}),
348359
takeUntilDestroyed(this.destroyRef),
349360
)

src/app/query/global-query/global-query.component.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* included in the LICENSE file.
66
*/
77

8-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, Input, OnInit } from "@angular/core";
8+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, Input, NgZone, OnInit } from "@angular/core";
99
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
1010
import { finalize, map, Observable } from "rxjs";
1111
import { MaybeNull } from "src/app/interface/app.types";
@@ -35,6 +35,7 @@ export class GlobalQueryComponent extends BaseComponent implements OnInit {
3535

3636
private sqlQueryService = inject(SqlQueryService);
3737
private cdr = inject(ChangeDetectorRef);
38+
private ngZone = inject(NgZone);
3839
private navigationService = inject(NavigationService);
3940

4041
public ngOnInit(): void {
@@ -58,7 +59,9 @@ export class GlobalQueryComponent extends BaseComponent implements OnInit {
5859
takeUntilDestroyed(this.destroyRef),
5960
finalize(() => {
6061
this.sqlLoading = false;
61-
this.navigationService.navigateWithSqlQuery(params.query);
62+
this.ngZone.run(() => {
63+
this.navigationService.navigateWithSqlQuery(params.query);
64+
});
6265
}),
6366
)
6467
.subscribe();

0 commit comments

Comments
 (0)