╭ changed ───────────────╮ │src/ui/widget/thread.zig│ ╰────────────────────────╯ ╭───────────╮ │← all files│ ╰───────────╯ ╭──────────╮ │← previous│ ╰──────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────╮ │2501 return &self.viewStack().children.values()[labels_view_index].word_flow;│ │2502 } │ │2503 │ │2501 - // no labels and no filter to clear, which shows the empty message │ │2504 + // no labels, which shows the empty message │ │2505 fn labelsEmpty(data: *const Self) bool { │ │2503 - return data.label.len == 0 and data.labels.len == 0; │ │2506 + return data.labels.len == 0; │ │2507 } │ │2508 │ │2509 // the non-confirmation form inside the stack │ ╰──────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────╮ │2738 false; │ │2739 if (enterable) root_focus.setFocus(self.box.children.keys()[stack_index]);│ │2740 } else if (key == .enter) { │ │2738 - if (try self.header().submittedText(allocator)) |submission| { │ │2739 - defer allocator.free(submission.text); │ │2740 - switch (submission.kind) { │ │2741 - .search => try self.submitSearch(submission.text), │ │2742 - .assignee => try self.submitAssignee(submission.text), │ │2743 - } │ │2741 + if (try self.header().submittedText(allocator)) |text| { │ │2742 + defer allocator.free(text); │ │2743 + try self.submitSearch(text); │ │2744 } │ │2745 } else { │ │2746 try self.header().input(allocator, key, root_focus); │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────╮ │2783 } │ │2784 } │ │2785 │ │2786 - // navigate to the typed query's results, keeping the label filter and the│ │2787 - // status list the page shows. an empty box clears a filtered page and │ │2788 - // does nothing on any other one. │ │2786 + // navigate to the typed query's results, keeping the status list the │ │2787 + // page shows. an empty box clears a filtered page and does nothing on │ │2788 + // any other one. │ │2789 fn submitSearch(self: *This, text: []const u8) !void { │ │2790 if (text.len == 0 and self.data.search == null) return; │ │2791 const selected = self.header().getSelectedIndex() orelse 0; │ ╰────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │2792 const status: Status = if (selected < status_count) splitStatus(selected) else @fromBackingInt(@intCast(0));│ │2793 - var route = listRoute(self.data.identity, status, self.data.label, "") orelse return; │ │2794 - const assignee = assigneeFilter(self.data); │ │2795 - if (assignee.len != 0) route = route.withEncodedAssignee(assignee) orelse return; │ │2793 + const route = listRoute(self.data.identity, status, "") orelse return; │ │2794 try self.session.navigate(route.withSearch(text) orelse return); │ │2795 } │ │2796 │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │2799 - // navigate to the issues assigned to the typed name or email, keeping │ │2800 - // the label, the search and the status list. an empty box clears the │ │2801 - // filter and does nothing on an unfiltered page. │ │2802 - fn submitAssignee(self: *This, typed: []const u8) !void { │ │2803 - const text = std.mem.trim(u8, typed, " \t"); │ │2804 - if (text.len == 0 and assigneeFilter(self.data).len == 0) return; │ │2805 - const selected = self.header().getSelectedIndex() orelse 0; │ │2806 - const status: Status = if (selected < status_count) splitStatus(selected) else @fromBackingInt(@intCast(0)); │ │2807 - var route = listRoute(self.data.identity, status, self.data.label, "") orelse return; │ │2808 - if (self.data.search) |search| route = route.withSearch(search) orelse return; │ │2809 - try self.session.navigate(route.withEncodedAssignee(try ui.urlEncodeRef(self.session.page_arena.allocator(), text)) orelse return);│ │2810 - } │ │2811 - │ │2797 // arrow keys move the label selection; up from the top row crosses to the │ │2798 // header tabs. │ │2799 fn labelsViewInput(self: *This, key: Key, root_focus: *Focus) void { │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │3023 }, │ │3024 } │ │3025 │ │3041 - const route = listRoute(self.data.identity, entryStatus(entry.*), "", entry.id) orelse return;│ │3026 + const route = listRoute(self.data.identity, entryStatus(entry.*), entry.id) orelse return; │ │3027 try self.session.navigate(route); │ │3028 } │ │3029 │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │3163 labels_input.clear(allocator); │ │3164 description_input.clear(allocator); │ │3165 │ │3181 - const route = listRoute(self.data.identity, @fromBackingInt(@intCast(0)), "", &event_id_hex) orelse return;│ │3166 + const route = listRoute(self.data.identity, @fromBackingInt(@intCast(0)), &event_id_hex) orelse return; │ │3167 try self.session.navigate(route); │ │3168 } │ │3169 │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │3204 try self.rememberThreadFeedback(failure, title, labels, description, target_branch); │ │3205 return; │ │3206 }; │ │3222 - const route = listRoute(self.data.identity, entryStatus(entry.*), "", entry.id) orelse return;│ │3207 + const route = listRoute(self.data.identity, entryStatus(entry.*), entry.id) orelse return; │ │3208 try self.session.navigate(route); │ │3209 return; │ │3210 } │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │3241 }, │ │3242 } │ │3243 │ │3259 - const route = listRoute(self.data.identity, entryStatus(entry.*), "", entry.id) orelse return;│ │3244 + const route = listRoute(self.data.identity, entryStatus(entry.*), entry.id) orelse return; │ │3245 try self.session.navigate(route); │ │3246 } │ │3247 │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │3276 if (!entryDraft(entry.*)) return; │ │3277 const author = ((try self.session.authorize(self.data.identity, .read, kind)) orelse return).author; │ │3278 try self.data.publishDraft(self.session, allocator, author, entry.id); │ │3294 - const route = listRoute(self.data.identity, @fromBackingInt(@intCast(0)), "", entry.id) orelse return;│ │3279 + const route = listRoute(self.data.identity, @fromBackingInt(@intCast(0)), entry.id) orelse return; │ │3280 try self.session.navigate(route); │ │3281 } else unreachable, │ │3282 .merge => if (comptime supports_merge) { │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯