diff --git a/package-lock.json b/package-lock.json index f0f7a4b..2d46362 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "cmdk": "^1.1.1", "cookies-next": "^6.1.0", "faker-js": "^1.0.0", + "input-otp": "^1.4.2", "js-cookie": "^3.0.5", "jsonwebtoken": "^9.0.2", "jwt-decode": "^4.0.0", @@ -4936,6 +4937,16 @@ "dev": true, "license": "ISC" }, + "node_modules/input-otp": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", + "integrity": "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -5419,7 +5430,6 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, -<<<<<<< HEAD "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -5467,8 +5477,6 @@ "json5": "lib/cli.js" } }, -======= ->>>>>>> origin/MVPTN-90 "node_modules/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", diff --git a/package.json b/package.json index c70016c..79f640a 100644 --- a/package.json +++ b/package.json @@ -7,9 +7,7 @@ "dev": "next dev --turbopack", "build": "next build", "start": "next start", - "lint": "next lint", - "lint:fix": "npm run lint -- --fix", - "format": "prettier --write . --ignore-path .gitignore" + "lint": "next lint" }, "dependencies": { "@faker-js/faker": "^10.0.0", @@ -34,6 +32,7 @@ "cmdk": "^1.1.1", "cookies-next": "^6.1.0", "faker-js": "^1.0.0", + "input-otp": "^1.4.2", "js-cookie": "^3.0.5", "jsonwebtoken": "^9.0.2", "jwt-decode": "^4.0.0", @@ -71,4 +70,4 @@ "tw-animate-css": "^1.3.7", "typescript": "^5" } -} +} \ No newline at end of file diff --git a/src/actions/form/ResetFormIfData.ts b/src/actions/form/ResetFormIfData.ts deleted file mode 100644 index 09fa8df..0000000 --- a/src/actions/form/ResetFormIfData.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { UseFormReturn, FieldValues } from "react-hook-form"; - -/** - * Reseta o formulário com os dados recebidos (se existirem) - * @param form - Instância do react-hook-form - * @param data - Dados para popular o formulário - */ -export function ResetFormIfData( - form: UseFormReturn, - data: T | null -) { - if (data) { - form.reset(data); - } -} diff --git a/src/app/(protected)/(administrativo)/(g_usuario)/usuarios/[id]/detalhes/page.tsx b/src/app/(protected)/(administrativo)/(g_usuario)/usuarios/[id]/detalhes/page.tsx index 208fd4e..d9eac18 100644 --- a/src/app/(protected)/(administrativo)/(g_usuario)/usuarios/[id]/detalhes/page.tsx +++ b/src/app/(protected)/(administrativo)/(g_usuario)/usuarios/[id]/detalhes/page.tsx @@ -6,7 +6,7 @@ import { useParams } from 'next/navigation'; import { Card, CardContent } from '@/components/ui/card'; import { useGUsuarioReadHooks } from '@/app/(protected)/(administrativo)/_hooks/g_usuario/useGUsuarioReadHooks'; import Usuario from '@/app/(protected)/(administrativo)/_interfaces/GUsuarioInterface'; -import Loading from '@/app/_components/loading/loading'; +import Loading from '@/shared/components/loading/loading'; export default function UsuarioDetalhes() { const params = useParams(); @@ -17,7 +17,6 @@ export default function UsuarioDetalhes() { if (params.id) { fetchUsuario({ usuario_id: Number(params.id) } as Usuario); } - console.log('pagina', usuario); }, []); if (!usuario) return ; diff --git a/src/app/(protected)/(administrativo)/(g_usuario)/usuarios/page.tsx b/src/app/(protected)/(administrativo)/(g_usuario)/usuarios/page.tsx index 9539e74..95fcb73 100644 --- a/src/app/(protected)/(administrativo)/(g_usuario)/usuarios/page.tsx +++ b/src/app/(protected)/(administrativo)/(g_usuario)/usuarios/page.tsx @@ -16,7 +16,7 @@ import { Button } from '@/components/ui/button'; import Link from 'next/link'; import { useGUsuarioIndexHook } from '../../_hooks/g_usuario/useGUsuarioIndexHook'; import { useEffect } from 'react'; -import Loading from '@/app/_components/loading/loading'; +import Loading from '@/shared/components/loading/loading'; export default function UsuarioPage() { const { usuarios, fetchUsuarios } = useGUsuarioIndexHook(); diff --git a/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioDeleteData.ts b/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioDeleteData.ts index a65d9a3..01b4fea 100644 --- a/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioDeleteData.ts +++ b/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioDeleteData.ts @@ -1,7 +1,7 @@ 'use server'; -import API from '@/services/api/Api'; -import { Methods } from '@/services/api/enums/ApiMethodEnum'; +import API from '@/shared/services/api/Api'; +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; export default async function GUsuarioDeleteData(usuarioId: number) { const api = new API(); diff --git a/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioIndexData.ts b/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioIndexData.ts index 5f82cdc..1d0ceba 100644 --- a/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioIndexData.ts +++ b/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioIndexData.ts @@ -1,7 +1,7 @@ 'use server'; -import API from '@/services/api/Api'; -import { Methods } from '@/services/api/enums/ApiMethodEnum'; +import API from '@/shared/services/api/Api'; +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; export default async function GUsuarioIndexData() { const api = new API(); diff --git a/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioLoginData.ts b/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioLoginData.ts index eb0313f..621f05f 100644 --- a/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioLoginData.ts +++ b/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioLoginData.ts @@ -1,7 +1,7 @@ 'use server'; -import { Methods } from '@/services/api/enums/ApiMethodEnum'; -import API from '@/services/api/Api'; +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; +import API from '@/shared/services/api/Api'; export default async function GUsuarioLoginData(form: any) { const api = new API(); diff --git a/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioReadData.ts b/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioReadData.ts index d0c9a00..887c9ae 100644 --- a/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioReadData.ts +++ b/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioReadData.ts @@ -1,7 +1,7 @@ 'use server'; -import API from '@/services/api/Api'; -import { Methods } from '@/services/api/enums/ApiMethodEnum'; +import API from '@/shared/services/api/Api'; +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; export default async function GUsuarioReadData(usuarioId: number) { const api = new API(); diff --git a/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioSaveData.ts b/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioSaveData.ts index d1de35a..8fd0f94 100644 --- a/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioSaveData.ts +++ b/src/app/(protected)/(administrativo)/_data/g_usuario/GUsuarioSaveData.ts @@ -1,7 +1,7 @@ 'use server'; -import API from '@/services/api/Api'; -import { Methods } from '@/services/api/enums/ApiMethodEnum'; +import API from '@/shared/services/api/Api'; +import { Methods } from '@/shared/services/api/enums/ApiMethodEnum'; export default async function GUsuarioSaveData(form: any) { const api = new API(); diff --git a/src/app/(protected)/(administrativo)/_hooks/g_usuario/useGUsuarioIndexHook.ts b/src/app/(protected)/(administrativo)/_hooks/g_usuario/useGUsuarioIndexHook.ts index 41e8c97..2df1b1e 100644 --- a/src/app/(protected)/(administrativo)/_hooks/g_usuario/useGUsuarioIndexHook.ts +++ b/src/app/(protected)/(administrativo)/_hooks/g_usuario/useGUsuarioIndexHook.ts @@ -3,7 +3,7 @@ import { useState } from 'react'; import Usuario from '../../_interfaces/GUsuarioInterface'; import GUsuarioIndex from '../../_services/g_usuario/GUsuarioIndex'; -import { useResponse } from '@/app/_response/ResponseContext'; +import { useResponse } from '@/shared/components/response/ResponseContext'; export const useGUsuarioIndexHook = () => { const { setResponse } = useResponse(); diff --git a/src/app/(protected)/(administrativo)/_hooks/g_usuario/useGUsuarioReadHooks.ts b/src/app/(protected)/(administrativo)/_hooks/g_usuario/useGUsuarioReadHooks.ts index ba64b81..116d489 100644 --- a/src/app/(protected)/(administrativo)/_hooks/g_usuario/useGUsuarioReadHooks.ts +++ b/src/app/(protected)/(administrativo)/_hooks/g_usuario/useGUsuarioReadHooks.ts @@ -3,7 +3,7 @@ import { useState } from 'react'; import Usuario from '../../_interfaces/GUsuarioInterface'; import GUsuarioRead from '../../_services/g_usuario/GUsuarioRead'; -import { useResponse } from '@/app/_response/ResponseContext'; +import { useResponse } from '@/shared/components/response/ResponseContext'; export const useGUsuarioReadHooks = () => { const { setResponse } = useResponse(); @@ -12,10 +12,7 @@ export const useGUsuarioReadHooks = () => { const fetchUsuario = async (Usuario: Usuario) => { const response = await GUsuarioRead(Usuario.usuario_id); - console.log('hook', response.data); - setUsuario(response.data); - setResponse(response); }; diff --git a/src/app/(protected)/(administrativo)/_hooks/g_usuario/useGUsuarioSaveHook.ts b/src/app/(protected)/(administrativo)/_hooks/g_usuario/useGUsuarioSaveHook.ts index 159fb29..58846ed 100644 --- a/src/app/(protected)/(administrativo)/_hooks/g_usuario/useGUsuarioSaveHook.ts +++ b/src/app/(protected)/(administrativo)/_hooks/g_usuario/useGUsuarioSaveHook.ts @@ -3,7 +3,7 @@ import { useState } from 'react'; import Usuario from '../../_interfaces/GUsuarioInterface'; import GUsuarioSave from '../../_services/g_usuario/GUsuarioSave'; -import { useResponse } from '@/app/_response/ResponseContext'; +import { useResponse } from '@/shared/components/response/ResponseContext'; export const useGUsuarioSaveHook = () => { const { setResponse } = useResponse(); diff --git a/src/app/(protected)/(administrativo)/_services/g_usuario/GUsuarioLogin.ts b/src/app/(protected)/(administrativo)/_services/g_usuario/GUsuarioLogin.ts index 64f1f5e..bff9520 100644 --- a/src/app/(protected)/(administrativo)/_services/g_usuario/GUsuarioLogin.ts +++ b/src/app/(protected)/(administrativo)/_services/g_usuario/GUsuarioLogin.ts @@ -30,5 +30,5 @@ export default async function GUsuarioLoginService(form: any) { }); // Redireciona para a págian desejada - redirect('/servicos'); + redirect('/'); } diff --git a/src/app/(protected)/(administrativo)/_services/g_usuario/GUsuarioRead.ts b/src/app/(protected)/(administrativo)/_services/g_usuario/GUsuarioRead.ts index 9682891..4910655 100644 --- a/src/app/(protected)/(administrativo)/_services/g_usuario/GUsuarioRead.ts +++ b/src/app/(protected)/(administrativo)/_services/g_usuario/GUsuarioRead.ts @@ -11,12 +11,6 @@ export default async function GUsuarioRead(usuarioId: number) { }; } - try { - const response = await GUsuarioReadData(usuarioId); - console.log('service', response); - return response; - } catch (error) { - console.log(error); - return error; - } + const response = await GUsuarioReadData(usuarioId); + return response; } diff --git a/src/app/(protected)/(administrativo)/administrativo/imoveis/rurais/page.tsx b/src/app/(protected)/(administrativo)/administrativo/imoveis/rurais/page.tsx new file mode 100644 index 0000000..155e76a --- /dev/null +++ b/src/app/(protected)/(administrativo)/administrativo/imoveis/rurais/page.tsx @@ -0,0 +1,13 @@ +'use client'; + +import TImovelIndex from "@/packages/administrativo/components/TImovel/TImovelIndex"; + +export default function TImovelRuralPage() { + return ( + + ); +} diff --git a/src/app/(protected)/(administrativo)/administrativo/imoveis/urbanos/page.tsx b/src/app/(protected)/(administrativo)/administrativo/imoveis/urbanos/page.tsx new file mode 100644 index 0000000..d2ed097 --- /dev/null +++ b/src/app/(protected)/(administrativo)/administrativo/imoveis/urbanos/page.tsx @@ -0,0 +1,13 @@ +'use client'; + +import TImovelIndex from "@/packages/administrativo/components/TImovel/TImovelIndex"; + +export default function TImovelUrbanoPage() { + return ( + + ); +} \ No newline at end of file diff --git a/src/app/(protected)/(administrativo)/administrativo/pessoas/fisicas/page.tsx b/src/app/(protected)/(administrativo)/administrativo/pessoas/fisicas/page.tsx index 3e44744..e870828 100644 --- a/src/app/(protected)/(administrativo)/administrativo/pessoas/fisicas/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/pessoas/fisicas/page.tsx @@ -1,166 +1,9 @@ 'use client'; -import React, { useEffect, useState, useCallback } from 'react'; - -import Loading from '@/app/_components/loading/loading'; -import TPessoaTable from '@/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaTable'; -import TPessoaForm from '@/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaForm'; - -import { useTPessoaIndexHook } from '@/packages/administrativo/hooks/t_pessoa/useTPessoaIndexHook'; -import { useTPessoaSaveHook } from '@/packages/administrativo/hooks/t_pessoa/useTPessoaSaveHook'; -import { useTPessoaDeleteHook } from '@/packages/administrativo/hooks/t_pessoa/useTPessoaDeleteHook'; - -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; - -import TPessoaInterface from '@/packages/administrativo/interfaces/TPessoa/TPessoaInterface'; -import Header from '@/app/_components/structure/Header'; +import TPessoaFisicaIndex from '@/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaIndex'; export default function TPessoaFisica() { - // Controle de estado do botão - const [buttonIsLoading, setButtonIsLoading] = useState(false); - - // Hooks para leitura e salvamento - const { tPessoa, fetchTPessoa } = useTPessoaIndexHook(); - const { saveTCensec } = useTPessoaSaveHook(); - const { deleteTCensec } = useTPessoaDeleteHook(); - - // Estados - const [selectedAndamento, setSelectedAndamento] = useState(null); - const [isFormOpen, setIsFormOpen] = useState(false); - - // Estado para saber qual item será deletado - const [itemToDelete, setItemToDelete] = useState(null); - - /** - * Hook do modal de confirmação - */ - const { - isOpen: isConfirmOpen, - openDialog: openConfirmDialog, - handleConfirm, - handleCancel, - } = useConfirmDialog(); - - /** - * Abre o formulário no modo de edição ou criação - */ - const handleOpenForm = useCallback((data: TPessoaInterface | null) => { - setSelectedAndamento(data); - setIsFormOpen(true); - }, []); - - /** - * Fecha o formulário e limpa o andamento selecionado - */ - const handleCloseForm = useCallback(() => { - setSelectedAndamento(null); - setIsFormOpen(false); - }, []); - - /** - * Salva os dados do formulário - */ - const handleSave = useCallback( - async (formData: TPessoaInterface) => { - // Coloca o botão em estado de loading - setButtonIsLoading(true); - - // Aguarda salvar o registro - await saveTCensec(formData); - - // Remove o botão em estado de loading - setButtonIsLoading(false); - - // Atualiza a lista de dados - fetchTPessoa(); - }, - [saveTCensec, fetchTPessoa, handleCloseForm], - ); - - /** - * Quando o usuário clica em "remover" na tabela - */ - const handleConfirmDelete = useCallback( - (item: TPessoaInterface) => { - // Define o item atual para remoção - setItemToDelete(item); - - // Abre o modal de confirmação - openConfirmDialog(); - }, - [openConfirmDialog], - ); - - /** - * Executa a exclusão de fato quando o usuário confirma - */ - const handleDelete = useCallback(async () => { - // Protege contra null - if (!itemToDelete) return; - - // Executa o Hook de remoção - await deleteTCensec(itemToDelete); - - // Atualiza a lista - await fetchTPessoa(); - - // Limpa o item selecionado - setItemToDelete(null); - - // Fecha o modal - handleCancel(); - }, [itemToDelete, fetchTPessoa, handleCancel]); - - /** - * Busca inicial dos dados - */ - useEffect(() => { - fetchTPessoa(); - }, []); - - /** - * Tela de loading enquanto carrega os dados - */ - if (tPessoa.length == 0) { - return ; - } - return ( -
- {/* Cabeçalho */} -
{ - handleOpenForm(null); - }} - /> - - {/* Tabela de Registros */} - - - {/* Modal de confirmação */} - - - {/* Formulário de criação/edição */} - -
+ ); } diff --git a/src/app/(protected)/(administrativo)/administrativo/pessoas/juridicas/page.tsx b/src/app/(protected)/(administrativo)/administrativo/pessoas/juridicas/page.tsx index f2486f3..d3a0eb3 100644 --- a/src/app/(protected)/(administrativo)/administrativo/pessoas/juridicas/page.tsx +++ b/src/app/(protected)/(administrativo)/administrativo/pessoas/juridicas/page.tsx @@ -1,166 +1,10 @@ 'use client'; -import React, { useEffect, useState, useCallback } from 'react'; - -import Loading from '@/app/_components/loading/loading'; - -import { useTPessoaSaveHook } from '@/packages/administrativo/hooks/t_pessoa/useTPessoaSaveHook'; -import { useTPessoaDeleteHook } from '@/packages/administrativo/hooks/t_pessoa/useTPessoaDeleteHook'; - -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; - -import TPessoaInterface from '@/packages/administrativo/interfaces/TPessoa/TPessoaInterface'; -import Header from '@/app/_components/structure/Header'; -import TPessoaJuridicaTable from '@/packages/administrativo/components/TPessoa/TPessoaJuridica/TPessoaJuridicaTable'; -import { useTPessoaJuridicaIndexHook } from '@/packages/administrativo/hooks/t_pessoa/juridica/useTPessoaJuridicaIndexHook'; -import TPessoaJuridicaForm from '@/packages/administrativo/components/TPessoa/TPessoaJuridica/TPessoaJuridicaForm'; +import TPessoaJuridicaIndex from '@/packages/administrativo/components/TPessoa/TPessoaJuridica/TPessoaJuridicaIndex'; export default function TPessoaFisica() { - // Controle de estado do botão - const [buttonIsLoading, setButtonIsLoading] = useState(false); - - // Hooks para leitura e salvamento - const { tPessoa, fetchTPessoa } = useTPessoaJuridicaIndexHook(); - const { saveTCensec } = useTPessoaSaveHook(); - const { deleteTCensec } = useTPessoaDeleteHook(); - - // Estados - const [selectedAndamento, setSelectedAndamento] = useState(null); - const [isFormOpen, setIsFormOpen] = useState(false); - - // Estado para saber qual item será deletado - const [itemToDelete, setItemToDelete] = useState(null); - - /** - * Hook do modal de confirmação - */ - const { - isOpen: isConfirmOpen, - openDialog: openConfirmDialog, - handleConfirm, - handleCancel, - } = useConfirmDialog(); - - /** - * Abre o formulário no modo de edição ou criação - */ - const handleOpenForm = useCallback((data: TPessoaInterface | null) => { - setSelectedAndamento(data); - setIsFormOpen(true); - }, []); - - /** - * Fecha o formulário e limpa o andamento selecionado - */ - const handleCloseForm = useCallback(() => { - setSelectedAndamento(null); - setIsFormOpen(false); - }, []); - - /** - * Salva os dados do formulário - */ - const handleSave = useCallback( - async (formData: TPessoaInterface) => { - // Coloca o botão em estado de loading - setButtonIsLoading(true); - - // Aguarda salvar o registro - await saveTCensec(formData); - - // Remove o botão em estado de loading - setButtonIsLoading(false); - - // Atualiza a lista de dados - fetchTPessoa(); - }, - [saveTCensec, fetchTPessoa, handleCloseForm], - ); - - /** - * Quando o usuário clica em "remover" na tabela - */ - const handleConfirmDelete = useCallback( - (item: TPessoaInterface) => { - // Define o item atual para remoção - setItemToDelete(item); - - // Abre o modal de confirmação - openConfirmDialog(); - }, - [openConfirmDialog], - ); - - /** - * Executa a exclusão de fato quando o usuário confirma - */ - const handleDelete = useCallback(async () => { - // Protege contra null - if (!itemToDelete) return; - - // Executa o Hook de remoção - await deleteTCensec(itemToDelete); - - // Atualiza a lista - await fetchTPessoa(); - - // Limpa o item selecionado - setItemToDelete(null); - - // Fecha o modal - handleCancel(); - }, [itemToDelete, fetchTPessoa, handleCancel]); - - /** - * Busca inicial dos dados - */ - useEffect(() => { - fetchTPessoa(); - }, []); - - /** - * Tela de loading enquanto carrega os dados - */ - if (tPessoa.length == 0) { - return ; - } return ( -
- {/* Cabeçalho */} -
{ - handleOpenForm(null); - }} - /> - - {/* Tabela de Registros */} - - - {/* Modal de confirmação */} - - - {/* Formulário de criação/edição */} - -
+ ); } 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 cd890e7..22c02b2 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(g_cidade)/cidades/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(g_cidade)/cidades/page.tsx @@ -3,7 +3,7 @@ import { useEffect, useState, useCallback } from 'react'; import { Card, CardContent } from '@/components/ui/card'; -import Loading from '@/app/_components/loading/loading'; +import Loading from '@/shared/components/loading/loading'; import GCidadeTable from '../../_components/g_cidade/GCidadeTable'; import GCidadeForm from '../../_components/g_cidade/GCidadeForm'; @@ -11,11 +11,11 @@ import { useGCidadeReadHook } from '../../_hooks/g_cidade/useGCidadeReadHook'; import { useGCidadeSaveHook } from '../../_hooks/g_cidade/useGCidadeSaveHook'; import { useGCidadeRemoveHook } from '../../_hooks/g_cidade/useGCidadeRemoveHook'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; import GCidadeInterface from '../../_interfaces/GCidadeInterface'; -import Header from '@/app/_components/structure/Header'; +import Header from '@/shared/components/structure/Header'; export default function GCidadePage() { // Hooks para leitura e salvamento diff --git a/src/app/(protected)/(cadastros)/cadastros/(g_medidatipo)/medida-tipo/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(g_medidatipo)/medida-tipo/page.tsx index fe193f0..071daec 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(g_medidatipo)/medida-tipo/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(g_medidatipo)/medida-tipo/page.tsx @@ -2,12 +2,12 @@ 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 { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; +import { useResponse } from '@/shared/components/response/ResponseContext'; -import Header from '@/app/_components/structure/Header'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import Loading from '@/app/_components/loading/loading'; +import Header from '@/shared/components/structure/Header'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import Loading from '@/shared/components/loading/loading'; import GMedidaTipoTable from '../../_components/g_medidatipo/GMedidaTipoTable'; import GMedidaTipoForm from '../../_components/g_medidatipo/GMedidaTipoForm'; @@ -16,7 +16,7 @@ import { useGMedidaTipoSaveHook } from '../../_hooks/g_medidatipo/useGMedidaTipo import { useGMedidaTipoRemoveHook } from '../../_hooks/g_medidatipo/useGMedidaTipoRemoveHook'; import { GMedidaTipoInterface } from '../../_interfaces/GMedidaTipoInterface'; -import { SituacoesEnum } from '@/enums/SituacoesEnum'; +import { SituacoesEnum } from '@/shared/enums/SituacoesEnum'; const initialMedidaTipo: GMedidaTipoInterface = { medida_tipo_id: 0, 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 bb662a8..9fb2583 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 @@ -2,12 +2,12 @@ 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 { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; +import { useResponse } from '@/shared/components/response/ResponseContext'; -import Header from '@/app/_components/structure/Header'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import Loading from '@/app/_components/loading/loading'; +import Header from '@/shared/components/structure/Header'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import Loading from '@/shared/components/loading/loading'; import GTBBairroTable from '../../_components/g_tb_bairro/GTBBairroTable'; import GTBBairroForm from '../../_components/g_tb_bairro/GTBBairroForm'; @@ -16,7 +16,7 @@ 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'; +import { SituacoesEnum } from '@/shared/enums/SituacoesEnum'; const initialBairro: GTBBairroInterface = { sistema_id: null, 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 index 1e635a7..da1bc9c 100644 --- 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 @@ -2,11 +2,11 @@ import { useEffect, useState, useCallback } from 'react'; import { Card, CardContent } from '@/components/ui/card'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; -import Header from '@/app/_components/structure/Header'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import Loading from '@/app/_components/loading/loading'; +import Header from '@/shared/components/structure/Header'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import Loading from '@/shared/components/loading/loading'; import GTBEstadoCivilTable from '../../_components/g_tb_estadocivil/GTBEstadoCivilTable'; import GTBEstadoCivilForm from '../../_components/g_tb_estadocivil/GTBEstadoCivilForm'; @@ -15,7 +15,7 @@ import { useGTBEstadoCivilSaveHook } from '../../_hooks/g_tb_estadocivil/useGTBE import { useGTBEstadoCivilRemoveHook } from '../../_hooks/g_tb_estadocivil/useGTBEstadoCivilRemoveHook'; import { GTBEstadoCivilInterface } from '../../_interfaces/GTBEstadoCivilInterface'; -import { useResponse } from '@/app/_response/ResponseContext'; +import { useResponse } from '@/shared/components/response/ResponseContext'; const initalEstadoCivil: GTBEstadoCivilInterface = { tb_estadocivil_id: 0, diff --git a/src/app/(protected)/(cadastros)/cadastros/(g_tb_profissao)/profissoes/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(g_tb_profissao)/profissoes/page.tsx index 3e8efe1..c19269c 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(g_tb_profissao)/profissoes/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(g_tb_profissao)/profissoes/page.tsx @@ -3,7 +3,7 @@ import { useEffect, useState, useCallback } from 'react'; import { Card, CardContent } from '@/components/ui/card'; -import Loading from '@/app/_components/loading/loading'; +import Loading from '@/shared/components/loading/loading'; import GTBProfissaoTable from '../../_components/g_tb_profissao/GTBProfissaoTable'; import GTBProfissaoForm from '../../_components/g_tb_profissao/GTBProfissaoForm'; @@ -11,11 +11,11 @@ import { useGTBProfissaoReadHook } from '../../_hooks/g_tb_profissao/useGTBProfi import { useGTBProfissaoSaveHook } from '../../_hooks/g_tb_profissao/useGTBProfissaoSaveHook'; import { useGTBProfissaoRemoveHook } from '../../_hooks/g_tb_profissao/useGTBProfissaoRemoveHook'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; import GTBProfissaoInterface from '../../_interfaces/GTBProfissaoInterface'; -import Header from '@/app/_components/structure/Header'; +import Header from '@/shared/components/structure/Header'; export default function TTBAndamentoServico() { // Hooks para leitura e salvamento diff --git a/src/app/(protected)/(cadastros)/cadastros/(g_tb_regimebens)/regime-bens/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(g_tb_regimebens)/regime-bens/page.tsx index dfc472f..10c36f7 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(g_tb_regimebens)/regime-bens/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(g_tb_regimebens)/regime-bens/page.tsx @@ -3,7 +3,7 @@ import { useEffect, useState, useCallback } from 'react'; import { Card, CardContent } from '@/components/ui/card'; -import Loading from '@/app/_components/loading/loading'; +import Loading from '@/shared/components/loading/loading'; import GTBRegimeBensTable from '../../_components/g_tb_regimebens/GTBRegimeBensTable'; import GTBRegimeBensForm from '../../_components/g_tb_regimebens/GTBRegimeBensForm'; @@ -11,11 +11,11 @@ import { useGTBRegimeBensReadHook } from '../../_hooks/g_tb_regimebens/useGTBReg import { useGTBRegimeBensSaveHook } from '../../_hooks/g_tb_regimebens/useGTBRegimeBensSaveHook'; import { useGTBRegimeBensRemoveHook } from '../../_hooks/g_tb_regimebens/useGTBRegimeBensRemoveHook'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; import GTBRegimeBensInterface from '../../_interfaces/GTBRegimeBensInterface'; -import Header from '@/app/_components/structure/Header'; +import Header from '@/shared/components/structure/Header'; export default function TTBAndamentoServico() { // Hooks para leitura e salvamento diff --git a/src/app/(protected)/(cadastros)/cadastros/(g_tb_regimecomunhao)/regime-comunhao/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(g_tb_regimecomunhao)/regime-comunhao/page.tsx index 626615d..5de6c1c 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(g_tb_regimecomunhao)/regime-comunhao/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(g_tb_regimecomunhao)/regime-comunhao/page.tsx @@ -3,7 +3,7 @@ import { useEffect, useState, useCallback } from 'react'; import { Card, CardContent } from '@/components/ui/card'; -import Loading from '@/app/_components/loading/loading'; +import Loading from '@/shared/components/loading/loading'; import GTBRegimeComunhaoTable from '../../_components/g_tb_regimecomunhao/GTBRegimeComunhaoTable'; import GTBRegimeComunhaoForm from '../../_components/g_tb_regimecomunhao/GTBRegimeComunhaoForm'; @@ -11,11 +11,11 @@ import { useGTBRegimeComunhaoReadHook } from '../../_hooks/g_tb_regimecomunhao/u import { useGTBRegimeComunhaoSaveHook } from '../../_hooks/g_tb_regimecomunhao/useGTBRegimeComunhaoSaveHook'; import { useGTBRegimeComunhaoRemoveHook } from '../../_hooks/g_tb_regimecomunhao/useGTBRegimeComunhaoRemoveHook'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; import GTBRegimeComunhaoInterface from '../../_interfaces/GTBRegimeComunhaoInterface'; -import Header from '@/app/_components/structure/Header'; +import Header from '@/shared/components/structure/Header'; export default function TTBAndamentoServico() { // Hooks para leitura e salvamento diff --git a/src/app/(protected)/(cadastros)/cadastros/(g_tb_tipologradouro)/tipo-logradouro/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(g_tb_tipologradouro)/tipo-logradouro/page.tsx index 023c5a4..8a198b4 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(g_tb_tipologradouro)/tipo-logradouro/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(g_tb_tipologradouro)/tipo-logradouro/page.tsx @@ -2,11 +2,11 @@ import { useEffect, useState, useCallback } from 'react'; import { Card, CardContent } from '@/components/ui/card'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; -import Header from '@/app/_components/structure/Header'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import Loading from '@/app/_components/loading/loading'; +import Header from '@/shared/components/structure/Header'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import Loading from '@/shared/components/loading/loading'; import GTBTipoLogradouroTable from '../../_components/g_tb_tipologradouro/GTBTipoLogradouroTable'; import GTBTipoLogradouroForm from '../../_components/g_tb_tipologradouro/GTBTipoLogradouroForm'; @@ -16,7 +16,7 @@ import { useGTBTipoLogradouroRemoveHook } from '../../_hooks/g_tb_tipologradouro import { GTBTipoLogradouroInterface } from '../../_interfaces/GTBTipoLogradouroInterface'; -import { useResponse } from '@/app/_response/ResponseContext'; +import { useResponse } from '@/shared/components/response/ResponseContext'; export default function TTBAndamentoServico() { // Controle de exibição de respostas diff --git a/src/app/(protected)/(cadastros)/cadastros/(t_censec)/censec/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(t_censec)/censec/page.tsx index ffceb27..e9235b8 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(t_censec)/censec/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(t_censec)/censec/page.tsx @@ -3,7 +3,7 @@ import { useEffect, useState, useCallback } from 'react'; import { Card, CardContent } from '@/components/ui/card'; -import Loading from '@/app/_components/loading/loading'; +import Loading from '@/shared/components/loading/loading'; import TCensecTable from '../../_components/t_censec/TCensecTable'; import TCensecForm from '../../_components/t_censec/TCensecForm'; @@ -11,11 +11,11 @@ import { useTCensecReadHook } from '../../_hooks/t_censec/useTCensecReadHook'; import { useTCensecSaveHook } from '../../_hooks/t_censec/useTCensecSaveHook'; import { useTCensecDeleteHook } from '../../_hooks/t_censec/useTCensecDeleteHook'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; import TCensecInterface from '../../_interfaces/TCensecInterface'; -import Header from '@/app/_components/structure/Header'; +import Header from '@/shared/components/structure/Header'; export default function TTBAndamentoServico() { // Controle de estado do botão diff --git a/src/app/(protected)/(cadastros)/cadastros/(t_censec_tipoato)/censec-tipoato/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(t_censec_tipoato)/censec-tipoato/page.tsx index 3b20226..92f62af 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(t_censec_tipoato)/censec-tipoato/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(t_censec_tipoato)/censec-tipoato/page.tsx @@ -2,11 +2,11 @@ import { useEffect, useState, useCallback } from "react"; import { Card, CardContent } from "@/components/ui/card"; -import { useConfirmDialog } from "@/app/_components/confirm_dialog/useConfirmDialog"; +import { useConfirmDialog } from "@/shared/components/confirmDialog/useConfirmDialog"; -import Header from "@/app/_components/structure/Header"; -import ConfirmDialog from "@/app/_components/confirm_dialog/ConfirmDialog"; -import Loading from "@/app/_components/loading/loading"; +import Header from "@/shared/components/structure/Header"; +import ConfirmDialog from "@/shared/components/confirmDialog/ConfirmDialog"; +import Loading from "@/shared/components/loading/loading"; import TCensecTipoAtoTable from "../../_components/t_censec_tipoato/TCensecTipoAtoTable"; import TCensecTipoAtoForm from "../../_components/t_censec_tipoato/TCensecTipoAtoForm"; @@ -17,6 +17,7 @@ import { useTCensecTipoAtoRemoveHook } from "../../_hooks/t_censec_tipoato/useTC import { useTCensecReadHook } from "../../_hooks/t_censec/useTCensecReadHook"; import { TCensecTipoAtoInterface } from "../../_interfaces/TCensecTipoAtoInterface"; +import { SituacoesEnum } from "@/shared/enums/SituacoesEnum"; // Estado inicial para criação const initialTCensecTipoAto: TCensecTipoAtoInterface = { @@ -24,7 +25,7 @@ const initialTCensecTipoAto: TCensecTipoAtoInterface = { censec_id: 0, codigo: null, descricao: "", - situacao: "A", + situacao: SituacoesEnum.A, tipo_separacao: null, tipo_revogacao: null, }; @@ -37,6 +38,8 @@ export default function TCensecTipoAtoPage() { const { tCensec, fetchTCensec } = useTCensecReadHook() + const [buttonIsLoading, setButtonIsLoading] = useState(false); + // Estado para controle do form e item selecionado const [selectedItem, setSelectedItem] = useState(null); const [isFormOpen, setIsFormOpen] = useState(false); @@ -141,6 +144,7 @@ export default function TCensecTipoAtoPage() { tCensec={tCensec} onClose={handleCloseForm} onSave={handleSave} + buttonIsLoading={buttonIsLoading} /> ); diff --git a/src/app/(protected)/(cadastros)/cadastros/(t_censecnaturezalitigio)/censec-natureza-litigio/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(t_censecnaturezalitigio)/censec-natureza-litigio/page.tsx index 147b5b5..0e8b588 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(t_censecnaturezalitigio)/censec-natureza-litigio/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(t_censecnaturezalitigio)/censec-natureza-litigio/page.tsx @@ -2,12 +2,12 @@ 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 { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; +import { useResponse } from '@/shared/components/response/ResponseContext'; -import Header from '@/app/_components/structure/Header'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import Loading from '@/app/_components/loading/loading'; +import Header from '@/shared/components/structure/Header'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import Loading from '@/shared/components/loading/loading'; import TCensecNaturezaLitigioTable from '../../_components/t_censecnaturezalitigio/TCensecNaturezaLitigioTable'; import TCensecNaturezaLitigioForm from '../../_components/t_censecnaturezalitigio/TCensecNaturezaLitigioForm'; @@ -17,7 +17,7 @@ import { useTCensecNaturezaLitigioSaveHook } from '../../_hooks/t_censecnatureza import { useTCensecNaturezaLitigioRemoveHook } from '../../_hooks/t_censecnaturezalitigio/useTCensecNaturezaLitigioRemoveHook'; import { TCensecNaturezaLitigioInterface } from '../../_interfaces/TCensecNaturezaLitigioInterface'; -import { SituacoesEnum } from '@/enums/SituacoesEnum'; +import { SituacoesEnum } from '@/shared/enums/SituacoesEnum'; const initialCensecNaturezaLitigio: TCensecNaturezaLitigioInterface = { censec_naturezalitigio_id: 0, diff --git a/src/app/(protected)/(cadastros)/cadastros/(t_minuta)/minuta/[id]/detalhes/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(t_minuta)/minuta/[id]/detalhes/page.tsx index 08b35d7..108127f 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(t_minuta)/minuta/[id]/detalhes/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(t_minuta)/minuta/[id]/detalhes/page.tsx @@ -6,7 +6,7 @@ import { useParams } from 'next/navigation'; import { Card, CardContent } from '@/components/ui/card'; import MainEditor from '@/components/MainEditor'; -import Loading from '@/app/_components/loading/loading'; +import Loading from '@/shared/components/loading/loading'; import { useTMinutaReadHook } from '../../../../_hooks/t_minuta/useTMinutaReadHook'; import { TMinutaInterface } from '../../../../_interfaces/TMinutaInterface'; diff --git a/src/app/(protected)/(cadastros)/cadastros/(t_minuta)/minuta/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(t_minuta)/minuta/page.tsx index 96a2818..b2f2b32 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(t_minuta)/minuta/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(t_minuta)/minuta/page.tsx @@ -2,11 +2,11 @@ import { useEffect, useState, useCallback } from 'react'; import { Card, CardContent } from '@/components/ui/card'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; -import Header from '@/app/_components/structure/Header'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import Loading from '@/app/_components/loading/loading'; +import Header from '@/shared/components/structure/Header'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import Loading from '@/shared/components/loading/loading'; import TMinutaTable from '../../_components/t_minuta/TMinutaTable'; import TMinutaForm from '../../_components/t_minuta/TMinutaForm'; 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 ade341d..8ac3997 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 @@ -3,19 +3,19 @@ import { useEffect, useState, useCallback } from 'react'; import { Card, CardContent } from '@/components/ui/card'; -import Loading from '@/app/_components/loading/loading'; +import Loading from '@/shared/components/loading/loading'; import TTBAndamentoServicoTable from '../../_components/t_tb_andamentoservico/TTBAndamentoServicoTable'; import TTBAndamentoServicoForm from '../../_components/t_tb_andamentoservico/TTBAndamentoServicoForm'; import { useTTBAndamentoServicoReadHook } from '../../_hooks/t_tb_andamentoservico/useTTBAndamentoServicoReadHook'; import { useTTBAndamentoServicoSaveHook } from '../../_hooks/t_tb_andamentoservico/useTTBAndamentoServicoSaveHook'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; import TTBAndamentoServicoInterface from '../../_interfaces/TTBAndamentoServicoInterface'; import { useTTBAndamentoServicoDeleteHook } from '../../_hooks/t_tb_andamentoservico/useTTBAndamentoServicoDeleteHook'; -import Header from '@/app/_components/structure/Header'; +import Header from '@/shared/components/structure/Header'; export default function TTBAndamentoServico() { // Hooks para leitura e salvamento diff --git a/src/app/(protected)/(cadastros)/cadastros/(t_tb_reconhecimentotipo)/reconhecimentos/page.tsx b/src/app/(protected)/(cadastros)/cadastros/(t_tb_reconhecimentotipo)/reconhecimentos/page.tsx index e6683f7..79581d6 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(t_tb_reconhecimentotipo)/reconhecimentos/page.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/(t_tb_reconhecimentotipo)/reconhecimentos/page.tsx @@ -3,8 +3,8 @@ import { useEffect, useState, useCallback } from 'react'; import { Card, CardContent } from '@/components/ui/card'; -import Loading from '@/app/_components/loading/loading'; -import Header from '@/app/_components/structure/Header'; +import Loading from '@/shared/components/loading/loading'; +import Header from '@/shared/components/structure/Header'; import TTBReconhecimentoTipoTable from '../../_components/t_tb_reconhecimentotipo/TTBReconhecimentoTipoTable'; import TTBReconhecimentoTipoForm from '../../_components/t_tb_reconhecimentotipo/TTBReconhecimentoTipoForm'; @@ -12,8 +12,8 @@ import { useTTBReconhecimentoTipoReadHook } from '../../_hooks/t_tb_reconhecimen import { useTTBReconhecimentoTipoSaveHook } from '../../_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoSaveHook'; import { useTTBReconhecimentoTipoDeleteHook } from '../../_hooks/t_tb_reconhecimentotipo/useTTBReconhecimentoTipoDeleteHook'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; import TTBReconhecimentoTipoInterface from '../../_interfaces/TTBReconhecimentoTipoInterface'; @@ -80,7 +80,7 @@ export default function TTBAndamentoServico() { // Define o item atual para remoção setItemToDelete(item); - // Abre o modal de confirmação + // Abre o modal de exclusão openConfirmDialog(); }, [openConfirmDialog], diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/g_medidatipo/GMedidaTipoForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/g_medidatipo/GMedidaTipoForm.tsx index 38b28cd..5d7b2ac 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/g_medidatipo/GMedidaTipoForm.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/g_medidatipo/GMedidaTipoForm.tsx @@ -24,7 +24,7 @@ import { FormMessage, } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; -import LoadingButton from '@/app/_components/loadingButton/LoadingButton'; +import LoadingButton from '@/shared/components/loadingButton/LoadingButton'; import { GMedidaTipoSchema } from '../../_schemas/GMedidaTipoSchema'; import { GMedidaTipoInterface } from '../../_interfaces/GMedidaTipoInterface'; 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 d88f690..7c11262 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 @@ -28,8 +28,8 @@ import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { GTBBairroSchema } from '../../_schemas/GTBBairroSchema'; -import LoadingButton from '@/app/_components/loadingButton/LoadingButton'; -import { SituacoesEnum } from '@/enums/SituacoesEnum'; +import LoadingButton from '@/shared/components/loadingButton/LoadingButton'; +import { SituacoesEnum } from '@/shared/enums/SituacoesEnum'; type FormValues = z.infer; 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 index 038c4a7..50c9723 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_estadocivil/GTBEstadoCivilForm.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_estadocivil/GTBEstadoCivilForm.tsx @@ -5,7 +5,7 @@ import { useEffect } from 'react'; import { useForm, Controller } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; -import LoadingButton from '@/app/_components/loadingButton/LoadingButton'; +import LoadingButton from '@/shared/components/loadingButton/LoadingButton'; import { Button } from '@/components/ui/button'; import { Checkbox } from '@/components/ui/checkbox'; import { diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_tipologradouro/GTBTipoLogradouroForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_tipologradouro/GTBTipoLogradouroForm.tsx index 83dba7d..08ba132 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_tipologradouro/GTBTipoLogradouroForm.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/g_tb_tipologradouro/GTBTipoLogradouroForm.tsx @@ -27,7 +27,7 @@ import { import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; -import LoadingButton from '@/app/_components/loadingButton/LoadingButton'; +import LoadingButton from '@/shared/components/loadingButton/LoadingButton'; import { GTBTipoLogradouroSchema } from '../../_schemas/GTBTipoLogradouroSchema'; import { GTBTipoLogradouroInterface } from '../../_interfaces/GTBTipoLogradouroInterface'; diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/t_censec/TCensecForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/t_censec/TCensecForm.tsx index 740e380..28bee9c 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/t_censec/TCensecForm.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/t_censec/TCensecForm.tsx @@ -28,8 +28,8 @@ import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { TCensecSchema } from '../../_schemas/TCensecSchema'; -import { SituacoesEnum } from '@/enums/SituacoesEnum'; -import LoadingButton from '@/app/_components/loadingButton/LoadingButton'; +import { SituacoesEnum } from '@/shared/enums/SituacoesEnum'; +import LoadingButton from '@/shared/components/loadingButton/LoadingButton'; type FormValues = z.infer; diff --git a/src/app/(protected)/(cadastros)/cadastros/_components/t_censec_tipoato/TCensecTipoAtoForm.tsx b/src/app/(protected)/(cadastros)/cadastros/_components/t_censec_tipoato/TCensecTipoAtoForm.tsx index 38e9b3a..b528fa1 100644 --- a/src/app/(protected)/(cadastros)/cadastros/_components/t_censec_tipoato/TCensecTipoAtoForm.tsx +++ b/src/app/(protected)/(cadastros)/cadastros/_components/t_censec_tipoato/TCensecTipoAtoForm.tsx @@ -5,6 +5,7 @@ import { useEffect } from "react"; import { useForm, Controller } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { Checkbox } from "@/components/ui/checkbox"; +import LoadingButton from "@/shared/components/loadingButton/LoadingButton"; import { Button } from "@/components/ui/button"; import { Dialog, @@ -29,6 +30,7 @@ import { Label } from "@/components/ui/label"; import { TCensecTipoAtoSchema } from "../../_schemas/TCensecTipoAtoSchema"; import { TCensecTipoAtoInterface } from "../../_interfaces/TCensecTipoAtoInterface"; import TCensecInterface from "../../_interfaces/TCensecInterface"; +import { SituacoesEnum } from "@/shared/enums/SituacoesEnum"; type FormValues = z.infer; @@ -38,6 +40,7 @@ interface TCensecTipoAtoFormProps { tCensec: TCensecInterface[]; onClose: (item: null, isFormStatus: boolean) => void; onSave: (data: FormValues) => void; + buttonIsLoading: boolean; } export default function TCensecTipoAtoForm({ @@ -46,6 +49,7 @@ export default function TCensecTipoAtoForm({ tCensec, onClose, onSave, + buttonIsLoading }: TCensecTipoAtoFormProps) { // react-hook-form com schema Zod const form = useForm({ @@ -55,7 +59,7 @@ export default function TCensecTipoAtoForm({ censec_id: 0, codigo: null, descricao: "", - situacao: "A", + situacao: SituacoesEnum.A, tipo_separacao: null, tipo_revogacao: null, }, @@ -105,17 +109,17 @@ export default function TCensecTipoAtoForm({ name="censec_id" render={({ field }) => ( - Censec + Central do Censec ) { 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive', className, )} + value={value ?? ''} {...props} /> ); diff --git a/src/components/ui/sidebar.tsx b/src/components/ui/sidebar.tsx index d3d8082..d4dc14f 100644 --- a/src/components/ui/sidebar.tsx +++ b/src/components/ui/sidebar.tsx @@ -548,7 +548,7 @@ function SidebarMenuAction({ 'peer-data-[size=lg]/menu-button:top-2.5', 'group-data-[collapsible=icon]:hidden', showOnHover && - 'peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0', + 'peer-data-[active=true]/menu-button:text-sidebar-accent-foreground group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 md:opacity-0', className, )} {...props} diff --git a/src/packages/administrativo/components/GTBBairro/GTBBairroSelect.tsx b/src/packages/administrativo/components/GTBBairro/GTBBairroSelect.tsx new file mode 100644 index 0000000..adfdb6c --- /dev/null +++ b/src/packages/administrativo/components/GTBBairro/GTBBairroSelect.tsx @@ -0,0 +1,114 @@ +'use client'; + +import React, { useState, useEffect, useCallback, useMemo } from 'react'; +import { Button } from '@/components/ui/button'; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from '@/components/ui/command'; +import { FormControl } from '@/components/ui/form'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { cn } from '@/lib/utils'; +import { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; +import GetCapitalize from '@/shared/actions/text/GetCapitalize'; +import { useGTBBairroReadHook } from '@/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_bairro/useGTBBairroReadHook'; +import GTBairroSelectInterface from './GTBairroSelectInterface'; + +export default function GTBBairroSelect({ field }: GTBairroSelectInterface) { + + const [open, setOpen] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const { gTBBairro = [], fetchGTBBairro } = useGTBBairroReadHook(); + + /** + * Efeito para buscar os dados apenas uma vez. + * useCallback evita recriação desnecessária da função. + */ + const loadData = useCallback(async () => { + if (gTBBairro.length) return; + setIsLoading(true); + await fetchGTBBairro(); + setIsLoading(false); + }, [gTBBairro.length, fetchGTBBairro]); + + useEffect(() => { + loadData(); + }, [loadData]); + + /** + * Memoriza o bairro selecionado para evitar reprocessamentos. + */ + const selected = useMemo( + () => gTBBairro.find((b) => String(b.tb_bairro_id) === String(field?.value ?? '')), + [gTBBairro, field?.value] + ); + + /** + * Manipulador de seleção com verificação segura. + */ + const handleSelect = useCallback( + (bairroId: string | number) => { + if (!field?.onChange) return; + field.onChange(bairroId); + setOpen(false); + }, + [field] + ); + + return ( + + + + + + + + + + + + + {isLoading ? 'Carregando...' : 'Nenhum resultado encontrado.'} + + + {gTBBairro.map((item) => ( + handleSelect(item.tb_bairro_id)} + > + + {GetCapitalize(item.descricao ?? '')} + + ))} + + + + + + ); +} diff --git a/src/packages/administrativo/components/GTBBairro/GTBairroSelectInterface.ts b/src/packages/administrativo/components/GTBBairro/GTBairroSelectInterface.ts new file mode 100644 index 0000000..e075046 --- /dev/null +++ b/src/packages/administrativo/components/GTBBairro/GTBairroSelectInterface.ts @@ -0,0 +1,6 @@ +export default interface GTBairroSelectInterface { + field?: { + value?: number | string; + onChange?: (value: string | number) => void; + }; +} \ No newline at end of file diff --git a/src/packages/administrativo/components/GUF/GUFSelec.tsx b/src/packages/administrativo/components/GUF/GUFSelec.tsx new file mode 100644 index 0000000..e69de29 diff --git a/src/packages/administrativo/components/t_imovel/TImovelColumns.tsx b/src/packages/administrativo/components/TImovel/TImovelColumns.tsx similarity index 86% rename from src/packages/administrativo/components/t_imovel/TImovelColumns.tsx rename to src/packages/administrativo/components/TImovel/TImovelColumns.tsx index f999aac..8a54278 100644 --- a/src/packages/administrativo/components/t_imovel/TImovelColumns.tsx +++ b/src/packages/administrativo/components/TImovel/TImovelColumns.tsx @@ -1,13 +1,13 @@ import { ColumnDef } from "@tanstack/react-table"; -import TImovelInterface from "../../interfaces/TImovelInterface"; +import TImovelInterface from "../../interfaces/TImovel/TImovelInterface"; import { Button } from "@/components/ui/button"; import { EllipsisIcon, PencilIcon, Trash2Icon, } from "lucide-react"; -import { FormatDateTime } from "@/actions/dateTime/FormatDateTime"; -import { FormatCEP } from "@/actions/CEP/FormatCEP"; +import { FormatDateTime } from "@/shared/actions/dateTime/FormatDateTime"; +import { FormatCEP } from "@/shared/actions/CEP/FormatCEP"; import { DropdownMenu, DropdownMenuContent, @@ -16,8 +16,9 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { ImovelTipoRegistro } from "@/enums/ImovelTipoRegistro"; -import { SortableHeader } from "@/app/_components/dataTable/SortableHeader"; +import { ImovelTipoRegistro } from "@/shared/enums/ImovelTipoRegistro"; +import { SortableHeader } from "@/shared/components/dataTable/SortableHeader"; +import GetCapitalize from "@/shared/actions/text/GetCapitalize"; export default function TImovelColumns( onEdit: (item: TImovelInterface, isEditingFormStatus: boolean) => void, @@ -59,16 +60,14 @@ export default function TImovelColumns( return (
- {imovel.cidade}/{imovel.uf} + {GetCapitalize(imovel.cidade)}/{imovel.uf} - {imovel.gtb_descricao} + {GetCapitalize(imovel.gtbb_descricao)}
); }, sortingFn: (a, b) => - (a.original.cartorio?.toLowerCase() || "").localeCompare( - b.original.cartorio?.toLowerCase() || "" - ), + Number(a.original.numero || 0) - Number(b.original.numero || 0), }, // CEP diff --git a/src/packages/administrativo/components/TImovel/TImovelForm.tsx b/src/packages/administrativo/components/TImovel/TImovelForm.tsx new file mode 100644 index 0000000..9cf1f8b --- /dev/null +++ b/src/packages/administrativo/components/TImovel/TImovelForm.tsx @@ -0,0 +1,282 @@ +'use client'; + +import React, { useEffect } from 'react'; + +import { Button } from '@/components/ui/button'; +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 LoadingButton from '@/shared/components/loadingButton/LoadingButton'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { HouseIcon, IdCardIcon } from 'lucide-react'; +import { ResetFormIfData } from '@/shared/actions/form/ResetFormIfData'; +import { TImovelFormInterface } from '../../interfaces/TImovel/TImovelFormInterface'; +import { useTImovelFormHook } from '../../hooks/TImovel/useTImovelFormHook'; +import TImovelUnidadeUrbanoPage from '../TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoIndex'; +import TImovelUnidadeRuralIndex from '../TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralIndex'; +import { parseNumberInput } from '@/shared/actions/form/parseNumberInput'; +import TImovelTipoRegistroSelect from './TImovelTipoRegistroSelect'; +import GTBBairroSelect from '../GTBBairro/GTBBairroSelect'; + +export default function TImovelForm({ isOpen, data, onClose, onSave, buttonIsLoading, tipoClasse }: TImovelFormInterface) { + + // Inicializa o react-hook-form com schema zod + const form = useTImovelFormHook({}); + + // Atualiza o formulário quando recebe dados para edição + useEffect(() => { + + // Se existir dados, reseta o formulário com os mesmos + ResetFormIfData(form, data); + + }, [data, form]); + + function onError(error: any) { + console.log(error); + } + + return ( + { + if (!open) onClose(null, false); + }} + > + + + + {tipoClasse === 1 ? 'Imóvel Urbano' : 'Imóvel Rural'} + + + {tipoClasse === 1 ? 'Cadastro de imóvel urbano' : 'Cadastro de imóvel rural'} + + + {/* Tabs */} + + + + + Dados do Imóvel + + {data?.imovel_id && ( + + + Unidades + + )} + + {/* Dados do Imóvel */} + +
+ +
+ {/* UF */} +
+ ( + + UF + + + + + + )} + /> +
+ {/* CEP */} +
+ ( + + CEP + + + + + + )} + /> +
+ {/* Cidade */} +
+ ( + + Cidade + + + + + + )} + /> +
+ {/* Bairro */} +
+ { + return ( + + Bairro + + + + ); + }} + /> +
+ {/* Cartório */} +
+ ( + + Cartório + + field.onChange(parseNumberInput(e))} /> + + + + )} + /> +
+ {/* CNS */} +
+ ( + + CNS + + field.onChange(parseNumberInput(e))} /> + + + + )} + /> +
+ {/* Livro */} +
+ ( + + Livro + + + + + + )} + /> +
+ {/* Tipo Registro */} +
+ ( + + Tipo Registro + + + + )} + /> +
+ {/* Número */} +
+ ( + + Número + + field.onChange(parseNumberInput(e))} /> + + + + )} + /> +
+ {/* Número Letra */} +
+ ( + + Número Letra + + + + + + )} + /> +
+
+ {/* Rodapé do Dialog */} + + + + + + +
+ +
+ {/* Unidades */} + {data?.imovel_id && ( + + {/* Imóvel Urbano */} + {tipoClasse === 1 && ( + + )} + {/* Imóvel Rural */} + {tipoClasse === 3 && ( + + )} + + )} +
+
+
+ ); +} \ No newline at end of file diff --git a/src/app/(protected)/(cadastros)/cadastros/(t_imovel)/imoveis/urbanos/page.tsx b/src/packages/administrativo/components/TImovel/TImovelIndex.tsx similarity index 67% rename from src/app/(protected)/(cadastros)/cadastros/(t_imovel)/imoveis/urbanos/page.tsx rename to src/packages/administrativo/components/TImovel/TImovelIndex.tsx index 52b4f0d..14cc04c 100644 --- a/src/app/(protected)/(cadastros)/cadastros/(t_imovel)/imoveis/urbanos/page.tsx +++ b/src/packages/administrativo/components/TImovel/TImovelIndex.tsx @@ -1,23 +1,29 @@ 'use client'; import { useEffect, useState, useCallback } from 'react'; -import { Card, CardContent } from '@/components/ui/card'; -import Loading from '@/app/_components/loading/loading'; -import TImovelTable from '@/packages/administrativo/components/t_imovel/TImovelTable'; -import TImovelForm from '@/packages/administrativo/components/t_imovel/TImovelForm'; +import Loading from '@/shared/components/loading/loading'; -import { useTImovelIndexHook } from '@/packages/administrativo/hooks/t_imovel/useTImovelIndexHook'; -import { useTImovelSaveHook } from '@/packages/administrativo/hooks/t_imovel/useTImovelSaveHook'; -import { useTImovelDeleteHook } from '@/packages/administrativo/hooks/t_imovel/useTImovelDeleteHook'; +import { useTImovelIndexHook } from '@/packages/administrativo/hooks/TImovel/useTImovelIndexHook'; +import { useTImovelSaveHook } from '@/packages/administrativo/hooks/TImovel/useTImovelSaveHook'; +import { useTImovelDeleteHook } from '@/packages/administrativo/hooks/TImovel/useTImovelDeleteHook'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; -import TImovelInterface from '@/packages/administrativo/interfaces/TImovelInterface'; -import Header from '@/app/_components/structure/Header'; +import TImovelInterface from '@/packages/administrativo/interfaces/TImovel/TImovelInterface'; +import Header from '@/shared/components/structure/Header'; +import { TImovelIndexInterface } from '../../interfaces/TImovel/TImovelIndexInterface'; +import TImovelTable from './TImovelTable'; +import TImovelForm from './TImovelForm'; +import { TImovelIndexDataInterface } from '../../interfaces/TImovel/TImovelIndexDataInterface'; + +export default function TImovelIndex({ pageTitle, pageDescription, tipoClasse }: TImovelIndexInterface) { + + const TImovelIndexDataInterface: TImovelIndexDataInterface = { + tipo_classe: tipoClasse + } -export default function TTBAndamentoServico() { // Controle de estado do botão const [buttonIsLoading, setButtonIsLoading] = useState(false); @@ -27,7 +33,7 @@ export default function TTBAndamentoServico() { const { deleteTImovel } = useTImovelDeleteHook(); // Estados - const [selectedAndamento, setSelectedAndamento] = useState(null); + const [selectedData, setSelectedData] = useState(null); const [isFormOpen, setIsFormOpen] = useState(false); // Estado para saber qual item será deletado @@ -47,7 +53,15 @@ export default function TTBAndamentoServico() { * Abre o formulário no modo de edição ou criação */ const handleOpenForm = useCallback((data: TImovelInterface | null) => { - setSelectedAndamento(data); + // Se não houver dados (criação), cria um objeto inicial com pessoa_tipo + const initialData: TImovelInterface = data ?? { tipo_classe: tipoClasse } as TImovelInterface; + + // Se existir dado de tipo_classe preenchido, converte para inteiro + if (initialData.tipo_classe !== undefined && initialData.tipo_classe !== null) { + initialData.tipo_classe = Number(initialData.tipo_classe); + } + + setSelectedData(initialData); setIsFormOpen(true); }, []); @@ -55,7 +69,7 @@ export default function TTBAndamentoServico() { * Fecha o formulário e limpa o andamento selecionado */ const handleCloseForm = useCallback(() => { - setSelectedAndamento(null); + setSelectedData(null); setIsFormOpen(false); }, []); @@ -74,7 +88,7 @@ export default function TTBAndamentoServico() { setButtonIsLoading(false); // Atualiza a lista de dados - indexTImovel(); + indexTImovel(TImovelIndexDataInterface); }, [saveTImovel, indexTImovel, handleCloseForm], ); @@ -86,7 +100,6 @@ export default function TTBAndamentoServico() { (item: TImovelInterface) => { // Define o item atual para remoção setItemToDelete(item); - // Abre o modal de confirmação openConfirmDialog(); }, @@ -104,7 +117,7 @@ export default function TTBAndamentoServico() { await deleteTImovel(itemToDelete); // Atualiza a lista - await indexTImovel(); + await indexTImovel(TImovelIndexDataInterface); // Limpa o item selecionado setItemToDelete(null); @@ -117,7 +130,7 @@ export default function TTBAndamentoServico() { * Busca inicial dos dados */ useEffect(() => { - indexTImovel(); + indexTImovel(TImovelIndexDataInterface); }, []); /** @@ -131,20 +144,19 @@ export default function TTBAndamentoServico() {
{/* Cabeçalho */}
{ handleOpenForm(null); }} /> - {/* Tabela de andamentos */} - + onDelete={handleConfirmDelete} + /> {/* Modal de confirmação */} - {/* Formulário de criação/edição */}
); - 4; } diff --git a/src/packages/administrativo/components/TImovel/TImovelTable.tsx b/src/packages/administrativo/components/TImovel/TImovelTable.tsx new file mode 100644 index 0000000..54c767b --- /dev/null +++ b/src/packages/administrativo/components/TImovel/TImovelTable.tsx @@ -0,0 +1,22 @@ +'use client'; + +import { DataTable } from '@/shared/components/dataTable/DataTable'; +import TImovelColumns from './TImovelColumns'; +import TImovelTableInterface from '../../interfaces/TImovel/TImovelTabelInterface'; + +/** + * Componente principal da tabela + */ +export default function TImovelTable({ data, onEdit, onDelete }: TImovelTableInterface) { + const columns = TImovelColumns(onEdit, onDelete); + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/src/packages/administrativo/components/TImovel/TImovelTipoConstrucaoSelect.tsx b/src/packages/administrativo/components/TImovel/TImovelTipoConstrucaoSelect.tsx new file mode 100644 index 0000000..7283985 --- /dev/null +++ b/src/packages/administrativo/components/TImovel/TImovelTipoConstrucaoSelect.tsx @@ -0,0 +1,66 @@ +import { Button } from "@/components/ui/button"; +import { CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@/components/ui/command"; +import { FormControl } from "@/components/ui/form"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { cn } from "@/lib/utils"; +import { ImovelConstrucaoEnum } from "@/shared/enums/ImovelConstrucaoEnum"; +import { Command } from "cmdk"; +import { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; +import React from "react"; + +export default function TImovelTipoConstrucaoSelect({ field }: any) { + const [open, setOpen] = React.useState(false); + const options = Object.entries(ImovelConstrucaoEnum).map(([id, label]) => ({ + value: Number(id), + label, + })); + return ( + + + + + + + + + + + Nenhum resultado encontrado. + + {options.map((item) => ( + { + field.onChange(item.value); + setOpen(false); + }} + > + + {item.label} + + ))} + + + + + + ); +} diff --git a/src/packages/administrativo/components/TImovel/TImovelTipoImovelSelect.tsx b/src/packages/administrativo/components/TImovel/TImovelTipoImovelSelect.tsx new file mode 100644 index 0000000..0ab104c --- /dev/null +++ b/src/packages/administrativo/components/TImovel/TImovelTipoImovelSelect.tsx @@ -0,0 +1,60 @@ +import { Button } from "@/components/ui/button"; +import { CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@/components/ui/command"; +import { FormControl } from "@/components/ui/form"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { cn } from "@/lib/utils"; +import { ImovelTipoEnum } from "@/shared/enums/ImovelTipoEnum"; +import { Command } from "cmdk"; +import { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; +import React from "react"; + +export default function TImovelTipoImovelSelect({ field }: any) { + const [open, setOpen] = React.useState(false); + const options = Object.entries(ImovelTipoEnum).map(([id, label]) => ({ + value: Number(id), + label, + })); + + return ( + + + + + + + + + + + Nenhum resultado encontrado. + + {options.map((item) => ( + { + field.onChange(item.value); + setOpen(false); + }} + > + + {item.label} + + ))} + + + + + + ); +} diff --git a/src/packages/administrativo/components/TImovel/TImovelTipoLogradouroSelect.tsx b/src/packages/administrativo/components/TImovel/TImovelTipoLogradouroSelect.tsx new file mode 100644 index 0000000..4f72661 --- /dev/null +++ b/src/packages/administrativo/components/TImovel/TImovelTipoLogradouroSelect.tsx @@ -0,0 +1,92 @@ +'use client'; + +import React from "react"; +import { Button } from "@/components/ui/button"; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from "@/components/ui/command"; +import { FormControl } from "@/components/ui/form"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { cn } from "@/lib/utils"; +import { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; +import GetCapitalize from "@/shared/actions/text/GetCapitalize"; +import { useGTBTipoLogradouroReadHook } from "@/app/(protected)/(cadastros)/cadastros/_hooks/g_tb_tipologradouro/useGTBTipoLogradouroReadHook"; + +export default function TImovelTipoLogradouroSelect({ field }: any) { + const [open, setOpen] = React.useState(false); + const [isLoading, setIsLoading] = React.useState(false); + const { gTBTipoLogradouro, fetchGTBTipoLogradouro } = useGTBTipoLogradouroReadHook(); + // Busca os dados uma única vez ao montar + React.useEffect(() => { + const loadData = async () => { + if (!gTBTipoLogradouro.length) { + setIsLoading(true); + await fetchGTBTipoLogradouro(); + setIsLoading(false); + } + }; + loadData(); + }, []); + const selected = gTBTipoLogradouro.find( + (item) => String(item.tb_tipologradouro_id) === String(field.value) + ); + return ( + + + + + + + + + + + + {isLoading ? "Carregando..." : "Nenhum resultado encontrado."} + + + {gTBTipoLogradouro?.map((item) => ( + { + field.onChange(Number(item.tb_tipologradouro_id)); + setOpen(false); + }} + > + + {GetCapitalize(item.descricao)} + + ))} + + + + + + ); +} diff --git a/src/packages/administrativo/components/TImovel/TImovelTipoRegistroSelect.tsx b/src/packages/administrativo/components/TImovel/TImovelTipoRegistroSelect.tsx new file mode 100644 index 0000000..8099d90 --- /dev/null +++ b/src/packages/administrativo/components/TImovel/TImovelTipoRegistroSelect.tsx @@ -0,0 +1,67 @@ +import { Button } from "@/components/ui/button"; +import { CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "@/components/ui/command"; +import { FormControl } from "@/components/ui/form"; +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { cn } from "@/lib/utils"; +import { ImovelTipoRegistro } from "@/shared/enums/ImovelTipoRegistro"; +import { Command } from "cmdk"; +import { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; +import React from "react"; + +export default function TImovelTipoRegistroSelect({ field }: any) { + const [open, setOpen] = React.useState(false); + + const options = Object.entries(ImovelTipoRegistro).map(([id, label]) => ({ + value: id, + label, + })); + + const selected = options.find((item) => item.value === field?.value); + + return ( + + + + + + + + + + + + Nenhum resultado encontrado. + + {options.map((item) => ( + { + field.onChange(item.value); + setOpen(false); + }} + > + + {item.label} + + ))} + + + + + + ); +} diff --git a/src/packages/administrativo/components/t_imovel_unidade/TImovelUnidadeColumns.tsx b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralColumns.tsx similarity index 87% rename from src/packages/administrativo/components/t_imovel_unidade/TImovelUnidadeColumns.tsx rename to src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralColumns.tsx index 486c30c..d996423 100644 --- a/src/packages/administrativo/components/t_imovel_unidade/TImovelUnidadeColumns.tsx +++ b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralColumns.tsx @@ -1,5 +1,4 @@ import { ColumnDef } from "@tanstack/react-table"; -import TImovelUnidadeInterface from "../../interfaces/TImovelUnidadeInterface"; import { Button } from "@/components/ui/button"; import { EllipsisIcon, @@ -14,12 +13,13 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { SortableHeader } from "@/app/_components/dataTable/SortableHeader"; +import { SortableHeader } from "@/shared/components/dataTable/SortableHeader"; +import { TImovelUnidadeRuralInterface } from "@/packages/administrativo/interfaces/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRural"; export default function TImovelUnidadeColumns( - onEdit: (item: TImovelUnidadeInterface, isEditingFormStatus: boolean) => void, - onDelete: (item: TImovelUnidadeInterface, isEditingFormStatus: boolean) => void -): ColumnDef[] { + onEdit: (item: TImovelUnidadeRuralInterface, isEditingFormStatus: boolean) => void, + onDelete: (item: TImovelUnidadeRuralInterface, isEditingFormStatus: boolean) => void +): ColumnDef[] { return [ // ID { diff --git a/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralForm.tsx b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralForm.tsx new file mode 100644 index 0000000..9fc17a4 --- /dev/null +++ b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralForm.tsx @@ -0,0 +1,266 @@ +'use client'; + +import React, { useEffect } from 'react'; + +import { Button } from '@/components/ui/button'; +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 LoadingButton from '@/shared/components/loadingButton/LoadingButton'; +import { ResetFormIfData } from '@/shared/actions/form/ResetFormIfData'; +import { TImovelUnidadeRuralFormInterface } from '@/packages/administrativo/interfaces/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralFormInterface'; +import { useTImovelUnidadeRuralFormHook } from '@/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralFormHook'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { SituacoesEnum } from '@/shared/enums/SituacoesEnum'; +import TImovelTipoImovelSelect from '../../TImovel/TImovelTipoImovelSelect'; +import TImovelTipoConstrucaoSelect from '../../TImovel/TImovelTipoConstrucaoSelect'; + +export default function TImovelUnidadeRuralForm({ isOpen, data, onClose, onSave, buttonIsLoading }: TImovelUnidadeRuralFormInterface) { + + // Inicializa o react-hook-form com schema zod + const form = useTImovelUnidadeRuralFormHook(); + + // Atualiza o formulário quando recebe dados para edição + useEffect(() => { + + // Se existir dados, reseta o formulário com os mesmos + ResetFormIfData(form, data); + + }, [data]); + + function onErro(errors: any) { + console.log(errors); + } + + return ( + { + if (!open) onClose(null, false); + }} + > + + + + Unidades do Imóvel + + + Cadastro de unidades do imóvel + + +
+ +
+ {/* Tipo Imóvel */} +
+ { + return ( + + Tipo Imóvel + + + + ); + }} + /> +
+ {/* Construção */} +
+ { + return ( + + Construção + + + + ); + }} + /> +
+ {/* Nome Identificação */} +
+ ( + + + Nome Identificação + + + + + + + )} + /> +
+ {/* Nome Denominação */} +
+ ( + + + Denominação + + + + + + + )} + /> +
+ {/* Area Descritiva */} +
+ ( + + + Área Descritiva + + + + + + + )} + /> +
+ {/* CCIR (Incra) */} +
+ ( + + + CCIR (Incra) + + + + + + + )} + /> +
+ {/* Nirf */} +
+ ( + + + NIRF + + + + + + + )} + /> +
+ {/* Geo Referenciamento */} +
+ ( + + Geo Referenciamento + + + + + + )} + /> +
+ {/* Reserva Florestal */} +
+ ( + + Reserva Florestal + + + + + + )} + /> +
+
+ {/* Rodapé do Dialog */} + + + + + + +
+ +
+
+ ); +} diff --git a/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralIndex.tsx b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralIndex.tsx new file mode 100644 index 0000000..bc2c7c1 --- /dev/null +++ b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralIndex.tsx @@ -0,0 +1,168 @@ +'use client'; + +import { useEffect, useState, useCallback } from 'react'; + +import TImovelUnidadeRuralTable from './TImovelUnidadeRuralTable'; +import TImovelUnidadeRuralForm from './TImovelUnidadeRuralForm'; + +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; + +import Header from '@/shared/components/structure/Header'; +import { useTImovelUnidadeRuralIndexHook } from '@/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralIndexHook'; +import { useTImovelUnidadeRuralSaveHook } from '@/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralSaveHook'; +import { useTImovelUnidadeRuralDeleteHook } from '@/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeRural/useTImovelUnidadeRuralDeleteHook'; +import { TImovelUnidadeRuralInterface } from '@/packages/administrativo/interfaces/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRural'; +import TImovelUnidadePageInterface from '@/packages/administrativo/interfaces/TImovelUnidade/TImovelUnidadePageInterface'; + +export default function TImovelUnidadeRuralIndex({ imovel_id }: TImovelUnidadePageInterface) { + + const TImovelUnidadePage: TImovelUnidadePageInterface = { + imovel_id: imovel_id + } + + // Controle de estado do botão + const [buttonIsLoading, setButtonIsLoading] = useState(false); + + // Hooks para leitura e salvamento + const { tImovelUnidadeRural, indexTImovelUnidadeRural } = useTImovelUnidadeRuralIndexHook(); + const { saveTImovelUnidadeRural } = useTImovelUnidadeRuralSaveHook(); + const { deleteTImovelUnidadeRural } = useTImovelUnidadeRuralDeleteHook(); + + // Estados + const [selectedData, setSelectedData] = useState(null); + const [isFormOpen, setIsFormOpen] = useState(false); + + // Estado para saber qual item será deletado + const [itemToDelete, setItemToDelete] = useState(null); + + /** + * Hook do modal de confirmação + */ + const { + isOpen: isConfirmOpen, + openDialog: openConfirmDialog, + handleCancel, + } = useConfirmDialog(); + + /** + * Abre o formulário no modo de edição ou criação + */ + const handleOpenForm = useCallback((data: TImovelUnidadeRuralInterface | null) => { + // Se não houver dados (criação), cria um objeto inicial com imovel_id + const initialData: TImovelUnidadeRuralInterface = data ?? { imovel_id } as TImovelUnidadeRuralInterface; + setSelectedData(initialData); + setIsFormOpen(true); + }, []); + + /** + * Fecha o formulário e limpa o andamento selecionado + */ + const handleCloseForm = useCallback(() => { + setSelectedData(null); + setIsFormOpen(false); + }, []); + + /** + * Salva os dados do formulário + */ + const handleSave = useCallback( + async (formData: TImovelUnidadeRuralInterface) => { + // Coloca o botão em estado de loading + setButtonIsLoading(true); + + // Aguarda salvar o registro + await saveTImovelUnidadeRural(formData); + + // Remove o botão em estado de loading + setButtonIsLoading(false); + + // Atualiza a lista de dados + indexTImovelUnidadeRural(TImovelUnidadePage); + }, + [saveTImovelUnidadeRural, indexTImovelUnidadeRural, handleCloseForm], + ); + + /** + * Quando o usuário clica em "remover" na tabela + */ + const handleConfirmDelete = useCallback( + (item: TImovelUnidadeRuralInterface) => { + // Define o item atual para remoção + setItemToDelete(item); + + // Abre o modal de confirmação + openConfirmDialog(); + }, + [openConfirmDialog], + ); + + /** + * Executa a exclusão de fato quando o usuário confirma + */ + const handleDelete = useCallback(async () => { + // Protege contra null + if (!itemToDelete) return; + + // Executa o Hook de remoção + await deleteTImovelUnidadeRural(itemToDelete); + + // Atualiza a lista + await indexTImovelUnidadeRural(TImovelUnidadePage); + + // Limpa o item selecionado + setItemToDelete(null); + + // Fecha o modal + handleCancel(); + }, [itemToDelete, indexTImovelUnidadeRural, handleCancel]); + + /** + * Busca inicial dos dados + */ + useEffect(() => { + indexTImovelUnidadeRural(TImovelUnidadePage); + }, []); + + return ( +
+ {/* Cabeçalho */} +
{ + handleOpenForm(null); + }} + /> + {/* Tabela de andamentos */} + + {/* Modal de confirmação */} + {isConfirmOpen && ( + + )} + {/* Formulário de criação/edição */} + {isFormOpen && ( + + )} +
+ ); +} diff --git a/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralTable.tsx b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralTable.tsx new file mode 100644 index 0000000..3f6ad33 --- /dev/null +++ b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralTable.tsx @@ -0,0 +1,29 @@ +'use client'; + +import { DataTable } from '@/shared/components/dataTable/DataTable'; +import TImovelUnidadeColumns from './TImovelUnidadeRuralColumns'; +import TImovelUnidadeRuralTableInterface from '@/packages/administrativo/interfaces/TImovelUnidade/TImovelUnidadeRural/TImovelUnidadeRuralTableInterface'; + +/** + * Componente principal da tabela + */ +export default function TImovelUnidadeRuralTable({ data, onEdit, onDelete }: TImovelUnidadeRuralTableInterface) { + const columns = TImovelUnidadeColumns(onEdit, onDelete); + const isEmpty = !data || data.length === 0; + return ( +
+ {isEmpty ? ( +
+ Nenhuma unidade cadastrada ainda. +
+ ) : ( + + )} +
+ ); +} \ No newline at end of file diff --git a/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoColumns.tsx b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoColumns.tsx new file mode 100644 index 0000000..d618f39 --- /dev/null +++ b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoColumns.tsx @@ -0,0 +1,90 @@ +import { ColumnDef } from "@tanstack/react-table"; +import { Button } from "@/components/ui/button"; +import { + EllipsisIcon, + PencilIcon, + Trash2Icon, +} from "lucide-react"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { SortableHeader } from "@/shared/components/dataTable/SortableHeader"; +import { TImovelUnidadeUrbanoInterface } from "@/packages/administrativo/interfaces/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoInterface"; + +export default function TImovelUnidadeUrbanoColumns( + onEdit: (item: TImovelUnidadeUrbanoInterface, isEditingFormStatus: boolean) => void, + onDelete: (item: TImovelUnidadeUrbanoInterface, isEditingFormStatus: boolean) => void +): ColumnDef[] { + return [ + // ID + { + accessorKey: "imovel_unidade_id", + header: ({ column }) => SortableHeader("#", column), + cell: ({ row }) => Number(row.getValue("imovel_unidade_id")), + }, + // Número da Unidade + { + accessorKey: "numero_unidade", + header: ({ column }) => SortableHeader("Número da Unidade", column), + cell: ({ row }) => row.getValue("numero_unidade"), + }, + // Quadra + { + accessorKey: "quadra", + header: ({ column }) => SortableHeader("Quadra", column), + cell: ({ row }) => row.getValue("quadra"), + }, + // Area + { + accessorKey: "area", + header: ({ column }) => SortableHeader("Área", column), + cell: ({ row }) => row.getValue("area"), + }, + // Logradouros + { + accessorKey: "logradouro", + header: ({ column }) => SortableHeader("Logradouro", column), + cell: ({ row }) => row.getValue("logradouro"), + }, + // Ações + { + id: "actions", + header: "Ações", + cell: ({ row }) => { + const imovel = row.original; + return ( + + + + + + + onEdit(imovel, true)}> + + Editar + + + onDelete(imovel, true)} + > + + Remover + + + + + ); + }, + enableSorting: false, + enableHiding: false, + }, + ]; +} diff --git a/src/packages/administrativo/components/t_imovel_unidade/TImovelUnidadeForm.tsx b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoForm.tsx similarity index 51% rename from src/packages/administrativo/components/t_imovel_unidade/TImovelUnidadeForm.tsx rename to src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoForm.tsx index 89f5174..0dee537 100644 --- a/src/packages/administrativo/components/t_imovel_unidade/TImovelUnidadeForm.tsx +++ b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoForm.tsx @@ -1,8 +1,6 @@ 'use client'; import React, { useEffect } from 'react'; -import { useForm } from 'react-hook-form'; -import { zodResolver } from '@hookform/resolvers/zod'; import { Button } from '@/components/ui/button'; import { @@ -24,50 +22,24 @@ import { } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; -import LoadingButton from '@/app/_components/loadingButton/LoadingButton'; -import { TImovelUnidadeFormValues, TImovelUnidadeSchema } from '../../schemas/TImovelUnidadeSchema'; -import TImovelUnidadeProps from './TImovelUnidadeFormProps'; -import { useGTBTipoLogradouroReadHook } from '../../../../app/(protected)/(cadastros)/cadastros/_hooks/g_tb_tipologradouro/useGTBTipoLogradouroReadHook'; -import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; -import { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; -import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command'; -import { cn } from '@/lib/utils'; -import GetCapitalize from '@/actions/text/GetCapitalize'; -import { ResetFormIfData } from '@/actions/form/ResetFormIfData'; -import { parseNumberInput } from '@/actions/form/parseNumberInput'; -import { ImovelTipoEnum } from '@/enums/ImovelTipoEnum'; -import { ImovelConstrucaoEnum } from '@/enums/ImovelConstrucaoEnum'; +import LoadingButton from '@/shared/components/loadingButton/LoadingButton'; +import { ResetFormIfData } from '@/shared/actions/form/ResetFormIfData'; +import { parseNumberInput } from '@/shared/actions/form/parseNumberInput'; +import { useTImovelUnidadeUrbanoFormHook } from '@/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeUrbano/useTImovelUnidadeUrbanoFormHook'; +import { TImovelUnidadeUrbanoFormInterface } from '@/packages/administrativo/interfaces/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoFormInterface'; +import TImovelTipoImovelSelect from '../../TImovel/TImovelTipoImovelSelect'; +import TImovelTipoConstrucaoSelect from '../../TImovel/TImovelTipoConstrucaoSelect'; +import TImovelTipoLogradouroSelect from '../../TImovel/TImovelTipoLogradouroSelect'; -export default function TImovelUnidadeForm({ isOpen, data, onClose, onSave, buttonIsLoading }: TImovelUnidadeProps) { - - const { gTBTipoLogradouro, fetchGTBTipoLogradouro } = useGTBTipoLogradouroReadHook(); +export default function TImovelUnidadeUrbanoForm({ isOpen, data, onClose, onSave, buttonIsLoading }: TImovelUnidadeUrbanoFormInterface) { // Inicializa o react-hook-form com schema zod - const form = useForm({ - resolver: zodResolver(TImovelUnidadeSchema), - defaultValues: { - imovel_id: 1, - }, - }); + const form = useTImovelUnidadeUrbanoFormHook({}); - // Atualiza o formulário quando recebe dados para edição + // Aguarda alteração no Data useEffect(() => { - - // Se existir dados, reseta o formulário com os mesmos ResetFormIfData(form, data); - - // Carregamento de dados iniciais - async function loadData() { - - // Carrega o tipo de logradouro - await fetchGTBTipoLogradouro(); - - } - - // Executa a função - loadData(); - - }, [data, form]); + }, [data]); return ( - Unidades do Imóvel + Unidades Urbanas do Imóvel Cadastro de unidades do imóvel @@ -97,7 +69,7 @@ export default function TImovelUnidadeForm({ isOpen, data, onClose, onSave, butt Quadra - + @@ -160,65 +132,13 @@ export default function TImovelUnidadeForm({ isOpen, data, onClose, onSave, butt { - const [open, setOpen] = React.useState(false); - return ( - - Tipo logradouro - - - - - - - - - - - Nenhum resultado encontrado. - - {gTBTipoLogradouro?.map((item) => ( - { - field.onChange(Number(item.tb_tipologradouro_id)); - setOpen(false); - }} - > - - {GetCapitalize(item.descricao)} - - ))} - - - - - - - - ); - }} + render={({ field }) => ( + + Tipo logradouro + + + + )} /> {/* Logradouro */} @@ -243,62 +163,10 @@ export default function TImovelUnidadeForm({ isOpen, data, onClose, onSave, butt control={form.control} name="tipo_imovel" render={({ field }) => { - const [open, setOpen] = React.useState(false); - // transforma o objeto em um array [{value, label}] - const options = Object.entries(ImovelTipoEnum).map(([id, label]) => ({ - value: Number(id), - label, - })); return ( Tipo Imóvel - - - - - - - - - - - Nenhum resultado encontrado. - - {options.map((item) => ( - { - field.onChange(item.value); // salva o número (id) - setOpen(false); - }} - > - - {item.label} - - ))} - - - - - + ); @@ -311,61 +179,10 @@ export default function TImovelUnidadeForm({ isOpen, data, onClose, onSave, butt control={form.control} name="tipo_construcao" render={({ field }) => { - const [open, setOpen] = React.useState(false); - const options = Object.entries(ImovelConstrucaoEnum).map(([id, label]) => ({ - value: Number(id), - label, - })); return ( Construção - - - - - - - - - - - Nenhum resultado encontrado. - - {options.map((item) => ( - { - field.onChange(item.value); - setOpen(false); - }} - > - - {item.label} - - ))} - - - - - + ); @@ -373,7 +190,7 @@ export default function TImovelUnidadeForm({ isOpen, data, onClose, onSave, butt /> {/* Iptu */} -
+
- {/* Unidade */} + {/* Unidade Urbano */}
( - Unidade + Unidade Urbano @@ -439,7 +256,7 @@ export default function TImovelUnidadeForm({ isOpen, data, onClose, onSave, butt />
{/* Loteamento */} -
+
+ {/* Numero */} +
+ ( + + Numero + + + + + + )} + /> +
{/* CNM */}
- {/* Numero da Edificação */}
- {/* Campo oculto */} - - diff --git a/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoIndex.tsx b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoIndex.tsx new file mode 100644 index 0000000..a01b6f4 --- /dev/null +++ b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoIndex.tsx @@ -0,0 +1,169 @@ +'use client'; + +import { useEffect, useState, useCallback, Suspense } from 'react'; + +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; + +import Header from '@/shared/components/structure/Header'; +import { useTImovelUnidadeUrbanoIndexHook } from '@/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeUrbano/useTImovelUnidadeUrbanoIndexHook'; +import { useTImovelUnidadeUrbanoSaveHook } from '@/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeUrbano/useTImovelUnidadeUrbanoSaveHook'; +import { useTImovelUnidadeUrbanoDeleteHook } from '@/packages/administrativo/hooks/TImovelUnidade/TImovelUnidadeUrbano/useTImovelUnidadeUrbanoDeleteHook'; +import { TImovelUnidadeUrbanoInterface } from '@/packages/administrativo/interfaces/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoInterface'; +import TImovelUnidadeUrbanoTable from './TImovelUnidadeUrbanoTable'; +import TImovelUnidadeUrbanoForm from './TImovelUnidadeUrbanoForm'; +import TImovelUnidadePageInterface from '@/packages/administrativo/interfaces/TImovelUnidade/TImovelUnidadePageInterface'; + +export default function TImovelUnidadeUrbanoPage({ imovel_id }: TImovelUnidadePageInterface) { + + const TImovelUnidadePage: TImovelUnidadePageInterface = { + imovel_id: imovel_id + } + + // Controle de estado do botão + const [buttonIsLoading, setButtonIsLoading] = useState(false); + + // Hooks para leitura e salvamento + const { tImovelUnidadeUrbano, indexTImovelUnidadeUrbano } = useTImovelUnidadeUrbanoIndexHook(); + const { saveTImovelUnidadeUrbano } = useTImovelUnidadeUrbanoSaveHook(); + const { deleteTImovelUnidadeUrbano } = useTImovelUnidadeUrbanoDeleteHook(); + + // Estados + const [selectedData, setSelectedData] = useState(null); + const [isFormOpen, setIsFormOpen] = useState(false); + + // Estado para saber qual item será deletado + const [itemToDelete, setItemToDelete] = useState(null); + + /** + * Hook do modal de confirmação + */ + const { + isOpen: isConfirmOpen, + openDialog: openConfirmDialog, + handleConfirm, + handleCancel, + } = useConfirmDialog(); + + /** + * Abre o formulário no modo de edição ou criação + */ + const handleOpenForm = useCallback((data: TImovelUnidadeUrbanoInterface | null) => { + // Se não houver dados (criação), cria um objeto inicial com imovel_id + const initialData: TImovelUnidadeUrbanoInterface = data ?? { imovel_id } as TImovelUnidadeUrbanoInterface; + setSelectedData(initialData); + setIsFormOpen(true); + }, []); + + /** + * Fecha o formulário e limpa o andamento selecionado + */ + const handleCloseForm = useCallback(() => { + setSelectedData(null); + setIsFormOpen(false); + }, []); + + /** + * Salva os dados do formulário + */ + const handleSave = useCallback( + async (formData: TImovelUnidadeUrbanoInterface) => { + // Coloca o botão em estado de loading + setButtonIsLoading(true); + + // Aguarda salvar o registro + await saveTImovelUnidadeUrbano(formData); + + // Remove o botão em estado de loading + setButtonIsLoading(false); + + // Atualiza a lista de dados + indexTImovelUnidadeUrbano(TImovelUnidadePage); + }, + [saveTImovelUnidadeUrbano, indexTImovelUnidadeUrbano, handleCloseForm], + ); + + /** + * Quando o usuário clica em "remover" na tabela + */ + const handleConfirmDelete = useCallback( + (item: TImovelUnidadeUrbanoInterface) => { + // Define o item atual para remoção + setItemToDelete(item); + + // Abre o modal de confirmação + openConfirmDialog(); + }, + [openConfirmDialog], + ); + + /** + * Executa a exclusão de fato quando o usuário confirma + */ + const handleDelete = useCallback(async () => { + // Protege contra null + if (!itemToDelete) return; + + // Executa o Hook de remoção + await deleteTImovelUnidadeUrbano(itemToDelete); + + // Atualiza a lista + await indexTImovelUnidadeUrbano(TImovelUnidadePage); + + // Limpa o item selecionado + setItemToDelete(null); + + // Fecha o modal + handleCancel(); + }, [itemToDelete, indexTImovelUnidadeUrbano, handleCancel]); + + /** + * Busca inicial dos dados + */ + useEffect(() => { + indexTImovelUnidadeUrbano(TImovelUnidadePage); + }, []); + + return ( +
+ {/* Cabeçalho */} +
{ + handleOpenForm(null); + }} + /> + {/* Tabela de andamentos */} + + {/* Modal de confirmação */} + {isConfirmOpen && ( + + )} + {/* Formulário de criação/edição, só aparece quando solicitado */} + {isFormOpen && ( + < TImovelUnidadeUrbanoForm + isOpen={isFormOpen} + data={selectedData} + onClose={handleCloseForm} + onSave={handleSave} + buttonIsLoading={buttonIsLoading} + /> + )} +
+ ); +} diff --git a/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoTable.tsx b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoTable.tsx new file mode 100644 index 0000000..774bfaf --- /dev/null +++ b/src/packages/administrativo/components/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoTable.tsx @@ -0,0 +1,28 @@ +'use client'; + +import { DataTable } from '@/shared/components/dataTable/DataTable'; +import TImovelUnidadeColumns from './TImovelUnidadeUrbanoColumns'; +import TImovelUnidadeUrbanoTableInterface from '@/packages/administrativo/interfaces/TImovelUnidade/TImovelUnidadeUrbano/TImovelUnidadeUrbanoTableInterface'; +/** + * Componente principal da tabela + */ +export default function TImovelUnidadeUrbanoTable({ data, onEdit, onDelete }: TImovelUnidadeUrbanoTableInterface) { + const columns = TImovelUnidadeColumns(onEdit, onDelete); + const isEmpty = !data || data.length === 0; + return ( +
+ {isEmpty ? ( +
+ Nenhuma unidade cadastrada ainda. +
+ ) : ( + + )} +
+ ); +} diff --git a/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaColumns.tsx b/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaColumns.tsx index 120b85c..e12fac1 100644 --- a/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaColumns.tsx +++ b/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaColumns.tsx @@ -1,8 +1,8 @@ -import { FormatCPF } from "@/actions/CPF/FormatCPF"; -import { FormatDateTime } from "@/actions/dateTime/FormatDateTime"; -import { FormatPhone } from "@/actions/phone/FormatPhone"; -import GetNameInitials from "@/actions/text/GetNameInitials"; -import empty from "@/actions/validations/empty"; +import { FormatCPF } from "@/shared/actions/CPF/FormatCPF"; +import { FormatDateTime } from "@/shared/actions/dateTime/FormatDateTime"; +import { FormatPhone } from "@/shared/actions/phone/FormatPhone"; +import GetNameInitials from "@/shared/actions/text/GetNameInitials"; +import empty from "@/shared/actions/validations/empty"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; import TPessoaFisicaInterface from "@/packages/administrativo/interfaces/TPessoa/TPessoaFisica/TPessoaFisicaInterface"; diff --git a/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaForm.tsx b/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaForm.tsx index 3af6e23..4cd8661 100644 --- a/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaForm.tsx +++ b/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaForm.tsx @@ -22,7 +22,7 @@ import { } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; -import LoadingButton from '@/app/_components/loadingButton/LoadingButton'; +import LoadingButton from '@/shared/components/loadingButton/LoadingButton'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Select, @@ -31,9 +31,9 @@ import { SelectTrigger, } from '@/components/ui/select'; import { CheckIcon, ChevronsUpDownIcon, HouseIcon, IdCardIcon, UserIcon } from 'lucide-react'; -import { Sexo } from '@/enums/SexoEnum'; +import { Sexo } from '@/shared/enums/SexoEnum'; import { useGTBEstadoCivilReadHook } from '../../../../../app/(protected)/(cadastros)/cadastros/_hooks/g_tb_estadocivil/useGTBEstadoCivilReadHook'; -import GetCapitalize from '@/actions/text/GetCapitalize'; +import GetCapitalize from '@/shared/actions/text/GetCapitalize'; import { useGTBRegimeComunhaoReadHook } from '../../../../../app/(protected)/(cadastros)/cadastros/_hooks/g_tb_regimecomunhao/useGTBRegimeComunhaoReadHook'; import { useGTBProfissaoReadHook } from '../../../../../app/(protected)/(cadastros)/cadastros/_hooks/g_tb_profissao/useGTBProfissaoReadHook'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; @@ -46,9 +46,9 @@ import { CommandList, } from '@/components/ui/command'; import { cn } from '@/lib/utils'; -import TPessoaFisicaFormInterface from '../../../interfaces/TPessoa/TPessoaFisica/TPessoaFisicaFormInterface'; -import { ResetFormIfData } from '@/actions/form/ResetFormIfData'; -import { useTPessoaForm } from '@/packages/administrativo/hooks/t_pessoa/fisica/usetTPessoaFormHook'; +import TPessoaFisicaFormInterface from '@/packages/administrativo/interfaces/TPessoa/TPessoaFisica/TPessoaFisicaFormInterface'; +import { useTPessoaFisicaFormHook } from '@/packages/administrativo/hooks/TPessoa/TPessoaFisica/useTPessoaFisicaFormHook'; +import { ResetFormIfData } from '@/shared/actions/form/ResetFormIfData'; export default function TPessoaFisicaForm({ isOpen, @@ -63,7 +63,7 @@ export default function TPessoaFisicaForm({ const { gTBRegimeComunhao, fetchGTBRegimeComunhao } = useGTBRegimeComunhaoReadHook(); // Inicializa o react-hook-form com schema zod - const form = useTPessoaForm({}); + const form = useTPessoaFisicaFormHook({}); // Atualiza o formulário quando recebe dados para edição useEffect(() => { @@ -80,6 +80,10 @@ export default function TPessoaFisicaForm({ loadData(); }, [data, form]); + function onError(errors: any) { + console.log('Errors: ', errors); + } + return (
- + {/* Tabs */} @@ -274,7 +278,6 @@ export default function TPessoaFisicaForm({ )} />
- {/* Estado Civil */}
+ {/* Email */} +
+ ( + + Email + + + + + + )} + /> +
{/* Endereço */}
{/* País */} -
+
( País @@ -823,8 +846,6 @@ export default function TPessoaFisicaForm({ loading={buttonIsLoading} /> - {/* Campo oculto */} - diff --git a/src/packages/administrativo/components/t_pessoa_representante/TPessoaRepresentantePage.tsx b/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaIndex.tsx similarity index 55% rename from src/packages/administrativo/components/t_pessoa_representante/TPessoaRepresentantePage.tsx rename to src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaIndex.tsx index 5d8a5d7..1f0d577 100644 --- a/src/packages/administrativo/components/t_pessoa_representante/TPessoaRepresentantePage.tsx +++ b/src/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaIndex.tsx @@ -2,38 +2,35 @@ import React, { useEffect, useState, useCallback } from 'react'; -import Loading from '@/app/_components/loading/loading'; -import TPessoaForm from '../TPessoa/TPessoaFisica/TPessoaFisicaForm'; +import Loading from '@/shared/components/loading/loading'; +import TPessoaTable from '@/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaTable'; +import TPessoaForm from '@/packages/administrativo/components/TPessoa/TPessoaFisica/TPessoaFisicaForm'; -import { useTPessoaIndexHook } from '../../hooks/t_pessoa/useTPessoaIndexHook'; -import { useTPessoaSaveHook } from '../../hooks/t_pessoa/useTPessoaSaveHook'; -import { useTPessoaDeleteHook } from '../../hooks/t_pessoa/useTPessoaDeleteHook'; +import { useTPessoaFisicaIndexHook } from '@/packages/administrativo/hooks/TPessoa/TPessoaFisica/useTPessoaFisicaIndexHook'; +import { useTPessoaFisicaSaveHook } from '@/packages/administrativo/hooks/TPessoa/TPessoaFisica/useTPessoaFisicaSaveHook'; +import { useTPessoaFisicaDeleteHook } from '@/packages/administrativo/hooks/TPessoa/TPessoaFisica/useTPessoaFisicaDeleteHook'; -import ConfirmDialog from '@/app/_components/confirm_dialog/ConfirmDialog'; -import { useConfirmDialog } from '@/app/_components/confirm_dialog/useConfirmDialog'; +import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog'; +import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog'; -import TPessoaInterface from '../../interfaces/TPessoa/TPessoaInterface'; -import TPessoaRepresentanteTable from './TPessoaRepresentanteTable'; -import { useTPessoaRepresentanteIndexHook } from '../../hooks/t_pessoa_representante/useTPessoaRepresentanteIndexHook'; -import { Button } from '@/components/ui/button'; -import Header from '@/app/_components/structure/Header'; -import TPessoaRepresentanteForm from './TPessoaRepresentanteForm'; +import TPessoaFisicaInterface from '@/packages/administrativo/interfaces/TPessoa/TPessoaFisica/TPessoaFisicaInterface'; +import Header from '@/shared/components/structure/Header'; -export default function TPessoaRepresentantePage() { +export default function TPessoaFisicaIndex() { // Controle de estado do botão const [buttonIsLoading, setButtonIsLoading] = useState(false); // Hooks para leitura e salvamento - const { tPessoaRepresentante, fetchTPessoaRepresentante } = useTPessoaRepresentanteIndexHook(); - const { saveTCensec } = useTPessoaSaveHook(); - const { deleteTCensec } = useTPessoaDeleteHook(); + const { tPessoaFisica, fetchTPessoaFisica } = useTPessoaFisicaIndexHook(); + const { saveTPessoaFisica } = useTPessoaFisicaSaveHook(); + const { deleteTPessoaFisica } = useTPessoaFisicaDeleteHook(); // Estados - const [selectedAndamento, setSelectedAndamento] = useState(null); + const [selectedAndamento, setSelectedAndamento] = useState(null); const [isFormOpen, setIsFormOpen] = useState(false); // Estado para saber qual item será deletado - const [itemToDelete, setItemToDelete] = useState(null); + const [itemToDelete, setItemToDelete] = useState(null); /** * Hook do modal de confirmação @@ -48,8 +45,10 @@ export default function TPessoaRepresentantePage() { /** * Abre o formulário no modo de edição ou criação */ - const handleOpenForm = useCallback((data: TPessoaInterface | null) => { - setSelectedAndamento(data); + const handleOpenForm = useCallback((data: TPessoaFisicaInterface | null) => { + // Se não houver dados (criação), cria um objeto inicial com pessoa_tipo + const initialData: TPessoaFisicaInterface = data ?? { pessoa_tipo: "F" } as TPessoaFisicaInterface; + setSelectedAndamento(initialData); setIsFormOpen(true); }, []); @@ -65,27 +64,27 @@ export default function TPessoaRepresentantePage() { * Salva os dados do formulário */ const handleSave = useCallback( - async (formData: TPessoaInterface) => { + async (formData: TPessoaFisicaInterface) => { // Coloca o botão em estado de loading setButtonIsLoading(true); // Aguarda salvar o registro - await saveTCensec(formData); + await saveTPessoaFisica(formData); // Remove o botão em estado de loading setButtonIsLoading(false); // Atualiza a lista de dados - fetchTPessoaRepresentante(); + fetchTPessoaFisica(); }, - [saveTCensec, fetchTPessoaRepresentante, handleCloseForm], + [saveTPessoaFisica, fetchTPessoaFisica, handleCloseForm], ); /** * Quando o usuário clica em "remover" na tabela */ const handleConfirmDelete = useCallback( - (item: TPessoaInterface) => { + (item: TPessoaFisicaInterface) => { // Define o item atual para remoção setItemToDelete(item); @@ -103,29 +102,29 @@ export default function TPessoaRepresentantePage() { if (!itemToDelete) return; // Executa o Hook de remoção - await deleteTCensec(itemToDelete); + await deleteTPessoaFisica(itemToDelete); // Atualiza a lista - await fetchTPessoaRepresentante(); + await fetchTPessoaFisica(); // Limpa o item selecionado setItemToDelete(null); // Fecha o modal handleCancel(); - }, [itemToDelete, fetchTPessoaRepresentante, handleCancel]); + }, [itemToDelete, fetchTPessoaFisica, handleCancel]); /** * Busca inicial dos dados */ useEffect(() => { - fetchTPessoaRepresentante(); + fetchTPessoaFisica(); }, []); /** * Tela de loading enquanto carrega os dados */ - if (tPessoaRepresentante.length == 0) { + if (tPessoaFisica.length == 0) { return ; } @@ -133,21 +132,17 @@ export default function TPessoaRepresentantePage() {
{/* Cabeçalho */}
{ handleOpenForm(null); }} /> - {/* Tabela de Registros */} - - + onEdit={handleOpenForm} /> {/* Modal de confirmação */} - {/* Formulário de criação/edição */} -
{pessoa.nome || '-'}
-
- {empty(pessoa.email) ? 'Email não informado' : pessoa.email} -
); @@ -57,7 +54,6 @@ export default function TPessoaJuridicaColumns( sortingFn: (a, b) => (a.original.nome?.toLowerCase() || '').localeCompare(b.original.nome?.toLowerCase() || ''), }, - // CPF { accessorKey: 'cpf_cnpj', @@ -71,7 +67,6 @@ export default function TPessoaJuridicaColumns( ), cell: ({ row }) => FormatCNPJ(row.getValue('cpf_cnpj')), }, - // Telefone { accessorKey: 'telefone', @@ -85,7 +80,6 @@ export default function TPessoaJuridicaColumns( ), cell: ({ row }) => FormatPhone(row.getValue('telefone')), }, - // Cidade / UF { id: 'cidade_uf', @@ -104,7 +98,6 @@ export default function TPessoaJuridicaColumns( .toLowerCase() .localeCompare(`${b.original.cidade}/${b.original.uf}`.toLowerCase()), }, - // Data de cadastro { accessorKey: 'data_cadastro', @@ -119,7 +112,6 @@ export default function TPessoaJuridicaColumns( cell: ({ row }) => FormatDateTime(row.getValue('data_cadastro')), sortingFn: 'datetime', }, - // Ações { id: 'actions', diff --git a/src/packages/administrativo/components/TPessoa/TPessoaJuridica/TPessoaJuridicaForm.tsx b/src/packages/administrativo/components/TPessoa/TPessoaJuridica/TPessoaJuridicaForm.tsx index 8db35d4..2a2fe7c 100644 --- a/src/packages/administrativo/components/TPessoa/TPessoaJuridica/TPessoaJuridicaForm.tsx +++ b/src/packages/administrativo/components/TPessoa/TPessoaJuridica/TPessoaJuridicaForm.tsx @@ -1,9 +1,6 @@ 'use client'; -import z from 'zod'; import React, { useEffect } from 'react'; -import { useForm, Controller } from 'react-hook-form'; -import { zodResolver } from '@hookform/resolvers/zod'; import { Button } from '@/components/ui/button'; import { @@ -25,23 +22,14 @@ import { } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; -import { TPessoaSchema } from '../../../schemas/TPessoa/TPessoaSchema'; -import LoadingButton from '@/app/_components/loadingButton/LoadingButton'; +import LoadingButton from '@/shared/components/loadingButton/LoadingButton'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { HouseIcon, IdCardIcon, UserIcon } from 'lucide-react'; -import { Textarea } from '@/components/ui/textarea'; -import { useTPessoaRepresentanteIndexHook } from '../../../hooks/t_pessoa_representante/useTPessoaRepresentanteIndexHook'; -import TPessoaRepresentantePage from '../../t_pessoa_representante/TPessoaRepresentantePage'; - -type FormValues = z.infer; - -interface TPessoaFormProps { - isOpen: boolean; - data: FormValues | null; - onClose: (item: null, isFormStatus: boolean) => void; - onSave: (data: FormValues) => void; - buttonIsLoading: boolean; -} +import TPessoaRepresentantePage from '../../TPessoaRepresentante/TPessoaRepresentanteIndex'; +import { useTPessoaJuridicaFormHook } from '@/packages/administrativo/hooks/TPessoa/TPessoaJuridica/useTPessoaJuridicaFormHook'; +import TPessoaJuridicaFormInterface from '@/packages/administrativo/interfaces/TPessoa/TPessoaJuridica/TPessoaJuridicaFormInterface'; +import { ResetFormIfData } from '@/shared/actions/form/ResetFormIfData'; +import { parseNumberInput } from '@/shared/actions/form/parseNumberInput'; export default function TPessoaJuridicaForm({ isOpen, @@ -49,33 +37,21 @@ export default function TPessoaJuridicaForm({ onClose, onSave, buttonIsLoading, -}: TPessoaFormProps) { - const { tPessoaRepresentante, fetchTPessoaRepresentante } = useTPessoaRepresentanteIndexHook(); +}: TPessoaJuridicaFormInterface) { // Inicializa o react-hook-form com schema zod - const form = useForm({ - resolver: zodResolver(TPessoaSchema), - defaultValues: { - nome: '', - pessoa_id: 0, - }, - }); + const form = useTPessoaJuridicaFormHook({}); // Atualiza o formulário quando recebe dados para edição useEffect(() => { - // Carregamento de dados sincronos - const loadData = async () => { - // Se existir dados, reseta o formulário com os dados informados - if (data) form.reset(data); - - // Aguarda a busca terminar - await fetchTPessoaRepresentante(); - }; - - // Dispara a função - loadData(); + // Se existir dados, reseta o formulário com os mesmos + ResetFormIfData(form, data); }, [data, form]); + const onError = (err: any) => { + console.log('Erros:', err); + }; + return ( - Pessoa + Pessoa Jurídica Preencha os dados da pessoa
- - {/* Tabs */} - - - - - Dados Pessoais - - - Endereço - + {/* Tabs */} + + + + + Dados Pessoais + + + Endereço + + {/* Representantes */} + {data?.pessoa_id && ( Representantes - -
- {/* Dados Pessoais */} - + )} + +
+ {/* Dados Pessoais */} + +
{/* Razão Social */}
@@ -128,7 +107,6 @@ export default function TPessoaJuridicaForm({ )} />
- {/* Nome Fantasia */}
( - Nome Fantasia + + Nome Fantasia +
- {/* Inscrição Estadual */}
- {/* CNPJ */}
- {/* Observação */}
Observação -