From e82d2d70664b098c6fc4c0d1531ac9180d81f473 Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Fri, 20 Mar 2026 22:57:58 -0400 Subject: [PATCH] docs: remove obsolete implementation plans Remove implementation plans that have been completed and are no longer needed: - ALPINE_COMPLETION_GUIDE.md (95% complete, only docs updates needed) - BOOK_PICKER_IMPL.md (90% obsolete, better approach implemented) - SSR_FIRST_ALPINE_GUIDE.md (100% compliant with current implementation) These plans served their purpose during implementation. Their content lives on in git history for reference. Keeping the repository clean of outdated planning docs. --- ALPINE_COMPLETION_GUIDE.md | 2374 ------------------------------------ BOOK_PICKER_IMPL.md | 211 ---- SSR_FIRST_ALPINE_GUIDE.md | 627 ---------- 3 files changed, 3212 deletions(-) delete mode 100644 ALPINE_COMPLETION_GUIDE.md delete mode 100644 BOOK_PICKER_IMPL.md delete mode 100644 SSR_FIRST_ALPINE_GUIDE.md diff --git a/ALPINE_COMPLETION_GUIDE.md b/ALPINE_COMPLETION_GUIDE.md deleted file mode 100644 index f39bb92..0000000 --- a/ALPINE_COMPLETION_GUIDE.md +++ /dev/null @@ -1,2374 +0,0 @@ -# Alpine.js Integration Completion Guide - -## Executive Summary - -This guide completes the migration from **hybrid onclick/@click with manual DOM manipulation** to **full reactive Alpine.js** with state-driven UI, while **maintaining SSR-first architecture**. - -**Current State**: Hybrid approach with 121 manual DOM manipulations -**Target State**: Full reactive Alpine.js with zero manual DOM manipulation -**Estimated Time**: 10-12 hours -**Impact**: Cleaner code, better maintainability, smoother UX - -**References:** - -- **`SSR_FIRST_ALPINE_GUIDE.md`** - SSR-first architecture principles (READ THIS FIRST) - ---- - -## Table of Contents - -1. [Current State Analysis](#current-state-analysis) -2. [Migration Strategy](#migration-strategy) -3. [Phase 0: Prerequisites (Dead Export Removal)](#phase-0-prerequisites-dead-export-removal) -4. [Phase 1: Header Template (Reference Implementation)](#phase-1-header-template-reference-implementation) -5. [Phase 2: Modal Templates]((#phase-2-modal-templates) -6. [Phase 3: Other Templates (DOMContentLoaded Cleanup)](#phase-3-other-templates-domcontentloaded-cleanup) -7. [Phase 4: Verification & Testing]((#phase-4-verification--testing) -8. [Phase 5: Cleanup]((#phase-5-cleanup) -9. [Troubleshooting](#troubleshooting) -10. [Success Criteria](#success-criteria) - ---- - -## Current State Analysis - -## Current State Analysis - -### What's Already Done ✅ - -- All `onclick` handlers converted to `@click` directives -- Functions registered with `Alpine.global()` in TypeScript -- 18 templates have `x-data="namespace"` attributes -- HTMX integration working for forms -- SSR-first architecture documented in `SSR_FIRST_ALPINE_GUIDE.md` - -### Documentation Structure - -**Two complementary guides:** - -1. **`SSR_FIRST_ALPINE_GUIDE.md`** - **READ THIS FIRST** - - SSR-first architecture principles - - Page type classifications (Type 1: 80% SSR, Type 2: SSR+Interactive, Type 3: 80% JS) - - When to fetch data vs when to use SSR data - - Server-side token injection - - **Prerequisite for understanding this guide** - -2. **`ALPINE_COMPLETION_GUIDE.md`** - **This document** - - Full reactive Alpine.js migration path - - Dead export removal (Phase 0) - - DOMContentLoaded cleanup (Phase 3) - - Template function call fixes - - Complete code examples and patterns - - **Long-term architecture goal** - -### What's Still Missing ❌ - -**Problem**: 121 instances of manual DOM manipulation in TypeScript files - -**Example from header.ts:7-17:** - -```typescript -const toggleThemeDropdown = (): void => { - const dropdown = document.getElementById("theme-dropdown"); - if (dropdown) { - dropdown.classList.toggle("hidden"); // ← Manual DOM manipulation! - const userMenu = document.getElementById("user-menu"); - if (userMenu && !dropdown.classList.contains("hidden")) { - userMenu.classList.add("hidden"); // ← Manual DOM manipulation! - } - } -}; -``` - -**Templates still using:** - -- `id="theme-dropdown"` + `class="hidden"` for show/hide -- No reactive state variables -- No `x-show` directives -- No `@click.outside` for closing dropdowns -- No `x-transition` for animations - -### What Needs Migration - -**8 stateful templates** (modals, dropdowns, wizards): - -1. ✅ **header.templ** - Theme dropdown + user menu (P0 - used in 17 places) -2. 🔄 **collection_modal.templ** - Create/edit collection modal (needs work - see 2.1) -3. ✅ **collections.templ** - Add books modal + navigation -4. ✅ **conflicts.templ** - Conflict resolution modal -5. ✅ **queue.templ** - Queue actions modal -6. ✅ **admin.templ** - Scan progress modal -7. ✅ **devices.templ** - Device token modal -8. ✅ **profile_modal.templ** - Profile edit modal - -**Note**: Simple buttons with `@click` handlers are fine - no migration needed. - ---- - -## Migration Strategy - -### The Pattern - -Every migration follows the same 5-step pattern: - -1. **Prerequisites** (Phase 0): Remove dead exports that cause console errors -2. **Template Changes**: Add `x-data` state, replace `class="hidden"` with `x-show`, add transitions -3. **TypeScript Cleanup**: Remove manual DOM manipulation functions -4. **Alpine Registration**: Remove deleted functions from `Alpine.global()` or `Alpine.data()` -5. **Testing**: Verify functionality, build, check for regressions - -### Key Principles - -**SSR-First (see `SSR_FIRST_ALPINE_GUIDE.md`):** - -- ❌ **NEVER fetch data in x-init** if data is already SSR'd -- ✅ x-init ONLY for setup (event listeners, modals) -- ✅ Data fetch ONLY after user actions (create/delete/update) -- ✅ State lives in template (`x-data`), not in TypeScript - -**Alpine.js Best Practices:** - -- **State lives in template** (`x-data="{ open: false }"`) -- **UI updates automatically** (`x-show="open"`) -- **No manual DOM manipulation** in TypeScript -- **Pure business logic only** in TypeScript functions - ---- - -## Phase 0: Prerequisites (Dead Export Removal) - -**Before starting full migration**, fix immediate console errors caused by dead Alpine.js exports. - -### Why This Phase? - -When functions are deleted from TypeScript but remain in `Alpine.data()` exports, the browser console shows errors like: - -- `addbooksToAdd is not defined` -- `removebooksToAdd is not defined` -- `showAllIcons is not defined` - -**Important**: For the Add Books functionality, these functions should be RESTORED with the proper Alpine/HTMX pattern (see Section 2.2), not just removed. The backend API still exists and should work. - -For other dead exports, they can be removed from Alpine.data if truly not needed. - ---- - -### Step 0.1: Verify Current State - -Before starting, check the current errors: - -```bash -cd /home/nymusicman/Code/bookhoard -npm run build:ts - -# Should see errors about: -# - "addbooksToAdd is not defined" -# - "removebooksToAdd is not defined" -# - "toggleBookSelection is not defined" -# - etc. -``` - ---- - -### Step 0.2: Fix collections.ts Alpine.data Export - -**File:** `web/src/collections.ts` - -**Problem:** Alpine.data exports functions that were deleted in commit 93710a1. - -#### Step 0.2.1: Read Current Alpine.data Export - -Check what's currently exported: - -```bash -# Check what's currently exported -tail -50 web/src/collections.ts | grep -A25 "Alpine.data" -``` - -You'll see something like: - -```typescript -Alpine.data("collections", () => ({ - addbooksToAdd, // ❌ Does NOT exist - deleted - backToCollections, - closeCollectionModal, - createRule, - deleteRule, - filterCollectionBooks, - filterIcons, - hideAddBooksModal, - initCollectionDetail, // ❌ Does NOT exist - deleted - initColorSelection, // ❌ Does NOT exist - deleted - initIconSelection, // ❌ Does NOT exist - deleted - loadCollectionRules, - loadCollections, - navigateToCollection, - populateIconGrid, - removeBook, - removebooksToAdd, // ❌ Does NOT exist - deleted - searchBooksForCollections, - selectColor, - selectIcon, - showAddBooksModal, - showAllIcons, // ❌ Does NOT exist - deleted - setupHTMXAuth, - testRule, - toggleBookForRemoval, // ❌ Does NOT exist - deleted - toggleBookSelection, // ❌ Does NOT exist - deleted - updateSelectedCount, -})); -``` - -#### Step 0.2.2: Read Current Export Statement - -Check the export statement at the end of the file: - -```bash -# Check the export statement at the end of the file -grep -A30 "^export {" web/src/collections.ts -``` - -You'll see similar dead exports. - -#### Step 0.2.3: Verify Which Functions Actually Exist - -Search for function definitions: - -```bash -# Search for function definitions -grep -n "^function\|^async function" web/src/collections.ts -``` - -Expected output (actual existing functions): - -- `backToCollections` ✓ -- `closeCollectionModal` ✓ -- `createRule` ✓ -- `deleteRule` ✓ -- `filterCollectionBooks` ✓ -- `filterIcons` ✓ -- `hideAddBooksModal` ✓ -- `loadCollectionRules` ✓ -- `loadCollections` ✓ -- `navigateToCollection` ✓ -- `populateIconGrid` ✓ -- `removeBook` ✓ -- `searchBooksForCollections` ✓ -- `selectColor` ✓ -- `selectIcon` ✓ -- `showAddBooksModal` ✓ -- `setupHTMXAuth` ✓ -- `testRule` ✓ -- `updateSelectedCount` ✓ - -#### Step 0.2.4: Update the Export Statement - -**Line ~407:** Change the `export` statement to only include existing functions: - -```typescript -export { - backToCollections, - closeCollectionModal, - createRule, - deleteRule, - filterCollectionBooks, - filterIcons, - hideAddBooksModal, - loadCollectionRules, - loadCollections, - navigateToCollection, - populateIconGrid, - removeBook, - searchBooksForCollections, - selectColor, - selectIcon, - showAddBooksModal, - setupHTMXAuth, - testRule, - updateSelectedCount, -}; -``` - -#### Step 0.2.5: Update Alpine.data Registration - -**Line ~424:** Update Alpine.data to match the export: - -```typescript -Alpine.data("collections", () => ({ - backToCollections, - closeCollectionModal, - createRule, - deleteRule, - filterCollectionBooks, - filterIcons, - hideAddBooksModal, - loadCollectionRules, - loadCollections, - navigateToCollection, - populateIconGrid, - removeBook, - searchBooksForCollections, - selectColor, - selectIcon, - showAddBooksModal, - setupHTMXAuth, - testRule, - updateSelectedCount, -})); -``` - -#### Step 0.2.6: Verify the Fix - -```bash -# Build TypeScript -npm run build:ts - -# Should now succeed with 0 errors -``` - ---- - -### Step 0.3: Fix Template Function Calls - -**File:** `templates/collections.templ` - -**Problem:** Template calls functions that no longer exist. - -#### Step 0.3.1: Restore Add Books Functionality (Not Remove!) - -**IMPORTANT**: These functions were accidentally deleted in commit 93710a1. The buttons were disabled but the backend API still exists. Instead of removing these, we need to RESTORE them with the proper Alpine/HTMX pattern. - -**See Section 2.2 for complete instructions on restoring Add Books functionality.** - -The new pattern uses: -1. Alpine.store for modal visibility -2. HTMX for book search (server-side) -3. HTMX form submission for adding books -4. On success: close modal + refresh books list - -**Do NOT disable these buttons - restore the functionality!** - -#### Step 0.3.2: Regenerate Templates - -```bash -# Generate Go template files -templ generate - -# Should see: Complete [updates=0 duration=~40ms] -``` - ---- - -### Step 0.4: Check Other Files for Similar Issues - -Based on commit 93710a1 and current errors: - -- ✅ `web/src/collections.ts` - Fixed above -- Check other files for similar issues as you encounter them - -**General process for any file:** - -1. **Identify dead exports:** - -```bash -# Check what's exported -grep -A25 "Alpine.data" web/src/FILENAME.ts - -# Find actual function definitions -grep -n "^function\|^async function" web/src/FILENAME.ts -``` - -1. **Update export statement** to remove dead functions - -2. **Update Alpine.data registration** to remove dead functions - -3. **Update templates** to remove dead function calls - -4. **Verify:** `npm run build:ts` and `templ generate` - ---- - -## Phase 1: Header Template (Reference Implementation) - -**Priority**: P0 (highest - used in 17 templates) -**Time**: 2-3 hours -**Complexity**: High (2 dropdowns + theme switching + click-outside) - -### Step 1.1: Update header.templ - -**Location**: `templates/header.templ` -**Lines to modify**: 46-191 - -**Current Structure (lines 46-53):** - -```templ -
- -