feat: Add 'atas' (minutes/records) management feature, and implement various improvements across UI, backend logic, and authentication.

This commit is contained in:
2025-12-02 16:37:48 -03:00
parent 05e7f1181d
commit 4bd9e21748
265 changed files with 29156 additions and 26460 deletions

View File

@@ -1,7 +1,7 @@
<script lang="ts">
import { useConvexClient } from 'convex-svelte';
import { api } from '@sgse-app/backend/convex/_generated/api';
import type { Id, Doc } from '@sgse-app/backend/convex/_generated/dataModel';
import type { Doc, Id } from '@sgse-app/backend/convex/_generated/dataModel';
import { useConvexClient } from 'convex-svelte';
import ErrorModal from './ErrorModal.svelte';
type SolicitacaoAusencia = Doc<'solicitacoesAusencias'> & {
@@ -17,11 +17,11 @@
onCancelar?: () => void;
}
let { solicitacao, gestorId, onSucesso, onCancelar }: Props = $props();
const { solicitacao, gestorId, onSucesso, onCancelar }: Props = $props();
const client = useConvexClient();
let motivoReprovacao = $state('');
const motivoReprovacao = $state('');
let processando = $state(false);
let erro = $state('');
let mostrarModalErro = $state(false);
@@ -138,12 +138,12 @@
</div>
<!-- Card Principal -->
<div class="card bg-base-100 border-t-4 border-primary shadow-2xl">
<div class="card bg-base-100 border-primary border-t-4 shadow-2xl">
<div class="card-body p-8">
<!-- Informações do Funcionário -->
<div class="mb-8">
<h3 class="mb-5 flex items-center gap-3 text-xl font-bold text-primary">
<div class="rounded-lg bg-primary/10 p-2">
<h3 class="text-primary mb-5 flex items-center gap-3 text-xl font-bold">
<div class="bg-primary/10 rounded-lg p-2">
<svg
xmlns="http://www.w3.org/2000/svg"
class="text-primary h-6 w-6"
@@ -162,17 +162,17 @@
Funcionário
</h3>
<div class="grid grid-cols-1 gap-5 md:grid-cols-2">
<div class="rounded-xl bg-base-200/50 p-4 transition-all hover:bg-base-200">
<p class="mb-2 text-sm font-semibold uppercase tracking-wide text-base-content/60">
<div class="bg-base-200/50 hover:bg-base-200 rounded-xl p-4 transition-all">
<p class="text-base-content/60 mb-2 text-sm font-semibold tracking-wide uppercase">
Nome
</p>
<p class="text-lg font-bold text-base-content">
<p class="text-base-content text-lg font-bold">
{solicitacao.funcionario?.nome || 'N/A'}
</p>
</div>
{#if solicitacao.time}
<div class="rounded-xl bg-base-200/50 p-4 transition-all hover:bg-base-200">
<p class="mb-2 text-sm font-semibold uppercase tracking-wide text-base-content/60">
<div class="bg-base-200/50 hover:bg-base-200 rounded-xl p-4 transition-all">
<p class="text-base-content/60 mb-2 text-sm font-semibold tracking-wide uppercase">
Time
</p>
<div
@@ -191,8 +191,8 @@
<!-- Período da Ausência -->
<div class="mb-8">
<h3 class="mb-5 flex items-center gap-3 text-xl font-bold text-primary">
<div class="rounded-lg bg-primary/10 p-2">
<h3 class="text-primary mb-5 flex items-center gap-3 text-xl font-bold">
<div class="bg-primary/10 rounded-lg p-2">
<svg
xmlns="http://www.w3.org/2000/svg"
class="text-primary h-6 w-6"
@@ -212,26 +212,26 @@
</h3>
<div class="grid grid-cols-1 gap-4 md:grid-cols-3">
<div
class="stat rounded-xl border-2 border-primary/20 bg-gradient-to-br from-primary/5 to-primary/10 shadow-md transition-all hover:border-primary/30 hover:shadow-lg"
class="stat border-primary/20 from-primary/5 to-primary/10 hover:border-primary/30 rounded-xl border-2 bg-gradient-to-br shadow-md transition-all hover:shadow-lg"
>
<div class="stat-title text-base-content/70">Data Início</div>
<div class="stat-value text-2xl text-primary">
<div class="stat-value text-primary text-2xl">
{new Date(solicitacao.dataInicio).toLocaleDateString('pt-BR')}
</div>
</div>
<div
class="stat rounded-xl border-2 border-primary/20 bg-gradient-to-br from-primary/5 to-primary/10 shadow-md transition-all hover:border-primary/30 hover:shadow-lg"
class="stat border-primary/20 from-primary/5 to-primary/10 hover:border-primary/30 rounded-xl border-2 bg-gradient-to-br shadow-md transition-all hover:shadow-lg"
>
<div class="stat-title text-base-content/70">Data Fim</div>
<div class="stat-value text-2xl text-primary">
<div class="stat-value text-primary text-2xl">
{new Date(solicitacao.dataFim).toLocaleDateString('pt-BR')}
</div>
</div>
<div
class="stat rounded-xl border-2 border-primary/30 bg-gradient-to-br from-primary/10 to-primary/15 shadow-md transition-all hover:border-primary/40 hover:shadow-lg"
class="stat border-primary/30 from-primary/10 to-primary/15 hover:border-primary/40 rounded-xl border-2 bg-gradient-to-br shadow-md transition-all hover:shadow-lg"
>
<div class="stat-title text-base-content/70">Total de Dias</div>
<div class="stat-value text-3xl font-bold text-primary">
<div class="stat-value text-primary text-3xl font-bold">
{totalDias}
</div>
<div class="stat-desc text-base-content/60">dias corridos</div>
@@ -243,8 +243,8 @@
<!-- Motivo -->
<div class="mb-8">
<h3 class="mb-5 flex items-center gap-3 text-xl font-bold text-primary">
<div class="rounded-lg bg-primary/10 p-2">
<h3 class="text-primary mb-5 flex items-center gap-3 text-xl font-bold">
<div class="bg-primary/10 rounded-lg p-2">
<svg
xmlns="http://www.w3.org/2000/svg"
class="text-primary h-6 w-6"
@@ -262,9 +262,9 @@
</div>
Motivo da Ausência
</h3>
<div class="card rounded-xl border-2 border-primary/10 bg-base-200/50 shadow-sm">
<div class="card border-primary/10 bg-base-200/50 rounded-xl border-2 shadow-sm">
<div class="card-body p-5">
<p class="whitespace-pre-wrap leading-relaxed text-base-content">
<p class="text-base-content leading-relaxed whitespace-pre-wrap">
{solicitacao.motivo}
</p>
</div>
@@ -272,9 +272,9 @@
</div>
<!-- Status Atual -->
<div class="mb-8 rounded-xl bg-base-200/30 p-4">
<div class="bg-base-200/30 mb-8 rounded-xl p-4">
<div class="flex items-center gap-3">
<span class="text-sm font-semibold uppercase tracking-wide text-base-content/70"
<span class="text-base-content/70 text-sm font-semibold tracking-wide uppercase"
>Status:</span
>
<div class={`badge badge-lg ${getStatusBadge(solicitacao.status)}`}>
@@ -362,14 +362,14 @@
<!-- Modal de Reprovação -->
{#if motivoReprovacao !== undefined}
<div class="mt-6 rounded-xl border-2 border-error/20 bg-error/5 p-5">
<div class="border-error/20 bg-error/5 mt-6 rounded-xl border-2 p-5">
<div class="form-control">
<label class="label" for="motivo-reprovacao">
<span class="label-text font-bold text-error">Motivo da Reprovação</span>
<span class="label-text text-error font-bold">Motivo da Reprovação</span>
</label>
<textarea
id="motivo-reprovacao"
class="textarea textarea-bordered h-24 focus:border-error focus:outline-error"
class="textarea textarea-bordered focus:border-error focus:outline-error h-24"
placeholder="Informe o motivo da reprovação..."
bind:value={motivoReprovacao}
></textarea>