{data.name}
{data.blurb}
+From 1ed421ebaf74a42a7967192c044b845008e4c4b8 Mon Sep 17 00:00:00 2001
From: Claude loading comments comments error: {errorMessage(error)} too short: {query} searching… search failed: {error.message} pick a result loading… failed: {error.message} item {id} not found {data.blurb} loading #{p.id} detail error: {errorMessage(p.error)} {p.detail.body} {p.assignError} rename error: {p.renameError} close error: {p.closeError} post error: {p.postError} loading {filter} issues list error: {errorMessage(error)} row error: {rowError} select an issue loading labels labels error: {errorMessage(labels.error)} label error: {error} finding related help related help failed: {errorMessage(hits.error)} no related help Loading settings… Could not load settings: {settings.error.message} Saved: {s.name} · {s.theme} · {s.density}{guess ? " (saving…)" : ""} Save failed: {saveError} {error} Preview: {theme} / {density} too short: {context.query} searching… search failed: {context.searchError} pick a result loading… item {context.selected} not found failed: {context.itemError} {context.item.blurb} loading #{id} detail error: issue #{id} not found detail error: {context.detailError} {context.detail?.body} assign error: {errors.assign} rename error: {errors.rename} close error: {errors.close} related help failed: {relatedError} finding related help no related help labels error: {context.labelsError} loading labels label error: {context.errors.label} comments error: {context.commentsError} loading comments post error: {context.errors.post} loading {context.filter} issues list error: {context.listError} row error: {context.errors.row} select an issue Loading settings… Could not load settings: {context.loadError}
+ Saved: {saved.name} · {saved.theme} · {saved.density}
+ {saving ? " (saving…)" : ""}
+ Save failed: {context.saveError} {error}
+ Preview: {draft.theme} / {draft.density}
+
+ {comments.map((c, i) => (
+
+ );
+}
diff --git a/eval/reference/desk9/react/HelpPage.tsx b/eval/reference/desk9/react/HelpPage.tsx
new file mode 100644
index 00000000..beb7c919
--- /dev/null
+++ b/eval/reference/desk9/react/HelpPage.tsx
@@ -0,0 +1,86 @@
+import { useState } from "react";
+import { keepPreviousData, useQuery } from "@tanstack/react-query";
+import { fetchItem, search, type Hit } from "./api";
+
+// Opens on `initialQuery` with `initialSelected` chosen (both empty from the tab; a related hit opens it on its issue's
+// title).
+export default function HelpPage({ initialQuery = "", initialSelected = null }: { initialQuery?: string; initialSelected?: number | null }) {
+ const [query, setQuery] = useState(initialQuery);
+ const [selected, setSelected] = useState
+ {data.length} results for {query}
+
+
+ {data.map((hit: Hit) => (
+
+ {data.name}
+ #{p.detail.id} {p.detail.title}
+
+
+ {issues.map(issue => (
+
+ );
+}
diff --git a/eval/reference/desk9/react/IssuesPage.tsx b/eval/reference/desk9/react/IssuesPage.tsx
new file mode 100644
index 00000000..49ab25b4
--- /dev/null
+++ b/eval/reference/desk9/react/IssuesPage.tsx
@@ -0,0 +1,279 @@
+import { useEffect, useRef, useState } from "react";
+import { useQuery, useQueryClient } from "@tanstack/react-query";
+import { addComment, assign, closeIssue, fetchComments, fetchIssue, fetchIssues, renameIssue } from "./api";
+import type { Comment, Issue, IssueDetail as Detail } from "./api";
+import { errorIn, errorMessage, type VisitError } from "./errors";
+import IssueList from "./IssueList";
+import IssueDetail from "./IssueDetail";
+import type { Sending } from "./CommentList";
+
+type Filter = "open" | "closed";
+// Where a write was started: the detail's buttons or a list row's. Each place reports its own failures.
+type Origin = "detail" | "row";
+// a write still in the air: `seq` orders writes to the same issue, the latest one is what the issue shows
+type Guess
+ {shown?.map(l => (
+
+ )}
+
+ {hits.data.slice(0, 3).map(h => (
+
+ )}
+
+ {results.hits.length} results for {results.query}
+
+
+ {results.hits.map(hit => (
+
+ {context.item.name}
+ #{id} {shownTitle(context, id)}
+
+
+ {related.hits.slice(0, 3).map(hit => (
+
+ )}
+
+ {labels.map(label => (
+
+ )}
+
+ {context.comments.map((c, i) => (
+
+ )}
+
+ {shownRows(context).map(issue => (
+
+ )}
+
no help
no related help
(title {detail()?.title})
+archive error: {errorMessage(archived.error)}
+ ) : ( +loading archive
+ )} +restore error: {restoreError}
} ++ error: {errorMessage(error)}{" "} + +
+ ) : ( +loading
+ )} + {footer} +add error: {addError}
} +move error: {moveError}
} + {archiveError !== null &&archive error: {archiveError}
} +select a card
+in {COLUMN_NAME[card.column]}
+rename error: {p.renameError}
} ++ {done}/{total} done +
+ > + ) : p.checklistError ? ( +checklist error: {errorMessage(p.checklistError)}
+ ) : ( +loading checklist
+ )} +item error: {p.itemError}
} +loading archive
} { + {errored fallback(e) {archive error: {e.message}
} { +restore error: {restoreError}
+ }} +add error: {addError}
+ }} +select a card
+ } else { +in {colName(selCol)}
+rename error: {errFor(renameError, sel.id)}
+ }} +loading checklist
} { + {errored fallback(e) {checklist error: {e.message}
} { + // what this visit knows of each checklist it loaded: the card counts read it, so they agree with it + effect (checklist) { + if ($0 != null) { + let c = $0 + known := ks => knowAnswer(ks, c.card, c.items) + } + } + items key key = checklist == null ? [] : layItems(knownItems(w, checklist.card) ?? checklist.items, checklist.card, w) +{items.filter(it => it.done).length}/{items.length} done
+ }} + }} +item error: {errFor(itemError, sel.id)}
+ }} + }} +move error: {moveError}
+ }} + {if archiveError != "" { +archive error: {archiveError}
+ }} +loading
+ } else { + {errored fallback(e) { +error: {e.message}{" "}
+ } { + {if props.ans == null { +loading
+ } else { +{toggling().length}
+loading archive
+ ) : state.matches("failed") ? ( +archive error: {context.loadError}
+ ) : ( +restore error: {context.restoreError}
} ++ error: {failed}{" "} + +
+ ) : ( +loading
+ )} + {footer} +add error: {addError}
} +move error: {moveError}
} + {archiveError !== null &&archive error: {archiveError}
} + + ); +} diff --git a/eval/reference/board/xstate/board/Detail.tsx b/eval/reference/board/xstate/board/Detail.tsx new file mode 100644 index 00000000..f7300d44 --- /dev/null +++ b/eval/reference/board/xstate/board/Detail.tsx @@ -0,0 +1,87 @@ +import type { Column } from "../api"; +import { COLUMN_NAME, countItems, type ItemRow } from "./lay"; +import type { BoardActor } from "./BoardPage"; + +type Props = { + /** the selected card as the board shows it; null while nothing is selected */ + card: { id: number; title: string; column: Column } | null; + /** its checklist as shown; null until it has loaded */ + items: ItemRow[] | null; + checklistError: string | null; + titleInput: string; + itemInput: string; + renameError: string | null; + itemError: string | null; + send: BoardActor["send"]; +}; + +export default function Detail({ card, items, checklistError, titleInput, itemInput, renameError, itemError, send }: Props) { + if (!card) + return ( +select a card
+in {COLUMN_NAME[card.column]}
+rename error: {renameError}
} ++ {done}/{total} done +
+ > + ) : checklistError !== null ? ( +checklist error: {checklistError}
+ ) : ( +loading checklist
+ )} +item error: {itemError}
} +