Skip to content

feat(crm): skeleton-лоадеры + empty-state'ы — UX подгрузки в CRM#16

Merged
Br1Im merged 1 commit into
mainfrom
devin/1778713495-crm-loaders
May 13, 2026
Merged

feat(crm): skeleton-лоадеры + empty-state'ы — UX подгрузки в CRM#16
Br1Im merged 1 commit into
mainfrom
devin/1778713495-crm-loaders

Conversation

@devin-ai-integration

Copy link
Copy Markdown
Contributor

Summary

Пока данных в CRM мало, пользователь видит либо стандартный Antd-спиннер, либо вообще плоский текст «Загрузка договоров...» — это выглядит сыро и непонятно: грузится оно или там вообще пусто. Этот PR заменяет всё на единый стиль.

Что добавлено — два переиспользуемых UI-компонента в frontend/src/components/ui/:

  1. <TableSkeleton rows cols withHeader withToolbar /> — сетка-плейсхолдер с шиммер-анимацией, повторяющая структуру будущей таблицы (заголовок + строки). CSS-only (без JS-таймеров), уважает prefers-reduced-motion и тёмную тему.
  2. <EmptyState title description icon action /> — приятная пустая карточка с круглой иконкой-градиентом, заголовком и подсказкой вместо <Empty /> и плоского «Документы не найдены».

Куда подключены:

Компонент Было Стало
Applications.tsx Antd spinner + <Empty> TableSkeleton + EmptyState
Acts.tsx Antd spinner + <Empty> TableSkeleton + EmptyState
Cases.tsx (2 таба) Antd spinner + plain text TableSkeleton + EmptyState
MyCases.tsx Antd spinner + <Empty> TableSkeleton + EmptyState
Arrivals.tsx (2 таба) Antd spinner + plain text TableSkeleton + EmptyState
Documents.tsx «Загрузка договоров...» текст TableSkeleton + EmptyState
Appointments.tsx «Загрузка записей...» текст TableSkeleton
Expenses.tsx «Загрузка расходов...» текст TableSkeleton
Materials.tsx «Загрузка материалов дел...» TableSkeleton
Employees.tsx «Загрузка…» TableSkeleton + EmptyState

Тесты: добавил TableSkeleton.test.tsx (7 кейсов) → frontend Vitest 20 passed (было 13). Полный typecheck (tsc --noEmit) и production build (vite build) проходят чисто.

Что НЕ входит в этот PR (отдельные PR'ы по согласованию):

  • Бэкенд perf (Promise.all в officeDashboardController, пагинация в clients/contracts/cases, gzip) — следующий PR.
  • IDOR-фикс на PUT/DELETE /api/offices/:id (зафиксирован в PR test(security): deep — JWT tampering, SQLi probes, mass-assignment, IDOR #15 Notes).
  • React Query / SWR (большой рефактор useEffect+fetch паттерна).

Превью

Static превью компонентов из реального CSS (light theme):

TableSkeleton + EmptyState

EmptyState

Review & Testing Checklist for Human

  • Открыть live http://138.124.14.157 после мержа и зайти в CRM, проверить разделы: Заявления, Дела, Клиенты, Договоры, Приходы, Сотрудники, Расходы. Скелетон должен появиться на короткий момент при первой загрузке и не должно быть «голого» текста.
  • Переключить тёмную тему — шиммер-полоски должны стать темнее, контраст сохраняется.
  • Если в какой-то таблице данных нет — должна показываться приятная пустая карточка (круглая иконка + заголовок + подсказка), а не пустое место.

Notes

— Скелетон рисуется только при loading && data.length === 0 (первая загрузка). При повторных запросах (фильтр, пагинация) остаётся обычный Antd loading оверлей сверху таблицы — это сохраняет видимый прогресс без «прыжка» макета.
Cases.tsx импортирует Empty из antd только в одной модалке (детальная карточка дела) — оставил, не менял Modal-логику.
— Компоненты названы и положены в frontend/src/components/ui/ с barrel-export — легко подключать в будущих таблицах без копипасты.

Link to Devin session: https://app.devin.ai/sessions/514f368ad0194bf18d0327e62a88aeda
Requested by: @Br1Im

@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

@Br1Im Br1Im merged commit f6e89c6 into main May 13, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant