diff --git a/frontend/dashboard.css b/frontend/dashboard.css index 6a0d6b7..54fb8bf 100644 --- a/frontend/dashboard.css +++ b/frontend/dashboard.css @@ -337,6 +337,19 @@ textarea { resize: vertical; min-height: 120px; } .week-review-duplicates { margin:12px 0; padding:12px; border:1px solid #f59e0b; border-radius:10px; background:#2a1c12; } .week-review-status { min-height:1.4em; margin:10px 0; } #confirm-week-plan { width:100%; min-height:48px; position:sticky; bottom:0; } +.week-calendar-handoff h2 { margin-bottom:6px; } +.week-calendar-days { display:grid; gap:12px; margin:14px 0; } +.week-calendar-day { min-width:0; padding:12px; border:1px solid #31577f; border-radius:12px; background:#10233a; } +.week-calendar-day header { display:flex; align-items:center; justify-content:space-between; gap:12px; } +.week-calendar-day h3 { margin:0; } +.week-calendar-day input[type="time"] { min-height:44px; font-size:16px; } +.week-calendar-item { display:grid; grid-template-columns:auto minmax(0,1fr); gap:10px; align-items:center; min-height:44px; padding:8px 0; overflow-wrap:anywhere; } +.week-calendar-item input { width:22px; height:22px; } +.week-calendar-item span { display:grid; gap:3px; } +.week-calendar-item small { color:#a9bdd3; } +.week-calendar-status { min-height:1.4em; margin:10px 0; } +.week-calendar-actions { position:sticky; bottom:0; display:grid; grid-template-columns:1fr 2fr; gap:8px; padding-bottom:env(safe-area-inset-bottom); background:#0b1526; } +.week-calendar-actions button { min-width:0; min-height:48px; } .plan-today-sheet.week-review-mode .week-plan-dates, .plan-today-sheet.week-review-mode .mobile-plan-today-nav, .plan-today-sheet.week-review-mode #plan-today-fit, diff --git a/frontend/dashboard.js b/frontend/dashboard.js index 47f4598..5d28da4 100644 --- a/frontend/dashboard.js +++ b/frontend/dashboard.js @@ -452,11 +452,15 @@ storage: localStorage, getLogin: () => planningOwnerLogin, }); + const weekItem=identity=>[...todayMyWork,...activeMyWork].find(item=>todayWork.identity(item)===identity); const weekWorkflow=createWeekPlanWorkflow({controller:weekPlan,qs,getLogin:()=>planningOwnerLogin, - getItem:identity=>[...todayMyWork,...activeMyWork].find(item=>todayWork.identity(item)===identity), + getItem:weekItem, openPlanner:openPlanToday,setReviewMode:value=>qs('#plan-today-sheet').classList.toggle('week-review-mode',value), escapeHtml,escapeAttribute:escAttr,todayWork, refresh:refreshMyWorkView,warm:warmTodayOffline}); + const weekCalendar=StackchainWeekCalendar.mountWeekCalendarHandoff({qs,getItem:weekItem,escapeHtml,escapeAttribute:escAttr, + onDone:()=>{weekWorkflow.finish();taskOverlayHistory.leave();}, + }); const todaySync = createTodaySync({ storage: localStorage, getLogin: () => planningOwnerLogin, @@ -2701,6 +2705,7 @@ } planToday.cancel(); planningTomorrow = false; + weekCalendar.close(); weekWorkflow.clear(); qs('#tomorrow-conflict-review').hidden = true; qs('#plan-today-sheet').classList.remove('tomorrow-conflict-mode'); @@ -7919,9 +7924,7 @@ qs('#week-review-status').textContent=weekPlan.pending()?'Wait for Week Ahead to finish syncing before confirming.':'Move duplicated work to one date before confirming.'; return; } - qs('#mobile-week-summary').textContent=weekPlan.summary(); - qs('#my-work-action-status').textContent='Week Ahead reviewed and confirmed.'; - taskOverlayHistory.leave(); + weekCalendar.open(weekPlan.state()); }); qs('#plan-today-sheet').addEventListener('click', event => { if (event.target === qs('#plan-today-sheet')) closePlanToday(); diff --git a/frontend/index.html b/frontend/index.html index 9e9e7d4..b373e58 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -514,6 +514,17 @@
+