diff --git a/client/src/app/+admin/follows/following-list/following-list.component.scss b/client/src/app/+admin/follows/following-list/following-list.component.scss index b3bb7f5f8..a6f0656b8 100644 --- a/client/src/app/+admin/follows/following-list/following-list.component.scss +++ b/client/src/app/+admin/follows/following-list/following-list.component.scss @@ -1,17 +1,6 @@ @import '_variables'; @import '_mixins'; -my-redundancy-checkbox /deep/ my-peertube-checkbox { - .form-group { - margin-bottom: 0; - align-items: center; - } - - label { - margin: 0; - } -} - .caption { justify-content: flex-end; diff --git a/client/src/app/shared/forms/peertube-checkbox.component.html b/client/src/app/shared/forms/peertube-checkbox.component.html index 38691f050..fb3006b53 100644 --- a/client/src/app/shared/forms/peertube-checkbox.component.html +++ b/client/src/app/shared/forms/peertube-checkbox.component.html @@ -1,4 +1,4 @@ -<div class="form-group"> +<div class="root"> <label class="form-group-checkbox"> <input type="checkbox" [(ngModel)]="checked" (ngModelChange)="onModelChange()" [id]="inputName" [disabled]="isDisabled" /> <span role="checkbox" [attr.aria-checked]="checked"></span> diff --git a/client/src/app/shared/forms/peertube-checkbox.component.scss b/client/src/app/shared/forms/peertube-checkbox.component.scss index ee133f190..6e4e20775 100644 --- a/client/src/app/shared/forms/peertube-checkbox.component.scss +++ b/client/src/app/shared/forms/peertube-checkbox.component.scss @@ -1,7 +1,7 @@ @import '_variables'; @import '_mixins'; -.form-group { +.root { display: flex; .form-group-checkbox { @@ -20,6 +20,10 @@ } } + label { + margin-bottom: 0; + } + my-help { position: relative; top: -2px; diff --git a/client/src/app/shared/video/abstract-video-list.html b/client/src/app/shared/video/abstract-video-list.html index d543ab7c1..69a619b76 100644 --- a/client/src/app/shared/video/abstract-video-list.html +++ b/client/src/app/shared/video/abstract-video-list.html @@ -1,8 +1,18 @@ <div [ngClass]="{ 'margin-content': marginContent }"> - <div *ngIf="titlePage" class="title-page title-page-single"> - {{ titlePage }} + <div class="videos-header"> + <div *ngIf="titlePage" class="title-page title-page-single"> + {{ titlePage }} + </div> + <my-video-feed [syndicationItems]="syndicationItems"></my-video-feed> + + <div class="moderation-block" *ngIf="displayModerationBlock"> + <my-peertube-checkbox + (change)="toggleModerationDisplay()" + inputName="display-unlisted-private" i18n-labelText labelText="Display unlisted and private videos" + > + </my-peertube-checkbox> + </div> </div> - <my-video-feed [syndicationItems]="syndicationItems"></my-video-feed> <div class="no-results" i18n *ngIf="pagination.totalItems === 0">No results.</div> <div diff --git a/client/src/app/shared/video/abstract-video-list.scss b/client/src/app/shared/video/abstract-video-list.scss index 3f9c73a29..92998cb44 100644 --- a/client/src/app/shared/video/abstract-video-list.scss +++ b/client/src/app/shared/video/abstract-video-list.scss @@ -8,12 +8,27 @@ } } -.title-page.title-page-single { - margin-right: 5px; -} +.videos-header { + display: flex; + height: 80px; + align-items: center; -my-video-feed { - display: inline-block; + .title-page.title-page-single { + margin: 0 5px 0 0; + } + + my-video-feed { + display: inline-block; + position: relative; + top: 1px; + } + + .moderation-block { + display: flex; + flex-grow: 1; + justify-content: flex-end; + align-items: center; + } } @media screen and (max-width: 500px) { diff --git a/client/src/app/shared/video/abstract-video-list.ts b/client/src/app/shared/video/abstract-video-list.ts index 763791165..1f43f974c 100644 --- a/client/src/app/shared/video/abstract-video-list.ts +++ b/client/src/app/shared/video/abstract-video-list.ts @@ -37,6 +37,7 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy { videoPages: Video[][] = [] ownerDisplayType: OwnerDisplayType = 'account' firstLoadedPage: number + displayModerationBlock = false protected baseVideoWidth = 215 protected baseVideoHeight = 205 @@ -160,6 +161,10 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy { ) } + toggleModerationDisplay () { + throw new Error('toggleModerationDisplay is not implemented') + } + protected hasMoreVideos () { // No results if (this.pagination.totalItems === 0) return false diff --git a/client/src/app/shared/video/video-miniature.component.html b/client/src/app/shared/video/video-miniature.component.html index cfc483018..41ba20d00 100644 --- a/client/src/app/shared/video/video-miniature.component.html +++ b/client/src/app/shared/video/video-miniature.component.html @@ -8,6 +8,9 @@ [routerLink]="[ '/videos/watch', video.uuid ]" [attr.title]="video.name" [ngClass]="{ 'blur-filter': isVideoBlur }" > {{ video.name }} + + <span *ngIf="isUnlistedVideo(video)" class="badge badge-warning" i18n>Unlisted</span> + <span *ngIf="isPrivateVideo(video)" class="badge badge-danger" i18n>Private</span> </a> <span i18n class="video-miniature-created-at-views">{{ video.publishedAt | myFromNow }} - {{ video.views | myNumberFormatter }} views</span> diff --git a/client/src/app/shared/video/video-miniature.component.ts b/client/src/app/shared/video/video-miniature.component.ts index 7e8692b0b..2f951a1f1 100644 --- a/client/src/app/shared/video/video-miniature.component.ts +++ b/client/src/app/shared/video/video-miniature.component.ts @@ -2,6 +2,7 @@ import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core import { User } from '../users' import { Video } from './video.model' import { ServerService } from '@app/core' +import { VideoPrivacy } from '../../../../../shared' export type OwnerDisplayType = 'account' | 'videoChannel' | 'auto' @@ -49,4 +50,12 @@ export class VideoMiniatureComponent implements OnInit { displayOwnerVideoChannel () { return this.ownerDisplayTypeChosen === 'videoChannel' } + + isUnlistedVideo () { + return this.video.privacy.id === VideoPrivacy.UNLISTED + } + + isPrivateVideo () { + return this.video.privacy.id === VideoPrivacy.PRIVATE + } } diff --git a/client/src/app/videos/+video-edit/shared/video-edit.component.scss b/client/src/app/videos/+video-edit/shared/video-edit.component.scss index b039d7ad4..25db8e8ed 100644 --- a/client/src/app/videos/+video-edit/shared/video-edit.component.scss +++ b/client/src/app/videos/+video-edit/shared/video-edit.component.scss @@ -5,6 +5,11 @@ @include peertube-select-container(auto); } +my-peertube-checkbox { + display: block; + margin-bottom: 1rem; +} + .video-edit { height: 100%; min-height: 300px; diff --git a/client/src/app/videos/video-list/video-local.component.ts b/client/src/app/videos/video-list/video-local.component.ts index c91c639ca..9d000cf2e 100644 --- a/client/src/app/videos/video-list/video-local.component.ts +++ b/client/src/app/videos/video-list/video-local.component.ts @@ -10,6 +10,7 @@ import { VideoService } from '../../shared/video/video.service' import { VideoFilter } from '../../../../../shared/models/videos/video-query.type' import { I18n } from '@ngx-translate/i18n-polyfill' import { ScreenService } from '@app/shared/misc/screen.service' +import { UserRight } from '../../../../../shared/models/users' @Component({ selector: 'my-videos-local', @@ -40,6 +41,11 @@ export class VideoLocalComponent extends AbstractVideoList implements OnInit, On ngOnInit () { super.ngOnInit() + if (this.authService.isLoggedIn()) { + const user = this.authService.getUser() + this.displayModerationBlock = user.hasRight(UserRight.SEE_ALL_VIDEOS) + } + this.generateSyndicationList() } @@ -56,4 +62,10 @@ export class VideoLocalComponent extends AbstractVideoList implements OnInit, On generateSyndicationList () { this.syndicationItems = this.videoService.getVideoFeedUrls(this.sort, this.filter, this.categoryOneOf) } + + toggleModerationDisplay () { + this.filter = this.filter === 'local' ? 'all-local' as 'all-local' : 'local' as 'local' + + this.reloadVideos() + } } diff --git a/client/src/sass/include/_mixins.scss b/client/src/sass/include/_mixins.scss index 2efd6a1d3..b25d7ae0f 100644 --- a/client/src/sass/include/_mixins.scss +++ b/client/src/sass/include/_mixins.scss @@ -29,7 +29,7 @@ display: block; /* Fallback for non-webkit */ display: -webkit-box; - max-height: $font-size*$line-height*$lines-to-show; + max-height: $font-size*$line-height*$lines-to-show + 0.2; /* Fallback for non-webkit */ font-size: $font-size; line-height: $line-height;