Skip to content

Finalize dashboard in portal#136

Merged
RasulOs merged 11 commits into
mainfrom
rasul/dro-2149-finalize-dashboard-in-portal
Jun 3, 2026
Merged

Finalize dashboard in portal#136
RasulOs merged 11 commits into
mainfrom
rasul/dro-2149-finalize-dashboard-in-portal

Conversation

@RasulOs
Copy link
Copy Markdown
Collaborator

@RasulOs RasulOs commented Jun 2, 2026

  • dashboard: add tasks dashboard tab with stats cards
  • dashboard: add area chart sparkline, multi-status donut ring, icons, and status legend
  • dashboard: touch tooltip, pull-to-refresh, and review fixes
  • dashboard: cleanup, style alignment, and performance fixes
  • dashboard: fix history pull-to-refresh spinner not dismissing
  • dashboard: rename shared data fetch for single source of truth
  • dashboard: fix scroll conflict, refresh UX, and cleanup
  • dashboard: fix history refresh routing

Ramtx and others added 8 commits May 29, 2026 14:00
Transform the History screen into a tabbed Tasks screen with Dashboard
and History tabs. The dashboard shows performance metrics, a 14-day
activity sparkline, success rate, and total runs — computed client-side
from a single listTasks(pageSize=100) call, matching the cloud dashboard
strategy. Rename the main-page button from "History" to "Tasks".
…and status legend

Replace the bar-chart sparkline with a smooth area chart (gradient fill,
cubic bezier line, date labels on the X axis) matching the cloud's
ActivitySparkline. Upgrade the success rate card with a multi-segment
donut ring showing all statuses (completed, failed, cancelled, running,
created, paused) with colored legend dots and per-status counts. Add
lucide-style vector icons to the Performance and Tasks card headers.
Add interactive touch tooltip to the sparkline chart — dragging a finger
shows a floating bubble with the date and task count, with a dashed
cursor line and highlighted dot. Add SwipeRefreshLayout for pull-to-
refresh on the dashboard tab.

Fix 7 issues from code review:
- Cache LinearGradient shader instead of allocating per frame
- Hide dashboardLoading spinner when SwipeRefresh is active
- Use maxOrNull for lastTaskAgoMs instead of relying on API sort order
- Use per-side padding in SuccessRingView oval calculation
- Add STATUS_TRACKING_TIMEOUT to status color and label maps
- Compute last ring slice as remainder to close the ring exactly
- Disable SwipeRefreshLayout during sparkline touch interaction
Align with codebase conventions:
- Rename data classes to Portal prefix (PortalDashboardStats,
  PortalStatusCount, PortalDayActivity)
- Move formatDuration, formatTimeAgo, statusColor to PortalTaskUiSupport
- Remove dead StatusCount.label field and formatModelLabel wrapper
- Replace all FQN references with proper imports
- Remove dead cachedChartTop/cachedChartBottom fields from SparklineView

Performance and correctness:
- Move PortalDashboardStats.compute() off the UI thread
- Seed history tab from cached dashboard data (skip redundant fetch)
- Add claimedAt field to PortalTaskHistoryItem for accurate duration
- Add sample size hint to performance and success rate cards
- Clear stale history items on dashboard refresh
- Remove tab-reselect auto-refresh (pull-to-refresh only)
The history SwipeRefreshLayout spinner never stopped because
renderDashboardState() early-returns when the history tab is active.
Move the spinner dismissal into the loadDashboard callback directly,
and re-seed the history list from fresh cache when the user refreshes
from the history tab.
Rename loadDashboard→loadData, isDashboardLoading→isDataLoading,
dashboardRequestToken→dataRequestToken, hasLoadedDashboard→hasLoadedData,
cachedDashboardPage→cachedTaskPage. Both tabs now clearly share one data
fetch — names reflect that neither tab owns the data.
Fix ListView scroll conflict with SwipeRefreshLayout — pull-to-refresh
now only triggers when the list is scrolled to the top. Show error Toast
when refresh fails on the History tab. Keep old items visible during
refresh instead of flashing empty state. Remove dead PortalDayActivity
date field. Move tooltip string to resources. Extract duplicated
SwipeRefreshLayout configuration into shared helper.
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

🧪 Test Build Ready

APK for PR #136 is available for testing.

Download APK from workflow run

Artifacts expire after 30 days.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

🧪 Test Build Ready

APK for PR #136 is available for testing.

Download APK from workflow run

Artifacts expire after 30 days.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

🧪 Test Build Ready

APK for PR #136 is available for testing.

Download APK from workflow run

Artifacts expire after 30 days.

@RasulOs RasulOs mentioned this pull request Jun 3, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

🧪 Test Build Ready

APK for PR #136 is available for testing.

Download APK from workflow run

Artifacts expire after 30 days.

@RasulOs RasulOs merged commit 532c9f0 into main Jun 3, 2026
5 of 6 checks passed
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.

2 participants