| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- <template>
- <div>
- <a-form-item class="mb-0">
- <a-radio-group v-decorator="decorators.type" :disabled="disabled" @change="handleTypeChange">
- <a-radio-button
- v-for="item of types"
- :key="item.key"
- :value="item.key">{{ item.label }}</a-radio-button>
- </a-radio-group>
- </a-form-item>
- <a-form-item class="mb-0" v-if="isBind">
- <div slot="extra">{{$t('compute.text_188', [_max])}}<help-link :href="href">{{$t('compute.text_189')}}</help-link>
- </div>
- <base-select
- remote
- class="w-50 pr-1"
- v-decorator="secgroupDecorator"
- resource="secgroups"
- :params="params"
- :showSync="true"
- :select-props="{ allowClear: true, placeholder: $t('compute.text_190'), mode: 'multiple' }" />
- </a-form-item>
- </div>
- </template>
- <script>
- import * as R from 'ramda'
- import { SECGROUP_OPTIONS_MAP } from '@Compute/constants'
- import { HYPERVISORS_MAP } from '@/constants'
- export default {
- name: 'SecgroupConfig',
- props: {
- decorators: {
- type: Object,
- required: true,
- validator: val => val.type && val.secgroup,
- },
- secgroupParams: {
- type: Object,
- default: () => ({}),
- },
- form: {
- type: Object,
- },
- isSnapshotImageType: { // 表单的镜像类型是否是主机快照
- type: Boolean,
- default: false,
- },
- hypervisor: {
- type: String,
- default: HYPERVISORS_MAP.kvm.key,
- },
- max: {
- type: Number,
- },
- showSecgroupBind: {
- type: Boolean,
- default: true,
- },
- },
- data () {
- // const concatRules = (k, l, r) => k === 'rules' ? R.concat(l, r) : r
- // const secgroupDecMsg = R.mergeDeepWithKey(concatRules,
- // (this.decorators.secgroup[1] || {}),
- // { rules: [{ validator: this.validateSecgroups }] },
- // )
- return {
- isBind: this.decorators.type[1].initialValue === SECGROUP_OPTIONS_MAP.bind.key,
- loading: false,
- disabled: false,
- // secgroupDecorator: [
- // this.decorators.secgroup[0],
- // this.secgroupDecMsg,
- // ],
- }
- },
- computed: {
- types () {
- const types = { ...SECGROUP_OPTIONS_MAP }
- if (this.isInCloudSphere || !this.showSecgroupBind) {
- delete types.bind
- }
- return types
- },
- params () {
- const params = {
- limit: 20,
- scope: this.$store.getters.scope,
- ...this.secgroupParams,
- }
- if (this.secgroupParams.project_domain) delete params.scope
- return params
- },
- href () {
- const url = this.$router.resolve('/secgroup')
- return url.href
- },
- isInCloudSphere () {
- return this.hypervisor.toLowerCase() === HYPERVISORS_MAP.incloudsphere.hypervisor.toLowerCase()
- },
- isAzure () {
- return this.hypervisor.toLowerCase() === HYPERVISORS_MAP.azure.hypervisor.toLowerCase()
- },
- isUCloud () {
- return this.hypervisor.toLowerCase() === HYPERVISORS_MAP.ucloud.hypervisor.toLowerCase()
- },
- isZstack () {
- return this.hypervisor.toLowerCase() === HYPERVISORS_MAP.zstack.hypervisor.toLowerCase()
- },
- _max () {
- if (this.max) {
- return this.max
- }
- return (this.isAzure || this.isUCloud || this.isZstack) ? 1 : 5
- },
- secgroupDecorator () {
- const concatRules = (k, l, r) => k === 'rules' ? R.concat(l, r) : r
- const obj = R.mergeDeepWithKey(concatRules,
- (this.decorators.secgroup[1] || {}),
- {
- rules: [{ validator: this.validateSecgroups }],
- initialValue: this.decorators.secgroup[1].initialValue || [],
- },
- )
- if (obj.rules.length > 1) {
- obj.validateFirst = true
- }
- const arr = [
- this.decorators.secgroup[0],
- obj,
- ]
- return arr
- },
- },
- watch: {
- isSnapshotImageType (val) {
- if (val) {
- this.disabled = true
- this.form.fc.setFieldsValue({
- [this.decorators.type[0]]: SECGROUP_OPTIONS_MAP.none.key,
- })
- } else {
- this.disabled = false
- }
- },
- hypervisor () {
- if (this.form && this.form.fc) {
- this.form.fc.validateFields([this.decorators.secgroup[0]])
- }
- },
- types (val) {
- if (!val.bind && this.form.fd && this.form.fd[this.decorators.type[0]] === 'bind' && this.form && this.form.fc) {
- this.form.fc.setFieldsValue({
- [this.decorators.type[0]]: 'default',
- })
- this.isBind = false
- }
- },
- },
- methods: {
- validateSecgroups (rule, value, callback) {
- const max = this._max
- const maxError = this.$t('compute.text_191', [max])
- const minError = this.$t('compute.text_192')
- if (value.length > max) {
- return callback(maxError)
- }
- if (value.length < 1) {
- return callback(minError)
- }
- return callback()
- },
- handleTypeChange (e) {
- this.isBind = (e.target.value === SECGROUP_OPTIONS_MAP.bind.key)
- },
- },
- }
- </script>
|