diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-03-26 00:37:41 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-03-26 00:37:41 +0000 |
| commit | e0dfb55c5457aec489fc084c4567e791b4c65eb1 (patch) | |
| tree | 68543a65d88f5afb3a0202925804103daa91bc6f /lib/roles/table/assign-roles-sheet.tsx | |
3/25 까지의 대표님 작업사항
Diffstat (limited to 'lib/roles/table/assign-roles-sheet.tsx')
| -rw-r--r-- | lib/roles/table/assign-roles-sheet.tsx | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/lib/roles/table/assign-roles-sheet.tsx b/lib/roles/table/assign-roles-sheet.tsx new file mode 100644 index 00000000..11c6a1ff --- /dev/null +++ b/lib/roles/table/assign-roles-sheet.tsx @@ -0,0 +1,87 @@ +"use client" + +import * as React from "react" +import { zodResolver } from "@hookform/resolvers/zod" +import { useForm } from "react-hook-form" +import { toast } from "sonner" + +import { + Sheet, + SheetClose, + SheetContent, + SheetDescription, + SheetFooter, + SheetHeader, + SheetTitle, +} from "@/components/ui/sheet" +import { Button } from "@/components/ui/button" +import { Loader } from "lucide-react" +import { AssginedUserTable } from "../userTable/assignedUsers-table" +import { assignUsersToRole } from "@/lib/users/service" +import { RoleView } from "@/db/schema/users" + +export interface UpdateRoleSheetProps + extends React.ComponentPropsWithRef<typeof Sheet> { + role: RoleView | null + + // ★ 새로 추가: 테이블에 필요한 데이터 로딩 promise + assignedTablePromises: Promise<[ + { data: any[]; pageCount: number } + + ]> +} + +export function AssignRolesSheet({ role, assignedTablePromises, ...props }: UpdateRoleSheetProps) { + + const [isUpdatePending, startUpdateTransition] = React.useTransition() + const [selectedUserIds, setSelectedUserIds] = React.useState<number[]>([]) + + // 2) 자식에서 호출될 콜백 + function handleSelectedChange(ids: number[]) { + setSelectedUserIds(ids) + } + + async function handleAssign() { + startUpdateTransition(async () => { + if (!role) return + const { error } = await assignUsersToRole(role.id, selectedUserIds) + if (error) { + toast.error(error) + return + } + props.onOpenChange?.(false) + toast.success(`Assigned ${selectedUserIds.length} users!`) + }) + } + + return ( + <Sheet {...props}> + <SheetContent className="flex flex-col gap-6 sm:max-w-md"> + <SheetHeader className="text-left"> + <SheetTitle>"{role?.name}"에 유저를 할당하세요</SheetTitle> + <SheetDescription> + 현재 {role?.name}에는 {role?.user_count}명이 할당되어있습니다. 이 롤은 다음과 같습니다.<br/> {role?.description} + </SheetDescription> + </SheetHeader> + + <AssginedUserTable promises={assignedTablePromises} onSelectedChange={handleSelectedChange} /> + + <SheetFooter className="gap-2 pt-2 sm:space-x-0"> + <SheetClose asChild> + <Button type="button" variant="outline"> + Cancel + </Button> + </SheetClose> + + {/* <Button disabled={isUpdatePending} onClick={onSubmitAssignUsers}> */} + <Button disabled={isUpdatePending} onClick={handleAssign}> + {isUpdatePending && ( + <Loader className="mr-2 h-4 w-4 animate-spin" aria-hidden="true" /> + )} + Assign + </Button> + </SheetFooter> + </SheetContent> + </Sheet> + ) +}
\ No newline at end of file |
