From e301e26d7ad6350698f8868d8eb833b25ff00e2f Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Thu, 27 Apr 2023 12:40:36 +0800 Subject: [PATCH] Add tags list for repos whose release setting is disabled (#23465) (#24369) Backport #23465 Close #23427 Co-Author: @wxiaoguang If a repo's release setting is enabled, the logic has't changed. Clicking the "Tags" button will jump to `/{user}/{repo}/tags` and `templates/repo/release/list.tmpl` template will be used. If the release setting is disabled, clicking the "Tags" button will still jump to `/{user}/{repo}/tags` but a new template `templates/repo/tag/list.tmpl` will be used. Since both templates above need to render the tags list, I moved the tags list to a shared template located in `templates/repo/tag/table.tmpl`. --- routers/web/repo/release.go | 26 ++-- routers/web/web.go | 10 +- templates/repo/release/list.tmpl | 68 +--------- templates/repo/sub_menu.tmpl | 2 +- templates/repo/sub_menu_release_tag.tmpl | 17 +++ templates/repo/tag/list.tmpl | 85 +++++++++++++ web_src/css/index.css | 1 + web_src/css/repository-release-tag.css | 151 +++++++++++++++++++++++ web_src/css/repository.css | 151 ----------------------- 9 files changed, 280 insertions(+), 231 deletions(-) create mode 100644 templates/repo/sub_menu_release_tag.tmpl create mode 100644 templates/repo/tag/list.tmpl create mode 100644 web_src/css/repository-release-tag.css diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go index 92b67baff6..15b00c33e7 100644 --- a/routers/web/repo/release.go +++ b/routers/web/repo/release.go @@ -29,8 +29,9 @@ import ( ) const ( - tplReleases base.TplName = "repo/release/list" - tplReleaseNew base.TplName = "repo/release/new" + tplReleasesList base.TplName = "repo/release/list" + tplReleaseNew base.TplName = "repo/release/new" + tplTagsList base.TplName = "repo/tag/list" ) // calReleaseNumCommitsBehind calculates given release has how many commits behind release target. @@ -58,16 +59,19 @@ func calReleaseNumCommitsBehind(repoCtx *context.Repository, release *repo_model // Releases render releases list page func Releases(ctx *context.Context) { + ctx.Data["PageIsReleaseList"] = true + ctx.Data["Title"] = ctx.Tr("repo.release.releases") releasesOrTags(ctx, false) } // TagsList render tags list page func TagsList(ctx *context.Context) { + ctx.Data["PageIsTagList"] = true + ctx.Data["Title"] = ctx.Tr("repo.release.tags") releasesOrTags(ctx, true) } func releasesOrTags(ctx *context.Context, isTagList bool) { - ctx.Data["PageIsReleaseList"] = true ctx.Data["DefaultBranch"] = ctx.Repo.Repository.DefaultBranch ctx.Data["IsViewBranch"] = false ctx.Data["IsViewTag"] = true @@ -75,14 +79,6 @@ func releasesOrTags(ctx *context.Context, isTagList bool) { ctx.Data["CanCreateBranch"] = false ctx.Data["HideBranchesInDropdown"] = true - if isTagList { - ctx.Data["Title"] = ctx.Tr("repo.release.tags") - ctx.Data["PageIsTagList"] = true - } else { - ctx.Data["Title"] = ctx.Tr("repo.release.releases") - ctx.Data["PageIsTagList"] = false - } - listOptions := db.ListOptions{ Page: ctx.FormInt("page"), PageSize: ctx.FormInt("limit"), @@ -192,7 +188,11 @@ func releasesOrTags(ctx *context.Context, isTagList bool) { pager.SetDefaultParams(ctx) ctx.Data["Page"] = pager - ctx.HTML(http.StatusOK, tplReleases) + if isTagList { + ctx.HTML(http.StatusOK, tplTagsList) + } else { + ctx.HTML(http.StatusOK, tplReleasesList) + } } // ReleasesFeedRSS get feeds for releases in RSS format @@ -270,7 +270,7 @@ func SingleRelease(ctx *context.Context) { } ctx.Data["Releases"] = []*repo_model.Release{release} - ctx.HTML(http.StatusOK, tplReleases) + ctx.HTML(http.StatusOK, tplReleasesList) } // LatestRelease redirects to the latest release diff --git a/routers/web/web.go b/routers/web/web.go index aa198c0032..0b1b1afcb9 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -1215,7 +1215,7 @@ func RegisterRoutes(m *web.Route) { }, context.RepoMustNotBeArchived(), reqRepoCodeWriter, repo.MustBeNotEmpty) }, reqSignIn, context.RepoAssignment, context.UnitTypes()) - // Releases + // Tags m.Group("/{username}/{reponame}", func() { m.Group("/tags", func() { m.Get("", repo.TagsList) @@ -1224,6 +1224,12 @@ func RegisterRoutes(m *web.Route) { }, func(ctx *context.Context) { ctx.Data["EnableFeed"] = setting.EnableFeed }, repo.MustBeNotEmpty, reqRepoCodeReader, context.RepoRefByType(context.RepoRefTag, true)) + m.Post("/tags/delete", repo.DeleteTag, reqSignIn, + repo.MustBeNotEmpty, context.RepoMustNotBeArchived(), reqRepoCodeWriter, context.RepoRef()) + }, reqSignIn, context.RepoAssignment, context.UnitTypes()) + + // Releases + m.Group("/{username}/{reponame}", func() { m.Group("/releases", func() { m.Get("/", repo.Releases) m.Get("/tag/*", repo.SingleRelease) @@ -1241,8 +1247,6 @@ func RegisterRoutes(m *web.Route) { m.Post("/attachments", repo.UploadReleaseAttachment) m.Post("/attachments/remove", repo.DeleteAttachment) }, reqSignIn, repo.MustBeNotEmpty, context.RepoMustNotBeArchived(), reqRepoReleaseWriter, context.RepoRef()) - m.Post("/tags/delete", repo.DeleteTag, reqSignIn, - repo.MustBeNotEmpty, context.RepoMustNotBeArchived(), reqRepoCodeWriter, context.RepoRef()) m.Group("/releases", func() { m.Get("/edit/*", repo.EditRelease) m.Post("/edit/*", web.Bind(forms.EditReleaseForm{}), repo.EditReleasePost) diff --git a/templates/repo/release/list.tmpl b/templates/repo/release/list.tmpl index 0f0535f75a..ca4e3b3782 100644 --- a/templates/repo/release/list.tmpl +++ b/templates/repo/release/list.tmpl @@ -1,73 +1,15 @@ {{template "base/head" .}} -
+
{{template "repo/header" .}}
{{template "base/alert" .}} - - {{if .EnableFeed}} - {{svg "octicon-rss" 18}} - {{end}} - {{if (and .CanCreateRelease (not .PageIsTagList))}} + {{template "repo/sub_menu_release_tag" .}} + + {{if .CanCreateRelease}} {{.locale.Tr "repo.release.new_release"}} {{end}} - {{if .PageIsTagList}} -
- {{if gt .ReleasesNum 0}} -

-
- {{svg "octicon-tag" 16 "gt-mr-2"}}{{.locale.Tr "repo.release.tags"}} -
-

-
- - - - {{range $idx, $release := .Releases}} - - - - {{end}} - -
-

- {{.TagName}} -

-
- {{if $.Permission.CanRead $.UnitTypeCode}} - {{if .CreatedUnix}} - {{svg "octicon-clock" 16 "gt-mr-2"}}{{TimeSinceUnix .CreatedUnix $.locale}} - {{end}} - {{svg "octicon-git-commit" 16 "gt-mr-2"}}{{ShortSha .Sha1}} - {{if not $.DisableDownloadSourceArchives}} - {{svg "octicon-file-zip" 16 "gt-mr-2"}}ZIP - {{svg "octicon-file-zip" 16 "gt-mr-2"}}TAR.GZ - {{end}} - {{if (and $.CanCreateRelease $release.IsTag)}} - {{svg "octicon-tag" 16 "gt-mr-2"}}{{$.locale.Tr "repo.release.new_release"}} - {{end}} - {{if (and ($.Permission.CanWrite $.UnitTypeCode) $release.IsTag)}} - - {{svg "octicon-trash" 16 "gt-mr-2"}}{{$.locale.Tr "repo.release.delete_tag"}} - - {{end}} - {{if (not $release.IsTag)}} - {{svg "octicon-tag" 16 "gt-mr-2"}}{{$.locale.Tr "repo.release.detail"}} - {{end}} - {{end}} -
-
-
- {{end}} - {{else}}
    {{range $idx, $release := .Releases}}
  • @@ -196,7 +138,7 @@
  • {{end}}
- {{end}} + {{template "base/paginate" .}}
diff --git a/templates/repo/sub_menu.tmpl b/templates/repo/sub_menu.tmpl index 5c1688d019..c06f0a8e56 100644 --- a/templates/repo/sub_menu.tmpl +++ b/templates/repo/sub_menu.tmpl @@ -10,7 +10,7 @@ {{svg "octicon-git-branch"}} {{.BranchesCount}} {{.locale.TrN .BranchesCount "repo.branch" "repo.branches"}}
{{if $.Permission.CanRead $.UnitTypeCode}} -
+ {{end}} diff --git a/templates/repo/sub_menu_release_tag.tmpl b/templates/repo/sub_menu_release_tag.tmpl new file mode 100644 index 0000000000..9e95c3c920 --- /dev/null +++ b/templates/repo/sub_menu_release_tag.tmpl @@ -0,0 +1,17 @@ +{{$canReadReleases := $.Permission.CanRead $.UnitTypeReleases}} +{{$canReadCode := $.Permission.CanRead $.UnitTypeCode}} + +{{if $canReadReleases}} + + + {{if .EnableFeed}} + {{svg "octicon-rss" 18}} + {{end}} +{{else if $canReadCode}} + {{template "repo/sub_menu" .}} +{{end}} diff --git a/templates/repo/tag/list.tmpl b/templates/repo/tag/list.tmpl new file mode 100644 index 0000000000..bf699c5b94 --- /dev/null +++ b/templates/repo/tag/list.tmpl @@ -0,0 +1,85 @@ +{{template "base/head" .}} + +
+ {{template "repo/header" .}} +
+ {{template "base/alert" .}} + {{template "repo/sub_menu_release_tag" .}} + +
+ +

+
+ {{svg "octicon-tag" 16 "gt-mr-2"}}{{.locale.Tr "repo.release.tags"}} +
+

+ + {{$canReadReleases := $.Permission.CanRead $.UnitTypeReleases}} + +
+ + + {{range $idx, $release := .Releases}} + + + + {{end}} + +
+

+ {{if $canReadReleases}} + {{.TagName}} + {{else}} + {{.TagName}} + {{end}} +

+
+ {{if $.Permission.CanRead $.UnitTypeCode}} + {{if .CreatedUnix}} + {{svg "octicon-clock" 16 "gt-mr-2"}}{{TimeSinceUnix .CreatedUnix $.locale}} + {{end}} + + {{svg "octicon-git-commit" 16 "gt-mr-2"}}{{ShortSha .Sha1}} + + {{if not $.DisableDownloadSourceArchives}} + {{svg "octicon-file-zip" 16 "gt-mr-2"}}ZIP + {{svg "octicon-file-zip" 16 "gt-mr-2"}}TAR.GZ + {{end}} + + {{if (and $canReadReleases $.CanCreateRelease $release.IsTag)}} + {{svg "octicon-tag" 16 "gt-mr-2"}}{{$.locale.Tr "repo.release.new_release"}} + {{end}} + + {{if (and ($.Permission.CanWrite $.UnitTypeCode) $release.IsTag)}} + + {{svg "octicon-trash" 16 "gt-mr-2"}}{{$.locale.Tr "repo.release.delete_tag"}} + + {{end}} + + {{if and $canReadReleases (not $release.IsTag)}} + {{svg "octicon-tag" 16 "gt-mr-2"}}{{$.locale.Tr "repo.release.detail"}} + {{end}} + {{end}} +
+
+
+ + {{template "base/paginate" .}} +
+
+ +{{if $.Permission.CanWrite $.UnitTypeCode}} + +{{end}} + + +{{template "base/footer" .}} diff --git a/web_src/css/index.css b/web_src/css/index.css index dd5f739379..79ecea15ae 100644 --- a/web_src/css/index.css +++ b/web_src/css/index.css @@ -28,6 +28,7 @@ @import "./install.css"; @import "./form.css"; @import "./repository.css"; +@import "./repository-release-tag.css"; @import "./editor.css"; @import "./organization.css"; @import "./user.css"; diff --git a/web_src/css/repository-release-tag.css b/web_src/css/repository-release-tag.css new file mode 100644 index 0000000000..6922ce5179 --- /dev/null +++ b/web_src/css/repository-release-tag.css @@ -0,0 +1,151 @@ +.repository.releases #release-list { + border-top: 1px solid var(--color-secondary); + margin-top: 20px; + padding-top: 15px; + padding-left: 0; +} + +.repository.releases #release-list .release-list-title { + font-size: 2rem; + font-weight: normal; + margin-top: -4px; + margin-bottom: 0; +} + +.repository.releases #release-list > li { + list-style: none; +} + +.repository.releases #release-list > li .meta, +.repository.releases #release-list > li .detail { + padding-top: 30px; + padding-bottom: 40px; +} + +.repository.releases #release-list > li .meta { + text-align: right; + position: relative; +} + +.repository.releases #release-list > li .meta .label { + margin-right: 0; +} + +.repository.releases #release-list > li .meta .commit { + display: block; + margin-top: 10px; +} + +.repository.releases #release-list > li .meta .choose { + margin-top: 15px; +} + +.repository.releases #release-list > li .meta .choose .button { + margin-right: 0; +} + +.repository.releases #release-list > li .detail { + border-left: 2px solid var(--color-secondary); +} + +.repository.releases #release-list > li .detail .author img { + margin-bottom: 3px; +} + +.repository.releases #release-list > li .detail .download > a .svg { + margin-left: 5px; + margin-right: 5px; +} + +.repository.releases #release-list > li .detail .download .list { + padding-left: 0; +} + +.repository.releases #release-list > li .detail .download .list li { + list-style: none; + display: block; + padding: 8px; + border: 1px solid var(--color-secondary); + background: var(--color-light); +} + +.repository.releases #release-list > li .detail .download .list li a > .text.right { + margin-right: 5px; +} + +.repository.releases #release-list > li .detail .download .list li + li { + border-top: 0; +} + +.repository.releases #release-list > li .detail .download .list li:first-of-type { + border-radius: var(--border-radius) 0 0 var(--border-radius); +} + +.repository.releases #release-list > li .detail .download .list li:last-of-type { + border-radius: 0 var(--border-radius) var(--border-radius) 0; +} + +.repository.releases #release-list > li .detail .dot { + width: 10px; + height: 10px; + background-color: var(--color-secondary-dark-3); + z-index: 9; + position: absolute; + display: block; + left: -6px; + top: 40px; + border-radius: 100%; + border: 2.5px solid var(--color-body); +} + +.repository.tags #tags-table .tag { + padding: 8px 12px; +} + +.repository.tags #tags-table .release-tag-name { + font-size: 18px; + font-weight: normal; +} + +.repository.new.release .target { + min-width: 500px; +} + +.repository.new.release .target #tag-name { + margin-top: -4px; +} + +.repository.new.release .target .at { + margin-left: -5px; + margin-right: 5px; +} + +.repository.new.release .target .selection.dropdown { + padding-top: 10px; + padding-bottom: 10px; +} + +.repository.new.release .prerelease.field { + margin-bottom: 0; +} + +@media (max-width: 438px) { + .repository.new.release .field button, + .repository.new.release .field input { + width: 100%; + } +} + +@media (max-width: 767px) { + .repository.new.release .field button { + margin-bottom: 1em; + } +} + +.repository.new.release .field .wrap_remove { + height: 38px; +} + +.repository.new.release .field .attachment_edit { + width: 450px !important; +} diff --git a/web_src/css/repository.css b/web_src/css/repository.css index 81b69c07bb..e8a6cc25e3 100644 --- a/web_src/css/repository.css +++ b/web_src/css/repository.css @@ -1931,157 +1931,6 @@ line-height: 1.4; } -.repository.release #release-list { - border-top: 1px solid var(--color-secondary); - margin-top: 20px; - padding-top: 15px; - padding-left: 0; -} - -.repository.release #release-list .release-list-title { - font-size: 2rem; - font-weight: normal; - margin-top: -4px; - margin-bottom: 0; -} - -.repository.release #release-list > li { - list-style: none; -} - -.repository.release #release-list > li .meta, -.repository.release #release-list > li .detail { - padding-top: 30px; - padding-bottom: 40px; -} - -.repository.release #release-list > li .meta { - text-align: right; - position: relative; -} - -.repository.release #release-list > li .meta .label { - margin-right: 0; -} - -.repository.release #release-list > li .meta .commit { - display: block; - margin-top: 10px; -} - -.repository.release #release-list > li .meta .choose { - margin-top: 15px; -} - -.repository.release #release-list > li .meta .choose .button { - margin-right: 0; -} - -.repository.release #release-list > li .detail { - border-left: 2px solid var(--color-secondary); -} - -.repository.release #release-list > li .detail .author img { - margin-bottom: 3px; -} - -.repository.release #release-list > li .detail .download > a .svg { - margin-left: 5px; - margin-right: 5px; -} - -.repository.release #release-list > li .detail .download .list { - padding-left: 0; -} - -.repository.release #release-list > li .detail .download .list li { - list-style: none; - display: block; - padding: 8px; - border: 1px solid var(--color-secondary); - background: var(--color-light); -} - -.repository.release #release-list > li .detail .download .list li a > .text.right { - margin-right: 5px; -} - -.repository.release #release-list > li .detail .download .list li + li { - border-top: 0; -} - -.repository.release #release-list > li .detail .download .list li:first-of-type { - border-radius: var(--border-radius) 0 0 var(--border-radius); -} - -.repository.release #release-list > li .detail .download .list li:last-of-type { - border-radius: 0 var(--border-radius) var(--border-radius) 0; -} - -.repository.release #release-list > li .detail .dot { - width: 10px; - height: 10px; - background-color: var(--color-secondary-dark-3); - z-index: 9; - position: absolute; - display: block; - left: -6px; - top: 40px; - border-radius: 100%; - border: 2.5px solid var(--color-body); -} - -.repository.release #tags-table .tag { - padding: 8px 12px; -} - -.repository.release #tags-table .release-tag-name { - font-size: 18px; - font-weight: normal; -} - -.repository.new.release .target { - min-width: 500px; -} - -.repository.new.release .target #tag-name { - margin-top: -4px; -} - -.repository.new.release .target .at { - margin-left: -5px; - margin-right: 5px; -} - -.repository.new.release .target .selection.dropdown { - padding-top: 10px; - padding-bottom: 10px; -} - -.repository.new.release .prerelease.field { - margin-bottom: 0; -} - -@media (max-width: 438px) { - .repository.new.release .field button, - .repository.new.release .field input { - width: 100%; - } -} - -@media (max-width: 767px) { - .repository.new.release .field button { - margin-bottom: 1em; - } -} - -.repository.new.release .field .wrap_remove { - height: 38px; -} - -.repository.new.release .field .attachment_edit { - width: 450px !important; -} .repository.forks .list { margin-top: 0;