import { IscsiService } from '~/app/shared/api/iscsi.service';
import { ListWithDetails } from '~/app/shared/classes/list-with-details.class';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
import { TableComponent } from '~/app/shared/datatable/table/table.component';
import { CellTemplate } from '~/app/shared/enum/cell-template.enum';
deleteIscsiTargetModal() {
const target_iqn = this.selection.first().target_iqn;
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: $localize`iSCSI target`,
itemNames: [target_iqn],
submitActionObservable: () =>
import { RbdMirroringService } from '~/app/shared/api/rbd-mirroring.service';
import { TableStatusViewCache } from '~/app/shared/classes/table-status-view-cache';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { URLVerbs } from '~/app/shared/constants/app.constants';
import { Icons } from '~/app/shared/enum/icons.enum';
import { CdTableAction } from '~/app/shared/models/cd-table-action';
import { ModalService } from '~/app/shared/services/modal.service';
import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service';
import { PoolEditPeerModalComponent } from '../pool-edit-peer-modal/pool-edit-peer-modal.component';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
const BASE_URL = '/block/mirroring';
@Component({
const poolName = this.selection.first().name;
const peerUUID = this.getPeerUUID();
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
impact: DeletionImpact.high,
itemDescription: $localize`mirror peer`,
itemNames: [`${poolName} (${peerUUID})`],
import { ListWithDetails } from '~/app/shared/classes/list-with-details.class';
import { TableStatus } from '~/app/shared/classes/table-status';
import { ConfirmationModalComponent } from '~/app/shared/components/confirmation-modal/confirmation-modal.component';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
import { TableComponent } from '~/app/shared/datatable/table/table.component';
import { Icons } from '~/app/shared/enum/icons.enum';
import { RbdParentModel } from '../rbd-form/rbd-parent.model';
import { RbdTrashMoveModalComponent } from '../rbd-trash-move-modal/rbd-trash-move-modal.component';
import { RBDImageFormat, RbdModel } from './rbd-model';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
const BASE_URL = 'block/rbd';
@Component({
const imageName = this.selection.first().name;
const imageSpec = new ImageSpec(poolName, namespace, imageName);
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
impact: DeletionImpact.high,
itemDescription: 'RBD',
itemNames: [imageSpec.imageName],
const imageName = this.selection.first().name;
const imageSpec = new ImageSpec(poolName, namespace, imageName);
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: 'RBD',
itemNames: [imageSpec],
actionDescription: 'resync',
this.selection.first().name
);
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
actionDescription: 'remove scheduling on',
itemDescription: $localize`image`,
itemNames: [`${imageName}`],
import { PoolService } from '~/app/shared/api/pool.service';
import { RbdService } from '~/app/shared/api/rbd.service';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
import { Icons } from '~/app/shared/enum/icons.enum';
import { NotificationType } from '~/app/shared/enum/notification-type.enum';
deleteModal() {
const pool = this.selection.first().pool;
const namespace = this.selection.first().namespace;
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: 'Namespace',
itemNames: [`${pool}/${namespace}`],
submitAction: () =>
import { RbdService } from '~/app/shared/api/rbd.service';
import { ComponentsModule } from '~/app/shared/components/components.module';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
import { DataTableModule } from '~/app/shared/datatable/datatable.module';
import { TableActionsComponent } from '~/app/shared/datatable/table-actions/table-actions.component';
TaskListService
]
},
- [CriticalConfirmationModalComponent]
+ [DeleteConfirmationModalComponent]
);
beforeEach(() => {
import { RbdService } from '~/app/shared/api/rbd.service';
import { CdHelperClass } from '~/app/shared/classes/cd-helper.class';
import { ConfirmationModalComponent } from '~/app/shared/components/confirmation-modal/confirmation-modal.component';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
import { CellTemplate } from '~/app/shared/enum/cell-template.enum';
import { CdTableAction } from '~/app/shared/models/cd-table-action';
import { RbdSnapshotFormModalComponent } from '../rbd-snapshot-form/rbd-snapshot-form-modal.component';
import { RbdSnapshotActionsModel } from './rbd-snapshot-actions.model';
import { RbdSnapshotModel } from './rbd-snapshot.model';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
@Component({
selector: 'cd-rbd-snapshot-list',
deleteSnapshotModal() {
const snapshotName = this.selection.selected[0].name;
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
impact: DeletionImpact.high,
itemDescription: $localize`RBD snapshot`,
itemNames: [snapshotName],
import { RbdService } from '~/app/shared/api/rbd.service';
import { TableStatusViewCache } from '~/app/shared/classes/table-status-view-cache';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
import { TableComponent } from '~/app/shared/datatable/table/table.component';
import { CellTemplate } from '~/app/shared/enum/cell-template.enum';
const isExpired = moment().isAfter(expiresAt);
const imageIdSpec = new ImageSpec(poolName, namespace, imageId);
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: 'RBD',
itemNames: [imageIdSpec],
bodyTemplate: this.deleteTpl,
import { CephfsService } from '~/app/shared/api/cephfs.service';
import { TableStatusViewCache } from '~/app/shared/classes/table-status-view-cache';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
import { Icons } from '~/app/shared/enum/icons.enum';
import { NotificationType } from '~/app/shared/enum/notification-type.enum';
evictClientModal() {
const clientId = this.selection.first().id;
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: 'client',
itemNames: [clientId],
actionDescription: 'evict',
import { CephfsService } from '~/app/shared/api/cephfs.service';
import { ConfirmationModalComponent } from '~/app/shared/components/confirmation-modal/confirmation-modal.component';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { FormModalComponent } from '~/app/shared/components/form-modal/form-modal.component';
import { NotificationType } from '~/app/shared/enum/notification-type.enum';
import { CdValidators } from '~/app/shared/forms/cd-validators';
declarations: [CephfsDirectoriesComponent],
providers: [NgbActiveModal]
},
- [CriticalConfirmationModalComponent, FormModalComponent, ConfirmationModalComponent]
+ [DeleteConfirmationModalComponent, FormModalComponent, ConfirmationModalComponent]
);
beforeEach(() => {
expect(tableActions).toEqual({
'create,update,delete': {
actions: ['Create', 'Delete'],
- primary: { multiple: 'Delete', executing: 'Delete', single: 'Delete', no: 'Create' }
+ primary: { multiple: 'Create', executing: 'Delete', single: 'Delete', no: 'Create' }
},
'create,update': {
actions: ['Create'],
},
'create,delete': {
actions: ['Create', 'Delete'],
- primary: { multiple: 'Delete', executing: 'Delete', single: 'Delete', no: 'Create' }
+ primary: { multiple: 'Create', executing: 'Delete', single: 'Delete', no: 'Create' }
},
create: {
actions: ['Create'],
import { CephfsService } from '~/app/shared/api/cephfs.service';
import { ConfirmationModalComponent } from '~/app/shared/components/confirmation-modal/confirmation-modal.component';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { FormModalComponent } from '~/app/shared/components/form-modal/form-modal.component';
import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
import { Icons } from '~/app/shared/enum/icons.enum';
import { NotificationType } from '~/app/shared/enum/notification-type.enum';
import { CdValidators } from '~/app/shared/forms/cd-validators';
}
deleteSnapshotModal() {
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
impact: DeletionImpact.high,
itemDescription: $localize`CephFs Snapshot`,
itemNames: this.snapshot.selection.selected.map((snapshot: CephfsSnapshot) => snapshot.name),
import { CdTableSelection } from '~/app/shared/models/cd-table-selection';
import { SharedModule } from '~/app/shared/shared.module';
import { configureTestBed } from '~/testing/unit-test-helper';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { CephfsVolumeFormComponent } from '../cephfs-form/cephfs-form.component';
import { ModalService } from '~/app/shared/services/modal.service';
import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service';
const callDeletion = () => {
component.removeVolumeModal();
expect(modalRef).toBeTruthy();
- const deletion: CriticalConfirmationModalComponent = modalRef && modalRef.componentInstance;
+ const deletion: DeleteConfirmationModalComponent = modalRef && modalRef.componentInstance;
deletion.submitActionObservable();
};
import { CellTemplate } from '~/app/shared/enum/cell-template.enum';
import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
import { Icons } from '~/app/shared/enum/icons.enum';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { CdTableAction } from '~/app/shared/models/cd-table-action';
import { CdTableColumn } from '~/app/shared/models/cd-table-column';
import { CdTableFetchDataContext } from '~/app/shared/models/cd-table-fetch-data-context';
import { map, switchMap } from 'rxjs/operators';
import { HealthService } from '~/app/shared/api/health.service';
import { CephfsAuthModalComponent } from '~/app/ceph/cephfs/cephfs-auth-modal/cephfs-auth-modal.component';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
const BASE_URL = 'cephfs';
removeVolumeModal() {
const volName = this.selection.first().mdsmap['fs_name'];
- this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalService.show(DeleteConfirmationModalComponent, {
impact: DeletionImpact.high,
itemDescription: 'File System',
itemNames: [volName],
import { NotificationType } from '~/app/shared/enum/notification-type.enum';
import { ActionLabelsI18n, URLVerbs } from '~/app/shared/constants/app.constants';
import { CephfsSnapshotscheduleFormComponent } from '../cephfs-snapshotschedule-form/cephfs-snapshotschedule-form.component';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service';
import { FinishedTask } from '~/app/shared/models/finished-task';
deactivateSnapshotSchedule() {
const { path, start, fs, schedule, subvol, group } = this.selection.first();
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: $localize`snapshot schedule`,
actionDescription: this.actionLabels.DEACTIVATE,
submitActionObservable: () =>
activateSnapshotSchedule() {
const { path, start, fs, schedule, subvol, group } = this.selection.first();
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: $localize`snapshot schedule`,
actionDescription: this.actionLabels.ACTIVATE,
submitActionObservable: () =>
})
?.join('|');
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: $localize`snapshot schedule`,
submitActionObservable: () =>
this.taskWrapper.wrapTaskAroundCall({
import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
import { ModalService } from '~/app/shared/services/modal.service';
import { Permissions } from '~/app/shared/models/permissions';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { FinishedTask } from '~/app/shared/models/finished-task';
import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service';
import { CephfsSubvolumeGroup } from '~/app/shared/models/cephfs-subvolume-group.model';
import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
import _ from 'lodash';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
@Component({
selector: 'cd-cephfs-subvolume-group',
removeSubVolumeModal() {
const name = this.selection.first().name;
- this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalService.show(DeleteConfirmationModalComponent, {
impact: DeletionImpact.high,
itemDescription: 'subvolume group',
itemNames: [name],
import { FormControl } from '@angular/forms';
import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
import { CdForm } from '~/app/shared/forms/cd-form';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { CephfsSubvolumeGroupService } from '~/app/shared/api/cephfs-subvolume-group.service';
import { CephfsSubvolumeGroup } from '~/app/shared/models/cephfs-subvolume-group.model';
import { CephfsMountDetailsComponent } from '../cephfs-mount-details/cephfs-mount-details.component';
import { HealthService } from '~/app/shared/api/health.service';
import _ from 'lodash';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
const DEFAULT_SUBVOLUME_GROUP = '_nogroup';
});
this.errorMessage = '';
this.selectedName = this.selection.first().name;
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
impact: DeletionImpact.high,
actionDescription: 'Remove',
itemNames: [this.selectedName],
import { CdTableSelection } from '~/app/shared/models/cd-table-selection';
import { CdDatePipe } from '~/app/shared/pipes/cd-date.pipe';
import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { FinishedTask } from '~/app/shared/models/finished-task';
import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service';
import { FormModalComponent } from '~/app/shared/components/form-modal/form-modal.component';
import { Validators } from '@angular/forms';
import { CdValidators } from '~/app/shared/forms/cd-validators';
import { DEFAULT_SUBVOLUME_GROUP } from '~/app/shared/constants/cephfs';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
@Component({
selector: 'cd-cephfs-subvolume-snapshots-list',
const subVolumeName = this.activeSubVolumeName;
const subVolumeGroupName = this.activeGroupName;
const fsName = this.fsName;
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
impact: DeletionImpact.high,
actionDescription: 'remove',
itemNames: [snapshotName],
import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
import { NotificationService } from '~/app/shared/services/notification.service';
import { ConfigFormCreateRequestModel } from './configuration-form-create-request.model';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
import { ModalService } from '~/app/shared/services/modal.service';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
const RGW = 'rgw';
}
openCriticalConfirmModal() {
- this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalService.show(DeleteConfirmationModalComponent, {
buttonText: $localize`Force Edit`,
actionDescription: $localize`force edit`,
itemDescription: $localize`configuration`,
import { OrchestratorService } from '~/app/shared/api/orchestrator.service';
import { ListWithDetails } from '~/app/shared/classes/list-with-details.class';
import { ConfirmationModalComponent } from '~/app/shared/components/confirmation-modal/confirmation-modal.component';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { FormModalComponent } from '~/app/shared/components/form-modal/form-modal.component';
import { SelectMessages } from '~/app/shared/components/select/select-messages.model';
import { ActionLabelsI18n, URLVerbs } from '~/app/shared/constants/app.constants';
import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service';
import { URLBuilderService } from '~/app/shared/services/url-builder.service';
import { HostFormComponent } from './host-form/host-form.component';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
const BASE_URL = 'hosts';
deleteAction() {
const hostname = this.selection.first().hostname;
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
impact: DeletionImpact.high,
itemDescription: 'Host',
itemNames: [hostname],
import { OrchestratorService } from '~/app/shared/api/orchestrator.service';
import { OsdService } from '~/app/shared/api/osd.service';
import { ConfirmationModalComponent } from '~/app/shared/components/confirmation-modal/confirmation-modal.component';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { FormModalComponent } from '~/app/shared/components/form-modal/form-modal.component';
import { TableActionsComponent } from '~/app/shared/datatable/table-actions/table-actions.component';
import { CdTableAction } from '~/app/shared/models/cd-table-action';
});
it('opens all critical confirmation modals', () => {
- const modalClass = CriticalConfirmationModalComponent;
+ const modalClass = DeleteConfirmationModalComponent;
mockSafeToDestroy();
expectOpensModal('Mark Lost', modalClass);
expectOpensModal('Purge', modalClass);
import { OsdService } from '~/app/shared/api/osd.service';
import { ListWithDetails } from '~/app/shared/classes/list-with-details.class';
import { ConfirmationModalComponent } from '~/app/shared/components/confirmation-modal/confirmation-modal.component';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { FormModalComponent } from '~/app/shared/components/form-modal/form-modal.component';
import { ActionLabelsI18n, URLVerbs } from '~/app/shared/constants/app.constants';
import { CellTemplate } from '~/app/shared/enum/cell-template.enum';
import { OsdScrubModalComponent } from '../osd-scrub-modal/osd-scrub-modal.component';
import { CdTableFetchDataContext } from '~/app/shared/models/cd-table-fetch-data-context';
import { Osd } from '~/app/shared/models/osd.model';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
const BASE_URL = 'osd';
): void {
check(this.getSelectedOsdIds()).subscribe((result) => {
const osdIds = this.getSelectedOsdIds();
- const modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ const modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
impact: DeletionImpact.high,
itemNames: osdIds,
actionDescription: actionDescription,
import { of } from 'rxjs';
import { PrometheusService } from '~/app/shared/api/prometheus.service';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { TableActionsComponent } from '~/app/shared/datatable/table-actions/table-actions.component';
import { NotificationType } from '~/app/shared/enum/notification-type.enum';
import { Permission } from '~/app/shared/models/permissions';
const expireSilence = () => {
component.expireSilence();
- const deletion: CriticalConfirmationModalComponent = component.modalRef.componentInstance;
+ const deletion: DeleteConfirmationModalComponent = component.modalRef.componentInstance;
// deletion.modalRef = new BsModalRef();
deletion.ngOnInit();
deletion.callSubmitAction();
import { PrometheusListHelper } from '~/app/shared/helpers/prometheus-list-helper';
import { SilenceFormComponent } from '~/app/ceph/cluster/prometheus/silence-form/silence-form.component';
import { PrometheusService } from '~/app/shared/api/prometheus.service';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n, SucceededActionLabelsI18n } from '~/app/shared/constants/app.constants';
import { CellTemplate } from '~/app/shared/enum/cell-template.enum';
import { Icons } from '~/app/shared/enum/icons.enum';
const id = this.selection.first().id;
const i18nSilence = $localize`Silence`;
const applicationName = 'Prometheus';
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: i18nSilence,
itemNames: [id],
actionDescription: this.actionLabels.EXPIRE,
import { CephServiceService } from '~/app/shared/api/ceph-service.service';
import { OrchestratorService } from '~/app/shared/api/orchestrator.service';
import { ListWithDetails } from '~/app/shared/classes/list-with-details.class';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n, URLVerbs } from '~/app/shared/constants/app.constants';
import { TableComponent } from '~/app/shared/datatable/table/table.component';
import { Icons } from '~/app/shared/enum/icons.enum';
import { URLBuilderService } from '~/app/shared/services/url-builder.service';
import { PlacementPipe } from './placement.pipe';
import { ServiceFormComponent } from './service-form/service-form.component';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
const BASE_URL = 'services';
deleteAction() {
const service = this.selection.first();
- this.modalService.show(CriticalConfirmationModalComponent, {
- impact: DeletionImpact.high,
+ this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: $localize`Service`,
itemNames: [service.service_name],
actionDescription: 'delete',
import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
import { Icons } from '~/app/shared/enum/icons.enum';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
import { ModalService } from '~/app/shared/services/modal.service';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { Permission } from '~/app/shared/models/permissions';
import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
import { UpgradeService } from '~/app/shared/api/upgrade.service';
stopUpgradeModal() {
// pause the upgrade meanwhile we get stop confirmation from user
this.pauseUpgrade();
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: 'Upgrade',
actionDescription: 'stop',
submitAction: () => this.stopUpgrade(),
import { NfsService } from '~/app/shared/api/nfs.service';
import { ListWithDetails } from '~/app/shared/classes/list-with-details.class';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
import { TableComponent } from '~/app/shared/datatable/table/table.component';
import { CellTemplate } from '~/app/shared/enum/cell-template.enum';
import { ModalService } from '~/app/shared/services/modal.service';
import { TaskListService } from '~/app/shared/services/task-list.service';
import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
@Component({
selector: 'cd-nfs-list',
const cluster_id = this.selection.first().cluster_id;
const export_id = this.selection.first().export_id;
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
impact: DeletionImpact.high,
itemDescription: $localize`NFS export`,
itemNames: [`${cluster_id}:${export_id}`],
import { CrushRuleService } from '~/app/shared/api/crush-rule.service';
import { ErasureCodeProfileService } from '~/app/shared/api/erasure-code-profile.service';
import { PoolService } from '~/app/shared/api/pool.service';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { SelectBadgesComponent } from '~/app/shared/components/select-badges/select-badges.component';
import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
import { ErasureCodeProfile } from '~/app/shared/models/erasure-code-profile';
{ provide: ActivatedRoute, useValue: { params: of({ name: 'somePoolName' }) } }
]
},
- [CriticalConfirmationModalComponent]
+ [DeleteConfirmationModalComponent]
);
let navigationSpy: jasmine.Spy;
describe('crush rule deletion', () => {
let taskWrapper: TaskWrapperService;
- let deletion: CriticalConfirmationModalComponent;
+ let deletion: DeleteConfirmationModalComponent;
let deleteSpy: jasmine.Spy;
let modalSpy: jasmine.Spy;
describe('ecp deletion', () => {
let taskWrapper: TaskWrapperService;
- let deletion: CriticalConfirmationModalComponent;
+ let deletion: DeleteConfirmationModalComponent;
let deleteSpy: jasmine.Spy;
let modalSpy: jasmine.Spy;
let modal: NgbModalRef;
import { ErasureCodeProfileService } from '~/app/shared/api/erasure-code-profile.service';
import { PoolService } from '~/app/shared/api/pool.service';
import { CrushNodeSelectionClass } from '~/app/shared/classes/crush.node.selection.class';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { SelectOption } from '~/app/shared/components/select/select-option.model';
import { ActionLabelsI18n, URLVerbs } from '~/app/shared/constants/app.constants';
import { Icons } from '~/app/shared/enum/icons.enum';
return;
}
const name = value[nameAttribute];
- this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription,
itemNames: [name],
submitActionObservable: () => {
import { ConfigurationService } from '~/app/shared/api/configuration.service';
import { ErasureCodeProfileService } from '~/app/shared/api/erasure-code-profile.service';
import { PoolService } from '~/app/shared/api/pool.service';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ErasureCodeProfile } from '~/app/shared/models/erasure-code-profile';
import { ExecutingTask } from '~/app/shared/models/executing-task';
import { AuthStorageService } from '~/app/shared/services/auth-storage.service';
const callDeletion = () => {
component.deletePoolModal();
expect(modalRef).toBeTruthy();
- const deletion: CriticalConfirmationModalComponent = modalRef && modalRef.componentInstance;
+ const deletion: DeleteConfirmationModalComponent = modalRef && modalRef.componentInstance;
deletion.submitActionObservable();
};
import { PoolService } from '~/app/shared/api/pool.service';
import { ListWithDetails } from '~/app/shared/classes/list-with-details.class';
import { TableStatusViewCache } from '~/app/shared/classes/table-status-view-cache';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n, URLVerbs } from '~/app/shared/constants/app.constants';
import { TableComponent } from '~/app/shared/datatable/table/table.component';
import { CellTemplate } from '~/app/shared/enum/cell-template.enum';
import { URLBuilderService } from '~/app/shared/services/url-builder.service';
import { Pool } from '../pool';
import { PoolStat, PoolStats } from '../pool-stat';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
const BASE_URL = 'pool';
deletePoolModal() {
const name = this.selection.first().pool_name;
- this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalService.show(DeleteConfirmationModalComponent, {
impact: DeletionImpact.high,
itemDescription: 'Pool',
itemNames: [name],
expect(tableActions).toEqual({
'create,update,delete': {
actions: ['Create', 'Edit', 'Delete'],
- primary: { multiple: 'Delete', executing: 'Edit', single: 'Edit', no: 'Create' }
+ primary: { multiple: 'Create', executing: 'Edit', single: 'Edit', no: 'Create' }
},
'create,update': {
actions: ['Create', 'Edit'],
},
'create,delete': {
actions: ['Create', 'Delete'],
- primary: { multiple: 'Delete', executing: 'Create', single: 'Create', no: 'Create' }
+ primary: { multiple: 'Create', executing: 'Delete', single: 'Delete', no: 'Create' }
},
create: {
actions: ['Create'],
},
'update,delete': {
actions: ['Edit', 'Delete'],
- primary: { multiple: 'Delete', executing: 'Edit', single: 'Edit', no: 'Edit' }
+ primary: { multiple: 'Edit', executing: 'Edit', single: 'Edit', no: 'Edit' }
},
update: {
actions: ['Edit'],
import { RgwBucketService } from '~/app/shared/api/rgw-bucket.service';
import { ListWithDetails } from '~/app/shared/classes/list-with-details.class';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
import { TableComponent } from '~/app/shared/datatable/table/table.component';
import { Icons } from '~/app/shared/enum/icons.enum';
import { ModalService } from '~/app/shared/services/modal.service';
import { URLBuilderService } from '~/app/shared/services/url-builder.service';
import { Bucket } from '../models/rgw-bucket';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
const BASE_URL = 'rgw/bucket';
deleteAction() {
const itemNames = this.selection.selected.map((bucket: any) => bucket['bid']);
- this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: $localize`bucket`,
impact: DeletionImpact.high,
itemNames: itemNames,
import { RgwRealmService } from '~/app/shared/api/rgw-realm.service';
import { RgwZoneService } from '~/app/shared/api/rgw-zone.service';
import { RgwZonegroupService } from '~/app/shared/api/rgw-zonegroup.service';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n, TimerServiceInterval } from '~/app/shared/constants/app.constants';
import { Icons } from '~/app/shared/enum/icons.enum';
import { NotificationType } from '~/app/shared/enum/notification-type.enum';
delete(node: TreeNode) {
if (node.data.type === 'realm') {
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: $localize`${node.data.type} ${node.data.name}`,
itemNames: [`${node.data.name}`],
submitAction: () => {
expect(tableActions).toEqual({
'create,update,delete': {
actions: ['Create', 'Edit', 'Delete'],
- primary: { multiple: 'Delete', executing: 'Edit', single: 'Edit', no: 'Create' }
+ primary: { multiple: 'Create', executing: 'Edit', single: 'Edit', no: 'Create' }
},
'create,update': {
actions: ['Create', 'Edit'],
},
'create,delete': {
actions: ['Create', 'Delete'],
- primary: { multiple: 'Delete', executing: 'Create', single: 'Create', no: 'Create' }
+ primary: { multiple: 'Create', executing: 'Delete', single: 'Delete', no: 'Create' }
},
create: {
actions: ['Create'],
},
'update,delete': {
actions: ['Edit', 'Delete'],
- primary: { multiple: 'Delete', executing: 'Edit', single: 'Edit', no: 'Edit' }
+ primary: { multiple: 'Edit', executing: 'Edit', single: 'Edit', no: 'Edit' }
},
update: {
actions: ['Edit'],
import { RgwUserService } from '~/app/shared/api/rgw-user.service';
import { ListWithDetails } from '~/app/shared/classes/list-with-details.class';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
import { TableComponent } from '~/app/shared/datatable/table/table.component';
import { CellTemplate } from '~/app/shared/enum/cell-template.enum';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
import { Icons } from '~/app/shared/enum/icons.enum';
import { CdTableAction } from '~/app/shared/models/cd-table-action';
import { CdTableColumn } from '~/app/shared/models/cd-table-column';
}
deleteAction() {
- this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalService.show(DeleteConfirmationModalComponent, {
impact: DeletionImpact.high,
itemDescription: this.selection.hasSingleSelection ? $localize`user` : $localize`users`,
itemNames: this.selection.selected.map((user: any) => user['uid']),
import { RoleService } from '~/app/shared/api/role.service';
import { ScopeService } from '~/app/shared/api/scope.service';
import { ListWithDetails } from '~/app/shared/classes/list-with-details.class';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { FormModalComponent } from '~/app/shared/components/form-modal/form-modal.component';
import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
import { CellTemplate } from '~/app/shared/enum/cell-template.enum';
deleteRoleModal() {
const name = this.selection.first().name;
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: 'Role',
itemNames: [name],
submitAction: () => this.deleteRole(name)
import { SettingsService } from '~/app/shared/api/settings.service';
import { UserService } from '~/app/shared/api/user.service';
-import { CriticalConfirmationModalComponent } from '~/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '~/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component';
import { ActionLabelsI18n } from '~/app/shared/constants/app.constants';
import { CellTemplate } from '~/app/shared/enum/cell-template.enum';
-import { DeletionImpact } from '~/app/shared/enum/critical-confirmation-modal-impact.enum';
+import { DeletionImpact } from '~/app/shared/enum/delete-confirmation-modal-impact.enum';
import { Icons } from '~/app/shared/enum/icons.enum';
import { NotificationType } from '~/app/shared/enum/notification-type.enum';
import { CdTableAction } from '~/app/shared/models/cd-table-action';
return;
}
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
impact: DeletionImpact.high,
itemDescription: 'User',
itemNames: [username],
import { ConfigOptionComponent } from './config-option/config-option.component';
import { ConfirmationModalComponent } from './confirmation-modal/confirmation-modal.component';
import { Copy2ClipboardButtonComponent } from './copy2clipboard-button/copy2clipboard-button.component';
-import { CriticalConfirmationModalComponent } from './critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from './delete-confirmation-modal/delete-confirmation-modal.component';
import { CustomLoginBannerComponent } from './custom-login-banner/custom-login-banner.component';
import { DateTimePickerComponent } from './date-time-picker/date-time-picker.component';
import { DocComponent } from './doc/doc.component';
LoadingPanelComponent,
ModalComponent,
NotificationsSidebarComponent,
- CriticalConfirmationModalComponent,
+ DeleteConfirmationModalComponent,
ConfirmationModalComponent,
LanguageSelectorComponent,
GrafanaComponent,
+++ /dev/null
-<cd-modal #modal
- [modalRef]="activeModal">
- <ng-container class="modal-title">
- <ng-container *ngTemplateOutlet="deletionHeading"></ng-container>
- </ng-container>
-
- <ng-container class="modal-content">
- <form name="deletionForm"
- #formDir="ngForm"
- [formGroup]="deletionForm"
- novalidate>
- <div class="modal-body">
- <ng-container *ngTemplateOutlet="bodyTemplate; context: bodyContext"></ng-container>
- <div class="question">
- <span *ngIf="itemNames; else noNames">
- <p *ngIf="itemNames.length === 1; else manyNames"
- i18n>Are you sure that you want to {{ actionDescription | lowercase }} <strong>{{ itemNames[0] }}</strong>?</p>
- <ng-template #manyNames>
- <p i18n>Are you sure that you want to {{ actionDescription | lowercase }} the selected items?</p>
- <ul>
- <li *ngFor="let itemName of itemNames"><strong>{{ itemName }}</strong></li>
- </ul>
- </ng-template >
- </span>
- <ng-template #noNames>
- <p i18n>Are you sure that you want to {{ actionDescription | lowercase }} the selected {{ itemDescription }}?</p>
- </ng-template>
- <ng-container *ngTemplateOutlet="childFormGroupTemplate; context:{form:deletionForm}"></ng-container>
- <div class="form-group">
- <ng-container *ngIf="impact == impactEnum.medium; else highImpactDeletion">
- <div class="custom-control custom-checkbox">
- <input type="checkbox"
- class="custom-control-input"
- name="confirmation"
- id="confirmation"
- formControlName="confirmation"
- autofocus>
- <label class="custom-control-label"
- for="confirmation"
- i18n>Yes, I am sure.</label>
- </div>
- </ng-container>
- <ng-template #highImpactDeletion>
- <label i18n
- for="name">Resource Name</label>
- <div class="cd-col-form-input">
- <input class="form-control"
- type="text"
- placeholder="Enter resource name to delete"
- id="resource_name"
- name="resource_name"
- formControlName="confirmInput">
- <span *ngIf="deletionForm.showError('confirmInput', formDir, 'required')"
- class="invalid-feedback">
- <ng-container i18n>This field is required.</ng-container>
- </span>
- <span *ngIf="deletionForm.showError('confirmInput', formDir, 'matchResource')"
- class="invalid-feedback">
- <ng-container i18n>Enter the correct resource name.</ng-container>
- </span>
- </div>
- </ng-template>
- </div>
- </div>
- </div>
- <div class="modal-footer">
- <cd-form-button-panel (submitActionEvent)="callSubmitAction()"
- (backActionEvent)="backAction ? callBackAction() : hideModal()"
- [form]="deletionForm"
- [submitText]="(actionDescription | titlecase) + ' ' + itemDescription"></cd-form-button-panel>
- </div>
- </form>
- </ng-container>
-</cd-modal>
-
-<ng-template #deletionHeading>
- {{ actionDescription | titlecase }} {{ itemDescription }}
-</ng-template>
\ No newline at end of file
+++ /dev/null
-.modal-body .question {
- margin-top: 1em;
-}
-
-.modal-body label {
- font-weight: bold;
-}
-
-.modal-body .question .form-check {
- padding-top: 7px;
-}
+++ /dev/null
-import { Component, NgModule, NO_ERRORS_SCHEMA, TemplateRef, ViewChild } from '@angular/core';
-import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing';
-import { NgForm, ReactiveFormsModule } from '@angular/forms';
-
-import { NgbActiveModal, NgbModalModule, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
-import { Observable, Subscriber, timer as observableTimer } from 'rxjs';
-
-import { DirectivesModule } from '~/app/shared/directives/directives.module';
-import { ModalService } from '~/app/shared/services/modal.service';
-import { configureTestBed, modalServiceShow } from '~/testing/unit-test-helper';
-import { AlertPanelComponent } from '../alert-panel/alert-panel.component';
-import { LoadingPanelComponent } from '../loading-panel/loading-panel.component';
-import { CriticalConfirmationModalComponent } from './critical-confirmation-modal.component';
-import { DeletionImpact } from '../../enum/critical-confirmation-modal-impact.enum';
-
-@NgModule({})
-export class MockModule {}
-
-@Component({
- template: `
- <button type="button" class="btn btn-danger" (click)="openCtrlDriven()">
- <i class="fa fa-times"></i>Deletion Ctrl-Test
- <ng-template #ctrlDescription>
- The spinner is handled by the controller if you have use the modal as ViewChild in order to
- use it's functions to stop the spinner or close the dialog.
- </ng-template>
- </button>
-
- <button type="button" class="btn btn-danger" (click)="openModalDriven()">
- <i class="fa fa-times"></i>Deletion Modal-Test
- <ng-template #modalDescription>
- The spinner is handled by the modal if your given deletion function returns a Observable.
- </ng-template>
- </button>
- `
-})
-class MockComponent {
- @ViewChild('ctrlDescription', { static: true })
- ctrlDescription: TemplateRef<any>;
- @ViewChild('modalDescription', { static: true })
- modalDescription: TemplateRef<any>;
- someData = [1, 2, 3, 4, 5];
- finished: number[];
- ctrlRef: NgbModalRef;
- modalRef: NgbModalRef;
-
- // Normally private - public was needed for the tests
- constructor(public modalService: ModalService) {}
-
- openCtrlDriven() {
- this.ctrlRef = this.modalService.show(CriticalConfirmationModalComponent, {
- submitAction: this.fakeDeleteController.bind(this),
- bodyTemplate: this.ctrlDescription
- });
- }
-
- openModalDriven() {
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
- submitActionObservable: this.fakeDelete(),
- bodyTemplate: this.modalDescription
- });
- }
-
- finish() {
- this.finished = [6, 7, 8, 9];
- }
-
- fakeDelete() {
- return (): Observable<any> => {
- return new Observable((observer: Subscriber<any>) => {
- observableTimer(100).subscribe(() => {
- observer.next(this.finish());
- observer.complete();
- });
- });
- };
- }
-
- fakeDeleteController() {
- observableTimer(100).subscribe(() => {
- this.finish();
- this.ctrlRef.close();
- });
- }
-}
-
-describe('CriticalConfirmationModalComponent', () => {
- let mockComponent: MockComponent;
- let component: CriticalConfirmationModalComponent;
- let mockFixture: ComponentFixture<MockComponent>;
-
- configureTestBed(
- {
- declarations: [
- MockComponent,
- CriticalConfirmationModalComponent,
- LoadingPanelComponent,
- AlertPanelComponent
- ],
- schemas: [NO_ERRORS_SCHEMA],
- imports: [ReactiveFormsModule, MockModule, DirectivesModule, NgbModalModule],
- providers: [NgbActiveModal]
- },
- [CriticalConfirmationModalComponent]
- );
-
- beforeEach(() => {
- mockFixture = TestBed.createComponent(MockComponent);
- mockComponent = mockFixture.componentInstance;
- spyOn(mockComponent.modalService, 'show').and.callFake((_modalComp, config) => {
- const data = modalServiceShow(CriticalConfirmationModalComponent, config);
- component = data.componentInstance;
- return data;
- });
- mockComponent.openCtrlDriven();
- mockFixture.detectChanges();
- });
-
- it('should create', () => {
- expect(component).toBeTruthy();
- });
-
- it('should throw an error if no action is defined', () => {
- component = Object.assign(component, {
- submitAction: null,
- submitActionObservable: null
- });
- expect(() => component.ngOnInit()).toThrowError('No submit action defined');
- });
-
- it('should test if the ctrl driven mock is set correctly through mock component', () => {
- expect(component.bodyTemplate).toBeTruthy();
- expect(component.submitAction).toBeTruthy();
- expect(component.submitActionObservable).not.toBeTruthy();
- });
-
- it('should test if the modal driven mock is set correctly through mock component', () => {
- mockComponent.openModalDriven();
- expect(component.bodyTemplate).toBeTruthy();
- expect(component.submitActionObservable).toBeTruthy();
- expect(component.submitAction).not.toBeTruthy();
- });
-
- describe('component functions', () => {
- const changeValue = (formControl: string, value: any) => {
- const ctrl = component.deletionForm.get(formControl);
- ctrl.setValue(value);
- ctrl.markAsDirty();
- ctrl.updateValueAndValidity();
- mockFixture.detectChanges();
- };
-
- it('should test hideModal', () => {
- expect(component.activeModal).toBeTruthy();
- expect(component.hideModal).toBeTruthy();
- spyOn(component.activeModal, 'close').and.callThrough();
- expect(component.activeModal.close).not.toHaveBeenCalled();
- component.hideModal();
- expect(component.activeModal.close).toHaveBeenCalled();
- });
-
- describe('validate confirmation', () => {
- const testValidation = (submitted: boolean, error: string, expected: boolean) => {
- expect(
- component.deletionForm.showError('confirmation', <NgForm>{ submitted: submitted }, error)
- ).toBe(expected);
- };
-
- beforeEach(() => {
- component.deletionForm.reset();
- const ctrl = component.deletionForm.get('impact');
- ctrl.setValue(DeletionImpact.normal);
- ctrl.markAsDirty();
- ctrl.updateValueAndValidity();
- component.deletionForm.get('confirmation').updateValueAndValidity();
- });
-
- it('should test empty values', () => {
- testValidation(false, undefined, false);
- testValidation(true, 'required', true);
- changeValue('confirmation', true);
- changeValue('confirmation', false);
- testValidation(true, 'required', true);
- });
- });
-
- describe('validate confirmInput', () => {
- const testValidation = (submitted: boolean, error: string, expected: boolean) => {
- expect(
- component.deletionForm.showError('confirmInput', <NgForm>{ submitted: submitted }, error)
- ).toBe(expected);
- };
-
- beforeEach(() => {
- component.deletionForm.reset();
- const ctrl = component.deletionForm.get('impact');
- ctrl.setValue(DeletionImpact.high);
- ctrl.markAsDirty();
- ctrl.updateValueAndValidity();
- component.deletionForm.get('confirmInput').updateValueAndValidity();
- });
-
- it('should test empty values', () => {
- testValidation(true, 'required', true);
- changeValue('confirmInput', 'dummytext');
- changeValue('confirmInput', '');
- testValidation(true, 'required', true);
- });
-
- it('should give error, if entered resource name is wrong', () => {
- component.itemNames = ['resource1'];
- changeValue('confirmInput', 'dummytext');
- testValidation(true, 'matchResource', true);
- });
-
- it('should give error, if entered resource name is correct', () => {
- component.itemNames = ['resource1'];
- changeValue('confirmInput', 'resource1');
- testValidation(true, 'matchResource', false);
- });
- });
-
- describe('deletion call', () => {
- beforeEach(() => {
- spyOn(component, 'stopLoadingSpinner').and.callThrough();
- spyOn(component, 'hideModal').and.callThrough();
- });
-
- describe('Controller driven', () => {
- beforeEach(() => {
- spyOn(component, 'submitAction').and.callThrough();
- spyOn(mockComponent.ctrlRef, 'close').and.callThrough();
- });
-
- it('should test fake deletion that closes modal', fakeAsync(() => {
- // Before deletionCall
- expect(component.submitAction).not.toHaveBeenCalled();
- // During deletionCall
- component.callSubmitAction();
- expect(component.stopLoadingSpinner).not.toHaveBeenCalled();
- expect(component.hideModal).not.toHaveBeenCalled();
- expect(mockComponent.ctrlRef.close).not.toHaveBeenCalled();
- expect(component.submitAction).toHaveBeenCalled();
- expect(mockComponent.finished).toBe(undefined);
- // After deletionCall
- tick(2000);
- expect(component.hideModal).not.toHaveBeenCalled();
- expect(mockComponent.ctrlRef.close).toHaveBeenCalled();
- expect(mockComponent.finished).toEqual([6, 7, 8, 9]);
- }));
- });
-
- describe('Modal driven', () => {
- beforeEach(() => {
- mockComponent.openModalDriven();
- spyOn(component, 'stopLoadingSpinner').and.callThrough();
- spyOn(component, 'hideModal').and.callThrough();
- spyOn(mockComponent, 'fakeDelete').and.callThrough();
- });
-
- it('should delete and close modal', fakeAsync(() => {
- // During deletionCall
- component.callSubmitAction();
- expect(mockComponent.finished).toBe(undefined);
- expect(component.hideModal).not.toHaveBeenCalled();
- // After deletionCall
- tick(2000);
- expect(mockComponent.finished).toEqual([6, 7, 8, 9]);
- expect(component.stopLoadingSpinner).not.toHaveBeenCalled();
- expect(component.hideModal).toHaveBeenCalled();
- }));
- });
- });
- });
-});
+++ /dev/null
-import { Component, OnInit, TemplateRef, ViewChild } from '@angular/core';
-import { AbstractControl, UntypedFormControl, ValidationErrors, Validators } from '@angular/forms';
-
-import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
-import { Observable } from 'rxjs';
-
-import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
-import { SubmitButtonComponent } from '../submit-button/submit-button.component';
-import { CdValidators } from '../../forms/cd-validators';
-import { DeletionImpact } from '../../enum/critical-confirmation-modal-impact.enum';
-
-@Component({
- selector: 'cd-deletion-modal',
- templateUrl: './critical-confirmation-modal.component.html',
- styleUrls: ['./critical-confirmation-modal.component.scss']
-})
-export class CriticalConfirmationModalComponent implements OnInit {
- @ViewChild(SubmitButtonComponent, { static: true })
- submitButton: SubmitButtonComponent;
- bodyTemplate: TemplateRef<any>;
- bodyContext: object;
- submitActionObservable: () => Observable<any>;
- callBackAtionObservable: () => Observable<any>;
- submitAction: Function;
- backAction: Function;
- deletionForm: CdFormGroup;
- itemDescription: 'entry';
- itemNames: string[];
- actionDescription = 'delete';
- impactEnum = DeletionImpact;
- childFormGroup: CdFormGroup;
- childFormGroupTemplate: TemplateRef<any>;
- impact: DeletionImpact;
- constructor(public activeModal: NgbActiveModal) {
- this.impact = this.impact || DeletionImpact.normal;
- }
-
- ngOnInit() {
- const controls = {
- impact: new UntypedFormControl(this.impact),
- confirmation: new UntypedFormControl(false, {
- validators: [
- CdValidators.composeIf(
- {
- impact: DeletionImpact.normal
- },
- [Validators.requiredTrue]
- )
- ]
- }),
- confirmInput: new UntypedFormControl('', [
- CdValidators.composeIf({ impact: this.impactEnum.high }, [
- this.matchResourceName.bind(this),
- Validators.required
- ])
- ])
- };
- if (this.childFormGroup) {
- controls['child'] = this.childFormGroup;
- }
- this.deletionForm = new CdFormGroup(controls);
- if (!(this.submitAction || this.submitActionObservable)) {
- throw new Error('No submit action defined');
- }
- }
-
- matchResourceName(control: AbstractControl): ValidationErrors | null {
- if (this.itemNames && control.value !== String(this.itemNames?.[0])) {
- return { matchResource: true };
- }
- return null;
- }
-
- callSubmitAction() {
- if (this.submitActionObservable) {
- this.submitActionObservable().subscribe({
- error: this.stopLoadingSpinner.bind(this),
- complete: this.hideModal.bind(this)
- });
- } else {
- this.submitAction();
- }
- }
-
- callBackAction() {
- if (this.callBackAtionObservable) {
- this.callBackAtionObservable().subscribe({
- error: this.stopLoadingSpinner.bind(this),
- complete: this.hideModal.bind(this)
- });
- } else {
- this.backAction();
- }
- }
-
- hideModal() {
- this.activeModal.close();
- }
-
- stopLoadingSpinner() {
- this.deletionForm.setErrors({ cdSubmitButton: true });
- }
-}
\ No newline at end of file
--- /dev/null
+<cd-modal #modal
+ [modalRef]="activeModal">
+ <ng-container class="modal-title">
+ <ng-container *ngTemplateOutlet="deletionHeading"></ng-container>
+ </ng-container>
+
+ <ng-container class="modal-content">
+ <form name="deletionForm"
+ #formDir="ngForm"
+ [formGroup]="deletionForm"
+ novalidate>
+ <div class="modal-body">
+ <ng-container *ngTemplateOutlet="bodyTemplate; context: bodyContext"></ng-container>
+ <div class="question">
+ <span *ngIf="itemNames; else noNames">
+ <p *ngIf="itemNames.length === 1; else manyNames"
+ i18n>Are you sure that you want to {{ actionDescription | lowercase }} <strong>{{ itemNames[0] }}</strong>?</p>
+ <ng-template #manyNames>
+ <p i18n>Are you sure that you want to {{ actionDescription | lowercase }} the selected items?</p>
+ <ul>
+ <li *ngFor="let itemName of itemNames"><strong>{{ itemName }}</strong></li>
+ </ul>
+ </ng-template >
+ </span>
+ <ng-template #noNames>
+ <p i18n>Are you sure that you want to {{ actionDescription | lowercase }} the selected {{ itemDescription }}?</p>
+ </ng-template>
+ <ng-container *ngTemplateOutlet="childFormGroupTemplate; context:{form:deletionForm}"></ng-container>
+ <div class="form-group">
+ <ng-container *ngIf="impact == impactEnum.medium; else highImpactDeletion">
+ <div class="custom-control custom-checkbox">
+ <input type="checkbox"
+ class="custom-control-input"
+ name="confirmation"
+ id="confirmation"
+ formControlName="confirmation"
+ autofocus>
+ <label class="custom-control-label"
+ for="confirmation"
+ i18n>Yes, I am sure.</label>
+ </div>
+ </ng-container>
+ <ng-template #highImpactDeletion>
+ <label i18n
+ for="name">Resource Name</label>
+ <div class="cd-col-form-input">
+ <input class="form-control"
+ type="text"
+ placeholder="Enter resource name to delete"
+ id="resource_name"
+ name="resource_name"
+ formControlName="confirmInput">
+ <span *ngIf="deletionForm.showError('confirmInput', formDir, 'required')"
+ class="invalid-feedback">
+ <ng-container i18n>This field is required.</ng-container>
+ </span>
+ <span *ngIf="deletionForm.showError('confirmInput', formDir, 'matchResource')"
+ class="invalid-feedback">
+ <ng-container i18n>Enter the correct resource name.</ng-container>
+ </span>
+ </div>
+ </ng-template>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <cd-form-button-panel (submitActionEvent)="callSubmitAction()"
+ (backActionEvent)="backAction ? callBackAction() : hideModal()"
+ [form]="deletionForm"
+ [submitText]="(actionDescription | titlecase) + ' ' + itemDescription"></cd-form-button-panel>
+ </div>
+ </form>
+ </ng-container>
+</cd-modal>
+
+<ng-template #deletionHeading>
+ {{ actionDescription | titlecase }} {{ itemDescription }}
+</ng-template>
--- /dev/null
+.modal-body .question {
+ margin-top: 1em;
+}
+
+.modal-body label {
+ font-weight: bold;
+}
+
+.modal-body .question .form-check {
+ padding-top: 7px;
+}
--- /dev/null
+import { Component, NgModule, NO_ERRORS_SCHEMA, TemplateRef, ViewChild } from '@angular/core';
+import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing';
+import { NgForm, ReactiveFormsModule } from '@angular/forms';
+
+import { NgbActiveModal, NgbModalModule, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
+import { Observable, Subscriber, timer as observableTimer } from 'rxjs';
+
+import { DirectivesModule } from '~/app/shared/directives/directives.module';
+import { ModalService } from '~/app/shared/services/modal.service';
+import { configureTestBed, modalServiceShow } from '~/testing/unit-test-helper';
+import { AlertPanelComponent } from '../alert-panel/alert-panel.component';
+import { LoadingPanelComponent } from '../loading-panel/loading-panel.component';
+import { DeleteConfirmationModalComponent } from './delete-confirmation-modal.component';
+import { DeletionImpact } from '../../enum/delete-confirmation-modal-impact.enum';
+
+@NgModule({})
+export class MockModule {}
+
+@Component({
+ template: `
+ <button type="button" class="btn btn-danger" (click)="openCtrlDriven()">
+ <i class="fa fa-times"></i>Deletion Ctrl-Test
+ <ng-template #ctrlDescription>
+ The spinner is handled by the controller if you have use the modal as ViewChild in order to
+ use it's functions to stop the spinner or close the dialog.
+ </ng-template>
+ </button>
+
+ <button type="button" class="btn btn-danger" (click)="openModalDriven()">
+ <i class="fa fa-times"></i>Deletion Modal-Test
+ <ng-template #modalDescription>
+ The spinner is handled by the modal if your given deletion function returns a Observable.
+ </ng-template>
+ </button>
+ `
+})
+class MockComponent {
+ @ViewChild('ctrlDescription', { static: true })
+ ctrlDescription: TemplateRef<any>;
+ @ViewChild('modalDescription', { static: true })
+ modalDescription: TemplateRef<any>;
+ someData = [1, 2, 3, 4, 5];
+ finished: number[];
+ ctrlRef: NgbModalRef;
+ modalRef: NgbModalRef;
+
+ // Normally private - public was needed for the tests
+ constructor(public modalService: ModalService) {}
+
+ openCtrlDriven() {
+ this.ctrlRef = this.modalService.show(DeleteConfirmationModalComponent, {
+ submitAction: this.fakeDeleteController.bind(this),
+ bodyTemplate: this.ctrlDescription
+ });
+ }
+
+ openModalDriven() {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
+ submitActionObservable: this.fakeDelete(),
+ bodyTemplate: this.modalDescription
+ });
+ }
+
+ finish() {
+ this.finished = [6, 7, 8, 9];
+ }
+
+ fakeDelete() {
+ return (): Observable<any> => {
+ return new Observable((observer: Subscriber<any>) => {
+ observableTimer(100).subscribe(() => {
+ observer.next(this.finish());
+ observer.complete();
+ });
+ });
+ };
+ }
+
+ fakeDeleteController() {
+ observableTimer(100).subscribe(() => {
+ this.finish();
+ this.ctrlRef.close();
+ });
+ }
+}
+
+describe('DeleteConfirmationModalComponent', () => {
+ let mockComponent: MockComponent;
+ let component: DeleteConfirmationModalComponent;
+ let mockFixture: ComponentFixture<MockComponent>;
+
+ configureTestBed(
+ {
+ declarations: [
+ MockComponent,
+ DeleteConfirmationModalComponent,
+ LoadingPanelComponent,
+ AlertPanelComponent
+ ],
+ schemas: [NO_ERRORS_SCHEMA],
+ imports: [ReactiveFormsModule, MockModule, DirectivesModule, NgbModalModule],
+ providers: [NgbActiveModal]
+ },
+ [DeleteConfirmationModalComponent]
+ );
+
+ beforeEach(() => {
+ mockFixture = TestBed.createComponent(MockComponent);
+ mockComponent = mockFixture.componentInstance;
+ spyOn(mockComponent.modalService, 'show').and.callFake((_modalComp, config) => {
+ const data = modalServiceShow(DeleteConfirmationModalComponent, config);
+ component = data.componentInstance;
+ return data;
+ });
+ mockComponent.openCtrlDriven();
+ mockFixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+
+ it('should throw an error if no action is defined', () => {
+ component = Object.assign(component, {
+ submitAction: null,
+ submitActionObservable: null
+ });
+ expect(() => component.ngOnInit()).toThrowError('No submit action defined');
+ });
+
+ it('should test if the ctrl driven mock is set correctly through mock component', () => {
+ expect(component.bodyTemplate).toBeTruthy();
+ expect(component.submitAction).toBeTruthy();
+ expect(component.submitActionObservable).not.toBeTruthy();
+ });
+
+ it('should test if the modal driven mock is set correctly through mock component', () => {
+ mockComponent.openModalDriven();
+ expect(component.bodyTemplate).toBeTruthy();
+ expect(component.submitActionObservable).toBeTruthy();
+ expect(component.submitAction).not.toBeTruthy();
+ });
+
+ describe('component functions', () => {
+ const changeValue = (formControl: string, value: string | boolean) => {
+ const ctrl = component.deletionForm.get(formControl);
+ ctrl.setValue(value);
+ ctrl.markAsDirty();
+ ctrl.updateValueAndValidity();
+ mockFixture.detectChanges();
+ };
+
+ it('should test hideModal', () => {
+ expect(component.activeModal).toBeTruthy();
+ expect(component.hideModal).toBeTruthy();
+ spyOn(component.activeModal, 'close').and.callThrough();
+ expect(component.activeModal.close).not.toHaveBeenCalled();
+ component.hideModal();
+ expect(component.activeModal.close).toHaveBeenCalled();
+ });
+
+ describe('validate confirmation', () => {
+ const testValidation = (submitted: boolean, error: string, expected: boolean) => {
+ expect(
+ component.deletionForm.showError('confirmation', <NgForm>{ submitted: submitted }, error)
+ ).toBe(expected);
+ };
+
+ beforeEach(() => {
+ component.deletionForm.reset();
+ const ctrl = component.deletionForm.get('impact');
+ ctrl.setValue(DeletionImpact.medium);
+ ctrl.markAsDirty();
+ ctrl.updateValueAndValidity();
+ component.deletionForm.get('confirmation').updateValueAndValidity();
+ });
+
+ it('should test empty values', () => {
+ testValidation(false, undefined, false);
+ testValidation(true, 'required', true);
+ changeValue('confirmation', true);
+ changeValue('confirmation', false);
+ testValidation(true, 'required', true);
+ });
+ });
+
+ describe('validate confirmInput', () => {
+ const testValidation = (submitted: boolean, error: string, expected: boolean) => {
+ expect(
+ component.deletionForm.showError('confirmInput', <NgForm>{ submitted: submitted }, error)
+ ).toBe(expected);
+ };
+
+ beforeEach(() => {
+ component.deletionForm.reset();
+ const ctrl = component.deletionForm.get('impact');
+ ctrl.setValue(DeletionImpact.high);
+ ctrl.markAsDirty();
+ ctrl.updateValueAndValidity();
+ component.deletionForm.get('confirmInput').updateValueAndValidity();
+ });
+
+ it('should test empty values', () => {
+ testValidation(true, 'required', true);
+ changeValue('confirmInput', 'dummytext');
+ changeValue('confirmInput', '');
+ testValidation(true, 'required', true);
+ });
+
+ it('should give error, if entered resource name is wrong', () => {
+ component.itemNames = ['resource1'];
+ changeValue('confirmInput', 'dummytext');
+ testValidation(true, 'matchResource', true);
+ });
+
+ it('should give error, if entered resource name is correct', () => {
+ component.itemNames = ['resource1'];
+ changeValue('confirmInput', 'resource1');
+ testValidation(true, 'matchResource', false);
+ });
+ });
+
+ describe('deletion call', () => {
+ beforeEach(() => {
+ spyOn(component, 'stopLoadingSpinner').and.callThrough();
+ spyOn(component, 'hideModal').and.callThrough();
+ });
+
+ describe('Controller driven', () => {
+ beforeEach(() => {
+ spyOn(component, 'submitAction').and.callThrough();
+ spyOn(mockComponent.ctrlRef, 'close').and.callThrough();
+ });
+
+ it('should test fake deletion that closes modal', fakeAsync(() => {
+ // Before deletionCall
+ expect(component.submitAction).not.toHaveBeenCalled();
+ // During deletionCall
+ component.callSubmitAction();
+ expect(component.stopLoadingSpinner).not.toHaveBeenCalled();
+ expect(component.hideModal).not.toHaveBeenCalled();
+ expect(mockComponent.ctrlRef.close).not.toHaveBeenCalled();
+ expect(component.submitAction).toHaveBeenCalled();
+ expect(mockComponent.finished).toBe(undefined);
+ // After deletionCall
+ tick(2000);
+ expect(component.hideModal).not.toHaveBeenCalled();
+ expect(mockComponent.ctrlRef.close).toHaveBeenCalled();
+ expect(mockComponent.finished).toEqual([6, 7, 8, 9]);
+ }));
+ });
+
+ describe('Modal driven', () => {
+ beforeEach(() => {
+ mockComponent.openModalDriven();
+ spyOn(component, 'stopLoadingSpinner').and.callThrough();
+ spyOn(component, 'hideModal').and.callThrough();
+ spyOn(mockComponent, 'fakeDelete').and.callThrough();
+ });
+
+ it('should delete and close modal', fakeAsync(() => {
+ // During deletionCall
+ component.callSubmitAction();
+ expect(mockComponent.finished).toBe(undefined);
+ expect(component.hideModal).not.toHaveBeenCalled();
+ // After deletionCall
+ tick(2000);
+ expect(mockComponent.finished).toEqual([6, 7, 8, 9]);
+ expect(component.stopLoadingSpinner).not.toHaveBeenCalled();
+ expect(component.hideModal).toHaveBeenCalled();
+ }));
+ });
+ });
+ });
+});
--- /dev/null
+import { Component, OnInit, TemplateRef, ViewChild } from '@angular/core';
+import { AbstractControl, UntypedFormControl, ValidationErrors, Validators } from '@angular/forms';
+
+import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
+import { Observable } from 'rxjs';
+
+import { CdFormGroup } from '~/app/shared/forms/cd-form-group';
+import { SubmitButtonComponent } from '../submit-button/submit-button.component';
+import { CdValidators } from '../../forms/cd-validators';
+import { DeletionImpact } from '../../enum/delete-confirmation-modal-impact.enum';
+
+@Component({
+ selector: 'cd-deletion-modal',
+ templateUrl: './delete-confirmation-modal.component.html',
+ styleUrls: ['./delete-confirmation-modal.component.scss']
+})
+export class DeleteConfirmationModalComponent implements OnInit {
+ @ViewChild(SubmitButtonComponent, { static: true })
+ submitButton: SubmitButtonComponent;
+ bodyTemplate: TemplateRef<any>;
+ bodyContext: object;
+ submitActionObservable: () => Observable<any>;
+ callBackAtionObservable: () => Observable<any>;
+ submitAction: Function;
+ backAction: Function;
+ deletionForm: CdFormGroup;
+ itemDescription: 'entry';
+ itemNames: string[];
+ actionDescription = 'delete';
+ impactEnum = DeletionImpact;
+ childFormGroup: CdFormGroup;
+ childFormGroupTemplate: TemplateRef<any>;
+ impact: DeletionImpact;
+ constructor(public activeModal: NgbActiveModal) {
+ this.impact = this.impact || DeletionImpact.medium;
+ }
+
+ ngOnInit() {
+ const controls = {
+ impact: new UntypedFormControl(this.impact),
+ confirmation: new UntypedFormControl(false, {
+ validators: [
+ CdValidators.composeIf(
+ {
+ impact: DeletionImpact.medium
+ },
+ [Validators.requiredTrue]
+ )
+ ]
+ }),
+ confirmInput: new UntypedFormControl('', [
+ CdValidators.composeIf({ impact: this.impactEnum.high }, [
+ this.matchResourceName.bind(this),
+ Validators.required
+ ])
+ ])
+ };
+ if (this.childFormGroup) {
+ controls['child'] = this.childFormGroup;
+ }
+ this.deletionForm = new CdFormGroup(controls);
+ if (!(this.submitAction || this.submitActionObservable)) {
+ throw new Error('No submit action defined');
+ }
+ }
+
+ matchResourceName(control: AbstractControl): ValidationErrors | null {
+ if (this.itemNames && control.value !== String(this.itemNames?.[0])) {
+ return { matchResource: true };
+ }
+ return null;
+ }
+
+ callSubmitAction() {
+ if (this.submitActionObservable) {
+ this.submitActionObservable().subscribe({
+ error: this.stopLoadingSpinner.bind(this),
+ complete: this.hideModal.bind(this)
+ });
+ } else {
+ this.submitAction();
+ }
+ }
+
+ callBackAction() {
+ if (this.callBackAtionObservable) {
+ this.callBackAtionObservable().subscribe({
+ error: this.stopLoadingSpinner.bind(this),
+ complete: this.hideModal.bind(this)
+ });
+ } else {
+ this.backAction();
+ }
+ }
+
+ hideModal() {
+ this.activeModal.close();
+ }
+
+ stopLoadingSpinner() {
+ this.deletionForm.setErrors({ cdSubmitButton: true });
+ }
+}
import { AuthStorageService } from '../../services/auth-storage.service';
import { TaskWrapperService } from '../../services/task-wrapper.service';
import { ModalService } from '../../services/modal.service';
-import { CriticalConfirmationModalComponent } from '../../components/critical-confirmation-modal/critical-confirmation-modal.component';
+import { DeleteConfirmationModalComponent } from '../../components/delete-confirmation-modal/delete-confirmation-modal.component';
@Component({
selector: 'cd-crud-table',
delete() {
const selectedKey = this.selection.first()[this.meta.columnKey];
- this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, {
+ this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, {
itemDescription: $localize`${this.meta.resource}`,
itemNames: [selectedKey],
submitAction: () => {
+++ /dev/null
-export enum DeletionImpact {
- normal = 'normal',
- high = 'high' // NOTE: User should be able to select only single resource while deleting
-}
--- /dev/null
+export enum DeletionImpact {
+ medium = 'medium',
+ high = 'high' // NOTE: User should be able to select only single resource while deleting
+}