-
setSetting("TRIAL_ENABLED", checked)}
- class="admin-switch-root"
- >
-
-
-
{boolValue("TRIAL_ENABLED")
- ? at("enabled", {}, "Enabled")
- : at("disabled", {}, "Disabled")}
+
+
+
+
+
+ {at("tariffs_trial_group_switch", {}, "Доступ")}
+
+ {at(
+ "tariffs_trial_group_switch_hint",
+ {},
+ "Включает или выключает выдачу пробного периода пользователям."
+ )}
+
-
-
-
-
-
diff --git a/frontend/src/styles/admin.css b/frontend/src/styles/admin.css
index d32d14f..577bea0 100644
--- a/frontend/src/styles/admin.css
+++ b/frontend/src/styles/admin.css
@@ -2045,6 +2045,10 @@
background: color-mix(in srgb, var(--admin-bg) 52%, transparent);
}
+.admin-settings-field-group.is-dirty {
+ border-color: color-mix(in srgb, var(--warning-border) 74%, var(--admin-border));
+}
+
.admin-settings-field-group-head {
display: grid;
gap: 3px;
@@ -2082,6 +2086,10 @@
background: color-mix(in srgb, var(--accent) 5%, transparent);
}
+.admin-setting.is-dirty {
+ background: color-mix(in srgb, var(--warning) 7%, transparent);
+}
+
.admin-setting-meta {
display: grid;
gap: 4px;
@@ -2822,6 +2830,38 @@
gap: 14px;
}
+.admin-trial-settings-body .admin-settings-field-groups {
+ padding: 0;
+}
+
+.admin-trial-settings-groups .admin-settings-field-group-head {
+ grid-template-columns: minmax(0, 1fr) auto;
+ align-items: start;
+ gap: 12px;
+}
+
+.admin-settings-field-group-head-copy {
+ display: grid;
+ gap: 3px;
+ min-width: 0;
+}
+
+.admin-trial-setting-row .input,
+.admin-trial-setting-row .admin-select-trigger {
+ width: 100%;
+}
+
+.admin-trial-squad-control {
+ display: grid;
+ grid-template-columns: minmax(0, 1fr) auto;
+ align-items: start;
+}
+
+.admin-trial-squad-control .admin-select-trigger,
+.admin-trial-squad-control .admin-chip-list {
+ grid-column: 1 / -1;
+}
+
.admin-tariff-settings-save-row {
justify-content: flex-end;
margin-bottom: 12px;
diff --git a/locales/en.json b/locales/en.json
index fa75e63..4484336 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -1113,6 +1113,7 @@
"admin_settings_secret_configured": "Secret is set",
"admin_settings_secret_empty": "Not set",
"admin_settings_badge_override": "Override",
+ "admin_settings_badge_dirty": "Changed",
"admin_status_limited": "Limited",
"admin_status_expired": "Expired",
"admin_status_disabled": "Disabled",
@@ -1314,6 +1315,14 @@
"admin_tariffs_trial_squads": "Trial Internal Squads",
"admin_tariffs_trial_squads_hint": "These squads are applied when trial is activated. Empty value falls back to USER_SQUAD_UUIDS.",
"admin_tariffs_trial_add_squad": "Add squad from panel",
+ "admin_tariffs_trial_group_switch": "Access",
+ "admin_tariffs_trial_group_switch_hint": "Turns trial activation on or off for users.",
+ "admin_tariffs_trial_group_general": "General settings",
+ "admin_tariffs_trial_group_general_hint": "Trial duration and traffic volume granted to the user.",
+ "admin_tariffs_trial_group_reset": "Traffic reset",
+ "admin_tariffs_trial_group_reset_hint": "Strategy Remnawave uses to refresh the trial traffic limit.",
+ "admin_tariffs_trial_group_squads": "Squads",
+ "admin_tariffs_trial_group_squads_hint": "Squads assigned to the user when trial access is activated.",
"admin_tariffs_legacy_title": "Legacy tariff compatibility",
"admin_tariffs_legacy_subtitle": "Old remnawave-tg-shop periods and traffic packages used only when the JSON tariff catalog is not configured.",
"admin_tariffs_legacy_period": "Period",
diff --git a/locales/ru.json b/locales/ru.json
index f8e5834..db3a85c 100644
--- a/locales/ru.json
+++ b/locales/ru.json
@@ -1113,6 +1113,7 @@
"admin_settings_secret_configured": "Секрет задан",
"admin_settings_secret_empty": "Не задан",
"admin_settings_badge_override": "Оверрайд",
+ "admin_settings_badge_dirty": "Изменено",
"admin_status_limited": "Ограничен",
"admin_status_expired": "Истёк",
"admin_status_disabled": "Выключен",
@@ -1314,6 +1315,14 @@
"admin_tariffs_trial_squads": "Internal Squads для триала",
"admin_tariffs_trial_squads_hint": "Эти сквады применяются при активации триала. Если поле пустое, используются USER_SQUAD_UUIDS.",
"admin_tariffs_trial_add_squad": "Добавить сквад из панели",
+ "admin_tariffs_trial_group_switch": "Доступ",
+ "admin_tariffs_trial_group_switch_hint": "Включает или выключает выдачу пробного периода пользователям.",
+ "admin_tariffs_trial_group_general": "Общие настройки",
+ "admin_tariffs_trial_group_general_hint": "Длительность пробного доступа и объём трафика, который получает пользователь.",
+ "admin_tariffs_trial_group_reset": "Сброс трафика",
+ "admin_tariffs_trial_group_reset_hint": "Стратегия, по которой Remnawave обновляет лимит трафика для пробного периода.",
+ "admin_tariffs_trial_group_squads": "Сквады",
+ "admin_tariffs_trial_group_squads_hint": "Сквады, которые будут назначены пользователю при активации триала.",
"admin_tariffs_legacy_title": "Совместимость с legacy-тарифами",
"admin_tariffs_legacy_subtitle": "Старые периоды и пакеты трафика remnawave-tg-shop, которые используются только без JSON-каталога.",
"admin_tariffs_legacy_period": "Период",
diff --git a/tests/test_admin_settings_manifest_i18n.py b/tests/test_admin_settings_manifest_i18n.py
index 943e02e..9c7471f 100644
--- a/tests/test_admin_settings_manifest_i18n.py
+++ b/tests/test_admin_settings_manifest_i18n.py
@@ -42,6 +42,14 @@ ADMIN_TARIFF_SETTINGS_PAGE_KEYS = {
"admin_tariffs_trial_squads",
"admin_tariffs_trial_squads_hint",
"admin_tariffs_trial_add_squad",
+ "admin_tariffs_trial_group_switch",
+ "admin_tariffs_trial_group_switch_hint",
+ "admin_tariffs_trial_group_general",
+ "admin_tariffs_trial_group_general_hint",
+ "admin_tariffs_trial_group_reset",
+ "admin_tariffs_trial_group_reset_hint",
+ "admin_tariffs_trial_group_squads",
+ "admin_tariffs_trial_group_squads_hint",
"admin_tariffs_legacy_title",
"admin_tariffs_legacy_subtitle",
"admin_tariffs_legacy_period",
@@ -61,6 +69,7 @@ ADMIN_VISIBLE_RU_KEYS = {
"admin_search",
"admin_settings_badge_override",
"admin_settings_badge_secret",
+ "admin_settings_badge_dirty",
"admin_settings_icon_current",
"admin_settings_icon_default_value",
"admin_settings_icon_empty",