aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/app/+admin/video-abuses/video-abuse-list
diff options
context:
space:
mode:
Diffstat (limited to 'client/src/app/+admin/video-abuses/video-abuse-list')
-rw-r--r--client/src/app/+admin/video-abuses/video-abuse-list/index.ts2
-rw-r--r--client/src/app/+admin/video-abuses/video-abuse-list/moderation-comment-modal.component.html32
-rw-r--r--client/src/app/+admin/video-abuses/video-abuse-list/moderation-comment-modal.component.scss6
-rw-r--r--client/src/app/+admin/video-abuses/video-abuse-list/moderation-comment-modal.component.ts73
-rw-r--r--client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.html66
-rw-r--r--client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.scss6
-rw-r--r--client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.ts125
7 files changed, 0 insertions, 310 deletions
diff --git a/client/src/app/+admin/video-abuses/video-abuse-list/index.ts b/client/src/app/+admin/video-abuses/video-abuse-list/index.ts
deleted file mode 100644
index da7176e52..000000000
--- a/client/src/app/+admin/video-abuses/video-abuse-list/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
1export * from './video-abuse-list.component'
2export * from './moderation-comment-modal.component'
diff --git a/client/src/app/+admin/video-abuses/video-abuse-list/moderation-comment-modal.component.html b/client/src/app/+admin/video-abuses/video-abuse-list/moderation-comment-modal.component.html
deleted file mode 100644
index 3a8424f68..000000000
--- a/client/src/app/+admin/video-abuses/video-abuse-list/moderation-comment-modal.component.html
+++ /dev/null
@@ -1,32 +0,0 @@
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/video-abuses/video-abuse-list/moderation-comment-modal.component.scss b/client/src/app/+admin/video-abuses/video-abuse-list/moderation-comment-modal.component.scss
deleted file mode 100644
index afcdb9a16..000000000
--- a/client/src/app/+admin/video-abuses/video-abuse-list/moderation-comment-modal.component.scss
+++ /dev/null
@@ -1,6 +0,0 @@
1@import 'variables';
2@import 'mixins';
3
4textarea {
5 @include peertube-textarea(100%, 100px);
6}
diff --git a/client/src/app/+admin/video-abuses/video-abuse-list/moderation-comment-modal.component.ts b/client/src/app/+admin/video-abuses/video-abuse-list/moderation-comment-modal.component.ts
deleted file mode 100644
index 7e8af6e5a..000000000
--- a/client/src/app/+admin/video-abuses/video-abuse-list/moderation-comment-modal.component.ts
+++ /dev/null
@@ -1,73 +0,0 @@
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 '@app/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/video-abuses/video-abuse-list/video-abuse-list.component.html b/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.html
deleted file mode 100644
index f213ab4b0..000000000
--- a/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.html
+++ /dev/null
@@ -1,66 +0,0 @@
1<div class="admin-sub-header">
2 <div i18n class="form-sub-title">Video abuses list</div>
3</div>
4
5<p-table
6 [value]="videoAbuses" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage"
7 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" dataKey="id"
8>
9 <ng-template pTemplate="header">
10 <tr>
11 <th style="width: 40px"></th>
12 <th i18n pSortableColumn="state" style="width: 80px;">State <p-sortIcon field="state"></p-sortIcon></th>
13 <th i18n>Reason</th>
14 <th i18n>Reporter</th>
15 <th i18n pSortableColumn="createdAt">Created <p-sortIcon field="createdAt"></p-sortIcon></th>
16 <th i18n>Video</th>
17 <th style="width: 50px;"></th>
18 </tr>
19 </ng-template>
20
21 <ng-template pTemplate="body" let-expanded="expanded" let-videoAbuse>
22 <tr>
23 <td>
24 <span *ngIf="videoAbuse.moderationComment" class="expander" [pRowToggler]="videoAbuse">
25 <i [ngClass]="expanded ? 'glyphicon glyphicon-menu-down' : 'glyphicon glyphicon-menu-right'"></i>
26 </span>
27 </td>
28
29 <td>
30 <span *ngIf="isVideoAbuseAccepted(videoAbuse)" [title]="videoAbuse.state.label" class="glyphicon glyphicon-ok"></span>
31 <span *ngIf="isVideoAbuseRejected(videoAbuse)" [title]="videoAbuse.state.label" class="glyphicon glyphicon-remove"></span>
32 </td>
33
34 <td>{{ videoAbuse.reason }}</td>
35
36 <td>
37 <a [href]="videoAbuse.reporterAccount.url" i18n-title title="Go to the account" target="_blank" rel="noopener noreferrer">
38 {{ createByString(videoAbuse.reporterAccount) }}
39 </a>
40 </td>
41
42 <td>{{ videoAbuse.createdAt }}</td>
43
44 <td>
45 <a [href]="getVideoUrl(videoAbuse)" i18n-title title="Go to the video" target="_blank" rel="noopener noreferrer">
46 {{ videoAbuse.video.name }}
47 </a>
48 </td>
49
50 <td class="action-cell">
51 <my-action-dropdown i18n-label label="Actions" [actions]="videoAbuseActions" [entry]="videoAbuse"></my-action-dropdown>
52 </td>
53 </tr>
54 </ng-template>
55
56 <ng-template pTemplate="rowexpansion" let-videoAbuse>
57 <tr class="moderation-comment">
58 <td colspan="7">
59 <span i18n class="moderation-comment-label">Moderation comment:</span>
60 {{ videoAbuse.moderationComment }}
61 </td>
62 </tr>
63 </ng-template>
64</p-table>
65
66<my-moderation-comment-modal #moderationCommentModal (commentUpdated)="onModerationCommentUpdated()"></my-moderation-comment-modal> \ No newline at end of file
diff --git a/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.scss b/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.scss
deleted file mode 100644
index 951a3fc92..000000000
--- a/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.scss
+++ /dev/null
@@ -1,6 +0,0 @@
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/video-abuses/video-abuse-list/video-abuse-list.component.ts b/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.ts
deleted file mode 100644
index 377e9c80f..000000000
--- a/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.ts
+++ /dev/null
@@ -1,125 +0,0 @@
1import { Component, OnInit, ViewChild } from '@angular/core'
2import { Account } from '@app/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 '@app/shared/buttons/action-dropdown.component'
9import { ConfirmService } from '@app/core'
10import { ModerationCommentModalComponent } from './moderation-comment-modal.component'
11import { Video } from '@app/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}