diff --git a/models/user/setting_options.go b/models/user/setting_options.go index 5867b908d1..7ae7f53191 100644 --- a/models/user/setting_options.go +++ b/models/user/setting_options.go @@ -24,4 +24,6 @@ const ( SettingEmailNotificationGiteaActionsDisabled = "disabled" SettingsKeyActionsConfig = "actions.config" + + SettingsKeyOrgRepoDefaultSort = "org.repo_default_sort" ) diff --git a/options/locale/locale_en-US.json b/options/locale/locale_en-US.json index e796064ce3..bfe84f8ae7 100644 --- a/options/locale/locale_en-US.json +++ b/options/locale/locale_en-US.json @@ -2744,6 +2744,10 @@ "org.settings.email": "Contact Email Address", "org.settings.website": "Website", "org.settings.location": "Location", + "org.settings.repo_default_sort": "Default repository sort", + "org.settings.repo_default_sort_default": "Instance default", + "org.settings.repo_default_sort_desc": "Used when visitors do not select a sort option on the organization repositories page.", + "org.settings.repo_default_sort_invalid": "Repository sort option is invalid.", "org.settings.permission": "Permissions", "org.settings.repoadminchangeteam": "Repository admin can add and remove access for teams", "org.settings.visibility": "Visibility", diff --git a/routers/web/org/home.go b/routers/web/org/home.go index e18a8de40f..c828dff298 100644 --- a/routers/web/org/home.go +++ b/routers/web/org/home.go @@ -55,7 +55,16 @@ func home(ctx *context.Context, viewRepositories bool) { var orderBy db.SearchOrderBy sortOrder := ctx.FormString("sort") if _, ok := repo_model.OrderByFlatMap[sortOrder]; !ok { - sortOrder = setting.UI.ExploreDefaultSort // TODO: add new default sort order for org home? + repoDefaultSort, err := getOrgRepoDefaultSort(ctx, org) + if err != nil { + ctx.ServerError("GetUserSetting", err) + return + } + if repoDefaultSort != "" { + sortOrder = repoDefaultSort + } else { + sortOrder = setting.UI.ExploreDefaultSort + } } ctx.Data["SortType"] = sortOrder orderBy = repo_model.OrderByFlatMap[sortOrder] diff --git a/routers/web/org/repo_default_sort.go b/routers/web/org/repo_default_sort.go new file mode 100644 index 0000000000..0d1cde975a --- /dev/null +++ b/routers/web/org/repo_default_sort.go @@ -0,0 +1,24 @@ +// Copyright 2026 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package org + +import ( + "code.gitea.io/gitea/models/organization" + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/services/context" +) + +func getOrgRepoDefaultSort(ctx *context.Context, org *organization.Organization) (string, error) { + defaultSort, err := user_model.GetUserSetting(ctx, org.ID, user_model.SettingsKeyOrgRepoDefaultSort) + if err != nil { + return "", err + } + if defaultSort != "" { + if _, ok := repo_model.OrderByFlatMap[defaultSort]; !ok { + return "", nil + } + } + return defaultSort, nil +} diff --git a/routers/web/org/setting.go b/routers/web/org/setting.go index ca1da6617e..00754bbf50 100644 --- a/routers/web/org/setting.go +++ b/routers/web/org/setting.go @@ -48,6 +48,13 @@ func Settings(ctx *context.Context) { ctx.Data["RepoAdminChangeTeamAccess"] = ctx.Org.Organization.RepoAdminChangeTeamAccess ctx.Data["ContextUser"] = ctx.ContextUser + repoDefaultSort, err := getOrgRepoDefaultSort(ctx, ctx.Org.Organization) + if err != nil { + ctx.ServerError("GetUserSetting", err) + return + } + ctx.Data["RepoDefaultSort"] = repoDefaultSort + if _, err := shared_user.RenderUserOrgHeader(ctx); err != nil { ctx.ServerError("RenderUserOrgHeader", err) return @@ -65,6 +72,9 @@ func SettingsPost(ctx *context.Context) { ctx.Data["CurrentVisibility"] = ctx.Org.Organization.Visibility if ctx.HasError() { + if repoDefaultSort, err := getOrgRepoDefaultSort(ctx, ctx.Org.Organization); err == nil { + ctx.Data["RepoDefaultSort"] = repoDefaultSort + } ctx.HTML(http.StatusOK, tplSettingsOptions) return } @@ -80,6 +90,19 @@ func SettingsPost(ctx *context.Context) { return } + repoDefaultSort := "" + if form.RepoDefaultSort != nil { + repoDefaultSort = *form.RepoDefaultSort + if repoDefaultSort != "" { + if _, ok := repo_model.OrderByFlatMap[repoDefaultSort]; !ok { + ctx.Data["Err_RepoDefaultSort"] = true + ctx.Data["RepoDefaultSort"] = repoDefaultSort + ctx.RenderWithErrDeprecated(ctx.Tr("org.settings.repo_default_sort_invalid"), tplSettingsOptions, &form) + return + } + } + } + opts := &user_service.UpdateOptions{ FullName: optional.FromPtr(form.FullName), Description: optional.FromPtr(form.Description), @@ -96,6 +119,20 @@ func SettingsPost(ctx *context.Context) { return } + if form.RepoDefaultSort != nil { + if repoDefaultSort == "" { + if err := user_model.DeleteUserSetting(ctx, org.ID, user_model.SettingsKeyOrgRepoDefaultSort); err != nil { + ctx.ServerError("DeleteUserSetting", err) + return + } + } else { + if err := user_model.SetUserSetting(ctx, org.ID, user_model.SettingsKeyOrgRepoDefaultSort, repoDefaultSort); err != nil { + ctx.ServerError("SetUserSetting", err) + return + } + } + } + log.Trace("Organization setting updated: %s", org.Name) ctx.Flash.Success(ctx.Tr("org.settings.update_setting_success")) ctx.Redirect(ctx.Org.OrgLink + "/settings") diff --git a/services/forms/org.go b/services/forms/org.go index 8a8106e8cf..b2395cd1fd 100644 --- a/services/forms/org.go +++ b/services/forms/org.go @@ -43,6 +43,7 @@ type UpdateOrgSettingForm struct { Location *string `binding:"MaxSize(50)"` MaxRepoCreation *int RepoAdminChangeTeamAccess *bool + RepoDefaultSort *string `binding:"MaxSize(50)"` } // Validate validates the fields diff --git a/templates/org/settings/options.tmpl b/templates/org/settings/options.tmpl index 2c17e13937..dee786b328 100644 --- a/templates/org/settings/options.tmpl +++ b/templates/org/settings/options.tmpl @@ -38,9 +38,18 @@ - {{if .SignedUser.IsAdmin}}
+{{ctx.Locale.Tr "org.settings.repo_default_sort_desc"}}
+