Commit graph

144 commits

Author SHA1 Message Date
Gabriel Menezes
0c57897e46 refactor: remove top header, migrate user profile, timer status, and workspace switcher to sidebar with single-word nav items 2026-10-11 17:15:51 -04:00
Gabriel Menezes
f2f9666fcf feat: replace unstyled native html selects with rich custom styled select components 2026-10-11 10:36:09 -04:00
Gabriel Menezes
6412bb20d1 style: elevate logged-in experience with ambient glows, glassmorphism, and landing page visual polish 2026-10-10 23:18:50 -04:00
Gabriel Menezes
eeccd176a1 feat(theme): implement full dark and light mode switching with ThemeContext and persistent storage 2026-10-10 23:08:21 -04:00
Gabriel Menezes
d1b2ac4eef fix(avatar): ensure user photo is clipped strictly inside circular container in Header and Profile 2026-10-10 23:03:29 -04:00
Gabriel Menezes
5c32665b55 fix(dashboard): unify styles, theme tokens, and integrate live timer with real tasks 2026-10-10 23:00:35 -04:00
Gabriel Menezes
61128c0a1a feat(analytics-profile): implement Workspace Analytics and User Profile pages 2026-10-10 22:54:43 -04:00
Gabriel Menezes
297a2ed9e4 feat(members-settings): implement Members management, join request approvals, and Workspace settings 2026-10-10 22:50:35 -04:00
Gabriel Menezes
640af48a9c feat(projects-categories): implement full Projects and Categories management pages with time analytics 2026-10-10 22:36:25 -04:00
Gabriel Menezes
1806b08724 feat(tasks): implement Kanban board, List view, real-time timer tracking, and task creation 2026-10-10 22:32:55 -04:00
Gabriel Menezes
c16992e049 feat(layout): implement AppShell, Sidebar, Header, Organizations, and Dashboard 2026-10-10 22:06:25 -04:00
Gabriel Menezes
8015b3ff77 feat: add auth page with login/register and enable task3 CORS origin 2026-10-10 21:34:38 -04:00
Gabriel Menezes
727cf62f7d feat(new-frontend): add new-frontend with HeroUI v3 landing page and docker service 2026-10-10 11:51:54 -04:00
Gabriel Menezes
1a5a835d33 feat(auth): increase access token expiry to 24h and refresh token to 7 days 2026-10-09 13:39:02 -04:00
Gabriel Menezes
33b24b62d5 fix: resolve token expiration clock skew and remove Keycloak docs 2026-10-09 10:20:06 -04:00
Gabriel Menezes
b05ff9651a feat(ui): make task filter bar collapsible 2026-10-09 09:45:55 -04:00
Gabriel Menezes
c4828a0a77 feat: adicionar abas de filtro por status na listagem de tarefas 2026-10-09 09:43:39 -04:00
Gabriel Menezes
5b0d1c6dea fix: correctly cap worked hours calculation to current time 2026-10-08 10:26:15 -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
fa5d400a0d fix: resolve hibernate query error in task repository 2026-10-08 10:22:29 -04:00
Gabriel Menezes
69aa0d3d9e fix(domain): use single-level subdomains with hyphens for Cloudflare SSL compatibility 2026-10-07 15:18:11 -04:00
Gabriel Menezes
791d184954 chore: configure docker-compose for homelab with task2.beetech.dev domain
- Replace archived MinIO images with community-maintained pgsty images
- Change routing domain to task2.beetech.dev across frontend, backend, and minio
- Avoid port collisions with existing homelab services (postgres port 5434)
- Add .env and *.pem to .gitignore
- Remove legacy deploy/ directory and deploy-main.yml workflow
2026-10-07 14:56:34 -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 Menezes
607bbef7d1
feat: add periodStats to user dashboard endpoint
feat: add periodStats to user dashboard endpoint
2026-05-22 20:28:28 -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
1b337e53c2 feat: add periodStats to dashboard output
Adiciona breakdown diário/mensal ao endpoint /dashboard do usuário:
- Novo record DashboardPeriodStats com year, month, day, finishedTasksCount e totalMinutesWorked
- DashboardUseCase agrupa history items por LocalDate para minutos e finishedAt para contagem de tarefas
- Lógica groupedBy: ≤62 dias → DAY, caso contrário → MONTH

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 16:06:24 -04:00
Gabriel Menezes
8cfae110c8
fix: resolve TypeScript error in apiFetch headers
fix: resolve TypeScript error in apiFetch headers
2026-05-21 19:19:37 -04:00
Gabriel Santana de Menezes
2a41e5cf86 fix: resolve TypeScript error in apiFetch headers
Type the defaultHeaders as Record<string, string> to fix TS2322 error
when spreading headers into fetch options.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 19:17:41 -04:00
Gabriel Menezes
aa1353e6a9
docs: add PR size limits to CLAUDE.md
docs: add PR size limits to CLAUDE.md
2026-05-21 19:11:38 -04:00
Gabriel Santana de Menezes
39ed29c0c4 docs: add PR size limits to CLAUDE.md
Enforce maximum 5 files and 30 lines changed per PR to keep reviews
focused and maintainable. Split by layer (frontend, backend, config)
when exceeding limits.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 19:10:35 -04:00
Gabriel Santana de Menezes
ee3c42a17f fix: remove Content-Type header when sending FormData in apiFetch
The hardcoded 'Content-Type: application/json' header was conflicting
with multipart/form-data uploads. When body is FormData, we now omit
the Content-Type header to let the browser set the correct
'multipart/form-data; boundary=...' header.

Fixes 415 Unsupported Media Type error on photo uploads.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 19:07:31 -04:00
Gabriel Menezes
7e0bfe6e70
fix: MinIO credentials validation in docker-compose
fix: MinIO credentials validation in docker-compose
2026-05-21 18:48:55 -04:00
Gabriel Santana de Menezes
f86d8a1e69 fix: MinIO credentials validation in docker-compose
Updates MinIO credentials to meet minimum length requirements:
- MINIO_ROOT_USER: at least 3 characters (was 'minioadmin')
- MINIO_ROOT_PASSWORD: at least 8 characters (was 'minioadmin')

Now uses environment variables with sensible defaults that can be
overridden via .env file or GitHub Actions secrets.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 18:41:38 -04:00
Gabriel Menezes
5a2073cba9
feat: add MinIO image server and profile photo upload
feat: add MinIO image server and profile photo upload
2026-05-21 18:24:37 -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 Menezes
15118177a2
feat: add user profile page with name and email editing
feat: add user profile page with name and email editing
2026-05-21 15:06:28 -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 Menezes
8fe40e800a
feat: add "Mostrar apenas as minhas" checkbox to task filters
feat: add "Mostrar apenas as minhas" checkbox to task filters
2026-05-21 10:42:17 -04:00
Gabriel Santana de Menezes
5a71aba13f refactor: extract shared task page logic into useTaskPage hook
Eliminates code duplication between TaskListPage and TaskBoardPage by
extracting common state, effects, and handlers into a custom hook. Also
fixes bug where TaskBoardPage's mergeProjects was omitting color/icon.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 10:41:07 -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 Menezes
a3ae6fe420
docs: Require branch and PR workflow
docs: Require branch and PR workflow
2026-05-20 15:50:56 -04:00
Gabriel Santana de Menezes
064251f6ab docs: update CLAUDE.md to require branch and PR workflow
Clarify that commits should never go directly to main. All work must go through
feature branches and pull requests for review and traceability.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-05-18 11:03:26 -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
e37cf06634 redirect 2026-05-18 09:57:58 -04:00
Gabriel Santana de Menezes
ae0d536ff7 Add optional assignee to task form 2026-05-17 21:18:07 -04:00
Gabriel Santana de Menezes
7c3ba32b3f increase status fetch 2026-05-17 21:00:13 -04:00
Gabriel Santana de Menezes
8cb1831cb4 Fix public stats parsing on landing page 2026-05-17 20:58:26 -04:00