diff --git a/docs/superpowers/plans/2026-05-12-frontend-bugfix-quality.md b/docs/superpowers/plans/2026-05-12-frontend-bugfix-quality.md new file mode 100644 index 0000000..9af8e2e --- /dev/null +++ b/docs/superpowers/plans/2026-05-12-frontend-bugfix-quality.md @@ -0,0 +1,1108 @@ +# Frontend Bug Fix + Code Quality Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Fix critical frontend bugs and eliminate code duplication across the Vue 3 web application. + +**Architecture:** Create shared composables (`useDebounce`, `useFileUtils`, `useFilePreview`) to eliminate duplication across 7+ view files. Fix silent error swallowing, loading state management, and add global error handling. Clean up dead code. + +**Tech Stack:** Vue 3.4+, TypeScript, Element Plus, Pinia, Vite + +--- + +## File Structure + +### New files +| File | Responsibility | +|------|---------------| +| `web/frontend/src/composables/useDebounce.ts` | Debounce utility (replaces 4 duplicate copies) | +| `web/frontend/src/composables/useFileUtils.ts` | `statusType`, `statusText`, `fmtTime` (replaces 3 duplicate copies) | +| `web/frontend/src/composables/useFilePreview.ts` | Preview dialog state + logic (replaces 3 duplicate copies) | + +### Modified files +| File | Changes | +|------|---------| +| `web/frontend/src/main.ts` | Add global error handler | +| `web/frontend/src/views/Layout.vue` | Fix fetchUser, dead code, password validation, redundant code | +| `web/frontend/src/views/files/Images.vue` | Use composables, fix error handling + loading | +| `web/frontend/src/views/files/Tables.vue` | Use composables, fix error handling + loading | +| `web/frontend/src/views/files/Orders.vue` | Use composables, fix error handling + loading | +| `web/frontend/src/views/Memory.vue` | Fix error handling, use useDebounce, fix stats fallback | +| `web/frontend/src/views/Barcodes.vue` | Use useDebounce, remove dead import | +| `web/frontend/src/views/Tasks.vue` | Fix error handling, use useDebounce | +| `web/frontend/src/views/Logs.vue` | Fix error handling, use useDebounce | +| `web/frontend/src/views/Sync.vue` | Fix error handling | +| `web/frontend/src/stores/processing.ts` | Remove dead code | +| `web/frontend/src/router/index.ts` | Remove dead code | +| `web/backend/routers/files.py` | Add batch-delete endpoint | + +--- + +## Task 1: Create useDebounce composable + +**Files:** +- Create: `web/frontend/src/composables/useDebounce.ts` + +- [ ] **Step 1: Create composables directory and useDebounce** + +```typescript +// web/frontend/src/composables/useDebounce.ts +import { ref } from 'vue' + +export function useDebounce any>(fn: T, delay = 300) { + const timer = ref | null>(null) + return (...args: Parameters) => { + if (timer.value) clearTimeout(timer.value) + timer.value = setTimeout(() => fn(...args), delay) + } +} +``` + +- [ ] **Step 2: Update Memory.vue — replace inline useDebounce with import** + +In `web/frontend/src/views/Memory.vue`, remove lines 166-174 (the inline `useDebounce` function) and add import at the top of `