4.1 KiB
4.1 KiB
Frontend FSD Screener — Implementation Plan
For agentic workers: Implement task-by-task using the tasks.md checklist. Steps use checkbox (
- [ ]) syntax.
Goal: Перевести скринер в FSD-структуру с созданием первого feature-slice (features/screener/).
Architecture: Скринер — пользовательский сценарий (фильтрация + сортировка + пагинация), а не бизнес-сущность, поэтому размещается в features/ слое. features/screener/ содержит API, модель (URLSearchParams + TanStack Query) и UI. pages/screener/ — тонкая композиция. Legacy-файлы удаляются без shim-совместимости.
Tech Stack: React 18, TypeScript, React Router v6, TanStack Query v5, Vitest, ESLint, Vite.
Карта файлов
Create
docs/features/frontend-fsd-screener/spec.mddocs/features/frontend-fsd-screener/plan.mddocs/features/frontend-fsd-screener/tasks.mdapps/frontend/src/features/screener/api/screenerApi.ts— ScreenerQuery, getScreenerResultsapps/frontend/src/features/screener/model/useScreener.ts— URLSearchParams + TanStack Queryapps/frontend/src/features/screener/model/index.ts— barrelapps/frontend/src/features/screener/ui/FilterPanel.tsx— фильтрыapps/frontend/src/features/screener/ui/FilterPanelShare.tsx— share-фильтрыapps/frontend/src/features/screener/ui/FilterPanelBond.tsx— bond-фильтрыapps/frontend/src/features/screener/ui/ScreenerTable.tsx— таблицаapps/frontend/src/features/screener/ui/index.ts— barrelapps/frontend/src/features/screener/index.ts— public APIapps/frontend/src/pages/screener/ui/ScreenerPage.tsx— page entrypointapps/frontend/src/pages/screener/index.ts— public API
Modify
apps/frontend/src/app/routing/AppRoutes.tsx— import from@/pages/screener
Delete
apps/frontend/src/api/screener.tsapps/frontend/src/hooks/useScreener.tsapps/frontend/src/components/screener/FilterPanel.tsxapps/frontend/src/components/screener/FilterPanelShare.tsxapps/frontend/src/components/screener/FilterPanelBond.tsxapps/frontend/src/components/screener/ScreenerTable.tsxapps/frontend/src/pages/screener/ScreenerPage.tsx
Порядок реализации
- Создать
features/screener/api/screenerApi.ts— перенестиScreenerQuery+getScreenerResultsизapi/screener.ts, обновить импорты на@/shared/api/client - Создать
features/screener/model/useScreener.ts— перенести хук изhooks/useScreener.ts, обновить импорты - Создать
features/screener/ui/— перенести 4 компонента изcomponents/screener/, обновить импорты - Создать barrel-файлы (
model/index.ts,ui/index.ts,features/screener/index.ts) - Создать
pages/screener/ui/ScreenerPage.tsx— обновить импорты на@/features/screener - Создать
pages/screener/index.ts— barrel export - Обновить
AppRoutes.tsx—import { ScreenerPage } from '@/pages/screener' - Удалить legacy-файлы
- Verification:
test,lint,build
Verification
npm test -w apps/frontend
npm run lint -w apps/frontend
npm run build -w apps/frontend
# Проверка отсутствия deep imports в новые model/ и ui/
rg -n "@features/screener/(model|ui)" apps/frontend/src --type ts --type tsx || echo "OK: no deep imports from outside"
# Проверка импорта pages/screener только через barrel
rg -n "@/pages/screener/(ui|ScreenerPage)" apps/frontend/src --type ts --type tsx || echo "OK: no deep page imports"
# Проверка, что legacy удалены
! test -f apps/frontend/src/api/screener.ts || echo "FAIL"
! test -f apps/frontend/src/hooks/useScreener.ts || echo "FAIL"
! test -d apps/frontend/src/components/screener || echo "FAIL"