Use account initial as default avatar (#4002)
* client: use account initial as default avatar * fix UI in user list Avatars was cutted in the top and bottom
This commit is contained in:
parent
75d7495962
commit
0979075453
6 changed files with 88 additions and 16 deletions
|
@ -106,7 +106,7 @@
|
||||||
<td *ngIf="isSelected('username')">
|
<td *ngIf="isSelected('username')">
|
||||||
<a i18n-title title="Open account in a new tab" target="_blank" rel="noopener noreferrer" [routerLink]="[ '/accounts/' + user.username ]">
|
<a i18n-title title="Open account in a new tab" target="_blank" rel="noopener noreferrer" [routerLink]="[ '/accounts/' + user.username ]">
|
||||||
<div class="chip two-lines">
|
<div class="chip two-lines">
|
||||||
<my-account-avatar [account]="user?.account"></my-account-avatar>
|
<my-account-avatar [account]="user?.account" size="32"></my-account-avatar>
|
||||||
<div>
|
<div>
|
||||||
<span class="user-table-primary-text">{{ user.account.displayName }}</span>
|
<span class="user-table-primary-text">{{ user.account.displayName }}</span>
|
||||||
<span class="text-muted">{{ user.username }}</span>
|
<span class="text-muted">{{ user.username }}</span>
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
<ng-template #img>
|
<ng-template #img>
|
||||||
<img [class]="class" [src]="avatarUrl" i18n-alt alt="Account avatar" />
|
<img *ngIf="avatarUrl || !initial" [class]="class" [src]="avatarUrl || defaultAvatarUrl" i18n-alt alt="Account avatar" />
|
||||||
|
<div *ngIf="!avatarUrl && initial" [class]="class">
|
||||||
|
<span>{{ initial }}</span>
|
||||||
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
<a *ngIf="account && href" [href]="href" target="_blank" rel="noopener noreferrer" [title]="title">
|
<a *ngIf="account && href" [href]="href" target="_blank" rel="noopener noreferrer" [title]="title">
|
||||||
|
|
|
@ -5,6 +5,10 @@
|
||||||
@include avatar(25px);
|
@include avatar(25px);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.avatar-32 {
|
||||||
|
@include avatar(32px);
|
||||||
|
}
|
||||||
|
|
||||||
.avatar-34 {
|
.avatar-34 {
|
||||||
@include avatar(34px);
|
@include avatar(34px);
|
||||||
}
|
}
|
||||||
|
@ -19,4 +23,54 @@
|
||||||
|
|
||||||
.avatar-120 {
|
.avatar-120 {
|
||||||
@include avatar(120px);
|
@include avatar(120px);
|
||||||
|
|
||||||
|
&.initial {
|
||||||
|
font-size: 46px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.initial {
|
||||||
|
background-color: #3C2109;
|
||||||
|
color: #fff;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 22px;
|
||||||
|
border-radius: 50%;
|
||||||
|
|
||||||
|
&.blue {
|
||||||
|
background-color: #009FD4;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.green {
|
||||||
|
background-color: #00AA55;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.purple {
|
||||||
|
background-color: #B381B3;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.gray {
|
||||||
|
background-color: #939393;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.yellow {
|
||||||
|
background-color: #AA8F00;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.orange {
|
||||||
|
background-color: #D47500;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.red {
|
||||||
|
background-color: #E76E3C;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.dark-blue {
|
||||||
|
background-color: #0A3055;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -12,7 +12,7 @@ export class AccountAvatarComponent {
|
||||||
avatar?: { url?: string, path: string }
|
avatar?: { url?: string, path: string }
|
||||||
url: string
|
url: string
|
||||||
}
|
}
|
||||||
@Input() size: '25' | '34' | '36' | '40' | '120' = '36'
|
@Input() size: '25' | '32' | '34' | '36' | '40' | '120' = '36'
|
||||||
|
|
||||||
// Use an external link
|
// Use an external link
|
||||||
@Input() href: string
|
@Input() href: string
|
||||||
|
@ -23,6 +23,8 @@ export class AccountAvatarComponent {
|
||||||
this._title = value
|
this._title = value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defaultAvatarUrl = Account.GET_DEFAULT_AVATAR_URL()
|
||||||
|
|
||||||
private _title: string
|
private _title: string
|
||||||
|
|
||||||
get title () {
|
get title () {
|
||||||
|
@ -30,10 +32,31 @@ export class AccountAvatarComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
get class () {
|
get class () {
|
||||||
return `avatar avatar-${this.size}`
|
return `avatar avatar-${this.size}` + (this.avatarUrl ? '' : ` initial ${this.getColorTheme()}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
get avatarUrl () {
|
get avatarUrl () {
|
||||||
return Account.GET_ACTOR_AVATAR_URL(this.account)
|
return Account.GET_ACTOR_AVATAR_URL(this.account)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get initial () {
|
||||||
|
return this.account?.name.slice(0, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
private getColorTheme () {
|
||||||
|
const themes = {
|
||||||
|
abc: 'blue',
|
||||||
|
def: 'green',
|
||||||
|
ghi: 'purple',
|
||||||
|
jkl: 'gray',
|
||||||
|
mno: 'yellow',
|
||||||
|
pqr: 'orange',
|
||||||
|
stv: 'red',
|
||||||
|
wxyz: 'dark-blue'
|
||||||
|
}
|
||||||
|
|
||||||
|
const theme = Object.keys(themes).find(chars => chars.includes(this.initial))
|
||||||
|
|
||||||
|
return themes[theme]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ export class Account extends Actor implements ServerAccount {
|
||||||
userId?: number
|
userId?: number
|
||||||
|
|
||||||
static GET_ACTOR_AVATAR_URL (actor: { avatar?: { url?: string, path: string } }) {
|
static GET_ACTOR_AVATAR_URL (actor: { avatar?: { url?: string, path: string } }) {
|
||||||
return Actor.GET_ACTOR_AVATAR_URL(actor) || this.GET_DEFAULT_AVATAR_URL()
|
return Actor.GET_ACTOR_AVATAR_URL(actor)
|
||||||
}
|
}
|
||||||
|
|
||||||
static GET_DEFAULT_AVATAR_URL () {
|
static GET_DEFAULT_AVATAR_URL () {
|
||||||
|
@ -46,7 +46,7 @@ export class Account extends Actor implements ServerAccount {
|
||||||
|
|
||||||
resetAvatar () {
|
resetAvatar () {
|
||||||
this.avatar = null
|
this.avatar = null
|
||||||
this.avatarUrl = Account.GET_DEFAULT_AVATAR_URL()
|
this.avatarUrl = null
|
||||||
}
|
}
|
||||||
|
|
||||||
private updateComputedAttributes () {
|
private updateComputedAttributes () {
|
||||||
|
|
|
@ -830,17 +830,9 @@
|
||||||
--chip-padding: .2rem .3rem;
|
--chip-padding: .2rem .3rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.avatar {
|
::ng-deep .avatar {
|
||||||
margin-left: -.4rem;
|
margin-left: -.4rem;
|
||||||
margin-right: .2rem;
|
margin-right: .2rem;
|
||||||
height: $avatar-height;
|
|
||||||
width: $avatar-height;
|
|
||||||
|
|
||||||
border-radius: 50%;
|
|
||||||
display: inline-block;
|
|
||||||
line-height: 1.25;
|
|
||||||
position: relative;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
&.two-lines {
|
&.two-lines {
|
||||||
|
|
Loading…
Reference in a new issue