Ensure running seconds never go negative by using Math.max(0, ...)
This prevents the timer from showing negative values when there's a
clock skew between client and server.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Backend:
- Adicionar métodos de contagem/agregação aos repositórios (UserRepository, OrganizationRepository, TaskRepository)
- Implementar nova use case PublicStatsUseCase que retorna estatísticas públicas (usuários, organizações, tarefas completas, horas registradas)
- Criar novo controller público GET /public/stats sem autenticação
- Configurar CDI factory PublicStatsUseCaseConfig
Frontend:
- Criar nova landing page pública (LandingPage.tsx) com seções:
* Hero com CTAs (Começar grátis / Ver demo)
* 4 cards de funcionalidades principais (dashboard, produtividade, rastreamento, Kanban)
* Seção "Como funciona" com 3 passos
* Showcase visual do dashboard com leaderboard fake
* Estatísticas reais da plataforma (consumidas do backend)
* CTA final e footer
- Criar serviço publicStatsService para consumir o endpoint público
- Adicionar rota /landing na router
- Design alinhado com o sistema de cores e tipografia existente (Plus Jakarta Sans, Tailwind v4)
Stats reais são animadas ao fazer scroll (Framer Motion counter).
Com o domínio task.beetech.dev servindo o frontend na raiz, o base
'/frontend/' gerava referencias quebradas nos assets. Muda para '/'.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
O modal de onboarding era disparado tanto na LoginPage quanto no AppShell
com navegação conflitante, fazendo ele fechar e reabrir ao escolher uma
opção. Agora o login sem org redireciona para /organizations, o AppShell
redireciona usuários sem org para lá, e o modal é exibido uma única vez
pela OrganizationsPage.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adiciona conceito de Categoria por organização (nome, cor e ícone lucide),
com CRUD restrito a OWNER/ADMIN. Tasks ganham categoria opcional, filtros
multiselect de status e categoria nas listagens, badges nos cards, e
gráficos de pizza de tempo por categoria nos dashboards pessoal, da
organização e no modal de detalhes do membro.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Substitui LocalDateTime.now() por Instant.now() no issuedAt — a string
produzida por LocalDateTime não contém timezone e era interpretada como
hora local pelo browser, fazendo o frontend calcular expiresAt errado e
nunca deslogar o usuário quando o token vencia.
- Cria TokenConstants com ACCESS_TOKEN_EXPIRY_SECONDS e
REFRESH_TOKEN_EXPIRY_SECONDS, eliminando os valores hardcoded em
LoginUseCase e RefreshTokenUseCase.
- Remove imports não utilizados em AuthController.
closes#24
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Backend: adiciona ListMyTasksInput, ListMyTasksRequest (@BeanParam) com
parâmetros text, projectId e status; novo método findTasksByUserFiltered
no repositório com query dinâmica via Panache; mapper atualizado;
CLAUDE.md documenta regra de DTO Request para 3+ parâmetros.
Frontend: componente reutilizável TaskFilterBar (texto, projeto, status)
integrado em TaskListPage e TaskBoardPage; getMyTasks() aceita filtros
repassados como query params ao backend.
closes#26
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Propagava o campo history do CreateTaskRequest até o use case e persistência.
O mapeamento em TaskControllerMapper ignorava o history; CreateTaskInput não
tinha o campo; e CreateTaskUseCase não aplicava os itens à entidade antes
de salvar.
Closes#22
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove leading slash from smallrye-health.root-path so the health
endpoint resolves to /backend/q/status (relative to non-app root)
instead of the unreachable absolute path /status
- Clean up docker-compose traefik labels (remove stale comments)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>