# QuoteForge v1.0.3 Дата релиза: 2026-02-06 Тег: `v1.0.3` Диапазон изменений: `v1.0.2..v1.0.3` ## Что нового - Добавлена страница управления проектами `/projects` с: - датой и временем создания проекта; - сортировкой по названию и дате создания; - серверной пагинацией; - фильтром по автору в заголовке таблицы. - Добавлена отдельная вкладка `Статус синхронизации` на уровне `Алерты / Компоненты / Прайслисты`. - Во вкладке статуса синхронизации отображаются: - пользователь; - версия приложения; - статус (`онлайн` или относительное время последней синхронизации). ## Изменения синхронизации - Реализован heartbeat синхронизации пользователей в MariaDB: `qt_pricelist_sync_status`. - Добавлен API `GET /api/sync/users-status` для UI статуса синхронизации. - Логика онлайн-статуса рассчитана от интервала фоновой синхронизации: `5 минут + 10%`. - В heartbeat фиксируется версия приложения (`app_version`). ## Важные исправления - Исправлено восстановление отсутствующей серверной конфигурации при push обновлений. - Исправлено экранирование паролей в MySQL DSN в setup. - Улучшена логика запуска SQL-миграций на старте при отсутствии прав/необходимости. - Обновлена логика пересчета прайслистов через админский price-refresh. ## Миграции и совместимость Добавлены SQL-миграции: - `migrations/010_add_pricelist_sync_status.sql` - `migrations/011_add_app_version_to_pricelist_sync_status.sql` Релиз совместим с предыдущей веткой `v1.0.x`; новая таблица синхронизации создается автоматически. ## Коммиты в релизе - `b1b50ce` Add projects table controls and sync status tab with app version - `6ab1e98` sync: recover missing server config during update push - `a1d2192` Fix MySQL DSN escaping for setup passwords and clarify DB user setup - `a90c07c` update stale files list - `e9307c4` Apply remaining pricelist and local-first updates - `1b48401` Use admin price-refresh logic for pricelist recalculation - `4a86f7b` fix: skip startup sql migrations when not needed or no permissions