Skip to content

[ux-calendar-agenda-empty-dead-end] Agenda empty state points at disabled Sync #6946

Description

@atomantic

Screen / route: /calendar/agenda — audited 2026-09-11 at 1440×900 and 375×812
Checklist failed: 2 (empty state names a next action) and 5 (no dead ends)

Problem

The user opens Agenda to see what’s next or to get a calendar connected. When no account is enabled, the screen is a dead end.

Live CDP:

  • Fold actions: Agenda/Day/Week/Month/Lifetime tabs and a disabled Sync (y=131 desktop, y=161 mobile). No “Connect” / “Add account” control.
  • Empty copy in client/src/components/calendar/AgendaTab.jsx:130-134: “No upcoming events” / “Sync your calendar accounts to see events here”.
  • The Sync button (AgendaTab.jsx:115-118) is disabled={syncing || accounts.filter(a => a.enabled).length === 0} — so when the copy tells you to sync, Sync cannot be pressed.
  • Setup (/capabilities) reports Calendar as “Not set up / No Calendar accounts connected”, but Agenda does not send the user to /calendar/sync.

Calendar.jsx:63-78 already has a Sync tab (SyncTab.jsx) that is the place to add/enable accounts. Agenda never points there.

Impact

A first-run (or disconnected) user lands on the default Calendar tab, reads “sync your accounts”, and finds the only action disabled. There is no path forward without already knowing the Sync sub-tab exists. Recurring: every session until an account is connected.

Fix

Decision: branch the empty state on whether any enabled account exists. Do not invent in-Agenda OAuth — SyncTab already owns that.

When accounts.filter(a => a.enabled).length === 0:

  • Render the shared EmptyState (client/src/components/EmptyState.jsx) with title “No calendar connected”, message that events appear after an account is connected, actionTo="/calendar/sync", actionLabel="Connect a calendar".
  • Hide or keep Sync disabled, but do not tell the user to click it.

When accounts exist but the event list is empty:

  • Keep Sync enabled as the in-page action (onAction={handleSync}), message “Sync now to pull upcoming events”.

Files: client/src/components/calendar/AgendaTab.jsx (primary), add AgendaTab.test.jsx. Optionally reuse the same empty copy on Day/Week/Month if they currently show a blank grid with no CTA — check DayView.jsx / WeekView.jsx / MonthView.jsx and match if they share the no-accounts case.

model:light — one empty-state branch and a link that already exists. effort:low — the enabled-accounts predicate is already on the Sync button.

Scope: small

Acceptance criteria

  • With zero enabled calendar accounts, /calendar/agenda shows EmptyState with a working “Connect a calendar” control that navigates to /calendar/sync.
  • That state does not instruct the user to press the disabled Sync button.
  • With at least one enabled account and zero events, Sync is enabled and the empty copy names Sync (or an equivalent onAction).
  • A component test covers both branches (no accounts vs accounts-but-empty).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    effort:lowLow reasoning budget per stepmodel:lightMechanical single-file changeplanTracked by /do:replanplanner:grok-4-6Plan authored by the grok-4-6 modeluxProposed from a UX/design audit

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions