Commit Graph

262 Commits

Author SHA1 Message Date
4b34a4bea5 Финансы: мобильная нижняя навигация (Обзор / Разделы / Настройки) вместо боковой панели на телефоне 2026-09-05 17:59:34 +03:00
ccfc396d40 CI: NODE_OPTIONS --max-old-space-size=6144 для tsc — googleapis тянет тяжёлые .d.ts, Type check падал с OOM 2026-09-05 15:39:58 +03:00
7a8db03163 Финансы: дебиторка (vw_debt_active), расчёты НДС/налога на прибыль, аудит целостности с автопланировщиком, синхронизация зарплат из Google Sheets, миграция настроек Data-Insight2 2026-09-05 15:07:36 +03:00
d2c993b613 fix: мультивыбор user/роль — мгновенное обновление выбора (галки/чипы) в карточке задачи 2026-09-05 12:33:14 +03:00
005a51e367 fix: MCP update_task_status запускает автоматизации task.status_changed (раньше обходил executeTaskTransition) 2026-09-04 20:32:06 +03:00
ba723aa0b7 feat: ctx.users.recalcFieldAverage + документация автопересчёта среднего history-number 2026-09-04 20:14:51 +03:00
6aececeb4a feat: автоматический пересчёт среднего для history-number в sandbox
- setFieldValue для history-number: переданное число пишется в историю, значением поля становится среднее за текущий месяц (автопересчёт)
- ctx.users.recalcFieldAverage(userId, fieldCodeOrId): принудительный пересчёт среднего за месяц (для schedule-автоматизаций; нет записей — поле очищается)
- документация обновлена (Automations.tsx, mcp.ts)
2026-09-04 20:09:27 +03:00
4d65049e02 feat: рейтинговые автоматизации, мультивыбор user/role-полей, график history-number
Инфраструктура автоматизаций:
- триггер task.status_changed оживлён: вызов из executeTaskTransition (fire-and-forget) + фильтр triggerConfig.statusId
- ctx.users.setFieldValue(userId, fieldCodeOrId, value): запись user_profile_field_values с аудитом; для history-number — append в user_field_history (миграция 0078)
- документация sandbox обновлена (Automations.tsx, mcp.ts, AGENTS.md) по критическому правилу 2

Мультивыбор пользователей и ролей в user-поле:
- чекбокс «Множественный выбор (пользователи и роли)» в настройках поля (form_fields.allow_multiple)
- значение — массив ['user:ID','role:ID'], обратная совместимость с одиночными/legacy значениями
- UserRoleMultiSelect в карточке задачи, реестре и диалоге создания (роли добавлены и в одиночный сценарий создания)
- синк в task_assignees итерирует массив; role:ID раскрывается в членов роли; PATCH single — diff старого/нового значений
- отображение массивов: реестр, title-шаблоны, условия полей, MCP update_task_fields
- список орг-ролей (/api/roles) загружается всем пользователям (сервер и так был открыт) — роли доступны не только админам

График history-number в профиле:
- GET /api/users/:id/field-history/:fieldId?period=week|month|quarter|year (агрегация AVG по бакетам)
- диалог с LineChart (recharts) и переключателем периодов по клику на иконку у поля
2026-09-04 19:39:10 +03:00
013e97c8d3 fix(ui): bulk-панель выделения заменяет тулбар на месте — список больше не сдвигается
- Home: панель действий рендерится вместо строки поиска (те же метрики: py-1, h-8 md:h-6)
- Реестр: панель «N выбрано / Удалить» внутри тулбара TaskRegistry (swap содержимого строки)
2026-09-04 14:42:53 +03:00
49209ddacd fix(chat): убрана длинная подсказка из placeholder поля сообщения в чате задачи 2026-09-04 11:43:23 +03:00
9a1a6f45e0 feat(themes): Тема 2.0 — spacing/density/компоненты в скинах, пресеты layout форм, скин pyrus
- tokens: spacing (fieldGap/controlPadding/sectionGap/pageGutter), density (пресеты compact/comfortable/spacious + высоты), components (control.variant, label, form.columns, dialog, table, button, motion)
- componentsToCssVars: варианты → CSS-переменные; контролы/таблицы/диалоги/кнопки читают var-ы с fallback'ами (обратная совместимость)
- useSkinComponents() для структурных вариантов
- AppearanceSettings: секция «Компоненты и отступы» + экспорт/импорт темы JSON
- layouts/: пресеты compact/vertical/pyrus представления карточки, выбор в FormEditor без кода (@preset:<id>), предпросмотр
- FieldValueRow вынесен в components/task-fields/ (пресеты с per-field редактированием)
- ctx.libs: +TaskChat, extraCtx: +transitions/assignees
- skins/pyrus: dark-first по мотивам Pyrus, compact density, filled-контролы, WCAG-контрасты
2026-09-04 09:31:43 +03:00
67dbf90d65 feat(gps): мосты-предположения по дорогам между GPS-якорями на LBS-участках (OSRM route, пунктир) 2026-08-31 21:30:17 +03:00
08d1fa1af3 fix(gps): бейдж «Нет GPS» = нет валидной GPS-точки дольше N часов (настройка), убран pin от stale-пересылок 2026-08-31 17:36:40 +03:00
0ad9bb8715 fix(gps): убран слой детекции LBS по stale re-send (помечал ~100% точек); is_lbs только по протокольному флагу valid=false + физика 2026-08-31 17:02:56 +03:00
cbb659aed7 feat(gps): valid=false от протокола H02 → точка сохраняется как LBS-примерная (не выбрасывается), сигнал потери GPS 2026-08-31 15:13:03 +03:00
bec3cc054d feat(gps): траекторный фильтр трека (медианный якорь из 10 точек + lookahead-подтверждение переезда); скорость у выживших LBS-точек с «~» 2026-08-30 20:26:36 +03:00
0386005463 fix(gps): LBS-точки без линий (конец «мяча»), честные поездки без фейковых разрывов, тост OSRM только при реальной недоступности 2026-08-30 12:49:00 +03:00
3f4d35ae83 fix(gps): offroad-фильтр при выдаче — все точки, не только isLbs (легализованный LBS обходил фильтр и ломал OSRM match) 2026-08-29 21:49:58 +03:00
3ff74d0d17 fix(gps): zIndex точек трека над полилиниями + capture-клики; offroad-фильтр LBS при выдаче трека (чистит старый «мяч») 2026-08-29 21:36:55 +03:00
a302f0c0ea feat(gps): фильтр «далеко от дороги» в LBS-режиме (offRoadMeters, OSRM nearest); пробег «точно + примерно (по вышкам)» в Маршрутах 2026-08-29 21:12:09 +03:00
9eaff65500 fix(gps): подписи Старт/Финиш не обрезаются; data-gps-marker-id на маркерах — надёжная доставка кликов (панель точки, плейхед) 2026-08-29 20:58:08 +03:00
60bd52b75a feat(gps): режим «потерян GPS» — LBS-точки помечаются (is_lbs), примерная позиция на карте, пунктир в треке; OSRM map matching трека (matched endpoint + переключатель «По дорогам») 2026-08-28 17:22:57 +03:00
5d45084af1 feat(gps): автообновление списка объектов каждые 30 сек (бейдж «Нет GPS» гаснет сам) 2026-08-28 16:09:14 +03:00
6688b49d4b fix(gps): непрозрачная инфо-панель точки трека (bg-card вместо bg-background/95) 2026-08-28 15:13:03 +03:00
1df7b06630 fix(gps): инфо-панель точки трека вместо balloon провайдера (время/скорость/направление + плейхед) 2026-08-28 13:29:11 +03:00
3ea0f8c187 feat(gps): фронт индикатора потери GPS — бейдж «Нет GPS» в объектах, настройка порога в часах 2026-08-28 10:53:34 +03:00
1af4126f7c feat(gps): индикатор потери GPS у объектов (last_gps_fix_at из stale re-send/принятых точек), настройка порога в часах 2026-08-28 10:48:32 +03:00
96e088c890 fix(gps): фильтр несогласованности скоростей против LBS-телепортов; fix: плейхед не закрывает balloon точек трека 2026-08-28 10:33:45 +03:00
ac4f89d42e feat(gps): фильтры heartbeat-эхо/valid=false/spike; доступ к GPS и Финансам — матрица на /users (пользователи+роли) 2026-08-26 17:13:49 +03:00
2fb7ad6606 fix(pwa): добавлен interactive-widget=resizes-content в viewport
Без этого на Android при открытии клавиатуры viewport не уменьшался,
и поле ввода сообщения в чате/задаче перекрывалось клавиатурой
или «убегало» вверх вместе с контентом.
2026-08-26 15:10:09 +03:00
5e8103a6da fix(push): bump SW to v12, улучшен openOrFocusChat и notificationclick
- openOrFocusChat: includeUncontrolled=true, логирование, try/catch, fallback на clients.openWindow.
- notificationclick: логирование data, fallback построения URL из вложенного data.data.
- markNotificationRead: поддержка type/messageId/conversationId на верхнем уровне и во вложенном data.
- Bump CACHE_NAME до v12 для принудительного обновления SW.
2026-08-26 14:54:37 +03:00
8a649541fb feat(button): связь parent/child и копирование полей для кнопки создания задачи
- В настройках кнопки «Создать задачу по форме» добавлен выбор связи: новая задача — родительская или дочерняя (task_relations).
- Добавлено копирование значений полей из текущей задачи в новую через визуальный маппинг в отдельном диалоге (ButtonCopyFieldsDialog).
- Маппинг хранится в form_fields.options.copyFields, связь — в options.relationType.
- CreateTaskDialog/CreateTaskFormContent поддерживают initialValues (объектные значения) и parentTaskId.
2026-08-26 11:24:56 +03:00
8f5789ec28 feat(gps): фокус геозоны на карте, город по умолчанию для всех карт, доступ к GPS по пользователям/ролям (админ) 2026-08-26 10:20:38 +03:00
3e8849019a feat(gps): скорость в км/ч (конверсия узлов Traccar + backfill), деление маршрута на поездки, проигрывание от любой точки, скорости x100-x1000 2026-08-26 09:24:29 +03:00
a4b508f70e fix(gps): гистерезис подтверждения jump-кандидата — latch-up на LBS, реальные переезды принимаются после 3 точек 2026-08-25 18:06:43 +03:00
3d24a15fb3 fix(gps): отсев устаревших копий и LBS-телепортов (stale/jump фильтры), настройка maxJumpSpeedKmh, фильтрация трека при выдаче 2026-08-25 17:49:38 +03:00
b635d1e16e feat(gps): last_seen по времени приёма, фильтр джиттера (настройки), линейка, трек по скорости; fix: карта не перекрывает диалоги (isolation) 2026-08-25 17:01:44 +03:00
670cecfe05 feat(gps): список объектов по клику на кластер, стрелки направления на точках трека; fix: хитбокс маркеров (попапы точек трека) 2026-08-25 16:15:02 +03:00
39c70033e3 feat(gps): кластеризация маркеров объектов (ymaps.Clusterer + leaflet.markercluster), точки трека со скоростью в попапах 2026-08-25 15:26:35 +03:00
bde9c2a641 feat(gps): левая панель-дерево объектов вместо select'ов; fix(csp): разрешён api-maps.yandex.ru для JS API 2.1 2026-08-25 14:59:09 +03:00
c7aac447bc feat(gps): Яндекс-подложка переведена на JS API 2.1 (v3 без бесплатного тарифа), общий marker-html для обеих подложек 2026-08-25 14:29:47 +03:00
4018ee0f1b feat(gps): SinoTrack ST-901L в справочнике — порт 5013 (H02), проверено на реальном устройстве 2026-08-25 13:51:25 +03:00
f6e3e1964c Кнопка На себя у поля Ответственный в TaskDetail и меню дополнительных действий в TaskChat 2026-08-25 10:13:36 +03:00
a7cf1b2c97 fix(gps): убран '--' из XML-комментария в traccar.xml.example (SAXParseException) 2026-08-24 22:25:26 +03:00
7fe636b56c feat(gps): вкладка «Инструкции» со справочником настройки трекеров + открыты порты протоколов (Teltonika, GPS103, H02, Suntech) 2026-08-24 22:15:34 +03:00
a6a42fdb15 feat(gps): бесплатная подложка OSM с авто-fallback и ручным переключателем провайдера карты 2026-08-24 21:05:22 +03:00
541248b103 chore: traccar.xml вынесен в .gitignore (шаблон traccar.xml.example), forward.type=json 2026-08-24 19:42:26 +03:00
104b3ca422 feat: модуль GPS-мониторинга (карта Яндекс.Карт, Traccar, геозоны, маршруты, группы) 2026-08-24 19:30:11 +03:00
c0e2ddd9c8 Исправлено дублирование сообщений в task-чате: защита от двойного Enter/клика по кнопке отправки 2026-08-24 16:53:25 +03:00
8b713e66c0 Исправлено дублирование сообщений в task-чате: защита от двойного Enter/клика по кнопке отправки 2026-08-24 16:50:05 +03:00