Empty states for tables

pull/2711/head
Rigel Kent 2020-04-19 20:26:25 +02:00 committed by Rigel Kent
parent e0a929179a
commit d384061366
14 changed files with 125 additions and 8 deletions

View File

@ -41,4 +41,15 @@
</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>

View File

@ -9,7 +9,7 @@ import { I18n } from '@ngx-translate/i18n-polyfill'
@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[] = []

View File

@ -45,6 +45,17 @@
</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>

View File

@ -11,7 +11,7 @@ import { BatchDomainsModalComponent } from '@app/+admin/config/shared/batch-doma
@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

View File

@ -1,4 +1,10 @@
@import "mixins";
.form-sub-title {
flex-grow: 0;
margin-right: 30px;
}
.empty-table-message {
@include empty-state;
}

View File

@ -19,7 +19,7 @@
<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>
@ -68,6 +68,17 @@
</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>

View File

@ -13,7 +13,7 @@ import { RedundancyService } from '@app/shared/video/redundancy.service'
@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'

View File

@ -17,7 +17,7 @@
<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>
@ -25,11 +25,38 @@
<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>

View File

@ -4,6 +4,7 @@ import { I18n } from '@ngx-translate/i18n-polyfill'
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',
@ -34,6 +35,10 @@ export class InstanceAccountBlocklistComponent extends RestTable implements OnIn
return 'InstanceAccountBlocklistComponent'
}
switchToDefaultAvatar ($event: Event) {
($event.target as HTMLImageElement).src = Actor.GET_DEFAULT_AVATAR_URL()
}
unblockAccount (accountBlock: AccountBlock) {
const blockedAccount = accountBlock.blockedAccount

View File

@ -21,7 +21,7 @@
<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>
@ -41,6 +41,17 @@
</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)">

View File

@ -15,6 +15,10 @@
}
}
.empty-table-message {
@include empty-state;
}
.moderation-expanded {
font-size: 90%;

View File

@ -39,7 +39,7 @@
<div class="chip two-lines">
<img
class="avatar"
[src]="videoAbuse.reporterAccount.avatar.path"
[src]="videoAbuse.reporterAccount.avatar?.path"
(error)="switchToDefaultAvatar($event)"
alt="Avatar"
>
@ -175,6 +175,17 @@
</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>

View File

@ -82,5 +82,16 @@
</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>

View File

@ -876,6 +876,15 @@
}
}
@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;