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 { Component, OnInit } from '@angular/core'
+import { ActivatedRoute, Router } from '@angular/router'
+import { AuthService, ConfirmService, MarkdownService, Notifier, RestPagination, RestTable } from '@app/core'
+import { AdvancedInputFilter } from '@app/shared/shared-forms'
+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 {
+export class VideoCommentListComponent extends RestTable implements OnInit {
comments: VideoCommentAdmin[]
totalRecords = 0
sort: SortMeta = { field: 'createdAt', order: -1 }
videoCommentActions: DropdownAction<VideoCommentAdmin>[][] = []
+ 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<VideoCommentAdmin[]>[] = []
+
+ inputFilters: AdvancedInputFilter[] = [
+ {
+ title: $localize`Advanced filters`,
+ children: [
+ {
+ value: 'local:true',
+ label: $localize`Local comments`
+ },
+ {
+ value: 'local:false',
+ label: $localize`Remote comments`
+ }
+ ]
+ }
+ ]
+
+ 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.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)
+ getIdentifier () {
+ return 'VideoCommentListComponent'
}
- onSearch (event: Event) {
- this.onSearch(event)
- this.setQueryParams((event.target as HTMLInputElement).value)
+ toHtml (text: string) {
+ return this.markdownRenderer.textMarkdownToHTML(text, true, true)
}
- setQueryParams (search: string) {
- const queryParams: Params = {}
-
- if (search) Object.assign(queryParams, { search })
- this.router.navigate([ '/admin/moderation/video-comments/list' ], { queryParams })
+ isInSelectionMode () {
+ return this.selectedComments.length !== 0
}
- resetTableFilter () {
- this.setTableFilter('')
- this.setQueryParams('')
- this.resetSearch()
+ protected reloadData () {
+ this.videoCommentService.getAdminVideoComments({
+ pagination: this.pagination,
+ sort: this.sort,
+ search: this.search
+ }).subscribe({
+ next: async resultList => {
+ this.totalRecords = resultList.total
+
+ this.comments = []
+
+ for (const c of resultList.data) {
+ this.comments.push(
+ new VideoCommentAdmin(c, await this.toHtml(c.text))
+ )
+ }
+ },
+
+ error: err => this.notifier.error(err.message)
+ })
}
- /* END Table filter functions */
- getIdentifier () {
- return 'VideoCommentListComponent'
+ private removeComments (comments: VideoCommentAdmin[]) {
+ const commentArgs = comments.map(c => ({ videoId: c.video.id, commentId: c.id }))
+
+ this.videoCommentService.deleteVideoComments(commentArgs)
+ .subscribe({
+ next: () => {
+ this.notifier.success($localize`${commentArgs.length} comments deleted.`)
+ this.reloadData()
+ },
+
+ error: err => this.notifier.error(err.message),
+
+ complete: () => this.selectedComments = []
+ })
}
- toHtml (text: string) {
- return this.markdownRenderer.textMarkdownToHTML(text)
+ private deleteComment (comment: VideoCommentAdmin) {
+ this.videoCommentService.deleteVideoComment(comment.video.id, comment.id)
+ .subscribe({
+ next: () => this.reloadData(),
+
+ error: err => this.notifier.error(err.message)
+ })
}
- protected loadData () {
- this.videoCommentService.getAdminVideoComments({
- pagination: this.pagination,
- sort: this.sort,
- search: this.search
- }).subscribe(
- async resultList => {
- this.totalRecords = resultList.total
+ 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
- this.comments = []
+ const options = {
+ accountName: comment.by,
+ scope: 'instance' as 'instance'
+ }
- for (const c of resultList.data) {
- this.comments.push(
- new VideoCommentAdmin(c, await this.toHtml(c.text))
- )
- }
+ this.bulkService.removeCommentsOf(options)
+ .subscribe({
+ next: () => {
+ this.notifier.success($localize`Comments of ${options.accountName} will be deleted in a few minutes`)
},
- err => this.notifier.error(err.message)
- )
+ error: err => this.notifier.error(err.message)
+ })
}
}