Skip to content

Commit bedfe02

Browse files
Merge branch 'w2p-113560_edit-item-add-relationships-one-by-one_contribute-7.6' into w2p-113560_edit-item-add-relationships-one-by-one_contribute-7_x
2 parents 14dbced + 227d471 commit bedfe02

5 files changed

Lines changed: 71 additions & 32 deletions

File tree

src/app/core/data/object-updates/object-updates.service.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
SetEditableFieldUpdateAction,
2020
SetValidFieldUpdateAction
2121
} from './object-updates.actions';
22-
import { distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators';
22+
import { distinctUntilChanged, filter, map, switchMap, take } from 'rxjs/operators';
2323
import {
2424
hasNoValue,
2525
hasValue,
@@ -198,17 +198,29 @@ export class ObjectUpdatesService {
198198
* @param url The page's URL for which the changes are saved
199199
* @param field An updated field for the page's object
200200
*/
201-
saveAddFieldUpdate(url: string, field: Identifiable) {
201+
saveAddFieldUpdate(url: string, field: Identifiable): Observable<boolean> {
202+
const update$: Observable<boolean> = this.getFieldUpdatesExclusive(url, [field]).pipe(
203+
filter((fieldUpdates: FieldUpdates) => fieldUpdates[field.uuid].changeType === FieldChangeType.ADD),
204+
take(1),
205+
map(() => true),
206+
);
202207
this.saveFieldUpdate(url, field, FieldChangeType.ADD);
208+
return update$;
203209
}
204210

205211
/**
206212
* Calls the saveFieldUpdate method with FieldChangeType.REMOVE
207213
* @param url The page's URL for which the changes are saved
208214
* @param field An updated field for the page's object
209215
*/
210-
saveRemoveFieldUpdate(url: string, field: Identifiable) {
216+
saveRemoveFieldUpdate(url: string, field: Identifiable): Observable<boolean> {
217+
const update$: Observable<boolean> = this.getFieldUpdatesExclusive(url, [field]).pipe(
218+
filter((fieldUpdates: FieldUpdates) => fieldUpdates[field.uuid].changeType === FieldChangeType.REMOVE),
219+
take(1),
220+
map(() => true),
221+
);
211222
this.saveFieldUpdate(url, field, FieldChangeType.REMOVE);
223+
return update$;
212224
}
213225

214226
/**

src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.ts

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -305,29 +305,28 @@ export class EditRelationshipListComponent implements OnInit, OnDestroy {
305305
modalComp.submitEv = () => {
306306
modalComp.isPending = true;
307307
const isLeft = this.currentItemIsLeftItem$.getValue();
308-
const addOperations = modalComp.toAdd.map((searchResult: any) => ({ type: 'add', searchResult }));
309-
const removeOperations = modalComp.toRemove.map((searchResult: any) => ({ type: 'remove', searchResult }));
308+
const addOperations = modalComp.toAdd.map((searchResult: ItemSearchResult) => ({ type: 'add', searchResult }));
309+
const removeOperations = modalComp.toRemove.map((searchResult: ItemSearchResult) => ({ type: 'remove', searchResult }));
310310
observableFrom([...addOperations, ...removeOperations]).pipe(
311-
concatMap(({ type, searchResult }: { type: string, searchResult: any }) => {
311+
concatMap(({ type, searchResult }: { type: string, searchResult: ItemSearchResult }) => {
312+
const relatedItem: Item = searchResult.indexableObject;
312313
if (type === 'add') {
313-
const relatedItem = searchResult.indexableObject;
314314
return this.relationshipService.getNameVariant(this.listId, relatedItem.uuid).pipe(
315-
map((nameVariant) => {
315+
switchMap((nameVariant) => {
316316
const update = {
317-
uuid: this.relationshipType.id + '-' + searchResult.indexableObject.uuid,
317+
uuid: `${this.relationshipType.id}-${relatedItem.uuid}`,
318318
nameVariant,
319319
type: this.relationshipType,
320320
originalIsLeft: isLeft,
321321
originalItem: this.item,
322322
relatedItem,
323323
} as RelationshipIdentifiable;
324-
this.objectUpdatesService.saveAddFieldUpdate(this.url, update);
325-
return update;
324+
return this.objectUpdatesService.saveAddFieldUpdate(this.url, update);
326325
}),
327326
take(1)
328327
);
329328
} else if (type === 'remove') {
330-
return this.relationshipService.getNameVariant(this.listId, searchResult.indexableObjectuuid).pipe(
329+
return this.relationshipService.getNameVariant(this.listId, relatedItem.uuid).pipe(
331330
switchMap((nameVariant) => {
332331
return this.getRelationFromId(searchResult.indexableObject).pipe(
333332
map( (relationship: Relationship) => {
@@ -339,9 +338,8 @@ export class EditRelationshipListComponent implements OnInit, OnDestroy {
339338
originalItem: this.item,
340339
relationship,
341340
} as RelationshipIdentifiable;
342-
this.objectUpdatesService.saveRemoveFieldUpdate(this.url,update);
343-
return update;
344-
})
341+
return this.objectUpdatesService.saveRemoveFieldUpdate(this.url,update);
342+
}),
345343
);
346344
}),
347345
take(1)

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
@@ -61,6 +61,7 @@ describe('VirtualMetadataComponent', () => {
6161
comp.url = url;
6262
comp.leftItem = item;
6363
comp.rightItem = relatedItem;
64+
comp.ngOnChanges();
6465
comp.relationshipId = relationshipId;
6566

6667
fixture.detectChanges();

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

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
1-
import { Component, EventEmitter, Inject, Input, OnInit, Output } from '@angular/core';
2-
import {Observable} from 'rxjs';
1+
import { Component, EventEmitter, Inject, Input, OnInit, Output, OnChanges, OnDestroy } from '@angular/core';
2+
import { Observable, Subscription, BehaviorSubject } from 'rxjs';
33
import {Item} from '../../../core/shared/item.model';
44
import {MetadataValue} from '../../../core/shared/metadata.models';
55
import {ObjectUpdatesService} from '../../../core/data/object-updates/object-updates.service';
66
import { APP_CONFIG, AppConfig } from '../../../../config/app-config.interface';
7+
import { hasValue } from '../../../shared/empty.util';
8+
9+
interface ItemDTO {
10+
11+
item: Item;
12+
13+
isSelectedVirtualMetadataItem$: Observable<boolean>;
14+
15+
}
716

817
@Component({
918
selector: 'ds-virtual-metadata',
@@ -14,7 +23,7 @@ import { APP_CONFIG, AppConfig } from '../../../../config/app-config.interface';
1423
* The component is shown when a relationship is marked to be deleted.
1524
* Each item has a checkbox to indicate whether its virtual metadata should be saved as real metadata.
1625
*/
17-
export class VirtualMetadataComponent implements OnInit {
26+
export class VirtualMetadataComponent implements OnInit, OnChanges, OnDestroy {
1827

1928
/**
2029
* The current url of this page
@@ -55,9 +64,9 @@ export class VirtualMetadataComponent implements OnInit {
5564
/**
5665
* Get an array of the left and the right item of the relationship to be deleted.
5766
*/
58-
get items() {
59-
return [this.leftItem, this.rightItem];
60-
}
67+
itemDTOs$: BehaviorSubject<ItemDTO[]> = new BehaviorSubject([]);
68+
69+
subs: Subscription[] = [];
6170

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

@@ -109,14 +118,33 @@ export class VirtualMetadataComponent implements OnInit {
109118
/**
110119
* Prevent unnecessary rerendering so fields don't lose focus
111120
*/
112-
trackItem(index, item: Item) {
113-
return item && item.uuid;
121+
trackItemDTO(index, itemDTO: ItemDTO): string {
122+
return itemDTO?.item?.uuid;
114123
}
115124

116125
ngOnInit(): void {
117-
this.items.forEach((item) => {
118-
this.virtualMetadata.set(item.uuid, this.getVirtualMetadata(item));
119-
});
126+
this.subs.push(this.itemDTOs$.subscribe((itemDTOs: ItemDTO[]) => {
127+
itemDTOs.forEach((itemDTO: ItemDTO) => this.virtualMetadata.set(itemDTO.item.uuid, this.getVirtualMetadata(itemDTO.item)));
128+
}));
129+
}
130+
131+
ngOnChanges(): void {
132+
if (hasValue(this.leftItem) && hasValue(this.rightItem)) {
133+
this.itemDTOs$.next([
134+
{
135+
item: this.leftItem,
136+
isSelectedVirtualMetadataItem$: this.isSelectedVirtualMetadataItem(this.leftItem),
137+
},
138+
{
139+
item: this.rightItem,
140+
isSelectedVirtualMetadataItem$: this.isSelectedVirtualMetadataItem(this.rightItem),
141+
},
142+
]);
143+
}
144+
}
145+
146+
ngOnDestroy(): void {
147+
this.subs.forEach((sub: Subscription) => sub.unsubscribe());
120148
}
121149
}
122150

0 commit comments

Comments
 (0)