╭ changed ─────────────╮ │src/ui/Repo/Header.zig│ ╰──────────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭───────────────────────────────────────────────────────────────────────────────────╮ │25 // the issues tab's tag filter, url-encoded ("" = unfiltered), so the tab links│ │26 // back to the filtered list. │ │27 issues_tag: []const u8, │ │28 +discussions_tag: []const u8, │ │29 │ │30 const Self = @This(); │ │31 │ ╰───────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │31 -pub fn init(arena: *std.heap.ArenaAllocator, name: []const u8, owner_name: []const u8, ref_or_oid: RefOrOid, ref_or_oid_value: []const u8, issues_tag: []const u8) !Self { │ │32 +pub fn init(arena: *std.heap.ArenaAllocator, name: []const u8, owner_name: []const u8, ref_or_oid: RefOrOid, ref_or_oid_value: []const u8, issues_tag: []const u8, discussions_tag: []const u8) !Self {│ │33 return .{ │ │34 .name = name, │ │35 .owner_name = owner_name, │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────╮ │38 .ref_or_oid = ref_or_oid, │ │39 .ref_or_oid_value = ref_or_oid_value,│ │40 .issues_tag = issues_tag, │ │41 + .discussions_tag = discussions_tag, │ │42 }; │ │43 } │ │44 │ ╰─────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │122 const refs_link = try std.fmt.allocPrint(aa, "ai:{s}", .{try refs_route.toUrl(session.page_arena)}); │ │123 const issues_route = ui.RoutablePage.repoIssuesRoute(identity, .open, data.issues_tag, "") orelse return error.RouteTooLong; │ │124 const issues_link = try std.fmt.allocPrint(aa, "ai:{s}", .{try issues_route.toUrl(session.page_arena)}); │ │125 + const discussions_route = ui.RoutablePage.repoDiscussionsRoute(identity, data.discussions_tag, "") orelse return error.RouteTooLong;│ │126 + const discussions_link = try std.fmt.allocPrint(aa, "ai:{s}", .{try discussions_route.toUrl(session.page_arena)}); │ │127 const events_route = ui.RoutablePage.repoEventsRoute(identity, .active, null, "") orelse return error.RouteTooLong; │ │128 const events_link = try std.fmt.allocPrint(aa, "ai:{s}", .{try events_route.toUrl(session.page_arena)}); │ │129 const settings_route = ui.RoutablePage{ .repo_settings = Array.from(identity) orelse return error.RouteTooLong }; │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────╮ │137 .repo_commits => commits_link, │ │138 .repo_refs => refs_link, │ │139 .repo_issues => issues_link, │ │140 + .repo_discussions => discussions_link,│ │141 .repo_events => events_link, │ │142 .repo_settings => settings_link, │ │143 .repo_auth => auth_link, │ ╰───────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │202 .widget = .{ .text_box = text_box }, │ │203 .rect = null, │ │204 .min_size = .{ .width = "issues".len + 2, .height = null }, │ │205 + }); │ │206 + } │ │207 + │ │208 + // discussions tab │ │209 + { │ │210 + var text_box = try wgt.TextBox(ui.Widget).init(allocator, "discussions", .{ .border_style = .single, .rounded_corners = true, .wrap_kind = .none });│ │211 + errdefer text_box.deinit(allocator); │ │212 + text_box.getFocus().focusable = true; │ │213 + text_box.getFocus().kind = .{ .custom = discussions_link }; │ │214 + try tab_ids.put(allocator, text_box.getFocus().id, {}); │ │215 + if (std.mem.eql(u8, discussions_link, current_link)) selected_tab = text_box.getFocus().id; │ │216 + try box.children.put(allocator, text_box.getFocus().id, .{ │ │217 + .widget = .{ .text_box = text_box }, │ │218 + .rect = null, │ │219 + .min_size = .{ .width = "discussions".len + 2, .height = null }, │ │220 }); │ │221 } │ │222 │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯