- 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
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>
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>
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>
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>
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>
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>
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>
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>