feat: update PDF generation to use symbols for day types and implement confirmation modal for record deletion in absence and license management, enhancing user experience and data integrity
This commit is contained in:
@@ -216,14 +216,14 @@ function gerarTabelaRegistrosPDF(
|
||||
}
|
||||
};
|
||||
|
||||
// Função auxiliar para obter ícone do tipo de dia
|
||||
const obterIconeTipoDia = (dia: DiaFichaPonto): string => {
|
||||
if (dia.atestado) return '🏥';
|
||||
if (dia.ausencia) return '🚫';
|
||||
if (dia.licenca) return '📋';
|
||||
if (dia.tipoDia === 'abonado') return '✅';
|
||||
if (dia.tipoDia === 'nao_computado') return '⏸';
|
||||
if (dia.inconsistencias.length > 0) return '⚠';
|
||||
// Função auxiliar para obter símbolo do tipo de dia
|
||||
const obterSimboloTipoDia = (dia: DiaFichaPonto): string => {
|
||||
if (dia.atestado) return 'AT';
|
||||
if (dia.ausencia) return 'AUS';
|
||||
if (dia.licenca) return 'LIC';
|
||||
if (dia.tipoDia === 'abonado') return 'ABO';
|
||||
if (dia.tipoDia === 'nao_computado') return 'NC';
|
||||
if (dia.inconsistencias.length > 0) return 'INC';
|
||||
return '';
|
||||
};
|
||||
|
||||
@@ -258,8 +258,10 @@ function gerarTabelaRegistrosPDF(
|
||||
|
||||
// Coluna Data (apenas na primeira linha)
|
||||
if (i === 0) {
|
||||
const simbolo = obterSimboloTipoDia(dia);
|
||||
const dataComSimbolo = simbolo ? `${dataFormatada} [${simbolo}]` : dataFormatada;
|
||||
linha.push({
|
||||
content: `${dataFormatada} ${obterIconeTipoDia(dia)}`,
|
||||
content: dataComSimbolo,
|
||||
styles: {
|
||||
fillColor: obterCorFundoTipoDia(dia.tipoDia),
|
||||
fontStyle: 'bold'
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
import FuncionarioMatriculaAutocomplete from '$lib/components/FuncionarioMatriculaAutocomplete.svelte';
|
||||
import FileUpload from '$lib/components/FileUpload.svelte';
|
||||
import ErrorModal from '$lib/components/ErrorModal.svelte';
|
||||
import ConfirmModal from '$lib/components/ConfirmModal.svelte';
|
||||
import CalendarioAfastamentos from '$lib/components/CalendarioAfastamentos.svelte';
|
||||
import AreaChart from '$lib/components/ti/charts/AreaChart.svelte';
|
||||
import UserAvatar from '$lib/components/chat/UserAvatar.svelte';
|
||||
@@ -132,6 +133,14 @@
|
||||
titulo: ''
|
||||
});
|
||||
|
||||
// Modal de exclusão
|
||||
let exclusaoModal = $state({
|
||||
aberto: false,
|
||||
tipo: null as 'atestado' | 'licenca' | null,
|
||||
id: null as string | null,
|
||||
nome: ''
|
||||
});
|
||||
|
||||
// Licenças maternidade para prorrogação (derivar dos dados já carregados)
|
||||
let licencasMaternidade = $derived.by(() => {
|
||||
const dados = dadosQuery?.data;
|
||||
@@ -651,26 +660,42 @@
|
||||
}
|
||||
});
|
||||
|
||||
// Excluir registro
|
||||
async function excluirRegistro(tipo: 'atestado' | 'licenca', id: string) {
|
||||
if (!confirm(`Tem certeza que deseja excluir este ${tipo}?`)) return;
|
||||
// Abrir modal de exclusão
|
||||
function abrirModalExclusao(tipo: 'atestado' | 'licenca', id: string, nome: string) {
|
||||
exclusaoModal = {
|
||||
aberto: true,
|
||||
tipo,
|
||||
id,
|
||||
nome
|
||||
};
|
||||
}
|
||||
|
||||
// Confirmar exclusão
|
||||
async function confirmarExclusao() {
|
||||
if (!exclusaoModal.tipo || !exclusaoModal.id) return;
|
||||
|
||||
try {
|
||||
if (tipo === 'atestado') {
|
||||
if (exclusaoModal.tipo === 'atestado') {
|
||||
await client.mutation(api.atestadosLicencas.excluirAtestado, {
|
||||
id: id as Id<'atestados'>
|
||||
id: exclusaoModal.id as Id<'atestados'>
|
||||
});
|
||||
} else {
|
||||
await client.mutation(api.atestadosLicencas.excluirLicenca, {
|
||||
id: id as Id<'licencas'>
|
||||
id: exclusaoModal.id as Id<'licencas'>
|
||||
});
|
||||
}
|
||||
toast.success('Registro excluído com sucesso!');
|
||||
exclusaoModal.aberto = false;
|
||||
} catch (error: unknown) {
|
||||
toast.error(getErrorMessage(error, 'Erro ao excluir registro'));
|
||||
}
|
||||
}
|
||||
|
||||
// Cancelar exclusão
|
||||
function cancelarExclusao() {
|
||||
exclusaoModal.aberto = false;
|
||||
}
|
||||
|
||||
// Filtrar registros
|
||||
let registrosFiltrados = $derived.by(() => {
|
||||
const dados = dadosQuery?.data;
|
||||
@@ -1677,7 +1702,12 @@
|
||||
{/if}
|
||||
<button
|
||||
class="btn btn-xs btn-error"
|
||||
onclick={() => excluirRegistro('atestado', atestado._id)}
|
||||
onclick={() =>
|
||||
abrirModalExclusao(
|
||||
'atestado',
|
||||
atestado._id,
|
||||
`${atestado.tipo === 'atestado_medico' ? 'Atestado Médico' : 'Declaração'} - ${atestado.funcionario?.nome || 'Funcionário'}`
|
||||
)}
|
||||
>
|
||||
Excluir
|
||||
</button>
|
||||
@@ -1739,7 +1769,12 @@
|
||||
{/if}
|
||||
<button
|
||||
class="btn btn-xs btn-error"
|
||||
onclick={() => excluirRegistro('licenca', licenca._id)}
|
||||
onclick={() =>
|
||||
abrirModalExclusao(
|
||||
'licenca',
|
||||
licenca._id,
|
||||
`${licenca.tipo === 'maternidade' ? 'Licença Maternidade' : 'Licença Paternidade'} - ${licenca.funcionario?.nome || 'Funcionário'}`
|
||||
)}
|
||||
>
|
||||
Excluir
|
||||
</button>
|
||||
@@ -2438,6 +2473,17 @@
|
||||
}}
|
||||
/>
|
||||
|
||||
<!-- Modal de Confirmação de Exclusão -->
|
||||
<ConfirmModal
|
||||
bind:open={exclusaoModal.aberto}
|
||||
title="Confirmar Exclusão"
|
||||
message="Tem certeza que deseja excluir este registro? Esta ação não pode ser desfeita e todos os dados relacionados serão removidos permanentemente."
|
||||
confirmText="Excluir"
|
||||
cancelText="Cancelar"
|
||||
onConfirm={confirmarExclusao}
|
||||
onCancel={cancelarExclusao}
|
||||
/>
|
||||
|
||||
<!-- Modal de Documento -->
|
||||
{#if documentoModal.aberto}
|
||||
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
||||
|
||||
Reference in New Issue
Block a user