BindInstanceGroup.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{ action }}</div>
  4. <div slot="body">
  5. <a-alert class="mb-2" type="warning">
  6. <template v-slot:message>
  7. <div>{{$t('compute.text_704', [$t('dictionary.instancegroup'), $t('dictionary.instancegroup')])}}</div>
  8. <div class="mt-2">{{$t('compute.text_707', [$t('dictionary.instancegroup') ])}}</div>
  9. </template>
  10. </a-alert>
  11. <dialog-selected-tips :name="params.name || $t('dictionary.instancegroup')" :count="params.data.length" :action="action" />
  12. <dialog-table :data="params.data" :columns="params.columns.slice(0, 3)" />
  13. <div class="d-flex align-items-center">
  14. <div class="mr-2">{{ $t('dictionary.instancegroup') }}:</div>
  15. <div class="flex-fill">
  16. <a-select
  17. v-if="instanceGroupsLoaded"
  18. class="w-100"
  19. mode="multiple"
  20. :placeholder="$t('compute.text_702', [$t('dictionary.instancegroup')])"
  21. :defaultValue="defaultSelected"
  22. :loading="instanceGroupsLoading"
  23. :filter-option="false"
  24. @search="debounceFetchInstanceGroups"
  25. @change="handleSelectChange">
  26. <a-select-option
  27. v-for="item of instanceGroups"
  28. :key="item.id">{{ item.name }}</a-select-option>
  29. </a-select>
  30. </div>
  31. </div>
  32. </div>
  33. <div slot="footer">
  34. <a-button type="primary" @click="handleConfirm" :loading="loading">{{ $t('dialog.ok') }}</a-button>
  35. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  36. </div>
  37. </base-dialog>
  38. </template>
  39. <script>
  40. import debounce from 'lodash/debounce'
  41. import { mapGetters } from 'vuex'
  42. import DialogMixin from '@/mixins/dialog'
  43. import WindowsMixin from '@/mixins/windows'
  44. export default {
  45. name: 'VmBindInstanceGroupDialog',
  46. mixins: [DialogMixin, WindowsMixin],
  47. data () {
  48. return {
  49. loading: false,
  50. action: this.$t('compute.text_1181', [this.$t('dictionary.instancegroup')]),
  51. // 获取的主机列表
  52. instanceGroups: [],
  53. instanceGroupsLoading: false,
  54. // 主机列表是否已加载
  55. instanceGroupsLoaded: false,
  56. // 已选择的主机
  57. selectedInstanceGroups: [],
  58. // 已绑定的主机
  59. bindedInstanceGroups: [],
  60. // 默认选择
  61. defaultSelected: [],
  62. }
  63. },
  64. computed: mapGetters(['scope']),
  65. created () {
  66. this.instanceGroupsManager = new this.$Manager('instancegroups', 'v2')
  67. this.fetchBindedInstanceGroups()
  68. this.debounceFetchInstanceGroups = debounce(this.fetchInstanceGroups, 300)
  69. },
  70. methods: {
  71. async fetchBindedInstanceGroups () {
  72. try {
  73. const { data: { data = [] } } = await this.instanceGroupsManager.list({
  74. params: {
  75. scope: this.scope,
  76. server: this.params.data[0].id,
  77. },
  78. })
  79. this.bindedInstanceGroups = data
  80. this.defaultSelected = data.map(item => item.id)
  81. this.fetchInstanceGroups()
  82. } catch (error) {
  83. throw error
  84. }
  85. },
  86. async fetchInstanceGroups (query) {
  87. this.instanceGroupsLoading = true
  88. const params = {
  89. enabled: true,
  90. scope: this.scope,
  91. project: this.params.data[0].tenant_id,
  92. }
  93. if (query) params.filter = `name.contains("${query}")`
  94. try {
  95. const { data: { data = [] } } = await this.instanceGroupsManager.list({
  96. params,
  97. })
  98. this.instanceGroups = data
  99. this.instanceGroupsLoaded = true
  100. } finally {
  101. this.instanceGroupsLoading = false
  102. }
  103. },
  104. doUpdateBindInstanceGroups (action, ids) {
  105. const data = {}
  106. for (let i = 0, len = ids.length; i < len; i++) {
  107. data[`group.${i}`] = ids[i]
  108. }
  109. return this.params.onManager('performAction', {
  110. id: this.params.data[0].id,
  111. managerArgs: {
  112. action,
  113. data,
  114. },
  115. })
  116. },
  117. async handleConfirm () {
  118. this.loading = true
  119. const unbindIds = this.defaultSelected.filter(item => {
  120. return !this.selectedInstanceGroups.includes(item)
  121. }).filter(item => !!item)
  122. const bindIds = this.selectedInstanceGroups.filter(item => {
  123. return !this.defaultSelected.includes(item)
  124. }).filter(item => !!item)
  125. try {
  126. if (unbindIds && unbindIds.length) {
  127. await this.doUpdateBindInstanceGroups('unbind-groups', unbindIds)
  128. }
  129. if (bindIds && bindIds.length) {
  130. await this.doUpdateBindInstanceGroups('bind-groups', bindIds)
  131. }
  132. this.params.refresh()
  133. this.cancelDialog()
  134. } finally {
  135. this.loading = false
  136. }
  137. },
  138. handleSelectChange (val) {
  139. this.selectedInstanceGroups = val
  140. },
  141. },
  142. }
  143. </script>