mirror of
https://github.com/go-gitea/gitea.git
synced 2025-05-07 08:48:48 +03:00

The old logic is incomplete. See the comment for the improved logic. Fix #34011 And more fixes: 1. use empty "alt" for images, otherwise the width is not right when the image fails to load 2. remove the "dropdown icon" patch, because it has been clearly done in "dropdown.js" now 3. remove the "dropdown filtered item" patch, added a clear callback, and improve the logic 4. fix global init when a node is removed and added back gain (eg: the "cherry pick" dialog with a dropdown)
83 lines
2.7 KiB
Go
83 lines
2.7 KiB
Go
// Copyright 2023 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package templates
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"html"
|
|
"html/template"
|
|
|
|
activities_model "code.gitea.io/gitea/models/activities"
|
|
"code.gitea.io/gitea/models/avatars"
|
|
"code.gitea.io/gitea/models/organization"
|
|
repo_model "code.gitea.io/gitea/models/repo"
|
|
user_model "code.gitea.io/gitea/models/user"
|
|
gitea_html "code.gitea.io/gitea/modules/htmlutil"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
)
|
|
|
|
type AvatarUtils struct {
|
|
ctx context.Context
|
|
}
|
|
|
|
func NewAvatarUtils(ctx context.Context) *AvatarUtils {
|
|
return &AvatarUtils{ctx: ctx}
|
|
}
|
|
|
|
// AvatarHTML creates the HTML for an avatar
|
|
func AvatarHTML(src string, size int, class, name string) template.HTML {
|
|
sizeStr := fmt.Sprintf(`%d`, size)
|
|
|
|
if name == "" {
|
|
name = "avatar"
|
|
}
|
|
|
|
// use empty alt, otherwise if the image fails to load, the width will follow the "alt" text's width
|
|
return template.HTML(`<img loading="lazy" alt="" class="` + class + `" src="` + src + `" title="` + html.EscapeString(name) + `" width="` + sizeStr + `" height="` + sizeStr + `"/>`)
|
|
}
|
|
|
|
// Avatar renders user avatars. args: user, size (int), class (string)
|
|
func (au *AvatarUtils) Avatar(item any, others ...any) template.HTML {
|
|
size, class := gitea_html.ParseSizeAndClass(avatars.DefaultAvatarPixelSize, avatars.DefaultAvatarClass, others...)
|
|
|
|
switch t := item.(type) {
|
|
case *user_model.User:
|
|
src := t.AvatarLinkWithSize(au.ctx, size*setting.Avatar.RenderedSizeFactor)
|
|
if src != "" {
|
|
return AvatarHTML(src, size, class, t.DisplayName())
|
|
}
|
|
case *repo_model.Collaborator:
|
|
src := t.AvatarLinkWithSize(au.ctx, size*setting.Avatar.RenderedSizeFactor)
|
|
if src != "" {
|
|
return AvatarHTML(src, size, class, t.DisplayName())
|
|
}
|
|
case *organization.Organization:
|
|
src := t.AsUser().AvatarLinkWithSize(au.ctx, size*setting.Avatar.RenderedSizeFactor)
|
|
if src != "" {
|
|
return AvatarHTML(src, size, class, t.AsUser().DisplayName())
|
|
}
|
|
}
|
|
|
|
return AvatarHTML(avatars.DefaultAvatarLink(), size, class, "")
|
|
}
|
|
|
|
// AvatarByAction renders user avatars from action. args: action, size (int), class (string)
|
|
func (au *AvatarUtils) AvatarByAction(action *activities_model.Action, others ...any) template.HTML {
|
|
action.LoadActUser(au.ctx)
|
|
return au.Avatar(action.ActUser, others...)
|
|
}
|
|
|
|
// AvatarByEmail renders avatars by email address. args: email, name, size (int), class (string)
|
|
func (au *AvatarUtils) AvatarByEmail(email, name string, others ...any) template.HTML {
|
|
size, class := gitea_html.ParseSizeAndClass(avatars.DefaultAvatarPixelSize, avatars.DefaultAvatarClass, others...)
|
|
src := avatars.GenerateEmailAvatarFastLink(au.ctx, email, size*setting.Avatar.RenderedSizeFactor)
|
|
|
|
if src != "" {
|
|
return AvatarHTML(src, size, class, name)
|
|
}
|
|
|
|
return ""
|
|
}
|