X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2F%2Badmin%2Fmoderation%2Fvideo-comment-list%2Fvideo-comment-list.component.ts;h=63493d00d59ccd6600dc81ddb74ba239014829b6;hb=205e4f56f3da1f787f1bc2cdfcc39948a99a16b1;hp=fdd5ec76e3310d43bd94bd96ffcd9b2259bcde96;hpb=0f8d00e3144060270d7fe603865fccaf18649c47;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/+admin/moderation/video-comment-list/video-comment-list.component.ts b/client/src/app/+admin/moderation/video-comment-list/video-comment-list.component.ts index fdd5ec76e..63493d00d 100644 --- a/client/src/app/+admin/moderation/video-comment-list/video-comment-list.component.ts +++ b/client/src/app/+admin/moderation/video-comment-list/video-comment-list.component.ts @@ -1,18 +1,20 @@ import { SortMeta } from 'primeng/api' -import { filter } from 'rxjs/operators' import { AfterViewInit, Component, OnInit } from '@angular/core' -import { DomSanitizer } from '@angular/platform-browser' -import { ActivatedRoute, Params, Router } from '@angular/router' -import { ConfirmService, MarkdownService, Notifier, RestPagination, RestTable, ServerService } from '@app/core' -import { DropdownAction, VideoService } from '@app/shared/shared-main' +import { ActivatedRoute, Router } from '@angular/router' +import { AuthService, ConfirmService, MarkdownService, Notifier, RestPagination, RestTable } from '@app/core' +import { DropdownAction } from '@app/shared/shared-main' +import { BulkService } from '@app/shared/shared-moderation' import { VideoCommentAdmin, VideoCommentService } from '@app/shared/shared-video-comment' +import { FeedFormat, UserRight } from '@shared/models' @Component({ selector: 'my-video-comment-list', templateUrl: './video-comment-list.component.html', - styleUrls: [ './video-comment-list.component.scss' ] + styleUrls: [ '../../../shared/shared-moderation/moderation.scss', './video-comment-list.component.scss' ] }) export class VideoCommentListComponent extends RestTable implements OnInit, AfterViewInit { + baseRoute = '/admin/moderation/video-comments/list' + comments: VideoCommentAdmin[] totalRecords = 0 sort: SortMeta = { field: 'createdAt', order: -1 } @@ -20,71 +22,89 @@ export class VideoCommentListComponent extends RestTable implements OnInit, Afte videoCommentActions: DropdownAction[][] = [] + syndicationItems = [ + { + format: FeedFormat.RSS, + label: 'media rss 2.0', + url: VideoCommentService.BASE_FEEDS_URL + FeedFormat.RSS.toLowerCase() + }, + { + format: FeedFormat.ATOM, + label: 'atom 1.0', + url: VideoCommentService.BASE_FEEDS_URL + FeedFormat.ATOM.toLowerCase() + }, + { + format: FeedFormat.JSON, + label: 'json 1.0', + url: VideoCommentService.BASE_FEEDS_URL + FeedFormat.JSON.toLowerCase() + } + ] + + selectedComments: VideoCommentAdmin[] = [] + bulkCommentActions: DropdownAction[] = [] + + get authUser () { + return this.auth.getUser() + } + constructor ( + protected router: Router, + protected route: ActivatedRoute, + private auth: AuthService, private notifier: Notifier, - private serverService: ServerService, private confirmService: ConfirmService, private videoCommentService: VideoCommentService, private markdownRenderer: MarkdownService, - private sanitizer: DomSanitizer, - private videoService: VideoService, - private route: ActivatedRoute, - private router: Router + private bulkService: BulkService ) { super() this.videoCommentActions = [ [ + { + label: $localize`Delete this comment`, + handler: comment => this.deleteComment(comment), + isDisplayed: () => this.authUser.hasRight(UserRight.REMOVE_ANY_VIDEO_COMMENT) + }, - // remove this comment, - - // remove all comments of this account - + { + label: $localize`Delete all comments of this account`, + description: $localize`Comments are deleted after a few minutes`, + handler: comment => this.deleteUserComments(comment), + isDisplayed: () => this.authUser.hasRight(UserRight.REMOVE_ANY_VIDEO_COMMENT) + } ] ] } ngOnInit () { 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() - }) + this.listenToSearchChange() + + this.bulkCommentActions = [ + { + label: $localize`Delete`, + handler: comments => this.removeComments(comments), + isDisplayed: () => this.authUser.hasRight(UserRight.REMOVE_ANY_VIDEO_COMMENT), + iconName: 'delete' + } + ] } ngAfterViewInit () { - if (this.search) this.setTableFilter(this.search) + if (this.search) this.setTableFilter(this.search, false) } - onSearch (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-comments/list' ], { queryParams }) - } - - resetTableFilter () { - this.setTableFilter('') - this.setQueryParams('') - this.resetSearch() - } - /* END Table filter functions */ - getIdentifier () { return 'VideoCommentListComponent' } toHtml (text: string) { - return this.markdownRenderer.textMarkdownToHTML(text) + return this.markdownRenderer.textMarkdownToHTML(text, true, true) + } + + isInSelectionMode () { + return this.selectedComments.length !== 0 } protected loadData () { @@ -108,4 +128,48 @@ export class VideoCommentListComponent extends RestTable implements OnInit, Afte err => this.notifier.error(err.message) ) } + + private async removeComments (comments: VideoCommentAdmin[]) { + const commentArgs = comments.map(c => ({ videoId: c.video.id, commentId: c.id })) + + this.videoCommentService.deleteVideoComments(commentArgs).subscribe( + () => { + this.notifier.success($localize`${commentArgs.length} comments deleted.`) + this.loadData() + }, + + err => this.notifier.error(err.message), + + () => this.selectedComments = [] + ) + } + + private deleteComment (comment: VideoCommentAdmin) { + this.videoCommentService.deleteVideoComment(comment.video.id, comment.id) + .subscribe( + () => this.loadData(), + + err => this.notifier.error(err.message) + ) + } + + private async deleteUserComments (comment: VideoCommentAdmin) { + const message = $localize`Do you really want to delete all comments of ${comment.by}?` + const res = await this.confirmService.confirm(message, $localize`Delete`) + if (res === false) return + + const options = { + accountName: comment.by, + scope: 'instance' as 'instance' + } + + this.bulkService.removeCommentsOf(options) + .subscribe( + () => { + this.notifier.success($localize`Comments of ${options.accountName} will be deleted in a few minutes`) + }, + + err => this.notifier.error(err.message) + ) + } }