- organization_api_keys.scopes (jsonb, NULL = полный доступ для legacy-ключей)
- MCP: фильтрация инструментов по режиму и проверка formIds в handler'ах
- PATCH /api/mcp-keys/:id, валидация скоупов в server/utils/api-key.ts
- UI Settings: диалог создания/редактирования ключа с режимом и мультивыбором форм/справочников
- в режиме редактирования карточки задачи редакторы geo (~90px) и contact
(~300px) переполняли inset-0 оверлей поверх однострочного read-view (~28px)
и наезжали на соседние поля (форма «Объект», «Наши Юрики»)
- теперь для типов geo/contact редактор рендерится в потоке, строка растёт
до высоты редактора; остальные типы — без изменений
- INSTRUCTIONS_TEXT: добавлено требование выйти из встречи, а не завершать её
- vpn.db.ts: findAllActiveVpnTasks для поиска активных VPN-задач
- vpn.service.ts: checkVpnRoomsValidity — периодическая проверка комнат, concurrency=5
- vpn-bot.service.ts: findVpnBotConversationId и notifyVpnRoomExpired
- server/index.ts: worker каждые 6 часов, уведомление пользователю о протухшей ссылке
- validateTelemostRoom: таймаут 3 сек + кэш 10 мин
- createVpnTask: транзакция + batch insert field values
- prepareVpnSubscription: валидация и создание подписки в фоне при получении ссылки
- sendVpnBotMessage: кэш botId, Promise.all для enrich/members/orgMap
- processPlatformSelection: одно сообщение с файлом и подпиской вместо двух
- Chat.tsx: нажатая кнопка становится зелёной галочкой, остальные disabled
- Добавлена ветка bot.type === 'vpn' в messenger.messages.routes.ts
- Добавлен полный модуль server/vpn/ (routes, service, db, bot, config)
- Подключены VPN-маршруты в server/routes/index.ts
- Добавлена раздача /apps статики и COPY в Dockerfile
- apps/ пока содержит .gitkeep и README; APK/IPA нужно добавить отдельно
- Добавлены active_chat_* поля в user_presence и endpoint /api/devices/active-chat
- Сервер не шлёт Web Push/Pushy, если получатель смотрит в тот же чат на видимой вкладке
- Клиент сообщает серверу и Service Worker об активном чате из Chat.tsx и TaskChat.tsx
- TaskChat: входящие сообщения автоматически отмечаются прочитанными при видимой вкладке
- SW: подавляет foreground/system push, если активный чат совпадает
- Убран локальный useState mode; режим всегда берется из value.
- Добавлена синхронизация customerInput с внешним value.
- При переключении на 'Мой номер' value сбрасывается для генерации номера.
- При переключении на 'Номер заказчика' используется локальный шифр.
- Убрано локальное состояние customerValue, теперь значение берётся напрямую из parsed.value
- Убран лишний useEffect, который мог сбрасывать ввод при глобальном редактировании
- Состояние mode продолжает синхронизироваться с value prop
- inputClass: w-full → w-auto (prevents input from wrapping below label)
- textareaClass: flex-1 → w-auto min-w-[200px]
- Increases max-w from 280px to 320px for longer values
- Fixes text/select inputs appearing on new line instead of inline with label
- catch block: use parsed.value as fallback instead of empty string
- remove error display in UI — show current value instead
- add parsed.value as fallback before 'Select legal entity' message
- fixes 'Не удалось загрузить номер' on first edit
- Revert NotionFieldRow grid layout back to original flex layout
- Keep StickyActionBar at bottom (not top)
- Add pencil icon on hover in left column
- Keep all original overlay logic (wide overlay for contract-number, date+prolongation)
- Preserve inline horizontal layout for extra elements (checkbox, calendar icon)
Fixes: vertical stacking of extra elements, misaligned fields
- 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.