diff options
Diffstat (limited to 'client/src/app/shared/instance')
7 files changed, 153 insertions, 49 deletions
diff --git a/client/src/app/shared/instance/feature-boolean.component.html b/client/src/app/shared/instance/feature-boolean.component.html new file mode 100644 index 000000000..ac208fc13 --- /dev/null +++ b/client/src/app/shared/instance/feature-boolean.component.html | |||
@@ -0,0 +1,3 @@ | |||
1 | <span *ngIf="value === true" class="glyphicon glyphicon-ok"></span> | ||
2 | <span *ngIf="value === false" class="glyphicon glyphicon-remove"></span> | ||
3 | |||
diff --git a/client/src/app/shared/instance/feature-boolean.component.scss b/client/src/app/shared/instance/feature-boolean.component.scss new file mode 100644 index 000000000..56d08af06 --- /dev/null +++ b/client/src/app/shared/instance/feature-boolean.component.scss | |||
@@ -0,0 +1,10 @@ | |||
1 | @import '_variables'; | ||
2 | @import '_mixins'; | ||
3 | |||
4 | .glyphicon-ok { | ||
5 | color: $green; | ||
6 | } | ||
7 | |||
8 | .glyphicon-remove { | ||
9 | color: $red; | ||
10 | } | ||
diff --git a/client/src/app/shared/instance/feature-boolean.component.ts b/client/src/app/shared/instance/feature-boolean.component.ts new file mode 100644 index 000000000..d02d513d6 --- /dev/null +++ b/client/src/app/shared/instance/feature-boolean.component.ts | |||
@@ -0,0 +1,10 @@ | |||
1 | import { Component, Input } from '@angular/core' | ||
2 | |||
3 | @Component({ | ||
4 | selector: 'my-feature-boolean', | ||
5 | templateUrl: './feature-boolean.component.html', | ||
6 | styleUrls: [ './feature-boolean.component.scss' ] | ||
7 | }) | ||
8 | export class FeatureBooleanComponent { | ||
9 | @Input() value: boolean | ||
10 | } | ||
diff --git a/client/src/app/shared/instance/instance-features-table.component.html b/client/src/app/shared/instance/instance-features-table.component.html index 2987bd00e..d1cb8fcbe 100644 --- a/client/src/app/shared/instance/instance-features-table.component.html +++ b/client/src/app/shared/instance/instance-features-table.component.html | |||
@@ -1,28 +1,53 @@ | |||
1 | <div class="feature-table"> | 1 | <div class="feature-table"> |
2 | 2 | ||
3 | <table class="table"> | 3 | <table class="table" *ngIf="config"> |
4 | <tr> | 4 | <tr> |
5 | <td i18n class="label">Default NSFW/sensitive videos policy (can be redefined by the users)</td> | 5 | <td i18n class="label"> |
6 | <div>Default NSFW/sensitive videos policy</div> | ||
7 | <div class="more-info">can be redefined by the users</div> | ||
8 | </td> | ||
6 | 9 | ||
7 | <td class="value">{{ buildNSFWLabel() }}</td> | 10 | <td class="value">{{ buildNSFWLabel() }}</td> |
8 | </tr> | 11 | </tr> |
9 | 12 | ||
10 | <tr *ngFor="let feature of features"> | 13 | <tr> |
11 | <td class="label">{{ feature.label }}</td> | 14 | <td i18n class="label">User registration allowed</td> |
12 | <td> | 15 | <td> |
13 | <span *ngIf="feature.value === true" class="glyphicon glyphicon-ok"></span> | 16 | <my-feature-boolean [value]="config.signup.allowed"></my-feature-boolean> |
14 | <span *ngIf="feature.value === false" class="glyphicon glyphicon-remove"></span> | ||
15 | </td> | 17 | </td> |
16 | </tr> | 18 | </tr> |
17 | 19 | ||
18 | <tr> | 20 | <tr> |
19 | <td i18n class="label">Video quota</td> | 21 | <td i18n class="label" colspan="2">Video uploads</td> |
22 | </tr> | ||
23 | |||
24 | <tr> | ||
25 | <td i18n class="sub-label">Transcoding in multiple resolutions</td> | ||
26 | <td> | ||
27 | <my-feature-boolean [value]="config.transcoding.enabledResolutions.length !== 0"></my-feature-boolean> | ||
28 | </td> | ||
29 | </tr> | ||
30 | |||
31 | <tr> | ||
32 | <td i18n class="sub-label">Video uploads</td> | ||
33 | <td> | ||
34 | <span *ngIf="config.autoBlacklist.videos.ofUsers.enabled">Requires manual validation by moderators</span> | ||
35 | <span *ngIf="!config.autoBlacklist.videos.ofUsers.enabled">Automatically published</span> | ||
36 | </td> | ||
37 | </tr> | ||
38 | |||
39 | <tr> | ||
40 | <td i18n class="sub-label">Video quota</td> | ||
20 | 41 | ||
21 | <td class="value"> | 42 | <td class="value"> |
22 | <ng-container *ngIf="initialUserVideoQuota !== -1"> | 43 | <ng-container *ngIf="initialUserVideoQuota !== -1"> |
23 | {{ initialUserVideoQuota | bytes: 0 }} <ng-container *ngIf="dailyUserVideoQuota !== -1">({{ dailyUserVideoQuota | bytes: 0 }} per day)</ng-container> | 44 | {{ initialUserVideoQuota | bytes: 0 }} <ng-container *ngIf="dailyUserVideoQuota !== -1">({{ dailyUserVideoQuota | bytes: 0 }} per day)</ng-container> |
24 | 45 | ||
25 | <my-help tooltipPlacement="auto" helpType="custom" [customHtml]="quotaHelpIndication"></my-help> | 46 | <my-help tooltipPlacement="auto" helpType="custom"> |
47 | <ng-template ptTemplate="customHtml"> | ||
48 | <div [innerHTML]="quotaHelpIndication"></div> | ||
49 | </ng-template> | ||
50 | </my-help> | ||
26 | </ng-container> | 51 | </ng-container> |
27 | 52 | ||
28 | <ng-container i18n *ngIf="initialUserVideoQuota === -1"> | 53 | <ng-container i18n *ngIf="initialUserVideoQuota === -1"> |
@@ -30,5 +55,35 @@ | |||
30 | </ng-container> | 55 | </ng-container> |
31 | </td> | 56 | </td> |
32 | </tr> | 57 | </tr> |
58 | |||
59 | <tr> | ||
60 | <td i18n class="label" colspan="2">Import</td> | ||
61 | </tr> | ||
62 | |||
63 | <tr> | ||
64 | <td i18n class="sub-label">HTTP import (YouTube, Vimeo, direct URL...)</td> | ||
65 | <td> | ||
66 | <my-feature-boolean [value]="config.import.videos.http.enabled"></my-feature-boolean> | ||
67 | </td> | ||
68 | </tr> | ||
69 | |||
70 | <tr> | ||
71 | <td i18n class="sub-label">Torrent import</td> | ||
72 | <td> | ||
73 | <my-feature-boolean [value]="config.import.videos.torrent.enabled"></my-feature-boolean> | ||
74 | </td> | ||
75 | </tr> | ||
76 | |||
77 | |||
78 | <tr> | ||
79 | <td i18n class="label" colspan="2">Player</td> | ||
80 | </tr> | ||
81 | |||
82 | <tr> | ||
83 | <td i18n class="sub-label">P2P enabled</td> | ||
84 | <td> | ||
85 | <my-feature-boolean [value]="config.tracker.enabled"></my-feature-boolean> | ||
86 | </td> | ||
87 | </tr> | ||
33 | </table> | 88 | </table> |
34 | </div> | 89 | </div> |
diff --git a/client/src/app/shared/instance/instance-features-table.component.scss b/client/src/app/shared/instance/instance-features-table.component.scss index f9bec038d..67f2b6c84 100644 --- a/client/src/app/shared/instance/instance-features-table.component.scss +++ b/client/src/app/shared/instance/instance-features-table.component.scss | |||
@@ -5,16 +5,28 @@ table { | |||
5 | font-size: 14px; | 5 | font-size: 14px; |
6 | color: var(--mainForegroundColor); | 6 | color: var(--mainForegroundColor); |
7 | 7 | ||
8 | .label { | 8 | .label, |
9 | font-weight: $font-semibold; | 9 | .sub-label { |
10 | min-width: 330px; | 10 | min-width: 330px; |
11 | } | ||
12 | 11 | ||
13 | .glyphicon-ok { | 12 | &.label { |
14 | color: $green; | 13 | font-weight: $font-semibold; |
14 | } | ||
15 | |||
16 | &.sub-label { | ||
17 | padding-left: 30px; | ||
18 | } | ||
19 | |||
20 | .more-info { | ||
21 | font-style: italic; | ||
22 | font-weight: initial; | ||
23 | font-size: 14px | ||
24 | } | ||
15 | } | 25 | } |
16 | 26 | ||
17 | .glyphicon-remove { | 27 | td { |
18 | color: $red; | 28 | vertical-align: middle; |
19 | } | 29 | } |
20 | } | 30 | } |
31 | |||
32 | |||
diff --git a/client/src/app/shared/instance/instance-features-table.component.ts b/client/src/app/shared/instance/instance-features-table.component.ts index a53082a93..46df4d0b2 100644 --- a/client/src/app/shared/instance/instance-features-table.component.ts +++ b/client/src/app/shared/instance/instance-features-table.component.ts | |||
@@ -1,6 +1,7 @@ | |||
1 | import { Component, OnInit } from '@angular/core' | 1 | import { Component, OnInit } from '@angular/core' |
2 | import { ServerService } from '@app/core' | 2 | import { ServerService } from '@app/core' |
3 | import { I18n } from '@ngx-translate/i18n-polyfill' | 3 | import { I18n } from '@ngx-translate/i18n-polyfill' |
4 | import { ServerConfig } from '@shared/models' | ||
4 | 5 | ||
5 | @Component({ | 6 | @Component({ |
6 | selector: 'my-instance-features-table', | 7 | selector: 'my-instance-features-table', |
@@ -8,8 +9,8 @@ import { I18n } from '@ngx-translate/i18n-polyfill' | |||
8 | styleUrls: [ './instance-features-table.component.scss' ] | 9 | styleUrls: [ './instance-features-table.component.scss' ] |
9 | }) | 10 | }) |
10 | export class InstanceFeaturesTableComponent implements OnInit { | 11 | export class InstanceFeaturesTableComponent implements OnInit { |
11 | features: { label: string, value?: boolean }[] = [] | ||
12 | quotaHelpIndication = '' | 12 | quotaHelpIndication = '' |
13 | config: ServerConfig | ||
13 | 14 | ||
14 | constructor ( | 15 | constructor ( |
15 | private i18n: I18n, | 16 | private i18n: I18n, |
@@ -28,7 +29,7 @@ export class InstanceFeaturesTableComponent implements OnInit { | |||
28 | ngOnInit () { | 29 | ngOnInit () { |
29 | this.serverService.configLoaded | 30 | this.serverService.configLoaded |
30 | .subscribe(() => { | 31 | .subscribe(() => { |
31 | this.buildFeatures() | 32 | this.config = this.serverService.getConfig() |
32 | this.buildQuotaHelpIndication() | 33 | this.buildQuotaHelpIndication() |
33 | }) | 34 | }) |
34 | } | 35 | } |
@@ -41,37 +42,6 @@ export class InstanceFeaturesTableComponent implements OnInit { | |||
41 | if (policy === 'display') return this.i18n('Displayed') | 42 | if (policy === 'display') return this.i18n('Displayed') |
42 | } | 43 | } |
43 | 44 | ||
44 | private buildFeatures () { | ||
45 | const config = this.serverService.getConfig() | ||
46 | |||
47 | this.features = [ | ||
48 | { | ||
49 | label: this.i18n('User registration allowed'), | ||
50 | value: config.signup.allowed | ||
51 | }, | ||
52 | { | ||
53 | label: this.i18n('Video uploads require manual validation by moderators'), | ||
54 | value: config.autoBlacklist.videos.ofUsers.enabled | ||
55 | }, | ||
56 | { | ||
57 | label: this.i18n('Transcode your videos in multiple resolutions'), | ||
58 | value: config.transcoding.enabledResolutions.length !== 0 | ||
59 | }, | ||
60 | { | ||
61 | label: this.i18n('HTTP import (YouTube, Vimeo, direct URL...)'), | ||
62 | value: config.import.videos.http.enabled | ||
63 | }, | ||
64 | { | ||
65 | label: this.i18n('Torrent import'), | ||
66 | value: config.import.videos.torrent.enabled | ||
67 | }, | ||
68 | { | ||
69 | label: this.i18n('P2P enabled'), | ||
70 | value: config.tracker.enabled | ||
71 | } | ||
72 | ] | ||
73 | } | ||
74 | |||
75 | private getApproximateTime (seconds: number) { | 45 | private getApproximateTime (seconds: number) { |
76 | const hours = Math.floor(seconds / 3600) | 46 | const hours = Math.floor(seconds / 3600) |
77 | let pluralSuffix = '' | 47 | let pluralSuffix = '' |
diff --git a/client/src/app/shared/instance/instance.service.ts b/client/src/app/shared/instance/instance.service.ts index d0c96941d..44b413fa4 100644 --- a/client/src/app/shared/instance/instance.service.ts +++ b/client/src/app/shared/instance/instance.service.ts | |||
@@ -4,6 +4,9 @@ import { Injectable } from '@angular/core' | |||
4 | import { environment } from '../../../environments/environment' | 4 | import { environment } from '../../../environments/environment' |
5 | import { RestExtractor, RestService } from '../rest' | 5 | import { RestExtractor, RestService } from '../rest' |
6 | import { About } from '../../../../../shared/models/server' | 6 | import { About } from '../../../../../shared/models/server' |
7 | import { MarkdownService } from '@app/shared/renderer' | ||
8 | import { peertubeTranslate } from '@shared/models' | ||
9 | import { ServerService } from '@app/core' | ||
7 | 10 | ||
8 | @Injectable() | 11 | @Injectable() |
9 | export class InstanceService { | 12 | export class InstanceService { |
@@ -13,7 +16,9 @@ export class InstanceService { | |||
13 | constructor ( | 16 | constructor ( |
14 | private authHttp: HttpClient, | 17 | private authHttp: HttpClient, |
15 | private restService: RestService, | 18 | private restService: RestService, |
16 | private restExtractor: RestExtractor | 19 | private restExtractor: RestExtractor, |
20 | private markdownService: MarkdownService, | ||
21 | private serverService: ServerService | ||
17 | ) { | 22 | ) { |
18 | } | 23 | } |
19 | 24 | ||
@@ -34,4 +39,43 @@ export class InstanceService { | |||
34 | .pipe(catchError(res => this.restExtractor.handleError(res))) | 39 | .pipe(catchError(res => this.restExtractor.handleError(res))) |
35 | 40 | ||
36 | } | 41 | } |
42 | |||
43 | async buildHtml (about: About) { | ||
44 | const html = { | ||
45 | description: '', | ||
46 | terms: '', | ||
47 | codeOfConduct: '', | ||
48 | moderationInformation: '', | ||
49 | administrator: '', | ||
50 | hardwareInformation: '' | ||
51 | } | ||
52 | |||
53 | for (const key of Object.keys(html)) { | ||
54 | html[ key ] = await this.markdownService.textMarkdownToHTML(about.instance[ key ]) | ||
55 | } | ||
56 | |||
57 | return html | ||
58 | } | ||
59 | |||
60 | buildTranslatedLanguages (about: About, translations: any) { | ||
61 | const languagesArray = this.serverService.getVideoLanguages() | ||
62 | |||
63 | return about.instance.languages | ||
64 | .map(l => { | ||
65 | const languageObj = languagesArray.find(la => la.id === l) | ||
66 | |||
67 | return peertubeTranslate(languageObj.label, translations) | ||
68 | }) | ||
69 | } | ||
70 | |||
71 | buildTranslatedCategories (about: About, translations: any) { | ||
72 | const categoriesArray = this.serverService.getVideoCategories() | ||
73 | |||
74 | return about.instance.categories | ||
75 | .map(c => { | ||
76 | const categoryObj = categoriesArray.find(ca => ca.id === c) | ||
77 | |||
78 | return peertubeTranslate(categoryObj.label, translations) | ||
79 | }) | ||
80 | } | ||
37 | } | 81 | } |