Hartmut
bc0bb5bdb8
test: add coverage for gitlooper ticket sweep
...
- useFocusTrap.test.ts: 7 unit tests covering rAF-deferred focus,
Tab/Shift+Tab wrapping, empty-list guard, and cleanup (#56 )
- nextConfig.test.ts: 3 tests for /login and /blueprints redirects (#51 #52 );
5 tests for COMPLETED demand exclusion filter logic (#66 )
Co-Authored-By: claude-flow <ruv@ruv.net >
2026-04-03 17:33:27 +02:00
Hartmut
65db330a4d
fix(ux): resolve tickets #55 #56 — resource modal stability and success feedback
...
#55 : Add SuccessToast after new resource is created. ResourceModal gains an
optional onSuccess(displayName) prop; ResourcesClient wires it to a toast
that auto-dismisses after 2.5 s.
#56 : Fix useFocusTrap stale-closure bug. Focusable elements are now queried
dynamically inside handleKeyDown (not captured once at mount), so Tab
navigation stays correct as the form re-renders. Initial focus is deferred
via requestAnimationFrame so the browser layout is stable before focus() fires.
Co-Authored-By: claude-flow <ruv@ruv.net >
2026-04-03 15:43:12 +02:00
Hartmut
e7e525df49
fix(timeline): clear multi-select on drag start and lock in SSE edge-case coverage
...
- useTimelineDrag: onProjectBarMouseDown and single-alloc drag path now reset
multiSelectRef + multiSelectState before starting a new drag, so the
FloatingActionBar is dismissed immediately when an unrelated drag begins
- FloatingActionBar.test.tsx: 4 regression tests for the null-render guard
(count=0) and all three label variants
- useTimelineSSE.test.ts: 2 new tests — tab hides during pending reconnect
timer (clears timer, resyncs on next open) and first-ever connection fails
before any open (retry open still resyncs correctly)
- assistant-tools-user-admin-inventory-read.test.ts: add isActive to expected
findMany select shape (already in production, test was stale)
Co-Authored-By: claude-flow <ruv@ruv.net >
2026-04-02 21:16:10 +02:00
Hartmut
8d9e26872b
fix(timeline): stabilize popovers on internal scroll + expand test coverage
...
B-1: useViewportPopover — ignoreScrollContainers option; scroll events
originating inside the timeline canvas no longer close point-anchor popovers
B-2: AllocationPopover, DemandPopover, NewAllocationPopover — thread
scrollContainerRef through so horizontal timeline scroll is ignored
B-3: AllocationPopover — staleTime 0 so SSE reconnect triggers immediate refetch
B-4: useViewportPopover.test.ts — 6 new tests (scroll close, ignore container,
resize close, style clamping)
B-5: AllocationPopover.test.tsx — loading state + happy-path tests added
Co-Authored-By: claude-flow <ruv@ruv.net >
2026-04-02 20:49:08 +02:00
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