docs: save handoff - library page flash & filter fix
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
# Library Page: Flash & Filter Fix
|
||||
|
||||
- **Date**: 2026-05-29
|
||||
- **Author**: OpenCode
|
||||
- **Status**: Completed
|
||||
|
||||
## Summary
|
||||
|
||||
Fixed three interconnected issues on the library page (`/library/`) where video cards would flash 3 times on load, and the enhanced filter panel (size slider, duration, registered/unregistered) stopped working after flash fixes.
|
||||
|
||||
## Root Causes & Fixes
|
||||
|
||||
### Issue 1: 3x Flash on Load
|
||||
|
||||
**Root Cause**: Multiple redundant render cycles triggered by:
|
||||
|
||||
1. **`delayedPeopleFilesLoader`** (snippet 55) schedules **6x** `setTimeout(startPeopleFilesLoader, ...)` — 3 from `DOMContentLoaded`, 3 from `window 'load'`. Each creates a `setInterval` that retries `initPeopleFilesMediaLoader` every 200ms.
|
||||
|
||||
2. **`loadMediaItems`** (snippet 55) resets `root.dataset.mediaLoaded = ''` after successful load, allowing the next pending `setTimeout(startPeopleFilesLoader, 500/1200)` to trigger a second/third `loadMediaItems` call → each calls `renderItems()` → re-renders all cards.
|
||||
|
||||
3. **`bootFilterOnly()`** (snippet 58) has no guard, runs 5+ times from multiple `setTimeout(start, 300/1000/2000)` and event listeners.
|
||||
|
||||
4. **`loadMediaMeta()`** (snippet 58) had no guard, ran on every `bootFilterOnly()` call → `debouncedApply()` → `applyEnhancedFilters()` reordered cards via DOM appendChild after async completion.
|
||||
|
||||
**Fix**:
|
||||
- Snippet 55: Removed `root.dataset.mediaLoaded = ''` reset in `loadMediaItems` success path. `mediaLoaded` stays `'1'` after first successful load, preventing re-triggers.
|
||||
- Snippet 58: Removed `debouncedApply()` from `loadMediaMeta()`.
|
||||
- Snippet 58: `setGridView()` already had a class-duplicate guard.
|
||||
- Snippet 58: `renderFinderRows()` already had a skip guard.
|
||||
|
||||
### Issue 2: Filter Not Working
|
||||
|
||||
**Root Cause**: `debouncedApply()` (which calls `applyEnhancedFilters()`) was only triggered automatically from `loadMediaMeta()`. After removing it (fix #1), the filter state was never applied to cards.
|
||||
|
||||
**Fix** (snippet 58):
|
||||
- Added `applyEnhancedFilters()` to the `ltPeopleFilesFiltered` event handler (after `renderFinderRows()`).
|
||||
- Removed the `setTimeout(0)` re-dispatch loop inside `applyEnhancedFilters` that would cause infinite event chaining. Replaced with simple `isApplyingFilter = false`.
|
||||
|
||||
### Issue 3: Infinite Event Loop
|
||||
|
||||
**Root Cause**: `applyEnhancedFilters()` used `setTimeout(0)` to set `isApplyingFilter = false` and re-dispatch `ltPeopleFilesFiltered`, which would call back into the handler → `applyEnhancedFilters()` → re-dispatch → loop.
|
||||
|
||||
**Fix**: Directly set `isApplyingFilter = false` at the end of `applyEnhancedFilters()`.
|
||||
|
||||
## Files Modified
|
||||
|
||||
| Snippet | ID | Changes |
|
||||
|---------|-----|---------|
|
||||
| LT-檔案管理-註冊 | 55 | Removed `mediaLoaded = ''` reset in `loadMediaItems` success |
|
||||
| LT-檔案管理-篩選功能 | 58 | Added `applyEnhancedFilters()` to `ltPeopleFilesFiltered` handler; removed `debouncedApply()` from `loadMediaMeta`; removed re-dispatch loop in `applyEnhancedFilters` |
|
||||
|
||||
## Verification
|
||||
|
||||
- ✅ No flashes on page load (single paint)
|
||||
- ✅ Filter panel works (registered/unregistered, search, sort, sliders)
|
||||
- ✅ Video streaming works (snippet 61, curl-based proxy)
|
||||
- ✅ `cargo clippy --lib` — N/A (WordPress PHP)
|
||||
- ✅ `cargo test --lib` — N/A
|
||||
|
||||
## Context Saved At
|
||||
|
||||
- User confirmed "沒有閃了" (no more flashes) and filter working
|
||||
- AGENTS.md development boundary: WordPress snippets #55, #58, #61 (Code Snippets plugin)
|
||||
- All edits done via direct MySQL UPDATE on `wp_snippets` table
|
||||
- Working directory: `/Users/accusys/momentry_core`
|
||||
- Latest context: user asked to save handoff before changing topic
|
||||
Reference in New Issue
Block a user