From 301bbc6fe4e26abd5f6150e38092f5e216e3fa51 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Mon, 10 May 2021 18:50:00 +0530 Subject: [PATCH 01/15] ui: support bulk action for various resources --- ui/public/locales/en.json | 2 + ui/src/components/view/DetailsTab.vue | 2 +- ui/src/components/view/ListView.vue | 9 ++++- ui/src/config/section/account.js | 20 ++++++++-- ui/src/config/section/compute.js | 36 ++++++++++++++--- ui/src/config/section/infra/routers.js | 21 ++++++++-- ui/src/config/section/infra/systemVms.js | 20 ++++++++-- ui/src/config/section/network.js | 45 +++++++++++++++++---- ui/src/config/section/offering.js | 50 +++++++++++++++++++----- ui/src/config/section/project.js | 15 +++++-- ui/src/config/section/storage.js | 16 ++++++-- ui/src/views/AutogenView.vue | 3 +- ui/src/views/network/EgressRulesTab.vue | 35 ++++++++++++++++- ui/src/views/network/FirewallRules.vue | 35 ++++++++++++++++- ui/src/views/network/LoadBalancing.vue | 35 ++++++++++++++++- ui/src/views/network/PortForwarding.vue | 35 ++++++++++++++++- 16 files changed, 331 insertions(+), 48 deletions(-) diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index 8115739da8db..215bc7d915a4 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -690,6 +690,7 @@ "label.delete.opendaylight.device": "Delete OpenDaylight Controller", "label.delete.pa": "Delete Palo Alto", "label.delete.portable.ip.range": "Delete Portable IP Range", +"label.delete.portforward.rules": "Delete Port Forward Rules", "label.delete.project": "Delete project", "label.delete.project.role": "Delete Project Role", "label.delete.role": "Delete Role", @@ -2384,6 +2385,7 @@ "message.action.delete.external.firewall": "Please confirm that you would like to remove this external firewall. Warning: If you are planning to add back the same external firewall, you must reset usage data on the device.", "message.action.delete.external.load.balancer": "Please confirm that you would like to remove this external load balancer. Warning: If you are planning to add back the same external load balancer, you must reset usage data on the device.", "message.action.delete.ingress.rule": "Please confirm that you want to delete this ingress rule.", +"message.action.delete.instance.group": "Please confirm that you want to delete the instance group", "message.action.delete.iso": "Please confirm that you want to delete this ISO.", "message.action.delete.iso.for.all.zones": "The ISO is used by all zones. Please confirm that you want to delete it from all zones.", "message.action.delete.network": "Please confirm that you want to delete this network.", diff --git a/ui/src/components/view/DetailsTab.vue b/ui/src/components/view/DetailsTab.vue index 015b44e24d67..563acac947e6 100644 --- a/ui/src/components/view/DetailsTab.vue +++ b/ui/src/components/view/DetailsTab.vue @@ -50,7 +50,7 @@ - +
{{ $t('label.' + String(item).toLowerCase()) }}
diff --git a/ui/src/components/view/ListView.vue b/ui/src/components/view/ListView.vue index c92c852797c2..af48db032314 100644 --- a/ui/src/components/view/ListView.vue +++ b/ui/src/components/view/ListView.vue @@ -23,7 +23,7 @@ :dataSource="items" :rowKey="(record, idx) => record.id || record.name || record.usageType || idx + '-' + Math.random()" :pagination="false" - :rowSelection="['vm', 'alert'].includes($route.name) || $route.name === 'event' && $store.getters.userInfo.roletype === 'Admin' + :rowSelection=" enableGroupAction() || $route.name === 'event' && $store.getters.userInfo.roletype === 'Admin' ? {selectedRowKeys: selectedRowKeys, onChange: onSelectChange} : null" :rowClassName="getRowClassName" style="overflow-y: auto" @@ -421,6 +421,13 @@ export default { '/computeoffering', '/systemoffering', '/diskoffering', '/backupoffering', '/networkoffering', '/vpcoffering'].join('|')) .test(this.$route.path) }, + enableGroupAction () { + return ['vm', 'alert', 'vmgroup', 'ssh', 'affinitygroup', 'volume', 'snapshot', + 'vmsnapshot', 'guestnetwork', 'vpc', 'publicip', 'vpnuser', 'vpncustomergateway', + 'project', 'account', 'systemvm', 'router', 'computeoffering', 'systemoffering', + 'diskoffering', 'backupoffering', 'networkoffering', 'vpcoffering' + ].includes(this.$route.name) + }, fetchColumns () { if (this.isOrderUpdatable()) { return this.columns diff --git a/ui/src/config/section/account.js b/ui/src/config/section/account.js index 1fce57aad7b6..12da562c894c 100644 --- a/ui/src/config/section/account.js +++ b/ui/src/config/section/account.js @@ -116,7 +116,10 @@ export default { !(record.domain === 'ROOT' && record.name === 'admin' && record.accounttype === 1) && (record.state === 'disabled' || record.state === 'locked') }, - params: { lock: 'false' } + params: { lock: 'false' }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }, { api: 'disableAccount', @@ -134,7 +137,10 @@ export default { lock: { value: (record) => { return false } } - } + }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x, lock: false } }) } }, { api: 'disableAccount', @@ -152,7 +158,10 @@ export default { lock: { value: (record) => { return true } } - } + }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x, lock: true } }) } }, { api: 'uploadSslCert', @@ -180,7 +189,10 @@ export default { show: (record, store) => { return ['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) && !record.isdefault && !(record.domain === 'ROOT' && record.name === 'admin' && record.accounttype === 1) - } + }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } } ] } diff --git a/ui/src/config/section/compute.js b/ui/src/config/section/compute.js index 77d86337b1f9..ff1f4cb95729 100644 --- a/ui/src/config/section/compute.js +++ b/ui/src/config/section/compute.js @@ -437,7 +437,10 @@ export default { message: 'message.kubernetes.cluster.start', docHelp: 'plugins/cloudstack-kubernetes-service.html#starting-a-stopped-kubernetes-cluster', dataView: true, - show: (record) => { return ['Stopped'].includes(record.state) } + show: (record) => { return ['Stopped'].includes(record.state) }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }, { api: 'stopKubernetesCluster', @@ -446,7 +449,10 @@ export default { message: 'message.kubernetes.cluster.stop', docHelp: 'plugins/cloudstack-kubernetes-service.html#stopping-kubernetes-cluster', dataView: true, - show: (record) => { return !['Stopped', 'Destroyed', 'Destroying'].includes(record.state) } + show: (record) => { return !['Stopped', 'Destroyed', 'Destroying'].includes(record.state) }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }, { api: 'scaleKubernetesCluster', @@ -477,7 +483,10 @@ export default { message: 'message.kubernetes.cluster.delete', docHelp: 'plugins/cloudstack-kubernetes-service.html#deleting-kubernetes-cluster', dataView: true, - show: (record) => { return !['Destroyed', 'Destroying'].includes(record.state) } + show: (record) => { return !['Destroyed', 'Destroying'].includes(record.state) }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } } ] }, @@ -513,7 +522,11 @@ export default { api: 'deleteInstanceGroup', icon: 'delete', label: 'label.delete.instance.group', - dataView: true + message: 'message.action.delete.instance.group', + dataView: true, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } } ] }, @@ -563,6 +576,16 @@ export default { domainid: { value: (record, params) => { return record.domainid } } + }, + groupAction: true, + popup: true, + groupMap: (selection, values, record) => { + return selection.map(x => { + const data = record.filter(y => { return y.name === x }) + return { + name: x, account: data[0].account, domainid: data[0].domainid + } + }) } } ] @@ -606,7 +629,10 @@ export default { label: 'label.delete.affinity.group', docHelp: 'adminguide/virtual_machines.html#delete-an-affinity-group', message: 'message.delete.affinity.group', - dataView: true + dataView: true, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } } ] } diff --git a/ui/src/config/section/infra/routers.js b/ui/src/config/section/infra/routers.js index 09f4fff8755c..abbfa1d763c1 100644 --- a/ui/src/config/section/infra/routers.js +++ b/ui/src/config/section/infra/routers.js @@ -49,7 +49,10 @@ export default { label: 'label.action.start.router', message: 'message.action.start.router', dataView: true, - show: (record) => { return record.state === 'Stopped' } + show: (record) => { return record.state === 'Stopped' }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }, { api: 'stopRouter', @@ -58,7 +61,10 @@ export default { message: 'message.action.stop.router', dataView: true, args: ['forced'], - show: (record) => { return record.state === 'Running' } + show: (record) => { return record.state === 'Running' }, + groupAction: true, + popup: true, + groupMap: (selection, values) => { return selection.map(x => { return { id: x, forced: values.forced } }) } }, { api: 'rebootRouter', @@ -66,7 +72,11 @@ export default { label: 'label.action.reboot.router', message: 'message.action.reboot.router', dataView: true, - hidden: (record) => { return record.state === 'Running' } + hidden: (record) => { return record.state === 'Running' }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } + }, { api: 'scaleSystemVm', @@ -154,7 +164,10 @@ export default { label: 'label.destroy.router', message: 'message.confirm.destroy.router', dataView: true, - show: (record) => { return ['Running', 'Error', 'Stopped'].includes(record.state) } + show: (record) => { return ['Running', 'Error', 'Stopped'].includes(record.state) }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } } ] } diff --git a/ui/src/config/section/infra/systemVms.js b/ui/src/config/section/infra/systemVms.js index 8d519ca5f49c..f8225653010e 100644 --- a/ui/src/config/section/infra/systemVms.js +++ b/ui/src/config/section/infra/systemVms.js @@ -30,7 +30,10 @@ export default { label: 'label.action.start.systemvm', message: 'message.action.start.systemvm', dataView: true, - show: (record) => { return record.state === 'Stopped' } + show: (record) => { return record.state === 'Stopped' }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }, { api: 'stopSystemVm', @@ -39,7 +42,10 @@ export default { message: 'message.action.stop.systemvm', dataView: true, show: (record) => { return record.state === 'Running' }, - args: ['forced'] + args: ['forced'], + groupAction: true, + popup: true, + groupMap: (selection, values) => { return selection.map(x => { return { id: x, forced: values.forced } }) } }, { api: 'rebootSystemVm', @@ -47,7 +53,10 @@ export default { label: 'label.action.reboot.systemvm', message: 'message.action.reboot.systemvm', dataView: true, - show: (record) => { return record.state === 'Running' } + show: (record) => { return record.state === 'Running' }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }, { api: 'scaleSystemVm', @@ -119,7 +128,10 @@ export default { label: 'label.action.destroy.systemvm', message: 'message.action.destroy.systemvm', dataView: true, - show: (record) => { return ['Running', 'Error', 'Stopped'].includes(record.state) } + show: (record) => { return ['Running', 'Error', 'Stopped'].includes(record.state) }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } } ] } diff --git a/ui/src/config/section/network.js b/ui/src/config/section/network.js index 4076509ad211..d24a176ccd61 100644 --- a/ui/src/config/section/network.js +++ b/ui/src/config/section/network.js @@ -88,7 +88,10 @@ export default { message: 'message.restart.network', dataView: true, args: ['cleanup'], - show: (record) => record.type !== 'L2' + show: (record) => record.type !== 'L2', + groupAction: true, + popup: true, + groupMap: (selection, values) => { return selection.map(x => { return { id: x, cleanup: values.cleanup } }) } }, { api: 'replaceNetworkACLList', @@ -114,7 +117,10 @@ export default { icon: 'delete', label: 'label.action.delete.network', message: 'message.action.delete.network', - dataView: true + dataView: true, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } } ] }, @@ -174,14 +180,20 @@ export default { fields.push('makeredundant') } return fields - } + }, + groupAction: true, + popup: true, + groupMap: (selection, values) => { return selection.map(x => { return { id: x, cleanup: values.cleanup, makeredundant: values.makeredundant } }) } }, { api: 'deleteVPC', icon: 'delete', label: 'label.remove.vpc', message: 'message.remove.vpc', - dataView: true + dataView: true, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } } ] }, @@ -257,7 +269,10 @@ export default { }, { name: 'firewall', component: () => import('@/views/network/FirewallRules.vue'), - networkServiceFilter: networkService => networkService.filter(x => x.name === 'Firewall').length > 0 + networkServiceFilter: networkService => networkService.filter(x => x.name === 'Firewall').length > 0, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }, { name: 'portforwarding', @@ -305,7 +320,10 @@ export default { message: 'message.action.release.ip', docHelp: 'adminguide/networking_and_traffic.html#releasing-an-ip-address-alloted-to-a-vpc', dataView: true, - show: (record) => { return !record.issourcenat } + show: (record) => { return !record.issourcenat }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } } ] }, @@ -583,6 +601,16 @@ export default { account: { value: (record) => { return record.account } } + }, + groupAction: true, + popup: true, + groupMap: (selection, values, record) => { + return selection.map(x => { + const data = record.filter(y => { return y.username === x }) + return { + username: x, account: data[0].account, domainid: data[0].domainid + } + }) } } ] @@ -624,7 +652,10 @@ export default { label: 'label.delete.vpn.customer.gateway', message: 'message.delete.vpn.customer.gateway', docHelp: 'adminguide/networking_and_traffic.html#updating-and-removing-a-vpn-customer-gateway', - dataView: true + dataView: true, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } } ] } diff --git a/ui/src/config/section/offering.js b/ui/src/config/section/offering.js index 64678de2daf8..eaa423ddd8e8 100644 --- a/ui/src/config/section/offering.js +++ b/ui/src/config/section/offering.js @@ -76,7 +76,10 @@ export default { label: 'label.action.delete.service.offering', message: 'message.action.delete.service.offering', docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering', - dataView: true + dataView: true, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }] }, { @@ -112,7 +115,10 @@ export default { message: 'message.action.delete.system.service.offering', docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering', dataView: true, - params: { issystem: 'true' } + params: { issystem: 'true' }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }] }, { @@ -165,7 +171,10 @@ export default { label: 'label.action.delete.disk.offering', message: 'message.action.delete.disk.offering', docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering', - dataView: true + dataView: true, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }] }, { @@ -190,7 +199,10 @@ export default { label: 'label.action.delete.backup.offering', message: 'message.action.delete.backup.offering', docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering', - dataView: true + dataView: true, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }] }, { @@ -234,7 +246,10 @@ export default { state: { value: (record) => { return 'Enabled' } } - } + }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x, state: 'Enabled' } }) } }, { api: 'updateNetworkOffering', icon: 'pause-circle', @@ -247,7 +262,10 @@ export default { state: { value: (record) => { return 'Disabled' } } - } + }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x, state: 'Disabled' } }) } }, { api: 'updateNetworkOffering', icon: 'lock', @@ -262,7 +280,10 @@ export default { label: 'label.remove.network.offering', message: 'message.confirm.remove.network.offering', docHelp: 'adminguide/service_offerings.html#modifying-or-deleting-a-service-offering', - dataView: true + dataView: true, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }] }, { @@ -306,7 +327,10 @@ export default { state: { value: (record) => { return 'Enabled' } } - } + }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x, state: 'Enabled' } }) } }, { api: 'updateVPCOffering', icon: 'pause-circle', @@ -319,7 +343,10 @@ export default { state: { value: (record) => { return 'Disabled' } } - } + }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x, state: 'Disabled' } }) } }, { api: 'updateVPCOffering', icon: 'lock', @@ -332,7 +359,10 @@ export default { icon: 'delete', label: 'label.remove.vpc.offering', message: 'message.confirm.remove.vpc.offering', - dataView: true + dataView: true, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }] } ] diff --git a/ui/src/config/section/project.js b/ui/src/config/section/project.js index 72cdd713ad2c..531901c50b68 100644 --- a/ui/src/config/section/project.js +++ b/ui/src/config/section/project.js @@ -104,7 +104,10 @@ export default { dataView: true, show: (record, store) => { return ((['Admin', 'DomainAdmin'].includes(store.userInfo.roletype)) || record.isCurrentUserProjectAdmin) && record.state === 'Suspended' - } + }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }, { api: 'suspendProject', @@ -116,7 +119,10 @@ export default { show: (record, store) => { return ((['Admin', 'DomainAdmin'].includes(store.userInfo.roletype)) || record.isCurrentUserProjectAdmin) && record.state !== 'Suspended' - } + }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }, { api: 'addAccountToProject', @@ -139,7 +145,10 @@ export default { dataView: true, show: (record, store) => { return (['Admin', 'DomainAdmin'].includes(store.userInfo.roletype)) || record.isCurrentUserProjectAdmin - } + }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } } ] } diff --git a/ui/src/config/section/storage.js b/ui/src/config/section/storage.js index 976cab9acde9..f22d702a4662 100644 --- a/ui/src/config/section/storage.js +++ b/ui/src/config/section/storage.js @@ -223,12 +223,14 @@ export default { label: 'label.action.delete.volume', message: 'message.action.delete.volume', dataView: true, - groupAction: true, show: (record, store) => { return ['Expunging', 'Expunged', 'UploadError'].includes(record.state) || ['Allocated', 'Uploaded'].includes(record.state) && record.type !== 'ROOT' && !record.virtualmachineid || ((['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) || store.features.allowuserexpungerecovervolume) && record.state === 'Destroy') - } + }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } }, { api: 'destroyVolume', @@ -311,7 +313,10 @@ export default { label: 'label.action.delete.snapshot', message: 'message.action.delete.snapshot', dataView: true, - show: (record) => { return record.state !== 'Destroyed' } + show: (record) => { return record.state !== 'Destroyed' }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { id: x } }) } } ] }, @@ -369,7 +374,10 @@ export default { vmsnapshotid: { value: (record) => { return record.id } } - } + }, + groupAction: true, + popup: true, + groupMap: (selection) => { return selection.map(x => { return { vmsnapshotid: x } }) } } ] }, diff --git a/ui/src/views/AutogenView.vue b/ui/src/views/AutogenView.vue index c51487c3b7a5..7314d56fd245 100644 --- a/ui/src/views/AutogenView.vue +++ b/ui/src/views/AutogenView.vue @@ -905,7 +905,8 @@ export default { this.items.map(x => { itemsNameMap[x.id] = x.name || x.displaytext || x.id }) - const paramsList = this.currentAction.groupMap(this.selectedRowKeys, values) + console.log(this.items) + const paramsList = this.currentAction.groupMap(this.selectedRowKeys, values, this.items) for (const params of paramsList) { var resourceName = itemsNameMap[params.id] // Using a method for this since it's an async call and don't want wrong prarms to be passed diff --git a/ui/src/views/network/EgressRulesTab.vue b/ui/src/views/network/EgressRulesTab.vue index 9634c489f4ed..28b1d20514f1 100644 --- a/ui/src/views/network/EgressRulesTab.vue +++ b/ui/src/views/network/EgressRulesTab.vue @@ -59,7 +59,14 @@
- + + {{ $t('label.action.delete.firewall') + 's' }} + @@ -251,11 +162,13 @@ import { api } from '@/api' import Status from '@/components/widgets/Status' import TooltipButton from '@/components/view/TooltipButton' +import BulkActionView from '@/components/view/BulkActionView' export default { components: { Status, - TooltipButton + TooltipButton, + BulkActionView }, props: { resource: { @@ -269,10 +182,14 @@ export default { selectedRowKeys: [], showGroupActionModal: false, showBulkActionCompletedModal: false, - selectedItems: {}, + selectedItems: [], selectedColumns: [], filterColumns: ['State', 'Action'], showConfirmationAction: false, + message: { + title: this.$t('label.action.bulk.delete.firewall.rules'), + confirmMessage: this.$t('label.confirm.delete.firewall.rules') + }, loading: true, addTagLoading: false, firewallRules: [], diff --git a/ui/src/views/network/LoadBalancing.vue b/ui/src/views/network/LoadBalancing.vue index e50d36afb840..465e6246d71f 100644 --- a/ui/src/views/network/LoadBalancing.vue +++ b/ui/src/views/network/LoadBalancing.vue @@ -385,130 +385,22 @@ - - - {{ $t('label.action.bulk.delete.load.balancer.rules') }} - - - - - - - - - - - - - -
-
-
- - - -
- -
- -
- - - -
- - - - - - - - -
-
- + @@ -516,12 +408,14 @@ import { api } from '@/api' import Status from '@/components/widgets/Status' import TooltipButton from '@/components/view/TooltipButton' +import BulkActionView from '@/components/view/BulkActionView' export default { name: 'LoadBalancing', components: { Status, - TooltipButton + TooltipButton, + BulkActionView }, props: { resource: { @@ -535,10 +429,14 @@ export default { selectedRowKeys: [], showGroupActionModal: false, showBulkActionCompletedModal: false, - selectedItems: {}, + selectedItems: [], selectedColumns: [], filterColumns: ['State', 'Action', 'Add VMs', 'Stickiness'], showConfirmationAction: false, + message: { + title: this.$t('label.action.bulk.delete.load.balancer.rules'), + confirmMessage: this.$t('label.confirm.delete.loadbalancer.rules') + }, loading: true, lbRules: [], newTagsForm: this.$form.createForm(this), diff --git a/ui/src/views/network/PortForwarding.vue b/ui/src/views/network/PortForwarding.vue index edd1aac0f0cc..a9c1ec7bf5d1 100644 --- a/ui/src/views/network/PortForwarding.vue +++ b/ui/src/views/network/PortForwarding.vue @@ -255,137 +255,22 @@ - - - {{ $t('label.action.bulk.delete.portforward.rules') }} - - - - - - - - - - - - - - -
-
-
- - - -
- -
- -
- - - - -
- - - - - - - - - -
-
- - + @@ -393,11 +278,13 @@ import { api } from '@/api' import Status from '@/components/widgets/Status' import TooltipButton from '@/components/view/TooltipButton' +import BulkActionView from '@/components/view/BulkActionView' export default { components: { Status, - TooltipButton + TooltipButton, + BulkActionView }, props: { resource: { @@ -411,11 +298,15 @@ export default { selectedRowKeys: [], showGroupActionModal: false, showBulkActionCompletedModal: false, - selectedItems: {}, + selectedItems: [], jobsState: {}, selectedColumns: [], filterColumns: ['State', 'Action'], showConfirmationAction: false, + message: { + title: this.$t('label.action.bulk.delete.portforward.rules'), + confirmMessage: this.$t('label.confirm.delete.portforward.rules') + }, loading: true, portForwardRules: [], newRule: { @@ -595,13 +486,6 @@ export default { onSelectChange (selectedRowKeys, selectedRows) { this.setSelection(selectedRowKeys) }, - // getSelectedItems () { - // const that = this - // this.selectedItems = (this.portForwardRules.filter(function (item) { - // return that.selectedRowKeys.indexOf(item.id) !== -1 - // })) - // this.selectedItems = this.selectedItems.map(v => ({ ...v, status: 'inprogress' })) - // }, bulkDeleteRulesConfirmation () { this.showConfirmationAction = true this.selectedColumns = this.columns.filter(column => { @@ -613,11 +497,8 @@ export default { console.log('handle cancel') this.showGroupActionModal = false this.showBulkActionCompletedModal = true - // this.updateJobsState() - // if (this.jobsState?.jobsState?.inprogress?.length > 0) { this.showBulkActionCompletedModal = false this.parentFetchData() - // } }, jobCompletedNotificationCancel () { this.jobsState = {} @@ -627,13 +508,6 @@ export default { this.selectedRowKeys = [] this.parentFetchData() }, - // updateJobsState () { - // if (this.selectedItems) { - // this.jobsState.inprogress = this.selectedItems.filter(item => item.status === 'inprogress') - // this.jobsState.success = this.selectedItems.filter(item => item.status === 'success') - // this.jobsState.failure = this.selectedItems.filter(item => item.status === 'failure') - // } - // }, updateResourceState (resource, state) { if (this.selectedItems && resource) { const objIndex = this.selectedItems.findIndex(obj => obj.id === resource) @@ -648,7 +522,6 @@ export default { scopedSlots: { customRender: 'status' } }) if (this.selectedRowKeys.length > 0) { - // this.getSelectedItems() this.showGroupActionModal = true } for (const rule of this.selectedItems) { From 773dd17072d385fc02f3c172122ccb3e9c42d14d Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Mon, 31 May 2021 15:45:39 +0530 Subject: [PATCH 05/15] cleanup + suppress notification --- ui/public/locales/en.json | 2 + ui/src/components/view/BulkActionView.vue | 20 +--- ui/src/components/view/ListView.vue | 5 +- ui/src/config/section/infra/ilbvms.js | 10 +- ui/src/utils/plugins.js | 1 + ui/src/views/AutogenView.vue | 131 ++++++++++++---------- ui/src/views/network/EgressRulesTab.vue | 12 +- ui/src/views/network/FirewallRules.vue | 12 +- ui/src/views/network/IpAddressesTab.vue | 99 +++++++++++++++- ui/src/views/network/LoadBalancing.vue | 18 +-- ui/src/views/network/PortForwarding.vue | 15 +-- 11 files changed, 201 insertions(+), 124 deletions(-) diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index fa1c6785b55a..2b4cd5c416c4 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -75,6 +75,7 @@ "label.action.bulk.delete.firewall.rules": "Bulk delete firewall rules", "label.action.bulk.delete.load.balancer.rules": "Bulk delete load balancer rules", "label.action.bulk.delete.portforward.rules": "Bulk delete Port Forward rules", +"label.action.bulk.release.public.ip.address": "Bulk release Public IP Addresses", "label.action.cancel.maintenance.mode": "Cancel Maintenance Mode", "label.action.cancel.maintenance.mode.processing": "Cancelling Maintenance Mode....", "label.action.change.password": "Change Password", @@ -594,6 +595,7 @@ "label.confirm.delete.firewall.rules": "Please confirm you wish to delete the selected firewall rules", "label.confirm.delete.loadbalancer.rules": "Please confirm you wish to delete the selected load balancing rules", "label.confirm.delete.portforward.rules": "Please confirm you wish to delete the selected port-forward rules", +"label.confirm.release.public.ip.addresses": "Please confirm you wish to release the selected public IP addresses", "label.congratulations": "Congratulations!", "label.connectiontimeout": "Connection Timeout", "label.conservemode": "Conserve mode", diff --git a/ui/src/components/view/BulkActionView.vue b/ui/src/components/view/BulkActionView.vue index db6b53416ce2..5ff15affd269 100644 --- a/ui/src/components/view/BulkActionView.vue +++ b/ui/src/components/view/BulkActionView.vue @@ -43,7 +43,7 @@ :columns="selectedColumns" :dataSource="selectedItems" :rowKey="(record, idx) => record.id" - :pagination="false" + :pagination="true" style="overflow-y: auto">