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
path: root/web/html
diff options
context:
space:
mode:
authorAli Golzar <57574919+aliglzr@users.noreply.github.com>2025-08-31 19:33:50 +0300
committerGitHub <noreply@github.com>2025-08-31 19:33:50 +0300
commit4a0914cb1e271ab4f076cb1bd68c9f07cc025e92 (patch)
tree95a15ed4255736b0bc7edaa509951d62c9c0254a /web/html
parent664269d513f4c122c9f5a713d3293777872d3353 (diff)
feat: add "Last Online" column to client list and modal (Closes #3402) (#3405)
* feat: persist client last online and expose API * feat(ui): show client last online in table and info modal * i18n: add “Last Online” across locales * chore: format timestamps as HH:mm:ss
Diffstat (limited to 'web/html')
-rw-r--r--web/html/component/aClientTable.html17
-rw-r--r--web/html/inbounds.html18
-rw-r--r--web/html/modals/inbound_info_modal.html6
3 files changed, 35 insertions, 6 deletions
diff --git a/web/html/component/aClientTable.html b/web/html/component/aClientTable.html
index 53ec27a3..a7279e50 100644
--- a/web/html/component/aClientTable.html
+++ b/web/html/component/aClientTable.html
@@ -33,12 +33,17 @@
<a-switch v-model="client.enable" @change="switchEnableClient(record.id,client)"></a-switch>
</template>
<template slot="online" slot-scope="text, client, index">
- <template v-if="client.enable && isClientOnline(client.email)">
- <a-tag color="green">{{ i18n "online" }}</a-tag>
- </template>
- <template v-else>
- <a-tag>{{ i18n "offline" }}</a-tag>
- </template>
+ <a-popover :overlay-class-name="themeSwitcher.currentTheme">
+ <template slot="content" >
+ {{ i18n "lastOnline" }}: [[ formatLastOnline(client.email) ]]
+ </template>
+ <template v-if="client.enable && isClientOnline(client.email)">
+ <a-tag color="green">{{ i18n "online" }}</a-tag>
+ </template>
+ <template v-else>
+ <a-tag>{{ i18n "offline" }}</a-tag>
+ </template>
+ </a-popover>
</template>
<template slot="client" slot-scope="text, client">
<a-space direction="horizontal" :size="2">
diff --git a/web/html/inbounds.html b/web/html/inbounds.html
index 1621807e..dfccdd70 100644
--- a/web/html/inbounds.html
+++ b/web/html/inbounds.html
@@ -807,6 +807,7 @@
defaultKey: '',
clientCount: [],
onlineClients: [],
+ lastOnlineMap: {},
isRefreshEnabled: localStorage.getItem("isRefreshEnabled") === "true" ? true : false,
refreshing: false,
refreshInterval: Number(localStorage.getItem("refreshInterval")) || 5000,
@@ -835,6 +836,7 @@
return;
}
+ await this.getLastOnlineMap();
await this.getOnlineUsers();
this.setInbounds(msg.obj);
@@ -849,6 +851,11 @@
}
this.onlineClients = msg.obj != null ? msg.obj : [];
},
+ async getLastOnlineMap() {
+ const msg = await HttpUtil.post('/panel/api/inbounds/lastOnline');
+ if (!msg.success || !msg.obj) return;
+ this.lastOnlineMap = msg.obj || {}
+ },
async getDefaultSettings() {
const msg = await HttpUtil.post('/panel/setting/defaultSettings');
if (!msg.success) {
@@ -1493,6 +1500,17 @@
isClientOnline(email) {
return this.onlineClients.includes(email);
},
+ getLastOnline(email) {
+ return this.lastOnlineMap[email] || null
+ },
+ formatLastOnline(email) {
+ const ts = this.getLastOnline(email)
+ if (!ts) return '-'
+ if (this.datepicker === 'gregorian') {
+ return DateUtil.formatMillis(ts)
+ }
+ return DateUtil.convertToJalalian(moment(ts))
+ },
isRemovable(dbInboundId) {
return this.getInboundClients(this.dbInbounds.find(row => row.id === dbInboundId)).length > 1;
},
diff --git a/web/html/modals/inbound_info_modal.html b/web/html/modals/inbound_info_modal.html
index fe7d7a82..a15172f3 100644
--- a/web/html/modals/inbound_info_modal.html
+++ b/web/html/modals/inbound_info_modal.html
@@ -217,6 +217,12 @@
</template>
</td>
</tr>
+ <tr>
+ <td>{{ i18n "lastOnline" }}</td>
+ <td>
+ <a-tag>[[ app.formatLastOnline(infoModal.clientSettings && infoModal.clientSettings.email ? infoModal.clientSettings.email : '') ]]</a-tag>
+ </td>
+ </tr>
<tr v-if="infoModal.clientSettings.comment">
<td>{{ i18n "comment" }}</td>
<td>