╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ──────────────╮ │src/ui/Repo/Patches.zig│ ╰───────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │609 var merged_set: ?DB.SortedSet(.read_only) = null; │ │610 - if (tagged) { │ │611 - if (try haxy_moment.getCursor(hash.hashInt(repo_opts.hash, evt.Patch.tag_status_to_id_set_key))) |tag_to_patches_cursor| { │ │612 - const tag_to_patches = try DB.SortedMap(.read_only).init(tag_to_patches_cursor); │ │613 - const decoded = std.Uri.percentDecodeInPlace(try aa.dupe(u8, empty.tag)); │ │614 - open_set = try thread.tagStatusSet(Self, DB, tag_to_patches, decoded, .open); │ │615 - closed_set = try thread.tagStatusSet(Self, DB, tag_to_patches, decoded, .closed); │ │616 - merged_set = try thread.tagStatusSet(Self, DB, tag_to_patches, decoded, .merged); │ │610 + if (labeled) { │ │611 + if (try haxy_moment.getCursor(hash.hashInt(repo_opts.hash, evt.Patch.label_status_to_id_set_key))) |label_to_patches_cursor| {│ │612 + const label_to_patches = try DB.SortedMap(.read_only).init(label_to_patches_cursor); │ │613 + const decoded = std.Uri.percentDecodeInPlace(try aa.dupe(u8, empty.label)); │ │614 + open_set = try thread.labelStatusSet(Self, DB, label_to_patches, decoded, .open); │ │615 + closed_set = try thread.labelStatusSet(Self, DB, label_to_patches, decoded, .closed); │ │616 + merged_set = try thread.labelStatusSet(Self, DB, label_to_patches, decoded, .merged); │ │617 } │ │618 } else if (try haxy_moment.getCursor(hash.hashInt(repo_opts.hash, evt.Patch.status_to_id_set_key))) |status_to_patches_cursor| { │ │619 const status_to_patches = try DB.SortedMap(.read_only).init(status_to_patches_cursor); │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────╮ │658 if (!try set.contains(order_key)) return error.NotFound; │ │659 conflicts_root = order_key; │ │660 } else { │ │661 - // the named patch must be in its windowed set (a tag url can name │ │662 - // an patch that doesn't carry the tag). │ │661 + // the named patch must be in its windowed set (a label url can name│ │662 + // an patch that doesn't carry the label). │ │663 const set = (switch (patch_event.event.status) { │ │664 .open => open_set, │ │665 .closed => closed_set, │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │712 else │ │713 try Comment.init(repo_opts.hash, arena, admin_moment, haxy_moment, empty.selected_id, empty.comment_id, comments_start);│ │714 │ │715 - const tags = try thread.loadTags(Self, repo_opts.hash, arena, haxy_moment); │ │715 + const labels = try thread.loadLabels(Self, repo_opts.hash, arena, haxy_moment); │ │716 │ │717 return .{ │ │718 .identity = empty.identity, │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────╮ │719 .default_target_branch = empty.default_target_branch,│ │720 - .tag = empty.tag, │ │720 + .label = empty.label, │ │721 .search = empty.search, │ │722 .selected_id = empty.selected_id, │ │723 .comment_id = empty.comment_id, │ ╰──────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────╮ │732 .theirs_picks = empty.theirs_picks, │ │733 .view = resolved_view, │ │734 .description_page = empty.description_page,│ │735 - .tags = tags, │ │735 + .labels = labels, │ │736 }; │ │737 } │ │738 │ ╰────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────╮ │900 const open_tab_label = "open"; │ │901 const closed_tab_label = "closed"; │ │902 const merged_tab_label = "merged"; │ │903 -const tags_tab_label = "tags"; │ │903 +const labels_tab_label = "labels"; │ │904 const edit_tab_label = "edit"; │ │905 const publish_tab_label = "publish";│ │906 const merge_tab_label = "merge"; │ ╰─────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1009 // a list tab per status, labeled with its listing's patch count │ │1010 const status_labels = [_][]const u8{ open_tab_label, closed_tab_label, merged_tab_label }; │ │1011 for ([_]Status{ .open, .closed, .merged }, status_labels, 0..) |status, status_label, index| { │ │1012 - const route = try thread.searchRoute(ui.RoutablePage.repoPatchesRoute(data.identity, status, data.tag, ""), data.search); │ │1012 + const route = try thread.searchRoute(ui.RoutablePage.repoPatchesRoute(data.identity, status, data.label, ""), data.search);│ │1013 const link = try ui.inPageTabLink(session, route, page_selected and selected_index == index); │ │1014 var label_buf: [64]u8 = undefined; │ │1015 const label = try thread.countLabel(&label_buf, status_label, data.window(status).*); │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │1016 try header.addTab(allocator, label, link, index); │ │1017 } │ │1018 │ │1019 - // tags tab, labeled with the active tag filter │ │1019 + // labels tab, showing the active label filter │ │1020 { │ │1021 - const tags_route = try thread.searchRoute(ui.RoutablePage.repoThreadTagsRoute(.patch, data.identity, data.tag), data.search); │ │1022 - const tags_link = try ui.inPageTabLink(session, tags_route, page_selected and selected_index == View.viewIndex(.tags)); │ │1023 - const label = if (data.tag.len == 0) tags_tab_label else blk: { │ │1024 - const decoded = std.Uri.percentDecodeInPlace(try aa.dupe(u8, data.tag)); │ │1025 - break :blk try std.fmt.allocPrint(aa, tags_tab_label ++ " ({s})", .{decoded}); │ │1021 + const labels_route = try thread.searchRoute(ui.RoutablePage.repoThreadLabelsRoute(.patch, data.identity, data.label), data.search);│ │1022 + const labels_link = try ui.inPageTabLink(session, labels_route, page_selected and selected_index == View.viewIndex(.labels)); │ │1023 + const label = if (data.label.len == 0) labels_tab_label else blk: { │ │1024 + const decoded = std.Uri.percentDecodeInPlace(try aa.dupe(u8, data.label)); │ │1025 + break :blk try std.fmt.allocPrint(aa, labels_tab_label ++ " ({s})", .{decoded}); │ │1026 }; │ │1027 - try header.addTab(allocator, label, tags_link, View.viewIndex(.tags)); │ │1027 + try header.addTab(allocator, label, labels_link, View.viewIndex(.labels)); │ │1028 } │ │1029 │ │1030 // new-patch tab; an edit or resolve url shows its tab in this place │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ───────────╮ │src/ui/Repo/Refs.zig│ ╰────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────╮ │141 pub const View = struct { │ │142 // a vertical box: the search sub-header above a horizontal box of two │ │143 // columns. each column is a fixed label above a │ │144 - // Scroll of a TagFlow, so the names wrap across the column and scroll │ │144 + // Scroll of a WordFlow, so the names wrap across the column and scroll │ │145 // beneath the label. focus points at the header or the active column and,│ │146 // in its flow, the selected name. │ │147 box: wgt.Box(ui.Widget), │ ╰───────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │235 // navigation brackets them: "← previous" off the first window, "next →" │ │236 // when more remain, each a full reload. │ │237 { │ │238 - var items: std.ArrayList(ui.widget.TagFlow.Item) = .empty; │ │238 + var items: std.ArrayList(ui.widget.WordFlow.Item) = .empty; │ │239 defer items.deinit(allocator); │ │240 if (data.prev) |p| try items.append(allocator, .{ .text = "← previous", .link = try windowLink(session.page_arena, identity, kind, p, search) });│ │241 for (data.names) |name| try items.append(allocator, .{ .text = name, .link = try refLink(session.page_arena, identity, kind, name) }); │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯