diff --git a/src/api/adminBulkActions.ts b/src/api/adminBulkActions.ts index 69315ef..1088dee 100644 --- a/src/api/adminBulkActions.ts +++ b/src/api/adminBulkActions.ts @@ -11,7 +11,8 @@ export type BulkActionType = | 'add_balance' | 'assign_promo_group' | 'grant_subscription' - | 'set_devices'; + | 'set_devices' + | 'delete_subscription'; export interface BulkActionRequest { action: BulkActionType; diff --git a/src/locales/en.json b/src/locales/en.json index aaef068..fa92050 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -2040,7 +2040,12 @@ "addBalance": "Add balance", "assignPromoGroup": "Assign promo group", "grantSubscription": "Grant subscription", - "setDevices": "Set devices" + "setDevices": "Set devices", + "deleteSubscription": "Delete subscriptions" + }, + "deleteSubscription": { + "warning": "Selected subscriptions will be permanently deleted from the bot and RemnaWave panel!", + "hint": "Users will lose VPN access for deleted subscriptions. This action cannot be undone." }, "params": { "days": "Number of days", diff --git a/src/locales/ru.json b/src/locales/ru.json index 100f22b..dedf504 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -3788,7 +3788,12 @@ "addBalance": "Начислить баланс", "assignPromoGroup": "Назначить промогруппу", "grantSubscription": "Выдать подписку", - "setDevices": "Изменить устройства" + "setDevices": "Изменить устройства", + "deleteSubscription": "Удалить подписки" + }, + "deleteSubscription": { + "warning": "Выбранные подписки будут безвозвратно удалены из бота и панели RemnaWave!", + "hint": "Пользователи потеряют доступ к VPN по удалённым подпискам. Это действие нельзя отменить." }, "params": { "days": "Количество дней", diff --git a/src/pages/AdminBulkActions.tsx b/src/pages/AdminBulkActions.tsx index add861b..3f2662b 100644 --- a/src/pages/AdminBulkActions.tsx +++ b/src/pages/AdminBulkActions.tsx @@ -141,6 +141,7 @@ const SUBSCRIPTION_LEVEL_ACTIONS: Set = new Set([ 'change_tariff', 'add_traffic', 'set_devices', + 'delete_subscription', ]); function isSubscriptionLevelAction(action: BulkActionType): boolean { @@ -799,6 +800,7 @@ function ActionModal({ assign_promo_group: 'admin.bulkActions.actions.assignPromoGroup', grant_subscription: 'admin.bulkActions.actions.grantSubscription', set_devices: 'admin.bulkActions.actions.setDevices', + delete_subscription: 'admin.bulkActions.actions.deleteSubscription', }; const handleSubmit = () => { @@ -965,6 +967,17 @@ function ActionModal({ ); + case 'delete_subscription': + return ( +
+

+ {t('admin.bulkActions.deleteSubscription.warning')} +

+

+ {t('admin.bulkActions.deleteSubscription.hint')} +

+
+ ); default: return null; } @@ -1189,6 +1202,26 @@ function FloatingActionBar({ ), colorClass: 'text-accent-400 hover:bg-accent-500/10', }, + { + type: 'delete_subscription', + labelKey: 'admin.bulkActions.actions.deleteSubscription', + icon: ( + + + + ), + colorClass: 'text-error-400 hover:bg-error-500/10', + }, { type: 'add_balance', labelKey: 'admin.bulkActions.actions.addBalance', @@ -1779,7 +1812,7 @@ export default function AdminBulkActions() { const user = row.original; const filteredSubs = getFilteredSubs(user.subscriptions ?? []); const subCount = filteredSubs.length; - const canExpand = subCount > 1; + const canExpand = isMultiTariff && subCount > 0; const isExpanded = expandedRows[user.id] ?? false; return (
@@ -2065,7 +2098,7 @@ export default function AdminBulkActions() { {table.getRowModel().rows.map((row) => { const user = row.original; const filteredSubs = getFilteredSubs(user.subscriptions ?? []); - const canExpand = filteredSubs.length > 1; + const canExpand = isMultiTariff && filteredSubs.length > 0; const isExpanded = expandedRows[user.id] ?? false; return (