diff --git a/src/app/(protected)/administrativo/(user)/usuarios/page.tsx b/src/app/(protected)/administrativo/(user)/usuarios/page.tsx index 3c7f0d1..ee14ae5 100644 --- a/src/app/(protected)/administrativo/(user)/usuarios/page.tsx +++ b/src/app/(protected)/administrativo/(user)/usuarios/page.tsx @@ -22,10 +22,23 @@ import { useUserDeleteHook } from '@/packages/administrativo/hooks/User/useUserD // Interface import { UserInterface } from '@/packages/administrativo/interfaces/User/UserInterface'; import { UserSchema } from '@/packages/administrativo/schemas/User/UserSchema'; +import { SituacoesEnum } from '@/shared/enums/SituacoesEnum'; -type FormValues = z.infer; +const initialUser: UserInterface = { + user_id: 0, + name: '', + email: '', + password: '', + team: '', + position: 'string', + status: SituacoesEnum.ATIVO, + user_id_create: null, + user_id_update: null +} export default function UsersPage() { + + const [buttonIsLoading, setButtonIsLoading] = useState(false); // 1. Hooks de dados para Usuário const { usuarios, fetchUsuarios } = useUserIndexHook(); const { saveUser } = useUserSaveHook(); @@ -56,9 +69,12 @@ export default function UsersPage() { // 4. Função para salvar (criar ou editar) const handleSave = useCallback( - async (formData: FormValues) => { + async (formData: UserInterface) => { + console.log("form data", formData) + setButtonIsLoading(true); await saveUser(formData); - handleCloseForm(); // Fecha o modal após salvar + setButtonIsLoading(false); + setIsFormOpen(false); await fetchUsuarios(); // Atualiza a lista de usuários }, [saveUser, fetchUsuarios, handleCloseForm], @@ -80,7 +96,7 @@ export default function UsersPage() { await fetchUsuarios(); // Atualiza a lista setUserToDelete(null); // Limpa o estado handleCancel(); // Fecha o modal de confirmação - }, [userToDelete, removeUser, fetchUsuarios, handleCancel]); + }, [userToDelete, fetchUsuarios, handleCancel]); // 6. Busca inicial dos dados useEffect(() => { @@ -99,7 +115,7 @@ export default function UsersPage() { title={'Usuários'} description={'Gerenciamento de Usuários do Sistema'} buttonText={'Novo Usuário'} - buttonAction={() => handleOpenForm(null)} + buttonAction={(data) => handleOpenForm(data = initialUser)} /> @@ -128,6 +144,7 @@ export default function UsersPage() { data={selectedUser} onClose={handleCloseForm} onSave={handleSave} + buttonIsLoading={buttonIsLoading} /> ); diff --git a/src/packages/administrativo/components/User/UserForm.tsx b/src/packages/administrativo/components/User/UserForm.tsx index b01c797..1eba3ef 100644 --- a/src/packages/administrativo/components/User/UserForm.tsx +++ b/src/packages/administrativo/components/User/UserForm.tsx @@ -28,48 +28,49 @@ import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { SituacoesEnum } from '@/shared/enums/SituacoesEnum'; import { UserSchema } from '../../schemas/User/UserSchema'; +import LoadingButton from '@/shared/components/loadingButton/LoadingButton'; type FormValues = z.infer; interface Props { isOpen: boolean; data: FormValues | null; - onClose: () => void; + onClose: (item: null, isFormStatus: boolean) => void; onSave: (data: FormValues) => void; + buttonIsLoading: boolean; } -export default function UserForm({ isOpen, data, onClose, onSave }: Props) { +export default function UserForm({ isOpen, data, onClose, onSave, buttonIsLoading }: Props) { const form = useForm({ resolver: zodResolver(UserSchema), defaultValues: { + user_id: 0, name: '', email: '', password: '', team: '', + position: 'string', status: SituacoesEnum.ATIVO, + user_id_create: null, + user_id_update: null }, }); // Atualiza o formulário quando recebe dados para edição useEffect(() => { - if (data) { - form.reset(data); - } else { - form.reset({ // Garante que o form limpe ao abrir para criar novo - name: '', - email: '', - password: '', - team: '', - status: SituacoesEnum.ATIVO, - }); - } - }, [data, form, isOpen]); // isOpen garante o reset ao reabrir + if (data) form.reset(data); + }, [data, form]); return ( - !open && onClose()}> + { + if (!open) onClose(null, false); + }} + > - {data ? 'Editar Usuário' : 'Novo Usuário'} + {data?.user_id ? 'Editar Usuário' : 'Novo Usuário'} Gerencie os dados do usuário aqui. @@ -148,14 +149,25 @@ export default function UserForm({ isOpen, data, onClose, onSave }: Props) { {/* Rodapé */} - - + {/* Campo oculto para o ID */} + diff --git a/src/packages/administrativo/data/User/UserIndexData.ts b/src/packages/administrativo/data/User/UserIndexData.ts index d2f6601..625d30a 100644 --- a/src/packages/administrativo/data/User/UserIndexData.ts +++ b/src/packages/administrativo/data/User/UserIndexData.ts @@ -9,7 +9,7 @@ async function executeUserIndexData() { const response = await api.send({ 'method': Methods.GET, - 'endpoint': `administrativo/user` + 'endpoint': `administrativo/user/` }); return response; diff --git a/src/packages/administrativo/data/User/UserSaveData.ts b/src/packages/administrativo/data/User/UserSaveData.ts index 2b6d306..84e1e1e 100644 --- a/src/packages/administrativo/data/User/UserSaveData.ts +++ b/src/packages/administrativo/data/User/UserSaveData.ts @@ -15,6 +15,8 @@ async function executeUserSaveData(data: UserInterface) { 'body': data }); + console.log(response.detail) + return response; } diff --git a/src/packages/administrativo/interfaces/User/UserInterface.ts b/src/packages/administrativo/interfaces/User/UserInterface.ts index 4d4e0d8..11b22ab 100644 --- a/src/packages/administrativo/interfaces/User/UserInterface.ts +++ b/src/packages/administrativo/interfaces/User/UserInterface.ts @@ -1,17 +1,15 @@ import { SituacoesEnum } from "@/shared/enums/SituacoesEnum"; export interface UserInterface { - user_id: number; + user_id?: number; name: string; email: string; - password: string; // Presumo que seja uma string com hash - password_temp: string | null; // Pode ser "N" ou outro valor, ou null - password_temp_confirm: string; // Pode ser "N" - position: string | null; // Pode ser uma string ou null - team: string; // Equipe onde o usuário pertence - status: SituacoesEnum; // A ou I - date_register: string; // Data de registro no formato ISO 8601 - date_update: string | null; // Data de atualização ou null - user_id_create: number | null; // ID do usuário que criou (se aplicável) - user_id_update: number | null; // ID do usuário que fez a última atualização (se aplicável) + password: string; + position: string; + team: string; + status: SituacoesEnum; // 'A' ou 'I' + date_register?: Date; + date_update?: Date | null; + user_id_create: number | null, + user_id_update: number | null } diff --git a/src/packages/administrativo/schemas/User/UserSchema.ts b/src/packages/administrativo/schemas/User/UserSchema.ts index 8ccfeea..df85e24 100644 --- a/src/packages/administrativo/schemas/User/UserSchema.ts +++ b/src/packages/administrativo/schemas/User/UserSchema.ts @@ -1,11 +1,16 @@ -import z from 'zod'; -import { SituacoesEnum } from '@/shared/enums/SituacoesEnum'; +import { z } from "zod"; +import { SituacoesEnum } from "@/shared/enums/SituacoesEnum"; export const UserSchema = z.object({ user_id: z.number().optional(), - name: z.string().min(3, { message: 'O nome deve ter no mínimo 3 caracteres.' }), - email: z.email({ message: 'Por favor, insira um email válido.' }), - password: z.string().optional(), - team: z.string().min(1, { message: 'A equipe é obrigatória.' }), - status: z.enum(SituacoesEnum), -}); \ No newline at end of file + name: z.string().min(3, { message: "O nome deve ter no mínimo 3 caracteres." }), + email: z.email({ message: "Por favor, insira um email válido." }), + password: z.string().min(6, { message: "A senha deve ter pelo menos 6 caracteres." }), + position: z.string({message: "Por favor insira position"}), + team: z.string().min(1, { message: "A equipe é obrigatória." }), + status: z.enum(SituacoesEnum), // 'A' ou 'I' + date_register: z.date().optional(), + date_update: z.date().nullable().optional(), + user_id_create: z.number().nullable(), + user_id_update: z.number().nullable(), +}); diff --git a/src/shared/components/response/response.tsx b/src/shared/components/response/response.tsx index d3bd34e..3d4cbd2 100644 --- a/src/shared/components/response/response.tsx +++ b/src/shared/components/response/response.tsx @@ -8,8 +8,6 @@ import { toast } from 'sonner'; export default function Response() { const { response, clearResponse } = useResponse(); - console.log(response); - useEffect(() => { switch (Number(response?.status)) { diff --git a/src/shared/services/api/Api.ts b/src/shared/services/api/Api.ts index a0ae006..413244d 100644 --- a/src/shared/services/api/Api.ts +++ b/src/shared/services/api/Api.ts @@ -38,8 +38,6 @@ export default class API { const filteredBody = _data.body ? Object.fromEntries(Object.entries(_data.body).filter(([_, v]) => v != null && v !== '')) : null; - - console.log(`${this.ApiSchema.url}${this.ApiSchema.prefix}${this.ApiSchema.endpoint}`) // Realiza a requisição const response = await fetch( `${this.ApiSchema.url}${this.ApiSchema.prefix}${this.ApiSchema.endpoint}`, @@ -48,7 +46,7 @@ export default class API { headers: { Accept: `${this.ApiSchema.contentType}`, 'Content-Type': `${this.ApiSchema.contentType}`, - Authorization: `Bearear ${this.ApiSchema.token}`, + Authorization: `Bearer ${this.ApiSchema.token}`, }, ...(filteredBody && { body: JSON.stringify(filteredBody) }), },