AttachDisk.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{$t('compute.text_1084')}}</div>
  4. <div slot="body">
  5. <a-alert class="mb-2" type="warning" :message="message" />
  6. <dialog-selected-tips :count="params.data.length" :action="$t('compute.text_1084')" :name="$t('dictionary.snapshotpolicy')" />
  7. <dialog-table :data="params.data" :columns="params.columns.slice(0, 3)" />
  8. <loader loading v-if="!bindedDisksLoaded" />
  9. <a-form :form="form.fc" hideRequiredMark v-else>
  10. <a-form-item :label="$t('compute.text_376')" v-bind="formItemLayout">
  11. <list-select
  12. v-if="form.fc.getFieldValue('disks')"
  13. v-decorator="decorators.disks"
  14. :list-props="diskProps"
  15. :multiple="true"
  16. :formatter="v => v.name" />
  17. </a-form-item>
  18. </a-form>
  19. </div>
  20. <div slot="footer">
  21. <a-button type="primary" @click="handleConfirm" :loading="loading">{{ $t('dialog.ok') }}</a-button>
  22. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  23. </div>
  24. </base-dialog>
  25. </template>
  26. <script>
  27. import { mapGetters } from 'vuex'
  28. import * as R from 'ramda'
  29. import DialogMixin from '@/mixins/dialog'
  30. import WindowsMixin from '@/mixins/windows'
  31. import { HYPERVISORS_MAP } from '@/constants'
  32. import ListSelect from '@/sections/ListSelect'
  33. import DiskPropsMixin from '../mixins/diskProps'
  34. export default {
  35. name: 'AttachDiskDialog',
  36. components: {
  37. ListSelect,
  38. },
  39. mixins: [DialogMixin, WindowsMixin, DiskPropsMixin],
  40. data () {
  41. return {
  42. loading: false,
  43. form: {
  44. fc: this.$form.createForm(this),
  45. },
  46. decorators: {
  47. disks: [
  48. 'disks',
  49. {
  50. initialValue: [],
  51. },
  52. ],
  53. },
  54. formItemLayout: {
  55. wrapperCol: {
  56. span: 21,
  57. },
  58. labelCol: {
  59. span: 3,
  60. },
  61. },
  62. disksInitLoaded: false,
  63. bindedDisks: [],
  64. bindedDisksLoaded: false,
  65. }
  66. },
  67. computed: {
  68. ...mapGetters(['scope']),
  69. isAzure () {
  70. return this.params.data[0].provider === HYPERVISORS_MAP.azure.provider
  71. },
  72. isUCloud () {
  73. return this.params.data[0].provider === HYPERVISORS_MAP.ucloud.provider
  74. },
  75. message () {
  76. return this.$t('compute.text_1086')
  77. },
  78. diskParams () {
  79. return { limit: 20, tenant: this.params.data[0].tenant_id }
  80. },
  81. },
  82. watch: {
  83. bindedDisks (val) {
  84. if (val) {
  85. const ids = val.map((item) => { return item.id })
  86. this.$nextTick(() => {
  87. this.form.fc.setFieldsValue({ disks: ids })
  88. })
  89. }
  90. },
  91. },
  92. created () {
  93. this.fetchBindedDisks()
  94. },
  95. methods: {
  96. mapperDisks (data) {
  97. data = data.concat(this.bindedDisks)
  98. data = R.uniqBy(item => item.id, data)
  99. data = data.filter((item) => { return ['OneCloud', 'Qcloud', 'Aliyun'].includes(item.brand) && item.guest_count > 0 })
  100. return data
  101. },
  102. async fetchBindedDisks () {
  103. const manager = new this.$Manager('disks')
  104. try {
  105. const { data: { data = [] } } = await manager.list({
  106. params: {
  107. scope: this.scope,
  108. snapshotpolicy_id: this.params.data[0].id,
  109. },
  110. })
  111. this.bindedDisks = data
  112. this.bindedDisksLoaded = true
  113. } catch (error) {
  114. throw error
  115. }
  116. },
  117. async handleConfirm () {
  118. const manager = new this.$Manager('disks')
  119. this.loading = true
  120. try {
  121. const values = await this.form.fc.validateFields()
  122. const ids = values.disks
  123. const disk = this.getDisks(ids, this.bindedDisks)
  124. const data = {
  125. snapshotpolicy_id: this.params.data[0].id,
  126. }
  127. if (disk.addDisks.length > 0) {
  128. await manager.batchPerformAction({
  129. ids: disk.addDisks,
  130. action: 'set-snapshotpolicy',
  131. data,
  132. })
  133. }
  134. if (disk.delDisks.length > 0) {
  135. await manager.batchPerformAction({
  136. ids: disk.delDisks,
  137. action: 'unbind-snapshotpolicy',
  138. data,
  139. })
  140. }
  141. this.params.refresh && this.params.refresh()
  142. this.cancelDialog()
  143. } finally {
  144. this.loading = false
  145. }
  146. },
  147. getDisks (newDisks = [], oldDisks = []) {
  148. const addDisks = []
  149. const delDisks = []
  150. const oldDiskIds = oldDisks.map((item) => { return item.id })
  151. newDisks.forEach((diskId) => {
  152. if (!oldDiskIds.includes(diskId)) {
  153. addDisks.push(diskId)
  154. }
  155. })
  156. oldDiskIds.forEach((diskId) => {
  157. if (!newDisks.includes(diskId)) {
  158. delDisks.push(diskId)
  159. }
  160. })
  161. return {
  162. addDisks,
  163. delDisks,
  164. }
  165. },
  166. },
  167. }
  168. </script>