diff --git a/src/app/admin/admin-ldn-services/admin-ldn-services-routing.module.ts b/src/app/admin/admin-ldn-services/admin-ldn-services-routing.module.ts index 4f05bca9e3..43dc4f3462 100644 --- a/src/app/admin/admin-ldn-services/admin-ldn-services-routing.module.ts +++ b/src/app/admin/admin-ldn-services/admin-ldn-services-routing.module.ts @@ -2,35 +2,33 @@ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; import { I18nBreadcrumbResolver } from 'src/app/core/breadcrumbs/i18n-breadcrumb.resolver'; import { LdnServicesOverviewComponent } from './ldn-services-directory/ldn-services-directory.component'; -import { LdnServicesGuard } from './ldn-services-guard/ldn-services-guard.service'; import { LdnServiceNewComponent } from './ldn-service-new/ldn-service-new.component'; import { LdnServiceFormEditComponent } from './ldn-service-form-edit/ldn-service-form-edit.component'; @NgModule({ - imports: [ - RouterModule.forChild([ - { - path: '', - pathMatch: 'full', - component: LdnServicesOverviewComponent, - resolve: { breadcrumb: I18nBreadcrumbResolver }, - data: { title: 'ldn-registered-services.title', breadcrumbKey: 'ldn-registered-services.new' }, - canActivate: [LdnServicesGuard] - }, - { - path: 'new', - resolve: { breadcrumb: I18nBreadcrumbResolver }, - component: LdnServiceNewComponent, - data: { title: 'ldn-register-new-service.title', breadcrumbKey: 'ldn-register-new-service' } - }, - { - path: 'edit/:serviceId', - resolve: { breadcrumb: I18nBreadcrumbResolver }, - component: LdnServiceFormEditComponent, - data: { title: 'ldn-edit-service.title', breadcrumbKey: 'ldn-edit-service' } - }, - ]), - ] + imports: [ + RouterModule.forChild([ + { + path: '', + pathMatch: 'full', + component: LdnServicesOverviewComponent, + resolve: {breadcrumb: I18nBreadcrumbResolver}, + data: {title: 'ldn-registered-services.title', breadcrumbKey: 'ldn-registered-services.new'}, + }, + { + path: 'new', + resolve: {breadcrumb: I18nBreadcrumbResolver}, + component: LdnServiceNewComponent, + data: {title: 'ldn-register-new-service.title', breadcrumbKey: 'ldn-register-new-service'} + }, + { + path: 'edit/:serviceId', + resolve: {breadcrumb: I18nBreadcrumbResolver}, + component: LdnServiceFormEditComponent, + data: {title: 'ldn-edit-service.title', breadcrumbKey: 'ldn-edit-service'} + }, + ]), + ] }) export class AdminLdnServicesRoutingModule { 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 1fd67d53b9..9ca3775a9e 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 @@ -6,20 +6,24 @@ import { SharedModule } from '../../shared/shared.module'; import { LdnServiceNewComponent } from './ldn-service-new/ldn-service-new.component'; 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'; @NgModule({ - imports: [ - CommonModule, - SharedModule, - AdminLdnServicesRoutingModule, - ], - declarations: [ - LdnServicesOverviewComponent, - LdnServiceNewComponent, - LdnServiceFormComponent, - LdnServiceFormEditComponent, - ] + imports: [ + CommonModule, + SharedModule, + AdminLdnServicesRoutingModule, + FormsModule + ], + declarations: [ + LdnServicesOverviewComponent, + LdnServiceNewComponent, + LdnServiceFormComponent, + LdnServiceFormEditComponent, + ], + providers: [LdnItemfiltersService] }) -export class AdminLdnServicesModule { } +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 6402e0b953..368b312cd1 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,155 +1,281 @@ - -
- -
- -
- -
-
-
-
-
- -
- - -
- -
-   -
- -
- - -
- -
-   -
- -
- - -
- -
-   -
- -
- - -
- -
-   -
- -
- - - -
- - -
- - - -
- - +
+ +
+

{{ 'ldn-edit-registered-service.title' | translate }}

- -
- -
- -
-
+ +
+ +
+ +
+
+
-
- +
+ + +
-
- -
+
+   +
- + +
+ + +
-
+
+   +
- {{ 'ldn-new-service.form.label.addPattern' | translate }} + +
+ + +
-
-   -
+
+   +
-
+ +
+ + +
- +
+   +
-
- - -
+
+
+ +
+
+ +
+
+ +
+
+
+
-
- - -
+
-
- -
- - - -
+ - {{ 'ldn-new-service.form.label.addPattern' | translate }} - +
+
+ +
-
-   -
+
+ + + +
+ +
+ +
+
+
+
+ + +
+ + +
+
+ +
+
+ + + {{ 'ldn-new-service.form.label.addPattern' | translate }} + +
+   +
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + + + +
+
+ +
+
+ + + +
+ +
+ +
+
+
+
+ +
+ + +
+
+
+
+ + {{ 'ldn-new-service.form.label.addPattern' | translate }} + + +
+   +
+ + +
+ + +
+ + + + +
+
+ + + +
+ + + + +
+
- - diff --git a/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.scss b/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.scss index 92ac744aed..b686e6533b 100644 --- a/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.scss +++ b/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.scss @@ -1,14 +1,8 @@ form { - display: flex; - flex-direction: column; - align-items: flex-start; max-width: 800px; font-size: 14px; - margin-left: 300px; + position: relative; - & > * { - width: 100%; - } } input[type="text"], @@ -33,12 +27,13 @@ textarea { resize: none; } -.add-pattern-link{ +.add-pattern-link { color: #0048ff; cursor: pointer; margin-left: 10px; } -.remove-pattern-link{ + +.remove-pattern-link { color: #e34949; cursor: pointer; margin-left: 10px; @@ -81,7 +76,6 @@ textarea { } - .toggle-switch .slider { width: 22px; height: 22px; @@ -103,12 +97,39 @@ textarea { .toggle-switch { cursor: pointer; + margin-top: 3px; + margin-right: 3px +} + +.label-box { + margin-left: 11px; +} + +.label-box-2 { + margin-left: 14px; +} + +.label-box-3 { + margin-left: 5px; +} + +form button.btn.btn-primary[type="submit"] { + position: absolute; + right: 8px; +} + +.submission-form-footer { + border-radius: var(--bs-card-border-radius); + bottom: 0; + background-color: var(--bs-gray-400); + padding: calc(var(--bs-spacer) / 2); + z-index: var(--ds-submission-footer-z-index); +} + +.marked-for-deletion { + background-color: #ffcccc; } - - - - diff --git a/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.spec.ts b/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.spec.ts index 8320ec9042..332d43cae3 100644 --- a/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.spec.ts +++ b/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.spec.ts @@ -3,21 +3,21 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { LdnServiceFormEditComponent } from './ldn-service-form-edit.component'; describe('LdnServiceFormEditComponent', () => { - let component: LdnServiceFormEditComponent; - let fixture: ComponentFixture; + let component: LdnServiceFormEditComponent; + let fixture: ComponentFixture; - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ LdnServiceFormEditComponent ] - }) - .compileComponents(); + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [LdnServiceFormEditComponent] + }) + .compileComponents(); - fixture = TestBed.createComponent(LdnServiceFormEditComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + fixture = TestBed.createComponent(LdnServiceFormEditComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.ts b/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.ts index 90a0546671..fa460afbca 100644 --- a/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.ts +++ b/src/app/admin/admin-ldn-services/ldn-service-form-edit/ldn-service-form-edit.component.ts @@ -1,14 +1,24 @@ -import { ChangeDetectorRef, Component, Input } from '@angular/core'; +import { ChangeDetectorRef, Component, Input, OnInit, TemplateRef, ViewChild } from '@angular/core'; import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; import { LDN_SERVICE } from '../ldn-services-model/ldn-service.resource-type'; -import { Router } from '@angular/router'; -import { HttpClient } from '@angular/common/http'; -import { LdnDirectoryService } from '../ldn-services-services/ldn-directory.service'; +import { ActivatedRoute, Router } from '@angular/router'; import { LdnServicesService } from '../ldn-services-data/ldn-services-data.service'; -import { LdnServiceConstraint } from '../ldn-services-model/ldn-service-constraint.model'; import { notifyPatterns } from '../ldn-services-patterns/ldn-service-coar-patterns'; -import { ActivatedRoute } from '@angular/router'; import { animate, state, style, transition, trigger } from '@angular/animations'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { TranslateService } from '@ngx-translate/core'; +import { LdnService } from '../ldn-services-model/ldn-services.model'; +import { RemoteData } from 'src/app/core/data/remote-data'; +import { Operation } from 'fast-json-patch'; +import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { LdnItemfiltersService } from '../ldn-services-data/ldn-itemfilters-data.service'; +import { Itemfilter } from '../ldn-services-model/ldn-service-itemfilters'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { Observable } from 'rxjs'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { FindListOptions } from '../../../core/data/find-list-options.model'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; @Component({ selector: 'ds-ldn-service-form-edit', @@ -22,17 +32,21 @@ import { animate, state, style, transition, trigger } from '@angular/animations' ]), ], }) -export class LdnServiceFormEditComponent { +export class LdnServiceFormEditComponent implements OnInit { formModel: FormGroup; + @ViewChild('confirmModal', {static: true}) confirmModal: TemplateRef; + @ViewChild('resetFormModal', {static: true}) resetFormModal: TemplateRef; - showItemFilterDropdown = false; - - private originalInboundPatterns: any[] = []; - private originalOutboundPatterns: any[] = []; public inboundPatterns: object[] = notifyPatterns; public outboundPatterns: object[] = notifyPatterns; - public itemFilterList: LdnServiceConstraint[]; - + itemfiltersRD$: Observable>>; + config: FindListOptions = Object.assign(new FindListOptions(), { + elementsPerPage: 20 + }); + pageConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'po', + pageSize: 20 + }); @Input() public name: string; @Input() public description: string; @Input() public url: string; @@ -41,18 +55,28 @@ export class LdnServiceFormEditComponent { @Input() public outboundPattern: string; @Input() public constraint: string; @Input() public automatic: boolean; - @Input() public headerKey: string; - private serviceId: string; + markedForDeletionInboundPattern: number[] = []; + markedForDeletionOutboundPattern: number[] = []; + protected serviceId: string; + private originalInboundPatterns: any[] = []; + private originalOutboundPatterns: any[] = []; + private deletedInboundPatterns: number[] = []; + private deletedOutboundPatterns: number[] = []; + private modalRef: any; + private service: LdnService; constructor( - private ldnServicesService: LdnServicesService, - private ldnDirectoryService: LdnDirectoryService, + protected ldnServicesService: LdnServicesService, + private ldnItemfiltersService: LdnItemfiltersService, private formBuilder: FormBuilder, - private http: HttpClient, private router: Router, private route: ActivatedRoute, - private cdRef: ChangeDetectorRef + private cdRef: ChangeDetectorRef, + protected modalService: NgbModal, + private notificationService: NotificationsService, + private translateService: TranslateService, + protected paginationService: PaginationService ) { this.formModel = this.formBuilder.group({ @@ -78,101 +102,238 @@ export class LdnServiceFormEditComponent { this.fetchServiceData(this.serviceId); } }); - this.ldnDirectoryService.getItemFilters().subscribe((itemFilters) => { - this.itemFilterList = itemFilters._embedded.itemfilters.map((filter: { id: string; }) => ({ - name: filter.id - })); - this.cdRef.detectChanges(); - - }); + this.setItemfilters(); } - private getOriginalPattern(formArrayName: string, patternId: number): any { - let originalPatterns: any[] = []; - - if (formArrayName === 'notifyServiceInboundPatterns') { - originalPatterns = this.originalInboundPatterns; - } else if (formArrayName === 'notifyServiceOutboundPatterns') { - originalPatterns = this.originalOutboundPatterns; - } - - return originalPatterns.find((pattern) => pattern.id === patternId); + setItemfilters() { + this.itemfiltersRD$ = this.ldnItemfiltersService.findAll().pipe( + getFirstCompletedRemoteData()); } - private patternsAreEqual(patternA: any, patternB: any): boolean { - return ( - patternA.pattern === patternB.pattern && - patternA.constraint === patternB.constraint && - patternA.automatic === patternB.automatic + + fetchServiceData(serviceId: string): void { + this.ldnServicesService.findById(serviceId).pipe( + getFirstCompletedRemoteData() + ).subscribe( + (data: RemoteData) => { + if (data.hasSucceeded) { + this.service = data.payload; + + this.formModel.patchValue({ + id: this.service.id, + name: this.service.name, + description: this.service.description, + url: this.service.url, + ldnUrl: this.service.ldnUrl, + type: this.service.type, + enabled: this.service.enabled + }); + + const inboundPatternsArray = this.formModel.get('notifyServiceInboundPatterns') as FormArray; + inboundPatternsArray.clear(); + + this.service.notifyServiceInboundPatterns.forEach((pattern: any) => { + const patternFormGroup = this.initializeInboundPatternFormGroup(); + patternFormGroup.patchValue(pattern); + inboundPatternsArray.push(patternFormGroup); + this.cdRef.detectChanges(); + }); + + const outboundPatternsArray = this.formModel.get('notifyServiceOutboundPatterns') as FormArray; + outboundPatternsArray.clear(); + + this.service.notifyServiceOutboundPatterns.forEach((pattern: any) => { + const patternFormGroup = this.initializeOutboundPatternFormGroup(); + patternFormGroup.patchValue(pattern); + outboundPatternsArray.push(patternFormGroup); + + this.cdRef.detectChanges(); + }); + this.originalInboundPatterns = [...this.service.notifyServiceInboundPatterns]; + this.originalOutboundPatterns = [...this.service.notifyServiceOutboundPatterns]; + } + }, ); } - fetchServiceData(serviceId: string): void { - const apiUrl = `http://localhost:8080/server/api/ldn/ldnservices/${serviceId}`; + generatePatchOperations(): any[] { + const patchOperations: any[] = []; - this.http.get(apiUrl).subscribe( - (data: any) => { - console.log(data); + this.createReplaceOperation(patchOperations, 'name', '/name'); + this.createReplaceOperation(patchOperations, 'description', '/description'); + this.createReplaceOperation(patchOperations, 'ldnUrl', '/ldnurl'); + this.createReplaceOperation(patchOperations, 'url', '/url'); - this.formModel.patchValue({ - id: data.id, - name: data.name, - description: data.description, - url: data.url, - ldnUrl: data.ldnUrl, - type: data.type, - enabled: data.enabled - }); + this.handlePatterns(patchOperations, 'notifyServiceInboundPatterns'); + this.handlePatterns(patchOperations, 'notifyServiceOutboundPatterns'); - const inboundPatternsArray = this.formModel.get('notifyServiceInboundPatterns') as FormArray; - inboundPatternsArray.clear(); // Clear existing rows + this.deletedInboundPatterns.forEach(index => { + const removeOperation: Operation = { + op: 'remove', + path: `notifyServiceInboundPatterns[${index}]` + }; + patchOperations.push(removeOperation); + }); - data.notifyServiceInboundPatterns.forEach((pattern: any) => { - console.log(pattern); - const patternFormGroup = this.initializeInboundPatternFormGroup(); - console.log(); - patternFormGroup.patchValue(pattern); - inboundPatternsArray.push(patternFormGroup); - this.cdRef.detectChanges(); - }); + this.deletedOutboundPatterns.forEach(index => { + const removeOperation: Operation = { + op: 'remove', + path: `notifyServiceOutboundPatterns[${index}]` + }; + patchOperations.push(removeOperation); + }); - const outboundPatternsArray = this.formModel.get('notifyServiceOutboundPatterns') as FormArray; - outboundPatternsArray.clear(); + return patchOperations; + } - data.notifyServiceOutboundPatterns.forEach((pattern: any) => { - const patternFormGroup = this.initializeOutboundPatternFormGroup(); - patternFormGroup.patchValue(pattern); - outboundPatternsArray.push(patternFormGroup); + onSubmit() { + this.openConfirmModal(this.confirmModal); + } - this.cdRef.detectChanges(); - }); - this.originalInboundPatterns = [...data.notifyServiceInboundPatterns]; + addInboundPattern() { + const notifyServiceInboundPatternsArray = this.formModel.get('notifyServiceInboundPatterns') as FormArray; + notifyServiceInboundPatternsArray.push(this.createInboundPatternFormGroup()); + } - this.originalOutboundPatterns = [...data.notifyServiceOutboundPatterns]; - }, - (error) => { - console.error('Error fetching service data:', error); + addOutboundPattern() { + const notifyServiceOutboundPatternsArray = this.formModel.get('notifyServiceOutboundPatterns') as FormArray; + notifyServiceOutboundPatternsArray.push(this.createOutboundPatternFormGroup()); + } + + + toggleAutomatic(i: number) { + const automaticControl = this.formModel.get(`notifyServiceInboundPatterns.${i}.automatic`); + if (automaticControl) { + automaticControl.setValue(!automaticControl.value); + } + } + + toggleEnabled() { + const newStatus = !this.formModel.get('enabled').value; + + const patchOperation: Operation = { + op: 'replace', + path: '/enabled', + value: newStatus, + }; + + this.ldnServicesService.patch(this.service, [patchOperation]).pipe( + getFirstCompletedRemoteData() + ).subscribe( + () => { + + this.formModel.get('enabled').setValue(newStatus); + this.cdRef.detectChanges(); } ); } - generatePatchOperations(): any[] { - const patchOperations: any[] = []; - - this.addReplaceOperation(patchOperations, 'name', '/name'); - this.addReplaceOperation(patchOperations, 'description', '/description'); - this.addReplaceOperation(patchOperations, 'ldnUrl', '/ldnurl'); - this.addReplaceOperation(patchOperations, 'url', '/url'); - - this.handlePatterns(patchOperations, 'notifyServiceInboundPatterns'); - - this.handlePatterns(patchOperations, 'notifyServiceOutboundPatterns'); - - return patchOperations; + closeModal() { + this.modalRef.close(); + this.cdRef.detectChanges(); } - private addReplaceOperation(patchOperations: any[], formControlName: string, path: string): void { + openConfirmModal(content) { + this.modalRef = this.modalService.open(content); + } + + openResetFormModal(content) { + this.modalRef = this.modalService.open(content); + } + + patchService() { + this.deleteMarkedInboundPatterns(); + this.deleteMarkedOutboundPatterns(); + const patchOperations = this.generatePatchOperations(); + + + this.ldnServicesService.patch(this.service, patchOperations).pipe( + getFirstCompletedRemoteData() + ).subscribe( + () => { + + this.closeModal(); + this.sendBack(); + this.notificationService.success(this.translateService.get('admin.registries.services-formats.modify.success.head'), + this.translateService.get('admin.registries.services-formats.modify.success.content')); + } + ); + + } + + resetFormAndLeave() { + this.sendBack(); + this.closeModal(); + } + + markForInboundPatternDeletion(index: number) { + if (!this.markedForDeletionInboundPattern.includes(index)) { + this.markedForDeletionInboundPattern.push(index); + } + } + + unmarkForInboundPatternDeletion(index: number) { + const i = this.markedForDeletionInboundPattern.indexOf(index); + if (i !== -1) { + this.markedForDeletionInboundPattern.splice(i, 1); + } + } + + markForOutboundPatternDeletion(index: number) { + if (!this.markedForDeletionOutboundPattern.includes(index)) { + this.markedForDeletionOutboundPattern.push(index); + } + } + + unmarkForOutboundPatternDeletion(index: number) { + const i = this.markedForDeletionOutboundPattern.indexOf(index); + if (i !== -1) { + this.markedForDeletionOutboundPattern.splice(i, 1); + } + } + + deleteMarkedInboundPatterns() { + this.markedForDeletionInboundPattern.sort((a, b) => b - a); + const patternsArray = this.formModel.get('notifyServiceInboundPatterns') as FormArray; + + for (const index of this.markedForDeletionInboundPattern) { + if (index >= 0 && index < patternsArray.length) { + const patternGroup = patternsArray.at(index) as FormGroup; + const patternValue = patternGroup.value; + if (patternValue.isNew) { + patternsArray.removeAt(index); + } else { + this.deletedInboundPatterns.push(index); + } + } + } + + this.markedForDeletionInboundPattern = []; + } + + + deleteMarkedOutboundPatterns() { + this.markedForDeletionOutboundPattern.sort((a, b) => b - a); + const patternsArray = this.formModel.get('notifyServiceOutboundPatterns') as FormArray; + + for (const index of this.markedForDeletionOutboundPattern) { + if (index >= 0 && index < patternsArray.length) { + const patternGroup = patternsArray.at(index) as FormGroup; + const patternValue = patternGroup.value; + if (patternValue.isNew) { + patternsArray.removeAt(index); + } else { + + this.deletedOutboundPatterns.push(index); + } + } + } + + this.markedForDeletionOutboundPattern = []; + } + + private createReplaceOperation(patchOperations: any[], formControlName: string, path: string): void { if (this.formModel.get(formControlName).dirty) { patchOperations.push({ op: 'replace', @@ -185,125 +346,31 @@ export class LdnServiceFormEditComponent { private handlePatterns(patchOperations: any[], formArrayName: string): void { const patternsArray = this.formModel.get(formArrayName) as FormArray; - if (patternsArray.dirty) { - for (let i = 0; i < patternsArray.length; i++) { - const patternGroup = patternsArray.at(i) as FormGroup; - const patternValue = patternGroup.value; + for (let i = 0; i < patternsArray.length; i++) { + const patternGroup = patternsArray.at(i) as FormGroup; + const patternValue = patternGroup.value; + if (patternGroup.dirty) { if (patternValue.isNew) { - console.log(this.getOriginalPatternsForFormArray(formArrayName)); - console.log(patternGroup); - delete patternValue.isNew; + delete patternValue.isNew; const addOperation = { op: 'add', path: `${formArrayName}/-`, value: patternValue, }; patchOperations.push(addOperation); - } else if (patternGroup.dirty) { + } else { const replaceOperation = { op: 'replace', path: `${formArrayName}[${i}]`, value: patternValue, }; patchOperations.push(replaceOperation); - console.log(patternValue.id); } } } } - private getOriginalPatternsForFormArray(formArrayName: string): any[] { - if (formArrayName === 'notifyServiceInboundPatterns') { - return this.originalInboundPatterns; - } else if (formArrayName === 'notifyServiceOutboundPatterns') { - return this.originalOutboundPatterns; - } - return []; - } - - submitForm() { - const apiUrl = `http://localhost:8080/server/api/ldn/ldnservices/${this.serviceId}`; - const patchOperations = this.generatePatchOperations(); - - this.http.patch(apiUrl, patchOperations).subscribe( - (response) => { - console.log('Service updated successfully:', response); - this.sendBack(); - }, - (error) => { - console.error('Error updating service:', error); - } - ); - - } - - - addInboundPattern() { - const notifyServiceInboundPatternsArray = this.formModel.get('notifyServiceInboundPatterns') as FormArray; - notifyServiceInboundPatternsArray.push(this.createInboundPatternFormGroup()); - } - - removeInboundPattern(index: number) { - const notifyServiceInboundPatternsArray = this.formModel.get('notifyServiceInboundPatterns') as FormArray; - if (index >= 0 && index < notifyServiceInboundPatternsArray.length) { - const serviceId = this.formModel.get('id').value; - - const patchOperation = [ - { - op: 'remove', - path: `notifyServiceInboundPatterns[${index}]` - } - ]; - - const apiUrl = `http://localhost:8080/server/api/ldn/ldnservices/${serviceId}`; - - this.http.patch(apiUrl, patchOperation).subscribe( - (response) => { - console.log('Pattern removed successfully:', response); - - notifyServiceInboundPatternsArray.removeAt(index); - }, - (error) => { - console.error('Error removing pattern:', error); - } - ); - } - } - - addOutboundPattern() { - const notifyServiceOutboundPatternsArray = this.formModel.get('notifyServiceOutboundPatterns') as FormArray; - notifyServiceOutboundPatternsArray.push(this.createOutboundPatternFormGroup()); - } - - removeOutboundPattern(index: number) { - const notifyServiceOutboundPatternsArray = this.formModel.get('notifyServiceOutboundPatterns') as FormArray; - if (index >= 0 && index < notifyServiceOutboundPatternsArray.length) { - const serviceId = this.formModel.get('id').value; - - - const patchOperation = [ - { - op: 'remove', - path: `notifyServiceOutboundPatterns[${index}]` - } - ]; - - const apiUrl = `http://localhost:8080/server/api/ldn/ldnservices/${serviceId}`; - - this.http.patch(apiUrl, patchOperation).subscribe( - (response) => { - console.log('Pattern removed successfully:', response); - - notifyServiceOutboundPatternsArray.removeAt(index); - }, - (error) => { - console.error('Error removing pattern:', error); - } - ); - } - } - private sendBack() { this.router.navigateByUrl('admin/ldn/services'); } @@ -320,7 +387,7 @@ export class LdnServiceFormEditComponent { return this.formBuilder.group({ pattern: '', constraint: '', - automatic: '', + automatic: false, isNew: true }); } @@ -339,36 +406,4 @@ export class LdnServiceFormEditComponent { automatic: '', }); } - - toggleAutomatic(i: number) { - const automaticControl = this.formModel.get(`notifyServiceInboundPatterns.${i}.automatic`); - if (automaticControl) { - automaticControl.setValue(!automaticControl.value); - } - } - - toggleEnabled() { - const newStatus = !this.formModel.get('enabled').value; - const serviceId = this.formModel.get('id').value; - const status = this.formModel.get('enabled').value; - - const apiUrl = `http://localhost:8080/server/api/ldn/ldnservices/${serviceId}`; - const patchOperation = { - op: 'replace', - path: '/enabled', - value: newStatus, - }; - - this.http.patch(apiUrl, [patchOperation]).subscribe( - () => { - console.log('Status updated successfully.'); - this.formModel.get('enabled').setValue(newStatus); - console.log(this.formModel.get('enabled')); - this.cdRef.detectChanges(); - }, - (error) => { - console.error('Error updating status:', error); - } - ); - } } diff --git a/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.html b/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.html index d1f13baf32..f1afa886f1 100644 --- a/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.html +++ b/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.html @@ -1,163 +1,266 @@ -
+
+ +
+

{{ 'ldn-create-service.title' | translate }}

+
+ +
+ + +
- -
- - -
+
+   +
-
-   -
+ +
+ + +
- -
- - -
+
+   +
-
-   -
+ +
+ + +
- -
- - -
+
+   +
-
-   -
+ +
+ + +
- -
- - -
+
+   +
-
-   -
- - -
- - - -
- - - + +
+
+
+
+ +
+
+ +
+
+
+
- +
-
- + - -
-
- -
- -
+
+
+ +
+ + +
+ + + +
+ +
+ +
+ +
+ +
+ +
+ + {{ 'ldn-new-service.form.label.addPattern' | translate }} +
+   +
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+ + + + +
+
+ +
+
+ + + +
+ +
+ +
+
+
+
+ +
+ +
+
-
- -
+
- - -
- - {{ 'ldn-new-service.form.label.addPattern' | translate }} - -
-   -
- - -
- - - -
- - - -
- -
- - - - - -
- -
- -
- -
- -
- - {{ 'ldn-new-service.form.label.addPattern' | translate }} + {{ 'ldn-new-service.form.label.addPattern' | translate }} -
-   -
- - +
+   +
+ + + + + +
+ + +
+ + + + +
+
+ + + +
+ + + + +
+
+ + diff --git a/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.scss b/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.scss index 92ac744aed..f0fdcd81a2 100644 --- a/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.scss +++ b/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.scss @@ -1,14 +1,8 @@ form { - display: flex; - flex-direction: column; - align-items: flex-start; max-width: 800px; font-size: 14px; - margin-left: 300px; + position: relative; - & > * { - width: 100%; - } } input[type="text"], @@ -33,12 +27,13 @@ textarea { resize: none; } -.add-pattern-link{ +.add-pattern-link { color: #0048ff; cursor: pointer; margin-left: 10px; } -.remove-pattern-link{ + +.remove-pattern-link { color: #e34949; cursor: pointer; margin-left: 10px; @@ -81,7 +76,6 @@ textarea { } - .toggle-switch .slider { width: 22px; height: 22px; @@ -105,8 +99,31 @@ textarea { cursor: pointer; } - - +.label-box { + margin-left: 11px; +} + +.label-box-2 { + margin-left: 14px; +} + +.label-box-3 { + margin-left: 5px; +} + +form button.btn.btn-primary[type="submit"] { + position: absolute; + bottom: 0; + right: -10px; +} + +.submission-form-footer { + border-radius: var(--bs-card-border-radius); + bottom: 0; + background-color: var(--bs-gray-400); + padding: calc(var(--bs-spacer) / 2); + z-index: var(--ds-submission-footer-z-index); +} diff --git a/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.spec.ts b/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.spec.ts index 3ae834d642..757b617091 100644 --- a/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.spec.ts +++ b/src/app/admin/admin-ldn-services/ldn-service-form/ldn-service-form.component.spec.ts @@ -3,23 +3,23 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { LdnServiceFormComponent } from './ldn-service-form.component'; describe('LdnServiceFormComponent', () => { - let component: LdnServiceFormComponent; - let fixture: ComponentFixture; + let component: LdnServiceFormComponent; + let fixture: ComponentFixture; - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ LdnServiceFormComponent ] - }) - .compileComponents(); - }); + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [LdnServiceFormComponent] + }) + .compileComponents(); + }); - beforeEach(() => { - fixture = TestBed.createComponent(LdnServiceFormComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(LdnServiceFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); 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 608a7ada23..6b908cdae2 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,14 +1,33 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { FormBuilder, FormGroup, Validators, FormArray } from '@angular/forms'; -import { HttpClient } from '@angular/common/http'; +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'; import { LdnServicesService } from '../ldn-services-data/ldn-services-data.service'; -import { LdnServiceConstraint } from '../ldn-services-model/ldn-service-constraint.model'; import { notifyPatterns } from '../ldn-services-patterns/ldn-service-coar-patterns'; -import { LdnDirectoryService } from '../ldn-services-services/ldn-directory.service'; import { LDN_SERVICE } from '../ldn-services-model/ldn-service.resource-type'; import { animate, state, style, transition, trigger } from '@angular/animations'; +import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; +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({ selector: 'ds-ldn-service-form', @@ -16,27 +35,26 @@ import { animate, state, style, transition, trigger } from '@angular/animations' styleUrls: ['./ldn-service-form.component.scss'], animations: [ trigger('toggleAnimation', [ - state('true', style({})), // Define animation states (empty style) + state('true', style({})), state('false', style({})), - transition('true <=> false', animate('300ms ease-in')), // Define animation transition with duration + transition('true <=> false', animate('300ms ease-in')), ]), ], }) export class LdnServiceFormComponent implements OnInit { formModel: FormGroup; - - - - //showItemFilterDropdown = false; - + @ViewChild('confirmModal', {static: true}) confirmModal: TemplateRef; + @ViewChild('resetFormModal', {static: true}) resetFormModal: TemplateRef; public inboundPatterns: object[] = notifyPatterns; public outboundPatterns: object[] = notifyPatterns; - public itemFilterList: LdnServiceConstraint[]; - //additionalOutboundPatterns: FormGroup[] = []; - //additionalInboundPatterns: FormGroup[] = []; - - - //@Input() public status: boolean; + itemfiltersRD$: Observable>>; + config: FindListOptions = Object.assign(new FindListOptions(), { + elementsPerPage: 20 + }); + pageConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'po', + pageSize: 20 + }); @Input() public name: string; @Input() public description: string; @Input() public url: string; @@ -45,21 +63,20 @@ export class LdnServiceFormComponent implements OnInit { @Input() public outboundPattern: string; @Input() public constraint: string; @Input() public automatic: boolean; - @Input() public headerKey: string; - - /* - get notifyServiceInboundPatternsFormArray(): FormArray { - return this.formModel.get('notifyServiceInboundPatterns') as FormArray; - } - */ + @Output() submitForm: EventEmitter = new EventEmitter(); + @Output() cancelForm: EventEmitter = new EventEmitter(); + private modalRef: any; constructor( private ldnServicesService: LdnServicesService, - private ldnDirectoryService: LdnDirectoryService, + private ldnItemfiltersService: LdnItemfiltersService, private formBuilder: FormBuilder, - private http: HttpClient, - private router: Router + private router: Router, + private notificationsService: NotificationsService, + private translateService: TranslateService, + private cdRef: ChangeDetectorRef, + protected modalService: NgbModal, ) { this.formModel = this.formBuilder.group({ @@ -79,16 +96,28 @@ 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(); } - submitForm() { + setItemfilters() { + this.itemfiltersRD$ = this.ldnItemfiltersService.findAll().pipe( + getFirstCompletedRemoteData()); + } + + 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(); @@ -98,31 +127,48 @@ export class LdnServiceFormComponent implements OnInit { const ldnUrl = this.formModel.get('ldnUrl').value; if (!name || !url || !ldnUrl) { + this.closeModal(); return; } - this.formModel.removeControl('inboundPattern'); - this.formModel.removeControl('outboundPattern'); - this.formModel.removeControl('constraintPattern'); - console.log('JSON Data:', this.formModel.value); + const values = this.formModel.value; - const apiUrl = 'http://localhost:8080/server/api/ldn/ldnservices'; + const inboundPatternValue = this.formModel.get('inboundPattern').value; + const outboundPatternValue = this.formModel.get('outboundPattern').value; + + if (inboundPatternValue === '') { + values.notifyServiceInboundPatterns = []; + } + if (outboundPatternValue === '') { + values.notifyServiceOutboundPatterns = []; + } + + const ldnServiceData = this.ldnServicesService.create(values); + + ldnServiceData.pipe( + getFirstCompletedRemoteData() + ).subscribe((rd: RemoteData) => { + if (rd.hasSucceeded) { + this.notificationsService.success(this.translateService.get('ldn-service-notification.created.success.title'), + this.translateService.get('ldn-service-notification.created.success.body')); - this.http.post(apiUrl, this.formModel.value).subscribe( - (response) => { - console.log('Service created successfully:', response); - this.formModel.reset(); this.sendBack(); - }, - (error) => { - console.error('Error creating service:', error); + this.closeModal(); + } else { + this.notificationsService.error(this.translateService.get('notification.created.failure')); } - ); + }); } - private sendBack() { - this.router.navigateByUrl('admin/ldn/services'); + resetFormAndLeave() { + this.sendBack(); + this.closeModal(); + } + + closeModal() { + this.modalRef.close(); + this.cdRef.detectChanges(); } addInboundPattern() { @@ -130,9 +176,9 @@ export class LdnServiceFormComponent implements OnInit { notifyServiceInboundPatternsArray.push(this.createInboundPatternFormGroup()); } - removeInboundPattern(patternGroup: FormGroup) { + removeInboundPattern(index: number) { const notifyServiceInboundPatternsArray = this.formModel.get('notifyServiceInboundPatterns') as FormArray; - notifyServiceInboundPatternsArray.removeAt(notifyServiceInboundPatternsArray.controls.indexOf(patternGroup)); + notifyServiceInboundPatternsArray.removeAt(index); } addOutboundPattern() { @@ -140,11 +186,23 @@ export class LdnServiceFormComponent implements OnInit { notifyServiceOutboundPatternsArray.push(this.createOutboundPatternFormGroup()); } - removeOutboundPattern(patternGroup: FormGroup) { + removeOutboundPattern(index: number) { const notifyServiceOutboundPatternsArray = this.formModel.get('notifyServiceOutboundPatterns') as FormArray; - notifyServiceOutboundPatternsArray.removeAt(notifyServiceOutboundPatternsArray.controls.indexOf(patternGroup)); + notifyServiceOutboundPatternsArray.removeAt(index); } + toggleAutomatic(i: number) { + const automaticControl = this.formModel.get(`notifyServiceInboundPatterns.${i}.automatic`); + if (automaticControl) { + automaticControl.setValue(!automaticControl.value); + } + } + + private sendBack() { + this.router.navigateByUrl('admin/ldn/services'); + } + + private createOutboundPatternFormGroup(): FormGroup { return this.formBuilder.group({ pattern: [''], @@ -160,12 +218,5 @@ export class LdnServiceFormComponent implements OnInit { }); } - toggleAutomatic(i: number) { - const automaticControl = this.formModel.get(`notifyServiceInboundPatterns.${i}.automatic`); - if (automaticControl) { - automaticControl.setValue(!automaticControl.value); - } - } - } diff --git a/src/app/admin/admin-ldn-services/ldn-service-new/ldn-service-new.component.spec.ts b/src/app/admin/admin-ldn-services/ldn-service-new/ldn-service-new.component.spec.ts index 4994823004..d49d393195 100644 --- a/src/app/admin/admin-ldn-services/ldn-service-new/ldn-service-new.component.spec.ts +++ b/src/app/admin/admin-ldn-services/ldn-service-new/ldn-service-new.component.spec.ts @@ -3,23 +3,23 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { LdnServiceNewComponent } from './ldn-service-new.component'; describe('LdnServiceNewComponent', () => { - let component: LdnServiceNewComponent; - let fixture: ComponentFixture; + let component: LdnServiceNewComponent; + let fixture: ComponentFixture; - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ LdnServiceNewComponent ] - }) - .compileComponents(); - }); + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [LdnServiceNewComponent] + }) + .compileComponents(); + }); - beforeEach(() => { - fixture = TestBed.createComponent(LdnServiceNewComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(LdnServiceNewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); diff --git a/src/app/admin/admin-ldn-services/ldn-service-new/ldn-service-new.component.ts b/src/app/admin/admin-ldn-services/ldn-service-new/ldn-service-new.component.ts index daf1653cd1..e92c06dc26 100644 --- a/src/app/admin/admin-ldn-services/ldn-service-new/ldn-service-new.component.ts +++ b/src/app/admin/admin-ldn-services/ldn-service-new/ldn-service-new.component.ts @@ -4,25 +4,24 @@ import { LdnService } from "../ldn-services-model/ldn-services.model"; import { ActivatedRoute } from "@angular/router"; import { ProcessDataService } from "../../../core/data/processes/process-data.service"; import { LinkService } from "../../../core/cache/builders/link.service"; -import { getFirstSucceededRemoteDataPayload } from "../../../core/shared/operators"; @Component({ - selector: 'ds-ldn-service-new', - templateUrl: './ldn-service-new.component.html', - styleUrls: ['./ldn-service-new.component.scss'] + selector: 'ds-ldn-service-new', + templateUrl: './ldn-service-new.component.html', + styleUrls: ['./ldn-service-new.component.scss'] }) export class LdnServiceNewComponent implements OnInit { - /** - * Emits preselected process if there is one - */ - ldnService$?: Observable; + /** + * Emits preselected process if there is one + */ + ldnService$?: Observable; - constructor(private route: ActivatedRoute, private processService: ProcessDataService, private linkService: LinkService) { - } + constructor(private route: ActivatedRoute, private processService: ProcessDataService, private linkService: LinkService) { + } - /** - * If there's an id parameter, use this the process with this identifier as presets for the form - */ - ngOnInit() { - } + /** + * If there's an id parameter, use this the process with this identifier as presets for the form + */ + ngOnInit() { + } } diff --git a/src/app/admin/admin-ldn-services/ldn-service-serviceMock/ldnServicesRD$-mock.ts b/src/app/admin/admin-ldn-services/ldn-service-serviceMock/ldnServicesRD$-mock.ts index fccb374b5f..b1a954b9d6 100644 --- a/src/app/admin/admin-ldn-services/ldn-service-serviceMock/ldnServicesRD$-mock.ts +++ b/src/app/admin/admin-ldn-services/ldn-service-serviceMock/ldnServicesRD$-mock.ts @@ -37,8 +37,6 @@ export const mockLdnService: LdnService = { }; - - const mockLdnServices = { payload: { elementsPerPage: 20, @@ -52,7 +50,7 @@ const mockLdnServices = { page: [mockLdnService], type: LDN_SERVICE, self: undefined, - getPageLength: function() { + getPageLength: function () { return this.page.length; }, _links: { @@ -67,7 +65,5 @@ const mockLdnServices = { }; - - // Create a mock ldnServicesRD$ observable export const mockLdnServicesRD$: Observable>> = of((mockLdnServices as unknown) as RemoteData>); 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..babb00c959 --- /dev/null +++ b/src/app/admin/admin-ldn-services/ldn-services-data/ldn-itemfilters-data.service.ts @@ -0,0 +1,47 @@ +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 43755adb3c..35f9bee04f 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 @@ -1,4 +1,4 @@ - import { Injectable } from '@angular/core'; +import { Injectable } from '@angular/core'; import { dataService } from '../../../core/data/base/data-service.decorator'; import { LDN_SERVICE } from '../ldn-services-model/ldn-service.resource-type'; import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service'; @@ -19,72 +19,108 @@ import { map, take } from 'rxjs/operators'; import { URLCombiner } from '../../../core/url-combiner/url-combiner'; import { MultipartPostRequest } from '../../../core/data/request.models'; import { RestRequest } from '../../../core/data/rest-request.model'; -import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; -import { hasValue } from '../../../shared/empty.util'; + import { LdnService } from '../ldn-services-model/ldn-services.model'; -import { LdnServiceConstraint } from '../ldn-services-model/ldn-service-constraint.model'; +import { PatchData, PatchDataImpl } from '../../../core/data/base/patch-data'; +import { ChangeAnalyzer } from '../../../core/data/change-analyzer'; +import { Operation } from 'fast-json-patch'; +import { RestRequestMethod } from 'src/app/core/data/rest-request-method'; +import { CreateData, CreateDataImpl } from '../../../core/data/base/create-data'; +import { ldnServiceConstrain } from '../ldn-services-model/ldn-service.constrain.model'; +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 { - private findAllData: FindAllDataImpl; // Corrected the type - private deleteData: DeleteDataImpl; // Corrected the type +export class LdnServicesService extends IdentifiableDataService implements FindAllData, DeleteData, PatchData, CreateData { + createData: CreateDataImpl; + private findAllData: FindAllDataImpl; + private deleteData: DeleteDataImpl; + private patchData: PatchDataImpl; + private comparator: ChangeAnalyzer; - constructor( - protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected objectCache: ObjectCacheService, - protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - ) { - super('ldnservices', requestService, rdbService, objectCache, halService); + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + ) { + super('ldnservices', requestService, rdbService, objectCache, halService); - this.findAllData = new FindAllDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); - this.deleteData = new DeleteDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive, this.constructIdEndpoint); - } + this.findAllData = new FindAllDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.responseMsToLive); + this.deleteData = new DeleteDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive, this.constructIdEndpoint); + this.patchData = new PatchDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, this.comparator, this.responseMsToLive, this.constructIdEndpoint); + this.createData = new CreateDataImpl(this.linkPath, requestService, rdbService, objectCache, halService, notificationsService, this.responseMsToLive); + } - findAll(options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { - return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); - } - public delete(objectId: string, copyVirtualMetadata?: string[]): Observable> { - return this.deleteData.delete(objectId, copyVirtualMetadata); - } + create(object: LdnService): Observable> { + return this.createData.create(object); + } - public deleteByHref(href: string, copyVirtualMetadata?: string[]): Observable> { - return this.deleteData.deleteByHref(href, copyVirtualMetadata); - } + patch(object: LdnService, operations: Operation[]): Observable> { + return this.patchData.patch(object, operations); + } - public invoke(serviceName: string, parameters: LdnServiceConstraint[], files: File[]): Observable> { - const requestId = this.requestService.generateRequestId(); - this.getBrowseEndpoint().pipe( - take(1), - map((endpoint: string) => new URLCombiner(endpoint, serviceName, 'processes').toString()), - map((endpoint: string) => { - const body = this.getInvocationFormData(parameters, files); - return new MultipartPostRequest(requestId, endpoint, body); - }) - ).subscribe((request: RestRequest) => this.requestService.send(request)); + update(object: LdnService): Observable> { + return this.patchData.update(object); + } - return this.rdbService.buildFromRequestUUID(requestId); - } + commitUpdates(method?: RestRequestMethod): void { + return this.patchData.commitUpdates(method); + } - private getInvocationFormData(constrain: LdnServiceConstraint[], files: File[]): FormData { - const form: FormData = new FormData(); - form.set('properties', JSON.stringify(constrain)); - files.forEach((file: File) => { - form.append('file', file); - }); - return form; - } + createPatchFromCache(object: LdnService): Observable { + return this.patchData.createPatchFromCache(object); + } - public ldnServiceWithNameExistsAndCanExecute(scriptName: string): Observable { - return this.findById(scriptName).pipe( - getFirstCompletedRemoteData(), - map((rd: RemoteData) => { - return hasValue(rd.payload); - }), - ); - } + findAll(options?: FindListOptions, useCachedVersionIfAvailable?: boolean, reRequestOnStale?: boolean, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.findAllData.findAll(options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); + } + + public delete(objectId: string, copyVirtualMetadata?: string[]): Observable> { + return this.deleteData.delete(objectId, copyVirtualMetadata); + } + + public deleteByHref(href: string, copyVirtualMetadata?: string[]): Observable> { + return this.deleteData.deleteByHref(href, copyVirtualMetadata); + } + + public invoke(serviceName: string, serviceId: string, parameters: ldnServiceConstrain[], files: File[]): Observable> { + const requestId = this.requestService.generateRequestId(); + this.getBrowseEndpoint().pipe( + take(1), + map((endpoint: string) => new URLCombiner(endpoint, serviceName, 'processes', serviceId).toString()), + map((endpoint: string) => { + const body = this.getInvocationFormData(parameters, files); + return new MultipartPostRequest(requestId, endpoint, body); + }) + ).subscribe((request: RestRequest) => this.requestService.send(request)); + + return this.rdbService.buildFromRequestUUID(requestId); + } + + public ldnServiceWithNameExistsAndCanExecute(scriptName: string): Observable { + return this.findById(scriptName).pipe( + getFirstCompletedRemoteData(), + map((rd: RemoteData) => { + return hasValue(rd.payload); + }), + ); + } + + private getInvocationFormData(constrain: ldnServiceConstrain[], files: File[]): FormData { + const form: FormData = new FormData(); + form.set('properties', JSON.stringify(constrain)); + files.forEach((file: File) => { + form.append('file', file); + }); + return form; + } } diff --git a/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.html b/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.html index e3795d6e96..45c2106468 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.html +++ b/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.html @@ -15,32 +15,34 @@
- - - - - - + + + + + + - + @@ -70,7 +72,8 @@
-
diff --git a/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.spec.ts b/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.spec.ts index bedcabb271..0999c82c19 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.spec.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-directory/ldn-services-directory.component.spec.ts @@ -3,23 +3,23 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ServicesDirectoryComponent } from './services-directory.component'; describe('ServicesDirectoryComponent', () => { - let component: ServicesDirectoryComponent; - let fixture: ComponentFixture; + let component: ServicesDirectoryComponent; + let fixture: ComponentFixture; - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ ServicesDirectoryComponent ] - }) - .compileComponents(); - }); + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ServicesDirectoryComponent] + }) + .compileComponents(); + }); - beforeEach(() => { - fixture = TestBed.createComponent(ServicesDirectoryComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + beforeEach(() => { + fixture = TestBed.createComponent(ServicesDirectoryComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - it('should create', () => { - expect(component).toBeTruthy(); - }); + it('should create', () => { + expect(component).toBeTruthy(); + }); }); 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 9d19ad56c7..3db9231ac2 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 @@ -1,25 +1,38 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core'; -import { LdnDirectoryService } from '../ldn-services-services/ldn-directory.service'; +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + OnDestroy, + OnInit, + TemplateRef, + ViewChild +} from '@angular/core'; import { Observable, Subscription } from 'rxjs'; import { RemoteData } from '../../../core/data/remote-data'; 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 { HttpClient } from '@angular/common/http'; +import { Operation } from 'fast-json-patch'; +import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { TranslateService } from '@ngx-translate/core'; + + @Component({ selector: 'ds-ldn-services-directory', templateUrl: './ldn-services-directory.component.html', styleUrls: ['./ldn-services-directory.component.scss'], + changeDetection: ChangeDetectionStrategy.Default }) export class LdnServicesOverviewComponent implements OnInit, OnDestroy { - selectedServiceId: number | null = null; + selectedServiceId: string | number | null = null; servicesData: any[] = []; @ViewChild('deleteModal', {static: true}) deleteModal: TemplateRef; ldnServicesRD$: Observable>>; @@ -33,39 +46,27 @@ export class LdnServicesOverviewComponent implements OnInit, OnDestroy { isProcessingSub: Subscription; private modalRef: any; + constructor( - protected processLdnService: LdnServicesService, + protected ldnServicesService: LdnServicesService, protected paginationService: PaginationService, protected modalService: NgbModal, - public ldnDirectoryService: LdnDirectoryService, - private http: HttpClient, - private cdRef: ChangeDetectorRef + private cdRef: ChangeDetectorRef, + private notificationService: NotificationsService, + private translateService: TranslateService, ) { } ngOnInit(): void { - /*this.ldnDirectoryService.listLdnServices();*/ - this.findAllServices(); this.setLdnServices(); - /*this.ldnServicesRD$.subscribe(data => { - console.log('searchByLdnUrl()', data); - });*/ - - /*this.ldnServicesRD$.pipe( - tap(data => { - console.log('ldnServicesRD$ data:', data); - }) - ).subscribe(() => { - this.searchByLdnUrl(); - });*/ - } setLdnServices() { this.ldnServicesRD$ = this.paginationService.getFindListOptions(this.pageConfig.id, this.config).pipe( - switchMap((config) => this.processLdnService.findAll(config, true, false)) + switchMap((config) => this.ldnServicesService.findAll(config, false, false).pipe( + getFirstCompletedRemoteData() + )) ); - console.log(); } ngOnDestroy(): void { @@ -84,80 +85,62 @@ export class LdnServicesOverviewComponent implements OnInit, OnDestroy { this.cdRef.detectChanges(); } - - findAllServices(): void { - this.retrieveAll().subscribe( - (response) => { - this.servicesData = response._embedded.ldnservices; - console.log('ServicesData =', this.servicesData); - this.cdRef.detectChanges(); - }, - (error) => { - console.error('Error:', error); - } - ); - } - - retrieveAll(): Observable { - const url = 'http://localhost:8080/server/api/ldn/ldnservices'; - return this.http.get(url); - } - - - - - deleteSelected() { - if (this.selectedServiceId !== null) { - const deleteUrl = `http://localhost:8080/server/api/ldn/ldnservices/${this.selectedServiceId}`; - this.http.delete(deleteUrl).subscribe( - () => { - this.closeModal(); - this.findAllServices(); - }, - (error) => { - console.error('Error deleting service:', error); - } - ); - } - } - selectServiceToDelete(serviceId: number) { this.selectedServiceId = serviceId; this.openDeleteModal(this.deleteModal); } - toggleStatus(ldnService: any): void { - const newStatus = !ldnService.enabled; + deleteSelected(serviceId: string, ldnServicesService: LdnServicesService): void { + if (this.selectedServiceId !== null) { + 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('ldn-service-delete.notification.success.title'), + this.translateService.get('ldn-service-delete.notification.success.content')); + } else { + this.notificationService.error(this.translateService.get('ldn-service-delete.notification.error.title'), + this.translateService.get('ldn-service-delete.notification.error.content')); + this.cdRef.detectChanges(); + } + }); + } + } - const apiUrl = `http://localhost:8080/server/api/ldn/ldnservices/${ldnService.id}`; - const patchOperation = { + + toggleStatus(ldnService: any, ldnServicesService: LdnServicesService): void { + const newStatus = !ldnService.enabled; + const originalStatus = ldnService.enabled; + + const patchOperation: Operation = { op: 'replace', path: '/enabled', value: newStatus, }; - this.http.patch(apiUrl, [patchOperation]).subscribe( - () => { - console.log('Status updated successfully.'); - ldnService.enabled = newStatus; - this.cdRef.detectChanges(); - }, - (error) => { - console.error('Error updating status:', error); + ldnServicesService.patch(ldnService, [patchOperation]).pipe(getFirstCompletedRemoteData()).subscribe( + (rd: RemoteData) => { + if (rd.hasSucceeded) { + ldnService.enabled = newStatus; + this.notificationService.success(this.translateService.get('ldn-enable-service.notification.success.title'), + this.translateService.get('ldn-enable-service.notification.success.content')); + } else { + ldnService.enabled = originalStatus; + this.notificationService.error(this.translateService.get('ldn-enable-service.notification.error.title'), + this.translateService.get('ldn-enable-service.notification.error.content')); + } } ); } - fetchServiceData(serviceId: string): void { - const apiUrl = `http://localhost:8080/server/api/ldn/ldnservices/${serviceId}`; - this.http.get(apiUrl).subscribe( - (data: any) => { - console.log(data); - }, - (error) => { - console.error('Error fetching service data:', error); - } - ); - } } diff --git a/src/app/admin/admin-ldn-services/ldn-services-guard/ldn-services-guard.service.ts b/src/app/admin/admin-ldn-services/ldn-services-guard/ldn-services-guard.service.ts deleted file mode 100644 index 85235b4370..0000000000 --- a/src/app/admin/admin-ldn-services/ldn-services-guard/ldn-services-guard.service.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; - -@Injectable({ - providedIn: 'root' -}) -export class LdnServicesGuard implements CanActivate { - - constructor( - //private notifyInfoService: NotifyInfoService, - private router: Router - ) {} - canActivate( - route: ActivatedRouteSnapshot, - state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { - return true; - /*return this.notifyInfoService.isCoarConfigEnabled().pipe( - map(coarLdnEnabled => { - if (coarLdnEnabled) { - return true; - } else { - return this.router.parseUrl('/404'); - } - }) - );*/ - } -} diff --git a/src/app/admin/admin-ldn-services/ldn-services-guard/ldn-services.guard.spec.ts b/src/app/admin/admin-ldn-services/ldn-services-guard/ldn-services.guard.spec.ts deleted file mode 100644 index 30af31cab8..0000000000 --- a/src/app/admin/admin-ldn-services/ldn-services-guard/ldn-services.guard.spec.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { LdnServicesGuard } from './ldn-services-guard.service'; - -describe('LdnServicesGuard', () => { - let guard: LdnServicesGuard; - - beforeEach(() => { - TestBed.configureTestingModule({}); - guard = TestBed.inject(LdnServicesGuard); - }); - - it('should be created', () => { - // @ts-ignore - expect(guard).toBeTruthy(); - }); -}); diff --git a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-constraint.model.ts b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-constraint.model.ts deleted file mode 100644 index 704a3e7d8c..0000000000 --- a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-constraint.model.ts +++ /dev/null @@ -1,26 +0,0 @@ - -/** - * A cosntrain that can be used when running a service - */ -export class LdnServiceConstraint { - /** - * The name of the constrain - */ - name: string; - - /** - * The value of the constrain - */ - value: string; -} - -export const EndorsmentConstrain = [ - { - name: 'Type 1 Item', - value: 'Type1' - }, - { - name: 'Type 2 Item', - value: 'Type2' - }, -]; 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..6aceada3df --- /dev/null +++ b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-itemfilters.ts @@ -0,0 +1,31 @@ +import { autoserialize, deserialize, inheritSerialization } from 'cerialize'; +import { LDN_SERVICE_CONSTRAINT_FILTER } from './ldn-service.resource-type'; +import { CacheableObject } from '../../../core/cache/cacheable-object.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-patterns.model.ts b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-patterns.model.ts new file mode 100644 index 0000000000..1103056e47 --- /dev/null +++ b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-patterns.model.ts @@ -0,0 +1,13 @@ +import { autoserialize } from 'cerialize'; + +/** + * notify service patterns + */ +export class NotifyServicePattern { + @autoserialize + pattern: string; + @autoserialize + constraint: string; + @autoserialize + automatic: string; +} diff --git a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-status.model.ts b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-status.model.ts index 040e4d37b8..d9e45d91a9 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-status.model.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service-status.model.ts @@ -2,7 +2,7 @@ * List of services statuses */ export enum LdnServiceStatus { - UNKOWN, - DISABLED, - ENABLED, + UNKOWN, + DISABLED, + ENABLED, } diff --git a/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service.constrain.model.ts b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service.constrain.model.ts new file mode 100644 index 0000000000..69a9baf273 --- /dev/null +++ b/src/app/admin/admin-ldn-services/ldn-services-model/ldn-service.constrain.model.ts @@ -0,0 +1,3 @@ +export class ldnServiceConstrain { + void: any; +} 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 937fac255d..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 @@ -6,4 +6,7 @@ */ import { ResourceType } from '../../../core/shared/resource-type'; -export const LDN_SERVICE = new ResourceType('ldnservices'); +export const LDN_SERVICE = 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 bdb8bc5123..8631ef2451 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 @@ -1,12 +1,15 @@ import { ResourceType } from '../../../core/shared/resource-type'; import { CacheableObject } from '../../../core/cache/cacheable-object.model'; -import { autoserialize, deserialize } from 'cerialize'; +import { autoserialize, deserialize, deserializeAs, inheritSerialization } from 'cerialize'; import { LDN_SERVICE } from './ldn-service.resource-type'; import { excludeFromEquals } from '../../../core/utilities/equals.decorators'; import { typedObject } from '../../../core/cache/builders/build-decorators'; +import { NotifyServicePattern } from './ldn-service-patterns.model'; +/** An LdnService and its properties. */ @typedObject +@inheritSerialization(CacheableObject) export class LdnService extends CacheableObject { static type = LDN_SERVICE; @@ -15,7 +18,10 @@ export class LdnService extends CacheableObject { type: ResourceType; @autoserialize - id?: number; + id: number; + + @deserializeAs('id') + uuid: string; @autoserialize name: string; @@ -26,6 +32,9 @@ export class LdnService extends CacheableObject { @autoserialize url: string; + @autoserialize + enabled: boolean; + @autoserialize ldnUrl: string; @@ -46,13 +55,3 @@ export class LdnService extends CacheableObject { return this._links.self.href; } } - - -class NotifyServicePattern { - @autoserialize - pattern: string; - @autoserialize - constraint?: string; - @autoserialize - automatic?: boolean; -} diff --git a/src/app/admin/admin-ldn-services/ldn-services-patterns/ldn-service-coar-patterns.ts b/src/app/admin/admin-ldn-services/ldn-services-patterns/ldn-service-coar-patterns.ts index 14d227c131..7b0c25e832 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-patterns/ldn-service-coar-patterns.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-patterns/ldn-service-coar-patterns.ts @@ -67,7 +67,3 @@ export const notifyPatterns = [ ]; -const pattern = notifyPatterns[0]; -console.log(`Pattern Name: ${pattern.name}`); -console.log(`Pattern Description: ${pattern.description}`); -console.log(`Pattern Category: ${pattern.category}`); diff --git a/src/app/admin/admin-ldn-services/ldn-services-services/ldn-directory.service.spec.ts b/src/app/admin/admin-ldn-services/ldn-services-services/ldn-directory.service.spec.ts index e24508e942..ab4f78dc6b 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-services/ldn-directory.service.spec.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-services/ldn-directory.service.spec.ts @@ -3,15 +3,15 @@ import { TestBed } from '@angular/core/testing'; import { LdnDirectoryService } from './ldn-directory.service'; describe('LdnDirectoryService', () => { - let service: LdnDirectoryService; + let service: LdnDirectoryService; - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(LdnDirectoryService); - }); + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(LdnDirectoryService); + }); - it('should be created', () => { - // @ts-ignore - expect(service).toBeTruthy(); - }); + it('should be created', () => { + // @ts-ignore + expect(service).toBeTruthy(); + }); }); 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..92446b4677 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,56 +1,27 @@ 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', + providedIn: 'root', }) export class LdnDirectoryService { - private baseUrl = 'http://localhost:8080/server/api/ldn/ldnservices'; - private itemFilterEndpoint = 'http://localhost:8080/server/api/config/itemfilters'; + 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); - }) - ); - } - - 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); - } + return this.ldnServicesService.findAll().pipe( + map((servicesData) => { + return servicesData; + }) + ); + } } diff --git a/src/app/admin/admin-ldn-services/ldn-services-services/ldn-service-bulk-delete.service.spec.ts b/src/app/admin/admin-ldn-services/ldn-services-services/ldn-service-bulk-delete.service.spec.ts index 38e1a4de2b..922b63a871 100644 --- a/src/app/admin/admin-ldn-services/ldn-services-services/ldn-service-bulk-delete.service.spec.ts +++ b/src/app/admin/admin-ldn-services/ldn-services-services/ldn-service-bulk-delete.service.spec.ts @@ -3,15 +3,15 @@ import { TestBed } from '@angular/core/testing'; import { LdnServicesBulkDeleteService } from './ldn-service-bulk-delete.service'; describe('LdnServiceBulkDeleteService', () => { - let service: LdnServicesBulkDeleteService; + let service: LdnServicesBulkDeleteService; - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(LdnServicesBulkDeleteService); - }); + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(LdnServicesBulkDeleteService); + }); - it('should be created', () => { - // @ts-ignore - expect(service).toBeTruthy(); - }); + it('should be created', () => { + // @ts-ignore + expect(service).toBeTruthy(); + }); }); diff --git a/src/app/admin/admin-ldn-services/ldn-services-services/ldn-service-bulk-delete.service.ts b/src/app/admin/admin-ldn-services/ldn-services-services/ldn-service-bulk-delete.service.ts deleted file mode 100644 index 6805cd7f93..0000000000 --- a/src/app/admin/admin-ldn-services/ldn-services-services/ldn-service-bulk-delete.service.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { Injectable } from '@angular/core'; -import { BehaviorSubject, count, from } from 'rxjs'; -import { LdnServicesService } from '../ldn-services-data/ldn-services-data.service'; -import { NotificationsService } from '../../../shared/notifications/notifications.service'; -import { TranslateService } from '@ngx-translate/core'; -import { isNotEmpty } from '../../../shared/empty.util'; -import { concatMap, filter, tap } from 'rxjs/operators'; -import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; -import { RemoteData } from '../../../core/data/remote-data'; -import { LdnService } from '../ldn-services-model/ldn-services.model'; -@Injectable({ - providedIn: 'root' -}) -/** - * Service to facilitate removing ldn services in bulk. - */ -export class LdnServicesBulkDeleteService { - - /** - * Array to track the services to be deleted - */ - ldnServicesToDelete: string[] = []; - - /** - * Behavior subject to track whether the delete is processing - * @protected - */ - protected isProcessingBehaviorSubject: BehaviorSubject = new BehaviorSubject(false); - - constructor( - protected processLdnService: LdnServicesService, - protected notificationsService: NotificationsService, - protected translateService: TranslateService - ) { - } - - /** - * Add or remove a process id to/from the list - * If the id is already present it will be removed, otherwise it will be added. - * - * @param notifyServiceName - The process id to add or remove - */ - toggleDelete(notifyServiceName: string) { - if (this.isToBeDeleted(notifyServiceName)) { - this.ldnServicesToDelete.splice(this.ldnServicesToDelete.indexOf(notifyServiceName), 1); - } else { - this.ldnServicesToDelete.push(notifyServiceName); - } - } - - /** - * Checks if the provided service id is present in the to be deleted list - * @param notifyServiceName - */ - isToBeDeleted(notifyServiceName: string) { - return this.ldnServicesToDelete.includes(notifyServiceName); - } - - /** - * Clear the list of services to be deleted - */ - clearAllServices() { - this.ldnServicesToDelete.splice(0); - } - - /** - * Get the amount of processes selected for deletion - */ - getAmountOfSelectedServices() { - return this.ldnServicesToDelete.length; - } - - /** - * Returns a behavior subject to indicate whether the bulk delete is processing - */ - isProcessing$() { - return this.isProcessingBehaviorSubject; - } - - /** - * Returns whether there currently are values selected for deletion - */ - hasSelected(): boolean { - return isNotEmpty(this.ldnServicesToDelete); - } - - /** - * Delete all selected processes one by one - * When the deletion for a process fails, an error notification will be shown with the process id, - * but it will continue deleting the other processes. - * At the end it will show a notification stating the amount of successful deletes - * The successfully deleted processes will be removed from the list of selected values, the failed ones will be retained. - */ - deleteSelectedLdnServices() { - this.isProcessingBehaviorSubject.next(true); - - from([...this.ldnServicesToDelete]).pipe( - concatMap((notifyServiceName) => { - return this.processLdnService.delete(notifyServiceName).pipe( - getFirstCompletedRemoteData(), - tap((rd: RemoteData) => { - if (rd.hasFailed) { - this.notificationsService.error(this.translateService.get('process.bulk.delete.error.head'), this.translateService.get('process.bulk.delete.error.body', {processId: notifyServiceName})); - } else { - this.toggleDelete(notifyServiceName); - } - }) - ); - }), - filter((rd: RemoteData) => rd.hasSucceeded), - count(), - ).subscribe((value) => { - this.notificationsService.success(this.translateService.get('process.bulk.delete.success', {count: value})); - this.isProcessingBehaviorSubject.next(false); - }); - } -} diff --git a/src/app/admin/admin-routing-paths.ts b/src/app/admin/admin-routing-paths.ts index df0459ff53..511680bfd8 100644 --- a/src/app/admin/admin-routing-paths.ts +++ b/src/app/admin/admin-routing-paths.ts @@ -4,6 +4,8 @@ import { getAdminModuleRoute } from '../app-routing-paths'; export const REGISTRIES_MODULE_PATH = 'registries'; export const NOTIFICATIONS_MODULE_PATH = 'notifications'; +export const LDN_PATH = 'ldn'; + export function getRegistriesModuleRoute() { return new URLCombiner(getAdminModuleRoute(), REGISTRIES_MODULE_PATH).toString(); } @@ -12,4 +14,8 @@ export function getNotificationsModuleRoute() { return new URLCombiner(getAdminModuleRoute(), NOTIFICATIONS_MODULE_PATH).toString(); } -export const LDN_PATH = 'ldn'; +export function getLdnServicesModuleRoute() { + return new URLCombiner(getAdminModuleRoute(), LDN_PATH).toString(); +} + + diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index e1b1fc8811..88da00f02c 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -188,6 +188,9 @@ import { BulkAccessConditionOptions } from './config/models/bulk-access-conditio import { SuggestionTarget } from './suggestion-notifications/reciter-suggestions/models/suggestion-target.model'; 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 @@ -312,6 +315,7 @@ const PROVIDERS = [ OrcidHistoryDataService, SupervisionOrderDataService, LdnServicesService, + LdnItemfiltersService ]; /** @@ -392,7 +396,10 @@ export const models = ItemRequest, BulkAccessConditionOptions, SuggestionTarget, - SuggestionSource + SuggestionSource, + LdnService, + Itemfilter + ]; @NgModule({ diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 7a68fc60c8..40f0150022 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -917,9 +917,15 @@ "ldn-service.overview.table.clickToEnable": "Click to enable", "ldn-service.overview.table.clickToDisable": "Click to disable", + "ldn-edit-registered-service.title": "Edit Service", + "ldn-create-service.title": "Create service", + "service.overview.create.modal": "Create Service", + "service.overview.create.body": "Please confirm the creation of this service", "ldn-service-status": "Status", + "service.confirm.create": "Create", + "service.refuse.create": "Discard", "ldn-register-new-service.title": "Register a new service", - "ldn-new-service.form.label.submit": "Submit", + "ldn-new-service.form.label.submit": "Save", "ldn-new-service.form.label.name": "Name", "ldn-new-service.form.label.description": "Description", "ldn-new-service.form.label.url": "Service URL", @@ -939,6 +945,24 @@ "ldn-new-service.form.label.removeItemFilter": "Remove", "ldn-register-new-service.breadcrumbs": "New Service", "service.overview.delete.body": "Are you sure you want to delete this service?", + "service.overview.edit.body": "Are you sure you want to confirm those service changes?", + "service.overview.edit.modal": "Edit Service", + "service.detail.update": "Edit Service", + "service.detail.return": "Cancel", + "service.overview.reset-form.body": "Are you sure you want to discard those changes and leave?", + "service.overview.reset-form.modal": "Discard Service Changes", + "service.overview.reset-form.reset-confirm":"Discard", + "admin.registries.services-formats.modify.success.head": "Successful Edit", + "admin.registries.services-formats.modify.success.content": "The service has been edited", + "ldn-service-notification.created.success.title": "Successful Create", + "ldn-service-notification.created.success.body": "The service has been created", + "ldn-enable-service.notification.success.title": "Successful status updated", + "ldn-enable-service.notification.success.content": "The service status has been updated", + "ldn-service-delete.notification.success.title": "Successful Deletion", + "ldn-service-delete.notification.success.content": "The service has been deleted", + "ldn-service-delete.notification.error.title": "Failed Deletion", + "ldn-service-delete.notification.error.content": "The service has not been deleted", + "service.overview.reset-form.reset-return": "Return", "service.overview.delete": "Delete service", "ldn-edit-service.title": "Edit service", "ldn-edit-service.form.label.name": "Name", @@ -954,7 +978,7 @@ "ldn-edit-service.form.label.outboundPattern": "Outbound Pattern", "ldn-edit-service.form.label.noOutboundPatternSelected": "No Outbound Pattern", "ldn-edit-service.form.label.addOutboundPattern": "+ Add more", - "ldn-edit-service.form.label.submit": "Submit", + "ldn-edit-service.form.label.submit": "Save", "ldn-edit-service.breadcrumbs": "Edit Service",
{{ 'service.overview.table.name' | translate }}{{ 'service.overview.table.description' | translate }}{{ 'service.overview.table.status' | translate }}{{ 'service.overview.table.actions' | translate }}
{{ 'service.overview.table.name' | translate }}{{ 'service.overview.table.description' | translate }}{{ 'service.overview.table.status' | translate }}{{ 'service.overview.table.actions' | translate }}
{{ ldnService.name }} {{ ldnService.description }} - + {{ ldnService.enabled ? ('ldn-service.overview.table.enabled' | translate) : ('ldn-service.overview.table.disabled' | translate) }} - - +
+ + +