Files
aiform_prod/CHANGELOG_MINIAPP.md
Fedor 4b9665b27f config: N8N_PROJECT_FORM_PODROBNEE_WEBHOOK для деталей дела/проекта из CRM
- config.py: n8n_project_form_podrobnee_webhook (из .env)
- CHANGELOG_MINIAPP.md: описание переменной, эндпоинт пока не добавлен
2026-03-02 15:04:46 +03:00

8.7 KiB
Raw Blame History

Доработки мини-приложения Clientright (TG/MAX и веб)

Консультации, CRM, кнопка «Назад» (2026-02-25)

Консультации

  • Страница «Консультации»: список тикетов из тех же данных, что и «Мои обращения» (общий контекст DraftsContext), без отдельного эндпоинта списка.
  • По клику на тикет — запрос POST /api/v1/consultations/ticket-detail (session + ticket_id), вызов вебхука «подробнее» (n8n_ticket_form_podrobnee_webhook), ответ показывается карточкой с полями: заголовок, статус, категория, описание, решение, приоритет (русские подписи).
  • Убраны подпись «Тикеты из CRM» и кнопка «Назад к списку» — возврат только через кнопку «Назад» в баре.
  • Кнопка «Назад» в баре на консультациях: подписка на miniapp:goBack в Consultations.tsx — в детали тикета возврат к списку, со списка переход на «Мои обращения» (onNavigate('/')).

Поддержка

  • Кнопка «Назад» в баре в чате поддержки: на маршруте /support кнопка «Назад» больше не отключается (BottomBar.tsx — убран isSupport из условия отключения).
  • В Support.tsx добавлена подписка на miniapp:goBack: в режиме чата — возврат к списку обращений, в списке — переход на «Мои обращения» (onNavigate('/')).

CRM и дашборд

  • n8n: Code-нода нормализации ответа CRM — из projects_json и tickets_json формируется массив элементов с полями для фронта (type_code, payload, status_code). Файл docs/n8n_CODE_CRM_NORMALIZE.js, на выходе объект с полем crm_items.
  • n8n: разворот ответа в плоский список — docs/n8n_CODE_FLATTEN_DATA.js разворачивает элементы вида { crm_items: [...] } в плоский массив в data.
  • Дашборд по категориям: при клике по плиткам («В работе», «Решены» и т.д.) список фильтруется в том числе для элементов из CRM: добавлены isFromCrm(), getItemCategory() по status_code/payload, расширен STATUS_CONFIG для active/completed/rejected.
  • Карточка обращения: у контейнера и Card заданы width: '100%' и boxSizing: 'border-box' в StepDraftSelection.tsx.

Бэкенд

  • В config.py — переменная n8n_ticket_form_podrobnee_webhook для вебхука «подробнее» по тикету.
  • В config.py — переменная n8n_project_form_podrobnee_webhook (N8N_PROJECT_FORM_PODROBNEE_WEBHOOK в .env) для вебхука «подробнее» по делу/проекту из CRM (по project_id). Эндпоинт, вызывающий этот хук, пока не добавлен — зарезервировано под будущий case-detail.
  • Модуль backend/app/api/consultations.py: эндпоинт POST /api/v1/consultations/ticket-detail (session + ticket_id), вызов вебхука, ответ как есть.

Системные баннеры на экране приветствия (2026-02)

  • Баннер «Профиль не заполнен» вынесен в отдельную зону справа от текста «Теперь ты в системе — можно продолжать» (на десктопе — колонка ~260px), чтобы не занимал полстраницы и не сдвигал контент.
  • Реализовано единое место для системных баннеров: массив systemBanners, при одном баннере показывается один Alert, при нескольких — карусель (Ant Design Carousel). В будущем сюда можно добавлять другие критические уведомления.
  • Мобильная вёрстка: баннер на всю ширину, нормальный перенос текста (без разбиения по слогам), кнопка «Заполнить профиль» переносится под текст, крестик закрытия остаётся в первой строке справа (через order и flex-wrap).
  • Профиль: убрана дублирующая ссылка «Домой» из шапки карточки профиля — навигация остаётся через нижний бар.

UI и навигация

  • «Мои обращения»: дашборд с плитками по статусам (На рассмотрении, В работе, Решённые, Отклонённые, Все), заголовок переименован с «Жалобы потребителей».
  • Убрана внешняя рамка у дашборда; карточки с hover-эффектом (подъём, тень), единая высота плиток, прозрачный фон у иконок.
  • Список обращений по категориям в виде карточек с hover; фильтр по выбранной категории.
  • Кнопка «Назад» перенесена в нижний бар; убраны дублирующие кнопки «Назад» из контента (описание, документы).

Telegram и MAX

  • Выход: корректное закрытие приложения — в TG вызывается Telegram.WebApp.close(), в MAX — window.WebApp.close() / postEvent('web_app_close'). Определение платформы по initData/URL.
  • Подключение скриптов по платформе: при наличии tgWebAppData/tgWebAppVersion в URL грузится только telegram-web-app.js, иначе — только max-web-app.js (устранены ошибки UnsupportedEvent в MAX).
  • В TG/MAX не показывается экран ввода телефона — шаг «Вход» только для обычного веба; раннее определение платформы (опрос WebApp.initData), флаг platformChecked чтобы не мелькал телефон до определения.

Сессия и авторизация

  • Сессию не сбрасывать при сетевых/временных ошибках session/verify — удалять session_token только при явном ответе valid: false.
  • При нажатии «Назад» с авторизованного пользователя не вести на шаг «Вход» — переход на дашборд «Мои обращения» или на /hello.
  • Переход на «Подать обращение» через роут /new и pushState для стабильного флоу без возврата на телефон.

Исправления

  • TDZ-ошибка (пустой экран после перехода с /hello): useEffect для miniapp:goBack перенесён после объявления prevStep (useCallback).
  • Тостер «Добро пожаловать!» показывается только в вебе (не в TG/MAX), проверка по Telegram.WebApp.initData и WebApp.initData.

Отладка и логи

  • Клиентский логгер miniappLogger: сбор событий, ошибок, отправка на POST /api/v1/utils/client-log; идентификация бандла (build/moduleUrl); очистка логов при смене сборки.
  • Бэкенд: приём логов в main.py, запись в logs/cursor-debug-*.log (NDJSON), без PII.

Файлы

  • Новые: StepComplaintsDashboard.tsx/.css, StepDraftSelection.css, miniappLogger.ts.
  • Правки: ClaimForm.tsx, HelloAuth.tsx, BottomBar.tsx, StepDescription.tsx, StepWizardPlan.tsx, StepDraftSelection.tsx, App.tsx, main.tsx, index.html, main.py, api/claims.py, ClaimForm.css, BottomBar.css, Dockerfile.prod.