7.0 KiB
Задача: провести полный аудит и довести до законченного состояния конструктор пользовательских метрик для дашборда. Не переписывай работающий движок без необходимости — сначала изучи текущую реализацию в app/assets/js/metrics.js, app/assets/css/metrics.css и связанные тесты.
Цель
Пользователь должен без технических знаний собрать метрику, выбрать источник данных, настроить отображение и сразу понимать, что получится. Интерфейс должен быть компактным, визуально цельным и соответствовать брендовому glass-дизайну приложения.
Функциональные требования
-
Сохрани структуру конструктора из трёх разделов:
- «Основное»;
- «Расчёт»;
- «Отображение».
-
В разделе «Основное»:
- название метрики;
- понятная идентификация создаваемой или редактируемой метрики;
- отсутствие лишнего поясняющего текста.
-
Поддержи типы расчёта:
- сумма выбранных категорий;
- доходы минус расходы;
- доля расходов от дохода;
- собственная формула.
-
Поддержи режимы данных:
- факт, если есть, иначе план;
- только факт;
- только план.
-
Категории:
- получай исключительно из пользовательских данных;
- не возвращай хардкод категорий и позиций;
- пустой инстанс должен оставаться пустым;
- исторические категории должны оставаться доступными для расчётов;
- выбор категорий оформить компактным раскрывающимся блоком с количеством выбранных элементов.
-
Собственные формулы:
- сохранить существующий движок формул;
- поддерживать базовые переменные, категории, ссылки на другие метрики и соседние периоды;
- поддерживать префиксы prev_, next_, prev2_ и next2_;
- автодополнение должно показывать полный доступный список без искусственного ограничения;
- неизвестные переменные, пустые выражения и синтаксические ошибки должны блокировать сохранение с понятной ошибкой;
- выбор результата: денежная сумма, коэффициент или процент;
- при собственной формуле отключать обычный выбор категорий, поскольку категории указываются токенами в выражении.
-
Настройки отображения:
- сравнение;
- динамика;
- прогресс;
- направление оценки «больше — лучше» или «меньше — лучше»;
- целевое значение показывать только при выбранном графике прогресса;
- переключатель закрепления метрики на дашборде.
-
Добавь живое превью карточки метрики внутри конструктора:
- название;
- рассчитанное или демонстрационное значение;
- единица измерения;
- выбранные графики;
- состояние цели;
- превью должно обновляться при изменении настроек и не сохранять данные само по себе.
-
Сохранение:
- создание новой метрики;
- редактирование существующей без потери ID и owner;
- удаление с возможностью восстановления через существующие хранилище и корзину;
- метрики должны продолжать работать в дашборде и каталоге калькулятора;
- при изменении структуры данных предусмотреть schemaVersion и миграцию старых записей.
Дизайн
- Используй существующие брендовые переменные, стеклянные поверхности и SVG-иконки проекта.
- Не добавляй новые случайные цвета и стили.
- Модальное окно должно находиться поверх всего интерфейса и использовать общий popup/modal слой.
- На десктопе поля можно размещать в две колонки.
- На мобильном всё должно переходить в одну колонку без горизонтального скролла.
- Учти экранную клавиатуру, safe-area и небольшую высоту экрана.
- Не перегружай форму подсказками: оставляй только ошибки, важные ограничения и необходимые пояснения для формул.
- Состояния выбора, disabled, loading, validation и focus должны быть визуально различимы.
Критерии готовности
- Можно создать и отредактировать каждый тип метрики.
- Формулы корректно работают с планом, фактом, категориями, соседними периодами и другими метриками.
- Пустой инстанс не получает предустановленных категорий или метрик.
- Старые сохранённые метрики продолжают работать.
- Конструктор не выходит за границы экрана на desktop и mobile.
- Все существующие тесты проходят.
- Добавлены тесты на живое превью, валидацию, динамические категории, адаптив и обратную совместимость.
- Проведена проверка синтаксиса всех изменённых JS-файлов.