import { SortMeta } from 'primeng/api'
-import { filter } from 'rxjs/operators'
-import { AfterViewInit, Component, OnInit } from '@angular/core'
-import { ActivatedRoute, Params, Router } from '@angular/router'
+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'
templateUrl: './video-comment-list.component.html',
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 }
}
]
+ 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 confirmService: ConfirmService,
private videoCommentService: VideoCommentService,
private markdownRenderer: MarkdownService,
- private route: ActivatedRoute,
- private router: Router,
private bulkService: BulkService
- ) {
+ ) {
super()
this.videoCommentActions = [
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()
- })
- }
-
- ngAfterViewInit () {
- if (this.search) this.setTableFilter(this.search)
- }
-
- onInputSearch (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()
+ this.bulkCommentActions = [
+ {
+ label: $localize`Delete`,
+ handler: comments => this.removeComments(comments),
+ isDisplayed: () => this.authUser.hasRight(UserRight.REMOVE_ANY_VIDEO_COMMENT),
+ iconName: 'delete'
+ }
+ ]
}
- /* END Table filter functions */
getIdentifier () {
return 'VideoCommentListComponent'
return this.markdownRenderer.textMarkdownToHTML(text, true, true)
}
- protected loadData () {
+ isInSelectionMode () {
+ return this.selectedComments.length !== 0
+ }
+
+ protected reloadData () {
this.videoCommentService.getAdminVideoComments({
pagination: this.pagination,
sort: this.sort,
search: this.search
- }).subscribe(
- async resultList => {
- this.totalRecords = resultList.total
+ }).subscribe({
+ next: async resultList => {
+ this.totalRecords = resultList.total
+
+ this.comments = []
- 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)
+ })
+ }
+
+ private removeComments (comments: VideoCommentAdmin[]) {
+ const commentArgs = comments.map(c => ({ videoId: c.video.id, commentId: c.id }))
- for (const c of resultList.data) {
- this.comments.push(
- new VideoCommentAdmin(c, await this.toHtml(c.text))
- )
- }
+ this.videoCommentService.deleteVideoComments(commentArgs)
+ .subscribe({
+ next: () => {
+ this.notifier.success($localize`${commentArgs.length} comments deleted.`)
+ this.reloadData()
},
- err => this.notifier.error(err.message)
- )
+ error: err => this.notifier.error(err.message),
+
+ complete: () => this.selectedComments = []
+ })
}
private deleteComment (comment: VideoCommentAdmin) {
this.videoCommentService.deleteVideoComment(comment.video.id, comment.id)
- .subscribe(
- () => this.loadData(),
+ .subscribe({
+ next: () => this.reloadData(),
- err => this.notifier.error(err.message)
- )
+ error: err => this.notifier.error(err.message)
+ })
}
private async deleteUserComments (comment: VideoCommentAdmin) {
}
this.bulkService.removeCommentsOf(options)
- .subscribe(
- () => {
+ .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)
+ })
}
}