From eed113590ca9b30330fdf790a263cb07ef284416 Mon Sep 17 00:00:00 2001 From: Kenio de Souza Date: Thu, 2 Oct 2025 18:06:44 -0300 Subject: [PATCH] =?UTF-8?q?[MVPTN-89]=20feat(CRUD):=20conclus=C3=A3o=20do?= =?UTF-8?q?=20CRUD=20g=5Fcidade?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cadastros/(g_cidade)/cidades/page.tsx | 12 +- .../_components/g_cidade/GCidadeForm.tsx | 143 ++++++++++++------ .../_data/GCidade/GCidadeIndexData.ts | 98 +++--------- .../_data/GCidade/GCidadeRemoveData.ts | 31 ++-- .../_data/GCidade/GCidadeSaveData.ts | 38 +++-- .../_hooks/g_cidade/useGCidadeRemoveHook.ts | 2 +- .../_hooks/g_cidade/useGCidadeSaveHook.ts | 18 +-- .../_services/g_cidade/GCidadeIndexService.ts | 2 +- .../cadastros/pessoas/complementos/page.tsx | 59 ++++---- src/app/_response/response.tsx | 1 + src/components/app-sidebar.tsx | 10 +- 11 files changed, 209 insertions(+), 205 deletions(-) diff --git a/src/app/(protected)/(cadastros)/cadastros/(g_cidade)/cidades/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(g_cidade)/cidades/page.tsx index 92a0ba3..0586a1f 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(g_cidade)/cidades/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(g_cidade)/cidades/page.tsx @@ -52,7 +52,7 @@ export default function GCidadePage() { /** * Fecha o formulário e limpa o andamento selecionado */ - const handleCloseForm = useCallback(() => { + const handleCloseForm = useCallback((_: null, __: boolean) => { setSelectedCidade(null); setIsFormOpen(false); }, []); @@ -61,14 +61,16 @@ export default function GCidadePage() { * Salva os dados do formulário */ const handleSave = useCallback(async (formData: GCidadeInterface) => { + // Aguarda salvar o registro await saveGCidade(formData); - // Atualiza a lista de dados - fetchGCidade(); - - }, [saveGCidade, fetchGCidade]); + // Atualiza a lista de dados + fetchGCidade(); + }, + [saveGCidade, fetchGCidade], + ); /** * Quando o usuário clica em "remover" na tabela diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/g_cidade/GCidadeForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/g_cidade/GCidadeForm.tsx index ebb0778..fae7348 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/g_cidade/GCidadeForm.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/g_cidade/GCidadeForm.tsx @@ -53,10 +53,40 @@ export default function GCidadeForm({ isOpen, data, onClose, onSave }: Props) { }, }); - // Quando recebe dados para edição, atualiza os valores do formulário - useEffect(() => { - if (data) form.reset(data); - }, [data, form]); + // Quando recebe dados para edição, atualiza os valores do formulário + useEffect(() => { + + if (data) { + // Se for edição, carrega os dados recebidos + form.reset({ + cidade_id: data.cidade_id, + uf: data.uf ?? '', + cidade_nome: data.cidade_nome ?? '', + codigo_ibge: data.codigo_ibge ?? '', + codigo_gyn: data.codigo_gyn ?? '', + }); + } else { + // Se for novo cadastro, limpa o formulário com valores padrão + form.reset({ + cidade_id: 0, + uf: '', + cidade_nome: '', + codigo_ibge: '', + codigo_gyn: '', + }); + } + + // Carrega todos os estados + // brasileiros para o formulário + const loadData = async () => { + // Aguarda a busca terminar + await fetchGUf(); + }; + + // Dispara a função + loadData(); + + }, [data, form]); return ( Controle de Cidades - {/* Estrutura do formulário */} -
- + {/* Estrutura do formulário */} + + + {/* Campo: Nome da cidade */} + ( + + Descrição + + + + + + )} + /> - {/* Campo: Nome da cidade */} - ( - - Descrição - - - - - - )} - /> + {/* Campo: Código IBGE */} + ( + + Código IBGE + + + + + + )} + /> - {/* Campo: Código IBGE */} - ( - - Código IBGE - - - - - - )} - /> - - {/* Campo: UF (Estado) */} - ( - - Estado - - - - - - )} - /> + {/* Tipo */} + ( + + UF + + + + )} + /> {/* Rodapé do diálogo com botões */} diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/GCidade/GCidadeIndexData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/GCidade/GCidadeIndexData.ts index d22d3c3..8453416 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/GCidade/GCidadeIndexData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/GCidade/GCidadeIndexData.ts @@ -1,86 +1,24 @@ -import API from "@/services/api/Api"; -import { Methods } from "@/services/api/enums/ApiMethodEnum"; +// Importa o serviço de API que será utilizado para realizar requisições HTTP +import API from '@/services/api/Api'; -export default async function GCidadeIndexData() { +// Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE) +import { Methods } from '@/services/api/enums/ApiMethodEnum'; - return Promise.resolve({ - status: 200, - message: "Dados localizados", - data: [ - { - "cidade_id": 1, - "uf": "AC", - "cidade_nome": "Acrelândia", - "codigo_ibge": null, - "codigo_gyn": null - }, - { - "cidade_id": 2, - "uf": "AC", - "cidade_nome": "Assis Brasil", - "codigo_ibge": null, - "codigo_gyn": null - }, - { - "cidade_id": 3, - "uf": "AC", - "cidade_nome": "Brasiléia", - "codigo_ibge": null, - "codigo_gyn": null - }, - { - "cidade_id": 4, - "uf": "AC", - "cidade_nome": "Bujari", - "codigo_ibge": null, - "codigo_gyn": null - }, - { - "cidade_id": 5, - "uf": "AC", - "cidade_nome": "Capixaba", - "codigo_ibge": null, - "codigo_gyn": null - }, - { - "cidade_id": 6, - "uf": "AC", - "cidade_nome": "Cruzeiro do Sul", - "codigo_ibge": null, - "codigo_gyn": null - }, - { - "cidade_id": 7, - "uf": "AC", - "cidade_nome": "Epitaciolândia", - "codigo_ibge": null, - "codigo_gyn": null - }, - { - "cidade_id": 8, - "uf": "AC", - "cidade_nome": "Feijó", - "codigo_ibge": null, - "codigo_gyn": null - }, - { - "cidade_id": 9, - "uf": "AC", - "cidade_nome": "Jordão", - "codigo_ibge": null, - "codigo_gyn": null - }, - { - "cidade_id": 10, - "uf": "AC", - "cidade_nome": "Mâncio Lima", - "codigo_ibge": null, - "codigo_gyn": null - } - ] +// Importa função que encapsula chamadas assíncronas e trata erros automaticamente +import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; - }); +// Função assíncrona que implementa a lógica de salvar (criar/atualizar) uma cidade +async function executeGcidadeIndexData() { + // Instancia o cliente da API para enviar a requisição + const api = new API(); + + // Executa a requisição para a API com o método apropriado e envia os dados no corpo + return await api.send({ + method: Methods.GET, // GET listar todos os itens + endpoint: `administrativo/g_cidade/` // endpoint dinâmico + }); } - +// Exporta a função de salvar cidade já encapsulada com tratamento de erros +export const GCidadeIndexData = withClientErrorHandler(executeGcidadeIndexData); diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/GCidade/GCidadeRemoveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/GCidade/GCidadeRemoveData.ts index abcf2aa..cd67260 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/GCidade/GCidadeRemoveData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/GCidade/GCidadeRemoveData.ts @@ -1,14 +1,27 @@ -import API from "@/services/api/Api"; -import { Methods } from "@/services/api/enums/ApiMethodEnum"; +// Importa o serviço de API que será utilizado para realizar requisições HTTP +import API from '@/services/api/Api'; -export default async function GCidadeRemoveData() { +// Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE) +import { Methods } from '@/services/api/enums/ApiMethodEnum'; - return Promise.resolve({ - status: 200, - message: "Dados removidos", - data: null - }); +// Importa a interface tipada que define a estrutura dos dados de uma cidade +import GCidadeInterface from '../../_interfaces/GCidadeInterface'; +// Importa função que encapsula chamadas assíncronas e trata erros automaticamente +import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; + +// Função assíncrona que implementa a lógica de salvar (criar/atualizar) uma cidade +async function executeGcidadeRemoveData(data: GCidadeInterface) { + + // Instancia o cliente da API para enviar a requisição + const api = new API(); + + // Executa a requisição para a API com o método apropriado e envia os dados no corpo + return await api.send({ + method: Methods.DELETE, // Verbo DELETE para exclusão + endpoint: `administrativo/g_cidade/${data.cidade_id}`, // endpoint dinâmico + }); } - +// Exporta a função de salvar cidade já encapsulada com tratamento de erros +export const GCidadeRemoveData = withClientErrorHandler(executeGcidadeRemoveData); diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/GCidade/GCidadeSaveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/GCidade/GCidadeSaveData.ts index 9bd2a52..d1f2433 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_data/GCidade/GCidadeSaveData.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_data/GCidade/GCidadeSaveData.ts @@ -1,15 +1,31 @@ -import API from "@/services/api/Api"; // Importa o serviço de API (ainda não utilizado aqui) -import { Methods } from "@/services/api/enums/ApiMethodEnum"; // Importa enum de métodos HTTP (também não usado neste trecho) +// Importa o serviço de API que será utilizado para realizar requisições HTTP +import API from '@/services/api/Api'; -// Função assíncrona responsável por salvar dados de cidades -export default async function GCidadeSaveData() { +// Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE) +import { Methods } from '@/services/api/enums/ApiMethodEnum'; - // Log para indicar que a função foi chamada - console.log("chegou"); +// Importa a interface tipada que define a estrutura dos dados de uma cidade +import GCidadeInterface from '../../_interfaces/GCidadeInterface'; - // Retorna uma Promise resolvida simulando resposta da API - return Promise.resolve({ - status: 200, // Código de status fictício - message: "Dados salvos" // Mensagem de sucesso - }); +// Importa função que encapsula chamadas assíncronas e trata erros automaticamente +import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withClientErrorHandler'; + +// Função assíncrona que implementa a lógica de salvar (criar/atualizar) uma cidade +async function executeGcidadeSaveData(data: GCidadeInterface) { + + // Verifica se existe ID da cidade para decidir se é atualização (PUT) ou criação (POST) + const isUpdate = Boolean(data.cidade_id); + + // Instancia o cliente da API para enviar a requisição + const api = new API(); + + // Executa a requisição para a API com o método apropriado e envia os dados no corpo + return await api.send({ + method: isUpdate ? Methods.PUT : Methods.POST, // PUT se atualizar, POST se criar + endpoint: `administrativo/g_cidade/${data.cidade_id || ''}`, // endpoint dinâmico + body: data, // payload enviado para a API + }); } + +// Exporta a função de salvar cidade já encapsulada com tratamento de erros +export const GCidadeSaveData = withClientErrorHandler(executeGcidadeSaveData); diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_cidade/useGCidadeRemoveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_cidade/useGCidadeRemoveHook.ts index c63f53b..ee389b1 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_cidade/useGCidadeRemoveHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_cidade/useGCidadeRemoveHook.ts @@ -1,6 +1,6 @@ import { useResponse } from "@/app/_response/ResponseContext"; // Contexto global para gerenciar respostas da API import GCidadeInterface from "../../_interfaces/GCidadeInterface"; // Interface tipada da cidade -import GCidadeRemoveData from "../../_data/GCidade/GCidadeRemoveData"; // Função que remove a cidade via API +import { GCidadeRemoveData } from "../../_data/GCidade/GCidadeRemoveData"; // Função que remove a cidade via API // Hook customizado para remoção de cidades export const useGCidadeRemoveHook = () => { diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_cidade/useGCidadeSaveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_cidade/useGCidadeSaveHook.ts index 0a0c1c4..1e3dd0d 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_cidade/useGCidadeSaveHook.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_cidade/useGCidadeSaveHook.ts @@ -8,24 +8,18 @@ export const useGCidadeSaveHook = () => { const { setResponse } = useResponse(); const [gCidade, setGCidade] = useState(null); - // controla se o formulário está aberto ou fechado - const [isOpen, setIsOpen] = useState(false); + // controla se o formulário está aberto ou fechado + // const [isOpen, setIsOpen] = useState(false); const saveGCidade = async (data: GCidadeInterface) => { const response = await GCidadeSaveService(data); - // Guardar os dados localizados - setGCidade(response.data); + // Guardar os dados localizados + setGCidade(response.data); - // Manda a resposta para o verificador de resposta - setResponse(response); - - // Fecha o formulário automaticamente após salvar - setIsOpen(false); - - // Retorna os dados imediatamente - return response; + // Manda a resposta para o verificador de resposta + setResponse(response); } diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/g_cidade/GCidadeIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/g_cidade/GCidadeIndexService.ts index c42a22f..fd26631 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_services/g_cidade/GCidadeIndexService.ts +++ b/src/app/(protected)/(cadastros)/cadastros/_services/g_cidade/GCidadeIndexService.ts @@ -1,6 +1,6 @@ import { withClientErrorHandler } from "@/actions/withClientErrorHandler/withClientErrorHandler"; // Função que envolve qualquer ação assíncrona para capturar e tratar erros do cliente -import GCidadeIndexData from "../../_data/GCidade/GCidadeIndexData"; +import { GCidadeIndexData } from '../../_data/GCidade/GCidadeIndexData'; // Função que retorna os dados da lista de cidades (chamada à API ou mock) // Função assíncrona que executa a chamada para buscar os dados de cidades diff --git a/src/app/(protected)/(cadastros)/cadastros/pessoas/complementos/page.tsx b/src/app/(protected)/(cadastros)/cadastros/pessoas/complementos/page.tsx index 5dc31bb..a6256d2 100644 --- a/src/app/(protected)/(cadastros)/cadastros/pessoas/complementos/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/pessoas/complementos/page.tsx @@ -37,37 +37,34 @@ export default function CadastrosPage() { }, ]; - return ( + return ( +
+
-
-
-

- Complementos de Cadastro pessoal -

-

- Gerencie os cadastros relacionados a regimes, como estado civil, regime de comunhão e outras informações complementares necessárias para o registro de pessoas. -

-
-
-
- {items.map((item, key) => ( - - - - - - -

- {item.title} -

-

- {item.description} -

-
-
- - ))} -
+

Complementos de Cadastro pessoal

+

+ Gerencie os cadastros relacionados a regimes, como estado civil, regime de comunhão e + outras informações complementares necessárias para o registro de pessoas. +

- ); +
+
+ {items.map((item, key) => ( + + + + + + +

+ {item.title} +

+

{item.description}

+
+
+ + ))} +
+
+ ); } \ No newline at end of file diff --git a/src/app/_response/response.tsx b/src/app/_response/response.tsx index fad1bec..d79f7f5 100644 --- a/src/app/_response/response.tsx +++ b/src/app/_response/response.tsx @@ -19,6 +19,7 @@ export default function Response() { useEffect(() => { switch (Number(response?.status)) { + case 201: toast.success(response.message); diff --git a/src/components/app-sidebar.tsx b/src/components/app-sidebar.tsx index a0f03f6..89da6d9 100644 --- a/src/components/app-sidebar.tsx +++ b/src/components/app-sidebar.tsx @@ -133,13 +133,13 @@ const data = { url: "/cadastros/minuta/", }, { - title: "Regimes/Comunhão", - url: "/cadastros/regime-comunhao/", + title: 'Pessoas/Físicas', + url: '/cadastros/pessoa/fisica', }, { - title: "Censec/Centrais", - url: "/cadastros/censec/", - } + title: 'Pessoas/Jurídica', + url: '/cadastros/pessoa/juridica', + }, ], }, {