From 7dfe46ff9a5c6df9d8477e90b22080c4d7f56013 Mon Sep 17 00:00:00 2001 From: sky121113 Date: Wed, 14 Jan 2026 09:52:56 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=84=AA=E5=8C=96=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E8=80=85=E7=AE=A1=E7=90=86=E4=BB=8B=E9=9D=A2=E8=88=87?= =?UTF-8?q?=E8=A7=92=E8=89=B2=E9=A1=AF=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 Header 中的角色名稱顯示 - 調整使用者表單欄位順序(使用者名稱、姓名並排) - 將角色分配區塊移至基本資料下方 - 修復 email 欄位 null 值警告 - 修復角色選擇無限迴圈錯誤 - 統一角色顯示格式(中文名稱在上,代號在下) --- app/Http/Controllers/Admin/UserController.php | 2 +- resources/js/Layouts/AuthenticatedLayout.tsx | 5 - resources/js/Pages/Admin/User/Create.tsx | 168 ++++++++-------- resources/js/Pages/Admin/User/Edit.tsx | 183 +++++++++--------- resources/js/Pages/Admin/User/Index.tsx | 38 ++-- 5 files changed, 196 insertions(+), 200 deletions(-) diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index e979731..cbd9da6 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -19,7 +19,7 @@ class UserController extends Controller { $perPage = $request->input('per_page', 10); - $users = User::with('roles') + $users = User::with(['roles:id,name,display_name']) ->orderBy('id') ->paginate($perPage) ->withQueryString(); diff --git a/resources/js/Layouts/AuthenticatedLayout.tsx b/resources/js/Layouts/AuthenticatedLayout.tsx index 7c0c9f2..914f552 100644 --- a/resources/js/Layouts/AuthenticatedLayout.tsx +++ b/resources/js/Layouts/AuthenticatedLayout.tsx @@ -352,11 +352,6 @@ export default function AuthenticatedLayout({ {user.username || 'Administrator'} - {user.roles && user.roles.length > 0 && ( - - [{user.roles.join(', ')}] - - )}
diff --git a/resources/js/Pages/Admin/User/Create.tsx b/resources/js/Pages/Admin/User/Create.tsx index 329bca6..a2b742b 100644 --- a/resources/js/Pages/Admin/User/Create.tsx +++ b/resources/js/Pages/Admin/User/Create.tsx @@ -81,11 +81,24 @@ export default function UserCreate({ roles }: Props) {
-
+
{/* Basic Info */} -
-
-

基本資料

+
+

基本資料

+ +
+
+ + setData('username', e.target.value)} + placeholder="請輸入登入帳號" + /> + {errors.username &&

{errors.username}

} +
- -
- - setData('email', e.target.value)} - placeholder="user@example.com (可省略)" - /> - {errors.email &&

{errors.email}

} -
- -
- - setData('username', e.target.value)} - placeholder="請輸入登入帳號" - /> - {errors.username &&

{errors.username}

} -
-
-

安全設定

- -
-
- - setData('password', e.target.value)} - /> - {errors.password &&

{errors.password}

} -
- -
- - setData('password_confirmation', e.target.value)} - /> -
-
+
+ + setData('email', e.target.value)} + placeholder="user@example.com (可省略)" + /> + {errors.email &&

{errors.email}

}
{/* Roles */} -
-
-

角色分配

-
- {Object.entries(roles).map(([roleName, displayName]) => ( -
- toggleRole(roleName)} - /> -
- -

- {roleName} -

-
+
+

角色分配

+
+ {Object.entries(roles).map(([roleName, displayName]) => ( +
+ toggleRole(roleName)} + /> +
+ +

+ {roleName} +

- ))} - {errors.roles &&

{errors.roles}

} +
+ ))} +
+ {errors.roles &&

{errors.roles}

} +
+ + {/* Password */} +
+

安全設定

+ +
+
+ + setData('password', e.target.value)} + /> + {errors.password &&

{errors.password}

} +
+ +
+ + setData('password_confirmation', e.target.value)} + />
diff --git a/resources/js/Pages/Admin/User/Edit.tsx b/resources/js/Pages/Admin/User/Edit.tsx index ee94f53..b98d018 100644 --- a/resources/js/Pages/Admin/User/Edit.tsx +++ b/resources/js/Pages/Admin/User/Edit.tsx @@ -29,7 +29,7 @@ interface Props { export default function UserEdit({ user, roles, currentRoles }: Props) { const { data, setData, put, processing, errors } = useForm({ name: user.name, - email: user.email, + email: user.email || '', username: user.username || '', password: '', password_confirmation: '', @@ -96,11 +96,24 @@ export default function UserEdit({ user, roles, currentRoles }: Props) {
-
+
{/* Basic Info */} -
-
-

基本資料

+
+

基本資料

+ +
+
+ + setData('username', e.target.value)} + placeholder="請輸入登入帳號" + /> + {errors.username &&

{errors.username}

} +
- -
- - setData('email', e.target.value)} - placeholder="user@example.com (可省略)" - /> - {errors.email &&

{errors.email}

} -
- -
- - setData('username', e.target.value)} - placeholder="請輸入登入帳號" - /> - {errors.username &&

{errors.username}

} -
-
-

重設密碼

-
- - 若不修改密碼,請留空以下欄位。 -
- -
-
- - setData('password', e.target.value)} - placeholder="••••••••" - /> - {errors.password &&

{errors.password}

} -
- -
- - setData('password_confirmation', e.target.value)} - placeholder="••••••••" - /> -
-
+
+ + setData('email', e.target.value)} + placeholder="user@example.com (可省略)" + /> + {errors.email &&

{errors.email}

}
{/* Roles */} -
-
-

角色分配

-
- {roles.map((role) => ( -
- toggleRole(role.name)} - // Prevent changing super-admin if user is editing themselves? Or just backend protection. - /> -
- -

- {role.name} -

-
+
+

角色分配

+
+ {roles.map((role) => ( +
+ toggleRole(role.name)} + /> +
+ +

+ {role.name} +

- ))} - {errors.roles &&

{errors.roles}

} +
+ ))} +
+ {errors.roles &&

{errors.roles}

} +
+ + {/* Password Reset */} +
+

重設密碼

+
+ + 若不修改密碼,請留空以下欄位。 +
+ +
+
+ + setData('password', e.target.value)} + placeholder="••••••••" + /> + {errors.password &&

{errors.password}

} +
+ +
+ + setData('password_confirmation', e.target.value)} + placeholder="••••••••" + />
diff --git a/resources/js/Pages/Admin/User/Index.tsx b/resources/js/Pages/Admin/User/Index.tsx index 0370713..ee23ef0 100644 --- a/resources/js/Pages/Admin/User/Index.tsx +++ b/resources/js/Pages/Admin/User/Index.tsx @@ -21,6 +21,7 @@ import { SearchableSelect } from "@/Components/ui/searchable-select"; interface Role { id: number; name: string; + display_name: string; } interface User { @@ -70,16 +71,7 @@ export default function UserIndex({ users, filters }: Props) { ); }; - const translateRoleName = (name: string) => { - const map: Record = { - 'super-admin': '超級管理員', - 'admin': '管理員', - 'warehouse-manager': '倉庫主管', - 'purchaser': '採購人員', - 'viewer': '檢視者', - }; - return map[name] || name; - } + return ( -
+
{user.roles.length > 0 ? ( user.roles.map(role => ( - - {role.name === 'super-admin' && } - {translateRoleName(role.name)} - +
+ {role.name === 'super-admin' && } + + {role.display_name} + +
+ + {role.name} + +
)) ) : ( 未分配角色