Show today's tasks as seed chips on the planning screen
The planning view renders Marvin's today list as clickable chips; clicking one fills the intent field, feeding the existing coach flow. idle/error/empty render nothing, pending shows a quiet loading line. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -107,3 +107,12 @@ input:focus { outline: 0; border-color: var(--accent); }
|
||||
font-variant-numeric: tabular-nums; color: var(--ink-dim);
|
||||
}
|
||||
.summary-row span:last-child { color: var(--ink); font-family: ui-monospace, monospace; }
|
||||
|
||||
/* Planning: today's tasks as clickable seed chips */
|
||||
.tasklist { display: flex; flex-wrap: wrap; gap: 8px; }
|
||||
.task-chip {
|
||||
padding: 6px 10px; border: 1px solid var(--line); border-radius: 999px;
|
||||
background: var(--bg); color: var(--ink); font: inherit; font-size: 13px;
|
||||
cursor: pointer; text-align: left;
|
||||
}
|
||||
.task-chip:hover { border-color: var(--accent); color: var(--accent); }
|
||||
|
||||
@@ -136,11 +136,33 @@ function updatePlanningCoach(coach) {
|
||||
}
|
||||
}
|
||||
|
||||
// updatePlanningTasks renders today's Marvin tasks as clickable seed chips.
|
||||
// Clicking a chip fills the intent field; the coach pipeline is unchanged.
|
||||
// idle/error/empty render nothing; pending shows a quiet loading line.
|
||||
function updatePlanningTasks(tasks) {
|
||||
const el = document.getElementById('tasksBand');
|
||||
if (!el) return;
|
||||
if (!tasks || tasks.status === 'idle' || tasks.status === 'error') { el.innerHTML = ''; return; }
|
||||
if (tasks.status === 'pending') { el.innerHTML = `<div class="meta">loading tasks…</div>`; return; }
|
||||
const list = tasks.tasks || [];
|
||||
if (!list.length) { el.innerHTML = ''; return; }
|
||||
const chips = list.map((t, i) =>
|
||||
`<button type="button" class="task-chip" data-i="${i}">${t.title}</button>`).join('');
|
||||
el.innerHTML = `<label>Today</label><div class="tasklist">${chips}</div>`;
|
||||
el.querySelectorAll('.task-chip').forEach(btn => {
|
||||
btn.onclick = () => {
|
||||
const intent = document.getElementById('intent');
|
||||
if (intent) { intent.value = list[+btn.dataset.i].title; intent.focus(); }
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
function render(state) {
|
||||
setStateAttr(state);
|
||||
const rs = state.runtime_state;
|
||||
if (rs === 'planning' && renderedState === 'planning') {
|
||||
updatePlanningCoach(state.coach);
|
||||
updatePlanningTasks(state.tasks);
|
||||
return;
|
||||
}
|
||||
if (rs === 'active' && renderedState === 'active') {
|
||||
@@ -166,6 +188,7 @@ function render(state) {
|
||||
<button id="sharpen" type="button" class="btn btn-ghost">Sharpen</button>
|
||||
<div id="coachStatus" class="meta"></div>
|
||||
</div>
|
||||
<div class="band" id="tasksBand"></div>
|
||||
<div class="band">
|
||||
<label>Next action</label><input id="na" placeholder="What exactly will you do?">
|
||||
<label>Success condition</label><input id="sc" placeholder="How do you know it's done?">
|
||||
@@ -190,6 +213,7 @@ function render(state) {
|
||||
if (intent) post('/coach', { intent });
|
||||
};
|
||||
updatePlanningCoach(state.coach);
|
||||
updatePlanningTasks(state.tasks);
|
||||
|
||||
} else if (rs === 'active') {
|
||||
const c = state.commitment || {};
|
||||
|
||||
Reference in New Issue
Block a user