aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/app
diff options
context:
space:
mode:
authorRigel Kent <sendmemail@rigelk.eu>2020-04-13 17:03:01 +0200
committerRigel Kent <sendmemail@rigelk.eu>2020-04-13 18:03:21 +0200
commit2bc9bd08cd121bdffbf56a0241c4decfb77bfdd5 (patch)
tree46ec5dab14adfd7e317fdc1c29d62fed89982f98 /client/src/app
parent92e4ca0d95f61994626233866c57b5b078ef9c5a (diff)
downloadPeerTube-2bc9bd08cd121bdffbf56a0241c4decfb77bfdd5.tar.gz
PeerTube-2bc9bd08cd121bdffbf56a0241c4decfb77bfdd5.tar.zst
PeerTube-2bc9bd08cd121bdffbf56a0241c4decfb77bfdd5.zip
Improving select displays, focus box-shadows for paginators, instructions for index url
Diffstat (limited to 'client/src/app')
-rw-r--r--client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html35
-rw-r--r--client/src/app/+admin/config/shared/config.service.ts12
-rw-r--r--client/src/app/+admin/follows/video-redundancies-list/video-redundancies-list.component.html14
-rw-r--r--client/src/app/+admin/follows/video-redundancies-list/video-redundancies-list.component.ts4
-rw-r--r--client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html3
-rw-r--r--client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html4
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html4
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts2
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html15
-rw-r--r--client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html16
-rw-r--r--client/src/app/+admin/system/jobs/jobs.component.html4
-rw-r--r--client/src/app/+admin/system/logs/logs.component.html6
-rw-r--r--client/src/app/+admin/users/user-edit/user-edit.component.html4
-rw-r--r--client/src/app/+admin/users/user-edit/user-edit.ts13
-rw-r--r--client/src/app/+admin/users/user-list/user-list.component.html2
-rw-r--r--client/src/app/+admin/users/user-list/user-list.component.scss5
-rw-r--r--client/src/app/+my-account/my-account-blocklist/my-account-blocklist.component.html1
-rw-r--r--client/src/app/+my-account/my-account-blocklist/my-account-server-blocklist.component.html2
-rw-r--r--client/src/app/+my-account/my-account-settings/my-account-video-settings/my-account-video-settings.component.html1
-rw-r--r--client/src/app/shared/forms/timestamp-input.component.scss7
-rw-r--r--client/src/app/videos/+video-watch/modal/video-share.component.ts2
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'
10export class ConfigService { 10export 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'
8import { ScreenService } from '@app/shared/misc/screen.service' 8import { ScreenService } from '@app/shared/misc/screen.service'
9 9
10export abstract class UserEdit extends FormReactive implements OnInit { 10export 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
28p-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
1p-inputmask { 3p-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 @@
1import { Component, ElementRef, Input, ViewChild } from '@angular/core' 1import { Component, ElementRef, Input, ViewChild } from '@angular/core'
2import { VideoDetails } from '../../../shared/video/video-details.model' 2import { VideoDetails } from '../../../shared/video/video-details.model'
3import { buildVideoEmbed, buildVideoLink } from '../../../../assets/player/utils' 3import { buildVideoEmbed, buildVideoLink } from '../../../../assets/player/utils'
4import { NgbModal, NgbNavChangeEvent, NgbTabChangeEvent } from '@ng-bootstrap/ng-bootstrap' 4import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
5import { VideoCaption } from '@shared/models' 5import { VideoCaption } from '@shared/models'
6import { VideoPlaylist } from '@app/shared/video-playlist/video-playlist.model' 6import { VideoPlaylist } from '@app/shared/video-playlist/video-playlist.model'
7 7