# Phase 3: Sentence Builder (Znakopis) - COMPLETED ✅ **Date Completed:** 2026-01-17 ## Summary Phase 3 has been successfully completed. The Sentence Builder (Znakopis) module is now fully functional with drag-and-drop token management, document creation, and multi-page support. ## Deliverables Completed ### Backend Implementation ✅ #### 1. ✅ Document Routes (`/api/documents`) - **GET /api/documents** - List all documents for authenticated user - Returns documents with all pages, sentences, and tokens - Ordered by most recently updated - **GET /api/documents/:id** - Get single document with full details - Includes all nested data (pages → sentences → tokens → terms) - **POST /api/documents** - Create new document - Automatically creates first page - Supports title, description, and visibility settings - **PATCH /api/documents/:id** - Update document metadata - **DELETE /api/documents/:id** - Delete document - **Location:** `packages/backend/src/routes/documents.ts` #### 2. ✅ Sentence & Token Management Routes - **POST /api/:documentId/pages/:pageIndex/sentences** - Create sentence with tokens - Accepts array of tokens with termId, displayText, isPunctuation - Automatically manages sentence indexing - **PATCH /api/sentences/:sentenceId/tokens** - Update sentence tokens - Supports reordering, adding, and removing tokens - Replaces all tokens atomically - **DELETE /api/sentences/:sentenceId** - Delete sentence - **POST /api/:documentId/pages** - Create new page in document - Automatically manages page indexing - **Location:** `packages/backend/src/routes/sentences.ts` #### 3. ✅ Authentication & Authorization - All routes protected with `isAuthenticated` middleware - Document ownership verification on all operations - Proper error handling and status codes ### Frontend Implementation ✅ #### 1. ✅ Sentence Store (Zustand) - Global state management for current sentence tokens - Persistent storage using localStorage - Actions: addToken, removeToken, reorderTokens, clearTokens, setTokens - **Location:** `packages/frontend/src/stores/sentenceStore.ts` #### 2. ✅ Document API Client - Complete API client for document operations - TypeScript interfaces for all data types - Error handling and response parsing - **Location:** `packages/frontend/src/lib/documentApi.ts` #### 3. ✅ Dictionary Integration - "Dodaj" (Add) button now functional - Adds terms to sentence store - Toast notifications with navigation to Znakopis - Persistent across page navigation - **Location:** `packages/frontend/src/pages/Dictionary.tsx` #### 4. ✅ Znakopis Page - Two-column responsive layout - Left: TokenTray (current sentence builder) - Right: DocumentPanel (document management) - Save/Load document functionality - New document creation - **Location:** `packages/frontend/src/pages/Znakopis.tsx` #### 5. ✅ TokenTray Component - Displays current sentence tokens - Drag-and-drop reordering using @dnd-kit - Visual feedback during dragging - Remove individual tokens - Clear all tokens - Empty state with helpful message - **Location:** `packages/frontend/src/components/znakopis/TokenTray.tsx` #### 6. ✅ SortableToken Component - Draggable token chip - Color-coded by word type (matching Dictionary) - Grip handle for dragging - Remove button - Smooth animations - **Location:** `packages/frontend/src/components/znakopis/SortableToken.tsx` #### 7. ✅ DocumentPanel Component - Document selector dropdown - Current document information - Page navigation (previous/next) - Create new page - Sentence list for current page - Delete sentence functionality - **Location:** `packages/frontend/src/components/znakopis/DocumentPanel.tsx` #### 8. ✅ Toast Notifications - Installed and configured Sonner - Success/error/info messages - Action buttons (e.g., "Go to Znakopis") - **Location:** `packages/frontend/src/App.tsx` ## Features Implemented ### Sentence Building - ✅ Add words from Dictionary to sentence - ✅ Drag-and-drop to reorder words - ✅ Remove individual words - ✅ Clear all words - ✅ Visual feedback during interactions - ✅ Persistent state across navigation ### Document Management - ✅ Create new documents - ✅ Save sentences to documents - ✅ Load existing documents - ✅ Multi-page document support - ✅ Page navigation - ✅ Delete sentences - ✅ Document metadata (title, description) ### User Experience - ✅ Responsive layout (mobile, tablet, desktop) - ✅ Toast notifications for all actions - ✅ Loading states - ✅ Empty states with helpful messages - ✅ Error handling - ✅ Smooth animations ## Croatian Localization All UI text is in Croatian: - "Znakopis" - Sentence Builder - "Trenutna rečenica" - Current sentence - "Dodaj" - Add - "Spremi" - Save - "Učitaj dokument" - Load document - "Nova stranica" - New page - "Popis rečenica" - Sentence list - "Očisti sve" - Clear all - Toast messages in Croatian ## Technical Highlights ### Backend - RESTful API design - Proper authentication and authorization - Atomic token updates - Cascading deletes (Prisma) - Efficient queries with nested includes - Error handling with meaningful messages ### Frontend - TypeScript for type safety - Zustand for state management - @dnd-kit for drag-and-drop - Sonner for toast notifications - Persistent state with localStorage - Component composition - Responsive design with Tailwind CSS ## Workflow The complete workflow now works end-to-end: 1. **Dictionary** → User browses and searches for words 2. **Add to Sentence** → User clicks "Dodaj" to add words 3. **Znakopis** → User navigates to Znakopis page 4. **Reorder** → User drags and drops to arrange words 5. **Save** → User clicks "Spremi" to save sentence to document 6. **Load** → User can load previously saved documents 7. **Multi-page** → User can create multiple pages with multiple sentences ## Next Steps (Phase 4) The Sentence Builder is complete and ready for Phase 4: Video Sentence Player **Phase 4 Goals:** 1. Create Video Sentence Player page 2. Implement video playlist generation 3. Synchronize video playback with token highlighting 4. Add playback controls (play, pause, next, prev, speed) 5. Implement smooth video transitions 6. Preload next video for seamless playback ## Commands Reference ```bash # Run development servers pnpm dev # Test API endpoints curl -X GET http://localhost:3000/api/documents -H "Cookie: connect.sid=..." curl -X POST http://localhost:3000/api/documents -H "Content-Type: application/json" -d '{"title":"Test Document"}' # Access Znakopis http://localhost:5174/znakopis ``` ## Testing Checklist - ✅ Add words from Dictionary - ✅ Words appear in Znakopis TokenTray - ✅ Drag and drop to reorder words - ✅ Remove individual words - ✅ Clear all words - ✅ Save sentence to new document - ✅ Load existing document - ✅ Navigate between pages - ✅ Create new page - ✅ Delete sentence - ✅ Toast notifications appear - ✅ State persists across page navigation - ✅ Responsive on mobile/tablet/desktop --- **Status:** ✅ COMPLETE **Next Phase:** Phase 4 - Video Sentence Player