Create.vue 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{$t('compute.text_770')}}</div>
  4. <div slot="body">
  5. <dialog-table v-if="params.data" :data="params.data" :columns="params.columns.slice(0, 2)" />
  6. <node-alert-form
  7. ref="nodeAlertFormRef"
  8. :metric-opts="metricOptsEnabled"
  9. :hypervisor="params.hypervisor"
  10. :alertType="params.alertType"
  11. :monitor-metric="params.metric" />
  12. </div>
  13. <div slot="footer">
  14. <a-button type="primary" @click="handleConfirm" :loading="loading">{{ $t('dialog.ok') }}</a-button>
  15. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  16. </div>
  17. </base-dialog>
  18. </template>
  19. <script>
  20. import DialogMixin from '@/mixins/dialog'
  21. import WindowsMixin from '@/mixins/windows'
  22. import NodeAlertForm from '../components/Form'
  23. export default {
  24. name: 'CreateNodeAlert',
  25. components: {
  26. NodeAlertForm,
  27. },
  28. mixins: [DialogMixin, WindowsMixin],
  29. data () {
  30. return {
  31. loading: false,
  32. }
  33. },
  34. computed: {
  35. metricOptsEnabled () {
  36. let opts = this.params.metricOpts
  37. if (this.params.list && this.params.list.data) {
  38. // 新建时要保证新建的报警不会和已有的重复,下面是过滤掉已有的metric
  39. const listDataArr = Object.values(this.params.list.data)
  40. if (listDataArr && listDataArr.length) {
  41. opts = opts.filter(val => {
  42. return !listDataArr.find(dataWrap => dataWrap.data.metric === val.key)
  43. })
  44. }
  45. }
  46. return opts
  47. },
  48. },
  49. methods: {
  50. async handleConfirm () {
  51. this.loading = true
  52. try {
  53. const values = await this.$refs.nodeAlertFormRef.validateForm()
  54. const recipients = values.recipients.join(',')
  55. const data = {
  56. metric: values.metric,
  57. window: `${values.window}m`,
  58. comparator: values.comparator,
  59. threshold: values.threshold + '',
  60. level: values.level,
  61. channel: values.channel,
  62. node_id: this.params.nodeId,
  63. type: this.params.alertType,
  64. recipients,
  65. scope: this.$store.getters.scope,
  66. }
  67. if (this.params.list && this.params.list.onManager) {
  68. await this.params.list.onManager('create', { managerArgs: { data } })
  69. } else {
  70. await this.params.alertManager.create({
  71. data,
  72. })
  73. }
  74. this.loading = false
  75. this.cancelDialog()
  76. this.$message.success(this.$t('compute.text_423'))
  77. } catch (error) {
  78. this.loading = false
  79. throw error
  80. }
  81. },
  82. },
  83. }
  84. </script>