236 lines
6.5 KiB
Markdown
236 lines
6.5 KiB
Markdown
# Agent Guidelines for Data Index Report App
|
|
|
|
## Project Overview
|
|
This is a React + TypeScript + Vite application for generating data analysis reports with PDF export functionality. The app includes data visualization components (ECharts), Excel import/export, and PDF generation.
|
|
|
|
## Build, Lint, and Test Commands
|
|
|
|
### Development
|
|
```bash
|
|
npm run dev # Start development server
|
|
npm run preview # Preview production build
|
|
```
|
|
|
|
### Build
|
|
```bash
|
|
npm run build # Build for production (runs TypeScript compilation + Vite build)
|
|
```
|
|
|
|
### Linting
|
|
```bash
|
|
npm run lint # Run ESLint on all files
|
|
```
|
|
|
|
### Type Checking
|
|
```bash
|
|
npx tsc --noEmit # Type check without emitting files
|
|
```
|
|
|
|
### Single File Operations
|
|
```bash
|
|
# Lint specific file
|
|
npx eslint src/components/ComponentName.tsx
|
|
|
|
# Type check specific file
|
|
npx tsc --noEmit src/components/ComponentName.tsx
|
|
```
|
|
|
|
## Code Style Guidelines
|
|
|
|
### Imports Order
|
|
1. React and external library imports
|
|
2. Internal component imports
|
|
3. Type imports
|
|
4. Utility/helper imports
|
|
5. Style/constant imports
|
|
|
|
Example:
|
|
```typescript
|
|
import { useRef, useState } from 'react';
|
|
import html2pdf from 'html2pdf.js';
|
|
import { Download, Upload } from 'lucide-react';
|
|
import { CoverPage } from './components/CoverPage';
|
|
import { defaultReportData } from './data/defaultData';
|
|
import { parseExcelReportData } from './utils/excelUtils';
|
|
import type { ReportData } from './types/data';
|
|
```
|
|
|
|
### TypeScript Configuration
|
|
- Strict mode enabled (`"strict": true`)
|
|
- No unused locals/parameters enforced
|
|
- Use explicit type annotations for function parameters and return types
|
|
- Prefer `interface` over `type` for object shapes
|
|
- Use `type` imports for type-only imports
|
|
|
|
### Naming Conventions
|
|
- **Components**: PascalCase (e.g., `Page02Industry`, `ChinaMap`)
|
|
- **Files**: PascalCase for components, camelCase for utilities
|
|
- **Variables/Functions**: camelCase
|
|
- **Constants**: UPPER_SNAKE_CASE for true constants, camelCase for exported constants
|
|
- **Types/Interfaces**: PascalCase with `I` prefix optional (not used in this codebase)
|
|
- **Props Interfaces**: `ComponentNameProps` pattern
|
|
|
|
### Component Structure
|
|
1. Import statements
|
|
2. Interface/type definitions
|
|
3. Component function with typed props
|
|
4. Internal helper functions
|
|
5. JSX return with proper className organization
|
|
|
|
Example component pattern:
|
|
```typescript
|
|
interface ComponentProps {
|
|
data: SomeType[];
|
|
onAction?: () => void;
|
|
}
|
|
|
|
export const Component = ({ data, onAction }: ComponentProps) => {
|
|
// State and hooks
|
|
const [state, setState] = useState<StateType>(initialValue);
|
|
|
|
// Helper functions
|
|
const processData = () => {
|
|
// Implementation
|
|
};
|
|
|
|
return (
|
|
<div className="container-class">
|
|
{/* JSX content */}
|
|
</div>
|
|
);
|
|
};
|
|
```
|
|
|
|
### Error Handling
|
|
- Use try/catch for async operations
|
|
- Provide user feedback for errors (status messages, UI indicators)
|
|
- Log errors to console for debugging
|
|
- Use TypeScript's strict null checking
|
|
|
|
### Styling (Tailwind CSS)
|
|
- Use Tailwind utility classes exclusively
|
|
- Organize classes logically: layout → typography → colors → effects
|
|
- Use responsive prefixes (sm:, md:, lg:) when needed
|
|
- Custom colors defined in `tailwind.config.js`
|
|
- Use `@apply` sparingly in CSS files only
|
|
|
|
Example class organization:
|
|
```jsx
|
|
<div className="
|
|
flex flex-col /* Layout */
|
|
p-4 space-y-4 /* Spacing */
|
|
bg-white rounded-lg /* Appearance */
|
|
shadow-md /* Effects */
|
|
hover:shadow-lg /* Interactive */
|
|
">
|
|
```
|
|
|
|
### File Organization
|
|
- `src/components/` - React components
|
|
- `src/types/` - TypeScript type definitions
|
|
- `src/utils/` - Utility functions
|
|
- `src/data/` - Default data and constants
|
|
- `src/constants.ts` - Application constants
|
|
- `public/` - Static assets
|
|
|
|
### React Patterns
|
|
- Use functional components with hooks
|
|
- Prefer explicit prop typing over `any`
|
|
- Use `useState` for local state
|
|
- Use `useRef` for DOM references
|
|
- Extract complex logic into custom hooks when reusable
|
|
- Use `React.memo` for performance optimization when needed
|
|
|
|
### ECharts Integration
|
|
- Chart components should accept typed data props
|
|
- Use responsive chart configurations
|
|
- Include proper error handling for missing data
|
|
- Export charts as reusable components
|
|
|
|
### PDF Generation
|
|
- Use `html2pdf.js` for PDF export
|
|
- Handle width locking during PDF generation
|
|
- Provide proper error feedback
|
|
- Use `@ts-expect-error` for library type issues when necessary
|
|
|
|
### Excel Integration
|
|
- Use `xlsx` library for Excel operations
|
|
- Provide template generation functions
|
|
- Validate imported data structure
|
|
- Handle file upload errors gracefully
|
|
|
|
## Development Workflow
|
|
|
|
### Adding New Components
|
|
1. Create component file in `src/components/`
|
|
2. Define TypeScript interfaces for props
|
|
3. Implement component with Tailwind styling
|
|
4. Export component as named export
|
|
5. Add to appropriate parent component
|
|
|
|
### Adding New Types
|
|
1. Add to existing interface in `src/types/data.ts` or create new file
|
|
2. Use descriptive property names
|
|
3. Include JSDoc comments for complex types
|
|
4. Export types for reuse
|
|
|
|
### Adding Utilities
|
|
1. Create file in `src/utils/`
|
|
2. Write pure functions with typed parameters
|
|
3. Include error handling
|
|
4. Export functions as named exports
|
|
|
|
### Testing Changes
|
|
1. Run `npm run lint` to check code style
|
|
2. Run `npx tsc --noEmit` for type checking
|
|
3. Test component in development server
|
|
4. Verify PDF generation still works
|
|
5. Test Excel import/export functionality
|
|
|
|
## Common Patterns in Codebase
|
|
|
|
### Data Processing
|
|
```typescript
|
|
// Map data aggregation pattern
|
|
const aggregatedData = data.reduce((acc, item) => {
|
|
const key = item.name;
|
|
acc[key] = (acc[key] || 0) + item.value;
|
|
return acc;
|
|
}, {} as Record<string, number>);
|
|
```
|
|
|
|
### Component Props
|
|
```typescript
|
|
// Optional props with defaults
|
|
interface Props {
|
|
data: DataType[];
|
|
title?: string;
|
|
className?: string;
|
|
}
|
|
|
|
const Component = ({
|
|
data,
|
|
title = 'Default Title',
|
|
className = ''
|
|
}: Props) => {
|
|
// Implementation
|
|
};
|
|
```
|
|
|
|
### State Management
|
|
```typescript
|
|
// Status state pattern
|
|
const [status, setStatus] = useState<'idle' | 'loading' | 'success' | 'error'>('idle');
|
|
|
|
// Data state with default
|
|
const [reportData, setReportData] = useState<ReportData>(defaultReportData);
|
|
```
|
|
|
|
## Notes for Agents
|
|
- This is a Chinese-language application (UI text in Chinese)
|
|
- Focus on data visualization and report generation
|
|
- Maintain print-friendly styling for PDF export
|
|
- Ensure all interactive elements have `no-print` class when needed
|
|
- Follow existing patterns for consistency
|
|
- Test PDF generation after UI changes
|
|
- Verify Excel template compatibility after data structure changes |