# TASK-FE-007: Drawing Management UI **ID:** TASK-FE-007 **Title:** Drawing List, Upload & Revision Management UI **Category:** Business Modules **Priority:** P2 (Medium) **Effort:** 4-6 days **Dependencies:** TASK-FE-003, TASK-FE-005, TASK-BE-008 **Assigned To:** Frontend Developer --- ## 📋 Overview Build UI for Drawing Management including Contract Drawings and Shop Drawings with revision tracking, file preview, and comparison features. --- ## 🎯 Objectives 1. Create drawing list with category filtering (Contract/Shop) 2. Implement drawing upload with metadata 3. Build revision management UI 4. Add file preview/download functionality 5. Implement drawing comparison (side-by-side) 6. Add version history view --- ## ✅ Acceptance Criteria - [ ] List displays drawings grouped by type - [ ] Upload form accepts drawing files (PDF, DWG) - [ ] Revision history visible with compare feature - [ ] File preview works for PDF - [ ] Download functionality working - [ ] Metadata (discipline, sheet number) editable --- ## 🔧 Implementation Steps ### Step 1: Drawing List with Category Tabs ```typescript // File: src/app/(dashboard)/drawings/page.tsx 'use client'; import { useState } from 'react'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { DrawingList } from '@/components/drawings/list'; import { Button } from '@/components/ui/button'; import { Upload } from 'lucide-react'; import Link from 'next/link'; export default function DrawingsPage() { return (

Drawings

Manage contract and shop drawings

Contract Drawings Shop Drawings
); } ``` ### Step 2: Drawing Card with Preview ```typescript // File: src/components/drawings/card.tsx 'use client'; import { Card } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { FileText, Download, Eye, GitCompare } from 'lucide-react'; import Link from 'next/link'; export function DrawingCard({ drawing }: { drawing: any }) { return (
{/* Thumbnail */}
{/* Info */}

{drawing.drawing_number}

{drawing.title}

{drawing.discipline?.discipline_code}
Sheet: {drawing.sheet_number}
Revision: {drawing.current_revision}
Scale: {drawing.scale || 'N/A'}
Date:{' '} {new Date(drawing.issue_date).toLocaleDateString()}
{drawing.revision_count > 1 && ( )}
); } ``` ### Step 3: Drawing Upload Form ```typescript // File: src/app/(dashboard)/drawings/upload/page.tsx import { DrawingUploadForm } from '@/components/drawings/upload-form'; export default function DrawingUploadPage() { return (

Upload Drawing

); } ``` ```typescript // File: src/components/drawings/upload-form.tsx 'use client'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Card } from '@/components/ui/card'; const drawingSchema = z.object({ drawing_type: z.enum(['CONTRACT', 'SHOP']), drawing_number: z.string().min(1), title: z.string().min(5), discipline_id: z.number(), sheet_number: z.string(), scale: z.string().optional(), file: z.instanceof(File), }); type DrawingFormData = z.infer; export function DrawingUploadForm() { const { register, handleSubmit, setValue, formState: { errors }, } = useForm({ resolver: zodResolver(drawingSchema), }); const onSubmit = async (data: DrawingFormData) => { const formData = new FormData(); Object.entries(data).forEach(([key, value]) => { formData.append(key, value); }); // Upload to API }; return (

Drawing Information

{ const file = e.target.files?.[0]; if (file) setValue('file', file); }} />

Accepted: PDF, DWG (Max 50MB)

); } ``` ### Step 4: Revision History ```typescript // File: src/components/drawings/revision-history.tsx import { Card } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Download } from 'lucide-react'; export function RevisionHistory({ revisions }: { revisions: any[] }) { return (

Revision History

{revisions.map((rev) => (
Rev. {rev.revision_number} {rev.is_current && ( CURRENT )}

{rev.revision_description}

{new Date(rev.revision_date).toLocaleDateString()} by{' '} {rev.revised_by_name}

))}
); } ``` --- ## 📦 Deliverables - [ ] Drawing list with Contract/Shop tabs - [ ] Upload form with file validation - [ ] Drawing cards with preview - [ ] Revision history view - [ ] File download functionality - [ ] Comparison feature (optional) --- ## 🔗 Related Documents - [TASK-BE-008: Drawing Module](./TASK-BE-008-drawing-module.md) --- **Created:** 2025-12-01 **Status:** Ready