feat: enhance sales stats with device stats, per-tariff charts, and dual-series trials

- Add DualAreaChart component for two-series visualization (registrations vs trials)
- Add MultiSeriesAreaChart component for N-series tariff breakdown with dynamic pivoting
- AddonsTab: add device purchases and device revenue stat cards
- SalesTab: add per-tariff daily sales chart using MultiSeriesAreaChart
- TrialsTab: replace single-series area chart with dual-series registrations + trials chart
- Update TypeScript interfaces to match backend schema changes
- Add i18n keys for all new UI elements across en, ru, zh, fa locales
This commit is contained in:
Fringg
2026-03-02 21:42:25 +03:00
parent 14e5f436ce
commit 4622b4b200
11 changed files with 391 additions and 18 deletions

View File

@@ -50,7 +50,7 @@ export function AddonsTab({ params }: AddonsTabProps) {
return (
<div className="space-y-4">
<div className="grid grid-cols-1 gap-3 sm:grid-cols-3">
<div className="grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-5">
<StatCard
label={t('admin.salesStats.addons.totalPurchases')}
value={data.total_purchases}
@@ -64,6 +64,15 @@ export function AddonsTab({ params }: AddonsTabProps) {
value={formatWithCurrency(data.addon_revenue_kopeks / SALES_STATS.KOPEKS_DIVISOR)}
valueClassName="text-success-400"
/>
<StatCard
label={t('admin.salesStats.addons.devicePurchases')}
value={data.device_purchases}
/>
<StatCard
label={t('admin.salesStats.addons.deviceRevenue')}
value={formatWithCurrency(data.device_revenue_kopeks / SALES_STATS.KOPEKS_DIVISOR)}
valueClassName="text-success-400"
/>
</div>
<div className="grid grid-cols-1 gap-4 lg:grid-cols-2">