Skip to content

Commit 58bcb9b

Browse files
115046: Fixed performance issues in virtual metadata popup
1 parent df80c33 commit 58bcb9b

3 files changed

Lines changed: 51 additions & 16 deletions

File tree

src/app/item-page/edit-item-page/virtual-metadata/virtual-metadata.component.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@
55
</button>
66
</div>
77
<div class="modal-body">
8-
<ng-container *ngFor="let item of items; trackBy: trackItem">
9-
<div *ngVar="(isSelectedVirtualMetadataItem(item) | async) as selected"
10-
(click)="setSelectedVirtualMetadataItem(item, !selected)"
8+
<ng-container *ngFor="let itemDTO of itemDTOs$ | async; trackBy: trackItemDTO">
9+
<div *ngVar="(itemDTO.isSelectedVirtualMetadataItem$ | async) as selected"
10+
(click)="setSelectedVirtualMetadataItem(itemDTO.item, !selected)"
1111
class="item d-flex flex-row">
1212
<div class="m-2">
1313
<label>
1414
<input class="select" type="checkbox" [checked]="selected">
1515
</label>
1616
</div>
1717
<div class="flex-column">
18-
<ds-listable-object-component-loader [object]="item">
18+
<ds-listable-object-component-loader [object]="itemDTO.item">
1919
</ds-listable-object-component-loader>
20-
<div *ngFor="let metadata of virtualMetadata.get(item.uuid)">
20+
<div *ngFor="let metadata of virtualMetadata.get(itemDTO.item.uuid)">
2121
<div class="font-weight-bold">
2222
{{metadata.metadataField}}
2323
</div>
@@ -31,7 +31,7 @@
3131
<div class="d-flex flex-row-reverse m-2">
3232
<button class="btn btn-primary save"
3333
(click)="save.emit()">
34-
<i class="fas fa-save"></i> {{"item.edit.metadata.save-button" | translate}}
34+
<i aria-hidden="true" class="fas fa-save"></i> {{ 'item.edit.metadata.save-button' | translate }}
3535
</button>
3636
</div>
3737
</div>

src/app/item-page/edit-item-page/virtual-metadata/virtual-metadata.component.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ describe('VirtualMetadataComponent', () => {
7777
comp.url = url;
7878
comp.leftItem = item;
7979
comp.rightItem = relatedItem;
80+
comp.ngOnChanges();
8081
comp.relationshipId = relationshipId;
8182

8283
fixture.detectChanges();

src/app/item-page/edit-item-page/virtual-metadata/virtual-metadata.component.ts

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,17 @@ import {
88
EventEmitter,
99
Inject,
1010
Input,
11+
OnChanges,
12+
OnDestroy,
1113
OnInit,
1214
Output,
1315
} from '@angular/core';
1416
import { TranslateModule } from '@ngx-translate/core';
15-
import { Observable } from 'rxjs';
17+
import {
18+
BehaviorSubject,
19+
Observable,
20+
Subscription,
21+
} from 'rxjs';
1622

1723
import {
1824
APP_CONFIG,
@@ -21,9 +27,18 @@ import {
2127
import { ObjectUpdatesService } from '../../../core/data/object-updates/object-updates.service';
2228
import { Item } from '../../../core/shared/item.model';
2329
import { MetadataValue } from '../../../core/shared/metadata.models';
30+
import { hasValue } from '../../../shared/empty.util';
2431
import { ListableObjectComponentLoaderComponent } from '../../../shared/object-collection/shared/listable-object/listable-object-component-loader.component';
2532
import { VarDirective } from '../../../shared/utils/var.directive';
2633

34+
interface ItemDTO {
35+
36+
item: Item;
37+
38+
isSelectedVirtualMetadataItem$: Observable<boolean>;
39+
40+
}
41+
2742
@Component({
2843
selector: 'ds-virtual-metadata',
2944
templateUrl: './virtual-metadata.component.html',
@@ -42,7 +57,7 @@ import { VarDirective } from '../../../shared/utils/var.directive';
4257
* The component is shown when a relationship is marked to be deleted.
4358
* Each item has a checkbox to indicate whether its virtual metadata should be saved as real metadata.
4459
*/
45-
export class VirtualMetadataComponent implements OnInit {
60+
export class VirtualMetadataComponent implements OnInit, OnChanges, OnDestroy {
4661

4762
/**
4863
* The current url of this page
@@ -83,9 +98,9 @@ export class VirtualMetadataComponent implements OnInit {
8398
/**
8499
* Get an array of the left and the right item of the relationship to be deleted.
85100
*/
86-
get items() {
87-
return [this.leftItem, this.rightItem];
88-
}
101+
itemDTOs$: BehaviorSubject<ItemDTO[]> = new BehaviorSubject([]);
102+
103+
subs: Subscription[] = [];
89104

90105
public virtualMetadata: Map<string, VirtualMetadata[]> = new Map<string, VirtualMetadata[]>();
91106

@@ -137,14 +152,33 @@ export class VirtualMetadataComponent implements OnInit {
137152
/**
138153
* Prevent unnecessary rerendering so fields don't lose focus
139154
*/
140-
trackItem(index, item: Item) {
141-
return item && item.uuid;
155+
trackItemDTO(index, itemDTO: ItemDTO): string {
156+
return itemDTO?.item?.uuid;
142157
}
143158

144159
ngOnInit(): void {
145-
this.items.forEach((item) => {
146-
this.virtualMetadata.set(item.uuid, this.getVirtualMetadata(item));
147-
});
160+
this.subs.push(this.itemDTOs$.subscribe((itemDTOs: ItemDTO[]) => {
161+
itemDTOs.forEach((itemDTO: ItemDTO) => this.virtualMetadata.set(itemDTO.item.uuid, this.getVirtualMetadata(itemDTO.item)));
162+
}));
163+
}
164+
165+
ngOnChanges(): void {
166+
if (hasValue(this.leftItem) && hasValue(this.rightItem)) {
167+
this.itemDTOs$.next([
168+
{
169+
item: this.leftItem,
170+
isSelectedVirtualMetadataItem$: this.isSelectedVirtualMetadataItem(this.leftItem),
171+
},
172+
{
173+
item: this.rightItem,
174+
isSelectedVirtualMetadataItem$: this.isSelectedVirtualMetadataItem(this.rightItem),
175+
},
176+
]);
177+
}
178+
}
179+
180+
ngOnDestroy(): void {
181+
this.subs.forEach((sub: Subscription) => sub.unsubscribe());
148182
}
149183
}
150184

0 commit comments

Comments
 (0)