diff --git a/src/pages/AdminTariffs.tsx b/src/pages/AdminTariffs.tsx index 8cbf8a6..b8d45b3 100644 --- a/src/pages/AdminTariffs.tsx +++ b/src/pages/AdminTariffs.tsx @@ -55,10 +55,75 @@ const InfinityIcon = () => ( ) -// Default period options -const DEFAULT_PERIODS = [7, 14, 30, 90, 180, 365] +const CalendarIcon = () => ( + + + +) -interface TariffModalProps { +const SunIcon = () => ( + + + +) + +// Type selection modal +interface TariffTypeSelectProps { + onSelect: (isDaily: boolean) => void + onClose: () => void +} + +function TariffTypeSelect({ onSelect, onClose }: TariffTypeSelectProps) { + return ( +
+
+
+

Выберите тип тарифа

+ +
+
+ + +
+
+
+ ) +} + +// Period tariff modal +interface PeriodTariffModalProps { tariff?: TariffDetail | null servers: ServerInfo[] onSave: (data: TariffCreateRequest | TariffUpdateRequest) => void @@ -66,47 +131,38 @@ interface TariffModalProps { isLoading?: boolean } -function TariffModal({ tariff, servers, onSave, onClose, isLoading }: TariffModalProps) { +function PeriodTariffModal({ tariff, servers, onSave, onClose, isLoading }: PeriodTariffModalProps) { const { t } = useTranslation() const isEdit = !!tariff const [name, setName] = useState(tariff?.name || '') const [description, setDescription] = useState(tariff?.description || '') - const [trafficLimitGb, setTrafficLimitGb] = useState(tariff?.traffic_limit_gb || 0) + const [trafficLimitGb, setTrafficLimitGb] = useState(tariff?.traffic_limit_gb || 100) const [deviceLimit, setDeviceLimit] = useState(tariff?.device_limit || 1) const [devicePriceKopeks, setDevicePriceKopeks] = useState(tariff?.device_price_kopeks || 0) const [maxDeviceLimit, setMaxDeviceLimit] = useState(tariff?.max_device_limit || 0) const [tierLevel, setTierLevel] = useState(tariff?.tier_level || 1) const [periodPrices, setPeriodPrices] = useState( - tariff?.period_prices || DEFAULT_PERIODS.map(d => ({ days: d, price_kopeks: 0 })) + tariff?.period_prices?.length ? tariff.period_prices : [] ) const [selectedSquads, setSelectedSquads] = useState(tariff?.allowed_squads || []) const [serverTrafficLimits, setServerTrafficLimits] = useState>( tariff?.server_traffic_limits || {} ) - // Произвольное количество дней - const [customDaysEnabled, setCustomDaysEnabled] = useState(tariff?.custom_days_enabled || false) - const [pricePerDayKopeks, setPricePerDayKopeks] = useState(tariff?.price_per_day_kopeks || 0) - const [minDays, setMinDays] = useState(tariff?.min_days || 1) - const [maxDays, setMaxDays] = useState(tariff?.max_days || 365) - // Произвольный трафик - const [customTrafficEnabled, setCustomTrafficEnabled] = useState(tariff?.custom_traffic_enabled || false) - const [trafficPricePerGbKopeks, setTrafficPricePerGbKopeks] = useState(tariff?.traffic_price_per_gb_kopeks || 0) - const [minTrafficGb, setMinTrafficGb] = useState(tariff?.min_traffic_gb || 1) - const [maxTrafficGb, setMaxTrafficGb] = useState(tariff?.max_traffic_gb || 1000) // Докупка трафика const [trafficTopupEnabled, setTrafficTopupEnabled] = useState(tariff?.traffic_topup_enabled || false) const [maxTopupTrafficGb, setMaxTopupTrafficGb] = useState(tariff?.max_topup_traffic_gb || 0) const [trafficTopupPackages, setTrafficTopupPackages] = useState>( tariff?.traffic_topup_packages || {} ) - // Дневной тариф - const [isDaily, setIsDaily] = useState(tariff?.is_daily || false) - const [dailyPriceKopeks, setDailyPriceKopeks] = useState(tariff?.daily_price_kopeks || 0) - const [activeTab, setActiveTab] = useState<'basic' | 'prices' | 'servers' | 'custom'>('basic') + + // Новый период для добавления + const [newPeriodDays, setNewPeriodDays] = useState(30) + const [newPeriodPrice, setNewPeriodPrice] = useState(300) + + const [activeTab, setActiveTab] = useState<'basic' | 'periods' | 'servers' | 'extra'>('basic') const handleSubmit = () => { - // Фильтруем лимиты только для выбранных серверов и только если они заданы (> 0) const filteredLimits: Record = {} for (const uuid of selectedSquads) { if (serverTrafficLimits[uuid] && serverTrafficLimits[uuid].traffic_limit_gb > 0) { @@ -125,23 +181,11 @@ function TariffModal({ tariff, servers, onSave, onClose, isLoading }: TariffModa period_prices: periodPrices.filter(p => p.price_kopeks > 0), allowed_squads: selectedSquads, server_traffic_limits: Object.keys(filteredLimits).length > 0 ? filteredLimits : {}, - // Произвольное количество дней - custom_days_enabled: customDaysEnabled, - price_per_day_kopeks: pricePerDayKopeks, - min_days: minDays, - max_days: maxDays, - // Произвольный трафик - custom_traffic_enabled: customTrafficEnabled, - traffic_price_per_gb_kopeks: trafficPricePerGbKopeks, - min_traffic_gb: minTrafficGb, - max_traffic_gb: maxTrafficGb, - // Докупка трафика traffic_topup_enabled: trafficTopupEnabled, traffic_topup_packages: trafficTopupPackages, max_topup_traffic_gb: maxTopupTrafficGb, - // Дневной тариф - is_daily: isDaily, - daily_price_kopeks: dailyPriceKopeks, + is_daily: false, + daily_price_kopeks: 0, } onSave(data) } @@ -161,14 +205,26 @@ function TariffModal({ tariff, servers, onSave, onClose, isLoading }: TariffModa ) } - const updatePeriodPrice = (days: number, priceKopeks: number) => { - setPeriodPrices(prev => { - const existing = prev.find(p => p.days === days) - if (existing) { - return prev.map(p => p.days === days ? { ...p, price_kopeks: priceKopeks } : p) + const addPeriod = () => { + if (newPeriodDays > 0 && newPeriodPrice > 0) { + // Проверяем, нет ли уже такого периода + const exists = periodPrices.some(p => p.days === newPeriodDays) + if (!exists) { + setPeriodPrices(prev => [...prev, { days: newPeriodDays, price_kopeks: newPeriodPrice * 100 }].sort((a, b) => a.days - b.days)) + setNewPeriodDays(30) + setNewPeriodPrice(300) } - return [...prev, { days, price_kopeks: priceKopeks }] - }) + } + } + + const removePeriod = (days: number) => { + setPeriodPrices(prev => prev.filter(p => p.days !== days)) + } + + const updatePeriodPrice = (days: number, priceRubles: number) => { + setPeriodPrices(prev => prev.map(p => + p.days === days ? { ...p, price_kopeks: priceRubles * 100 } : p + )) } return ( @@ -176,9 +232,17 @@ function TariffModal({ tariff, servers, onSave, onClose, isLoading }: TariffModa
{/* Header */}
-

- {isEdit ? t('admin.tariffs.edit') : t('admin.tariffs.create')} -

+
+
+ +
+
+

+ {isEdit ? 'Редактирование тарифа' : 'Новый периодный тариф'} +

+

Оплата за период

+
+
@@ -186,7 +250,7 @@ function TariffModal({ tariff, servers, onSave, onClose, isLoading }: TariffModa {/* Tabs */}
- {(['basic', 'prices', 'servers', 'custom'] as const).map(tab => ( + {(['basic', 'periods', 'servers', 'extra'] as const).map(tab => ( ))}
@@ -210,31 +274,31 @@ function TariffModal({ tariff, servers, onSave, onClose, isLoading }: TariffModa
{/* Name */}
- + setName(e.target.value)} className="w-full px-3 py-2 bg-dark-700 border border-dark-600 rounded-lg text-dark-100 focus:outline-none focus:border-accent-500" - placeholder={t('admin.tariffs.namePlaceholder')} + placeholder="Например: Стандарт" />
{/* Description */}
- +