257 lines
5.6 KiB
Markdown
257 lines
5.6 KiB
Markdown
# Frontend Setup Guide
|
|
|
|
## Quick Start
|
|
|
|
### 1. Install Dependencies
|
|
|
|
```bash
|
|
cd frontend
|
|
npm install
|
|
```
|
|
|
|
### 2. Configure Environment
|
|
|
|
Copy `.env.example` to `.env.local` and update if needed:
|
|
|
|
```bash
|
|
cp .env.example .env.local
|
|
```
|
|
|
|
Default configuration:
|
|
```
|
|
VITE_API_URL=http://localhost:8000
|
|
VITE_WS_URL=ws://localhost:8000/ws
|
|
```
|
|
|
|
### 3. Start Backend API
|
|
|
|
Make sure the backend is running first:
|
|
|
|
```bash
|
|
# From project root
|
|
wsl bash -c "source ~/miniconda3/etc/profile.d/conda.sh && conda activate invoice-py311 && python run_server.py"
|
|
```
|
|
|
|
Backend will be available at: http://localhost:8000
|
|
|
|
### 4. Start Frontend Dev Server
|
|
|
|
```bash
|
|
cd frontend
|
|
npm run dev
|
|
```
|
|
|
|
Frontend will be available at: http://localhost:3000
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
frontend/
|
|
├── src/
|
|
│ ├── api/ # API client layer
|
|
│ │ ├── client.ts # Axios instance with interceptors
|
|
│ │ ├── types.ts # API type definitions
|
|
│ │ └── endpoints/
|
|
│ │ ├── documents.ts # Document API calls
|
|
│ │ ├── annotations.ts # Annotation API calls
|
|
│ │ └── training.ts # Training API calls
|
|
│ │
|
|
│ ├── components/ # React components
|
|
│ │ └── Dashboard.tsx # Updated with real API integration
|
|
│ │
|
|
│ ├── hooks/ # Custom React Hooks
|
|
│ │ ├── useDocuments.ts
|
|
│ │ ├── useDocumentDetail.ts
|
|
│ │ ├── useAnnotations.ts
|
|
│ │ └── useTraining.ts
|
|
│ │
|
|
│ ├── styles/
|
|
│ │ └── index.css # Tailwind CSS entry
|
|
│ │
|
|
│ ├── App.tsx
|
|
│ └── main.tsx # App entry point with QueryClient
|
|
│
|
|
├── components/ # Legacy components (to be migrated)
|
|
│ ├── Badge.tsx
|
|
│ ├── Button.tsx
|
|
│ ├── Layout.tsx
|
|
│ ├── DocumentDetail.tsx
|
|
│ ├── Training.tsx
|
|
│ ├── Models.tsx
|
|
│ └── UploadModal.tsx
|
|
│
|
|
├── tailwind.config.js # Tailwind configuration
|
|
├── postcss.config.js
|
|
├── vite.config.ts
|
|
├── package.json
|
|
└── index.html
|
|
```
|
|
|
|
## Key Technologies
|
|
|
|
- **React 19** - UI framework
|
|
- **TypeScript** - Type safety
|
|
- **Vite** - Build tool
|
|
- **Tailwind CSS** - Styling (Warm Graphite theme)
|
|
- **Axios** - HTTP client
|
|
- **@tanstack/react-query** - Server state management
|
|
- **lucide-react** - Icon library
|
|
|
|
## API Integration
|
|
|
|
### Authentication
|
|
|
|
The app stores admin token in localStorage:
|
|
|
|
```typescript
|
|
localStorage.setItem('admin_token', 'your-token')
|
|
```
|
|
|
|
All API requests automatically include the `X-Admin-Token` header.
|
|
|
|
### Available Hooks
|
|
|
|
#### useDocuments
|
|
|
|
```typescript
|
|
const {
|
|
documents,
|
|
total,
|
|
isLoading,
|
|
uploadDocument,
|
|
deleteDocument,
|
|
triggerAutoLabel,
|
|
} = useDocuments({ status: 'labeled', limit: 20 })
|
|
```
|
|
|
|
#### useDocumentDetail
|
|
|
|
```typescript
|
|
const { document, annotations, isLoading } = useDocumentDetail(documentId)
|
|
```
|
|
|
|
#### useAnnotations
|
|
|
|
```typescript
|
|
const {
|
|
createAnnotation,
|
|
updateAnnotation,
|
|
deleteAnnotation,
|
|
verifyAnnotation,
|
|
overrideAnnotation,
|
|
} = useAnnotations(documentId)
|
|
```
|
|
|
|
#### useTraining
|
|
|
|
```typescript
|
|
const {
|
|
models,
|
|
isLoadingModels,
|
|
startTraining,
|
|
downloadModel,
|
|
} = useTraining()
|
|
```
|
|
|
|
## Features Implemented
|
|
|
|
### Phase 1 (Completed)
|
|
- ✅ API client with axios interceptors
|
|
- ✅ Type-safe API endpoints
|
|
- ✅ React Query for server state
|
|
- ✅ Custom hooks for all APIs
|
|
- ✅ Dashboard with real data
|
|
- ✅ Local Tailwind CSS
|
|
- ✅ Environment configuration
|
|
- ✅ CORS configured in backend
|
|
|
|
### Phase 2 (TODO)
|
|
- [ ] Update DocumentDetail to use useDocumentDetail
|
|
- [ ] Update Training page to use useTraining hooks
|
|
- [ ] Update Models page with real data
|
|
- [ ] Add UploadModal integration with API
|
|
- [ ] Add react-router for proper routing
|
|
- [ ] Add error boundary
|
|
- [ ] Add loading states
|
|
- [ ] Add toast notifications
|
|
|
|
### Phase 3 (TODO)
|
|
- [ ] Annotation canvas with real data
|
|
- [ ] Batch upload functionality
|
|
- [ ] Auto-label progress polling
|
|
- [ ] Training job monitoring
|
|
- [ ] Model download functionality
|
|
- [ ] Search and filtering
|
|
- [ ] Pagination
|
|
|
|
## Development Tips
|
|
|
|
### Hot Module Replacement
|
|
|
|
Vite supports HMR. Changes will reflect immediately without page reload.
|
|
|
|
### API Debugging
|
|
|
|
Check browser console for API requests:
|
|
- Network tab shows all requests/responses
|
|
- Axios interceptors log errors automatically
|
|
|
|
### Type Safety
|
|
|
|
TypeScript types in `src/api/types.ts` match backend Pydantic schemas.
|
|
|
|
To regenerate types from backend:
|
|
```bash
|
|
# TODO: Add type generation script
|
|
```
|
|
|
|
### Backend API Documentation
|
|
|
|
Visit http://localhost:8000/docs for interactive API documentation (Swagger UI).
|
|
|
|
## Troubleshooting
|
|
|
|
### CORS Errors
|
|
|
|
If you see CORS errors:
|
|
1. Check backend is running at http://localhost:8000
|
|
2. Verify CORS settings in `src/web/app.py`
|
|
3. Check `.env.local` has correct `VITE_API_URL`
|
|
|
|
### Module Not Found
|
|
|
|
If imports fail:
|
|
```bash
|
|
rm -rf node_modules package-lock.json
|
|
npm install
|
|
```
|
|
|
|
### Types Not Matching
|
|
|
|
If API responses don't match types:
|
|
1. Check backend version is up-to-date
|
|
2. Verify types in `src/api/types.ts`
|
|
3. Check API response in Network tab
|
|
|
|
## Next Steps
|
|
|
|
1. Run `npm install` to install dependencies
|
|
2. Start backend server
|
|
3. Run `npm run dev` to start frontend
|
|
4. Open http://localhost:3000
|
|
5. Create an admin token via backend API
|
|
6. Store token in localStorage via browser console:
|
|
```javascript
|
|
localStorage.setItem('admin_token', 'your-token-here')
|
|
```
|
|
7. Refresh page to see authenticated API calls
|
|
|
|
## Production Build
|
|
|
|
```bash
|
|
npm run build
|
|
npm run preview # Preview production build
|
|
```
|
|
|
|
Build output will be in `dist/` directory.
|