git-ents.gitmain
⌘K
foforge
commit 8340a3b
roots: rename tickets to issues across the web ui

The rail item, dashboard card, issues page, and palette placeholder all said Tickets while the composer said Issue; the entity is an issue, so every surface now says Issues.

Assisted-by: Claude:claude-fable-5

Joseph D. Carpinelli · 1 month ago

Reviews

No reviews of this commit yet — record a verdict below.

Start a review

verdict

crates/cli/ents-web/tests/router.rs @@ -428,13 +428,13 @@ .to_bytes(); let body = String::from_utf8(body.to_vec()).expect("utf8 html"); assert!(body.contains("Working tree")); - assert!(body.contains("Tickets")); + assert!(body.contains("Issues")); // The shell chrome renders on every page: the icon rail, the sticky // top bar, and the bar's palette search form. assert!(body.contains("class=\"rail\"")); assert!(body.contains("class=\"wb-bar\"")); assert!(body.contains("class=\"palette\"")); - assert!(body.contains("Jump to file, commit, ticket, member")); + assert!(body.contains("Jump to file, commit, issue, member")); } /// `roots.web-agnostic`: the shell's `.wb-bar` top bar names the served @@ -498,11 +498,11 @@ } /// `roots.web-agnostic`: the workbench dashboard (`GET /`) renders its -/// four sections -- Working tree, Needs attention, Tickets, History -- +/// four sections -- Working tree, Needs attention, Issues, History -- /// against a real repository, with real content in each: the dirty file /// shows up as a working-tree row, the seeded open comment as a /// needs-attention row (naming its anchored path), the seeded open issue -/// as a ticket, and the `HEAD` commit in the History card with its +/// as an issue, and the `HEAD` commit in the History card with its /// Scoped-Commits scope chip. #[tokio::test] async fn dashboard_renders_the_four_sections_with_real_content() { @@ -530,7 +530,7 @@ seed_issue(&router, &state, "Ship the desk", "open", "", "").await; let body = get_body(&router, "/").await; - for header in ["Working tree", "Needs attention", "Tickets", "History"] { + for header in ["Working tree", "Needs attention", "Issues", "History"] { assert!(body.contains(header), "the {header} section renders"); } assert!( @@ -543,7 +543,7 @@ ); assert!( body.contains("Ship the desk"), - "the open issue lists as a ticket" + "the open issue lists on the Issues card" ); assert!( body.contains(&format!("/commit/{oid}")), @@ -578,7 +578,7 @@ let router = ents_web::router(state); let body = get_body(&router, "/").await; - for header in ["Working tree", "Needs attention", "Tickets", "History"] { + for header in ["Working tree", "Needs attention", "Issues", "History"] { assert!(body.contains(header), "the {header} section renders"); } assert!(!body.contains("/commit/"), "no placeholder commit links"); @@ -898,7 +898,7 @@ /// The master-detail splits (`crate::pages::layout_split`): a blob view /// renders a `.tree` sidebar with its own entry active and its siblings /// listed; a commit page renders the compact history sidebar with the -/// viewed commit active; the tickets page renders its list beside the +/// viewed commit active; the issues page renders its list beside the /// composer. #[tokio::test] async fn split_pages_render_a_sidebar_with_the_current_selection_active() { @@ -941,7 +941,7 @@ ); let issues = get_body(&router, "/issues").await; - assert!(issues.contains("class=\"tree\""), "the tickets page splits"); + assert!(issues.contains("class=\"tree\""), "the issues page splits"); assert!( issues.contains("Split the panes") && issues.contains("Open an Issue"), "the list and the composer render side by side" @@ -949,7 +949,7 @@ let detail = get_body(&router, &format!("/issues/{issue_id}")).await; assert!( detail.contains(&format!("class=\"active\" href=\"/issues/{issue_id}\"")), - "the viewed ticket highlights in the sidebar" + "the viewed issue highlights in the sidebar" ); } @@ -1026,7 +1026,7 @@ } /// The icon rail (`crate::pages::layout_shell`) names every top-level page -/// family truthfully: Dashboard, Code, Review, Tickets, Threads, then the +/// family truthfully: Dashboard, Code, Review, Issues, Threads, then the /// meta and account items -- and the issues family renders as its own rail /// item, never behind the `META_SECTIONS` rail (see `crate::pages::mod`'s /// own doc). @@ -1053,7 +1053,7 @@ "the rail links {href}" ); } - for label in ["Dashboard", "Code", "Review", "Tickets", "Threads"] { + for label in ["Dashboard", "Code", "Review", "Issues", "Threads"] { assert!( overview.contains(&format!("title=\"{label}\"")), "the rail tooltips {label}"
crates/cli/ents-web/src/pages/dashboard.rs @@ -1,8 +1,8 @@ //! `GET /`: the workbench dashboard -- `git status` for review and -//! ticketing (`docs/web-workbench-plan.adoc`'s Phase C home page). Four +//! issue tracking (`docs/web-workbench-plan.adoc`'s Phase C home page). Four //! sections on a `.desk` grid: the working tree's changed files (a live //! `gix` status of the repository at `state.path`), a needs-attention -//! feed of open comment threads, the open tickets, and a full-width +//! feed of open comment threads, the open issues, and a full-width //! History card of recent commits with their Scoped-Commits scope chips. //! The `README` this page used to render moved to `crate::pages::files`'s //! root listing -- the dashboard is a work surface, not a document viewer. @@ -75,7 +75,7 @@ div.desk { (working_tree_card(changes.as_deref())) (attention) - (tickets_card(&open_issues)) + (issues_card(&open_issues)) } div.desk-wide { (history_card(&history_title, &history)) @@ -111,7 +111,7 @@ /// The "Needs attention" card: every open comment thread, each linking to /// its own page and naming where its anchor lands ([`comment_where`]), -/// closed by an open-tickets count line when any tickets are open. +/// closed by an open-issues count line when any issues are open. fn attention_card<O: Find>( state: &AppState<O>, open_comments: &[(String, ents_forge::comment::Comment)], @@ -133,7 +133,7 @@ a.attention-row href="/issues" { span.what { (open_issue_count) - @if open_issue_count == 1 { " open ticket" } @else { " open tickets" } + @if open_issue_count == 1 { " open issue" } @else { " open issues" } } } } @@ -141,17 +141,17 @@ } } -/// The "Tickets" card: every open issue linking to its own page, with a -/// ghost "New" button into the Tickets page's own composer. -fn tickets_card(open_issues: &[(String, ents_forge::Issue)]) -> Markup { +/// The "Issues" card: every open issue linking to its own page, with a +/// ghost "New" button into the Issues page's own composer. +fn issues_card(open_issues: &[(String, ents_forge::Issue)]) -> Markup { html! { section.card { div.card-header { - "Tickets" + "Issues" a.btn.btn-ghost href="/issues" { "New" } } @if open_issues.is_empty() { - div.card-row.muted { "No open tickets." } + div.card-row.muted { "No open issues." } } @for (id, issue) in open_issues { a.attention-row href={ "/issues/" (id) } { @@ -191,7 +191,7 @@ } /// A body's first line, ellipsized past [`WHAT_LIMIT`] characters -- what -/// a `.what` row shows of a comment or ticket. +/// a `.what` row shows of a comment or issue. fn what_line(text: &str) -> String { let line = text.lines().next().unwrap_or(""); let mut shown: String = line.chars().take(WHAT_LIMIT).collect();
crates/cli/ents-web/src/pages/issues.rs @@ -29,7 +29,7 @@ use crate::session::Session; use crate::state::AppState; -/// `GET /issues`: the Tickets split (`crate::pages::layout_split`) -- +/// `GET /issues`: the Issues split (`crate::pages::layout_split`) -- /// every issue recorded in this repository (`ents_forge::issue::list_all`) /// as the sidebar, its state/assignees/labels on each row's own locator /// line, beside the new-issue composer in the pane. @@ -54,14 +54,14 @@ &super::RepoHeader::from_state(&state), &super::identity_label(&state), super::Tab::Issues, - "Tickets", + "Issues", issues_sidebar(&rows, None), html! { div.readable { (crate::render::unreadable_disclosure(&failures)) @if rows.is_empty() { (super::blankslate( - "No tickets yet", + "No issues yet", html! { "Open one with the form below." }, )) } @@ -73,13 +73,13 @@ )) } -/// The Tickets split's `.tree` sidebar: every issue as a two-line row -- +/// The Issues split's `.tree` sidebar: every issue as a two-line row -- /// its title, then a muted locator of its state, assignees, and labels -- /// linking to its own page, `active` naming the viewed issue's id. fn issues_sidebar(rows: &[(String, ents_forge::Issue)], active: Option<&str>) -> Markup { html! { @if rows.is_empty() { - span.tree-note { "No tickets yet." } + span.tree-note { "No issues yet." } } @for (id, issue) in rows { a.active[active == Some(id.as_str())] href={ "/issues/" (id) } { @@ -140,7 +140,7 @@ let body = crate::asciidoc::to_html(&issue.body).unwrap_or_else(|_| html! { p { (issue.body) } }); let return_to = format!("/issues/{id}"); - // Best-effort: the sidebar listing every ticket beside this one is + // Best-effort: the sidebar listing every issue beside this one is // navigation chrome, never a reason to fail the issue's own page. let (rows, _unreadable) = issue::list_all(state.refs.as_ref(), &*state.objects()).unwrap_or_default();
crates/cli/ents-web/src/pages/mod.rs @@ -17,7 +17,7 @@ //! carrying its own top-level entry (see `Tab`'s own doc); [`meta`] is that //! group's `GET /meta` landing page. [`commits`] and [`issues`] are rail //! items of their own -- `Tab::Commits` (Review) and `Tab::Issues` -//! (Tickets) in [`layout`]'s icon rail, alongside the dashboard, code, +//! (Issues) in [`layout`]'s icon rail, alongside the dashboard, code, //! threads, and meta items. [`search`] renders with no rail item active at //! all; it is reached from the `.wb-bar`'s own `.palette` search form //! rather than any rail item. @@ -111,7 +111,7 @@ /// the horizontal tab strip became the vertical icon rail, but the /// "handler names its own section" contract is unchanged). The rail reads, /// top to bottom: Dashboard (`Overview`), Code (`Files`), Review -/// (`Commits`), Tickets (`Issues`), Threads (`Comments`); then, past the +/// (`Commits`), Issues, Threads (`Comments`); then, past the /// spacer, Repo & governance (`Meta`) and Account. `Meta` covers five page /// families ([`super::members`], [`super::effects`], [`super::toolchains`], /// [`super::redactions`], [`super::inbox`]) behind one rail item and the @@ -259,7 +259,7 @@ /// The workbench shell itself (the "Proposal C" chrome, /// `docs/web-workbench-plan.adoc`): a `.wb` grid pairing the sticky icon -/// `.rail` (Dashboard / Code / Review / Tickets / Threads, then governance +/// `.rail` (Dashboard / Code / Review / Issues / Threads, then governance /// and account past the spacer -- see [`Tab`]'s own doc) with a `.wb-main` /// column whose sticky `.wb-bar` top bar names the served repository and /// its branch pill, carries the `.palette` search form (a plain GET to @@ -294,7 +294,7 @@ (rail_link(active, Tab::Overview, "/", "Dashboard", "i-home")) (rail_link(active, Tab::Files, "/files", "Code", "i-files")) (rail_link(active, Tab::Commits, "/commits", "Review", "i-commit")) - (rail_link(active, Tab::Issues, "/issues", "Tickets", "i-issue")) + (rail_link(active, Tab::Issues, "/issues", "Issues", "i-issue")) (rail_link(active, Tab::Comments, "/comments", "Threads", "i-comment")) span.spacer {} (rail_link(active, Tab::Meta, "/meta", "Repo & governance", "i-meta")) @@ -310,7 +310,7 @@ } form.palette method="get" action="/search" { (crate::assets::icon_use("i-search")) - input type="search" name="q" placeholder="Jump to file, commit, ticket, member…" aria-label="Search"; + input type="search" name="q" placeholder="Jump to file, commit, issue, member…" aria-label="Search"; kbd { "⌘K" } } a.id-chip href="/account" { (identity) } @@ -359,7 +359,7 @@ /// Wrap `title`, `sidebar`, and `pane` in the master-detail split every /// selection-heavy page family renders through ([`super::files`]'s tree /// beside a blob, [`super::commits`]'s compact history beside a diff, -/// [`super::issues`]'s ticket list beside a ticket): the workbench chrome +/// [`super::issues`]'s issue list beside an issue): the workbench chrome /// ([`layout_shell`]) around a full-bleed `.split` grid -- a sticky /// `nav.tree` sidebar on the left, a padded `main.pane` (carrying the /// page's own `.page-header` title and `pane` body) on the right. Every