Make resource deletion safer with name confirmation (#13104)

* enable double confirmation in delete flow for resource

* address copilot comments
This commit is contained in:
Manoj Kumar 2026-05-08 10:56:50 +05:30 committed by GitHub
parent 4425ee4234
commit 72b99a3f8c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 30 additions and 17 deletions

View File

@ -795,6 +795,7 @@
"label.delete.ciscoasa1000v": "Delete CiscoASA1000v",
"label.delete.ciscovnmc.resource": "Delete CiscoVNMC resource",
"label.delete.condition": "Delete condition",
"label.delete.confirmation": "Enter the exact resource name to proceed with deletion",
"label.delete.custom.action": "Delete Custom Action",
"label.delete.dedicated.vlan.range": "Deleted dedicated VLAN/VNI range.",
"label.delete.domain": "Delete domain",

View File

@ -162,6 +162,7 @@ export default {
},
groupAction: true,
popup: true,
requireNameConfirmation: true,
groupMap: (selection, values) => { return selection.map(x => { return { id: x, cleanup: values.cleanup || null } }) },
args: (record, store) => {
const fields = []

View File

@ -195,8 +195,6 @@
:footer="null"
style="top: 20px;"
:width="modalWidth"
:ok-button-props="getOkProps()"
:cancel-button-props="getCancelProps()"
:confirmLoading="actionLoading"
@cancel="cancelAction"
centered
@ -270,8 +268,18 @@
</a-table>
</div>
<br v-if="currentAction.paramFields.length > 0" />
</span>
<a-form
</span>
<div v-if="currentAction.requireNameConfirmation && !(currentAction.groupAction && selectedRowKeys.length > 0)" style="margin-bottom: 5px">
<a-form-item>
<a-input v-model:value="actionConfirmText" :placeholder="resource.name" />
</a-form-item>
<a-alert type="info">
<template #message>
<div v-html="$t('label.delete.confirmation')"></div>
</template>
</a-alert>
</div>
<a-form
:ref="formRef"
:model="form"
:rules="rules"
@ -531,6 +539,7 @@
type="primary"
@click="handleSubmit"
ref="submit"
:disabled="isSubmitDisabled"
>{{ $t('label.ok') }}</a-button>
</div>
</a-form>
@ -691,6 +700,7 @@ export default {
confirmDirty: false,
firstIndex: 0,
modalWidth: '30vw',
actionConfirmText: '',
promises: []
}
},
@ -898,6 +908,12 @@ export default {
return 'active'
}
return 'self'
},
isSubmitDisabled () {
if (this.currentAction?.requireNameConfirmation && !(this.currentAction.groupAction && this.selectedRowKeys.length > 0)) {
return this.actionConfirmText.trim() !== this.resource?.name?.trim()
}
return false
}
},
methods: {
@ -907,19 +923,6 @@ export default {
}
return 'inline-flex'
},
getOkProps () {
if (this.selectedRowKeys.length > 0 && this.currentAction?.groupAction) {
} else {
return { props: { type: 'primary' } }
}
},
getCancelProps () {
if (this.selectedRowKeys.length > 0 && this.currentAction?.groupAction) {
return { props: { type: 'primary' } }
} else {
return { props: { type: 'default' } }
}
},
switchProject (projectId) {
if (!projectId || !projectId.length || projectId.length !== 36) {
return
@ -1308,6 +1311,7 @@ export default {
this.actionLoading = false
this.showAction = false
this.currentAction = {}
this.actionConfirmText = ''
},
cancelAction () {
eventBus.emit('action-closing', { action: this.currentAction })
@ -1365,6 +1369,7 @@ export default {
this.currentAction = action
this.currentAction.params = store.getters.apis[this.currentAction.api].params
this.resource = action.resource
this.actionConfirmText = ''
this.$emit('change-resource', this.resource)
var paramFields = this.currentAction.params
paramFields.sort(function (a, b) {
@ -1647,6 +1652,12 @@ export default {
},
handleSubmit (e) {
if (this.actionLoading) return
if (this.currentAction?.requireNameConfirmation && !(this.currentAction.groupAction && this.selectedRowKeys.length > 0)) {
if (this.actionConfirmText.trim() !== this.resource?.name?.trim()) {
return
}
}
this.promises = []
if (!this.dataView && this.currentAction.groupAction && this.selectedRowKeys.length > 0) {
if (this.selectedRowKeys.length > 0) {