170 lines
4.6 KiB
TypeScript
170 lines
4.6 KiB
TypeScript
'use client';
|
|
|
|
import { useCallback, useEffect, useState } from 'react';
|
|
|
|
import { Card, CardContent } from '@/components/ui/card';
|
|
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 { useTCensecDeleteHook } from '@/packages/administrativo/hooks/TCensec/useTCensecDeleteHook';
|
|
import { useTCensecReadHook } from '@/packages/administrativo/hooks/TCensec/useTCensecReadHook';
|
|
import { useTCensecSaveHook } from '@/packages/administrativo/hooks/TCensec/useTCensecSaveHook';
|
|
import TCensecInterface from '@/packages/administrativo/interfaces/TCensec/TCensecInterface';
|
|
import TCensecForm from './TCensecForm';
|
|
import TCensecTable from './TCensecTable';
|
|
|
|
export default function TCensecIndex() {
|
|
// Controle de estado do botão
|
|
const [buttonIsLoading, setButtonIsLoading] = useState(false);
|
|
|
|
// Hooks para leitura e salvamento
|
|
const { tCensec, fetchTCensec } = useTCensecReadHook();
|
|
const { saveTCensec } = useTCensecSaveHook();
|
|
const { deleteTCensec } = useTCensecDeleteHook();
|
|
|
|
// Estados
|
|
const [selectedAndamento, setSelectedAndamento] = useState<TCensecInterface | null>(null);
|
|
const [isFormOpen, setIsFormOpen] = useState(false);
|
|
|
|
// Estado para saber qual item será deletado
|
|
const [itemToDelete, setItemToDelete] = useState<TCensecInterface | null>(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: TCensecInterface | 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: TCensecInterface) => {
|
|
// 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
|
|
fetchTCensec();
|
|
},
|
|
[saveTCensec, fetchTCensec, handleCloseForm],
|
|
);
|
|
|
|
/**
|
|
* Quando o usuário clica em "remover" na tabela
|
|
*/
|
|
const handleConfirmDelete = useCallback(
|
|
(item: TCensecInterface) => {
|
|
// 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 fetchTCensec();
|
|
|
|
// Limpa o item selecionado
|
|
setItemToDelete(null);
|
|
|
|
// Fecha o modal
|
|
handleCancel();
|
|
}, [itemToDelete, fetchTCensec, handleCancel]);
|
|
|
|
/**
|
|
* Busca inicial dos dados
|
|
*/
|
|
useEffect(() => {
|
|
fetchTCensec();
|
|
}, []);
|
|
|
|
/**
|
|
* Tela de loading enquanto carrega os dados
|
|
*/
|
|
if (tCensec.length == 0) {
|
|
return <Loading type={2} />;
|
|
}
|
|
|
|
return (
|
|
<div>
|
|
{/* Cabeçalho */}
|
|
<Header
|
|
title={'CENSEC'}
|
|
description={'Gerenciamento de Centrais'}
|
|
buttonText={'Nova Central'}
|
|
buttonAction={() => {
|
|
handleOpenForm(null);
|
|
}}
|
|
/>
|
|
|
|
{/* Tabela de andamentos */}
|
|
<Card>
|
|
<CardContent>
|
|
<TCensecTable data={tCensec} onEdit={handleOpenForm} onDelete={handleConfirmDelete} />
|
|
</CardContent>
|
|
</Card>
|
|
|
|
{/* Modal de confirmação */}
|
|
<ConfirmDialog
|
|
isOpen={isConfirmOpen}
|
|
title="Confirmar exclusão"
|
|
description="Atenção"
|
|
message={`Deseja realmente excluir o andamento "${itemToDelete?.descricao}"?`}
|
|
confirmText="Sim, excluir"
|
|
cancelText="Cancelar"
|
|
onConfirm={handleDelete}
|
|
onCancel={handleCancel}
|
|
/>
|
|
|
|
{/* Formulário de criação/edição */}
|
|
<TCensecForm
|
|
isOpen={isFormOpen}
|
|
data={selectedAndamento}
|
|
onClose={handleCloseForm}
|
|
onSave={handleSave}
|
|
buttonIsLoading={buttonIsLoading}
|
|
/>
|
|
</div>
|
|
);
|
|
4;
|
|
}
|