Commit graph

46 commits

Author SHA1 Message Date
Gabriel Menezes
f8b8bc14b8 style(dashboard): simplify scope indicators to icons only without background color 2026-10-22 10:29:34 -04:00
Gabriel Menezes
b41e664d8a refactor(ui): modernize Select component with HeroUI v3 aesthetics and replace native selects 2026-10-22 10:25:33 -04:00
Gabriel Menezes
d3174653b1 feat: add scope toggles for individual vs team metrics, add GEMINI.md guidelines 2026-10-22 09:41:58 -04:00
Gabriel Menezes
d1bfe4d1cb feat: migrate to frontend v2, add task external links, auto-assign logged user, and preferences support 2026-10-15 09:04:24 -04:00
Gabriel Menezes
b05ff9651a feat(ui): make task filter bar collapsible 2026-10-09 09:45:55 -04:00
Gabriel Menezes
ec9cf347ec feat: redesign task filter bar UI 2026-10-08 10:22:49 -04:00
Gabriel Menezes
b399992dc5 fix: resolve profile photo rendering and upload issues 2026-10-08 10:22:41 -04:00
Gabriel Menezes
437dbbe052
refactor: extract shared chart components to DashboardCharts.tsx
refactor: extract shared chart components to DashboardCharts.tsx
2026-05-22 20:29:26 -04:00
Gabriel Santana de Menezes
2ecbe090b5 refactor: extract shared chart components to DashboardCharts.tsx
Extrai BarChart, ProjectMiniPieChart, ChartTooltip e helpers (getPeriodLabel, chartFormatMinutes)
de MemberDetailModal.tsx para um arquivo compartilhado, eliminando duplicação ao reutilizá-los
na dashboard do usuário. CategoryMiniPieChart permanece local por usar cores dinâmicas de categoria.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 16:42:57 -04:00
Gabriel Santana de Menezes
59a5c61585 feat: add MinIO image server and profile photo upload
Infrastructure: MinIO service added to docker-compose (prod + dev) with
minio-init container that creates the avatars bucket with public read
policy. Traefik routes minio.task.beetech.dev → port 9000.

Backend: native MinIO SDK integration via MinioStorageService;
UploadUserPhotoUseCase validates 5 MB limit and image content-type;
new POST /auth/profile/photo endpoint (multipart). All hardcoded
ui-avatars.com fallback URLs removed from 6 use cases — backend now
returns null when user has no photo.

Frontend: ProfilePage gains clickable avatar with camera overlay,
file picker, preview, and photo upload on save. UserAvatar gains
onError handler for broken URLs and xs size. OrganizationAdminPage
replaces hardcoded ui-avatars.com with UserAvatar component.

CI/CD: deploy-main.yml passes 5 new MinIO secrets to the server and
writes them to .env.production.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 18:01:59 -04:00
Gabriel Santana de Menezes
769791b25c feat: add user profile page with name and email editing
Backend: new UpdateUserProfileUseCase with email uniqueness validation,
PUT /auth/profile endpoint. Frontend: ProfilePage with avatar initials,
inline success/error feedback, and refreshUser() sync after save.
Avatar dropdown in AppShell gains a "Meu Perfil" link.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 15:03:45 -04:00
Gabriel Santana de Menezes
119d896a59 feat: add "Mostrar apenas as minhas" checkbox to task filters
Adds a pre-checked checkbox next to the employee filter that
automatically filters tasks to the logged-in user on page load.
Unchecking restores the free-select dropdown behavior.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 15:51:40 -04:00
Gabriel Santana de Menezes
f01d72c2bb Fix task timer desync between server and browser clocks
Calculate elapsed time server-side and return it to client. Timer now adds
elapsedSeconds from server to local increments since response received, instead
of calculating from startAt with potentially mismatched browser clock.

Backend changes:
- TaskHistoryItem: add getElapsedSeconds() to calculate time since startAt
- TaskHistoryItemOutput: add elapsedSeconds field
- CreateTaskResponse.TaskHistoryItemResponse: add elapsedSeconds field
- CreateTaskMapper: map elapsedSeconds in toTaskHistoryItemOutput()

Frontend changes:
- TaskTimer: track responseTimestamp when running item changes
- Calculate: accumulatedSeconds + elapsedSeconds + (now - responseTimestamp)
- Remove parseISO import (no longer needed)
- TaskHistoryItem type: add optional elapsedSeconds field

This fixes the issue where timer doesn't update until task is stopped if
server and browser clocks are out of sync.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-05-18 10:59:16 -04:00
Gabriel Santana de Menezes
3f67d34306 Fix task listing and filters, add project colors/icons
- Remove user membership filter from task query — show all org tasks, not just user's accessible ones
- Add color and icon fields to projects with DB migration and entity updates
- Fetch org members and projects upfront for filters, not just from task results
- Convert project and status filters to chips like categories, with color/icon display
- Add icon and color picker to project creation form

Backend changes:
- TaskRepositoryImpl: remove (pu.email = ?2 or tu.email = ?2) from WHERE clause
- TaskRepository interface: remove email param from findAccessibleTasksFiltered
- ListAllTasksUseCase: adjust call without email
- CreateProjectUseCase: accept color and icon params
- ProjectController: update request/response records, map new fields
- ProjectEntityMapper: map color/icon in both directions
- Add V3 migration for color/icon columns

Frontend changes:
- TaskListPage: fetch org members and projects on org change
- TaskFilterBar: replace dropdowns with chips for projects and status
- ProjectsPage: add color picker and icon picker to form
- Project type: add optional color/icon fields
- TaskAssignee: allow photo to be nullable

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-05-18 10:19:12 -04:00
Gabriel Santana de Menezes
814bc51b86 Fix task timer showing negative values
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>
2026-05-18 09:59:56 -04:00
Gabriel Santana de Menezes
7c3ba32b3f increase status fetch 2026-05-17 21:00:13 -04:00
Gabriel Santana de Menezes
7f05ebdf61 Add assignee filtering to task listings 2026-05-17 20:55:29 -04:00
Gabriel Santana de Menezes
ea7ffaaffd Add multi-select task filters for projects and statuses 2026-05-17 19:22:44 -04:00
Gabriel Santana de Menezes
5c53379568 fix: centralizar OnboardingModal em /organizations e evitar reabertura (#15)
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>
2026-05-16 10:58:21 -04:00
Gabriel Santana de Menezes
2fdb375462 feat: adicionar categorias para tasks (#23)
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>
2026-05-15 16:18:41 -04:00
Gabriel Santana de Menezes
db463551e6 feat: filtros de busca nas listagens de tasks (#26)
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>
2026-05-14 22:12:05 -04:00
Gabriel Santana de Menezes
0ab12e0583 fix: build fix 2026-05-12 20:06:44 -04:00
Gabriel Santana de Menezes
8e5d29c7a3 feat: show backend status and system version 2026-05-12 20:06:44 -04:00
Gabriel Santana de Menezes
96e35dc21d feat: restructure navbar and fix dead-end navigation across pages
Restructure the AppShell navbar for better UX grouping: rename
"Organizações" to "Equipe", consolidate Org Dashboard and admin
items inside the Equipe dropdown, add a persistent "+ Nova Tarefa"
CTA button, and replace the isolated logout button with an avatar
dropdown showing user name and email. Add "Buscar Organização"
to the Equipe dropdown for all roles. Mobile nav simplified to
Dashboard · Tarefas · + · Equipe.

Per-page fixes: remove non-functional chevron and dead links from
ProjectsPage; replace the PDF export button in DashboardPage with
a working "Copiar Relatório" clipboard button; remove dead info
links from OrganizationsPage; remove the broken support link from
LoginPage; add Lista/Quadro view toggle to TaskListPage header.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 20:06:44 -04:00
Gabriel Santana de Menezes
6e77f7b194 feat: add hover tooltips to all charts and increase project legend font
- PieChart (org dashboard): tooltip on hover shows project name, time and %
- BarChart (member detail): tooltip on hover shows period label and value
- MiniPieChart (member detail): tooltip on hover shows project name, time and %
- Increase project stats legend font from text-[10px] to text-xs (12px)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 20:06:44 -04:00
Gabriel Santana de Menezes
20c69bcb7e fix: include projectless tasks in org dashboard and member detail stats
Tasks with no associated project were being excluded from org dashboard
calculations because the query filtered by project.organization.id.
Now fetches tasks by active member emails, so all tasks are counted.
Tasks and history items with no project are grouped under "Geral" in
project-specific charts and calculations.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 20:06:44 -04:00
Gabriel Santana de Menezes
824d33f283 chore: removing unecessary lines
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 20:06:44 -04:00
Gabriel Santana de Menezes
90bd08ba39 feat: add member detail modal on org dashboard
Closes #5

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 20:06:26 -04:00
Gabriel Santana de Menezes
faf4bed682 feat: dashboard da organização para admin/owner
Adiciona tela de analytics organizacional acessível apenas por OWNER e ADMIN,
com gráfico de pizza por projeto, top 5 tarefas e ranking de membros por tempo trabalhado.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-12 20:05:20 -04:00
Gabriel Santana de Menezes
b7803fef05 melhorando o codigo de restricao de acesso 2026-05-12 20:04:45 -04:00
Gabriel Santana de Menezes
4582663fc8 editar task 2026-05-12 20:04:45 -04:00
Gabriel Santana de Menezes
1688cf092e dashboard 2026-05-12 20:04:45 -04:00
Gabriel Santana de Menezes
2bf3635d4d ajustes no nav bar 2026-05-12 20:04:45 -04:00
Gabriel Santana de Menezes
f14742b312 ajustes no menu 2026-05-12 20:04:45 -04:00
Gabriel Santana de Menezes
734e5d19a7 organizacoes 2026-05-12 20:04:45 -04:00
Gabriel Santana de Menezes
23b2fa4e1a criando projetos 2026-05-12 20:04:45 -04:00
Gabriel Santana de Menezes
fd3f93afa3 Organizacao ativa 2026-05-12 20:04:45 -04:00
Gabriel Santana de Menezes
211cc1ba6b mostrando minhas solicitgacoes 2026-05-12 20:04:45 -04:00
Gabriel Santana de Menezes
58eaf357c2 liberando acesso ao menu de organizacoes 2026-05-12 20:04:45 -04:00
Gabriel Santana de Menezes
495984e1a4 banco persistente no h2 e nao obrigatorio a entrar ou criar org 2026-05-12 20:04:45 -04:00
Gabriel Santana de Menezes
e99e1cd586 Modal do primeiro acesso 2026-05-12 20:04:45 -04:00
Gabriel Santana de Menezes
829ef310a5 login no frontend 2026-05-12 20:04:45 -04:00
Gabriel Santana de Menezes
985311211a removendo contador cards 2026-04-30 14:50:30 -04:00
Gabriel Santana de Menezes
251362852d listagem e board 2026-04-30 14:31:39 -04:00
Gabriel Santana de Menezes
3312f2276c criar task 2026-04-30 11:09:18 -04:00
Gabriel Santana de Menezes
090f2888d0 project scaffold 2026-04-21 15:58:44 -04:00