]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html
Fix grammar in translation documentation
[github/Chocobozzz/PeerTube.git] / client / src / app / +admin / config / edit-custom-config / edit-custom-config.component.html
CommitLineData
8a8e02a4 1<form role="form" [formGroup]="form">
fd206f0b 2
45e0d669 3 <ngb-tabset #tabs class="root-tabset bootstrap">
8be1afa1 4
45e0d669 5 <ngb-tab id="instance-information" i18n-title title="Instance information">
63347a0f 6 <ng-template ngbTabContent>
8be1afa1 7
3866f1a0 8 <ng-container formGroupName="instance">
ccc00cb2 9
482fa503
RK
10 <div class="form-row mt-5"> <!-- instance grid -->
11 <div class="form-group col-12 col-lg-4 col-xl-3">
12 <div i18n class="inner-form-title">INSTANCE</div>
13 </div>
63347a0f 14
482fa503 15 <div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
63347a0f 16
482fa503
RK
17 <div class="form-group">
18 <label i18n for="instanceName">Name</label>
19 <input
20 type="text" id="instanceName"
21 formControlName="name" [ngClass]="{ 'input-error': formErrors.instance.name }"
22 >
23 <div *ngIf="formErrors.instance.name" class="form-error">{{ formErrors.instance.name }}</div>
24 </div>
63347a0f 25
482fa503
RK
26 <div class="form-group">
27 <label i18n for="instanceShortDescription">Short description</label>
28 <textarea
29 id="instanceShortDescription" formControlName="shortDescription" class="small"
30 [ngClass]="{ 'input-error': formErrors['instance.shortDescription'] }"
31 ></textarea>
32 <div *ngIf="formErrors.instance.shortDescription" class="form-error">{{ formErrors.instance.shortDescription }}</div>
33 </div>
ccc00cb2 34
482fa503
RK
35 <div class="form-group">
36 <label i18n for="instanceDescription">Description</label><my-help helpType="markdownText"></my-help>
37 <my-markdown-textarea
38 name="instanceDescription" formControlName="description" textareaWidth="500px" [previewColumn]="true"
39 [classes]="{ 'input-error': formErrors['instance.description'] }"
40 ></my-markdown-textarea>
41 <div *ngIf="formErrors.instance.description" class="form-error">{{ formErrors.instance.description }}</div>
42 </div>
ccc00cb2 43
482fa503
RK
44 <div class="form-group">
45 <label i18n for="instanceCategories">Main instance categories</label>
46
47 <div>
48 <p-multiSelect
49 inputId="instanceCategories" [options]="categoryItems" formControlName="categories" [showToggleAll]="false"
50 [defaultLabel]="getDefaultCategoryLabel()" [selectedItemsLabel]="getSelectedCategoryLabel()"
51 emptyFilterMessage="No results found" i18n-emptyFilterMessage
52 ></p-multiSelect>
53 </div>
54 </div>
55
56 <div class="form-group">
57 <label i18n for="instanceLanguages">Main languages you/your moderators speak</label>
58
59 <div>
60 <p-multiSelect
61 inputId="instanceLanguages" [options]="languageItems" formControlName="languages" [showToggleAll]="false"
62 [defaultLabel]="getDefaultLanguageLabel()" [selectedItemsLabel]="getSelectedLanguageLabel()"
63 emptyFilterMessage="No results found" i18n-emptyFilterMessage
64 ></p-multiSelect>
65 </div>
66 </div>
ccc00cb2 67
ccc00cb2 68 </div>
63347a0f 69 </div>
63347a0f 70
482fa503
RK
71 <div class="form-row mt-4"> <!-- moderation & nsfw grid -->
72 <div class="form-group col-12 col-lg-4 col-xl-3">
73 <div i18n class="inner-form-title">MODERATION & NSFW</div>
310e95d8
RK
74 <div i18n class="inner-for-description">
75 Manage <a routerLink="/admin/users">users</a> to build a moderation team.
76 </div>
482fa503 77 </div>
ccc00cb2 78
482fa503 79 <div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
421d935d 80
482fa503
RK
81 <div class="form-group">
82 <my-peertube-checkbox inputName="instanceIsNSFW" formControlName="isNSFW">
83 <ng-template ptTemplate="label">
84 <ng-container i18n>This instance is dedicated to sensitive or NSFW content</ng-container>
85 </ng-template>
f8802489 86
482fa503
RK
87 <ng-template ptTemplate="help">
88 <ng-container i18n>
89 Enabling it will allow other administrators to know that you are mainly federating sensitive content.<br /><br />
90 Moreover, the NSFW checkbox on video upload will be automatically checked by default.
91 </ng-container>
92 </ng-template>
93 </my-peertube-checkbox>
94 </div>
421d935d 95
482fa503
RK
96 <div class="form-group">
97 <label i18n for="instanceDefaultNSFWPolicy">Policy on videos containing sensitive content</label>
ccc00cb2 98
482fa503
RK
99 <my-help>
100 <ng-template ptTemplate="customHtml">
101 <ng-container i18n>
102 With <strong>Do not list</strong> or <strong>Blur thumbnails</strong>, a confirmation will be requested to watch the video.
103 </ng-container>
104 </ng-template>
105 </my-help>
106
107 <div class="peertube-select-container">
108 <select id="instanceDefaultNSFWPolicy" formControlName="defaultNSFWPolicy">
109 <option i18n value="do_not_list">Do not list</option>
110 <option i18n value="blur">Blur thumbnails</option>
111 <option i18n value="display">Display</option>
112 </select>
113 </div>
114 <div *ngIf="formErrors.instance.defaultNSFWPolicy" class="form-error">{{ formErrors.instance.defaultNSFWPolicy }}</div>
115 </div>
ccc00cb2 116
482fa503
RK
117 <div class="form-group">
118 <label i18n for="instanceTerms">Terms</label><my-help helpType="markdownText"></my-help>
119 <my-markdown-textarea
120 name="instanceTerms" formControlName="terms" textareaWidth="500px" [previewColumn]="true"
121 [ngClass]="{ 'input-error': formErrors['instance.terms'] }"
122 ></my-markdown-textarea>
123 <div *ngIf="formErrors.instance.terms" class="form-error">{{ formErrors.instance.terms }}</div>
124 </div>
ccc00cb2 125
482fa503
RK
126 <div class="form-group">
127 <label i18n for="instanceCodeOfConduct">Code of conduct</label><my-help helpType="markdownText"></my-help>
128 <my-markdown-textarea
129 name="instanceCodeOfConduct" formControlName="codeOfConduct" textareaWidth="500px" [previewColumn]="true"
130 [ngClass]="{ 'input-error': formErrors['instance.codeOfConduct'] }"
131 ></my-markdown-textarea>
132 <div *ngIf="formErrors.instance.codeOfConduct" class="form-error">{{ formErrors.instance.codeOfConduct }}</div>
133 </div>
ccc00cb2 134
482fa503
RK
135 <div class="form-group">
136 <label i18n for="instanceModerationInformation">Moderation information</label><my-help helpType="markdownText"></my-help>
137 <div i18n class="label-small-info">Who moderates the instance? What is the policy regarding NSFW videos? Political videos? etc</div>
138
139 <my-markdown-textarea
140 name="instanceModerationInformation" formControlName="moderationInformation" textareaWidth="500px" [previewColumn]="true"
141 [ngClass]="{ 'input-error': formErrors['instance.moderationInformation'] }"
142 ></my-markdown-textarea>
143 <div *ngIf="formErrors.instance.moderationInformation" class="form-error">{{ formErrors.instance.moderationInformation }}</div>
144 </div>
145
146 </div>
ccc00cb2
C
147 </div>
148
482fa503
RK
149 <div class="form-row mt-4"> <!-- you and your instance grid -->
150 <div class="form-group col-12 col-lg-4 col-xl-3">
151 <div i18n class="inner-form-title">YOU AND YOUR INSTANCE</div>
152 </div>
ccc00cb2 153
482fa503 154 <div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
ccc00cb2 155
482fa503
RK
156 <div class="form-group">
157 <label i18n for="instanceAdministrator">Who is behind the instance?</label>
158 <div i18n class="label-small-info">A single person? A non-profit? A company?</div>
8ae03c37 159
482fa503
RK
160 <my-markdown-textarea
161 name="instanceAdministrator" formControlName="administrator" textareaWidth="500px" textareaHeight="75px" [previewColumn]="true"
162 [classes]="{ 'input-error': formErrors['instance.administrator'] }"
163 ></my-markdown-textarea>
8ae03c37 164
482fa503
RK
165 <div *ngIf="formErrors.instance.administrator" class="form-error">{{ formErrors.instance.administrator }}</div>
166 </div>
8ae03c37 167
482fa503
RK
168 <div class="form-group">
169 <label i18n for="instanceCreationReason">Why did you create this instance?</label>
170 <div i18n class="label-small-info">To share your personal videos? To open registrations and allow people to upload what they want?</div>
171
172 <textarea
173 id="instanceCreationReason" formControlName="creationReason" class="small"
174 [ngClass]="{ 'input-error': formErrors['instance.creationReason'] }"
175 ></textarea>
176 <div *ngIf="formErrors.instance.creationReason" class="form-error">{{ formErrors.instance.creationReason }}</div>
177 </div>
ccc00cb2 178
482fa503
RK
179 <div class="form-group">
180 <label i18n for="instanceMaintenanceLifetime">How long do you plan to maintain this instance?</label>
181 <div i18n class="label-small-info">It's important to know for users who want to register on your instance</div>
182
183 <textarea
184 id="instanceMaintenanceLifetime" formControlName="maintenanceLifetime" class="small"
185 [ngClass]="{ 'input-error': formErrors['instance.maintenanceLifetime'] }"
186 ></textarea>
187 <div *ngIf="formErrors.instance.maintenanceLifetime" class="form-error">{{ formErrors.instance.maintenanceLifetime }}</div>
188 </div>
189
190 <div class="form-group">
191 <label i18n for="instanceBusinessModel">How will you finance the PeerTube server?</label>
192 <div i18n class="label-small-info">With your own funds? With user donations? Advertising?</div>
193
194 <textarea
195 id="instanceBusinessModel" formControlName="businessModel" class="small"
196 [ngClass]="{ 'input-error': formErrors['instance.businessModel'] }"
197 ></textarea>
198 <div *ngIf="formErrors.instance.businessModel" class="form-error">{{ formErrors.instance.businessModel }}</div>
199 </div>
ccc00cb2 200
482fa503 201 </div>
ccc00cb2
C
202 </div>
203
482fa503
RK
204 <div class="form-row mt-4"> <!-- other information grid -->
205 <div class="form-group col-12 col-lg-4 col-xl-3">
206 <div i18n class="inner-form-title">OTHER INFORMATION</div>
207 </div>
ccc00cb2 208
482fa503 209 <div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
ccc00cb2 210
482fa503
RK
211 <div class="form-group">
212 <label i18n for="instanceHardwareInformation">What server/hardware does the instance run on?</label>
45e0d669 213 <div i18n class="label-small-info">i.e. 2vCore 2GB RAM, a direct the link to the server you rent, etc.</div>
be04c6fd 214
482fa503
RK
215 <my-markdown-textarea
216 name="instanceHardwareInformation" formControlName="hardwareInformation" textareaWidth="500px" textareaHeight="75px" [previewColumn]="true"
217 [classes]="{ 'input-error': formErrors['instance.hardwareInformation'] }"
218 ></my-markdown-textarea>
be04c6fd 219
482fa503
RK
220 <div *ngIf="formErrors.instance.hardwareInformation" class="form-error">{{ formErrors.instance.hardwareInformation }}</div>
221 </div>
be04c6fd 222
482fa503 223 </div>
be04c6fd
C
224 </div>
225
3866f1a0 226 </ng-container>
ccc00cb2
C
227 </ng-template>
228 </ngb-tab>
63347a0f 229
45e0d669 230 <ngb-tab id="basic-configuration" i18n-title title="Basic configuration">
ccc00cb2 231 <ng-template ngbTabContent>
0dc64777 232
482fa503
RK
233 <div class="form-row mt-5"> <!-- appearance grid -->
234 <div class="form-group col-12 col-lg-4 col-xl-3">
235 <div i18n class="inner-form-title">APPEARANCE</div>
310e95d8 236 <div i18n class="inner-for-description">
45e0d669 237 Use <a routerLink="/admin/plugins">plugins & themes</a> for more involved changes, or <a routerLink="/admin/config/edit-custom" fragment="customizations" (click)="gotoAnchor()">add slight customizations</a>.
310e95d8 238 </div>
7cd4d2ba 239 </div>
7cd4d2ba 240
482fa503 241 <div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
7cd4d2ba 242
482fa503
RK
243 <ng-container formGroupName="theme">
244 <div class="form-group">
245 <label i18n for="themeDefault">Theme</label>
ccc00cb2 246
482fa503
RK
247 <div class="peertube-select-container">
248 <select formControlName="default" id="themeDefault">
249 <option i18n value="default">default</option>
63347a0f 250
482fa503
RK
251 <option *ngFor="let theme of availableThemes" [value]="theme">{{ theme }}</option>
252 </select>
96a4a7c3 253 </div>
482fa503
RK
254 </div>
255 </ng-container>
63347a0f 256
482fa503
RK
257 <div class="form-group" formGroupName="instance">
258 <label i18n for="instanceDefaultClientRoute">Landing page</label>
259 <div class="peertube-select-container">
260 <select id="instanceDefaultClientRoute" formControlName="defaultClientRoute">
261 <option i18n value="/videos/overview">Discover videos</option>
262 <option i18n value="/videos/trending">Trending videos</option>
263 <option i18n value="/videos/most-liked">Most liked videos</option>
264 <option i18n value="/videos/recently-added">Recently added videos</option>
265 <option i18n value="/videos/local">Local videos</option>
266 </select>
267 </div>
268 <div *ngIf="formErrors.instance.defaultClientRoute" class="form-error">{{ formErrors.instance.defaultClientRoute }}</div>
3866f1a0 269 </div>
482fa503 270
3866f1a0 271 </div>
482fa503 272 </div>
d9eaee39 273
482fa503
RK
274 <div class="form-row mt-4"> <!-- new users grid -->
275 <div class="form-group col-12 col-lg-4 col-xl-3">
276 <div i18n class="inner-form-title">NEW USERS</div>
310e95d8
RK
277 <div i18n class="inner-for-description">
278 Manage <a routerLink="/admin/users">users</a> to set their quota individually.
279 </div>
63347a0f 280 </div>
8be1afa1 281
482fa503 282 <div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
0dc64777 283
482fa503
RK
284 <ng-container formGroupName="signup">
285 <div class="form-group">
286 <my-peertube-checkbox
287 inputName="signupEnabled" formControlName="enabled"
288 i18n-labelText labelText="Signup enabled"
289 >
290 <ng-container ngProjectAs="description">
291 <span i18n>⚠️ This functionality requires a lot of attention and extra moderation.</span>
292 </ng-container>
293 <ng-container ngProjectAs="extra">
294 <my-peertube-checkbox [ngClass]="{ 'disabled-checkbox-extra': !isSignupEnabled() }"
295 inputName="signupRequiresEmailVerification" formControlName="requiresEmailVerification"
296 i18n-labelText labelText="Signup requires email verification"
297 ></my-peertube-checkbox>
63347a0f 298
482fa503
RK
299 <div [ngClass]="{ 'disabled-checkbox-extra': !isSignupEnabled() }" class="mt-3">
300 <label i18n for="signupLimit">Signup limit</label>
301 <input
302 type="number" min="-1" id="signupLimit"
303 formControlName="limit" [ngClass]="{ 'input-error': formErrors['signup.limit'] }"
304 >
305 <div *ngIf="formErrors.signup.limit" class="form-error">{{ formErrors.signup.limit }}</div>
306 <small *ngIf="form.value['signup']['limit'] === -1" class="text-muted">Signup won't be limited to a fixed number of users.</small>
307 </div>
308 </ng-container>
309 </my-peertube-checkbox>
310 </div>
311 </ng-container>
8be1afa1 312
482fa503
RK
313 <ng-container formGroupName="user">
314 <div class="form-group">
315 <label i18n for="userVideoQuota">Default video quota per user</label>
316 <div class="peertube-select-container">
317 <select id="userVideoQuota" formControlName="videoQuota">
318 <option *ngFor="let videoQuotaOption of videoQuotaOptions" [value]="videoQuotaOption.value">
319 {{ videoQuotaOption.label }}
320 </option>
321 </select>
322 </div>
323 <div *ngIf="formErrors.user.videoQuota" class="form-error">{{ formErrors.user.videoQuota }}</div>
324 </div>
3866f1a0 325
482fa503
RK
326 <div class="form-group">
327 <label i18n for="userVideoQuotaDaily">Default daily upload limit per user</label>
328 <div class="peertube-select-container">
329 <select id="userVideoQuotaDaily" formControlName="videoQuotaDaily">
330 <option *ngFor="let videoQuotaDailyOption of videoQuotaDailyOptions" [value]="videoQuotaDailyOption.value">
331 {{ videoQuotaDailyOption.label }}
332 </option>
333 </select>
334 </div>
335 <div *ngIf="formErrors.user.videoQuotaDaily" class="form-error">{{ formErrors.user.videoQuotaDaily }}</div>
336 </div>
337 </ng-container>
3866f1a0 338
482fa503
RK
339 </div>
340 </div>
8be1afa1 341
482fa503
RK
342 <div class="form-row mt-4"> <!-- new videos grid -->
343 <div class="form-group col-12 col-lg-4 col-xl-3">
344 <div i18n class="inner-form-title">NEW VIDEOS</div>
345 </div>
0dc64777 346
482fa503 347 <div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
7ccddd7b 348
482fa503
RK
349 <ng-container formGroupName="import">
350 <ng-container formGroupName="videos">
351
352 <div class="form-group" formGroupName="http">
353 <my-peertube-checkbox
354 inputName="importVideosHttpEnabled" formControlName="enabled"
355 i18n-labelText labelText="Allow import with HTTP URL (i.e. YouTube)"
356 ></my-peertube-checkbox>
357 </div>
7ccddd7b 358
482fa503
RK
359 <div class="form-group" formGroupName="torrent">
360 <my-peertube-checkbox
361 inputName="importVideosTorrentEnabled" formControlName="enabled"
362 i18n-labelText labelText="Allow import with a torrent file or a magnet URI"
363 ></my-peertube-checkbox>
364 </div>
7ccddd7b 365
482fa503 366 </ng-container>
7ccddd7b 367 </ng-container>
0dc64777 368
482fa503
RK
369 <ng-container formGroupName="autoBlacklist">
370 <ng-container formGroupName="videos">
371 <ng-container formGroupName="ofUsers">
372
373 <div class="form-group">
374 <my-peertube-checkbox
375 inputName="autoBlacklistVideosOfUsersEnabled" formControlName="enabled"
376 i18n-labelText labelText="Blacklist new videos automatically"
377 >
378 <ng-container ngProjectAs="description">
379 <span i18n>Unless a user is marked as trusted, their videos will stay private until a moderator reviews them.</span>
380 </ng-container>
381 </my-peertube-checkbox>
382 </div>
383
384 </ng-container>
385 </ng-container>
386 </ng-container>
0dc64777 387
482fa503
RK
388 </div>
389 </div>
0dc64777 390
482fa503
RK
391 <div class="form-row mt-4"> <!-- federation grid -->
392 <div class="form-group col-12 col-lg-4 col-xl-3">
393 <div i18n class="inner-form-title">FEDERATION</div>
45e0d669
RK
394 <div i18n class="inner-form-description">
395 Manage <a routerLink="/admin/follows">relations</a> with other instances.
396 </div>
482fa503 397 </div>
0dc64777 398
482fa503 399 <div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
0dc64777 400
482fa503
RK
401 <ng-container formGroupName="followers">
402 <ng-container formGroupName="instance">
e1b49ee5 403
482fa503
RK
404 <div class="form-group">
405 <my-peertube-checkbox
406 inputName="followersInstanceEnabled" formControlName="enabled"
407 i18n-labelText labelText="Other instances can follow yours"
408 ></my-peertube-checkbox>
409 </div>
e1b49ee5 410
482fa503
RK
411 <div class="form-group">
412 <my-peertube-checkbox
413 inputName="followersInstanceManualApproval" formControlName="manualApproval"
414 i18n-labelText labelText="Manually approve new instance followers"
415 ></my-peertube-checkbox>
416 </div>
417 </ng-container>
e1b49ee5
C
418 </ng-container>
419
482fa503
RK
420 <ng-container formGroupName="followings">
421 <ng-container formGroupName="instance">
422
423 <ng-container formGroupName="autoFollowBack">
424 <div class="form-group">
425 <my-peertube-checkbox
426 inputName="followingsInstanceAutoFollowBackEnabled" formControlName="enabled"
427 i18n-labelText labelText="Automatically follow back instances"
428 >
429 <ng-container ngProjectAs="description">
430 <span i18n>⚠️ This functionality requires a lot of attention and extra moderation.</span>
431 </ng-container>
432 </my-peertube-checkbox>
433 </div>
434 </ng-container>
96a4a7c3 435
482fa503
RK
436 <ng-container formGroupName="autoFollowIndex">
437 <div class="form-group">
438 <my-peertube-checkbox
439 inputName="followingsInstanceAutoFollowIndexEnabled" formControlName="enabled"
440 i18n-labelText labelText="Automatically follow instances of the public index"
441 >
442 <ng-container ngProjectAs="description">
443 <span i18n>⚠️ This functionality requires a lot of attention and extra moderation.</span>
444 </ng-container>
445
446 <ng-container ngProjectAs="extra">
447 <div [ngClass]="{ 'disabled-checkbox-extra': !isAutoFollowIndexEnabled() }">
448 <label i18n for="followingsInstanceAutoFollowIndexUrl">Index URL</label>
449 <input
450 type="text" id="followingsInstanceAutoFollowIndexUrl"
451 formControlName="indexUrl" [ngClass]="{ 'input-error': formErrors['followings.instance.autoFollowIndex.indexUrl'] }"
452 >
453 <div *ngIf="formErrors.followings.instance.autoFollowIndex.indexUrl" class="form-error">{{ formErrors.followings.instance.autoFollowIndex.indexUrl }}</div>
454 </div>
455 </ng-container>
456 </my-peertube-checkbox>
457 </div>
e1b49ee5 458
482fa503
RK
459 </ng-container>
460 </ng-container>
e1b49ee5 461 </ng-container>
e1b49ee5 462
482fa503
RK
463 </div>
464 </div>
465
466 <div class="form-row mt-4"> <!-- administrators grid -->
467 <div class="form-group col-12 col-lg-4 col-xl-3">
468 <div i18n class="inner-form-title">ADMINISTRATORS</div>
469 </div>
0dc64777 470
482fa503 471 <div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
8be1afa1 472
482fa503
RK
473 <div class="form-group" formGroupName="admin">
474 <label i18n for="adminEmail">Admin email</label>
475 <input
476 type="text" id="adminEmail"
477 formControlName="email" [ngClass]="{ 'input-error': formErrors['admin.email'] }"
478 >
479 <div *ngIf="formErrors.admin.email" class="form-error">{{ formErrors.admin.email }}</div>
480 </div>
481
482 <div class="form-group" formGroupName="contactForm">
483 <my-peertube-checkbox
484 inputName="enableContactForm" formControlName="enabled"
485 i18n-labelText labelText="Enable contact form"
486 ></my-peertube-checkbox>
487 </div>
8be1afa1 488
482fa503 489 </div>
8be1afa1 490 </div>
bee0abff 491
63347a0f
C
492 </ng-template>
493 </ngb-tab>
8be1afa1 494
45e0d669 495 <ngb-tab id="services" i18n-title title="Services">
63347a0f 496 <ng-template ngbTabContent>
0f7fedc3 497
482fa503
RK
498 <div class="form-row mt-5"> <!-- twitter grid -->
499 <div class="form-group col-12 col-lg-4 col-xl-3">
500 <div i18n class="inner-form-title">TWITTER</div>
9b307858
RK
501 <div i18n class="inner-form-description">
502 Optional. If any, provide the Twitter account representing your instance to improve link previews.
503 </div>
482fa503 504 </div>
3866f1a0 505
482fa503 506 <div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
421d935d 507
482fa503
RK
508 <ng-container formGroupName="services">
509 <ng-container formGroupName="twitter">
421d935d 510
482fa503
RK
511 <div class="form-group">
512 <label i18n for="signupLimit">Your Twitter username</label>
3866f1a0 513
482fa503
RK
514 <input
515 type="text" id="servicesTwitterUsername"
516 formControlName="username" [ngClass]="{ 'input-error': formErrors['services.twitter.username'] }"
517 >
518 <div *ngIf="formErrors.services.twitter.username" class="form-error">{{ formErrors.services.twitter.username }}</div>
519 </div>
3866f1a0 520
482fa503
RK
521 <div class="form-group">
522 <my-peertube-checkbox inputName="servicesTwitterWhitelisted" formControlName="whitelisted">
523 <ng-template ptTemplate="label">
524 <ng-container i18n>Instance whitelisted by Twitter</ng-container>
525 </ng-template>
526
527 <ng-template ptTemplate="help">
528 <ng-container i18n>
529 If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.<br />
530 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.<br /><br />
531 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on
532 <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a>
533 to see if you instance is whitelisted.
534 </ng-container>
535 </ng-template>
536 </my-peertube-checkbox>
537 </div>
538
539 </ng-container>
540 </ng-container>
541
542 </div>
543 </div>
8be1afa1 544
63347a0f
C
545 </ng-template>
546 </ngb-tab>
547
45e0d669 548 <ngb-tab id="advanced-configuration" i18n-title title="Advanced configuration">
63347a0f
C
549 <ng-template ngbTabContent>
550
482fa503
RK
551 <div class="form-row mt-5"> <!-- transcoding grid -->
552 <div class="form-group col-12 col-lg-4 col-xl-3">
553 <div i18n class="inner-form-title">TRANSCODING</div>
9b307858
RK
554 <div i18n class="inner-form-description">
555 Process uploaded videos so that they are in a streamable form that any device can play. Though costly in
556 resources, this is a critical part of PeerTube, so tread carefully.
557 </div>
14e2014a
C
558 </div>
559
482fa503 560 <div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
3866f1a0 561
482fa503 562 <ng-container formGroupName="transcoding">
536598cf 563
482fa503
RK
564 <div class="form-group">
565 <my-peertube-checkbox inputName="transcodingEnabled" formControlName="enabled">
566 <ng-template ptTemplate="label">
567 <ng-container i18n>Transcoding enabled</ng-container>
568 </ng-template>
569
5a71acd2 570 <ng-template ptTemplate="help">
482fa503
RK
571 <ng-container i18n>If you disable transcoding, many videos from your users will not work!</ng-container>
572 </ng-template>
5a71acd2 573
482fa503 574 <ng-container ngProjectAs="extra">
04cda1d7 575
482fa503
RK
576 <div class="form-group" [ngClass]="{ 'disabled-checkbox-extra': !isTranscodingEnabled() }">
577 <my-peertube-checkbox
578 inputName="transcodingAllowAdditionalExtensions" formControlName="allowAdditionalExtensions"
579 i18n-labelText labelText="Allow additional extensions"
580 >
9b307858
RK
581 <ng-container ngProjectAs="description">
582 <span i18n>Allow your users to upload .mkv, .mov, .avi and .flv videos.</span>
583 </ng-container>
482fa503
RK
584 </my-peertube-checkbox>
585 </div>
586
587 <div class="form-group" [ngClass]="{ 'disabled-checkbox-extra': !isTranscodingEnabled() }">
588 <my-peertube-checkbox
589 inputName="transcodingAllowAudioFiles" formControlName="allowAudioFiles"
590 i18n-labelText labelText="Allow audio files upload"
591 >
9b307858
RK
592 <ng-container ngProjectAs="description">
593 <span i18n>Allow your users to upload audio files that will be merged with the preview file on upload.</span>
594 </ng-container>
482fa503
RK
595 </my-peertube-checkbox>
596 </div>
04cda1d7 597
482fa503
RK
598 <ng-container formGroupName="webtorrent">
599 <div class="form-group" [ngClass]="{ 'disabled-checkbox-extra': !isTranscodingEnabled() }">
600 <my-peertube-checkbox
601 inputName="transcodingWebTorrentEnabled" formControlName="enabled"
602 i18n-labelText labelText="WebTorrent support enabled"
603 >
604 <ng-template ptTemplate="help">
605 <ng-container i18n>
606 <strong>Experimental, we suggest you to not disable webtorrent support for now</strong>
607
608 <p>If you also enabled HLS support, it will multiply videos storage by 2</p>
609
610 <br />
611
612 <strong>If disabled, breaks federation with PeerTube instances < 2.1</strong>
613 </ng-container>
614 </ng-template>
615 </my-peertube-checkbox>
616 </div>
5a71acd2 617 </ng-container>
482fa503
RK
618
619 <ng-container formGroupName="hls">
620 <div class="form-group" [ngClass]="{ 'disabled-checkbox-extra': !isTranscodingEnabled() }">
621 <my-peertube-checkbox
622 inputName="transcodingHlsEnabled" formControlName="enabled"
623 i18n-labelText labelText="HLS support enabled"
624 >
625 <ng-template ptTemplate="help">
626 <ng-container i18n>
627 <strong>Requires ffmpeg >= 4.1</strong>
628
629 <p>Generate HLS playlists and fragmented MP4 files resulting in a better playback than with the current default player:</p>
630 <ul>
631 <li>Resolution change is smoother</li>
632 <li>Faster playback in particular with long videos</li>
633 <li>More stable playback (less bugs/infinite loading)</li>
634 </ul>
635
636 <p>If you also enabled WebTorrent support, it will multiply videos storage by 2</p>
637 </ng-container>
638 </ng-template>
639 </my-peertube-checkbox>
640 </div>
641 </ng-container>
482fa503
RK
642
643 </ng-container>
5a71acd2
C
644 </my-peertube-checkbox>
645 </div>
482fa503 646
9b307858
RK
647 <div class="form-group">
648
649 <div class="form-group" [ngClass]="{ 'disabled-checkbox-extra': !isTranscodingEnabled() }">
650 <label i18n for="transcodingThreads">Transcoding threads</label>
651 <div class="peertube-select-container">
652 <select id="transcodingThreads" formControlName="threads">
653 <option *ngFor="let transcodingThreadOption of transcodingThreadOptions" [value]="transcodingThreadOption.value">
654 {{ transcodingThreadOption.label }}
655 </option>
656 </select>
657 </div>
658 <div *ngIf="formErrors.transcoding.threads" class="form-error">{{ formErrors.transcoding.threads }}</div>
659 </div>
660
661 </div>
662
663 <div class="form-group" [ngClass]="{ 'disabled-checkbox-extra': !isTranscodingEnabled() }">
664
665 <label i18n for="transcodingThreads">Resolutions to generate</label>
666
667 <div class="ml-2 mt-2 d-flex flex-column">
668 <ng-container formGroupName="resolutions">
669 <div class="form-group" *ngFor="let resolution of resolutions">
670 <my-peertube-checkbox
671 [inputName]="getResolutionKey(resolution.id)" [formControlName]="resolution.id"
672 labelText="{{resolution.label}}"
673 >
674 <ng-template *ngIf="resolution.description" ptTemplate="help">
675 <div [innerHTML]="resolution.description"></div>
676 </ng-template>
677 </my-peertube-checkbox>
678 </div>
679 </ng-container>
680 </div>
681
682 </div>
683
5a71acd2
C
684 </ng-container>
685
482fa503
RK
686 </div>
687 </div>
5d9e4eaa 688
482fa503
RK
689 <div class="form-row mt-4"> <!-- cache grid -->
690 <div class="form-group col-12 col-lg-4 col-xl-3">
9b307858
RK
691 <div i18n class="inner-form-title">CACHE</div>
692 <div i18n class="inner-form-description">
693 Some files are not federated, and fetched when necessary. Define their caching policies.
482fa503
RK
694 </div>
695 </div>
5a71acd2 696
482fa503 697 <div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
5d9e4eaa 698
482fa503
RK
699 <ng-container formGroupName="cache">
700 <div class="form-group" formGroupName="previews">
701 <label i18n for="cachePreviewsSize">Number of previews to keep in cache</label>
702 <input
703 type="number" min="0" id="cachePreviewsSize"
704 formControlName="size" [ngClass]="{ 'input-error': formErrors['cache.previews.size'] }"
705 >
706 <div *ngIf="formErrors.cache.previews.size" class="form-error">{{ formErrors.cache.previews.size }}</div>
3866f1a0 707 </div>
63347a0f 708
482fa503
RK
709 <div class="form-group" formGroupName="captions">
710 <label i18n for="cacheCaptionsSize">Number of video captions to keep in cache</label>
711 <input
712 type="number" min="0" id="cacheCaptionsSize"
713 formControlName="size" [ngClass]="{ 'input-error': formErrors['cache.captions.size'] }"
46db9430 714 >
482fa503 715 <div *ngIf="formErrors.cache.captions.size" class="form-error">{{ formErrors.cache.captions.size }}</div>
3866f1a0
C
716 </div>
717 </ng-container>
718
63347a0f 719 </div>
482fa503 720 </div>
63347a0f 721
482fa503
RK
722 <div class="form-row mt-4"> <!-- cache grid -->
723 <div class="form-group col-12 col-lg-4 col-xl-3">
45e0d669 724 <div class="anchor" id="customizations"></div> <!-- customizations anchor -->
482fa503 725 <div i18n class="inner-form-title">CUSTOMIZATIONS</div>
9b307858
RK
726 <div i18n class="inner-form-description">
727 Slight modifications to your PeerTube instance for when creating a plugin or theme is overkill.
728 </div>
63347a0f 729 </div>
63347a0f 730
482fa503
RK
731 <div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
732
733 <ng-container formGroupName="instance">
734 <ng-container formGroupName="customizations">
735 <div class="form-group">
736 <label i18n for="customizationJavascript">JavaScript</label>
737 <my-help>
738 <ng-template ptTemplate="customHtml">
739 <ng-container i18n>
740 Write JavaScript code directly.<br />Example: <pre>console.log('my instance is amazing');</pre>
741 </ng-container>
742 </ng-template>
743 </my-help>
744
745 <textarea
746 id="customizationJavascript" formControlName="javascript"
747 [ngClass]="{ 'input-error': formErrors['instance.customizations.javascript'] }"
748 ></textarea>
749
750 <div *ngIf="formErrors.instance.customizations.javascript" class="form-error">{{ formErrors.instance.customizations.javascript }}</div>
751 </div>
421d935d 752
482fa503
RK
753 <div class="form-group">
754 <label for="customizationCSS">CSS</label>
755
756 <my-help>
757 <ng-template ptTemplate="customHtml">
758 <ng-container i18n>
759 Write CSS code directly. Example:<br /><br />
760 <pre>
761 #custom-css {{ '{' }}
762 color: red;
763 {{ '}' }}
764 </pre>
765 Prepend with <em>#custom-css</em> to override styles. Example:<br /><br />
766 <pre>
767 #custom-css .logged-in-email {{ '{' }}
768 color: red;
769 {{ '}' }}
770 </pre>
771 </ng-container>
772 </ng-template>
773 </my-help>
774
775 <textarea
776 id="customizationCSS" formControlName="css"
777 [ngClass]="{ 'input-error': formErrors['instance.customizations.css'] }"
778 ></textarea>
779 <div *ngIf="formErrors.instance.customizations.css" class="form-error">{{ formErrors.instance.customizations.css }}</div>
780 </div>
781 </ng-container>
782 </ng-container>
421d935d 783
482fa503
RK
784 </div>
785 </div>
63347a0f 786
63347a0f
C
787 </ng-template>
788 </ngb-tab>
789 </ngb-tabset>
00b5556c 790
482fa503
RK
791 <div class="form-row mt-4"> <!-- submit placement block -->
792 <div class="col-md-7 col-xl-5"></div>
793 <div class="col-md-5 col-xl-5">
794 <input (click)="formValidated()" type="submit" i18n-value value="Update configuration" [disabled]="!form.valid">
795 <span class="form-error" i18n *ngIf="!form.valid">It seems like the configuration is invalid. Please search for potential errors in the different tabs.</span>
796 </div>
797 </div>
fd206f0b 798</form>