123 lines
4.9 KiB
Markdown
123 lines
4.9 KiB
Markdown
# Project Edit Page - Complete Fix Summary
|
|
|
|
## Fixed Issues
|
|
|
|
### 1. **Database Table Name Correction**
|
|
- **Fixed**: Changed from `training_projects` to `ak_training_projects` to match actual database schema
|
|
- **Locations**: `loadProjectData()`, `saveDraft()`, `updateProject()`, `deleteProject()`
|
|
|
|
### 2. **Data Loading Logic Fix**
|
|
- **Issue**: Incorrect handling of `.single()` query result and undefined error variable
|
|
- **Fixed**:
|
|
- Changed `res.data.length > 0` to `res.data != null` (single query returns object, not array)
|
|
- Changed `console.error('Error loading project:', error)` to `console.error('Error loading project:', res.error)`
|
|
|
|
### 3. **Database Field Mapping Correction**
|
|
Based on actual `ak_training_projects` table schema:
|
|
|
|
#### Database Fields → Form Fields Mapping:
|
|
- `objectives` (TEXT[]) → `requirements` (Array<{text: string}>)
|
|
- `instructions` (TEXT) → `scoring_criteria` (Array<{min_score, max_score, description}>)
|
|
- `equipment_required` (TEXT[]) → `performance_metrics` (Array<{name, unit}>)
|
|
- `sport_type` ↔ `category`
|
|
- `difficulty_level` ↔ `difficulty`
|
|
- `is_active` ↔ `status` (boolean ↔ 'active'/'inactive')
|
|
|
|
### 4. **Data Loading Implementation**
|
|
```typescript
|
|
// Convert database arrays to form structure
|
|
const objectives = safeGet(projectData, 'objectives', [])
|
|
let requirements: Array<UTSJSONObject> = []
|
|
if (objectives instanceof Array && objectives.length > 0) {
|
|
requirements = objectives.map((obj: any) => ({ text: obj.toString() } as UTSJSONObject))
|
|
} else {
|
|
requirements = [{ text: '' } as UTSJSONObject]
|
|
}
|
|
|
|
// Convert instruction text to scoring criteria structure
|
|
const instructions = safeGet(projectData, 'instructions', '')
|
|
let scoringCriteria: Array<UTSJSONObject> = []
|
|
if (instructions && instructions.length > 0) {
|
|
const instructionSteps = instructions.split('\n').filter((step: string) => step.trim().length > 0)
|
|
scoringCriteria = instructionSteps.map((step: string, index: number) => ({
|
|
min_score: (index * 20).toString(),
|
|
max_score: ((index + 1) * 20).toString(),
|
|
description: step.trim()
|
|
} as UTSJSONObject))
|
|
}
|
|
```
|
|
|
|
### 5. **Data Saving Implementation**
|
|
```typescript
|
|
// Convert form data back to database format
|
|
const requirements = getRequirements()
|
|
const objectives = requirements.map((req: UTSJSONObject) => safeGet(req, 'text', ''))
|
|
.filter((text: string) => text.trim().length > 0)
|
|
|
|
const scoringCriteria = getScoringCriteria()
|
|
const instructions = scoringCriteria.map((criteria: UTSJSONObject) =>
|
|
safeGet(criteria, 'description', '')).filter((desc: string) => desc.trim().length > 0).join('\n')
|
|
|
|
const performanceMetrics = getPerformanceMetrics()
|
|
const equipmentRequired = performanceMetrics.map((metric: UTSJSONObject) =>
|
|
safeGet(metric, 'name', '')).filter((name: string) => name.trim().length > 0)
|
|
```
|
|
|
|
### 6. **Fixed Save Operation Fields**
|
|
Updated both `saveDraft()` and `updateProject()` to use correct database fields:
|
|
- `sport_type` instead of `category`
|
|
- `difficulty_level` instead of `difficulty`
|
|
- `is_active` (boolean) instead of `status` (string)
|
|
- `objectives` array instead of `requirements`
|
|
- `instructions` text instead of `scoring_criteria` array
|
|
- `equipment_required` array instead of `performance_metrics`
|
|
|
|
## Current Status
|
|
|
|
✅ **Data Loading**: Correctly loads from `ak_training_projects` table and maps to form structure
|
|
✅ **Data Saving**: Properly converts form data back to database schema
|
|
✅ **Data Deletion**: Uses correct table name
|
|
✅ **Error Handling**: Fixed undefined error variable issue
|
|
✅ **Type Safety**: All UTSJSONObject casting properly implemented
|
|
✅ **Field Mapping**: Bidirectional mapping between database and form fields
|
|
|
|
## Testing Checklist
|
|
|
|
- [ ] **Load Project**: Verify project data loads correctly into form fields
|
|
- [ ] **Save Draft**: Ensure draft saving works and sets `is_active = false`
|
|
- [ ] **Update Project**: Confirm active project updates with `is_active = true`
|
|
- [ ] **Delete Project**: Test project deletion functionality
|
|
- [ ] **Field Mapping**: Verify all form fields display correct data from database
|
|
- [ ] **Validation**: Test form validation with new data structure
|
|
|
|
## Database Schema Reference
|
|
|
|
```sql
|
|
CREATE TABLE ak_training_projects (
|
|
id UUID PRIMARY KEY,
|
|
title VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
sport_type VARCHAR(100) NOT NULL,
|
|
difficulty_level VARCHAR(50) DEFAULT 'beginner',
|
|
duration_minutes INTEGER DEFAULT 30,
|
|
equipment_required TEXT[],
|
|
target_age_group VARCHAR(50),
|
|
objectives TEXT[],
|
|
instructions TEXT NOT NULL,
|
|
video_url VARCHAR(500),
|
|
image_url VARCHAR(500),
|
|
is_active BOOLEAN DEFAULT true,
|
|
created_by UUID,
|
|
created_at TIMESTAMP,
|
|
updated_at TIMESTAMP
|
|
);
|
|
```
|
|
|
|
## Notes
|
|
|
|
- The form structure remains unchanged for UI consistency
|
|
- All data conversion happens in the load/save functions
|
|
- The mapping preserves the semantic meaning of each field
|
|
- Draft projects are saved with `is_active = false`
|
|
- Active projects are saved with `is_active = true`
|