Skip to content

Commit d3dd7fc

Browse files
committed
Move the create alert button from the action icons into the resource Alerts tab
1 parent c076a6e commit d3dd7fc

7 files changed

Lines changed: 53 additions & 38 deletions

File tree

‎ui/src/components/view/ResourceAlertsTab.vue‎

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,19 @@
1717

1818
<template>
1919
<div>
20-
<a-select
21-
v-model:value="severity"
22-
style="width: 200px; margin-bottom: 12px"
23-
@change="onFilterChange">
24-
<a-select-option value="">{{ $t('label.severity') }}: {{ $t('label.all') }}</a-select-option>
25-
<a-select-option v-for="s in severities" :key="s" :value="s">{{ s }}</a-select-option>
26-
</a-select>
20+
<div class="toolbar">
21+
<a-select
22+
v-model:value="severity"
23+
style="width: 200px"
24+
@change="onFilterChange">
25+
<a-select-option value="">{{ $t('label.severity') }}: {{ $t('label.all') }}</a-select-option>
26+
<a-select-option v-for="s in severities" :key="s" :value="s">{{ s }}</a-select-option>
27+
</a-select>
28+
<a-button v-if="canCreateRule" type="primary" @click="showCreateRule = true">
29+
<template #icon><plus-outlined /></template>
30+
{{ $t('label.create.resource.alert.rule') }}
31+
</a-button>
32+
</div>
2733
<a-table
2834
size="small"
2935
:columns="columns"
@@ -47,16 +53,33 @@
4753
</template>
4854
</template>
4955
</a-table>
56+
<a-modal
57+
v-if="showCreateRule"
58+
:visible="showCreateRule"
59+
:title="$t('label.create.resource.alert.rule')"
60+
:footer="null"
61+
:maskClosable="false"
62+
centered
63+
@cancel="showCreateRule = false">
64+
<create-resource-alert-rule
65+
:resource="resource"
66+
:presetResourceType="resourceType"
67+
@close-action="showCreateRule = false" />
68+
</a-modal>
5069
</div>
5170
</template>
5271

5372
<script>
5473
import { getAPI } from '@/api'
5574
import { resourceAlertLabel } from '@/views/resourcealert/resourceAlertOptions'
75+
import CreateResourceAlertRule from '@/views/resourcealert/CreateResourceAlertRule.vue'
5676
5777
// Shows the alerts of one resource, or of one rule when no resourceType is given.
5878
export default {
5979
name: 'ResourceAlertsTab',
80+
components: {
81+
CreateResourceAlertRule
82+
},
6083
props: {
6184
resource: {
6285
type: Object,
@@ -78,6 +101,7 @@ export default {
78101
return {
79102
alerts: [],
80103
tabLoading: false,
104+
showCreateRule: false,
81105
severity: '',
82106
severities: ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW'],
83107
page: 1,
@@ -94,6 +118,10 @@ export default {
94118
}
95119
},
96120
computed: {
121+
// Extensions do not report VM or host usage, so rules on them would never fire
122+
canCreateRule () {
123+
return !!this.resourceType && 'createResourceAlertRule' in this.$store.getters.apis && this.resource?.hypervisor !== 'External'
124+
},
97125
pagination () {
98126
return {
99127
current: this.page,
@@ -157,3 +185,12 @@ export default {
157185
}
158186
}
159187
</script>
188+
189+
<style scoped>
190+
.toolbar {
191+
display: flex;
192+
justify-content: space-between;
193+
align-items: center;
194+
margin-bottom: 12px;
195+
}
196+
</style>

‎ui/src/config/section/compute.js‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import { shallowRef, defineAsyncComponent } from 'vue'
1919
import store from '@/store'
20-
import { createAlertRuleAction } from '@/config/section/infra/resourceAlertRules'
2120
import { isZoneCreated } from '@/utils/zone'
2221
import { getAPI, postAPI, getBaseUrl } from '@/api'
2322
import { getLatestKubernetesIsoParams } from '@/utils/acsrepo'
@@ -482,8 +481,7 @@ export default {
482481
groupMap: (selection, values) => { return selection.map(x => { return { id: x, expunge: values.expunge } }) },
483482
show: (record) => { return ['Running', 'Stopped', 'Error'].includes(record.state) && record.vmtype !== 'sharedfsvm' },
484483
component: shallowRef(defineAsyncComponent(() => import('@/views/compute/DestroyVM.vue')))
485-
},
486-
createAlertRuleAction('VirtualMachine')
484+
}
487485
]
488486
},
489487
{

‎ui/src/config/section/infra/hosts.js‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import { shallowRef, defineAsyncComponent } from 'vue'
1919
import store from '@/store'
20-
import { createAlertRuleAction } from '@/config/section/infra/resourceAlertRules'
2120

2221
export default {
2322
name: 'host',
@@ -352,7 +351,6 @@ export default {
352351
dataView: true,
353352
args: ['forced'],
354353
show: (record) => { return ['Maintenance', 'Disabled', 'Down', 'Alert', 'Disconnected'].includes(record.resourcestate) }
355-
},
356-
createAlertRuleAction('Host')
354+
}
357355
]
358356
}

‎ui/src/config/section/infra/primaryStorages.js‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import { shallowRef, defineAsyncComponent } from 'vue'
1919
import store from '@/store'
20-
import { createAlertRuleAction } from '@/config/section/infra/resourceAlertRules'
2120

2221
export default {
2322
name: 'storagepool',
@@ -169,7 +168,6 @@ export default {
169168
args: ['forced'],
170169
show: (record) => { return (record.state === 'Down' || record.state === 'Maintenance' || record.state === 'Disconnected') },
171170
displayName: (record) => { return record.name || record.displayName || record.id }
172-
},
173-
createAlertRuleAction('StoragePool')
171+
}
174172
]
175173
}

‎ui/src/config/section/infra/resourceAlertRules.js‎

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,6 @@ import { resourceAlertLabel } from '@/views/resourcealert/resourceAlertOptions'
2222

2323
const label = (field) => ({ [field]: (record) => resourceAlertLabel(field, record[field]) })
2424

25-
// Create an alert rule from a resource's own page, with the resource already picked
26-
export const createAlertRuleAction = (resourceAlertType) => ({
27-
api: 'createResourceAlertRule',
28-
icon: 'bell-outlined',
29-
label: 'label.create.resource.alert.rule',
30-
dataView: true,
31-
popup: true,
32-
resourceAlertType,
33-
// Extensions do not report VM or host usage, so rules on them would never fire
34-
show: (record) => { return record.hypervisor !== 'External' },
35-
component: shallowRef(defineAsyncComponent(() => import('@/views/resourcealert/CreateResourceAlertRule.vue')))
36-
})
37-
3825
export default {
3926
name: 'resourcealerts',
4027
title: 'label.resource.alert.rules',

‎ui/src/config/section/storage.js‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import { shallowRef, defineAsyncComponent } from 'vue'
1919
import store from '@/store'
20-
import { createAlertRuleAction } from '@/config/section/infra/resourceAlertRules'
2120
import { isZoneCreated } from '@/utils/zone'
2221
import { isAdmin } from '@/role'
2322

@@ -327,8 +326,7 @@ export default {
327326
return !['Destroy', 'Destroyed', 'Expunging', 'Expunged', 'Migrating', 'Uploading', 'UploadError', 'Creating', 'Allocated', 'Uploaded'].includes(record.state) &&
328327
record.type !== 'ROOT' && !record.virtualmachineid
329328
}
330-
},
331-
createAlertRuleAction('Volume')
329+
}
332330
]
333331
},
334332
{

‎ui/src/views/resourcealert/CreateResourceAlertRule.vue‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,9 @@ export default {
151151
type: Object,
152152
default: () => ({})
153153
},
154-
currentAction: {
155-
type: Object,
156-
default: () => ({})
154+
presetResourceType: {
155+
type: String,
156+
default: ''
157157
}
158158
},
159159
data () {
@@ -233,9 +233,8 @@ export default {
233233
methods: {
234234
// Opened from a resource's own page: pick its type and the resource itself
235235
presetResource () {
236-
const type = this.currentAction?.resourceAlertType
237-
if (!type || !this.resource?.id) return
238-
this.form.resourcetype = type
236+
if (!this.presetResourceType || !this.resource?.id) return
237+
this.form.resourcetype = this.presetResourceType
239238
this.form.metric = undefined
240239
this.fetchResources().then(() => {
241240
this.form.resourceid = this.resource.id

0 commit comments

Comments
 (0)