From ab5cc1c961685beafbcce9020b8c7fdc63642ad8 Mon Sep 17 00:00:00 2001 From: lotte Date: Fri, 4 Jan 2019 16:30:25 +0100 Subject: [PATCH] 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