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:
authorMHSanaei <ho3ein.sanaei@gmail.com>2024-01-26 21:37:15 +0300
committerMHSanaei <ho3ein.sanaei@gmail.com>2024-01-27 00:02:19 +0300
commit9fba92d879767394535f70ba83f0a58d6b063a7d (patch)
treef0d6a8cd5d70c5127c9e992f884e39c91eeb9676
parentdaa43540477e18ae5c6e19e887733b793c17ad72 (diff)
v2.1.2
revert #1650 #1661 #1664 #1670 made panel full of bug
-rw-r--r--.github/workflows/docker.yml2
-rw-r--r--README.md4
-rw-r--r--config/version2
-rw-r--r--web/assets/js/util/utils.js35
-rw-r--r--web/controller/inbound.go111
-rw-r--r--web/html/common/qrcode_modal.html17
-rw-r--r--web/html/xui/client_modal.html154
-rw-r--r--web/html/xui/form/client.html16
-rw-r--r--web/html/xui/inbound_modal.html4
-rw-r--r--web/html/xui/inbounds.html82
-rw-r--r--web/translation/translate.en_US.toml3
-rw-r--r--web/translation/translate.es_ES.toml3
-rw-r--r--web/translation/translate.fa_IR.toml3
-rw-r--r--web/translation/translate.ru_RU.toml3
-rw-r--r--web/translation/translate.vi_VN.toml3
-rw-r--r--web/translation/translate.zh_Hans.toml3
16 files changed, 57 insertions, 388 deletions
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index 6afe8618..1115de37 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -36,6 +36,6 @@ jobs:
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
- platforms: linux/amd64, linux/arm64/v8, linux/arm/v7, linux/arm/v6, linux/386, linux/arm/v5
+ platforms: linux/amd64, linux/arm64/v8, linux/arm/v7, linux/arm/v6, linux/386
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
diff --git a/README.md b/README.md
index 6b0beab7..389d6d1d 100644
--- a/README.md
+++ b/README.md
@@ -25,10 +25,10 @@ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.
## Install Custom Version
-To install your desired version, add the version to the end of the installation command. e.g., ver `v2.1.1`:
+To install your desired version, add the version to the end of the installation command. e.g., ver `v2.1.2`:
```
-bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) v2.1.1
+bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh) v2.1.2
```
## Manual Install & Upgrade
diff --git a/config/version b/config/version
index 7c327287..8f9174b4 100644
--- a/config/version
+++ b/config/version
@@ -1 +1 @@
-2.1.1 \ No newline at end of file
+2.1.2 \ No newline at end of file
diff --git a/web/assets/js/util/utils.js b/web/assets/js/util/utils.js
index 48ff237d..61b322bd 100644
--- a/web/assets/js/util/utils.js
+++ b/web/assets/js/util/utils.js
@@ -83,41 +83,6 @@ class HttpUtil {
}
return msg;
}
-
- static async jsonPost(url, data) {
- let msg;
- try {
- const requestOptions = {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify(data),
- };
- const resp = await fetch(url, requestOptions);
- const response = await resp.json();
-
- msg = this._respToMsg({data : response});
- } catch (e) {
- msg = new Msg(false, e.toString());
- }
- this._handleMsg(msg);
- return msg;
- }
-
- static async postWithModalJson(url, data, modal) {
- if (modal) {
- modal.loading(true);
- }
- const msg = await this.jsonPost(url, data);
- if (modal) {
- modal.loading(false);
- if (msg instanceof Msg && msg.success) {
- modal.close();
- }
- }
- return msg;
- }
}
class PromiseUtil {
diff --git a/web/controller/inbound.go b/web/controller/inbound.go
index 0aa2e2df..86da9813 100644
--- a/web/controller/inbound.go
+++ b/web/controller/inbound.go
@@ -1,7 +1,6 @@
package controller
import (
- "errors"
"encoding/json"
"fmt"
"strconv"
@@ -33,9 +32,7 @@ func (a *InboundController) initRouter(g *gin.RouterGroup) {
g.POST("/clientIps/:email", a.getClientIps)
g.POST("/clearClientIps/:email", a.clearClientIps)
g.POST("/addClient", a.addInboundClient)
- g.POST("/addGroupClient", a.addGroupInboundClient)
g.POST("/:id/delClient/:clientId", a.delInboundClient)
- g.POST("/updateClients", a.updateGroupInboundClient)
g.POST("/updateClient/:clientId", a.updateInboundClient)
g.POST("/:id/resetClientTraffic/:email", a.resetClientTraffic)
g.POST("/resetAllTraffics", a.resetAllTraffics)
@@ -163,51 +160,23 @@ func (a *InboundController) clearClientIps(c *gin.Context) {
func (a *InboundController) addInboundClient(c *gin.Context) {
data := &model.Inbound{}
- err := c.ShouldBind(data)
- if err != nil {
- jsonMsg(c, I18nWeb(c, "pages.inbounds.update"), err)
- return
- }
-
- needRestart := true
-
- needRestart, err = a.inboundService.AddInboundClient(data)
- if err != nil {
- jsonMsg(c, "Something went wrong!", err)
- return
- }
- jsonMsg(c, "Client(s) added", nil)
- if err == nil && needRestart {
- a.xrayService.SetToNeedRestart()
- }
-}
-
-func (a *InboundController) addGroupInboundClient(c *gin.Context) {
- var requestData []model.Inbound
-
- err := c.ShouldBindJSON(&requestData)
-
- if err != nil {
- jsonMsg(c, I18nWeb(c, "pages.inbounds.update"), err)
- return
- }
-
- needRestart := true
-
- for _, data := range requestData {
-
- needRestart, err = a.inboundService.AddInboundClient(&data)
- if err != nil {
- jsonMsg(c, "Something went wrong!", err)
- return
- }
- }
+ err := c.ShouldBind(data)
+ if err != nil {
+ jsonMsg(c, I18nWeb(c, "pages.inbounds.update"), err)
+ return
+ }
- jsonMsg(c, "Client(s) added", nil)
- if err == nil && needRestart {
- a.xrayService.SetToNeedRestart()
- }
+ needRestart := true
+ needRestart, err = a.inboundService.AddInboundClient(data)
+ if err != nil {
+ jsonMsg(c, "Something went wrong!", err)
+ return
+ }
+ jsonMsg(c, "Client(s) added", nil)
+ if err == nil && needRestart {
+ a.xrayService.SetToNeedRestart()
+ }
}
func (a *InboundController) delInboundClient(c *gin.Context) {
@@ -254,56 +223,6 @@ func (a *InboundController) updateInboundClient(c *gin.Context) {
}
}
-func (a *InboundController) updateGroupInboundClient(c *gin.Context) {
- var requestData []map[string]interface{}
-
- if err := c.ShouldBindJSON(&requestData); err != nil {
- jsonMsg(c, I18nWeb(c, "pages.inbounds.update"), err)
- return
- }
-
- needRestart := false
-
- for _, item := range requestData {
-
- inboundMap, ok := item["inbound"].(map[string]interface{})
- if !ok {
- jsonMsg(c, "Something went wrong!", errors.New("Failed to convert 'inbound' to map"))
- return
- }
-
- clientId, ok := item["clientId"].(string)
- if !ok {
- jsonMsg(c, "Something went wrong!", errors.New("Failed to convert 'clientId' to string"))
- return
- }
-
- inboundJSON, err := json.Marshal(inboundMap)
- if err != nil {
- jsonMsg(c, "Something went wrong!", err)
- return
- }
-
- var inboundModel model.Inbound
- if err := json.Unmarshal(inboundJSON, &inboundModel); err != nil {
- jsonMsg(c, "Something went wrong!", err)
- return
- }
-
- if restart, err := a.inboundService.UpdateInboundClient(&inboundModel, clientId); err != nil {
- jsonMsg(c, "Something went wrong!", err)
- return
- } else {
- needRestart = needRestart || restart
- }
- }
-
- jsonMsg(c, "Client updated", nil)
- if needRestart {
- a.xrayService.SetToNeedRestart()
- }
-}
-
func (a *InboundController) resetClientTraffic(c *gin.Context) {
id, err := strconv.Atoi(c.Param("id"))
if err != nil {
diff --git a/web/html/common/qrcode_modal.html b/web/html/common/qrcode_modal.html
index 31b3450c..3c4fd929 100644
--- a/web/html/common/qrcode_modal.html
+++ b/web/html/common/qrcode_modal.html
@@ -11,12 +11,10 @@
<a-divider>Subscription</a-divider>
<div class="qr-bg"><canvas @click="copyToClipboard('qrCode-sub',genSubLink(qrModal.client.subId))" id="qrCode-sub" style="width: 100%; height: 100%;"></canvas></div>
</template>
- <a-divider v-if="!isJustSub">{{ i18n "pages.inbounds.client" }}</a-divider>
- <template v-if="!isJustSub">
- <template v-for="(row, index) in qrModal.qrcodes">
- <a-tag color="green" style="margin: 10px 0; display: block; text-align: center;">[[ row.remark ]]</a-tag>
- <div class="qr-bg"><canvas @click="copyToClipboard('qrCode-'+index, row.link)" :id="'qrCode-'+index" style="width: 100%; height: 100%;"></canvas></div>
- </template>
+ <a-divider>{{ i18n "pages.inbounds.client" }}</a-divider>
+ <template v-for="(row, index) in qrModal.qrcodes">
+ <a-tag color="green" style="margin: 10px 0; display: block; text-align: center;">[[ row.remark ]]</a-tag>
+ <div class="qr-bg"><canvas @click="copyToClipboard('qrCode-'+index, row.link)" :id="'qrCode-'+index" style="width: 100%; height: 100%;"></canvas></div>
</template>
</a-modal>
@@ -29,14 +27,12 @@
qrcodes: [],
clipboard: null,
visible: false,
- isJustSub: false,
subId: '',
- show: function (title = '', dbInbound, client, isJustSub = false) {
+ show: function (title = '', dbInbound, client) {
this.title = title;
this.dbInbound = dbInbound;
this.inbound = dbInbound.toInbound();
this.client = client;
- this.isJustSub = isJustSub;
this.subId = '';
this.qrcodes = [];
this.inbound.genAllLinks(this.dbInbound.remark, app.remarkModel, client).forEach(l => {
@@ -57,9 +53,6 @@
el: '#qrcode-modal',
data: {
qrModal: qrModal,
- get isJustSub(){
- return qrModal.isJustSub
- }
},
methods: {
copyToClipboard(elmentId, content) {
diff --git a/web/html/xui/client_modal.html b/web/html/xui/client_modal.html
index cb15e1e7..4b270607 100644
--- a/web/html/xui/client_modal.html
+++ b/web/html/xui/client_modal.html
@@ -15,16 +15,8 @@
confirmLoading: false,
title: '',
okText: '',
- group: {
- canGroup: true,
- isGroup: false,
- currentClient: null,
- inbounds: [],
- clients: [],
- editIds: []
- },
+ isEdit: false,
dbInbound: new DBInbound(),
- dbInbounds: null,
inbound: new Inbound(),
clients: [],
clientStats: [],
@@ -33,137 +25,33 @@
clientIps: null,
delayedStart: false,
ok() {
- if (clientModal.group.isGroup && clientModal.group.canGroup) {
- const currentClient = clientModal.group.currentClient;
-
- clientModal.group.clients.forEach((client, index) => {
- const { email, limitIp, totalGB, expiryTime, reset, enable, subId, tgId, flow } = currentClient;
-
- const match = email.match(/^(.*?)__/);
- const new_email = match ? match[1] : email;
-
- client.email = `${new_email}__${index + 1}`;
- client.limitIp = limitIp;
- client.totalGB = totalGB;
- client.expiryTime = expiryTime;
- client.reset = reset;
- client.enable = enable;
-
- if (subId) {
- client.subId = subId;
- }
- if (tgId) {
- client.tgId = tgId;
- }
- if (flow) {
- client.flow = flow;
- }
- });
-
- if (clientModal.isEdit) {
- ObjectUtil.execute(clientModal.confirm, clientModal.group.clients, clientModal.group.inbounds, clientModal.group.editIds);
- }else{
- ObjectUtil.execute(clientModal.confirm, clientModal.group.clients, clientModal.group.inbounds);
- }
+ if (clientModal.isEdit) {
+ ObjectUtil.execute(clientModal.confirm, clientModalApp.client, clientModal.dbInbound.id, clientModal.oldClientId);
} else {
- if (clientModal.isEdit){
- ObjectUtil.execute(clientModal.confirm, clientModalApp.client, clientModal.dbInbound.id, clientModal.oldClientId);
- }else{
- ObjectUtil.execute(clientModal.confirm, clientModalApp.client, clientModal.dbInbound.id);
- }
+ ObjectUtil.execute(clientModal.confirm, clientModalApp.client, clientModal.dbInbound.id);
}
},
- show({ title = '', okText = '{{ i18n "sure" }}', index = null, dbInbound = null, dbInbounds = null, confirm = () => { }, isEdit = false }) {
- this.group = {
- canGroup: true,
- isGroup: false,
- currentClient: null,
- inbounds: [],
- clients: [],
- editIds: []
- }
- this.dbInbounds = dbInbounds;
+ show({ title = '', okText = '{{ i18n "sure" }}', index = null, dbInbound = null, confirm = () => { }, isEdit = false }) {
this.visible = true;
this.title = title;
this.okText = okText;
this.isEdit = isEdit;
- if (dbInbounds !== null && Array.isArray(dbInbounds)) {
- if (isEdit) {
- this.showProcess(dbInbound, index);
- let processSingleEdit = true
- if (this.group.canGroup){
- this.group.currentClient = this.clients[this.index]
- const response = this.getGroupInboundsClients(dbInbounds,this.group.currentClient)
- if (response.clients.length > 1){
- this.group.isGroup = true;
- this.group.inbounds = response.inbounds
- this.group.clients = response.clients
- this.group.editIds = response.editIds
- if (this.clients[index].expiryTime < 0) {
- this.delayedStart = true;
- }
- processSingleEdit = false
- }
- }
- if(processSingleEdit){
- this.singleEditClientProcess(index)
- }
- } else {
- this.group.isGroup = true;
- dbInbounds.forEach((dbInboundItem) => {
- this.showProcess(dbInboundItem);
- this.addClient(this.inbound.protocol, this.clients);
- this.group.inbounds.push(dbInboundItem.id)
- this.group.clients.push(this.clients[this.index])
- })
- this.group.currentClient = this.clients[this.index]
- }
- } else {
- this.showProcess(dbInbound, index);
- if (isEdit) {
- this.singleEditClientProcess(index)
- } else {
- this.addClient(this.inbound.protocol, this.clients);
- }
- }
- this.clientStats = this.dbInbound.clientStats.find(row => row.email === this.clients[this.index].email);
- this.confirm = confirm;
- },
- showProcess(dbInbound, index = null) {
this.dbInbound = new DBInbound(dbInbound);
this.inbound = dbInbound.toInbound();
this.clients = this.inbound.clients;
this.index = index === null ? this.clients.length : index;
this.delayedStart = false;
- },
- singleEditClientProcess(index) {
- if (this.clients[index].expiryTime < 0) {
- this.delayedStart = true;
- }
- this.oldClientId = this.getClientId(this.dbInbound.protocol, this.clients[index]);
- },
- getGroupInboundsClients(dbInbounds, currentClient) {
- const response = {
- inbounds: [],
- clients: [],
- editIds: []
- }
- dbInbounds.forEach((dbInboundItem) => {
- const dbInbound = new DBInbound(dbInboundItem);
- const inbound = dbInbound.toInbound();
- const clients = inbound.clients;
- if (clients.length > 0){
- clients.forEach((client) => {
- if (client['subId'] === currentClient['subId']){
- response.inbounds.push(dbInboundItem.id)
- response.clients.push(client)
- response.editIds.push(this.getClientId(dbInbound.protocol, client))
- }
- })
+ if (isEdit) {
+ if (this.clients[index].expiryTime < 0) {
+ this.delayedStart = true;
}
- })
- return response;
- },
+ this.oldClientId = this.getClientId(dbInbound.protocol, clients[index]);
+ } else {
+ this.addClient(this.inbound.protocol, this.clients);
+ }
+ this.clientStats = this.dbInbound.clientStats.find(row => row.email === this.clients[this.index].email);
+ this.confirm = confirm;
+ },
getClientId(protocol, client) {
switch (protocol) {
case Protocols.TROJAN: return client.password;
@@ -206,18 +94,6 @@
get isEdit() {
return this.clientModal.isEdit;
},
- get isGroup() {
- return this.clientModal.group.isGroup;
- },
- get isGroupEdit() {
- return this.clientModal.group.canGroup;
- },
- set isGroupEdit(value) {
- this.clientModal.group.canGroup = value;
- if (!value){
- this.clientModal.singleEditClientProcess(this.clientModal.index)
- }
- },
get datepicker() {
return app.datepicker;
},
diff --git a/web/html/xui/form/client.html b/web/html/xui/form/client.html
index 526bbb8b..63cb8aef 100644
--- a/web/html/xui/form/client.html
+++ b/web/html/xui/form/client.html
@@ -3,18 +3,6 @@
<a-form-item label='{{ i18n "pages.inbounds.enable" }}'>
<a-switch v-model="client.enable"></a-switch>
</a-form-item>
- <a-form-item v-if="isEdit && app.subSettings.enable && isGroup">
- <template slot="label">
- <a-tooltip>
- <template slot="title">
- <span>{{ i18n "pages.inbounds.isGroupEditDesc" }}</span>
- </template>
- {{ i18n "pages.inbounds.isGroupEdit" }}
- <a-icon type="question-circle"></a-icon>
- </a-tooltip>
- </template>
- <a-switch v-model="isGroupEdit"></a-switch>
- </a-form-item>
<a-form-item>
<template slot="label">
<a-tooltip>
@@ -27,7 +15,7 @@
</template>
<a-input v-model.trim="client.email"></a-input>
</a-form-item>
- <a-form-item v-if="(inbound.protocol === Protocols.TROJAN || inbound.protocol === Protocols.SHADOWSOCKS) && !isGroup">
+ <a-form-item v-if="inbound.protocol === Protocols.TROJAN || inbound.protocol === Protocols.SHADOWSOCKS">
<template slot="label">
<a-tooltip>
<template slot="title">
@@ -40,7 +28,7 @@
</template>
<a-input v-model.trim="client.password"></a-input>
</a-form-item>
- <a-form-item v-if="(inbound.protocol === Protocols.VMESS || inbound.protocol === Protocols.VLESS) && !isGroup">
+ <a-form-item v-if="inbound.protocol === Protocols.VMESS || inbound.protocol === Protocols.VLESS">
<template slot="label">
<a-tooltip>
<template slot="title">
diff --git a/web/html/xui/inbound_modal.html b/web/html/xui/inbound_modal.html
index 7f9ed740..ab42e09c 100644
--- a/web/html/xui/inbound_modal.html
+++ b/web/html/xui/inbound_modal.html
@@ -13,7 +13,6 @@
confirmLoading: false,
okText: '{{ i18n "sure" }}',
isEdit: false,
- isGroup: false,
confirm: null,
inbound: new Inbound(),
dbInbound: new DBInbound(),
@@ -61,9 +60,6 @@
get isEdit() {
return inModal.isEdit;
},
- get isGroup() {
- return inModal.isGroup;
- },
get client() {
return inModal.inbound.clients[0];
},
diff --git a/web/html/xui/inbounds.html b/web/html/xui/inbounds.html
index 2707fc42..c986e3fd 100644
--- a/web/html/xui/inbounds.html
+++ b/web/html/xui/inbounds.html
@@ -145,10 +145,6 @@
<a-icon type="rest"></a-icon>
{{ i18n "pages.inbounds.delDepletedClients" }}
</a-menu-item>
- <a-menu-item v-if="subSettings.enable && dbInbounds.length > 0" key="addGroupClient">
- <a-icon type="usergroup-add"></a-icon>
- {{ i18n "pages.client.groupAdd"}}
- </a-menu-item>
</a-menu>
</a-dropdown>
</a-col>
@@ -289,7 +285,7 @@
<p v-for="clientEmail in clientCount[dbInbound.id].online">[[ clientEmail ]]</p>
</template>
<a-tag style="margin:0; padding: 0 2px;" color="blue" v-if="clientCount[dbInbound.id].online.length">[[ clientCount[dbInbound.id].online.length ]]</a-tag>
- </a-popover>
+ </a-popover>
</template>
</template>
<template slot="traffic" slot-scope="text, dbInbound">
@@ -343,7 +339,7 @@
<a-tag style="margin:0;" color="blue">[[ dbInbound.toInbound().stream.network ]]</a-tag>
<a-tag style="margin:0;" v-if="dbInbound.toInbound().stream.isTls" color="green">tls</a-tag>
<a-tag style="margin:0;" v-if="dbInbound.toInbound().stream.isReality" color="green">reality</a-tag>
- </template>
+ </template>
</td>
</tr>
<tr>
@@ -377,7 +373,7 @@
<p v-for="clientEmail in clientCount[dbInbound.id].online">[[ clientEmail ]]</p>
</template>
<a-tag style="margin:0; padding: 0 2px;" color="green" v-if="clientCount[dbInbound.id].online.length">[[ clientCount[dbInbound.id].online.length ]]</a-tag>
- </a-popover>
+ </a-popover>
</td>
</tr>
<tr>
@@ -744,9 +740,6 @@
case "delDepletedClients":
this.delDepletedClients(-1)
break;
- case "addGroupClient":
- this.openGroupAddClient()
- break;
}
},
clickAction(action, dbInbound) {
@@ -890,20 +883,6 @@
await this.submit(`/panel/inbound/update/${dbInbound.id}`, data, inModal);
},
- openGroupAddClient() {
- clientModal.show({
- title: '{{ i18n "pages.client.groupAdd"}}',
- okText: '{{ i18n "pages.client.submitAdd"}}',
- dbInbounds: this.dbInbounds,
- confirm: async (clients, dbInboundIds) => {
- clientModal.loading();
- await this.addGroupClient(clients, dbInboundIds);
- clientModal.close();
- await this.showQrcode(dbInboundIds[0],clients[0], true)
- },
- isEdit: false
- });
- },
openAddClient(dbInboundId) {
dbInbound = this.dbInbounds.find(row => row.id === dbInboundId);
clientModal.show({
@@ -914,7 +893,6 @@
clientModal.loading();
await this.addClient(clients, dbInboundId);
clientModal.close();
- await this.showQrcode(dbInboundId,clients)
},
isEdit: false
});
@@ -939,7 +917,6 @@
clientModal.show({
title: '{{ i18n "pages.client.edit"}}',
okText: '{{ i18n "pages.client.submitEdit"}}',
- dbInbounds: this.dbInbounds,
dbInbound: dbInbound,
index: index,
confirm: async (client, dbInboundId, clientId) => {
@@ -963,41 +940,14 @@
id: dbInboundId,
settings: '{"clients": [' + clients.toString() + ']}',
};
-
- await this.submit(`/panel/inbound/addClient`, data)
- },
-
- async addGroupClient(clients, dbInboundIds) {
- const data = []
- dbInboundIds.forEach((dbInboundId, index) => {
- data.push({
- id: dbInboundId,
- settings: '{"clients": [' + clients[index].toString() + ']}',
- })
- })
-
- await this.submit(`/panel/inbound/addGroupClient`, data, true)
+ await this.submit(`/panel/inbound/addClient`, data);
},
async updateClient(client, dbInboundId, clientId) {
- if (Array.isArray(client) && Array.isArray(dbInboundId) && Array.isArray(clientId)){
- const data = []
- client.forEach((client, index) => {
- data.push({
- clientId: clientId[index],
- inbound: {
- id: dbInboundId[index],
- settings: '{"clients": [' + client.toString() + ']}',
- }
- })
- })
- await this.submit(`/panel/inbound/updateClients`, data, true);
- }else{
- const data = {
- id: dbInboundId,
- settings: '{"clients": [' + client.toString() + ']}',
- };
- await this.submit(`/panel/inbound/updateClient/${clientId}`, data);
- }
+ const data = {
+ id: dbInboundId,
+ settings: '{"clients": [' + client.toString() + ']}',
+ };
+ await this.submit(`/panel/inbound/updateClient/${clientId}`, data);
},
resetTraffic(dbInboundId) {
dbInbound = this.dbInbounds.find(row => row.id === dbInboundId);
@@ -1051,8 +1001,8 @@
checkFallback(dbInbound) {
newDbInbound = new DBInbound(dbInbound);
if (dbInbound.listen.startsWith("@")){
- rootInbound = this.inbounds.find((i) =>
- i.isTcp &&
+ rootInbound = this.inbounds.find((i) =>
+ i.isTcp &&
['trojan','vless'].includes(i.protocol) &&
i.settings.fallbacks.find(f => f.dest === dbInbound.listen)
);
@@ -1068,10 +1018,10 @@
}
return newDbInbound;
},
- showQrcode(dbInboundId, client, isJustSub = false) {
+ showQrcode(dbInboundId, client) {
dbInbound = this.dbInbounds.find(row => row.id === dbInboundId);
newDbInbound = this.checkFallback(dbInbound);
- qrModal.show('{{ i18n "qrCode"}}', newDbInbound, client, isJustSub);
+ qrModal.show('{{ i18n "qrCode"}}', newDbInbound, client);
},
showInfo(dbInboundId, client) {
dbInbound = this.dbInbounds.find(row => row.id === dbInboundId);
@@ -1100,8 +1050,8 @@
await this.updateClient(clients[index], dbInboundId, clientId);
this.loading(false);
},
- async submit(url, data, isJson = false) {
- const msg = isJson ? await HttpUtil.postWithModalJson(url, data) : await HttpUtil.postWithModal(url, data);
+ async submit(url, data) {
+ const msg = await HttpUtil.postWithModal(url, data);
if (msg.success) {
await this.getDBInbounds();
}
@@ -1243,7 +1193,7 @@
value: '',
okText: '{{ i18n "pages.inbounds.import" }}',
confirm: async (dbInboundText) => {
- await this.submit('/panel/inbound/import', {data: dbInboundText});
+ await this.submit('/panel/inbound/import', {data: dbInboundText}, promptModal);
promptModal.close();
},
});
diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml
index 0b7ac5b2..7e0f26c5 100644
--- a/web/translation/translate.en_US.toml
+++ b/web/translation/translate.en_US.toml
@@ -181,12 +181,9 @@
"exportInbound" = "Export Inbound"
"import" = "Import"
"importInbound" = "Import an Inbound"
-"isGroupEdit" = "Group editing"
-"isGroupEditDesc" = "All clients with the same subscription are edited"
[pages.client]
"add" = "Add Client"
-"groupAdd" = "Add subscription user"
"edit" = "Edit Client"
"submitAdd" = "Add Client"
"submitEdit" = "Save Changes"
diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml
index 926325cf..6c817a30 100644
--- a/web/translation/translate.es_ES.toml
+++ b/web/translation/translate.es_ES.toml
@@ -181,12 +181,9 @@
"exportInbound" = "Exportación entrante"
"import" = "Importar"
"importInbound" = "Importar un entrante"
-"isGroupEdit" = "Edición de grupo"
-"isGroupEditDesc" = "Se editan todos los usuarios con la misma suscripción"
[pages.client]
"add" = "Agregar Cliente"
-"groupAdd" = "Agregar usuario de suscripción"
"edit" = "Editar Cliente"
"submitAdd" = "Agregar Cliente"
"submitEdit" = "Guardar Cambios"
diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml
index 17e6facc..11b66788 100644
--- a/web/translation/translate.fa_IR.toml
+++ b/web/translation/translate.fa_IR.toml
@@ -181,12 +181,9 @@
"exportInbound" = "استخراج ورودی"
"import" = "افزودن"
"importInbound" = "افزودن یک ورودی"
-"isGroupEdit" = "ویرایش گروهی"
-"isGroupEditDesc" = "تمامی کاربران با سابسکریپشن یکسان ویرایش می‌شوند"