X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2F%2Badmin%2Fmoderation%2Fvideo-abuse-list%2Fvideo-abuse-list.component.ts;h=ca37bccf30e975585b346e05ba9338cd68ec9cb8;hb=5baee5fca418487e72ddcd6419d31bca8659b668;hp=0c727ae90dc9d78b461f8aef213fc9caa57f8708;hpb=042daa7072c0168b876db2badfc838dba7ac2284;p=github%2FChocobozzz%2FPeerTube.git 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 0c727ae90..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 @@ -1,9 +1,9 @@ -import { Component, OnInit, ViewChild } from '@angular/core' +import { Component, OnInit, ViewChild, AfterViewInit } from '@angular/core' 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' @@ -16,21 +16,33 @@ import { getAbsoluteAPIUrl } from '@app/shared/misc/utils' import { DomSanitizer } from '@angular/platform-browser' import { BlocklistService } from '@app/shared/blocklist' import { VideoService } from '@app/shared/video/video.service' -import { ActivatedRoute } from '@angular/router' -import { first } from 'rxjs/operators' +import { ActivatedRoute, Params, Router } from '@angular/router' +import { filter } from 'rxjs/operators' + +export type ProcessedVideoAbuse = VideoAbuse & { + moderationCommentHtml?: string, + reasonHtml?: string + embedHtml?: string + updatedAt?: Date + // override bare server-side definitions with rich client-side definitions + reporterAccount: Account + video: VideoAbuse['video'] & { + channel: VideoAbuse['video']['channel'] & { + ownerAccount: Account + } + } +} @Component({ selector: 'my-video-abuse-list', templateUrl: './video-abuse-list.component.html', styleUrls: [ '../moderation.component.scss', './video-abuse-list.component.scss' ] }) -export class VideoAbuseListComponent extends RestTable implements OnInit { +export class VideoAbuseListComponent extends RestTable implements OnInit, AfterViewInit { @ViewChild('moderationCommentModal', { static: true }) moderationCommentModal: ModerationCommentModalComponent - videoAbuses: (VideoAbuse & { moderationCommentHtml?: string, reasonHtml?: string })[] = [] + videoAbuses: ProcessedVideoAbuse[] = [] totalRecords = 0 - rowsPerPageOptions = [ 20, 50, 100 ] - rowsPerPage = this.rowsPerPageOptions[0] sort: SortMeta = { field: 'createdAt', order: 1 } pagination: RestPagination = { count: this.rowsPerPage, start: 0 } @@ -41,12 +53,13 @@ export class VideoAbuseListComponent extends RestTable implements OnInit { private videoAbuseService: VideoAbuseService, private blocklistService: BlocklistService, private videoService: VideoService, - private videoBlacklistService: VideoBlacklistService, + private videoBlocklistService: VideoBlockService, private confirmService: ConfirmService, private i18n: I18n, private markdownRenderer: MarkdownService, private sanitizer: DomSanitizer, - private route: ActivatedRoute + private route: ActivatedRoute, + private router: Router ) { super() @@ -88,13 +101,13 @@ export class VideoAbuseListComponent extends RestTable implements OnInit { 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) }, @@ -104,13 +117,13 @@ export class VideoAbuseListComponent extends RestTable implements OnInit { } }, { - 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) }, @@ -190,8 +203,16 @@ export class VideoAbuseListComponent extends RestTable implements OnInit { this.initialize() this.route.queryParams - .pipe(first(params => params.search !== undefined && params.search !== null)) - .subscribe(params => this.search = params.search) + .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) } getIdentifier () { @@ -206,10 +227,25 @@ export class VideoAbuseListComponent extends RestTable implements OnInit { this.loadData() } - createByString (account: Account) { - return Account.CREATE_BY_STRING(account.name, account.host) + /* Table filter functions */ + onAbuseSearch (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-abuses/list' ], { queryParams }) } + resetTableFilter () { + this.setTableFilter('') + this.setQueryParams('') + this.resetSearch() + } + /* END Table filter functions */ + isVideoAbuseAccepted (videoAbuse: VideoAbuse) { return videoAbuse.state.id === VideoAbuseState.ACCEPTED } @@ -256,7 +292,6 @@ export class VideoAbuseListComponent extends RestTable implements OnInit { err => this.notifier.error(err.message) ) - } protected loadData () { @@ -267,18 +302,23 @@ export class VideoAbuseListComponent extends RestTable implements OnInit { }).subscribe( async resultList => { this.totalRecords = resultList.total + const videoAbuses = [] - this.videoAbuses = resultList.data - - for (const abuse of this.videoAbuses) { + for (const abuse of resultList.data) { Object.assign(abuse, { reasonHtml: await this.toHtml(abuse.reason), moderationCommentHtml: await this.toHtml(abuse.moderationComment), embedHtml: this.sanitizer.bypassSecurityTrustHtml(this.getVideoEmbed(abuse)), reporterAccount: new Account(abuse.reporterAccount) }) + + if (abuse.video.channel?.ownerAccount) abuse.video.channel.ownerAccount = new Account(abuse.video.channel.ownerAccount) + if (abuse.updatedAt === abuse.createdAt) delete abuse.updatedAt + + videoAbuses.push(abuse as ProcessedVideoAbuse) } + this.videoAbuses = videoAbuses }, err => this.notifier.error(err.message)