aboutsummaryrefslogtreecommitdiffhomepage
path: root/client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html
diff options
context:
space:
mode:
Diffstat (limited to 'client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html')
-rw-r--r--client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html480
1 files changed, 253 insertions, 227 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 e2cbd35ca..52eb00d93 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
@@ -7,161 +7,169 @@
7 7
8 <div i18n class="inner-form-title">Instance</div> 8 <div i18n class="inner-form-title">Instance</div>
9 9
10 <div class="form-group"> 10 <ng-container formGroupName="instance">
11 <label i18n for="instanceName">Name</label> 11 <div class="form-group">
12 <input 12 <label i18n for="instanceName">Name</label>
13 type="text" id="instanceName" 13 <input
14 formControlName="instanceName" [ngClass]="{ 'input-error': formErrors['instanceName'] }" 14 type="text" id="instanceName"
15 > 15 formControlName="name" [ngClass]="{ 'input-error': formErrors.instance.name }"
16 <div *ngIf="formErrors.instanceName" class="form-error"> 16 >
17 {{ formErrors.instanceName }} 17 <div *ngIf="formErrors.instance.name" class="form-error">{{ formErrors.instance.name }}</div>
18 </div> 18 </div>
19 </div>
20 19
21 <div class="form-group"> 20 <div class="form-group">
22 <label i18n for="instanceShortDescription">Short description</label> 21 <label i18n for="instanceShortDescription">Short description</label>
23 <textarea 22 <textarea
24 id="instanceShortDescription" formControlName="instanceShortDescription" 23 id="instanceShortDescription" formControlName="shortDescription"
25 [ngClass]="{ 'input-error': formErrors['instanceShortDescription'] }" 24 [ngClass]="{ 'input-error': formErrors['instance.shortDescription'] }"
26 ></textarea> 25 ></textarea>
27 <div *ngIf="formErrors.instanceShortDescription" class="form-error"> 26 <div *ngIf="formErrors.instance.shortDescription" class="form-error">{{ formErrors.instance.shortDescription }}</div>
28 {{ formErrors.instanceShortDescription }}
29 </div> 27 </div>
30 </div>
31 28
32 <div class="form-group"> 29 <div class="form-group">
33 <label i18n for="instanceDescription">Description</label><my-help helpType="markdownText"></my-help> 30 <label i18n for="instanceDescription">Description</label><my-help helpType="markdownText"></my-help>
34 <my-markdown-textarea 31 <my-markdown-textarea
35 id="instanceDescription" formControlName="instanceDescription" textareaWidth="500px" [previewColumn]="true" 32 id="instanceDescription" formControlName="description" textareaWidth="500px" [previewColumn]="true"
36 [classes]="{ 'input-error': formErrors['instanceDescription'] }" 33 [classes]="{ 'input-error': formErrors['instance.description'] }"
37 ></my-markdown-textarea> 34 ></my-markdown-textarea>
38 <div *ngIf="formErrors.instanceDescription" class="form-error"> 35 <div *ngIf="formErrors.instance.description" class="form-error">{{ formErrors.instance.description }}</div>
39 {{ formErrors.instanceDescription }}
40 </div> 36 </div>
41 </div>
42 37
43 <div class="form-group"> 38 <div class="form-group">
44 <label i18n for="instanceTerms">Terms</label><my-help helpType="markdownText"></my-help> 39 <label i18n for="instanceTerms">Terms</label><my-help helpType="markdownText"></my-help>
45 <my-markdown-textarea 40 <my-markdown-textarea
46 id="instanceTerms" formControlName="instanceTerms" textareaWidth="500px" [previewColumn]="true" 41 id="instanceTerms" formControlName="terms" textareaWidth="500px" [previewColumn]="true"
47 [ngClass]="{ 'input-error': formErrors['instanceTerms'] }" 42 [ngClass]="{ 'input-error': formErrors['instance.terms'] }"
48 ></my-markdown-textarea> 43 ></my-markdown-textarea>
49 <div *ngIf="formErrors.instanceTerms" class="form-error"> 44 <div *ngIf="formErrors.instance.terms" class="form-error">{{ formErrors.instance.terms }}</div>
50 {{ formErrors.instanceTerms }}
51 </div> 45 </div>
52 </div>
53 46
54 <div class="form-group"> 47 <div class="form-group">
55 <label i18n for="instanceDefaultClientRoute">Default client route</label> 48 <label i18n for="instanceDefaultClientRoute">Default client route</label>
56 <div class="peertube-select-container"> 49 <div class="peertube-select-container">
57 <select id="instanceDefaultClientRoute" formControlName="instanceDefaultClientRoute"> 50 <select id="instanceDefaultClientRoute" formControlName="defaultClientRoute">
58 <option i18n value="/videos/overview">Videos Overview</option> 51 <option i18n value="/videos/overview">Videos Overview</option>
59 <option i18n value="/videos/trending">Videos Trending</option> 52 <option i18n value="/videos/trending">Videos Trending</option>
60 <option i18n value="/videos/recently-added">Videos Recently Added</option> 53 <option i18n value="/videos/recently-added">Videos Recently Added</option>
61 <option i18n value="/videos/local">Local videos</option> 54 <option i18n value="/videos/local">Local videos</option>
62 </select> 55 </select>
56 </div>
57 <div *ngIf="formErrors.instance.defaultClientRoute" class="form-error">{{ formErrors.instance.defaultClientRoute }}</div>
63 </div> 58 </div>
64 <div *ngIf="formErrors.instanceDefaultClientRoute" class="form-error"> 59
65 {{ formErrors.instanceDefaultClientRoute }} 60 <div class="form-group">
61 <label i18n for="instanceDefaultNSFWPolicy">Policy on videos containing sensitive content</label>
62 <my-help
63 helpType="custom" i18n-customHtml
64 customHtml="With <strong>Do not list</strong> or <strong>Blur thumbnails</strong>, a confirmation will be requested to watch the video."
65 ></my-help>
66
67 <div class="peertube-select-container">
68 <select id="instanceDefaultNSFWPolicy" formControlName="defaultNSFWPolicy">
69 <option i18n value="do_not_list">Do not list</option>
70 <option i18n value="blur">Blur thumbnails</option>
71 <option i18n value="display">Display</option>
72 </select>
73 </div>
74 <div *ngIf="formErrors.instance.defaultNSFWPolicy" class="form-error">{{ formErrors.instance.defaultNSFWPolicy }}</div>
66 </div> 75 </div>
67 </div> 76 </ng-container>
68 77
69 <div class="form-group"> 78 <div i18n class="inner-form-title">Signup</div>
70 <label i18n for="instanceDefaultNSFWPolicy">Policy on videos containing sensitive content</label>
71 <my-help
72 helpType="custom" i18n-customHtml
73 customHtml="With <strong>Do not list</strong> or <strong>Blur thumbnails</strong>, a confirmation will be requested to watch the video."
74 ></my-help>
75 79
76 <div class="peertube-select-container"> 80 <ng-container formGroupName="signup">
77 <select id="instanceDefaultNSFWPolicy" formControlName="instanceDefaultNSFWPolicy"> 81 <div class="form-group">
78 <option i18n value="do_not_list">Do not list</option> 82 <my-peertube-checkbox
79 <option i18n value="blur">Blur thumbnails</option> 83 inputName="signupEnabled" formControlName="enabled"
80 <option i18n value="display">Display</option> 84 i18n-labelText labelText="Signup enabled"
81 </select> 85 ></my-peertube-checkbox>
82 </div> 86 </div>
83 <div *ngIf="formErrors.instanceDefaultNSFWPolicy" class="form-error"> 87
84 {{ formErrors.instanceDefaultNSFWPolicy }} 88 <div class="form-group">
89 <my-peertube-checkbox *ngIf="isSignupEnabled()"
90 inputName="signupRequiresEmailVerification" formControlName="requiresEmailVerification"
91 i18n-labelText labelText="Signup requires email verification"
92 ></my-peertube-checkbox>
85 </div> 93 </div>
86 </div>
87 94
88 <div i18n class="inner-form-title">Signup</div> 95 <div *ngIf="isSignupEnabled()" class="form-group">
96 <label i18n for="signupLimit">Signup limit</label>
97 <input
98 type="text" id="signupLimit"
99 formControlName="limit" [ngClass]="{ 'input-error': formErrors['signup.limit'] }"
100 >
101 <div *ngIf="formErrors.signup.limit" class="form-error">{{ formErrors.signup.limit }}</div>
102 </div>
103 </ng-container>
89 104
90 <my-peertube-checkbox 105 <div i18n class="inner-form-title">Users</div>
91 inputName="signupEnabled" formControlName="signupEnabled"
92 i18n-labelText labelText="Signup enabled"
93 ></my-peertube-checkbox>
94 106
95 <my-peertube-checkbox *ngIf="isSignupEnabled()" 107 <ng-container formGroupName="user">
96 inputName="signupRequiresEmailVerification" formControlName="signupRequiresEmailVerification" 108 <div class="form-group">
97 i18n-labelText labelText="Signup requires email verification" 109 <label i18n for="userVideoQuota">User default video quota</label>
98 ></my-peertube-checkbox> 110 <div class="peertube-select-container">
111 <select id="userVideoQuota" formControlName="videoQuota">
112 <option *ngFor="let videoQuotaOption of videoQuotaOptions" [value]="videoQuotaOption.value">
113 {{ videoQuotaOption.label }}
114 </option>
115 </select>
116 </div>
117 <div *ngIf="formErrors.user.videoQuota" class="form-error">{{ formErrors.user.videoQuota }}</div>
118 </div>
99 119
100 <div *ngIf="isSignupEnabled()" class="form-group"> 120 <div class="form-group">
101 <label i18n for="signupLimit">Signup limit</label> 121 <label i18n for="userVideoQuotaDaily">User default daily upload limit</label>
102 <input 122 <div class="peertube-select-container">
103 type="text" id="signupLimit" 123 <select id="userVideoQuotaDaily" formControlName="videoQuotaDaily">
104 formControlName="signupLimit" [ngClass]="{ 'input-error': formErrors['signupLimit'] }" 124 <option *ngFor="let videoQuotaDailyOption of videoQuotaDailyOptions" [value]="videoQuotaDailyOption.value">
105 > 125 {{ videoQuotaDailyOption.label }}
106 <div *ngIf="formErrors.signupLimit" class="form-error"> 126 </option>
107 {{ formErrors.signupLimit }} 127 </select>
128 </div>
129 <div *ngIf="formErrors.user.videoQuotaDaily" class="form-error">{{ formErrors.user.videoQuotaDaily }}</div>
108 </div> 130 </div>
109 </div> 131 </ng-container>
110 132
111 <div i18n class="inner-form-title">Import</div> 133 <div i18n class="inner-form-title">Import</div>
112 134
113 <my-peertube-checkbox 135 <ng-container formGroupName="import">
114 inputName="importVideosHttpEnabled" formControlName="importVideosHttpEnabled" 136 <ng-container formGroupName="videos">
115 i18n-labelText labelText="Video import with HTTP enabled"
116 ></my-peertube-checkbox>
117 137
118 <my-peertube-checkbox 138 <div class="form-group" formGroupName="http">
119 inputName="importVideosTorrentEnabled" formControlName="importVideosTorrentEnabled" 139 <my-peertube-checkbox
120 i18n-labelText labelText="Video import with a torrent file or a magnet URI enabled" 140 inputName="importVideosHttpEnabled" formControlName="enabled"
121 ></my-peertube-checkbox> 141 i18n-labelText labelText="Video import with HTTP URL (i.e. YouTube) enabled"
142 ></my-peertube-checkbox>
143 </div>
144
145 <div class="form-group" formGroupName="torrent">
146 <my-peertube-checkbox
147 inputName="importVideosTorrentEnabled" formControlName="enabled"
148 i18n-labelText labelText="Video import with a torrent file or a magnet URI enabled"
149 ></my-peertube-checkbox>
150 </div>
151
152 </ng-container>
153 </ng-container>
122 154
123 <div i18n class="inner-form-title">Administrator</div> 155 <div i18n class="inner-form-title">Administrator</div>
124 156
125 <div class="form-group"> 157 <div class="form-group" formGroupName="admin">
126 <label i18n for="adminEmail">Admin email</label> 158 <label i18n for="adminEmail">Admin email</label>
127 <input 159 <input
128 type="text" id="adminEmail" 160 type="text" id="adminEmail"
129 formControlName="adminEmail" [ngClass]="{ 'input-error': formErrors['adminEmail'] }" 161 formControlName="email" [ngClass]="{ 'input-error': formErrors['admin.email'] }"
130 > 162 >
131 <div *ngIf="formErrors.adminEmail" class="form-error"> 163 <div *ngIf="formErrors.admin.email" class="form-error">{{ formErrors.admin.email }}</div>
132 {{ formErrors.adminEmail }}
133 </div>
134 </div> 164 </div>
135 165
136 <div i18n class="inner-form-title">Users</div> 166 <div class="form-group" formGroupName="contactForm">
137 167 <my-peertube-checkbox
138 <div class="form-group"> 168 inputName="enableContactForm" formControlName="enabled"
139 <label i18n for="userVideoQuota">User default video quota</label> 169 i18n-labelText labelText="Enable contact form"
140 <div class="peertube-select-container"> 170 ></my-peertube-checkbox>
141 <select id="userVideoQuota" formControlName="userVideoQuota">
142 <option *ngFor="let videoQuotaOption of videoQuotaOptions" [value]="videoQuotaOption.value">
143 {{ videoQuotaOption.label }}
144 </option>
145 </select>
146 </div>
147 <div *ngIf="formErrors.userVideoQuota" class="form-error">
148 {{ formErrors.userVideoQuota }}
149 </div>
150 </div> 171 </div>
151 172
152 <div class="form-group">
153 <label i18n for="userVideoQuotaDaily">User default daily upload limit</label>
154 <div class="peertube-select-container">
155 <select id="userVideoQuotaDaily" formControlName="userVideoQuotaDaily">
156 <option *ngFor="let videoQuotaDailyOption of videoQuotaDailyOptions" [value]="videoQuotaDailyOption.value">
157 {{ videoQuotaDailyOption.label }}
158 </option>
159 </select>
160 </div>
161 <div *ngIf="formErrors.userVideoQuotaDaily" class="form-error">
162 {{ formErrors.userVideoQuotaDaily }}
163 </div>
164 </div>
165 </ng-template> 173 </ng-template>
166 </ngb-tab> 174 </ngb-tab>
167 175
@@ -169,28 +177,35 @@
169 <ng-template ngbTabContent> 177 <ng-template ngbTabContent>
170 <div i18n class="inner-form-title">Twitter</div> 178 <div i18n class="inner-form-title">Twitter</div>
171 179
172 <div class="form-group"> 180 <ng-container formGroupName="services">
173 <label i18n for="signupLimit">Your Twitter username</label> 181 <ng-container formGroupName="twitter">
174 <my-help 182
175 helpType="custom" i18n-customHtml 183 <div class="form-group">
176 customHtml="Indicates the Twitter account for the website or platform on which the content was published." 184 <label i18n for="signupLimit">Your Twitter username</label>
177 ></my-help> 185 <my-help
178 <input 186 helpType="custom" i18n-customHtml
179 type="text" id="servicesTwitterUsername" 187 customHtml="Indicates the Twitter account for the website or platform on which the content was published."
180 formControlName="servicesTwitterUsername" [ngClass]="{ 'input-error': formErrors['servicesTwitterUsername'] }" 188 ></my-help>
181 > 189 <input
182 <div *ngIf="formErrors.servicesTwitterUsername" class="form-error"> 190 type="text" id="servicesTwitterUsername"
183 {{ formErrors.servicesTwitterUsername }} 191 formControlName="username" [ngClass]="{ 'input-error': formErrors['services.twitter.username'] }"
184 </div> 192 >
185 </div> 193 <div *ngIf="formErrors.services.twitter.username" class="form-error">{{ formErrors.services.twitter.username }}</div>
194 </div>
195
196 <div class="form-group">
197 <my-peertube-checkbox
198 inputName="servicesTwitterWhitelisted" formControlName="whitelisted"
199 i18n-labelText labelText="Instance whitelisted by Twitter"
200 i18n-helpHtml helpHtml="If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.<br />
201 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.<br /><br />
202 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> to see if you instance is whitelisted."
203 ></my-peertube-checkbox>
204 </div>
205
206 </ng-container>
207 </ng-container>
186 208
187 <my-peertube-checkbox
188 inputName="servicesTwitterWhitelisted" formControlName="servicesTwitterWhitelisted"
189 i18n-labelText labelText="Instance whitelisted by Twitter"
190 i18n-helpHtml helpHtml="If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.<br />
191 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.<br /><br />
192 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> to see if you instance is whitelisted."
193 ></my-peertube-checkbox>
194 </ng-template> 209 </ng-template>
195 </ngb-tab> 210 </ngb-tab>
196 211
@@ -199,36 +214,48 @@
199 214
200 <div i18n class="inner-form-title">Transcoding</div> 215 <div i18n class="inner-form-title">Transcoding</div>
201 216
202 <my-peertube-checkbox 217 <ng-container formGroupName="transcoding">
203 inputName="transcodingEnabled" formControlName="transcodingEnabled" 218 <div class="form-group">
204 i18n-labelText labelText="Transcoding enabled" 219 <my-peertube-checkbox
205 i18n-helpHtml helpHtml="If you disable transcoding, many videos from your users will not work!" 220 inputName="transcodingEnabled" formControlName="enabled"
206 ></my-peertube-checkbox> 221 i18n-labelText labelText="Transcoding enabled"
222 i18n-helpHtml helpHtml="If you disable transcoding, many videos from your users will not work!"
223 ></my-peertube-checkbox>
224 </div>
207 225
208 <ng-template [ngIf]="isTranscodingEnabled()"> 226 <ng-container *ngIf="isTranscodingEnabled()">
209 227
210 <div class="form-group"> 228 <div class="form-group">
211 <label i18n for="transcodingThreads">Transcoding threads</label> 229 <my-peertube-checkbox
212 <div class="peertube-select-container"> 230 inputName="transcodingAllowAdditionalExtensions" formControlName="allowAdditionalExtensions"
213 <select id="transcodingThreads" formControlName="transcodingThreads"> 231 i18n-labelText labelText="Allow additional extensions"
214 <option *ngFor="let transcodingThreadOption of transcodingThreadOptions" [value]="transcodingThreadOption.value"> 232 i18n-helpHtml helpHtml="Allow your users to upload .mkv, .mov, .avi, .flv videos"
215 {{ transcodingThreadOption.label }} 233 ></my-peertube-checkbox>
216 </option>
217 </select>
218 </div> 234 </div>
219 <div *ngIf="formErrors.transcodingThreads" class="form-error"> 235
220 {{ formErrors.transcodingThreads }} 236 <div class="form-group">
237 <label i18n for="transcodingThreads">Transcoding threads</label>
238 <div class="peertube-select-container">
239 <select id="transcodingThreads" formControlName="threads">
240 <option *ngFor="let transcodingThreadOption of transcodingThreadOptions" [value]="transcodingThreadOption.value">
241 {{ transcodingThreadOption.label }}
242 </option>
243 </select>
244 </div>
245 <div *ngIf="formErrors.transcoding.threads" class="form-error">{{ formErrors.transcoding.threads }}</div>
221 </div> 246 </div>
222 </div>
223 247
224 <div class="form-group" *ngFor="let resolution of resolutions"> 248 <ng-container formGroupName="resolutions">
225 <my-peertube-checkbox 249 <div class="form-group" *ngFor="let resolution of resolutions">
226 [inputName]="getResolutionKey(resolution)" [formControlName]="getResolutionKey(resolution)" 250 <my-peertube-checkbox
227 i18n-labelText labelText="Resolution {{resolution}} enabled" 251 [inputName]="getResolutionKey(resolution)" [formControlName]="resolution"
228 ></my-peertube-checkbox> 252 i18n-labelText labelText="Resolution {{resolution}} enabled"
253 ></my-peertube-checkbox>
254 </div>
255 </ng-container>
229 256
230 </div> 257 </ng-container>
231 </ng-template> 258 </ng-container>
232 259
233 <div i18n class="inner-form-title"> 260 <div i18n class="inner-form-title">
234 Cache 261 Cache
@@ -239,74 +266,73 @@
239 ></my-help> 266 ></my-help>
240 </div> 267 </div>
241 268
242 <div class="form-group"> 269 <ng-container formGroupName="cache">
243 <label i18n for="cachePreviewsSize">Previews cache size</label> 270 <div class="form-group" formGroupName="previews">
244 <input 271 <label i18n for="cachePreviewsSize">Previews cache size</label>
245 type="text" id="cachePreviewsSize" 272 <input
246 formControlName="cachePreviewsSize" [ngClass]="{ 'input-error': formErrors['cachePreviewsSize'] }" 273 type="text" id="cachePreviewsSize"
247 > 274 formControlName="size" [ngClass]="{ 'input-error': formErrors['cache.previews.size'] }"
248 <div *ngIf="formErrors.cachePreviewsSize" class="form-error"> 275 >
249 {{ formErrors.cachePreviewsSize }} 276 <div *ngIf="formErrors.cache.previews.size" class="form-error">{{ formErrors.cache.previews.size }}</div>
250 </div> 277 </div>
251 </div>
252 278
253 <div class="form-group"> 279 <div class="form-group" formGroupName="captions">
254 <label i18n for="cachePreviewsSize">Video captions cache size</label> 280 <label i18n for="cacheCaptionsSize">Video captions cache size</label>
255 <input 281 <input
256 type="text" id="cacheCaptionsSize" 282 type="text" id="cacheCaptionsSize"
257 formControlName="cacheCaptionsSize" [ngClass]="{ 'input-error': formErrors['cacheCaptionsSize'] }" 283 formControlName="size" [ngClass]="{ 'input-error': formErrors['cache.captions.size'] }"
258 > 284 >
259 <div *ngIf="formErrors.cacheCaptionsSize" class="form-error"> 285 <div *ngIf="formErrors.cache.captions.size" class="form-error">{{ formErrors.cache.captions.size }}</div>
260 {{ formErrors.cacheCaptionsSize }}
261 </div> 286 </div>
262 </div> 287 </ng-container>
263 288
264 <div i18n class="inner-form-title">Customizations</div> 289 <div i18n class="inner-form-title">Customizations</div>
265 290
266 <div class="form-group"> 291 <ng-container formGroupName="instance">
267 <label i18n for="customizationJavascript">JavaScript</label> 292 <ng-container formGroupName="customizations">
268 <my-help 293 <div class="form-group">
269 helpType="custom" i18n-customHtml 294 <label i18n for="customizationJavascript">JavaScript</label>
270 customHtml="Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre>" 295 <my-help
271 ></my-help> 296 helpType="custom" i18n-customHtml
272 <textarea 297 customHtml="Write directly JavaScript code.<br />Example: <pre>console.log('my instance is amazing');</pre>"
273 id="customizationJavascript" formControlName="customizationJavascript" 298 ></my-help>
274 [ngClass]="{ 'input-error': formErrors['customizationJavascript'] }" 299 <textarea
275 ></textarea> 300 id="customizationJavascript" formControlName="javascript"
276 <div *ngIf="formErrors.customizationJavascript" class="form-error"> 301 [ngClass]="{ 'input-error': formErrors['instance.customizations.javascript'] }"
277 {{ formErrors.customizationJavascript }} 302 ></textarea>
278 </div> 303 <div *ngIf="formErrors.instance.customizations.javascript" class="form-error">{{ formErrors.instance.customizations.javascript }}</div>
279 </div> 304 </div>
305
306 <div class="form-group">
307 <label for="customizationCSS">CSS</label>
308 <my-help
309 helpType="custom"
310 i18n-customHtml
311 customHtml="
312 Write directly CSS code. Example:<br />
313 <pre>
314 body {{ '{' }}
315 background-color: red;
316 {{ '}' }}
317 </pre>
318
319 Prepend with <em>#custom-css</em> to override styles. Example:
320 <pre>
321 #custom-css .logged-in-email {{ '{' }}
322 color: red;
323 {{ '}' }}
324 </pre>
325 "
326 ></my-help>
327 <textarea
328 id="customizationCSS" formControlName="css"
329 [ngClass]="{ 'input-error': formErrors['instance.customizations.css'] }"
330 ></textarea>
331 <div *ngIf="formErrors.instance.customizations.css" class="form-error">{{ formErrors.instance.customizations.css }}</div>
332 </div>
333 </ng-container>
334 </ng-container>
280 335
281 <div class="form-group">
282 <label for="customizationCSS">CSS</label>
283 <my-help
284 helpType="custom"
285 i18n-customHtml
286 customHtml="
287 Write directly CSS code. Example:<br />
288 <pre>
289 body {{ '{' }}
290 background-color: red;
291 {{ '}' }}
292 </pre>
293
294 Prepend with <em>#custom-css</em> to override styles. Example:
295 <pre>
296 #custom-css .logged-in-email {{ '{' }}
297 color: red;
298 {{ '}' }}
299 </pre>
300 "
301 ></my-help>
302 <textarea
303 id="customizationCSS" formControlName="customizationCSS"
304 [ngClass]="{ 'input-error': formErrors['customizationCSS'] }"
305 ></textarea>
306 <div *ngIf="formErrors.customizationCSS" class="form-error">
307 {{ formErrors.customizationCSS }}
308 </div>
309 </div>
310 </ng-template> 336 </ng-template>
311 </ngb-tab> 337 </ngb-tab>
312 </ngb-tabset> 338 </ngb-tabset>