Merge pull request #758 from atmire/DS-630-Item_delete_broken

DS 630 - item delete broken
This commit is contained in:
Tim Donohue
2020-07-16 15:17:32 -05:00
committed by GitHub
5 changed files with 143 additions and 111 deletions

View File

@@ -1,9 +1,9 @@
import { Component, Input, OnInit } from '@angular/core'; import { Component, Input, OnInit } from '@angular/core';
import {filter, first, map, switchMap, take} from 'rxjs/operators'; import { defaultIfEmpty, filter, first, map, switchMap, take } from 'rxjs/operators';
import { AbstractSimpleItemActionComponent } from '../simple-item-action/abstract-simple-item-action.component'; import { AbstractSimpleItemActionComponent } from '../simple-item-action/abstract-simple-item-action.component';
import { getItemEditPath } from '../../item-page-routing.module'; import { getItemEditPath } from '../../item-page-routing.module';
import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
import {combineLatest as observableCombineLatest, combineLatest, Observable} from 'rxjs'; import { combineLatest as observableCombineLatest, combineLatest, Observable, of as observableOf } from 'rxjs';
import { RelationshipType } from '../../../core/shared/item-relationships/relationship-type.model'; import { RelationshipType } from '../../../core/shared/item-relationships/relationship-type.model';
import { VirtualMetadata } from '../virtual-metadata/virtual-metadata.component'; import { VirtualMetadata } from '../virtual-metadata/virtual-metadata.component';
import { Relationship } from '../../../core/shared/item-relationships/relationship.model'; import { Relationship } from '../../../core/shared/item-relationships/relationship.model';
@@ -19,6 +19,8 @@ import {TranslateService} from '@ngx-translate/core';
import { ObjectUpdatesService } from '../../../core/data/object-updates/object-updates.service'; import { ObjectUpdatesService } from '../../../core/data/object-updates/object-updates.service';
import { RelationshipService } from '../../../core/data/relationship.service'; import { RelationshipService } from '../../../core/data/relationship.service';
import { EntityTypeService } from '../../../core/data/entity-type.service'; import { EntityTypeService } from '../../../core/data/entity-type.service';
import { LinkService } from '../../../core/cache/builders/link.service';
import { followLink } from '../../../shared/utils/follow-link-config.model';
@Component({ @Component({
selector: 'ds-item-delete', selector: 'ds-item-delete',
@@ -80,6 +82,7 @@ export class ItemDeleteComponent
protected objectUpdatesService: ObjectUpdatesService, protected objectUpdatesService: ObjectUpdatesService,
protected relationshipService: RelationshipService, protected relationshipService: RelationshipService,
protected entityTypeService: EntityTypeService, protected entityTypeService: EntityTypeService,
protected linkService: LinkService,
) { ) {
super( super(
route, route,
@@ -98,9 +101,9 @@ export class ItemDeleteComponent
super.ngOnInit(); super.ngOnInit();
this.url = this.router.url; this.url = this.router.url;
this.types$ = this.entityTypeService.getEntityTypeByLabel( const label = this.item.firstMetadataValue('relationship.type');
this.item.firstMetadataValue('relationship.type') if (label !== undefined) {
).pipe( this.types$ = this.entityTypeService.getEntityTypeByLabel(label).pipe(
getSucceededRemoteData(), getSucceededRemoteData(),
getRemoteDataPayload(), getRemoteDataPayload(),
switchMap((entityType) => this.entityTypeService.getEntityTypeRelationships(entityType.id)), switchMap((entityType) => this.entityTypeService.getEntityTypeRelationships(entityType.id)),
@@ -122,6 +125,9 @@ export class ItemDeleteComponent
) )
), ),
); );
} else {
this.types$ = observableOf([]);
}
this.types$.pipe( this.types$.pipe(
take(1), take(1),
@@ -187,6 +193,7 @@ export class ItemDeleteComponent
observableCombineLatest( observableCombineLatest(
relationships.map((relationship) => this.getRelationshipType(relationship)) relationships.map((relationship) => this.getRelationshipType(relationship))
).pipe( ).pipe(
defaultIfEmpty([]),
map((types) => relationships.filter( map((types) => relationships.filter(
(relationship, index) => relationshipType.id === types[index].id (relationship, index) => relationshipType.id === types[index].id
)), )),
@@ -205,6 +212,12 @@ export class ItemDeleteComponent
*/ */
private getRelationshipType(relationship: Relationship): Observable<RelationshipType> { private getRelationshipType(relationship: Relationship): Observable<RelationshipType> {
this.linkService.resolveLinks(
relationship,
followLink('relationshipType'),
followLink('leftItem'),
followLink('rightItem'),
);
return relationship.relationshipType.pipe( return relationship.relationshipType.pipe(
getSucceededRemoteData(), getSucceededRemoteData(),
getRemoteDataPayload(), getRemoteDataPayload(),
@@ -305,6 +318,7 @@ export class ItemDeleteComponent
combineLatest( combineLatest(
types.map((type) => this.isSelected(type)) types.map((type) => this.isSelected(type))
).pipe( ).pipe(
defaultIfEmpty([]),
map((selection) => types.filter( map((selection) => types.filter(
(type, index) => selection[index] (type, index) => selection[index]
)), )),

View File

@@ -1,4 +1,6 @@
<div class="item-relationships"> <div class="item-relationships">
<ng-container *ngVar="entityType$ | async as entityType">
<ng-container *ngIf="entityType">
<div class="button-row top d-flex"> <div class="button-row top d-flex">
<button class="btn btn-danger ml-auto" *ngIf="!(isReinstatable() | async)" <button class="btn btn-danger ml-auto" *ngIf="!(isReinstatable() | async)"
[disabled]="!(hasChanges() | async)" [disabled]="!(hasChanges() | async)"
@@ -21,7 +23,7 @@
<ds-edit-relationship-list <ds-edit-relationship-list
[url]="url" [url]="url"
[item]="item" [item]="item"
[itemType]="entityType$ | async" [itemType]="entityType"
[relationshipType]="relationshipType" [relationshipType]="relationshipType"
></ds-edit-relationship-list> ></ds-edit-relationship-list>
</div> </div>
@@ -45,4 +47,10 @@
</button> </button>
</div> </div>
</div> </div>
</ng-container>
<div *ngIf="!entityType"
class="alert alert-info mt-2" role="alert">
{{ 'item.edit.relationships.no-entity-type' | translate }}
</div>
</ng-container>
</div> </div>

View File

@@ -3,7 +3,7 @@ import { Item } from '../../../core/shared/item.model';
import { DeleteRelationship, FieldUpdate, FieldUpdates } from '../../../core/data/object-updates/object-updates.reducer'; import { DeleteRelationship, FieldUpdate, FieldUpdates } from '../../../core/data/object-updates/object-updates.reducer';
import { Observable } from 'rxjs/internal/Observable'; import { Observable } from 'rxjs/internal/Observable';
import { filter, map, switchMap, take } from 'rxjs/operators'; import { filter, map, switchMap, take } from 'rxjs/operators';
import { zip as observableZip } from 'rxjs'; import { of as observableOf, zip as observableZip} from 'rxjs';
import { followLink } from '../../../shared/utils/follow-link-config.model'; import { followLink } from '../../../shared/utils/follow-link-config.model';
import { AbstractItemUpdateComponent } from '../abstract-item-update/abstract-item-update.component'; import { AbstractItemUpdateComponent } from '../abstract-item-update/abstract-item-update.component';
import { ItemDataService } from '../../../core/data/item-data.service'; import { ItemDataService } from '../../../core/data/item-data.service';
@@ -87,9 +87,10 @@ export class ItemRelationshipsComponent extends AbstractItemUpdateComponent impl
*/ */
public initializeUpdates(): void { public initializeUpdates(): void {
this.entityType$ = this.entityTypeService.getEntityTypeByLabel( const label = this.item.firstMetadataValue('relationship.type');
this.item.firstMetadataValue('relationship.type') if (label !== undefined) {
).pipe(
this.entityType$ = this.entityTypeService.getEntityTypeByLabel(label).pipe(
getSucceededRemoteData(), getSucceededRemoteData(),
getRemoteDataPayload(), getRemoteDataPayload(),
); );
@@ -107,6 +108,9 @@ export class ItemRelationshipsComponent extends AbstractItemUpdateComponent impl
) )
), ),
); );
} else {
this.entityType$ = observableOf(undefined);
}
} }
/** /**

View File

@@ -19,6 +19,7 @@ describe('ProcessFormComponent', () => {
let component: ProcessFormComponent; let component: ProcessFormComponent;
let fixture: ComponentFixture<ProcessFormComponent>; let fixture: ComponentFixture<ProcessFormComponent>;
let scriptService; let scriptService;
let router;
let parameterValues; let parameterValues;
let script; let script;
@@ -41,7 +42,10 @@ describe('ProcessFormComponent', () => {
} }
}) })
} }
) );
router = {
navigateByUrl: () => undefined,
};
} }
beforeEach(async(() => { beforeEach(async(() => {

View File

@@ -1378,6 +1378,8 @@
"item.edit.relationships.save-button": "Save", "item.edit.relationships.save-button": "Save",
"item.edit.relationships.no-entity-type": "Add 'relationship.type' metadata to enable relationships for this item",
"item.edit.tabs.bitstreams.head": "Bitstreams", "item.edit.tabs.bitstreams.head": "Bitstreams",