Hartmut
745be7ee8b
fix(dashboard): scope localStorage key by userId to prevent cross-user layout bleed ( #27 )
...
New users on a shared device were picking up a previous user's stale
(potentially empty) dashboard layout from localStorage because the key
"capakraken_dashboard_v1" was not user-scoped.
- useDashboardLayout: key is now capakraken_dashboard_v1_{userId};
userId is resolved via trpc.user.me before touching localStorage
- Initial state falls back to createDefaultDashboardLayout() until
userId resolves, then hydrates from the user-scoped key
- DB layout still wins over localStorage when it has data (unchanged)
- E2E test suite covers: new-user flow, modal widget list, add widget
persists after reload, cross-user localStorage isolation
- plan.md: added ticket #27 implementation plan
Co-Authored-By: claude-flow <ruv@ruv.net >
2026-04-01 22:44:41 +02:00
Hartmut
4b14db9dc6
fix(timeline): pause sse while hidden
2026-04-01 15:05:34 +02:00
Hartmut
3258b59e21
fix(timeline): resync after sse reconnect
2026-04-01 15:04:00 +02:00
Hartmut
d4652b7a42
fix(timeline): cancel stranded drag interactions
2026-04-01 14:57:56 +02:00
Hartmut
a71bbeb640
fix(timeline): stabilize overlay lifecycle
2026-04-01 14:41:03 +02:00
Hartmut
e103174d39
refactor(web): extract preview target setup
2026-04-01 11:59:10 +02:00
Hartmut
2a7769a0de
refactor(web): extract range release resolution
2026-04-01 11:53:11 +02:00
Hartmut
1e2bd3d4eb
refactor(web): extract project drag finalize
2026-04-01 11:49:14 +02:00
Hartmut
463caedcfd
refactor(web): extract touch event forwarding
2026-04-01 11:39:39 +02:00
Hartmut
37c6e03d23
refactor(web): extract allocation release effects
2026-04-01 11:35:17 +02:00
Hartmut
f4e9831dea
refactor(web): extract allocation drag session
2026-04-01 11:27:03 +02:00
Hartmut
510459fbff
refactor(web): extract allocation multi-drag session
2026-04-01 11:22:18 +02:00
Hartmut
5402189158
refactor(web): extract drag position helpers
2026-04-01 11:18:31 +02:00
Hartmut
3fe3a5fb2a
refactor(web): extract project drag session
2026-04-01 11:16:15 +02:00
Hartmut
0181f2b304
refactor(web): extract multi-select session
2026-04-01 11:14:28 +02:00
Hartmut
b14be80e32
refactor(web): extract timeline drag cleanup
2026-04-01 11:12:20 +02:00
Hartmut
922394c56a
refactor(web): split touch canvas adapters
2026-04-01 11:09:26 +02:00
Hartmut
a4789d718b
refactor(web): centralize multi-select release handling
2026-04-01 10:50:21 +02:00
Hartmut
ca947befde
refactor(web): extract allocation release classification
2026-04-01 10:48:47 +02:00
Hartmut
0ab1374853
refactor(web): centralize touch mouse adapters
2026-04-01 10:43:38 +02:00
Hartmut
eda8722d83
refactor(web): extract document drag listeners
2026-04-01 10:39:28 +02:00
Hartmut
84c5760392
refactor(web): extract range selection bootstrap
2026-04-01 10:17:39 +02:00
Hartmut
c941b1e5cf
refactor(web): extract allocation drag action plans
2026-04-01 10:15:54 +02:00
Hartmut
203bb8751d
refactor(web): extract allocation drag bootstrap
2026-04-01 10:10:06 +02:00
Hartmut
892a9c5ccf
refactor(web): extract project drag helpers
2026-04-01 10:06:32 +02:00
Hartmut
c32f56ba89
refactor(web): extract allocation multi-drag helpers
2026-04-01 10:03:16 +02:00
Hartmut
6dac993521
refactor(web): extract allocation drag finalize helpers
2026-04-01 09:57:29 +02:00
Hartmut
54c6cf2e2d
refactor(web): extract optimistic timeline reconciliation
2026-04-01 09:53:40 +02:00
Hartmut
848797b4d2
refactor(web): extract timeline range selection helpers
2026-04-01 09:51:18 +02:00
Hartmut
43f04d66c8
refactor(web): extract timeline multi-select helpers
2026-04-01 09:50:03 +02:00
Hartmut
3abb3bc865
refactor(web): extract timeline touch helpers
2026-04-01 09:48:04 +02:00
Hartmut
5e8babd1e6
test(web): cover timeline live preview render edges
2026-04-01 09:41:43 +02:00
Hartmut
5011d071b8
refactor(web): extract timeline live preview helpers
2026-04-01 09:40:07 +02:00
Hartmut
71c4e61735
test(web): cover timeline sse edge paths
2026-04-01 09:10:45 +02:00
Hartmut
e75f69bcf5
refactor(web): extract timeline sse invalidation policy
2026-04-01 08:59:25 +02:00
Hartmut
8c5be51251
feat(platform): checkpoint current implementation state
2026-04-01 07:42:03 +02:00
Hartmut
c3b3dffb6e
fix(web): harden timeline sse reconnect lifecycle
2026-03-31 23:06:07 +02:00
Hartmut
7ace137d16
feat(dashboard): tighten explainability detail views
2026-03-31 22:50:47 +02:00
Hartmut
fac8c1c3a5
feat(sse): scope timeline events to affected audiences
2026-03-30 00:40:24 +02:00
Hartmut
819345acfa
feat(platform): harden access scoping and delivery baseline
2026-03-30 00:27:31 +02:00
Hartmut
47e4d701ff
chore(repo): checkpoint current capakraken implementation state
2026-03-29 12:47:12 +02:00
Hartmut
4f48afe7b4
feat(planning): ship holiday-aware planning and assistant upgrades
2026-03-28 22:49:28 +01:00
Hartmut
cd78f72f33
chore: full technical rename planarchy → capakraken
...
Complete rename of all technical identifiers across the codebase:
Package names (11 packages):
- @planarchy/* → @capakraken/* in all package.json, tsconfig, imports
Import statements: 277 files, 548 occurrences replaced
Database & Docker:
- PostgreSQL user/db: planarchy → capakraken
- Docker volumes: planarchy_pgdata → capakraken_pgdata
- Connection strings updated in docker-compose, .env, CI
CI/CD:
- GitHub Actions workflow: all filter commands updated
- Test database credentials updated
Infrastructure:
- Redis channel: planarchy:sse → capakraken:sse
- Logger service name: planarchy-api → capakraken-api
- Anonymization seed updated
- Start/stop/restart scripts updated
Test data:
- Seed emails: @planarchy.dev → @capakraken.dev
- E2E test credentials: all 11 spec files updated
- Email defaults: @planarchy.app → @capakraken.app
- localStorage keys: planarchy_* → capakraken_*
Documentation: 30+ .md files updated
Verification:
- pnpm install: workspace resolution works
- TypeScript: only pre-existing TS2589 (no new errors)
- Engine: 310/310 tests pass
- Staffing: 37/37 tests pass
Co-Authored-By: claude-flow <ruv@ruv.net >
2026-03-27 13:18:09 +01:00
Hartmut
208f866d68
feat: shared widget filter system for all dashboard widgets
...
Shared infrastructure:
- WidgetFilterBar: declarative filter component (search, select, toggle)
- useWidgetFilterOptions: cached hook for clients, countries, roles, chapters
Widget integration (5 widgets):
- ProjectHealth: search (name) + select (client)
- BudgetForecast: search (name) + select (client)
- Chargeability: select (chapter) + toggle (include proposed)
- SkillGap: search (skill name)
- TopValue: select (chapter)
Backend: added clientId/clientName to ProjectHealth and BudgetForecast
query results for client-based filtering.
Filter state persisted via widget config (survives page reload).
All filters use compact 11px inputs with full dark theme support.
Co-Authored-By: claude-flow <ruv@ruv.net >
2026-03-23 09:21:46 +01:00
Hartmut
c02f453679
fix: hover card, preferences modal, timeline scroll, multi-drag
...
- ResourceHoverCard: add isInitialLoading to useEffect deps so
mouseover/mouseout listeners attach after canvas mounts
- PreferencesModal: lift prefsOpen state to AppShell, render modal
outside sidebar's backdrop-blur stacking context
- Timeline page: constrain to max-h-[100dvh] overflow-hidden so
horizontal scrollbar is accessible without scrolling to bottom
- Multi-drag: pass selectedAllocationIds from ref at drag completion
to prevent stale closure in onMultiDragComplete callback
Co-Authored-By: claude-flow <ruv@ruv.net >
2026-03-19 20:30:43 +01:00
Hartmut
407266bc28
chore: update plan and fix useMultiSelectIntersection types
...
Co-Authored-By: claude-flow <ruv@ruv.net >
2026-03-19 00:37:14 +01:00
Hartmut
e7b74f13bd
refactor: consolidate duplicated code across web and API packages
...
- Extract shared render helpers (vacation blocks, range overlay, overbooking blink) into renderHelpers.tsx
- Centralize status badge styles and vacation color maps into status-styles.ts
- Extract dragMath.ts utility from useTimelineDrag for reuse
- Split useInvalidatePlanningViews into useInvalidateTimeline (4 queries) + useInvalidatePlanningViews (8 queries)
- Adopt findUniqueOrThrow() and Prisma select constants across API routers
- Add shared fmtEur() helper for API-side money formatting
- Wrap TimelineResourcePanel and TimelineProjectPanel with React.memo
- Fix pre-existing TS2589 deep type errors in TeamCalendar and VacationModal
- 38 files changed, reducing ~400 lines of duplicated code
Co-Authored-By: claude-flow <ruv@ruv.net >
2026-03-19 00:10:08 +01:00
Hartmut
ddec3a927a
feat: timeline multi-select, demand popover, resource hover card, merged tooltips, dark mode fixes
...
Major timeline enhancements:
- Right-click drag multi-selection with floating action bar (batch delete/assign)
- DemandPopover for demand strip details (replaces broken "Loading" modal)
- ResourceHoverCard on name hover showing skills, rates, role, chapter
- Merged heatmap+vacation tooltips into unified TimelineTooltip component
- Fixed overbooking blink animation (date normalization, z-index ordering)
- Fixed dark mode sticky column bleed-through in project view
- System roles admin page, notification task management, performance review docs
Co-Authored-By: claude-flow <ruv@ruv.net >
2026-03-18 23:43:51 +01:00
Hartmut
d0f04f13f8
feat: enterprise notification & task management system
...
Phase N.1 — Data Model:
- Extend Notification model with category, priority, task fields (status, action,
assignee, dueDate, completedAt/By), reminder fields (remindAt, recurrence,
nextRemindAt), and targeting metadata (sourceId, senderId, channel)
- Add NotificationCategory, NotificationPriority, TaskStatus enums
- Add NotificationBroadcast model for group notifications
- Shared types with parseTaskAction()/buildTaskAction() helpers
Phase N.2 — API:
- Extend notification router: listTasks, taskCounts, updateTaskStatus,
createReminder/update/delete/list, createBroadcast/listBroadcasts,
createTask, assignTask, delete
- Broadcast targeting: resolve recipients by user/role/project/orgUnit/all
- Task-action registry: approve_vacation, reject_vacation, confirm_assignment
- Reminder scheduler: 60s poll interval, recurring support, catch-up on start
- SSE events: TASK_ASSIGNED, TASK_COMPLETED, TASK_STATUS_CHANGED,
REMINDER_DUE, BROADCAST_SENT
Phase N.3 — AI Assistant:
- 7 new tools: list_tasks, get_task_detail, update_task_status,
execute_task_action, create_reminder, create_task_for_user, send_broadcast
- execute_task_action dispatches to task-action registry with per-action
permission checks, marks tasks as completed by AI
Phase N.4 — Frontend:
- Enhanced NotificationBell with task badge, tabs (All/Tasks/Reminders)
- TaskCard component with priority badges, due dates, action buttons
- ReminderModal for creating/editing personal reminders
- BroadcastModal for targeted group notifications (manager+)
- NotificationCenter full-page with 5 tabs and bulk actions
- TaskWidget dashboard widget showing open tasks
- Admin broadcast management page
- AppShell nav links for Notifications and Broadcasts
- SSE hook handlers for task/reminder events
Phase N.5 — Auto-Tasks:
- Vacation create → APPROVAL tasks for all managers
- Vacation approve/reject → mark approval tasks as DONE
- Demand create → TASK for managers to fill staffing needs
Co-Authored-By: claude-flow <ruv@ruv.net >
2026-03-18 11:51:49 +01:00
Hartmut
eb283147d1
feat: project colors, timeline filters, sidebar fix, GitLooper agent, and misc improvements
...
- Fix sidebar double-highlight on /vacations/my (Gitea #6 ): add isNavItemActive() helper
- Add project color picker (schema + API + modal + timeline rendering)
- Add ProjectCombobox/ResourceCombobox to timeline toolbar
- Show PENDING vacations on timeline with dashed/dimmed style
- Add "show demand projects" preference with localStorage persistence
- Add ProjectAssignmentsTable with total hours/cost columns
- Extend vacation API to accept status arrays
- Add GitLooper formal YAML agent configuration
- Extend user admin with permission overrides UI
- Add delete-assignment use case tests
- Add status-styles.ts shared badge constants
- Centralize formatMoney/formatCents in format.ts
Co-Authored-By: claude-flow <ruv@ruv.net >
2026-03-17 10:22:52 +01:00