Create.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{params.title}}</div>
  4. <div slot="body">
  5. <a-form
  6. :form="form.fc"
  7. v-bind="formItemLayout">
  8. <a-form-item :label="$t('dictionary.filesystem')">
  9. <a-input :default-value="filesystem" disabled="true" />
  10. </a-form-item>
  11. <a-form-item :label="$t('common.network.type')">
  12. <a-radio-group v-decorator="decorators.network_type" @change="onResourceTypeChanged">
  13. <a-radio value="vpc">{{$t('common.network.type.vpc')}}</a-radio>
  14. <a-radio value="classic" :disabled="isClassicDisabled">{{$t('common.network.type.classic')}}</a-radio>
  15. </a-radio-group>
  16. </a-form-item>
  17. <template v-if="form.fc.getFieldValue('network_type') !== 'classic'">
  18. <ip-subnet
  19. :label="$t('network.text_211')"
  20. :isRequired="true"
  21. :labelCol="formItemLayout.labelCol"
  22. :wrapperCol="formItemLayout.wrapperCol"
  23. :decorator="decorators"
  24. :vpcParams="vpcParams"
  25. :networkParams="networkParams"
  26. :showIpConfig="false" />
  27. </template>
  28. <a-form-item :label="$t('dictionary.access_group')">
  29. <base-select
  30. v-decorator="decorators.access_group_id"
  31. :params="accessGroupParams"
  32. :select-props="{ placeholder: $t('storage.access.group.select') }"
  33. resource="access_groups"
  34. :filterable="true" />
  35. </a-form-item>
  36. </a-form>
  37. </div>
  38. <div slot="footer">
  39. <a-button type="primary" @click="handleConfirm" :loading="loading.submit">{{ $t('dialog.ok') }}</a-button>
  40. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  41. </div>
  42. </base-dialog>
  43. </template>
  44. <script>
  45. import { mapGetters } from 'vuex'
  46. import DialogMixin from '@/mixins/dialog'
  47. import WindowsMixin from '@/mixins/windows'
  48. import IpSubnet from '@Network/sections/IpSubnet'
  49. export default {
  50. name: 'MountTargetCreateDialog',
  51. components: {
  52. IpSubnet,
  53. },
  54. mixins: [DialogMixin, WindowsMixin],
  55. data () {
  56. return {
  57. loading: {
  58. submit: false,
  59. trafficPolicy: false,
  60. },
  61. form: {
  62. fc: this.$form.createForm(this, { }),
  63. },
  64. formItemLayout: {
  65. wrapperCol: {
  66. span: 20,
  67. },
  68. labelCol: {
  69. span: 4,
  70. },
  71. },
  72. filesystem: this.params.data.name,
  73. decorators: {
  74. vpc: [
  75. 'vpc',
  76. {
  77. rules: [
  78. { required: true, message: this.$t('network.text_274') },
  79. ],
  80. },
  81. ],
  82. network: [
  83. 'network',
  84. {
  85. rules: [
  86. { required: true, message: this.$t('network.text_212') },
  87. ],
  88. },
  89. ],
  90. network_type: [
  91. 'network_type',
  92. {
  93. initialValue: 'vpc',
  94. rules: [
  95. { required: true },
  96. ],
  97. },
  98. ],
  99. access_group_id: [
  100. 'access_group_id',
  101. {
  102. rules: [
  103. { required: true, message: this.$t('storage.access.group.select') },
  104. ],
  105. },
  106. ],
  107. },
  108. }
  109. },
  110. computed: {
  111. ...mapGetters(['isAdminMode', 'scope', 'userInfo']),
  112. vpcParams () {
  113. const params = {
  114. scope: this.scope,
  115. usable: true,
  116. manager: this.params.data.manager_id,
  117. cloudregion_id: this.params.data.cloudregion_id,
  118. }
  119. if (this.isAdminMode) {
  120. params.project_domain = this.params.data.domain_id
  121. delete params.scope
  122. }
  123. return params
  124. },
  125. networkParams () {
  126. const ret = {
  127. limit: 0,
  128. usable: true,
  129. scope: this.scope,
  130. }
  131. return ret
  132. },
  133. accessGroupParams () {
  134. const ret = {
  135. limit: 0,
  136. scope: this.scope,
  137. manager: this.params.data.manager_id,
  138. cloudregion_id: this.params.data.cloudregion_id,
  139. }
  140. if (this.isAdminMode) {
  141. ret.project_domain = this.params.data.domain_id
  142. delete ret.scope
  143. }
  144. return ret
  145. },
  146. isClassicDisabled () {
  147. if (this.params.data.file_system_type === 'standard') {
  148. return false
  149. }
  150. return true
  151. },
  152. },
  153. methods: {
  154. doCreate (data) {
  155. return this.params.onManager('create', {
  156. managerArgs: {
  157. data,
  158. },
  159. })
  160. },
  161. async handleConfirm () {
  162. this.loading = true
  163. try {
  164. let values = await this.form.fc.validateFields()
  165. values = {
  166. generate_name: 'access-group-for-' + this.params.data.name,
  167. file_system_id: this.params.data.id,
  168. ...values,
  169. }
  170. await this.doCreate(values)
  171. this.loading = false
  172. this.cancelDialog()
  173. } catch (error) {
  174. this.loading = false
  175. throw error
  176. }
  177. },
  178. },
  179. }
  180. </script>
  181. <style lang="scss" scoped>
  182. .oc-ttl {
  183. list-style: none;
  184. .oc-ttl-item {
  185. .ant-tag {
  186. cursor: pointer;
  187. }
  188. }
  189. }
  190. </style>