From c19c8c859e06491fa289b6b3c044fae2ac3aff4c Mon Sep 17 00:00:00 2001 From: deyvisonwanderley Date: Mon, 1 Dec 2025 22:04:32 -0300 Subject: [PATCH 01/52] feat: add setores display and loading state to perfil page, and implement click outside functionality for dropdown menus in funcionarios page --- .../routes/(dashboard)/perfil/+page.svelte | 42 ++++++++++++ .../funcionarios/+page.svelte | 66 +++++++++++++++++-- 2 files changed, 103 insertions(+), 5 deletions(-) diff --git a/apps/web/src/routes/(dashboard)/perfil/+page.svelte b/apps/web/src/routes/(dashboard)/perfil/+page.svelte index 5c162ca..b7438ba 100644 --- a/apps/web/src/routes/(dashboard)/perfil/+page.svelte +++ b/apps/web/src/routes/(dashboard)/perfil/+page.svelte @@ -199,6 +199,13 @@ }); }); + const setoresQuery = $derived.by(() => { + if (!funcionarioIdParaQueries) return { data: [] }; + return useQuery(api.setores.getSetoresByFuncionario, { + funcionarioId: funcionarioIdParaQueries + }); + }); + $effect(() => { if (meuTimeQuery?.data && funcionarioIdParaQueries) { meuTimeEstavel = meuTimeQuery.data; @@ -1186,6 +1193,41 @@ +
+
+ +
+
+ Setores + {#if setoresQuery?.data && setoresQuery.data.length > 0} +
+ {#each setoresQuery.data as setor} +
+ {setor.nome} + {#if setor.sigla} + ({setor.sigla}) + {/if} +
+ {/each} +
+ {:else if setoresQuery?.isLoading} +

Carregando...

+ {:else} +

Nenhum setor atribuído

+ {/if} +
+
+
diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/+page.svelte index ca05422..c46f962 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/+page.svelte @@ -79,6 +79,42 @@ openMenuId = openMenuId === id ? null : id; } + function closeMenu() { + openMenuId = null; + } + + // Fechar menu ao clicar fora + $effect(() => { + if (!openMenuId) return; + + function handleClickOutside(event: MouseEvent) { + const target = event.target as HTMLElement; + // Verificar se o clique foi fora do dropdown (botão e menu) + const dropdown = target.closest('.dropdown'); + if (!dropdown) { + openMenuId = null; + } + } + + function handleEscape(event: KeyboardEvent) { + if (event.key === 'Escape') { + openMenuId = null; + } + } + + // Adicionar listeners no próximo tick para não interferir com o clique que abriu o menu + const timeoutId = setTimeout(() => { + document.addEventListener('click', handleClickOutside); + document.addEventListener('keydown', handleEscape); + }, 10); + + return () => { + clearTimeout(timeoutId); + document.removeEventListener('click', handleClickOutside); + document.removeEventListener('keydown', handleEscape); + }; + }); + async function openSetoresModal(funcionarioId: Id<'funcionarios'>, nome: string) { funcionarioParaSetores = { _id: funcionarioId, nome }; setoresSelecionados = []; @@ -382,30 +418,50 @@ class="dropdown-content menu bg-base-100 rounded-box border-base-300 z-20 w-52 border p-2 shadow-xl" >
  • - + Ver Detalhes
  • - + Editar
  • - + Ver Documentos
  • -
  • From 95c3b48ae63884fb2009ee5119d38913f777c4fc Mon Sep 17 00:00:00 2001 From: deyvisonwanderley Date: Mon, 1 Dec 2025 22:13:01 -0300 Subject: [PATCH 02/52] feat: add UserAvatar component to display employee profile pictures in various HR pages, enhancing visual representation of employee data --- .../atestados-licencas/+page.svelte | 23 ++++++++- .../controle-ponto/dispensa/+page.svelte | 45 +++++++++++------ .../controle-ponto/homologacao/+page.svelte | 50 +++++++++++++------ packages/backend/convex/atestadosLicencas.ts | 30 +++++++++++ packages/backend/convex/pontos.ts | 49 +++++++++++++++++- packages/backend/convex/times.ts | 15 +++++- 6 files changed, 178 insertions(+), 34 deletions(-) diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/atestados-licencas/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/atestados-licencas/+page.svelte index 8f255b8..8c52c8c 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/atestados-licencas/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/atestados-licencas/+page.svelte @@ -11,6 +11,7 @@ import ErrorModal from '$lib/components/ErrorModal.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'; import type { Id } from '@sgse-app/backend/convex/_generated/dataModel'; import jsPDF from 'jspdf'; import autoTable from 'jspdf-autotable'; @@ -1578,7 +1579,16 @@ {#each registrosFiltrados.atestados as atestado} - {atestado.funcionario?.nome || '-'} + +
    + + {atestado.funcionario?.nome || '-'} +
    + + + {licenca.funcionario?.nome || '-'} +
    + {#each funcionarios as funcionario}