diff --git a/frontend/dashboard.css b/frontend/dashboard.css index af77298..3d79b38 100644 --- a/frontend/dashboard.css +++ b/frontend/dashboard.css @@ -474,6 +474,12 @@ textarea { resize: vertical; min-height: 120px; } .completed-filed-actions button { min-height:44px; min-width:0; } #issue-sheet:has(.completed-filed-actions:not([hidden])) .issue-sheet-panel { padding-bottom:calc(110px + env(safe-area-inset-bottom)); } .issue-sheet-content { overflow-wrap:anywhere; white-space:pre-wrap; } +.checklist-completion { position:fixed; right:0; bottom:0; z-index:58; box-sizing:border-box; width:min(560px,100%); display:grid; grid-template-columns:minmax(0,1fr) repeat(2,minmax(0,auto)); align-items:center; gap:8px; padding:10px 12px calc(10px + env(safe-area-inset-bottom)); border-top:1px solid #4ade80; background:rgba(11,21,38,.98); overflow-wrap:anywhere; } +.checklist-completion[hidden] { display:none; } +.checklist-completion button { min-height:44px; min-width:0; } +#issue-sheet:has(.checklist-completion:not([hidden])) .issue-sheet-panel { padding-bottom:calc(118px + env(safe-area-inset-bottom)); } +#issue-sheet:has(.checklist-completion:not([hidden])) .work-session-nav { display:none; } +@media(max-width:420px) { .checklist-completion { grid-template-columns:1fr 1fr; } .checklist-completion span { grid-column:1 / -1; } } .issue-blockers { max-width:100%; overflow-x:hidden; margin:16px 0; padding:12px; border:1px solid #b45309; border-radius:12px; background:#291b0c; } .issue-blockers h2 { margin-top:0; } .issue-blocker-list { display:grid; gap:8px; } diff --git a/frontend/dashboard.js b/frontend/dashboard.js index 4f7a035..7fd0ec6 100644 --- a/frontend/dashboard.js +++ b/frontend/dashboard.js @@ -216,6 +216,7 @@ let selectedIssue = null; let selectedIssueOffline = false; let selectedIssueDetail = null; + let dismissedChecklistBody = null; let issueBlockerCandidates = []; let issueBlockerSearchTimer = null; let issueConversation = null; @@ -3398,9 +3399,22 @@ } } + function renderChecklistCompletion(detail) { + const interactive = !issueController.readOnly(selectedIssue) && detail?.state === 'open' && detail?.updated_at; + const completion = issueController.checklistCompletion(qs('#issue-sheet-body'), { + interactive, today:workSession.active(), offline:selectedIssueOffline, + dismissed:dismissedChecklistBody === detail?.body, + }); + const bar = qs('#checklist-completion'); + bar.hidden = !completion.visible; + qs('#checklist-completion-status').textContent = completion.status; + qs('#complete-checklist-issue').textContent = completion.label; + } + function renderIssueBody(detail) { - issueController.renderTasks(qs('#issue-sheet-body'), detail, - !issueController.readOnly(selectedIssue) && detail.state === 'open' && detail.updated_at); + const interactive = !issueController.readOnly(selectedIssue) && detail.state === 'open' && detail.updated_at; + issueController.renderTasks(qs('#issue-sheet-body'), detail, interactive); + renderChecklistCompletion(detail); } function applyIssueContent(editing, detail, confirmed) { @@ -3427,6 +3441,7 @@ qs('#issue-planning').inert = false; qs('#issue-handoff').inert = false; selectedIssue = item; + dismissedChecklistBody = null; issueMentions.dismiss(); selectedIssueOffline = Boolean(offlineDetail); selectedIssueDetail = null; @@ -3447,6 +3462,7 @@ qs('#completed-filed-progress').textContent = item.is_completed ? 'Completed Filed issue ' + (completedPosition + 1) + ' of ' + completedItems.length : ''; qs('#issue-sheet-body').textContent = ''; + qs('#checklist-completion').hidden = true; qs('#issue-labels').textContent = ''; qs('#issue-assignees').textContent = ''; qs('#issue-comments').textContent = ''; @@ -5609,6 +5625,14 @@ confirmed:applyIssueContent, restore:renderIssueBody, }); + qs('#complete-checklist-issue').addEventListener('click', () => { + qs('#close-issue').click(); + }); + qs('#keep-checklist-issue-open').addEventListener('click', () => { + dismissedChecklistBody = selectedIssueDetail?.body; + if (selectedIssueDetail) renderChecklistCompletion(selectedIssueDetail); + qs('#issue-sheet-body').focus(); + }); qs('#issue-planning').addEventListener('toggle', event => { if (event.currentTarget.open) loadIssuePlanning(); }); diff --git a/frontend/index.html b/frontend/index.html index 1016eb0..6c0cb3a 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -605,6 +605,11 @@
+