</td>
</tr>
</ng-template>
+
+ <ng-template pTemplate="emptymessage">
+ <tr>
+ <td colspan="6">
+ <div class="empty-table-message">
+ <ng-container *ngIf="search" i18n>No follower found matching current filters.</ng-container>
+ <ng-container *ngIf="!search" i18n>Your instance doesn't have any follower.</ng-container>
+ </div>
+ </td>
+ </tr>
+ </ng-template>
</p-table>
@Component({
selector: 'my-followers-list',
templateUrl: './followers-list.component.html',
- styleUrls: [ './followers-list.component.scss' ]
+ styleUrls: [ '../follows.component.scss', './followers-list.component.scss' ]
})
export class FollowersListComponent extends RestTable implements OnInit {
followers: ActorFollow[] = []
</td>
</tr>
</ng-template>
+
+ <ng-template pTemplate="emptymessage">
+ <tr>
+ <td colspan="6">
+ <div class="empty-table-message">
+ <ng-container *ngIf="search" i18n>No host found matching current filters.</ng-container>
+ <ng-container *ngIf="!search" i18n>Your instance is not follwing any host.</ng-container>
+ </div>
+ </td>
+ </tr>
+ </ng-template>
</p-table>
<my-batch-domains-modal #batchDomainsModal i18n-action action="Follow domains" (domains)="addFollowing($event)"></my-batch-domains-modal>
@Component({
selector: 'my-followers-list',
templateUrl: './following-list.component.html',
- styleUrls: [ './following-list.component.scss' ]
+ styleUrls: [ '../follows.component.scss', './following-list.component.scss' ]
})
export class FollowingListComponent extends RestTable implements OnInit {
@ViewChild('batchDomainsModal') batchDomainsModal: BatchDomainsModalComponent
+@import "mixins";
+
.form-sub-title {
flex-grow: 0;
margin-right: 30px;
}
+
+.empty-table-message {
+ @include empty-state;
+}
<tr>
<th style="width: 40px;"></th>
<th style="width: 160px;" i18n *ngIf="isDisplayingRemoteVideos()">Strategy</th>
- <th i18n pSortableColumn="name">Video name <p-sortIcon field="name"></p-sortIcon></th>
+ <th i18n pSortableColumn="name">Video name <p-sortIcon field="name"></p-sortIcon></th >
<th i18n>Video URL</th>
<th style="width: 100px;" i18n *ngIf="isDisplayingRemoteVideos()">Total size</th>
<th style="width: 80px;"></th>
</td>
</tr>
</ng-template>
+
+ <ng-template pTemplate="emptymessage">
+ <tr>
+ <td colspan="6">
+ <div class="empty-table-message">
+ <ng-container *ngIf="isDisplayingRemoteVideos()" i18n>Your instance doesn't mirror any video.</ng-container>
+ <ng-container *ngIf="!isDisplayingRemoteVideos()" i18n>Your instance has no mirrored videos.</ng-container>
+ </div>
+ </td>
+ </tr>
+ </ng-template>
</p-table>
@Component({
selector: 'my-video-redundancies-list',
templateUrl: './video-redundancies-list.component.html',
- styleUrls: [ './video-redundancies-list.component.scss' ]
+ styleUrls: [ '../follows.component.scss', './video-redundancies-list.component.scss' ]
})
export class VideoRedundanciesListComponent extends RestTable implements OnInit {
private static LOCAL_STORAGE_DISPLAY_TYPE = 'video-redundancies-list-display-type'
<ng-template pTemplate="header">
<tr>
- <th i18n>Account</th>
+ <th style="width: 100%;" i18n>Account</th>
<th style="width: 190px;" i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th>
<th style="width: 100px;"></th> <!-- column for action buttons -->
</tr>
<ng-template pTemplate="body" let-accountBlock>
<tr>
- <td>{{ accountBlock.blockedAccount.nameWithHost }}</td>
+ <td>
+ <a [href]="accountBlock.blockedAccount.url" i18n-title title="Open account in a new tab" target="_blank" rel="noopener noreferrer">
+ <div class="chip two-lines">
+ <img
+ class="avatar"
+ [src]="accountBlock.blockedAccount.avatar?.path"
+ (error)="switchToDefaultAvatar($event)"
+ alt="Avatar"
+ >
+ <div>
+ {{ accountBlock.blockedAccount.displayName }}
+ <span class="text-muted">{{ accountBlock.blockedAccount.nameWithHost }}</span>
+ </div>
+ </div>
+ </a>
+ </td>
+
<td>{{ accountBlock.createdAt }}</td>
<td class="action-cell">
<button class="unblock-button" (click)="unblockAccount(accountBlock)" i18n>Unmute</button>
</td>
</tr>
</ng-template>
+
+ <ng-template pTemplate="emptymessage">
+ <tr>
+ <td colspan="6">
+ <div class="empty-table-message">
+ <ng-container *ngIf="search" i18n>No account found matching current filters.</ng-container>
+ <ng-container *ngIf="!search" i18n>No account found.</ng-container>
+ </div>
+ </td>
+ </tr>
+ </ng-template>
</p-table>
import { RestPagination, RestTable } from '@app/shared'
import { SortMeta } from 'primeng/api'
import { AccountBlock, BlocklistService } from '@app/shared/blocklist'
+import { Actor } from '@app/shared/actor/actor.model'
@Component({
selector: 'my-instance-account-blocklist',
return 'InstanceAccountBlocklistComponent'
}
+ switchToDefaultAvatar ($event: Event) {
+ ($event.target as HTMLImageElement).src = Actor.GET_DEFAULT_AVATAR_URL()
+ }
+
unblockAccount (accountBlock: AccountBlock) {
const blockedAccount = accountBlock.blockedAccount
<ng-template pTemplate="header">
<tr>
- <th i18n>Instance</th>
+ <th style="width: 100%;" i18n>Instance</th>
<th style="width: 190px;" i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th>
<th style="width: 100px;"></th> <!-- column for action buttons -->
</tr>
</td>
</tr>
</ng-template>
+
+ <ng-template pTemplate="emptymessage">
+ <tr>
+ <td colspan="6">
+ <div class="empty-table-message">
+ <ng-container *ngIf="search" i18n>No server found matching current filters.</ng-container>
+ <ng-container *ngIf="!search" i18n>No server found.</ng-container>
+ </div>
+ </td>
+ </tr>
+ </ng-template>
</p-table>
<my-batch-domains-modal #batchDomainsModal i18n-action action="Mute domains" (domains)="onDomainsToBlock($event)">
}
}
+.empty-table-message {
+ @include empty-state;
+}
+
.moderation-expanded {
font-size: 90%;
<div class="chip two-lines">
<img
class="avatar"
- [src]="videoAbuse.reporterAccount.avatar.path"
+ [src]="videoAbuse.reporterAccount.avatar?.path"
(error)="switchToDefaultAvatar($event)"
alt="Avatar"
>
</td>
</tr>
</ng-template>
+
+ <ng-template pTemplate="emptymessage">
+ <tr>
+ <td colspan="6">
+ <div class="empty-table-message">
+ <ng-container *ngIf="search" i18n>No video abuses found matching current filters.</ng-container>
+ <ng-container *ngIf="!search" i18n>No video abuses found.</ng-container>
+ </div>
+ </td>
+ </tr>
+ </ng-template>
</p-table>
<my-moderation-comment-modal #moderationCommentModal (commentUpdated)="onModerationCommentUpdated()"></my-moderation-comment-modal>
</td>
</tr>
</ng-template>
+
+ <ng-template pTemplate="emptymessage">
+ <tr>
+ <td colspan="6">
+ <div class="empty-table-message">
+ <ng-container *ngIf="search" i18n>No blacklisted video found matching current filters.</ng-container>
+ <ng-container *ngIf="!search" i18n>No blacklisted video found.</ng-container>
+ </div>
+ </td>
+ </tr>
+ </ng-template>
</p-table>
}
}
+@mixin empty-state {
+ min-height: 40vh;
+ max-height: 500px;
+
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
@mixin admin-sub-header-responsive ($horizontal-margins) {
flex-direction: column;