diff options
author | HesterG <hestergong@gmail.com> | 2023-07-21 19:20:04 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-21 11:20:04 +0000 |
commit | 2f0e79e6393df13930eaa419273d24dc2ef36cfa (patch) | |
tree | 878d19f8055f7f5c5ce114620c05d18cbfb6c79a /routers | |
parent | dbbae67f44364eb965f516bfc77ba25dd5242c16 (diff) | |
download | gitea-2f0e79e6393df13930eaa419273d24dc2ef36cfa.tar.gz gitea-2f0e79e6393df13930eaa419273d24dc2ef36cfa.zip |
Use frontend fetch for branch dropdown component (#25719)
- Send request to get branch/tag list, use loading icon when waiting for
response.
- Only fetch when the first time branch/tag list shows.
- For backend, removed assignment to `ctx.Data["Branches"]` and
`ctx.Data["Tags"]` from `context/repo.go` and passed these data wherever
needed.
- Changed some `v-if` to `v-show` and used native `svg` as mentioned in
https://github.com/go-gitea/gitea/pull/25719#issuecomment-1631712757 to
improve perfomance when there are a lot of branches.
- Places Used the dropdown component:
Repo Home Page
<img width="1429" alt="Screen Shot 2023-07-06 at 12 17 51"
src="https://github.com/go-gitea/gitea/assets/17645053/6accc7b6-8d37-4e88-ae1a-bd2b3b927ea0">
Commits Page
<img width="1431" alt="Screen Shot 2023-07-06 at 12 18 34"
src="https://github.com/go-gitea/gitea/assets/17645053/2d0bf306-d1e2-45a8-a784-bc424879f537">
Specific commit -> operations -> cherry-pick
<img width="758" alt="Screen Shot 2023-07-06 at 12 23 28"
src="https://github.com/go-gitea/gitea/assets/17645053/1e557948-3881-4e45-a625-8ef36d45ae2d">
Release Page
<img width="1433" alt="Screen Shot 2023-07-06 at 12 25 05"
src="https://github.com/go-gitea/gitea/assets/17645053/3ec82af1-15a4-4162-a50b-04a9502161bb">
- Demo
https://github.com/go-gitea/gitea/assets/17645053/d45d266b-3eb0-465a-82f9-57f78dc5f9f3
- Note:
UI of dropdown menu could be improved in another PR as it should apply
to more dropdown menus.
Fix #14180
---------
Co-authored-by: silverwind <me@silverwind.io>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Diffstat (limited to 'routers')
-rw-r--r-- | routers/web/repo/compare.go | 6 | ||||
-rw-r--r-- | routers/web/repo/issue.go | 32 | ||||
-rw-r--r-- | routers/web/repo/pull.go | 10 | ||||
-rw-r--r-- | routers/web/repo/release.go | 21 | ||||
-rw-r--r-- | routers/web/repo/repo.go | 61 | ||||
-rw-r--r-- | routers/web/repo/setting/protected_branch.go | 11 | ||||
-rw-r--r-- | routers/web/web.go | 2 |
7 files changed, 133 insertions, 10 deletions
diff --git a/routers/web/repo/compare.go b/routers/web/repo/compare.go index 7089c219ad..4ceb52d039 100644 --- a/routers/web/repo/compare.go +++ b/routers/web/repo/compare.go @@ -754,6 +754,12 @@ func CompareDiff(ctx *context.Context) { } ctx.Data["HeadBranches"] = headBranches + // For compare repo branches + PrepareBranchList(ctx) + if ctx.Written() { + return + } + headTags, err := repo_model.GetTagNamesByRepoID(ctx, ci.HeadRepo.ID) if err != nil { ctx.ServerError("GetTagNamesByRepoID", err) diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 8fb6fe04df..f855514048 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -785,18 +785,10 @@ func RetrieveRepoMetas(ctx *context.Context, repo *repo_model.Repository, isPull return nil } - brs, err := git_model.FindBranchNames(ctx, git_model.FindBranchOptions{ - RepoID: ctx.Repo.Repository.ID, - ListOptions: db.ListOptions{ - ListAll: true, - }, - IsDeletedBranch: util.OptionalBoolFalse, - }) - if err != nil { - ctx.ServerError("GetBranches", err) + PrepareBranchList(ctx) + if ctx.Written() { return nil } - ctx.Data["Branches"] = brs // Contains true if the user can create issue dependencies ctx.Data["CanCreateIssueDependencies"] = ctx.Repo.CanCreateIssueDependencies(ctx.Doer, isPull) @@ -921,6 +913,13 @@ func NewIssue(ctx *context.Context) { RetrieveRepoMetas(ctx, ctx.Repo.Repository, false) + tags, err := repo_model.GetTagNamesByRepoID(ctx, ctx.Repo.Repository.ID) + if err != nil { + ctx.ServerError("GetTagNamesByRepoID", err) + return + } + ctx.Data["Tags"] = tags + _, templateErrs := issue_service.GetTemplatesFromDefaultBranch(ctx.Repo.Repository, ctx.Repo.GitRepo) if errs := setTemplateIfExists(ctx, issueTemplateKey, IssueTemplateCandidates); len(errs) > 0 { for k, v := range errs { @@ -1918,6 +1917,19 @@ func ViewIssue(ctx *context.Context) { ctx.Data["ShouldShowCommentType"] = func(commentType issues_model.CommentType) bool { return hiddenCommentTypes == nil || hiddenCommentTypes.Bit(int(commentType)) == 0 } + // For sidebar + PrepareBranchList(ctx) + + if ctx.Written() { + return + } + + tags, err := repo_model.GetTagNamesByRepoID(ctx, ctx.Repo.Repository.ID) + if err != nil { + ctx.ServerError("GetTagNamesByRepoID", err) + return + } + ctx.Data["Tags"] = tags ctx.HTML(http.StatusOK, tplIssueView) } diff --git a/routers/web/repo/pull.go b/routers/web/repo/pull.go index c5f260adfa..adfc01c251 100644 --- a/routers/web/repo/pull.go +++ b/routers/web/repo/pull.go @@ -729,6 +729,11 @@ func ViewPullCommits(ctx *context.Context) { ctx.Data["HasIssuesOrPullsWritePermission"] = ctx.Repo.CanWriteIssuesOrPulls(issue.IsPull) ctx.Data["IsIssuePoster"] = ctx.IsSigned && issue.IsPoster(ctx.Doer.ID) + // For PR commits page + PrepareBranchList(ctx) + if ctx.Written() { + return + } getBranchData(ctx, issue) ctx.HTML(http.StatusOK, tplPullCommits) } @@ -893,6 +898,11 @@ func ViewPullFiles(ctx *context.Context) { ctx.Data["HasIssuesOrPullsWritePermission"] = ctx.Repo.CanWriteIssuesOrPulls(issue.IsPull) ctx.Data["IsAttachmentEnabled"] = setting.Attachment.Enabled + // For files changed page + PrepareBranchList(ctx) + if ctx.Written() { + return + } upload.AddUploadContext(ctx, "comment") ctx.HTML(http.StatusOK, tplPullFiles) diff --git a/routers/web/repo/release.go b/routers/web/repo/release.go index 1a0303f1f2..3d991384e5 100644 --- a/routers/web/repo/release.go +++ b/routers/web/repo/release.go @@ -352,6 +352,20 @@ func NewRelease(ctx *context.Context) { ctx.Data["Assignees"] = MakeSelfOnTop(ctx, assigneeUsers) upload.AddUploadContext(ctx, "release") + + // For New Release page + PrepareBranchList(ctx) + if ctx.Written() { + return + } + + tags, err := repo_model.GetTagNamesByRepoID(ctx, ctx.Repo.Repository.ID) + if err != nil { + ctx.ServerError("GetTagNamesByRepoID", err) + return + } + ctx.Data["Tags"] = tags + ctx.HTML(http.StatusOK, tplReleaseNew) } @@ -361,6 +375,13 @@ func NewReleasePost(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("repo.release.new_release") ctx.Data["PageIsReleaseList"] = true + tags, err := repo_model.GetTagNamesByRepoID(ctx, ctx.Repo.Repository.ID) + if err != nil { + ctx.ServerError("GetTagNamesByRepoID", err) + return + } + ctx.Data["Tags"] = tags + if ctx.HasError() { ctx.HTML(http.StatusOK, tplReleaseNew) return diff --git a/routers/web/repo/repo.go b/routers/web/repo/repo.go index 0a2b334eb9..0de804dbce 100644 --- a/routers/web/repo/repo.go +++ b/routers/web/repo/repo.go @@ -622,3 +622,64 @@ func SearchRepo(ctx *context.Context) { Data: results, }) } + +type branchTagSearchResponse struct { + Results []string `json:"results"` +} + +// GetBranchesList get branches for current repo' +func GetBranchesList(ctx *context.Context) { + branchOpts := git_model.FindBranchOptions{ + RepoID: ctx.Repo.Repository.ID, + IsDeletedBranch: util.OptionalBoolFalse, + ListOptions: db.ListOptions{ + ListAll: true, + }, + } + branches, err := git_model.FindBranchNames(ctx, branchOpts) + if err != nil { + ctx.JSON(http.StatusInternalServerError, err) + return + } + resp := &branchTagSearchResponse{} + // always put default branch on the top if it exists + if util.SliceContains(branches, ctx.Repo.Repository.DefaultBranch) { + branches = util.SliceRemoveAll(branches, ctx.Repo.Repository.DefaultBranch) + branches = append([]string{ctx.Repo.Repository.DefaultBranch}, branches...) + } + resp.Results = branches + ctx.JSON(http.StatusOK, resp) +} + +// GetTagList get tag list for current repo +func GetTagList(ctx *context.Context) { + tags, err := repo_model.GetTagNamesByRepoID(ctx, ctx.Repo.Repository.ID) + if err != nil { + ctx.JSON(http.StatusInternalServerError, err) + return + } + resp := &branchTagSearchResponse{} + resp.Results = tags + ctx.JSON(http.StatusOK, resp) +} + +func PrepareBranchList(ctx *context.Context) { + branchOpts := git_model.FindBranchOptions{ + RepoID: ctx.Repo.Repository.ID, + IsDeletedBranch: util.OptionalBoolFalse, + ListOptions: db.ListOptions{ + ListAll: true, + }, + } + brs, err := git_model.FindBranchNames(ctx, branchOpts) + if err != nil { + ctx.ServerError("GetBranches", err) + return + } + // always put default branch on the top if it exists + if util.SliceContains(brs, ctx.Repo.Repository.DefaultBranch) { + brs = util.SliceRemoveAll(brs, ctx.Repo.Repository.DefaultBranch) + brs = append([]string{ctx.Repo.Repository.DefaultBranch}, brs...) + } + ctx.Data["Branches"] = brs +} diff --git a/routers/web/repo/setting/protected_branch.go b/routers/web/repo/setting/protected_branch.go index 777d52c858..b8775cca2d 100644 --- a/routers/web/repo/setting/protected_branch.go +++ b/routers/web/repo/setting/protected_branch.go @@ -21,6 +21,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/web" + "code.gitea.io/gitea/routers/web/repo" "code.gitea.io/gitea/services/forms" pull_service "code.gitea.io/gitea/services/pull" "code.gitea.io/gitea/services/repository" @@ -44,6 +45,11 @@ func ProtectedBranchRules(ctx *context.Context) { } ctx.Data["ProtectedBranches"] = rules + repo.PrepareBranchList(ctx) + if ctx.Written() { + return + } + ctx.HTML(http.StatusOK, tplBranches) } @@ -52,6 +58,11 @@ func SetDefaultBranchPost(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("repo.settings.branches.update_default_branch") ctx.Data["PageIsSettingsBranches"] = true + repo.PrepareBranchList(ctx) + if ctx.Written() { + return + } + repo := ctx.Repo.Repository switch ctx.FormString("action") { diff --git a/routers/web/web.go b/routers/web/web.go index 00e0ca36da..f091bfefb8 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -1094,6 +1094,7 @@ func registerRoutes(m *web.Route) { }, context.RepoRef(), canEnableEditor, context.RepoMustNotBeArchived()) m.Group("/branches", func() { + m.Get("/list", repo.GetBranchesList) m.Group("/_new", func() { m.Post("/branch/*", context.RepoRefByType(context.RepoRefBranch), repo.CreateBranch) m.Post("/tag/*", context.RepoRefByType(context.RepoRefTag), repo.CreateBranch) @@ -1108,6 +1109,7 @@ func registerRoutes(m *web.Route) { m.Group("/{username}/{reponame}", func() { m.Group("/tags", func() { m.Get("", repo.TagsList) + m.Get("/list", repo.GetTagList) m.Get(".rss", feedEnabled, repo.TagsListFeedRSS) m.Get(".atom", feedEnabled, repo.TagsListFeedAtom) }, ctxDataSet("EnableFeed", setting.Other.EnableFeed), |