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