aboutsummaryrefslogtreecommitdiffstats
path: root/routers/web/user/profile.go
diff options
context:
space:
mode:
authorpuni9869 <80308335+puni9869@users.noreply.github.com>2023-07-07 00:29:24 +0530
committerGitHub <noreply@github.com>2023-07-06 18:59:24 +0000
commit2af30f715e64dbb0a3900168e3768ffb36c06392 (patch)
tree9167af942ea3d4ee7e32e756637ae48d6d10041e /routers/web/user/profile.go
parentf0bde0e4f902970d447e3aae628f2dcf6f79e539 (diff)
downloadgitea-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.go148
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