diff --git a/src/app/(protected)/(cadastros)/cadastros/(g_tb_bairro)/bairro/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(g_tb_bairro)/bairro/page.tsx index 841f229..4cf949b 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(g_tb_bairro)/bairro/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(g_tb_bairro)/bairro/page.tsx @@ -3,6 +3,7 @@ import { useEffect, useState, useCallback } from "react"; import { Card, CardContent } from "@/components/ui/card"; import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog"; +import { useResponse } from "@/app/_response/ResponseContext" import Header from "@/app/_components/structure/Header"; import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog"; @@ -15,15 +16,22 @@ import { useGTBBairroSaveHook } from "../../_hooks/g_tb_bairro/useGTBBairroSaveH import { useGTBBairroRemoveHook } from "../../_hooks/g_tb_bairro/useGTBBairroRemoveHook"; import { GTBBairroInterface } from "../../_interfaces/GTBBairroInterface"; +import { SituacoesEnum } from "@/enums/SituacoesEnum"; const initialBairro: GTBBairroInterface = { sistema_id: null, tb_bairro_id: 0, descricao: '', - situacao: 'A' + situacao: SituacoesEnum.A } -export default function TTBAndamentoServico() { +export default function GTBBairroPage() { + + // Controle de exibição de respostas + const { setResponse } = useResponse(); + + // Controle de estado do botão + const [buttonIsLoading, setButtonIsLoading] = useState(false); // Hooks para leitura e salvamento const { gTBBairro, fetchGTBBairro } = useGTBBairroReadHook(); @@ -39,7 +47,6 @@ export default function TTBAndamentoServico() { const { isOpen: isConfirmOpen, openDialog: openConfirmDialog, - handleConfirm, handleCancel, } = useConfirmDialog(); @@ -55,8 +62,19 @@ export default function TTBAndamentoServico() { }, []); const handleSave = useCallback(async (data: GTBBairroInterface) => { + + // Coloca o botão em estado de loading + setButtonIsLoading(true); + + // Realiza o procedimento desejado await saveGTBBairro(data); - fetchGTBBairro(); // Atualiza a tabela após salvar + + // Remove o botão do estado de loading + setButtonIsLoading(false); + + // Atualiza a tabela após salvar + fetchGTBBairro(); + }, [saveGTBBairro, fetchGTBBairro]); // Ações de deleção @@ -66,14 +84,29 @@ export default function TTBAndamentoServico() { }, [openConfirmDialog]); const handleDelete = useCallback(async () => { - if (!itemToDelete) return; + // Verifica se existe item para remoção + if (!itemToDelete) { + + // Define os dados da resposta visual + setResponse({ + status: 400, + message: 'Não foi informado um registro para exclusão' + }); + return; + }; + + // Executa o hook de remoção await removeGTBBairro(itemToDelete); - await fetchGTBBairro(); // Atualiza a tabela após remover + // Atualiza a tabela após remover + await fetchGTBBairro(); + + // Limpa o item para remoção setItemToDelete(null) handleCancel(); + }, [itemToDelete, fetchGTBBairro, handleCancel]); // Efeito para carregar os dados na montagem do componente @@ -81,7 +114,10 @@ export default function TTBAndamentoServico() { fetchGTBBairro(); }, []); - if (!gTBBairro) { + /** + * Tela de loading enquanto carrega os dados + */ + if (gTBBairro.length == 0) { return ; } @@ -124,6 +160,7 @@ export default function TTBAndamentoServico() { data={selectedBairro} onClose={handleCloseForm} onSave={handleSave} + buttonIsLoading={buttonIsLoading} /> ); diff --git a/src/app/(protected)/(cadastros)/cadastros/(t_tb_andamentoservico)/andamentos/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(t_tb_andamentoservico)/andamentos/page.tsx index eb747f7..f33c575 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(t_tb_andamentoservico)/andamentos/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(t_tb_andamentoservico)/andamentos/page.tsx @@ -18,6 +18,7 @@ import { useTTBAndamentoServicoDeleteHook } from "../../_hooks/t_tb_andamentoser import Header from "@/app/_components/structure/Header"; export default function TTBAndamentoServico() { + // Hooks para leitura e salvamento const { tTBAndamentosServicos, fetchTTBAndamentoServico } = useTTBAndamentoServicoReadHook(); const { saveTTBAndamentoServico } = useTTBAndamentoServicoSaveHook(); diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_bairro/GTBBairroForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_bairro/GTBBairroForm.tsx index 3cb3cd2..4e465b4 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_bairro/GTBBairroForm.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_bairro/GTBBairroForm.tsx @@ -1,7 +1,7 @@ 'use client'; import z from "zod"; -import { useEffect } from "react"; +import { useEffect, useState } from "react"; import { useForm, Controller } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; @@ -28,7 +28,8 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { GTBBairroSchema } from "../../_schemas/GTBBairroSchema"; -import { GTBBairroInterface } from "../../_interfaces/GTBBairroInterface"; +import LoadingButton from "@/app/_components/loadingButton/LoadingButton"; +import { SituacoesEnum } from "@/enums/SituacoesEnum"; type FormValues = z.infer; @@ -37,9 +38,11 @@ interface GTBBairroFormProps { data: FormValues | null; onClose: (item: null, isFormStatus: boolean) => void; onSave: (data: FormValues) => void; + buttonIsLoading: boolean; } -export default function GTBBairroForm({ isOpen, data, onClose, onSave }: GTBBairroFormProps) { +export default function GTBBairroForm({ isOpen, data, onClose, onSave, buttonIsLoading }: GTBBairroFormProps) { + // Inicializa o react-hook-form com o schema Zod const form = useForm({ resolver: zodResolver(GTBBairroSchema), @@ -47,7 +50,7 @@ export default function GTBBairroForm({ isOpen, data, onClose, onSave }: GTBBair sistema_id: null, tb_bairro_id: 0, descricao: "", - situacao: "A", + situacao: SituacoesEnum.A, }, }); @@ -113,14 +116,14 @@ export default function GTBBairroForm({ isOpen, data, onClose, onSave }: GTBBair Cancelar - + {/* Botão de loading */} + {/* Campos ocultos */} + diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/GTBBairro/GTBBairroIndexData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/GTBBairro/GTBBairroIndexData.ts index 928f9ff..5506807 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/GTBBairro/GTBBairroIndexData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/GTBBairro/GTBBairroIndexData.ts @@ -1,25 +1,15 @@ import API from "@/services/api/Api"; import { Methods } from "@/services/api/enums/ApiMethodEnum"; -import BairroMockDeDados from "./mockBairro"; - -const useMock = false export default async function GTBBairroIndexData() { - if (useMock) { - console.log(BairroMockDeDados()) - return await BairroMockDeDados(); - } const api = new API(); - try { - const dados = await api.send({ - method: Methods.GET, - endpoint: `administrativo/g_tb_bairro/` - }); - return dados - } catch (error) { - console.log(error) - return error - } + + const dados = await api.send({ + method: Methods.GET, + endpoint: `administrativo/g_tb_bairro/` + }); + + return dados } \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_bairro/useGTBBairroReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_bairro/useGTBBairroReadHook.ts index 2b78ab8..2d4ebac 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_bairro/useGTBBairroReadHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_bairro/useGTBBairroReadHook.ts @@ -1,24 +1,27 @@ +'use client' + import { useResponse } from "@/app/_response/ResponseContext" -import { useState } from "react"; +import { use, useState } from "react"; import { GTBBairroInterface } from "../../_interfaces/GTBBairroInterface"; import GTBBairroIndexService from "../../_services/g_tb_bairro/GTBBairroIndexService"; export const useGTBBairroReadHook = () => { const { setResponse } = useResponse(); + + // Controle dos dados obtidos via API const [gTBBairro, setGTBBairro] = useState([]); const fetchGTBBairro = async () => { - try { - const response = await GTBBairroIndexService(); + // Realiza a requisição para a api + const response = await GTBBairroIndexService(); - setGTBBairro(response.data); + // Armazena os dados da resposta + setGTBBairro(response.data); - setResponse(response); - } catch (error) { - console.log(error) - } + // Envia os dados da resposta para ser tratado + setResponse(response); } diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_bairro/useGTBBairroSaveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_bairro/useGTBBairroSaveHook.ts index 8873c44..ecd5d3f 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_bairro/useGTBBairroSaveHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_bairro/useGTBBairroSaveHook.ts @@ -7,6 +7,7 @@ export const useGTBBairroSaveHook = () => { const { setResponse } = useResponse(); const [gTBBairro, setGTBBairro] = useState(null); + // controla se o formulário está aberto ou fechado const [isOpen, setIsOpen] = useState(false); diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GTBBairroInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GTBBairroInterface.ts index e3a8c68..10f70c9 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GTBBairroInterface.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GTBBairroInterface.ts @@ -1,6 +1,8 @@ +import { SituacoesEnum } from "@/enums/SituacoesEnum"; + export interface GTBBairroInterface { sistema_id: number | null; tb_bairro_id: number; descricao: string; - situacao: 'A' | 'I'; + situacao: SituacoesEnum; } \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_schemas/GTBBairroSchema.ts b/src/app/(protected)/(cadastros)/cadastros/_schemas/GTBBairroSchema.ts index 50fcf25..c4a67d5 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_schemas/GTBBairroSchema.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_schemas/GTBBairroSchema.ts @@ -1,8 +1,9 @@ +import { SituacoesEnum } from '@/enums/SituacoesEnum'; import { z } from 'zod'; export const GTBBairroSchema = z.object({ - sistema_id: z.number().nullable(), tb_bairro_id: z.number(), - descricao: z.string(), - situacao: z.enum(['A', 'I']), + sistema_id: z.number().nullable(), + descricao: z.string().min(1, 'O campo deve ser preenchido'), + situacao: z.enum(SituacoesEnum), }); \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_bairro/GTBBairroIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_bairro/GTBBairroIndexService.ts index fbc3e01..a58e999 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_bairro/GTBBairroIndexService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_bairro/GTBBairroIndexService.ts @@ -2,11 +2,7 @@ import GTBBairroIndexData from "../../_data/GTBBairro/GTBBairroIndexData"; export default async function GTBBairroIndexService() { - try { - const response = await GTBBairroIndexData(); - return response; - } catch (error) { - console.log(error) - return error - } + const response = await GTBBairroIndexData(); + return response; + } \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_bairro/GTBBairroSaveService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_bairro/GTBBairroSaveService.ts index f7e8da4..d37c2a2 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_bairro/GTBBairroSaveService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_bairro/GTBBairroSaveService.ts @@ -5,8 +5,6 @@ export default async function GTBBairroSaveService(data: GTBBairroInterface) { const response = await GTBBairroSaveData(data); - console.log('GTBRegimeComunhaoSaveData', response) - return response; } \ No newline at end of file diff --git a/src/app/_components/loadingButton/LoadingButton.tsx b/src/app/_components/loadingButton/LoadingButton.tsx index e334b8b..3c890c4 100644 --- a/src/app/_components/loadingButton/LoadingButton.tsx +++ b/src/app/_components/loadingButton/LoadingButton.tsx @@ -15,7 +15,7 @@ const LoadingButton = forwardRef( aria-busy={loading} aria-live="polite" className={clsx( - "flex items-center justify-center gap-2 w-full my-3 cursor-pointer", + "cursor-pointer", className )} {...props} diff --git a/src/app/_components/structure/Header.tsx b/src/app/_components/structure/Header.tsx index 2fb7a55..c8c02e6 100644 --- a/src/app/_components/structure/Header.tsx +++ b/src/app/_components/structure/Header.tsx @@ -1,5 +1,4 @@ import { Button } from "@/components/ui/button"; -import Link from "next/link"; import { PlusIcon } from "lucide-react"; interface HeaderProps { @@ -23,10 +22,9 @@ export default function Header({ title, description, buttonText, buttonAction }: {description}

- diff --git a/src/app/_response/response.tsx b/src/app/_response/response.tsx index 94c0d0a..fad1bec 100644 --- a/src/app/_response/response.tsx +++ b/src/app/_response/response.tsx @@ -30,6 +30,12 @@ export default function Response() { }); break; + case 400: + toast.error(response.error, { + description: response.message + }); + break; + case 600: toast.error(response.error, { description: response.message diff --git a/src/enums/SituacoesEnum.ts b/src/enums/SituacoesEnum.ts new file mode 100644 index 0000000..451ffb1 --- /dev/null +++ b/src/enums/SituacoesEnum.ts @@ -0,0 +1,6 @@ +export enum SituacoesEnum { + + A = 'A', + I = 'I', + +} \ No newline at end of file