Виды таблицы
Одна таблица результата — девять видов: столбцы, кольцо, тренд, часы, таблица, KPI, воронка, сравнение, произвольный график.
Вид выбирает агент через show({ view }). Все виды получают одни и те же данные AnalyticsTableData
и рисуются через TABLE_VIEWS[view](data).
Столбцы и кольцо
Живой код — редактируйте
const sourcesTable = { period: { from: "2026-10-13", to: "2026-10-19", days: 7 }, caveats: [], columns: [ { key: "source", label: "Источник", role: "dimension", unit: "text" }, { key: "visits", label: "Визиты", role: "metric", unit: "count" }, { key: "submissions", label: "Заявки", role: "metric", unit: "count" }, { key: "conversion", label: "Конверсия", role: "metric", unit: "percent" } ], rows: [ { source: "Яндекс Директ", visits: 1840, submissions: 84, conversion: 4.6 }, { source: "Органика", visits: 920, submissions: 31, conversion: 3.4 }, { source: "Соцсети", visits: 410, submissions: 9, conversion: 2.2 }, { source: "Прямые", visits: 290, submissions: 4, conversion: 1.4 } ], totals: { source: "Всего", visits: 3460, submissions: 128, conversion: 3.7 } }; render( <div className="grid gap-6 md:grid-cols-2"> {TABLE_VIEWS.bars(sourcesTable)} {TABLE_VIEWS.donut(sourcesTable)} </div> );
Тренд и часы
Живой код — редактируйте
const hoursTable = { period: { from: "2026-10-13", to: "2026-10-19", days: 7 }, caveats: [], columns: [ { key: "hour", label: "Час", role: "dimension", unit: "text" }, { key: "submissions", label: "Заявки", role: "metric", unit: "count" } ], rows: [ { hour: 8, submissions: 4 }, { hour: 9, submissions: 7 }, { hour: 10, submissions: 9 }, { hour: 11, submissions: 11 }, { hour: 12, submissions: 12 }, { hour: 13, submissions: 13 }, { hour: 14, submissions: 14 }, { hour: 15, submissions: 14 }, { hour: 16, submissions: 13 }, { hour: 17, submissions: 12 }, { hour: 18, submissions: 11 }, { hour: 19, submissions: 9 }, { hour: 20, submissions: 7 }, { hour: 21, submissions: 4 }, { hour: 22, submissions: 2 } ] }; const trendTable = { period: { from: "2026-10-13", to: "2026-10-19", days: 7 }, caveats: [], columns: [ { key: "day", label: "День", role: "dimension", unit: "text" }, { key: "visits", label: "Визиты", role: "metric", unit: "count" }, { key: "submissions", label: "Заявки", role: "metric", unit: "count" } ], rows: [ { day: "2026-10-13", visits: 420, submissions: 14 }, { day: "2026-10-14", visits: 510, submissions: 19 }, { day: "2026-10-15", visits: 480, submissions: 17 }, { day: "2026-10-16", visits: 560, submissions: 23 }, { day: "2026-10-17", visits: 530, submissions: 21 }, { day: "2026-10-18", visits: 390, submissions: 15 }, { day: "2026-10-19", visits: 570, submissions: 19 } ] }; render( <div className="flex flex-col gap-6"> {TABLE_VIEWS.trend(trendTable)} {TABLE_VIEWS.hours(hoursTable)} </div> );
Таблица и KPI
Живой код — редактируйте
const kpiTable = { period: { from: "2026-10-13", to: "2026-10-19", days: 7 }, caveats: [], columns: [ { key: "visits", label: "Визиты", role: "metric", unit: "count", description: "Уникальные посетители" }, { key: "submissions", label: "Заявки", role: "metric", unit: "count" }, { key: "conversion", label: "Конверсия", role: "metric", unit: "percent" }, { key: "time", label: "Время на сайте", role: "metric", unit: "seconds" } ], rows: [{ visits: 3460, submissions: 128, conversion: 3.7, time: 94 }] }; const sourcesTable = { period: { from: "2026-10-13", to: "2026-10-19", days: 7 }, caveats: [], columns: [ { key: "source", label: "Источник", role: "dimension", unit: "text" }, { key: "visits", label: "Визиты", role: "metric", unit: "count" }, { key: "submissions", label: "Заявки", role: "metric", unit: "count" }, { key: "conversion", label: "Конверсия", role: "metric", unit: "percent" } ], rows: [ { source: "Яндекс Директ", visits: 1840, submissions: 84, conversion: 4.6 }, { source: "Органика", visits: 920, submissions: 31, conversion: 3.4 }, { source: "Соцсети", visits: 410, submissions: 9, conversion: 2.2 }, { source: "Прямые", visits: 290, submissions: 4, conversion: 1.4 } ], totals: { source: "Всего", visits: 3460, submissions: 128, conversion: 3.7 } }; render( <div className="flex flex-col gap-6"> {TABLE_VIEWS.kpi(kpiTable)} {TABLE_VIEWS.table(sourcesTable)} </div> );
Воронка и сравнение периодов
Живой код — редактируйте
const comparisonTable = { period: { from: "2026-10-13", to: "2026-10-19", days: 7 }, previousPeriod: { from: "2026-10-06", to: "2026-10-12", days: 7 }, caveats: [], columns: [ { key: "source", label: "Источник", role: "dimension", unit: "text" }, { key: "submissions", label: "Заявки", role: "metric", unit: "count" }, { key: "conversion", label: "Конверсия", role: "metric", unit: "percent" } ], rows: [ { source: "Яндекс Директ", submissions: 84, conversion: 4.6 }, { source: "Органика", submissions: 31, conversion: 3.4 }, { source: "Соцсети", submissions: 9, conversion: 2.2 } ], previousRows: [ { source: "Яндекс Директ", submissions: 71, conversion: 4.1 }, { source: "Органика", submissions: 33, conversion: 3.6 }, { source: "Соцсети", submissions: 5, conversion: 1.5 } ], flags: [{ row: 2, metric: "submissions", lowSample: true }] }; const funnelTable = { period: { from: "2026-10-13", to: "2026-10-19", days: 7 }, caveats: [], columns: [ { key: "stage", label: "Шаг", role: "dimension", unit: "text" }, { key: "visitors", label: "Посетители", role: "metric", unit: "count" } ], rows: [ { stage: "Зашли на сайт", visitors: 3460 }, { stage: "Увидели форму", visitors: 1720 }, { stage: "Начали заполнять", visitors: 410 }, { stage: "Отправили заявку", visitors: 128 } ] }; render( <div className="flex flex-col gap-6"> {TABLE_VIEWS.funnel(funnelTable)} {TABLE_VIEWS.comparison(comparisonTable)} </div> );
Произвольный график
Живой код — редактируйте
const trendTable = { period: { from: "2026-10-13", to: "2026-10-19", days: 7 }, caveats: [], columns: [ { key: "day", label: "День", role: "dimension", unit: "text" }, { key: "visits", label: "Визиты", role: "metric", unit: "count" }, { key: "submissions", label: "Заявки", role: "metric", unit: "count" } ], rows: [ { day: "2026-10-13", visits: 420, submissions: 14 }, { day: "2026-10-14", visits: 510, submissions: 19 }, { day: "2026-10-15", visits: 480, submissions: 17 }, { day: "2026-10-16", visits: 560, submissions: 23 }, { day: "2026-10-17", visits: 530, submissions: 21 }, { day: "2026-10-18", visits: 390, submissions: 15 }, { day: "2026-10-19", visits: 570, submissions: 19 } ] }; render( TABLE_VIEWS.chart(trendTable, { type: 'combo', x: 'day', y: ['visits'], y2: ['submissions'] }) );