diff --git a/frontend/src/components/common/SubscriptionProgressMini.vue b/frontend/src/components/common/SubscriptionProgressMini.vue
index b84175e9..92198c2c 100644
--- a/frontend/src/components/common/SubscriptionProgressMini.vue
+++ b/frontend/src/components/common/SubscriptionProgressMini.vue
@@ -69,94 +69,108 @@
-
+
-
-
{{
- t('subscriptionProgress.daily')
- }}
-
-
- {{
- formatUsage(subscription.daily_usage_usd, subscription.group?.daily_limit_usd)
- }}
+
+
+ ∞
+
+ {{ t('subscriptionProgress.unlimited') }}
-
-
{{
- t('subscriptionProgress.weekly')
- }}
-
-
+
+
+
+
{{
+ t('subscriptionProgress.daily')
+ }}
+
+
+ {{
+ formatUsage(subscription.daily_usage_usd, subscription.group?.daily_limit_usd)
+ }}
+
-
- {{
- formatUsage(subscription.weekly_usage_usd, subscription.group?.weekly_limit_usd)
- }}
-
-
-
-
{{
- t('subscriptionProgress.monthly')
- }}
-
-
+
+
{{
+ t('subscriptionProgress.weekly')
+ }}
+
+
+ {{
+ formatUsage(subscription.weekly_usage_usd, subscription.group?.weekly_limit_usd)
+ }}
+
-
- {{
- formatUsage(
- subscription.monthly_usage_usd,
- subscription.group?.monthly_limit_usd
- )
- }}
-
-
+
+
+
{{
+ t('subscriptionProgress.monthly')
+ }}
+
+
+ {{
+ formatUsage(
+ subscription.monthly_usage_usd,
+ subscription.group?.monthly_limit_usd
+ )
+ }}
+
+
+
@@ -215,7 +229,19 @@ function getMaxUsagePercentage(sub: UserSubscription): number {
return percentages.length > 0 ? Math.max(...percentages) : 0
}
+function isUnlimited(sub: UserSubscription): boolean {
+ return (
+ !sub.group?.daily_limit_usd &&
+ !sub.group?.weekly_limit_usd &&
+ !sub.group?.monthly_limit_usd
+ )
+}
+
function getProgressDotClass(sub: UserSubscription): string {
+ // Unlimited subscriptions get a special color
+ if (isUnlimited(sub)) {
+ return 'bg-emerald-500'
+ }
const maxPercentage = getMaxUsagePercentage(sub)
if (maxPercentage >= 90) return 'bg-red-500'
if (maxPercentage >= 70) return 'bg-orange-500'
diff --git a/frontend/src/i18n/locales/en.ts b/frontend/src/i18n/locales/en.ts
index d153b553..6d1095cf 100644
--- a/frontend/src/i18n/locales/en.ts
+++ b/frontend/src/i18n/locales/en.ts
@@ -749,6 +749,7 @@ export default {
weekly: 'Weekly',
monthly: 'Monthly',
noLimits: 'No limits configured',
+ unlimited: 'Unlimited',
resetNow: 'Resetting soon',
windowNotActive: 'Window not active',
resetInMinutes: 'Resets in {minutes}m',
@@ -1492,7 +1493,8 @@ export default {
expiresToday: 'Expires today',
expiresTomorrow: 'Expires tomorrow',
viewAll: 'View all subscriptions',
- noSubscriptions: 'No active subscriptions'
+ noSubscriptions: 'No active subscriptions',
+ unlimited: 'Unlimited'
},
// Version Badge
@@ -1535,6 +1537,7 @@ export default {
expires: 'Expires',
noExpiration: 'No expiration',
unlimited: 'Unlimited',
+ unlimitedDesc: 'No usage limits on this subscription',
daily: 'Daily',
weekly: 'Weekly',
monthly: 'Monthly',
diff --git a/frontend/src/i18n/locales/zh.ts b/frontend/src/i18n/locales/zh.ts
index c6105683..97d57051 100644
--- a/frontend/src/i18n/locales/zh.ts
+++ b/frontend/src/i18n/locales/zh.ts
@@ -840,6 +840,7 @@ export default {
weekly: '每周',
monthly: '每月',
noLimits: '未配置限额',
+ unlimited: '无限制',
resetNow: '即将重置',
windowNotActive: '窗口未激活',
resetInMinutes: '{minutes} 分钟后重置',
@@ -1689,7 +1690,8 @@ export default {
expiresToday: '今天到期',
expiresTomorrow: '明天到期',
viewAll: '查看全部订阅',
- noSubscriptions: '暂无有效订阅'
+ noSubscriptions: '暂无有效订阅',
+ unlimited: '无限制'
},
// Version Badge
@@ -1731,6 +1733,7 @@ export default {
expires: '到期时间',
noExpiration: '无到期时间',
unlimited: '无限制',
+ unlimitedDesc: '该订阅无用量限制',
daily: '每日',
weekly: '每周',
monthly: '每月',
diff --git a/frontend/src/views/admin/SubscriptionsView.vue b/frontend/src/views/admin/SubscriptionsView.vue
index bd6a17eb..679c3275 100644
--- a/frontend/src/views/admin/SubscriptionsView.vue
+++ b/frontend/src/views/admin/SubscriptionsView.vue
@@ -202,16 +202,19 @@
-
+