176 lines
5.4 KiB
TypeScript
176 lines
5.4 KiB
TypeScript
'use client';
|
|
|
|
import { useCallback, useEffect, useState } from 'react';
|
|
|
|
import { useGEmolumentoItemDeleteHook } from '@/packages/administrativo/hooks/GEmolumentoItem/useGEmolumentoItemDeleteHook';
|
|
import { useGEmolumentoItemIndexHook } from '@/packages/administrativo/hooks/GEmolumentoItem/useGEmolumentoItemIndexHook';
|
|
import { useGEmolumentoItemSaveHook } from '@/packages/administrativo/hooks/GEmolumentoItem/useGEmolumentoItemSaveHook';
|
|
import GEmolumentoItemIndexInterface from '@/packages/administrativo/interfaces/GEmolumentoItem/GEmolumentoItemIndexInterface';
|
|
import GEmolumentoItemInterface from '@/packages/administrativo/interfaces/GEmolumentoItem/GEmolumentoItemInterface';
|
|
import ConfirmDialog from '@/shared/components/confirmDialog/ConfirmDialog';
|
|
import { useConfirmDialog } from '@/shared/components/confirmDialog/useConfirmDialog';
|
|
import Loading from '@/shared/components/loading/loading';
|
|
import Header from '@/shared/components/structure/Header';
|
|
|
|
import GEmolumentoItemForm from './GEmolumentoItemForm';
|
|
import GEmolumentoItemTable from './GEmolumentoItemTable';
|
|
|
|
export default function GEmolumentoItemIndex({
|
|
emolumento_id,
|
|
emolumento_periodo_id,
|
|
}: GEmolumentoItemIndexInterface) {
|
|
const gEmolumentoItemParams = {
|
|
emolumento_id: emolumento_id,
|
|
emolumento_periodo_id: emolumento_periodo_id,
|
|
};
|
|
|
|
// Controle de estado do botão
|
|
const [buttonIsLoading, setButtonIsLoading] = useState(false);
|
|
|
|
// Hooks para leitura e salvamento
|
|
const { gEmolumentoItem, indexGEmolumentoItem } = useGEmolumentoItemIndexHook();
|
|
const { saveGEmolumentoItem } = useGEmolumentoItemSaveHook();
|
|
const { deleteGEmolumentoItem } = useGEmolumentoItemDeleteHook();
|
|
|
|
// Estados
|
|
const [selectedData, setSelectedData] = useState<GEmolumentoItemInterface | null>(null);
|
|
const [isFormOpen, setIsFormOpen] = useState(false);
|
|
|
|
// Estado para saber qual item será deletado
|
|
const [itemToDelete, setItemToDelete] = useState<GEmolumentoItemInterface | null>(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: GEmolumentoItemInterface | null) => {
|
|
// Se não houver dados (criação), cria um objeto inicial com imovel_id
|
|
const initialData: GEmolumentoItemInterface =
|
|
data ?? ({ emolumento_id, emolumento_periodo_id } as GEmolumentoItemInterface);
|
|
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: GEmolumentoItemInterface) => {
|
|
// Coloca o botão em estado de loading
|
|
setButtonIsLoading(true);
|
|
|
|
// Aguarda salvar o registro
|
|
await saveGEmolumentoItem(formData);
|
|
|
|
// Remove o botão em estado de loading
|
|
setButtonIsLoading(false);
|
|
|
|
// Atualiza a lista de dados
|
|
indexGEmolumentoItem(gEmolumentoItemParams);
|
|
},
|
|
[saveGEmolumentoItem, indexGEmolumentoItem, handleCloseForm],
|
|
);
|
|
|
|
/**
|
|
* Quando o usuário clica em "remover" na tabela
|
|
*/
|
|
const handleConfirmDelete = useCallback(
|
|
(item: GEmolumentoItemInterface) => {
|
|
// 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 deleteGEmolumentoItem(itemToDelete);
|
|
|
|
// Atualiza a lista
|
|
await indexGEmolumentoItem(gEmolumentoItemParams);
|
|
|
|
// Limpa o item selecionado
|
|
setItemToDelete(null);
|
|
|
|
// Fecha o modal
|
|
handleCancel();
|
|
}, [itemToDelete, indexGEmolumentoItem, handleCancel]);
|
|
|
|
/**
|
|
* Busca inicial dos dados
|
|
*/
|
|
useEffect(() => {
|
|
indexGEmolumentoItem(gEmolumentoItemParams);
|
|
}, []);
|
|
|
|
/**
|
|
* Tela de loading enquanto carrega os dados
|
|
*/
|
|
if (gEmolumentoItem?.length == 0) {
|
|
return <Loading type={2} />;
|
|
}
|
|
|
|
return (
|
|
<div>
|
|
{/* Cabeçalho */}
|
|
<Header
|
|
title="Itens de Emolumentos"
|
|
description="Itens de Emolumentos"
|
|
buttonText="Novo Item"
|
|
buttonAction={() => handleOpenForm(null)}
|
|
/>
|
|
|
|
{/* Tabela */}
|
|
<GEmolumentoItemTable
|
|
data={gEmolumentoItem}
|
|
onEdit={handleOpenForm}
|
|
onDelete={handleConfirmDelete}
|
|
/>
|
|
|
|
{/* Modal de confirmação */}
|
|
{isConfirmOpen && (
|
|
<ConfirmDialog
|
|
isOpen={isConfirmOpen}
|
|
title="Confirmar exclusão"
|
|
description="Atenção"
|
|
message={`Deseja realmente excluir o valor "${itemToDelete?.valor_emolumento}"?`}
|
|
confirmText="Sim, excluir"
|
|
cancelText="Cancelar"
|
|
onConfirm={handleDelete}
|
|
onCancel={handleCancel}
|
|
/>
|
|
)}
|
|
|
|
{/* Formulário */}
|
|
{isFormOpen && (
|
|
<GEmolumentoItemForm
|
|
isOpen={isFormOpen}
|
|
data={selectedData}
|
|
onClose={handleCloseForm}
|
|
onSave={handleSave}
|
|
buttonIsLoading={buttonIsLoading}
|
|
/>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|