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>2026-05-05 00:27:57 +0300
committerMHSanaei <ho3ein.sanaei@gmail.com>2026-05-05 00:27:57 +0300
commit32b7ada54915adc7b6f93e9fef5e468e2fe66f6a (patch)
tree340b86a6cc30e0fc841daf0d6fd2ba1605c96028
parent6099a07ff0a3f619ace3c7645ee76dce943a97e0 (diff)
subpage: enabled state
Track and surface a subscription's enabled state from backend to frontend so the UI can show inactive subscriptions and use it in active-state logic. Changes: - sub/subService.go: track hasEnabledClient, set traffic.Enable, add Enabled to PageData and populate it in BuildPageData. - sub/subController.go: include enabled in the page context. - web/html/settings/panel/subscription/subpage.html: emit data-enabled attribute and render an "inactive" tag when disabled. - web/assets/js/subscription.js: read data-enabled and include it in isActive() checks. This ensures subscriptions with no enabled clients are marked inactive in the UI and excluded from being considered active.
-rw-r--r--sub/subController.go1
-rw-r--r--sub/subService.go7
-rw-r--r--web/assets/js/subscription.js4
-rw-r--r--web/html/settings/panel/subscription/subpage.html7
4 files changed, 16 insertions, 3 deletions
diff --git a/sub/subController.go b/sub/subController.go
index 0e9e2c97..a765ef06 100644
--- a/sub/subController.go
+++ b/sub/subController.go
@@ -138,6 +138,7 @@ func (a *SUBController) subs(c *gin.Context) {
"host": page.Host,
"base_path": page.BasePath,
"sId": page.SId,
+ "enabled": page.Enabled,
"download": page.Download,
"upload": page.Upload,
"total": page.Total,
diff --git a/sub/subService.go b/sub/subService.go
index d9fe0a6b..12d9bfb5 100644
--- a/sub/subService.go
+++ b/sub/subService.go
@@ -46,6 +46,7 @@ func (s *SubService) GetSubs(subId string, host string) ([]string, int64, xray.C
var result []string
var traffic xray.ClientTraffic
var lastOnline int64
+ var hasEnabledClient bool
var clientTraffics []xray.ClientTraffic
inbounds, err := s.getInboundsBySubId(subId)
if err != nil {
@@ -78,6 +79,9 @@ func (s *SubService) GetSubs(subId string, host string) ([]string, int64, xray.C
}
for _, client := range clients {
if client.SubID == subId {
+ if client.Enable {
+ hasEnabledClient = true
+ }
link := s.getLink(inbound, client.Email)
result = append(result, link)
ct := s.getClientTraffics(inbound.ClientStats, client.Email)
@@ -111,6 +115,7 @@ func (s *SubService) GetSubs(subId string, host string) ([]string, int64, xray.C
}
}
}
+ traffic.Enable = hasEnabledClient
return result, lastOnline, traffic, nil
}
@@ -1304,6 +1309,7 @@ type PageData struct {
Host string
BasePath string
SId string
+ Enabled bool
Download string
Upload string
Total string
@@ -1453,6 +1459,7 @@ func (s *SubService) BuildPageData(subId string, hostHeader string, traffic xray
Host: hostHeader,
BasePath: basePath,
SId: subId,
+ Enabled: traffic.Enable,
Download: download,
Upload: upload,
Total: total,
diff --git a/web/assets/js/subscription.js b/web/assets/js/subscription.js
index d08bfd28..aa09e1c4 100644
--- a/web/assets/js/subscription.js
+++ b/web/assets/js/subscription.js
@@ -7,6 +7,7 @@
const data = {
sId: el.getAttribute('data-sid') || '',
+ enabled: (el.getAttribute('data-enabled') || '').toLowerCase() === 'true',
subUrl: el.getAttribute('data-sub-url') || '',
subJsonUrl: el.getAttribute('data-subjson-url') || '',
subClashUrl: el.getAttribute('data-subclash-url') || '',
@@ -128,9 +129,10 @@
},
isActive() {
const now = Date.now();
+ const enabledOk = this.app.enabled;
const expiryOk = !this.app.expireMs || this.app.expireMs >= now;
const trafficOk = !this.app.totalByte || (this.app.uploadByte + this.app.downloadByte) <= this.app.totalByte;
- return expiryOk && trafficOk;
+ return enabledOk && expiryOk && trafficOk;
},
shadowrocketUrl() {
const rawUrl = this.app.subUrl + '?flag=shadowrocket';
diff --git a/web/html/settings/panel/subscription/subpage.html b/web/html/settings/panel/subscription/subpage.html
index 48f0ecfb..adfbea93 100644
--- a/web/html/settings/panel/subscription/subpage.html
+++ b/web/html/settings/panel/subscription/subpage.html
@@ -153,7 +153,10 @@
app.sId
]]</a-descriptions-item>
<a-descriptions-item label='{{ i18n "subscription.status" }}'>
- <template v-if="isUnlimited">
+ <template v-if="!app.enabled">
+ <a-tag color="red">{{ i18n "subscription.inactive" }}</a-tag>
+ </template>
+ <template v-else-if="isUnlimited">
<a-tag color="purple">{{ i18n
"subscription.unlimited" }}</a-tag>
</template>
@@ -275,7 +278,7 @@
data-subclash-url="{{ .subClashUrl }}" data-download="{{ .download }}" data-upload="{{ .upload }}"
data-used="{{ .used }}" data-total="{{ .total }}" data-remained="{{ .remained }}" data-expire="{{ .expire }}"
data-lastonline="{{ .lastOnline }}" data-downloadbyte="{{ .downloadByte }}" data-uploadbyte="{{ .uploadByte }}"
- data-totalbyte="{{ .totalByte }}" data-datepicker="{{ .datepicker }}"></template>
+ data-totalbyte="{{ .totalByte }}" data-datepicker="{{ .datepicker }}" data-enabled="{{ .enabled }}"></template>
<textarea id="subscription-links" style="display:none">{{ range .result }}{{ . }}
{{ end }}</textarea>