Skip to content

Commit 1c43845

Browse files
bodnaraxkureck
authored andcommitted
fix(admin): entity detail unsubscribe on destroy
* created mixin to handle unsubscribing from reload when destroyed * entity details now extend this mixin * this should fix sidemenu showing items for wrong entity
1 parent c441846 commit 1c43845

File tree

5 files changed

+41
-13
lines changed

5 files changed

+41
-13
lines changed

apps/admin-gui/src/app/facilities/pages/facility-detail-page/facility-detail-page.component.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@ import {
1717
} from '@perun-web-apps/perun/dialogs';
1818
import { DeleteFacilityDialogComponent } from '../../../shared/components/dialogs/delete-facility-dialog/delete-facility-dialog.component';
1919
import { ReloadEntityDetailService } from '../../../core/services/common/reload-entity-detail.service';
20+
import { destroyDetailMixin } from '../../../shared/destroy-entity-detail';
21+
import { takeUntil } from 'rxjs/operators';
2022

2123
@Component({
2224
selector: 'app-facility-detail-page',
2325
templateUrl: './facility-detail-page.component.html',
2426
styleUrls: ['./facility-detail-page.component.scss'],
2527
animations: [fadeIn],
2628
})
27-
export class FacilityDetailPageComponent implements OnInit {
29+
export class FacilityDetailPageComponent extends destroyDetailMixin() implements OnInit {
2830
facility: Facility;
2931
editFacilityAuth = false;
3032
deleteAuth = false;
@@ -40,11 +42,13 @@ export class FacilityDetailPageComponent implements OnInit {
4042
private router: Router,
4143
private entityStorageService: EntityStorageService,
4244
private reloadEntityDetail: ReloadEntityDetailService
43-
) {}
45+
) {
46+
super();
47+
}
4448

4549
ngOnInit(): void {
4650
this.reloadData();
47-
this.reloadEntityDetail.entityDetailChange.subscribe(() => {
51+
this.reloadEntityDetail.entityDetailChange.pipe(takeUntil(this.destroyed$)).subscribe(() => {
4852
this.reloadData();
4953
});
5054
}

apps/admin-gui/src/app/facilities/pages/resource-detail-page/resource-detail-page.component.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,16 @@ import {
2323
import { RemoveResourceDialogComponent } from '../../../shared/components/dialogs/remove-resource-dialog/remove-resource-dialog.component';
2424
import { ReloadEntityDetailService } from '../../../core/services/common/reload-entity-detail.service';
2525
import { SideMenuItem } from '../../../shared/side-menu/side-menu.component';
26+
import { destroyDetailMixin } from '../../../shared/destroy-entity-detail';
27+
import { takeUntil } from 'rxjs/operators';
2628

2729
@Component({
2830
selector: 'app-resource-detail-page',
2931
templateUrl: './resource-detail-page.component.html',
3032
styleUrls: ['./resource-detail-page.component.scss'],
3133
animations: [fadeIn],
3234
})
33-
export class ResourceDetailPageComponent implements OnInit {
35+
export class ResourceDetailPageComponent extends destroyDetailMixin() implements OnInit {
3436
resource: RichResource;
3537
vo: Vo;
3638
facility: Facility;
@@ -54,11 +56,13 @@ export class ResourceDetailPageComponent implements OnInit {
5456
private router: Router,
5557
private entityStorageService: EntityStorageService,
5658
private reloadEntityDetail: ReloadEntityDetailService
57-
) {}
59+
) {
60+
super();
61+
}
5862

5963
ngOnInit(): void {
6064
this.reloadData();
61-
this.reloadEntityDetail.entityDetailChange.subscribe(() => {
65+
this.reloadEntityDetail.entityDetailChange.pipe(takeUntil(this.destroyed$)).subscribe(() => {
6266
this.reloadData();
6367
});
6468
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { OnDestroy } from '@angular/core';
2+
import { Subject } from 'rxjs';
3+
4+
// eslint-disable-next-line
5+
export type Constructor<T = {}> = new (...args: any[]) => T;
6+
// eslint-disable-next-line
7+
export const destroyDetailMixin = <T extends Constructor>(base: T = class {} as T) =>
8+
class extends base implements OnDestroy {
9+
destroyed$ = new Subject<void>();
10+
ngOnDestroy(): void {
11+
this.destroyed$.next();
12+
}
13+
};

apps/admin-gui/src/app/vos/pages/group-detail-page/group-detail-page.component.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,16 @@ import {
2424
} from '@perun-web-apps/perun/dialogs';
2525
import { DeleteGroupDialogComponent } from '../../../shared/components/dialogs/delete-group-dialog/delete-group-dialog.component';
2626
import { ReloadEntityDetailService } from '../../../core/services/common/reload-entity-detail.service';
27+
import { destroyDetailMixin } from '../../../shared/destroy-entity-detail';
28+
import { takeUntil } from 'rxjs/operators';
2729

2830
@Component({
2931
selector: 'app-group-detail-page',
3032
templateUrl: './group-detail-page.component.html',
3133
styleUrls: ['./group-detail-page.component.scss'],
3234
animations: [fadeIn],
3335
})
34-
export class GroupDetailPageComponent implements OnInit {
36+
export class GroupDetailPageComponent extends destroyDetailMixin() implements OnInit {
3537
vo: Vo;
3638
group: RichGroup;
3739
editAuth = false;
@@ -59,10 +61,12 @@ export class GroupDetailPageComponent implements OnInit {
5961
private router: Router,
6062
private entityStorageService: EntityStorageService,
6163
private reloadEntityDetail: ReloadEntityDetailService
62-
) {}
64+
) {
65+
super();
66+
}
6367

6468
ngOnInit(): void {
65-
this.reloadEntityDetail.entityDetailChange.subscribe(() => {
69+
this.reloadEntityDetail.entityDetailChange.pipe(takeUntil(this.destroyed$)).subscribe(() => {
6670
this.reloadData();
6771
});
6872
this.reloadData();

apps/admin-gui/src/app/vos/pages/vo-detail-page/vo-detail-page.component.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@ import {
1717
} from '@perun-web-apps/perun/dialogs';
1818
import { RemoveVoDialogComponent } from '../../../shared/components/dialogs/remove-vo-dialog/remove-vo-dialog.component';
1919
import { ReloadEntityDetailService } from '../../../core/services/common/reload-entity-detail.service';
20+
import { destroyDetailMixin } from '../../../shared/destroy-entity-detail';
21+
import { takeUntil } from 'rxjs/operators';
2022

2123
@Component({
2224
selector: 'app-vo-detail-page',
2325
templateUrl: './vo-detail-page.component.html',
2426
styleUrls: ['./vo-detail-page.component.scss'],
2527
animations: [fadeIn],
2628
})
27-
export class VoDetailPageComponent implements OnInit {
29+
export class VoDetailPageComponent extends destroyDetailMixin() implements OnInit {
2830
vo: Vo;
2931
enrichedVo: EnrichedVo;
3032
editAuth: boolean;
@@ -41,11 +43,13 @@ export class VoDetailPageComponent implements OnInit {
4143
private authResolver: GuiAuthResolver,
4244
private entityStorageService: EntityStorageService,
4345
private reloadEntityDetail: ReloadEntityDetailService
44-
) {}
46+
) {
47+
super();
48+
}
4549

4650
ngOnInit(): void {
4751
this.reloadData();
48-
this.reloadEntityDetail.entityDetailChange.subscribe(() => {
52+
this.reloadEntityDetail.entityDetailChange.pipe(takeUntil(this.destroyed$)).subscribe(() => {
4953
this.reloadData();
5054
});
5155
}
@@ -98,7 +102,6 @@ export class VoDetailPageComponent implements OnInit {
98102
setMenuItems(): void {
99103
const isHierarchical = this.enrichedVo.memberVos.length !== 0;
100104
const sideMenuItem = this.sideMenuItemService.parseVo(this.vo, isHierarchical);
101-
102105
this.sideMenuService.setAccessMenuItems([sideMenuItem]);
103106
}
104107

0 commit comments

Comments
 (0)