roots: rename tickets to issues across the web ui
commit
8340a3broots: 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
Reviews
No reviews of this commit yet — record a verdict below.
Start a review
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