diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go
index 92b67baff6ae..15b00c33e719 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 aa198c0032f4..0b1b1afcb919 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 0f0535f75a75..ca4e3b378241 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}}
-
-
- {{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 5c1688d01968..c06f0a8e565b 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 000000000000..9e95c3c920b4
--- /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 000000000000..bf699c5b945d
--- /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" .}}
+
+
+
+
+
+ {{$canReadReleases := $.Permission.CanRead $.UnitTypeReleases}}
+
+
+
+ {{template "base/paginate" .}}
+
+
+
+{{if $.Permission.CanWrite $.UnitTypeCode}}
+
+
+
+
{{.locale.Tr "repo.release.deletion_tag_desc"}}
+
+ {{template "base/delete_modal_actions" .}}
+
+{{end}}
+
+
+{{template "base/footer" .}}
diff --git a/web_src/css/index.css b/web_src/css/index.css
index dd5f73937926..79ecea15aee5 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 000000000000..6922ce517965
--- /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 81b69c07bb15..e8a6cc25e363 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;