本卡屬 FR-132(母卡 CM-2510),A.5 存取管理前端第 3 張,取代作廢的 CM-2538。依賴:T-5.1(預覽元件與端點)、T-3.8(指派 API;jedi
365166ef已 commit,開工前看 CM-2530 狀態)。建議 model:opus。
新做「指派」頁:一筆指派=某個人 × 某個角色 × 期間(永久或起訖日)。表格一筆一行,可以切「依人」或「依角色」分組看,可以用角色篩、預設把已到期的藏起來。按「新增指派」開對話框,選人(可多選)、選角色、選期間,右邊即時顯示「這個人加上這個角色之後,選單會多出哪些頁」。
決策者定:沒有範圍欄、沒有部門篩選——部門指派今天與整公司判定相同(D12 不做),把欄位藏掉;API 的 org_unit_id 參數保留,前端一律送 scope: "tenant"。
~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/api/routing.py:123-127,守門 api/routes/role_assignment_route.py:25-66):列表 POST /role-assignments(iam.user.read,分頁慣例,filters user_uid/role_uid/org_unit_id/active_only)、新增 POST /role-assignment(iam.user.update)、修改 PUT /role-assignment/<id>、刪除 DELETE /role-assignment/<id>(都是 iam.user.update)。api/serializers/role_assignment.py:19-36):user_uid、role_uid、scope(必填,tenant/org)、tenant_id、org_unit_id、starts_at、ends_at(空=立即生效/永不到期)。新增一次一人,多選要逐人送。role_assignment.py:39-55):id、user_uid、user_login_name、user_nickname、role_uid、role_name、scope、starts_at、ends_at、is_default、is_active、created_at。active_only=true 套的是判定同一份「有效」定義(infra/repository/user_role_repo_impl.py:146,178),會把未生效的也藏掉;但畫面要「預設藏已到期、未生效照顯示」。所以不能直接用 active_only 當「顯示已到期」開關。starts_at 在未來=未生效;ends_at 已過=已到期;其餘 is_active=true=有效。is_active=false 但日期在範圍內(角色或帳號被停用)另顯示「停用」,不要硬塞進三態。docs/features/FR-132-2610-access-management/mockup/roles-and-assignments-v3.html 定稿:指派頁(頂部切換「指派」)與新增指派對話框
~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/views/user-manage/UserMTRBACForm.vue:548-578 今天的角色指派區塊(T-5.5 拿掉,可參考欄位)
~/Projects/Billows/Audit-Manager/compliance-manager-fe/src/config/api/api.js 新增 ROLE_ASSIGNMENTS/ROLE_ASSIGNMENT 常數
~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/api/serializers/role_assignment.py:8-12 filters 補一個條件
~/Projects/Jedicogy/module/jedi-python-package/jedi-iam/jedi_iam/infra/repository/user_role_repo_impl.py:169-198 get_assignments_and_pager 加條件
RoleAssignmentFilterRequest 加 hide_expired: bool(ends_at IS NULL OR ends_at >= now()),repo 的列表查詢加對應條件;active_only 不動。列表補 user_nickname 已有,created_user_name 若要顯示照 CLAUDE.md 審計欄位規範在 app service 批次補。/access/assignments):DataTable+rowGroupMode="subheader"(groupRowsBy 依人=user_uid、依角色=role_uid),分組列顯示「陳雅婷 yating.chen · 2 筆」或角色名+人數。欄位:使用者、角色、生效、到期(空顯示「永久」)、狀態(Tag:有效綠、未生效、已到期、停用)、操作(編輯/移除,icon-only 加 tooltip)。工具列:「依人 | 依角色」SelectButton(:unselectable="false")、角色 Dropdown 篩選(「全部角色」+/roles/menu)、「顯示已到期」InputSwitch(預設關=送 hide_expired: true)。表尾「共 N 筆,另有 M 筆已到期未顯示」。支援 query ?role_uid= 預選篩選(T-5.2 角色資料卡會帶過來)。頂部預留「檢查存取」搜尋框的位置,功能由 T-5.4 做。Dialog,先開再載):左欄「指派給誰」MultiSelect(filter、顯示暱稱+帳號+部門,資料走 /users/menu),說明「可以一次選多人,每人各產生一筆指派」;「角色」Dropdown(顯示「稽核員 · 39 項權限」);「期間」SelectButton 永久/指定起訖,選指定時出兩個 Calendar(起不得晚於訖),說明「到期當天結束後自動失效,之後重新登入就看不到相關功能」。右欄「可見選單變化」:只選一人時,用 T-5.1 端點分別算「他目前的角色」與「目前角色+新角色」兩組可見頁,VisibleMenuPreview 的 diff 模式顯示(目前有的灰、新增的綠色加號),說明句「林志豪目前有『一般成員』,加上『稽核員』後新增的以綠色標示」;選多人時右欄改顯示新角色本身的可見頁。按「建立指派」逐人送,全部完成後 toast 一次、刷新表格;部分失敗時列出失敗的人,成功的不回滾。PUT /role-assignment/<id>,body 帶 scope: "tenant"。移除:ConfirmDialog 後 DELETE。POST /role-assignments filters user_uid 撈有效指派的 role_uid,丟給 T-5.1 端點的 role_uids。