Files
schulos/docs/COMPONENT_CONSOLIDATION_GUIDE.md
Z User 9ce58565ba i18n: Fix 44 additional hardcoded English strings across 15 files
Fixed files:
- competitions-view.tsx: 10 strings (placeholders, labels)
- subjects-view.tsx: 11 strings (types, actions, placeholders)
- professional-calendar.tsx: 5 strings (event type labels)
- illness-reporting-view.tsx: 3 strings (status badges)
- student-detail-view.tsx: 4 strings (health form placeholders)
- data-table.tsx: 2 strings (search, empty state)
- compliance-wizard.tsx: 2 strings (name, state)
- settings-view.tsx: 1 string (Skipped)
- competence-flower-view.tsx: 1 string (Active)
- disciplinary-view.tsx: 1 string (All clear)
- district-management-view.tsx: 1 string (No recent activity)
- competitions-view.tsx: 1 string (Stock)
- ui/pagination.tsx: 3 strings (Previous, Next, More pages)
- ui/breadcrumb.tsx: 1 string (More)
- ui/carousel.tsx: 2 strings (Previous/Next slide)
- ui/sidebar.tsx: 1 string (Sidebar title)

Total: 44 hardcoded English strings replaced with German
2026-09-06 15:11:41 +00:00

272 lines
6.8 KiB
Markdown
Executable File

# Component Consolidation Guide
## Overview
This guide consolidates 55+ duplicated components into 12 unified modules.
Target: 50% code reduction in components directory.
---
## Priority 1: High-Duplication Components
### 1. Communication System
**Current State:**
- `communication-view.tsx` (800 lines)
- `parent-communication-view.tsx` (900 lines)
- Total: 1,700 lines of 85% similar code
**Consolidated Solution:**
- ✅ Created `unified-communication.tsx` (wrapper)
- Uses unified-nav-menu for role-based filtering
- Both views now auto-select based on user role
**Migration Path:**
1. Update imports in parent pages to use `UnifiedCommunication`
2. Keep both views as internal implementations
3. Remove direct imports from pages
---
### 2. Navigation System
**Current State:**
- Multiple navigation implementations
- Duplicated menu building logic
- Inconsistent route references
**Consolidated Solution:**
- ✅ Created `navigation-config.ts` (centralized config)
- ✅ Created `unified-nav-menu.tsx` (single component)
- Single source of truth for all routes
**Benefits:**
- Change route once, updates everywhere
- Role-based filtering in one place
- Compliance gates centralized (Module L)
**Action Items:**
```typescript
// OLD: Multiple nav implementations
import { TeacherNav } from './teacher-nav'
import { StudentNav } from './student-nav'
import { ParentNav } from './parent-nav'
// NEW: Single unified nav
import { UnifiedNavMenu } from '@/components/unified-nav-menu'
<UnifiedNavMenu orientation="vertical" />
```
---
### 3. Data Tables (8 implementations)
**Current State:**
- analytics-table.tsx
- attendance-table.tsx
- grades-table.tsx
- behavior-table.tsx
- assessments-table.tsx
- competitors-table.tsx
- notebook-table.tsx
- messages-table.tsx
**Problem:** 85% identical code, only differs in columns/data
**Consolidated Solution:**
- Already created: `data-table.tsx` (reusable)
- Configure via column definitions, not code duplication
**Implementation:**
```typescript
// Define columns once
const gradesColumns: ColumnDef<Grade>[] = [
{ accessorKey: 'subject', header: 'Subject' },
{ accessorKey: 'grade', header: 'Grade' },
// ... more columns
];
// Use generic table
<DataTable
columns={gradesColumns}
data={grades}
onSort={handleSort}
onFilter={handleFilter}
actionButtons={[/* actions */]}
/>
```
**Consolidation Checklist:**
- [ ] Extract column definitions to separate files
- [ ] Replace all 8 table components with `DataTable`
- [ ] Verify sorting, filtering, pagination work
- [ ] Delete original 8 files
- [ ] Expected saving: ~3,000 lines
---
### 4. Forms (10+ implementations)
**Current State:**
- student-form.tsx
- grade-entry-form.tsx
- assessment-creation-form.tsx
- behavior-incident-form.tsx
- wellness-check-form.tsx
- message-compose-form.tsx
- notebook-form.tsx
- And more duplicates
**Consolidated Solution:**
- Already created: `form-builder.tsx` (schema-driven)
**Implementation:**
```typescript
// Define schema once
const gradeSchema = z.object({
subject: z.string(),
grade: z.number().min(1).max(6),
comment: z.string().optional(),
});
// Use generic builder
<FormBuilder
schema={gradeSchema}
onSubmit={handleSubmit}
fields={['subject', 'grade', 'comment']}
/>
```
**Consolidation Checklist:**
- [ ] Extract form schemas to `schemas/forms/`
- [ ] Replace all 10+ forms with `FormBuilder`
- [ ] Test validation on all forms
- [ ] Delete original files
- [ ] Expected saving: ~4,000 lines
---
### 5. Analytics & Charts (4 implementations)
**Current State:**
- grade-analytics-view.tsx (600 lines)
- attendance-analytics.tsx (500 lines)
- behavior-analytics.tsx (550 lines)
- competency-analytics.tsx (480 lines)
**Problem:** Same charting logic, different data sources
**Consolidated Solution:**
```typescript
// Centralized chart configs
const chartConfigs = {
GRADES: { type: 'bar', color: 'emerald', metrics: ['grade', 'trend'] },
ATTENDANCE: { type: 'line', color: 'blue', metrics: ['present', 'absent'] },
BEHAVIOR: { type: 'area', color: 'red', metrics: ['incidents', 'warnings'] },
};
// Generic analytics component
<AnalyticsPanel
type="GRADES"
data={gradesData}
config={chartConfigs.GRADES}
/>
```
**Expected saving:** ~2,000 lines
---
## Priority 2: Medium-Duplication Components
### 6. Dashboard Widgets (4 variations)
**Consolidation:** Use `widget-container.tsx` + `dashboard-customizer.tsx`
### 7. Modal/Dialog Components (6+ duplicates)
**Consolidation:** Use `confirm-dialog.tsx` for confirmations
### 8. Status Badges (5+ implementations)
**Consolidation:** Create centralized `status-badge.tsx`
---
## Priority 3: API & Data Patterns
### 9. API Hooks (60+ manual fetch patterns)
**Solution:** Use `useApi()` hook everywhere
**Migration:**
```typescript
// OLD
const [data, setData] = useState([]);
useEffect(() => {
fetch('/api/grades').then(r => r.json()).then(setData);
}, []);
// NEW
const { data } = useApi('/api/grades', { revalidateOnFocus: true });
```
### 10. Response Handling (100+ duplicated patterns)
**Solution:** Use `api-response.ts` wrapper
---
## Expected Results After Consolidation
| Metric | Before | After | Reduction |
|--------|--------|-------|-----------|
| Component files | 55 | 12 | 78% |
| Total LOC | ~18,000 | ~9,000 | 50% |
| Form code | 4,000 | 400 | 90% |
| Table code | 3,000 | 300 | 90% |
| Navigation LOC | 2,000 | 300 | 85% |
| API calls | 60+ patterns | 1 hook | 99% |
| Bundle size | 450KB | 300KB | 33% |
| Bundle (gzip) | 120KB | 75KB | 37% |
---
## Implementation Timeline
**Week 1:**
- [ ] Day 1: Consolidate navigation (UnifiedNavMenu)
- [ ] Day 2: Consolidate communication (UnifiedCommunication)
- [ ] Day 3: Consolidate data tables (replace all 8)
- [ ] Day 4: Consolidate forms (replace 10+)
- [ ] Day 5: Testing & verification
**Week 2:**
- [ ] Day 1-2: Consolidate analytics
- [ ] Day 3-4: Consolidate modals
- [ ] Day 5: Migration of remaining components
**Week 3:**
- [ ] Testing all user roles
- [ ] Performance benchmarking
- [ ] Documentation updates
---
## Success Criteria
- [ ] All 55 components mapped to 12 modules
- [ ] 50%+ code reduction achieved
- [ ] No functionality lost
- [ ] All tests passing
- [ ] Performance metrics improved
- [ ] Navigation works for all roles
- [ ] Compliance gates working (Module L)
---
## Files to Create (Already Done)
- ✅ `src/lib/navigation-config.ts` - Centralized routes
- ✅ `src/components/unified-nav-menu.tsx` - Single nav component
- ✅ `src/components/unified-communication.tsx` - Communication wrapper
- ✅ `src/components/data-table.tsx` - Generic table
- ✅ `src/components/form-builder.tsx` - Schema-driven forms
- ✅ `src/lib/hooks/useApi.ts` - Universal data fetching
## Files to Delete (During Migration)
- Will delete all 55 duplicated component files after verification
- Keep originals as backup until full migration complete