diff --git a/src/app/admin/admin-ldn-services/admin-ldn-services.module.ts b/src/app/admin/admin-ldn-services/admin-ldn-services.module.ts index c3642ea88d..c82250fcec 100644 --- a/src/app/admin/admin-ldn-services/admin-ldn-services.module.ts +++ b/src/app/admin/admin-ldn-services/admin-ldn-services.module.ts @@ -7,6 +7,7 @@ import { LdnServiceNewComponent } from './ldn-service-new/ldn-service-new.compon import { LdnServiceFormComponent } from './ldn-service-form/ldn-service-form.component'; import { LdnServiceFormEditComponent } from './ldn-service-form-edit/ldn-service-form-edit.component'; import { FormsModule } from '@angular/forms'; +import { LdnItemfiltersService } from './ldn-services-data/ldn-itemfilters-data.service'; @@ -22,6 +23,7 @@ import { FormsModule } from '@angular/forms'; LdnServiceNewComponent, LdnServiceFormComponent, LdnServiceFormEditComponent, - ] + ], + providers: [LdnItemfiltersService] }) export class AdminLdnServicesModule { } diff --git a/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.html b/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.html index 9f5515960b..5d33d21505 100644 --- a/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.html +++ b/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.html @@ -1,4 +1,4 @@ -
+
@@ -95,8 +95,8 @@
@@ -159,12 +159,13 @@
- + + +
@@ -249,7 +250,7 @@ {{ 'service.overview.reset-form.body' | translate }}
-
@@ -149,12 +149,13 @@
- - + +
@@ -182,6 +183,69 @@  
+
+ +
+ + +
+ + + + +
+
+ + + +
+ + + + +
+
+ diff --git a/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.ts b/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.ts index bfee1467d7..25b7ab70d5 100644 --- a/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.ts +++ b/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.ts @@ -1,4 +1,13 @@ -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { + ChangeDetectorRef, + Component, + EventEmitter, + Input, + OnInit, + Output, + TemplateRef, + ViewChild +} from '@angular/core'; import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Router } from '@angular/router'; @@ -12,6 +21,13 @@ import { RemoteData } from '../../../core/data/remote-data'; import { LdnService } from '../ldn-services-model/ldn-services.model'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { TranslateService } from '@ngx-translate/core'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { Itemfilter } from '../ldn-services-model/ldn-service-itemfilters'; +import { Observable } from 'rxjs'; +import { FindListOptions } from '../../../core/data/find-list-options.model'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { LdnItemfiltersService } from '../ldn-services-data/ldn-itemfilters-data.service'; +import { NgbModal } from "@ng-bootstrap/ng-bootstrap"; @Component({ @@ -28,11 +44,21 @@ import { TranslateService } from '@ngx-translate/core'; }) export class LdnServiceFormComponent implements OnInit { formModel: FormGroup; + private modalRef: any; + @ViewChild('confirmModal', {static: true}) confirmModal: TemplateRef; + @ViewChild('resetFormModal', {static: true}) resetFormModal: TemplateRef; public inboundPatterns: object[] = notifyPatterns; public outboundPatterns: object[] = notifyPatterns; - public itemFilterList: any[]; + itemfiltersRD$: Observable>>; + config: FindListOptions = Object.assign(new FindListOptions(), { + elementsPerPage: 20 + }); + pageConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'po', + pageSize: 20 + }); @@ -51,11 +77,14 @@ export class LdnServiceFormComponent implements OnInit { constructor( private ldnServicesService: LdnServicesService, - private ldnDirectoryService: LdnDirectoryService, + private ldnItemfiltersService: LdnItemfiltersService, private formBuilder: FormBuilder, private router: Router, private notificationsService: NotificationsService, - private translateService: TranslateService + private translateService: TranslateService, + private cdRef: ChangeDetectorRef, + protected modalService: NgbModal, + ) { this.formModel = this.formBuilder.group({ @@ -75,15 +104,19 @@ export class LdnServiceFormComponent implements OnInit { } ngOnInit(): void { - this.ldnDirectoryService.getItemFilters().subscribe((itemFilters) => { - console.log(itemFilters); - this.itemFilterList = itemFilters._embedded.itemfilters.map((filter: { id: string; }) => ({ - name: filter.id - })); - }); + this.setItemfilters(); } - + setItemfilters() { + this.itemfiltersRD$ = this.ldnItemfiltersService.findAll().pipe( + getFirstCompletedRemoteData()); + console.log(this.itemfiltersRD$); + this.itemfiltersRD$.subscribe((rd: RemoteData>) => { + if (rd.hasSucceeded) { + console.log(rd); + } + }); + } /*createLdnService(values: any) { this.formModel.get('name').markAsTouched(); this.formModel.get('url').markAsTouched(); @@ -106,7 +139,7 @@ export class LdnServiceFormComponent implements OnInit { ).subscribe((rd: RemoteData) => { if (rd.hasSucceeded) { this.notificationsService.success(this.translateService.get('notification.created.success')); - this.submitForm.emit(values); + this.onSubmit.emit(values); } else { this.notificationsService.error(this.translateService.get('notification.created.failure', )); this.cancelForm.emit(); @@ -116,6 +149,17 @@ export class LdnServiceFormComponent implements OnInit { }*/ onSubmit() { + this.openConfirmModal(this.confirmModal); + } + + openConfirmModal(content) { + this.modalRef = this.modalService.open(content); + } + + openResetFormModal(content) { + this.modalRef = this.modalService.open(content); + } + createService(){ this.formModel.get('name').markAsTouched(); this.formModel.get('url').markAsTouched(); this.formModel.get('ldnUrl').markAsTouched(); @@ -125,6 +169,7 @@ export class LdnServiceFormComponent implements OnInit { const ldnUrl = this.formModel.get('ldnUrl').value; if (!name || !url || !ldnUrl) { + this.closeModal(); return; } @@ -133,26 +178,28 @@ export class LdnServiceFormComponent implements OnInit { const ldnServiceData = this.ldnServicesService.create(values); ldnServiceData.pipe( - getFirstCompletedRemoteData() - ).subscribe((ldnNewService) => { - console.log(ldnNewService); - }); - - ldnServiceData.pipe( - getFirstCompletedRemoteData() + getFirstCompletedRemoteData() ).subscribe((rd: RemoteData) => { if (rd.hasSucceeded) { this.notificationsService.success(this.translateService.get('notification.created.success')); - this.submitForm.emit(); this.sendBack(); } else { this.notificationsService.error(this.translateService.get('notification.created.failure')); - this.cancelForm.emit(); } }); } + resetFormAndLeave() { + this.sendBack(); + this.closeModal(); + } + + closeModal() { + this.modalRef.close(); + this.cdRef.detectChanges(); + } + addInboundPattern() { const notifyServiceInboundPatternsArray = this.formModel.get('notifyServiceInboundPatterns') as FormArray; notifyServiceInboundPatternsArray.push(this.createInboundPatternFormGroup()); @@ -184,6 +231,8 @@ export class LdnServiceFormComponent implements OnInit { this.router.navigateByUrl('admin/ldn/services'); } + + private createOutboundPatternFormGroup(): FormGroup { return this.formBuilder.group({ pattern: [''], diff --git a/src/app/admin/admin-ldn-services/ldn-services-data/ldn-itemfilters-data.service.ts b/src/app/admin/admin-ldn-services/ldn-services-data/ldn-itemfilters-data.service.ts new file mode 100644 index 0000000000..692e1a5db9 --- /dev/null +++ b/src/app/admin/admin-ldn-services/ldn-services-data/ldn-itemfilters-data.service.ts @@ -0,0 +1,48 @@ +import { Injectable } from '@angular/core'; +import { dataService } from '../../../core/data/base/data-service.decorator'; +import { LDN_SERVICE_CONSTRAINT_FILTERS } from '../ldn-services-model/ldn-service.resource-type'; +import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service'; +import { FindAllData, FindAllDataImpl } from '../../../core/data/base/find-all-data'; + +import { RequestService } from '../../../core/data/request.service'; +import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../../core/cache/object-cache.service'; +import { HALEndpointService } from '../../../core/shared/hal-endpoint.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { FindListOptions } from '../../../core/data/find-list-options.model'; +import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model'; +import { Observable } from 'rxjs'; +import { RemoteData } from '../../../core/data/remote-data'; +import { Itemfilter } from '../ldn-services-model/ldn-service-itemfilters'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; + + + +/** + * A service responsible for fetching/sending data from/to the REST API on the itemfilters endpoint + */ +@Injectable() +@dataService(LDN_SERVICE_CONSTRAINT_FILTERS) +export class LdnItemfiltersService extends IdentifiableDataService implements FindAllData { + private findAllData: FindAllDataImpl; + + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + ) { + super('itemfilters', requestService, rdbService, objectCache, halService); + + this.findAllData = new FindAllDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); + } + + getEndpoint() { + return this.halService.getEndpoint(this.linkPath); + } + + findAll(options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } +} diff --git a/src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service.ts b/src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service.ts index 83098f7f7c..d2ef16fada 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service.ts @@ -32,6 +32,9 @@ import { ldnServiceConstrain } from '../ldn-services-model/ldn-service.constrain import { getFirstCompletedRemoteData } from 'src/app/core/shared/operators'; import { hasValue } from 'src/app/shared/empty.util'; +/** + * A service responsible for fetching/sending data from/to the REST API on the ldnservices endpoint + */ @Injectable() @dataService(LDN_SERVICE) export class LdnServicesService extends IdentifiableDataService implements FindAllData, DeleteData, PatchData, CreateData { diff --git a/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.ts b/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.ts index 933dff8901..9bc0602787 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.ts @@ -5,13 +5,13 @@ import { PaginatedList } from '../../../core/data/paginated-list.model'; import { FindListOptions } from '../../../core/data/find-list-options.model'; import { LdnService } from '../ldn-services-model/ldn-services.model'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; -import { switchMap } from 'rxjs/operators'; +import { map, switchMap } from 'rxjs/operators'; import { LdnServicesService } from 'src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service'; import { PaginationService } from 'src/app/core/pagination/pagination.service'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { hasValue } from '../../../shared/empty.util'; import { Operation } from 'fast-json-patch'; -import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { getAllCompletedRemoteData, getFirstCompletedRemoteData } from '../../../core/shared/operators'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { TranslateService } from '@ngx-translate/core'; import { Router } from '@angular/router'; @@ -55,8 +55,9 @@ export class LdnServicesOverviewComponent implements OnInit, OnDestroy { setLdnServices() { this.ldnServicesRD$ = this.paginationService.getFindListOptions(this.pageConfig.id, this.config).pipe( - switchMap((config) => this.ldnServicesService.findAll(config, true, false).pipe( + switchMap((config) => this.ldnServicesService.findAll(config, false, false).pipe( getFirstCompletedRemoteData() + )) ); @@ -96,6 +97,14 @@ export class LdnServicesOverviewComponent implements OnInit, OnDestroy { ldnServicesService.delete(serviceId).pipe(getFirstCompletedRemoteData()).subscribe((rd: RemoteData) => { if (rd.hasSucceeded) { this.servicesData = this.servicesData.filter(service => service.id !== serviceId); + this.ldnServicesRD$ = this.ldnServicesRD$.pipe( + map((remoteData: RemoteData>) => { + if (remoteData.hasSucceeded) { + remoteData.payload.page = remoteData.payload.page.filter(service => service.id.toString() !== serviceId); + } + return remoteData; + }) + ); this.cdRef.detectChanges(); this.closeModal(); this.notificationService.success(this.translateService.get('notification.created.success')); diff --git a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-itemfilters.ts b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-itemfilters.ts new file mode 100644 index 0000000000..865fa0b3ea --- /dev/null +++ b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-itemfilters.ts @@ -0,0 +1,32 @@ +import { autoserialize, inheritSerialization, deserialize } from 'cerialize'; +import { LDN_SERVICE_CONSTRAINT_FILTER } from './ldn-service.resource-type'; +import { CacheableObject } from '../../../core/cache/cacheable-object.model'; +import { HALLink } from '../../../core/shared/hal-link.model'; +import { typedObject } from '../../../core/cache/builders/build-decorators'; +import { excludeFromEquals } from '../../../core/utilities/equals.decorators'; +import { ResourceType } from '../../../core/shared/resource-type'; + +/** A single filter value and its properties. */ +@typedObject +@inheritSerialization(CacheableObject) +export class Itemfilter extends CacheableObject { + static type = LDN_SERVICE_CONSTRAINT_FILTER; + + @excludeFromEquals + @autoserialize + type: ResourceType; + + @autoserialize + id: string; + + @deserialize + _links: { + self: { + href: string; + }; + }; + + get self(): string { + return this._links.self.href; + } +} diff --git a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service.resource-type.ts b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service.resource-type.ts index 859ecb739e..05a881e7e7 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service.resource-type.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service.resource-type.ts @@ -7,4 +7,6 @@ import { ResourceType } from '../../../core/shared/resource-type'; export const LDN_SERVICE = new ResourceType('ldnservice'); -export const LDN_SERVICE_CONSTRAINT = new ResourceType('ldnservice'); +export const LDN_SERVICE_CONSTRAINT_FILTERS = new ResourceType('itemfilters'); + +export const LDN_SERVICE_CONSTRAINT_FILTER = new ResourceType('itemfilter'); diff --git a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-services.model.ts b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-services.model.ts index 82731b3cb1..e0725b5851 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-services.model.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-services.model.ts @@ -8,7 +8,7 @@ import { NotifyServicePattern } from './ldn-service-patterns.model'; - +/** An LdnService and its properties. */ @typedObject @inheritSerialization(CacheableObject) export class LdnService extends CacheableObject { diff --git a/src/app/admin/admin-ldn-services/ldn-services-services/ldn-directory.service.ts b/src/app/admin/admin-ldn-services/ldn-services-services/ldn-directory.service.ts index 5ed32f5bb7..3499759f03 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-services/ldn-directory.service.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-services/ldn-directory.service.ts @@ -1,57 +1,26 @@ import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; -import { Observable, tap } from 'rxjs'; -import { LdnService } from '../ldn-services-model/ldn-services.model'; +import { map, Observable } from 'rxjs'; +import { LdnServicesService } from "../ldn-services-data/ldn-services-data.service"; @Injectable({ providedIn: 'root', }) export class LdnDirectoryService { - private baseUrl = 'http://localhost:8080/server/api/ldn/ldnservices'; private itemFilterEndpoint = 'http://localhost:8080/server/api/config/itemfilters'; - constructor(private http: HttpClient) {} + constructor(private http: HttpClient, + private ldnServicesService: LdnServicesService) {} + public getItemFilters(): Observable { - - public listLdnServices(): Observable { - const endpoint = `${this.baseUrl}`; - return this.http.get(endpoint).pipe( - tap(data => { - console.log('listLdnServices() Data:', data); + return this.ldnServicesService.findAll().pipe( + map((servicesData) => { + return servicesData; }) ); } - public getLdnServiceById(id: string): Observable { - const endpoint = `${this.baseUrl}/${id}`; - return this.http.get(endpoint); - } - - public createLdnService(ldnService: LdnService): Observable { - return this.http.post(this.baseUrl, ldnService); - } - - public updateLdnService(id: string, ldnService: LdnService): Observable { - const endpoint = `${this.baseUrl}/${id}`; - return this.http.put(endpoint, ldnService); - } - - public deleteLdnService(id: string): Observable { - const endpoint = `${this.baseUrl}/${id}`; - return this.http.delete(endpoint); - } - - public searchLdnServicesByLdnUrl(ldnUrl: string): Observable { - const endpoint = `${this.baseUrl}/search/byLdnUrl?ldnUrl=${ldnUrl}`; - return this.http.get(endpoint); - } - - public getItemFilters(): Observable { - const itemFiltersEndpoint = `${this.itemFilterEndpoint}`; - return this.http.get(itemFiltersEndpoint); - } - } diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 1990bde77e..88da00f02c 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -189,6 +189,8 @@ import { SuggestionTarget } from './suggestion-notifications/reciter-suggestions import { SuggestionSource } from './suggestion-notifications/reciter-suggestions/models/suggestion-source.model'; import { LdnServicesService } from '../admin/admin-ldn-services/ldn-services-data/ldn-services-data.service'; import { LdnService } from '../admin/admin-ldn-services/ldn-services-model/ldn-services.model'; +import { LdnItemfiltersService } from '../admin/admin-ldn-services/ldn-services-data/ldn-itemfilters-data.service'; +import { Itemfilter } from "../admin/admin-ldn-services/ldn-services-model/ldn-service-itemfilters"; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -313,6 +315,7 @@ const PROVIDERS = [ OrcidHistoryDataService, SupervisionOrderDataService, LdnServicesService, + LdnItemfiltersService ]; /** @@ -394,7 +397,8 @@ export const models = BulkAccessConditionOptions, SuggestionTarget, SuggestionSource, - LdnService + LdnService, + Itemfilter ];