Create.vue 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{ $t('cloudenv.text_492') }}</div>
  4. <div slot="body">
  5. <a-form
  6. :form="form.fc"
  7. v-bind="formItemLayout">
  8. <template v-if="showDomainSelect">
  9. <a-form-item :label="`${$t('network.text_205', [$t('dictionary.domain')])}`">
  10. <base-select
  11. v-decorator="decorators.project_domain"
  12. resource="domains"
  13. version="v1"
  14. :params="domainProps"
  15. filterable
  16. :select-props="{ placeholder: $t('rules.domain') }" />
  17. </a-form-item>
  18. </template>
  19. <a-form-item :label="$t('dictionary.cloudprovider')">
  20. <base-select
  21. v-decorator="decorators.manager_id"
  22. resource="cloudproviders"
  23. filterable
  24. isDefaultSelect
  25. :params="cloudproviderParams"
  26. :item.sync="form.fi.cloudprovider" />
  27. </a-form-item>
  28. <a-form-item :label="$t('common.name')">
  29. <a-input v-decorator="decorators.name" :placeholder="$t('validator.serverCreateName')" @change="e => { form.fi.generate_name = e.target.value }" />
  30. <name-repeated
  31. v-if="form.fi.generate_name"
  32. res="servers"
  33. version="v1"
  34. :name="form.fi.generate_name"
  35. :params="nameRepeatParams" />
  36. </a-form-item>
  37. <a-form-item :label="$t('common.description')">
  38. <a-textarea :auto-size="{ minRows: 1, maxRows: 3 }" v-decorator="decorators.description" :placeholder="$t('common_367')" />
  39. </a-form-item>
  40. <!-- <a-form-item :label="$t('common.brand')">
  41. <a-select
  42. showSearch
  43. :filterOption="filterOption"
  44. v-decorator="decorators.provider"
  45. :placeholder="$t('rules.provider')"
  46. :disabled="!!params.provider"
  47. @change="handleProviderChange">
  48. <template v-for="item of providerOptions">
  49. <a-select-option :key="item[0]" :value="item[1].provider">{{ item[1].label }}</a-select-option>
  50. </template>
  51. </a-select>
  52. </a-form-item> -->
  53. <a-form-item :label="$t('dictionary.policy')">
  54. <list-select
  55. v-decorator="decorators.cloudpolicy_ids"
  56. :listProps="policySelectProps"
  57. multiple
  58. :formatter="row => `${row.name} / ${row.description || ''}`"
  59. :dialog-params="{ mask: false, width: 900, title: $t('rules.policy') }" />
  60. </a-form-item>
  61. </a-form>
  62. </div>
  63. <div slot="footer">
  64. <a-button type="primary" @click="handleConfirm" :loading="loading">{{ $t('dialog.ok') }}</a-button>
  65. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  66. </div>
  67. </base-dialog>
  68. </template>
  69. <script>
  70. // import get from 'lodash/get'
  71. import { mapGetters } from 'vuex'
  72. import DialogMixin from '@/mixins/dialog'
  73. import WindowsMixin from '@/mixins/windows'
  74. import NameRepeated from '@/sections/NameRepeated'
  75. import ListSelect from '@/sections/ListSelect'
  76. import { getNameFilter } from '@/utils/common/tableFilter'
  77. // import { HYPERVISORS_MAP } from '@/constants'
  78. export default {
  79. name: 'CloudgroupCreateDialog',
  80. components: {
  81. NameRepeated,
  82. ListSelect,
  83. },
  84. mixins: [DialogMixin, WindowsMixin],
  85. data () {
  86. // const providerOptions = Object.entries(HYPERVISORS_MAP).filter(item => {
  87. // return (this.$store.getters.capability.cloud_id_brands || []).includes(item[1].provider) && this.$store.getters.capability.brands.includes(item[1].provider)
  88. // })
  89. // const firstProvider = get(providerOptions, '[0][1].provider')
  90. return {
  91. loading: false,
  92. form: {
  93. fc: this.$form.createForm(this),
  94. fi: {
  95. generate_name: '',
  96. provider: this.params.provider || '',
  97. },
  98. },
  99. // providerOptions,
  100. decorators: {
  101. name: [
  102. 'name',
  103. {
  104. validateFirst: true,
  105. rules: [
  106. { required: true, message: this.$t('common.text00042') },
  107. ],
  108. },
  109. ],
  110. description: ['description'],
  111. provider: [
  112. 'provider',
  113. {
  114. initialValue: this.params.provider || '',
  115. rules: [
  116. { required: true, message: this.$t('rules.provider') },
  117. ],
  118. },
  119. ],
  120. manager_id: [
  121. 'manager_id',
  122. {
  123. rules: [
  124. { required: true, message: this.$t('common.select') },
  125. ],
  126. },
  127. ],
  128. cloudpolicy_ids: [
  129. 'cloudpolicy_ids',
  130. ],
  131. project_domain: [
  132. 'project_domain',
  133. {
  134. rules: [
  135. { required: true, message: this.$t('rules.domain') },
  136. ],
  137. },
  138. ],
  139. },
  140. policySelectProps: {
  141. list: this.$list.createList(this, {
  142. id: this.id,
  143. resource: 'cloudpolicies',
  144. apiVersion: 'v1',
  145. getParams: () => {
  146. return {
  147. scope: this.$store.getters.scope,
  148. manager_id: this.form.fc.getFieldValue('manager_id'),
  149. }
  150. },
  151. filterOptions: {
  152. name: getNameFilter(),
  153. description: {
  154. label: this.$t('table.title.desc'),
  155. filter: true,
  156. formatter: val => {
  157. return `description.contains(${val})`
  158. },
  159. },
  160. },
  161. }),
  162. columns: [
  163. {
  164. field: 'name',
  165. title: this.$t('table.title.name'),
  166. showOverflow: 'title',
  167. },
  168. {
  169. field: 'description',
  170. title: this.$t('table.title.desc'),
  171. showOverflow: 'title',
  172. },
  173. ],
  174. },
  175. formItemLayout: {
  176. wrapperCol: {
  177. span: 21,
  178. },
  179. labelCol: {
  180. span: 3,
  181. },
  182. },
  183. }
  184. },
  185. computed: {
  186. ...mapGetters(['scope', 'isAdminMode']),
  187. nameRepeatParams () {
  188. return {
  189. provider: this.form.fi.cloudprovider?.provider,
  190. }
  191. },
  192. domainProps () {
  193. return {
  194. scope: this.scope,
  195. }
  196. },
  197. showDomainSelect () {
  198. return this.isAdminMode && !(this.params.cloudaccount?.domain_id)
  199. },
  200. cloudproviderParams () {
  201. const ret = {
  202. scope: this.$store.getters.scope,
  203. cloudaccount_id: this.params.cloudaccount.id,
  204. }
  205. const { cloud_id_brands = [], brands = [] } = this.$store.getters.capability || {}
  206. const list = [...cloud_id_brands].filter(l => brands.includes(l))
  207. ret.brands = list
  208. return ret
  209. },
  210. },
  211. methods: {
  212. async handleConfirm () {
  213. this.loading = true
  214. try {
  215. const values = await this.form.fc.validateFields()
  216. values.project_domain = values.project_domain || this.params.cloudaccount?.domain_id
  217. await this.params.onManager('create', {
  218. managerArgs: {
  219. data: values,
  220. },
  221. })
  222. this.cancelDialog()
  223. } finally {
  224. this.loading = false
  225. }
  226. },
  227. handleProviderChange (val) {
  228. this.form.fi.provider = val
  229. },
  230. filterOption (input, option) {
  231. return (
  232. option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
  233. )
  234. },
  235. },
  236. }
  237. </script>