diff --git a/components/filters/data-filters.ts b/components/filters/data-filters.ts index 97695d2970..21691b2c5c 100644 --- a/components/filters/data-filters.ts +++ b/components/filters/data-filters.ts @@ -51,3 +51,11 @@ export const filterFindings = [ }, // Add more filter categories as needed ]; + +export const filterUsers = [ + { + key: "is_active", + labelCheckboxGroup: "Status", + values: ["true", "false"], + }, +]; diff --git a/components/users/AddUserModal.tsx b/components/users/AddUserModal.tsx deleted file mode 100644 index e309ea0516..0000000000 --- a/components/users/AddUserModal.tsx +++ /dev/null @@ -1,62 +0,0 @@ -"use client"; - -import { Button, Input } from "@nextui-org/react"; -import { useRef, useState } from "react"; - -import { - Dialog, - DialogContent, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@/components/ui"; - -import { ButtonAddUser } from "./ButtonAddUser"; -import { CustomSelectUser } from "./CustomSelectUser"; - -export const AddUserModal = () => { - const [open, setOpen] = useState(false); - const ref = useRef(null); - - return ( - - - - - - - Add User - -
setOpen(false)}> -
- - -
-
- -
-
-
-
- ); -}; diff --git a/components/users/ButtonAddUser.tsx b/components/users/ButtonAddUser.tsx deleted file mode 100644 index e840dc0157..0000000000 --- a/components/users/ButtonAddUser.tsx +++ /dev/null @@ -1,14 +0,0 @@ -"use client"; - -import { Button } from "@nextui-org/react"; -import React from "react"; -import { useFormStatus } from "react-dom"; - -export const ButtonAddUser = () => { - const { pending } = useFormStatus(); - return ( - - ); -}; diff --git a/components/users/ButtonEditUser.tsx b/components/users/ButtonEditUser.tsx deleted file mode 100644 index a0322b7a2d..0000000000 --- a/components/users/ButtonEditUser.tsx +++ /dev/null @@ -1,14 +0,0 @@ -"use client"; - -import { Button } from "@nextui-org/react"; -import React from "react"; -import { useFormStatus } from "react-dom"; - -export const ButtonEditUser = () => { - const { pending } = useFormStatus(); - return ( - - ); -}; diff --git a/components/users/CustomSelectUser.tsx b/components/users/CustomSelectUser.tsx deleted file mode 100644 index 676fe881e6..0000000000 --- a/components/users/CustomSelectUser.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { - Label, - Select, - SelectContent, - SelectGroup, - SelectItem, - SelectTrigger, - SelectValue, -} from "@/components/ui"; -import { UserProps } from "@/types"; - -interface CustomSelectUserProps { - userData?: UserProps; -} - -export const CustomSelectUser: React.FC = ({ - userData, -}) => { - return ( - <> - - - - ); -}; diff --git a/components/users/EditUserModal.tsx b/components/users/EditUserModal.tsx deleted file mode 100644 index 45d7c86791..0000000000 --- a/components/users/EditUserModal.tsx +++ /dev/null @@ -1,82 +0,0 @@ -"use client"; - -import { Input } from "@nextui-org/react"; -import { useRef } from "react"; - -import { - Dialog, - DialogContent, - DialogHeader, - DialogTitle, -} from "@/components/ui"; -import { UserProps } from "@/types"; - -import { ButtonEditUser } from "./ButtonEditUser"; -import { CustomSelectUser } from "./CustomSelectUser"; - -interface EditUserModalProps { - isOpen: boolean; - setIsOpen: React.Dispatch>; - userData: UserProps; -} - -export const EditUserModal: React.FC = ({ - isOpen, - setIsOpen, - userData, -}) => { - const ref = useRef(null); - - return ( - - - - Edit User - -
setIsOpen(false)}> -
- - - -
-
- -
-
-
-
- ); -}; diff --git a/components/users/forms/delete-form.tsx b/components/users/forms/delete-form.tsx new file mode 100644 index 0000000000..36843534b9 --- /dev/null +++ b/components/users/forms/delete-form.tsx @@ -0,0 +1,97 @@ +"use client"; + +import { zodResolver } from "@hookform/resolvers/zod"; +import React, { Dispatch, SetStateAction } from "react"; +import { useForm } from "react-hook-form"; +import * as z from "zod"; + +import { deleteUser } from "@/actions/users/users"; +import { DeleteIcon } from "@/components/icons"; +import { useToast } from "@/components/ui"; +import { CustomButton } from "@/components/ui/custom"; +import { Form } from "@/components/ui/form"; + +const formSchema = z.object({ + userId: z.string(), +}); + +export const DeleteForm = ({ + userId, + setIsOpen, +}: { + userId: string; + setIsOpen: Dispatch>; +}) => { + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + userId, + }, + }); + const { toast } = useToast(); + const isLoading = form.formState.isSubmitting; + + async function onSubmitClient(values: z.infer) { + const formData = new FormData(); + + Object.entries(values).forEach( + ([key, value]) => value !== undefined && formData.append(key, value), + ); + + console.log(formData); + // client-side validation + const data = await deleteUser(formData); + + if (data?.errors && data.errors.length > 0) { + const error = data.errors[0]; + const errorMessage = `${error.detail}`; + // show error + toast({ + variant: "destructive", + title: "Oops! Something went wrong", + description: errorMessage, + }); + } else { + toast({ + title: "Success!", + description: "The user was removed successfully.", + }); + } + setIsOpen(false); // Close the modal on success + } + + return ( +
+ + +
+ setIsOpen(false)} + isDisabled={isLoading} + > + Cancel + + + } + > + {isLoading ? <>Loading : Delete} + +
+
+ + ); +}; diff --git a/components/users/forms/edit-form.tsx b/components/users/forms/edit-form.tsx new file mode 100644 index 0000000000..ece7080b5a --- /dev/null +++ b/components/users/forms/edit-form.tsx @@ -0,0 +1,155 @@ +"use client"; + +import { zodResolver } from "@hookform/resolvers/zod"; +import { Dispatch, SetStateAction } from "react"; +import { useForm } from "react-hook-form"; +import * as z from "zod"; + +import { updateUser } from "@/actions/users/users"; +import { SaveIcon } from "@/components/icons"; +import { useToast } from "@/components/ui"; +import { CustomButton, CustomInput } from "@/components/ui/custom"; +import { Form } from "@/components/ui/form"; +import { editUserFormSchema } from "@/types"; + +export const EditForm = ({ + userId, + userName, + userEmail, + userCompanyName, + setIsOpen, +}: { + userId: string; + userName?: string; + userEmail?: string; + userCompanyName?: string; + setIsOpen: Dispatch>; +}) => { + const formSchema = editUserFormSchema( + userName ?? "", + userEmail ?? "", + userCompanyName ?? "", + ); + + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + userId: userId, + name: userName, + email: userEmail, + company_name: userCompanyName, + }, + }); + + const { toast } = useToast(); + + const isLoading = form.formState.isSubmitting; + + const onSubmitClient = async (values: z.infer) => { + const formData = new FormData(); + + Object.entries(values).forEach( + ([key, value]) => value !== undefined && formData.append(key, value), + ); + + const data = await updateUser(formData); + + if (data?.errors && data.errors.length > 0) { + const error = data.errors[0]; + const errorMessage = `${error.detail}`; + // show error + toast({ + variant: "destructive", + title: "Oops! Something went wrong", + description: errorMessage, + }); + } else { + toast({ + title: "Success!", + description: "The user was updated successfully.", + }); + setIsOpen(false); // Close the modal on success + } + }; + + return ( +
+ +
+ Current name: {userName} +
+
+ +
+
+ +
+
+ +
+ + +
+ setIsOpen(false)} + isDisabled={isLoading} + > + Cancel + + + } + > + {isLoading ? <>Loading : Save} + +
+
+ + ); +}; diff --git a/components/users/forms/index.ts b/components/users/forms/index.ts new file mode 100644 index 0000000000..a081952ade --- /dev/null +++ b/components/users/forms/index.ts @@ -0,0 +1,2 @@ +export * from "./delete-form"; +export * from "./edit-form"; diff --git a/components/users/index.ts b/components/users/index.ts deleted file mode 100644 index 36f6d8f557..0000000000 --- a/components/users/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export * from "./AddUserModal"; -export * from "./ButtonAddUser"; -export * from "./ButtonEditUser"; -export * from "./CustomSelectUser"; -export * from "./EditUserModal"; -export * from "./table/ColumnsUser"; -export * from "./table/DataTableColumnHeader"; -export * from "./table/DataTablePagination"; -export * from "./table/DataTableUser"; -export * from "./table/SkeletonTableUser"; -export * from "./table/UserActions"; diff --git a/dataUsers.json b/dataUsers.json deleted file mode 100644 index 26428a633a..0000000000 --- a/dataUsers.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "links": { - "first": "http://localhost:8080/api/v1/users?page%5Bnumber%5D=1", - "last": "http://localhost:8080/api/v1/users?page%5Bnumber%5D=1", - "next": null, - "prev": null - }, - "data": [ - { - "id": "001", - "email": "john.doe@example.com", - "name": "John Doe", - "role": "Admin", - "dateAdded": "2024-08-14T10:00:00.000000Z", - "status": "active" - }, - { - "id": "002", - "email": "jane.smith@example.com", - "name": "Jane Smith", - "role": "User", - "dateAdded": "2024-08-15T11:30:00.000000Z", - "status": "inactive" - }, - { - "id": "003", - "email": "will.johnson@example.com", - "name": "Will Johnson", - "role": "Admin", - "dateAdded": "2024-08-16T09:15:00.000000Z", - "status": "active" - }, - { - "id": "004", - "email": "emily.davis@example.com", - "name": "Emily Davis", - "role": "User", - "dateAdded": "2024-08-17T14:00:00.000000Z", - "status": "active" - }, - { - "id": "005", - "email": "michael.brown@example.com", - "name": "Michael Brown", - "role": "User", - "dateAdded": "2024-08-18T08:45:00.000000Z", - "status": "inactive" - }, - { - "id": "006", - "email": "sarah.miller@example.com", - "name": "Sarah Miller", - "role": "Admin", - "dateAdded": "2024-08-19T13:25:00.000000Z", - "status": "active" - }, - { - "id": "007", - "email": "david.wilson@example.com", - "name": "David Wilson", - "role": "User", - "dateAdded": "2024-08-20T10:50:00.000000Z", - "status": "active" - }, - { - "id": "008", - "email": "lisa.moore@example.com", - "name": "Lisa Moore", - "role": "Admin", - "dateAdded": "2024-08-21T07:30:00.000000Z", - "status": "inactive" - }, - { - "id": "009", - "email": "james.taylor@example.com", - "name": "James Taylor", - "role": "User", - "dateAdded": "2024-08-22T12:10:00.000000Z", - "status": "active" - }, - { - "id": "010", - "email": "anna.anderson@example.com", - "name": "Anna Anderson", - "role": "User", - "dateAdded": "2024-08-23T11:00:00.000000Z", - "status": "inactive" - } - ], - "meta": { - "pagination": { - "page": 1, - "pages": 1, - "count": 10 - }, - "version": "v1" - } -}