From 4a0914cb1e271ab4f076cb1bd68c9f07cc025e92 Mon Sep 17 00:00:00 2001 From: Ali Golzar <57574919+aliglzr@users.noreply.github.com> Date: Sun, 31 Aug 2025 20:03:50 +0330 Subject: feat: add "Last Online" column to client list and modal (Closes #3402) (#3405) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 --- web/html/inbounds.html | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'web/html/inbounds.html') 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; }, -- cgit v1.2.3