- ContractNumberField: mode и customerValue теперь синхронизируются с value prop через useEffect
- TaskDetail: date/datetime input используют w-auto, чтобы чекбокс автопролонгации шёл в одну строку
- FieldOverlay: при fitOverlay=false добавлен w-max, чтобы оверлей растягивался по ширине редактора, а не обрезался по read-view
- TaskDetail: date/datetime с автопролонгацией используют fitOverlay=false и overlayMinWidth=280
- ContractNumberField compact: переключатель, select юрлица и input/preview в одну строку
- TaskDetail: date/datetime с автопролонгацией — input и чекбокс в одну строку
- Увеличена max-width обёртки contract-number до 640px
- FieldOverlay: border-input, shadow-sm, убран overflow-hidden по умолчанию
- TaskDetail: input-редакторы h-7 leading-6, для contract-number fitOverlay=false
- ContractNumberField: добавлен compact-режим, подполя не обрезаются
- Создание задачи оставлено с вертикальным layout
- textarea overlay max-height увеличен до min(85vh, 700px)
- убрана правая кнопка 'Добавить файл' (дубль левой иконки)
- файлы идут горизонтально, длинные имена обрезаются ellipsis, список занимает доступную ширину
- FieldOverlay: border-2 border-primary/50 + shadow-lg для заметной границы
- TaskDetail textarea/rich-text: overlay растянут на всю ширину контентной области, max-height min(70vh, 500px)
- AutoResizeTextarea в TaskDetail: maxRows увеличен до 25
- FileFieldRow: список файлов в одну строку, перенос на следующую только при нехватке места
- 'Добавить файл' идёт в той же строке после файлов
- Добавлена лёгкая подложка bg-muted/40 вокруг каждого файла для визуального разделения
- Добавлены компоненты InlineField и FieldOverlay для рендера editor поверх read-view
- TaskDetail: FieldValueRow, title и due date переведены на overlay-редактирование
- TaskRegistry: ячейки реестра используют InlineField
- TaskRegularTable: ячейки таблицы-вкладки используют InlineField
- RegistryCellEditor: textarea на AutoResizeTextarea с minRows=1/maxRows=8
- Поля не разбегаются при входе в режим редактирования, textarea растёт внутри оверлея
- Добавлена миграция и поле forms.qr_generation_enabled.
- В редакторе формы (вкладка «Основное») добавлен переключатель «Показывать кнопку генерации QR в реестре форм».
- В реестре форм (/forms) рядом со статусом формы появляется кнопка QR, если toggle включён.
- Новый компонент BatchTaskQrDialog: генерирует QR для всех задач формы по всем qr.scan-шаблонам, позволяет скачать отдельный PNG или все сразу ZIP-архивом.
- Добавлена зависимость jszip.
- /api/auth/me now returns app-role permissions (was empty after reload).
- client hasPermission/hasAnyPermission now bypass admin so UI queries are not disabled when permissions array is stale.
- Добавлено поле data_tables.tree_display_column_index.
- Backend /api/directories/:id/rows/tree возвращает displayColumnIndex и
формирует label для row-узлов на основе выбранной колонки.
- В редакторе справочника добавлен селектор «Колонка для отображения в дереве».
- DirectoryRowTree, DirectoryColumnTree, DirectoryTreeSelect,
DirectoryTreeMultiSelect используют настроенную колонку.
- TableFieldSelect / TableFieldMultiSelect используют
treeDisplayColumnIndex справочника как fallback, если в поле формы
не задан displayColumn.
- Миграция 0057 + запись в _journal.json.
- package.json: db:migrate теперь запускает scripts/migrate-docker.js
- docker-entrypoint.sh: использует npm run db:migrate вместо прямого вызова node scripts/migrate-docker.js
drizzle-kit migrate падает на сервере из-за ручных SQL-миграций без snapshot'ов,
поэтому официально переводим миграции на проверенный migrate-docker.js.
- queryClient: refreshSession возвращает reason (network/unauthorized);
при network-ошибке не делаем logout, а бросаем network_error_during_refresh.
- useAuth: checkAuth и refreshUser не сбрасывают сессию при network-ошибке
во время refresh, переводят в офлайн-режим.
- auth.service: remember берётся из сессии, race tolerance 5 минут.
- access token lifetime унифицирован до 30 дней по умолчанию, cookie maxAge
теперь совпадает с JWT expiry (было 15 минут fallback).
- Add client/src/themes/ with tokens, built-in skins (iistwin, twenty, omegaprom)
- Add ThemeProvider with data-skin/data-theme and runtime CSS for custom skins
- Add npm run skins:generate script for build-time CSS generation
- Add organization_skins table, migration and CRUD API
- Add activeSkinId to organizations and expose it in /api/auth/me
- Add skin switcher in /profile and admin skin editor in /settings/appearance
- Adapt index.css hardcoded colors to skin tokens
- Update AGENTS.md and Obsidian notes
- number-поля теперь рендерятся как text + inputMode=numeric,
чтобы браузер не округлял значения через input type=number
- пробелы при вставке в number-поля удаляются
- бэкенд нормализует значения number-полей в строку перед сохранением
- добавлен хелпер normalizeFieldValueForStorage
Closes: искажение расчётного счёта и других длинных числовых полей