From: Naman Munet Date: Mon, 10 Feb 2025 03:34:19 +0000 (+0530) Subject: mgr/dashboard: renaming critical-confirmation-modal to delete-confirmation-modal... X-Git-Tag: v18.2.5~45^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=bd884816ede8ad61a8aa68f69d1b41354433a48f;p=ceph.git mgr/dashboard: renaming critical-confirmation-modal to delete-confirmation-modal and keeping default deletion impact as medium Fixes: https://tracker.ceph.com/issues/69628 Signed-off-by: Naman Munet (cherry picked from commit 6866d6a3fe72a62b5239267d2efa42729c9aa4a4) Conflicts: src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/pool-list/pool-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/block/nvmeof-initiators-list/nvmeof-initiators-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/block/nvmeof-listeners-list/nvmeof-listeners-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/block/nvmeof-namespaces-list/nvmeof-namespaces-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/block/nvmeof-subsystems/nvmeof-subsystems.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-list/rbd-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-namespace-list/rbd-namespace-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-list/rbd-snapshot-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-directories/cephfs-directories.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-list/cephfs-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-group/cephfs-subvolume-group.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-list/cephfs-subvolume-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-snapshots-list/cephfs-subvolume-snapshots-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/configuration/configuration-form/configuration-form.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/hosts/hosts.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/multi-cluster/multi-cluster-list/multi-cluster-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-list/osd-list.component.spec.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-list/osd-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/services.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/upgrade/upgrade-progress/upgrade-progress.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/nfs/nfs-list/nfs-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-details/rgw-multisite-details.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-sync-policy-details/rgw-multisite-sync-policy-details.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-sync-policy/rgw-multisite-sync-policy.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-storage-class-list/rgw-storage-class-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-accounts/rgw-user-accounts.component.ts src/pybind/mgr/dashboard/frontend/src/app/ceph/smb/smb-cluster-list/smb-cluster-list.component.ts src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.html src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.spec.ts src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.ts src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/crud-table/crud-table.component.ts --- diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-list/iscsi-target-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-list/iscsi-target-list.component.ts index d0eed6a72c77e..08c9e51c83206 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-list/iscsi-target-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/iscsi-target-list/iscsi-target-list.component.ts @@ -6,7 +6,7 @@ import { Subscription } from 'rxjs'; 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'; @@ -223,7 +223,7 @@ export class IscsiTargetListComponent extends ListWithDetails implements OnInit, 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: () => diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/pool-list/pool-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/pool-list/pool-list.component.ts index 5916a20e57e3e..bc8850cc130a4 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/pool-list/pool-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/mirroring/pool-list/pool-list.component.ts @@ -6,7 +6,7 @@ import { Observable, Subscriber, Subscription } from 'rxjs'; 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'; @@ -17,7 +17,7 @@ import { AuthStorageService } from '~/app/shared/services/auth-storage.service'; 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({ @@ -150,7 +150,7 @@ export class PoolListComponent implements OnInit, OnDestroy { 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})`], diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-list/rbd-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-list/rbd-list.component.ts index 61b7866eef670..798de3bb7e894 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-list/rbd-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-list/rbd-list.component.ts @@ -8,7 +8,7 @@ import { RbdService } from '~/app/shared/api/rbd.service'; 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'; @@ -32,7 +32,7 @@ import { RbdFormEditRequestModel } from '../rbd-form/rbd-form-edit-request.model 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({ @@ -427,7 +427,7 @@ export class RbdListComponent extends ListWithDetails implements OnInit { 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], @@ -452,7 +452,7 @@ export class RbdListComponent extends ListWithDetails implements OnInit { 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', @@ -534,7 +534,7 @@ export class RbdListComponent extends ListWithDetails implements OnInit { 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}`], diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-namespace-list/rbd-namespace-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-namespace-list/rbd-namespace-list.component.ts index 4617e13e4247c..8f82127356e76 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-namespace-list/rbd-namespace-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-namespace-list/rbd-namespace-list.component.ts @@ -5,7 +5,7 @@ import { forkJoin, Observable } from 'rxjs'; 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'; @@ -125,7 +125,7 @@ export class RbdNamespaceListComponent implements OnInit { 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: () => diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-list/rbd-snapshot-list.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-list/rbd-snapshot-list.component.spec.ts index 1b9b385466510..20cd2cc2cb149 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-list/rbd-snapshot-list.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-list/rbd-snapshot-list.component.spec.ts @@ -10,7 +10,7 @@ import { Subject, throwError as observableThrowError } from 'rxjs'; 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'; @@ -67,7 +67,7 @@ describe('RbdSnapshotListComponent', () => { TaskListService ] }, - [CriticalConfirmationModalComponent] + [DeleteConfirmationModalComponent] ); beforeEach(() => { diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-list/rbd-snapshot-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-list/rbd-snapshot-list.component.ts index 5f12821aaa59c..fc787be33656e 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-list/rbd-snapshot-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-snapshot-list/rbd-snapshot-list.component.ts @@ -16,7 +16,7 @@ import { of } from 'rxjs'; 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'; @@ -38,7 +38,7 @@ import { TaskManagerService } from '~/app/shared/services/task-manager.service'; 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', @@ -326,7 +326,7 @@ export class RbdSnapshotListComponent implements OnInit, OnChanges { 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], diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-trash-list/rbd-trash-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-trash-list/rbd-trash-list.component.ts index 43fe42b99fa38..bfc2d5be337d8 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-trash-list/rbd-trash-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/block/rbd-trash-list/rbd-trash-list.component.ts @@ -6,7 +6,7 @@ import moment from 'moment'; 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'; @@ -204,7 +204,7 @@ export class RbdTrashListComponent implements OnInit { 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, diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-clients/cephfs-clients.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-clients/cephfs-clients.component.ts index fb43cca4b20df..e705d3fad9f63 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-clients/cephfs-clients.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-clients/cephfs-clients.component.ts @@ -4,7 +4,7 @@ import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; 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'; @@ -92,7 +92,7 @@ export class CephfsClientsComponent implements OnInit { 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', diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-directories/cephfs-directories.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-directories/cephfs-directories.component.spec.ts index 3a43ac5c77dc2..ff190176347d5 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-directories/cephfs-directories.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-directories/cephfs-directories.component.spec.ts @@ -11,7 +11,7 @@ import { Observable, of } from 'rxjs'; 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'; @@ -370,7 +370,7 @@ describe('CephfsDirectoriesComponent', () => { declarations: [CephfsDirectoriesComponent], providers: [NgbActiveModal] }, - [CriticalConfirmationModalComponent, FormModalComponent, ConfirmationModalComponent] + [DeleteConfirmationModalComponent, FormModalComponent, ConfirmationModalComponent] ); beforeEach(() => { @@ -713,7 +713,7 @@ describe('CephfsDirectoriesComponent', () => { 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'], @@ -721,7 +721,7 @@ describe('CephfsDirectoriesComponent', () => { }, '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'], diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-directories/cephfs-directories.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-directories/cephfs-directories.component.ts index 8d24bd567db3a..6cfe173f6e606 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-directories/cephfs-directories.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-directories/cephfs-directories.component.ts @@ -14,10 +14,10 @@ import moment from 'moment'; 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'; @@ -694,7 +694,7 @@ export class CephfsDirectoriesComponent implements OnInit, OnChanges { } 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), diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-list/cephfs-list.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-list/cephfs-list.component.spec.ts index 5659f131c9914..269048ad210c2 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-list/cephfs-list.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-list/cephfs-list.component.spec.ts @@ -9,7 +9,7 @@ import { ToastrModule } from 'ngx-toastr'; 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'; @@ -59,7 +59,7 @@ describe('CephfsListComponent', () => { const callDeletion = () => { component.removeVolumeModal(); expect(modalRef).toBeTruthy(); - const deletion: CriticalConfirmationModalComponent = modalRef && modalRef.componentInstance; + const deletion: DeleteConfirmationModalComponent = modalRef && modalRef.componentInstance; deletion.submitActionObservable(); }; diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-list/cephfs-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-list/cephfs-list.component.ts index 5caa4dd9c51a7..2a9ea85db9b89 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-list/cephfs-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-list/cephfs-list.component.ts @@ -10,7 +10,7 @@ import { ListWithDetails } from '~/app/shared/classes/list-with-details.class'; 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'; @@ -26,7 +26,7 @@ import { CephfsMountDetailsComponent } from '../cephfs-mount-details/cephfs-moun 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'; @@ -172,7 +172,7 @@ export class CephfsListComponent extends ListWithDetails implements OnInit { 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], diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-snapshotschedule-list/cephfs-snapshotschedule-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-snapshotschedule-list/cephfs-snapshotschedule-list.component.ts index 53c8e924e82e7..963f815850bf6 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-snapshotschedule-list/cephfs-snapshotschedule-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-snapshotschedule-list/cephfs-snapshotschedule-list.component.ts @@ -28,7 +28,7 @@ import { BlockUI, NgBlockUI } from 'ng-block-ui'; 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'; @@ -247,7 +247,7 @@ export class CephfsSnapshotscheduleListComponent 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: () => @@ -270,7 +270,7 @@ export class CephfsSnapshotscheduleListComponent 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: () => @@ -302,7 +302,7 @@ export class CephfsSnapshotscheduleListComponent }) ?.join('|'); - this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, { + this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, { itemDescription: $localize`snapshot schedule`, submitActionObservable: () => this.taskWrapper.wrapTaskAroundCall({ diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-group/cephfs-subvolume-group.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-group/cephfs-subvolume-group.component.ts index 10d155fab023c..f1af838fd94f7 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-group/cephfs-subvolume-group.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-group/cephfs-subvolume-group.component.ts @@ -14,13 +14,13 @@ import { ActionLabelsI18n } from '~/app/shared/constants/app.constants'; 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', @@ -178,7 +178,7 @@ export class CephfsSubvolumeGroupComponent implements OnInit, OnChanges { removeSubVolumeModal() { const name = this.selection.first().name; - this.modalService.show(CriticalConfirmationModalComponent, { + this.modalService.show(DeleteConfirmationModalComponent, { impact: DeletionImpact.high, itemDescription: 'subvolume group', itemNames: [name], diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-list/cephfs-subvolume-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-list/cephfs-subvolume-list.component.ts index 64b71f9024640..eb396d6c13c8c 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-list/cephfs-subvolume-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-list/cephfs-subvolume-list.component.ts @@ -28,13 +28,13 @@ import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; 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'; @@ -251,7 +251,7 @@ export class CephfsSubvolumeListComponent extends CdForm implements OnInit, OnCh }); 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], diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-snapshots-list/cephfs-subvolume-snapshots-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-snapshots-list/cephfs-subvolume-snapshots-list.component.ts index cc6e6e0df5bea..1cbf0ee374e99 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-snapshots-list/cephfs-subvolume-snapshots-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cephfs/cephfs-subvolume-snapshots-list/cephfs-subvolume-snapshots-list.component.ts @@ -17,7 +17,7 @@ import { Permissions } from '~/app/shared/models/permissions'; 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'; @@ -27,7 +27,7 @@ import moment from 'moment'; 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', @@ -232,7 +232,7 @@ export class CephfsSubvolumeSnapshotsListComponent implements OnInit, OnChanges 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], diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/configuration/configuration-form/configuration-form.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/configuration/configuration-form/configuration-form.component.ts index f95479fc53e01..6282b73ad6b5f 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/configuration/configuration-form/configuration-form.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/configuration/configuration-form/configuration-form.component.ts @@ -13,8 +13,8 @@ import { CdForm } from '~/app/shared/forms/cd-form'; 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'; @@ -158,7 +158,7 @@ export class ConfigurationFormComponent extends CdForm implements OnInit { } openCriticalConfirmModal() { - this.modalService.show(CriticalConfirmationModalComponent, { + this.modalService.show(DeleteConfirmationModalComponent, { buttonText: $localize`Force Edit`, actionDescription: $localize`force edit`, itemDescription: $localize`configuration`, diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/hosts/hosts.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/hosts/hosts.component.ts index 082aef10780ca..7957e06198fef 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/hosts/hosts.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/hosts/hosts.component.ts @@ -10,7 +10,7 @@ import { HostService } from '~/app/shared/api/host.service'; 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'; @@ -35,7 +35,7 @@ import { NotificationService } from '~/app/shared/services/notification.service' 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'; @@ -447,7 +447,7 @@ export class HostsComponent extends ListWithDetails implements OnDestroy, OnInit 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], diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-list/osd-list.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-list/osd-list.component.spec.ts index 7b215e42ad4db..83a1c5026f297 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-list/osd-list.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-list/osd-list.component.spec.ts @@ -16,7 +16,7 @@ import { CoreModule } from '~/app/core/core.module'; 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'; @@ -478,7 +478,7 @@ describe('OsdListComponent', () => { }); it('opens all critical confirmation modals', () => { - const modalClass = CriticalConfirmationModalComponent; + const modalClass = DeleteConfirmationModalComponent; mockSafeToDestroy(); expectOpensModal('Mark Lost', modalClass); expectOpensModal('Purge', modalClass); diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-list/osd-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-list/osd-list.component.ts index 592de5fb73ec9..fd36302949b01 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-list/osd-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/osd/osd-list/osd-list.component.ts @@ -11,7 +11,7 @@ import { OrchestratorService } from '~/app/shared/api/orchestrator.service'; 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'; @@ -40,7 +40,7 @@ import { OsdReweightModalComponent } from '../osd-reweight-modal/osd-reweight-mo 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'; @@ -581,7 +581,7 @@ export class OsdListComponent extends ListWithDetails implements OnInit { ): 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, diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-list/silence-list.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-list/silence-list.component.spec.ts index a136b2bac1119..541edf5dc2e90 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-list/silence-list.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-list/silence-list.component.spec.ts @@ -8,7 +8,7 @@ import { ToastrModule } from 'ngx-toastr'; 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'; @@ -103,7 +103,7 @@ describe('SilenceListComponent', () => { const expireSilence = () => { component.expireSilence(); - const deletion: CriticalConfirmationModalComponent = component.modalRef.componentInstance; + const deletion: DeleteConfirmationModalComponent = component.modalRef.componentInstance; // deletion.modalRef = new BsModalRef(); deletion.ngOnInit(); deletion.callSubmitAction(); diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-list/silence-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-list/silence-list.component.ts index d5612a0949c05..0331f5f826b69 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-list/silence-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/prometheus/silence-list/silence-list.component.ts @@ -7,7 +7,7 @@ import { Observable, Subscriber } from 'rxjs'; 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'; @@ -194,7 +194,7 @@ export class SilenceListComponent extends PrometheusListHelper { 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, diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/services.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/services.component.ts index a3f6ef9090781..8ebed84eeea52 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/services.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/services/services.component.ts @@ -7,7 +7,7 @@ import { delay } from 'rxjs/operators'; 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'; @@ -27,7 +27,6 @@ import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service'; 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'; @@ -238,8 +237,7 @@ export class ServicesComponent extends ListWithDetails implements OnChanges, OnI 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', diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/upgrade/upgrade-progress/upgrade-progress.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/upgrade/upgrade-progress/upgrade-progress.component.ts index 03bb6ed084dff..af857f481864b 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/upgrade/upgrade-progress/upgrade-progress.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/cluster/upgrade/upgrade-progress/upgrade-progress.component.ts @@ -4,8 +4,8 @@ import { Observable, ReplaySubject, Subscription } from 'rxjs'; 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'; @@ -109,7 +109,7 @@ export class UpgradeProgressComponent implements OnInit, OnDestroy { 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(), diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/nfs/nfs-list/nfs-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/nfs/nfs-list/nfs-list.component.ts index 354f0186334d6..fe9b90c6a14f9 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/nfs/nfs-list/nfs-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/nfs/nfs-list/nfs-list.component.ts @@ -6,7 +6,7 @@ import { Subscription } from 'rxjs'; 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'; @@ -22,7 +22,7 @@ import { AuthStorageService } from '~/app/shared/services/auth-storage.service'; 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', @@ -184,7 +184,7 @@ export class NfsListComponent extends ListWithDetails implements OnInit, OnDestr 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}`], diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.spec.ts index 87b791b690307..a323bdcb1cde1 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.spec.ts @@ -21,7 +21,7 @@ import { ErrorComponent } from '~/app/core/error/error.component'; 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'; @@ -155,7 +155,7 @@ describe('PoolFormComponent', () => { { provide: ActivatedRoute, useValue: { params: of({ name: 'somePoolName' }) } } ] }, - [CriticalConfirmationModalComponent] + [DeleteConfirmationModalComponent] ); let navigationSpy: jasmine.Spy; @@ -798,7 +798,7 @@ describe('PoolFormComponent', () => { describe('crush rule deletion', () => { let taskWrapper: TaskWrapperService; - let deletion: CriticalConfirmationModalComponent; + let deletion: DeleteConfirmationModalComponent; let deleteSpy: jasmine.Spy; let modalSpy: jasmine.Spy; @@ -949,7 +949,7 @@ describe('PoolFormComponent', () => { describe('ecp deletion', () => { let taskWrapper: TaskWrapperService; - let deletion: CriticalConfirmationModalComponent; + let deletion: DeleteConfirmationModalComponent; let deleteSpy: jasmine.Spy; let modalSpy: jasmine.Spy; let modal: NgbModalRef; diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.ts index c91ca76536725..3167d4035d9da 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-form/pool-form.component.ts @@ -11,7 +11,7 @@ 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 { 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'; @@ -674,7 +674,7 @@ export class PoolFormComponent extends CdForm implements OnInit { return; } const name = value[nameAttribute]; - this.modalService.show(CriticalConfirmationModalComponent, { + this.modalService.show(DeleteConfirmationModalComponent, { itemDescription, itemNames: [name], submitActionObservable: () => { diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.spec.ts index 8a8af7b73494f..c40543ddf7f8c 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.spec.ts @@ -13,7 +13,7 @@ import { PgCategoryService } from '~/app/ceph/shared/pg-category.service'; 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'; @@ -152,7 +152,7 @@ describe('PoolListComponent', () => { const callDeletion = () => { component.deletePoolModal(); expect(modalRef).toBeTruthy(); - const deletion: CriticalConfirmationModalComponent = modalRef && modalRef.componentInstance; + const deletion: DeleteConfirmationModalComponent = modalRef && modalRef.componentInstance; deletion.submitActionObservable(); }; diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.ts index 2696a9d5e6813..55d62f0ae3427 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/pool/pool-list/pool-list.component.ts @@ -9,7 +9,7 @@ import { ErasureCodeProfileService } from '~/app/shared/api/erasure-code-profile 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'; @@ -30,7 +30,7 @@ import { TaskWrapperService } from '~/app/shared/services/task-wrapper.service'; 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'; @@ -224,7 +224,7 @@ export class PoolListComponent extends ListWithDetails implements OnInit { deletePoolModal() { const name = this.selection.first().pool_name; - this.modalService.show(CriticalConfirmationModalComponent, { + this.modalService.show(DeleteConfirmationModalComponent, { impact: DeletionImpact.high, itemDescription: 'Pool', itemNames: [name], diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-list/rgw-bucket-list.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-list/rgw-bucket-list.component.spec.ts index ff07057931765..13ce274a0c51a 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-list/rgw-bucket-list.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-list/rgw-bucket-list.component.spec.ts @@ -54,7 +54,7 @@ describe('RgwBucketListComponent', () => { 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'], @@ -62,7 +62,7 @@ describe('RgwBucketListComponent', () => { }, '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'], @@ -70,7 +70,7 @@ describe('RgwBucketListComponent', () => { }, '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'], diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-list/rgw-bucket-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-list/rgw-bucket-list.component.ts index e00895433d8df..23f77001ecb2e 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-list/rgw-bucket-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-bucket-list/rgw-bucket-list.component.ts @@ -6,7 +6,7 @@ import { switchMap } from 'rxjs/operators'; 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'; @@ -21,7 +21,7 @@ import { AuthStorageService } from '~/app/shared/services/auth-storage.service'; 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'; @@ -144,7 +144,7 @@ export class RgwBucketListComponent extends ListWithDetails implements OnInit, O 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, diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-details/rgw-multisite-details.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-details/rgw-multisite-details.component.ts index 6e898e789456b..fee9ad22093ed 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-details/rgw-multisite-details.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-multisite-details/rgw-multisite-details.component.ts @@ -13,7 +13,7 @@ import { forkJoin, Subscription, timer as observableTimer } from 'rxjs'; 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'; @@ -519,7 +519,7 @@ export class RgwMultisiteDetailsComponent implements OnDestroy, OnInit { 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: () => { diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-list/rgw-user-list.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-list/rgw-user-list.component.spec.ts index 2f886ccf5d4a4..26af6df36d973 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-list/rgw-user-list.component.spec.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-list/rgw-user-list.component.spec.ts @@ -48,7 +48,7 @@ describe('RgwUserListComponent', () => { 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'], @@ -56,7 +56,7 @@ describe('RgwUserListComponent', () => { }, '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'], @@ -64,7 +64,7 @@ describe('RgwUserListComponent', () => { }, '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'], diff --git a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-list/rgw-user-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-list/rgw-user-list.component.ts index 4f7caedcea9ac..298bba44a73c1 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-list/rgw-user-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/ceph/rgw/rgw-user-list/rgw-user-list.component.ts @@ -4,11 +4,11 @@ import { forkJoin as observableForkJoin, Observable, Subscriber } from 'rxjs'; 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'; @@ -148,7 +148,7 @@ export class RgwUserListComponent extends ListWithDetails implements OnInit { } 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']), diff --git a/src/pybind/mgr/dashboard/frontend/src/app/core/auth/role-list/role-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/core/auth/role-list/role-list.component.ts index 83dcd69fa57f2..2aa311e7876ad 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/core/auth/role-list/role-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/core/auth/role-list/role-list.component.ts @@ -6,7 +6,7 @@ import { forkJoin } from 'rxjs'; 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'; @@ -134,7 +134,7 @@ export class RoleListComponent extends ListWithDetails implements OnInit { 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) diff --git a/src/pybind/mgr/dashboard/frontend/src/app/core/auth/user-list/user-list.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/core/auth/user-list/user-list.component.ts index 1941cf3566dd5..00e56e4313f0a 100755 --- a/src/pybind/mgr/dashboard/frontend/src/app/core/auth/user-list/user-list.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/core/auth/user-list/user-list.component.ts @@ -4,10 +4,10 @@ import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; 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'; @@ -174,7 +174,7 @@ export class UserListComponent implements OnInit { return; } - this.modalRef = this.modalService.show(CriticalConfirmationModalComponent, { + this.modalRef = this.modalService.show(DeleteConfirmationModalComponent, { impact: DeletionImpact.high, itemDescription: 'User', itemNames: [username], diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/components.module.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/components.module.ts index c3baa9c13f59c..cf28dbc483b12 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/components.module.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/components.module.ts @@ -26,7 +26,7 @@ import { ColorClassFromTextPipe } from './cd-label/color-class-from-text.pipe'; 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'; @@ -85,7 +85,7 @@ import { FormAdvancedFieldsetComponent } from './form-advanced-fieldset/form-adv LoadingPanelComponent, ModalComponent, NotificationsSidebarComponent, - CriticalConfirmationModalComponent, + DeleteConfirmationModalComponent, ConfirmationModalComponent, LanguageSelectorComponent, GrafanaComponent, diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component.html b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component.html deleted file mode 100644 index 5f7988a60d48b..0000000000000 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - -
- - -
-
-
- - - {{ actionDescription | titlecase }} {{ itemDescription }} - \ No newline at end of file diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component.scss b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component.scss deleted file mode 100644 index 979cb13fe228f..0000000000000 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component.scss +++ /dev/null @@ -1,11 +0,0 @@ -.modal-body .question { - margin-top: 1em; -} - -.modal-body label { - font-weight: bold; -} - -.modal-body .question .form-check { - padding-top: 7px; -} diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component.spec.ts deleted file mode 100644 index 066a7f4592ef7..0000000000000 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component.spec.ts +++ /dev/null @@ -1,275 +0,0 @@ -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: ` - - - - ` -}) -class MockComponent { - @ViewChild('ctrlDescription', { static: true }) - ctrlDescription: TemplateRef; - @ViewChild('modalDescription', { static: true }) - modalDescription: TemplateRef; - 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 => { - return new Observable((observer: Subscriber) => { - 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; - - 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', { 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', { 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(); - })); - }); - }); - }); -}); diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component.ts deleted file mode 100644 index 9280d81825230..0000000000000 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/critical-confirmation-modal/critical-confirmation-modal.component.ts +++ /dev/null @@ -1,103 +0,0 @@ -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; - bodyContext: object; - submitActionObservable: () => Observable; - callBackAtionObservable: () => Observable; - submitAction: Function; - backAction: Function; - deletionForm: CdFormGroup; - itemDescription: 'entry'; - itemNames: string[]; - actionDescription = 'delete'; - impactEnum = DeletionImpact; - childFormGroup: CdFormGroup; - childFormGroupTemplate: TemplateRef; - 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 diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.html b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.html new file mode 100644 index 0000000000000..5509b0056bdae --- /dev/null +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.html @@ -0,0 +1,78 @@ + + + + + + +
+ + +
+
+
+ + + {{ actionDescription | titlecase }} {{ itemDescription }} + diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.scss b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.scss new file mode 100644 index 0000000000000..979cb13fe228f --- /dev/null +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.scss @@ -0,0 +1,11 @@ +.modal-body .question { + margin-top: 1em; +} + +.modal-body label { + font-weight: bold; +} + +.modal-body .question .form-check { + padding-top: 7px; +} diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.spec.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.spec.ts new file mode 100644 index 0000000000000..7541b81dab688 --- /dev/null +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.spec.ts @@ -0,0 +1,275 @@ +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: ` + + + + ` +}) +class MockComponent { + @ViewChild('ctrlDescription', { static: true }) + ctrlDescription: TemplateRef; + @ViewChild('modalDescription', { static: true }) + modalDescription: TemplateRef; + 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 => { + return new Observable((observer: Subscriber) => { + 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; + + 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', { 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', { 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(); + })); + }); + }); + }); +}); diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.ts new file mode 100644 index 0000000000000..8ed5464ad0620 --- /dev/null +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/components/delete-confirmation-modal/delete-confirmation-modal.component.ts @@ -0,0 +1,103 @@ +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; + bodyContext: object; + submitActionObservable: () => Observable; + callBackAtionObservable: () => Observable; + submitAction: Function; + backAction: Function; + deletionForm: CdFormGroup; + itemDescription: 'entry'; + itemNames: string[]; + actionDescription = 'delete'; + impactEnum = DeletionImpact; + childFormGroup: CdFormGroup; + childFormGroupTemplate: TemplateRef; + 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 }); + } +} diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/crud-table/crud-table.component.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/crud-table/crud-table.component.ts index 340ddf7005bc4..d8dd327ff26b6 100644 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/crud-table/crud-table.component.ts +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/crud-table/crud-table.component.ts @@ -16,7 +16,7 @@ import { Permission, Permissions } from '../../models/permissions'; 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', @@ -119,7 +119,7 @@ export class CRUDTableComponent implements OnInit { 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: () => { diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/enum/critical-confirmation-modal-impact.enum.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/enum/critical-confirmation-modal-impact.enum.ts deleted file mode 100644 index 045d6f52ae6c7..0000000000000 --- a/src/pybind/mgr/dashboard/frontend/src/app/shared/enum/critical-confirmation-modal-impact.enum.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum DeletionImpact { - normal = 'normal', - high = 'high' // NOTE: User should be able to select only single resource while deleting -} diff --git a/src/pybind/mgr/dashboard/frontend/src/app/shared/enum/delete-confirmation-modal-impact.enum.ts b/src/pybind/mgr/dashboard/frontend/src/app/shared/enum/delete-confirmation-modal-impact.enum.ts new file mode 100644 index 0000000000000..5009ea28f94a9 --- /dev/null +++ b/src/pybind/mgr/dashboard/frontend/src/app/shared/enum/delete-confirmation-modal-impact.enum.ts @@ -0,0 +1,4 @@ +export enum DeletionImpact { + medium = 'medium', + high = 'high' // NOTE: User should be able to select only single resource while deleting +}