diff options
author | puni9869 <80308335+puni9869@users.noreply.github.com> | 2023-07-07 00:29:24 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-06 18:59:24 +0000 |
commit | 2af30f715e64dbb0a3900168e3768ffb36c06392 (patch) | |
tree | 9167af942ea3d4ee7e32e756637ae48d6d10041e /routers/web/user/profile.go | |
parent | f0bde0e4f902970d447e3aae628f2dcf6f79e539 (diff) | |
download | gitea-2af30f715e64dbb0a3900168e3768ffb36c06392.tar.gz gitea-2af30f715e64dbb0a3900168e3768ffb36c06392.zip |
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>
Diffstat (limited to 'routers/web/user/profile.go')
-rw-r--r-- | routers/web/user/profile.go | 148 |
1 files changed, 38 insertions, 110 deletions
diff --git a/routers/web/user/profile.go b/routers/web/user/profile.go index 6f9f84d60d..442fd0433a 100644 --- a/routers/web/user/profile.go +++ b/routers/web/user/profile.go @@ -11,22 +11,22 @@ import ( activities_model "code.gitea.io/gitea/models/activities" "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" - project_model "code.gitea.io/gitea/models/project" repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/git" + "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/markup" "code.gitea.io/gitea/modules/markup/markdown" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/routers/web/feed" "code.gitea.io/gitea/routers/web/org" + shared_user "code.gitea.io/gitea/routers/web/shared/user" ) -// Profile render user's profile page -func Profile(ctx *context.Context) { +// OwnerProfile render profile page for a user or a organization (aka, repo owner) +func OwnerProfile(ctx *context.Context) { if strings.Contains(ctx.Req.Header.Get("Accept"), "application/rss+xml") { feed.ShowUserFeedRSS(ctx) return @@ -38,36 +38,22 @@ func Profile(ctx *context.Context) { if ctx.ContextUser.IsOrganization() { org.Home(ctx) - return + } else { + userProfile(ctx) } +} +func userProfile(ctx *context.Context) { // check view permissions if !user_model.IsUserVisibleToViewer(ctx, ctx.ContextUser, ctx.Doer) { ctx.NotFound("user", fmt.Errorf(ctx.ContextUser.Name)) return } - // advertise feed via meta tag - ctx.Data["FeedURL"] = ctx.ContextUser.HomeLink() - - // Show OpenID URIs - openIDs, err := user_model.GetUserOpenIDs(ctx.ContextUser.ID) - if err != nil { - ctx.ServerError("GetUserOpenIDs", err) - return - } - - var isFollowing bool - if ctx.Doer != nil { - isFollowing = user_model.IsFollowing(ctx.Doer.ID, ctx.ContextUser.ID) - } - ctx.Data["Title"] = ctx.ContextUser.DisplayName() ctx.Data["PageIsUserProfile"] = true - ctx.Data["ContextUser"] = ctx.ContextUser - ctx.Data["OpenIDs"] = openIDs - ctx.Data["IsFollowing"] = isFollowing + // prepare heatmap data if setting.Service.EnableUserHeatmap { data, err := activities_model.GetUserHeatmapDataByUser(ctx.ContextUser, ctx.Doer) if err != nil { @@ -78,75 +64,28 @@ func Profile(ctx *context.Context) { ctx.Data["HeatmapTotalContributions"] = activities_model.GetTotalContributionsInHeatmap(data) } - if len(ctx.ContextUser.Description) != 0 { - content, err := markdown.RenderString(&markup.RenderContext{ - URLPrefix: ctx.Repo.RepoLink, - Metas: map[string]string{"mode": "document"}, - GitRepo: ctx.Repo.GitRepo, - Ctx: ctx, - }, ctx.ContextUser.Description) - if err != nil { - ctx.ServerError("RenderString", err) - return - } - ctx.Data["RenderedDescription"] = content - } - - repo, err := repo_model.GetRepositoryByName(ctx.ContextUser.ID, ".profile") - if err == nil && !repo.IsEmpty { - gitRepo, err := git.OpenRepository(ctx, repo.RepoPath()) - if err != nil { - ctx.ServerError("OpenRepository", err) - return - } - defer gitRepo.Close() - commit, err := gitRepo.GetBranchCommit(repo.DefaultBranch) - if err != nil { - ctx.ServerError("GetBranchCommit", err) - return - } - blob, err := commit.GetBlobByPath("README.md") - if err == nil { - bytes, err := blob.GetBlobContent(setting.UI.MaxDisplayFileSize) - if err != nil { - ctx.ServerError("GetBlobContent", err) - return - } - profileContent, err := markdown.RenderString(&markup.RenderContext{ - Ctx: ctx, - GitRepo: gitRepo, - }, bytes) - if err != nil { - ctx.ServerError("RenderString", err) - return - } - ctx.Data["ProfileReadme"] = profileContent - } - } + profileGitRepo, profileReadmeBlob, profileClose := shared_user.FindUserProfileReadme(ctx) + defer profileClose() showPrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID) + prepareUserProfileTabData(ctx, showPrivate, profileGitRepo, profileReadmeBlob) + // call PrepareContextForProfileBigAvatar later to avoid re-querying the NumFollowers & NumFollowing + shared_user.PrepareContextForProfileBigAvatar(ctx) + ctx.HTML(http.StatusOK, tplProfile) +} - orgs, err := organization.FindOrgs(organization.FindOrgOptions{ - UserID: ctx.ContextUser.ID, - IncludePrivate: showPrivate, - }) - if err != nil { - ctx.ServerError("FindOrgs", err) - return - } - - ctx.Data["Orgs"] = orgs - ctx.Data["HasOrgsVisible"] = organization.HasOrgsVisible(orgs, ctx.Doer) - - badges, _, err := user_model.GetUserBadges(ctx, ctx.ContextUser) - if err != nil { - ctx.ServerError("GetUserBadges", err) - return - } - ctx.Data["Badges"] = badges - +func prepareUserProfileTabData(ctx *context.Context, showPrivate bool, profileGitRepo *git.Repository, profileReadme *git.Blob) { + // if there is a profile readme, default to "overview" page, otherwise, default to "repositories" page tab := ctx.FormString("tab") + if tab == "" { + if profileReadme != nil { + tab = "overview" + } else { + tab = "repositories" + } + } ctx.Data["TabName"] = tab + ctx.Data["HasProfileReadme"] = profileReadme != nil page := ctx.FormInt("page") if page <= 0 { @@ -154,12 +93,7 @@ func Profile(ctx *context.Context) { } pagingNum := setting.UI.User.RepoPagingNum - if tab == "activity" { - pagingNum = setting.UI.FeedPagingNum - } - topicOnly := ctx.FormBool("topic") - var ( repos []*repo_model.Repository count int64 @@ -228,6 +162,7 @@ func Profile(ctx *context.Context) { total = int(count) case "activity": date := ctx.FormString("date") + pagingNum = setting.UI.FeedPagingNum items, count, err := activities_model.GetFeeds(ctx, activities_model.GetFeedsOptions{ RequestedUser: ctx.ContextUser, Actor: ctx.Doer, @@ -271,16 +206,6 @@ func Profile(ctx *context.Context) { } total = int(count) - case "projects": - ctx.Data["OpenProjects"], _, err = project_model.FindProjects(ctx, project_model.SearchOptions{ - Page: -1, - IsClosed: util.OptionalBoolFalse, - Type: project_model.TypeIndividual, - }) - if err != nil { - ctx.ServerError("GetProjects", err) - return - } case "watching": repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{ ListOptions: db.ListOptions{ @@ -303,7 +228,17 @@ func Profile(ctx *context.Context) { } total = int(count) - default: + case "overview": + if bytes, err := profileReadme.GetBlobContent(setting.UI.MaxDisplayFileSize); err != nil { + log.Error("failed to GetBlobContent: %v", err) + } else { + if profileContent, err := markdown.RenderString(&markup.RenderContext{Ctx: ctx, GitRepo: profileGitRepo}, bytes); err != nil { + log.Error("failed to RenderString: %v", err) + } else { + ctx.Data["ProfileReadme"] = profileContent + } + } + default: // default to "repositories" repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{ ListOptions: db.ListOptions{ PageSize: pagingNum, @@ -339,13 +274,6 @@ func Profile(ctx *context.Context) { pager.AddParam(ctx, "date", "Date") } ctx.Data["Page"] = pager - ctx.Data["IsProjectEnabled"] = true - ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled - ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled - - ctx.Data["ShowUserEmail"] = setting.UI.ShowUserEmail && ctx.ContextUser.Email != "" && ctx.IsSigned && !ctx.ContextUser.KeepEmailPrivate - - ctx.HTML(http.StatusOK, tplProfile) } // Action response for follow/unfollow user request |