| 
									
										
										
										
											2024-02-06 08:10:49 +00:00
										 |  |  | {{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"> | 
					
						
							| 
									
										
										
										
											2024-02-27 15:28:35 +00:00
										 |  |  |     <a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }"> | 
					
						
							| 
									
										
										
										
											2024-02-06 08:10:49 +00:00
										 |  |  |         <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()" | 
					
						
							| 
									
										
										
										
											2024-02-06 08:19:07 +00:00
										 |  |  |                 placeholder='{{ i18n "pages.xray.balancer.tagDesc" }}'></a-input> | 
					
						
							| 
									
										
										
										
											2024-02-06 08:10:49 +00:00
										 |  |  |         </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> | 
					
						
							| 
									
										
										
										
											2024-04-02 08:18:44 +00:00
										 |  |  |                 <a-select-option value="leastLoad">Least Load</a-select-option> | 
					
						
							|  |  |  |                 <a-select-option value="leastPing">Least Ping</a-select-option> | 
					
						
							| 
									
										
										
										
											2024-02-06 08:10:49 +00:00
										 |  |  |             </a-select> | 
					
						
							|  |  |  |         </a-form-item> | 
					
						
							| 
									
										
										
										
											2024-07-14 22:09:31 +00:00
										 |  |  |         <a-form-item label='{{ i18n "pages.xray.balancer.balancerSelectors" }}' has-feedback | 
					
						
							|  |  |  |             :validate-status="balancerModal.emptySelector? 'warning' : 'success'"> | 
					
						
							| 
									
										
										
										
											2024-02-06 08:10:49 +00:00
										 |  |  |             <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> | 
					
						
							| 
									
										
										
										
											2024-07-14 22:09:31 +00:00
										 |  |  |         <a-form-item label="Fallback"> | 
					
						
							|  |  |  |             <a-select v-model="balancerModal.balancer.fallbackTag" clearable | 
					
						
							|  |  |  |                 :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> | 
					
						
							| 
									
										
										
										
											2024-02-06 08:10:49 +00:00
										 |  |  |         </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', | 
					
						
							| 
									
										
										
										
											2024-07-14 22:09:31 +00:00
										 |  |  |             selector: [], | 
					
						
							|  |  |  |             fallbackTag: '' | 
					
						
							| 
									
										
										
										
											2024-02-06 08:10:49 +00:00
										 |  |  |         }, | 
					
						
							|  |  |  |         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', | 
					
						
							| 
									
										
										
										
											2024-07-14 22:09:31 +00:00
										 |  |  |                     selector: [], | 
					
						
							|  |  |  |                     fallbackTag: '' | 
					
						
							| 
									
										
										
										
											2024-02-06 08:10:49 +00:00
										 |  |  |                 }; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             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; | 
					
						
							| 
									
										
										
										
											2024-02-22 19:42:26 +00:00
										 |  |  |             this.check(); | 
					
						
							|  |  |  |             this.checkSelector(); | 
					
						
							| 
									
										
										
										
											2024-02-06 08:10:49 +00:00
										 |  |  |         }, | 
					
						
							|  |  |  |         close() { | 
					
						
							| 
									
										
										
										
											2024-02-22 19:42:26 +00:00
										 |  |  |             this.visible = false; | 
					
						
							|  |  |  |             this.loading(false); | 
					
						
							| 
									
										
										
										
											2024-02-06 08:10:49 +00:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2024-02-21 11:39:56 +00:00
										 |  |  |         loading(loading=true) { | 
					
						
							| 
									
										
										
										
											2024-02-22 19:42:26 +00:00
										 |  |  |             this.confirmLoading = loading; | 
					
						
							| 
									
										
										
										
											2024-02-06 08:10:49 +00:00
										 |  |  |         }, | 
					
						
							|  |  |  |         check() { | 
					
						
							| 
									
										
										
										
											2024-02-22 19:42:26 +00:00
										 |  |  |             if (this.balancer.tag == '' || this.balancerTags.includes(this.balancer.tag)) { | 
					
						
							| 
									
										
										
										
											2024-02-06 08:10:49 +00:00
										 |  |  |                 this.duplicateTag = true; | 
					
						
							|  |  |  |                 this.isValid = false; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 this.duplicateTag = false; | 
					
						
							|  |  |  |                 this.isValid = true; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         checkSelector() { | 
					
						
							| 
									
										
										
										
											2024-02-22 19:42:26 +00:00
										 |  |  |             this.emptySelector = this.balancer.selector.length == 0; | 
					
						
							| 
									
										
										
										
											2024-02-06 08:10:49 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     new Vue({ | 
					
						
							|  |  |  |         delimiters: ['[[', ']]'], | 
					
						
							|  |  |  |         el: '#balancer-modal', | 
					
						
							|  |  |  |         data: { | 
					
						
							|  |  |  |             balancerModal: balancerModal | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         methods: { | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </script> | 
					
						
							|  |  |  | {{end}} |