From ab5cc1c961685beafbcce9020b8c7fdc63642ad8 Mon Sep 17 00:00:00 2001 From: lotte Date: Fri, 4 Jan 2019 16:30:25 +0100 Subject: [PATCH 1/6] 58522: implemented delete for coll and comms --- resources/i18n/en.json | 26 ++++++- .../collection-page-routing.module.ts | 10 +++ .../collection-page.module.ts | 2 + .../delete-community-page.component.html | 19 +++++ .../delete-community-page.component.scss | 1 + .../delete-community-page.component.ts | 33 +++++++++ .../edit-collection-page.component.html | 7 +- .../edit-collection-page.component.ts | 4 +- .../community-page-routing.module.ts | 10 +++ .../+community-page/community-page.module.ts | 3 + .../delete-community-page.component.html | 19 +++++ .../delete-community-page.component.scss | 1 + .../delete-community-page.component.ts | 30 ++++++++ .../edit-community-page.component.html | 14 ++-- .../edit-community-page.component.ts | 3 +- src/app/core/data/comcol-data.service.spec.ts | 2 +- src/app/core/data/comcol-data.service.ts | 2 +- src/app/core/data/data.service.ts | 29 ++++++-- .../core/data/dspace-object-data.service.ts | 2 +- src/app/core/data/request.models.ts | 11 +++ .../delete-comcol-page.component.ts | 71 +++++++++++++++++++ .../edit-comcol-page.component.spec.ts | 8 --- .../edit-comcol-page.component.ts | 4 +- src/app/shared/shared.module.ts | 2 + 24 files changed, 281 insertions(+), 32 deletions(-) create mode 100644 src/app/+collection-page/delete-collection-page/delete-community-page.component.html create mode 100644 src/app/+collection-page/delete-collection-page/delete-community-page.component.scss create mode 100644 src/app/+collection-page/delete-collection-page/delete-community-page.component.ts create mode 100644 src/app/+community-page/delete-community-page/delete-community-page.component.html create mode 100644 src/app/+community-page/delete-community-page/delete-community-page.component.scss create mode 100644 src/app/+community-page/delete-community-page/delete-community-page.component.ts create mode 100644 src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.ts diff --git a/resources/i18n/en.json b/resources/i18n/en.json index 1f85b8ddac..bcaccc83a3 100644 --- a/resources/i18n/en.json +++ b/resources/i18n/en.json @@ -29,11 +29,22 @@ } }, "edit": { - "head": "Edit Collection" + "head": "Edit Collection", + "delete": "Delete this collection" }, "create": { "head": "Create a Collection", "sub-head": "Create a Collection for Community {{ parent }}" + }, + "delete": { + "head": "Delete Collection", + "text": "Are you sure you want to delete collection \"{{ dso }}\"", + "confirm": "Confirm", + "cancel": "Cancel", + "notification": { + "success": "Successfully deleted collection", + "fail": "Collection could not be deleted" + } } }, "community": { @@ -60,11 +71,22 @@ } }, "edit": { - "head": "Edit Community" + "head": "Edit Community", + "delete": "Delete this community" }, "create": { "head": "Create a Community", "sub-head": "Create a Sub-Community for Community {{ parent }}" + }, + "delete": { + "head": "Delete Community", + "text": "Are you sure you want to delete community \"{{ dso }}\"", + "confirm": "Confirm", + "cancel": "Cancel", + "notification": { + "success": "Successfully deleted community", + "fail": "Community could not be deleted" + } } }, "item": { diff --git a/src/app/+collection-page/collection-page-routing.module.ts b/src/app/+collection-page/collection-page-routing.module.ts index ec53796e61..939844dfcd 100644 --- a/src/app/+collection-page/collection-page-routing.module.ts +++ b/src/app/+collection-page/collection-page-routing.module.ts @@ -7,6 +7,7 @@ import { CreateCollectionPageComponent } from './create-collection-page/create-c import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { EditCollectionPageComponent } from './edit-collection-page/edit-collection-page.component'; import { CreateCollectionPageGuard } from './create-collection-page/create-collection-page.guard'; +import { DeleteCollectionPageComponent } from './delete-collection-page/delete-community-page.component'; @NgModule({ imports: [ @@ -25,6 +26,15 @@ import { CreateCollectionPageGuard } from './create-collection-page/create-colle dso: CollectionPageResolver } }, + { + path: ':id/delete', + pathMatch: 'full', + component: DeleteCollectionPageComponent, + canActivate: [AuthenticatedGuard], + resolve: { + dso: CollectionPageResolver + } + }, { path: ':id', component: CollectionPageComponent, diff --git a/src/app/+collection-page/collection-page.module.ts b/src/app/+collection-page/collection-page.module.ts index 63a03f4299..9d14de489a 100644 --- a/src/app/+collection-page/collection-page.module.ts +++ b/src/app/+collection-page/collection-page.module.ts @@ -9,6 +9,7 @@ import { CreateCollectionPageComponent } from './create-collection-page/create-c import { CollectionFormComponent } from './collection-form/collection-form.component'; import { SearchPageModule } from '../+search-page/search-page.module'; import { EditCollectionPageComponent } from './edit-collection-page/edit-collection-page.component'; +import { DeleteCollectionPageComponent } from './delete-collection-page/delete-community-page.component'; @NgModule({ imports: [ @@ -21,6 +22,7 @@ import { EditCollectionPageComponent } from './edit-collection-page/edit-collect CollectionPageComponent, CreateCollectionPageComponent, EditCollectionPageComponent, + DeleteCollectionPageComponent, CollectionFormComponent ] }) diff --git a/src/app/+collection-page/delete-collection-page/delete-community-page.component.html b/src/app/+collection-page/delete-collection-page/delete-community-page.component.html new file mode 100644 index 0000000000..cfd09f2bbd --- /dev/null +++ b/src/app/+collection-page/delete-collection-page/delete-community-page.component.html @@ -0,0 +1,19 @@ +
+
+ +
+ +

{{ 'community.delete.text' | translate:{ dso: dso.name } }}

+ + +
+
+ +
+ +
diff --git a/src/app/+collection-page/delete-collection-page/delete-community-page.component.scss b/src/app/+collection-page/delete-collection-page/delete-community-page.component.scss new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/app/+collection-page/delete-collection-page/delete-community-page.component.scss @@ -0,0 +1 @@ + diff --git a/src/app/+collection-page/delete-collection-page/delete-community-page.component.ts b/src/app/+collection-page/delete-collection-page/delete-community-page.component.ts new file mode 100644 index 0000000000..21d4dfd135 --- /dev/null +++ b/src/app/+collection-page/delete-collection-page/delete-community-page.component.ts @@ -0,0 +1,33 @@ +import { Component } from '@angular/core'; +import { Community } from '../../core/shared/community.model'; +import { CommunityDataService } from '../../core/data/community-data.service'; +import { ActivatedRoute, Router } from '@angular/router'; +import { NormalizedCommunity } from '../../core/cache/models/normalized-community.model'; +import { DeleteComColPageComponent } from '../../shared/comcol-forms/delete-comcol-page/delete-comcol-page.component'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { CollectionDataService } from '../../core/data/collection-data.service'; +import { NormalizedCollection } from '../../core/cache/models/normalized-collection.model'; +import { Collection } from '../../core/shared/collection.model'; +import { TranslateService } from '@ngx-translate/core'; + +/** + * Component that represents the page where a user can edit an existing Community + */ +@Component({ + selector: 'ds-delete-collection', + styleUrls: ['./delete-collection-page.component.scss'], + templateUrl: './delete-collection-page.component.html' +}) +export class DeleteCollectionPageComponent extends DeleteComColPageComponent { + protected frontendURL = '/collections/'; + + public constructor( + protected dsoDataService: CollectionDataService, + protected router: Router, + protected route: ActivatedRoute, + protected notifications: NotificationsService, + protected translate: TranslateService + ) { + super(dsoDataService, router, route, notifications, translate); + } +} diff --git a/src/app/+collection-page/edit-collection-page/edit-collection-page.component.html b/src/app/+collection-page/edit-collection-page/edit-collection-page.component.html index 1308af919f..129cd3059b 100644 --- a/src/app/+collection-page/edit-collection-page/edit-collection-page.component.html +++ b/src/app/+collection-page/edit-collection-page/edit-collection-page.component.html @@ -1,8 +1,11 @@
- + + + {{'collection.edit.delete' + | translate}}
-
diff --git a/src/app/+collection-page/edit-collection-page/edit-collection-page.component.ts b/src/app/+collection-page/edit-collection-page/edit-collection-page.component.ts index 2ffb4925a0..9bbdbfb9a1 100644 --- a/src/app/+collection-page/edit-collection-page/edit-collection-page.component.ts +++ b/src/app/+collection-page/edit-collection-page/edit-collection-page.component.ts @@ -1,5 +1,4 @@ import { Component } from '@angular/core'; -import { RouteService } from '../../shared/services/route.service'; import { ActivatedRoute, Router } from '@angular/router'; import { EditComColPageComponent } from '../../shared/comcol-forms/edit-comcol-page/edit-comcol-page.component'; import { NormalizedCollection } from '../../core/cache/models/normalized-collection.model'; @@ -19,10 +18,9 @@ export class EditCollectionPageComponent extends EditComColPageComponent +
+ +
+ +

{{ 'community.delete.text' | translate:{ dso: dso.name } }}

+ + +
+
+ +
+ + diff --git a/src/app/+community-page/delete-community-page/delete-community-page.component.scss b/src/app/+community-page/delete-community-page/delete-community-page.component.scss new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/app/+community-page/delete-community-page/delete-community-page.component.scss @@ -0,0 +1 @@ + diff --git a/src/app/+community-page/delete-community-page/delete-community-page.component.ts b/src/app/+community-page/delete-community-page/delete-community-page.component.ts new file mode 100644 index 0000000000..d76284660f --- /dev/null +++ b/src/app/+community-page/delete-community-page/delete-community-page.component.ts @@ -0,0 +1,30 @@ +import { Component } from '@angular/core'; +import { Community } from '../../core/shared/community.model'; +import { CommunityDataService } from '../../core/data/community-data.service'; +import { ActivatedRoute, Router } from '@angular/router'; +import { NormalizedCommunity } from '../../core/cache/models/normalized-community.model'; +import { DeleteComColPageComponent } from '../../shared/comcol-forms/delete-comcol-page/delete-comcol-page.component'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { TranslateService } from '@ngx-translate/core'; + +/** + * Component that represents the page where a user can edit an existing Community + */ +@Component({ + selector: 'ds-delete-community', + styleUrls: ['./delete-community-page.component.scss'], + templateUrl: './delete-community-page.component.html' +}) +export class DeleteCommunityPageComponent extends DeleteComColPageComponent { + protected frontendURL = '/communities/'; + + public constructor( + protected dsoDataService: CommunityDataService, + protected router: Router, + protected route: ActivatedRoute, + protected notifications: NotificationsService, + protected translate: TranslateService + ) { + super(dsoDataService, router, route, notifications, translate); + } +} diff --git a/src/app/+community-page/edit-community-page/edit-community-page.component.html b/src/app/+community-page/edit-community-page/edit-community-page.component.html index 98649243cc..a015a312d3 100644 --- a/src/app/+community-page/edit-community-page/edit-community-page.component.html +++ b/src/app/+community-page/edit-community-page/edit-community-page.component.html @@ -1,8 +1,12 @@
-
-
- +
+
+ + + {{'community.edit.delete' + | translate}} +
-
-
diff --git a/src/app/+community-page/edit-community-page/edit-community-page.component.ts b/src/app/+community-page/edit-community-page/edit-community-page.component.ts index 8db5eab204..31111f779a 100644 --- a/src/app/+community-page/edit-community-page/edit-community-page.component.ts +++ b/src/app/+community-page/edit-community-page/edit-community-page.component.ts @@ -19,10 +19,9 @@ export class EditCommunityPageComponent extends EditComColPageComponent { function initMockCommunityDataService(): CommunityDataService { return jasmine.createSpyObj('responseCache', { getEndpoint: hot('--a-', { a: communitiesEndpoint }), - getFindByIDHref: cold('b-', { b: communityEndpoint }) + getIDHref: cold('b-', { b: communityEndpoint }) }); } diff --git a/src/app/core/data/comcol-data.service.ts b/src/app/core/data/comcol-data.service.ts index 0616e9c2ed..8a1ea51bb3 100644 --- a/src/app/core/data/comcol-data.service.ts +++ b/src/app/core/data/comcol-data.service.ts @@ -42,7 +42,7 @@ export abstract class ComColDataService this.cds.getFindByIDHref(endpoint, options.scopeID)), + mergeMap((endpoint: string) => this.cds.getIDHref(endpoint, options.scopeID)), filter((href: string) => isNotEmpty(href)), take(1), tap((href: string) => { diff --git a/src/app/core/data/data.service.ts b/src/app/core/data/data.service.ts index 47be86c296..069af4937e 100644 --- a/src/app/core/data/data.service.ts +++ b/src/app/core/data/data.service.ts @@ -18,7 +18,7 @@ import { URLCombiner } from '../url-combiner/url-combiner'; import { PaginatedList } from './paginated-list'; import { RemoteData } from './remote-data'; import { - CreateRequest, + CreateRequest, DeleteByIDRequest, FindAllOptions, FindAllRequest, FindByIDRequest, @@ -33,7 +33,7 @@ import { NotificationsService } from '../../shared/notifications/notifications.s import { HttpClient } from '@angular/common/http'; import { configureRequest, - filterSuccessfulResponses, getResourceLinksFromResponse, + filterSuccessfulResponses, getFinishedRemoteData, getResourceLinksFromResponse, getResponseFromEntry } from '../shared/operators'; import { DSOSuccessResponse, ErrorResponse, RestResponse } from '../cache/response.models'; @@ -43,6 +43,7 @@ import { NormalizedObjectFactory } from '../cache/models/normalized-object-facto import { CacheableObject } from '../cache/object-cache.reducer'; import { DataBuildService } from '../cache/builders/data-build.service'; import { UpdateComparator } from './update-comparator'; +import { RequestEntry } from './request.reducer'; export abstract class DataService { protected abstract requestService: RequestService; @@ -97,13 +98,13 @@ export abstract class DataService(hrefObs) as Observable>>; } - getFindByIDHref(endpoint, resourceID): string { + getIDHref(endpoint, resourceID): string { return `${endpoint}/${resourceID}`; } findById(id: string): Observable> { const hrefObs = this.halService.getEndpoint(this.linkPath).pipe( - map((endpoint: string) => this.getFindByIDHref(endpoint, id))); + map((endpoint: string) => this.getIDHref(endpoint, id))); hrefObs.pipe( find((href: string) => hasValue(href))) @@ -192,4 +193,24 @@ export abstract class DataService { + const requestId = this.requestService.generateRequestId(); + + const hrefObs = this.halService.getEndpoint(this.linkPath).pipe( + map((endpoint: string) => this.getIDHref(endpoint, dso.uuid))); + + hrefObs.pipe( + find((href: string) => hasValue(href)), + map((href: string) => { + const request = new DeleteByIDRequest(requestId, href, dso.uuid); + this.requestService.configure(request); + }) + ).subscribe(); + + return this.requestService.getByUUID(requestId).pipe( + find((request: RequestEntry) => request.completed), + map((request: RequestEntry) => request.response.isSuccessful) + ); + } + } diff --git a/src/app/core/data/dspace-object-data.service.ts b/src/app/core/data/dspace-object-data.service.ts index 9a069c4d61..15438d60b7 100644 --- a/src/app/core/data/dspace-object-data.service.ts +++ b/src/app/core/data/dspace-object-data.service.ts @@ -37,7 +37,7 @@ class DataServiceImpl extends DataService return this.halService.getEndpoint(linkPath); } - getFindByIDHref(endpoint, resourceID): string { + getIDHref(endpoint, resourceID): string { return endpoint.replace(/\{\?uuid\}/,`?uuid=${resourceID}`); } } diff --git a/src/app/core/data/request.models.ts b/src/app/core/data/request.models.ts index 6c4c89e492..5f8539f144 100644 --- a/src/app/core/data/request.models.ts +++ b/src/app/core/data/request.models.ts @@ -227,6 +227,17 @@ export class CreateRequest extends PostRequest { } } +export class DeleteByIDRequest extends DeleteRequest { + constructor( + uuid: string, + href: string, + public resourceID: string + ) { + super(uuid, href); + } +} + + export class RequestError extends Error { statusText: string; } diff --git a/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.ts b/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.ts new file mode 100644 index 0000000000..6fb97d3f37 --- /dev/null +++ b/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.ts @@ -0,0 +1,71 @@ +import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { RouteService } from '../../services/route.service'; +import { ActivatedRoute, Router } from '@angular/router'; +import { RemoteData } from '../../../core/data/remote-data'; +import { isNotUndefined } from '../../empty.util'; +import { first, map } from 'rxjs/operators'; +import { getSucceededRemoteData } from '../../../core/shared/operators'; +import { DataService } from '../../../core/data/data.service'; +import { NormalizedDSpaceObject } from '../../../core/cache/models/normalized-dspace-object.model'; +import { DSpaceObject } from '../../../core/shared/dspace-object.model'; +import { NotificationsService } from '../../notifications/notifications.service'; +import { TranslateService } from '@ngx-translate/core'; + +/** + * Component representing the edit page for communities and collections + */ +@Component({ + selector: 'ds-delete-comcol', + template: '' +}) +export class DeleteComColPageComponent implements OnInit { + /** + * Frontend endpoint where for this type of DSP + */ + protected frontendURL: string; + /** + * The initial DSO object + */ + public dsoRD$: Observable>; + + public constructor( + protected dsoDataService: DataService, + protected router: Router, + protected route: ActivatedRoute, + protected notifications: NotificationsService, + protected translate: TranslateService + ) { + } + + ngOnInit(): void { + this.dsoRD$ = this.route.data.pipe(first(), map((data) => data.dso)); + } + + /** + * @param {TDomain} dso The DSO to delete + * Deletes an existing DSO and redirects to the home page afterwards + */ + onConfirm(dso: TDomain) { + this.dsoDataService.delete(dso) + .pipe(first()) + .subscribe((success: boolean) => { + if (success) { + const successMessage = this.translate.instant(dso.type + '.delete.notification.success'); + this.notifications.success(successMessage) + } else { + const errorMessage = this.translate.instant(dso.type + '.delete.notification.fail'); + this.notifications.error(errorMessage) + } + this.router.navigate(['/']); + }); + } + + /** + * @param {TDomain} dso The DSO for which the delete action was canceled + * When a delete is canceled, the user is redirected to the DSO's edit page + */ + onCancel(dso: TDomain) { + this.router.navigate([this.frontendURL + '/' + dso.uuid + '/edit']); + } +} diff --git a/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.spec.ts b/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.spec.ts index ae59e185a3..aa8d73cd2a 100644 --- a/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.spec.ts +++ b/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.spec.ts @@ -1,6 +1,5 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { CommunityDataService } from '../../../core/data/community-data.service'; -import { RouteService } from '../../services/route.service'; import { ActivatedRoute, Router } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { of as observableOf } from 'rxjs'; @@ -20,13 +19,11 @@ describe('EditComColPageComponent', () => { let fixture: ComponentFixture>; let communityDataService: CommunityDataService; let dsoDataService: CommunityDataService; - let routeService: RouteService; let router: Router; let community; let newCommunity; let communityDataServiceStub; - let routeServiceStub; let routerStub; let routeStub; @@ -59,9 +56,6 @@ describe('EditComColPageComponent', () => { }; - routeServiceStub = { - getQueryParameterValue: (param) => observableOf(community.uuid) - }; routerStub = { navigate: (commands) => commands }; @@ -78,7 +72,6 @@ describe('EditComColPageComponent', () => { imports: [TranslateModule.forRoot(), SharedModule, CommonModule, RouterTestingModule], providers: [ { provide: DataService, useValue: communityDataServiceStub }, - { provide: RouteService, useValue: routeServiceStub }, { provide: Router, useValue: routerStub }, { provide: ActivatedRoute, useValue: routeStub }, ], @@ -92,7 +85,6 @@ describe('EditComColPageComponent', () => { fixture.detectChanges(); dsoDataService = (comp as any).dsoDataService; communityDataService = (comp as any).communityDataService; - routeService = (comp as any).routeService; router = (comp as any).router; }); diff --git a/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.ts b/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.ts index 8f03280fc0..42a77b66f9 100644 --- a/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.ts +++ b/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.ts @@ -1,6 +1,5 @@ import { Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; -import { RouteService } from '../../services/route.service'; import { ActivatedRoute, Router } from '@angular/router'; import { RemoteData } from '../../../core/data/remote-data'; import { isNotUndefined } from '../../empty.util'; @@ -29,7 +28,6 @@ export class EditComColPageComponent, - protected routeService: RouteService, protected router: Router, protected route: ActivatedRoute ) { @@ -41,7 +39,7 @@ export class EditComColPageComponent Date: Mon, 7 Jan 2019 12:01:09 +0100 Subject: [PATCH 2/6] Added tests/type doc --- .../collection-page-routing.module.ts | 2 +- .../collection-page.module.ts | 2 +- ... => delete-collection-page.component.html} | 0 ... => delete-collection-page.component.scss} | 0 ...ts => delete-collection-page.component.ts} | 2 +- .../delete-community-page.component.ts | 2 +- .../create-comcol-page.component.ts | 2 +- .../delete-comcol-page.component.spec.ts | 154 ++++++++++++++++++ .../delete-comcol-page.component.ts | 6 +- .../edit-comcol-page.component.spec.ts | 9 - .../edit-comcol-page.component.ts | 2 +- 11 files changed, 163 insertions(+), 18 deletions(-) rename src/app/+collection-page/delete-collection-page/{delete-community-page.component.html => delete-collection-page.component.html} (100%) rename src/app/+collection-page/delete-collection-page/{delete-community-page.component.scss => delete-collection-page.component.scss} (100%) rename src/app/+collection-page/delete-collection-page/{delete-community-page.component.ts => delete-collection-page.component.ts} (94%) create mode 100644 src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.spec.ts diff --git a/src/app/+collection-page/collection-page-routing.module.ts b/src/app/+collection-page/collection-page-routing.module.ts index 939844dfcd..ddcf36a0cc 100644 --- a/src/app/+collection-page/collection-page-routing.module.ts +++ b/src/app/+collection-page/collection-page-routing.module.ts @@ -7,7 +7,7 @@ import { CreateCollectionPageComponent } from './create-collection-page/create-c import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { EditCollectionPageComponent } from './edit-collection-page/edit-collection-page.component'; import { CreateCollectionPageGuard } from './create-collection-page/create-collection-page.guard'; -import { DeleteCollectionPageComponent } from './delete-collection-page/delete-community-page.component'; +import { DeleteCollectionPageComponent } from './delete-collection-page/delete-collection-page.component'; @NgModule({ imports: [ diff --git a/src/app/+collection-page/collection-page.module.ts b/src/app/+collection-page/collection-page.module.ts index 9d14de489a..8424cc02a4 100644 --- a/src/app/+collection-page/collection-page.module.ts +++ b/src/app/+collection-page/collection-page.module.ts @@ -9,7 +9,7 @@ import { CreateCollectionPageComponent } from './create-collection-page/create-c import { CollectionFormComponent } from './collection-form/collection-form.component'; import { SearchPageModule } from '../+search-page/search-page.module'; import { EditCollectionPageComponent } from './edit-collection-page/edit-collection-page.component'; -import { DeleteCollectionPageComponent } from './delete-collection-page/delete-community-page.component'; +import { DeleteCollectionPageComponent } from './delete-collection-page/delete-collection-page.component'; @NgModule({ imports: [ diff --git a/src/app/+collection-page/delete-collection-page/delete-community-page.component.html b/src/app/+collection-page/delete-collection-page/delete-collection-page.component.html similarity index 100% rename from src/app/+collection-page/delete-collection-page/delete-community-page.component.html rename to src/app/+collection-page/delete-collection-page/delete-collection-page.component.html diff --git a/src/app/+collection-page/delete-collection-page/delete-community-page.component.scss b/src/app/+collection-page/delete-collection-page/delete-collection-page.component.scss similarity index 100% rename from src/app/+collection-page/delete-collection-page/delete-community-page.component.scss rename to src/app/+collection-page/delete-collection-page/delete-collection-page.component.scss diff --git a/src/app/+collection-page/delete-collection-page/delete-community-page.component.ts b/src/app/+collection-page/delete-collection-page/delete-collection-page.component.ts similarity index 94% rename from src/app/+collection-page/delete-collection-page/delete-community-page.component.ts rename to src/app/+collection-page/delete-collection-page/delete-collection-page.component.ts index 21d4dfd135..80abb83694 100644 --- a/src/app/+collection-page/delete-collection-page/delete-community-page.component.ts +++ b/src/app/+collection-page/delete-collection-page/delete-collection-page.component.ts @@ -11,7 +11,7 @@ import { Collection } from '../../core/shared/collection.model'; import { TranslateService } from '@ngx-translate/core'; /** - * Component that represents the page where a user can edit an existing Community + * Component that represents the page where a user can delete an existing Collection */ @Component({ selector: 'ds-delete-collection', diff --git a/src/app/+community-page/delete-community-page/delete-community-page.component.ts b/src/app/+community-page/delete-community-page/delete-community-page.component.ts index d76284660f..01741a7577 100644 --- a/src/app/+community-page/delete-community-page/delete-community-page.component.ts +++ b/src/app/+community-page/delete-community-page/delete-community-page.component.ts @@ -8,7 +8,7 @@ import { NotificationsService } from '../../shared/notifications/notifications.s import { TranslateService } from '@ngx-translate/core'; /** - * Component that represents the page where a user can edit an existing Community + * Component that represents the page where a user can delete an existing Community */ @Component({ selector: 'ds-delete-community', diff --git a/src/app/shared/comcol-forms/create-comcol-page/create-comcol-page.component.ts b/src/app/shared/comcol-forms/create-comcol-page/create-comcol-page.component.ts index f8bed5b814..fc7ee3ee70 100644 --- a/src/app/shared/comcol-forms/create-comcol-page/create-comcol-page.component.ts +++ b/src/app/shared/comcol-forms/create-comcol-page/create-comcol-page.component.ts @@ -21,7 +21,7 @@ import { NormalizedDSpaceObject } from '../../../core/cache/models/normalized-ds }) export class CreateComColPageComponent implements OnInit { /** - * Frontend endpoint where for this type of DSP + * Frontend endpoint for this type of DSO */ protected frontendURL: string; diff --git a/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.spec.ts b/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.spec.ts new file mode 100644 index 0000000000..0243cce33b --- /dev/null +++ b/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.spec.ts @@ -0,0 +1,154 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { CommunityDataService } from '../../../core/data/community-data.service'; +import { ActivatedRoute, Router } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; +import { of as observableOf } from 'rxjs'; +import { Community } from '../../../core/shared/community.model'; +import { SharedModule } from '../../shared.module'; +import { CommonModule } from '@angular/common'; +import { RouterTestingModule } from '@angular/router/testing'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { DSpaceObject } from '../../../core/shared/dspace-object.model'; +import { NormalizedDSpaceObject } from '../../../core/cache/models/normalized-dspace-object.model'; +import { DataService } from '../../../core/data/data.service'; +import { DeleteComColPageComponent } from './delete-comcol-page.component'; +import { NotificationsService } from '../../notifications/notifications.service'; +import { NotificationsServiceStub } from '../../testing/notifications-service-stub'; + +describe('DeleteComColPageComponent', () => { + let comp: DeleteComColPageComponent; + let fixture: ComponentFixture>; + let dsoDataService: CommunityDataService; + let router: Router; + + let community; + let newCommunity; + let routerStub; + let routeStub; + let notificationsService; + const validUUID = 'valid-uuid'; + const invalidUUID = 'invalid-uuid'; + + function initializeVars() { + community = Object.assign(new Community(), { + uuid: 'a20da287-e174-466a-9926-f66b9300d347', + metadata: [{ + key: 'dc.title', + value: 'test community' + }] + }); + + newCommunity = Object.assign(new Community(), { + uuid: '1ff59938-a69a-4e62-b9a4-718569c55d48', + metadata: [{ + key: 'dc.title', + value: 'new community' + }] + }); + + dsoDataService = jasmine.createSpyObj( + 'dsoDataService', + { + delete: observableOf(true) + }); + + routerStub = { + navigate: (commands) => commands + }; + + routeStub = { + data: observableOf(community) + }; + + } + + beforeEach(async(() => { + initializeVars(); + TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot(), SharedModule, CommonModule, RouterTestingModule], + providers: [ + { provide: DataService, useValue: dsoDataService }, + { provide: Router, useValue: routerStub }, + { provide: ActivatedRoute, useValue: routeStub }, + { provide: NotificationsService, useValue: new NotificationsServiceStub() }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DeleteComColPageComponent); + comp = fixture.componentInstance; + fixture.detectChanges(); + notificationsService = (comp as any).notifications; + router = (comp as any).router; + }); + + describe('onConfirm', () => { + let data1; + let data2; + beforeEach(() => { + data1 = Object.assign(new Community(), { + uuid: validUUID, + metadata: [{ + key: 'dc.title', + value: 'test' + }] + }); + + data2 = Object.assign(new Community(), { + uuid: invalidUUID, + metadata: [{ + key: 'dc.title', + value: 'test' + }] + }); + }); + + it('should show an error notification on failure', () => { + (dsoDataService.delete as any).and.returnValue(observableOf(false)); + spyOn(notificationsService, 'error'); + spyOn(router, 'navigate'); + comp.onConfirm(data2); + fixture.detectChanges(); + expect(notificationsService.error).toHaveBeenCalled(); + expect(router.navigate).toHaveBeenCalled(); + }); + + it('should show a success notification on success and navigate', () => { + spyOn(notificationsService, 'success'); + spyOn(router, 'navigate'); + comp.onConfirm(data1); + fixture.detectChanges(); + expect(notificationsService.success).toHaveBeenCalled(); + expect(router.navigate).toHaveBeenCalled(); + }); + + it('should call delete on the data service', () => { + comp.onConfirm(data1); + fixture.detectChanges(); + expect(dsoDataService.delete).toHaveBeenCalledWith(data1); + }); + }); + + describe('onCancel', () => { + let data1; + beforeEach(() => { + data1 = Object.assign(new Community(), { + uuid: validUUID, + metadata: [{ + key: 'dc.title', + value: 'test' + }] + }); + }); + + it('should redirect to the edit page', () => { + const redirectURL = 'communities/edit/' + validUUID; + spyOn(router, 'navigate'); + comp.onCancel(data1); + fixture.detectChanges(); + expect(router.navigate).toHaveBeenCalledWith([redirectURL]); + }); + }); +}); diff --git a/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.ts b/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.ts index 6fb97d3f37..6e3a826e87 100644 --- a/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.ts +++ b/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.ts @@ -13,7 +13,7 @@ import { NotificationsService } from '../../notifications/notifications.service' import { TranslateService } from '@ngx-translate/core'; /** - * Component representing the edit page for communities and collections + * Component representing the delete page for communities and collections */ @Component({ selector: 'ds-delete-comcol', @@ -21,7 +21,7 @@ import { TranslateService } from '@ngx-translate/core'; }) export class DeleteComColPageComponent implements OnInit { /** - * Frontend endpoint where for this type of DSP + * Frontend endpoint for this type of DSO */ protected frontendURL: string; /** @@ -44,7 +44,7 @@ export class DeleteComColPageComponent { let comp: EditComColPageComponent; let fixture: ComponentFixture>; - let communityDataService: CommunityDataService; let dsoDataService: CommunityDataService; let router: Router; @@ -45,13 +44,6 @@ describe('EditComColPageComponent', () => { }); communityDataServiceStub = { - findById: (uuid) => observableOf(new RemoteData(false, false, true, null, Object.assign(new Community(), { - uuid: uuid, - metadata: [{ - key: 'dc.title', - value: community.name - }] - }))), update: (com, uuid?) => observableOf(new RemoteData(false, false, true, undefined, newCommunity)) }; @@ -84,7 +76,6 @@ describe('EditComColPageComponent', () => { comp = fixture.componentInstance; fixture.detectChanges(); dsoDataService = (comp as any).dsoDataService; - communityDataService = (comp as any).communityDataService; router = (comp as any).router; }); diff --git a/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.ts b/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.ts index 42a77b66f9..b669fcea54 100644 --- a/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.ts +++ b/src/app/shared/comcol-forms/edit-comcol-page/edit-comcol-page.component.ts @@ -18,7 +18,7 @@ import { DSpaceObject } from '../../../core/shared/dspace-object.model'; }) export class EditComColPageComponent implements OnInit { /** - * Frontend endpoint where for this type of DSP + * Frontend endpoint for this type of DSO */ protected frontendURL: string; /** From 0be76d49d97831d80303e2f92f3581dd228aae8a Mon Sep 17 00:00:00 2001 From: lotte Date: Mon, 7 Jan 2019 12:42:24 +0100 Subject: [PATCH 3/6] 58522: delete tests and docs --- .../delete-comcol-page/delete-comcol-page.component.spec.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.spec.ts b/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.spec.ts index 0243cce33b..81ec9c47a0 100644 --- a/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.spec.ts +++ b/src/app/shared/comcol-forms/delete-comcol-page/delete-comcol-page.component.spec.ts @@ -28,7 +28,7 @@ describe('DeleteComColPageComponent', () => { let notificationsService; const validUUID = 'valid-uuid'; const invalidUUID = 'invalid-uuid'; - + const frontendURL = '/testType'; function initializeVars() { community = Object.assign(new Community(), { uuid: 'a20da287-e174-466a-9926-f66b9300d347', @@ -81,6 +81,7 @@ describe('DeleteComColPageComponent', () => { comp = fixture.componentInstance; fixture.detectChanges(); notificationsService = (comp as any).notifications; + (comp as any).frontendURL = frontendURL; router = (comp as any).router; }); @@ -144,7 +145,7 @@ describe('DeleteComColPageComponent', () => { }); it('should redirect to the edit page', () => { - const redirectURL = 'communities/edit/' + validUUID; + const redirectURL = frontendURL + '/' + validUUID + '/edit'; spyOn(router, 'navigate'); comp.onCancel(data1); fixture.detectChanges(); From 8e543ab0366660f92f050723d8cc745c6e886cf3 Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 10 Jan 2019 10:14:50 +0100 Subject: [PATCH 4/6] 58522: changed styling of button --- .../edit-collection-page/edit-collection-page.component.html | 2 +- .../edit-community-page/edit-community-page.component.html | 2 +- src/app/core/data/request.models.ts | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/app/+collection-page/edit-collection-page/edit-collection-page.component.html b/src/app/+collection-page/edit-collection-page/edit-collection-page.component.html index 129cd3059b..c389c681ce 100644 --- a/src/app/+collection-page/edit-collection-page/edit-collection-page.component.html +++ b/src/app/+collection-page/edit-collection-page/edit-collection-page.component.html @@ -3,7 +3,7 @@
- {{'collection.edit.delete' | translate}}
diff --git a/src/app/+community-page/edit-community-page/edit-community-page.component.html b/src/app/+community-page/edit-community-page/edit-community-page.component.html index a015a312d3..cedb771c14 100644 --- a/src/app/+community-page/edit-community-page/edit-community-page.component.html +++ b/src/app/+community-page/edit-community-page/edit-community-page.component.html @@ -4,7 +4,7 @@ - {{'community.edit.delete' | translate}}
diff --git a/src/app/core/data/request.models.ts b/src/app/core/data/request.models.ts index 5f8539f144..6f0ff5b605 100644 --- a/src/app/core/data/request.models.ts +++ b/src/app/core/data/request.models.ts @@ -237,7 +237,6 @@ export class DeleteByIDRequest extends DeleteRequest { } } - export class RequestError extends Error { statusText: string; } From a9f62659b95f669883e6d80d302f1c9a8244b394 Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 10 Jan 2019 14:12:47 +0100 Subject: [PATCH 5/6] added tests --- .../delete-collection-page.component.spec.ts | 41 ++++++++++++++++++ .../edit-collection-page.component.spec.ts | 7 +--- .../delete-community-page.component.spec.ts | 42 +++++++++++++++++++ .../edit-community-page.component.spec.ts | 7 +--- .../edit-community-page.component.ts | 1 - 5 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 src/app/+collection-page/delete-collection-page/delete-collection-page.component.spec.ts create mode 100644 src/app/+community-page/delete-community-page/delete-community-page.component.spec.ts diff --git a/src/app/+collection-page/delete-collection-page/delete-collection-page.component.spec.ts b/src/app/+collection-page/delete-collection-page/delete-collection-page.component.spec.ts new file mode 100644 index 0000000000..d64c1d1915 --- /dev/null +++ b/src/app/+collection-page/delete-collection-page/delete-collection-page.component.spec.ts @@ -0,0 +1,41 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute, Router } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; +import { CommonModule } from '@angular/common'; +import { RouterTestingModule } from '@angular/router/testing'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { SharedModule } from '../../shared/shared.module'; +import { of as observableOf } from 'rxjs'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { DeleteCollectionPageComponent } from './delete-collection-page.component'; +import { CollectionDataService } from '../../core/data/collection-data.service'; + +describe('DeleteCollectionPageComponent', () => { + let comp: DeleteCollectionPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot(), SharedModule, CommonModule, RouterTestingModule], + declarations: [DeleteCollectionPageComponent], + providers: [ + { provide: CollectionDataService, useValue: {} }, + { provide: ActivatedRoute, useValue: { data: observableOf({ dso: { payload: {} } }) } }, + { provide: NotificationsService, useValue: {} }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DeleteCollectionPageComponent); + comp = fixture.componentInstance; + fixture.detectChanges(); + }); + + describe('frontendURL', () => { + it('should have the right frontendURL set', () => { + expect((comp as any).frontendURL).toEqual('/collections/'); + }) + }); +}); diff --git a/src/app/+collection-page/edit-collection-page/edit-collection-page.component.spec.ts b/src/app/+collection-page/edit-collection-page/edit-collection-page.component.spec.ts index 6b01f13574..193cb293e4 100644 --- a/src/app/+collection-page/edit-collection-page/edit-collection-page.component.spec.ts +++ b/src/app/+collection-page/edit-collection-page/edit-collection-page.component.spec.ts @@ -1,11 +1,10 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { CommonModule } from '@angular/common'; import { RouterTestingModule } from '@angular/router/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { EditCollectionPageComponent } from './edit-collection-page.component'; -import { RouteService } from '../../shared/services/route.service'; import { SharedModule } from '../../shared/shared.module'; import { CollectionDataService } from '../../core/data/collection-data.service'; import { of as observableOf } from 'rxjs'; @@ -20,9 +19,7 @@ describe('EditCollectionPageComponent', () => { declarations: [EditCollectionPageComponent], providers: [ { provide: CollectionDataService, useValue: {} }, - { provide: RouteService, useValue: {} }, - { provide: Router, useValue: {} }, - { provide: ActivatedRoute, useValue: { data: observableOf({dso: undefined}) } }, + { provide: ActivatedRoute, useValue: { data: observableOf({ dso: { payload: {} } }) } }, ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); diff --git a/src/app/+community-page/delete-community-page/delete-community-page.component.spec.ts b/src/app/+community-page/delete-community-page/delete-community-page.component.spec.ts new file mode 100644 index 0000000000..f18c4fb1f1 --- /dev/null +++ b/src/app/+community-page/delete-community-page/delete-community-page.component.spec.ts @@ -0,0 +1,42 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ActivatedRoute, Router } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; +import { CommonModule } from '@angular/common'; +import { RouterTestingModule } from '@angular/router/testing'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { RouteService } from '../../shared/services/route.service'; +import { SharedModule } from '../../shared/shared.module'; +import { of as observableOf } from 'rxjs'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { DeleteCommunityPageComponent } from './delete-community-page.component'; +import { CommunityDataService } from '../../core/data/community-data.service'; + +describe('DeleteCommunityPageComponent', () => { + let comp: DeleteCommunityPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot(), SharedModule, CommonModule, RouterTestingModule], + declarations: [DeleteCommunityPageComponent], + providers: [ + { provide: CommunityDataService, useValue: {} }, + { provide: ActivatedRoute, useValue: { data: observableOf({ dso: { payload: {} } }) } }, + { provide: NotificationsService, useValue: {} }, + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DeleteCommunityPageComponent); + comp = fixture.componentInstance; + fixture.detectChanges(); + }); + + describe('frontendURL', () => { + it('should have the right frontendURL set', () => { + expect((comp as any).frontendURL).toEqual('/communities/'); + }) + }); +}); diff --git a/src/app/+community-page/edit-community-page/edit-community-page.component.spec.ts b/src/app/+community-page/edit-community-page/edit-community-page.component.spec.ts index 764cffe8b5..54f2133ce7 100644 --- a/src/app/+community-page/edit-community-page/edit-community-page.component.spec.ts +++ b/src/app/+community-page/edit-community-page/edit-community-page.component.spec.ts @@ -1,10 +1,9 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { CommonModule } from '@angular/common'; import { RouterTestingModule } from '@angular/router/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { RouteService } from '../../shared/services/route.service'; import { SharedModule } from '../../shared/shared.module'; import { of as observableOf } from 'rxjs'; import { EditCommunityPageComponent } from './edit-community-page.component'; @@ -20,9 +19,7 @@ describe('EditCommunityPageComponent', () => { declarations: [EditCommunityPageComponent], providers: [ { provide: CommunityDataService, useValue: {} }, - { provide: RouteService, useValue: {} }, - { provide: Router, useValue: {} }, - { provide: ActivatedRoute, useValue: { data: observableOf({dso: undefined}) } }, + { provide: ActivatedRoute, useValue: { data: observableOf({ dso: { payload: {} } }) } }, ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); diff --git a/src/app/+community-page/edit-community-page/edit-community-page.component.ts b/src/app/+community-page/edit-community-page/edit-community-page.component.ts index 31111f779a..68f092e915 100644 --- a/src/app/+community-page/edit-community-page/edit-community-page.component.ts +++ b/src/app/+community-page/edit-community-page/edit-community-page.component.ts @@ -1,7 +1,6 @@ import { Component } from '@angular/core'; import { Community } from '../../core/shared/community.model'; import { CommunityDataService } from '../../core/data/community-data.service'; -import { RouteService } from '../../shared/services/route.service'; import { ActivatedRoute, Router } from '@angular/router'; import { NormalizedCommunity } from '../../core/cache/models/normalized-community.model'; import { EditComColPageComponent } from '../../shared/comcol-forms/edit-comcol-page/edit-comcol-page.component'; From b8252a1a8eac709778fc3c21f558e39783460c47 Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 24 Jan 2019 14:13:22 +0100 Subject: [PATCH 6/6] Fixed feedback --- .../item-delete/item-delete.component.spec.ts | 34 +++++++------------ .../item-delete/item-delete.component.ts | 11 +++--- src/app/core/data/data.service.ts | 10 ++++++ src/app/core/data/item-data.service.spec.ts | 21 ------------ src/app/core/data/item-data.service.ts | 34 ++----------------- src/app/core/data/request.models.ts | 3 ++ 6 files changed, 34 insertions(+), 79 deletions(-) diff --git a/src/app/+item-page/edit-item-page/item-delete/item-delete.component.spec.ts b/src/app/+item-page/edit-item-page/item-delete/item-delete.component.spec.ts index c03ae7c3fe..6d435c8de8 100644 --- a/src/app/+item-page/edit-item-page/item-delete/item-delete.component.spec.ts +++ b/src/app/+item-page/edit-item-page/item-delete/item-delete.component.spec.ts @@ -27,8 +27,6 @@ let routerStub; let mockItemDataService: ItemDataService; let routeStub; let notificationsServiceStub; -let successfulRestResponse; -let failRestResponse; describe('ItemDeleteComponent', () => { beforeEach(async(() => { @@ -46,14 +44,12 @@ describe('ItemDeleteComponent', () => { }); mockItemDataService = jasmine.createSpyObj('mockItemDataService', { - delete: observableOf(new RestResponse(true, '200')) + delete: observableOf(true) }); routeStub = { data: observableOf({ - item: new RemoteData(false, false, true, null, { - id: 'fake-id' - }) + item: new RemoteData(false, false, true, null, mockItem) }) }; @@ -63,10 +59,10 @@ describe('ItemDeleteComponent', () => { imports: [CommonModule, FormsModule, RouterTestingModule.withRoutes([]), TranslateModule.forRoot(), NgbModule.forRoot()], declarations: [ItemDeleteComponent], providers: [ - {provide: ActivatedRoute, useValue: routeStub}, - {provide: Router, useValue: routerStub}, - {provide: ItemDataService, useValue: mockItemDataService}, - {provide: NotificationsService, useValue: notificationsServiceStub}, + { provide: ActivatedRoute, useValue: routeStub }, + { provide: Router, useValue: routerStub }, + { provide: ItemDataService, useValue: mockItemDataService }, + { provide: NotificationsService, useValue: notificationsServiceStub }, ], schemas: [ CUSTOM_ELEMENTS_SCHEMA ] @@ -74,9 +70,6 @@ describe('ItemDeleteComponent', () => { })); beforeEach(() => { - successfulRestResponse = new RestResponse(true, '200'); - failRestResponse = new RestResponse(false, '500'); - fixture = TestBed.createComponent(ItemDeleteComponent); comp = fixture.componentInstance; fixture.detectChanges(); @@ -95,22 +88,21 @@ describe('ItemDeleteComponent', () => { describe('performAction', () => { it('should call delete function from the ItemDataService', () => { - spyOn(comp, 'processRestResponse'); + spyOn(comp, 'notify'); comp.performAction(); - - expect(mockItemDataService.delete).toHaveBeenCalledWith(mockItem.id); - expect(comp.processRestResponse).toHaveBeenCalled(); + expect(mockItemDataService.delete).toHaveBeenCalledWith(mockItem); + expect(comp.notify).toHaveBeenCalled(); }); }); - describe('processRestResponse', () => { + describe('notify', () => { it('should navigate to the homepage on successful deletion of the item', () => { - comp.processRestResponse(successfulRestResponse); + comp.notify(true); expect(routerStub.navigate).toHaveBeenCalledWith(['']); }); }); - describe('processRestResponse', () => { + describe('notify', () => { it('should navigate to the item edit page on failed deletion of the item', () => { - comp.processRestResponse(failRestResponse); + comp.notify(false); expect(routerStub.navigate).toHaveBeenCalledWith([getItemEditPath('fake-id')]); }); }); diff --git a/src/app/+item-page/edit-item-page/item-delete/item-delete.component.ts b/src/app/+item-page/edit-item-page/item-delete/item-delete.component.ts index 95f25c67bc..2700b45475 100644 --- a/src/app/+item-page/edit-item-page/item-delete/item-delete.component.ts +++ b/src/app/+item-page/edit-item-page/item-delete/item-delete.component.ts @@ -19,20 +19,19 @@ export class ItemDeleteComponent extends AbstractSimpleItemActionComponent { * Perform the delete action to the item */ performAction() { - this.itemDataService.delete(this.item.id).pipe(first()).subscribe( - (response: RestResponse) => { - this.processRestResponse(response); + this.itemDataService.delete(this.item).pipe(first()).subscribe( + (succeeded: boolean) => { + this.notify(succeeded); } ); } /** - * Process the RestResponse retrieved from the server. * When the item is successfully delete, navigate to the homepage, otherwise navigate back to the item edit page * @param response */ - processRestResponse(response: RestResponse) { - if (response.isSuccessful) { + notify(succeeded: boolean) { + if (succeeded) { this.notificationsService.success(this.translateService.get('item.edit.' + this.messageKey + '.success')); this.router.navigate(['']); } else { diff --git a/src/app/core/data/data.service.ts b/src/app/core/data/data.service.ts index f4d7bcdf4f..440013c31c 100644 --- a/src/app/core/data/data.service.ts +++ b/src/app/core/data/data.service.ts @@ -95,6 +95,11 @@ export abstract class DataService(hrefObs) as Observable>>; } + /** + * Create the HREF for a specific object based on its identifier + * @param endpoint The base endpoint for the type of object + * @param resourceID The identifier for the object + */ getIDHref(endpoint, resourceID): string { return `${endpoint}/${resourceID}`; } @@ -199,6 +204,11 @@ export abstract class DataService { const requestId = this.requestService.generateRequestId(); diff --git a/src/app/core/data/item-data.service.spec.ts b/src/app/core/data/item-data.service.spec.ts index 6cf7e503d3..02c70791b5 100644 --- a/src/app/core/data/item-data.service.spec.ts +++ b/src/app/core/data/item-data.service.spec.ts @@ -162,25 +162,4 @@ describe('ItemDataService', () => { }); }); - describe('getItemDeleteEndpoint', () => { - beforeEach(() => { - scheduler = getTestScheduler(); - service = initTestService(); - }); - - it('should return the endpoint to make an item private or public', () => { - const result = service.getItemDeleteEndpoint(scopeID); - const expected = cold('a', {a: ScopedItemEndpoint}); - - expect(result).toBeObservable(expected); - }); - - it('should delete the item', () => { - const expected = new RestResponse(true, '200'); - const result = service.delete(scopeID); - result.subscribe((v) => expect(v).toEqual(expected)); - - }); - }); - }); diff --git a/src/app/core/data/item-data.service.ts b/src/app/core/data/item-data.service.ts index c67b49f70d..bd3c42a67c 100644 --- a/src/app/core/data/item-data.service.ts +++ b/src/app/core/data/item-data.service.ts @@ -14,7 +14,7 @@ import { URLCombiner } from '../url-combiner/url-combiner'; import { DataService } from './data.service'; import { RequestService } from './request.service'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { DeleteRequest, FindAllOptions, PatchRequest, RestRequest } from './request.models'; +import { FindAllOptions, PatchRequest, RestRequest } from './request.models'; import { ObjectCacheService } from '../cache/object-cache.service'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { HttpClient } from '@angular/common/http'; @@ -64,7 +64,7 @@ export class ItemDataService extends DataService { */ public getItemWithdrawEndpoint(itemId: string): Observable { return this.halService.getEndpoint(this.linkPath).pipe( - map((endpoint: string) => this.getFindByIDHref(endpoint, itemId)) + map((endpoint: string) => this.getIDHref(endpoint, itemId)) ); } @@ -74,17 +74,7 @@ export class ItemDataService extends DataService { */ public getItemDiscoverableEndpoint(itemId: string): Observable { return this.halService.getEndpoint(this.linkPath).pipe( - map((endpoint: string) => this.getFindByIDHref(endpoint, itemId)) - ); - } - - /** - * Get the endpoint to delete the item - * @param itemId - */ - public getItemDeleteEndpoint(itemId: string): Observable { - return this.halService.getEndpoint(this.linkPath).pipe( - map((endpoint: string) => this.getFindByIDHref(endpoint, itemId)) + map((endpoint: string) => this.getIDHref(endpoint, itemId)) ); } @@ -129,22 +119,4 @@ export class ItemDataService extends DataService { map((requestEntry: RequestEntry) => requestEntry.response) ); } - - /** - * Delete the item - * @param itemId - */ - public delete(itemId: string) { - return this.getItemDeleteEndpoint(itemId).pipe( - distinctUntilChanged(), - map((endpointURL: string) => - new DeleteRequest(this.requestService.generateRequestId(), endpointURL) - ), - configureRequest(this.requestService), - map((request: RestRequest) => request.href), - getRequestFromRequestHref(this.requestService), - map((requestEntry: RequestEntry) => requestEntry.response) - ); - } - } diff --git a/src/app/core/data/request.models.ts b/src/app/core/data/request.models.ts index 6f0ff5b605..e4920058ac 100644 --- a/src/app/core/data/request.models.ts +++ b/src/app/core/data/request.models.ts @@ -227,6 +227,9 @@ export class CreateRequest extends PostRequest { } } +/** + * Request to delete an object based on its identifier + */ export class DeleteByIDRequest extends DeleteRequest { constructor( uuid: string,