{{define "balancerModal"}} <a-modal id="balancer-modal" v-model="balancerModal.visible" :title="balancerModal.title" @ok="balancerModal.ok" :confirm-loading="balancerModal.confirmLoading" :ok-button-props="{ props: { disabled: !balancerModal.isValid } }" :closable="true" :mask-closable="false" :ok-text="balancerModal.okText" cancel-text='{{ i18n "close" }}' :class="themeSwitcher.currentTheme"> <a-form :colon="false" :label-col="{ md: {span:6} }" :wrapper-col="{ md: {span:14} }"> <a-form-item label='{{ i18n "pages.xray.balancer.tag" }}' has-feedback :validate-status="balancerModal.duplicateTag? 'warning' : 'success'"> <a-input v-model.trim="balancerModal.balancer.tag" @change="balancerModal.check()" placeholder='{{ i18n "pages.xray.balancer.tagDesc" }}'></a-input> </a-form-item> <a-form-item label='{{ i18n "pages.xray.balancer.balancerStrategy" }}'> <a-select v-model="balancerModal.balancer.strategy" :dropdown-class-name="themeSwitcher.currentTheme"> <a-select-option value="random">Random</a-select-option> <a-select-option value="roundRobin">Round Robin</a-select-option> </a-select> </a-form-item> <a-form-item label='{{ i18n "pages.xray.balancer.balancerSelectors" }}' has-feedback :validate-status="balancerModal.emptySelector? 'warning' : 'success'"> <a-select v-model="balancerModal.balancer.selector" mode="tags" @change="balancerModal.checkSelector()" :dropdown-class-name="themeSwitcher.currentTheme"> <a-select-option v-for="tag in balancerModal.outboundTags" :value="tag">[[ tag ]]</a-select-option> </a-select> </a-form-item> </table> </a-form> </a-modal> <script> const balancerModal = { title: '', visible: false, confirmLoading: false, okText: '{{ i18n "sure" }}', isEdit: false, confirm: null, duplicateTag: false, emptySelector: false, balancer: { tag: '', strategy: 'random', selector: [] }, outboundTags: [], balancerTags:[], ok() { if (balancerModal.balancer.selector.length == 0) { balancerModal.emptySelector = true; return; } balancerModal.emptySelector = false; ObjectUtil.execute(balancerModal.confirm, balancerModal.balancer); }, show({ title = '', okText = '{{ i18n "sure" }}', balancerTags = [], balancer, confirm = (balancer) => { }, isEdit = false }) { this.title = title; this.okText = okText; this.confirm = confirm; this.visible = true; if (isEdit) { balancerModal.balancer = balancer; } else { balancerModal.balancer = { tag: '', strategy: 'random', selector: [] }; } this.balancerTags = balancerTags.filter((tag) => tag != balancer.tag); this.outboundTags = app.templateSettings.outbounds.filter((o) => !ObjectUtil.isEmpty(o.tag)).map(obj => obj.tag); this.isEdit = isEdit; this.check() }, close() { balancerModal.visible = false; balancerModal.loading(false); }, loading(loading) { balancerModal.confirmLoading = loading; }, check() { if (balancerModal.balancer.tag == '' || balancerModal.balancerTags.includes(balancerModal.balancer.tag)) { this.duplicateTag = true; this.isValid = false; } else { this.duplicateTag = false; this.isValid = true; } }, checkSelector() { balancerModal.emptySelector = balancerModal.balancer.selector.length == 0; } }; new Vue({ delimiters: ['[[', ']]'], el: '#balancer-modal', data: { balancerModal: balancerModal }, methods: { } }); </script> {{end}}