diff --git a/src/app/appmarket/domains/domains.module.ts b/src/app/appmarket/domains/domains.module.ts index af01e1f53eece3f2c3727782c3e1374a34e36e9c..7d7dbf47029cf6a452720fa33a906f0591408f4b 100644 --- a/src/app/appmarket/domains/domains.module.ts +++ b/src/app/appmarket/domains/domains.module.ts @@ -17,6 +17,7 @@ import { DomainGroupsComponent } from './domain-groups/domain-groups.component'; import { DomainGroupViewComponent } from './domain-group-view/domain-group-view.component'; import {DropdownModule} from 'primeng/dropdown'; import {MultiSelectModule} from 'primeng/multiselect'; +import { RemovalConfirmationModalComponent } from './modals/removal-confirmation-modal/removal-confirmation-modal.component'; @@ -26,6 +27,7 @@ import {MultiSelectModule} from 'primeng/multiselect'; DomainComponent, DomainGroupsComponent, DomainGroupViewComponent, + RemovalConfirmationModalComponent, ], imports: [ CommonModule, diff --git a/src/app/appmarket/domains/list/domainslist.component.html b/src/app/appmarket/domains/list/domainslist.component.html index b3c2136d7f43688b0bce09261a6a9628564d989f..57c5fb47e1c89502cd22c8ef91e94e357c7c07b8 100644 --- a/src/app/appmarket/domains/list/domainslist.component.html +++ b/src/app/appmarket/domains/list/domainslist.component.html @@ -14,7 +14,7 @@ <tbody> <ng-template ngFor let-domain [ngForOf]="domains | async"> - <tr class="clickable" [routerLink]="['view/', domain.id]"> + <tr *ngIf="!domain.deleted" [routerLink]="['view', domain.id]"> <td>{{domain?.codename}}</td> <td>{{domain?.name}}</td> <td><span class="glyphicon glyphicon-ok" *ngIf="domain?.active"></span><span class="glyphicon glyphicon-remove" *ngIf="!(domain?.active)"></span></td> @@ -31,9 +31,12 @@ <li><a *roles="['ROLE_SYSTEM_ADMIN', 'ROLE_OPERATOR']" [routerLink]="['edit/', domain.id]" class="">{{ 'DOMAINS.EDIT_BUTTON' | translate }}</a> </li> - <li><a *roles="['ROLE_SYSTEM_ADMIN']" (click)="changeState(domain)" + <li><a *roles="['ROLE_SYSTEM_ADMIN']" (click)="$event.stopPropagation(); changeState(domain)" class="">{{ getStateLabel(domain?.active) }}</a> </li> + <li><a *roles="['ROLE_SYSTEM_ADMIN']" (click)="$event.stopPropagation(); openRemovalModal(domain)" + class="">{{ 'DOMAINS.DELETE_BUTTON' | translate }}</a> + </li> </ul> </span> </td> @@ -42,3 +45,5 @@ </tbody> </table> </div> + +<app-removal-confirmation-modal [domain]="domainToRemove" (onConfirm)="softRemoveDomain(domainToRemove.id)"></app-removal-confirmation-modal> diff --git a/src/app/appmarket/domains/list/domainslist.component.ts b/src/app/appmarket/domains/list/domainslist.component.ts index d46263a80e087ebd2bcadbac6d4dc9169a33735c..ae21395b6974d8216b80aa78a1e510a3a2433566 100644 --- a/src/app/appmarket/domains/list/domainslist.component.ts +++ b/src/app/appmarket/domains/list/domainslist.component.ts @@ -2,10 +2,14 @@ import {AuthService} from '../../../auth/auth.service'; import {Domain} from '../../../model/domain'; import {Role} from '../../../model/userrole'; import {DomainService} from '../../../service/domain.service'; -import {Component, OnInit} from '@angular/core'; +import {Component, OnInit, ViewChild} from '@angular/core'; import {Observable} from 'rxjs'; import {map} from 'rxjs/operators'; import {TranslateService} from '@ngx-translate/core'; +import {ModalComponent} from "../../../shared"; +import { + RemovalConfirmationModalComponent +} from "../modals/removal-confirmation-modal/removal-confirmation-modal.component"; @Component({ selector: 'app-domains-list', @@ -16,6 +20,11 @@ export class DomainsListComponent implements OnInit { public domains: Observable<Domain[]>; + @ViewChild(RemovalConfirmationModalComponent) + public readonly modal: ModalComponent; + + public domainToRemove: Domain + constructor(protected domainService: DomainService, protected authService: AuthService, public translate: TranslateService) { } @@ -33,7 +42,7 @@ export class DomainsListComponent implements OnInit { } } - protected update(): void { + public update(): void { this.domains = this.getDomainsObservable().pipe( map((domains) => [...domains].sort( (a, b) => { @@ -59,4 +68,15 @@ export class DomainsListComponent implements OnInit { return active ? this.translate.instant('DOMAINS.DISABLE_BUTTON') : this.translate.instant('DOMAINS.ENABLE_BUTTON'); } + public softRemoveDomain(id: number): void { + this.domainService.remove(id, true).subscribe({ + next: () => this.update(), + error: err => console.error(err) + }); + } + + openRemovalModal(domain: Domain) { + this.domainToRemove = domain + this.modal.show() + } } diff --git a/src/app/appmarket/domains/modals/removal-confirmation-modal/removal-confirmation-modal.component.css b/src/app/appmarket/domains/modals/removal-confirmation-modal/removal-confirmation-modal.component.css new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/app/appmarket/domains/modals/removal-confirmation-modal/removal-confirmation-modal.component.html b/src/app/appmarket/domains/modals/removal-confirmation-modal/removal-confirmation-modal.component.html new file mode 100644 index 0000000000000000000000000000000000000000..8d30d18f677de7fbeb197a549e412208fe27ab4f --- /dev/null +++ b/src/app/appmarket/domains/modals/removal-confirmation-modal/removal-confirmation-modal.component.html @@ -0,0 +1,11 @@ +<nmaas-modal styleModal="warning"> + <div class="nmaas-modal-header">{{ 'DOMAIN_DETAILS.MODAL.HEADER' | translate }}</div> + <div class="nmaas-modal-body"> + <p>{{ 'DOMAIN_DETAILS.MODAL.DESCRIPTION' | translate}}</p> + </div> + <div class="nmaas-modal-footer"> + <button role="button" type="button" class="btn btn-success" (click)="removeDomain()">{{ 'DOMAIN_DETAILS.MODAL.BUTTONS.CONFIRM' | translate}}</button> + <button type="button" class="btn btn-primary" (click)="modal.hide()">{{ 'DOMAIN_DETAILS.MODAL.BUTTONS.CANCEL' | translate}}</button> + </div> +</nmaas-modal> + diff --git a/src/app/appmarket/domains/modals/removal-confirmation-modal/removal-confirmation-modal.component.spec.ts b/src/app/appmarket/domains/modals/removal-confirmation-modal/removal-confirmation-modal.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..572ebc13fdfc3bc24101c49b981c45a3ffb49cb9 --- /dev/null +++ b/src/app/appmarket/domains/modals/removal-confirmation-modal/removal-confirmation-modal.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { RemovalConfirmationModalComponent } from './removal-confirmation-modal.component'; + +describe('RemovalConfirmationModalComponent', () => { + let component: RemovalConfirmationModalComponent; + let fixture: ComponentFixture<RemovalConfirmationModalComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ RemovalConfirmationModalComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(RemovalConfirmationModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/appmarket/domains/modals/removal-confirmation-modal/removal-confirmation-modal.component.ts b/src/app/appmarket/domains/modals/removal-confirmation-modal/removal-confirmation-modal.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..07a0b8a7ce950f69e2f9a51587eec220297afeb7 --- /dev/null +++ b/src/app/appmarket/domains/modals/removal-confirmation-modal/removal-confirmation-modal.component.ts @@ -0,0 +1,34 @@ +import {Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core'; +import {ModalComponent} from "../../../../shared"; +import {Domain} from "../../../../model/domain"; +import {DomainService} from "../../../../service"; + +@Component({ + selector: 'app-removal-confirmation-modal', + templateUrl: './removal-confirmation-modal.component.html', + styleUrls: ['./removal-confirmation-modal.component.css'] +}) +export class RemovalConfirmationModalComponent { + + @ViewChild(ModalComponent, { static: true }) + public readonly modal: ModalComponent; + + @Input() + public domain: Domain; + + @Output() + public onConfirm: EventEmitter<void> = new EventEmitter<void>(); + + public show() { + this.modal.show(); + } + + public hide() { + this.modal.hide(); + } + + removeDomain() { + this.onConfirm.emit() + this.hide() + } +} diff --git a/src/app/model/domain.ts b/src/app/model/domain.ts index cb175fb72f246a1c8cb9a392ba526ef2093e4ee4..fca050c4f2cbb89151b8eb68866cfdce52abeb75 100644 --- a/src/app/model/domain.ts +++ b/src/app/model/domain.ts @@ -12,4 +12,5 @@ export class Domain { public domainTechDetails: DomainTechDetails = new DomainTechDetails(); public applicationStatePerDomain: DomainApplicationStatePerDomain[] = []; public groups: DomainGroup[] = []; + public deleted: boolean; } diff --git a/src/app/service/domain.service.ts b/src/app/service/domain.service.ts index e168b8327b11d563b872936c34824d6b6c7551b8..3337b1902762aa14cb17b9662962d0b686c4568c 100644 --- a/src/app/service/domain.service.ts +++ b/src/app/service/domain.service.ts @@ -2,7 +2,7 @@ import {Injectable} from '@angular/core'; import {Observable} from 'rxjs'; import {GenericDataService} from './genericdata.service'; -import {HttpClient} from '@angular/common/http' +import {HttpClient, HttpParams} from '@angular/common/http' import {AppConfigService} from './appconfig.service'; import {Id} from '../model'; @@ -61,8 +61,12 @@ export class DomainService extends GenericDataService { return this.patch<Domain, Id>(this.url + domain.id + '/state?active=' + !domain.active, null); } - public remove(domainId: number): Observable<any> { - return this.delete(this.url + domainId); + public remove(domainId: number, softRemove?: boolean): Observable<any> { + let params = new HttpParams() + if (softRemove !== undefined) { + params = params.append("softRemove", softRemove.toString()) + } + return this.http.delete(this.url + domainId, {params}) } public getMyDomains(): Observable<Domain[]> {