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,95 +1,96 @@
<script lang="ts">
import { Trophy, Award, Building2, Workflow, Target } from "lucide-svelte";
import { resolve } from "$app/paths";
import ProtectedRoute from "$lib/components/ProtectedRoute.svelte";
</script>
<ProtectedRoute>
<main class="container mx-auto px-4 py-4">
<div class="text-sm breadcrumbs mb-4">
<ul>
<li><a href={resolve('/')} class="text-primary hover:underline">Dashboard</a></li>
<li>Programas Esportivos</li>
</ul>
</div>
<div class="mb-6">
<div class="flex items-center gap-4 mb-2">
<div class="p-3 bg-yellow-500/20 rounded-xl">
<Trophy class="h-8 w-8 text-yellow-600" strokeWidth={2} />
</div>
<div>
<h1 class="text-3xl font-bold text-primary">Programas Esportivos</h1>
<p class="text-base-content/70">Gestão de programas e projetos esportivos</p>
</div>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
<a
href={resolve('/licitacoes/empresas')}
class="card bg-base-100 shadow-md hover:shadow-lg transition-shadow border border-base-200 hover:border-primary"
>
<div class="card-body">
<div class="flex items-center gap-3 mb-2">
<div class="p-2 bg-primary/10 rounded-lg">
<Building2 class="h-6 w-6 text-primary" strokeWidth={2} />
</div>
<h4 class="font-semibold">Empresas</h4>
</div>
<p class="text-sm text-base-content/70">
Cadastro, listagem e edição de empresas e seus contatos.
</p>
</div>
</a>
<a
href={resolve('/programas-esportivos/acoes')}
class="card bg-base-100 shadow-md hover:shadow-lg transition-shadow border border-base-200 hover:border-accent"
>
<div class="card-body">
<div class="flex items-center gap-3 mb-2">
<div class="p-2 bg-accent/10 rounded-lg">
<Target class="h-6 w-6 text-accent" strokeWidth={2} />
</div>
<h4 class="font-semibold">Ações</h4>
</div>
<p class="text-sm text-base-content/70">
Gerencie ações, projetos e leis relacionadas aos programas esportivos.
</p>
</div>
</a>
<div class="card bg-base-100 shadow-md opacity-70">
<div class="card-body">
<div class="flex items-center gap-3 mb-2">
<div class="p-2 bg-base-200 rounded-lg">
<Award class="h-6 w-6 text-base-content/50" strokeWidth={2} />
</div>
<h4 class="font-semibold text-base-content/70">Programas Esportivos</h4>
</div>
<p class="text-sm text-base-content/60">
Em breve: funcionalidades para gestão de programas e projetos esportivos.
</p>
</div>
</div>
<a
href={resolve('/fluxos')}
class="card bg-base-100 shadow-md hover:shadow-lg transition-shadow border border-base-200 hover:border-secondary"
>
<div class="card-body">
<div class="flex items-center gap-3 mb-2">
<div class="p-2 bg-secondary/10 rounded-lg">
<Workflow class="h-6 w-6 text-secondary" strokeWidth={2} />
</div>
<h4 class="font-semibold">Fluxos de Trabalho</h4>
</div>
<p class="text-sm text-base-content/70">
Gerencie templates e instâncias de fluxos de trabalho para programas e projetos esportivos.
</p>
</div>
</a>
</div>
</main>
</ProtectedRoute>
<script lang="ts">
import { Award, Building2, Target, Trophy, Workflow } from 'lucide-svelte';
import { resolve } from '$app/paths';
import ProtectedRoute from '$lib/components/ProtectedRoute.svelte';
</script>
<ProtectedRoute>
<main class="container mx-auto px-4 py-4">
<div class="breadcrumbs mb-4 text-sm">
<ul>
<li><a href={resolve('/')} class="text-primary hover:underline">Dashboard</a></li>
<li>Programas Esportivos</li>
</ul>
</div>
<div class="mb-6">
<div class="mb-2 flex items-center gap-4">
<div class="rounded-xl bg-yellow-500/20 p-3">
<Trophy class="h-8 w-8 text-yellow-600" strokeWidth={2} />
</div>
<div>
<h1 class="text-primary text-3xl font-bold">Programas Esportivos</h1>
<p class="text-base-content/70">Gestão de programas e projetos esportivos</p>
</div>
</div>
</div>
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
<a
href={resolve('/licitacoes/empresas')}
class="card bg-base-100 border-base-200 hover:border-primary border shadow-md transition-shadow hover:shadow-lg"
>
<div class="card-body">
<div class="mb-2 flex items-center gap-3">
<div class="bg-primary/10 rounded-lg p-2">
<Building2 class="text-primary h-6 w-6" strokeWidth={2} />
</div>
<h4 class="font-semibold">Empresas</h4>
</div>
<p class="text-base-content/70 text-sm">
Cadastro, listagem e edição de empresas e seus contatos.
</p>
</div>
</a>
<a
href={resolve('/programas-esportivos/acoes')}
class="card bg-base-100 border-base-200 hover:border-accent border shadow-md transition-shadow hover:shadow-lg"
>
<div class="card-body">
<div class="mb-2 flex items-center gap-3">
<div class="bg-accent/10 rounded-lg p-2">
<Target class="text-accent h-6 w-6" strokeWidth={2} />
</div>
<h4 class="font-semibold">Ações</h4>
</div>
<p class="text-base-content/70 text-sm">
Gerencie ações, projetos e leis relacionadas aos programas esportivos.
</p>
</div>
</a>
<div class="card bg-base-100 opacity-70 shadow-md">
<div class="card-body">
<div class="mb-2 flex items-center gap-3">
<div class="bg-base-200 rounded-lg p-2">
<Award class="text-base-content/50 h-6 w-6" strokeWidth={2} />
</div>
<h4 class="text-base-content/70 font-semibold">Programas Esportivos</h4>
</div>
<p class="text-base-content/60 text-sm">
Em breve: funcionalidades para gestão de programas e projetos esportivos.
</p>
</div>
</div>
<a
href={resolve('/fluxos')}
class="card bg-base-100 border-base-200 hover:border-secondary border shadow-md transition-shadow hover:shadow-lg"
>
<div class="card-body">
<div class="mb-2 flex items-center gap-3">
<div class="bg-secondary/10 rounded-lg p-2">
<Workflow class="text-secondary h-6 w-6" strokeWidth={2} />
</div>
<h4 class="font-semibold">Fluxos de Trabalho</h4>
</div>
<p class="text-base-content/70 text-sm">
Gerencie templates e instâncias de fluxos de trabalho para programas e projetos
esportivos.
</p>
</div>
</a>
</div>
</main>
</ProtectedRoute>

View File

@@ -1,8 +1,8 @@
<script lang="ts">
import { useQuery, 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 { Plus, Pencil, Trash2, X } from 'lucide-svelte';
import type { Doc, Id } from '@sgse-app/backend/convex/_generated/dataModel';
import { useConvexClient, useQuery } from 'convex-svelte';
import { Pencil, Plus, Trash2, X } from 'lucide-svelte';
const client = useConvexClient();