╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ─────────────╮ │src/ui/Repo/Events.zig│ ╰──────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │310 }, │ │311 .fork => _ = (try evt.readRecordSubset(evt.Fork, struct { removed: bool }, DB, hash_kind, haxy_moment, arena, id)) orelse return null, │ │312 .grant => _ = (try evt.readRecordSubset(evt.Grant, struct { removed: bool }, DB, hash_kind, haxy_moment, arena, id)) orelse return null, │ │313 + .notify => _ = (try evt.readRecordSubset(evt.Notify, struct { removed: bool }, DB, hash_kind, haxy_moment, arena, id)) orelse return null,│ │314 .discuss => { │ │315 const record = (try evt.readRecordSubset(evt.Discussion, Authored, DB, hash_kind, haxy_moment, arena, id)) orelse return null; │ │316 item.author = try ui.Author.initFromEmail(admin_moment, arena, record.author_email); │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ─────────────╮ │src/ui/Repo/Header.zig│ ╰──────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │173 const new_repo_link = try ui.inPageTabLink(session, new_repo_route, current_tag == .repo_repo_new); │ │174 const new_user_route = ui.RoutablePage{ .repo_user_new = Array.from(identity) orelse return error.RouteTooLong }; │ │175 const new_user_link = try ui.inPageTabLink(session, new_user_route, current_tag == .repo_user_new); │ │176 - const user_route = ui.RoutablePage{ .repo_user = Array.from(identity) orelse return error.RouteTooLong }; │ │176 + const user_route = ui.RoutablePage{ .repo_user = .{ .name = Array.from(identity) orelse return error.RouteTooLong } };│ │177 const user_link = try ui.inPageTabLink(session, user_route, current_tag == .repo_user); │ │178 │ │179 // the tab matching the current page is focused initially; matching by │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │358 // user tab. local mode has no users, so it has none. │ │359 if (session.data.host_kind == .server) { │ │360 const label = ui.UserSettings.tabLabel(session); │ │361 - var text_box = try wgt.TextBox.init(allocator, label, .{ .border = .single, .round_corners = true, .wrap_kind = .none }); │ │361 + const count_label = try ui.UserSettings.tabBottomLabel(session); │ │362 + var text_box = try wgt.TextBox.init(allocator, label, .{ .border = .single, .round_corners = true, .wrap_kind = .none, .bottom_label = .{ .text = count_label } });│ │363 errdefer text_box.deinit(allocator); │ │364 text_box.getFocus().mode = .all; │ │365 text_box.getFocus().kind = .{ .custom = user_link }; │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────╮ │368 try tabs_box.children.put(allocator, text_box.getFocus().id, .{ │ │369 .widget = .{ .text_box = text_box }, │ │370 .rect = null, │ │370 - .min_size = .{ .width = label.len + 2, .height = null }, │ │371 + .min_size = .{ .width = @max(label.len, count_label.len) + 2, .height = null },│ │372 }); │ │373 } │ │374 │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ─────────────╮ │src/ui/Repo/Issues.zig│ ╰──────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────╮ │32 assignees: []const ui.Assignee = &.{}, │ │33 // whether the viewer may change the thread, computed here so the web ui has it│ │34 can_modify: bool = false, │ │35 + // the viewer's notify button, null when hidden │ │36 + notify_action: ?ui.NotifyAction = null, │ │37 }; │ │38 │ │39 pub const Entry = IssueWithId; │ ╰───────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ──────────────╮ │src/ui/Repo/Patches.zig│ ╰───────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────╮ │150 assignees: []const ui.Assignee = &.{}, │ │151 // whether the viewer may change the thread, computed here so the web ui has it│ │152 can_modify: bool = false, │ │153 + // the viewer's notify button, null when hidden │ │154 + notify_action: ?ui.NotifyAction = null, │ │155 draft: bool = false, │ │156 revision_oid: []const u8 = "", │ │157 base_oid: []const u8 = "", │ ╰────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │384 │ │385 pub fn publishDraft(data: *const Self, session: *ui.Session, allocator: std.mem.Allocator, author: evt.CommitAuthor, id: []const u8) !void {│ │386 const io = session.io orelse return error.NotFound; │ │385 - const users_dir = session.users_dir orelse return error.NotFound; │ │387 + const server = switch (session.eventHost()) { │ │388 + .server => |server| server, │ │389 + .local => return error.NotFound, │ │390 + }; │ │391 const admin_repo = session.admin_repo orelse return error.NotFound; │ │392 const repo_source = data.repo_source orelse return error.NotFound; │ │393 const repo_id = data.repo_id orelse return error.NotFound; │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │398 var target_repo = try rp.AnyRepo(.xit, .{}).open(io, allocator, repo_source.localInitOpts()); │ │399 defer target_repo.deinit(io, allocator); │ │400 switch (target_repo) { │ │396 - inline else => |*repo| try pch.publish(repo.self_repo_opts, io, allocator, users_dir, admin_repo, repo, .{│ │401 + inline else => |*repo| try pch.publish(repo.self_repo_opts, io, allocator, server, admin_repo, repo, .{ │ │402 .id = id_hex, │ │403 .user_id = user_id, │ │404 .repo_id = repo_id, │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │410 │ │411 pub fn mergePatch(data: *const Self, session: *ui.Session, allocator: std.mem.Allocator, author: evt.CommitAuthor, id: []const u8, revision: evt.Patch.MergeRevision) !void {│ │412 const io = session.io orelse return error.NotFound; │ │408 - const users_dir = session.users_dir orelse return error.NotFound; │ │413 + const server = switch (session.eventHost()) { │ │414 + .server => |server| server, │ │415 + .local => return error.NotFound, │ │416 + }; │ │417 const repo_source = data.repo_source orelse return error.NotFound; │ │418 if (repo_source.repo_kind != .xit) return error.NotFound; │ │419 const patch_id = evt.parseEventId(id) catch return error.NotFound; │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │422 var target_repo = try rp.AnyRepo(.xit, .{}).open(io, allocator, repo_source.localInitOpts()); │ │423 defer target_repo.deinit(io, allocator); │ │424 switch (target_repo) { │ │417 - inline else => |*repo| try pch.mergeAndRemoveFork(repo.self_repo_opts, io, allocator, users_dir, repo, .{│ │425 + inline else => |*repo| try pch.mergeAndRemoveFork(repo.self_repo_opts, io, allocator, server, repo, .{ │ │426 .id = id_hex, │ │427 .revision = revision, │ │428 .author = author, │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯