--- title: Task --- ```js import {API} from "../components/config.js"; import {fieldRow} from "../components/field-help.js"; import {statusControl, TASK_STATUSES} from "../components/status-control.js"; ``` ```js const taskId = observable.params.id; const raw = await fetch(`${API}/tasks/${taskId}`) .then(r => r.ok ? r.json() : r.json().then(e => ({error: e.detail ?? `HTTP ${r.status}`}))) .catch(e => ({error: String(e)})); ``` ```js if (raw.error) { display(html`
⚠️ ${raw.error}
`); } else { const name = raw.title || taskId; const shortName = name.length > 60 ? name.slice(0, 60) + "…" : name; display(html`

Task · ${shortName}

`); display(html`

← Tasks  |  ← Token Cost

`); display(html`
Status ${statusControl({ entity: raw, type: "task", statuses: TASK_STATUSES, onSaved: () => setTimeout(() => location.reload(), 450), })}
Priority${raw.priority ?? "—"}
Assignee${raw.assignee ?? "—"}
`); const FIELD_ORDER = [ "id","title","status","priority","assignee", "workstream_id","due_date","needs_human","intervention_note", "created_at","updated_at", ]; const HIDDEN_FIELDS = ["description"]; const taskContent = (raw.description ?? "").trim(); if (taskContent) { display(html`

Task Content

${taskContent}
`); } else { display(html`

No task content recorded.

`); } const rows = FIELD_ORDER.map(k => fieldRow(k, raw[k] ?? null)); for (const k of Object.keys(raw)) { if (!FIELD_ORDER.includes(k) && !HIDDEN_FIELDS.includes(k)) rows.push(fieldRow(k, raw[k])); } display(html`${rows}
`); } ```