link.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <template>
  2. <base-dialog @cancel="cancelDialog">
  3. <div slot="header">{{ $t('network.ssh-proxy-match.link.create') }}</div>
  4. <div slot="body">
  5. <a-form
  6. :form="form.fc">
  7. <a-form-item :label="$t('network.text_21')" v-bind="formItemLayout">
  8. <a-input v-decorator="decorators.name" :placeholder="$t('network.text_44')" @change="handleNameChange" />
  9. <name-repeated v-slot:extra res="proxy_matches" :name="name" />
  10. </a-form-item>
  11. <area-selects
  12. class="mb-0"
  13. ref="areaSelects"
  14. :wrapperCol="formItemLayout.wrapperCol"
  15. :labelCol="formItemLayout.labelCol"
  16. :names="['provider', 'cloudregion']"
  17. :cloudregionParams="regionParams"
  18. :providerParams="providerParams"
  19. :isRequired="false"
  20. filterBrandResource="compute_engine"
  21. @change="handleRegionChange" />
  22. <a-form-item :label="$t('network.text_277')" v-bind="formItemLayout">
  23. <a-radio-group v-decorator="decorators.match_scope" :defaultChecked="true" @change="handleScopeChange">
  24. <a-radio-button value="vpc" key="vpc">
  25. {{ $t('dictionary.vpc') }}
  26. </a-radio-button>
  27. <a-radio-button value="network" key="network">
  28. {{ $t('compute.text_106') }}
  29. </a-radio-button>
  30. </a-radio-group>
  31. </a-form-item>
  32. <a-form-item label="VPC" v-bind="formItemLayout">
  33. <base-select
  34. v-decorator="decorators.vpc"
  35. resource="vpcs"
  36. @change="handleVpcChange"
  37. :params="vpcParams"
  38. :isDefaultSelect="true"
  39. :needParams="true"
  40. :labelFormat="vpcLabelFormat"
  41. :select-props="{ placeholder: $t('common_226') }" />
  42. </a-form-item>
  43. <a-form-item v-if="showNetworks" :label="$t('compute.text_106')" v-bind="formItemLayout">
  44. <base-select
  45. v-decorator="decorators.network"
  46. resource="networks"
  47. need-params
  48. filterable
  49. :isDefaultSelect="true"
  50. :params="networkParams"
  51. :select-props="{ placeholder: $t('network.text_212') }" />
  52. </a-form-item>
  53. </a-form>
  54. </div>
  55. <div slot="footer">
  56. <a-button type="primary" @click="handleConfirm" :loading="loading">{{ $t('dialog.ok') }}</a-button>
  57. <a-button @click="cancelDialog">{{ $t('dialog.cancel') }}</a-button>
  58. </div>
  59. </base-dialog>
  60. </template>
  61. <script>
  62. import _ from 'lodash'
  63. import * as R from 'ramda'
  64. import { mapGetters } from 'vuex'
  65. import NameRepeated from '@/sections/NameRepeated'
  66. import AreaSelects from '@/sections/AreaSelects'
  67. import DialogMixin from '@/mixins/dialog'
  68. import WindowsMixin from '@/mixins/windows'
  69. export default {
  70. name: 'SshProxyMatchLinkDialog',
  71. components: {
  72. AreaSelects,
  73. NameRepeated,
  74. },
  75. mixins: [DialogMixin, WindowsMixin],
  76. data () {
  77. this.handleNameChange = _.debounce(this._handleNameChange, 500)
  78. return {
  79. loading: false,
  80. manager: new this.$Manager('proxy_matches'),
  81. showNetworks: false,
  82. form: {
  83. fc: this.$form.createForm(this),
  84. },
  85. scope: this.$store.getters.scope,
  86. name: '',
  87. regionId: '',
  88. vpcId: '',
  89. decorators: {
  90. name: [
  91. 'name',
  92. {
  93. validateFirst: true,
  94. validateTrigger: ['blur'],
  95. rules: [
  96. { required: true, message: this.$t('network.text_116') },
  97. { validator: this.$validate('resourceCreateName') },
  98. ],
  99. },
  100. ],
  101. match_scope: [
  102. 'match_scope',
  103. {
  104. initialValue: 'vpc',
  105. rules: [
  106. { required: true, message: this.$t('network.text_343') },
  107. ],
  108. },
  109. ],
  110. vpc: [
  111. 'vpc',
  112. {
  113. initialValue: '',
  114. rules: [
  115. { required: true, message: this.$t('network.text_274') },
  116. ],
  117. },
  118. ],
  119. network: [
  120. 'network',
  121. {
  122. initialValue: '',
  123. rules: [
  124. { required: true, message: this.$t('network.text_212') },
  125. ],
  126. },
  127. ],
  128. },
  129. formItemLayout: {
  130. wrapperCol: {
  131. span: 20,
  132. },
  133. labelCol: {
  134. span: 4,
  135. },
  136. },
  137. }
  138. },
  139. computed: {
  140. ...mapGetters(['isAdminMode', 'isDomainMode', 'userInfo']),
  141. regionParams () {
  142. return {
  143. usable: true,
  144. show_emulated: true,
  145. scope: this.scope,
  146. }
  147. },
  148. providerParams () {
  149. return {
  150. scope: this.scope,
  151. }
  152. },
  153. vpcParams () {
  154. const params = {
  155. limit: 0,
  156. usable_vpc: true,
  157. scope: this.scope,
  158. }
  159. if (this.regionId) params.cloudregion_id = this.regionId
  160. if (!this.regionId) return {}
  161. return params
  162. },
  163. networkParams () {
  164. const params = { scope: this.scope, usable: true, limit: 0 }
  165. if (this.vpcId) {
  166. params.vpc = this.vpcId
  167. }
  168. return params
  169. },
  170. },
  171. methods: {
  172. _handleNameChange (e) {
  173. this.name = e.target.value
  174. },
  175. handleScopeChange (e) {
  176. this.showNetworks = e.target.value === 'network'
  177. },
  178. handleVpcChange (e) {
  179. this.vpcId = e
  180. },
  181. handleRegionChange (data) {
  182. if (!R.isEmpty(data.cloudregion) && !R.isNil(data.cloudregion)) {
  183. this.regionId = data.cloudregion.id
  184. }
  185. },
  186. vpcLabelFormat (item) {
  187. if (item.manager) {
  188. if (item.cidr_block) {
  189. return <div><span class="text-color-secondary">VPC:</span> { item.name }<span>({ item.cidr_block })</span><span class="ml-2 text-color-secondary">{this.$t('common_711')}: { item.manager }</span></div>
  190. }
  191. return <div><span class="text-color-secondary">VPC:</span> { item.name }<span class="ml-2 text-color-secondary">{this.$t('common_711')}: { item.manager }</span></div>
  192. }
  193. return <div>{ item.name }</div>
  194. },
  195. doCreate (data) {
  196. return this.manager.create({
  197. data: {
  198. generate_name: data.name,
  199. proxy_endpoint: this.params.proxy_endpoint_id,
  200. match_scope: data.match_scope,
  201. match_value: data.match_scope === 'vpc' ? data.vpc : data.network,
  202. },
  203. })
  204. },
  205. async handleConfirm () {
  206. this.loading = true
  207. try {
  208. const values = await this.form.fc.validateFields()
  209. await this.doCreate(values)
  210. this.loading = false
  211. if (this.params.list && typeof this.params.list.fetchData === 'function') {
  212. this.params.list.fetchData()
  213. }
  214. this.cancelDialog()
  215. } catch (error) {
  216. this.loading = false
  217. }
  218. },
  219. },
  220. }
  221. </script>