ADR-005: Application Launcher 導航架構
狀態
已接受 (2025-12-19)
背景 (Context)
問題陳述
原有的靜態側邊欄(Sidebar)導航模式在應用程式模組(Applet)數量增加時面臨多項挑戰:
- 擴展性不足 - 側邊欄垂直空間有限,無法容納大量 Applet
- 角色權限管理複雜 - 各 Applet 需獨立處理權限過濾邏輯
- 分類不清 - 隨著 Applet 增加,用戶難以快速找到目標應用
- 搜尋功能缺失 - 無法透過關鍵字快速定位 Applet
限制條件
- 需保持響應式設計(桌面與移動端)
- 需支援多語言
- 需與現有 RBAC 權限系統整合
- 需最小化對現有路由架構的影響
關鍵利害關係人
- 前端團隊
- UX 設計團隊
- 產品團隊
決策 (Decision)
選擇的方案
採用 Application Launcher 取代靜態側邊欄,設計參考 macOS Launchpad。
實施細節
1. 集中式應用註冊表
建立 src/config/applet-registry.ts 作為所有 Applet 的單一配置來源:
export interface AppletMetadata {
id: string;
name: string; // 顯示名稱
description?: string; // 描述
icon: LucideIcon; // 圖示組件
iconColor: string; // 圖示背景色(DaisyUI 語義化顏色)
category: AppletCategory; // 分類
path: string; // 路由路徑
requiredRole?: RoleName; // 最低所需角色
keywords?: string[]; // 搜尋關鍵字
}
export const APPLET_REGISTRY: AppletMetadata[] = [
// 所有 Applet 配置
];
2. 分類系統
定義標準化的 Applet 分類:
| 分類 | 說明 |
|---|---|
sales-marketing | 銷售與行銷 |
operations | 營運管理 |
finance | 財務會計 |
hr | 人力資源 |
utilities | 工具程式 |
other | 其他 |
3. 輔助函數
提供三個核心輔助函數:
filterAppletsByRole(applets, userRole)- 根據用戶角色過濾可見 AppletgroupAppletsByCategory(applets)- 按分類分組searchApplets(applets, query)- 搜尋名稱、描述、關鍵字
4. UI 組件
Application Launcher 組件位於 src/components/application-launcher/:
- Modal 形式呈現(覆蓋整個畫面)
- 頂部搜尋欄
- 分類標籤過濾
- 網格式 Applet 圖示顯示
- ESC 鍵關閉
5. 觸發入口
透過 Header 中的 Grid 圖示按鈕觸發開啟。
考慮的替代方案 (Alternatives Considered)
方案 A: 繼續使用 Sidebar
描述: 維持原有的靜態側邊欄設計,增加折疊功能。
優點:
- 無需大幅改動現有架構
- 用戶無需學習新操作
缺點:
- 擴展性問題未解決
- 需額外處理權限過濾邏輯
- 移動端體驗不佳
為何未採用: 無法根本解決擴展性問題。
方案 B: Dock 模式
描述: 類似 macOS Dock 的固定工具列,僅顯示最常用的 Applet。
優點:
- 視覺簡潔
- 快速訪問常用應用
缺點:
- 可顯示的 Applet 數量有限
- 需要額外的「更多應用」入口
- 自定義機制增加複雜度
為何未採用: 仍需要輔助機制處理大量 Applet。
方案 C: Command Palette
描述: 類似 VS Code 的命令面板(Ctrl/Cmd + K),透過鍵盤快速導航。
優點:
- 對熟練用戶效率極高
- 不佔用畫面空間
缺點:
- 學習曲線較高
- 新用戶難以發現可用 Applet
- 無視覺化預覽
為何未採用: 目標用戶群不熟悉此操作模式。
決策後果 (Consequences)
正面影響 (Positive)
- ✅ 統一導航入口 - 所有 Applet 透過單一介面訪問
- ✅ 角色感知 - 自動過濾用戶無權訪問的 Applet
- ✅ 可搜尋 - 支援多語言關鍵字搜尋
- ✅ 分類清晰 - 按業務領域分組,便於瀏覽
- ✅ 易於擴展 - 新增 Applet 只需在 Registry 添加配置
負面影響 (Negative)
- ⚠️ 需要額外點擊 - 相比側邊欄需多一步操作打開 Launcher
- 緩解:提供快捷鍵支援(未來)
- ⚠️ 首次使用需適應 - 用戶需了解新的導航方式
- 緩解:提供簡單的引導提示
風險 (Risks)
- 🚨 效能風險(機率: 低,影響: 低)- Applet 數量極大時可能影響渲染效能
- 緩解:使用虛擬化列表(如需要)
需要注意的事項 (Notes)
- 📌 確保所有新增 Applet 都在 Registry 註冊
- 📌 圖示顏色使用 DaisyUI 語義化顏色以保持主題一致性
- 📌 關鍵字應包含中英文以支援雙語搜尋
影響範圍 (Impact)
受影響的系統/模組
src/layouts/header.tsx- 添加 Launcher 觸發按鈕src/layouts/sidebar.tsx- 已刪除src/layouts/sidebar-context.tsx- 已刪除src/data/applets.ts- 已刪除,由src/config/applet-registry.ts取代
需要的變更
- 建立
src/config/applet-registry.ts - 建立
src/components/application-launcher/ - 修改
src/layouts/header.tsx添加觸發入口 - 刪除舊的 Sidebar 相關檔案
遷移策略
- 先建立新架構與舊架構並存
- 測試新導航功能正常
- 移除舊的 Sidebar 組件與相關狀態管理
參考資料 (References)
後續行動 (Follow-up Actions)
- 建立 Applet Registry
- 實作 Application Launcher 組件
- 整合至 Header
- 移除舊 Sidebar
- 添加鍵盤快捷鍵支援 (Cmd/Ctrl + K)
最後更新: 2026-01-03 決策者: Development Team