diff --git a/frontend/dashboard.js b/frontend/dashboard.js index 654b28b..76f921a 100644 --- a/frontend/dashboard.js +++ b/frontend/dashboard.js @@ -123,12 +123,14 @@ queueCounts.followingUnavailable = false; preparationItems.following = items.filter(item => item.has_unseen_change === true); renderMobileQueuePresentation(); + mobileTaskDock.updateQueues(queueCounts); mobileStartDay.render(); }, onStatus:status => { if (status === 'loading') return; queueCounts.followingUnavailable = status === 'error'; renderMobileQueuePresentation(); + mobileTaskDock.updateQueues(queueCounts); mobileStartDay.render(); }, onReviewComplete:() => mobileStartDay.completePhase('following'), @@ -3547,9 +3549,12 @@ counts.delivery = draftInbox.partition(lastDrafts).actionable; counts.gate = queueCounts.gate; counts.gateUnavailable = queueCounts.gateUnavailable; + counts.following = queueCounts.following; + counts.followingUnavailable = queueCounts.followingUnavailable; preparationItems = { delivery:draftInbox.partition(lastDrafts).deliveries, gate:preparationItems.gate || [], + following:preparationItems.following || [], agenda:agendaMyWork(activeMyWork), attention:activeMyWork.filter(item => item.needs_attention), update:activeMyWork.filter(item => item.has_update), diff --git a/frontend/mobile-task-dock.js b/frontend/mobile-task-dock.js index 474ea13..8fc374e 100644 --- a/frontend/mobile-task-dock.js +++ b/frontend/mobile-task-dock.js @@ -97,9 +97,9 @@ } function updateQueues(counts) { - const names = 'today agenda delivery gate attention update filed later draft'.split(' '); + const names = 'today agenda delivery gate attention update following filed authored later draft'.split(' '); const normalized = Object.fromEntries(names.map(name => [name, Math.max(0, Number(counts?.[name]) || 0)])); - const actionableNames = ['today', 'delivery', 'gate', 'attention', 'update', 'filed', 'later', 'draft']; + const actionableNames = ['today', 'delivery', 'gate', 'attention', 'update', 'following', 'filed', 'authored', 'later', 'draft']; const active = actionableNames.reduce((total, name) => total + (normalized[name] > 0 ? 1 : 0), 0); Object.entries(options.queueCounts || {}).forEach(([name, element]) => { element.textContent = String(normalized[name] || 0); @@ -107,6 +107,9 @@ options.queueRows?.update?.setAttribute( 'aria-label', 'Updates, ' + normalized.update + ' unread conversations' ); + options.queueRows?.following?.setAttribute( + 'aria-label', 'Following, ' + normalized.following + ' unseen changes' + ); if (options.queueBadge) { options.queueBadge.textContent = active + ' active'; options.queueBadge.hidden = active === 0; @@ -127,7 +130,9 @@ + ', Human Gates ' + normalized.gate + ', Attention ' + normalized.attention + ', Updates ' + normalized.update + + ', Following ' + normalized.following + ', Filed ' + normalized.filed + + ', My PRs ' + normalized.authored + ', Later ' + normalized.later + ', Drafts ' + normalized.draft + '; ' + active + ' active ' + (active === 1 ? 'queue' : 'queues'); diff --git a/tests/test_mobile_task_dock.py b/tests/test_mobile_task_dock.py index efd1793..683af41 100644 --- a/tests/test_mobile_task_dock.py +++ b/tests/test_mobile_task_dock.py @@ -300,6 +300,33 @@ async def test_mobile_queue_sheet_prioritizes_next_active_and_planning_without_d assert html.count(f'