[VDU-9] fix(CREATE): correção do create porém agora o update que não está funcionando
This commit is contained in:
parent
a1d08b9be0
commit
cefd6fd561
8 changed files with 78 additions and 48 deletions
|
|
@ -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>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ async function executeUserIndexData() {
|
|||
|
||||
const response = await api.send({
|
||||
'method': Methods.GET,
|
||||
'endpoint': `administrativo/user`
|
||||
'endpoint': `administrativo/user/`
|
||||
});
|
||||
|
||||
return response;
|
||||
|
|
|
|||
|
|
@ -15,6 +15,8 @@ async function executeUserSaveData(data: UserInterface) {
|
|||
'body': data
|
||||
});
|
||||
|
||||
console.log(response.detail)
|
||||
|
||||
return response;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
});
|
||||
|
|
|
|||
|
|
@ -8,8 +8,6 @@ import { toast } from 'sonner';
|
|||
export default function Response() {
|
||||
const { response, clearResponse } = useResponse();
|
||||
|
||||
console.log(response);
|
||||
|
||||
useEffect(() => {
|
||||
switch (Number(response?.status)) {
|
||||
|
||||
|
|
|
|||
|
|
@ -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) }),
|
||||
},
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue