diff options
| author | Saeid <43953720+surbiks@users.noreply.github.com> | 2024-02-06 11:10:49 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-06 11:10:49 +0300 |
| commit | c53cee31f5a64ed3292f977bf5a0749324eb78a2 (patch) | |
| tree | 8a900083690e0767ee7fc2371f8203938d6e3a00 /web/html/xui/xray_balancer_modal.html | |
| parent | 222b9734caba389604fd81caa068e815bdb16dcb (diff) | |
Manage balancers in settings UI (#1759)
* add balancer config to ui
* manage balancer in rules table
* fix balancer translations
* fix edit button text
Diffstat (limited to 'web/html/xui/xray_balancer_modal.html')
| -rw-r--r-- | web/html/xui/xray_balancer_modal.html | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/web/html/xui/xray_balancer_modal.html b/web/html/xui/xray_balancer_modal.html new file mode 100644 index 00000000..11eea378 --- /dev/null +++ b/web/html/xui/xray_balancer_modal.html @@ -0,0 +1,111 @@ +{{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 "balancerModal.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}}
\ No newline at end of file |
