Skip to content

Commit f69ffe2

Browse files
feat: add admin user management (#170)
* feat: add admin user management * feat: change password * feat: modify staff adding flow, fix input behavios in edit-staff * chore: remove console.log in staff actions * fix: catch error in staff editing and deleting flow KNOWN ISSUE: super_admin does not have permission to edit and delete user * feat: add login background * feat: sow from error on login form * feat: add Radix UI alert dialog and checkbox components to dependencies * chore: fix all type lint error --------- Co-authored-by: beambeambeam <supawitmarayat@gmail.com>
1 parent 7dad312 commit f69ffe2

35 files changed

+1355
-45
lines changed

apps/staff/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
"@orpc/client": "^1.8.5",
1616
"@orpc/react": "^1.8.5",
1717
"@orpc/server": "^1.8.5",
18+
"@radix-ui/react-alert-dialog": "^1.1.15",
19+
"@radix-ui/react-checkbox": "^1.3.3",
1820
"@radix-ui/react-dialog": "^1.1.15",
1921
"@radix-ui/react-dropdown-menu": "^2.1.16",
2022
"@radix-ui/react-hover-card": "^1.1.15",
@@ -49,6 +51,7 @@
4951
"react-dom": "19.1.0",
5052
"react-hook-form": "^7.62.0",
5153
"recharts": "^2.15.4",
54+
"sonner": "^2.0.7",
5255
"tailwind-merge": "^3.3.1",
5356
"zod": "^4.0.17"
5457
},
252 KB
Loading

apps/staff/public/file.svg

Lines changed: 0 additions & 1 deletion
This file was deleted.

apps/staff/public/globe.svg

Lines changed: 0 additions & 1 deletion
This file was deleted.

apps/staff/public/next.svg

Lines changed: 0 additions & 1 deletion
This file was deleted.

apps/staff/public/vercel.svg

Lines changed: 0 additions & 1 deletion
This file was deleted.

apps/staff/public/window.svg

Lines changed: 0 additions & 1 deletion
This file was deleted.

apps/staff/src/app/(protected)/_components/user.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {
99
} from "@/components/ui/dropdown-menu"
1010
import { Spinner } from "@/components/ui/spinner"
1111
import { authClient } from "@/lib/auth-client"
12-
import { LogOutIcon } from "lucide-react"
12+
import { KeyIcon, LogOutIcon } from "lucide-react"
13+
import Link from "next/link"
1314
import { useRouter } from "next/navigation"
1415

1516
const { useSession } = authClient
@@ -30,6 +31,12 @@ function UserNavbar() {
3031
<DropdownMenuContent>
3132
<DropdownMenuLabel>{session?.user.email}</DropdownMenuLabel>
3233
<DropdownMenuSeparator />
34+
<DropdownMenuItem asChild>
35+
<Link href="/change-password">
36+
<KeyIcon />
37+
Change Password
38+
</Link>
39+
</DropdownMenuItem>
3340
<DropdownMenuItem
3441
onSelect={async () => {
3542
await authClient.signOut({})
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
"use client"
2+
3+
import { Button } from "@/components/ui/button"
4+
import {
5+
DropdownMenu,
6+
DropdownMenuContent,
7+
DropdownMenuItem,
8+
DropdownMenuTrigger,
9+
} from "@/components/ui/dropdown-menu"
10+
import { authClient } from "@/lib/auth-client"
11+
import { MoreHorizontal } from "lucide-react"
12+
import { createContext } from "react"
13+
14+
import DropdownMenuDeleteStaff from "./dialog/delete-user"
15+
import DropdownMenuEditStaff from "./dialog/edit-user"
16+
17+
interface ActionMenuProps {
18+
user: typeof authClient.$Infer.Session.user | undefined
19+
}
20+
21+
export const UserDataContext = createContext<ActionMenuProps>({
22+
user: undefined,
23+
})
24+
25+
export function ActionMenu(props: ActionMenuProps) {
26+
return (
27+
<UserDataContext.Provider value={props}>
28+
<DropdownMenu>
29+
<DropdownMenuTrigger asChild>
30+
<Button variant="ghost" size="icon">
31+
<MoreHorizontal className="h-4 w-4" />
32+
<span className="sr-only">Open menu</span>
33+
</Button>
34+
</DropdownMenuTrigger>
35+
<DropdownMenuContent align="end">
36+
<DropdownMenuItem onSelect={(e) => e.preventDefault()}>
37+
<DropdownMenuEditStaff />
38+
</DropdownMenuItem>
39+
<DropdownMenuItem variant="destructive" onSelect={(e) => e.preventDefault()}>
40+
<DropdownMenuDeleteStaff />
41+
</DropdownMenuItem>
42+
</DropdownMenuContent>
43+
</DropdownMenu>
44+
</UserDataContext.Provider>
45+
)
46+
}

apps/staff/src/app/(protected)/admin/_components/user-table/columns.tsx

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
import { Badge } from "@/components/ui/badge"
2-
import { Button } from "@/components/ui/button"
3-
import {
4-
DropdownMenu,
5-
DropdownMenuContent,
6-
DropdownMenuItem,
7-
DropdownMenuTrigger,
8-
} from "@/components/ui/dropdown-menu"
92
import { authClient } from "@/lib/auth-client"
103
import { createColumnHelper } from "@tanstack/react-table"
11-
import { MoreHorizontal, CheckCircle, XCircle } from "lucide-react"
4+
import { CheckCircle, XCircle } from "lucide-react"
125
import { Text } from "lucide-react"
136

7+
import { ActionMenu } from "./action-menu"
8+
149
const columnHelper = createColumnHelper<typeof authClient.$Infer.Session.user>()
1510

1611
export const columns = [
@@ -67,20 +62,7 @@ export const columns = [
6762
columnHelper.display({
6863
id: "actions",
6964
header: "Actions",
70-
cell: (_info) => (
71-
<DropdownMenu>
72-
<DropdownMenuTrigger asChild>
73-
<Button variant="ghost" size="icon">
74-
<MoreHorizontal className="h-4 w-4" />
75-
<span className="sr-only">Open menu</span>
76-
</Button>
77-
</DropdownMenuTrigger>
78-
<DropdownMenuContent align="end">
79-
<DropdownMenuItem>Edit</DropdownMenuItem>
80-
<DropdownMenuItem variant="destructive">Delete</DropdownMenuItem>
81-
</DropdownMenuContent>
82-
</DropdownMenu>
83-
),
65+
cell: (info) => <ActionMenu user={info.row.original} />,
8466
size: 32,
8567
}),
8668
]

0 commit comments

Comments
 (0)