]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - client/src/app/+admin/config/edit-custom-config/edit-basic-configuration.component.html
Migrate to bootstrap 5
[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 routerLink="/admin/plugins">plugins & themes</a> for more involved changes, or <a routerLink="/admin/config/edit-custom" fragment="advanced-configuration">add slight 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">default</option>
19
20 <option *ngFor="let theme of getAvailableThemes()" [value]="theme">{{ theme }}</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-for-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" textareaMaxWidth="500px"
136 [classes]="{ 'input-error': 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-for-description">
151 Manage <a 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 alert-info 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">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 *ngIf="formErrors.user.videoQuota" class="form-error">{{ formErrors.user.videoQuota }}</div>
222 </div>
223
224 <div class="form-group">
225 <label i18n for="userVideoQuotaDaily">Default daily upload limit per user</label>
226
227 <my-select-custom-value
228 id="userVideoQuotaDaily"
229 [items]="getVideoQuotaDailyOptions()"
230 formControlName="videoQuotaDaily"
231 i18n-inputSuffix inputSuffix="bytes" inputType="number"
232 [clearable]="false"
233 ></my-select-custom-value>
234
235 <div *ngIf="formErrors.user.videoQuotaDaily" class="form-error">{{ formErrors.user.videoQuotaDaily }}</div>
236 </div>
237 </ng-container>
238
239 </div>
240 </div>
241
242 <div class="row mt-4"> <!-- videos grid -->
243 <div class="col-12 col-lg-4 col-xl-3">
244 <div i18n class="inner-form-title">VIDEOS</div>
245 </div>
246
247 <div class="col-12 col-lg-8 col-xl-9">
248
249 <ng-container formGroupName="import">
250
251 <ng-container formGroupName="videos">
252
253 <div class="form-group">
254 <label i18n for="importConcurrency">Import jobs concurrency</label>
255 <span i18n class="muted ms-1">allows to import multiple videos in parallel. ⚠️ Requires a PeerTube restart.</span>
256
257 <div class="number-with-unit">
258 <input type="number" name="importConcurrency" formControlName="concurrency" />
259 <span i18n>jobs in parallel</span>
260 </div>
261
262 <div *ngIf="formErrors.import.concurrency" class="form-error">{{ formErrors.import.concurrency }}</div>
263 </div>
264
265 <div class="form-group" formGroupName="http">
266 <my-peertube-checkbox
267 inputName="importVideosHttpEnabled" formControlName="enabled"
268 i18n-labelText labelText="Allow import with HTTP URL (e.g. YouTube)"
269 >
270 <ng-container ngProjectAs="description">
271 <span i18n>⚠️ If enabled, we recommend to use <a href="https://docs.joinpeertube.org/maintain-configuration?id=security">a HTTP proxy</a> to prevent private URL access from your PeerTube server</span>
272 </ng-container>
273 </my-peertube-checkbox>
274 </div>
275
276 <div class="form-group" formGroupName="torrent">
277 <my-peertube-checkbox
278 inputName="importVideosTorrentEnabled" formControlName="enabled"
279 i18n-labelText labelText="Allow import with a torrent file or a magnet URI"
280 >
281 <ng-container ngProjectAs="description">
282 <span i18n>⚠️ We don't recommend to enable this feature if you don't trust your users</span>
283 </ng-container>
284 </my-peertube-checkbox>
285 </div>
286
287 </ng-container>
288 </ng-container>
289
290 <ng-container formGroupName="autoBlacklist">
291 <ng-container formGroupName="videos">
292 <ng-container formGroupName="ofUsers">
293
294 <div class="form-group">
295 <my-peertube-checkbox
296 inputName="autoBlacklistVideosOfUsersEnabled" formControlName="enabled"
297 i18n-labelText labelText="Block new videos automatically"
298 >
299 <ng-container ngProjectAs="description">
300 <span i18n>Unless a user is marked as trusted, their videos will stay private until a moderator reviews them.</span>
301 </ng-container>
302 </my-peertube-checkbox>
303 </div>
304
305 </ng-container>
306 </ng-container>
307 </ng-container>
308
309 </div>
310 </div>
311
312 <div class="row mt-4"> <!-- video channels grid -->
313 <div class="col-12 col-lg-4 col-xl-3">
314 <div i18n class="inner-form-title">VIDEO CHANNELS</div>
315 </div>
316
317 <div class="col-12 col-lg-8 col-xl-9">
318 <div class="form-group" formGroupName="videoChannels">
319 <label i18n for="videoChannelsMaxPerUser">Max video channels per user</label>
320
321 <div class="number-with-unit">
322 <input
323 type="number" min="1" id="videoChannelsMaxPerUser" class="form-control"
324 formControlName="maxPerUser" [ngClass]="{ 'input-error': formErrors['videoChannels.maxPerUser'] }"
325 >
326 <span i18n>{form.value['videoChannels']['maxPerUser'], plural, =1 {channel} other {channels}}</span>
327 </div>
328
329 <div *ngIf="formErrors.videoChannels.maxPerUser" class="form-error">{{ formErrors.videoChannels.maxPerUser }}</div>
330 </div>
331 </div>
332 </div>
333
334 <div class="row mt-4"> <!-- search grid -->
335 <div class="col-12 col-lg-4 col-xl-3">
336 <div i18n class="inner-form-title">SEARCH</div>
337 </div>
338
339 <div class="col-12 col-lg-8 col-xl-9">
340
341 <ng-container formGroupName="search">
342 <ng-container formGroupName="remoteUri">
343
344 <div class="form-group">
345 <my-peertube-checkbox
346 inputName="searchRemoteUriUsers" formControlName="users"
347 i18n-labelText labelText="Allow users to do remote URI/handle search"
348 >
349 <ng-container ngProjectAs="description">
350 <span i18n>Allow <strong>your users</strong> to look up remote videos/actors that may not be federated with your instance</span>
351 </ng-container>
352 </my-peertube-checkbox>
353 </div>
354
355 <div class="form-group">
356 <my-peertube-checkbox
357 inputName="searchRemoteUriAnonymous" formControlName="anonymous"
358 i18n-labelText labelText="Allow anonymous to do remote URI/handle search"
359 >
360 <ng-container ngProjectAs="description">
361 <span i18n>Allow <strong>anonymous users</strong> to look up remote videos/actors that may not be federated with your instance</span>
362 </ng-container>
363 </my-peertube-checkbox>
364 </div>
365
366 </ng-container>
367
368 <ng-container formGroupName="searchIndex">
369 <div class="form-group">
370 <my-peertube-checkbox
371 inputName="searchIndexEnabled" formControlName="enabled"
372 i18n-labelText labelText="Enable global search"
373 >
374 <ng-container ngProjectAs="description">
375 <p i18n>⚠️ This functionality depends heavily on the moderation of instances followed by the search index you select.</p>
376
377 <span i18n>
378 You should only use moderated search indexes in production, or <a href="https://framagit.org/framasoft/peertube/search-index">host your own</a>.
379 </span>
380 </ng-container>
381
382 <ng-container ngProjectAs="extra">
383 <div [ngClass]="getDisabledSearchIndexClass()">
384 <label i18n for="searchIndexUrl">Search index URL</label>
385
386 <input
387 type="text" id="searchIndexUrl" class="form-control"
388 formControlName="url" [ngClass]="{ 'input-error': formErrors['search.searchIndex.url'] }"
389 >
390
391 <div *ngIf="formErrors.search.searchIndex.url" class="form-error">{{ formErrors.search.searchIndex.url }}</div>
392 </div>
393
394 <div class="mt-3">
395 <my-peertube-checkbox [ngClass]="getDisabledSearchIndexClass()"
396 inputName="searchIndexDisableLocalSearch" formControlName="disableLocalSearch"
397 i18n-labelText labelText="Disable local search in search bar"
398 ></my-peertube-checkbox>
399 </div>
400
401 <div class="mt-3">
402 <my-peertube-checkbox [ngClass]="getDisabledSearchIndexClass()"
403 inputName="searchIndexIsDefaultSearch" formControlName="isDefaultSearch"
404 i18n-labelText labelText="Search bar uses the global search index by default"
405 >
406 <ng-container ngProjectAs="description">
407 <span i18n>Otherwise the local search stays used by default</span>
408 </ng-container>
409 </my-peertube-checkbox>
410 </div>
411
412 </ng-container>
413 </my-peertube-checkbox>
414 </div>
415
416 </ng-container>
417
418 </ng-container>
419
420 </div>
421 </div>
422
423 <div class="row mt-4"> <!-- federation grid -->
424 <div class="col-12 col-lg-4 col-xl-3">
425 <div i18n class="inner-form-title">FEDERATION</div>
426 <div i18n class="inner-form-description">
427 Manage <a routerLink="/admin/follows">relations</a> with other instances.
428 </div>
429 </div>
430
431 <div class="col-12 col-lg-8 col-xl-9">
432
433 <ng-container formGroupName="followers">
434 <ng-container formGroupName="instance">
435
436 <div class="form-group">
437 <my-peertube-checkbox
438 inputName="followersInstanceEnabled" formControlName="enabled"
439 i18n-labelText labelText="Other instances can follow yours"
440 ></my-peertube-checkbox>
441 </div>
442
443 <div class="form-group">
444 <my-peertube-checkbox
445 inputName="followersInstanceManualApproval" formControlName="manualApproval"
446 i18n-labelText labelText="Manually approve new instance followers"
447 ></my-peertube-checkbox>
448 </div>
449 </ng-container>
450 </ng-container>
451
452 <ng-container formGroupName="followings">
453 <ng-container formGroupName="instance">
454
455 <ng-container formGroupName="autoFollowBack">
456 <div class="form-group">
457 <my-peertube-checkbox
458 inputName="followingsInstanceAutoFollowBackEnabled" formControlName="enabled"
459 i18n-labelText labelText="Automatically follow back instances"
460 >
461 <ng-container ngProjectAs="description">
462 <span i18n>⚠️ This functionality requires a lot of attention and extra moderation.</span>
463 </ng-container>
464 </my-peertube-checkbox>
465 </div>
466 </ng-container>
467
468 <ng-container formGroupName="autoFollowIndex">
469 <div class="form-group">
470 <my-peertube-checkbox
471 inputName="followingsInstanceAutoFollowIndexEnabled" formControlName="enabled"
472 i18n-labelText labelText="Automatically follow instances of a public index"
473 >
474 <ng-container ngProjectAs="description">
475 <p i18n>⚠️ This functionality requires a lot of attention and extra moderation.</p>
476
477 <span i18n>
478 See <a 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
479 </span>
480 </ng-container>
481
482 <ng-container ngProjectAs="extra">
483 <div [ngClass]="{ 'disabled-checkbox-extra': !isAutoFollowIndexEnabled() }">
484 <label i18n for="followingsInstanceAutoFollowIndexUrl">Index URL</label>
485 <input
486 type="text" id="followingsInstanceAutoFollowIndexUrl" class="form-control"
487 formControlName="indexUrl" [ngClass]="{ 'input-error': formErrors['followings.instance.autoFollowIndex.indexUrl'] }"
488 >
489 <div *ngIf="formErrors.followings.instance.autoFollowIndex.indexUrl" class="form-error">{{ formErrors.followings.instance.autoFollowIndex.indexUrl }}</div>
490 </div>
491 </ng-container>
492 </my-peertube-checkbox>
493 </div>
494
495 </ng-container>
496 </ng-container>
497 </ng-container>
498
499 </div>
500 </div>
501
502 <div class="row mt-4"> <!-- administrators grid -->
503 <div class="col-12 col-lg-4 col-xl-3">
504 <div i18n class="inner-form-title">ADMINISTRATORS</div>
505 </div>
506
507 <div class="col-12 col-lg-8 col-xl-9">
508
509 <div class="form-group" formGroupName="admin">
510 <label i18n for="adminEmail">Admin email</label>
511
512 <input
513 type="text" id="adminEmail" class="form-control"
514 formControlName="email" [ngClass]="{ 'input-error': formErrors['admin.email'] }"
515 >
516
517 <div *ngIf="formErrors.admin.email" class="form-error">{{ formErrors.admin.email }}</div>
518 </div>
519
520 <div class="form-group" formGroupName="contactForm">
521 <my-peertube-checkbox
522 inputName="enableContactForm" formControlName="enabled"
523 i18n-labelText labelText="Enable contact form"
524 ></my-peertube-checkbox>
525 </div>
526
527 </div>
528 </div>
529
530 <div class="row mt-4"> <!-- Twitter grid -->
531 <div class="col-12 col-lg-4 col-xl-3">
532 <div i18n class="inner-form-title">TWITTER</div>
533 <div i18n class="inner-form-description">
534 Provide the Twitter account representing your instance to improve link previews.
535 If you don't have a Twitter account, just leave the default value.
536 </div>
537 </div>
538
539 <div class="col-12 col-lg-8 col-xl-9">
540
541 <ng-container formGroupName="services">
542 <ng-container formGroupName="twitter">
543
544 <div class="form-group">
545 <label for="servicesTwitterUsername" i18n>Your Twitter username</label>
546
547 <input
548 type="text" id="servicesTwitterUsername" class="form-control"
549 formControlName="username" [ngClass]="{ 'input-error': formErrors['services.twitter.username'] }"
550 >
551
552 <div *ngIf="formErrors.services.twitter.username" class="form-error">{{ formErrors.services.twitter.username }}</div>
553 </div>
554
555 <div class="form-group">
556 <my-peertube-checkbox inputName="servicesTwitterWhitelisted" formControlName="whitelisted">
557 <ng-template ptTemplate="label">
558 <ng-container i18n>Instance allowed by Twitter</ng-container>
559 </ng-template>
560
561 <ng-template ptTemplate="help">
562 <ng-container i18n>
563 If your instance is explicitly allowed by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.<br />
564 If the instance is not, we use an image link card that will redirect to your PeerTube instance.<br /><br />
565 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/w/blabla) on
566 <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a>
567 to see if you instance is allowed.
568 </ng-container>
569 </ng-template>
570 </my-peertube-checkbox>
571 </div>
572
573 </ng-container>
574 </ng-container>
575
576 </div>
577 </div>
578 </ng-container>