╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ──╮ │src/try.zig│ ╰───────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │198 } │ │199 │ │200 // commit the seed events and consume them into the database │ │204 - try evt.commitAndConsume(evt.admin_repo_opts, io, allocator, &repo, evt.events_ref, &events_to_consume); │ │201 + try evt.commitAndConsume(.xit, evt.admin_repo_opts, io, allocator, &repo, evt.events_ref, &events_to_consume, false);│ │202 │ │203 // every repo gets the same generated history, so build it once into a │ │204 // template repo and copy that to each repo's location below rather than │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │515 }, │ │516 }; │ │517 } │ │521 - try evt.commitAndConsume(.{}, io, allocator, &template_repo, evt.events_ref, &issue_events); │ │518 + try evt.commitAndConsume(.xit, .{}, io, allocator, &template_repo, evt.events_ref, &issue_events, false);│ │519 } │ │520 │ │521 // copy the template to each repo's on-disk location, named by its │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ─╮ │src/ui.zig│ ╰──────────╯ ╭─────────────────────────────────────────────────────────────────╮ │101 │ │102 pub const RefKind = enum { branch, tag }; │ │103 │ │104 - pub const IssuesView = enum { open, closed, tags }; │ │104 + pub const IssuesView = enum { open, closed, tags, new };│ │105 │ │106 pub const RefOrOid = enum { │ │107 branch, │ ╰─────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────╮ │308 } }; │ │309 } │ │310 │ │311 - // build a `.repo_issues` route showing "owner/name" (identity)'s tags view, │ │312 - // keeping the url-encoded `tag` filter ("" = unfiltered). │ │311 + // build a `.repo_issues` route showing tags view, keeping the url-encoded │ │312 + // `tag` filter ("" = unfiltered). │ │313 pub fn repoIssuesTagsRoute(identity: []const u8, tag: []const u8) ?RoutablePage {│ │314 return .{ .repo_issues = .{ │ │315 .name = Array(repo_route_max_len).from(identity) orelse return null, │ ╰──────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────╮ │318 } }; │ │319 } │ │320 │ │321 + // build a `.repo_issues` route showing new-issue form. │ │322 + pub fn repoIssuesNewRoute(identity: []const u8) ?RoutablePage { │ │323 + return .{ .repo_issues = .{ │ │324 + .name = Array(repo_route_max_len).from(identity) orelse return null, │ │325 + .view = .new, │ │326 + } }; │ │327 + } │ │328 + │ │329 // an inline, owned array of data. keeping it in the route (rather than a │ │330 // borrowed slice) makes RoutablePage a plain value: it can be copied, stored│ │331 // in history, and serialized without any arena tracking. │ ╰──────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │513 const w = word orelse return if (tag_value.len == 0) repoIssuesRoute(pair, .open, "", "") else null; │ │514 if (std.meta.stringToEnum(evt.Issue.Status, w)) |status| return repoIssuesRoute(pair, status, tag_value, "");│ │515 if (std.mem.eql(u8, w, "tags")) return repoIssuesTagsRoute(pair, tag_value); │ │516 + if (std.mem.eql(u8, w, "new")) return if (tag_value.len == 0) repoIssuesNewRoute(pair) else null; │ │517 return repoIssuesRoute(pair, .open, tag_value, w); │ │518 } │ │519 if (std.mem.eql(u8, tab, files_seg)) { │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ────────────╮ │src/ui/Auth/Login.zig│ ╰─────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────╮ │148 // expect; arrow_down does the same. │ │149 .arrow_down, .tab => if (current + 1 < self.nav_ids.len) { │ │150 root_focus.setFocus(self.nav_ids[current + 1]); │ │151 - return; │ │152 - }, │ │153 - // submit on Enter from any nav field — typical "press Enter in│ │154 - // a form to submit" UX │ │155 - .enter => { │ │156 - try self.submit(allocator, root_focus); │ │151 return; │ │152 }, │ │153 else => {}, │ ╰────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────╮ │155 │ │156 if (current == button_index) { │ │157 switch (key) { │ │158 + .enter => { │ │159 + try self.submit(allocator, root_focus); │ │160 + return; │ │161 + }, │ │162 .mouse => |mouse| { │ │163 if (inp.leftClickOn(root_focus, child_id, mouse)) {│ │164 try self.submit(allocator, root_focus); │ ╰────────────────────────────────────────────────────────────────────────────╯ ╭ changed ──────╮ │src/ui/Repo.zig│ ╰───────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────╮ │162 // route named none), so they end up viewing the same one and either's │ │163 // resolved ref can canonicalize the tab mirror urls below. no filesystem│ │164 // (wasm), nowhere to look, or a failed open: empty tabs. │ │165 - const files, const commits, const refs, const issues = blk: { │ │165 + const files, const commits, const refs, var issues = blk: { │ │166 read: { │ │167 const io = session.io orelse break :read; │ │168 const src = source orelse break :read; │ ╰──────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │195 try Issues.emptyResult(aa, repo_identity.identity, issues_tag, issues_selected, issues_view),│ │196 }; │ │197 }; │ │198 + issues.repo_source = source; │ │199 │ │200 // each tab mirror carries this page's route for that tab; tabs not targeted │ │201 // by the incoming route fall back to their root/first-page route. the files │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯