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>
This commit is contained in:
parent
f0bde0e4f9
commit
2af30f715e
30 changed files with 464 additions and 402 deletions
|
@ -336,7 +336,7 @@ func GetUserFollowers(ctx context.Context, u, viewer *User, listOptions db.ListO
|
||||||
|
|
||||||
// GetUserFollowing returns range of user's following.
|
// GetUserFollowing returns range of user's following.
|
||||||
func GetUserFollowing(ctx context.Context, u, viewer *User, listOptions db.ListOptions) ([]*User, int64, error) {
|
func GetUserFollowing(ctx context.Context, u, viewer *User, listOptions db.ListOptions) ([]*User, int64, error) {
|
||||||
sess := db.GetEngine(db.DefaultContext).
|
sess := db.GetEngine(ctx).
|
||||||
Select("`user`.*").
|
Select("`user`.*").
|
||||||
Join("LEFT", "follow", "`user`.id=follow.follow_id").
|
Join("LEFT", "follow", "`user`.id=follow.follow_id").
|
||||||
Where("follow.user_id=?", u.ID).
|
Where("follow.user_id=?", u.ID).
|
||||||
|
|
|
@ -161,7 +161,6 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
|
||||||
}
|
}
|
||||||
ctx.Data["IsOrganizationOwner"] = ctx.Org.IsOwner
|
ctx.Data["IsOrganizationOwner"] = ctx.Org.IsOwner
|
||||||
ctx.Data["IsOrganizationMember"] = ctx.Org.IsMember
|
ctx.Data["IsOrganizationMember"] = ctx.Org.IsMember
|
||||||
ctx.Data["IsProjectEnabled"] = true
|
|
||||||
ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
|
ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
|
||||||
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
|
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
|
||||||
ctx.Data["IsPublicMember"] = func(uid int64) bool {
|
ctx.Data["IsPublicMember"] = func(uid int64) bool {
|
||||||
|
|
|
@ -41,6 +41,7 @@ func MustEnableProjects(ctx *context.Context) {
|
||||||
|
|
||||||
// Projects renders the home page of projects
|
// Projects renders the home page of projects
|
||||||
func Projects(ctx *context.Context) {
|
func Projects(ctx *context.Context) {
|
||||||
|
shared_user.PrepareContextForProfileBigAvatar(ctx)
|
||||||
ctx.Data["Title"] = ctx.Tr("repo.project_board")
|
ctx.Data["Title"] = ctx.Tr("repo.project_board")
|
||||||
|
|
||||||
sortType := ctx.FormTrim("sort")
|
sortType := ctx.FormTrim("sort")
|
||||||
|
|
|
@ -4,35 +4,109 @@
|
||||||
package user
|
package user
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"code.gitea.io/gitea/models/db"
|
||||||
|
"code.gitea.io/gitea/models/organization"
|
||||||
repo_model "code.gitea.io/gitea/models/repo"
|
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/context"
|
||||||
"code.gitea.io/gitea/modules/git"
|
"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/setting"
|
||||||
)
|
)
|
||||||
|
|
||||||
func RenderUserHeader(ctx *context.Context) {
|
// prepareContextForCommonProfile store some common data into context data for user's profile related pages (including the nav menu)
|
||||||
ctx.Data["IsProjectEnabled"] = true
|
// It is designed to be fast and safe to be called multiple times in one request
|
||||||
|
func prepareContextForCommonProfile(ctx *context.Context) {
|
||||||
ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
|
ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
|
||||||
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
|
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
|
||||||
ctx.Data["ContextUser"] = ctx.ContextUser
|
ctx.Data["ContextUser"] = ctx.ContextUser
|
||||||
tab := ctx.FormString("tab")
|
ctx.Data["EnableFeed"] = setting.Other.EnableFeed
|
||||||
ctx.Data["TabName"] = tab
|
ctx.Data["FeedURL"] = ctx.ContextUser.HomeLink()
|
||||||
repo, err := repo_model.GetRepositoryByName(ctx.ContextUser.ID, ".profile")
|
}
|
||||||
if err == nil && !repo.IsEmpty {
|
|
||||||
gitRepo, err := git.OpenRepository(ctx, repo.RepoPath())
|
// PrepareContextForProfileBigAvatar set the context for big avatar view on the profile page
|
||||||
|
func PrepareContextForProfileBigAvatar(ctx *context.Context) {
|
||||||
|
prepareContextForCommonProfile(ctx)
|
||||||
|
|
||||||
|
ctx.Data["IsFollowing"] = ctx.Doer != nil && user_model.IsFollowing(ctx.Doer.ID, ctx.ContextUser.ID)
|
||||||
|
ctx.Data["ShowUserEmail"] = setting.UI.ShowUserEmail && ctx.ContextUser.Email != "" && ctx.IsSigned && !ctx.ContextUser.KeepEmailPrivate
|
||||||
|
|
||||||
|
// Show OpenID URIs
|
||||||
|
openIDs, err := user_model.GetUserOpenIDs(ctx.ContextUser.ID)
|
||||||
|
if err != nil {
|
||||||
|
ctx.ServerError("GetUserOpenIDs", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ctx.Data["OpenIDs"] = openIDs
|
||||||
|
|
||||||
|
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 {
|
if err != nil {
|
||||||
ctx.ServerError("OpenRepository", err)
|
ctx.ServerError("RenderString", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer gitRepo.Close()
|
ctx.Data["RenderedDescription"] = content
|
||||||
commit, err := gitRepo.GetBranchCommit(repo.DefaultBranch)
|
}
|
||||||
if err != nil {
|
|
||||||
ctx.ServerError("GetBranchCommit", err)
|
showPrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID)
|
||||||
return
|
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
|
||||||
|
|
||||||
|
// in case the numbers are already provided by other functions, no need to query again (which is slow)
|
||||||
|
if _, ok := ctx.Data["NumFollowers"]; !ok {
|
||||||
|
_, ctx.Data["NumFollowers"], _ = user_model.GetUserFollowers(ctx, ctx.ContextUser, ctx.Doer, db.ListOptions{PageSize: 1, Page: 1})
|
||||||
|
}
|
||||||
|
if _, ok := ctx.Data["NumFollowing"]; !ok {
|
||||||
|
_, ctx.Data["NumFollowing"], _ = user_model.GetUserFollowing(ctx, ctx.ContextUser, ctx.Doer, db.ListOptions{PageSize: 1, Page: 1})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func FindUserProfileReadme(ctx *context.Context) (profileGitRepo *git.Repository, profileReadmeBlob *git.Blob, profileClose func()) {
|
||||||
|
profileDbRepo, err := repo_model.GetRepositoryByName(ctx.ContextUser.ID, ".profile")
|
||||||
|
if err == nil && !profileDbRepo.IsEmpty {
|
||||||
|
if profileGitRepo, err = git.OpenRepository(ctx, profileDbRepo.RepoPath()); err != nil {
|
||||||
|
log.Error("FindUserProfileReadme failed to OpenRepository: %v", err)
|
||||||
|
} else {
|
||||||
|
if commit, err := profileGitRepo.GetBranchCommit(profileDbRepo.DefaultBranch); err != nil {
|
||||||
|
log.Error("FindUserProfileReadme failed to GetBranchCommit: %v", err)
|
||||||
|
} else {
|
||||||
|
profileReadmeBlob, _ = commit.GetBlobByPath("README.md")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
blob, err := commit.GetBlobByPath("README.md")
|
}
|
||||||
if err == nil && blob != nil {
|
return profileGitRepo, profileReadmeBlob, func() {
|
||||||
ctx.Data["ProfileReadme"] = true
|
if profileGitRepo != nil {
|
||||||
|
_ = profileGitRepo.Close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RenderUserHeader(ctx *context.Context) {
|
||||||
|
prepareContextForCommonProfile(ctx)
|
||||||
|
|
||||||
|
_, profileReadmeBlob, profileClose := FindUserProfileReadme(ctx)
|
||||||
|
defer profileClose()
|
||||||
|
ctx.Data["HasProfileReadme"] = profileReadmeBlob != nil
|
||||||
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"code.gitea.io/gitea/modules/context"
|
"code.gitea.io/gitea/modules/context"
|
||||||
code_indexer "code.gitea.io/gitea/modules/indexer/code"
|
code_indexer "code.gitea.io/gitea/modules/indexer/code"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
shared_user "code.gitea.io/gitea/routers/web/shared/user"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -23,8 +24,9 @@ func CodeSearch(ctx *context.Context) {
|
||||||
ctx.Redirect(ctx.ContextUser.HomeLink())
|
ctx.Redirect(ctx.ContextUser.HomeLink())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
shared_user.PrepareContextForProfileBigAvatar(ctx)
|
||||||
|
shared_user.RenderUserHeader(ctx)
|
||||||
|
|
||||||
ctx.Data["IsProjectEnabled"] = true
|
|
||||||
ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
|
ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
|
||||||
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
|
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
|
||||||
ctx.Data["Title"] = ctx.Tr("explore.code")
|
ctx.Data["Title"] = ctx.Tr("explore.code")
|
||||||
|
|
|
@ -857,7 +857,7 @@ func UsernameSubRoute(ctx *context.Context) {
|
||||||
context_service.UserAssignmentWeb()(ctx)
|
context_service.UserAssignmentWeb()(ctx)
|
||||||
if !ctx.Written() {
|
if !ctx.Written() {
|
||||||
ctx.Data["EnableFeed"] = setting.Other.EnableFeed
|
ctx.Data["EnableFeed"] = setting.Other.EnableFeed
|
||||||
Profile(ctx)
|
OwnerProfile(ctx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,7 @@ const (
|
||||||
|
|
||||||
// ListPackages displays a list of all packages of the context user
|
// ListPackages displays a list of all packages of the context user
|
||||||
func ListPackages(ctx *context.Context) {
|
func ListPackages(ctx *context.Context) {
|
||||||
|
shared_user.PrepareContextForProfileBigAvatar(ctx)
|
||||||
page := ctx.FormInt("page")
|
page := ctx.FormInt("page")
|
||||||
if page <= 1 {
|
if page <= 1 {
|
||||||
page = 1
|
page = 1
|
||||||
|
@ -259,6 +260,7 @@ func ViewPackageVersion(ctx *context.Context) {
|
||||||
|
|
||||||
// ListPackageVersions lists all versions of a package
|
// ListPackageVersions lists all versions of a package
|
||||||
func ListPackageVersions(ctx *context.Context) {
|
func ListPackageVersions(ctx *context.Context) {
|
||||||
|
shared_user.PrepareContextForProfileBigAvatar(ctx)
|
||||||
p, err := packages_model.GetPackageByName(ctx, ctx.Package.Owner.ID, packages_model.Type(ctx.Params("type")), ctx.Params("name"))
|
p, err := packages_model.GetPackageByName(ctx, ctx.Package.Owner.ID, packages_model.Type(ctx.Params("type")), ctx.Params("name"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == packages_model.ErrPackageNotExist {
|
if err == packages_model.ErrPackageNotExist {
|
||||||
|
|
|
@ -11,22 +11,22 @@ import (
|
||||||
|
|
||||||
activities_model "code.gitea.io/gitea/models/activities"
|
activities_model "code.gitea.io/gitea/models/activities"
|
||||||
"code.gitea.io/gitea/models/db"
|
"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"
|
repo_model "code.gitea.io/gitea/models/repo"
|
||||||
user_model "code.gitea.io/gitea/models/user"
|
user_model "code.gitea.io/gitea/models/user"
|
||||||
"code.gitea.io/gitea/modules/context"
|
"code.gitea.io/gitea/modules/context"
|
||||||
"code.gitea.io/gitea/modules/git"
|
"code.gitea.io/gitea/modules/git"
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/markup"
|
"code.gitea.io/gitea/modules/markup"
|
||||||
"code.gitea.io/gitea/modules/markup/markdown"
|
"code.gitea.io/gitea/modules/markup/markdown"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
"code.gitea.io/gitea/modules/util"
|
"code.gitea.io/gitea/modules/util"
|
||||||
"code.gitea.io/gitea/routers/web/feed"
|
"code.gitea.io/gitea/routers/web/feed"
|
||||||
"code.gitea.io/gitea/routers/web/org"
|
"code.gitea.io/gitea/routers/web/org"
|
||||||
|
shared_user "code.gitea.io/gitea/routers/web/shared/user"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Profile render user's profile page
|
// OwnerProfile render profile page for a user or a organization (aka, repo owner)
|
||||||
func Profile(ctx *context.Context) {
|
func OwnerProfile(ctx *context.Context) {
|
||||||
if strings.Contains(ctx.Req.Header.Get("Accept"), "application/rss+xml") {
|
if strings.Contains(ctx.Req.Header.Get("Accept"), "application/rss+xml") {
|
||||||
feed.ShowUserFeedRSS(ctx)
|
feed.ShowUserFeedRSS(ctx)
|
||||||
return
|
return
|
||||||
|
@ -38,36 +38,22 @@ func Profile(ctx *context.Context) {
|
||||||
|
|
||||||
if ctx.ContextUser.IsOrganization() {
|
if ctx.ContextUser.IsOrganization() {
|
||||||
org.Home(ctx)
|
org.Home(ctx)
|
||||||
return
|
} else {
|
||||||
|
userProfile(ctx)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func userProfile(ctx *context.Context) {
|
||||||
// check view permissions
|
// check view permissions
|
||||||
if !user_model.IsUserVisibleToViewer(ctx, ctx.ContextUser, ctx.Doer) {
|
if !user_model.IsUserVisibleToViewer(ctx, ctx.ContextUser, ctx.Doer) {
|
||||||
ctx.NotFound("user", fmt.Errorf(ctx.ContextUser.Name))
|
ctx.NotFound("user", fmt.Errorf(ctx.ContextUser.Name))
|
||||||
return
|
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["Title"] = ctx.ContextUser.DisplayName()
|
||||||
ctx.Data["PageIsUserProfile"] = true
|
ctx.Data["PageIsUserProfile"] = true
|
||||||
ctx.Data["ContextUser"] = ctx.ContextUser
|
|
||||||
ctx.Data["OpenIDs"] = openIDs
|
|
||||||
ctx.Data["IsFollowing"] = isFollowing
|
|
||||||
|
|
||||||
|
// prepare heatmap data
|
||||||
if setting.Service.EnableUserHeatmap {
|
if setting.Service.EnableUserHeatmap {
|
||||||
data, err := activities_model.GetUserHeatmapDataByUser(ctx.ContextUser, ctx.Doer)
|
data, err := activities_model.GetUserHeatmapDataByUser(ctx.ContextUser, ctx.Doer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -78,75 +64,28 @@ func Profile(ctx *context.Context) {
|
||||||
ctx.Data["HeatmapTotalContributions"] = activities_model.GetTotalContributionsInHeatmap(data)
|
ctx.Data["HeatmapTotalContributions"] = activities_model.GetTotalContributionsInHeatmap(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(ctx.ContextUser.Description) != 0 {
|
profileGitRepo, profileReadmeBlob, profileClose := shared_user.FindUserProfileReadme(ctx)
|
||||||
content, err := markdown.RenderString(&markup.RenderContext{
|
defer profileClose()
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
showPrivate := ctx.IsSigned && (ctx.Doer.IsAdmin || ctx.Doer.ID == ctx.ContextUser.ID)
|
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{
|
func prepareUserProfileTabData(ctx *context.Context, showPrivate bool, profileGitRepo *git.Repository, profileReadme *git.Blob) {
|
||||||
UserID: ctx.ContextUser.ID,
|
// if there is a profile readme, default to "overview" page, otherwise, default to "repositories" page
|
||||||
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
|
|
||||||
|
|
||||||
tab := ctx.FormString("tab")
|
tab := ctx.FormString("tab")
|
||||||
|
if tab == "" {
|
||||||
|
if profileReadme != nil {
|
||||||
|
tab = "overview"
|
||||||
|
} else {
|
||||||
|
tab = "repositories"
|
||||||
|
}
|
||||||
|
}
|
||||||
ctx.Data["TabName"] = tab
|
ctx.Data["TabName"] = tab
|
||||||
|
ctx.Data["HasProfileReadme"] = profileReadme != nil
|
||||||
|
|
||||||
page := ctx.FormInt("page")
|
page := ctx.FormInt("page")
|
||||||
if page <= 0 {
|
if page <= 0 {
|
||||||
|
@ -154,12 +93,7 @@ func Profile(ctx *context.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pagingNum := setting.UI.User.RepoPagingNum
|
pagingNum := setting.UI.User.RepoPagingNum
|
||||||
if tab == "activity" {
|
|
||||||
pagingNum = setting.UI.FeedPagingNum
|
|
||||||
}
|
|
||||||
|
|
||||||
topicOnly := ctx.FormBool("topic")
|
topicOnly := ctx.FormBool("topic")
|
||||||
|
|
||||||
var (
|
var (
|
||||||
repos []*repo_model.Repository
|
repos []*repo_model.Repository
|
||||||
count int64
|
count int64
|
||||||
|
@ -228,6 +162,7 @@ func Profile(ctx *context.Context) {
|
||||||
total = int(count)
|
total = int(count)
|
||||||
case "activity":
|
case "activity":
|
||||||
date := ctx.FormString("date")
|
date := ctx.FormString("date")
|
||||||
|
pagingNum = setting.UI.FeedPagingNum
|
||||||
items, count, err := activities_model.GetFeeds(ctx, activities_model.GetFeedsOptions{
|
items, count, err := activities_model.GetFeeds(ctx, activities_model.GetFeedsOptions{
|
||||||
RequestedUser: ctx.ContextUser,
|
RequestedUser: ctx.ContextUser,
|
||||||
Actor: ctx.Doer,
|
Actor: ctx.Doer,
|
||||||
|
@ -271,16 +206,6 @@ func Profile(ctx *context.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
total = int(count)
|
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":
|
case "watching":
|
||||||
repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
|
repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
|
||||||
ListOptions: db.ListOptions{
|
ListOptions: db.ListOptions{
|
||||||
|
@ -303,7 +228,17 @@ func Profile(ctx *context.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
total = int(count)
|
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{
|
repos, count, err = repo_model.SearchRepository(ctx, &repo_model.SearchRepoOptions{
|
||||||
ListOptions: db.ListOptions{
|
ListOptions: db.ListOptions{
|
||||||
PageSize: pagingNum,
|
PageSize: pagingNum,
|
||||||
|
@ -339,13 +274,6 @@ func Profile(ctx *context.Context) {
|
||||||
pager.AddParam(ctx, "date", "Date")
|
pager.AddParam(ctx, "date", "Date")
|
||||||
}
|
}
|
||||||
ctx.Data["Page"] = pager
|
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
|
// Action response for follow/unfollow user request
|
||||||
|
|
17
templates/code/searchcombo.tmpl
Normal file
17
templates/code/searchcombo.tmpl
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
{{template "code/searchform" .}}
|
||||||
|
<div class="divider"></div>
|
||||||
|
<div class="ui user list">
|
||||||
|
{{if .CodeIndexerUnavailable}}
|
||||||
|
<div class="ui error message">
|
||||||
|
<p>{{$.locale.Tr "explore.code_search_unavailable"}}</p>
|
||||||
|
</div>
|
||||||
|
{{else if .SearchResults}}
|
||||||
|
<h3>
|
||||||
|
{{.locale.Tr "explore.code_search_results" (.Keyword|Escape) | Str2html}}
|
||||||
|
</h3>
|
||||||
|
{{template "code/searchresults" .}}
|
||||||
|
{{else if .Keyword}}
|
||||||
|
<div>{{$.locale.Tr "explore.code_no_results"}}</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
{{template "base/paginate" .}}
|
|
@ -2,24 +2,7 @@
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content explore users">
|
<div role="main" aria-label="{{.Title}}" class="page-content explore users">
|
||||||
{{template "explore/navbar" .}}
|
{{template "explore/navbar" .}}
|
||||||
<div class="ui container">
|
<div class="ui container">
|
||||||
{{template "code/searchform" .}}
|
{{template "code/searchcombo" .}}
|
||||||
<div class="divider"></div>
|
|
||||||
<div class="ui user list">
|
|
||||||
{{if .CodeIndexerUnavailable}}
|
|
||||||
<div class="ui error message">
|
|
||||||
<p>{{$.locale.Tr "explore.code_search_unavailable"}}</p>
|
|
||||||
</div>
|
|
||||||
{{else if .SearchResults}}
|
|
||||||
<h3>
|
|
||||||
{{.locale.Tr "explore.code_search_results" (.Keyword|Escape) | Str2html}}
|
|
||||||
</h3>
|
|
||||||
{{template "code/searchresults" .}}
|
|
||||||
{{else if .Keyword}}
|
|
||||||
<div>{{$.locale.Tr "explore.code_no_results"}}</div>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{template "base/paginate" .}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{template "base/footer" .}}
|
{{template "base/footer" .}}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<div class="ui tabs container">
|
<div class="ui container">
|
||||||
<div class="ui secondary stackable pointing menu">
|
<div class="ui secondary stackable pointing menu">
|
||||||
<a class="{{if .PageIsViewRepositories}}active {{end}}item" href="{{$.Org.HomeLink}}">
|
<a class="{{if .PageIsViewRepositories}}active {{end}}item" href="{{$.Org.HomeLink}}">
|
||||||
{{svg "octicon-repo"}} {{.locale.Tr "user.repositories"}}
|
{{svg "octicon-repo"}} {{.locale.Tr "user.repositories"}}
|
||||||
|
@ -6,7 +6,7 @@
|
||||||
<div class="ui small label">{{.ContextUser.NumRepos}}</div>
|
<div class="ui small label">{{.ContextUser.NumRepos}}</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
</a>
|
</a>
|
||||||
{{if and .IsProjectEnabled .CanReadProjects}}
|
{{if .CanReadProjects}}
|
||||||
<a class="{{if .PageIsViewProjects}}active {{end}}item" href="{{$.Org.HomeLink}}/-/projects">
|
<a class="{{if .PageIsViewProjects}}active {{end}}item" href="{{$.Org.HomeLink}}/-/projects">
|
||||||
{{svg "octicon-project-symlink"}} {{.locale.Tr "user.projects"}}
|
{{svg "octicon-project-symlink"}} {{.locale.Tr "user.projects"}}
|
||||||
</a>
|
</a>
|
||||||
|
|
|
@ -1,6 +1,27 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository packages">
|
{{if .ContextUser.IsOrganization}}
|
||||||
{{template "user/overview/header" .}}
|
<div role="main" aria-label="{{.Title}}" class="page-content repository packages">
|
||||||
{{template "projects/list" .}}
|
{{template "shared/user/org_profile_avatar" .}}
|
||||||
</div>
|
<div class="ui container">
|
||||||
|
{{template "user/overview/header" .}}
|
||||||
|
{{template "projects/list" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<div role="main" aria-label="{{.Title}}" class="page-content user profile">
|
||||||
|
<div class="ui container">
|
||||||
|
<div class="ui stackable grid">
|
||||||
|
<div class="ui four wide column">
|
||||||
|
{{template "shared/user/profile_big_avatar" .}}
|
||||||
|
</div>
|
||||||
|
<div class="ui twelve wide column">
|
||||||
|
<div class="gt-mb-4">
|
||||||
|
{{template "user/overview/header" .}}
|
||||||
|
</div>
|
||||||
|
{{template "projects/list" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
{{template "base/footer" .}}
|
{{template "base/footer" .}}
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content organization projects edit-project new">
|
<div role="main" aria-label="{{.Title}}" class="page-content organization projects edit-project new">
|
||||||
|
{{template "shared/user/org_profile_avatar" .}}
|
||||||
|
<div class="ui container">
|
||||||
{{template "user/overview/header" .}}
|
{{template "user/overview/header" .}}
|
||||||
{{template "projects/new" .}}
|
{{template "projects/new" .}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{template "base/footer" .}}
|
{{template "base/footer" .}}
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository packages">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository packages">
|
||||||
|
{{template "shared/user/org_profile_avatar" .}}
|
||||||
|
<div class="ui container">
|
||||||
{{template "user/overview/header" .}}
|
{{template "user/overview/header" .}}
|
||||||
{{template "projects/view" .}}
|
{{template "projects/view" .}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{template "base/footer" .}}
|
{{template "base/footer" .}}
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository settings options">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository settings options">
|
||||||
{{template "user/overview/header" .}}
|
{{template "shared/user/org_profile_avatar" .}}
|
||||||
<div class="ui container">
|
<div class="ui container">
|
||||||
|
{{template "user/overview/header" .}}
|
||||||
{{template "base/alert" .}}
|
{{template "base/alert" .}}
|
||||||
<p><a href="{{.PackageDescriptor.FullWebLink}}">{{.PackageDescriptor.Package.Name}} ({{.PackageDescriptor.Version.Version}})</a> / <strong>{{.locale.Tr "repo.settings"}}</strong></p>
|
<p><a href="{{.PackageDescriptor.FullWebLink}}">{{.PackageDescriptor.Package.Name}} ({{.PackageDescriptor.Version.Version}})</a> / <strong>{{.locale.Tr "repo.settings"}}</strong></p>
|
||||||
<h4 class="ui top attached header">
|
<h4 class="ui top attached header">
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
<div class="ui container">
|
|
||||||
{{template "base/alert" .}}
|
{{template "base/alert" .}}
|
||||||
<form class="ui form ignore-dirty">
|
<form class="ui form ignore-dirty">
|
||||||
<div class="ui fluid action input">
|
<div class="ui fluid action input">
|
||||||
|
@ -37,7 +36,7 @@
|
||||||
</li>
|
</li>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{if not .HasPackages}}
|
{{if not .HasPackages}}
|
||||||
<div class="empty center">
|
<div class="gt-pt-5 empty center">
|
||||||
{{svg "octicon-package" 48}}
|
{{svg "octicon-package" 48}}
|
||||||
<h2>{{.locale.Tr "packages.empty"}}</h2>
|
<h2>{{.locale.Tr "packages.empty"}}</h2>
|
||||||
{{if and .Repository .CanWritePackages}}
|
{{if and .Repository .CanWritePackages}}
|
||||||
|
@ -52,4 +51,3 @@
|
||||||
{{end}}
|
{{end}}
|
||||||
{{template "base/paginate" .}}
|
{{template "base/paginate" .}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
<div class="ui container">
|
|
||||||
<p><a href="{{.PackageDescriptor.PackageWebLink}}">{{.PackageDescriptor.Package.Name}}</a> / <strong>{{.locale.Tr "packages.versions"}}</strong></p>
|
<p><a href="{{.PackageDescriptor.PackageWebLink}}">{{.PackageDescriptor.Package.Name}}</a> / <strong>{{.locale.Tr "packages.versions"}}</strong></p>
|
||||||
<form class="ui form ignore-dirty">
|
<form class="ui form ignore-dirty">
|
||||||
<div class="ui fluid action input">
|
<div class="ui fluid action input">
|
||||||
|
@ -36,4 +35,3 @@
|
||||||
{{end}}
|
{{end}}
|
||||||
{{template "base/paginate" .}}
|
{{template "base/paginate" .}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository view issue packages">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository view issue packages">
|
||||||
{{template "user/overview/header" .}}
|
{{template "shared/user/org_profile_avatar" .}}
|
||||||
<div class="ui container">
|
<div class="ui container">
|
||||||
|
{{template "user/overview/header" .}}
|
||||||
<div class="issue-title-header">
|
<div class="issue-title-header">
|
||||||
<div class="issue-title">
|
<div class="issue-title">
|
||||||
<h1>{{.PackageDescriptor.Package.Name}} ({{.PackageDescriptor.Version.Version}})</h1>
|
<h1>{{.PackageDescriptor.Package.Name}} ({{.PackageDescriptor.Version.Version}})</h1>
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository projects">
|
|
||||||
<div class="ui container">
|
|
||||||
{{if .CanWriteProjects}}
|
{{if .CanWriteProjects}}
|
||||||
<div class="navbar">
|
<div class="gt-tr">
|
||||||
<div class="ui right">
|
<a class="ui small green button" href="{{$.Link}}/new">{{.locale.Tr "repo.projects.new"}}</a>
|
||||||
<a class="ui small green button" href="{{$.Link}}/new">{{.locale.Tr "repo.projects.new"}}</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="divider"></div>
|
<div class="divider"></div>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
@ -75,8 +71,6 @@
|
||||||
|
|
||||||
{{template "base/paginate" .}}
|
{{template "base/paginate" .}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{if $.CanWriteProjects}}
|
{{if $.CanWriteProjects}}
|
||||||
<div class="ui g-modal-confirm delete modal">
|
<div class="ui g-modal-confirm delete modal">
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
<div class="ui container">
|
|
||||||
<h2 class="ui dividing header">
|
<h2 class="ui dividing header">
|
||||||
{{if .PageIsEditProjects}}
|
{{if .PageIsEditProjects}}
|
||||||
{{.locale.Tr "repo.projects.edit"}}
|
{{.locale.Tr "repo.projects.edit"}}
|
||||||
|
@ -55,7 +54,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="ui container">
|
|
||||||
<div class="divider"></div>
|
<div class="divider"></div>
|
||||||
<div class="ui left">
|
<div class="ui left">
|
||||||
<a class="ui cancel button" href="{{$.CancelLink}}">
|
<a class="ui cancel button" href="{{$.CancelLink}}">
|
||||||
|
@ -65,6 +63,4 @@
|
||||||
{{if .PageIsEditProjects}}{{.locale.Tr "repo.projects.modify"}}{{else}}{{.locale.Tr "repo.projects.create"}}{{end}}
|
{{if .PageIsEditProjects}}{{.locale.Tr "repo.projects.modify"}}{{else}}{{.locale.Tr "repo.projects.create"}}{{end}}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository packages">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository packages">
|
||||||
{{template "repo/header" .}}
|
{{template "repo/header" .}}
|
||||||
|
<div class="ui container">
|
||||||
{{template "package/shared/list" .}}
|
{{template "package/shared/list" .}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{template "base/footer" .}}
|
{{template "base/footer" .}}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository projects edit-project new milestone">
|
<div role="main" aria-label="{{.Title}}" class="page-content repository projects edit-project new milestone">
|
||||||
{{template "repo/header" .}}
|
{{template "repo/header" .}}
|
||||||
|
<div class="ui container">
|
||||||
{{template "projects/new" .}}
|
{{template "projects/new" .}}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{template "base/footer" .}}
|
{{template "base/footer" .}}
|
||||||
|
|
16
templates/shared/user/org_profile_avatar.tmpl
Normal file
16
templates/shared/user/org_profile_avatar.tmpl
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{{with .ContextUser}}
|
||||||
|
<div class="ui container">
|
||||||
|
<div class="ui vertically grid head">
|
||||||
|
<div class="column">
|
||||||
|
<div class="ui header">
|
||||||
|
{{avatar $.Context . 100}}
|
||||||
|
<span class="text thin grey"><a href="{{.HomeLink}}">{{.DisplayName}}</a></span>
|
||||||
|
<span class="org-visibility">
|
||||||
|
{{if .Visibility.IsLimited}}<div class="ui medium basic horizontal label">{{$.locale.Tr "org.settings.visibility.limited_shortname"}}</div>{{end}}
|
||||||
|
{{if .Visibility.IsPrivate}}<div class="ui medium basic horizontal label">{{$.locale.Tr "org.settings.visibility.private_shortname"}}</div>{{end}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
116
templates/shared/user/profile_big_avatar.tmpl
Normal file
116
templates/shared/user/profile_big_avatar.tmpl
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
<div class="ui card">
|
||||||
|
<div id="profile-avatar" class="content gt-df">
|
||||||
|
{{if eq .SignedUserID .ContextUser.ID}}
|
||||||
|
<a class="image" href="{{AppSubUrl}}/user/settings" data-tooltip-content="{{.locale.Tr "user.change_avatar"}}">
|
||||||
|
{{/* the size doesn't take affect (and no need to take affect), image size(width) should be controlled by the parent container since this is not a flex layout*/}}
|
||||||
|
{{avatar $.Context .ContextUser 256}}
|
||||||
|
</a>
|
||||||
|
{{else}}
|
||||||
|
<span class="image">
|
||||||
|
{{avatar $.Context .ContextUser 256}}
|
||||||
|
</span>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
<div class="content gt-word-break profile-avatar-name">
|
||||||
|
{{if .ContextUser.FullName}}<span class="header text center">{{.ContextUser.FullName}}</span>{{end}}
|
||||||
|
<span class="username text center">{{.ContextUser.Name}}</span>
|
||||||
|
{{if .EnableFeed}}
|
||||||
|
<a href="{{.ContextUser.HomeLink}}.rss"><i class="ui text grey gt-ml-3" data-tooltip-content="{{.locale.Tr "rss_feed"}}">{{svg "octicon-rss" 18}}</i></a>
|
||||||
|
{{end}}
|
||||||
|
<div class="gt-mt-3">
|
||||||
|
<a class="muted" href="{{.ContextUser.HomeLink}}?tab=followers">{{svg "octicon-person" 18 "gt-mr-2"}}{{.NumFollowers}} {{.locale.Tr "user.followers"}}</a> · <a class="muted" href="{{.ContextUser.HomeLink}}?tab=following">{{.NumFollowing}} {{.locale.Tr "user.following"}}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="extra content gt-word-break">
|
||||||
|
<ul>
|
||||||
|
{{if .ContextUser.Location}}
|
||||||
|
<li>{{svg "octicon-location"}} {{.ContextUser.Location}}</li>
|
||||||
|
{{end}}
|
||||||
|
{{if (eq .SignedUserID .ContextUser.ID)}}
|
||||||
|
<li>
|
||||||
|
{{svg "octicon-mail"}}
|
||||||
|
<a href="mailto:{{.ContextUser.Email}}" rel="nofollow">{{.ContextUser.Email}}</a>
|
||||||
|
<a href="{{AppSubUrl}}/user/settings#keep-email-private">
|
||||||
|
{{if .ShowUserEmail}}
|
||||||
|
<i class="ui right" data-tooltip-content="{{.locale.Tr "user.email_visibility.limited"}}">
|
||||||
|
{{svg "octicon-unlock"}}
|
||||||
|
</i>
|
||||||
|
{{else}}
|
||||||
|
<i class="ui right" data-tooltip-content="{{.locale.Tr "user.email_visibility.private"}}">
|
||||||
|
{{svg "octicon-lock"}}
|
||||||
|
</i>
|
||||||
|
{{end}}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{{else}}
|
||||||
|
{{if .ShowUserEmail}}
|
||||||
|
<li>
|
||||||
|
{{svg "octicon-mail"}}
|
||||||
|
<a href="mailto:{{.ContextUser.Email}}" rel="nofollow">{{.ContextUser.Email}}</a>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{if .ContextUser.Website}}
|
||||||
|
<li>
|
||||||
|
{{svg "octicon-link"}}
|
||||||
|
<a target="_blank" rel="noopener noreferrer me" href="{{.ContextUser.Website}}">{{.ContextUser.Website}}</a>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
{{if $.RenderedDescription}}
|
||||||
|
<li>
|
||||||
|
<div class="render-content markup">{{$.RenderedDescription|Str2html}}</div>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
{{range .OpenIDs}}
|
||||||
|
{{if .Show}}
|
||||||
|
<li>
|
||||||
|
{{svg "fontawesome-openid"}}
|
||||||
|
<a target="_blank" rel="noopener noreferrer" href="{{.URI}}">{{.URI}}</a>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
<li>{{svg "octicon-clock"}} {{.locale.Tr "user.joined_on" (DateTime "short" .ContextUser.CreatedUnix) | Safe}}</li>
|
||||||
|
{{if and .Orgs .HasOrgsVisible}}
|
||||||
|
<li>
|
||||||
|
<ul class="user-orgs">
|
||||||
|
{{range .Orgs}}
|
||||||
|
{{if (or .Visibility.IsPublic (and ($.SignedUser) (or .Visibility.IsLimited (and (.HasMemberWithUserID $.SignedUserID) .Visibility.IsPrivate) ($.IsAdmin))))}}
|
||||||
|
<li>
|
||||||
|
<a href="{{.HomeLink}}" data-tooltip-content="{{.Name}}">
|
||||||
|
{{avatar $.Context .}}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
{{if .Badges}}
|
||||||
|
<li>
|
||||||
|
<ul class="user-badges">
|
||||||
|
{{range .Badges}}
|
||||||
|
<li>
|
||||||
|
<img width="64" height="64" src="{{.ImageURL}}" alt="{{.Description}}" data-tooltip-content="{{.Description}}">
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
{{if and .IsSigned (ne .SignedUserID .ContextUser.ID)}}
|
||||||
|
<li class="follow">
|
||||||
|
{{if $.IsFollowing}}
|
||||||
|
<form method="post" action="{{.Link}}?action=unfollow&redirect_to={{$.Link}}">
|
||||||
|
{{$.CsrfTokenHtml}}
|
||||||
|
<button type="submit" class="ui basic red button">{{svg "octicon-person"}} {{.locale.Tr "user.unfollow"}}</button>
|
||||||
|
</form>
|
||||||
|
{{else}}
|
||||||
|
<form method="post" action="{{.Link}}?action=follow&redirect_to={{$.Link}}">
|
||||||
|
{{$.CsrfTokenHtml}}
|
||||||
|
<button type="submit" class="ui basic green button">{{svg "octicon-person"}} {{.locale.Tr "user.follow"}}</button>
|
||||||
|
</form>
|
||||||
|
{{end}}
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -1,25 +1,25 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository code-search">
|
{{if .ContextUser.IsOrganization}}
|
||||||
{{template "user/overview/header" .}}
|
<div role="main" aria-label="{{.Title}}" class="page-content repository">
|
||||||
<div class="ui container">
|
{{template "shared/user/org_profile_avatar" .}}
|
||||||
{{template "code/searchform" .}}
|
<div class="ui container">
|
||||||
<div class="divider"></div>
|
{{template "user/overview/header" .}}
|
||||||
<div class="ui user list">
|
{{template "code/searchcombo" .}}
|
||||||
{{if .CodeIndexerUnavailable}}
|
|
||||||
<div class="ui error message">
|
|
||||||
<p>{{$.locale.Tr "explore.code_search_unavailable"}}</p>
|
|
||||||
</div>
|
|
||||||
{{else if .SearchResults}}
|
|
||||||
<h3>
|
|
||||||
{{.locale.Tr "explore.code_search_results" (.Keyword|Escape) | Str2html}}
|
|
||||||
</h3>
|
|
||||||
{{template "code/searchresults" .}}
|
|
||||||
{{else if .Keyword}}
|
|
||||||
<div>{{$.locale.Tr "explore.code_no_results"}}</div>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{template "base/paginate" .}}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{{else}}
|
||||||
|
<div role="main" aria-label="{{.Title}}" class="page-content user profile">
|
||||||
|
<div class="ui container">
|
||||||
|
<div class="ui stackable grid">
|
||||||
|
<div class="ui four wide column">
|
||||||
|
{{template "shared/user/profile_big_avatar" .}}
|
||||||
|
</div>
|
||||||
|
<div class="ui twelve wide column">
|
||||||
|
{{template "user/overview/header" .}}
|
||||||
|
{{template "code/searchcombo" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
{{template "base/footer" .}}
|
{{template "base/footer" .}}
|
||||||
|
|
|
@ -1,92 +1,69 @@
|
||||||
<!-- TODO: make template org and user can share -->
|
<div class="ui secondary stackable pointing menu">
|
||||||
{{if or (.IsPackagesPage) (.PageIsViewProjects)}}
|
{{if .HasProfileReadme}}
|
||||||
{{with .ContextUser}}
|
<a class='{{if eq .TabName "overview"}}active {{end}}item' href="{{.ContextUser.HomeLink}}?tab=overview">
|
||||||
<div class="ui container">
|
{{svg "octicon-info"}} {{.locale.Tr "user.overview"}}
|
||||||
<div class="ui vertically grid head">
|
</a>
|
||||||
<div class="column">
|
{{end}}
|
||||||
<div class="ui header">
|
<a class="{{if eq .TabName "repositories"}}active {{end}} item" href="{{.ContextUser.HomeLink}}?tab=repositories">
|
||||||
{{avatar $.Context . 100}}
|
{{svg "octicon-repo"}} {{.locale.Tr "user.repositories"}}
|
||||||
<span class="text thin grey"><a href="{{.HomeLink}}">{{.DisplayName}}</a></span>
|
{{if .ContextUser.NumRepos}}
|
||||||
<span class="org-visibility">
|
<div class="ui small label">{{.ContextUser.NumRepos}}</div>
|
||||||
{{if .Visibility.IsLimited}}<div class="ui medium basic horizontal label">{{$.locale.Tr "org.settings.visibility.limited_shortname"}}</div>{{end}}
|
{{end}}
|
||||||
{{if .Visibility.IsPrivate}}<div class="ui medium basic horizontal label">{{$.locale.Tr "org.settings.visibility.private_shortname"}}</div>{{end}}
|
</a>
|
||||||
</span>
|
{{if or .ContextUser.IsIndividual (and .ContextUser.IsOrganization .CanReadProjects)}}
|
||||||
</div>
|
<a href="{{.ContextUser.HomeLink}}/-/projects" class="{{if .PageIsViewProjects}}active {{end}}item">
|
||||||
</div>
|
{{svg "octicon-project-symlink"}} {{.locale.Tr "user.projects"}}
|
||||||
</div>
|
</a>
|
||||||
</div>
|
{{end}}
|
||||||
|
{{if and .IsPackageEnabled (or .ContextUser.IsIndividual (and .ContextUser.IsOrganization .CanReadPackages))}}
|
||||||
|
<a href="{{.ContextUser.HomeLink}}/-/packages" class="{{if .IsPackagesPage}}active {{end}}item">
|
||||||
|
{{svg "octicon-package"}} {{.locale.Tr "packages.title"}}
|
||||||
|
</a>
|
||||||
|
{{end}}
|
||||||
|
{{if and .IsRepoIndexerEnabled (or .ContextUser.IsIndividual (and .ContextUser.IsOrganization .CanReadCode))}}
|
||||||
|
<a href="{{.ContextUser.HomeLink}}/-/code" class="{{if .IsCodePage}}active {{end}}item">
|
||||||
|
{{svg "octicon-code"}} {{.locale.Tr "user.code"}}
|
||||||
|
</a>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{end}}
|
|
||||||
|
|
||||||
<div class="ui tabs container">
|
{{if .ContextUser.IsOrganization}}
|
||||||
<div class="ui secondary stackable pointing menu">
|
{{if .IsOrganizationMember}}
|
||||||
{{if .ProfileReadme}}
|
<a class="item" href="{{$.OrgLink}}/members">
|
||||||
<a class='{{if or (eq .TabName "overview") (and (eq .TabName "") (not .IsPackagesPage) (not .PageIsViewProjects))}}active {{end}}item' href="{{.ContextUser.HomeLink}}?tab=overview">
|
{{svg "octicon-person"}} {{$.locale.Tr "org.members"}}
|
||||||
{{svg "octicon-info"}} {{.locale.Tr "user.overview"}}
|
{{if .NumMembers}}
|
||||||
</a>
|
<div class="ui small label">{{.NumMembers}}</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
<a class="{{if or (eq .TabName "repositories") (and (eq .TabName "") (not .IsPackagesPage) (not .PageIsViewProjects) (not .ProfileReadme))}}active {{end}} item" href="{{.ContextUser.HomeLink}}?tab=repositories">
|
|
||||||
{{svg "octicon-repo"}} {{.locale.Tr "user.repositories"}}
|
|
||||||
{{if .ContextUser.NumRepos}}
|
|
||||||
<div class="ui small label">{{.ContextUser.NumRepos}}</div>
|
|
||||||
{{end}}
|
|
||||||
</a>
|
|
||||||
{{if and .IsProjectEnabled (or .ContextUser.IsIndividual (and .ContextUser.IsOrganization .CanReadProjects))}}
|
|
||||||
<a href="{{.ContextUser.HomeLink}}/-/projects" class="{{if .PageIsViewProjects}}active {{end}}item">
|
|
||||||
{{svg "octicon-project-symlink"}} {{.locale.Tr "user.projects"}}
|
|
||||||
</a>
|
|
||||||
{{end}}
|
|
||||||
{{if and .IsPackageEnabled (or .ContextUser.IsIndividual (and .ContextUser.IsOrganization .CanReadPackages))}}
|
|
||||||
<a href="{{.ContextUser.HomeLink}}/-/packages" class="{{if .IsPackagesPage}}active {{end}}item">
|
|
||||||
{{svg "octicon-package"}} {{.locale.Tr "packages.title"}}
|
|
||||||
</a>
|
</a>
|
||||||
{{end}}
|
<a class="item" href="{{$.OrgLink}}/teams">
|
||||||
{{if and .IsRepoIndexerEnabled (or .ContextUser.IsIndividual (and .ContextUser.IsOrganization .CanReadCode))}}
|
{{svg "octicon-people"}} {{$.locale.Tr "org.teams"}}
|
||||||
<a href="{{.ContextUser.HomeLink}}/-/code" class="{{if .IsCodePage}}active {{end}}item">
|
{{if .NumTeams}}
|
||||||
{{svg "octicon-code"}} {{.locale.Tr "user.code"}}
|
<div class="ui small label">{{.NumTeams}}</div>
|
||||||
|
{{end}}
|
||||||
</a>
|
</a>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
{{if .ContextUser.IsOrganization}}
|
{{if .IsOrganizationOwner}}
|
||||||
{{if .IsOrganizationMember}}
|
<div class="right menu">
|
||||||
<a class="item" href="{{$.OrgLink}}/members">
|
<a class="item" href="{{.OrgLink}}/settings">
|
||||||
{{svg "octicon-person"}} {{$.locale.Tr "org.members"}}
|
{{svg "octicon-tools"}} {{.locale.Tr "repo.settings"}}
|
||||||
{{if .NumMembers}}
|
|
||||||
<div class="ui small label">{{.NumMembers}}</div>
|
|
||||||
{{end}}
|
|
||||||
</a>
|
</a>
|
||||||
<a class="item" href="{{$.OrgLink}}/teams">
|
</div>
|
||||||
{{svg "octicon-people"}} {{$.locale.Tr "org.teams"}}
|
{{end}}
|
||||||
{{if .NumTeams}}
|
{{else}}
|
||||||
<div class="ui small label">{{.NumTeams}}</div>
|
<a class='{{if eq .TabName "activity"}}active {{end}}item' href="{{.ContextUser.HomeLink}}?tab=activity">
|
||||||
{{end}}
|
{{svg "octicon-rss"}} {{.locale.Tr "user.activity"}}
|
||||||
</a>
|
</a>
|
||||||
{{end}}
|
{{if not .DisableStars}}
|
||||||
|
<a class='{{if eq .TabName "stars"}}active {{end}}item' href="{{.ContextUser.HomeLink}}?tab=stars">
|
||||||
{{if .IsOrganizationOwner}}
|
{{svg "octicon-star"}} {{.locale.Tr "user.starred"}}
|
||||||
<div class="right menu">
|
{{if .ContextUser.NumStars}}
|
||||||
<a class="item" href="{{.OrgLink}}/settings">
|
<div class="ui small label">{{.ContextUser.NumStars}}</div>
|
||||||
{{svg "octicon-tools"}} {{.locale.Tr "repo.settings"}}
|
{{end}}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
|
||||||
{{end}}
|
|
||||||
{{else}}
|
{{else}}
|
||||||
<a class='{{if eq .TabName "activity"}}active {{end}}item' href="{{.ContextUser.HomeLink}}?tab=activity">
|
<a class='{{if eq .TabName "watching"}}active {{end}}item' href="{{.ContextUser.HomeLink}}?tab=watching">
|
||||||
{{svg "octicon-rss"}} {{.locale.Tr "user.activity"}}
|
{{svg "octicon-eye"}} {{.locale.Tr "user.watched"}}
|
||||||
</a>
|
</a>
|
||||||
{{if not .DisableStars}}
|
|
||||||
<a class='{{if eq .TabName "stars"}}active {{end}}item' href="{{.ContextUser.HomeLink}}?tab=stars">
|
|
||||||
{{svg "octicon-star"}} {{.locale.Tr "user.starred"}}
|
|
||||||
{{if .ContextUser.NumStars}}
|
|
||||||
<div class="ui small label">{{.ContextUser.NumStars}}</div>
|
|
||||||
{{end}}
|
|
||||||
</a>
|
|
||||||
{{else}}
|
|
||||||
<a class='{{if eq .TabName "watching"}}active {{end}}item' href="{{.ContextUser.HomeLink}}?tab=watching">
|
|
||||||
{{svg "octicon-eye"}} {{.locale.Tr "user.watched"}}
|
|
||||||
</a>
|
|
||||||
{{end}}
|
|
||||||
{{end}}
|
{{end}}
|
||||||
|
{{end}}
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,27 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository packages">
|
{{if .ContextUser.IsOrganization}}
|
||||||
{{template "user/overview/header" .}}
|
<div role="main" aria-label="{{.Title}}" class="page-content repository packages">
|
||||||
{{template "package/shared/versionlist" .}}
|
{{template "shared/user/org_profile_avatar" .}}
|
||||||
|
<div class="ui container">
|
||||||
|
{{template "user/overview/header" .}}
|
||||||
|
{{template "package/shared/versionlist" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<div role="main" aria-label="{{.Title}}" class="page-content user profile packages">
|
||||||
|
<div class="ui container">
|
||||||
|
<div class="ui stackable grid">
|
||||||
|
<div class="ui four wide column">
|
||||||
|
{{template "shared/user/profile_big_avatar" .}}
|
||||||
|
</div>
|
||||||
|
<div class="ui twelve wide column">
|
||||||
|
<div class="gt-mb-4">
|
||||||
|
{{template "user/overview/header" .}}
|
||||||
|
</div>
|
||||||
|
{{template "package/shared/versionlist" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{{end}}
|
||||||
{{template "base/footer" .}}
|
{{template "base/footer" .}}
|
||||||
|
|
|
@ -1,6 +1,27 @@
|
||||||
{{template "base/head" .}}
|
{{template "base/head" .}}
|
||||||
<div role="main" aria-label="{{.Title}}" class="page-content repository packages">
|
{{if .ContextUser.IsOrganization}}
|
||||||
{{template "user/overview/header" .}}
|
<div role="main" aria-label="{{.Title}}" class="page-content repository packages">
|
||||||
{{template "package/shared/list" .}}
|
{{template "shared/user/org_profile_avatar" .}}
|
||||||
</div>
|
<div class="ui container">
|
||||||
|
{{template "user/overview/header" .}}
|
||||||
|
{{template "package/shared/list" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<div role="main" aria-label="{{.Title}}" class="page-content user profile packages">
|
||||||
|
<div class="ui container">
|
||||||
|
<div class="ui stackable grid">
|
||||||
|
<div class="ui four wide column">
|
||||||
|
{{template "shared/user/profile_big_avatar" .}}
|
||||||
|
</div>
|
||||||
|
<div class="ui twelve wide column">
|
||||||
|
<div class="gt-mb-4">
|
||||||
|
{{template "user/overview/header" .}}
|
||||||
|
</div>
|
||||||
|
{{template "package/shared/list" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
{{template "base/footer" .}}
|
{{template "base/footer" .}}
|
||||||
|
|
|
@ -3,125 +3,10 @@
|
||||||
<div class="ui container">
|
<div class="ui container">
|
||||||
<div class="ui stackable grid">
|
<div class="ui stackable grid">
|
||||||
<div class="ui four wide column">
|
<div class="ui four wide column">
|
||||||
<div class="ui card">
|
{{template "shared/user/profile_big_avatar" .}}
|
||||||
<div id="profile-avatar" class="content gt-df">
|
|
||||||
{{if eq .SignedUserID .ContextUser.ID}}
|
|
||||||
<a class="image" href="{{AppSubUrl}}/user/settings" data-tooltip-content="{{.locale.Tr "user.change_avatar"}}">
|
|
||||||
{{/* the size doesn't take affect (and no need to take affect), image size(width) should be controlled by the parent container since this is not a flex layout*/}}
|
|
||||||
{{avatar $.Context .ContextUser 256}}
|
|
||||||
</a>
|
|
||||||
{{else}}
|
|
||||||
<span class="image">
|
|
||||||
{{avatar $.Context .ContextUser 256}}
|
|
||||||
</span>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
||||||
<div class="content gt-word-break profile-avatar-name">
|
|
||||||
{{if .ContextUser.FullName}}<span class="header text center">{{.ContextUser.FullName}}</span>{{end}}
|
|
||||||
<span class="username text center">{{.ContextUser.Name}}</span>
|
|
||||||
{{if .EnableFeed}}
|
|
||||||
<a href="{{.ContextUser.HomeLink}}.rss"><i class="ui text grey gt-ml-3" data-tooltip-content="{{.locale.Tr "rss_feed"}}">{{svg "octicon-rss" 18}}</i></a>
|
|
||||||
{{end}}
|
|
||||||
<div class="gt-mt-3">
|
|
||||||
<a class="muted" href="{{.ContextUser.HomeLink}}?tab=followers">{{svg "octicon-person" 18 "gt-mr-2"}}{{.NumFollowers}} {{.locale.Tr "user.followers"}}</a> · <a class="muted" href="{{.ContextUser.HomeLink}}?tab=following">{{.NumFollowing}} {{.locale.Tr "user.following"}}</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="extra content gt-word-break">
|
|
||||||
<ul>
|
|
||||||
{{if .ContextUser.Location}}
|
|
||||||
<li>{{svg "octicon-location"}} {{.ContextUser.Location}}</li>
|
|
||||||
{{end}}
|
|
||||||
{{if (eq .SignedUserID .ContextUser.ID)}}
|
|
||||||
<li>
|
|
||||||
{{svg "octicon-mail"}}
|
|
||||||
<a href="mailto:{{.ContextUser.Email}}" rel="nofollow">{{.ContextUser.Email}}</a>
|
|
||||||
<a href="{{AppSubUrl}}/user/settings#privacy-user-settings">
|
|
||||||
{{if .ShowUserEmail}}
|
|
||||||
<i class="ui right" data-tooltip-content="{{.locale.Tr "user.email_visibility.limited"}}">
|
|
||||||
{{svg "octicon-unlock"}}
|
|
||||||
</i>
|
|
||||||
{{else}}
|
|
||||||
<i class="ui right" data-tooltip-content="{{.locale.Tr "user.email_visibility.private"}}">
|
|
||||||
{{svg "octicon-lock"}}
|
|
||||||
</i>
|
|
||||||
{{end}}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{{else}}
|
|
||||||
{{if .ShowUserEmail}}
|
|
||||||
<li>
|
|
||||||
{{svg "octicon-mail"}}
|
|
||||||
<a href="mailto:{{.ContextUser.Email}}" rel="nofollow">{{.ContextUser.Email}}</a>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
{{end}}
|
|
||||||
{{if .ContextUser.Website}}
|
|
||||||
<li>
|
|
||||||
{{svg "octicon-link"}}
|
|
||||||
<a target="_blank" rel="noopener noreferrer me" href="{{.ContextUser.Website}}">{{.ContextUser.Website}}</a>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
{{if $.RenderedDescription}}
|
|
||||||
<li>
|
|
||||||
<div class="render-content markup">{{$.RenderedDescription|Str2html}}</div>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
{{range .OpenIDs}}
|
|
||||||
{{if .Show}}
|
|
||||||
<li>
|
|
||||||
{{svg "fontawesome-openid"}}
|
|
||||||
<a target="_blank" rel="noopener noreferrer" href="{{.URI}}">{{.URI}}</a>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
{{end}}
|
|
||||||
<li>{{svg "octicon-clock"}} {{.locale.Tr "user.joined_on" (DateTime "short" .ContextUser.CreatedUnix) | Safe}}</li>
|
|
||||||
{{if and .Orgs .HasOrgsVisible}}
|
|
||||||
<li>
|
|
||||||
<ul class="user-orgs">
|
|
||||||
{{range .Orgs}}
|
|
||||||
{{if (or .Visibility.IsPublic (and ($.SignedUser) (or .Visibility.IsLimited (and (.HasMemberWithUserID $.SignedUserID) .Visibility.IsPrivate) ($.IsAdmin))))}}
|
|
||||||
<li>
|
|
||||||
<a href="{{.HomeLink}}" data-tooltip-content="{{.Name}}">
|
|
||||||
{{avatar $.Context .}}
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
{{end}}
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
{{if .Badges}}
|
|
||||||
<li>
|
|
||||||
<ul class="user-badges">
|
|
||||||
{{range .Badges}}
|
|
||||||
<li>
|
|
||||||
<img width="64" height="64" src="{{.ImageURL}}" alt="{{.Description}}" data-tooltip-content="{{.Description}}">
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
{{if and .IsSigned (ne .SignedUserID .ContextUser.ID)}}
|
|
||||||
<li class="follow">
|
|
||||||
{{if $.IsFollowing}}
|
|
||||||
<form method="post" action="{{.Link}}?action=unfollow&redirect_to={{$.Link}}">
|
|
||||||
{{$.CsrfTokenHtml}}
|
|
||||||
<button type="submit" class="ui basic red button">{{svg "octicon-person"}} {{.locale.Tr "user.unfollow"}}</button>
|
|
||||||
</form>
|
|
||||||
{{else}}
|
|
||||||
<form method="post" action="{{.Link}}?action=follow&redirect_to={{$.Link}}">
|
|
||||||
{{$.CsrfTokenHtml}}
|
|
||||||
<button type="submit" class="ui basic green button">{{svg "octicon-person"}} {{.locale.Tr "user.follow"}}</button>
|
|
||||||
</form>
|
|
||||||
{{end}}
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="ui twelve wide column">
|
<div class="ui twelve wide column">
|
||||||
<div class="gt-mb-4 gt-df">
|
<div class="gt-mb-4">
|
||||||
{{template "user/overview/header" .}}
|
{{template "user/overview/header" .}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -145,12 +30,12 @@
|
||||||
{{template "repo/user_cards" .}}
|
{{template "repo/user_cards" .}}
|
||||||
{{else if eq .TabName "followers"}}
|
{{else if eq .TabName "followers"}}
|
||||||
{{template "repo/user_cards" .}}
|
{{template "repo/user_cards" .}}
|
||||||
{{else if or (eq .TabName "repositories") (not .ProfileReadme)}}
|
{{else if eq .TabName "overview"}}
|
||||||
|
<div id="readme_profile" class="markup">{{.ProfileReadme | Str2html}}</div>
|
||||||
|
{{else}}
|
||||||
{{template "explore/repo_search" .}}
|
{{template "explore/repo_search" .}}
|
||||||
{{template "explore/repo_list" .}}
|
{{template "explore/repo_list" .}}
|
||||||
{{template "base/paginate" .}}
|
{{template "base/paginate" .}}
|
||||||
{{else if .ProfileReadme}}
|
|
||||||
<div id="readme_profile" class="render-content markup"> {{$.ProfileReadme|Str2html}} </div>
|
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,6 +11,7 @@ Gitea's private styles use `g-` prefix.
|
||||||
.gt-ab { align-items: baseline !important; }
|
.gt-ab { align-items: baseline !important; }
|
||||||
.gt-tc { text-align: center !important; }
|
.gt-tc { text-align: center !important; }
|
||||||
.gt-tl { text-align: left !important; }
|
.gt-tl { text-align: left !important; }
|
||||||
|
.gt-tr { text-align: right !important; } /* TODO: rename these to "gt-text-right", etc. there are only a few */
|
||||||
.gt-jc { justify-content: center !important; }
|
.gt-jc { justify-content: center !important; }
|
||||||
.gt-js { justify-content: flex-start !important; }
|
.gt-js { justify-content: flex-start !important; }
|
||||||
.gt-je { justify-content: flex-end !important; }
|
.gt-je { justify-content: flex-end !important; }
|
||||||
|
|
Loading…
Reference in a new issue