Don't always use a link for account avatar

pull/3970/head
Chocobozzz 2021-04-15 11:21:00 +02:00
parent 5b23d4e0f8
commit 126a6352ec
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
8 changed files with 39 additions and 31 deletions

View File

@ -23,8 +23,8 @@
<div class="section-label" i18n>OWNER ACCOUNT</div> <div class="section-label" i18n>OWNER ACCOUNT</div>
<div class="avatar-row"> <div class="avatar-row">
<my-account-avatar [account]="videoChannel.ownerAccount" size="120"></my-account-avatar> <my-account-avatar [account]="videoChannel.ownerAccount" [internalHref]="getAccountUrl()" size="120"></my-account-avatar>
<div class="actor-info"> <div class="actor-info">
<h4> <h4>
<a [routerLink]="getAccountUrl()" title="View account" i18n-title>{{ videoChannel.ownerAccount.displayName }}</a> <a [routerLink]="getAccountUrl()" title="View account" i18n-title>{{ videoChannel.ownerAccount.displayName }}</a>

View File

@ -1,6 +1,6 @@
<div *ngIf="isCommentDisplayed()" class="root-comment"> <div *ngIf="isCommentDisplayed()" class="root-comment">
<div class="left"> <div class="left">
<my-account-avatar *ngIf="!comment.isDeleted" [account]="comment.account"></my-account-avatar> <my-account-avatar *ngIf="!comment.isDeleted" [href]="comment.account.url" [account]="comment.account"></my-account-avatar>
<div class="vertical-border"></div> <div class="vertical-border"></div>
</div> </div>

View File

@ -4,11 +4,11 @@
<img [src]="video.videoChannelAvatarUrl" i18n-alt alt="Channel avatar" class="channel-avatar" /> <img [src]="video.videoChannelAvatarUrl" i18n-alt alt="Channel avatar" class="channel-avatar" />
</a> </a>
<my-account-avatar [account]="video.account"></my-account-avatar> <my-account-avatar [account]="video.account" [title]="accountLinkTitle" [internalHref]="[ '/accounts', video.byAccount ]"></my-account-avatar>
</ng-container> </ng-container>
<ng-container *ngIf="!isChannelAvatarNull() && genericChannel"> <ng-container *ngIf="!isChannelAvatarNull() && genericChannel">
<my-account-avatar [account]="video.account"></my-account-avatar> <my-account-avatar [account]="video.account" [title]="accountLinkTitle" [internalHref]="[ '/accounts', video.byAccount ]"></my-account-avatar>
<a [routerLink]="[ '/video-channels', video.byVideoChannel ]" [title]="channelLinkTitle"> <a [routerLink]="[ '/video-channels', video.byVideoChannel ]" [title]="channelLinkTitle">
<img [src]="video.videoChannelAvatarUrl" i18n-alt alt="Channel avatar" class="channel-avatar" /> <img [src]="video.videoChannelAvatarUrl" i18n-alt alt="Channel avatar" class="channel-avatar" />
@ -16,6 +16,6 @@
</ng-container> </ng-container>
<ng-container *ngIf="isChannelAvatarNull()"> <ng-container *ngIf="isChannelAvatarNull()">
<my-account-avatar [account]="video.account"></my-account-avatar> <my-account-avatar [account]="video.account" [title]="accountLinkTitle" [internalHref]="[ '/accounts', video.byAccount ]"></my-account-avatar>
</ng-container> </ng-container>
</div> </div>

View File

@ -1,8 +1,15 @@
<a *ngIf="account" [href]="href" target="_blank" rel="noopener noreferrer" [title]="title"> <ng-template #img>
<img <img [class]="class" [src]="avatarUrl" i18n-alt alt="Account avatar" />
[class]="class" </ng-template>
[src]="avatarUrl"
i18n-alt <a *ngIf="account && href" [href]="href" target="_blank" rel="noopener noreferrer" [title]="title">
alt="Account avatar" <ng-template *ngTemplateOutlet="img"></ng-template>
/>
</a> </a>
<a *ngIf="account && internalHref" [routerLink]="internalHref" [title]="title">
<ng-template *ngTemplateOutlet="img"></ng-template>
</a>
<ng-container *ngIf="!account || (!href && !internalHref)">
<ng-template *ngTemplateOutlet="img"></ng-template>
</ng-container>

View File

@ -1,5 +1,4 @@
import { Component, Input } from '@angular/core' import { Component, Input } from '@angular/core'
import { Account as AccountInterface } from '@shared/models'
import { Account } from '../shared-main/account/account.model' import { Account } from '../shared-main/account/account.model'
@Component({ @Component({
@ -8,21 +7,23 @@ import { Account } from '../shared-main/account/account.model'
templateUrl: './account-avatar.component.html' templateUrl: './account-avatar.component.html'
}) })
export class AccountAvatarComponent { export class AccountAvatarComponent {
_href: string @Input() account: {
_title: string name: string
avatar?: { url?: string, path: string }
@Input() account: { name: string, avatar?: { url?: string }, url: string } url: string
@Input() size = '36'
@Input() set href (value) {
this._href = value
} }
@Input() size: '25' | '34' | '36' | '40' | '120' = '36'
// Use an external link
@Input() href: string
// Use routerLink
@Input() internalHref: string | string[]
@Input() set title (value) { @Input() set title (value) {
this._title = value this._title = value
} }
get href () { private _title: string
return this._href || this.account?.url
}
get title () { get title () {
return this._title || $localize`${this.account.name} (account page)` return this._title || $localize`${this.account.name} (account page)`
@ -33,6 +34,6 @@ export class AccountAvatarComponent {
} }
get avatarUrl () { get avatarUrl () {
return this.account?.avatar ? this.account.avatar.url : Account.GET_DEFAULT_AVATAR_URL() return Account.GET_ACTOR_AVATAR_URL(this.account)
} }
} }

View File

@ -1,4 +1,4 @@
import { Account as ServerAccount, ActorImage } from '@shared/models' import { Account as ServerAccount, Actor as ServerActor, ActorImage } from '@shared/models'
import { Actor } from './actor.model' import { Actor } from './actor.model'
export class Account extends Actor implements ServerAccount { export class Account extends Actor implements ServerAccount {
@ -13,7 +13,7 @@ export class Account extends Actor implements ServerAccount {
userId?: number userId?: number
static GET_ACTOR_AVATAR_URL (actor: object) { 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) || this.GET_DEFAULT_AVATAR_URL()
} }

View File

@ -1,7 +1,7 @@
import { Actor as ActorServer, ActorImage } from '@shared/models'
import { getAbsoluteAPIUrl } from '@app/helpers' import { getAbsoluteAPIUrl } from '@app/helpers'
import { Actor as ServerActor, ActorImage } from '@shared/models'
export abstract class Actor implements ActorServer { export abstract class Actor implements ServerActor {
id: number id: number
name: string name: string
@ -47,7 +47,7 @@ export abstract class Actor implements ActorServer {
return host.trim() === thisHost return host.trim() === thisHost
} }
protected constructor (hash: Partial<ActorServer>) { protected constructor (hash: Partial<ServerActor>) {
this.id = hash.id this.id = hash.id
this.url = hash.url ?? '' this.url = hash.url ?? ''
this.name = hash.name ?? '' this.name = hash.name ?? ''

View File

@ -13,7 +13,7 @@
<a *ngIf="displayOptions.avatar && displayOwnerVideoChannel()" class="avatar" [routerLink]="[ '/video-channels', video.byVideoChannel ]" [title]="channelLinkTitle"> <a *ngIf="displayOptions.avatar && displayOwnerVideoChannel()" class="avatar" [routerLink]="[ '/video-channels', video.byVideoChannel ]" [title]="channelLinkTitle">
<img [src]="getAvatarUrl()" alt="" class="channel" /> <img [src]="getAvatarUrl()" alt="" class="channel" />
</a> </a>
<my-account-avatar *ngIf="displayOptions.avatar && displayOwnerAccount()" [account]="video.account" size="40" [href]="'/video-channels/' + video.byVideoChannel" [title]="channelLinkTitle"></my-account-avatar> <my-account-avatar *ngIf="displayOptions.avatar && displayOwnerAccount()" [account]="video.account" size="40" [internalHref]="'/video-channels/' + video.byVideoChannel" [title]="channelLinkTitle"></my-account-avatar>
<div class="w-100 d-flex flex-column"> <div class="w-100 d-flex flex-column">
<a *ngIf="!videoHref" tabindex="-1" class="video-miniature-name" <a *ngIf="!videoHref" tabindex="-1" class="video-miniature-name"