Skip to content

Commit 2af30f7

Browse files
puni9869wxiaoguangGiteaBotsilverwind
authored
Fix inconsistent user profile layout across tabs (#25625)
Fix ::User Profile Page Project Tab Have Inconsistent Layout and Style Added the big_avator for consistency in the all header_items tabs. Fixes: #24871 > ### Description > in the user profile page the `Packages` and `Projects` tab have small icons for user but other tabs have bigger profile picture with user info: > > ### Screenshots > ### **For Packages And Projects:** > ![image](https://user-images.githubusercontent.com/25511175/240148601-2420d77b-ba25-4718-9ccb-c5d0d95e3079.png) > > ### **For Other Tabs:** > ![image](https://user-images.githubusercontent.com/25511175/240148461-ce9636b3-fe11-4c46-a230-30d83eee5947.png) > ## Before ![image](https://github.com/go-gitea/gitea/assets/80308335/975ad038-07ca-4b10-b75d-ccf259be7b9d) ## After changes Project View <img width="1394" alt="image" src="https://github.com/go-gitea/gitea/assets/80308335/95d181d7-8e61-496d-9899-7b825c91ad56"> Packages View <img width="1378" alt="image" src="https://github.com/go-gitea/gitea/assets/80308335/7f5fd60f-6b18-4fa8-8c56-7b0d45d1a610"> ## Org view for projects page <img width="1385" alt="image" src="https://github.com/go-gitea/gitea/assets/80308335/6400dc89-a5ae-4f0a-831b-5b6efa020d89"> ## Org view for packages page <img width="1387" alt="image" src="https://github.com/go-gitea/gitea/assets/80308335/4e1e9ffe-1e4b-4334-8657-de11b5fd31d0"> --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> Co-authored-by: Giteabot <teabot@gitea.io> Co-authored-by: silverwind <me@silverwind.io>
1 parent f0bde0e commit 2af30f7

30 files changed

+461
-399
lines changed

models/user/user.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ func GetUserFollowers(ctx context.Context, u, viewer *User, listOptions db.ListO
336336

337337
// GetUserFollowing returns range of user's following.
338338
func GetUserFollowing(ctx context.Context, u, viewer *User, listOptions db.ListOptions) ([]*User, int64, error) {
339-
sess := db.GetEngine(db.DefaultContext).
339+
sess := db.GetEngine(ctx).
340340
Select("`user`.*").
341341
Join("LEFT", "follow", "`user`.id=follow.follow_id").
342342
Where("follow.user_id=?", u.ID).

modules/context/org.go

-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,6 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
161161
}
162162
ctx.Data["IsOrganizationOwner"] = ctx.Org.IsOwner
163163
ctx.Data["IsOrganizationMember"] = ctx.Org.IsMember
164-
ctx.Data["IsProjectEnabled"] = true
165164
ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
166165
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
167166
ctx.Data["IsPublicMember"] = func(uid int64) bool {

routers/web/org/projects.go

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func MustEnableProjects(ctx *context.Context) {
4141

4242
// Projects renders the home page of projects
4343
func Projects(ctx *context.Context) {
44+
shared_user.PrepareContextForProfileBigAvatar(ctx)
4445
ctx.Data["Title"] = ctx.Tr("repo.project_board")
4546

4647
sortType := ctx.FormTrim("sort")

routers/web/shared/user/header.go

+90-16
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,109 @@
44
package user
55

66
import (
7+
"code.gitea.io/gitea/models/db"
8+
"code.gitea.io/gitea/models/organization"
79
repo_model "code.gitea.io/gitea/models/repo"
10+
user_model "code.gitea.io/gitea/models/user"
811
"code.gitea.io/gitea/modules/context"
912
"code.gitea.io/gitea/modules/git"
13+
"code.gitea.io/gitea/modules/log"
14+
"code.gitea.io/gitea/modules/markup"
15+
"code.gitea.io/gitea/modules/markup/markdown"
1016
"code.gitea.io/gitea/modules/setting"
1117
)
1218

13-
func RenderUserHeader(ctx *context.Context) {
14-
ctx.Data["IsProjectEnabled"] = true
19+
// prepareContextForCommonProfile store some common data into context data for user's profile related pages (including the nav menu)
20+
// It is designed to be fast and safe to be called multiple times in one request
21+
func prepareContextForCommonProfile(ctx *context.Context) {
1522
ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
1623
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
1724
ctx.Data["ContextUser"] = ctx.ContextUser
18-
tab := ctx.FormString("tab")
19-
ctx.Data["TabName"] = tab
20-
repo, err := repo_model.GetRepositoryByName(ctx.ContextUser.ID, ".profile")
21-
if err == nil && !repo.IsEmpty {
22-
gitRepo, err := git.OpenRepository(ctx, repo.RepoPath())
25+
ctx.Data["EnableFeed"] = setting.Other.EnableFeed
26+
ctx.Data["FeedURL"] = ctx.ContextUser.HomeLink()
27+
}
28+
29+
// PrepareContextForProfileBigAvatar set the context for big avatar view on the profile page
30+
func PrepareContextForProfileBigAvatar(ctx *context.Context) {
31+
prepareContextForCommonProfile(ctx)
32+
33+
ctx.Data["IsFollowing"] = ctx.Doer != nil && user_model.IsFollowing(ctx.Doer.ID, ctx.ContextUser.ID)
34+
ctx.Data["ShowUserEmail"] = setting.UI.ShowUserEmail && ctx.ContextUser.Email != "" && ctx.IsSigned && !ctx.ContextUser.KeepEmailPrivate
35+
36+
// Show OpenID URIs
37+
openIDs, err := user_model.GetUserOpenIDs(ctx.ContextUser.ID)
38+
if err != nil {
39+
ctx.ServerError("GetUserOpenIDs", err)
40+
return
41+
}
42+
ctx.Data["OpenIDs"] = openIDs
43+
44+
if len(ctx.ContextUser.Description) != 0 {
45+
content, err := markdown.RenderString(&markup.RenderContext{
46+
URLPrefix: ctx.Repo.RepoLink,
47+
Metas: map[string]string{"mode": "document"},
48+
GitRepo: ctx.Repo.GitRepo,
49+
Ctx: ctx,
50+
}, ctx.ContextUser.Description)
2351
if err != nil {
24-
ctx.ServerError("OpenRepository", err)
52+
ctx.ServerError("RenderString", err)
2553
return
2654
}
27-
defer gitRepo.Close()
28-
commit, err := gitRepo.GetBranchCommit(repo.DefaultBranch)
29-
if err != nil {
30-
ctx.ServerError("GetBranchCommit", err)
31-
return
55+
ctx.Data["RenderedDescription"] = content
56+
}
57+
58+
showPrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID)
59+
orgs, err := organization.FindOrgs(organization.FindOrgOptions{
60+
UserID: ctx.ContextUser.ID,
61+
IncludePrivate: showPrivate,
62+
})
63+
if err != nil {
64+
ctx.ServerError("FindOrgs", err)
65+
return
66+
}
67+
ctx.Data["Orgs"] = orgs
68+
ctx.Data["HasOrgsVisible"] = organization.HasOrgsVisible(orgs, ctx.Doer)
69+
70+
badges, _, err := user_model.GetUserBadges(ctx, ctx.ContextUser)
71+
if err != nil {
72+
ctx.ServerError("GetUserBadges", err)
73+
return
74+
}
75+
ctx.Data["Badges"] = badges
76+
77+
// in case the numbers are already provided by other functions, no need to query again (which is slow)
78+
if _, ok := ctx.Data["NumFollowers"]; !ok {
79+
_, ctx.Data["NumFollowers"], _ = user_model.GetUserFollowers(ctx, ctx.ContextUser, ctx.Doer, db.ListOptions{PageSize: 1, Page: 1})
80+
}
81+
if _, ok := ctx.Data["NumFollowing"]; !ok {
82+
_, ctx.Data["NumFollowing"], _ = user_model.GetUserFollowing(ctx, ctx.ContextUser, ctx.Doer, db.ListOptions{PageSize: 1, Page: 1})
83+
}
84+
}
85+
86+
func FindUserProfileReadme(ctx *context.Context) (profileGitRepo *git.Repository, profileReadmeBlob *git.Blob, profileClose func()) {
87+
profileDbRepo, err := repo_model.GetRepositoryByName(ctx.ContextUser.ID, ".profile")
88+
if err == nil && !profileDbRepo.IsEmpty {
89+
if profileGitRepo, err = git.OpenRepository(ctx, profileDbRepo.RepoPath()); err != nil {
90+
log.Error("FindUserProfileReadme failed to OpenRepository: %v", err)
91+
} else {
92+
if commit, err := profileGitRepo.GetBranchCommit(profileDbRepo.DefaultBranch); err != nil {
93+
log.Error("FindUserProfileReadme failed to GetBranchCommit: %v", err)
94+
} else {
95+
profileReadmeBlob, _ = commit.GetBlobByPath("README.md")
96+
}
3297
}
33-
blob, err := commit.GetBlobByPath("README.md")
34-
if err == nil && blob != nil {
35-
ctx.Data["ProfileReadme"] = true
98+
}
99+
return profileGitRepo, profileReadmeBlob, func() {
100+
if profileGitRepo != nil {
101+
_ = profileGitRepo.Close()
36102
}
37103
}
38104
}
105+
106+
func RenderUserHeader(ctx *context.Context) {
107+
prepareContextForCommonProfile(ctx)
108+
109+
_, profileReadmeBlob, profileClose := FindUserProfileReadme(ctx)
110+
defer profileClose()
111+
ctx.Data["HasProfileReadme"] = profileReadmeBlob != nil
112+
}

routers/web/user/code.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"code.gitea.io/gitea/modules/context"
1212
code_indexer "code.gitea.io/gitea/modules/indexer/code"
1313
"code.gitea.io/gitea/modules/setting"
14+
shared_user "code.gitea.io/gitea/routers/web/shared/user"
1415
)
1516

1617
const (
@@ -23,8 +24,9 @@ func CodeSearch(ctx *context.Context) {
2324
ctx.Redirect(ctx.ContextUser.HomeLink())
2425
return
2526
}
27+
shared_user.PrepareContextForProfileBigAvatar(ctx)
28+
shared_user.RenderUserHeader(ctx)
2629

27-
ctx.Data["IsProjectEnabled"] = true
2830
ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
2931
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
3032
ctx.Data["Title"] = ctx.Tr("explore.code")

routers/web/user/home.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -857,7 +857,7 @@ func UsernameSubRoute(ctx *context.Context) {
857857
context_service.UserAssignmentWeb()(ctx)
858858
if !ctx.Written() {
859859
ctx.Data["EnableFeed"] = setting.Other.EnableFeed
860-
Profile(ctx)
860+
OwnerProfile(ctx)
861861
}
862862
}
863863
}

routers/web/user/package.go

+2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ const (
3737

3838
// ListPackages displays a list of all packages of the context user
3939
func ListPackages(ctx *context.Context) {
40+
shared_user.PrepareContextForProfileBigAvatar(ctx)
4041
page := ctx.FormInt("page")
4142
if page <= 1 {
4243
page = 1
@@ -259,6 +260,7 @@ func ViewPackageVersion(ctx *context.Context) {
259260

260261
// ListPackageVersions lists all versions of a package
261262
func ListPackageVersions(ctx *context.Context) {
263+
shared_user.PrepareContextForProfileBigAvatar(ctx)
262264
p, err := packages_model.GetPackageByName(ctx, ctx.Package.Owner.ID, packages_model.Type(ctx.Params("type")), ctx.Params("name"))
263265
if err != nil {
264266
if err == packages_model.ErrPackageNotExist {

0 commit comments

Comments
 (0)