╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ Discussions.zig ──────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭ find file ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╮ ╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╮ │ │ │http│ ssh │ │ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╯ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─╯
217 218 pub const View = thread.View(.discuss, Self); 219 pub const Detail = thread.Detail(.discuss, Self); 220 pub const detail_widget_name = "repo_discussion_detail"; 221 222 pub const Header = thread.Header; 223 224 const recent_tab_label = "recent"; 225 const labels_tab_label = "labels"; 226 const edit_tab_label = "edit"; 227 const reply_tab_label = "reply"; 228 const remove_tab_label = "remove"; 229 const new_tab_label = "new"; 230 231 // tabs switching between the discussions page's views 232 pub fn initHeader(allocator: std.mem.Allocator, session: *ui.Session, data: *const Self) !Header { 233 var header = try Header.init(allocator, session, data.search, " search "); 234 errdefer header.deinit(allocator); 235 const selected_index = View.viewIndex(data.view); 236 const page_selected = std.meta.activeTag(session.data.current_page) == .repo_discussions; 237 238 // recent discussions 239 { 240 const route = try thread.searchRoute(ui.RoutablePage.repoDiscussionsRoute(data.identity, ""), data.search); 241 const link = try ui.inPageTabLink(session, route, page_selected and selected_index == 0); 242 try header.addTab(allocator, recent_tab_label, try thread.countLabel(session, data.recent), link, 0); 243 } 244 245 // labels tab 246 { 247 const labels_route = try thread.searchRoute(ui.RoutablePage.repoThreadLabelsRoute(.discuss, data.identity), data.search); 248 const labels_link = try ui.inPageTabLink(session, labels_route, page_selected and selected_index == View.viewIndex(.labels)); 249 try header.addTab(allocator, labels_tab_label, "", labels_link, View.viewIndex(.labels)); 250 } 251 252 // new-discussion tab; an edit or comment url shows its tab in this place 253 { 254 const route = switch (data.view) { 255 .edit => ui.RoutablePage.repoThreadEditRoute(.discuss, data.identity, data.selected_id) orelse return error.RouteTooLong, 256 .new_comment => ui.RoutablePage.repoThreadCommentNewRoute(.discuss, data.identity, data.selected_id, data.comment_id) orelse return error.RouteTooLong, 257 .edit_comment => ui.RoutablePage.repoThreadCommentEditRoute(.discuss, data.identity, data.selected_id, data.comment_id) orelse return error.RouteTooLong, 258 .remove => ui.RoutablePage.repoThreadRemoveRoute(.discuss, data.identity, data.selected_id, data.comment_id) orelse return error.RouteTooLong, 259 else => ui.RoutablePage.repoThreadNewRoute(.discuss, data.identity) orelse return error.RouteTooLong, 260 }; 261 const link = try ui.inPageTabLink(session, route, page_selected and selected_index == View.viewIndex(.new)); 262 const label: []const u8 = switch (data.view) { 263 .edit => edit_tab_label, 264 .new_comment => reply_tab_label, 265 .edit_comment => edit_tab_label, 266 .remove => remove_tab_label, 267 else => new_tab_label, 268 }; 269 try header.addTab(allocator, label, "", link, View.viewIndex(.new)); 270 } 271 272 header.select(View.viewIndex(data.view)); 273 return header; 274 } 275