Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

11 KiB

Scratchpad — Scheduling Context Facade

  • Plan slug: scheduling-context-facade
  • Created: 2026-02-05

Decisions

  • (2026-02-05) Use React Context facade pattern instead of direct imports or prop threading. Reason: avoids cross-package deps AND avoids 3-4 layer prop threading for InteractionDetails/TaskForm.
  • (2026-02-05) Context defined in @alga-psa/ui (all packages already depend on it). Real implementations in @alga-psa/scheduling. Provider in msp-composition.
  • (2026-02-05) Option A for server page wrapping: wrap individual pages (tickets, contacts, projects), not the MSP layout. Keeps blast radius small.
  • (2026-02-05) AgentScheduleView defaults to week view (not month). Better UX for drawer width.
  • (2026-02-05) AgentScheduleView lives in scheduling package (not tickets). It uses scheduling internals directly — no cross-package concern since it's in the same package.
  • (2026-02-05) Yesterday's materials drawer used direct @alga-psa/billing dependency — user noted this was architecturally incorrect and should also use facade pattern in the future.

Discoveries / Constraints

  • (2026-02-05) Old AgentScheduleDrawer was 632 lines (commit c6e3612d2). Full React Big Calendar with drag-and-drop, event CRUD, color-coded events, EntryPopup integration.
  • (2026-02-05) Current ScheduleCalendar.tsx has NO props (fully self-contained, 1040 lines). Cannot be embedded in a drawer as-is.
  • (2026-02-05) Old time entry handlers: validated prerequisites → fetched time period → created timesheet → built IExtendedWorkItem → opened TimeEntryDialog in drawer.
  • (2026-02-05) InteractionDetails is 3 layers deep from server page (ContactDetailsView → InteractionsFeed → InteractionDetails). No existing composition wrapper for clients.
  • (2026-02-05) TaskForm is 4 layers deep (ProjectPage → ProjectDetail → TaskQuickAdd/TaskEdit → TaskForm). No existing composition wrapper for projects.
  • (2026-02-05) TagContext is a good pattern reference — context defined in package, provides callbacks to deeply nested consumers.
  • (2026-02-05) InteractionDetails already imports AgentScheduleDrawer from @alga-psa/tickets, so updating the stub there fixes both ticket and interaction entry points.
  • (2026-02-05) TimeEntryDialog supports inDrawer: true prop for drawer mode.
  • (2026-02-05) Timer state (elapsedTime, isRunning, timeDescription) is local to TicketDetails — passed through context params, not stored in the context itself.

Commands / Runbooks

  • View old AgentScheduleDrawer: git show c6e3612d2 -- packages/tickets/src/components/ticket/AgentScheduleDrawer.tsx
  • View old time entry handlers: git log --all -p -S "TimeEntryDialog" -- packages/tickets/src/components/ticket/TicketDetails.tsx | head -200
  • The modularization commit: c43321e4c ("refactor: continue modularization of actions and components")
  • Old AgentScheduleDrawer styles: packages/tickets/src/components/ticket/AgentScheduleDrawerStyles.tsx
  • ScheduleCalendar: packages/scheduling/src/components/schedule/ScheduleCalendar.tsx
  • EntryPopup: packages/scheduling/src/components/schedule/EntryPopup.tsx
  • DynamicBigCalendar: packages/scheduling/src/components/schedule/DynamicBigCalendar.tsx
  • CalendarStyleProvider: packages/scheduling/src/components/schedule/CalendarStyleProvider.tsx
  • TimeEntryDialog: packages/scheduling/src/components/time-management/time-entry/time-sheet/TimeEntryDialog.tsx
  • TimeEntryProvider: packages/scheduling/src/components/time-management/time-entry/time-sheet/TimeEntryProvider.tsx
  • scheduleActions: packages/scheduling/src/actions/scheduleActions.ts
  • timeEntryCrudActions: packages/scheduling/src/actions/timeEntryCrudActions.ts
  • MspTicketDetailsContainerClient: packages/msp-composition/src/tickets/MspTicketDetailsContainerClient.tsx
  • Existing stubs: AgentScheduleDrawer.tsx, TicketDetails.tsx:975, InteractionDetails.tsx:229, TaskForm.tsx:831

Open Questions

  • None currently blocking.

Updates

  • (2026-02-05) Added TimeEntryWorkItemContext to packages/types/src/interfaces/scheduling.interfaces.ts for shared work-item launch context.
  • (2026-02-05) Added SchedulingContext in packages/ui/src/context/SchedulingContext.tsx with no-op defaults and hook.
  • (2026-02-05) Re-exported SchedulingContext from packages/ui/src/context/index.ts.
  • (2026-02-05) Created packages/scheduling/src/components/schedule/AgentScheduleView.tsx and AgentScheduleDrawerStyles.tsx for single-agent calendar drawer view.
  • (2026-02-05) AgentScheduleView now loads entries via getScheduleEntries scoped to agentId and current date range.
  • (2026-02-05) AgentScheduleView uses DynamicBigCalendar with week/day/month views and default week view.
  • (2026-02-05) AgentScheduleView applies work-item color mapping via eventPropGetter.
  • (2026-02-05) AgentScheduleView opens EntryPopup on event click (view-only mode).
  • (2026-02-05) AgentScheduleView auto-scrolls to 8 AM on initial render.
  • (2026-02-05) AgentScheduleView gates viewing by user_schedule permissions and shows a permission error when disallowed.
  • (2026-02-05) AgentScheduleView includes CalendarStyleProvider and AgentScheduleDrawerStyles for drawer styling.
  • (2026-02-05) Added packages/scheduling/src/lib/timeEntryLauncher.tsx to orchestrate time entry dialog launch from work-item context.
  • (2026-02-05) timeEntryLauncher now toasts when no active time period exists.
  • (2026-02-05) timeEntryLauncher opens TimeEntryDialog in drawer mode with time period and time sheet context.
  • (2026-02-05) timeEntryLauncher saves time entry, closes drawer, and triggers onComplete on success.
  • (2026-02-05) Added MspSchedulingProvider in msp-composition to supply scheduling callbacks via context.
  • (2026-02-05) Added @alga-psa/scheduling dependency and exports to msp-composition package.json.
  • (2026-02-05) Wrapped ticket detail page with MspSchedulingProvider.
  • (2026-02-05) Wrapped contact detail and activity pages with MspSchedulingProvider.
  • (2026-02-05) Wrapped project detail page with MspSchedulingProvider.
  • (2026-02-05) Updated AgentScheduleDrawer to use SchedulingContext renderAgentSchedule callback.
  • (2026-02-05) TicketDetails now launches time entry via SchedulingContext with ticket timer context.
  • (2026-02-05) InteractionDetails now launches time entry via SchedulingContext with interaction context.
  • (2026-02-05) TaskForm now launches time entry via SchedulingContext with project/phase/task and service context.
  • (2026-02-05) Default SchedulingContext callbacks provide alert/toast fallbacks when no provider is present.
  • (2026-02-05) Added helper builders for time entry contexts in tickets/clients/projects to simplify test coverage.
  • (2026-02-05) Added type-level test for TimeEntryWorkItemContext in packages/scheduling/tests/timeEntryWorkItemContext.test.ts.
  • (2026-02-05) Added SchedulingContext hook default test in packages/ui/src/context/SchedulingContext.test.tsx.
  • (2026-02-05) Added SchedulingContext default renderAgentSchedule fallback test.
  • (2026-02-05) Added SchedulingContext default launchTimeEntry toast test.
  • (2026-02-05) Added SchedulingCallbackProvider override test.
  • (2026-02-05) Added context index re-export test for SchedulingContext.
  • (2026-02-05) Added initial AgentScheduleView render test with mocked calendar dependencies.
  • (2026-02-05) Added AgentScheduleView getScheduleEntries call verification test.
  • (2026-02-05) Added AgentScheduleView loading state test.
  • (2026-02-05) Added AgentScheduleView default week view test.
  • (2026-02-05) Added AgentScheduleView view-switching test.
  • (2026-02-05) Added AgentScheduleView event color mapping test.
  • (2026-02-05) Added AgentScheduleView EntryPopup open-on-click test.
  • (2026-02-05) Added AgentScheduleView scroll-to-8am test via scrollToTime prop.
  • (2026-02-05) Added AgentScheduleView permission test for user_schedule:read (own-only).
  • (2026-02-05) Added AgentScheduleView permission test for user_schedule:read:all.
  • (2026-02-05) Added AgentScheduleView style provider render test.
  • (2026-02-05) Added timeEntryLauncher test for current time period fetch.
  • (2026-02-05) Added timeEntryLauncher test for time sheet fetch/create.
  • (2026-02-05) Added timeEntryLauncher ticket work item build test.
  • (2026-02-05) Added timeEntryLauncher interaction work item build test.
  • (2026-02-05) Added timeEntryLauncher project task work item build test.
  • (2026-02-05) Added timeEntryLauncher missing time period toast test.
  • (2026-02-05) Added timeEntryLauncher drawer mode props test.
  • (2026-02-05) Added timeEntryLauncher service prefill test for project tasks.
  • (2026-02-05) Added timeEntryLauncher save-and-close test.
  • (2026-02-05) Added timeEntryLauncher onComplete callback test.
  • (2026-02-05) Added msp-composition SchedulingProvider tests and vitest config.
  • (2026-02-05) Added MspSchedulingProvider launchTimeEntry wiring test.
  • (2026-02-05) Added msp-composition package dependency test for scheduling.
  • (2026-02-05) Added server page provider presence tests for ticket/contact/project pages.
  • (2026-02-05) Verified contact detail/activity pages include scheduling provider via server page tests.
  • (2026-02-05) Verified project detail page includes scheduling provider via server page tests.
  • (2026-02-05) Added AgentScheduleDrawer tests for provider rendering and fallback alert.
  • (2026-02-05) Verified AgentScheduleDrawer fallback alert without provider.
  • (2026-02-05) Added TicketDetails schedule drawer wiring test via source inspection.
  • (2026-02-05) Added InteractionDetails schedule drawer wiring test via source inspection.
  • (2026-02-05) Added ticket time entry context helper tests.
  • (2026-02-05) Verified ticket time entry context includes elapsedTime and timeDescription.
  • (2026-02-05) Verified ticket time entry onComplete resets timer state.
  • (2026-02-05) Added interaction time entry context helper test.
  • (2026-02-05) Added task time entry context helper test and projects vitest config.
  • (2026-02-05) Added fallback toast test for time entry without provider.
  • (2026-02-05) Fixed SchedulingContext test mock hoisting for react-hot-toast.
  • (2026-02-05) Fixed msp-composition test mock hoisting for timeEntryLauncher.
  • (2026-02-05) Fixed tickets test config aliasing for @shared and toast mock hoisting.
  • (2026-02-05) Added tickets test alias for @alga-psa/event-schemas to unblock existing tests.
  • (2026-02-05) Added tickets package aliasing for @alga-psa/tickets to fix existing SLA tests.

Test Runs

  • npx vitest --config vitest.config.ts --run --root packages/ui
  • npx vitest --config vitest.config.ts --run --root packages/scheduling
  • npx vitest --config vitest.config.ts --run --root packages/msp-composition
  • npx vitest --config vitest.config.ts --run --root packages/tickets
  • npx vitest --config vitest.config.ts --run --root packages/clients
  • npx vitest --config vitest.config.ts --run --root packages/projects