feat(admin): cadastre bulk harvest UI (#168 PR4/5) #172
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#172
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/cadastre-bulk-admin-ui"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
/admin/scrape/cadastrefor triggering bulk cadastre harvest + monitoring jobsFiles
frontend/src/app/admin/scrape/cadastre/page.tsx/admin/scrape/geo)frontend/src/app/admin/layout.tsxUI components
Trigger form
Job #N создан, targets=X, estimate=YминLive jobs table
useQuery({ refetchInterval: 5000 })done/total (fail), Errors, Started, Heartbeat, Actionsqueuedgrey,runningblue,donegreen,failedred,zombiedarker red,cancelledpurple,pausedamberwaf_blocked_count > 5runningandnow - heartbeat_at > 10minPer-row expand
phase_statepretty-printed JSON, computed req/s rate, full stats grid, error textqueued,running}failed,cancelled,paused} ANDphase_state.phase !== 'done'TanStack Query
Token persistence
localStorage.getItem("admin_token")— same key as existing/admin/scrape/geoдля shared session.Type safety
CadastreJob,CreateCadastreJobRequest,CreateCadastreJobResponse) — fully typedany, all unknown narrowedtsc --noEmit✅, ESLint ✅Test plan
cd frontend && npx tsc --noEmit -p tsconfig.json— no errorscd frontend && npm run lint— cleanmanual_listquarters=['66:41:0303161']→ alert + новый rowrunningпосле backend enqueue_cadastre_harvest pickupDependencies
What's NOT in this PR
Notes
cardStyle,inputStyle,labelStyle,td,thиз@/lib/adminStylesapiFetchиз@/lib/api/admin/scrape/geoCloses 4/5 of #168.
Final review — CI ✅, agent verdict approve
Cross-checked агентом — page works end-to-end against documented backend, контракт exact, нет hidden real gaps.
Contract alignment (verified by agent)
✅ TS
CadastreJobinterface ↔ backend_serialize_job— exact match:job_id, name, job_kind, scope, status, triggered_by, rate_ms, created_at, started_at, finished_at, heartbeat_at, targets_total, targets_done, targets_failed, targets_skipped, requests_count, waf_blocked_count, error, phase_state, progress_pct, estimate_minutes. Никакой field drift (PR #147 pattern).✅
statustyped как string literal union — все 7 enum values покрыты (queued/running/done/failed/zombie/cancelled/paused).✅ POST request/response shapes match backend exactly.
Admin token + lifecycle
✅ Все 5 API calls send
X-Admin-TokenчерезapiFetch✅
localStorage["admin_token"]shared с/admin/scrape/geo— session consistent✅
refetchInterval: 5000для live updates✅ Status badges + colored progress bar + WAF column + heartbeat staleness check
UI safety gating
✅ Cancel button gated by status ∈ {queued, running}
✅ Resume gated by status ∈ {failed, cancelled, paused} AND
phase_state.phase !== 'done'✅ Client-side validation: manual_list требует ≥1 quarter
✅
phase_staterendered safely viaJSON.stringify(..., null, 2)Минор (cosmetic / non-blocking — agent classified)
<>shorthand в.mapвместо<React.Fragment key={...}>— dev console warning, не runtime bugconfirm()на Cancel — admin tool, low risk + действие reversible через resumeThese are genuine improvements но classified агентом как "не real gaps" — page works end-to-end. Recommend follow-up в PR 5/5 (pilot run) когда UI exercise'нется в реальных условиях.
Pattern checks
✅
apiFetch+useQuery+useMutationreuse из существующих admin pages✅ Reuse
cardStyle,inputStyle,labelStyle,td,thиз@/lib/adminStyles✅ tsc + ESLint clean per PR body
✅ Backend + frontend CI SUCCESS
approve merge