Form.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <template>
  2. <div>
  3. <a-form-item :label="$t('common.name')">
  4. <a-input
  5. v-decorator="decorators.name"
  6. :placeholder="$t('common.tips.input', [$t('common.name')])" />
  7. </a-form-item>
  8. <a-form-item :label="$t('compute.repo.image.source')">
  9. <a-radio-group default-value="custom" @change="handleSourceChange">
  10. <a-radio-button value="custom">{{ $t('compute.repo.image.custom') }}</a-radio-button>
  11. <a-radio-button value="registry">{{ $t('compute.repo.image.registry') }}</a-radio-button>
  12. </a-radio-group>
  13. </a-form-item>
  14. <a-form-item v-if="source === 'custom'" :label="$t('compute.repo.container_image')">
  15. <a-input
  16. v-decorator="decorators.image"
  17. :placeholder="$t('common.tips.input', [$t('compute.repo.container_image')])" />
  18. </a-form-item>
  19. <a-form-item v-else :label="$t('compute.repo.container_image')">
  20. <mirror-registry v-decorator="decorators.registryImage" @credential-change="handleCredentialChange" />
  21. <a-input v-show="false" v-decorator="decorators.imageCredentialId" />
  22. </a-form-item>
  23. <a-form-item label="CPU" v-show="false">
  24. <a-input
  25. :placeholder="$t('common.tips.input', [$t('compute.repo.cpu_cores')])"
  26. type="number"
  27. v-decorator="decorators.cpu"
  28. :addonAfter="$t('compute.repo.cpu_cores.unit')"
  29. :min="1"
  30. @blur="e => formatInput(e, 'cpu')" />
  31. </a-form-item>
  32. <a-form-item :label="$t('compute.repo.memory')" v-show="false">
  33. <a-input
  34. v-decorator="decorators.memory"
  35. :placeholder="$t('common.tips.input', [$t('compute.repo.memory')])"
  36. type="number"
  37. addonAfter="G"
  38. :min="1"
  39. @blur="e => formatInput(e, 'memory')" />
  40. </a-form-item>
  41. <a-form-item :label="$t('compute.repo.command')">
  42. <a-input v-decorator="decorators.command" :placeholder="$t('compute.repo.command.placeholder')" />
  43. </a-form-item>
  44. <a-form-item :label="$t('compute.repo.command.params')">
  45. <a-input v-decorator="decorators.arg" :placeholder="$t('compute.repo.command.params.placeholder')" />
  46. </a-form-item>
  47. <a-form-item :label="$t('compute.repo.data_volume')">
  48. <labels
  49. :decorators="decorators.volumeMount"
  50. :title="$t('compute.repo.storage_statement')"
  51. :keyLabel="$t('compute.repo.storage_statement')"
  52. :valueLabel="$t('compute.repo.mount_point')"
  53. :keyPlaceholder="$t('common.tips.select', [$t('compute.repo.storage_volume')])"
  54. :valuePlaceholder="$t('compute.repo.mount_point.example')"
  55. :keyBaseSelectProps="keyBaseSelectProps"
  56. :checkedValues="checkedValues"
  57. @label-change="labelChangeHandle" />
  58. </a-form-item>
  59. <a-form-item :label="$t('compute.repo.env_variables')">
  60. <labels :decorators="decorators.env" :title="$t('compute.repo.variables')" :keyLabel="$t('compute.repo.variables')" />
  61. </a-form-item>
  62. <a-form-item label="">
  63. <a-checkbox v-decorator="decorators.privileged">{{$t('compute.repo.privileged_mode')}}</a-checkbox>
  64. </a-form-item>
  65. </div>
  66. </template>
  67. <script>
  68. import * as R from 'ramda'
  69. import Labels from '@Compute/sections/Labels'
  70. import MirrorRegistry from '@Compute/sections/MirrorRegistry'
  71. export default {
  72. name: 'SpecContainerForm',
  73. components: {
  74. Labels,
  75. MirrorRegistry,
  76. },
  77. props: {
  78. decorators: {
  79. type: Object,
  80. required: true,
  81. },
  82. cluster: String,
  83. namespace: String,
  84. form: {
  85. tpye: Object,
  86. validator: val => val.fc,
  87. },
  88. paneKey: String,
  89. },
  90. data () {
  91. return {
  92. source: 'custom', // custom or registry
  93. labelList: [],
  94. }
  95. },
  96. computed: {
  97. keyBaseSelectProps () {
  98. const { fd } = this.form
  99. const props = {
  100. options: [],
  101. }
  102. if (fd.dataDiskSizes) {
  103. for (const k in fd.dataDiskSizes) {
  104. const label = fd[`dataDiskTypes[${k}]`].label
  105. const idx = fd[`dataDiskTypes[${k}]`].index
  106. props.options.push({
  107. id: `${idx}`,
  108. name: `${this.$t('compute.text_376')}${idx + 1}: ${fd.dataDiskSizes[k]}G${label}`,
  109. })
  110. }
  111. }
  112. return props
  113. },
  114. checkedValues () {
  115. const { fc } = this.form
  116. let checkedValues = []
  117. if (this.labelList) {
  118. const mountNames = fc.getFieldValue('containerVolumeMountNames')
  119. if (mountNames && mountNames[this.paneKey]) {
  120. checkedValues = Object.values(mountNames[this.paneKey])
  121. }
  122. }
  123. return checkedValues
  124. },
  125. },
  126. methods: {
  127. formatInput (e, field) {
  128. if (this.form && this.form.fc) {
  129. const val = Number(e.target.value)
  130. if (R.is(Number, val) && !Number.isNaN(val) && val >= 0) {
  131. } else {
  132. this.form.fc.setFieldsValue({
  133. [this.decorators[field][0]]: 1, // 不合法直接设置为初始值 1
  134. })
  135. }
  136. }
  137. },
  138. handleSourceChange (e) {
  139. this.source = e.target.value
  140. },
  141. handleCredentialChange (credentialId) {
  142. if (this.form && this.form.fc && this.decorators.imageCredentialId) {
  143. this.form.fc.setFieldsValue({
  144. [this.decorators.imageCredentialId[0]]: credentialId,
  145. })
  146. }
  147. },
  148. labelChangeHandle (val) {
  149. this.labelList = val
  150. },
  151. },
  152. }
  153. </script>