Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow package version sorting #21453

Merged
merged 12 commits into from
Oct 23, 2022
19 changes: 17 additions & 2 deletions models/packages/container/search.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ type ImageTagsSearchOptions struct {
PackageID int64
Query string
IsTagged bool
Sort packages.VersionSort
db.Paginator
}

Expand Down Expand Up @@ -195,12 +196,26 @@ func (opts *ImageTagsSearchOptions) toConds() builder.Cond {
return cond
}

func (opts *ImageTagsSearchOptions) configureOrderBy(e db.Engine) {
switch opts.Sort {
case packages.SortVersionDesc:
e.Desc("package_version.version")
case packages.SortVersionAsc:
e.Asc("package_version.version")
case packages.SortCreatedAsc:
e.Asc("package_version.created_unix")
default:
e.Desc("package_version.created_unix")
}
}

// SearchImageTags gets a sorted list of the tags of an image
func SearchImageTags(ctx context.Context, opts *ImageTagsSearchOptions) ([]*packages.PackageVersion, int64, error) {
sess := db.GetEngine(ctx).
Join("INNER", "package", "package.id = package_version.package_id").
Where(opts.toConds()).
Desc("package_version.created_unix")
Where(opts.toConds())

opts.configureOrderBy(sess)

if opts.Paginator != nil {
sess = db.SetSessionPagination(sess, opts)
Expand Down
23 changes: 17 additions & 6 deletions models/packages/package_version.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,17 @@ type SearchValue struct {
ExactMatch bool
}

type VersionSort = string

const (
SortNameAsc VersionSort = "name_asc"
SortNameDesc VersionSort = "name_desc"
SortVersionAsc VersionSort = "version_asc"
SortVersionDesc VersionSort = "version_desc"
SortCreatedAsc VersionSort = "created_asc"
SortCreatedDesc VersionSort = "created_desc"
)

// PackageSearchOptions are options for SearchXXX methods
// Besides IsInternal are all fields optional and are not used if they have their default value (nil, "", 0)
type PackageSearchOptions struct {
Expand All @@ -176,7 +187,7 @@ type PackageSearchOptions struct {
IsInternal util.OptionalBool
HasFileWithName string // only results are found which are associated with a file with the specific name
HasFiles util.OptionalBool // only results are found which have associated files
Sort string
Sort VersionSort
db.Paginator
}

Expand Down Expand Up @@ -254,15 +265,15 @@ func (opts *PackageSearchOptions) toConds() builder.Cond {

func (opts *PackageSearchOptions) configureOrderBy(e db.Engine) {
switch opts.Sort {
case "alphabetically":
case SortNameAsc:
e.Asc("package.name")
case "reversealphabetically":
case SortNameDesc:
e.Desc("package.name")
case "highestversion":
case SortVersionDesc:
e.Desc("package_version.version")
case "lowestversion":
case SortVersionAsc:
e.Asc("package_version.version")
case "oldest":
case SortCreatedAsc:
e.Asc("package_version.created_unix")
default:
e.Desc("package_version.created_unix")
Expand Down
4 changes: 4 additions & 0 deletions options/locale/locale_en-US.ini
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,10 @@ never = Never

rss_feed = RSS Feed

[filter]
string.asc = A - Z
string.desc = Z - A

[error]
occurred = An error occurred
report_message = If you are sure this is a Gitea bug, please search for issues on <a href="https://github.com/go-gitea/gitea/issues" target="_blank">GitHub</a> or open a new issue if necessary.
Expand Down
7 changes: 6 additions & 1 deletion routers/web/user/package.go
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,7 @@ func ListPackageVersions(ctx *context.Context) {
}

query := ctx.FormTrim("q")
sort := ctx.FormTrim("sort")

ctx.Data["Title"] = ctx.Tr("packages.title")
ctx.Data["IsPackagesPage"] = true
Expand All @@ -243,9 +244,11 @@ func ListPackageVersions(ctx *context.Context) {
Owner: ctx.Package.Owner,
}
ctx.Data["Query"] = query
ctx.Data["Sort"] = sort

pagerParams := map[string]string{
"q": query,
"q": query,
"sort": sort,
}

var (
Expand All @@ -264,6 +267,7 @@ func ListPackageVersions(ctx *context.Context) {
PackageID: p.ID,
Query: query,
IsTagged: tagged == "" || tagged == "tagged",
Sort: sort,
})
if err != nil {
ctx.ServerError("SearchImageTags", err)
Expand All @@ -278,6 +282,7 @@ func ListPackageVersions(ctx *context.Context) {
Value: query,
},
IsInternal: util.OptionalBoolFalse,
Sort: sort,
})
if err != nil {
ctx.ServerError("SearchVersions", err)
Expand Down
12 changes: 6 additions & 6 deletions templates/admin/packages/list.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,20 @@
<th>ID</th>
<th>{{.locale.Tr "admin.packages.owner"}}</th>
<th>{{.locale.Tr "admin.packages.type"}}</th>
<th data-sortt-asc="alphabetically" data-sortt-desc="reversealphabetically">
<th data-sortt-asc="name_asc" data-sortt-desc="name_desc">
{{.locale.Tr "admin.packages.name"}}
{{SortArrow "alphabetically" "reversealphabetically" .SortType false}}
{{SortArrow "name_asc" "name_desc" .SortType false}}
</th>
<th data-sortt-asc="highestversion" data-sortt-desc="lowestversion">
<th data-sortt-asc="version_desc" data-sortt-desc="version_asc">
{{.locale.Tr "admin.packages.version"}}
{{SortArrow "highestversion" "lowestversion" .SortType false}}
{{SortArrow "version_desc" "version_asc" .SortType false}}
</th>
<th>{{.locale.Tr "admin.packages.creator"}}</th>
<th>{{.locale.Tr "admin.packages.repository"}}</th>
<th>{{.locale.Tr "admin.packages.size"}}</th>
<th data-sortt-asc="oldest" data-sortt-desc="newest">
<th data-sortt-asc="created_asc" data-sortt-desc="created_desc">
{{.locale.Tr "admin.packages.published"}}
{{SortArrow "oldest" "newest" .SortType true}}
{{SortArrow "created_asc" "created_desc" .SortType true}}
</th>
<th>{{.locale.Tr "admin.notices.op"}}</th>
</tr>
Expand Down
10 changes: 8 additions & 2 deletions templates/package/shared/versionlist.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,17 @@
<form class="ui form ignore-dirty">
<div class="ui fluid action input">
<input name="q" value="{{.Query}}" placeholder="{{.locale.Tr "explore.search"}}..." autofocus>
<select class="ui dropdown" name="sort">
<option value="version_asc"{{if eq .Sort "version_asc"}} selected="selected"{{end}}>{{.locale.Tr "filter.string.asc"}}</option>
<option value="version_desc"{{if eq .Sort "version_desc"}} selected="selected"{{end}}>{{.locale.Tr "filter.string.desc"}}</option>
<option value="created_asc"{{if eq .Sort "created_asc"}} selected="selected"{{end}}>{{.locale.Tr "repo.issues.filter_sort.oldest"}}</option>
<option value="created_desc"{{if or (eq .Sort "") (eq .Sort "created_desc")}} selected="selected"{{end}}>{{.locale.Tr "repo.issues.filter_sort.latest"}}</option>
</select>
{{if eq .PackageDescriptor.Package.Type "container"}}
<select class="ui dropdown" name="tagged">
{{$isTagged := or (eq .Tagged "") (eq .Tagged "tagged")}}
<option value="tagged" {{if $isTagged}}selected="selected"{{end}}>{{.locale.Tr "packages.filter.container.tagged"}}</option>
<option value="untagged" {{if not $isTagged}}selected="selected"{{end}}>{{.locale.Tr "packages.filter.container.untagged"}}</option>
<option value="tagged"{{if $isTagged}} selected="selected"{{end}}>{{.locale.Tr "packages.filter.container.tagged"}}</option>
<option value="untagged"{{if not $isTagged}} selected="selected"{{end}}>{{.locale.Tr "packages.filter.container.untagged"}}</option>
</select>
{{end}}
<button class="ui primary button">{{.locale.Tr "explore.search"}}</button>
Expand Down