Files
egg 9b1d2edc52 feat(portal): implement dynamic drawer/page navigation management
Replace hardcoded sidebar drawer configuration with admin-manageable
dynamic system. Extend page_status.json with drawer definitions and
page assignments, add drawer CRUD API endpoints, render portal sidebar
via Jinja2 loops, and extend /admin/pages UI with drawer management.
Fix multi-worker cache invalidation via mtime-based staleness detection.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 11:34:04 +08:00

2.8 KiB
Raw Permalink Blame History

1. 資料層:擴展 page_status.json 與 page_registry.py

  • 1.1 在 page_registry.py_load() 中加入自動遷移邏輯:當 drawers 欄位不存在時,注入預設三個抽屜並根據 hardcoded 映射表填充每個 page 的 drawer_idorder,然後 _save()
  • 1.2 新增 drawer CRUD 函式:get_all_drawers(), create_drawer(name, order, admin_only), update_drawer(id, ...), delete_drawer(id)
  • 1.3 擴展 set_page_status() 支援 drawer_idorder 參數
  • 1.4 新增 get_navigation_config() 函式:回傳按 drawer order 排序的巢狀結構drawers → pages供 portal route 使用

2. API 層:擴展 admin_routes.py

  • 2.1 新增 GET /admin/api/drawers endpoint回傳所有抽屜sorted by order
  • 2.2 新增 POST /admin/api/drawers endpoint建立新抽屜驗證名稱不重複
  • 2.3 新增 PUT /admin/api/drawers/<id> endpoint更新抽屜名稱/排序/admin_only
  • 2.4 新增 DELETE /admin/api/drawers/<id> endpoint刪除空抽屜有頁面時回傳 409
  • 2.5 擴展現有 PUT /admin/api/pages/<route> endpoint接受 drawer_idorder 欄位(驗證 drawer_id 存在)

3. 模板層portal.html 動態渲染

  • 3.1 修改 app.py 的 portal route呼叫 get_navigation_config() 取得結構化導航資料,傳入 Jinja2 context
  • 3.2 將 portal.html sidebar 區塊lines 356-392改為 {% for drawer in drawers %} 動態渲染,保留 can_view_page() 過濾與 admin_only 判斷
  • 3.3 將 portal.html iframe 區塊lines 394-421改為動態渲染根據配置產生 iframe elements
  • 3.4 確認 portal.jsactivateTab() 與 lazy-load 邏輯在動態 DOM 下正常運作iframe id 命名規則需一致)

4. Admin UI擴展 /admin/pages

  • 4.1 在 admin/pages.html 上方加入「抽屜管理」區塊:抽屜列表 + 新增/改名/刪除/排序控制
  • 4.2 在頁面列表每一列加入 drawer 歸屬下拉選單(含「未分類」選項)和排序輸入
  • 4.3 實作前端 JSdrawer CRUD 操作(呼叫 API → 更新 UI
  • 4.4 實作前端 JS頁面 drawer 指派操作(下拉變更 → PUT API

5. 驗證

  • 5.1 驗證首次啟動遷移:刪除 page_status.json 中的 drawers 欄位,重啟後確認自動產生正確的預設配置
  • 5.2 驗證 portal sidebar 動態渲染:新增/刪除抽屜後刷新 portal確認 sidebar 正確反映
  • 5.3 驗證頁面歸屬變更:改變頁面的 drawer_id 後刷新 portal確認頁面出現在正確的抽屜中
  • 5.4 驗證權限邏輯不變:非 admin 使用者看不到 dev 頁面、看不到 admin_only 抽屜
  • 5.5 驗證安全性:非 admin 使用者無法存取 drawer API endpoints