CST-12174 Updated delete services to mark for deletion

This commit is contained in:
Mattia Vianelli
2023-10-24 12:59:21 +02:00
parent 5cca15daec
commit 0963a32081
28 changed files with 1388 additions and 1397 deletions

View File

@@ -13,21 +13,21 @@ import { LdnServiceFormEditComponent } from './ldn-service-form-edit/ldn-service
path: '',
pathMatch: 'full',
component: LdnServicesOverviewComponent,
resolve: { breadcrumb: I18nBreadcrumbResolver },
data: { title: 'ldn-registered-services.title', breadcrumbKey: 'ldn-registered-services.new' },
resolve: {breadcrumb: I18nBreadcrumbResolver},
data: {title: 'ldn-registered-services.title', breadcrumbKey: 'ldn-registered-services.new'},
canActivate: [LdnServicesGuard]
},
{
path: 'new',
resolve: { breadcrumb: I18nBreadcrumbResolver },
resolve: {breadcrumb: I18nBreadcrumbResolver},
component: LdnServiceNewComponent,
data: { title: 'ldn-register-new-service.title', breadcrumbKey: 'ldn-register-new-service' }
data: {title: 'ldn-register-new-service.title', breadcrumbKey: 'ldn-register-new-service'}
},
{
path: 'edit/:serviceId',
resolve: { breadcrumb: I18nBreadcrumbResolver },
resolve: {breadcrumb: I18nBreadcrumbResolver},
component: LdnServiceFormEditComponent,
data: { title: 'ldn-edit-service.title', breadcrumbKey: 'ldn-edit-service' }
data: {title: 'ldn-edit-service.title', breadcrumbKey: 'ldn-edit-service'}
},
]),
]

View File

@@ -10,7 +10,6 @@ import { FormsModule } from '@angular/forms';
import { LdnItemfiltersService } from './ldn-services-data/ldn-itemfilters-data.service';
@NgModule({
imports: [
CommonModule,
@@ -26,4 +25,5 @@ import { LdnItemfiltersService } from './ldn-services-data/ldn-itemfilters-data.
],
providers: [LdnItemfiltersService]
})
export class AdminLdnServicesModule { }
export class AdminLdnServicesModule {
}

View File

@@ -1,5 +1,5 @@
<div class="container">
<form (ngSubmit)="onSubmit()" [formGroup]="formModel">
<form (ngSubmit)="onSubmit()" [formGroup]="formModel">
<div class="d-flex">
<h2 class="flex-grow-1">{{ 'ldn-edit-registered-service.title' | translate }}</h2>
</div>
@@ -84,8 +84,6 @@
<ng-container [formGroupName]="i">
<div [class.marked-for-deletion]="markedForDeletion.includes(i)" class="row mb-1">
<div class="col">
<select #inboundPattern formControlName="pattern" id="additionalInboundPattern{{i}}"
@@ -107,7 +105,8 @@
</div>
<div [style.visibility]="inboundPattern.value ? 'visible' : 'hidden'" class="col-sm1">
<input formControlName="automatic" hidden id="automatic{{i}}" name="automatic{{i}}" type="checkbox">
<input formControlName="automatic" hidden id="automatic{{i}}" name="automatic{{i}}"
type="checkbox">
<div (click)="toggleAutomatic(i)"
[class.checked]="formModel.get('notifyServiceInboundPatterns.' + i + '.automatic').value"
class="toggle-switch">
@@ -117,10 +116,11 @@
<div class="col-sm-1 btn-group">
<button type="button" (click)="markForDeletion(i)" class="btn btn-outline-dark trash-button">
<button (click)="markForDeletion(i)" class="btn btn-outline-dark trash-button" type="button">
<i class="fas fa-trash"></i>
</button>
<button *ngIf="markedForDeletion.includes(i)" type="button" (click)="unmarkForDeletion(i)" class="btn btn-outline-dark undo-button">
<button (click)="unmarkForDeletion(i)" *ngIf="markedForDeletion.includes(i)" class="btn btn-outline-dark undo-button"
type="button">
<i class="fas fa-undo"></i>
</button>
</div>
@@ -186,7 +186,8 @@
</div>
<div class="col-sm-1">
<button type="button" (click)="removeOutboundPattern(i)" class="btn btn-outline-dark trash-button">
<button (click)="removeOutboundPattern(i)" class="btn btn-outline-dark trash-button"
type="button">
<i class="fas fa-trash"></i>
</button>
</div>
@@ -202,17 +203,17 @@
<div class="mb-5">
&nbsp;
</div>
<div class="submission-form-footer mt-1 mb-1 position-sticky" role="group" aria-label="Basic example">
<div aria-label="Basic example" class="submission-form-footer mt-1 mb-1 position-sticky" role="group">
<button class="btn btn-primary" type="submit">
<span><i class="fas fa-save"></i> {{ 'ldn-new-service.form.label.submit' | translate }}</span>
</button>
<div class="d-flex">
<button type="button" class="btn btn-danger" (click)="this.openResetFormModal(this.resetFormModal)">
<button (click)="this.openResetFormModal(this.resetFormModal)" class="btn btn-danger" type="button">
<span><i class="fas fa-trash"></i> {{ 'submission.general.discard.submit' | translate }}</span>
</button>
</div>
</div>
</form>
</form>
</div>
<ng-template #confirmModal>
@@ -264,7 +265,8 @@
</div>
<div class="mt-4">
<button (click)="resetFormAndLeave()"
class="btn btn-primary mr-2 custom-btn" id="reset-confirm">{{ 'service.overview.reset-form.reset-return' | translate }}</button>
class="btn btn-primary mr-2 custom-btn"
id="reset-confirm">{{ 'service.overview.reset-form.reset-return' | translate }}</button>
<button (click)="closeModal()" class="btn btn-danger"
id="reset-delete">{{ 'service.overview.reset-form.reset-confirm' | translate }}
</button>

View File

@@ -27,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;
@@ -75,7 +76,6 @@ textarea {
}
.toggle-switch .slider {
width: 22px;
height: 22px;
@@ -101,16 +101,16 @@ textarea {
margin-right: 3px
}
.label-box{
margin-left:11px;
.label-box {
margin-left: 11px;
}
.label-box-2{
margin-left:14px;
.label-box-2 {
margin-left: 14px;
}
.label-box-3{
margin-left:5px;
.label-box-3 {
margin-left: 5px;
}
form button.btn.btn-primary[type="submit"] {

View File

@@ -8,7 +8,7 @@ describe('LdnServiceFormEditComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ LdnServiceFormEditComponent ]
declarations: [LdnServiceFormEditComponent]
})
.compileComponents();

View File

@@ -56,15 +56,14 @@ export class LdnServiceFormEditComponent implements OnInit {
@Input() public constraint: string;
@Input() public automatic: boolean;
@Input() public headerKey: string;
markedForDeletion: number[] = [];
protected serviceId: string;
private originalInboundPatterns: any[] = [];
private originalOutboundPatterns: any[] = [];
private deletedInboundPatterns: number[] = [];
private deletedOutboundPatterns: number[] = [];
private modalRef: any;
private service: LdnService;
protected serviceId: string;
markedForDeletion: number[] = [];
constructor(
protected ldnServicesService: LdnServicesService,
@@ -111,8 +110,6 @@ export class LdnServiceFormEditComponent implements OnInit {
}
fetchServiceData(serviceId: string): void {
this.ldnServicesService.findById(serviceId).pipe(
getFirstCompletedRemoteData()
@@ -275,15 +272,43 @@ export class LdnServiceFormEditComponent implements OnInit {
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'));
},
(error) => {
this.notificationService.error(this.translateService.get('admin.registries.services-formats.modify.failure.head'),
this.translateService.get('admin.registries.services-formats.modify.failure.content'));
}
);
}
resetFormAndLeave() {
this.sendBack();
this.closeModal();
}
markForDeletion(index: number) {
if (!this.markedForDeletion.includes(index)) {
this.markedForDeletion.push(index);
}
}
unmarkForDeletion(index: number) {
const i = this.markedForDeletion.indexOf(index);
if (i !== -1) {
this.markedForDeletion.splice(i, 1);
}
}
deleteMarkedPatterns() {
this.markedForDeletion.sort((a, b) => b - a);
const patternsArray = this.formModel.get('notifyServiceInboundPatterns') as FormArray;
for (const index of this.markedForDeletion) {
if (index >= 0 && index < patternsArray.length) {
this.deletedInboundPatterns.push(index);
patternsArray.removeAt(index);
}
}
this.markedForDeletion = [];
}
private createReplaceOperation(patchOperations: any[], formControlName: string, path: string): void {
if (this.formModel.get(formControlName).dirty) {
patchOperations.push({
@@ -326,11 +351,6 @@ export class LdnServiceFormEditComponent implements OnInit {
this.router.navigateByUrl('admin/ldn/services');
}
resetFormAndLeave() {
this.sendBack();
this.closeModal();
}
private createOutboundPatternFormGroup(): FormGroup {
return this.formBuilder.group({
pattern: '',
@@ -362,30 +382,4 @@ export class LdnServiceFormEditComponent implements OnInit {
automatic: '',
});
}
markForDeletion(index: number) {
if (!this.markedForDeletion.includes(index)) {
this.markedForDeletion.push(index);
}
}
unmarkForDeletion(index: number) {
const i = this.markedForDeletion.indexOf(index);
if (i !== -1) {
this.markedForDeletion.splice(i, 1);
}
}
deleteMarkedPatterns() {
this.markedForDeletion.sort((a, b) => b - a);
const patternsArray = this.formModel.get('notifyServiceInboundPatterns') as FormArray;
for (const index of this.markedForDeletion) {
if (index >= 0 && index < patternsArray.length) {
this.deletedInboundPatterns.push(index);
patternsArray.removeAt(index);
}
}
this.markedForDeletion = [];
}
}

View File

@@ -1,5 +1,5 @@
<div class="container">
<form (ngSubmit)="onSubmit()" [formGroup]="formModel">
<form (ngSubmit)="onSubmit()" [formGroup]="formModel">
<div class="d-flex">
<h2 class="flex-grow-1">{{ 'ldn-create-service.title' | translate }}</h2>
</div>
@@ -44,7 +44,8 @@
<div class="mb-2">
<label for="ldnUrl">{{ 'ldn-new-service.form.label.ldnUrl' | translate }}</label>
<input [class.invalid-field]="formModel.get('ldnUrl').invalid && formModel.get('ldnUrl').touched"
[placeholder]="'ldn-new-service.form.placeholder.ldnUrl' | translate" formControlName="ldnUrl" id="ldnUrl"
[placeholder]="'ldn-new-service.form.placeholder.ldnUrl' | translate" formControlName="ldnUrl"
id="ldnUrl"
name="ldnUrl"
type="text">
</div>
@@ -96,7 +97,8 @@
</div>
<div [style.visibility]="inboundPattern.value ? 'visible' : 'hidden'" class="col-sm-1">
<input formControlName="automatic" hidden id="automatic{{i}}" name="automatic{{i}}" type="checkbox">
<input formControlName="automatic" hidden id="automatic{{i}}" name="automatic{{i}}"
type="checkbox">
<div (click)="toggleAutomatic(i)"
[class.checked]="formModel.get('notifyServiceInboundPatterns.' + i + '.automatic').value"
class="toggle-switch">
@@ -186,19 +188,19 @@
&nbsp;
</div>
<div class="submission-form-footer mt-1 mb-1 position-sticky" role="group" aria-label="Basic example">
<div aria-label="Basic example" class="submission-form-footer mt-1 mb-1 position-sticky" role="group">
<button class="btn btn-primary" type="submit">
<span><i class="fas fa-save"></i> {{ 'ldn-new-service.form.label.submit' | translate }}</span>
</button>
<div class="d-flex">
<button type="button" class="btn btn-danger" (click)="this.openResetFormModal(this.resetFormModal)">
<button (click)="this.openResetFormModal(this.resetFormModal)" class="btn btn-danger" type="button">
<span><i class="fas fa-trash"></i> {{ 'submission.general.discard.submit' | translate }}</span>
</button>
</div>
</div>
</form>
</form>
</div>
<ng-template #confirmModal>
@@ -250,7 +252,8 @@
</div>
<div class="mt-4">
<button (click)="resetFormAndLeave()"
class="btn btn-primary mr-2 custom-btn" id="reset-confirm">{{ 'service.overview.reset-form.reset-return' | translate }}
class="btn btn-primary mr-2 custom-btn"
id="reset-confirm">{{ 'service.overview.reset-form.reset-return' | translate }}
</button>
<button (click)="closeModal()" class="btn btn-danger"
id="reset-delete">{{ 'service.overview.reset-form.reset-confirm' | translate }}

View File

@@ -27,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;
@@ -75,7 +76,6 @@ textarea {
}
.toggle-switch .slider {
width: 22px;
height: 22px;
@@ -99,21 +99,21 @@ textarea {
cursor: pointer;
}
.label-box{
margin-left:11px;
.label-box {
margin-left: 11px;
}
.label-box-2{
margin-left:14px;
.label-box-2 {
margin-left: 14px;
}
.label-box-3{
margin-left:5px;
.label-box-3 {
margin-left: 5px;
}
form button.btn.btn-primary[type="submit"] {
position: absolute;
bottom: 0px;
bottom: 0;
right: -10px;
}

View File

@@ -8,7 +8,7 @@ describe('LdnServiceFormComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ LdnServiceFormComponent ]
declarations: [LdnServiceFormComponent]
})
.compileComponents();
});

View File

@@ -43,11 +43,8 @@ import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
})
export class LdnServiceFormComponent implements OnInit {
formModel: FormGroup;
private modalRef: any;
@ViewChild('confirmModal', {static: true}) confirmModal: TemplateRef<any>;
@ViewChild('resetFormModal', {static: true}) resetFormModal: TemplateRef<any>;
public inboundPatterns: object[] = notifyPatterns;
public outboundPatterns: object[] = notifyPatterns;
itemfiltersRD$: Observable<RemoteData<PaginatedList<Itemfilter>>>;
@@ -58,9 +55,6 @@ export class LdnServiceFormComponent implements OnInit {
id: 'po',
pageSize: 20
});
@Input() public name: string;
@Input() public description: string;
@Input() public url: string;
@@ -69,10 +63,10 @@ export class LdnServiceFormComponent implements OnInit {
@Input() public outboundPattern: string;
@Input() public constraint: string;
@Input() public automatic: boolean;
@Input() public headerKey: string;
@Output() submitForm: EventEmitter<any> = new EventEmitter();
@Output() cancelForm: EventEmitter<any> = new EventEmitter();
private modalRef: any;
constructor(
private ldnServicesService: LdnServicesService,
@@ -83,7 +77,6 @@ export class LdnServiceFormComponent implements OnInit {
private translateService: TranslateService,
private cdRef: ChangeDetectorRef,
protected modalService: NgbModal,
) {
this.formModel = this.formBuilder.group({
@@ -106,13 +99,10 @@ export class LdnServiceFormComponent implements OnInit {
this.setItemfilters();
}
setItemfilters() {
this.itemfiltersRD$ = this.ldnItemfiltersService.findAll().pipe(
getFirstCompletedRemoteData());
this.itemfiltersRD$.subscribe((rd: RemoteData<PaginatedList<Itemfilter>>) => {
if (rd.hasSucceeded) {
}
});
}
onSubmit() {
@@ -126,6 +116,7 @@ export class LdnServiceFormComponent implements OnInit {
openResetFormModal(content) {
this.modalRef = this.modalService.open(content);
}
createService() {
this.formModel.get('name').markAsTouched();
this.formModel.get('url').markAsTouched();
@@ -212,7 +203,6 @@ export class LdnServiceFormComponent implements OnInit {
}
private createOutboundPatternFormGroup(): FormGroup {
return this.formBuilder.group({
pattern: [''],

View File

@@ -8,7 +8,7 @@ describe('LdnServiceNewComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ LdnServiceNewComponent ]
declarations: [LdnServiceNewComponent]
})
.compileComponents();
});

View File

@@ -4,7 +4,6 @@ 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',

View File

@@ -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<RemoteData<PaginatedList<LdnService>>> = of((mockLdnServices as unknown) as RemoteData<PaginatedList<LdnService>>);

View File

@@ -17,7 +17,6 @@ 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
*/

View File

@@ -106,6 +106,14 @@ export class LdnServicesService extends IdentifiableDataService<LdnService> impl
return this.rdbService.buildFromRequestUUID<LdnService>(requestId);
}
public ldnServiceWithNameExistsAndCanExecute(scriptName: string): Observable<boolean> {
return this.findById(scriptName).pipe(
getFirstCompletedRemoteData(),
map((rd: RemoteData<LdnService>) => {
return hasValue(rd.payload);
}),
);
}
private getInvocationFormData(constrain: ldnServiceConstrain[], files: File[]): FormData {
const form: FormData = new FormData();
@@ -115,13 +123,4 @@ export class LdnServicesService extends IdentifiableDataService<LdnService> impl
});
return form;
}
public ldnServiceWithNameExistsAndCanExecute(scriptName: string): Observable<boolean> {
return this.findById(scriptName).pipe(
getFirstCompletedRemoteData(),
map((rd: RemoteData<LdnService>) => {
return hasValue(rd.payload);
}),
);
}
}

View File

@@ -27,9 +27,9 @@
<td>{{ ldnService.name }}</td>
<td>{{ ldnService.description }}</td>
<td>
<span [ngClass]="{ 'status-enabled': ldnService.enabled, 'status-disabled': !ldnService.enabled }"
class="status-indicator" (click)="toggleStatus(ldnService, ldnServicesService)"
[title]="ldnService.enabled ? ('ldn-service.overview.table.clickToDisable' | translate) : ('ldn-service.overview.table.clickToEnable' | translate)">
<span (click)="toggleStatus(ldnService, ldnServicesService)"
[ngClass]="{ 'status-enabled': ldnService.enabled, 'status-disabled': !ldnService.enabled }" [title]="ldnService.enabled ? ('ldn-service.overview.table.clickToDisable' | translate) : ('ldn-service.overview.table.clickToEnable' | translate)"
class="status-indicator">
{{ ldnService.enabled ? ('ldn-service.overview.table.enabled' | translate) : ('ldn-service.overview.table.disabled' | translate) }}
</span>
</td>
@@ -72,7 +72,8 @@
<div class="mt-4">
<button (click)="closeModal()"
class="btn btn-primary mr-2">{{ 'service.detail.delete.cancel' | translate }}</button>
<button (click)="deleteSelected(this.selectedServiceId.toString(), ldnServicesService)" class="btn btn-danger"
<button (click)="deleteSelected(this.selectedServiceId.toString(), ldnServicesService)"
class="btn btn-danger"
id="delete-confirm">{{ 'service.overview.delete' | translate }}
</button>
</div>

View File

@@ -8,7 +8,7 @@ describe('ServicesDirectoryComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ ServicesDirectoryComponent ]
declarations: [ServicesDirectoryComponent]
})
.compileComponents();
});

View File

@@ -1,4 +1,12 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';
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';
@@ -109,8 +117,6 @@ export class LdnServicesOverviewComponent implements OnInit, OnDestroy {
}
toggleStatus(ldnService: any, ldnServicesService: LdnServicesService): void {
const newStatus = !ldnService.enabled;
const originalStatus = ldnService.enabled;

View File

@@ -11,7 +11,9 @@ export class LdnServicesGuard implements CanActivate {
constructor(
//private notifyInfoService: NotifyInfoService,
private router: Router
) {}
) {
}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {

View File

@@ -1,7 +1,6 @@
import { autoserialize, inheritSerialization, deserialize } from 'cerialize';
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 { 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';

View File

@@ -7,7 +7,6 @@ import { typedObject } from '../../../core/cache/builders/build-decorators';
import { NotifyServicePattern } from './ldn-service-patterns.model';
/** An LdnService and its properties. */
@typedObject
@inheritSerialization(CacheableObject)

View File

@@ -11,7 +11,9 @@ export class LdnDirectoryService {
constructor(private http: HttpClient,
private ldnServicesService: LdnServicesService) {}
private ldnServicesService: LdnServicesService) {
}
public getItemFilters(): Observable<any> {
return this.ldnServicesService.findAll().pipe(