From a2c99e3a367740ea81226fe897ea92631dab47be Mon Sep 17 00:00:00 2001 From: sky121113 Date: Fri, 16 Jan 2026 12:05:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=EF=BC=9AUI=20=E5=84=AA?= =?UTF-8?q?=E5=8C=96=E8=88=87=E4=BD=BF=E7=94=A8=E8=80=85=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E5=88=86=E9=85=8D=E6=94=B9=E7=82=BA=E5=96=AE=E9=81=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 33 +++++++++++++ package.json | 3 +- resources/js/Layouts/AuthenticatedLayout.tsx | 2 +- resources/js/Layouts/LandlordLayout.tsx | 2 +- resources/js/Pages/Admin/User/Create.tsx | 49 ++++++++++--------- resources/js/Pages/Admin/User/Edit.tsx | 50 ++++++++++---------- 6 files changed, 85 insertions(+), 54 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8d3b5cb..b23c7e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-label": "^2.1.8", "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-radio-group": "^1.3.8", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-slot": "^1.2.4", @@ -1514,6 +1515,38 @@ } } }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.8.tgz", + "integrity": "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.11", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-roving-focus": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz", diff --git a/package.json b/package.json index c107222..f2803e0 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-label": "^2.1.8", "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-radio-group": "^1.3.8", "@radix-ui/react-scroll-area": "^1.2.10", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-slot": "^1.2.4", @@ -46,4 +47,4 @@ "sonner": "^2.0.7", "tailwind-merge": "^3.4.0" } -} \ No newline at end of file +} diff --git a/resources/js/Layouts/AuthenticatedLayout.tsx b/resources/js/Layouts/AuthenticatedLayout.tsx index 8415661..3a0a6c4 100644 --- a/resources/js/Layouts/AuthenticatedLayout.tsx +++ b/resources/js/Layouts/AuthenticatedLayout.tsx @@ -348,7 +348,7 @@ export default function AuthenticatedLayout({
- {user.name} + {user.name} ({user.username}) {user.role_labels?.[0] || user.roles?.[0] || '一般用戶'} diff --git a/resources/js/Layouts/LandlordLayout.tsx b/resources/js/Layouts/LandlordLayout.tsx index 1e4b11f..a9140eb 100644 --- a/resources/js/Layouts/LandlordLayout.tsx +++ b/resources/js/Layouts/LandlordLayout.tsx @@ -117,7 +117,7 @@ export default function LandlordLayout({ children, title }: LandlordLayoutProps)
- {user.name} + {user.name} ({user.username}) {user.role_labels?.[0] || user.roles?.[0] || '系統管理員'} diff --git a/resources/js/Pages/Admin/User/Create.tsx b/resources/js/Pages/Admin/User/Create.tsx index a2b742b..2d2ffbf 100644 --- a/resources/js/Pages/Admin/User/Create.tsx +++ b/resources/js/Pages/Admin/User/Create.tsx @@ -4,7 +4,7 @@ import { Users, ArrowLeft, Check, Lock, Mail, User } from 'lucide-react'; import { Button } from '@/Components/ui/button'; import { Input } from '@/Components/ui/input'; import { Label } from '@/Components/ui/label'; -import { Checkbox } from '@/Components/ui/checkbox'; +import { RadioGroup, RadioGroupItem } from '@/Components/ui/radio-group'; import { FormEvent } from 'react'; interface Props { @@ -26,14 +26,6 @@ export default function UserCreate({ roles }: Props) { post(route('users.store')); }; - const toggleRole = (roleName: string) => { - if (data.roles.includes(roleName)) { - setData('roles', data.roles.filter(r => r !== roleName)); - } else { - setData('roles', [...data.roles, roleName]); - } - }; - return ( -

角色分配

-
+

角色分配 (單選)

+ setData('roles', [value])} + className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4" + > {Object.entries(roles).map(([roleName, displayName]) => ( -
- + toggleRole(roleName)} + className="text-primary-main border-gray-300" />
- -

+ + {roleName} -

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

{errors.roles}

}
diff --git a/resources/js/Pages/Admin/User/Edit.tsx b/resources/js/Pages/Admin/User/Edit.tsx index b98d018..1a932e8 100644 --- a/resources/js/Pages/Admin/User/Edit.tsx +++ b/resources/js/Pages/Admin/User/Edit.tsx @@ -4,7 +4,7 @@ import { Users, ArrowLeft, Check, Lock, Mail, User, AlertCircle } from 'lucide-r import { Button } from '@/Components/ui/button'; import { Input } from '@/Components/ui/input'; import { Label } from '@/Components/ui/label'; -import { Checkbox } from '@/Components/ui/checkbox'; +import { RadioGroup, RadioGroupItem } from '@/Components/ui/radio-group'; import { FormEvent } from 'react'; interface Role { @@ -41,15 +41,6 @@ export default function UserEdit({ user, roles, currentRoles }: Props) { put(route('users.update', user.id)); }; - const toggleRole = (roleName: string) => { - if (data.roles.includes(roleName)) { - setData('roles', data.roles.filter(r => r !== roleName)); - } else { - setData('roles', [...data.roles, roleName]); - } - }; - - return ( -

角色分配

-
+

角色分配 (單選)

+ setData('roles', [value])} + className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4" + > {roles.map((role) => ( -
- + toggleRole(role.name)} + className="text-primary-main border-gray-300" />
- -

+ + {role.name} -

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

{errors.roles}

}