refactor: align tariff builder with bot functionality

- Remove unused fields: custom_days, custom_traffic (bot doesn't use them)
- Add promo groups selection to tariff form
- Add API endpoint for fetching available promo groups
- Make traffic topup packages dynamic (add/remove any number)
- Fix stuck 0 in number inputs when clearing
- Add validation messages explaining why save button is blocked
- Match bot validation: name 2-50 chars, device_limit >= 1, tier_level 1-10
- Add missing i18n translations for new fields and validation errors
This commit is contained in:
c0mrade
2026-02-02 04:27:52 +03:00
parent 8cd95b84fb
commit d6edb659a3
6 changed files with 430 additions and 297 deletions

View File

@@ -1762,6 +1762,7 @@
"nameLabel": "Название тарифа",
"nameExamplePeriod": "Например: Стандарт",
"nameExampleDaily": "Например: Суточный",
"nameHint": "От 2 до 50 символов",
"descriptionLabel": "Описание",
"descriptionPlaceholder": "Краткое описание тарифа",
"trafficLimitLabel": "Лимит трафика",
@@ -1778,8 +1779,12 @@
"addButton": "Добавить",
"noPeriodsHint": "Нет добавленных периодов. Добавьте хотя бы один период.",
"daysShort": "дн.",
"serversTitle": "Серверы",
"serversTabHint": "Выберите серверы, доступные на этом тарифе.",
"noServersAvailable": "Нет доступных серверов",
"promoGroupsTitle": "Промо-группы",
"promoGroupsHint": "Выберите промо-группы, которым доступен этот тариф. Если не выбрано ничего — доступен всем.",
"noPromoGroups": "Нет промо-групп",
"extraDeviceTitle": "Докупка устройств",
"devicePriceLabel": "Цена за устройство (30 дней):",
"devicePriceHint": "0 = докупка недоступна",
@@ -1789,6 +1794,8 @@
"trafficMaxLimitLabel": "Макс. лимит:",
"trafficLimitHint2": "(0 = без ограничений)",
"trafficPackagesLabel": "Пакеты трафика:",
"addPackageTitle": "Добавить пакет",
"noPackagesHint": "Нет добавленных пакетов. Добавьте хотя бы один пакет.",
"gbPackageUnit": "ГБ:",
"customDaysTitle": "Произвольное количество дней",
"customDaysDesc": "Пользователь сам выбирает срок подписки",
@@ -1820,7 +1827,18 @@
"dailyPriceLabel": "Цена за день",
"currencyPerDay": "₽/день",
"dailyDeductionDesc": "Списывается ежедневно с баланса пользователя",
"dailyPriceRequired": "Укажите цену за день больше 0"
"dailyPriceRequired": "Укажите цену за день больше 0",
"cannotSave": "Невозможно сохранить тариф:",
"validation": {
"nameRequired": "Введите название тарифа",
"nameLength": "Название должно быть от 2 до 50 символов",
"deviceLimitRequired": "Укажите количество устройств (минимум 1)",
"tierLevelInvalid": "Уровень тарифа должен быть от 1 до 10",
"fieldsRequired": "Заполните обязательные поля (устройства, уровень)",
"periodsRequired": "Добавьте хотя бы один период",
"dailyPriceRequired": "Укажите цену за день больше 0",
"trafficPackagesRequired": "Добавьте хотя бы один пакет трафика (или отключите докупку)"
}
},
"servers": {
"title": "Управление серверами",