From 8a50fb6f617e777cbd4122364ae9d198b377087c Mon Sep 17 00:00:00 2001 From: killer-cf Date: Tue, 2 Dec 2025 19:18:53 -0300 Subject: [PATCH] fix: Correct incomplete `$state` initialization in multiple Svelte components and pages. --- .../web/src/lib/components/ActionGuard.svelte | 2 +- .../lib/components/AprovarAusencias.svelte | 4 +- .../src/lib/components/AprovarFerias.svelte | 6 +- .../components/CalendarioAfastamentos.svelte | 6 +- apps/web/src/lib/components/ErrorModal.svelte | 2 +- .../FuncionarioMatriculaAutocomplete.svelte | 4 +- .../FuncionarioNomeAutocomplete.svelte | 4 +- .../lib/components/FuncionarioSelect.svelte | 6 +- .../src/lib/components/MenuProtection.svelte | 2 +- apps/web/src/lib/components/PrintModal.svelte | 2 +- .../src/lib/components/RelogioPrazo.svelte | 2 +- apps/web/src/lib/components/Sidebar.svelte | 4 +- .../src/lib/components/SolicitarFerias.svelte | 4 +- .../ausencias/CalendarioAusencias.svelte | 2 +- .../WizardSolicitacaoAusencia.svelte | 6 +- .../lib/components/call/CallControls.svelte | 2 +- .../lib/components/call/CallSettings.svelte | 4 +- .../src/lib/components/call/CallWindow.svelte | 18 ++-- .../lib/components/chamados/TicketCard.svelte | 4 +- .../lib/components/chamados/TicketForm.svelte | 4 +- .../components/chamados/TicketTimeline.svelte | 2 +- .../src/lib/components/chat/ChatList.svelte | 59 ++++++------ .../src/lib/components/chat/ChatWidget.svelte | 4 +- .../src/lib/components/chat/ChatWindow.svelte | 14 +-- .../lib/components/chat/MessageInput.svelte | 6 +- .../lib/components/chat/MessageList.svelte | 2 +- .../chat/NewConversationModal.svelte | 10 +- .../components/chat/NotificationBell.svelte | 8 +- .../components/chat/PresenceManager.svelte | 2 +- .../components/chat/SalaReuniaoManager.svelte | 14 +-- .../components/chat/UserStatusBadge.svelte | 2 +- .../components/ferias/CalendarioFerias.svelte | 2 +- .../components/ferias/DashboardFerias.svelte | 18 ++-- .../ferias/WizardSolicitacaoFerias.svelte | 24 ++--- .../components/ponto/PrintPontoModal.svelte | 2 +- .../lib/components/ponto/RegistroPonto.svelte | 32 +++---- .../ponto/RelogioSincronizado.svelte | 4 +- .../lib/components/ponto/WebcamCapture.svelte | 4 +- .../lib/components/ti/AlertConfigModal.svelte | 2 +- .../components/ti/CybersecurityWizcard.svelte | 40 ++++---- .../components/ti/ReportGeneratorModal.svelte | 8 +- .../components/ti/SystemMonitorCard.svelte | 6 +- .../ti/SystemMonitorCardLocal.svelte | 12 +-- .../lib/components/ti/UserStatusBadge.svelte | 2 +- .../web/src/routes/(dashboard)/+layout.svelte | 2 +- .../(dashboard)/abrir-chamado/+page.svelte | 2 +- .../(dashboard)/alterar-senha/+page.svelte | 6 +- .../(dashboard)/compras/atas/+page.svelte | 8 +- .../(dashboard)/compras/objetos/+page.svelte | 6 +- .../routes/(dashboard)/fluxos/+page.svelte | 2 +- .../fluxos/[id]-fluxo/+page.svelte | 4 +- .../fluxos/[id]/editor/+page.svelte | 4 +- .../fluxos/instancias/+page.svelte | 2 +- .../gestao-ausencias/+page.svelte | 8 +- .../licitacoes/contratos/+page.svelte | 14 +-- .../licitacoes/contratos/[id]/+page.svelte | 10 +- .../licitacoes/contratos/novo/+page.svelte | 6 +- .../licitacoes/fluxos/+page.svelte | 2 +- .../licitacoes/fluxos/[id]/+page.svelte | 2 +- .../routes/(dashboard)/pedidos/+page.svelte | 6 +- .../(dashboard)/pedidos/[id]/+page.svelte | 18 ++-- .../(dashboard)/pedidos/novo/+page.svelte | 8 +- .../routes/(dashboard)/perfil/+page.svelte | 74 +++++++------- .../(dashboard)/perfil/chamados/+page.svelte | 10 +- .../programas-esportivos/acoes/+page.svelte | 6 +- .../atestados-licencas/+page.svelte | 16 ++-- .../recursos-humanos/ausencias/+page.svelte | 8 +- .../controle-ponto/dispensa/+page.svelte | 10 +- .../controle-ponto/homologacao/+page.svelte | 28 +++--- .../recursos-humanos/ferias/+page.svelte | 36 +++---- .../funcionarios/+page.svelte | 8 +- .../funcionarios/[funcionarioId]/+page.svelte | 4 +- .../[funcionarioId]/documentos/+page.svelte | 6 +- .../[funcionarioId]/editar/+page.svelte | 2 +- .../enderecos-marcacao/+page.svelte | 16 ++-- .../funcionarios/cadastro/+page.svelte | 96 +++++++++---------- .../funcionarios/excluir/+page.svelte | 2 +- .../funcionarios/relatorios/+page.svelte | 2 +- .../registro-pontos/+page.svelte | 24 ++--- .../simbolos/cadastro/+page.svelte | 2 +- .../gestao-ausencias/+page.svelte | 8 +- .../(dashboard)/ti/auditoria/+page.svelte | 22 ++--- .../ti/central-chamados/+page.svelte | 20 ++-- .../ti/configuracoes-email/+page.svelte | 4 +- .../ti/configuracoes-jitsi/+page.svelte | 6 +- .../enderecos/+page.svelte | 6 +- .../(dashboard)/ti/configuracoes/+page.svelte | 6 +- .../ti/monitoramento-emails/+page.svelte | 2 +- .../(dashboard)/ti/notificacoes/+page.svelte | 42 ++++---- .../ti/notificacoes/templates/+page.svelte | 8 +- .../notificacoes/templates/[id]/+page.svelte | 8 +- .../notificacoes/templates/novo/+page.svelte | 14 +-- .../ti/painel-administrativo/+page.svelte | 6 +- .../ti/painel-permissoes/+page.svelte | 16 ++-- .../routes/(dashboard)/ti/perfis/+page.svelte | 12 +-- .../routes/(dashboard)/ti/times/+page.svelte | 10 +- .../(dashboard)/ti/usuarios/+page.svelte | 10 +- .../ti/usuarios/criar/+page.svelte | 4 +- apps/web/src/routes/todos/+page.svelte | 8 +- 99 files changed, 520 insertions(+), 519 deletions(-) diff --git a/apps/web/src/lib/components/ActionGuard.svelte b/apps/web/src/lib/components/ActionGuard.svelte index 77410b0..3a774ac 100644 --- a/apps/web/src/lib/components/ActionGuard.svelte +++ b/apps/web/src/lib/components/ActionGuard.svelte @@ -19,7 +19,7 @@ // Usuário atual const currentUser = useQuery(api.auth.getCurrentUser, {}); - const permissaoQuery = $derived( + let permissaoQuery = $derived( currentUser?.data ? useQuery(api.permissoesAcoes.verificarAcao, { usuarioId: currentUser.data._id as Id<'usuarios'>, diff --git a/apps/web/src/lib/components/AprovarAusencias.svelte b/apps/web/src/lib/components/AprovarAusencias.svelte index b40312e..22ce20d 100644 --- a/apps/web/src/lib/components/AprovarAusencias.svelte +++ b/apps/web/src/lib/components/AprovarAusencias.svelte @@ -21,7 +21,7 @@ const client = useConvexClient(); - const motivoReprovacao = $state(''); + let motivoReprovacao = $state(''); let processando = $state(false); let erro = $state(''); let mostrarModalErro = $state(false); @@ -34,7 +34,7 @@ return Math.ceil(diff / (1000 * 60 * 60 * 24)) + 1; } - const totalDias = $derived(calcularDias(solicitacao.dataInicio, solicitacao.dataFim)); + let totalDias = $derived(calcularDias(solicitacao.dataInicio, solicitacao.dataFim)); async function aprovar() { try { diff --git a/apps/web/src/lib/components/AprovarFerias.svelte b/apps/web/src/lib/components/AprovarFerias.svelte index 5d764b9..a61c86e 100644 --- a/apps/web/src/lib/components/AprovarFerias.svelte +++ b/apps/web/src/lib/components/AprovarFerias.svelte @@ -20,15 +20,15 @@ const client = useConvexClient(); - const modoAjuste = $state(false); + let modoAjuste = $state(false); let novaDataInicio = $state(periodo.dataInicio); let novaDataFim = $state(periodo.dataFim); - const motivoReprovacao = $state(''); + let motivoReprovacao = $state(''); let processando = $state(false); let erro = $state(''); // Calcular dias do período ajustado - const diasAjustados = $derived.by(() => { + let diasAjustados = $derived.by(() => { if (!novaDataInicio || !novaDataFim) return 0; const inicio = new Date(novaDataInicio); const fim = new Date(novaDataFim); diff --git a/apps/web/src/lib/components/CalendarioAfastamentos.svelte b/apps/web/src/lib/components/CalendarioAfastamentos.svelte index bc54148..3f3f235 100644 --- a/apps/web/src/lib/components/CalendarioAfastamentos.svelte +++ b/apps/web/src/lib/components/CalendarioAfastamentos.svelte @@ -24,7 +24,7 @@ let calendarEl: HTMLDivElement; let calendar: Calendar | null = null; - const filtroAtivo = $state(tipoFiltro); + let filtroAtivo = $state(tipoFiltro); let showModal = $state(false); let eventoSelecionado = $state<{ title: string; @@ -35,13 +35,13 @@ } | null>(null); // Eventos filtrados - const eventosFiltrados = $derived.by(() => { + let eventosFiltrados = $derived.by(() => { if (filtroAtivo === 'todos') return eventos; return eventos.filter((e) => e.tipo === filtroAtivo); }); // Converter eventos para formato FullCalendar - const eventosFullCalendar = $derived.by(() => { + let eventosFullCalendar = $derived.by(() => { return eventosFiltrados.map((evento) => ({ id: evento.id, title: evento.title, diff --git a/apps/web/src/lib/components/ErrorModal.svelte b/apps/web/src/lib/components/ErrorModal.svelte index 8438636..8f53324 100644 --- a/apps/web/src/lib/components/ErrorModal.svelte +++ b/apps/web/src/lib/components/ErrorModal.svelte @@ -87,7 +87,7 @@ } // Verificar se details contém instruções ou apenas detalhes técnicos - const temInstrucoes = $derived.by(() => { + let temInstrucoes = $derived.by(() => { if (!details) return false; // Se contém palavras-chave de instruções, é uma instrução return ( diff --git a/apps/web/src/lib/components/FuncionarioMatriculaAutocomplete.svelte b/apps/web/src/lib/components/FuncionarioMatriculaAutocomplete.svelte index 9412dfe..1d27e69 100644 --- a/apps/web/src/lib/components/FuncionarioMatriculaAutocomplete.svelte +++ b/apps/web/src/lib/components/FuncionarioMatriculaAutocomplete.svelte @@ -20,10 +20,10 @@ // Buscar funcionários const funcionariosQuery = useQuery(api.funcionarios.getAll, {}); - const funcionarios = $derived(funcionariosQuery?.data?.filter((f) => !f.desligamentoData) || []); + let funcionarios = $derived(funcionariosQuery?.data?.filter((f) => !f.desligamentoData) || []); // Filtrar funcionários baseado na busca (por matrícula ou nome) - const funcionariosFiltrados = $derived.by(() => { + let funcionariosFiltrados = $derived.by(() => { if (!value || !value.trim()) return funcionarios.slice(0, 10); // Limitar a 10 quando vazio const termo = value.toLowerCase().trim(); diff --git a/apps/web/src/lib/components/FuncionarioNomeAutocomplete.svelte b/apps/web/src/lib/components/FuncionarioNomeAutocomplete.svelte index 1ce9375..89cf814 100644 --- a/apps/web/src/lib/components/FuncionarioNomeAutocomplete.svelte +++ b/apps/web/src/lib/components/FuncionarioNomeAutocomplete.svelte @@ -20,10 +20,10 @@ // Buscar funcionários const funcionariosQuery = useQuery(api.funcionarios.getAll, {}); - const funcionarios = $derived(funcionariosQuery?.data?.filter((f) => !f.desligamentoData) || []); + let funcionarios = $derived(funcionariosQuery?.data?.filter((f) => !f.desligamentoData) || []); // Filtrar funcionários baseado na busca (por nome ou matrícula) - const funcionariosFiltrados = $derived.by(() => { + let funcionariosFiltrados = $derived.by(() => { if (!value || !value.trim()) return funcionarios.slice(0, 10); // Limitar a 10 quando vazio const termo = value.toLowerCase().trim(); diff --git a/apps/web/src/lib/components/FuncionarioSelect.svelte b/apps/web/src/lib/components/FuncionarioSelect.svelte index a2bf93d..7d3d0ef 100644 --- a/apps/web/src/lib/components/FuncionarioSelect.svelte +++ b/apps/web/src/lib/components/FuncionarioSelect.svelte @@ -23,10 +23,10 @@ // Buscar funcionários const funcionariosQuery = useQuery(api.funcionarios.getAll, {}); - const funcionarios = $derived(funcionariosQuery?.data?.filter((f) => !f.desligamentoData) || []); + let funcionarios = $derived(funcionariosQuery?.data?.filter((f) => !f.desligamentoData) || []); // Filtrar funcionários baseado na busca - const funcionariosFiltrados = $derived.by(() => { + let funcionariosFiltrados = $derived.by(() => { if (!busca.trim()) return funcionarios; const termo = busca.toLowerCase().trim(); @@ -39,7 +39,7 @@ }); // Funcionário selecionado - const funcionarioSelecionado = $derived.by(() => { + let funcionarioSelecionado = $derived.by(() => { if (!value) return null; return funcionarios.find((f) => f._id === value); }); diff --git a/apps/web/src/lib/components/MenuProtection.svelte b/apps/web/src/lib/components/MenuProtection.svelte index b13c7e6..e9d013c 100644 --- a/apps/web/src/lib/components/MenuProtection.svelte +++ b/apps/web/src/lib/components/MenuProtection.svelte @@ -26,7 +26,7 @@ // Query para verificar permissões (só executa se o usuário estiver autenticado) const currentUser = useQuery(api.auth.getCurrentUser, {}); - const permissaoQuery = $derived( + let permissaoQuery = $derived( currentUser?.data ? useQuery(api.menuPermissoes.verificarAcesso, { usuarioId: currentUser.data._id as Id<'usuarios'>, diff --git a/apps/web/src/lib/components/PrintModal.svelte b/apps/web/src/lib/components/PrintModal.svelte index 6be86af..d9f0729 100644 --- a/apps/web/src/lib/components/PrintModal.svelte +++ b/apps/web/src/lib/components/PrintModal.svelte @@ -24,7 +24,7 @@ let generating = $state(false); // Seções selecionáveis - const sections = $state({ + let sections = $state({ dadosPessoais: true, filiacao: true, naturalidade: true, diff --git a/apps/web/src/lib/components/RelogioPrazo.svelte b/apps/web/src/lib/components/RelogioPrazo.svelte index 070c4c3..ed90531 100644 --- a/apps/web/src/lib/components/RelogioPrazo.svelte +++ b/apps/web/src/lib/components/RelogioPrazo.svelte @@ -18,7 +18,7 @@ return () => clearInterval(interval); }); - const tempoInfo = $derived.by(() => { + let tempoInfo = $derived.by(() => { // Para etapas concluídas if (status === 'completed' && finishedAt && startedAt) { const tempoExecucao = finishedAt - startedAt; diff --git a/apps/web/src/lib/components/Sidebar.svelte b/apps/web/src/lib/components/Sidebar.svelte index 4dc64cd..7ec8edf 100644 --- a/apps/web/src/lib/components/Sidebar.svelte +++ b/apps/web/src/lib/components/Sidebar.svelte @@ -16,13 +16,13 @@ const { children }: { children: Snippet } = $props(); - const currentPath = $derived(page.url.pathname); + let currentPath = $derived(page.url.pathname); const currentUser = useQuery(api.auth.getCurrentUser, {}); const convexClient = useConvexClient(); // Função para obter a URL do avatar/foto do usuário - const avatarUrlDoUsuario = $derived(() => { + let avatarUrlDoUsuario = $derived(() => { if (!currentUser.data) return null; // Prioridade: fotoPerfilUrl > avatar > fallback com nome diff --git a/apps/web/src/lib/components/SolicitarFerias.svelte b/apps/web/src/lib/components/SolicitarFerias.svelte index 607e9e8..de1210b 100644 --- a/apps/web/src/lib/components/SolicitarFerias.svelte +++ b/apps/web/src/lib/components/SolicitarFerias.svelte @@ -19,8 +19,8 @@ const client = useConvexClient(); - const anoReferencia = $state(new Date().getFullYear()); - const observacao = $state(''); + let anoReferencia = $state(new Date().getFullYear()); + let observacao = $state(''); let periodos = $state([]); let processando = $state(false); let erro = $state(''); diff --git a/apps/web/src/lib/components/ausencias/CalendarioAusencias.svelte b/apps/web/src/lib/components/ausencias/CalendarioAusencias.svelte index 830c4e1..d03f77c 100644 --- a/apps/web/src/lib/components/ausencias/CalendarioAusencias.svelte +++ b/apps/web/src/lib/components/ausencias/CalendarioAusencias.svelte @@ -41,7 +41,7 @@ }; // Converter ausências existentes em eventos - const eventos = $derived.by(() => { + let eventos = $derived.by(() => { const novosEventos: Array<{ id: string; title: string; diff --git a/apps/web/src/lib/components/ausencias/WizardSolicitacaoAusencia.svelte b/apps/web/src/lib/components/ausencias/WizardSolicitacaoAusencia.svelte index 74f3d7e..f553e75 100644 --- a/apps/web/src/lib/components/ausencias/WizardSolicitacaoAusencia.svelte +++ b/apps/web/src/lib/components/ausencias/WizardSolicitacaoAusencia.svelte @@ -25,7 +25,7 @@ // Dados da solicitação let dataInicio = $state(''); let dataFim = $state(''); - const motivo = $state(''); + let motivo = $state(''); let processando = $state(false); // Estados para modal de erro @@ -39,7 +39,7 @@ }); // Filtrar apenas ausências aprovadas ou aguardando aprovação (que bloqueiam novas solicitações) - const ausenciasExistentes = $derived( + let ausenciasExistentes = $derived( (ausenciasExistentesQuery?.data || []) .filter((a) => a.status === 'aprovado' || a.status === 'aguardando_aprovacao') .map((a) => ({ @@ -58,7 +58,7 @@ return Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1; } - const totalDias = $derived(calcularDias(dataInicio, dataFim)); + let totalDias = $derived(calcularDias(dataInicio, dataFim)); // Funções de navegação function proximoPasso() { diff --git a/apps/web/src/lib/components/call/CallControls.svelte b/apps/web/src/lib/components/call/CallControls.svelte index fea7475..5838f27 100644 --- a/apps/web/src/lib/components/call/CallControls.svelte +++ b/apps/web/src/lib/components/call/CallControls.svelte @@ -51,7 +51,7 @@ return `${minutos.toString().padStart(2, '0')}:${segs.toString().padStart(2, '0')}`; } - const duracaoFormatada = $derived(formatarDuracao(duracaoSegundos)); + let duracaoFormatada = $derived(formatarDuracao(duracaoSegundos));
diff --git a/apps/web/src/lib/components/call/CallSettings.svelte b/apps/web/src/lib/components/call/CallSettings.svelte index 46e7639..ffa2376 100644 --- a/apps/web/src/lib/components/call/CallSettings.svelte +++ b/apps/web/src/lib/components/call/CallSettings.svelte @@ -31,7 +31,7 @@ cameras: [] }); - const selecionados = $state({ + let selecionados = $state({ microphoneId: dispositivoAtual.microphoneId || null, cameraId: dispositivoAtual.cameraId || null, speakerId: dispositivoAtual.speakerId || null @@ -39,7 +39,7 @@ let carregando = $state(false); let previewStream: MediaStream | null = $state(null); - const previewVideo: HTMLVideoElement | null = $state(null); + let previewVideo: HTMLVideoElement | null = $state(null); let erro = $state(null); // Carregar dispositivos disponíveis diff --git a/apps/web/src/lib/components/call/CallWindow.svelte b/apps/web/src/lib/components/call/CallWindow.svelte index 8faf63f..d2a613f 100644 --- a/apps/web/src/lib/components/call/CallWindow.svelte +++ b/apps/web/src/lib/components/call/CallWindow.svelte @@ -68,11 +68,11 @@ const client = useConvexClient(); // Estados - const janelaElement: HTMLDivElement | null = $state(null); - const dragHandle: HTMLDivElement | null = $state(null); + let janelaElement: HTMLDivElement | null = $state(null); + let dragHandle: HTMLDivElement | null = $state(null); let resizeHandles: HTMLDivElement[] = $state([]); - const videoContainer: HTMLDivElement | null = $state(null); - const localVideo: HTMLVideoElement | null = $state(null); + let videoContainer: HTMLDivElement | null = $state(null); + let localVideo: HTMLVideoElement | null = $state(null); let showSettings = $state(false); let duracaoTimer: ReturnType | null = $state(null); let gravador: GravadorMedia | null = $state(null); @@ -97,15 +97,15 @@ // Queries const chamadaQuery = useQuery(api.chamadas.obterChamada, { chamadaId }); - const chamada = $derived(chamadaQuery?.data); + let chamada = $derived(chamadaQuery?.data); const meuPerfil = useQuery(api.auth.getCurrentUser, {}); const configJitsiBackend = useQuery(api.configuracaoJitsi.obterConfigJitsi, {}); // Estado derivado do store - const estadoChamada = $derived(get(callState)); + let estadoChamada = $derived(get(callState)); // Configuração Jitsi (busca do backend primeiro, depois fallback para env vars) - const configJitsi = $derived.by(() => obterConfiguracaoJitsi(configJitsiBackend?.data || null)); + let configJitsi = $derived.by(() => obterConfiguracaoJitsi(configJitsiBackend?.data || null)); // Handler de erro melhorado function handleError(message: string, details?: string, podeReconectar: boolean = false): void { @@ -735,10 +735,10 @@ } // Mapa para rastrear elementos de vídeo remotos - const remoteVideoElements = $state>( + let remoteVideoElements = $state>( new Map() ); - const remoteAudioElements = $state>(new Map()); + let remoteAudioElements = $state>(new Map()); // Adicionar track remoto ao container function adicionarTrackRemoto(track: JitsiTrack): void { diff --git a/apps/web/src/lib/components/chamados/TicketCard.svelte b/apps/web/src/lib/components/chamados/TicketCard.svelte index 25c8147..9dd8a7a 100644 --- a/apps/web/src/lib/components/chamados/TicketCard.svelte +++ b/apps/web/src/lib/components/chamados/TicketCard.svelte @@ -21,8 +21,8 @@ select: { ticketId: Id<'tickets'> }; }>(); const props = $props(); - const ticket = $derived(props.ticket); - const selected = $derived(props.selected ?? false); + let ticket = $derived(props.ticket); + let selected = $derived(props.selected ?? false); const prioridadeClasses: Record = { baixa: 'badge badge-sm bg-base-200 text-base-content/70', diff --git a/apps/web/src/lib/components/chamados/TicketForm.svelte b/apps/web/src/lib/components/chamados/TicketForm.svelte index 2aa6efb..a031d56 100644 --- a/apps/web/src/lib/components/chamados/TicketForm.svelte +++ b/apps/web/src/lib/components/chamados/TicketForm.svelte @@ -18,14 +18,14 @@ const dispatch = createEventDispatcher<{ submit: { values: FormValues } }>(); const props = $props(); - const loading = $derived(props.loading ?? false); + let loading = $derived(props.loading ?? false); let titulo = $state(''); let descricao = $state(''); let tipo = $state['tipo']>('chamado'); let prioridade = $state['prioridade']>('media'); let categoria = $state(''); - const canalOrigem = $state('Portal SGSE'); + let canalOrigem = $state('Portal SGSE'); let anexos = $state>([]); let errors = $state>({}); function validate(): boolean { diff --git a/apps/web/src/lib/components/chamados/TicketTimeline.svelte b/apps/web/src/lib/components/chamados/TicketTimeline.svelte index ea4332d..9f38214 100644 --- a/apps/web/src/lib/components/chamados/TicketTimeline.svelte +++ b/apps/web/src/lib/components/chamados/TicketTimeline.svelte @@ -15,7 +15,7 @@ } const props = $props(); - const timeline = $derived>(props.timeline ?? []); + let timeline = $derived>(props.timeline ?? []); const badgeClasses: Record = { success: 'bg-success/20 text-success border-success/40', diff --git a/apps/web/src/lib/components/chat/ChatList.svelte b/apps/web/src/lib/components/chat/ChatList.svelte index 694beff..29cfa05 100644 --- a/apps/web/src/lib/components/chat/ChatList.svelte +++ b/apps/web/src/lib/components/chat/ChatList.svelte @@ -1,8 +1,7 @@ +```
diff --git a/apps/web/src/lib/components/chat/ChatWidget.svelte b/apps/web/src/lib/components/chat/ChatWidget.svelte index 40f068a..fdc596c 100644 --- a/apps/web/src/lib/components/chat/ChatWidget.svelte +++ b/apps/web/src/lib/components/chat/ChatWidget.svelte @@ -28,7 +28,7 @@ let activeConversation = $state(null); // Função para obter a URL do avatar/foto do usuário logado - const avatarUrlDoUsuario = $derived(() => { + let avatarUrlDoUsuario = $derived(() => { const usuario = currentUser?.data; if (!usuario) return null; @@ -47,7 +47,7 @@ let isDragging = $state(false); let dragStart = $state({ x: 0, y: 0 }); let isAnimating = $state(false); - const dragThreshold = $state(5); // Distância mínima em pixels para considerar arrastar + let dragThreshold = $state(5); // Distância mínima em pixels para considerar arrastar let hasMoved = $state(false); // Flag para verificar se houve movimento durante o arrastar let shouldPreventClick = $state(false); // Flag para prevenir clique após arrastar diff --git a/apps/web/src/lib/components/chat/ChatWindow.svelte b/apps/web/src/lib/components/chat/ChatWindow.svelte index bb13be9..31b4d9b 100644 --- a/apps/web/src/lib/components/chat/ChatWindow.svelte +++ b/apps/web/src/lib/components/chat/ChatWindow.svelte @@ -39,10 +39,10 @@ // Token é passado automaticamente via interceptadores em +layout.svelte - const showScheduleModal = $state(false); - const showSalaManager = $state(false); - const showAdminMenu = $state(false); - const showNotificacaoModal = $state(false); + let showScheduleModal = $state(false); + let showSalaManager = $state(false); + let showAdminMenu = $state(false); + let showNotificacaoModal = $state(false); let iniciandoChamada = $state(false); let chamadaAtiva = $state | null>(null); @@ -56,14 +56,14 @@ const chamadaAtivaQuery = useQuery(api.chamadas.obterChamadaAtiva, { conversaId: conversaId as Id<'conversas'> }); - const chamadaAtual = $derived(chamadaAtivaQuery?.data); + let chamadaAtual = $derived(chamadaAtivaQuery?.data); const conversas = useQuery(api.chat.listarConversas, {}); const isAdmin = useQuery(api.chat.verificarSeEhAdmin, { conversaId: conversaId as Id<'conversas'> }); - const conversa = $derived(() => { + let conversa = $derived(() => { console.log('🔍 [ChatWindow] Buscando conversa ID:', conversaId); console.log('📋 [ChatWindow] Conversas disponíveis:', conversas?.data); @@ -248,7 +248,7 @@ // Verificar se usuário é anfitrião da chamada atual const meuPerfil = useQuery(api.auth.getCurrentUser, {}); - const souAnfitriao = $derived( + let souAnfitriao = $derived( chamadaAtual && meuPerfil?.data ? chamadaAtual.criadoPor === meuPerfil.data._id : false ); diff --git a/apps/web/src/lib/components/chat/MessageInput.svelte b/apps/web/src/lib/components/chat/MessageInput.svelte index 1f37db1..a9369fd 100644 --- a/apps/web/src/lib/components/chat/MessageInput.svelte +++ b/apps/web/src/lib/components/chat/MessageInput.svelte @@ -106,20 +106,20 @@ } // Obter conversa atual - const conversa = $derived((): ConversaComParticipantes | null => { + let conversa = $derived((): ConversaComParticipantes | null => { if (!conversas?.data) return null; return (conversas.data as ConversaComParticipantes[]).find((c) => c._id === conversaId) || null; }); // Obter participantes para menções (apenas grupos e salas) - const participantesParaMencoes = $derived((): ParticipanteInfo[] => { + let participantesParaMencoes = $derived((): ParticipanteInfo[] => { const c = conversa(); if (!c || (c.tipo !== 'grupo' && c.tipo !== 'sala_reuniao')) return []; return c.participantesInfo || []; }); // Filtrar participantes para dropdown de menções - const participantesFiltrados = $derived((): ParticipanteInfo[] => { + let participantesFiltrados = $derived((): ParticipanteInfo[] => { if (!mentionQuery.trim()) return participantesParaMencoes().slice(0, 5); const query = mentionQuery.toLowerCase(); return participantesParaMencoes() diff --git a/apps/web/src/lib/components/chat/MessageList.svelte b/apps/web/src/lib/components/chat/MessageList.svelte index 6f21f65..6cca104 100644 --- a/apps/web/src/lib/components/chat/MessageList.svelte +++ b/apps/web/src/lib/components/chat/MessageList.svelte @@ -395,7 +395,7 @@ } // Obter informações da conversa atual - const conversaAtual = $derived(() => { + let conversaAtual = $derived(() => { if (!conversas?.data) return null; return (conversas.data as any[]).find((c) => c._id === conversaId) || null; }); diff --git a/apps/web/src/lib/components/chat/NewConversationModal.svelte b/apps/web/src/lib/components/chat/NewConversationModal.svelte index 75bd6c4..beba38f 100644 --- a/apps/web/src/lib/components/chat/NewConversationModal.svelte +++ b/apps/web/src/lib/components/chat/NewConversationModal.svelte @@ -28,14 +28,14 @@ // Usuário atual const currentUser = useQuery(api.auth.getCurrentUser, {}); - const activeTab = $state<'individual' | 'grupo' | 'sala_reuniao'>('individual'); - const searchQuery = $state(''); + let activeTab = $state<'individual' | 'grupo' | 'sala_reuniao'>('individual'); + let searchQuery = $state(''); let selectedUsers = $state([]); - const groupName = $state(''); - const salaReuniaoName = $state(''); + let groupName = $state(''); + let salaReuniaoName = $state(''); let loading = $state(false); - const usuariosFiltrados = $derived(() => { + let usuariosFiltrados = $derived(() => { if (!usuarios?.data) return []; // Filtrar o próprio usuário diff --git a/apps/web/src/lib/components/chat/NotificationBell.svelte b/apps/web/src/lib/components/chat/NotificationBell.svelte index 9129051..26f066d 100644 --- a/apps/web/src/lib/components/chat/NotificationBell.svelte +++ b/apps/web/src/lib/components/chat/NotificationBell.svelte @@ -38,16 +38,16 @@ let limpandoNotificacoes = $state(false); // Helpers para obter valores das queries - const count = $derived((typeof countQuery === 'number' ? countQuery : countQuery?.data) ?? 0); - const todasNotificacoes = $derived( + let count = $derived((typeof countQuery === 'number' ? countQuery : countQuery?.data) ?? 0); + let todasNotificacoes = $derived( (Array.isArray(todasNotificacoesQuery) ? todasNotificacoesQuery : todasNotificacoesQuery?.data) ?? [] ); // Separar notificações lidas e não lidas - const notificacoesNaoLidas = $derived(todasNotificacoes.filter((n) => !n.lida)); - const notificacoesLidas = $derived(todasNotificacoes.filter((n) => n.lida)); + let notificacoesNaoLidas = $derived(todasNotificacoes.filter((n) => !n.lida)); + let notificacoesLidas = $derived(todasNotificacoes.filter((n) => n.lida)); // Atualizar contador no store $effect(() => { diff --git a/apps/web/src/lib/components/chat/PresenceManager.svelte b/apps/web/src/lib/components/chat/PresenceManager.svelte index 151d316..9dbc147 100644 --- a/apps/web/src/lib/components/chat/PresenceManager.svelte +++ b/apps/web/src/lib/components/chat/PresenceManager.svelte @@ -7,7 +7,7 @@ // Verificar se o usuário está autenticado antes de gerenciar presença const currentUser = useQuery(api.auth.getCurrentUser, {}); - const usuarioAutenticado = $derived( + let usuarioAutenticado = $derived( currentUser?.data !== null && currentUser?.data !== undefined ); diff --git a/apps/web/src/lib/components/chat/SalaReuniaoManager.svelte b/apps/web/src/lib/components/chat/SalaReuniaoManager.svelte index 1d6ddff..830f13a 100644 --- a/apps/web/src/lib/components/chat/SalaReuniaoManager.svelte +++ b/apps/web/src/lib/components/chat/SalaReuniaoManager.svelte @@ -18,21 +18,21 @@ const conversas = useQuery(api.chat.listarConversas, {}); const todosUsuariosQuery = useQuery(api.chat.listarTodosUsuarios, {}); - const activeTab = $state<'participantes' | 'adicionar'>('participantes'); + let activeTab = $state<'participantes' | 'adicionar'>('participantes'); let searchQuery = $state(''); let loading = $state(null); let error = $state(null); - const conversa = $derived(() => { + let conversa = $derived(() => { if (!conversas?.data) return null; return conversas.data.find((c: any) => c._id === conversaId); }); - const todosUsuarios = $derived(() => { + let todosUsuarios = $derived(() => { return todosUsuariosQuery?.data || []; }); - const participantes = $derived(() => { + let participantes = $derived(() => { try { const conv = conversa(); const usuarios = todosUsuarios(); @@ -76,11 +76,11 @@ } }); - const administradoresIds = $derived(() => { + let administradoresIds = $derived(() => { return conversa()?.administradores || []; }); - const usuariosDisponiveis = $derived(() => { + let usuariosDisponiveis = $derived(() => { const usuarios = todosUsuarios(); if (!usuarios || usuarios.length === 0) return []; const participantesIds = conversa()?.participantes || []; @@ -89,7 +89,7 @@ ); }); - const usuariosFiltrados = $derived(() => { + let usuariosFiltrados = $derived(() => { const disponiveis = usuariosDisponiveis(); if (!searchQuery.trim()) return disponiveis; const query = searchQuery.toLowerCase(); diff --git a/apps/web/src/lib/components/chat/UserStatusBadge.svelte b/apps/web/src/lib/components/chat/UserStatusBadge.svelte index 9371c50..47f143a 100644 --- a/apps/web/src/lib/components/chat/UserStatusBadge.svelte +++ b/apps/web/src/lib/components/chat/UserStatusBadge.svelte @@ -61,7 +61,7 @@ } }; - const config = $derived(statusConfig[status]); + let config = $derived(statusConfig[status]);
+ let eventos = $derived.by(() => periodosExistentes.map((periodo, index) => ({ id: `periodo-${index}`, title: `Período ${index + 1} (${periodo.dias} dias)`, diff --git a/apps/web/src/lib/components/ferias/DashboardFerias.svelte b/apps/web/src/lib/components/ferias/DashboardFerias.svelte index 1b8f53a..a87d45e 100644 --- a/apps/web/src/lib/components/ferias/DashboardFerias.svelte +++ b/apps/web/src/lib/components/ferias/DashboardFerias.svelte @@ -15,24 +15,24 @@ funcionarioId }); - const saldos = $derived(saldosQuery.data || []); - const solicitacoes = $derived(solicitacoesQuery.data || []); + let saldos = $derived(saldosQuery.data || []); + let solicitacoes = $derived(solicitacoesQuery.data || []); // Estatísticas derivadas - const saldoAtual = $derived(saldos.find((s) => s.anoReferencia === new Date().getFullYear())); - const totalSolicitacoes = $derived(solicitacoes.length); - const aprovadas = $derived( + let saldoAtual = $derived(saldos.find((s) => s.anoReferencia === new Date().getFullYear())); + let totalSolicitacoes = $derived(solicitacoes.length); + let aprovadas = $derived( solicitacoes.filter((s) => s.status === 'aprovado' || s.status === 'data_ajustada_aprovada') .length ); - const pendentes = $derived( + let pendentes = $derived( solicitacoes.filter((s) => s.status === 'aguardando_aprovacao').length ); - const reprovadas = $derived(solicitacoes.filter((s) => s.status === 'reprovado').length); + let reprovadas = $derived(solicitacoes.filter((s) => s.status === 'reprovado').length); // Canvas para gráfico de pizza - const canvasSaldo = $state(); - const canvasStatus = $state(); + let canvasSaldo = $state(); + let canvasStatus = $state(); // Função para desenhar gráfico de pizza moderno function desenharGraficoPizza( diff --git a/apps/web/src/lib/components/ferias/WizardSolicitacaoFerias.svelte b/apps/web/src/lib/components/ferias/WizardSolicitacaoFerias.svelte index 7d89dd2..34cb88b 100644 --- a/apps/web/src/lib/components/ferias/WizardSolicitacaoFerias.svelte +++ b/apps/web/src/lib/components/ferias/WizardSolicitacaoFerias.svelte @@ -20,13 +20,13 @@ const totalPassos = 3; // Dados da solicitação - const anoSelecionado = $state(new Date().getFullYear()); + let anoSelecionado = $state(new Date().getFullYear()); let periodosFerias: Array<{ dataInicio: string; dataFim: string; dias: number; }> = $state([]); - const observacao = $state(''); + let observacao = $state(''); let processando = $state(false); // Estados para os selects de data @@ -37,17 +37,17 @@ const funcionarioQuery = useQuery(api.funcionarios.getById, { id: funcionarioId }); - const funcionario = $derived(funcionarioQuery?.data); - const regimeTrabalho = $derived(funcionario?.regimeTrabalho || 'clt'); + let funcionario = $derived(funcionarioQuery?.data); + let regimeTrabalho = $derived(funcionario?.regimeTrabalho || 'clt'); - const saldoQuery = $derived( + let saldoQuery = $derived( useQuery(api.saldoFerias.obterSaldo, { funcionarioId, anoReferencia: anoSelecionado }) ); - const validacaoQuery = $derived( + let validacaoQuery = $derived( periodosFerias.length > 0 ? useQuery(api.saldoFerias.validarSolicitacao, { funcionarioId, @@ -61,18 +61,18 @@ ); // Derivados - const saldo = $derived(saldoQuery.data); - const validacao = $derived(validacaoQuery.data); - const totalDiasSelecionados = $derived(periodosFerias.reduce((acc, p) => acc + p.dias, 0)); + let saldo = $derived(saldoQuery.data); + let validacao = $derived(validacaoQuery.data); + let totalDiasSelecionados = $derived(periodosFerias.reduce((acc, p) => acc + p.dias, 0)); // Anos disponíveis (últimos 3 anos + próximo ano) - const anosDisponiveis = $derived.by(() => { + let anosDisponiveis = $derived.by(() => { const anoAtual = new Date().getFullYear(); return [anoAtual - 1, anoAtual, anoAtual + 1]; }); // Verificar se é regime estatutário PE ou Municipal - const ehEstatutarioPEOuMunicipal = $derived( + let ehEstatutarioPEOuMunicipal = $derived( regimeTrabalho === 'estatutario_pe' || regimeTrabalho === 'estatutario_municipal' ); @@ -227,7 +227,7 @@ } // Calcular dias do período atual - const diasPeriodoAtual = $derived(calcularDias(dataInicioPeriodo, dataFimPeriodo)); + let diasPeriodoAtual = $derived(calcularDias(dataInicioPeriodo, dataFimPeriodo));
diff --git a/apps/web/src/lib/components/ponto/PrintPontoModal.svelte b/apps/web/src/lib/components/ponto/PrintPontoModal.svelte index 858d837..33c661a 100644 --- a/apps/web/src/lib/components/ponto/PrintPontoModal.svelte +++ b/apps/web/src/lib/components/ponto/PrintPontoModal.svelte @@ -20,7 +20,7 @@ let modalRef: HTMLDialogElement; // Seções selecionáveis - const sections = $state({ + let sections = $state({ dadosFuncionario: true, registrosPonto: true, saldoDiario: true, diff --git a/apps/web/src/lib/components/ponto/RegistroPonto.svelte b/apps/web/src/lib/components/ponto/RegistroPonto.svelte index e37ff90..40abeeb 100644 --- a/apps/web/src/lib/components/ponto/RegistroPonto.svelte +++ b/apps/web/src/lib/components/ponto/RegistroPonto.svelte @@ -39,8 +39,8 @@ const configQuery = useQuery(api.configuracaoPonto.obterConfiguracao, {}); // Query para histórico e saldo do dia - const funcionarioId = $derived(currentUser?.data?.funcionarioId ?? null); - const dataHoje = $derived(new Date().toISOString().split('T')[0]!); + let funcionarioId = $derived(currentUser?.data?.funcionarioId ?? null); + let dataHoje = $derived(new Date().toISOString().split('T')[0]!); // Usar refreshKey para forçar atualização após registro const registrosHojeQuery = useQuery(api.pontos.listarRegistrosDia, { @@ -80,10 +80,10 @@ null ); - const registrosHoje = $derived(registrosHojeQuery?.data || []); - const config = $derived(configQuery?.data); + let registrosHoje = $derived(registrosHojeQuery?.data || []); + let config = $derived(configQuery?.data); - const proximoTipo = $derived.by(() => { + let proximoTipo = $derived.by(() => { if (registrosHoje.length === 0) { return 'entrada'; } @@ -91,7 +91,7 @@ return getProximoTipoRegistro(ultimoRegistro?.tipo || null); }); - const tipoLabel = $derived.by(() => { + let tipoLabel = $derived.by(() => { if (config) { return getTipoRegistroLabel(proximoTipo, { nomeEntrada: config.nomeEntrada, @@ -820,12 +820,12 @@ } } - const dispensaAtiva = $derived(dispensaQuery?.data); - const estaDispensado = $derived(dispensaAtiva?.dispensado ?? false); - const motivoDispensa = $derived(dispensaAtiva?.motivo ?? null); - const temFuncionarioAssociado = $derived(funcionarioId !== null); + let dispensaAtiva = $derived(dispensaQuery?.data); + let estaDispensado = $derived(dispensaAtiva?.dispensado ?? false); + let motivoDispensa = $derived(dispensaAtiva?.motivo ?? null); + let temFuncionarioAssociado = $derived(funcionarioId !== null); - const podeRegistrar = $derived.by(() => { + let podeRegistrar = $derived.by(() => { return ( !registrando && !coletandoInfo && @@ -875,7 +875,7 @@ } }); - const mapaHorarios = $derived.by(() => { + let mapaHorarios = $derived.by(() => { if (!config) return []; const horarios = [ @@ -927,8 +927,8 @@ }); // Dados do histórico e saldo - const historicoSaldo = $derived(historicoSaldoQuery?.data); - const registrosOrdenados = $derived.by(() => { + let historicoSaldo = $derived(historicoSaldoQuery?.data); + let registrosOrdenados = $derived.by(() => { if (!historicoSaldo?.registros) return []; return [...historicoSaldo.registros].sort((a, b) => { const minutosA = a.hora * 60 + a.minuto; @@ -938,7 +938,7 @@ }); // Formatação do saldo - const saldoFormatado = $derived.by(() => { + let saldoFormatado = $derived.by(() => { if (!historicoSaldo) return null; const minutos = historicoSaldo.saldoMinutos; const horas = Math.floor(Math.abs(minutos) / 60); @@ -947,7 +947,7 @@ return `${sinal}${horas}h ${mins}min`; }); - const saldoPositivo = $derived(historicoSaldo ? historicoSaldo.saldoMinutos >= 0 : false); + let saldoPositivo = $derived(historicoSaldo ? historicoSaldo.saldoMinutos >= 0 : false); // Posicionamento dos modais baseado no texto "Registrar Ponto" let modalPosition = $state<{ top: number; left: number } | null>(null); diff --git a/apps/web/src/lib/components/ponto/RelogioSincronizado.svelte b/apps/web/src/lib/components/ponto/RelogioSincronizado.svelte index cafcbc7..64d1f3a 100644 --- a/apps/web/src/lib/components/ponto/RelogioSincronizado.svelte +++ b/apps/web/src/lib/components/ponto/RelogioSincronizado.svelte @@ -95,7 +95,7 @@ } }); - const horaFormatada = $derived.by(() => { + let horaFormatada = $derived.by(() => { return tempoAtual.toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit', @@ -103,7 +103,7 @@ }); }); - const dataFormatada = $derived.by(() => { + let dataFormatada = $derived.by(() => { return tempoAtual.toLocaleDateString('pt-BR', { weekday: 'long', day: '2-digit', diff --git a/apps/web/src/lib/components/ponto/WebcamCapture.svelte b/apps/web/src/lib/components/ponto/WebcamCapture.svelte index 92d25c9..9ecb551 100644 --- a/apps/web/src/lib/components/ponto/WebcamCapture.svelte +++ b/apps/web/src/lib/components/ponto/WebcamCapture.svelte @@ -19,8 +19,8 @@ fotoObrigatoria = false }: Props = $props(); - const videoElement: HTMLVideoElement | null = $state(null); - const canvasElement: HTMLCanvasElement | null = $state(null); + let videoElement: HTMLVideoElement | null = $state(null); + let canvasElement: HTMLCanvasElement | null = $state(null); let stream: MediaStream | null = $state(null); let webcamDisponivel = $state(false); let capturando = $state(false); diff --git a/apps/web/src/lib/components/ti/AlertConfigModal.svelte b/apps/web/src/lib/components/ti/AlertConfigModal.svelte index 72e7172..5617882 100644 --- a/apps/web/src/lib/components/ti/AlertConfigModal.svelte +++ b/apps/web/src/lib/components/ti/AlertConfigModal.svelte @@ -7,7 +7,7 @@ const client = useConvexClient(); const alertasQuery = useQuery(api.monitoramento.listarAlertas, {}); - const alertas = $derived.by(() => { + let alertas = $derived.by(() => { if (!alertasQuery) return []; // O useQuery pode retornar o array diretamente ou em .data if (Array.isArray(alertasQuery)) return alertasQuery; diff --git a/apps/web/src/lib/components/ti/CybersecurityWizcard.svelte b/apps/web/src/lib/components/ti/CybersecurityWizcard.svelte index be17883..6f7fef9 100644 --- a/apps/web/src/lib/components/ti/CybersecurityWizcard.svelte +++ b/apps/web/src/lib/components/ti/CybersecurityWizcard.svelte @@ -250,24 +250,24 @@ let filtroSeveridades = $state([]); // Vazio = mostrar todos let filtroTipos = $state([]); - const alertaSonoroAtivo = $state(true); - const alertaVisualAtivo = $state(true); + let alertaSonoroAtivo = $state(true); + let alertaVisualAtivo = $state(true); // Contagem de novos eventos detectados em tempo real (sem recarregar) let novosEventos = $state(0); // Timestamp do último evento observado no feed para cálculo de "novos" let ultimoTsVisto = $state(Date.now()); let ipManual = $state(''); let comentarioManual = $state(''); - const porta = $state(443); - const protocolo = $state<'tcp' | 'udp' | 'icmp' | 'quic' | 'any'>('tcp'); - const acao = $state<'permitir' | 'bloquear' | 'monitorar' | 'rate_limit'>('monitorar'); - const temporario = $state(true); - const duracao = $state(900); - const severidadeMin = $state('moderado'); - const relatorioInicio = $state(new Date(Date.now() - 60 * 60 * 1000).toISOString().slice(0, 16)); - const relatorioFim = $state(new Date().toISOString().slice(0, 16)); - const incluirMetricas = $state(true); - const incluirAcoes = $state(true); + let porta = $state(443); + let protocolo = $state<'tcp' | 'udp' | 'icmp' | 'quic' | 'any'>('tcp'); + let acao = $state<'permitir' | 'bloquear' | 'monitorar' | 'rate_limit'>('monitorar'); + let temporario = $state(true); + let duracao = $state(900); + let severidadeMin = $state('moderado'); + let relatorioInicio = $state(new Date(Date.now() - 60 * 60 * 1000).toISOString().slice(0, 16)); + let relatorioFim = $state(new Date().toISOString().slice(0, 16)); + let incluirMetricas = $state(true); + let incluirAcoes = $state(true); let feedback = $state<{ tipo: 'success' | 'error'; mensagem: string } | null>(null); let ultimaReferenciaCritica: Id<'securityEvents'> | null = null; let audioCtx: AudioContext | null = null; @@ -288,9 +288,9 @@ let rateLimitNotas = $state(''); let rateLimitEditando = $state | null>(null); - const series = $derived.by(() => visaoCamadas?.data?.series ?? []); - const totais = $derived.by(() => visaoCamadas?.data?.totais ?? null); - const eventosFiltrados = $derived.by(() => { + let series = $derived.by(() => visaoCamadas?.data?.series ?? []); + let totais = $derived.by(() => visaoCamadas?.data?.totais ?? null); + let eventosFiltrados = $derived.by(() => { const lista = eventos?.data ?? []; return lista .filter((evento) => { @@ -304,10 +304,10 @@ }) .slice(0, 50); }); - const ipCriticos = $derived.by(() => (reputacoes?.data ?? []).slice(0, 10)); - const regras = $derived.by(() => regrasPorta?.data ?? []); + let ipCriticos = $derived.by(() => (reputacoes?.data ?? []).slice(0, 10)); + let regras = $derived.by(() => regrasPorta?.data ?? []); - const eventoCriticoAtual = $derived.by( + let eventoCriticoAtual = $derived.by( () => (eventos?.data ?? []).find((evento) => evento.severidade === 'critico') ?? null ); @@ -342,7 +342,7 @@ nosql_injection: 'rgba(20,184,166,0.9)' }; const tiposParaChart = Object.keys(coresTipo); - const timelineBuckets = $derived.by(() => { + let timelineBuckets = $derived.by(() => { const agora = Date.now(); const inicio = agora - janelaMs; const lista = (eventos?.data ?? []).filter((e) => e.timestamp >= inicio); @@ -404,7 +404,7 @@ return `M0,${altura} ${pontos.map((ponto) => `L${ponto}`).join(' ')} L${largura},${altura} Z`; } - const chartPaths = $derived.by(() => { + let chartPaths = $derived.by(() => { if (!series.length) { return { ddos: '', sql: '', avancados: '' }; } diff --git a/apps/web/src/lib/components/ti/ReportGeneratorModal.svelte b/apps/web/src/lib/components/ti/ReportGeneratorModal.svelte index bb501de..9d41b0b 100644 --- a/apps/web/src/lib/components/ti/ReportGeneratorModal.svelte +++ b/apps/web/src/lib/components/ti/ReportGeneratorModal.svelte @@ -15,8 +15,8 @@ let periodType = $state('custom'); let dataInicio = $state(format(subDays(new Date(), 7), 'yyyy-MM-dd')); let dataFim = $state(format(new Date(), 'yyyy-MM-dd')); - const horaInicio = $state('00:00'); - const horaFim = $state('23:59'); + let horaInicio = $state('00:00'); + let horaFim = $state('23:59'); let generating = $state(false); // Métricas selecionadas @@ -32,7 +32,7 @@ } as const; type MetricKey = keyof typeof metricLabels; - const selectedMetrics = $state>({ + let selectedMetrics = $state>({ cpuUsage: true, memoryUsage: true, networkLatency: true, @@ -43,7 +43,7 @@ errosCount: true }); - const metricEntries = $derived(Object.entries(metricLabels) as Array<[MetricKey, string]>); + let metricEntries = $derived(Object.entries(metricLabels) as Array<[MetricKey, string]>); function isMetricSelected(key: MetricKey): boolean { return selectedMetrics[key]; diff --git a/apps/web/src/lib/components/ti/SystemMonitorCard.svelte b/apps/web/src/lib/components/ti/SystemMonitorCard.svelte index 41f57cb..78477d7 100644 --- a/apps/web/src/lib/components/ti/SystemMonitorCard.svelte +++ b/apps/web/src/lib/components/ti/SystemMonitorCard.svelte @@ -9,12 +9,12 @@ const client = useConvexClient(); const ultimaMetrica = useQuery(api.monitoramento.obterUltimaMetrica, {}); - const showAlertModal = $state(false); - const showReportModal = $state(false); + let showAlertModal = $state(false); + let showReportModal = $state(false); let stopCollection: (() => void) | null = null; // Métricas derivadas - const metrics = $derived(ultimaMetrica || null); + let metrics = $derived(ultimaMetrica || null); // Função para obter cor baseada no valor function getStatusColor( diff --git a/apps/web/src/lib/components/ti/SystemMonitorCardLocal.svelte b/apps/web/src/lib/components/ti/SystemMonitorCardLocal.svelte index bf49960..6904c7b 100644 --- a/apps/web/src/lib/components/ti/SystemMonitorCardLocal.svelte +++ b/apps/web/src/lib/components/ti/SystemMonitorCardLocal.svelte @@ -13,8 +13,8 @@ const client = useConvexClient(); - const showAlertModal = $state(false); - const showReportModal = $state(false); + let showAlertModal = $state(false); + let showReportModal = $state(false); let intervalId: ReturnType | null = null; type Metrics = { @@ -119,7 +119,7 @@ let metricsHistory: Array = $state([]); // Dados para gráficos - const lineChartData = $derived({ + let lineChartData = $derived({ labels: metricsHistory .map((m) => { const date = new Date(m.timestamp); @@ -158,7 +158,7 @@ ] }); - const areaChartData = $derived({ + let areaChartData = $derived({ labels: metricsHistory .map((m) => { const date = new Date(m.timestamp); @@ -194,7 +194,7 @@ ] }); - const doughnutChartData = $derived({ + let doughnutChartData = $derived({ labels: ['CPU', 'RAM', 'Storage', 'Disponível'], datasets: [ { @@ -221,7 +221,7 @@ ] }); - const barChartData = $derived({ + let barChartData = $derived({ labels: ['FPS', 'DOM Nodes (x100)', 'JS Heap (MB)', 'Cache (MB)', 'IndexedDB (MB)'], datasets: [ { diff --git a/apps/web/src/lib/components/ti/UserStatusBadge.svelte b/apps/web/src/lib/components/ti/UserStatusBadge.svelte index 1973ac5..01c3fcc 100644 --- a/apps/web/src/lib/components/ti/UserStatusBadge.svelte +++ b/apps/web/src/lib/components/ti/UserStatusBadge.svelte @@ -12,7 +12,7 @@ return { text: 'Inativo', class: 'badge-warning' }; }; - const status = $derived(getStatus()); + let status = $derived(getStatus()); diff --git a/apps/web/src/routes/(dashboard)/+layout.svelte b/apps/web/src/routes/(dashboard)/+layout.svelte index 92356c6..1eaefd7 100644 --- a/apps/web/src/routes/(dashboard)/+layout.svelte +++ b/apps/web/src/routes/(dashboard)/+layout.svelte @@ -7,7 +7,7 @@ const { children } = $props(); // Resolver recurso/ação a partir da rota - const routeAction = $derived.by(() => { + let routeAction = $derived.by(() => { const p = page.url.pathname; if (p === '/' || p === '/abrir-chamado') return null; diff --git a/apps/web/src/routes/(dashboard)/abrir-chamado/+page.svelte b/apps/web/src/routes/(dashboard)/abrir-chamado/+page.svelte index 3be9b34..990a0eb 100644 --- a/apps/web/src/routes/(dashboard)/abrir-chamado/+page.svelte +++ b/apps/web/src/routes/(dashboard)/abrir-chamado/+page.svelte @@ -21,7 +21,7 @@ numero?: string; } | null>(null); - const exemploTimeline = $state>([ + let exemploTimeline = $state>([ { etapa: 'abertura', status: 'concluido', diff --git a/apps/web/src/routes/(dashboard)/alterar-senha/+page.svelte b/apps/web/src/routes/(dashboard)/alterar-senha/+page.svelte index e453574..5f1113f 100644 --- a/apps/web/src/routes/(dashboard)/alterar-senha/+page.svelte +++ b/apps/web/src/routes/(dashboard)/alterar-senha/+page.svelte @@ -25,9 +25,9 @@ let confirmarSenha = $state(''); let carregando = $state(false); let notice = $state<{ type: 'success' | 'error'; message: string } | null>(null); - const mostrarSenhaAtual = $state(false); - const mostrarNovaSenha = $state(false); - const mostrarConfirmarSenha = $state(false); + let mostrarSenhaAtual = $state(false); + let mostrarNovaSenha = $state(false); + let mostrarConfirmarSenha = $state(false); onMount(() => { if (!currentUser?.data) { diff --git a/apps/web/src/routes/(dashboard)/compras/atas/+page.svelte b/apps/web/src/routes/(dashboard)/compras/atas/+page.svelte index 2a8005d..b47faea 100644 --- a/apps/web/src/routes/(dashboard)/compras/atas/+page.svelte +++ b/apps/web/src/routes/(dashboard)/compras/atas/+page.svelte @@ -8,12 +8,12 @@ // Reactive queries const atasQuery = useQuery(api.atas.list, {}); - const atas = $derived(atasQuery.data || []); - const loadingAtas = $derived(atasQuery.isLoading); - const errorAtas = $derived(atasQuery.error?.message || null); + let atas = $derived(atasQuery.data || []); + let loadingAtas = $derived(atasQuery.isLoading); + let errorAtas = $derived(atasQuery.error?.message || null); const empresasQuery = useQuery(api.empresas.list, {}); - const empresas = $derived(empresasQuery.data || []); + let empresas = $derived(empresasQuery.data || []); // Modal state let showModal = $state(false); diff --git a/apps/web/src/routes/(dashboard)/compras/objetos/+page.svelte b/apps/web/src/routes/(dashboard)/compras/objetos/+page.svelte index 6c09cbc..70b425e 100644 --- a/apps/web/src/routes/(dashboard)/compras/objetos/+page.svelte +++ b/apps/web/src/routes/(dashboard)/compras/objetos/+page.svelte @@ -9,9 +9,9 @@ // Reactive query const objetosQuery = useQuery(api.objetos.list, {}); - const objetos = $derived(objetosQuery.data || []); - const loading = $derived(objetosQuery.isLoading); - const error = $derived(objetosQuery.error?.message || null); + let objetos = $derived(objetosQuery.data || []); + let loading = $derived(objetosQuery.isLoading); + let error = $derived(objetosQuery.error?.message || null); // Modal state let showModal = $state(false); diff --git a/apps/web/src/routes/(dashboard)/fluxos/+page.svelte b/apps/web/src/routes/(dashboard)/fluxos/+page.svelte index 2ae154c..153a956 100644 --- a/apps/web/src/routes/(dashboard)/fluxos/+page.svelte +++ b/apps/web/src/routes/(dashboard)/fluxos/+page.svelte @@ -8,7 +8,7 @@ const client = useConvexClient(); // Estado do filtro - const statusFilter = $state<'draft' | 'published' | 'archived' | undefined>(undefined); + let statusFilter = $state<'draft' | 'published' | 'archived' | undefined>(undefined); // Query de templates const templatesQuery = useQuery(api.flows.listTemplates, () => diff --git a/apps/web/src/routes/(dashboard)/fluxos/[id]-fluxo/+page.svelte b/apps/web/src/routes/(dashboard)/fluxos/[id]-fluxo/+page.svelte index bbf345f..5ace5bf 100644 --- a/apps/web/src/routes/(dashboard)/fluxos/[id]-fluxo/+page.svelte +++ b/apps/web/src/routes/(dashboard)/fluxos/[id]-fluxo/+page.svelte @@ -7,7 +7,7 @@ import ActionGuard from '$lib/components/ActionGuard.svelte'; const client = useConvexClient(); - const instanceId = $derived($page.params.id as Id<'flowInstances'>); + let instanceId = $derived($page.params.id as Id<'flowInstances'>); // Query da instância com passos const instanceQuery = useQuery(api.flows.getInstanceWithSteps, () => ({ @@ -18,7 +18,7 @@ const usuariosQuery = useQuery(api.usuarios.listar, {}); // Query de usuários por setor para atribuição - const usuariosPorSetorQuery = $state > | null>(null); diff --git a/apps/web/src/routes/(dashboard)/fluxos/[id]/editor/+page.svelte b/apps/web/src/routes/(dashboard)/fluxos/[id]/editor/+page.svelte index 1b4cfb9..3203f4b 100644 --- a/apps/web/src/routes/(dashboard)/fluxos/[id]/editor/+page.svelte +++ b/apps/web/src/routes/(dashboard)/fluxos/[id]/editor/+page.svelte @@ -7,7 +7,7 @@ import { page } from '$app/stores'; const client = useConvexClient(); - const templateId = $derived($page.params.id as Id<'flowTemplates'>); + let templateId = $derived($page.params.id as Id<'flowTemplates'>); // Queries const templateQuery = useQuery(api.flows.getTemplate, () => ({ @@ -36,7 +36,7 @@ // Estado do passo selecionado let selectedStepId = $state | null>(null); - const selectedStep = $derived(localSteps?.find((s) => s._id === selectedStepId)); + let selectedStep = $derived(localSteps?.find((s) => s._id === selectedStepId)); // Modal de novo passo let showNewStepModal = $state(false); diff --git a/apps/web/src/routes/(dashboard)/fluxos/instancias/+page.svelte b/apps/web/src/routes/(dashboard)/fluxos/instancias/+page.svelte index 38495c8..30794f0 100644 --- a/apps/web/src/routes/(dashboard)/fluxos/instancias/+page.svelte +++ b/apps/web/src/routes/(dashboard)/fluxos/instancias/+page.svelte @@ -8,7 +8,7 @@ const client = useConvexClient(); // Estado dos filtros - const statusFilter = $state<'active' | 'completed' | 'cancelled' | undefined>(undefined); + let statusFilter = $state<'active' | 'completed' | 'cancelled' | undefined>(undefined); // Query de instâncias const instancesQuery = useQuery(api.flows.listInstances, () => diff --git a/apps/web/src/routes/(dashboard)/gestao-pessoas/gestao-ausencias/+page.svelte b/apps/web/src/routes/(dashboard)/gestao-pessoas/gestao-ausencias/+page.svelte index 14cec95..75e576a 100644 --- a/apps/web/src/routes/(dashboard)/gestao-pessoas/gestao-ausencias/+page.svelte +++ b/apps/web/src/routes/(dashboard)/gestao-pessoas/gestao-ausencias/+page.svelte @@ -12,13 +12,13 @@ // Buscar TODAS as solicitações de ausências const todasAusenciasQuery = useQuery(api.ausencias.listarTodas, {}); - const filtroStatus = $state('todos'); + let filtroStatus = $state('todos'); let solicitacaoSelecionada = $state | null>(null); - const ausencias = $derived(todasAusenciasQuery?.data || []); + let ausencias = $derived(todasAusenciasQuery?.data || []); // Filtrar solicitações - const ausenciasFiltradas = $derived( + let ausenciasFiltradas = $derived( ausencias.filter((a) => { // Filtro de status if (filtroStatus !== 'todos' && a.status !== filtroStatus) return false; @@ -27,7 +27,7 @@ ); // Estatísticas gerais - const stats = $derived({ + let stats = $derived({ total: ausencias.length, aguardando: ausencias.filter((a) => a.status === 'aguardando_aprovacao').length, aprovadas: ausencias.filter((a) => a.status === 'aprovado').length, diff --git a/apps/web/src/routes/(dashboard)/licitacoes/contratos/+page.svelte b/apps/web/src/routes/(dashboard)/licitacoes/contratos/+page.svelte index 8d74aa6..193240c 100644 --- a/apps/web/src/routes/(dashboard)/licitacoes/contratos/+page.svelte +++ b/apps/web/src/routes/(dashboard)/licitacoes/contratos/+page.svelte @@ -17,9 +17,9 @@ }); // Filtros - const responsavelId = $state | undefined>(undefined); - const dataInicio = $state(undefined); - const dataFim = $state(undefined); + let responsavelId = $state | undefined>(undefined); + let dataInicio = $state(undefined); + let dataFim = $state(undefined); // Queries const contratosQuery = useQuery(api.contratos.listar, () => ({ @@ -31,22 +31,22 @@ const funcionariosQuery = useQuery(api.funcionarios.getAll, {}); // Derivados para facilitar acesso aos dados - const contratos = $derived.by(() => { + let contratos = $derived.by(() => { if (contratosQuery === undefined || contratosQuery === null) return []; if (Array.isArray(contratosQuery)) return contratosQuery; if ('data' in contratosQuery) return contratosQuery.data || []; return []; }); - const funcionarios = $derived.by(() => { + let funcionarios = $derived.by(() => { if (funcionariosQuery === undefined || funcionariosQuery === null) return []; if (Array.isArray(funcionariosQuery)) return funcionariosQuery; if ('data' in funcionariosQuery) return funcionariosQuery.data || []; return []; }); - const isLoading = $derived(contratosQuery === undefined); - const error = $derived(contratosQuery instanceof Error ? contratosQuery : null); + let isLoading = $derived(contratosQuery === undefined); + let error = $derived(contratosQuery instanceof Error ? contratosQuery : null); // Helpers function formatarData(data: string) { diff --git a/apps/web/src/routes/(dashboard)/licitacoes/contratos/[id]/+page.svelte b/apps/web/src/routes/(dashboard)/licitacoes/contratos/[id]/+page.svelte index 490656d..02133f4 100644 --- a/apps/web/src/routes/(dashboard)/licitacoes/contratos/[id]/+page.svelte +++ b/apps/web/src/routes/(dashboard)/licitacoes/contratos/[id]/+page.svelte @@ -25,11 +25,11 @@ const funcionariosQuery = useQuery(api.funcionarios.getAll, {}); // Derivados - const contrato = $derived(contratoQuery.data); - const empresas = $derived(empresasQuery.data || []); - const funcionarios = $derived(funcionariosQuery.data || []); - const isLoading = $derived(contratoQuery.isLoading); - const error = $derived(contratoQuery.error); + let contrato = $derived(contratoQuery.data); + let empresas = $derived(empresasQuery.data || []); + let funcionarios = $derived(funcionariosQuery.data || []); + let isLoading = $derived(contratoQuery.isLoading); + let error = $derived(contratoQuery.error); type SituacaoContrato = 'em_execucao' | 'rescendido' | 'aguardando_assinatura' | 'finalizado'; diff --git a/apps/web/src/routes/(dashboard)/licitacoes/contratos/novo/+page.svelte b/apps/web/src/routes/(dashboard)/licitacoes/contratos/novo/+page.svelte index f85bda9..92d23db 100644 --- a/apps/web/src/routes/(dashboard)/licitacoes/contratos/novo/+page.svelte +++ b/apps/web/src/routes/(dashboard)/licitacoes/contratos/novo/+page.svelte @@ -21,14 +21,14 @@ const funcionariosQuery = useQuery(api.funcionarios.getAll, {}); // Derivados - const empresas = $derived.by(() => { + let empresas = $derived.by(() => { if (empresasQuery === undefined || empresasQuery === null) return []; if (Array.isArray(empresasQuery)) return empresasQuery; if ('data' in empresasQuery) return empresasQuery.data || []; return []; }); - const funcionarios = $derived.by(() => { + let funcionarios = $derived.by(() => { if (funcionariosQuery === undefined || funcionariosQuery === null) return []; if (Array.isArray(funcionariosQuery)) return funcionariosQuery; if ('data' in funcionariosQuery) return funcionariosQuery.data || []; @@ -58,7 +58,7 @@ // Estado do formulário let loading = $state(false); - const formData = $state({ + let formData = $state({ contratadaId: null, objeto: '', numeroNotaEmpenho: '', diff --git a/apps/web/src/routes/(dashboard)/licitacoes/fluxos/+page.svelte b/apps/web/src/routes/(dashboard)/licitacoes/fluxos/+page.svelte index afca625..29bc7d6 100644 --- a/apps/web/src/routes/(dashboard)/licitacoes/fluxos/+page.svelte +++ b/apps/web/src/routes/(dashboard)/licitacoes/fluxos/+page.svelte @@ -8,7 +8,7 @@ const client = useConvexClient(); // Estado dos filtros - const statusFilter = $state<'active' | 'completed' | 'cancelled' | undefined>(undefined); + let statusFilter = $state<'active' | 'completed' | 'cancelled' | undefined>(undefined); // Query de instâncias const instancesQuery = useQuery(api.flows.listInstances, () => diff --git a/apps/web/src/routes/(dashboard)/licitacoes/fluxos/[id]/+page.svelte b/apps/web/src/routes/(dashboard)/licitacoes/fluxos/[id]/+page.svelte index 38340af..b5c5eeb 100644 --- a/apps/web/src/routes/(dashboard)/licitacoes/fluxos/[id]/+page.svelte +++ b/apps/web/src/routes/(dashboard)/licitacoes/fluxos/[id]/+page.svelte @@ -9,7 +9,7 @@ import RelogioPrazo from '$lib/components/RelogioPrazo.svelte'; const client = useConvexClient(); - const instanceId = $derived($page.params.id as Id<'flowInstances'>); + let instanceId = $derived($page.params.id as Id<'flowInstances'>); // Query da instância com passos const instanceQuery = useQuery(api.flows.getInstanceWithSteps, () => ({ diff --git a/apps/web/src/routes/(dashboard)/pedidos/+page.svelte b/apps/web/src/routes/(dashboard)/pedidos/+page.svelte index a6bb70a..5a476ee 100644 --- a/apps/web/src/routes/(dashboard)/pedidos/+page.svelte +++ b/apps/web/src/routes/(dashboard)/pedidos/+page.svelte @@ -8,9 +8,9 @@ const pedidosQuery = useQuery(api.pedidos.list, {}); const acoesQuery = useQuery(api.acoes.list, {}); - const pedidos = $derived(pedidosQuery.data || []); - const loading = $derived(pedidosQuery.isLoading || acoesQuery.isLoading); - const error = $derived(pedidosQuery.error?.message || acoesQuery.error?.message || null); + let pedidos = $derived(pedidosQuery.data || []); + let loading = $derived(pedidosQuery.isLoading || acoesQuery.isLoading); + let error = $derived(pedidosQuery.error?.message || acoesQuery.error?.message || null); function formatStatus(status: string) { switch (status) { diff --git a/apps/web/src/routes/(dashboard)/pedidos/[id]/+page.svelte b/apps/web/src/routes/(dashboard)/pedidos/[id]/+page.svelte index 9f0745c..f5dac5d 100644 --- a/apps/web/src/routes/(dashboard)/pedidos/[id]/+page.svelte +++ b/apps/web/src/routes/(dashboard)/pedidos/[id]/+page.svelte @@ -28,14 +28,14 @@ const acoesQuery = useQuery(api.acoes.list, {}); // Derived state - const pedido = $derived(pedidoQuery.data); - const items = $derived(itemsQuery.data || []); - const history = $derived(historyQuery.data || []); - const objetos = $derived(objetosQuery.data || []); - const acoes = $derived(acoesQuery.data || []); + let pedido = $derived(pedidoQuery.data); + let items = $derived(itemsQuery.data || []); + let history = $derived(historyQuery.data || []); + let objetos = $derived(objetosQuery.data || []); + let acoes = $derived(acoesQuery.data || []); // Group items by user - const groupedItems = $derived.by(() => { + let groupedItems = $derived.by(() => { const groups: Record = {}; for (const item of items) { const userId = item.adicionadoPor; @@ -50,7 +50,7 @@ return Object.values(groups); }); - const loading = $derived( + let loading = $derived( pedidoQuery.isLoading || itemsQuery.isLoading || historyQuery.isLoading || @@ -58,7 +58,7 @@ acoesQuery.isLoading ); - const error = $derived( + let error = $derived( pedidoQuery.error?.message || itemsQuery.error?.message || historyQuery.error?.message || @@ -183,7 +183,7 @@ return unitValue * quantidade; } - const totalGeral = $derived( + let totalGeral = $derived( items.reduce((sum, item) => sum + calculateItemTotal(item.valorEstimado, item.quantidade), 0) ); diff --git a/apps/web/src/routes/(dashboard)/pedidos/novo/+page.svelte b/apps/web/src/routes/(dashboard)/pedidos/novo/+page.svelte index 225736a..85cab7a 100644 --- a/apps/web/src/routes/(dashboard)/pedidos/novo/+page.svelte +++ b/apps/web/src/routes/(dashboard)/pedidos/novo/+page.svelte @@ -9,15 +9,15 @@ const client = useConvexClient(); const acoesQuery = useQuery(api.acoes.list, {}); - const acoes = $derived(acoesQuery.data || []); + let acoes = $derived(acoesQuery.data || []); let searchQuery = $state(''); const searchResultsQuery = useQuery(api.objetos.search, () => ({ query: searchQuery })); - const searchResults = $derived(searchResultsQuery.data); + let searchResults = $derived(searchResultsQuery.data); - const formData = $state({ + let formData = $state({ numeroSei: '' }); let creating = $state(false); @@ -33,7 +33,7 @@ }; let selectedItems = $state([]); - const selectedObjetoIds = $derived(selectedItems.map((i) => i.objeto._id)); + let selectedObjetoIds = $derived(selectedItems.map((i) => i.objeto._id)); // Item configuration modal let showItemModal = $state(false); diff --git a/apps/web/src/routes/(dashboard)/perfil/+page.svelte b/apps/web/src/routes/(dashboard)/perfil/+page.svelte index a5e9310..cc6820a 100644 --- a/apps/web/src/routes/(dashboard)/perfil/+page.svelte +++ b/apps/web/src/routes/(dashboard)/perfil/+page.svelte @@ -59,7 +59,7 @@ let minhasSolicitacoesEstaveis = $state([]); let minhasAusenciasEstaveis = $state([]); - const abaAtiva = $state< + let abaAtiva = $state< | 'meu-perfil' | 'meus-chamados' | 'minhas-ferias' @@ -76,25 +76,25 @@ let uploadandoFoto = $state(false); let erroUpload = $state(''); let modoFoto = $state<'upload' | 'avatar'>('avatar'); - const mostrarBotaoCamera = $state(false); + let mostrarBotaoCamera = $state(false); // Estados para Minhas Férias - const mostrarWizard = $state(false); - const filtroStatusFerias = $state('todos'); + let mostrarWizard = $state(false); + let filtroStatusFerias = $state('todos'); // Estados para Minhas Ausências - const mostrarWizardAusencia = $state(false); - const filtroStatusAusencias = $state('todos'); + let mostrarWizardAusencia = $state(false); + let filtroStatusAusencias = $state('todos'); // Estados para Aprovar Ausências (Gestores) - const solicitacaoAusenciaAprovar = $state | null>(null); + let solicitacaoAusenciaAprovar = $state | null>(null); // Estados para Meus Chamados type Ticket = Doc<'tickets'>; const detalhesStore = chamadosStore.detalhes; let carregandoDetalheChamado = $state(false); - const filtroStatusChamados = $state<'todos' | Ticket['status']>('todos'); - const filtroTipoChamados = $state<'todos' | Ticket['tipo']>('todos'); + let filtroStatusChamados = $state<'todos' | Ticket['status']>('todos'); + let filtroTipoChamados = $state<'todos' | Ticket['tipo']>('todos'); let selectedTicketId = $state | null>(null); let mensagemChamado = $state(''); let erroMensagemChamado = $state(null); @@ -121,11 +121,11 @@ ]; // FuncionarioId disponível diretamente do usuário atual - const funcionarioIdDisponivel = $derived(currentUser?.data?.funcionarioId ?? null); - const gestorIdDisponivel = $derived(currentUser?.data?._id ?? null); + let funcionarioIdDisponivel = $derived(currentUser?.data?.funcionarioId ?? null); + let gestorIdDisponivel = $derived(currentUser?.data?._id ?? null); // Verificar autenticação antes de executar queries - const usuarioAutenticado = $derived( + let usuarioAutenticado = $derived( currentUser?.data !== null && currentUser?.data !== undefined ); @@ -143,14 +143,14 @@ // ✅ CORRIGIDO: Queries com argumentos obrigatórios usando $derived.by para estabilidade // Usamos uma chave estável baseada no ID para evitar recriação desnecessária - const solicitacoesSubordinadosQuery = $derived.by(() => { + let solicitacoesSubordinadosQuery = $derived.by(() => { if (!gestorIdDisponivel) return { data: [] }; return useQuery(api.ferias.listarSolicitacoesSubordinados, { gestorId: gestorIdDisponivel as Id<'usuarios'> }); }); - const ausenciasSubordinadosQuery = $derived.by(() => { + let ausenciasSubordinadosQuery = $derived.by(() => { if (!gestorIdDisponivel) return { data: [] }; return useQuery(api.ausencias.listarSolicitacoesSubordinados, { gestorId: gestorIdDisponivel as Id<'usuarios'> @@ -174,23 +174,23 @@ }); // Queries que dependem de funcionarioEstavel - const funcionarioIdParaQueries = $derived(funcionarioEstavel?._id ?? null); + let funcionarioIdParaQueries = $derived(funcionarioEstavel?._id ?? null); - const minhasSolicitacoesQuery = $derived.by(() => { + let minhasSolicitacoesQuery = $derived.by(() => { if (!funcionarioIdParaQueries) return { data: [] }; return useQuery(api.ferias.listarMinhasSolicitacoes, { funcionarioId: funcionarioIdParaQueries }); }); - const minhasAusenciasQuery = $derived.by(() => { + let minhasAusenciasQuery = $derived.by(() => { if (!funcionarioIdParaQueries) return { data: [] }; return useQuery(api.ausencias.listarMinhasSolicitacoes, { funcionarioId: funcionarioIdParaQueries }); }); - const meuTimeQuery = $derived.by(() => { + let meuTimeQuery = $derived.by(() => { if (!funcionarioIdParaQueries) return { data: null }; return useQuery(api.times.obterTimeFuncionario, { funcionarioId: funcionarioIdParaQueries @@ -234,26 +234,26 @@ }); // Deriveds - agora apenas extraem dados, não criam queries - const funcionario = $derived(funcionarioEstavel); - const solicitacoesSubordinados = $derived.by(() => { + let funcionario = $derived(funcionarioEstavel); + let solicitacoesSubordinados = $derived.by(() => { if (!gestorIdDisponivel) return []; return solicitacoesSubordinadosQuery?.data || []; }); - const ausenciasSubordinados = $derived.by(() => { + let ausenciasSubordinados = $derived.by(() => { if (!gestorIdDisponivel) return []; return ausenciasSubordinadosQuery?.data || []; }); - const meuTime = $derived(meuTimeEstavel); - const minhasSolicitacoes = $derived(minhasSolicitacoesEstaveis); - const minhasAusencias = $derived(minhasAusenciasEstaveis); - const timesSubordinados = $derived(timesSubordinadosQuery?.data || []); - const meusTimesGestor = $derived(timesSubordinados); + let meuTime = $derived(meuTimeEstavel); + let minhasSolicitacoes = $derived(minhasSolicitacoesEstaveis); + let minhasAusencias = $derived(minhasAusenciasEstaveis); + let timesSubordinados = $derived(timesSubordinadosQuery?.data || []); + let meusTimesGestor = $derived(timesSubordinados); - const rolePermiteAprovacao = $derived( + let rolePermiteAprovacao = $derived( currentUser?.data?.role?.nome === 'TI_MASTER' || currentUser?.data?.role?.nome === 'TI_ADMIN' ); - const ehGestor = $derived((timesSubordinados || []).length > 0 || rolePermiteAprovacao); + let ehGestor = $derived((timesSubordinados || []).length > 0 || rolePermiteAprovacao); // Estados estáveis para Meus Chamados let chamadosEstaveis = $state>>([]); @@ -274,14 +274,14 @@ }); // Deriveds para Meus Chamados - const listaChamados = $derived(chamadosEstaveis); - const carregandoListaChamados = $derived( + let listaChamados = $derived(chamadosEstaveis); + let carregandoListaChamados = $derived( chamadosQuery === undefined || chamadosQuery === null || chamadosQuery.data === undefined ); - const detalheAtualChamado = $derived( + let detalheAtualChamado = $derived( selectedTicketId ? ($detalhesStore[selectedTicketId] ?? null) : null ); - const ticketsFiltrados = $derived( + let ticketsFiltrados = $derived( listaChamados.filter((ticket) => { if (filtroStatusChamados !== 'todos' && ticket.status !== filtroStatusChamados) return false; if (filtroTipoChamados !== 'todos' && ticket.tipo !== filtroTipoChamados) return false; @@ -372,7 +372,7 @@ }); // Filtrar minhas solicitações - const solicitacoesFiltradas = $derived( + let solicitacoesFiltradas = $derived( minhasSolicitacoes.filter((s) => { if (filtroStatusFerias !== 'todos' && s.status !== filtroStatusFerias) return false; return true; @@ -380,7 +380,7 @@ ); // Filtrar minhas ausências - const ausenciasFiltradas = $derived( + let ausenciasFiltradas = $derived( minhasAusencias.filter((a) => { if (filtroStatusAusencias !== 'todos' && a.status !== filtroStatusAusencias) return false; return true; @@ -388,7 +388,7 @@ ); // Formatar ausências para o calendário - const ausenciasParaCalendario = $derived( + let ausenciasParaCalendario = $derived( minhasAusencias.map((a) => ({ dataInicio: a.dataInicio, dataFim: a.dataFim, @@ -397,7 +397,7 @@ ); // Estatísticas das minhas férias (períodos individuais) - const statsMinhasFerias = $derived({ + let statsMinhasFerias = $derived({ total: minhasSolicitacoes.length, aguardando: minhasSolicitacoes.filter((s) => s.status === 'aguardando_aprovacao').length, aprovadas: minhasSolicitacoes.filter( @@ -409,7 +409,7 @@ }); // Estatísticas das minhas ausências - const statsMinhasAusencias = $derived({ + let statsMinhasAusencias = $derived({ total: minhasAusencias.length, aguardando: minhasAusencias.filter((a) => a.status === 'aguardando_aprovacao').length, aprovadas: minhasAusencias.filter((a) => a.status === 'aprovado').length, diff --git a/apps/web/src/routes/(dashboard)/perfil/chamados/+page.svelte b/apps/web/src/routes/(dashboard)/perfil/chamados/+page.svelte index 9adaae4..05b64dd 100644 --- a/apps/web/src/routes/(dashboard)/perfil/chamados/+page.svelte +++ b/apps/web/src/routes/(dashboard)/perfil/chamados/+page.svelte @@ -24,18 +24,18 @@ let carregandoLista = $state(true); let carregandoDetalhe = $state(false); - const filtroStatus = $state<'todos' | Ticket['status']>('todos'); - const filtroTipo = $state<'todos' | Ticket['tipo']>('todos'); + let filtroStatus = $state<'todos' | Ticket['status']>('todos'); + let filtroTipo = $state<'todos' | Ticket['tipo']>('todos'); let selectedTicketId = $state | null>(null); let mensagem = $state(''); let erroMensagem = $state(null); let sucessoMensagem = $state(null); - const listaChamados = $derived($ticketsStore); - const detalheAtual = $derived( + let listaChamados = $derived($ticketsStore); + let detalheAtual = $derived( selectedTicketId ? ($detalhesStore[selectedTicketId] ?? null) : null ); - const ticketsFiltrados = $derived( + let ticketsFiltrados = $derived( listaChamados.filter((ticket) => { if (filtroStatus !== 'todos' && ticket.status !== filtroStatus) return false; if (filtroTipo !== 'todos' && ticket.tipo !== filtroTipo) return false; diff --git a/apps/web/src/routes/(dashboard)/programas-esportivos/acoes/+page.svelte b/apps/web/src/routes/(dashboard)/programas-esportivos/acoes/+page.svelte index ba77e17..892c5a7 100644 --- a/apps/web/src/routes/(dashboard)/programas-esportivos/acoes/+page.svelte +++ b/apps/web/src/routes/(dashboard)/programas-esportivos/acoes/+page.svelte @@ -8,9 +8,9 @@ // Reactive query const acoesQuery = useQuery(api.acoes.list, {}); - const acoes = $derived(acoesQuery.data || []); - const loading = $derived(acoesQuery.isLoading); - const error = $derived(acoesQuery.error?.message || null); + let acoes = $derived(acoesQuery.data || []); + let loading = $derived(acoesQuery.isLoading); + let error = $derived(acoesQuery.error?.message || null); // Modal state let showModal = $state(false); 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 8b206c4..cbcef40 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 @@ -101,7 +101,7 @@ }); // Licenças maternidade para prorrogação (derivar dos dados já carregados) - const licencasMaternidade = $derived.by(() => { + let licencasMaternidade = $derived.by(() => { const dados = dadosQuery?.data; if (!dados) return []; return dados.licencas.filter((l) => l.tipo === 'maternidade' && !l.ehProrrogacao); @@ -147,7 +147,7 @@ } // Dados para gráfico de área - Total de Dias por Tipo (Layerchart) - const chartDataTotalDiasPorTipo = $derived.by(() => { + let chartDataTotalDiasPorTipo = $derived.by(() => { if (!graficosQuery?.data?.totalDiasPorTipo) { return { labels: [], @@ -184,7 +184,7 @@ }); // Dados para gráfico de área - Tendências Mensais (Layerchart empilhado) - const chartDataTendenciasMensais = $derived.by(() => { + let chartDataTendenciasMensais = $derived.by(() => { if (!graficosQuery?.data?.tendenciasMensais) { return { labels: [], @@ -527,7 +527,7 @@ } // Filtrar registros - const registrosFiltrados = $derived.by(() => { + let registrosFiltrados = $derived.by(() => { const dados = dadosQuery?.data; if (!dados) return { atestados: [], licencas: [] }; @@ -588,10 +588,10 @@ } // Estados para relatórios - const relatorioPeriodoInicio = $state(''); - const relatorioPeriodoFim = $state(''); - const relatorioFuncionarioNome = $state(''); - const relatorioFuncionarioMatricula = $state(''); + let relatorioPeriodoInicio = $state(''); + let relatorioPeriodoFim = $state(''); + let relatorioFuncionarioNome = $state(''); + let relatorioFuncionarioMatricula = $state(''); let relatorioCampos = $state({ atestados: false, licencaPaternidade: false, diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/ausencias/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/ausencias/+page.svelte index 336e175..f9f79d5 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/ausencias/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/ausencias/+page.svelte @@ -12,13 +12,13 @@ // Buscar TODAS as solicitações de ausências (Dashboard RH) const todasAusenciasQuery = useQuery(api.ausencias.listarTodas, {}); - const filtroStatus = $state('todos'); + let filtroStatus = $state('todos'); let solicitacaoSelecionada = $state | null>(null); - const ausencias = $derived(todasAusenciasQuery?.data || []); + let ausencias = $derived(todasAusenciasQuery?.data || []); // Filtrar solicitações - const ausenciasFiltradas = $derived( + let ausenciasFiltradas = $derived( ausencias.filter((a) => { // Filtro de status if (filtroStatus !== 'todos' && a.status !== filtroStatus) return false; @@ -27,7 +27,7 @@ ); // Estatísticas gerais - const stats = $derived({ + let stats = $derived({ total: ausencias.length, aguardando: ausencias.filter((a) => a.status === 'aguardando_aprovacao').length, aprovadas: ausencias.filter((a) => a.status === 'aprovado').length, diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/controle-ponto/dispensa/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/controle-ponto/dispensa/+page.svelte index f6c2c1b..5f50583 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/controle-ponto/dispensa/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/controle-ponto/dispensa/+page.svelte @@ -22,12 +22,12 @@ let isento = $state(false); // Computed para converter time string para hora/minuto - const horaInicio = $derived.by(() => { + let horaInicio = $derived.by(() => { const [hora, minuto] = horaInicioTime.split(':').map(Number); return { hora: hora || 8, minuto: minuto || 0 }; }); - const horaFim = $derived.by(() => { + let horaFim = $derived.by(() => { const [hora, minuto] = horaFimTime.split(':').map(Number); return { hora: hora || 18, minuto: minuto || 0 }; }); @@ -38,11 +38,11 @@ apenasAtivas: true // Mostrar apenas dispensas ativas }); - const subordinados = $derived(subordinadosQuery?.data || []); - const dispensas = $derived(dispensasQuery?.data || []); + let subordinados = $derived(subordinadosQuery?.data || []); + let dispensas = $derived(dispensasQuery?.data || []); // Lista de funcionários do time - const funcionarios = $derived.by(() => { + let funcionarios = $derived.by(() => { const funcs: Array<{ _id: Id<'funcionarios'>; nome: string; diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/controle-ponto/homologacao/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/controle-ponto/homologacao/+page.svelte index a263128..8def085 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/controle-ponto/homologacao/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/controle-ponto/homologacao/+page.svelte @@ -32,8 +32,8 @@ // Filtros de período const hoje = new Date(); const trintaDiasAtras = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); - const dataInicioFiltro = $state(trintaDiasAtras.toISOString().split('T')[0]!); - const dataFimFiltro = $state(hoje.toISOString().split('T')[0]!); + let dataInicioFiltro = $state(trintaDiasAtras.toISOString().split('T')[0]!); + let dataFimFiltro = $state(hoje.toISOString().split('T')[0]!); // Monitorar mudanças em funcionarioSelecionado $effect(() => { @@ -96,13 +96,13 @@ } // Obter registro selecionado - const registroEmEdicao = $derived.by(() => { + let registroEmEdicao = $derived.by(() => { if (!registroSelecionado) return null; return registros.find((r) => r._id === registroSelecionado) || null; }); // Formatar data do registro - const dataRegistroFormatada = $derived.by(() => { + let dataRegistroFormatada = $derived.by(() => { if (!registroEmEdicao) return ''; const data = new Date(registroEmEdicao.data); return data.toLocaleDateString('pt-BR', { @@ -124,12 +124,12 @@ const motivosQuery = useQuery(api.pontos.obterMotivosAtestados, {}); // Parâmetros reativos para queries - const homologacoesParams = $derived({ + let homologacoesParams = $derived({ funcionarioId: funcionarioSelecionado || undefined }); // Parâmetros para query de registros - só executa quando há funcionário selecionado - const registrosQueryParams = $derived.by(() => { + let registrosQueryParams = $derived.by(() => { // Verificar se funcionarioSelecionado não é string vazia if (!funcionarioSelecionado || funcionarioSelecionado === '') { return undefined; @@ -142,16 +142,16 @@ }); const homologacoesQuery = useQuery(api.pontos.listarHomologacoes, homologacoesParams); - const registrosQuery = $derived( + let registrosQuery = $derived( registrosQueryParams ? useQuery(api.pontos.listarRegistrosPeriodo, registrosQueryParams) : null ); - const subordinados = $derived(subordinadosQuery?.data || []); - const motivos = $derived(motivosQuery?.data); - const homologacoes = $derived(homologacoesQuery?.data || []); + let subordinados = $derived(subordinadosQuery?.data || []); + let motivos = $derived(motivosQuery?.data); + let homologacoes = $derived(homologacoesQuery?.data || []); // Registros já filtrados pela query no backend - const registros = $derived.by(() => { + let registros = $derived.by(() => { if (!funcionarioSelecionado || funcionarioSelecionado === '' || !registrosQuery) { return []; } @@ -164,10 +164,10 @@ }); // Verificar se é gestor (tem subordinados) - const isGestor = $derived(subordinados.length > 0); + let isGestor = $derived(subordinados.length > 0); // Lista de funcionários do time - const funcionarios = $derived.by(() => { + let funcionarios = $derived.by(() => { const funcs: Array<{ _id: Id<'funcionarios'>; nome: string; @@ -364,7 +364,7 @@ } } - const homologacaoSelecionada = $derived.by(() => { + let homologacaoSelecionada = $derived.by(() => { if (!homologacaoDetalhada) return null; return homologacoes.find((h) => h._id === homologacaoDetalhada) || null; }); diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/ferias/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/ferias/+page.svelte index 5dabaef..acd120d 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/ferias/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/ferias/+page.svelte @@ -52,13 +52,13 @@ const currentUser = useQuery(api.auth.getCurrentUser, {}); // Estado da aba ativa - const abaAtiva = $state<'dashboard' | 'solicitacoes' | 'relatorios'>('dashboard'); + let abaAtiva = $state<'dashboard' | 'solicitacoes' | 'relatorios'>('dashboard'); // Estado para controlar qual período está selecionado para mudança de status let periodoSelecionado = $state | null>(null); // Estados de loading e error - const isLoading = $derived(todasSolicitacoesQuery?.isLoading ?? true); + let isLoading = $derived(todasSolicitacoesQuery?.isLoading ?? true); // Debug: Log dos dados carregados (apenas uma vez quando dados mudam) let ultimoTotalDados = $state(-1); @@ -71,15 +71,15 @@ }); // Verificar erro de forma segura - const queryResult = $derived(todasSolicitacoesQuery); - const hasError = $derived( + let queryResult = $derived(todasSolicitacoesQuery); + let hasError = $derived( queryResult !== undefined && queryResult !== null && typeof queryResult === 'object' && 'error' in queryResult && (queryResult as { error?: unknown }).error !== undefined ); - const errorMessage = $derived(() => { + let errorMessage = $derived(() => { if (!hasError) return 'Erro desconhecido ao carregar dados'; const queryWithError = queryResult as { error?: unknown } | undefined; if (!queryWithError?.error) return 'Erro desconhecido ao carregar dados'; @@ -110,7 +110,7 @@ }); // Usar último valor válido ou array vazio - const solicitacoes = $derived( + let solicitacoes = $derived( (todasSolicitacoesQuery?.data ?? ultimasSolicitacoesValidas) || [] ); @@ -237,7 +237,7 @@ } // Filtros para Dashboard - const solicitacoesFiltradasDashboard = $derived( + let solicitacoesFiltradasDashboard = $derived( filtrarSolicitacoes(solicitacoes, { status: filtroStatusDashboard, nome: filtroNomeDashboard, @@ -250,7 +250,7 @@ ); // Filtros para Solicitações - const solicitacoesFiltradas = $derived( + let solicitacoesFiltradas = $derived( filtrarSolicitacoes(solicitacoes, { status: filtroStatusSolicitacoes, nome: filtroNomeSolicitacoes, @@ -263,7 +263,7 @@ ); // Estatísticas gerais - const stats = $derived({ + let stats = $derived({ total: solicitacoes.length, aguardando: solicitacoes.filter((solicitacao) => solicitacao.status === 'aguardando_aprovacao') .length, @@ -274,14 +274,14 @@ reprovadas: solicitacoes.filter((solicitacao) => solicitacao.status === 'reprovado').length }); - const solicitacoesAprovadas = $derived( + let solicitacoesAprovadas = $derived( (Array.isArray(solicitacoesFiltradas) ? solicitacoesFiltradas : []).filter( (p) => p.status === 'aprovado' || p.status === 'data_ajustada_aprovada' || p.status === 'EmFérias' ) ); - const periodosDetalhados = $derived>( + let periodosDetalhados = $derived>( (Array.isArray(solicitacoesAprovadas) ? solicitacoesAprovadas : []) .map((periodo) => ({ feriasId: periodo._id, @@ -307,7 +307,7 @@ quantidadePeriodos: number; }; - const periodosPorMes = $derived>( + let periodosPorMes = $derived>( (() => { const agregados = new SvelteMap(); @@ -408,7 +408,7 @@ } }); - const periodosPorMesAtivos = $derived>( + let periodosPorMesAtivos = $derived>( (() => { if (periodosPorMes.length === 0) { return []; @@ -422,7 +422,7 @@ })() ); - const solicitacoesPorAno = $derived>( + let solicitacoesPorAno = $derived>( (() => { const agregados = new SvelteMap(); @@ -443,7 +443,7 @@ ); // Dados para gráfico de barras 3D - Dias por Mês - const chartDataMes = $derived(() => { + let chartDataMes = $derived(() => { if (periodosPorMesAtivos.length === 0) { return { labels: [], @@ -482,7 +482,7 @@ }); // Dados para gráfico de barras 3D - Dias por Ano - const chartDataAno = $derived(() => { + let chartDataAno = $derived(() => { if (solicitacoesPorAno.length === 0) { return { labels: [], @@ -564,7 +564,7 @@ spanGaps: boolean; }>; }; - const chartDataFuncionariosFerias: ChartData = $derived.by(() => { + let chartDataFuncionariosFerias: ChartData = $derived.by(() => { // Sempre criar os 12 meses, mesmo sem dados const hoje = new SvelteDate(); hoje.setHours(0, 0, 0, 0); @@ -686,7 +686,7 @@ '#f43f5e' ] as const; - const eventosFerias = $derived>( + let eventosFerias = $derived>( periodosDetalhados.map((periodo, indice) => { const corBase = periodo.timeCor ?? coresCalendario[indice % coresCalendario.length]; return { 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 fd83308..3313f14 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/+page.svelte @@ -38,10 +38,10 @@ // Queries const todosSetoresQuery = useQuery(api.setores.list, {}); - const filtroNome = $state(''); - const filtroCPF = $state(''); - const filtroMatricula = $state(''); - const filtroTipo = $state(''); + let filtroNome = $state(''); + let filtroCPF = $state(''); + let filtroMatricula = $state(''); + let filtroTipo = $state(''); function applyFilters() { const nome = filtroNome.toLowerCase(); diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/+page.svelte index 4f41835..69b5ebd 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/+page.svelte @@ -19,14 +19,14 @@ const client = useConvexClient(); - const funcionarioId = $derived($page.params.funcionarioId as string); + let funcionarioId = $derived($page.params.funcionarioId as string); let funcionario = $state(null); let simbolo = $state(null); let cursos = $state([]); let documentosUrls = $state>({}); let loading = $state(true); - const showPrintModal = $state(false); + let showPrintModal = $state(false); async function load() { try { diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/documentos/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/documentos/+page.svelte index a5f8de4..c22cb07 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/documentos/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/documentos/+page.svelte @@ -15,12 +15,12 @@ const client = useConvexClient(); - const funcionarioId = $derived($page.params.funcionarioId as Id<'funcionarios'>); + let funcionarioId = $derived($page.params.funcionarioId as Id<'funcionarios'>); let funcionario = $state | null>(null); - const documentosStorage = $state>({}); + let documentosStorage = $state>({}); let loading = $state(true); - const filtro = $state<'todos' | 'enviados' | 'pendentes'>('todos'); // todos, enviados, pendentes + let filtro = $state<'todos' | 'enviados' | 'pendentes'>('todos'); // todos, enviados, pendentes async function load() { try { diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/editar/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/editar/+page.svelte index 2fa1018..5feeb63 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/editar/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/editar/+page.svelte @@ -33,7 +33,7 @@ const client = useConvexClient(); - const funcionarioId = $derived($page.params.funcionarioId as string); + let funcionarioId = $derived($page.params.funcionarioId as string); let simbolos: Array<{ _id: string; diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/enderecos-marcacao/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/enderecos-marcacao/+page.svelte index 70450e1..74aa217 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/enderecos-marcacao/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/[funcionarioId]/enderecos-marcacao/+page.svelte @@ -10,7 +10,7 @@ import { page } from '$app/stores'; const client = useConvexClient(); - const funcionarioId = $derived($page.params.funcionarioId as Id<'funcionarios'>); + let funcionarioId = $derived($page.params.funcionarioId as Id<'funcionarios'>); // Queries const funcionarioQuery = useQuery( @@ -25,15 +25,15 @@ incluirInativos: false }); - const funcionario = $derived(funcionarioQuery?.data); - const associacoes = $derived(associacoesQuery?.data || []); - const enderecosDisponiveis = $derived(enderecosDisponiveisQuery?.data || []); + let funcionario = $derived(funcionarioQuery?.data); + let associacoes = $derived(associacoesQuery?.data || []); + let enderecosDisponiveis = $derived(enderecosDisponiveisQuery?.data || []); // Estados let mostrarModalAssociacao = $state(false); let editandoAssociacao: (typeof associacoes)[number] | null = $state(null); let processando = $state(false); - const termoBusca = $state(''); + let termoBusca = $state(''); // Campos do formulário let enderecoSelecionado: Id<'enderecosMarcacao'> | '' = $state(''); @@ -42,7 +42,7 @@ let dataFim = $state(''); // Filtrar associacoes - const associacoesFiltradas = $derived( + let associacoesFiltradas = $derived( associacoes.filter((a) => { if (!termoBusca) return true; const busca = termoBusca.toLowerCase(); @@ -56,12 +56,12 @@ ); // Endereços já associados (para não mostrar no select) - const enderecosJaAssociados = $derived( + let enderecosJaAssociados = $derived( new Set(associacoes.filter((a) => a.ativo).map((a) => a.endereco._id)) ); // Endereços disponíveis para associar (não associados e ativos) - const enderecosParaAssociar = $derived( + let enderecosParaAssociar = $derived( enderecosDisponiveis.filter((e) => e.ativo && !enderecosJaAssociados.has(e._id)) ); diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/cadastro/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/cadastro/+page.svelte index 6bcd4bd..bd4151c 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/cadastro/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/cadastro/+page.svelte @@ -37,73 +37,73 @@ descricao: string; }> = $state([]); - const tipo = $state('cargo_comissionado'); + let tipo = $state('cargo_comissionado'); let loading = $state(false); let notice = $state<{ kind: 'success' | 'error'; text: string } | null>(null); // Campos obrigatórios - const nome = $state(''); - const matricula = $state(''); - const cpf = $state(''); - const rg = $state(''); - const nascimento = $state(''); - const email = $state(''); - const telefone = $state(''); + let nome = $state(''); + let matricula = $state(''); + let cpf = $state(''); + let rg = $state(''); + let nascimento = $state(''); + let email = $state(''); + let telefone = $state(''); let endereco = $state(''); - const cep = $state(''); + let cep = $state(''); let cidade = $state(''); let uf = $state(''); - const simboloId: Id<'simbolos'> | null = $derived.by(() => { + let simboloId: Id<'simbolos'> | null = $derived.by(() => { if (tipo) { return null; } else { return null; } }); - const admissaoData = $state(''); + let admissaoData = $state(''); // Dados Pessoais Adicionais - const nomePai = $state(''); - const nomeMae = $state(''); - const naturalidade = $state(''); - const naturalidadeUF = $state(''); - const sexo = $state<'masculino' | 'feminino' | 'outro' | null>(null); - const estadoCivil = $state< + let nomePai = $state(''); + let nomeMae = $state(''); + let naturalidade = $state(''); + let naturalidadeUF = $state(''); + let sexo = $state<'masculino' | 'feminino' | 'outro' | null>(null); + let estadoCivil = $state< 'solteiro' | 'casado' | 'divorciado' | 'viuvo' | 'uniao_estavel' | null >(null); - const nacionalidade = $state('Brasileira'); + let nacionalidade = $state('Brasileira'); // Documentos Pessoais - const rgOrgaoExpedidor = $state(''); - const rgDataEmissao = $state(''); - const carteiraProfissionalNumero = $state(''); - const carteiraProfissionalSerie = $state(''); - const carteiraProfissionalDataEmissao = $state(''); - const reservistaNumero = $state(''); - const reservistaSerie = $state(''); - const tituloEleitorNumero = $state(''); - const tituloEleitorZona = $state(''); - const tituloEleitorSecao = $state(''); - const pisNumero = $state(''); + let rgOrgaoExpedidor = $state(''); + let rgDataEmissao = $state(''); + let carteiraProfissionalNumero = $state(''); + let carteiraProfissionalSerie = $state(''); + let carteiraProfissionalDataEmissao = $state(''); + let reservistaNumero = $state(''); + let reservistaSerie = $state(''); + let tituloEleitorNumero = $state(''); + let tituloEleitorZona = $state(''); + let tituloEleitorSecao = $state(''); + let pisNumero = $state(''); // Formação e Saúde - const grauInstrucao = $state< + let grauInstrucao = $state< 'fundamental' | 'medio' | 'superior' | 'pos_graduacao' | 'mestrado' | 'doutorado' | null >(null); - const formacao = $state(''); - const formacaoRegistro = $state(''); - const grupoSanguineo = $state<'A' | 'B' | 'AB' | 'O' | null>(null); - const fatorRH = $state<'positivo' | 'negativo' | null>(null); + let formacao = $state(''); + let formacaoRegistro = $state(''); + let grupoSanguineo = $state<'A' | 'B' | 'AB' | 'O' | null>(null); + let fatorRH = $state<'positivo' | 'negativo' | null>(null); // Cargo e Vínculo - const descricaoCargo = $state(''); - const nomeacaoPortaria = $state(''); - const nomeacaoData = $state(''); - const nomeacaoDOE = $state(''); - const pertenceOrgaoPublico = $state(false); - const orgaoOrigem = $state(''); - const aposentado = $state<'nao' | 'funape_ipsep' | 'inss' | null>('nao'); - const regimeTrabalho = $state< + let descricaoCargo = $state(''); + let nomeacaoPortaria = $state(''); + let nomeacaoData = $state(''); + let nomeacaoDOE = $state(''); + let pertenceOrgaoPublico = $state(false); + let orgaoOrigem = $state(''); + let aposentado = $state<'nao' | 'funape_ipsep' | 'inss' | null>('nao'); + let regimeTrabalho = $state< 'clt' | 'estatutario_municipal' | 'estatutario_pe' | 'estatutario_federal' | null >(null); @@ -115,12 +115,12 @@ ] as const; // Dados Bancários - const contaBradescoNumero = $state(''); - const contaBradescoDV = $state(''); - const contaBradescoAgencia = $state(''); + let contaBradescoNumero = $state(''); + let contaBradescoDV = $state(''); + let contaBradescoAgencia = $state(''); // Documentos (Storage IDs) - const documentosStorage: Record = $state({}); + let documentosStorage: Record = $state({}); // Cursos e Treinamentos let cursos = $state< @@ -131,7 +131,7 @@ certificadoId?: Id<'_storage'>; }> >([]); - const mostrarFormularioCurso = $state(false); + let mostrarFormularioCurso = $state(false); let cursoAtual = $state({ descricao: '', data: '', @@ -151,7 +151,7 @@ impostoRenda?: boolean; }> >([]); - const mostrarFormularioDependente = $state(false); + let mostrarFormularioDependente = $state(false); let dependenteAtual = $state<{ parentesco: 'outro' | 'filho' | 'filha' | 'conjuge' | null; nome: string; diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/excluir/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/excluir/+page.svelte index e2c2d22..6bc04f1 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/excluir/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/excluir/+page.svelte @@ -71,7 +71,7 @@ } // Computed para lista filtrada - const filtered = $derived( + let filtered = $derived( list.filter((f) => { const q = (filtro || '').toLowerCase(); return ( diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/relatorios/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/relatorios/+page.svelte index 8ba76bd..53c9304 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/relatorios/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/funcionarios/relatorios/+page.svelte @@ -61,7 +61,7 @@ const chartHeight = 350; const padding = { top: 20, right: 20, bottom: 80, left: 70 }; - const chartWidth = $derived(containerWidth); + let chartWidth = $derived(containerWidth); function getMax(arr: Array, sel: (t: T) => number): number { let m = 0; diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/registro-pontos/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/registro-pontos/+page.svelte index 6eab0e5..20c907a 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/registro-pontos/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/registro-pontos/+page.svelte @@ -43,7 +43,7 @@ let funcionarioIdFiltro = $state | ''>(''); let statusFiltro = $state<'todos' | 'dentro' | 'fora'>('todos'); let localizacaoFiltro = $state<'todos' | 'dentro' | 'fora'>('todos'); - const carregando = $state(false); + let carregando = $state(false); let mostrarModalImpressao = $state(false); let funcionarioParaImprimir = $state | ''>(''); let mostrarModalDetalhes = $state(false); @@ -52,13 +52,13 @@ let chartInstance: Chart | null = null; // Parâmetros reativos para queries - const registrosParams = $derived({ + let registrosParams = $derived({ funcionarioId: funcionarioIdFiltro && funcionarioIdFiltro !== '' ? funcionarioIdFiltro : undefined, dataInicio, dataFim }); - const estatisticasParams = $derived({ + let estatisticasParams = $derived({ dataInicio, dataFim, funcionarioId: @@ -71,10 +71,10 @@ const estatisticasQuery = useQuery(api.pontos.obterEstatisticas, estatisticasParams); const configQuery = useQuery(api.configuracaoPonto.obterConfiguracao, {}); - const funcionarios = $derived(funcionariosQuery?.data || []); - const registros = $derived(registrosQuery?.data || []); - const estatisticas = $derived(estatisticasQuery?.data); - const config = $derived(configQuery?.data); + let funcionarios = $derived(funcionariosQuery?.data || []); + let registros = $derived(registrosQuery?.data || []); + let estatisticas = $derived(estatisticasQuery?.data); + let config = $derived(configQuery?.data); // Debug: Log dos dados recebidos $effect(() => { @@ -92,7 +92,7 @@ }); // Dados do gráfico baseados nas estatísticas - const chartData = $derived.by(() => { + let chartData = $derived.by(() => { if (!estatisticas) return null; return { @@ -266,7 +266,7 @@ // Filtrar registros com base nos filtros avançados // Nota: Os filtros de data e funcionário são aplicados no backend através de registrosParams // Os filtros de status e localização são aplicados aqui no frontend - const registrosFiltrados = $derived.by(() => { + let registrosFiltrados = $derived.by(() => { if (!registros || registros.length === 0) return []; let resultado = [...registros]; @@ -297,7 +297,7 @@ }); // Agrupar registros por funcionário e data - const registrosAgrupados = $derived.by(() => { + let registrosAgrupados = $derived.by(() => { const configData = config; const agrupados: Record< string, @@ -502,7 +502,7 @@ }); // Query para banco de horas de cada funcionário - const funcionariosComBancoHoras = $derived.by(() => { + let funcionariosComBancoHoras = $derived.by(() => { return registrosAgrupados.map((grupo) => grupo.funcionarioId); }); @@ -529,7 +529,7 @@ // Usar função centralizada formatarDataDDMMAAAA da lib/utils/ponto.ts // Obter nome do funcionário selecionado - const funcionarioSelecionadoNome = $derived.by(() => { + let funcionarioSelecionadoNome = $derived.by(() => { if (!funcionarioIdFiltro) return null; return funcionarios.find((f) => f._id === funcionarioIdFiltro)?.nome || null; }); diff --git a/apps/web/src/routes/(dashboard)/recursos-humanos/simbolos/cadastro/+page.svelte b/apps/web/src/routes/(dashboard)/recursos-humanos/simbolos/cadastro/+page.svelte index a3991e0..4aa1c31 100644 --- a/apps/web/src/routes/(dashboard)/recursos-humanos/simbolos/cadastro/+page.svelte +++ b/apps/web/src/routes/(dashboard)/recursos-humanos/simbolos/cadastro/+page.svelte @@ -9,7 +9,7 @@ const client = useConvexClient(); - const tipo = $state('cargo_comissionado'); + let tipo = $state('cargo_comissionado'); const defaultValues = { nome: '', diff --git a/apps/web/src/routes/(dashboard)/secretaria-executiva/gestao-ausencias/+page.svelte b/apps/web/src/routes/(dashboard)/secretaria-executiva/gestao-ausencias/+page.svelte index 4ce68e7..222a594 100644 --- a/apps/web/src/routes/(dashboard)/secretaria-executiva/gestao-ausencias/+page.svelte +++ b/apps/web/src/routes/(dashboard)/secretaria-executiva/gestao-ausencias/+page.svelte @@ -12,13 +12,13 @@ // Buscar TODAS as solicitações de ausências const todasAusenciasQuery = useQuery(api.ausencias.listarTodas, {}); - const filtroStatus = $state('todos'); + let filtroStatus = $state('todos'); let solicitacaoSelecionada = $state | null>(null); - const ausencias = $derived(todasAusenciasQuery?.data || []); + let ausencias = $derived(todasAusenciasQuery?.data || []); // Filtrar solicitações - const ausenciasFiltradas = $derived( + let ausenciasFiltradas = $derived( ausencias.filter((a) => { // Filtro de status if (filtroStatus !== 'todos' && a.status !== filtroStatus) return false; @@ -27,7 +27,7 @@ ); // Estatísticas gerais - const stats = $derived({ + let stats = $derived({ total: ausencias.length, aguardando: ausencias.filter((a) => a.status === 'aguardando_aprovacao').length, aprovadas: ausencias.filter((a) => a.status === 'aprovado').length, diff --git a/apps/web/src/routes/(dashboard)/ti/auditoria/+page.svelte b/apps/web/src/routes/(dashboard)/ti/auditoria/+page.svelte index 2831eee..1ffb04f 100644 --- a/apps/web/src/routes/(dashboard)/ti/auditoria/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/auditoria/+page.svelte @@ -9,9 +9,9 @@ import { resolve } from '$app/paths'; import logoGovPE from '$lib/assets/logo_governo_PE.png'; - const abaAtiva = $state<'atividades' | 'logins'>('atividades'); - const limite = $state(50); - const mostrarFiltros = $state(false); + let abaAtiva = $state<'atividades' | 'logins'>('atividades'); + let limite = $state(50); + let mostrarFiltros = $state(false); let exportando = $state(false); const client = useConvexClient(); @@ -31,7 +31,7 @@ })); // Extrair dados das queries de forma robusta - const atividadesRaw = $derived.by(() => { + let atividadesRaw = $derived.by(() => { if (atividadesQuery === undefined || atividadesQuery === null) { return undefined; } @@ -47,7 +47,7 @@ return undefined; }); - const loginsRaw = $derived.by(() => { + let loginsRaw = $derived.by(() => { if (loginsQuery === undefined || loginsQuery === null) { return undefined; } @@ -64,7 +64,7 @@ }); // Aplicar filtros - const atividades = $derived.by(() => { + let atividades = $derived.by(() => { if (!atividadesRaw || !Array.isArray(atividadesRaw)) return []; let filtradas = [...atividadesRaw]; @@ -88,7 +88,7 @@ return filtradas; }); - const logins = $derived.by(() => { + let logins = $derived.by(() => { if (!loginsRaw || !Array.isArray(loginsRaw)) return []; let filtrados = [...loginsRaw]; @@ -212,10 +212,10 @@ } // Estatísticas - const totalAtividades = $derived(atividades?.length || 0); - const totalLogins = $derived(logins?.length || 0); - const loginsSucesso = $derived(logins?.filter((l) => l.sucesso).length || 0); - const loginsFalha = $derived(logins?.filter((l) => !l.sucesso).length || 0); + let totalAtividades = $derived(atividades?.length || 0); + let totalLogins = $derived(logins?.length || 0); + let loginsSucesso = $derived(logins?.filter((l) => l.sucesso).length || 0); + let loginsFalha = $derived(logins?.filter((l) => !l.sucesso).length || 0); // Funções de exportação async function exportarCSV() { diff --git a/apps/web/src/routes/(dashboard)/ti/central-chamados/+page.svelte b/apps/web/src/routes/(dashboard)/ti/central-chamados/+page.svelte index 6c7e1b3..e901288 100644 --- a/apps/web/src/routes/(dashboard)/ti/central-chamados/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/central-chamados/+page.svelte @@ -30,7 +30,7 @@ const dadosSlaGraficoQuery = useQuery(api.chamados.obterDadosSlaGrafico, {}); // Extrair dados dos templates - const templates = $derived.by(() => { + let templates = $derived.by(() => { // useQuery retorna undefined enquanto carrega, depois retorna os dados diretamente if (templatesQuery === undefined || templatesQuery === null) { return []; @@ -42,12 +42,12 @@ return []; }); - const carregandoTemplates = $derived.by(() => { + let carregandoTemplates = $derived.by(() => { // useQuery retorna undefined enquanto carrega return templatesQuery === undefined || templatesQuery === null; }); - const templatesChamados = $derived.by(() => { + let templatesChamados = $derived.by(() => { return templates.filter((t: Template) => { if (!t.codigo) return false; return typeof t.codigo === 'string' && t.codigo.startsWith('chamado_'); @@ -56,12 +56,12 @@ let carregandoChamados = $state(true); let tickets = $state>([]); - const filtroStatus = $state<'todos' | Ticket['status']>('todos'); - const filtroResponsavel = $state<'todos' | Id<'usuarios'>>('todos'); - const filtroSetor = $state('todos'); + let filtroStatus = $state<'todos' | Ticket['status']>('todos'); + let filtroResponsavel = $state<'todos' | Id<'usuarios'>>('todos'); + let filtroSetor = $state('todos'); let ticketSelecionado = $state | null>(null); let detalheSelecionado = $state(null); - const abaAtiva = $state<'dashboard' | 'chamados' | 'sla'>('dashboard'); + let abaAtiva = $state<'dashboard' | 'chamados' | 'sla'>('dashboard'); let assignResponsavel = $state | ''>(''); let assignMotivo = $state(''); let assignFeedback = $state(null); @@ -223,7 +223,7 @@ detalheSelecionado = tickets.find((t) => t._id === ticketId) ?? null; } - const usuariosTI = $derived.by(() => { + let usuariosTI = $derived.by(() => { // useQuery retorna undefined enquanto carrega, depois retorna os dados diretamente if (usuariosQuery === undefined || usuariosQuery === null) { if (import.meta.env.DEV) { @@ -285,7 +285,7 @@ return usuariosFiltrados; }); - const estatisticas = $derived.by(() => { + let estatisticas = $derived.by(() => { // Usar query de estatísticas se disponível, senão calcular localmente if (estatisticasQuery !== undefined && estatisticasQuery !== null) { // useQuery retorna dados diretamente ou em propriedade data @@ -408,7 +408,7 @@ } } - const slaConfigsPorPrioridade = $derived.by(() => { + let slaConfigsPorPrioridade = $derived.by(() => { // useQuery retorna um objeto com propriedade .data if (slaConfigsQuery === undefined || slaConfigsQuery === null) { return { diff --git a/apps/web/src/routes/(dashboard)/ti/configuracoes-email/+page.svelte b/apps/web/src/routes/(dashboard)/ti/configuracoes-email/+page.svelte index ba188f3..a8d37b3 100644 --- a/apps/web/src/routes/(dashboard)/ti/configuracoes-email/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/configuracoes-email/+page.svelte @@ -165,9 +165,9 @@ } } - const statusConfig = $derived(configAtual?.data?.ativo ? 'Configurado' : 'Não configurado'); + let statusConfig = $derived(configAtual?.data?.ativo ? 'Configurado' : 'Não configurado'); - const isLoading = $derived(configAtual === undefined); + let isLoading = $derived(configAtual === undefined);
diff --git a/apps/web/src/routes/(dashboard)/ti/configuracoes-jitsi/+page.svelte b/apps/web/src/routes/(dashboard)/ti/configuracoes-jitsi/+page.svelte index 11c177d..9a37a67 100644 --- a/apps/web/src/routes/(dashboard)/ti/configuracoes-jitsi/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/configuracoes-jitsi/+page.svelte @@ -132,10 +132,10 @@ } } - const statusConfig = $derived(configAtual?.data?.ativo ? 'Configurado' : 'Não configurado'); + let statusConfig = $derived(configAtual?.data?.ativo ? 'Configurado' : 'Não configurado'); - const isLoading = $derived(configAtual === undefined); - const hasError = $derived(configAtual === null && !isLoading); + let isLoading = $derived(configAtual === undefined); + let hasError = $derived(configAtual === null && !isLoading);
diff --git a/apps/web/src/routes/(dashboard)/ti/configuracoes-ponto/enderecos/+page.svelte b/apps/web/src/routes/(dashboard)/ti/configuracoes-ponto/enderecos/+page.svelte index aa27924..df5ba89 100644 --- a/apps/web/src/routes/(dashboard)/ti/configuracoes-ponto/enderecos/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/configuracoes-ponto/enderecos/+page.svelte @@ -11,13 +11,13 @@ incluirInativos: true }); - const enderecos = $derived(enderecosQuery?.data || []); + let enderecos = $derived(enderecosQuery?.data || []); // Estados do formulário let mostrarFormulario = $state(false); let editandoId: Id<'enderecosMarcacao'> | null = $state(null); let processando = $state(false); - const termoBusca = $state(''); + let termoBusca = $state(''); let buscandoCEP = $state(false); let buscandoCoordenadas = $state(false); @@ -36,7 +36,7 @@ let tipo: 'sede' | 'home_office' | 'deslocamento' | 'cliente' = $state('sede'); // Endereços filtrados - const enderecosFiltrados = $derived( + let enderecosFiltrados = $derived( enderecos.filter((e) => { if (!termoBusca) return true; const busca = termoBusca.toLowerCase(); diff --git a/apps/web/src/routes/(dashboard)/ti/configuracoes/+page.svelte b/apps/web/src/routes/(dashboard)/ti/configuracoes/+page.svelte index 789200b..1e3b74f 100644 --- a/apps/web/src/routes/(dashboard)/ti/configuracoes/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/configuracoes/+page.svelte @@ -9,9 +9,9 @@ const setoresQuery = useQuery(api.setores.list, {}); const configQuery = useQuery(api.config.getComprasSetor, {}); - const setores = $derived(setoresQuery.data || []); - const config = $derived(configQuery.data); - const loading = $derived(setoresQuery.isLoading || configQuery.isLoading); + let setores = $derived(setoresQuery.data || []); + let config = $derived(configQuery.data); + let loading = $derived(setoresQuery.isLoading || configQuery.isLoading); // Initialize selected setor from config - using boxed $state to avoid reactivity warning let selectedSetorId = $state(''); diff --git a/apps/web/src/routes/(dashboard)/ti/monitoramento-emails/+page.svelte b/apps/web/src/routes/(dashboard)/ti/monitoramento-emails/+page.svelte index c9078c3..53e0d45 100644 --- a/apps/web/src/routes/(dashboard)/ti/monitoramento-emails/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/monitoramento-emails/+page.svelte @@ -5,7 +5,7 @@ type EmailDetalhes = Doc<'notificacoesEmail'> | null; - const autoRefresh = $state(true); + let autoRefresh = $state(true); let refreshInterval: ReturnType | null = null; let processando = $state(false); let modalDetalhesAberto = $state(false); diff --git a/apps/web/src/routes/(dashboard)/ti/notificacoes/+page.svelte b/apps/web/src/routes/(dashboard)/ti/notificacoes/+page.svelte index 05bb4de..5c7696f 100644 --- a/apps/web/src/routes/(dashboard)/ti/notificacoes/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/notificacoes/+page.svelte @@ -53,11 +53,11 @@ let emailIdsRastreados = $state>(new Set()); // Query para buscar status dos emails (só executa quando há IDs) - const emailIdsArray = $derived( + let emailIdsArray = $derived( Array.from(emailIdsRastreados).map((id) => id as Id<'notificacoesEmail'>) ); // Usar $derived para calcular argumentos da query condicionalmente - const emailsStatusArgs = $derived( + let emailsStatusArgs = $derived( emailIdsArray.length === 0 ? 'skip' : { emailIds: emailIdsArray } ); const emailsStatusQuery = useQuery(api.email.buscarEmailsPorIds, emailsStatusArgs); @@ -68,10 +68,10 @@ // Filtro de agendamentos type FiltroAgendamento = 'todos' | 'agendados' | 'enviados'; - const filtroAgendamento = $state('todos'); + let filtroAgendamento = $state('todos'); // Extrair dados das queries de forma robusta - const templates = $derived.by(() => { + let templates = $derived.by(() => { if (templatesQuery === undefined || templatesQuery === null) { return []; } @@ -84,7 +84,7 @@ return []; }); - const usuarios = $derived.by(() => { + let usuarios = $derived.by(() => { if (usuariosQuery === undefined || usuariosQuery === null) { return []; } @@ -97,8 +97,8 @@ return []; }); - const totalUsuarios = $derived(usuarios.length); - const totalTemplates = $derived(templates.length); + let totalUsuarios = $derived(usuarios.length); + let totalTemplates = $derived(templates.length); function templateDisponivelParaCanal( template: Doc<'templatesMensagens'>, @@ -124,13 +124,13 @@ return categoria === canalAtual; } - const templatesParaCanal = $derived.by(() => + let templatesParaCanal = $derived.by(() => templates.filter((t) => templateDisponivelParaCanal(t as Doc<'templatesMensagens'>, canal)) ); // Estados de carregamento e erro - const carregandoTemplates = $derived(templatesQuery === undefined || templatesQuery === null); - const carregandoUsuarios = $derived(usuariosQuery === undefined || usuariosQuery === null); + let carregandoTemplates = $derived(templatesQuery === undefined || templatesQuery === null); + let carregandoUsuarios = $derived(usuariosQuery === undefined || usuariosQuery === null); // Verificar erros de forma mais robusta (código mantido mas variáveis não utilizadas removidas para lint) /* const erroTemplates = $derived.by(() => { @@ -142,7 +142,7 @@ return false; }); - const erroUsuarios = $derived.by(() => { + let erroUsuarios = $derived.by(() => { if (usuariosQuery === undefined || usuariosQuery === null) return false; if (typeof usuariosQuery === 'object' && 'error' in usuariosQuery) { return usuariosQuery.error !== undefined && usuariosQuery.error !== null; @@ -160,16 +160,16 @@ let destinatarioId = $state(''); let enviarParaTodos = $state(false); - const canal = $state<'chat' | 'email' | 'ambos'>('chat'); + let canal = $state<'chat' | 'email' | 'ambos'>('chat'); let templateId = $state(''); let mensagemPersonalizada = $state(''); - const usarTemplate = $state(true); + let usarTemplate = $state(true); let processando = $state(false); let criandoTemplates = $state(false); let progressoEnvio = $state({ total: 0, enviados: 0, falhas: 0 }); // Aba ativa - const abaAtiva = $state<'enviar' | 'templates' | 'agendamentos'>('enviar'); + let abaAtiva = $state<'enviar' | 'templates' | 'agendamentos'>('enviar'); // Estrutura de dados para logs de envio type StatusLog = 'sucesso' | 'erro' | 'fila' | 'info' | 'enviando'; @@ -184,7 +184,7 @@ }; let logsEnvio = $state([]); - const terminalScrollRef: HTMLDivElement | null = $state(null); + let terminalScrollRef: HTMLDivElement | null = $state(null); // Estados para agendamento let agendarEnvio = $state(false); @@ -196,7 +196,7 @@ const minDate = format(now, 'yyyy-MM-dd'); // Hora mínima recalculada baseada na data selecionada - const horaMinima = $derived.by(() => { + let horaMinima = $derived.by(() => { if (!dataAgendamento) return format(now, 'HH:mm'); const hoje = format(now, 'yyyy-MM-dd'); if (dataAgendamento === hoje) { @@ -230,7 +230,7 @@ texto: string; } | null>(null); - const templateSelecionado = $derived(templates.find((t) => t._id === templateId)); + let templateSelecionado = $derived(templates.find((t) => t._id === templateId)); // Função para renderizar template com variáveis (similar à função do backend) function renderizarTemplate(template: string, variaveis: Record): string { @@ -371,7 +371,7 @@ } // Extrair e processar agendamentos - const agendamentosEmail = $derived.by(() => { + let agendamentosEmail = $derived.by(() => { if (!agendamentosEmailQuery || agendamentosEmailQuery === undefined) return []; const dados = Array.isArray(agendamentosEmailQuery) ? agendamentosEmailQuery @@ -381,7 +381,7 @@ return dados as AgendamentoEmail[]; }); - const agendamentosChat = $derived.by(() => { + let agendamentosChat = $derived.by(() => { if (!agendamentosChatQuery || agendamentosChatQuery === undefined) return []; const dados = Array.isArray(agendamentosChatQuery) ? agendamentosChatQuery @@ -392,7 +392,7 @@ }); // Combinar e processar agendamentos - const todosAgendamentos = $derived.by(() => { + let todosAgendamentos = $derived.by(() => { const agendamentos: Agendamento[] = []; for (const email of agendamentosEmail) { @@ -440,7 +440,7 @@ }); // Filtrar agendamentos - const agendamentosFiltrados = $derived.by(() => { + let agendamentosFiltrados = $derived.by(() => { if (filtroAgendamento === 'todos') return todosAgendamentos; return todosAgendamentos.filter((ag) => { diff --git a/apps/web/src/routes/(dashboard)/ti/notificacoes/templates/+page.svelte b/apps/web/src/routes/(dashboard)/ti/notificacoes/templates/+page.svelte index f54ba93..8258cb9 100644 --- a/apps/web/src/routes/(dashboard)/ti/notificacoes/templates/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/notificacoes/templates/+page.svelte @@ -11,7 +11,7 @@ // Queries const templatesQuery = useQuery(api.templatesMensagens.listarTemplates, {}); - const templates = $derived.by(() => { + let templates = $derived.by(() => { if (templatesQuery === undefined || templatesQuery === null) { return []; } @@ -27,8 +27,8 @@ // Estados let templateEditando = $state | null>(null); let modalAberto = $state(false); - const filtroCategoria = $state<'todos' | 'email' | 'chat' | 'ambos'>('todos'); - const buscaTexto = $state(''); + let filtroCategoria = $state<'todos' | 'email' | 'chat' | 'ambos'>('todos'); + let buscaTexto = $state(''); let processando = $state(false); let mensagem = $state<{ tipo: 'success' | 'error' | 'info'; @@ -36,7 +36,7 @@ } | null>(null); // Filtrar templates - const templatesFiltrados = $derived.by(() => { + let templatesFiltrados = $derived.by(() => { let filtrados = templates; // Filtro por categoria diff --git a/apps/web/src/routes/(dashboard)/ti/notificacoes/templates/[id]/+page.svelte b/apps/web/src/routes/(dashboard)/ti/notificacoes/templates/[id]/+page.svelte index 0b9fbf6..6da9718 100644 --- a/apps/web/src/routes/(dashboard)/ti/notificacoes/templates/[id]/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/notificacoes/templates/[id]/+page.svelte @@ -10,7 +10,7 @@ const client = useConvexClient(); const currentUser = useQuery(api.auth.getCurrentUser as FunctionReference<'query'>); - const templateIdParam = $derived($page.params.id ?? ''); + let templateIdParam = $derived($page.params.id ?? ''); // Query específica para buscar o template por ID const templateQuery = useQuery(api.templatesMensagens.obterTemplatePorId, () => { @@ -23,7 +23,7 @@ }); // Extrair template da query - const template = $derived.by(() => { + let template = $derived.by(() => { if (templateQuery === undefined || templateQuery === null) return null; // useQuery retorna os dados diretamente if (templateQuery && typeof templateQuery === 'object') { @@ -43,8 +43,8 @@ return null; }); - const carregandoTemplate = $derived(templateQuery === undefined || templateQuery === null); - const erroTemplate = $derived.by(() => { + let carregandoTemplate = $derived(templateQuery === undefined || templateQuery === null); + let erroTemplate = $derived.by(() => { if (templateQuery && typeof templateQuery === 'object' && 'error' in templateQuery) { return templateQuery.error as Error | string | null; } diff --git a/apps/web/src/routes/(dashboard)/ti/notificacoes/templates/novo/+page.svelte b/apps/web/src/routes/(dashboard)/ti/notificacoes/templates/novo/+page.svelte index d096f5a..3e4a40a 100644 --- a/apps/web/src/routes/(dashboard)/ti/notificacoes/templates/novo/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/notificacoes/templates/novo/+page.svelte @@ -11,13 +11,13 @@ const currentUser = useQuery( api.auth.getCurrentUser as FunctionReference<"query">, ); -const codigo = $state(""); -const nome = $state(""); -const titulo = $state(""); -const corpo = $state(""); -const categoria = $state<"email" | "chat" | "ambos">("email"); -const variaveisTexto = $state(""); -const tagsTexto = $state(""); +let codigo = $state(""); +let nome = $state(""); +let titulo = $state(""); +let corpo = $state(""); +let categoria = $state<"email" | "chat" | "ambos">("email"); +let variaveisTexto = $state(""); +let tagsTexto = $state(""); let criando = $state(false); let mensagem = $state<{ tipo: "success" | "error" | "info"; diff --git a/apps/web/src/routes/(dashboard)/ti/painel-administrativo/+page.svelte b/apps/web/src/routes/(dashboard)/ti/painel-administrativo/+page.svelte index 3cf48e6..881df2e 100644 --- a/apps/web/src/routes/(dashboard)/ti/painel-administrativo/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/painel-administrativo/+page.svelte @@ -19,13 +19,13 @@ const usuariosQuery = useQuery(api.usuarios.listar, {}); // Verificar se está carregando - const carregando = $derived(usuariosQuery === undefined); + let carregando = $derived(usuariosQuery === undefined); // Extrair dados dos usuários - const usuarios = $derived(usuariosQuery?.data ?? []); + let usuarios = $derived(usuariosQuery?.data ?? []); // Estatísticas derivadas - const stats = $derived.by(() => { + let stats = $derived.by(() => { // Se ainda está carregando, retorna null para mostrar loading if (carregando) return null; diff --git a/apps/web/src/routes/(dashboard)/ti/painel-permissoes/+page.svelte b/apps/web/src/routes/(dashboard)/ti/painel-permissoes/+page.svelte index 7de45c9..3c0c086 100644 --- a/apps/web/src/routes/(dashboard)/ti/painel-permissoes/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/painel-permissoes/+page.svelte @@ -14,8 +14,8 @@ let salvando = $state(false); let mensagem = $state<{ tipo: 'success' | 'error'; texto: string } | null>(null); - const busca = $state(''); - const filtroRole = $state | ''>(''); + let busca = $state(''); + let filtroRole = $state | ''>(''); let modalNovoPerfilAberto = $state(false); let nomeNovoPerfil = $state(''); let descricaoNovoPerfil = $state(''); @@ -26,7 +26,7 @@ // Controla quais recursos estão expandidos (mostrando as ações) por perfil // Formato: { "roleId-recurso": true/false } - const recursosExpandidos: Record = $state({}); + let recursosExpandidos: Record = $state({}); // Cache de permissões por role const permissoesPorRole: Record< @@ -57,7 +57,7 @@ }, 3000); } - const rolesFiltradas = $derived.by(() => { + let rolesFiltradas = $derived.by(() => { if (!rolesQuery.data) return []; let rs = rolesQuery.data; // Removed explicit type annotation if (filtroRole) rs = rs.filter((r) => r._id === filtroRole); // Removed as any @@ -126,16 +126,16 @@ .replace(/^_+|_+$/g, '') .replace(/_{2,}/g, '_'); - const identificadorSugerido = $derived.by(() => gerarIdentificador(nomeNovoPerfil)); + let identificadorSugerido = $derived.by(() => gerarIdentificador(nomeNovoPerfil)); - const podeSalvarNovoPerfil = $derived.by(() => { + let podeSalvarNovoPerfil = $derived.by(() => { const nome = nomeNovoPerfil.trim(); const nivel = Number(nivelNovoPerfil); const nivelValido = Number.isFinite(nivel) && nivel >= 0 && nivel <= 10; return nome.length >= 3 && nivelValido && !criandoNovoPerfil; }); - const roleDuplicacaoSelecionada = $derived.by(() => { + let roleDuplicacaoSelecionada = $derived.by(() => { if (!roleParaDuplicar || !rolesQuery.data) return null; return rolesQuery.data.find((role) => role._id === roleParaDuplicar) ?? null; }); @@ -146,7 +146,7 @@ } }); - const resumoPermissoesDuplicacao = $derived.by(() => { + let resumoPermissoesDuplicacao = $derived.by(() => { if (!roleParaDuplicar) return null; const permissoes = permissoesPorRole[roleParaDuplicar]; if (!permissoes) return null; diff --git a/apps/web/src/routes/(dashboard)/ti/perfis/+page.svelte b/apps/web/src/routes/(dashboard)/ti/perfis/+page.svelte index f09ae9d..d8c49a8 100644 --- a/apps/web/src/routes/(dashboard)/ti/perfis/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/perfis/+page.svelte @@ -20,8 +20,8 @@ const client = useConvexClient(); const rolesQuery = useQuery(api.roles.listar, {}); - const roles = $derived(rolesQuery?.data ?? []); - const carregando = $derived(rolesQuery === undefined); + let roles = $derived(rolesQuery?.data ?? []); + let carregando = $derived(rolesQuery === undefined); let busca = $state(''); let filtroSetor = $state(''); @@ -29,7 +29,7 @@ let roleSelecionada = $state(null); let modalDetalhesAberto = $state(false); - const setoresDisponiveis = $derived.by(() => { + let setoresDisponiveis = $derived.by(() => { const setores = new Set(); roles.forEach((r) => { if (r.setor) setores.add(r.setor); @@ -38,7 +38,7 @@ }); // Estatísticas - const stats = $derived.by(() => { + let stats = $derived.by(() => { if (carregando) return null; const nivelMaximo = roles.filter((r) => r.nivel === 0).length; @@ -54,7 +54,7 @@ }; }); - const rolesFiltradas = $derived.by(() => { + let rolesFiltradas = $derived.by(() => { let resultado = roles; // Filtro por busca (nome ou descrição) @@ -133,7 +133,7 @@ filtroNivel = ''; } - const temFiltrosAtivos = $derived( + let temFiltrosAtivos = $derived( busca.trim() !== '' || filtroSetor !== '' || filtroNivel !== '' ); diff --git a/apps/web/src/routes/(dashboard)/ti/times/+page.svelte b/apps/web/src/routes/(dashboard)/ti/times/+page.svelte index 2807388..ef35c7e 100644 --- a/apps/web/src/routes/(dashboard)/ti/times/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/times/+page.svelte @@ -86,11 +86,11 @@ const usuariosQuery = useQuery(api.usuarios.listar, {}); const funcionariosQuery = useQuery(api.funcionarios.getAll, {}); - const times = $derived((timesQuery?.data || []) as TimeComDetalhes[]); - const usuarios = $derived((usuariosQuery?.data || []) as Usuario[]); - const funcionarios = $derived((funcionariosQuery?.data || []) as Funcionario[]); + let times = $derived((timesQuery?.data || []) as TimeComDetalhes[]); + let usuarios = $derived((usuariosQuery?.data || []) as Usuario[]); + let funcionarios = $derived((funcionariosQuery?.data || []) as Funcionario[]); - const carregando = $derived( + let carregando = $derived( timesQuery === undefined || usuariosQuery === undefined || funcionariosQuery === undefined ); @@ -110,7 +110,7 @@ let formCor = $state('#3B82F6'); // Membros - const membrosDisponiveis = $derived( + let membrosDisponiveis = $derived( funcionarios.filter((f: Funcionario) => { // Verificar se o funcionário já está em algum time ativo const jaNaEquipe = timeParaMembros?.membros?.some( diff --git a/apps/web/src/routes/(dashboard)/ti/usuarios/+page.svelte b/apps/web/src/routes/(dashboard)/ti/usuarios/+page.svelte index 7d8c6ae..ca51db1 100644 --- a/apps/web/src/routes/(dashboard)/ti/usuarios/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/usuarios/+page.svelte @@ -64,7 +64,7 @@ const usuariosQuery = useQuery(api.usuarios.listar, {}); // Extrair dados e determinar estado de carregamento - const usuarios = $derived.by(() => { + let usuarios = $derived.by(() => { // Se usuariosQuery é undefined ou null, está carregando if (usuariosQuery === undefined || usuariosQuery === null) { return []; @@ -89,7 +89,7 @@ return []; }); - const carregandoUsuarios = $derived.by(() => { + let carregandoUsuarios = $derived.by(() => { // Se é undefined/null, está carregando if (usuariosQuery === undefined || usuariosQuery === null) { return true; @@ -227,7 +227,7 @@ }, 4000); } - const funcionariosFiltrados = $derived.by(() => { + let funcionariosFiltrados = $derived.by(() => { if (!buscaFuncionario) { return [...funcionarios].sort((a, b) => a.nome.localeCompare(b.nome)); } @@ -245,12 +245,12 @@ }); // Verificar se há usuários com problemas - const usuariosComProblemas = $derived.by(() => { + let usuariosComProblemas = $derived.by(() => { return usuarios.filter((u) => u.role?.erro === true || (u.avisos && u.avisos.length > 0)); }); // Lógica de filtros reativos - const usuariosFiltrados = $derived.by(() => { + let usuariosFiltrados = $derived.by(() => { let resultado = usuarios; // Filtro por nome diff --git a/apps/web/src/routes/(dashboard)/ti/usuarios/criar/+page.svelte b/apps/web/src/routes/(dashboard)/ti/usuarios/criar/+page.svelte index cb74b12..8bd1ad2 100644 --- a/apps/web/src/routes/(dashboard)/ti/usuarios/criar/+page.svelte +++ b/apps/web/src/routes/(dashboard)/ti/usuarios/criar/+page.svelte @@ -13,8 +13,8 @@ // Estados do formulário let nome = $state(''); let email = $state(''); - const roleId = $state(''); - const funcionarioId = $state(''); + let roleId = $state(''); + let funcionarioId = $state(''); let senhaInicial = $state(''); let confirmarSenha = $state(''); let processando = $state(false); diff --git a/apps/web/src/routes/todos/+page.svelte b/apps/web/src/routes/todos/+page.svelte index d06bb31..2107d14 100644 --- a/apps/web/src/routes/todos/+page.svelte +++ b/apps/web/src/routes/todos/+page.svelte @@ -67,10 +67,10 @@ } } - const canAdd = $derived(!isAdding && newTodoText.trim().length > 0); - const isLoadingTodos = $derived(todosQuery.isLoading); - const todos = $derived(todosQuery.data ?? []); - const hasTodos = $derived(todos.length > 0); + let canAdd = $derived(!isAdding && newTodoText.trim().length > 0); + let isLoadingTodos = $derived(todosQuery.isLoading); + let todos = $derived(todosQuery.data ?? []); + let hasTodos = $derived(todos.length > 0);