diff options
Diffstat (limited to 'client/src/app')
21 files changed, 96 insertions, 60 deletions
diff --git a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html index 4ce4c18fc..b925d3d02 100644 --- a/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html +++ b/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html | |||
@@ -108,6 +108,7 @@ | |||
108 | 108 | ||
109 | <div class="peertube-select-container"> | 109 | <div class="peertube-select-container"> |
110 | <select id="instanceDefaultNSFWPolicy" formControlName="defaultNSFWPolicy" class="form-control"> | 110 | <select id="instanceDefaultNSFWPolicy" formControlName="defaultNSFWPolicy" class="form-control"> |
111 | <option i18n value="undefined" disabled>Policy for sensitive videos</option> | ||
111 | <option i18n value="do_not_list">Do not list</option> | 112 | <option i18n value="do_not_list">Do not list</option> |
112 | <option i18n value="blur">Blur thumbnails</option> | 113 | <option i18n value="blur">Blur thumbnails</option> |
113 | <option i18n value="display">Display</option> | 114 | <option i18n value="display">Display</option> |
@@ -319,7 +320,7 @@ | |||
319 | <label i18n for="userVideoQuota">Default video quota per user</label> | 320 | <label i18n for="userVideoQuota">Default video quota per user</label> |
320 | <div class="peertube-select-container"> | 321 | <div class="peertube-select-container"> |
321 | <select id="userVideoQuota" formControlName="videoQuota" class="form-control"> | 322 | <select id="userVideoQuota" formControlName="videoQuota" class="form-control"> |
322 | <option *ngFor="let videoQuotaOption of videoQuotaOptions" [value]="videoQuotaOption.value"> | 323 | <option *ngFor="let videoQuotaOption of videoQuotaOptions" [value]="videoQuotaOption.value" [disabled]="videoQuotaOption.disabled"> |
323 | {{ videoQuotaOption.label }} | 324 | {{ videoQuotaOption.label }} |
324 | </option> | 325 | </option> |
325 | </select> | 326 | </select> |
@@ -331,7 +332,7 @@ | |||
331 | <label i18n for="userVideoQuotaDaily">Default daily upload limit per user</label> | 332 | <label i18n for="userVideoQuotaDaily">Default daily upload limit per user</label> |
332 | <div class="peertube-select-container"> | 333 | <div class="peertube-select-container"> |
333 | <select id="userVideoQuotaDaily" formControlName="videoQuotaDaily" class="form-control"> | 334 | <select id="userVideoQuotaDaily" formControlName="videoQuotaDaily" class="form-control"> |
334 | <option *ngFor="let videoQuotaDailyOption of videoQuotaDailyOptions" [value]="videoQuotaDailyOption.value"> | 335 | <option *ngFor="let videoQuotaDailyOption of videoQuotaDailyOptions" [value]="videoQuotaDailyOption.value" [disabled]="videoQuotaDailyOption.disabled"> |
335 | {{ videoQuotaDailyOption.label }} | 336 | {{ videoQuotaDailyOption.label }} |
336 | </option> | 337 | </option> |
337 | </select> | 338 | </select> |
@@ -441,10 +442,14 @@ | |||
441 | <div class="form-group"> | 442 | <div class="form-group"> |
442 | <my-peertube-checkbox | 443 | <my-peertube-checkbox |
443 | inputName="followingsInstanceAutoFollowIndexEnabled" formControlName="enabled" | 444 | inputName="followingsInstanceAutoFollowIndexEnabled" formControlName="enabled" |
444 | i18n-labelText labelText="Automatically follow instances of the public index" | 445 | i18n-labelText labelText="Automatically follow instances of a public index" |
445 | > | 446 | > |
446 | <ng-container ngProjectAs="description"> | 447 | <ng-container ngProjectAs="description"> |
447 | <span i18n>⚠️ This functionality requires a lot of attention and extra moderation.</span> | 448 | <p i18n>⚠️ This functionality requires a lot of attention and extra moderation.</p> |
449 | |||
450 | <span i18n> | ||
451 | You should only follow indexes you trust, or <a href="https://framagit.org/framasoft/peertube/instances-peertube#peertube-auto-follow">host your own</a>. | ||
452 | </span> | ||
448 | </ng-container> | 453 | </ng-container> |
449 | 454 | ||
450 | <ng-container ngProjectAs="extra"> | 455 | <ng-container ngProjectAs="extra"> |
@@ -651,20 +656,16 @@ | |||
651 | </my-peertube-checkbox> | 656 | </my-peertube-checkbox> |
652 | </div> | 657 | </div> |
653 | 658 | ||
654 | <div class="form-group"> | 659 | <div class="form-group" [ngClass]="{ 'disabled-checkbox-extra': !isTranscodingEnabled() }"> |
655 | 660 | <label i18n for="transcodingThreads">Transcoding threads</label> | |
656 | <div class="form-group" [ngClass]="{ 'disabled-checkbox-extra': !isTranscodingEnabled() }"> | 661 | <div class="peertube-select-container"> |
657 | <label i18n for="transcodingThreads">Transcoding threads</label> | 662 | <select id="transcodingThreads" formControlName="threads" class="form-control"> |
658 | <div class="peertube-select-container"> | 663 | <option *ngFor="let transcodingThreadOption of transcodingThreadOptions" [value]="transcodingThreadOption.value"> |
659 | <select id="transcodingThreads" formControlName="threads" class="form-control"> | 664 | {{ transcodingThreadOption.label }} |
660 | <option *ngFor="let transcodingThreadOption of transcodingThreadOptions" [value]="transcodingThreadOption.value"> | 665 | </option> |
661 | {{ transcodingThreadOption.label }} | 666 | </select> |
662 | </option> | ||
663 | </select> | ||
664 | </div> | ||
665 | <div *ngIf="formErrors.transcoding.threads" class="form-error">{{ formErrors.transcoding.threads }}</div> | ||
666 | </div> | 667 | </div> |
667 | 668 | <div *ngIf="formErrors.transcoding.threads" class="form-error">{{ formErrors.transcoding.threads }}</div> | |
668 | </div> | 669 | </div> |
669 | 670 | ||
670 | <div class="form-group" [ngClass]="{ 'disabled-checkbox-extra': !isTranscodingEnabled() }"> | 671 | <div class="form-group" [ngClass]="{ 'disabled-checkbox-extra': !isTranscodingEnabled() }"> |
diff --git a/client/src/app/+admin/config/shared/config.service.ts b/client/src/app/+admin/config/shared/config.service.ts index 28a3d67d6..874b8094d 100644 --- a/client/src/app/+admin/config/shared/config.service.ts +++ b/client/src/app/+admin/config/shared/config.service.ts | |||
@@ -10,8 +10,8 @@ import { I18n } from '@ngx-translate/i18n-polyfill' | |||
10 | export class ConfigService { | 10 | export class ConfigService { |
11 | private static BASE_APPLICATION_URL = environment.apiUrl + '/api/v1/config' | 11 | private static BASE_APPLICATION_URL = environment.apiUrl + '/api/v1/config' |
12 | 12 | ||
13 | videoQuotaOptions: { value: number, label: string }[] = [] | 13 | videoQuotaOptions: { value: number, label: string, disabled?: boolean }[] = [] |
14 | videoQuotaDailyOptions: { value: number, label: string }[] = [] | 14 | videoQuotaDailyOptions: { value: number, label: string, disabled?: boolean }[] = [] |
15 | 15 | ||
16 | constructor ( | 16 | constructor ( |
17 | private authHttp: HttpClient, | 17 | private authHttp: HttpClient, |
@@ -19,8 +19,10 @@ export class ConfigService { | |||
19 | private i18n: I18n | 19 | private i18n: I18n |
20 | ) { | 20 | ) { |
21 | this.videoQuotaOptions = [ | 21 | this.videoQuotaOptions = [ |
22 | { value: undefined, label: 'Default quota', disabled: true }, | ||
22 | { value: -1, label: this.i18n('Unlimited') }, | 23 | { value: -1, label: this.i18n('Unlimited') }, |
23 | { value: 0, label: '0' }, | 24 | { value: undefined, label: '─────', disabled: true }, |
25 | { value: 0, label: this.i18n('None - no upload possible') }, | ||
24 | { value: 100 * 1024 * 1024, label: this.i18n('100MB') }, | 26 | { value: 100 * 1024 * 1024, label: this.i18n('100MB') }, |
25 | { value: 500 * 1024 * 1024, label: this.i18n('500MB') }, | 27 | { value: 500 * 1024 * 1024, label: this.i18n('500MB') }, |
26 | { value: 1024 * 1024 * 1024, label: this.i18n('1GB') }, | 28 | { value: 1024 * 1024 * 1024, label: this.i18n('1GB') }, |
@@ -30,8 +32,10 @@ export class ConfigService { | |||
30 | ] | 32 | ] |
31 | 33 | ||
32 | this.videoQuotaDailyOptions = [ | 34 | this.videoQuotaDailyOptions = [ |
35 | { value: undefined, label: 'Default daily upload limit', disabled: true }, | ||
33 | { value: -1, label: this.i18n('Unlimited') }, | 36 | { value: -1, label: this.i18n('Unlimited') }, |
34 | { value: 0, label: '0' }, | 37 | { value: undefined, label: '─────', disabled: true }, |
38 | { value: 0, label: this.i18n('None - no upload possible') }, | ||
35 | { value: 10 * 1024 * 1024, label: this.i18n('10MB') }, | 39 | { value: 10 * 1024 * 1024, label: this.i18n('10MB') }, |
36 | { value: 50 * 1024 * 1024, label: this.i18n('50MB') }, | 40 | { value: 50 * 1024 * 1024, label: this.i18n('50MB') }, |
37 | { value: 100 * 1024 * 1024, label: this.i18n('100MB') }, | 41 | { value: 100 * 1024 * 1024, label: this.i18n('100MB') }, |
diff --git a/client/src/app/+admin/follows/video-redundancies-list/video-redundancies-list.component.html b/client/src/app/+admin/follows/video-redundancies-list/video-redundancies-list.component.html index 18d88c20c..07362b3b9 100644 --- a/client/src/app/+admin/follows/video-redundancies-list/video-redundancies-list.component.html +++ b/client/src/app/+admin/follows/video-redundancies-list/video-redundancies-list.component.html | |||
@@ -3,9 +3,9 @@ | |||
3 | <label for="displayType" i18n>Display</label> | 3 | <label for="displayType" i18n>Display</label> |
4 | 4 | ||
5 | <div class="peertube-select-container"> | 5 | <div class="peertube-select-container"> |
6 | <select id="displayType" name="displayType" [(ngModel)]="displayType" (ngModelChange)="onDisplayTypeChanged()"> | 6 | <select id="displayType" name="displayType" [(ngModel)]="displayType" (ngModelChange)="onDisplayTypeChanged()" class="form-control"> |
7 | <option value="my-videos">My videos duplicated by remote instances</option> | 7 | <option value="my-videos" i18n>My videos duplicated by remote instances</option> |
8 | <option value="remote-videos">Remote videos duplicated by my instance</option> | 8 | <option value="remote-videos" i18n>Remote videos duplicated by my instance</option> |
9 | </select> | 9 | </select> |
10 | </div> | 10 | </div> |
11 | </div> | 11 | </div> |
@@ -22,14 +22,14 @@ | |||
22 | <th i18n pSortableColumn="name">Video name <p-sortIcon field="name"></p-sortIcon></th> | 22 | <th i18n pSortableColumn="name">Video name <p-sortIcon field="name"></p-sortIcon></th> |
23 | <th i18n>Video URL</th> | 23 | <th i18n>Video URL</th> |
24 | <th i18n *ngIf="isDisplayingRemoteVideos()">Total size</th> | 24 | <th i18n *ngIf="isDisplayingRemoteVideos()">Total size</th> |
25 | <th></th> | 25 | <th style="width: 80px;"></th> |
26 | </tr> | 26 | </tr> |
27 | </ng-template> | 27 | </ng-template> |
28 | 28 | ||
29 | <ng-template pTemplate="body" let-expanded="expanded" let-redundancy> | 29 | <ng-template pTemplate="body" let-expanded="expanded" let-redundancy> |
30 | <tr> | 30 | <tr> |
31 | 31 | ||
32 | <td class="expand-cell"> | 32 | <td> |
33 | <span class="expander" i18n-ngbTooltip ngbTooltip="List redundancies" [pRowToggler]="redundancy"> | 33 | <span class="expander" i18n-ngbTooltip ngbTooltip="List redundancies" [pRowToggler]="redundancy"> |
34 | <i [ngClass]="expanded ? 'glyphicon glyphicon-menu-down' : 'glyphicon glyphicon-menu-right'"></i> | 34 | <i [ngClass]="expanded ? 'glyphicon glyphicon-menu-down' : 'glyphicon glyphicon-menu-right'"></i> |
35 | </span> | 35 | </span> |
@@ -53,7 +53,7 @@ | |||
53 | 53 | ||
54 | <ng-template pTemplate="rowexpansion" let-redundancy> | 54 | <ng-template pTemplate="rowexpansion" let-redundancy> |
55 | <tr *ngIf="redundancy.redundancies.files.length !== 0"> | 55 | <tr *ngIf="redundancy.redundancies.files.length !== 0"> |
56 | <td [attr.colspan]="getColspan()"> | 56 | <td class="expand-cell" [attr.colspan]="getColspan()"> |
57 | <div *ngFor="let file of redundancy.redundancies.files" class="expansion-block"> | 57 | <div *ngFor="let file of redundancy.redundancies.files" class="expansion-block"> |
58 | <my-video-redundancy-information [redundancyElement]="file"></my-video-redundancy-information> | 58 | <my-video-redundancy-information [redundancyElement]="file"></my-video-redundancy-information> |
59 | </div> | 59 | </div> |
@@ -61,7 +61,7 @@ | |||
61 | </tr> | 61 | </tr> |
62 | 62 | ||
63 | <tr *ngIf="redundancy.redundancies.streamingPlaylists.length !== 0"> | 63 | <tr *ngIf="redundancy.redundancies.streamingPlaylists.length !== 0"> |
64 | <td [attr.colspan]="getColspan()"> | 64 | <td class="expand-cell" [attr.colspan]="getColspan()"> |
65 | <div *ngFor="let playlist of redundancy.redundancies.streamingPlaylists"> | 65 | <div *ngFor="let playlist of redundancy.redundancies.streamingPlaylists"> |
66 | <my-video-redundancy-information [redundancyElement]="playlist"></my-video-redundancy-information> | 66 | <my-video-redundancy-information [redundancyElement]="playlist"></my-video-redundancy-information> |
67 | </div> | 67 | </div> |
diff --git a/client/src/app/+admin/follows/video-redundancies-list/video-redundancies-list.component.ts b/client/src/app/+admin/follows/video-redundancies-list/video-redundancies-list.component.ts index d563b4e95..2b62d30a3 100644 --- a/client/src/app/+admin/follows/video-redundancies-list/video-redundancies-list.component.ts +++ b/client/src/app/+admin/follows/video-redundancies-list/video-redundancies-list.component.ts | |||
@@ -66,9 +66,9 @@ export class VideoRedundanciesListComponent extends RestTable implements OnInit | |||
66 | } | 66 | } |
67 | 67 | ||
68 | getColspan () { | 68 | getColspan () { |
69 | if (this.isDisplayingRemoteVideos()) return 3 | 69 | if (this.isDisplayingRemoteVideos()) return 5 |
70 | 70 | ||
71 | return 2 | 71 | return 4 |
72 | } | 72 | } |
73 | 73 | ||
74 | isDisplayingRemoteVideos () { | 74 | isDisplayingRemoteVideos () { |
diff --git a/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html b/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html index 7797bc56e..8c3930643 100644 --- a/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html +++ b/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html | |||
@@ -1,12 +1,15 @@ | |||
1 | <p-table | 1 | <p-table |
2 | [value]="blockedAccounts" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" | 2 | [value]="blockedAccounts" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" |
3 | [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" | 3 | [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" |
4 | [showCurrentPageReport]="true" i18n-currentPageReportTemplate | ||
5 | currentPageReportTemplate="Showing {first} to {last} of {totalRecords} muted accounts" | ||
4 | > | 6 | > |
5 | 7 | ||
6 | <ng-template pTemplate="header"> | 8 | <ng-template pTemplate="header"> |
7 | <tr> | 9 | <tr> |
8 | <th i18n>Account</th> | 10 | <th i18n>Account</th> |
9 | <th i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th> | 11 | <th i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th> |
12 | <th></th> <!-- column for action buttons --> | ||
10 | </tr> | 13 | </tr> |
11 | </ng-template> | 14 | </ng-template> |
12 | 15 | ||
diff --git a/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html b/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html index f634ba834..44c5c2fb8 100644 --- a/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html +++ b/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html | |||
@@ -1,13 +1,15 @@ | |||
1 | <p-table | 1 | <p-table |
2 | [value]="blockedServers" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" | 2 | [value]="blockedServers" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" |
3 | [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" | 3 | [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" |
4 | [showCurrentPageReport]="true" i18n-currentPageReportTemplate | ||
5 | currentPageReportTemplate="Showing {first} to {last} of {totalRecords} muted instances" | ||
4 | > | 6 | > |
5 | 7 | ||
6 | <ng-template pTemplate="header"> | 8 | <ng-template pTemplate="header"> |
7 | <tr> | 9 | <tr> |
8 | <th i18n>Instance</th> | 10 | <th i18n>Instance</th> |
9 | <th i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th> | 11 | <th i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th> |
10 | <th></th> | 12 | <th></th> <!-- column for action buttons --> |
11 | </tr> | 13 | </tr> |
12 | </ng-template> | 14 | </ng-template> |
13 | 15 | ||
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 index 8fbd33871..8082e93f4 100644 --- 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 | |||
@@ -8,7 +8,9 @@ | |||
8 | <div class="modal-body"> | 8 | <div class="modal-body"> |
9 | <form novalidate [formGroup]="form" (ngSubmit)="banUser()"> | 9 | <form novalidate [formGroup]="form" (ngSubmit)="banUser()"> |
10 | <div class="form-group"> | 10 | <div class="form-group"> |
11 | <textarea formControlName="moderationComment" [ngClass]="{ 'input-error': formErrors['moderationComment'] }"> | 11 | <textarea |
12 | formControlName="moderationComment" ngbAutofocus i18-placeholder placeholder="Comment this report…" | ||
13 | [ngClass]="{ 'input-error': formErrors['moderationComment'] }" class="form-control"> | ||
12 | </textarea> | 14 | </textarea> |
13 | <div *ngIf="formErrors.moderationComment" class="form-error"> | 15 | <div *ngIf="formErrors.moderationComment" class="form-error"> |
14 | {{ formErrors.moderationComment }} | 16 | {{ formErrors.moderationComment }} |
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 index 29f90194b..a0471f2b0 100644 --- 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 | |||
@@ -32,7 +32,7 @@ export class ModerationCommentModalComponent extends FormReactive implements OnI | |||
32 | 32 | ||
33 | ngOnInit () { | 33 | ngOnInit () { |
34 | this.buildForm({ | 34 | this.buildForm({ |
35 | moderationComment: this.videoAbuseValidatorsService.VIDEO_ABUSE_REASON | 35 | moderationComment: this.videoAbuseValidatorsService.VIDEO_ABUSE_MODERATION_COMMENT |
36 | }) | 36 | }) |
37 | } | 37 | } |
38 | 38 | ||
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 index b25412c99..cf7b61d2a 100644 --- 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 | |||
@@ -1,12 +1,14 @@ | |||
1 | <p-table | 1 | <p-table |
2 | [value]="videoAbuses" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" | 2 | [value]="videoAbuses" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" |
3 | [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" dataKey="id" | 3 | [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" dataKey="id" |
4 | [showCurrentPageReport]="true" i18n-currentPageReportTemplate | ||
5 | currentPageReportTemplate="Showing {first} to {last} of {totalRecords} reports" | ||
4 | > | 6 | > |
5 | <ng-template pTemplate="header"> | 7 | <ng-template pTemplate="header"> |
6 | <tr> | 8 | <tr> <!-- header --> |
7 | <th style="width: 40px"></th> | 9 | <th style="width: 40px;"></th> |
8 | <th i18n>Reporter</th> | 10 | <th i18n>Reporter</th> |
9 | <th i18n pSortableColumn="createdAt">Created <p-sortIcon field="createdAt"></p-sortIcon></th> | 11 | <th style="width: 200px;" i18n pSortableColumn="createdAt">Created <p-sortIcon field="createdAt"></p-sortIcon></th> |
10 | <th i18n>Video</th> | 12 | <th i18n>Video</th> |
11 | <th i18n pSortableColumn="state" style="width: 80px;">State <p-sortIcon field="state"></p-sortIcon></th> | 13 | <th i18n pSortableColumn="state" style="width: 80px;">State <p-sortIcon field="state"></p-sortIcon></th> |
12 | <th style="width: 120px;"></th> | 14 | <th style="width: 120px;"></th> |
@@ -15,9 +17,8 @@ | |||
15 | 17 | ||
16 | <ng-template pTemplate="body" let-expanded="expanded" let-videoAbuse> | 18 | <ng-template pTemplate="body" let-expanded="expanded" let-videoAbuse> |
17 | <tr> | 19 | <tr> |
18 | 20 | <td class="c-hand" [pRowToggler]="videoAbuse" i18n-ngbTooltip ngbTooltip="More information" placement="top-left" container="body"> | |
19 | <td class="expand-cell"> | 21 | <span class="expander"> |
20 | <span class="expander" i18n-ngbTooltip ngbTooltip="More information" [pRowToggler]="videoAbuse"> | ||
21 | <i [ngClass]="expanded ? 'glyphicon glyphicon-menu-down' : 'glyphicon glyphicon-menu-right'"></i> | 22 | <i [ngClass]="expanded ? 'glyphicon glyphicon-menu-down' : 'glyphicon glyphicon-menu-right'"></i> |
22 | </span> | 23 | </span> |
23 | </td> | 24 | </td> |
@@ -31,7 +32,7 @@ | |||
31 | <td>{{ videoAbuse.createdAt }}</td> | 32 | <td>{{ videoAbuse.createdAt }}</td> |
32 | 33 | ||
33 | <td> | 34 | <td> |
34 | <a [href]="getVideoUrl(videoAbuse)" i18n-title title="Go to the video" target="_blank" rel="noopener noreferrer"> | 35 | <a [href]="getVideoUrl(videoAbuse)" i18n-title title="Open video in a new tab" target="_blank" rel="noopener noreferrer"> |
35 | {{ videoAbuse.video.name }} | 36 | {{ videoAbuse.video.name }} |
36 | </a> | 37 | </a> |
37 | </td> | 38 | </td> |
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 index 4f9a6c18c..a39e7639e 100644 --- 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 | |||
@@ -1,23 +1,25 @@ | |||
1 | <p-table | 1 | <p-table |
2 | [value]="blacklist" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" | 2 | [value]="blacklist" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" |
3 | [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" dataKey="id" | 3 | [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" dataKey="id" |
4 | [showCurrentPageReport]="true" i18n-currentPageReportTemplate | ||
5 | currentPageReportTemplate="Showing {first} to {last} of {totalRecords} blacklisted videos" | ||
4 | > | 6 | > |
5 | <ng-template pTemplate="header"> | 7 | <ng-template pTemplate="header"> |
6 | <tr> | 8 | <tr> |
7 | <th style="width: 40px"></th> | 9 | <th style="width: 40px"></th> |
8 | <th i18n pSortableColumn="name">Video name <p-sortIcon field="name"></p-sortIcon></th> | 10 | <th i18n pSortableColumn="name">Video <p-sortIcon field="name"></p-sortIcon></th> |
9 | <th i18n>Sensitive</th> | 11 | <th style="width: 120px;" i18n>Sensitive</th> |
10 | <th i18n>Unfederated</th> | 12 | <th style="width: 120px;" i18n>Unfederated</th> |
11 | <th i18n pSortableColumn="createdAt">Date <p-sortIcon field="createdAt"></p-sortIcon></th> | 13 | <th style="width: 200px;" i18n pSortableColumn="createdAt">Date <p-sortIcon field="createdAt"></p-sortIcon></th> |
12 | <th style="width: 120px;"></th> | 14 | <th style="width: 120px;"></th> |
13 | </tr> | 15 | </tr> |
14 | </ng-template> | 16 | </ng-template> |
15 | 17 | ||
16 | <ng-template pTemplate="body" let-videoBlacklist let-expanded="expanded"> | 18 | <ng-template pTemplate="body" let-videoBlacklist let-expanded="expanded"> |
17 | <tr> | 19 | <tr> |
18 | 20 | <td *ngIf="!videoBlacklist.reason"></td> | |
19 | <td class="expand-cell"> | 21 | <td *ngIf="videoBlacklist.reason" class="expand-cell c-hand" [pRowToggler]="videoBlacklist" i18n-ngbTooltip ngbTooltip="More information" placement="top-left" container="body"> |
20 | <span *ngIf="videoBlacklist.reason" class="expander" i18n-ngbTooltip ngbTooltip="More information" [pRowToggler]="videoBlacklist"> | 22 | <span class="expander"> |
21 | <i [ngClass]="expanded ? 'glyphicon glyphicon-menu-down' : 'glyphicon glyphicon-menu-right'"></i> | 23 | <i [ngClass]="expanded ? 'glyphicon glyphicon-menu-down' : 'glyphicon glyphicon-menu-right'"></i> |
22 | </span> | 24 | </span> |
23 | </td> | 25 | </td> |
diff --git a/client/src/app/+admin/system/jobs/jobs.component.html b/client/src/app/+admin/system/jobs/jobs.component.html index 3dd4e8a2a..e9765ca77 100644 --- a/client/src/app/+admin/system/jobs/jobs.component.html +++ b/client/src/app/+admin/system/jobs/jobs.component.html | |||
@@ -2,7 +2,7 @@ | |||
2 | <div class="select-filter-block"> | 2 | <div class="select-filter-block"> |
3 | <label for="jobType" i18n>Job type</label> | 3 | <label for="jobType" i18n>Job type</label> |
4 | <div class="peertube-select-container"> | 4 | <div class="peertube-select-container"> |
5 | <select id="jobType" name="jobType" [(ngModel)]="jobType" (ngModelChange)="onJobStateOrTypeChanged()"> | 5 | <select id="jobType" name="jobType" [(ngModel)]="jobType" (ngModelChange)="onJobStateOrTypeChanged()" class="form-control"> |
6 | <option *ngFor="let jobType of jobTypes" [value]="jobType">{{ jobType }}</option> | 6 | <option *ngFor="let jobType of jobTypes" [value]="jobType">{{ jobType }}</option> |
7 | </select> | 7 | </select> |
8 | </div> | 8 | </div> |
@@ -11,7 +11,7 @@ | |||
11 | <div class="select-filter-block"> | 11 | <div class="select-filter-block"> |
12 | <label for="jobState" i18n>Job state</label> | 12 | <label for="jobState" i18n>Job state</label> |
13 | <div class="peertube-select-container"> | 13 | <div class="peertube-select-container"> |
14 | <select id="jobState" name="jobState" [(ngModel)]="jobState" (ngModelChange)="onJobStateOrTypeChanged()"> | 14 | <select id="jobState" name="jobState" [(ngModel)]="jobState" (ngModelChange)="onJobStateOrTypeChanged()" class="form-control"> |
15 | <option *ngFor="let state of jobStates" [value]="state">{{ state }}</option> | 15 | <option *ngFor="let state of jobStates" [value]="state">{{ state }}</option> |
16 | </select> | 16 | </select> |
17 | </div> | 17 | </div> |
diff --git a/client/src/app/+admin/system/logs/logs.component.html b/client/src/app/+admin/system/logs/logs.component.html index 37f833020..ae1b0c601 100644 --- a/client/src/app/+admin/system/logs/logs.component.html +++ b/client/src/app/+admin/system/logs/logs.component.html | |||
@@ -1,18 +1,18 @@ | |||
1 | <div class="header"> | 1 | <div class="header"> |
2 | <div class="peertube-select-container"> | 2 | <div class="peertube-select-container"> |
3 | <select [(ngModel)]="logType" (ngModelChange)="refresh()"> | 3 | <select [(ngModel)]="logType" (ngModelChange)="refresh()" class="form-control"> |
4 | <option *ngFor="let logTypeChoice of logTypeChoices" [value]="logTypeChoice.id">{{ logTypeChoice.label }}</option> | 4 | <option *ngFor="let logTypeChoice of logTypeChoices" [value]="logTypeChoice.id">{{ logTypeChoice.label }}</option> |
5 | </select> | 5 | </select> |
6 | </div> | 6 | </div> |
7 | 7 | ||
8 | <div class="peertube-select-container"> | 8 | <div class="peertube-select-container"> |
9 | <select [(ngModel)]="startDate" (ngModelChange)="refresh()"> | 9 | <select [(ngModel)]="startDate" (ngModelChange)="refresh()" class="form-control"> |
10 | <option *ngFor="let timeChoice of timeChoices" [value]="timeChoice.id">{{ timeChoice.label }}</option> | 10 | <option *ngFor="let timeChoice of timeChoices" [value]="timeChoice.id">{{ timeChoice.label }}</option> |
11 | </select> | 11 | </select> |
12 | </div> | 12 | </div> |
13 | 13 | ||
14 | <div class="peertube-select-container" *ngIf="!isAuditLog()"> | 14 | <div class="peertube-select-container" *ngIf="!isAuditLog()"> |
15 | <select [(ngModel)]="level" (ngModelChange)="refresh()"> | 15 | <select [(ngModel)]="level" (ngModelChange)="refresh()" class="form-control"> |
16 | <option *ngFor="let levelChoice of levelChoices" [value]="levelChoice.id">{{ levelChoice.label }}</option> | 16 | <option *ngFor="let levelChoice of levelChoices" [value]="levelChoice.id">{{ levelChoice.label }}</option> |
17 | </select> | 17 | </select> |
18 | </div> | 18 | </div> |
diff --git a/client/src/app/+admin/users/user-edit/user-edit.component.html b/client/src/app/+admin/users/user-edit/user-edit.component.html index 51db100e9..5303d6096 100644 --- a/client/src/app/+admin/users/user-edit/user-edit.component.html +++ b/client/src/app/+admin/users/user-edit/user-edit.component.html | |||
@@ -139,7 +139,7 @@ | |||
139 | <label i18n for="videoQuota">Video quota</label> | 139 | <label i18n for="videoQuota">Video quota</label> |
140 | <div class="peertube-select-container"> | 140 | <div class="peertube-select-container"> |
141 | <select id="videoQuota" formControlName="videoQuota" class="form-control"> | 141 | <select id="videoQuota" formControlName="videoQuota" class="form-control"> |
142 | <option *ngFor="let videoQuotaOption of videoQuotaOptions" [value]="videoQuotaOption.value"> | 142 | <option *ngFor="let videoQuotaOption of videoQuotaOptions" [value]="videoQuotaOption.value" [disabled]="videoQuotaOption.disabled"> |
143 | {{ videoQuotaOption.label }} | 143 | {{ videoQuotaOption.label }} |
144 | </option> | 144 | </option> |
145 | </select> | 145 | </select> |
@@ -155,7 +155,7 @@ | |||
155 | <label i18n for="videoQuotaDaily">Daily video quota</label> | 155 | <label i18n for="videoQuotaDaily">Daily video quota</label> |
156 | <div class="peertube-select-container"> | 156 | <div class="peertube-select-container"> |
157 | <select id="videoQuotaDaily" formControlName="videoQuotaDaily" class="form-control"> | 157 | <select id="videoQuotaDaily" formControlName="videoQuotaDaily" class="form-control"> |
158 | <option *ngFor="let videoQuotaDailyOption of videoQuotaDailyOptions" [value]="videoQuotaDailyOption.value"> | 158 | <option *ngFor="let videoQuotaDailyOption of videoQuotaDailyOptions" [value]="videoQuotaDailyOption.value" [disabled]="videoQuotaDailyOption.disabled"> |
159 | {{ videoQuotaDailyOption.label }} | 159 | {{ videoQuotaDailyOption.label }} |
160 | </option> | 160 | </option> |
161 | </select> | 161 | </select> |
diff --git a/client/src/app/+admin/users/user-edit/user-edit.ts b/client/src/app/+admin/users/user-edit/user-edit.ts index a23cd9033..18ca5805f 100644 --- a/client/src/app/+admin/users/user-edit/user-edit.ts +++ b/client/src/app/+admin/users/user-edit/user-edit.ts | |||
@@ -8,8 +8,8 @@ import { User } from '@app/shared/users/user.model' | |||
8 | import { ScreenService } from '@app/shared/misc/screen.service' | 8 | import { ScreenService } from '@app/shared/misc/screen.service' |
9 | 9 | ||
10 | export abstract class UserEdit extends FormReactive implements OnInit { | 10 | export abstract class UserEdit extends FormReactive implements OnInit { |
11 | videoQuotaOptions: { value: string, label: string }[] = [] | 11 | videoQuotaOptions: { value: string, label: string, disabled?: boolean }[] = [] |
12 | videoQuotaDailyOptions: { value: string, label: string }[] = [] | 12 | videoQuotaDailyOptions: { value: string, label: string, disabled?: boolean }[] = [] |
13 | username: string | 13 | username: string |
14 | user: User | 14 | user: User |
15 | 15 | ||
@@ -94,9 +94,14 @@ export abstract class UserEdit extends FormReactive implements OnInit { | |||
94 | protected buildQuotaOptions () { | 94 | protected buildQuotaOptions () { |
95 | // These are used by a HTML select, so convert key into strings | 95 | // These are used by a HTML select, so convert key into strings |
96 | this.videoQuotaOptions = this.configService | 96 | this.videoQuotaOptions = this.configService |
97 | .videoQuotaOptions.map(q => ({ value: q.value.toString(), label: q.label })) | 97 | .videoQuotaOptions.map(q => ({ value: q.value?.toString(), label: q.label, disabled: q.disabled })) |
98 | 98 | ||
99 | this.videoQuotaDailyOptions = this.configService | 99 | this.videoQuotaDailyOptions = this.configService |
100 | .videoQuotaDailyOptions.map(q => ({ value: q.value.toString(), label: q.label })) | 100 | .videoQuotaDailyOptions.map(q => ({ value: q.value?.toString(), label: q.label, disabled: q.disabled })) |
101 | |||
102 | console.log( | ||
103 | this.videoQuotaOptions, | ||
104 | this.videoQuotaDailyOptions | ||
105 | ) | ||
101 | } | 106 | } |
102 | } | 107 | } |
diff --git a/client/src/app/+admin/users/user-list/user-list.component.html b/client/src/app/+admin/users/user-list/user-list.component.html index 249883efc..15bdb6398 100644 --- a/client/src/app/+admin/users/user-list/user-list.component.html +++ b/client/src/app/+admin/users/user-list/user-list.component.html | |||
@@ -11,6 +11,8 @@ | |||
11 | [value]="users" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" | 11 | [value]="users" [lazy]="true" [paginator]="true" [totalRecords]="totalRecords" [rows]="rowsPerPage" |
12 | [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" dataKey="id" | 12 | [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" dataKey="id" |
13 | [(selection)]="selectedUsers" | 13 | [(selection)]="selectedUsers" |
14 | [showCurrentPageReport]="true" i18n-currentPageReportTemplate | ||
15 | currentPageReportTemplate="Showing {first} to {last} of {totalRecords} users" | ||
14 | > | 16 | > |
15 | <ng-template pTemplate="caption"> | 17 | <ng-template pTemplate="caption"> |
16 | <div class="caption"> | 18 | <div class="caption"> |
diff --git a/client/src/app/+admin/users/user-list/user-list.component.scss b/client/src/app/+admin/users/user-list/user-list.component.scss index 5274be01c..40f08027f 100644 --- a/client/src/app/+admin/users/user-list/user-list.component.scss +++ b/client/src/app/+admin/users/user-list/user-list.component.scss | |||
@@ -24,3 +24,8 @@ tr.banned { | |||
24 | @include peertube-input-text(250px); | 24 | @include peertube-input-text(250px); |
25 | } | 25 | } |
26 | } | 26 | } |
27 | |||
28 | p-tableCheckbox { | ||
29 | position: relative; | ||
30 | top: -2.5px; | ||
31 | } | ||
diff --git a/client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.html b/client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.html index a96a11f5e..8a93bc9b4 100644 --- a/client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.html +++ b/client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.html | |||
@@ -11,6 +11,7 @@ | |||
11 | <tr> | 11 | <tr> |
12 | <th i18n>Account</th> | 12 | <th i18n>Account</th> |
13 | <th i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th> | 13 | <th i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th> |
14 | <th></th> <!-- column for action buttons --> | ||
14 | </tr> | 15 | </tr> |
15 | </ng-template> | 16 | </ng-template> |
16 | 17 | ||
diff --git a/client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.html b/client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.html index 329cfb08f..0f7ca1f85 100644 --- a/client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.html +++ b/client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.html | |||
@@ -11,7 +11,7 @@ | |||
11 | <tr> | 11 | <tr> |
12 | <th i18n>Instance</th> | 12 | <th i18n>Instance</th> |
13 | <th i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th> | 13 | <th i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th> |
14 | <th></th> | 14 | <th></th> <!-- column for action buttons --> |
15 | </tr> | 15 | </tr> |
16 | </ng-template> | 16 | </ng-template> |
17 | 17 | ||
diff --git a/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html b/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html index a755c4d69..0dda33af2 100644 --- a/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html +++ b/client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html | |||
@@ -11,6 +11,7 @@ | |||
11 | 11 | ||
12 | <div class="peertube-select-container"> | 12 | <div class="peertube-select-container"> |
13 | <select id="nsfwPolicy" formControlName="nsfwPolicy" class="form-control"> | 13 | <select id="nsfwPolicy" formControlName="nsfwPolicy" class="form-control"> |
14 | <option i18n value="undefined" disabled>Policy for sensitive videos</option> | ||
14 | <option i18n value="do_not_list">Do not list</option> | 15 | <option i18n value="do_not_list">Do not list</option> |
15 | <option i18n value="blur">Blur thumbnails</option> | 16 | <option i18n value="blur">Blur thumbnails</option> |
16 | <option i18n value="display">Display</option> | 17 | <option i18n value="display">Display</option> |
diff --git a/client/src/app/shared/forms/timestamp-input.component.scss b/client/src/app/shared/forms/timestamp-input.component.scss index e7dbcd997..9671cc65f 100644 --- a/client/src/app/shared/forms/timestamp-input.component.scss +++ b/client/src/app/shared/forms/timestamp-input.component.scss | |||
@@ -1,8 +1,15 @@ | |||
1 | @import 'variables'; | ||
2 | |||
1 | p-inputmask { | 3 | p-inputmask { |
2 | ::ng-deep input { | 4 | ::ng-deep input { |
3 | width: 80px; | 5 | width: 80px; |
4 | font-size: 15px; | 6 | font-size: 15px; |
5 | 7 | ||
6 | border: none; | 8 | border: none; |
9 | |||
10 | &:focus-within, | ||
11 | &:focus { | ||
12 | box-shadow: #{$focus-box-shadow-form} var(--mainColorLightest); | ||
13 | } | ||
7 | } | 14 | } |
8 | } | 15 | } |
diff --git a/client/src/app/videos/+video-watch/modal/video-share.component.ts b/client/src/app/videos/+video-watch/modal/video-share.component.ts index 56e7d70dd..3550556a0 100644 --- a/client/src/app/videos/+video-watch/modal/video-share.component.ts +++ b/client/src/app/videos/+video-watch/modal/video-share.component.ts | |||
@@ -1,7 +1,7 @@ | |||
1 | import { Component, ElementRef, Input, ViewChild } from '@angular/core' | 1 | import { Component, ElementRef, Input, ViewChild } from '@angular/core' |
2 | import { VideoDetails } from '../../../shared/video/video-details.model' | 2 | import { VideoDetails } from '../../../shared/video/video-details.model' |
3 | import { buildVideoEmbed, buildVideoLink } from '../../../../assets/player/utils' | 3 | import { buildVideoEmbed, buildVideoLink } from '../../../../assets/player/utils' |
4 | import { NgbModal, NgbNavChangeEvent, NgbTabChangeEvent } from '@ng-bootstrap/ng-bootstrap' | 4 | import { NgbModal } from '@ng-bootstrap/ng-bootstrap' |
5 | import { VideoCaption } from '@shared/models' | 5 | import { VideoCaption } from '@shared/models' |
6 | import { VideoPlaylist } from '@app/shared/video-playlist/video-playlist.model' | 6 | import { VideoPlaylist } from '@app/shared/video-playlist/video-playlist.model' |
7 | 7 | ||