]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - client/src/app/+admin/config/edit-custom-config/edit-basic-configuration.component.html
728185195098d18adf199828061c5e46189d72af
[github/Chocobozzz/PeerTube.git] / client / src / app / +admin / config / edit-custom-config / edit-basic-configuration.component.html
1 <ng-container [formGroup]="form">
2 <div class="row mt-5"> <!-- appearance grid -->
3 <div class="col-12 col-lg-4 col-xl-3">
4 <div i18n class="inner-form-title">APPEARANCE</div>
5 <div i18n class="inner-form-description">
6 Use <a class="link-orange" routerLink="/admin/plugins">plugins & themes</a> for more involved changes, or add slight <a class="link-orange" routerLink="/admin/config/edit-custom" fragment="advanced-configuration">customizations</a>.
7 </div>
8 </div>
9
10 <div class="col-12 col-lg-8 col-xl-9">
11
12 <ng-container formGroupName="theme">
13 <div class="form-group">
14 <label i18n for="themeDefault">Theme</label>
15
16 <div class="peertube-select-container">
17 <select formControlName="default" id="themeDefault" class="form-control">
18 <option i18n value="default">{{ getDefaultThemeLabel() }}</option>
19
20 <option *ngFor="let theme of availableThemes" [value]="theme.id">{{ theme.label }}</option>
21 </select>
22 </div>
23 </div>
24 </ng-container>
25
26 <div class="form-group" formGroupName="instance">
27 <label i18n for="instanceDefaultClientRoute">Landing page</label>
28
29 <my-select-custom-value
30 id="instanceDefaultClientRoute"
31 [items]="defaultLandingPageOptions"
32 formControlName="defaultClientRoute"
33 inputType="text"
34 [clearable]="false"
35 ></my-select-custom-value>
36
37 <div *ngIf="formErrors.instance.defaultClientRoute" class="form-error">{{ formErrors.instance.defaultClientRoute }}</div>
38 </div>
39
40 <div class="form-group" formGroupName="trending">
41 <ng-container formGroupName="videos">
42 <ng-container formGroupName="algorithms">
43 <label i18n for="trendingVideosAlgorithmsDefault">Default trending page</label>
44
45 <div class="peertube-select-container">
46 <select id="trendingVideosAlgorithmsDefault" formControlName="default" class="form-control">
47 <option i18n value="hot">Hot videos</option>
48 <option i18n value="most-viewed">Most viewed videos</option>
49 <option i18n value="most-liked">Most liked videos</option>
50 </select>
51 </div>
52
53 <div *ngIf="formErrors.trending.videos.algorithms.default" class="form-error">{{ formErrors.trending.videos.algorithms.default }}</div>
54 </ng-container>
55 </ng-container>
56 </div>
57
58 <ng-container formGroupName="client">
59
60 <ng-container formGroupName="videos">
61 <ng-container formGroupName="miniature">
62 <div class="form-group">
63 <my-peertube-checkbox
64 inputName="clientVideosMiniaturePreferAuthorDisplayName" formControlName="preferAuthorDisplayName"
65 i18n-labelText labelText="Prefer author display name in video miniature"
66 ></my-peertube-checkbox>
67 </div>
68 </ng-container>
69 </ng-container>
70
71 <ng-container formGroupName="menu">
72 <ng-container formGroupName="login">
73 <div class="form-group">
74 <my-peertube-checkbox
75 inputName="clientMenuLoginRedirectOnSingleExternalAuth" formControlName="redirectOnSingleExternalAuth"
76 i18n-labelText labelText="Redirect users on single external auth when users click on the login button in menu"
77 >
78 <ng-container ngProjectAs="description">
79 <span *ngIf="countExternalAuth() === 0" i18n>⚠️ You don't have any external auth plugin enabled.</span>
80 <span *ngIf="countExternalAuth() > 1" i18n>⚠️ You have multiple external auth plugins enabled.</span>
81 </ng-container>
82 </my-peertube-checkbox>
83 </div>
84 </ng-container>
85 </ng-container>
86 </ng-container>
87
88 </div>
89 </div>
90
91 <div class="row mt-4"> <!-- broadcast grid -->
92 <div class="col-12 col-lg-4 col-xl-3">
93 <div i18n class="inner-form-title">BROADCAST MESSAGE</div>
94 <div i18n class="inner-form-description">
95 Display a message on your instance
96 </div>
97 </div>
98
99 <div class="col-12 col-lg-8 col-xl-9">
100
101 <ng-container formGroupName="broadcastMessage">
102
103 <div class="form-group">
104 <my-peertube-checkbox
105 inputName="broadcastMessageEnabled" formControlName="enabled"
106 i18n-labelText labelText="Enable broadcast message"
107 ></my-peertube-checkbox>
108 </div>
109
110 <div class="form-group">
111 <my-peertube-checkbox
112 inputName="broadcastMessageDismissable" formControlName="dismissable"
113 i18n-labelText labelText="Allow users to dismiss the broadcast message "
114 ></my-peertube-checkbox>
115 </div>
116
117 <div class="form-group">
118 <label i18n for="broadcastMessageLevel">Broadcast message level</label>
119
120 <div class="peertube-select-container">
121 <select id="broadcastMessageLevel" formControlName="level" class="form-control">
122 <option value="info">info</option>
123 <option value="warning">warning</option>
124 <option value="error">error</option>
125 </select>
126 </div>
127
128 <div *ngIf="formErrors.broadcastMessage.level" class="form-error">{{ formErrors.broadcastMessage.level }}</div>
129 </div>
130
131 <div class="form-group">
132 <label i18n for="broadcastMessageMessage">Message</label><my-help helpType="markdownText"></my-help>
133
134 <my-markdown-textarea
135 name="broadcastMessageMessage" formControlName="message"
136 [formError]="formErrors['broadcastMessage.message']"
137 ></my-markdown-textarea>
138
139 <div *ngIf="formErrors.broadcastMessage.message" class="form-error">{{ formErrors.broadcastMessage.message }}</div>
140 </div>
141
142 </ng-container>
143
144 </div>
145 </div>
146
147 <div class="row mt-4"> <!-- new users grid -->
148 <div class="col-12 col-lg-4 col-xl-3">
149 <div i18n class="inner-form-title">NEW USERS</div>
150 <div i18n class="inner-form-description">
151 Manage <a class="link-orange" routerLink="/admin/users">users</a> to set their quota individually.
152 </div>
153 </div>
154
155 <div class="col-12 col-lg-8 col-xl-9">
156
157 <ng-container formGroupName="signup">
158 <div class="form-group">
159 <my-peertube-checkbox
160 inputName="signupEnabled" formControlName="enabled"
161 i18n-labelText labelText="Enable Signup"
162 >
163 <ng-container ngProjectAs="description">
164 <span i18n>⚠️ This functionality requires a lot of attention and extra moderation.</span>
165
166 <div class="alert pt-alert-primary alert-signup" *ngIf="signupAlertMessage">{{ signupAlertMessage }}</div>
167 </ng-container>
168
169 <ng-container ngProjectAs="extra">
170 <my-peertube-checkbox [ngClass]="getDisabledSignupClass()"
171 inputName="signupRequiresEmailVerification" formControlName="requiresEmailVerification"
172 i18n-labelText labelText="Signup requires email verification"
173 ></my-peertube-checkbox>
174
175 <div [ngClass]="getDisabledSignupClass()" class="mt-3">
176 <label i18n for="signupLimit">Signup limit</label>
177
178 <div class="number-with-unit">
179 <input
180 type="number" min="-1" id="signupLimit" class="form-control"
181 formControlName="limit" [ngClass]="{ 'input-error': formErrors['signup.limit'] }"
182 >
183 <span i18n>{form.value['signup']['limit'], plural, =1 {user} other {users}}</span>
184 </div>
185
186 <div *ngIf="formErrors.signup.limit" class="form-error">{{ formErrors.signup.limit }}</div>
187
188 <small i18n *ngIf="hasUnlimitedSignup()" class="muted small">Signup won't be limited to a fixed number of users.</small>
189 </div>
190
191 <div [ngClass]="getDisabledSignupClass()" class="mt-3">
192 <label i18n for="signupMinimumAge">Minimum required age to create an account</label>
193
194 <div class="number-with-unit">
195 <input
196 type="number" min="1" id="signupMinimumAge" class="form-control"
197 formControlName="minimumAge" [ngClass]="{ 'input-error': formErrors['signup.minimumAge'] }"
198 >
199 <span i18n>{form.value['signup']['minimumAge'], plural, =1 {year old} other {years old}}</span>
200 </div>
201
202 <div *ngIf="formErrors.signup.minimumAge" class="form-error">{{ formErrors.signup.minimumAge }}</div>
203 </div>
204 </ng-container>
205 </my-peertube-checkbox>
206 </div>
207 </ng-container>
208
209 <ng-container formGroupName="user">
210 <div class="form-group">
211 <label i18n for="userVideoQuota">Default video quota per user</label>
212
213 <my-select-custom-value
214 id="userVideoQuota"
215 [items]="getVideoQuotaOptions()"
216 formControlName="videoQuota"
217 i18n-inputSuffix inputSuffix="bytes" inputType="number"
218 [clearable]="false"
219 ></my-select-custom-value>
220
221 <div i18n class="transcoding-information" *ngIf="isTranscodingInformationDisplayed()">
222 Transcoding is enabled. The video quota only takes into account <strong>original</strong> video size. <br />
223 At most, a user could upload ~ {{ computeQuotaWithTranscoding() | bytes: 0 }}.
224 </div>
225
226 <div *ngIf="formErrors.user.videoQuota" class="form-error">{{ formErrors.user.videoQuota }}</div>
227 </div>
228
229 <div class="form-group">
230 <label i18n for="userVideoQuotaDaily">Default daily upload limit per user</label>
231
232 <my-select-custom-value
233 id="userVideoQuotaDaily"
234 [items]="getVideoQuotaDailyOptions()"
235 formControlName="videoQuotaDaily"
236 i18n-inputSuffix inputSuffix="bytes" inputType="number"
237 [clearable]="false"
238 ></my-select-custom-value>
239
240 <div *ngIf="formErrors.user.videoQuotaDaily" class="form-error">{{ formErrors.user.videoQuotaDaily }}</div>
241 </div>
242 </ng-container>
243
244 </div>
245 </div>
246
247 <div class="row mt-4"> <!-- videos grid -->
248 <div class="col-12 col-lg-4 col-xl-3">
249 <div i18n class="inner-form-title">VIDEOS</div>
250 </div>
251
252 <div class="col-12 col-lg-8 col-xl-9">
253
254 <ng-container formGroupName="import">
255
256 <ng-container formGroupName="videos">
257
258 <div class="form-group">
259 <label i18n for="importConcurrency">Import jobs concurrency</label>
260 <span i18n class="small muted ms-1">allows to import multiple videos in parallel. ⚠️ Requires a PeerTube restart.</span>
261
262 <div class="number-with-unit">
263 <input type="number" name="importConcurrency" formControlName="concurrency" />
264 <span i18n>jobs in parallel</span>
265 </div>
266
267 <div *ngIf="formErrors.import.concurrency" class="form-error">{{ formErrors.import.concurrency }}</div>
268 </div>
269
270 <div class="form-group" formGroupName="http">
271 <my-peertube-checkbox
272 inputName="importVideosHttpEnabled" formControlName="enabled"
273 i18n-labelText labelText="Allow import with HTTP URL (e.g. YouTube)"
274 >
275 <ng-container ngProjectAs="description">
276 <span i18n>⚠️ If enabled, we recommend to use <a class="link-orange" href="https://docs.joinpeertube.org/maintain-configuration?id=security">a HTTP proxy</a> to prevent private URL access from your PeerTube server</span>
277 </ng-container>
278 </my-peertube-checkbox>
279 </div>
280
281 <div class="form-group" formGroupName="torrent">
282 <my-peertube-checkbox
283 inputName="importVideosTorrentEnabled" formControlName="enabled"
284 i18n-labelText labelText="Allow import with a torrent file or a magnet URI"
285 >
286 <ng-container ngProjectAs="description">
287 <span i18n>⚠️ We don't recommend to enable this feature if you don't trust your users</span>
288 </ng-container>
289 </my-peertube-checkbox>
290 </div>
291
292 </ng-container>
293
294 <ng-container formGroupName="videoChannelSynchronization">
295 <div class="form-group">
296 <my-peertube-checkbox
297 inputName="importSynchronizationEnabled" formControlName="enabled"
298 i18n-labelText labelText="Allow channel synchronization with channel of other platforms like YouTube (requires allowing import with HTTP URL)"
299 >
300 <ng-container ngProjectAs="description">
301 <span i18n [hidden]="isImportVideosHttpEnabled()">
302 ⛔ You need to allow import with HTTP URL to be able to activate this feature.
303 </span>
304 </ng-container>
305 </my-peertube-checkbox>
306 </div>
307 </ng-container>
308
309 </ng-container>
310
311 <ng-container formGroupName="autoBlacklist">
312 <ng-container formGroupName="videos">
313 <ng-container formGroupName="ofUsers">
314
315 <div class="form-group">
316 <my-peertube-checkbox
317 inputName="autoBlacklistVideosOfUsersEnabled" formControlName="enabled"
318 i18n-labelText labelText="Block new videos automatically"
319 >
320 <ng-container ngProjectAs="description">
321 <span i18n>Unless a user is marked as trusted, their videos will stay private until a moderator reviews them.</span>
322 </ng-container>
323 </my-peertube-checkbox>
324 </div>
325
326 </ng-container>
327 </ng-container>
328 </ng-container>
329
330 </div>
331 </div>
332
333 <div class="row mt-4"> <!-- video channels grid -->
334 <div class="col-12 col-lg-4 col-xl-3">
335 <div i18n class="inner-form-title">VIDEO CHANNELS</div>
336 </div>
337
338 <div class="col-12 col-lg-8 col-xl-9">
339 <div class="form-group" formGroupName="videoChannels">
340 <label i18n for="videoChannelsMaxPerUser">Max video channels per user</label>
341
342 <div class="number-with-unit">
343 <input
344 type="number" min="1" id="videoChannelsMaxPerUser" class="form-control"
345 formControlName="maxPerUser" [ngClass]="{ 'input-error': formErrors['videoChannels.maxPerUser'] }"
346 >
347 <span i18n>{form.value['videoChannels']['maxPerUser'], plural, =1 {channel} other {channels}}</span>
348 </div>
349
350 <div *ngIf="formErrors.videoChannels.maxPerUser" class="form-error">{{ formErrors.videoChannels.maxPerUser }}</div>
351 </div>
352 </div>
353 </div>
354
355 <div class="row mt-4"> <!-- search grid -->
356 <div class="col-12 col-lg-4 col-xl-3">
357 <div i18n class="inner-form-title">SEARCH</div>
358 </div>
359
360 <div class="col-12 col-lg-8 col-xl-9">
361
362 <ng-container formGroupName="search">
363 <ng-container formGroupName="remoteUri">
364
365 <div class="form-group">
366 <my-peertube-checkbox
367 inputName="searchRemoteUriUsers" formControlName="users"
368 i18n-labelText labelText="Allow users to do remote URI/handle search"
369 >
370 <ng-container ngProjectAs="description">
371 <span i18n>Allow <strong>your users</strong> to look up remote videos/actors that may not be federated with your instance</span>
372 </ng-container>
373 </my-peertube-checkbox>
374 </div>
375
376 <div class="form-group">
377 <my-peertube-checkbox
378 inputName="searchRemoteUriAnonymous" formControlName="anonymous"
379 i18n-labelText labelText="Allow anonymous to do remote URI/handle search"
380 >
381 <ng-container ngProjectAs="description">
382 <span i18n>Allow <strong>anonymous users</strong> to look up remote videos/actors that may not be federated with your instance</span>
383 </ng-container>
384 </my-peertube-checkbox>
385 </div>
386
387 </ng-container>
388
389 <ng-container formGroupName="searchIndex">
390 <div class="form-group">
391 <my-peertube-checkbox
392 inputName="searchIndexEnabled" formControlName="enabled"
393 i18n-labelText labelText="Enable global search"
394 >
395 <ng-container ngProjectAs="description">
396 <div i18n>⚠️ This functionality depends heavily on the moderation of instances followed by the search index you select.</div>
397
398 <div i18n>
399 You should only use moderated search indexes in production, or <a class="link-orange" href="https://framagit.org/framasoft/peertube/search-index">host your own</a>.
400 </div>
401 </ng-container>
402
403 <ng-container ngProjectAs="extra">
404 <div [ngClass]="getDisabledSearchIndexClass()">
405 <label i18n for="searchIndexUrl">Search index URL</label>
406
407 <input
408 type="text" id="searchIndexUrl" class="form-control"
409 formControlName="url" [ngClass]="{ 'input-error': formErrors['search.searchIndex.url'] }"
410 >
411
412 <div *ngIf="formErrors.search.searchIndex.url" class="form-error">{{ formErrors.search.searchIndex.url }}</div>
413 </div>
414
415 <div class="mt-3">
416 <my-peertube-checkbox [ngClass]="getDisabledSearchIndexClass()"
417 inputName="searchIndexDisableLocalSearch" formControlName="disableLocalSearch"
418 i18n-labelText labelText="Disable local search in search bar"
419 ></my-peertube-checkbox>
420 </div>
421
422 <div class="mt-3">
423 <my-peertube-checkbox [ngClass]="getDisabledSearchIndexClass()"
424 inputName="searchIndexIsDefaultSearch" formControlName="isDefaultSearch"
425 i18n-labelText labelText="Search bar uses the global search index by default"
426 >
427 <ng-container ngProjectAs="description">
428 <span i18n>Otherwise the local search stays used by default</span>
429 </ng-container>
430 </my-peertube-checkbox>
431 </div>
432
433 </ng-container>
434 </my-peertube-checkbox>
435 </div>
436
437 </ng-container>
438
439 </ng-container>
440
441 </div>
442 </div>
443
444 <div class="row mt-4"> <!-- federation grid -->
445 <div class="col-12 col-lg-4 col-xl-3">
446 <div i18n class="inner-form-title">FEDERATION</div>
447 <div i18n class="inner-form-description">
448 Manage <a class="link-orange" routerLink="/admin/follows">relations</a> with other instances.
449 </div>
450 </div>
451
452 <div class="col-12 col-lg-8 col-xl-9">
453
454 <ng-container formGroupName="followers">
455 <ng-container formGroupName="instance">
456
457 <div class="form-group">
458 <my-peertube-checkbox
459 inputName="followersInstanceEnabled" formControlName="enabled"
460 i18n-labelText labelText="Other instances can follow yours"
461 ></my-peertube-checkbox>
462 </div>
463
464 <div class="form-group">
465 <my-peertube-checkbox
466 inputName="followersInstanceManualApproval" formControlName="manualApproval"
467 i18n-labelText labelText="Manually approve new instance followers"
468 ></my-peertube-checkbox>
469 </div>
470 </ng-container>
471 </ng-container>
472
473 <ng-container formGroupName="followings">
474 <ng-container formGroupName="instance">
475
476 <ng-container formGroupName="autoFollowBack">
477 <div class="form-group">
478 <my-peertube-checkbox
479 inputName="followingsInstanceAutoFollowBackEnabled" formControlName="enabled"
480 i18n-labelText labelText="Automatically follow back instances"
481 >
482 <ng-container ngProjectAs="description">
483 <span i18n>⚠️ This functionality requires a lot of attention and extra moderation.</span>
484 </ng-container>
485 </my-peertube-checkbox>
486 </div>
487 </ng-container>
488
489 <ng-container formGroupName="autoFollowIndex">
490 <div class="form-group">
491 <my-peertube-checkbox
492 inputName="followingsInstanceAutoFollowIndexEnabled" formControlName="enabled"
493 i18n-labelText labelText="Automatically follow instances of a public index"
494 >
495 <ng-container ngProjectAs="description">
496 <div i18n>⚠️ This functionality requires a lot of attention and extra moderation.</div>
497
498 <span i18n>
499 See <a class="link-orange" href="https://docs.joinpeertube.org/admin-following-instances?id=automatically-follow-other-instances" rel="noopener noreferrer" target="_blank">the documentation</a> for more information about the expected URL
500 </span>
501 </ng-container>
502
503 <ng-container ngProjectAs="extra">
504 <div [ngClass]="{ 'disabled-checkbox-extra': !isAutoFollowIndexEnabled() }">
505 <label i18n for="followingsInstanceAutoFollowIndexUrl">Index URL</label>
506 <input
507 type="text" id="followingsInstanceAutoFollowIndexUrl" class="form-control"
508 formControlName="indexUrl" [ngClass]="{ 'input-error': formErrors['followings.instance.autoFollowIndex.indexUrl'] }"
509 >
510 <div *ngIf="formErrors.followings.instance.autoFollowIndex.indexUrl" class="form-error">{{ formErrors.followings.instance.autoFollowIndex.indexUrl }}</div>
511 </div>
512 </ng-container>
513 </my-peertube-checkbox>
514 </div>
515
516 </ng-container>
517 </ng-container>
518 </ng-container>
519
520 </div>
521 </div>
522
523 <div class="row mt-4"> <!-- administrators grid -->
524 <div class="col-12 col-lg-4 col-xl-3">
525 <div i18n class="inner-form-title">ADMINISTRATORS</div>
526 </div>
527
528 <div class="col-12 col-lg-8 col-xl-9">
529
530 <div class="form-group" formGroupName="admin">
531 <label i18n for="adminEmail">Admin email</label>
532
533 <input
534 type="text" id="adminEmail" class="form-control"
535 formControlName="email" [ngClass]="{ 'input-error': formErrors['admin.email'] }"
536 >
537
538 <div *ngIf="formErrors.admin.email" class="form-error">{{ formErrors.admin.email }}</div>
539 </div>
540
541 <div class="form-group" formGroupName="contactForm">
542 <my-peertube-checkbox
543 inputName="enableContactForm" formControlName="enabled"
544 i18n-labelText labelText="Enable contact form"
545 ></my-peertube-checkbox>
546 </div>
547
548 </div>
549 </div>
550
551 <div class="row mt-4"> <!-- Twitter grid -->
552 <div class="col-12 col-lg-4 col-xl-3">
553 <div i18n class="inner-form-title">TWITTER</div>
554 <div i18n class="inner-form-description">
555 Provide the Twitter account representing your instance to improve link previews.
556 If you don't have a Twitter account, just leave the default value.
557 </div>
558 </div>
559
560 <div class="col-12 col-lg-8 col-xl-9">
561
562 <ng-container formGroupName="services">
563 <ng-container formGroupName="twitter">
564
565 <div class="form-group">
566 <label for="servicesTwitterUsername" i18n>Your Twitter username</label>
567
568 <input
569 type="text" id="servicesTwitterUsername" class="form-control"
570 formControlName="username" [ngClass]="{ 'input-error': formErrors['services.twitter.username'] }"
571 >
572
573 <div *ngIf="formErrors.services.twitter.username" class="form-error">{{ formErrors.services.twitter.username }}</div>
574 </div>
575
576 <div class="form-group">
577 <my-peertube-checkbox inputName="servicesTwitterWhitelisted" formControlName="whitelisted">
578 <ng-template ptTemplate="label">
579 <ng-container i18n>Instance allowed by Twitter</ng-container>
580 </ng-template>
581
582 <ng-template ptTemplate="help">
583 <ng-container i18n>
584 If your instance is explicitly allowed by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.<br />
585 If the instance is not, we use an image link card that will redirect to your PeerTube instance.<br /><br />
586 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/w/blabla) on
587 <a class="link-orange" target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a>
588 to see if you instance is allowed.
589 </ng-container>
590 </ng-template>
591 </my-peertube-checkbox>
592 </div>
593
594 </ng-container>
595 </ng-container>
596
597 </div>
598 </div>
599 </ng-container>