From f1273314593a4a7dc7ec9594ce0c6c3ae8f62b34 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 16 Nov 2020 11:55:17 +0100 Subject: Add admin view to manage comments --- .../video-block-list.component.scss | 8 +- .../video-comment-list.component.html | 36 ++++++--- .../video-comment-list.component.scss | 51 +++++++++++-- .../video-comment-list.component.ts | 86 ++++++++++++++++++---- 4 files changed, 145 insertions(+), 36 deletions(-) (limited to 'client/src/app/+admin/moderation') 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 index c92d1c39c..0e34150c1 100644 --- 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 @@ -1,12 +1,8 @@ @import 'mixins'; my-global-icon { - @include apply-svg-color(#7d7d7d); - - width: 12px; - height: 12px; - position: relative; - top: -1px; + width: 24px; + height: 24px; } .input-group { diff --git a/client/src/app/+admin/moderation/video-comment-list/video-comment-list.component.html b/client/src/app/+admin/moderation/video-comment-list/video-comment-list.component.html index b4f66a75f..45c5fe28f 100644 --- a/client/src/app/+admin/moderation/video-comment-list/video-comment-list.component.html +++ b/client/src/app/+admin/moderation/video-comment-list/video-comment-list.component.html @@ -1,9 +1,11 @@

- + Video comments + +

-this view does show comments from muted accounts so you can delete them +This view also shows comments from muted accounts. Clear filters @@ -41,9 +43,9 @@ this view does show comments from muted accounts so you can delete them - Account - Video - Comment + Account + Video + Comment Date @@ -58,14 +60,28 @@ this view does show comments from muted accounts so you can delete them - {{ videoComment.by }} + +
+ +
+ {{ videoComment.account.displayName }} + {{ videoComment.by }} +
+
+
- - {{ videoComment.video.name }} + + Commented video + + {{ videoComment.video.name }} - +
diff --git a/client/src/app/+admin/moderation/video-comment-list/video-comment-list.component.scss b/client/src/app/+admin/moderation/video-comment-list/video-comment-list.component.scss index c92d1c39c..b3746b0c5 100644 --- a/client/src/app/+admin/moderation/video-comment-list/video-comment-list.component.scss +++ b/client/src/app/+admin/moderation/video-comment-list/video-comment-list.component.scss @@ -1,12 +1,22 @@ @import 'mixins'; -my-global-icon { - @include apply-svg-color(#7d7d7d); +h1 { + my-feed { + margin-left: 5px; + display: inline-block; + + ::ng-deep { + my-global-icon { + width: 15px !important; + top: 0 !important; + } + } + } +} - width: 12px; - height: 12px; - position: relative; - top: -1px; +my-global-icon { + width: 24px; + height: 24px; } .input-group { @@ -25,3 +35,32 @@ my-global-icon { flex-grow: 1; } } + +.video { + display: flex; + flex-direction: column; + + em { + font-size: 11px; + } + + a { + @include ellipsis + } +} + +.comment-html { + ::ng-deep { + > div { + max-height: 22px; + } + + div, p { + @include ellipsis; + } + + p { + margin: 0; + } + } +} 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..d26047125 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,16 +1,17 @@ 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 { 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 { comments: VideoCommentAdmin[] @@ -20,26 +21,54 @@ 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() + } + ] + + get authUser () { + return this.auth.getUser() + } + constructor ( + 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 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) + } ] ] } @@ -60,7 +89,7 @@ export class VideoCommentListComponent extends RestTable implements OnInit, Afte if (this.search) this.setTableFilter(this.search) } - onSearch (event: Event) { + onInputSearch (event: Event) { this.onSearch(event) this.setQueryParams((event.target as HTMLInputElement).value) } @@ -84,7 +113,7 @@ export class VideoCommentListComponent extends RestTable implements OnInit, Afte } toHtml (text: string) { - return this.markdownRenderer.textMarkdownToHTML(text) + return this.markdownRenderer.textMarkdownToHTML(text, true, true) } protected loadData () { @@ -108,4 +137,33 @@ export class VideoCommentListComponent extends RestTable implements OnInit, Afte err => this.notifier.error(err.message) ) } + + 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) + ) + } } -- cgit v1.2.3