{{define "inboundModal"}} <a-modal id="inbound-modal" v-model="inModal.visible" :title="inModal.title" @ok="inModal.ok" :confirm-loading="inModal.confirmLoading" :closable="true" :mask-closable="false" :ok-text="inModal.okText" cancel-text='{{ i18n "close" }}'> {{template "form/inbound"}} </a-modal> <script> const inModal = { title: '', visible: false, confirmLoading: false, okText: '{{ i18n "sure" }}', isEdit: false, confirm: null, inbound: new Inbound(), dbInbound: new DBInbound(), ok() { ObjectUtil.execute(inModal.confirm, inModal.inbound, inModal.dbInbound); }, show({ title='', okText='{{ i18n "sure" }}', inbound=null, dbInbound=null, confirm=(inbound, dbInbound)=>{}, isEdit=false }) { this.title = title; this.okText = okText; if (inbound) { this.inbound = Inbound.fromJson(inbound.toJson()); } else { this.inbound = new Inbound(); } if (dbInbound) { this.dbInbound = new DBInbound(dbInbound); } else { this.dbInbound = new DBInbound(); } this.confirm = confirm; this.visible = true; this.isEdit = isEdit; }, close() { inModal.visible = false; inModal.loading(false); }, loading(loading) { inModal.confirmLoading = loading; }, }; const protocols = { VMESS: Protocols.VMESS, VLESS: Protocols.VLESS, TROJAN: Protocols.TROJAN, SHADOWSOCKS: Protocols.SHADOWSOCKS, DOKODEMO: Protocols.DOKODEMO, SOCKS: Protocols.SOCKS, HTTP: Protocols.HTTP, }; new Vue({ delimiters: ['[[', ']]'], el: '#inbound-modal', data: { inModal: inModal, Protocols: protocols, SSMethods: SSMethods, get inbound() { return inModal.inbound; }, get dbInbound() { return inModal.dbInbound; }, get isEdit() { return inModal.isEdit; } }, methods: { streamNetworkChange(oldValue) { if (oldValue === 'kcp') { this.inModal.inbound.tls = false; } }, addClient(protocol, clients) { switch (protocol) { case Protocols.VMESS: return clients.push(new Inbound.VmessSettings.Vmess()); case Protocols.VLESS: return clients.push(new Inbound.VLESSSettings.VLESS()); case Protocols.TROJAN: return clients.push(new Inbound.TrojanSettings.Trojan()); default: return null; } }, removeClient(index, clients) { clients.splice(index, 1); }, async resetClientTraffic(client,event) { const msg = await HttpUtil.post('/xui/inbound/resetClientTraffic/'+ client.email); if (!msg.success) { return; } clientStats = this.inbound.clientStats if(clientStats.length > 0) { for (const key in clientStats) { if (Object.hasOwnProperty.call(clientStats, key)) { if(clientStats[key]['email'] == client.email){ clientStats[key]['up'] = 0 clientStats[key]['down'] = 0 } } } } }, isExpiry(index) { return this.inbound.isExpiry(index) }, getUpStats(email) { clientStats = this.inbound.clientStats if(clientStats.length > 0) { for (const key in clientStats) { if (Object.hasOwnProperty.call(clientStats, key)) { if(clientStats[key]['email'] == email) return clientStats[key]['up'] } } } }, getDownStats(email) { clientStats = this.inbound.clientStats if(clientStats.length > 0) { for (const key in clientStats) { if (Object.hasOwnProperty.call(clientStats, key)) { if(clientStats[key]['email'] == email) return clientStats[key]['down'] } } } }, isClientEnable(email) { clientStats = this.dbInbound.clientStats ? this.dbInbound.clientStats.find(stats => stats.email === email) : null return clientStats ? clientStats['enable'] : true }, getHeaderText(email) { if(email == "") return "Add Client" return email + (this.isClientEnable(email) == true ? ' Active' : ' Deactive') }, getHeaderStyle(email) { return (this.isClientEnable(email) == true ? '' : 'deactive-client') }, getNewEmail(client) { var chars = 'abcdefghijklmnopqrstuvwxyz1234567890'; var string = ''; var len = 7 + Math.floor(Math.random() * 5) for(var ii=0; ii<len; ii++){ string += chars[Math.floor(Math.random() * chars.length)]; } client.email = string } }, }); </script> {{end}}