|
1 | 1 | import { S, $, esc } from "./store"; |
2 | 2 | import { fileReviewState, fileFinished } from "./changes"; |
3 | 3 | import { navFileOrder, nextUnreviewed, wrapNextTarget, wrapPrevTarget } from "./seek"; |
4 | | -import { |
5 | | - fileFullySkimmed, |
6 | | - fileSkimReason, |
7 | | - isFileSkim, |
8 | | - isSkimGroupExpanded, |
9 | | - toggleSkimGroup, |
10 | | -} from "./skim"; |
11 | | -import { renderMarkdown, renderMarkdownInline } from "./markdown"; |
| 4 | +import { fileFullySkimmed, isSkimGroupExpanded } from "./skim"; |
| 5 | +import { renderMarkdown } from "./markdown"; |
12 | 6 | import { lineStats, walkthroughGroups, walkRows } from "./walkthrough"; |
13 | | -import type { WalkGroup, WalkRow, WalkFile } from "./walkthrough"; |
| 7 | +import type { WalkGroup, WalkRow } from "./walkthrough"; |
14 | 8 |
|
15 | 9 | // Whether the current review carries an agent-attached guide with at least one file. |
16 | 10 | export function hasGuide(): boolean { |
@@ -211,100 +205,21 @@ export function guideStale(): boolean { |
211 | 205 | ); |
212 | 206 | } |
213 | 207 |
|
214 | | -// The short skim reason for a fully-skimmed file, shown in the collapsed group: the file-level |
215 | | -// skimReason, else the distinct block reasons joined. "" when the agent gave none. |
216 | | -function skimReasonFor(path: string): string { |
217 | | - if (isFileSkim(path)) return fileSkimReason(path); |
218 | | - const reasons = [ |
219 | | - ...new Set( |
220 | | - (S.state?.changes ?? []) |
221 | | - .filter((c) => c.path === path && c.skim?.reason) |
222 | | - .map((c) => c.skim!.reason!.trim()) |
223 | | - .filter(Boolean), |
224 | | - ), |
225 | | - ]; |
226 | | - return reasons.join(", "); |
227 | | -} |
228 | | - |
229 | | -// One file row in the Overview list: path (dimmed dir, bright basename) + flag icon + |
230 | | -// ±counts + a read-only review-state badge on top, the guide's orientation beneath. |
231 | | -// Read-only by design — decisions stay where the diff is visible; clicking opens the file. |
232 | | -function overviewFileRow(f: WalkFile): string { |
233 | | - const badge = |
234 | | - f.state === "approved" |
235 | | - ? `<svg class="ic badge approved" title="Approved"><use href="#gly-check"></use></svg>` |
236 | | - : f.state === "changes-requested" |
237 | | - ? `<svg class="ic badge changes" title="Changes requested"><use href="#gly-flag"></use></svg>` |
238 | | - : `<svg class="ic badge pending" title="Pending review"><use href="#gly-dot"></use></svg>`; |
239 | | - return `<button class="go-file" data-i="${f.fileIndex}"> |
240 | | - <span class="go-file-top"> |
241 | | - <span class="go-file-path"><span class="fdir">${esc(f.dir)}</span><span class="fname">${esc(f.name)}</span></span> |
242 | | - ${f.flag ? `<svg class="ic crit" title="${esc(f.flag)}"><use href="#gly-flag"></use></svg>` : ""} |
243 | | - <span class="go-file-stats">${f.added ? `<i class="add">+${f.added}</i>` : ""}${f.removed ? `<i class="del">−${f.removed}</i>` : ""}${badge}</span> |
244 | | - </span> |
245 | | - ${f.orientation ? `<span class="go-file-sum">${renderMarkdownInline(f.orientation)}</span>` : ""} |
246 | | - </button>`; |
247 | | -} |
248 | | - |
249 | | -// A member of the collapsed Skimmed group: muted, no state badge (out of the flow), path + its |
250 | | -// skim reason. Clicking opens it like any file (the file/block skim strips render as issue 06). |
251 | | -function overviewSkimRow(f: WalkFile): string { |
252 | | - const reason = skimReasonFor(f.path); |
253 | | - return `<button class="go-file go-file-skim" data-i="${f.fileIndex}"> |
254 | | - <span class="go-file-top"> |
255 | | - <span class="go-file-path"><span class="fdir">${esc(f.dir)}</span><span class="fname">${esc(f.name)}</span></span> |
256 | | - <span class="go-file-stats"><svg class="ic skim" title="Skimmed"><use href="#gly-collapse-all"></use></svg></span> |
257 | | - </span> |
258 | | - ${reason ? `<span class="go-file-sum">${esc(reason)}</span>` : ""} |
259 | | - </button>`; |
260 | | -} |
261 | | - |
262 | | -// The collapsed "Skimmed · N files" group: a clickable header (caret + count) with its file rows |
263 | | -// shown only when expanded. Mirrors the tree/walkthrough group; per-session expand state. |
264 | | -function overviewSkimGroup(grp: WalkGroup): string { |
265 | | - const open = isSkimGroupExpanded(); |
266 | | - return `<div class="go-grp go-grp-skim"> |
267 | | - <button class="go-grp-h go-grp-toggle" data-skimgrp="1"> |
268 | | - <svg class="ic chev${open ? " open" : ""}"><use href="#gly-chevron"></use></svg> |
269 | | - <span class="go-grp-name">Skimmed</span> |
270 | | - <span class="go-grp-meta">${grp.total} file${grp.total === 1 ? "" : "s"}</span> |
271 | | - </button> |
272 | | - ${open ? grp.files.map(overviewSkimRow).join("") : ""} |
273 | | - </div>`; |
274 | | -} |
275 | | - |
276 | | -// Render the Overview page into #diff: overview → optional PR description → the per-file |
277 | | -// list grouped by category → Start. Called by render() when overviewOpen && hasGuide(). |
278 | | -// Binds the Start button + per-file jumps. |
| 208 | +// Render the Overview page into #diff: overview → optional PR description → Start. No file |
| 209 | +// list — the sidebar (tree/walkthrough, including the Skimmed group) already lists every file, |
| 210 | +// so repeating them here was redundant; per-file orientation renders in each file's header. |
| 211 | +// Called by render() when overviewOpen && hasGuide(). |
279 | 212 | export function renderOverview() { |
280 | 213 | const g = S.state.guide!; |
281 | | - const fileList = walkGroups() |
282 | | - .map((grp) => |
283 | | - grp.skimmed |
284 | | - ? overviewSkimGroup(grp) |
285 | | - : `<div class="go-grp"> |
286 | | - <div class="go-grp-h"><span class="go-grp-name">${esc(grp.category)}</span><span class="go-grp-meta">${grp.total} file${grp.total === 1 ? "" : "s"}${grp.added || grp.removed ? ` · <span class="go-grp-counts">${grp.added ? `<i class="add">+${grp.added}</i>` : ""}${grp.removed ? `<i class="del">−${grp.removed}</i>` : ""}</span>` : ""}</span></div> |
287 | | - ${grp.files.map(overviewFileRow).join("")} |
288 | | - </div>`, |
289 | | - ) |
290 | | - .join(""); |
291 | 214 | const title = g.title || S.state.target || "Review"; |
292 | 215 | $("diff").innerHTML = `<div class="guide-overview"><div class="go-card"> |
293 | 216 | <h1>${esc(title)}</h1> |
294 | 217 | <div class="go-sub">${esc(S.state.mode)} · ${esc(S.state.session)} · ${S.state.files.length} files</div> |
295 | 218 | ${guideStale() ? `<div class="go-stale"><svg class="ic"><use href="#gly-warn"></use></svg> This guide was generated for an earlier version of the diff. Regenerate it and restart the desk with <code>--guide</code> to refresh.</div>` : ""} |
296 | 219 | <div class="go-overview md">${renderMarkdown(g.overview)}</div> |
297 | 220 | ${g.prDescription ? `<div class="go-pr"><b>PR description</b><div class="md">${renderMarkdown(g.prDescription)}</div></div>` : ""} |
298 | | - ${fileList ? `<div class="label go-files-h">Files in this review</div><div class="go-files">${fileList}</div>` : ""} |
299 | 221 | <div class="go-actions"><button class="btn primary" id="guideStart">Start Review <kbd>↵</kbd></button></div> |
300 | 222 | </div></div>`; |
301 | 223 | const start = $("diff").querySelector("#guideStart") as HTMLButtonElement | null; |
302 | 224 | if (start) start.onclick = () => S.startGuided?.(); |
303 | | - $("diff") |
304 | | - .querySelectorAll<HTMLElement>(".go-file") |
305 | | - .forEach((el) => { |
306 | | - el.onclick = () => S.selectFile?.(Number(el.dataset.i)); |
307 | | - }); |
308 | | - const skimToggle = $("diff").querySelector("[data-skimgrp]") as HTMLButtonElement | null; |
309 | | - if (skimToggle) skimToggle.onclick = () => toggleSkimGroup(); |
310 | 225 | } |
0 commit comments