Skip to content

feat: dashboard signals, profile integrations, top nav, empty states, delete modal#52

Merged
neethika12 merged 6 commits into
mainfrom
feature/dashboard-profile-signals-ux
Apr 29, 2026
Merged

feat: dashboard signals, profile integrations, top nav, empty states, delete modal#52
neethika12 merged 6 commits into
mainfrom
feature/dashboard-profile-signals-ux

Conversation

@neethika12
Copy link
Copy Markdown
Contributor

Changes

  • feat(decisions): replace browser confirm() with custom delete modal
  • fix(integrations): persist Slack/GitHub connection status on tab re-visit
  • feat(profile): move signals feed from dashboard to profile page
  • feat(profile): move Slack/GitHub/Jira integrations to profile page
  • feat(nav): persistent top nav bar with unread signal badge
  • feat(dashboard): unread signal count badge on workspace cards
  • feat(signals): source tabs (All/Slack/GitHub/Jira) + unread toggle replaces filter pills
  • feat(ux): contextual empty states — "No signals yet" + "All caught up" on signals; icon + CTA on decisions list

Signals (Slack, GitHub, JIRA) are user-scoped not workspace-scoped,
so the profile page is their natural home.

- profile.ts: inject SignalService, add signals state + filter/markRead/archive methods
- profile.html: add signals section below profile cards with source/status filter pills,
  search bar, signal-board, and styled empty state
- profile.css: signals section styles — dark-theme filter pills, divider, empty state card
- dashboard.ts: remove SignalService, SignalBoard, SearchBar imports and all signal state/methods
- dashboard.html: remove signals section; update hero copy to link users to Profile for signals
- dashboard.css: add .hero-link style for the inline Profile link in hero copy

Ref Sentinent-AI/Sentinent#36
Integrations are account-level connections, not workspace content,
so the profile page is their natural home.

- WorkspaceIntegrationsComponent: add @input() inputWorkspaceId + ngOnChanges
  so the component reloads when the workspace selection changes when
  embedded outside the router (e.g. profile page)
- profile.ts: inject WorkspaceService, load workspaces, expose
  selectedWorkspaceId + selectWorkspace() for workspace switcher
- profile.html: add integrations section below profile cards — embeds
  <app-workspace-integrations> with workspace selector dropdown (shown
  only when user has more than one workspace); empty state if no workspaces
- profile.css: integrations section styles, workspace selector dropdown
- dashboard.ts/html: revert signals-move (signals stay on dashboard);
  restore original hero copy
- workspace-details.html: replace Integrations nav link with a
  'Integrations →' link that routes to /profile

Ref Sentinent-AI/Sentinent#36
Create AppNavComponent — a fixed dark nav bar shared across all
auth'd pages (dashboard, profile, workspace detail).

- app-nav: Sentinent logo (links /dashboard), Dashboard + Profile
  links with routerLinkActive highlight, unread signal badge on
  Profile (polls every 60s), Logout button
- dashboard: remove inline brand/profile-btn/logout-btn; add
  padding-top: 56px to offset fixed nav
- profile: remove 'Back to dashboard' button (nav replaces it);
  add padding-top offset
- workspace-details: add <app-nav>; update padding-top; shorten
  'Back to Dashboard' label to '← Dashboard'

Ref Sentinent-AI/Sentinent#36
After signals load, compute a workspaceId→unreadCount map from the
already-fetched signal list (no extra API call). Each workspace card
now shows a dark pill badge (e.g. '3 unread') when there are unread
signals for that workspace, giving users at-a-glance triage from the
dashboard.

Ref Sentinent-AI/Sentinent#36
Signal filtering is now client-side on an already-fetched full list,
so switching tabs is instant with no extra network calls.

- Source tabs (All / Slack / GitHub / JIRA) each show a live count
  badge; active tab gets an underline indicator
- 'Unread only' toggle replaces the old status filter pill — one click
  to focus, one click to clear
- allSignals holds the full status-filtered list; signals is the
  tab-filtered view; applyFilters() recomputes on tab switch without
  re-fetching

Ref Sentinent-AI/Sentinent#36
- Signals: two distinct empty states depending on context
  - 'No signals yet' with icon + 'Connect integrations' CTA when
    allSignals is empty (no tools connected)
  - 'All caught up' with check icon when integrations are connected
    but the active tab/filter returns nothing; message adapts to
    sourceTab and showUnreadOnly flag
- Decision list: replace bare text with structured empty state
  (icon, heading, sub-copy, 'Create your first decision' CTA button)
- CSS: empty-icon, empty-cta, caught-up/no-integrations variants
@neethika12 neethika12 merged commit 7324fc4 into main Apr 29, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant