aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/app/+admin/moderation
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2018-08-14 16:38:37 +0200
committerChocobozzz <me@florianbigard.com>2018-08-14 18:01:22 +0200
commit614d1ae928ec307b708c4a3eb423797353b1df2a (patch)
tree8281785fc158073e56d31a9e1923906b72622ae2 /client/src/app/+admin/moderation
parent65b247ddc75aa9f131af86dde21c8d958f7f4b39 (diff)
downloadPeerTube-614d1ae928ec307b708c4a3eb423797353b1df2a.tar.gz
PeerTube-614d1ae928ec307b708c4a3eb423797353b1df2a.tar.zst
PeerTube-614d1ae928ec307b708c4a3eb423797353b1df2a.zip
Regroup abuse and blacklisted videos inside "moderation"
Diffstat (limited to 'client/src/app/+admin/moderation')
-rw-r--r--client/src/app/+admin/moderation/index.ts4
-rw-r--r--client/src/app/+admin/moderation/moderation.component.html11
-rw-r--r--client/src/app/+admin/moderation/moderation.component.scss4
-rw-r--r--client/src/app/+admin/moderation/moderation.component.ts19
-rw-r--r--client/src/app/+admin/moderation/moderation.routes.ts42
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/index.ts2
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html32
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.scss6
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts73
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html62
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.scss6
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts125
-rw-r--r--client/src/app/+admin/moderation/video-blacklist-list/index.ts1
-rw-r--r--client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html47
-rw-r--r--client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.scss6
-rw-r--r--client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts81
16 files changed, 521 insertions, 0 deletions
diff --git a/client/src/app/+admin/moderation/index.ts b/client/src/app/+admin/moderation/index.ts
new file mode 100644
index 000000000..66e2c6a39
--- /dev/null
+++ b/client/src/app/+admin/moderation/index.ts
@@ -0,0 +1,4 @@
1export * from './video-abuse-list'
2export * from './video-blacklist-list'
3export * from './moderation.component'
4export * from './moderation.routes'
diff --git a/client/src/app/+admin/moderation/moderation.component.html b/client/src/app/+admin/moderation/moderation.component.html
new file mode 100644
index 000000000..91e87fcd4
--- /dev/null
+++ b/client/src/app/+admin/moderation/moderation.component.html
@@ -0,0 +1,11 @@
1<div class="admin-sub-header">
2 <div i18n class="form-sub-title">Moderation</div>
3
4 <div class="admin-sub-nav">
5 <a *ngIf="hasVideoAbusesRight()" i18n routerLink="video-abuses/list" routerLinkActive="active">Video abuses</a>
6
7 <a *ngIf="hasVideoBlacklistRight()" i18n routerLink="video-blacklist/list" routerLinkActive="active">Blacklisted videos</a>
8 </div>
9</div>
10
11<router-outlet></router-outlet> \ No newline at end of file
diff --git a/client/src/app/+admin/moderation/moderation.component.scss b/client/src/app/+admin/moderation/moderation.component.scss
new file mode 100644
index 000000000..766d7853b
--- /dev/null
+++ b/client/src/app/+admin/moderation/moderation.component.scss
@@ -0,0 +1,4 @@
1.form-sub-title {
2 flex-grow: 0;
3 margin-right: 30px;
4}
diff --git a/client/src/app/+admin/moderation/moderation.component.ts b/client/src/app/+admin/moderation/moderation.component.ts
new file mode 100644
index 000000000..0f4efb970
--- /dev/null
+++ b/client/src/app/+admin/moderation/moderation.component.ts
@@ -0,0 +1,19 @@
1import { Component } from '@angular/core'
2import { UserRight } from '../../../../../shared'
3import { AuthService } from '@app/core/auth/auth.service'
4
5@Component({
6 templateUrl: './moderation.component.html',
7 styleUrls: [ './moderation.component.scss' ]
8})
9export class ModerationComponent {
10 constructor (private auth: AuthService) {}
11
12 hasVideoAbusesRight () {
13 return this.auth.getUser().hasRight(UserRight.MANAGE_VIDEO_ABUSES)
14 }
15
16 hasVideoBlacklistRight () {
17 return this.auth.getUser().hasRight(UserRight.MANAGE_VIDEO_BLACKLIST)
18 }
19}
diff --git a/client/src/app/+admin/moderation/moderation.routes.ts b/client/src/app/+admin/moderation/moderation.routes.ts
new file mode 100644
index 000000000..b133152d9
--- /dev/null
+++ b/client/src/app/+admin/moderation/moderation.routes.ts
@@ -0,0 +1,42 @@
1import { Routes } from '@angular/router'
2import { UserRight } from '../../../../../shared'
3import { UserRightGuard } from '@app/core'
4import { VideoAbuseListComponent } from '@app/+admin/moderation/video-abuse-list'
5import { VideoBlacklistListComponent } from '@app/+admin/moderation/video-blacklist-list'
6import { ModerationComponent } from '@app/+admin/moderation/moderation.component'
7
8export const ModerationRoutes: Routes = [
9 {
10 path: 'moderation',
11 component: ModerationComponent,
12 children: [
13 {
14 path: '',
15 redirectTo: 'video-abuses/list',
16 pathMatch: 'full'
17 },
18 {
19 path: 'video-abuses/list',
20 component: VideoAbuseListComponent,
21 canActivate: [ UserRightGuard ],
22 data: {
23 userRight: UserRight.MANAGE_VIDEO_ABUSES,
24 meta: {
25 title: 'Video abuses list'
26 }
27 }
28 },
29 {
30 path: 'video-blacklist/list',
31 component: VideoBlacklistListComponent,
32 canActivate: [ UserRightGuard ],
33 data: {
34 userRight: UserRight.MANAGE_VIDEO_BLACKLIST,
35 meta: {
36 title: 'Blacklisted videos'
37 }
38 }
39 }
40 ]
41 }
42]
diff --git a/client/src/app/+admin/moderation/video-abuse-list/index.ts b/client/src/app/+admin/moderation/video-abuse-list/index.ts
new file mode 100644
index 000000000..da7176e52
--- /dev/null
+++ b/client/src/app/+admin/moderation/video-abuse-list/index.ts
@@ -0,0 +1,2 @@
1export * from './video-abuse-list.component'
2export * from './moderation-comment-modal.component'
diff --git a/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html b/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html
new file mode 100644
index 000000000..3a8424f68
--- /dev/null
+++ b/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html
@@ -0,0 +1,32 @@
1<ng-template #modal>
2 <div class="modal-header">
3 <h4 i18n class="modal-title">Moderation comment</h4>
4 <span class="close" aria-hidden="true" (click)="hideModerationCommentModal()"></span>
5 </div>
6
7 <div class="modal-body">
8 <form novalidate [formGroup]="form" (ngSubmit)="banUser()">
9 <div class="form-group">
10 <textarea formControlName="moderationComment" [ngClass]="{ 'input-error': formErrors['moderationComment'] }">
11 </textarea>
12 <div *ngIf="formErrors.moderationComment" class="form-error">
13 {{ formErrors.moderationComment }}
14 </div>
15 </div>
16
17 <div i18n>
18 This comment can only be seen by you or the other moderators.
19 </div>
20
21 <div class="form-group inputs">
22 <span i18n class="action-button action-button-cancel" (click)="hideModerationCommentModal()">Cancel</span>
23
24 <input
25 type="submit" i18n-value value="Update this comment" class="action-button-submit"
26 [disabled]="!form.valid"
27 >
28 </div>
29 </form>
30 </div>
31
32</ng-template> \ No newline at end of file
diff --git a/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.scss b/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.scss
new file mode 100644
index 000000000..afcdb9a16
--- /dev/null
+++ b/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.scss
@@ -0,0 +1,6 @@
1@import 'variables';
2@import 'mixins';
3
4textarea {
5 @include peertube-textarea(100%, 100px);
6}
diff --git a/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts b/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts
new file mode 100644
index 000000000..34ab384d1
--- /dev/null
+++ b/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts
@@ -0,0 +1,73 @@
1import { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core'
2import { NotificationsService } from 'angular2-notifications'
3import { FormReactive, VideoAbuseService, VideoAbuseValidatorsService } from '../../../shared'
4import { I18n } from '@ngx-translate/i18n-polyfill'
5import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
6import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref'
7import { FormValidatorService } from '../../../shared/forms/form-validators/form-validator.service'
8import { VideoAbuse } from '../../../../../../shared/models/videos'
9
10@Component({
11 selector: 'my-moderation-comment-modal',
12 templateUrl: './moderation-comment-modal.component.html',
13 styleUrls: [ './moderation-comment-modal.component.scss' ]
14})
15export class ModerationCommentModalComponent extends FormReactive implements OnInit {
16 @ViewChild('modal') modal: NgbModal
17 @Output() commentUpdated = new EventEmitter<string>()
18
19 private abuseToComment: VideoAbuse
20 private openedModal: NgbModalRef
21
22 constructor (
23 protected formValidatorService: FormValidatorService,
24 private modalService: NgbModal,
25 private notificationsService: NotificationsService,
26 private videoAbuseService: VideoAbuseService,
27 private videoAbuseValidatorsService: VideoAbuseValidatorsService,
28 private i18n: I18n
29 ) {
30 super()
31 }
32
33 ngOnInit () {
34 this.buildForm({
35 moderationComment: this.videoAbuseValidatorsService.VIDEO_ABUSE_REASON
36 })
37 }
38
39 openModal (abuseToComment: VideoAbuse) {
40 this.abuseToComment = abuseToComment
41 this.openedModal = this.modalService.open(this.modal)
42
43 this.form.patchValue({
44 moderationComment: this.abuseToComment.moderationComment
45 })
46 }
47
48 hideModerationCommentModal () {
49 this.abuseToComment = undefined
50 this.openedModal.close()
51 this.form.reset()
52 }
53
54 async banUser () {
55 const moderationComment: string = this.form.value['moderationComment']
56
57 this.videoAbuseService.updateVideoAbuse(this.abuseToComment, { moderationComment })
58 .subscribe(
59 () => {
60 this.notificationsService.success(
61 this.i18n('Success'),
62 this.i18n('Comment updated.')
63 )
64
65 this.commentUpdated.emit(moderationComment)
66 this.hideModerationCommentModal()
67 },
68
69 err => this.notificationsService.error(this.i18n('Error'), err.message)
70 )
71 }
72
73}
diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html
new file mode 100644
index 000000000..722ff7906
--- /dev/null
+++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html
@@ -0,0 +1,62 @@
1<p-table
2 [value]="videoAbuses" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage"
3 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" dataKey="id"
4>
5 <ng-template pTemplate="header">
6 <tr>
7 <th style="width: 40px"></th>
8 <th i18n pSortableColumn="state" style="width: 80px;">State <p-sortIcon field="state"></p-sortIcon></th>
9 <th i18n>Reason</th>
10 <th i18n>Reporter</th>
11 <th i18n pSortableColumn="createdAt">Created <p-sortIcon field="createdAt"></p-sortIcon></th>
12 <th i18n>Video</th>
13 <th style="width: 50px;"></th>
14 </tr>
15 </ng-template>
16
17 <ng-template pTemplate="body" let-expanded="expanded" let-videoAbuse>
18 <tr>
19 <td>
20 <span *ngIf="videoAbuse.moderationComment" class="expander" [pRowToggler]="videoAbuse">
21 <i [ngClass]="expanded ? 'glyphicon glyphicon-menu-down' : 'glyphicon glyphicon-menu-right'"></i>
22 </span>
23 </td>
24
25 <td>
26 <span *ngIf="isVideoAbuseAccepted(videoAbuse)" [title]="videoAbuse.state.label" class="glyphicon glyphicon-ok"></span>
27 <span *ngIf="isVideoAbuseRejected(videoAbuse)" [title]="videoAbuse.state.label" class="glyphicon glyphicon-remove"></span>
28 </td>
29
30 <td>{{ videoAbuse.reason }}</td>
31
32 <td>
33 <a [href]="videoAbuse.reporterAccount.url" i18n-title title="Go to the account" target="_blank" rel="noopener noreferrer">
34 {{ createByString(videoAbuse.reporterAccount) }}
35 </a>
36 </td>
37
38 <td>{{ videoAbuse.createdAt }}</td>
39
40 <td>
41 <a [href]="getVideoUrl(videoAbuse)" i18n-title title="Go to the video" target="_blank" rel="noopener noreferrer">
42 {{ videoAbuse.video.name }}
43 </a>
44 </td>
45
46 <td class="action-cell">
47 <my-action-dropdown i18n-label label="Actions" [actions]="videoAbuseActions" [entry]="videoAbuse"></my-action-dropdown>
48 </td>
49 </tr>
50 </ng-template>
51
52 <ng-template pTemplate="rowexpansion" let-videoAbuse>
53 <tr class="moderation-comment">
54 <td colspan="7">
55 <span i18n class="moderation-comment-label">Moderation comment:</span>
56 {{ videoAbuse.moderationComment }}
57 </td>
58 </tr>
59 </ng-template>
60</p-table>
61
62<my-moderation-comment-modal #moderationCommentModal (commentUpdated)="onModerationCommentUpdated()"></my-moderation-comment-modal> \ No newline at end of file
diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.scss b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.scss
new file mode 100644
index 000000000..2391fef8f
--- /dev/null
+++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.scss
@@ -0,0 +1,6 @@
1@import 'variables';
2@import 'mixins';
3
4.moderation-comment-label {
5 font-weight: $font-semibold;
6} \ No newline at end of file
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
new file mode 100644
index 000000000..b17278b94
--- /dev/null
+++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts
@@ -0,0 +1,125 @@
1import { Component, OnInit, ViewChild } from '@angular/core'
2import { Account } from '../../../shared/account/account.model'
3import { NotificationsService } from 'angular2-notifications'
4import { SortMeta } from 'primeng/components/common/sortmeta'
5import { VideoAbuse, VideoAbuseState } from '../../../../../../shared'
6import { RestPagination, RestTable, VideoAbuseService } from '../../../shared'
7import { I18n } from '@ngx-translate/i18n-polyfill'
8import { DropdownAction } from '../../../shared/buttons/action-dropdown.component'
9import { ConfirmService } from '../../../core/index'
10import { ModerationCommentModalComponent } from './moderation-comment-modal.component'
11import { Video } from '../../../shared/video/video.model'
12
13@Component({
14 selector: 'my-video-abuse-list',
15 templateUrl: './video-abuse-list.component.html',
16 styleUrls: [ './video-abuse-list.component.scss']
17})
18export class VideoAbuseListComponent extends RestTable implements OnInit {
19 @ViewChild('moderationCommentModal') moderationCommentModal: ModerationCommentModalComponent
20
21 videoAbuses: VideoAbuse[] = []
22 totalRecords = 0
23 rowsPerPage = 10
24 sort: SortMeta = { field: 'createdAt', order: 1 }
25 pagination: RestPagination = { count: this.rowsPerPage, start: 0 }
26
27 videoAbuseActions: DropdownAction<VideoAbuse>[] = []
28
29 constructor (
30 private notificationsService: NotificationsService,
31 private videoAbuseService: VideoAbuseService,
32 private confirmService: ConfirmService,
33 private i18n: I18n
34 ) {
35 super()
36
37 this.videoAbuseActions = [
38 {
39 label: this.i18n('Delete'),
40 handler: videoAbuse => this.removeVideoAbuse(videoAbuse)
41 },
42 {
43 label: this.i18n('Update moderation comment'),
44 handler: videoAbuse => this.openModerationCommentModal(videoAbuse)
45 },
46 {
47 label: this.i18n('Mark as accepted'),
48 handler: videoAbuse => this.updateVideoAbuseState(videoAbuse, VideoAbuseState.ACCEPTED),
49 isDisplayed: videoAbuse => !this.isVideoAbuseAccepted(videoAbuse)
50 },
51 {
52 label: this.i18n('Mark as rejected'),
53 handler: videoAbuse => this.updateVideoAbuseState(videoAbuse, VideoAbuseState.REJECTED),
54 isDisplayed: videoAbuse => !this.isVideoAbuseRejected(videoAbuse)
55 }
56 ]
57 }
58
59 ngOnInit () {
60 this.loadSort()
61 }
62
63 openModerationCommentModal (videoAbuse: VideoAbuse) {
64 this.moderationCommentModal.openModal(videoAbuse)
65 }
66
67 onModerationCommentUpdated () {
68 this.loadData()
69 }
70
71 createByString (account: Account) {
72 return Account.CREATE_BY_STRING(account.name, account.host)
73 }
74
75 isVideoAbuseAccepted (videoAbuse: VideoAbuse) {
76 return videoAbuse.state.id === VideoAbuseState.ACCEPTED
77 }
78
79 isVideoAbuseRejected (videoAbuse: VideoAbuse) {
80 return videoAbuse.state.id === VideoAbuseState.REJECTED
81 }
82
83 getVideoUrl (videoAbuse: VideoAbuse) {
84 return Video.buildClientUrl(videoAbuse.video.uuid)
85 }
86
87 async removeVideoAbuse (videoAbuse: VideoAbuse) {
88 const res = await this.confirmService.confirm(this.i18n('Do you really want to delete this abuse?'), this.i18n('Delete'))
89 if (res === false) return
90
91 this.videoAbuseService.removeVideoAbuse(videoAbuse).subscribe(
92 () => {
93 this.notificationsService.success(
94 this.i18n('Success'),
95 this.i18n('Abuse deleted.')
96 )
97 this.loadData()
98 },
99
100 err => this.notificationsService.error(this.i18n('Error'), err.message)
101 )
102 }
103
104 updateVideoAbuseState (videoAbuse: VideoAbuse, state: VideoAbuseState) {
105 this.videoAbuseService.updateVideoAbuse(videoAbuse, { state })
106 .subscribe(
107 () => this.loadData(),
108
109 err => this.notificationsService.error(this.i18n('Error'), err.message)
110 )
111
112 }
113
114 protected loadData () {
115 return this.videoAbuseService.getVideoAbuses(this.pagination, this.sort)
116 .subscribe(
117 resultList => {
118 this.videoAbuses = resultList.data
119 this.totalRecords = resultList.total
120 },
121
122 err => this.notificationsService.error(this.i18n('Error'), err.message)
123 )
124 }
125}
diff --git a/client/src/app/+admin/moderation/video-blacklist-list/index.ts b/client/src/app/+admin/moderation/video-blacklist-list/index.ts
new file mode 100644
index 000000000..4daf64187
--- /dev/null
+++ b/client/src/app/+admin/moderation/video-blacklist-list/index.ts
@@ -0,0 +1 @@
export * from './video-blacklist-list.component'
diff --git a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html
new file mode 100644
index 000000000..dafaeb1e2
--- /dev/null
+++ b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html
@@ -0,0 +1,47 @@
1<p-table
2 [value]="blacklist" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage"
3 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" dataKey="id"
4>
5 <ng-template pTemplate="header">
6 <tr>
7 <th style="width: 40px"></th>
8 <th i18n pSortableColumn="name">Video name <p-sortIcon field="name"></p-sortIcon></th>
9 <th i18n>Sensitive</th>
10 <th i18n pSortableColumn="createdAt">Date <p-sortIcon field="createdAt"></p-sortIcon></th>
11 <th style="width: 50px;"></th>
12 </tr>
13 </ng-template>
14
15 <ng-template pTemplate="body" let-videoBlacklist let-expanded="expanded">
16 <tr>
17 <td>
18 <span *ngIf="videoBlacklist.reason" class="expander" [pRowToggler]="videoBlacklist">
19 <i [ngClass]="expanded ? 'glyphicon glyphicon-menu-down' : 'glyphicon glyphicon-menu-right'"></i>
20 </span>
21 </td>
22
23 <td>
24 <a [href]="getVideoUrl(videoBlacklist)" i18n-title title="Go to the video" target="_blank" rel="noopener noreferrer">
25 {{ videoBlacklist.video.name }}
26 </a>
27 </td>
28
29 <td>{{ videoBlacklist.video.nsfw }}</td>
30 <td>{{ videoBlacklist.createdAt }}</td>
31
32 <td class="action-cell">
33 <my-action-dropdown i18n-label label="Actions" [actions]="videoBlacklistActions" [entry]="videoBlacklist"></my-action-dropdown>
34 </td>
35 </tr>
36 </ng-template>
37
38 <ng-template pTemplate="rowexpansion" let-videoBlacklist>
39 <tr class="blacklist-reason">
40 <td colspan="7">
41 <span i18n class="blacklist-reason-label">Blacklist reason:</span>
42 {{ videoBlacklist.reason }}
43 </td>
44 </tr>
45 </ng-template>
46</p-table>
47
diff --git a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.scss b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.scss
new file mode 100644
index 000000000..063f6324e
--- /dev/null
+++ b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.scss
@@ -0,0 +1,6 @@
1@import 'variables';
2@import 'mixins';
3
4.blacklist-reason-label {
5 font-weight: $font-semibold;
6} \ No newline at end of file
diff --git a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts
new file mode 100644
index 000000000..9890d1f90
--- /dev/null
+++ b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts
@@ -0,0 +1,81 @@
1import { Component, OnInit } from '@angular/core'
2import { SortMeta } from 'primeng/components/common/sortmeta'
3import { NotificationsService } from 'angular2-notifications'
4import { ConfirmService } from '../../../core'
5import { RestPagination, RestTable, VideoBlacklistService } from '../../../shared'
6import { VideoBlacklist } from '../../../../../../shared'
7import { I18n } from '@ngx-translate/i18n-polyfill'
8import { DropdownAction } from '../../../shared/buttons/action-dropdown.component'
9import { Video } from '../../../shared/video/video.model'
10
11@Component({
12 selector: 'my-video-blacklist-list',
13 templateUrl: './video-blacklist-list.component.html',
14 styleUrls: [ './video-blacklist-list.component.scss' ]
15})
16export class VideoBlacklistListComponent extends RestTable implements OnInit {
17 blacklist: VideoBlacklist[] = []
18 totalRecords = 0
19 rowsPerPage = 10
20 sort: SortMeta = { field: 'createdAt', order: 1 }
21 pagination: RestPagination = { count: this.rowsPerPage, start: 0 }
22
23 videoBlacklistActions: DropdownAction<VideoBlacklist>[] = []
24
25 constructor (
26 private notificationsService: NotificationsService,
27 private confirmService: ConfirmService,
28 private videoBlacklistService: VideoBlacklistService,
29 private i18n: I18n
30 ) {
31 super()
32
33 this.videoBlacklistActions = [
34 {
35 label: this.i18n('Unblacklist'),
36 handler: videoBlacklist => this.removeVideoFromBlacklist(videoBlacklist)
37 }
38 ]
39 }
40
41 ngOnInit () {
42 this.loadSort()
43 }
44
45 getVideoUrl (videoBlacklist: VideoBlacklist) {
46 return Video.buildClientUrl(videoBlacklist.video.uuid)
47 }
48
49 async removeVideoFromBlacklist (entry: VideoBlacklist) {
50 const confirmMessage = this.i18n(
51 'Do you really want to remove this video from the blacklist? It will be available again in the videos list.'
52 )
53
54 const res = await this.confirmService.confirm(confirmMessage, this.i18n('Unblacklist'))
55 if (res === false) return
56
57 this.videoBlacklistService.removeVideoFromBlacklist(entry.video.id).subscribe(
58 () => {
59 this.notificationsService.success(
60 this.i18n('Success'),
61 this.i18n('Video {{name}} removed from the blacklist.', { name: entry.video.name })
62 )
63 this.loadData()
64 },
65
66 err => this.notificationsService.error(this.i18n('Error'), err.message)
67 )
68 }
69
70 protected loadData () {
71 this.videoBlacklistService.listBlacklist(this.pagination, this.sort)
72 .subscribe(
73 resultList => {
74 this.blacklist = resultList.data
75 this.totalRecords = resultList.total
76 },
77
78 err => this.notificationsService.error(this.i18n('Error'), err.message)
79 )
80 }
81}