Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSaeid <43953720+surbiks@users.noreply.github.com>2024-02-06 11:10:49 +0300
committerGitHub <noreply@github.com>2024-02-06 11:10:49 +0300
commitc53cee31f5a64ed3292f977bf5a0749324eb78a2 (patch)
tree8a900083690e0767ee7fc2371f8203938d6e3a00 /web/html/xui/xray_balancer_modal.html
parent222b9734caba389604fd81caa068e815bdb16dcb (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.html111
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