Merge branch 'MVPTN-89' into release(MVP/Sprint6)

This commit is contained in:
Kenio 2025-10-02 18:14:43 -03:00
commit f6faae900d
10 changed files with 95 additions and 123 deletions

View file

@ -48,21 +48,22 @@ export default function GCidadePage() {
setIsFormOpen(true);
}, []);
/**
* Fecha o formulário e limpa o andamento selecionado
*/
const handleCloseForm = useCallback(() => {
setSelectedCidade(null);
setIsFormOpen(false);
}, []);
/**
* Fecha o formulário e limpa o andamento selecionado
*/
const handleCloseForm = useCallback((_: null, __: boolean) => {
setSelectedCidade(null);
setIsFormOpen(false);
}, []);
/**
* Salva os dados do formulário
*/
const handleSave = useCallback(
async (formData: GCidadeInterface) => {
// Aguarda salvar o registro
await saveGCidade(formData);
/**
* 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();

View file

@ -67,9 +67,29 @@ export default function GCidadeForm({ isOpen, data, onClose, onSave }: Props) {
// Quando recebe dados para edição, atualiza os valores do formulário
useEffect(() => {
// Se existir dados, reseta o formulário com os dados informados
if (data) form.reset(data);
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();
@ -77,6 +97,7 @@ export default function GCidadeForm({ isOpen, data, onClose, onSave }: Props) {
// Dispara a função
loadData();
}, [data, form]);
return (
@ -105,7 +126,7 @@ export default function GCidadeForm({ isOpen, data, onClose, onSave }: Props) {
<FormItem>
<FormLabel>Descrição</FormLabel>
<FormControl>
<Input {...field} placeholder="Digite a descrição" />
<Input {...field} value={field.value ?? ''} placeholder="Digite a descrição" />
</FormControl>
<FormMessage />
</FormItem>
@ -120,7 +141,7 @@ export default function GCidadeForm({ isOpen, data, onClose, onSave }: Props) {
<FormItem>
<FormLabel>Código IBGE</FormLabel>
<FormControl>
<Input {...field} placeholder="Digite o código" />
<Input {...field} value={field.value ?? ''} placeholder="Digite o código" />
</FormControl>
<FormMessage />
</FormItem>
@ -134,11 +155,10 @@ export default function GCidadeForm({ isOpen, data, onClose, onSave }: Props) {
render={({ field }) => (
<FormItem>
<FormLabel>UF</FormLabel>
<Select
value={String(field.value)}
// Carrega o valor selecionado
onValueChange={(val) => field.onChange(val)}
>
<Select
value={field.value ?? ''} // garante que não será null
onValueChange={(val) => field.onChange(val)}
>
<FormControl className="w-full">
<SelectTrigger>
<SelectValue placeholder="Selecione o estado desejado" />

View file

@ -1,81 +1,24 @@
// Importa o serviço de API que será utilizado para realizar requisições HTTP
import API from '@/services/api/Api';
// Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE)
import { Methods } from '@/services/api/enums/ApiMethodEnum';
export default async function GCidadeIndexData() {
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);

View file

@ -1,11 +1,27 @@
// Importa o serviço de API que será utilizado para realizar requisições HTTP
import API from '@/services/api/Api';
// Importa o enum que contém os métodos HTTP disponíveis (GET, POST, PUT, DELETE)
import { Methods } from '@/services/api/enums/ApiMethodEnum';
// Importa a interface tipada que define a estrutura dos dados de uma cidade
import GCidadeInterface from '../../_interfaces/GCidadeInterface';
export default async function GCidadeRemoveData(data: GCidadeInterface) {
return Promise.resolve({
status: 200,
message: 'Dados removidos',
data: 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 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);

View file

@ -12,6 +12,7 @@ import { withClientErrorHandler } from '@/actions/withClientErrorHandler/withCli
// 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);

View file

@ -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 { 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
// Hook customizado para remoção de cidades
export const useGCidadeRemoveHook = () => {

View file

@ -8,29 +8,18 @@ export const useGCidadeSaveHook = () => {
const [gCidade, setGCidade] = useState<GCidadeInterface | null>(null);
// controla se o formulário está aberto ou fechado
const [isOpen, setIsOpen] = useState(false);
// 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);
console.log(response);
// Manda a resposta para o verificador de resposta
setResponse(response);
// Fecha o formulário automaticamente após salvar
setIsOpen(false);
console.log(response);
// Manda a resposta para o verificador de resposta
setResponse(response);
};
}
return { gCidade, saveGCidade };
};

View file

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

View file

@ -50,8 +50,8 @@ export default function CadastrosPage() {
</div>
<div className="grid grid-cols-5 gap-3">
{items.map((item, key) => (
<Link href={'/'}>
<Card key={key} className="hover:bg-muted cursor-pointer transition-colors">
<Link key={key} href={'/'}>
<Card className="hover:bg-muted cursor-pointer transition-colors">
<CardContent>
<span className="mb-2 inline-flex shrink-0 rounded-md border border-blue-300 bg-blue-100 p-2 dark:border-blue-300/10 dark:bg-blue-400/10">
<item.icon className="size-6 stroke-blue-700 dark:stroke-blue-500" />

View file

@ -12,6 +12,8 @@ export default function Response() {
useEffect(() => {
switch (Number(response?.status)) {
case 201:
toast.success(response.message);
break;