Create.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{params.title}}</div>
  4. <div slot="body">
  5. <a-form
  6. class="mt-3"
  7. :form="form.fc"
  8. @submit.prevent="handleSubmit"
  9. v-bind="formItemLayout">
  10. <a-form-item :label="$t('network.text_205', [$t('dictionary.domain')])" v-if="$store.getters.isAdminMode">
  11. <domain-select v-decorator="decorators.project_domain" @change="handleDomainChange" />
  12. </a-form-item>
  13. <a-form-item :label="$t('network.text_717')">
  14. <a-select
  15. v-decorator="decorators.zoneType" @change="zoneTypeChangeHandle">
  16. <a-select-option v-for="v in options.zoneTypes" :value="v.value" :key="v.value">
  17. <div>{{ v.label }}<span class="ml-2">{{ v.desc }}</span></div>
  18. </a-select-option>
  19. </a-select>
  20. </a-form-item>
  21. <a-form-item :label="$t('network.text_156')">
  22. <a-input v-decorator="decorators.name" :placeholder="$t('network.text_157')" />
  23. </a-form-item>
  24. </a-form>
  25. </div>
  26. <div slot="footer">
  27. <a-button type="primary" @click="handleConfirm" :loading="loading">{{ $t('dialog.ok') }}</a-button>
  28. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  29. </div>
  30. </base-dialog>
  31. </template>
  32. <script>
  33. import { mapGetters } from 'vuex'
  34. import DomainSelect from '@/sections/DomainSelect'
  35. import DialogMixin from '@/mixins/dialog'
  36. import WindowsMixin from '@/mixins/windows'
  37. import { validate } from '@/utils/validate'
  38. import { zoneTypes } from '../constants'
  39. export default {
  40. name: 'DnsZoneCreateDialog',
  41. components: {
  42. DomainSelect,
  43. },
  44. mixins: [DialogMixin, WindowsMixin],
  45. data () {
  46. const projectDomainId = this.$store.getters.userInfo.projectDomainId
  47. const zoneType = zoneTypes[0].value
  48. return {
  49. loading: false,
  50. project_domain: projectDomainId,
  51. options: {
  52. zoneTypes,
  53. },
  54. form: {
  55. fc: this.$form.createForm(this, {
  56. onValuesChange: (props, values) => {
  57. Object.keys(values).forEach((key) => {
  58. this.form.fd[key] = values[key]
  59. })
  60. },
  61. }),
  62. fd: {
  63. zoneType,
  64. },
  65. },
  66. decorators: {
  67. project_domain: [
  68. 'project_domain',
  69. {
  70. initialValue: projectDomainId,
  71. },
  72. ],
  73. name: [
  74. 'name',
  75. {
  76. validateFirst: true,
  77. rules: [
  78. { required: true, message: this.$t('network.text_157') },
  79. { validator: this.checkDomainHandle },
  80. ],
  81. },
  82. ],
  83. zoneType: [
  84. 'zoneType',
  85. {
  86. initialValue: zoneType,
  87. validateFirst: true,
  88. rules: [
  89. { required: true, message: this.$t('network.text_717') },
  90. ],
  91. },
  92. ],
  93. },
  94. formItemLayout: {
  95. wrapperCol: {
  96. span: 21,
  97. },
  98. labelCol: {
  99. span: 3,
  100. },
  101. },
  102. }
  103. },
  104. computed: {
  105. ...mapGetters(['isAdminMode', 'scope']),
  106. },
  107. methods: {
  108. doCreate (data) {
  109. return new this.$Manager('dns_zones').create({ data })
  110. },
  111. async handleConfirm () {
  112. this.loading = true
  113. try {
  114. const values = await this.form.fc.validateFields()
  115. const { name, project_domain, zoneType } = values
  116. const data = {
  117. name,
  118. project_domain_id: project_domain,
  119. zone_type: zoneType,
  120. }
  121. await this.doCreate(data)
  122. this.loading = false
  123. this.params.refresh && this.params.refresh()
  124. this.cancelDialog()
  125. } catch (err) {
  126. throw err
  127. } finally {
  128. this.loading = false
  129. }
  130. },
  131. handleDomainChange (val) {
  132. this.project_domain = val
  133. },
  134. checkDomainHandle (rule, value, callback) {
  135. if (this.form.fd.zoneType === 'PublicZone') {
  136. if (validate(value, 'domain') === false || validate(value, 'domain').result === false) {
  137. callback(new Error(this.$t('network.text_178')))
  138. }
  139. }
  140. callback()
  141. },
  142. zoneTypeChangeHandle () {
  143. this.$nextTick(() => {
  144. this.form.fc.validateFields(['name'], { force: true })
  145. })
  146. },
  147. },
  148. }
  149. </script>