From 5baee5fca418487e72ddcd6419d31bca8659b668 Mon Sep 17 00:00:00 2001 From: Rigel Kent Date: Tue, 2 Jun 2020 20:50:42 +0200 Subject: [PATCH] rename blacklist to block/blocklist, merge block and auto-block views - also replace whitelist with allowlist - add advanced filters for video-block-list view - move icons in video-block-list and video-abuse-list to left side for visibility - add robot icon to depict automated nature of a block in video-block-list resolves #2790 --- client/src/app/+admin/admin.component.ts | 6 +- client/src/app/+admin/admin.module.ts | 6 +- .../edit-custom-config.component.html | 10 +- client/src/app/+admin/moderation/index.ts | 3 +- .../moderation/moderation.component.html | 6 +- .../+admin/moderation/moderation.component.ts | 8 +- .../+admin/moderation/moderation.routes.ts | 48 ++--- .../video-abuse-details.component.html | 2 +- .../video-abuse-list.component.html | 6 +- .../video-abuse-list.component.ts | 17 +- .../video-auto-blacklist-list/index.ts | 1 - .../video-auto-blacklist-list.component.html | 20 -- .../video-auto-blacklist-list.component.scss | 14 -- .../video-auto-blacklist-list.component.ts | 86 -------- .../moderation/video-blacklist-list/index.ts | 1 - .../video-blacklist-list.component.html | 100 --------- .../video-blacklist-list.component.ts | 113 ---------- .../moderation/video-block-list/index.ts | 1 + .../video-block-list.component.html | 113 ++++++++++ .../video-block-list.component.scss | 18 ++ .../video-block-list.component.ts | 196 ++++++++++++++++++ .../app/+admin/users/user-edit/user-edit.ts | 2 +- .../users/user-edit/user-update.component.ts | 2 +- .../my-account-history.component.html | 2 +- ...ount-notification-preferences.component.ts | 6 +- client/src/app/menu/menu.component.ts | 4 +- client/src/app/search/search.component.html | 2 +- .../app/shared/forms/form-validators/index.ts | 2 +- ...e.ts => video-block-validators.service.ts} | 10 +- .../shared/images/global-icon.component.ts | 3 +- client/src/app/shared/index.ts | 2 +- client/src/app/shared/shared.module.ts | 14 +- .../shared/users/user-notification.model.ts | 6 +- .../users/user-notifications.component.html | 12 +- .../src/app/shared/video-blacklist/index.ts | 1 - .../video-blacklist.service.ts | 89 -------- client/src/app/shared/video-block/index.ts | 1 + .../shared/video-block/video-block.service.ts | 77 +++++++ .../app/shared/video/abstract-video-list.html | 2 +- ...ponent.html => video-block.component.html} | 4 +- ...ponent.scss => video-block.component.scss} | 0 ....component.ts => video-block.component.ts} | 31 ++- .../video-actions-dropdown.component.html | 2 +- .../video/video-actions-dropdown.component.ts | 54 ++--- .../video/video-miniature.component.html | 8 +- .../video/video-miniature.component.scss | 8 +- .../shared/video/video-miniature.component.ts | 12 +- client/src/app/shared/video/video.model.ts | 12 +- .../+video-watch/video-watch.component.html | 4 +- .../+video-watch/video-watch.component.scss | 2 +- .../+video-watch/video-watch.component.ts | 4 +- .../recommended-videos.component.html | 2 +- client/src/assets/images/global/robot.svg | 11 + server/controllers/api/videos/blacklist.ts | 8 +- .../custom-validators/video-blacklist.ts | 4 +- .../migrations/0350-video-blacklist-type.ts | 4 +- server/lib/notifier.ts | 8 +- server/lib/video-blacklist.ts | 10 +- server/models/account/user.ts | 4 +- server/models/video/video-blacklist.ts | 8 +- server/tests/api/check-params/users.ts | 2 +- .../tests/api/check-params/video-blacklist.ts | 4 +- server/tests/api/users/users.ts | 4 +- server/tests/api/videos/video-blacklist.ts | 20 +- .../extra-utils/users/user-notifications.ts | 6 +- shared/extra-utils/videos/video-blacklist.ts | 4 +- shared/models/users/user-flag.model.ts | 2 +- .../models/users/user-notification.model.ts | 6 +- shared/models/users/user-right.enum.ts | 2 +- shared/models/users/user-role.ts | 2 +- .../videos/blacklist/video-blacklist.model.ts | 6 +- 71 files changed, 627 insertions(+), 643 deletions(-) delete mode 100644 client/src/app/+admin/moderation/video-auto-blacklist-list/index.ts delete mode 100644 client/src/app/+admin/moderation/video-auto-blacklist-list/video-auto-blacklist-list.component.html delete mode 100644 client/src/app/+admin/moderation/video-auto-blacklist-list/video-auto-blacklist-list.component.scss delete mode 100644 client/src/app/+admin/moderation/video-auto-blacklist-list/video-auto-blacklist-list.component.ts delete mode 100644 client/src/app/+admin/moderation/video-blacklist-list/index.ts delete mode 100644 client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html delete mode 100644 client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts create mode 100644 client/src/app/+admin/moderation/video-block-list/index.ts create mode 100644 client/src/app/+admin/moderation/video-block-list/video-block-list.component.html create mode 100644 client/src/app/+admin/moderation/video-block-list/video-block-list.component.scss create mode 100644 client/src/app/+admin/moderation/video-block-list/video-block-list.component.ts rename client/src/app/shared/forms/form-validators/{video-blacklist-validators.service.ts => video-block-validators.service.ts} (52%) delete mode 100644 client/src/app/shared/video-blacklist/index.ts delete mode 100644 client/src/app/shared/video-blacklist/video-blacklist.service.ts create mode 100644 client/src/app/shared/video-block/index.ts create mode 100644 client/src/app/shared/video-block/video-block.service.ts rename client/src/app/shared/video/modals/{video-blacklist.component.html => video-block.component.html} (91%) rename client/src/app/shared/video/modals/{video-blacklist.component.scss => video-block.component.scss} (100%) rename client/src/app/shared/video/modals/{video-blacklist.component.ts => video-block.component.ts} (61%) create mode 100644 client/src/assets/images/global/robot.svg diff --git a/client/src/app/+admin/admin.component.ts b/client/src/app/+admin/admin.component.ts index 9662522dc..4cf3da0e8 100644 --- a/client/src/app/+admin/admin.component.ts +++ b/client/src/app/+admin/admin.component.ts @@ -18,7 +18,7 @@ export class AdminComponent implements OnInit { ngOnInit () { if (this.hasUsersRight()) this.items.push({ label: this.i18n('Users'), routerLink: '/admin/users' }) if (this.hasServerFollowRight()) this.items.push({ label: this.i18n('Follows & redundancies'), routerLink: '/admin/follows' }) - if (this.hasVideoAbusesRight() || this.hasVideoBlacklistRight()) this.items.push({ label: this.i18n('Moderation'), routerLink: '/admin/moderation' }) + if (this.hasVideoAbusesRight() || this.hasVideoBlocklistRight()) this.items.push({ label: this.i18n('Moderation'), routerLink: '/admin/moderation' }) if (this.hasConfigRight()) this.items.push({ label: this.i18n('Configuration'), routerLink: '/admin/config' }) if (this.hasPluginsRight()) this.items.push({ label: this.i18n('Plugins/Themes'), routerLink: '/admin/plugins' }) if (this.hasJobsRight() || this.hasLogsRight() || this.hasDebugRight()) this.items.push({ label: this.i18n('System'), routerLink: '/admin/system' }) @@ -36,8 +36,8 @@ export class AdminComponent implements OnInit { return this.auth.getUser().hasRight(UserRight.MANAGE_VIDEO_ABUSES) } - hasVideoBlacklistRight () { - return this.auth.getUser().hasRight(UserRight.MANAGE_VIDEO_BLACKLIST) + hasVideoBlocklistRight () { + return this.auth.getUser().hasRight(UserRight.MANAGE_VIDEO_BLOCKS) } hasConfigRight () { diff --git a/client/src/app/+admin/admin.module.ts b/client/src/app/+admin/admin.module.ts index d04313c0a..eb073f709 100644 --- a/client/src/app/+admin/admin.module.ts +++ b/client/src/app/+admin/admin.module.ts @@ -11,8 +11,7 @@ import { UserCreateComponent, UserListComponent, UserPasswordComponent, UsersCom import { ModerationCommentModalComponent, VideoAbuseListComponent, - VideoAutoBlacklistListComponent, - VideoBlacklistListComponent + VideoBlockListComponent } from './moderation' import { ModerationComponent } from '@app/+admin/moderation/moderation.component' import { RedundancyCheckboxComponent } from '@app/+admin/follows/shared/redundancy-checkbox.component' @@ -59,10 +58,9 @@ import { VideoAbuseDetailsComponent } from './moderation/video-abuse-list/video- UserListComponent, ModerationComponent, - VideoBlacklistListComponent, + VideoBlockListComponent, VideoAbuseListComponent, VideoAbuseDetailsComponent, - VideoAutoBlacklistListComponent, ModerationCommentModalComponent, InstanceServerBlocklistComponent, InstanceAccountBlocklistComponent, diff --git a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html index 981b6685f..52c759fb7 100644 --- a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html +++ b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html @@ -430,7 +430,7 @@
Unless a user is marked as trusted, their videos will stay private until a moderator reviews them. @@ -671,16 +671,16 @@
- Instance whitelisted by Twitter + Instance allowed by Twitter - If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.
- If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.

+ If your instance is explicitly allowed by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.
+ If the instance is not, we use an image link card that will redirect on your PeerTube instance.

Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on https://cards-dev.twitter.com/validator - to see if you instance is whitelisted. + to see if you instance is allowed.
diff --git a/client/src/app/+admin/moderation/index.ts b/client/src/app/+admin/moderation/index.ts index 3c683a28c..e99244b74 100644 --- a/client/src/app/+admin/moderation/index.ts +++ b/client/src/app/+admin/moderation/index.ts @@ -1,5 +1,4 @@ export * from './video-abuse-list' -export * from './video-auto-blacklist-list' -export * from './video-blacklist-list' +export * from './video-block-list' export * from './moderation.component' export * from './moderation.routes' diff --git a/client/src/app/+admin/moderation/moderation.component.html b/client/src/app/+admin/moderation/moderation.component.html index b70027957..09f149c0e 100644 --- a/client/src/app/+admin/moderation/moderation.component.html +++ b/client/src/app/+admin/moderation/moderation.component.html @@ -2,11 +2,9 @@
Moderation
- Video abuses + Video reports - {{ autoBlacklistVideosEnabled ? 'Manually blacklisted videos' : 'Blacklisted videos' }} - - Auto-blacklisted videos + Video blocks Muted accounts diff --git a/client/src/app/+admin/moderation/moderation.component.ts b/client/src/app/+admin/moderation/moderation.component.ts index 7744deb06..d48305eed 100644 --- a/client/src/app/+admin/moderation/moderation.component.ts +++ b/client/src/app/+admin/moderation/moderation.component.ts @@ -7,7 +7,7 @@ import { AuthService, ServerService } from '@app/core' styleUrls: [ './moderation.component.scss' ] }) export class ModerationComponent implements OnInit { - autoBlacklistVideosEnabled = false + autoBlockVideosEnabled = false constructor ( private auth: AuthService, @@ -16,7 +16,7 @@ export class ModerationComponent implements OnInit { ngOnInit (): void { this.serverService.getConfig() - .subscribe(config => this.autoBlacklistVideosEnabled = config.autoBlacklist.videos.ofUsers.enabled) + .subscribe(config => this.autoBlockVideosEnabled = config.autoBlacklist.videos.ofUsers.enabled) } @@ -24,8 +24,8 @@ export class ModerationComponent implements OnInit { return this.auth.getUser().hasRight(UserRight.MANAGE_VIDEO_ABUSES) } - hasVideoBlacklistRight () { - return this.auth.getUser().hasRight(UserRight.MANAGE_VIDEO_BLACKLIST) + hasVideoBlocklistRight () { + return this.auth.getUser().hasRight(UserRight.MANAGE_VIDEO_BLOCKS) } hasAccountsBlocklistRight () { diff --git a/client/src/app/+admin/moderation/moderation.routes.ts b/client/src/app/+admin/moderation/moderation.routes.ts index a024f2bee..aeb555c4a 100644 --- a/client/src/app/+admin/moderation/moderation.routes.ts +++ b/client/src/app/+admin/moderation/moderation.routes.ts @@ -2,8 +2,7 @@ import { Routes } from '@angular/router' import { UserRight } from '../../../../../shared' import { UserRightGuard } from '@app/core' import { VideoAbuseListComponent } from '@app/+admin/moderation/video-abuse-list' -import { VideoBlacklistListComponent } from '@app/+admin/moderation/video-blacklist-list' -import { VideoAutoBlacklistListComponent } from '@app/+admin/moderation/video-auto-blacklist-list' +import { VideoBlockListComponent } from '@app/+admin/moderation/video-block-list' import { ModerationComponent } from '@app/+admin/moderation/moderation.component' import { InstanceAccountBlocklistComponent, InstanceServerBlocklistComponent } from '@app/+admin/moderation/instance-blocklist' @@ -22,16 +21,6 @@ export const ModerationRoutes: Routes = [ redirectTo: 'video-abuses/list', pathMatch: 'full' }, - { - path: 'video-blacklist', - redirectTo: 'video-blacklist/list', - pathMatch: 'full' - }, - { - path: 'video-auto-blacklist', - redirectTo: 'video-auto-blacklist/list', - pathMatch: 'full' - }, { path: 'video-abuses/list', component: VideoAbuseListComponent, @@ -39,29 +28,38 @@ export const ModerationRoutes: Routes = [ data: { userRight: UserRight.MANAGE_VIDEO_ABUSES, meta: { - title: 'Video abuses list' + title: 'Video reports' } } }, + { + path: 'video-blacklist', + redirectTo: 'video-blocks/list', + pathMatch: 'full' + }, + { + path: 'video-auto-blacklist', + redirectTo: 'video-blocks/list', + pathMatch: 'full' + }, { path: 'video-auto-blacklist/list', - component: VideoAutoBlacklistListComponent, - canActivate: [ UserRightGuard ], - data: { - userRight: UserRight.MANAGE_VIDEO_BLACKLIST, - meta: { - title: 'Auto-blacklisted videos' - } - } + redirectTo: 'video-blocks/list', + pathMatch: 'full' + }, + { + path: 'video-blacklist', + redirectTo: 'video-blocks/list', + pathMatch: 'full' }, { - path: 'video-blacklist/list', - component: VideoBlacklistListComponent, + path: 'video-blocks/list', + component: VideoBlockListComponent, canActivate: [ UserRightGuard ], data: { - userRight: UserRight.MANAGE_VIDEO_BLACKLIST, + userRight: UserRight.MANAGE_VIDEO_BLOCKS, meta: { - title: 'Blacklisted videos' + title: 'Videos blocked' } } }, diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-details.component.html b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-details.component.html index 2abcc0669..453a282d1 100644 --- a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-details.component.html +++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-details.component.html @@ -69,7 +69,7 @@
The video was deleted - The video was blacklisted + The video was blocked
diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html index d30475794..df15999ec 100644 --- a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html +++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html @@ -19,7 +19,7 @@ Unsolved reports Accepted reports Refused reports - Reports with blacklisted videos + Reports with blocked videos Reports with deleted videos
@@ -84,9 +84,9 @@
- {{ videoAbuse.video.name }} - + + {{ videoAbuse.video.name }}
by {{ videoAbuse.video.channel?.displayName }} on {{ videoAbuse.video.channel?.host }}
diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts index 39f619cc3..ca37bccf3 100644 --- a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts +++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts @@ -3,7 +3,7 @@ import { Account } from '@app/shared/account/account.model' import { Notifier } from '@app/core' import { SortMeta } from 'primeng/api' import { VideoAbuse, VideoAbuseState } from '../../../../../../shared' -import { RestPagination, RestTable, VideoAbuseService, VideoBlacklistService } from '../../../shared' +import { RestPagination, RestTable, VideoAbuseService, VideoBlockService } from '../../../shared' import { I18n } from '@ngx-translate/i18n-polyfill' import { DropdownAction } from '../../../shared/buttons/action-dropdown.component' import { ConfirmService } from '../../../core/index' @@ -53,7 +53,7 @@ export class VideoAbuseListComponent extends RestTable implements OnInit, AfterV private videoAbuseService: VideoAbuseService, private blocklistService: BlocklistService, private videoService: VideoService, - private videoBlacklistService: VideoBlacklistService, + private videoBlocklistService: VideoBlockService, private confirmService: ConfirmService, private i18n: I18n, private markdownRenderer: MarkdownService, @@ -101,13 +101,13 @@ export class VideoAbuseListComponent extends RestTable implements OnInit, AfterV isDisplayed: videoAbuse => !videoAbuse.video.deleted }, { - label: this.i18n('Blacklist video'), + label: this.i18n('Block video'), isDisplayed: videoAbuse => !videoAbuse.video.deleted && !videoAbuse.video.blacklisted, handler: videoAbuse => { - this.videoBlacklistService.blacklistVideo(videoAbuse.video.id, undefined, true) + this.videoBlocklistService.blockVideo(videoAbuse.video.id, undefined, true) .subscribe( () => { - this.notifier.success(this.i18n('Video blacklisted.')) + this.notifier.success(this.i18n('Video blocklisted.')) this.updateVideoAbuseState(videoAbuse, VideoAbuseState.ACCEPTED) }, @@ -117,13 +117,13 @@ export class VideoAbuseListComponent extends RestTable implements OnInit, AfterV } }, { - label: this.i18n('Unblacklist video'), + label: this.i18n('Unblock video'), isDisplayed: videoAbuse => !videoAbuse.video.deleted && videoAbuse.video.blacklisted, handler: videoAbuse => { - this.videoBlacklistService.removeVideoFromBlacklist(videoAbuse.video.id) + this.videoBlocklistService.unblockVideo(videoAbuse.video.id) .subscribe( () => { - this.notifier.success(this.i18n('Video unblacklisted.')) + this.notifier.success(this.i18n('Video unblocklisted.')) this.updateVideoAbuseState(videoAbuse, VideoAbuseState.ACCEPTED) }, @@ -292,7 +292,6 @@ export class VideoAbuseListComponent extends RestTable implements OnInit, AfterV err => this.notifier.error(err.message) ) - } protected loadData () { diff --git a/client/src/app/+admin/moderation/video-auto-blacklist-list/index.ts b/client/src/app/+admin/moderation/video-auto-blacklist-list/index.ts deleted file mode 100644 index e3522f68c..000000000 --- a/client/src/app/+admin/moderation/video-auto-blacklist-list/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './video-auto-blacklist-list.component' diff --git a/client/src/app/+admin/moderation/video-auto-blacklist-list/video-auto-blacklist-list.component.html b/client/src/app/+admin/moderation/video-auto-blacklist-list/video-auto-blacklist-list.component.html deleted file mode 100644 index e2193b630..000000000 --- a/client/src/app/+admin/moderation/video-auto-blacklist-list/video-auto-blacklist-list.component.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - Unblacklist - - - - - - - - diff --git a/client/src/app/+admin/moderation/video-auto-blacklist-list/video-auto-blacklist-list.component.scss b/client/src/app/+admin/moderation/video-auto-blacklist-list/video-auto-blacklist-list.component.scss deleted file mode 100644 index 85ebc6041..000000000 --- a/client/src/app/+admin/moderation/video-auto-blacklist-list/video-auto-blacklist-list.component.scss +++ /dev/null @@ -1,14 +0,0 @@ -@import '_variables'; -@import '_mixins'; - -.action-button-unblacklist-selection { - display: inline-block; - - @include peertube-button; - @include orange-button; - @include button-with-icon(21px); - - my-global-icon { - @include apply-svg-color(#fff); - } -} diff --git a/client/src/app/+admin/moderation/video-auto-blacklist-list/video-auto-blacklist-list.component.ts b/client/src/app/+admin/moderation/video-auto-blacklist-list/video-auto-blacklist-list.component.ts deleted file mode 100644 index fb2962b47..000000000 --- a/client/src/app/+admin/moderation/video-auto-blacklist-list/video-auto-blacklist-list.component.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Component } from '@angular/core' -import { I18n } from '@ngx-translate/i18n-polyfill' -import { ActivatedRoute, Router } from '@angular/router' -import { ComponentPagination } from '@app/shared/rest/component-pagination.model' -import { AuthService, Notifier, ServerService } from '@app/core' -import { VideoBlacklistService } from '@app/shared' -import { immutableAssign } from '@app/shared/misc/utils' -import { ScreenService } from '@app/shared/misc/screen.service' -import { MiniatureDisplayOptions } from '@app/shared/video/video-miniature.component' -import { SelectionType } from '@app/shared/video/videos-selection.component' -import { Video } from '@app/shared/video/video.model' - -@Component({ - selector: 'my-video-auto-blacklist-list', - templateUrl: './video-auto-blacklist-list.component.html', - styleUrls: [ './video-auto-blacklist-list.component.scss' ] -}) -export class VideoAutoBlacklistListComponent { - titlePage: string - selection: SelectionType = {} - miniatureDisplayOptions: MiniatureDisplayOptions = { - date: true, - views: false, - by: true, - privacyLabel: false, - privacyText: true, - state: false, - blacklistInfo: false, - nsfw: true - } - pagination: ComponentPagination = { - currentPage: 1, - itemsPerPage: 5, - totalItems: null - } - videos: Video[] = [] - getVideosObservableFunction = this.getVideosObservable.bind(this) - - constructor ( - protected router: Router, - protected route: ActivatedRoute, - protected notifier: Notifier, - protected authService: AuthService, - protected screenService: ScreenService, - protected serverService: ServerService, - private i18n: I18n, - private videoBlacklistService: VideoBlacklistService - ) { - this.titlePage = this.i18n('Auto-blacklisted videos') - } - - getVideosObservable (page: number) { - const newPagination = immutableAssign(this.pagination, { currentPage: page }) - - return this.videoBlacklistService.getAutoBlacklistedAsVideoList(newPagination) - } - - removeVideoFromBlacklist (entry: Video) { - this.videoBlacklistService.removeVideoFromBlacklist(entry.id).subscribe( - () => { - this.notifier.success(this.i18n('Video {{name}} removed from blacklist.', { name: entry.name })) - - this.videos = this.videos.filter(v => v.id !== entry.id) - }, - - error => this.notifier.error(error.message) - ) - } - - removeSelectedVideosFromBlacklist () { - const toReleaseVideosIds = Object.keys(this.selection) - .filter(k => this.selection[ k ] === true) - .map(k => parseInt(k, 10)) - - this.videoBlacklistService.removeVideoFromBlacklist(toReleaseVideosIds).subscribe( - () => { - this.notifier.success(this.i18n('{{num}} videos removed from blacklist.', { num: toReleaseVideosIds.length })) - - this.selection = {} - this.videos = this.videos.filter(v => toReleaseVideosIds.includes(v.id) === false) - }, - - error => this.notifier.error(error.message) - ) - } -} diff --git a/client/src/app/+admin/moderation/video-blacklist-list/index.ts b/client/src/app/+admin/moderation/video-blacklist-list/index.ts deleted file mode 100644 index 4daf64187..000000000 --- a/client/src/app/+admin/moderation/video-blacklist-list/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './video-blacklist-list.component' diff --git a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html deleted file mode 100644 index cfa04514f..000000000 --- a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html +++ /dev/null @@ -1,100 +0,0 @@ - - -
-
- - - Clear filters -
-
-
- - - - - Video - Sensitive - Unfederated - Date - - - - - - - - - - - - - - - -
-
- -
-
-
- {{ videoBlacklist.video.name }} - -
-
by {{ videoBlacklist.video.channel?.displayName }} on {{ videoBlacklist.video.channel?.host }}
-
-
-
- - - - {{ booleanToText(videoBlacklist.video.nsfw) }} - {{ booleanToText(videoBlacklist.unfederated) }} - {{ videoBlacklist.createdAt | date: 'short' }} - - - {{ booleanToText(videoBlacklist.video.nsfw) }} - {{ booleanToText(videoBlacklist.unfederated) }} - {{ videoBlacklist.createdAt | date: 'short' }} - - - - - - -
- - - - -
- Blacklist reason: - -
- - -
- - - - -
- No blacklisted video found matching current filters. - No blacklisted video found. -
- - -
-
- diff --git a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts deleted file mode 100644 index 63ecdeb9f..000000000 --- a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { Component, OnInit } from '@angular/core' -import { SortMeta } from 'primeng/api' -import { Notifier, ServerService } from '@app/core' -import { ConfirmService } from '../../../core' -import { RestPagination, RestTable, VideoBlacklistService } from '../../../shared' -import { VideoBlacklist, VideoBlacklistType } from '../../../../../../shared' -import { I18n } from '@ngx-translate/i18n-polyfill' -import { DropdownAction } from '../../../shared/buttons/action-dropdown.component' -import { Video } from '../../../shared/video/video.model' -import { MarkdownService } from '@app/shared/renderer' - -@Component({ - selector: 'my-video-blacklist-list', - templateUrl: './video-blacklist-list.component.html', - styleUrls: [ '../moderation.component.scss' ] -}) -export class VideoBlacklistListComponent extends RestTable implements OnInit { - blacklist: (VideoBlacklist & { reasonHtml?: string })[] = [] - totalRecords = 0 - sort: SortMeta = { field: 'createdAt', order: -1 } - pagination: RestPagination = { count: this.rowsPerPage, start: 0 } - listBlacklistTypeFilter: VideoBlacklistType = undefined - - videoBlacklistActions: DropdownAction[] = [] - - constructor ( - private notifier: Notifier, - private serverService: ServerService, - private confirmService: ConfirmService, - private videoBlacklistService: VideoBlacklistService, - private markdownRenderer: MarkdownService, - private i18n: I18n - ) { - super() - } - - ngOnInit () { - this.serverService.getConfig() - .subscribe(config => { - // don't filter if auto-blacklist is not enabled as this will be the only list - if (config.autoBlacklist.videos.ofUsers.enabled) { - this.listBlacklistTypeFilter = VideoBlacklistType.MANUAL - } - }) - - this.initialize() - - this.videoBlacklistActions = [ - { - label: this.i18n('Unblacklist'), - handler: videoBlacklist => this.removeVideoFromBlacklist(videoBlacklist) - } - ] - } - - getIdentifier () { - return 'VideoBlacklistListComponent' - } - - getVideoUrl (videoBlacklist: VideoBlacklist) { - return Video.buildClientUrl(videoBlacklist.video.uuid) - } - - booleanToText (value: boolean) { - if (value === true) return this.i18n('yes') - - return this.i18n('no') - } - - toHtml (text: string) { - return this.markdownRenderer.textMarkdownToHTML(text) - } - - async removeVideoFromBlacklist (entry: VideoBlacklist) { - const confirmMessage = this.i18n( - 'Do you really want to remove this video from the blacklist? It will be available again in the videos list.' - ) - - const res = await this.confirmService.confirm(confirmMessage, this.i18n('Unblacklist')) - if (res === false) return - - this.videoBlacklistService.removeVideoFromBlacklist(entry.video.id).subscribe( - () => { - this.notifier.success(this.i18n('Video {{name}} removed from the blacklist.', { name: entry.video.name })) - this.loadData() - }, - - err => this.notifier.error(err.message) - ) - } - - protected loadData () { - this.videoBlacklistService.listBlacklist({ - pagination: this.pagination, - sort: this.sort, - search: this.search, - type: this.listBlacklistTypeFilter - }) - .subscribe( - async resultList => { - this.totalRecords = resultList.total - - this.blacklist = resultList.data - - for (const element of this.blacklist) { - Object.assign(element, { reasonHtml: await this.toHtml(element.reason) }) - } - }, - - err => this.notifier.error(err.message) - ) - } -} diff --git a/client/src/app/+admin/moderation/video-block-list/index.ts b/client/src/app/+admin/moderation/video-block-list/index.ts new file mode 100644 index 000000000..ec4de8f62 --- /dev/null +++ b/client/src/app/+admin/moderation/video-block-list/index.ts @@ -0,0 +1 @@ +export * from './video-block-list.component' diff --git a/client/src/app/+admin/moderation/video-block-list/video-block-list.component.html b/client/src/app/+admin/moderation/video-block-list/video-block-list.component.html new file mode 100644 index 000000000..f3ec37314 --- /dev/null +++ b/client/src/app/+admin/moderation/video-block-list/video-block-list.component.html @@ -0,0 +1,113 @@ + + +
+
+
+
+
+ +
+ +
+ + Automatic blocks + Manual blocks +
+
+ + + Clear filters +
+
+
+
+ + + + + Video + Sensitive + Unfederated + Date + + + + + + + + + + + + + + + +
+
+ +
+
+
+ + {{ videoBlock.video.name }} +
+
by {{ videoBlock.video.channel?.displayName }} on {{ videoBlock.video.channel?.host }}
+
+
+
+ + + + {{ booleanToText(videoBlock.video.nsfw) }} + {{ booleanToText(videoBlock.unfederated) }} + {{ videoBlock.createdAt | date: 'short' }} + + + {{ booleanToText(videoBlock.video.nsfw) }} + {{ booleanToText(videoBlock.unfederated) }} + {{ videoBlock.createdAt | date: 'short' }} + + + + + + +
+ + + + +
+ Block reason: + +
+ + +
+ + + + +
+ No blocked video found matching current filters. + No blocked video found. +
+ + +
+
+ diff --git a/client/src/app/+admin/moderation/video-block-list/video-block-list.component.scss b/client/src/app/+admin/moderation/video-block-list/video-block-list.component.scss new file mode 100644 index 000000000..43a365608 --- /dev/null +++ b/client/src/app/+admin/moderation/video-block-list/video-block-list.component.scss @@ -0,0 +1,18 @@ +@import 'mixins'; + +my-global-icon { + @include apply-svg-color(#7d7d7d); + + width: 12px; + height: 12px; + position: relative; + top: -1px; +} + +.input-group { + @include peertube-input-group(300px); + + .dropdown-toggle::after { + margin-left: 0; + } +} diff --git a/client/src/app/+admin/moderation/video-block-list/video-block-list.component.ts b/client/src/app/+admin/moderation/video-block-list/video-block-list.component.ts new file mode 100644 index 000000000..e72ab5348 --- /dev/null +++ b/client/src/app/+admin/moderation/video-block-list/video-block-list.component.ts @@ -0,0 +1,196 @@ +import { Component, OnInit } from '@angular/core' +import { SortMeta } from 'primeng/api' +import { Notifier, ServerService } from '@app/core' +import { ConfirmService } from '../../../core' +import { RestPagination, RestTable, VideoBlockService } from '../../../shared' +import { VideoBlocklist, VideoBlockType } from '../../../../../../shared' +import { I18n } from '@ngx-translate/i18n-polyfill' +import { DropdownAction } from '../../../shared/buttons/action-dropdown.component' +import { Video } from '../../../shared/video/video.model' +import { MarkdownService } from '@app/shared/renderer' +import { Params, ActivatedRoute, Router } from '@angular/router' +import { filter, switchMap } from 'rxjs/operators' +import { VideoService } from '@app/shared/video/video.service' + +@Component({ + selector: 'my-video-block-list', + templateUrl: './video-block-list.component.html', + styleUrls: [ '../moderation.component.scss', './video-block-list.component.scss' ] +}) +export class VideoBlockListComponent extends RestTable implements OnInit { + blocklist: (VideoBlocklist & { reasonHtml?: string })[] = [] + totalRecords = 0 + sort: SortMeta = { field: 'createdAt', order: -1 } + pagination: RestPagination = { count: this.rowsPerPage, start: 0 } + listBlockTypeFilter: VideoBlockType = undefined + + videoBlocklistActions: DropdownAction[][] = [] + + constructor ( + private notifier: Notifier, + private serverService: ServerService, + private confirmService: ConfirmService, + private videoBlocklistService: VideoBlockService, + private markdownRenderer: MarkdownService, + private videoService: VideoService, + private route: ActivatedRoute, + private router: Router, + private i18n: I18n + ) { + super() + + this.videoBlocklistActions = [ + [ + { + label: this.i18n('Internal actions'), + isHeader: true + }, + { + label: this.i18n('Switch video block to manual'), + handler: videoBlock => { + this.videoBlocklistService.unblockVideo(videoBlock.video.id).pipe( + switchMap(_ => this.videoBlocklistService.blockVideo(videoBlock.video.id, undefined, true)) + ).subscribe( + () => { + this.notifier.success(this.i18n('Video {{name}} switched to manual block.', { name: videoBlock.video.name })) + this.loadData() + }, + + err => this.notifier.error(err.message) + ) + } + } + ], + [ + { + label: this.i18n('Actions for the video'), + isHeader: true, + }, + { + label: this.i18n('Unblock video'), + handler: videoBlock => this.unblockVideo(videoBlock) + }, + + { + label: this.i18n('Delete video'), + handler: async videoBlock => { + const res = await this.confirmService.confirm( + this.i18n('Do you really want to delete this video?'), + this.i18n('Delete') + ) + if (res === false) return + + this.videoService.removeVideo(videoBlock.video.id) + .subscribe( + () => { + this.notifier.success(this.i18n('Video deleted.')) + }, + + err => this.notifier.error(err.message) + ) + } + } + ] + ] + } + + ngOnInit () { + this.serverService.getConfig() + .subscribe(config => { + // don't filter if auto-blacklist is not enabled as this will be the only list + if (config.autoBlacklist.videos.ofUsers.enabled) { + this.listBlockTypeFilter = VideoBlockType.MANUAL + } + }) + + this.initialize() + + this.route.queryParams + .pipe(filter(params => params.search !== undefined && params.search !== null)) + .subscribe(params => { + this.search = params.search + this.setTableFilter(params.search) + this.loadData() + }) + } + + ngAfterViewInit () { + if (this.search) this.setTableFilter(this.search) + } + + /* Table filter functions */ + onBlockSearch (event: Event) { + this.onSearch(event) + this.setQueryParams((event.target as HTMLInputElement).value) + } + + setQueryParams (search: string) { + const queryParams: Params = {} + if (search) Object.assign(queryParams, { search }) + this.router.navigate([ '/admin/moderation/video-blocks/list' ], { queryParams }) + } + + resetTableFilter () { + this.setTableFilter('') + this.setQueryParams('') + this.resetSearch() + } + /* END Table filter functions */ + + getIdentifier () { + return 'VideoBlockListComponent' + } + + getVideoUrl (videoBlock: VideoBlocklist) { + return Video.buildClientUrl(videoBlock.video.uuid) + } + + booleanToText (value: boolean) { + if (value === true) return this.i18n('yes') + + return this.i18n('no') + } + + toHtml (text: string) { + return this.markdownRenderer.textMarkdownToHTML(text) + } + + async unblockVideo (entry: VideoBlocklist) { + const confirmMessage = this.i18n( + 'Do you really want to unblock this video? It will be available again in the videos list.' + ) + + const res = await this.confirmService.confirm(confirmMessage, this.i18n('Unblock')) + if (res === false) return + + this.videoBlocklistService.unblockVideo(entry.video.id).subscribe( + () => { + this.notifier.success(this.i18n('Video {{name}} unblocked.', { name: entry.video.name })) + this.loadData() + }, + + err => this.notifier.error(err.message) + ) + } + + protected loadData () { + this.videoBlocklistService.listBlocks({ + pagination: this.pagination, + sort: this.sort, + search: this.search, + }) + .subscribe( + async resultList => { + this.totalRecords = resultList.total + + this.blocklist = resultList.data + + for (const element of this.blocklist) { + Object.assign(element, { reasonHtml: await this.toHtml(element.reason) }) + } + }, + + err => this.notifier.error(err.message) + ) + } +} diff --git a/client/src/app/+admin/users/user-edit/user-edit.ts b/client/src/app/+admin/users/user-edit/user-edit.ts index 6e2952c44..98249bcc1 100644 --- a/client/src/app/+admin/users/user-edit/user-edit.ts +++ b/client/src/app/+admin/users/user-edit/user-edit.ts @@ -88,7 +88,7 @@ export abstract class UserEdit extends FormReactive implements OnInit { } protected buildAdminFlags (formValue: any) { - return formValue.byPassAutoBlacklist ? UserAdminFlag.BY_PASS_VIDEO_AUTO_BLACKLIST : UserAdminFlag.NONE + return formValue.byPassAutoBlacklist ? UserAdminFlag.BYPASS_VIDEO_AUTO_BLOCK : UserAdminFlag.NONE } protected buildQuotaOptions () { diff --git a/client/src/app/+admin/users/user-edit/user-update.component.ts b/client/src/app/+admin/users/user-edit/user-update.component.ts index e0e1fbddf..f2bd8c8ec 100644 --- a/client/src/app/+admin/users/user-edit/user-update.component.ts +++ b/client/src/app/+admin/users/user-edit/user-update.component.ts @@ -125,7 +125,7 @@ export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy { role: userJson.role.toString(), videoQuota: userJson.videoQuota, videoQuotaDaily: userJson.videoQuotaDaily, - byPassAutoBlacklist: userJson.adminFlags & UserAdminFlag.BY_PASS_VIDEO_AUTO_BLACKLIST + byPassAutoBlacklist: userJson.adminFlags & UserAdminFlag.BYPASS_VIDEO_AUTO_BLOCK }) } } diff --git a/client/src/app/+my-account/my-account-history/my-account-history.component.html b/client/src/app/+my-account/my-account-history/my-account-history.component.html index d3a329e8f..817b929fe 100644 --- a/client/src/app/+my-account/my-account-history/my-account-history.component.html +++ b/client/src/app/+my-account/my-account-history/my-account-history.component.html @@ -17,6 +17,6 @@
+ (videoRemoved)="removeVideoFromArray(video)" (videoBlocked)="removeVideoFromArray(video)">
diff --git a/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts b/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts index 6ba1a1020..72e26ac28 100644 --- a/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts +++ b/client/src/app/+my-account/my-account-settings/my-account-notification-preferences/my-account-notification-preferences.component.ts @@ -35,8 +35,8 @@ export class MyAccountNotificationPreferencesComponent implements OnInit { newVideoFromSubscription: this.i18n('New video from your subscriptions'), newCommentOnMyVideo: this.i18n('New comment on your video'), videoAbuseAsModerator: this.i18n('New video abuse'), - videoAutoBlacklistAsModerator: this.i18n('Video auto-blacklisted waiting review'), - blacklistOnMyVideo: this.i18n('One of your video is blacklisted/unblacklisted'), + videoAutoBlacklistAsModerator: this.i18n('Video blocked automatically waiting review'), + blacklistOnMyVideo: this.i18n('One of your video is blocked/unblocked'), myVideoPublished: this.i18n('Video published (after transcoding/scheduled update)'), myVideoImportFinished: this.i18n('Video import finished'), newUserRegistration: this.i18n('A new user registered on your instance'), @@ -49,7 +49,7 @@ export class MyAccountNotificationPreferencesComponent implements OnInit { this.rightNotifications = { videoAbuseAsModerator: UserRight.MANAGE_VIDEO_ABUSES, - videoAutoBlacklistAsModerator: UserRight.MANAGE_VIDEO_BLACKLIST, + videoAutoBlacklistAsModerator: UserRight.MANAGE_VIDEO_BLOCKS, newUserRegistration: UserRight.MANAGE_USERS, newInstanceFollower: UserRight.MANAGE_SERVER_FOLLOW, autoInstanceFollowing: UserRight.MANAGE_CONFIGURATION diff --git a/client/src/app/menu/menu.component.ts b/client/src/app/menu/menu.component.ts index 015c14bce..79bf29e9c 100644 --- a/client/src/app/menu/menu.component.ts +++ b/client/src/app/menu/menu.component.ts @@ -33,7 +33,7 @@ export class MenuComponent implements OnInit { [UserRight.MANAGE_USERS]: '/admin/users', [UserRight.MANAGE_SERVER_FOLLOW]: '/admin/friends', [UserRight.MANAGE_VIDEO_ABUSES]: '/admin/moderation/video-abuses', - [UserRight.MANAGE_VIDEO_BLACKLIST]: '/admin/moderation/video-blacklist', + [UserRight.MANAGE_VIDEO_BLOCKS]: '/admin/moderation/video-blocks', [UserRight.MANAGE_JOBS]: '/admin/jobs', [UserRight.MANAGE_CONFIGURATION]: '/admin/config' } @@ -131,7 +131,7 @@ export class MenuComponent implements OnInit { UserRight.MANAGE_USERS, UserRight.MANAGE_SERVER_FOLLOW, UserRight.MANAGE_VIDEO_ABUSES, - UserRight.MANAGE_VIDEO_BLACKLIST, + UserRight.MANAGE_VIDEO_BLOCKS, UserRight.MANAGE_JOBS, UserRight.MANAGE_CONFIGURATION ] diff --git a/client/src/app/search/search.component.html b/client/src/app/search/search.component.html index 3cafc676d..d723606db 100644 --- a/client/src/app/search/search.component.html +++ b/client/src/app/search/search.component.html @@ -55,7 +55,7 @@ diff --git a/client/src/app/shared/forms/form-validators/index.ts b/client/src/app/shared/forms/form-validators/index.ts index e3de3ae13..4a01b1622 100644 --- a/client/src/app/shared/forms/form-validators/index.ts +++ b/client/src/app/shared/forms/form-validators/index.ts @@ -6,7 +6,7 @@ export * from './login-validators.service' export * from './reset-password-validators.service' export * from './user-validators.service' export * from './video-abuse-validators.service' -export * from './video-blacklist-validators.service' +export * from './video-block-validators.service' export * from './video-channel-validators.service' export * from './video-comment-validators.service' export * from './video-validators.service' diff --git a/client/src/app/shared/forms/form-validators/video-blacklist-validators.service.ts b/client/src/app/shared/forms/form-validators/video-block-validators.service.ts similarity index 52% rename from client/src/app/shared/forms/form-validators/video-blacklist-validators.service.ts rename to client/src/app/shared/forms/form-validators/video-block-validators.service.ts index 07d1f264a..dc8257761 100644 --- a/client/src/app/shared/forms/form-validators/video-blacklist-validators.service.ts +++ b/client/src/app/shared/forms/form-validators/video-block-validators.service.ts @@ -4,15 +4,15 @@ import { Injectable } from '@angular/core' import { BuildFormValidator } from '@app/shared' @Injectable() -export class VideoBlacklistValidatorsService { - readonly VIDEO_BLACKLIST_REASON: BuildFormValidator +export class VideoBlockValidatorsService { + readonly VIDEO_BLOCK_REASON: BuildFormValidator constructor (private i18n: I18n) { - this.VIDEO_BLACKLIST_REASON = { + this.VIDEO_BLOCK_REASON = { VALIDATORS: [ Validators.minLength(2), Validators.maxLength(300) ], MESSAGES: { - 'minlength': this.i18n('Blacklist reason must be at least 2 characters long.'), - 'maxlength': this.i18n('Blacklist reason cannot be more than 300 characters long.') + 'minlength': this.i18n('Block reason must be at least 2 characters long.'), + 'maxlength': this.i18n('Block reason cannot be more than 300 characters long.') } } } diff --git a/client/src/app/shared/images/global-icon.component.ts b/client/src/app/shared/images/global-icon.component.ts index d2700f6c3..169882685 100644 --- a/client/src/app/shared/images/global-icon.component.ts +++ b/client/src/app/shared/images/global-icon.component.ts @@ -56,7 +56,8 @@ const icons = { 'refresh': require('!!raw-loader?!../../../assets/images/global/refresh.svg').default, 'npm': require('!!raw-loader?!../../../assets/images/global/npm.svg').default, 'fullscreen': require('!!raw-loader?!../../../assets/images/global/fullscreen.svg').default, - 'exit-fullscreen': require('!!raw-loader?!../../../assets/images/global/exit-fullscreen.svg').default + 'exit-fullscreen': require('!!raw-loader?!../../../assets/images/global/exit-fullscreen.svg').default, + 'robot': require('!!raw-loader?!../../../assets/images/global/robot.svg').default } export type GlobalIconName = keyof typeof icons diff --git a/client/src/app/shared/index.ts b/client/src/app/shared/index.ts index 136730c91..8be578d9f 100644 --- a/client/src/app/shared/index.ts +++ b/client/src/app/shared/index.ts @@ -3,5 +3,5 @@ export * from './forms' export * from './rest' export * from './users' export * from './video-abuse' -export * from './video-blacklist' +export * from './video-block' export * from './shared.module' diff --git a/client/src/app/shared/shared.module.ts b/client/src/app/shared/shared.module.ts index 813f76672..2035097d7 100644 --- a/client/src/app/shared/shared.module.ts +++ b/client/src/app/shared/shared.module.ts @@ -35,7 +35,7 @@ import { UserValidatorsService, VideoAbuseValidatorsService, VideoAcceptOwnershipValidatorsService, - VideoBlacklistValidatorsService, + VideoBlockValidatorsService, VideoChangeOwnershipValidatorsService, VideoChannelValidatorsService, VideoCommentValidatorsService, @@ -78,7 +78,7 @@ import { VideoPlaylistElementMiniatureComponent } from '@app/shared/video-playli import { VideoPlaylistMiniatureComponent } from '@app/shared/video-playlist/video-playlist-miniature.component' import { VideoPlaylistService } from '@app/shared/video-playlist/video-playlist.service' import { InfiniteScrollerDirective } from '@app/shared/video/infinite-scroller.directive' -import { VideoBlacklistComponent } from '@app/shared/video/modals/video-blacklist.component' +import { VideoBlockComponent } from '@app/shared/video/modals/video-block.component' import { VideoDownloadComponent } from '@app/shared/video/modals/video-download.component' import { VideoReportComponent } from '@app/shared/video/modals/video-report.component' import { RedundancyService } from '@app/shared/video/redundancy.service' @@ -102,7 +102,7 @@ import { LoaderComponent } from './misc/loader.component' import { RestExtractor, RestService } from './rest' import { UserService } from './users' import { VideoAbuseService } from './video-abuse' -import { VideoBlacklistService } from './video-blacklist' +import { VideoBlockService } from './video-block' import { VideoOwnershipService } from './video-ownership' import { FeedComponent } from './video/feed.component' import { VideoMiniatureComponent } from './video/video-miniature.component' @@ -147,7 +147,7 @@ import { VideoService } from './video/video.service' VideoDownloadComponent, VideoReportComponent, - VideoBlacklistComponent, + VideoBlockComponent, FeedComponent, @@ -230,7 +230,7 @@ import { VideoService } from './video/video.service' VideoDownloadComponent, VideoReportComponent, - VideoBlacklistComponent, + VideoBlockComponent, FeedComponent, @@ -282,7 +282,7 @@ import { VideoService } from './video/video.service' RestExtractor, RestService, VideoAbuseService, - VideoBlacklistService, + VideoBlockService, VideoOwnershipService, UserService, VideoService, @@ -305,7 +305,7 @@ import { VideoService } from './video/video.service' VideoCommentValidatorsService, VideoValidatorsService, VideoCaptionsValidatorsService, - VideoBlacklistValidatorsService, + VideoBlockValidatorsService, OverviewService, VideoChangeOwnershipValidatorsService, VideoAcceptOwnershipValidatorsService, diff --git a/client/src/app/shared/users/user-notification.model.ts b/client/src/app/shared/users/user-notification.model.ts index 7b8368d87..bc1861c64 100644 --- a/client/src/app/shared/users/user-notification.model.ts +++ b/client/src/app/shared/users/user-notification.model.ts @@ -96,7 +96,7 @@ export class UserNotification implements UserNotificationServer { this.videoUrl = this.buildVideoUrl(this.video) break - case UserNotificationType.UNBLACKLIST_ON_MY_VIDEO: + case UserNotificationType.UNBLOCK_ON_MY_VIDEO: this.videoUrl = this.buildVideoUrl(this.video) break @@ -112,7 +112,7 @@ export class UserNotification implements UserNotificationServer { this.videoUrl = this.buildVideoUrl(this.videoAbuse.video) break - case UserNotificationType.VIDEO_AUTO_BLACKLIST_FOR_MODERATORS: + case UserNotificationType.VIDEO_AUTO_BLOCK_FOR_MODERATORS: this.videoAutoBlacklistUrl = '/admin/moderation/video-auto-blacklist/list' // Backward compatibility where we did not assign videoBlacklist to this type of notification before if (!this.videoBlacklist) this.videoBlacklist = { id: null, video: this.video } @@ -120,7 +120,7 @@ export class UserNotification implements UserNotificationServer { this.videoUrl = this.buildVideoUrl(this.videoBlacklist.video) break - case UserNotificationType.BLACKLIST_ON_MY_VIDEO: + case UserNotificationType.BLOCK_ON_MY_VIDEO: this.videoUrl = this.buildVideoUrl(this.videoBlacklist.video) break diff --git a/client/src/app/shared/users/user-notifications.component.html b/client/src/app/shared/users/user-notifications.component.html index 8dbe6e329..5a102995a 100644 --- a/client/src/app/shared/users/user-notifications.component.html +++ b/client/src/app/shared/users/user-notifications.component.html @@ -26,19 +26,19 @@ - +
- Your video {{ notification.video.name }} has been unblacklisted + Your video {{ notification.video.name }} has been unblocked
- +
- Your video {{ notification.videoBlacklist.video.name }} has been blacklisted + Your video {{ notification.videoBlacklist.video.name }} has been blocked
@@ -50,11 +50,11 @@
- + diff --git a/client/src/app/shared/video-blacklist/index.ts b/client/src/app/shared/video-blacklist/index.ts deleted file mode 100644 index bfb026441..000000000 --- a/client/src/app/shared/video-blacklist/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './video-blacklist.service' diff --git a/client/src/app/shared/video-blacklist/video-blacklist.service.ts b/client/src/app/shared/video-blacklist/video-blacklist.service.ts deleted file mode 100644 index c0e13a651..000000000 --- a/client/src/app/shared/video-blacklist/video-blacklist.service.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { catchError, map, concatMap, toArray } from 'rxjs/operators' -import { HttpClient, HttpParams } from '@angular/common/http' -import { Injectable } from '@angular/core' -import { SortMeta } from 'primeng/api' -import { from as observableFrom, Observable } from 'rxjs' -import { VideoBlacklist, VideoBlacklistType, ResultList } from '../../../../../shared' -import { Video } from '../video/video.model' -import { environment } from '../../../environments/environment' -import { RestExtractor, RestPagination, RestService } from '../rest' -import { ComponentPaginationLight } from '../rest/component-pagination.model' - -@Injectable() -export class VideoBlacklistService { - private static BASE_VIDEOS_URL = environment.apiUrl + '/api/v1/videos/' - - constructor ( - private authHttp: HttpClient, - private restService: RestService, - private restExtractor: RestExtractor - ) {} - - listBlacklist (options: { - pagination: RestPagination, - sort: SortMeta, - search?: string - type?: VideoBlacklistType - }): Observable> { - const { pagination, sort, search, type } = options - - let params = new HttpParams() - params = this.restService.addRestGetParams(params, pagination, sort) - - if (search) params = params.append('search', search) - if (type) params = params.append('type', type.toString()) - - return this.authHttp.get>(VideoBlacklistService.BASE_VIDEOS_URL + 'blacklist', { params }) - .pipe( - map(res => this.restExtractor.convertResultListDateToHuman(res)), - catchError(res => this.restExtractor.handleError(res)) - ) - } - - getAutoBlacklistedAsVideoList (videoPagination: ComponentPaginationLight): Observable> { - const pagination = this.restService.componentPaginationToRestPagination(videoPagination) - - // prioritize first created since waiting longest - const AUTO_BLACKLIST_SORT = 'createdAt' - - let params = new HttpParams() - params = this.restService.addRestGetParams(params, pagination, AUTO_BLACKLIST_SORT) - - params = params.set('type', VideoBlacklistType.AUTO_BEFORE_PUBLISHED.toString()) - - return this.authHttp.get>(VideoBlacklistService.BASE_VIDEOS_URL + 'blacklist', { params }) - .pipe( - map(res => { - return { - total: res.total, - data: res.data.map(videoBlacklist => new Video(videoBlacklist.video)) - } - }), - catchError(res => this.restExtractor.handleError(res)) - ) - } - - removeVideoFromBlacklist (videoIdArgs: number | number[]) { - const videoIds = Array.isArray(videoIdArgs) ? videoIdArgs : [ videoIdArgs ] - - return observableFrom(videoIds) - .pipe( - concatMap(id => this.authHttp.delete(VideoBlacklistService.BASE_VIDEOS_URL + id + '/blacklist')), - toArray(), - catchError(err => this.restExtractor.handleError(err)) - ) - } - - blacklistVideo (videoId: number, reason: string, unfederate: boolean) { - const body = { - unfederate, - reason - } - - return this.authHttp.post(VideoBlacklistService.BASE_VIDEOS_URL + videoId + '/blacklist', body) - .pipe( - map(this.restExtractor.extractDataBool), - catchError(res => this.restExtractor.handleError(res)) - ) - } -} diff --git a/client/src/app/shared/video-block/index.ts b/client/src/app/shared/video-block/index.ts new file mode 100644 index 000000000..a99551a38 --- /dev/null +++ b/client/src/app/shared/video-block/index.ts @@ -0,0 +1 @@ +export * from './video-block.service' diff --git a/client/src/app/shared/video-block/video-block.service.ts b/client/src/app/shared/video-block/video-block.service.ts new file mode 100644 index 000000000..67ca1d85b --- /dev/null +++ b/client/src/app/shared/video-block/video-block.service.ts @@ -0,0 +1,77 @@ +import { catchError, map, concatMap, toArray } from 'rxjs/operators' +import { HttpClient, HttpParams } from '@angular/common/http' +import { Injectable } from '@angular/core' +import { SortMeta } from 'primeng/api' +import { from as observableFrom, Observable } from 'rxjs' +import { VideoBlocklist, VideoBlockType, ResultList } from '../../../../../shared' +import { environment } from '../../../environments/environment' +import { RestExtractor, RestPagination, RestService } from '../rest' + +@Injectable() +export class VideoBlockService { + private static BASE_VIDEOS_URL = environment.apiUrl + '/api/v1/videos/' + + constructor ( + private authHttp: HttpClient, + private restService: RestService, + private restExtractor: RestExtractor + ) {} + + listBlocks (options: { + pagination: RestPagination + sort: SortMeta + search?: string + type?: VideoBlockType + }): Observable> { + const { pagination, sort, search, type } = options + + let params = new HttpParams() + params = this.restService.addRestGetParams(params, pagination, sort) + + if (search) { + const filters = this.restService.parseQueryStringFilter(search, { + type: { + prefix: 'type:', + handler: v => { + if (v === 'manual') return VideoBlockType.MANUAL + if (v === 'auto') return VideoBlockType.AUTO_BEFORE_PUBLISHED + + return undefined + } + } + }) + + params = this.restService.addObjectParams(params, filters) + } + + return this.authHttp.get>(VideoBlockService.BASE_VIDEOS_URL + 'blacklist', { params }) + .pipe( + map(res => this.restExtractor.convertResultListDateToHuman(res)), + catchError(res => this.restExtractor.handleError(res)) + ) + } + + unblockVideo (videoIdArgs: number | number[]) { + const videoIds = Array.isArray(videoIdArgs) ? videoIdArgs : [ videoIdArgs ] + + return observableFrom(videoIds) + .pipe( + concatMap(id => this.authHttp.delete(VideoBlockService.BASE_VIDEOS_URL + id + '/blacklist')), + toArray(), + catchError(err => this.restExtractor.handleError(err)) + ) + } + + blockVideo (videoId: number, reason: string, unfederate: boolean) { + const body = { + unfederate, + reason + } + + return this.authHttp.post(VideoBlockService.BASE_VIDEOS_URL + videoId + '/blacklist', body) + .pipe( + map(this.restExtractor.extractDataBool), + catchError(res => this.restExtractor.handleError(res)) + ) + } +} diff --git a/client/src/app/shared/video/abstract-video-list.html b/client/src/app/shared/video/abstract-video-list.html index cd8a5b840..8ce3b25b0 100644 --- a/client/src/app/shared/video/abstract-video-list.html +++ b/client/src/app/shared/video/abstract-video-list.html @@ -39,7 +39,7 @@ [fitWidth]="true" [video]="video" [user]="user" [ownerDisplayType]="ownerDisplayType" [displayVideoActions]="displayVideoActions" [displayOptions]="displayOptions" - (videoBlacklisted)="removeVideoFromArray(video)" (videoRemoved)="removeVideoFromArray(video)" + (videoBlocked)="removeVideoFromArray(video)" (videoRemoved)="removeVideoFromArray(video)" > diff --git a/client/src/app/shared/video/modals/video-blacklist.component.html b/client/src/app/shared/video/modals/video-block.component.html similarity index 91% rename from client/src/app/shared/video/modals/video-blacklist.component.html rename to client/src/app/shared/video/modals/video-block.component.html index 8f06a6b02..a8dd30b5e 100644 --- a/client/src/app/shared/video/modals/video-blacklist.component.html +++ b/client/src/app/shared/video/modals/video-block.component.html @@ -1,12 +1,12 @@