[VDU-9] fix(CREATE): correção do create porém agora o update que não está funcionando

This commit is contained in:
= 2025-10-16 10:47:35 -03:00
parent a1d08b9be0
commit cefd6fd561
8 changed files with 78 additions and 48 deletions

View file

@ -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<typeof UserSchema>;
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)}
/>
<Card>
@ -128,6 +144,7 @@ export default function UsersPage() {
data={selectedUser}
onClose={handleCloseForm}
onSave={handleSave}
buttonIsLoading={buttonIsLoading}
/>
</div>
);

View file

@ -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<typeof UserSchema>;
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<FormValues>({
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 (
<Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>
<Dialog
open={isOpen}
onOpenChange={(open) => {
if (!open) onClose(null, false);
}}
>
<DialogContent className="sm:max-w-[425px]">
<DialogHeader>
<DialogTitle>{data ? 'Editar Usuário' : 'Novo Usuário'}</DialogTitle>
<DialogTitle>{data?.user_id ? 'Editar Usuário' : 'Novo Usuário'}</DialogTitle>
<DialogDescription>Gerencie os dados do usuário aqui.</DialogDescription>
</DialogHeader>
@ -148,14 +149,25 @@ export default function UserForm({ isOpen, data, onClose, onSave }: Props) {
{/* Rodapé */}
<DialogFooter className="mt-4">
<DialogClose asChild>
<Button variant="outline" type="button" onClick={onClose}>
<Button
variant="outline"
type="button"
onClick={() => onClose(null, false)}
className="cursor-pointer"
>
Cancelar
</Button>
</DialogClose>
<Button type="submit">Salvar</Button>
<LoadingButton
text={data?.user_id ? 'Salvar' : 'Cadastrar'}
textLoading="Aguarde..."
type="submit"
loading={buttonIsLoading}
/>
</DialogFooter>
{/* Campo oculto para o ID */}
<input type="hidden" {...form.register('user_id')} />
<input type="hidden" {...form.register('position')} />
</form>
</Form>
</DialogContent>

View file

@ -9,7 +9,7 @@ async function executeUserIndexData() {
const response = await api.send({
'method': Methods.GET,
'endpoint': `administrativo/user`
'endpoint': `administrativo/user/`
});
return response;

View file

@ -15,6 +15,8 @@ async function executeUserSaveData(data: UserInterface) {
'body': data
});
console.log(response.detail)
return response;
}

View file

@ -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
}

View file

@ -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),
});
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(),
});

View file

@ -8,8 +8,6 @@ import { toast } from 'sonner';
export default function Response() {
const { response, clearResponse } = useResponse();
console.log(response);
useEffect(() => {
switch (Number(response?.status)) {

View file

@ -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) }),
},