From 3a3cd0b44591fd394cc5dff9899a7eaf686f4cdb Mon Sep 17 00:00:00 2001 From: c0mrade Date: Tue, 24 Mar 2026 17:44:58 +0300 Subject: [PATCH] =?UTF-8?q?redesign:=20admin=20subscription=20tab=20?= =?UTF-8?q?=E2=80=94=20two-level=20navigation=20for=20multi-tariff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Level 1 (subscription list): - Cards with tariff name, status badge, traffic, date, devices - Click to drill into subscription detail - "Создать подписку" with filtered purchased tariffs Level 2 (subscription detail): - Back button to return to list - All actions scoped to selected subscription - No "Сменить тариф" in multi-subscription mode - Panel info, devices, traffic stats per-subscription Single subscription: keeps current behavior (direct detail view) --- src/pages/AdminUserDetail.tsx | 267 +++++++++++++++++++++++----------- 1 file changed, 182 insertions(+), 85 deletions(-) diff --git a/src/pages/AdminUserDetail.tsx b/src/pages/AdminUserDetail.tsx index b402ae8..cdda415 100644 --- a/src/pages/AdminUserDetail.tsx +++ b/src/pages/AdminUserDetail.tsx @@ -336,6 +336,7 @@ export default function AdminUserDetail() { const [subDays, setSubDays] = useState(30); const [selectedTariffId, setSelectedTariffId] = useState(null); const [activeSubscriptionId, setActiveSubscriptionId] = useState(null); + const [subscriptionDetailView, setSubscriptionDetailView] = useState(false); // Promo group const [promoGroups, setPromoGroups] = useState([]); @@ -1379,40 +1380,133 @@ export default function AdminUserDetail() { {/* Subscription Tab */} {activeTab === 'subscription' && (
- {/* Subscription selector (when multiple) */} - {userSubscriptions.length > 1 && ( -
-
- {t('admin.users.detail.subscription.selectSubscription', 'Выберите подписку')} ( - {userSubscriptions.length}) -
-
+ {/* Multi-subscription: Level 1 — subscription list */} + {userSubscriptions.length > 1 && !subscriptionDetailView && ( + <> +
{userSubscriptions.map((sub) => ( ))}
-
+ + {/* Create new subscription — at list level */} + {hasPermission('users:subscription') && ( +
+
+ {t('admin.users.detail.subscription.createNew', 'Создать подписку')} +
+
+ + + +
+
+ )} + )} - {selectedSub ? ( + {/* Level 2 — subscription detail (or single subscription) */} + {(subscriptionDetailView || userSubscriptions.length <= 1) && selectedSub ? ( <> + {/* Back to list (multi-subscription) */} + {subscriptionDetailView && userSubscriptions.length > 1 && ( + + )} + {/* Current subscription */}
@@ -1602,9 +1696,11 @@ export default function AdminUserDetail() { - + {userSubscriptions.length <= 1 && ( + + )} @@ -1661,66 +1757,67 @@ export default function AdminUserDetail() { ) : null} - {/* Create new subscription (shown when no subs, or always in multi-tariff) */} - {hasPermission('users:subscription') && ( -
- {userSubscriptions.length === 0 && ( -
- {t('admin.users.detail.subscription.noActive')} + {/* Create new subscription (shown when no subs, or single-tariff mode) */} + {hasPermission('users:subscription') && + !(subscriptionDetailView && userSubscriptions.length > 1) && ( +
+ {userSubscriptions.length === 0 && ( +
+ {t('admin.users.detail.subscription.noActive')} +
+ )} +
+ {t('admin.users.detail.subscription.createNew', 'Создать подписку')} +
+
+ + +
- )} -
- {t('admin.users.detail.subscription.createNew', 'Создать подписку')}
-
- - - -
-
- )} + )} {/* Panel Info */} {panelInfoLoading ? (