╭──────────╮ │← previous│ ╰──────────╯ ╭ changed ───────────────╮ │src/ui/Repo/Settings.zig│ ╰────────────────────────╯ ╭─────────────────────────────────────────────╮ │246 - pub fn clearGrid(self: *View) void {│ │372 + pub fn clearGrid(self: *Form) void {│ │373 self.scroll.clearGrid(); │ │374 } │ │375 │ ╰─────────────────────────────────────────────╯ ╭───────────────────────────────────────────╮ │250 - pub fn getGrid(self: View) ?Grid {│ │376 + pub fn getGrid(self: Form) ?Grid {│ │377 return self.scroll.getGrid(); │ │378 } │ │379 │ ╰───────────────────────────────────────────╯ ╭──────────────────────────────────────────────╮ │254 - pub fn getFocus(self: *View) *Focus {│ │380 + pub fn getFocus(self: *Form) *Focus {│ │381 return self.scroll.getFocus(); │ │382 } │ │383 │ ╰──────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────╮ │384 // up leaves the form from its first control │ │259 - pub fn atTop(self: View) bool { │ │385 + pub fn atTop(self: Form) bool { │ │386 const box = &self.scroll.child.center.child.box; │ │387 return box.focus.child_id == box.children.keys()[0];│ │388 } │ ╰─────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │408 try evt.updateRepo(io, allocator, users_dir, &owner_id, actor.author, parsed.name, name, description, access, discuss_role, issue_role, patch_role);│ │409 var buf: [ui.RoutablePage.repo_route_max_len]u8 = undefined; │ │410 const new_identity = std.fmt.bufPrint(&buf, "{s}:{s}", .{ parsed.owner, name }) catch return error.RouteTooLong; │ │285 - return ui.RoutablePage.repoRepoRoute(new_identity) orelse error.RouteTooLong; │ │411 + return ui.RoutablePage.repoSettingsRoute(new_identity) orelse error.RouteTooLong; │ │412 } │ │413 │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ added ──────────────╮ │src/ui/Repo/Roles.zig│ ╰─────────────────────╯ ╭ changed ────────╮ │src/ui/widget.zig│ ╰─────────────────╯ ╭──────────────────────────────────────────────────╮ │65 repo_events: ui.Repo.Events.View, │ │66 repo_undo: ui.Repo.Undo.View, │ │67 repo_settings: ui.Repo.Settings.View, │ │68 + repo_settings_form: ui.Repo.Settings.Form,│ │69 + repo_roles: ui.Repo.Roles.View, │ │70 repo_comment: ui.Repo.Comment.Item, │ │71 copyable_text: CopyableText, │ │72 patch_source: ui.Repo.Patches.Source, │ ╰──────────────────────────────────────────────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │117 // whether moving up should return to the page header │ │118 pub fn atTop(self: *Widget, root_focus: *Focus) bool { │ │119 return switch (self.*) { │ │118 - inline .home_about, .home_users, .user_repos, .flow_box_scroll, .new_repo, .new_user, .user_login, .user_settings, .quit, .repo_files, .repo_commits, .diff_view, .repo_refs, .repo_issues, .repo_patches, .repo_discussions, .repo_events, .repo_undo, .repo_settings => |*view| view.atTop(), │ │120 + inline .home_about, .home_users, .user_repos, .flow_box_scroll, .new_repo, .new_user, .user_login, .user_settings, .quit, .repo_files, .repo_commits, .diff_view, .repo_refs, .repo_issues, .repo_patches, .repo_discussions, .repo_events, .repo_undo, .repo_settings, .repo_settings_form, .repo_roles => |*view| view.atTop(),│ │121 inline .repo_patch_detail => |*view| view.atTop(root_focus), │ │122 else => false, │ │123 }; │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭ changed ──╮ │src/web.zig│ ╰───────────╯ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │156 switch (host) { │ │157 .server => |server| { │ │158 // "repo/new" and "user/new" come before "new", which would claim them │ │159 - const PostRoute = enum { login, logout, @"repo/new", @"user/new", user, repo, new, edit, remove, open, close, resolve, publish, merge, squash, attach, undo, clear }; │ │159 + const PostRoute = enum { login, logout, @"repo/new", @"user/new", user, settings, grant, revoke, promote, demote, new, edit, remove, open, close, resolve, publish, merge, squash, attach, undo, clear };│ │160 inline for (@typeInfo(PostRoute).@"enum".field_names) |name| { │ │161 const suffix = "/" ++ name; │ │162 if (std.mem.endsWith(u8, path, suffix)) { │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │167 .@"repo/new" => handleRepoNew(io, request, allocator, path, server.admin_repo_path, server.users_dir, server.session_store),│ │168 .@"user/new" => handleUserNew(io, request, allocator, path, server.admin_repo_path, server.users_dir, server.session_store),│ │169 .user => handleUserSettings(io, request, allocator, path, server.admin_repo_path, server.users_dir, server.session_store), │ │170 - .repo => handleRepoSettings(io, request, allocator, path, base, host), │ │170 + .settings => handleRepoSettings(io, request, allocator, path, host), │ │171 + .grant => handleRoles(io, request, allocator, base, host, .grant), │ │172 + .revoke => handleRoles(io, request, allocator, base, host, .revoke), │ │173 + .promote => handleRoles(io, request, allocator, base, host, .promote), │ │174 + .demote => handleRoles(io, request, allocator, base, host, .demote), │ │175 .new => handleNew(io, request, allocator, base, host), │ │176 .edit => handleEdit(io, request, allocator, base, host), │ │177 .remove => handleRemove(io, request, allocator, base, host), │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭──────╮ │next →│ ╰──────╯