diff --git a/src/app/(protected)/(cadastros)/cadastros/(g_tb_estadocivil)/estado-civil/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(g_tb_estadocivil)/estado-civil/page.tsx new file mode 100644 index 0000000..536b2be --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/(g_tb_estadocivil)/estado-civil/page.tsx @@ -0,0 +1,129 @@ +'use client'; + +import { useEffect, useState, useCallback } from "react"; +import { Card, CardContent } from "@/components/ui/card"; +import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog"; + +import Header from "@/app/_components/structure/Header"; +import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog"; +import Loading from "@/app/_components/loading/loading"; +import GTBEstadoCivilTable from "../../_components/g_tb_estadocivil/GTBEstadoCivilTable"; +import GTBEstadoCivilForm from "../../_components/g_tb_estadocivil/GTBEstadoCivilForm"; + +import { useGTBEstadoCivilReadHook } from "../../_hooks/g_tb_estadocivil/useGTBEstadoCivilReadHook"; +import { useGTBEstadoCivilSaveHook } from "../../_hooks/g_tb_estadocivil/useGTBEstadoCivilSaveHook"; +import { useGTBEstadoCivilRemoveHook } from "../../_hooks/g_tb_estadocivil/useGTBEstadoCivilRemoveHook"; + +import { GTBEstadoCivilInterface } from "../../_interfaces/GTBEstadoCivilInterface"; + +const initalEstadoCivil: GTBEstadoCivilInterface = { + tb_estadocivil_id: 0, + sistema_id: 0, + descricao: '', + situacao: 'A', +} + +export default function TBEstadoCivilPage() { + + // Hooks para leitura e salvamento + const { gTBEstadoCivil, fetchGTBEstadoCivil } = useGTBEstadoCivilReadHook(); + const { saveGTBEstadoCivil } = useGTBEstadoCivilSaveHook(); + const { removeGTBEstadoCivil } = useGTBEstadoCivilRemoveHook(); + + // Estado para controlar o formulário e item selecionado + const [selectedEstadoCivil, setSelectedEstadoCivil] = useState(null); + const [isFormOpen, setIsFormOpen] = useState(false); + const [itemToDelete, setItemToDelete] = useState(null); + + // Hook para o modal de confirmação + const { + isOpen: isConfirmOpen, + openDialog: openConfirmDialog, + handleConfirm, + handleCancel, + } = useConfirmDialog(); + + // Ações do formulário + const handleOpenForm = useCallback((data: GTBEstadoCivilInterface | null) => { + setSelectedEstadoCivil(data); + setIsFormOpen(true); + }, []); + + const handleCloseForm = useCallback(() => { + setIsFormOpen(false); + setSelectedEstadoCivil(null); + }, []); + + const handleSave = useCallback(async (data: GTBEstadoCivilInterface) => { + await saveGTBEstadoCivil(data); + await fetchGTBEstadoCivil(); // Atualiza a tabela após salvar + handleCloseForm(); + }, [saveGTBEstadoCivil, fetchGTBEstadoCivil]); + + // Ações de deleção + const handleConfirmDelete = useCallback((item: GTBEstadoCivilInterface) => { + setItemToDelete(item); + openConfirmDialog(); + }, [openConfirmDialog]); + + const handleDelete = useCallback(async () => { + if (itemToDelete) { + await removeGTBEstadoCivil(itemToDelete); + await fetchGTBEstadoCivil(); // Atualiza a tabela após remover + } + handleCancel(); + }, [itemToDelete, fetchGTBEstadoCivil, handleCancel]); + + // Efeito para carregar os dados na montagem do componente + useEffect(() => { + fetchGTBEstadoCivil(); + }, []); + + // Mostra tela de loading enquanto os dados não são carregados + if (!gTBEstadoCivil) { + return ; + } + + return ( +
+ {/* Cabeçalho */} +
{ handleOpenForm(data = initalEstadoCivil) }} + /> + + {/* Tabela de Estados Civis */} + + + + + + + {/* Modal de confirmação */} + + + {/* Formulário de criação/edição */} + +
+ ); +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_estadocivil/GTBEstadoCivilForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_estadocivil/GTBEstadoCivilForm.tsx new file mode 100644 index 0000000..6e94347 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_estadocivil/GTBEstadoCivilForm.tsx @@ -0,0 +1,129 @@ +'use client'; + +import z from "zod"; +import { useEffect } from "react"; +import { useForm, Controller } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; + +import { Button } from "@/components/ui/button"; +import { Checkbox } from "@/components/ui/checkbox"; +import { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle +} from "@/components/ui/dialog"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; + +import { GTBEstadoCivilSchema } from "../../_schemas/GTBEstadoCivilSchema"; +import { GTBEstadoCivilInterface } from "../../_interfaces/GTBEstadoCivilInterface"; + +type FormValues = z.infer; + +interface TBEstadoCivilFormProps { + isOpen: boolean; + data: FormValues | null; + onClose: (item: null, isFormStatus: boolean) => void; + onSave: (data: FormValues) => void; +} + +export default function GTBEstadoCivilForm({ isOpen, data, onClose, onSave }: TBEstadoCivilFormProps) { + // Inicializa o react-hook-form com o schema Zod + const form = useForm({ + resolver: zodResolver(GTBEstadoCivilSchema), + defaultValues: { + tb_estadocivil_id: 0, + sistema_id: 0, + descricao: "", + situacao: "A", + }, + }); + + // Atualiza o formulário quando recebe dados para edição + useEffect(() => { + if (data) form.reset(data); + }, [data, form]); + + return ( + { + if (!open) onClose(null, false); + }} + > + + + + Estado Civil + + + Crie ou edite um estado civil + + + +
+ + + {/* Descrição */} + ( + + Descrição + + + + + + )} + /> + + {/* Situação */} + ( +
+ field.onChange(checked ? "A" : "I")} + /> + +
+ )} + /> + + {/* Rodapé do Dialog */} + + + + + + + + {/* Campos ocultos */} + + + + +
+
+ ); +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_estadocivil/GTBEstadoCivilTable.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_estadocivil/GTBEstadoCivilTable.tsx new file mode 100644 index 0000000..1f3ba22 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_estadocivil/GTBEstadoCivilTable.tsx @@ -0,0 +1,123 @@ +'use client'; + +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger +} from "@/components/ui/dropdown-menu"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow +} from "@/components/ui/table"; +import { EllipsisIcon, PencilIcon, Trash2Icon } from "lucide-react"; +import { GTBEstadoCivilInterface } from "../../_interfaces/GTBEstadoCivilInterface"; + +interface TBEstadoCivilTableProps { + data: GTBEstadoCivilInterface[]; + onEdit: (item: GTBEstadoCivilInterface, isEditingFormStatus: boolean) => void; + onDelete: (item: GTBEstadoCivilInterface, isEditingFormStatus: boolean) => void; +} + +/** + * Renderiza o badge de situação + */ +function StatusBadge({ situacao }: { situacao: 'A' | 'I' }) { + const isActive = situacao === "A"; + + const baseClasses = + "text-xs font-medium px-2.5 py-0.5 rounded-sm me-2"; + + const activeClasses = + "bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300"; + + const inactiveClasses = + "bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300"; + + return ( + + {isActive ? "Ativo" : "Inativo"} + + ); +} + +export default function GTBEstadoCivilTable({ + data, + onEdit, + onDelete +}: TBEstadoCivilTableProps) { + return ( + + + + # + Situação + Descrição + Ações + + + + + {data.map((item) => ( + + + {item.tb_estadocivil_id} + + + + + + + {item.descricao} + + + + + + + + + + onEdit(item, true)} + > + + Editar + + + + + onDelete(item, true)} + > + + Remover + + + + + + + ))} + +
+ ); +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/GTBEstadoCivil/GTBEstadoCivilIndexData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/GTBEstadoCivil/GTBEstadoCivilIndexData.ts new file mode 100644 index 0000000..efa8787 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/GTBEstadoCivil/GTBEstadoCivilIndexData.ts @@ -0,0 +1,25 @@ +import API from "@/services/api/Api"; +import { Methods } from "@/services/api/enums/ApiMethodEnum"; +import EstadoCivilMockDeDados from "./mockEstadoCivil"; + +const useMock = true + +export default async function GTBEstadoCivilIndexData() { + if (useMock) { + console.log(EstadoCivilMockDeDados()) + return await EstadoCivilMockDeDados(); + } + + const api = new API(); + try { + const dados = await api.send({ + method: Methods.GET, + endpoint: `administrativo/g_tb_estado_civil/` + }); + return dados + } catch (error) { + console.log(error) + return error + } + +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/GTBEstadoCivil/GTBEstadoCivilRemoveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/GTBEstadoCivil/GTBEstadoCivilRemoveData.ts new file mode 100644 index 0000000..306b3c4 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/GTBEstadoCivil/GTBEstadoCivilRemoveData.ts @@ -0,0 +1,14 @@ +import API from "@/services/api/Api"; +import { GTBEstadoCivilInterface } from "../../_interfaces/GTBEstadoCivilInterface"; +import { Methods } from "@/services/api/enums/ApiMethodEnum"; + +export default async function GTBEstadoCivilRemoveData(data: GTBEstadoCivilInterface) { + + const api = new API(); + + return await api.send({ + method: Methods.DELETE, + endpoint: `administrativo/g_tb_bairro/${data.tb_estadocivil_id}` + }); + +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/GTBEstadoCivil/GTBEstadoCivilSaveData.ts b/src/app/(protected)/(cadastros)/cadastros/_data/GTBEstadoCivil/GTBEstadoCivilSaveData.ts new file mode 100644 index 0000000..da800a6 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/GTBEstadoCivil/GTBEstadoCivilSaveData.ts @@ -0,0 +1,17 @@ +import API from "@/services/api/Api"; +import { GTBEstadoCivilInterface } from "../../_interfaces/GTBEstadoCivilInterface"; +import { Methods } from "@/services/api/enums/ApiMethodEnum"; + +export default async function GTBEstadoCivilSaveData(data: GTBEstadoCivilInterface) { + + const isUpdate = Boolean(data.tb_estadocivil_id); + + const api = new API(); + + return await api.send({ + method: isUpdate ? Methods.PUT : Methods.POST, + endpoint: `administrativo/g_tb_bairro/${data.tb_estadocivil_id || ''}`, + body: data + }); + +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_data/GTBEstadoCivil/mockEstadoCivil.ts b/src/app/(protected)/(cadastros)/cadastros/_data/GTBEstadoCivil/mockEstadoCivil.ts new file mode 100644 index 0000000..04e8155 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_data/GTBEstadoCivil/mockEstadoCivil.ts @@ -0,0 +1,58 @@ +import { GTBBairroInterface } from "../../_interfaces/GTBBairroInterface"; + +export default async function EstadoCivilMockDeDados() { + return Promise.resolve({ + status: 200, + message: 'Dados localizados', + data: [ + { + tb_estadocivil_id: 26.00, + sistema_id: 2.00, + descricao: "casado", + situacao: "A", + }, + { + tb_estadocivil_id: 27.00, + sistema_id: 2.00, + descricao: "solteiro(a)", + situacao: "A", + }, + { + tb_estadocivil_id: 28.00, + sistema_id: 2.00, + descricao: "desquitado(a)", + situacao: "A", + }, + { + tb_estadocivil_id: 29.00, + sistema_id: 2.00, + descricao: "divorciado(a)", + situacao: "A", + }, + { + tb_estadocivil_id: 30.00, + sistema_id: 2.00, + descricao: "espólio", + situacao: "A", + }, + { + tb_estadocivil_id: 31.00, + sistema_id: 2.00, + descricao: "menor impúbere", + situacao: "A", + }, + { + tb_estadocivil_id: 32.00, + sistema_id: 2.00, + descricao: "menor púbere", + situacao: "A", + }, + { + tb_estadocivil_id: 33.00, + sistema_id: 2.00, + descricao: "não consta", + situacao: "A", + } + ] + }); +} diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_estadocivil/useGTBEstadoCivilReadHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_estadocivil/useGTBEstadoCivilReadHook.ts new file mode 100644 index 0000000..4a7d31b --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_estadocivil/useGTBEstadoCivilReadHook.ts @@ -0,0 +1,27 @@ +import { useResponse } from "@/app/_response/ResponseContext" +import { useState } from "react"; +import { GTBEstadoCivilInterface } from "../../_interfaces/GTBEstadoCivilInterface"; +import GTBEstadoCivilIndexService from "../../_services/g_tb_estadocivil/GTBEstadoCivilIndexService"; + +export const useGTBEstadoCivilReadHook = () => { + + const { setResponse } = useResponse(); + const [gTBEstadoCivil, setGTBEstadoCivil] = useState([]); + + const fetchGTBEstadoCivil = async () => { + + try { + const response = await GTBEstadoCivilIndexService(); + + setGTBEstadoCivil(response.data); + + setResponse(response); + } catch (error) { + console.log(error) + } + + } + + return { gTBEstadoCivil, fetchGTBEstadoCivil } + +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_estadocivil/useGTBEstadoCivilRemoveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_estadocivil/useGTBEstadoCivilRemoveHook.ts new file mode 100644 index 0000000..1cc29cf --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_estadocivil/useGTBEstadoCivilRemoveHook.ts @@ -0,0 +1,19 @@ +import { useResponse } from "@/app/_response/ResponseContext" +import { GTBEstadoCivilInterface } from "../../_interfaces/GTBEstadoCivilInterface"; +import GTBEstadoCivilRemoveService from "../../_services/g_tb_estadocivil/GTBEstadoCivilRemoveService"; + +export const useGTBEstadoCivilRemoveHook = () => { + + const { setResponse } = useResponse(); + + const removeGTBEstadoCivil = async (data: GTBEstadoCivilInterface) => { + + const response = await GTBEstadoCivilRemoveService(data); + + setResponse(response); + + } + + return { removeGTBEstadoCivil } + +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_estadocivil/useGTBEstadoCivilSaveHook.ts b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_estadocivil/useGTBEstadoCivilSaveHook.ts new file mode 100644 index 0000000..63a0237 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_estadocivil/useGTBEstadoCivilSaveHook.ts @@ -0,0 +1,31 @@ +import { useResponse } from "@/app/_response/ResponseContext" +import { useState } from "react"; +import { GTBEstadoCivilInterface } from "../../_interfaces/GTBEstadoCivilInterface"; +import GTBEstadoCivilSaveService from "../../_services/g_tb_estadocivil/GTBEstadoCivilSaveService"; + +export const useGTBEstadoCivilSaveHook = () => { + + const { setResponse } = useResponse(); + const [gTBEstadoCivil, setGTBEstadoCivil] = useState(null); + // controla se o formulário está aberto ou fechado + const [isOpen, setIsOpen] = useState(false); + + const saveGTBEstadoCivil = async (data: GTBEstadoCivilInterface) => { + + const response = await GTBEstadoCivilSaveService(data); + + setGTBEstadoCivil(response.data); + + setResponse(response); + + // Fecha o formulário automaticamente após salvar + setIsOpen(false); + + // Retorna os dados imediatamente + return response; + + } + + return { gTBEstadoCivil, saveGTBEstadoCivil } + +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_interfaces/GTBEstadoCivilInterface.ts b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GTBEstadoCivilInterface.ts new file mode 100644 index 0000000..12f1cf5 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_interfaces/GTBEstadoCivilInterface.ts @@ -0,0 +1,6 @@ +export interface GTBEstadoCivilInterface { + tb_estadocivil_id: number; + sistema_id: number; + descricao: string; + situacao: 'A' | 'I'; +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_schemas/GTBEstadoCivilSchema.ts b/src/app/(protected)/(cadastros)/cadastros/_schemas/GTBEstadoCivilSchema.ts new file mode 100644 index 0000000..88cb617 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_schemas/GTBEstadoCivilSchema.ts @@ -0,0 +1,8 @@ +import { z } from 'zod'; + +export const GTBEstadoCivilSchema = z.object({ + tb_estadocivil_id: z.number(), + sistema_id: z.number(), + descricao: z.string(), + situacao: z.enum(['A', 'I']), +}); \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_estadocivil/GTBEstadoCivilIndexService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_estadocivil/GTBEstadoCivilIndexService.ts new file mode 100644 index 0000000..11c0b1d --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_estadocivil/GTBEstadoCivilIndexService.ts @@ -0,0 +1,12 @@ +import GTBEstadoCivilIndexData from "../../_data/GTBEstadoCivil/GTBEstadoCivilIndexData"; + +export default async function GTBEstadoCivilIndexService() { + + try { + const response = await GTBEstadoCivilIndexData(); + return response; + } catch (error) { + console.log(error) + return error + } +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_estadocivil/GTBEstadoCivilRemoveService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_estadocivil/GTBEstadoCivilRemoveService.ts new file mode 100644 index 0000000..4c19f10 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_estadocivil/GTBEstadoCivilRemoveService.ts @@ -0,0 +1,10 @@ +import GTBEstadoCivilSaveData from "../../_data/GTBEstadoCivil/GTBEstadoCivilSaveData"; +import { GTBEstadoCivilInterface } from "../../_interfaces/GTBEstadoCivilInterface"; + +export default async function GTBEstadoCivilRemoveService(data: GTBEstadoCivilInterface) { + + const response = await GTBEstadoCivilSaveData(data); + + return response; + +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_estadocivil/GTBEstadoCivilSaveService.ts b/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_estadocivil/GTBEstadoCivilSaveService.ts new file mode 100644 index 0000000..0567d52 --- /dev/null +++ b/src/app/(protected)/(cadastros)/cadastros/_services/g_tb_estadocivil/GTBEstadoCivilSaveService.ts @@ -0,0 +1,12 @@ +import GTBEstadoCivilSaveData from "../../_data/GTBEstadoCivil/GTBEstadoCivilSaveData"; +import { GTBEstadoCivilInterface } from "../../_interfaces/GTBEstadoCivilInterface"; + +export default async function GTBEstadoCivilSaveService(data: GTBEstadoCivilInterface) { + + const response = await GTBEstadoCivilSaveData(data); + + console.log('GTBRegimeComunhaoSaveData', response) + + return response; + +} \ No newline at end of file diff --git a/src/components/app-sidebar.tsx b/src/components/app-sidebar.tsx index b959708..35c881d 100644 --- a/src/components/app-sidebar.tsx +++ b/src/components/app-sidebar.tsx @@ -104,6 +104,10 @@ const data = { { title: "Bairro", url: "/cadastros/bairro" + }, + { + title: "Estado Civil", + url: "/cadastros/estado-civil" } ], },