feat: complete Today from mobile HUD (Closes #601)
This commit is contained in:
1 parent
f023414929
commit
7aa25f1d8c
5 files changed
+94
-4
No files matched your search
@@ -9,6 +9,7 @@ from tests.dashboard_bundle import dashboard
|
||||
|
||||
DOCK = Path(__file__).resolve().parents[1] / "frontend" / "mobile-task-dock.js"
|
||||
ENTRY = Path(__file__).resolve().parents[1] / "frontend" / "mobile-work-entry.js"
|
||||
TIMER = Path(__file__).resolve().parents[1] / "frontend" / "today-timer.js"
|
||||
|
||||
|
||||
def test_mobile_work_entry_prioritizes_continue_resume_start_then_fallback():
|
||||
@@ -146,6 +147,67 @@ process.stdout.write(JSON.stringify({{
|
||||
}
|
||||
|
||||
|
||||
def test_mobile_today_hud_completes_current_item_and_labels_final_item_for_recap():
|
||||
script = f"""
|
||||
const createView = require({json.dumps(str(TIMER))}).createView;
|
||||
class FakeElement {{
|
||||
constructor() {{ this.listeners = {{}}; this.hidden = true; this.textContent = ''; this.attributes = {{}}; }}
|
||||
addEventListener(name, callback) {{ this.listeners[name] = callback; }}
|
||||
click() {{ return this.listeners.click?.(); }}
|
||||
setAttribute(name, value) {{ this.attributes[name] = value; }}
|
||||
}}
|
||||
const hud = new FakeElement();
|
||||
const open = new FakeElement();
|
||||
const toggle = new FakeElement();
|
||||
const complete = new FakeElement();
|
||||
const progress = new FakeElement();
|
||||
const elements = {{
|
||||
'[data-mobile-today-hud]':[hud],
|
||||
'[data-mobile-today-open]':[open],
|
||||
'[data-mobile-today-toggle]':[toggle],
|
||||
'[data-mobile-today-complete]':[complete],
|
||||
'[data-work-session-progress]':[progress],
|
||||
'[data-work-session-adjust-plan]':[],
|
||||
'[data-work-session-timer-toggle]':[toggle],
|
||||
}};
|
||||
let active = true;
|
||||
const snapshot = {{identity:'issue:r:1:', elapsed_ms:0, running:true}};
|
||||
const completed = [];
|
||||
const view = createView({{
|
||||
timer:{{snapshot:()=>snapshot,totalElapsed:()=>0,pause:()=>true,resume:()=>true}},
|
||||
isActive:()=>active,
|
||||
queryAll:selector=>elements[selector] || [],
|
||||
formatEstimate:value=>value + 'm',
|
||||
getItem:()=>({{title:'Ship mobile flow'}}),
|
||||
onComplete:identity=>{{ completed.push(identity); return false; }},
|
||||
}});
|
||||
view.update({{index:1,total:2}}, null);
|
||||
const next = {{hidden:complete.hidden,label:complete.textContent,aria:complete.attributes['aria-label']}};
|
||||
complete.click();
|
||||
const preservedAfterFailure = {{hudHidden:hud.hidden,identity:snapshot.identity}};
|
||||
view.update({{index:2,total:2}}, null);
|
||||
const recap = {{hidden:complete.hidden,label:complete.textContent}};
|
||||
active = false; view.render();
|
||||
process.stdout.write(JSON.stringify({{next,recap,completed,preservedAfterFailure,hiddenWhenInactive:complete.hidden}}));
|
||||
"""
|
||||
result = subprocess.run(
|
||||
["node", "-e", script], capture_output=True, text=True
|
||||
)
|
||||
|
||||
assert result.returncode == 0, result.stderr
|
||||
assert json.loads(result.stdout) == {
|
||||
"next": {
|
||||
"hidden": False,
|
||||
"label": "Done & next",
|
||||
"aria": "Complete Ship mobile flow and open next Today item",
|
||||
},
|
||||
"recap": {"hidden": False, "label": "Done & recap"},
|
||||
"completed": ["issue:r:1:"],
|
||||
"preservedAfterFailure": {"hudHidden": False, "identity": "issue:r:1:"},
|
||||
"hiddenWhenInactive": True,
|
||||
}
|
||||
|
||||
|
||||
def test_mobile_task_dock_exposes_independent_attention_action_and_six_column_state():
|
||||
script = f"""
|
||||
const createDock = require({json.dumps(str(DOCK))});
|
||||
@@ -231,10 +293,16 @@ async def test_dashboard_renders_phone_safe_today_session_hud_above_task_dock():
|
||||
assert 'data-work-session-progress' in html
|
||||
assert 'data-work-session-timer-toggle' in html
|
||||
assert 'data-work-session-adjust-plan' in html
|
||||
assert 'data-mobile-today-complete' in html
|
||||
assert 'Done & next' in html
|
||||
assert "getItem: identity => [...todayMyWork, ...activeMyWork].find" in html
|
||||
assert "onReopen: identity =>" in html
|
||||
assert "onComplete: identity =>" in html
|
||||
assert "completeTodayItem(item)" in html
|
||||
assert "workSession.reopen(item)" in html
|
||||
assert '.mobile-today-hud { display:none;' in html
|
||||
assert 'grid-template-areas:' in html
|
||||
assert '[data-mobile-today-complete] { grid-area:complete;' in html
|
||||
assert 'bottom:calc(56px + env(safe-area-inset-bottom))' in html
|
||||
assert '.mobile-today-hud button { min-height:44px;' in html
|
||||
assert '.mobile-task-action[hidden] { display:none;' in html
|
||||
|
||||
Reference in new issue
Block a user