import { FormBuilder, FormGroup } from '@angular/forms'
import { Router } from '@angular/router'
import { ConfigService } from '@app/+admin/config/shared/config.service'
+import { ConfirmService } from '@app/core'
import { ServerService } from '@app/core/server/server.service'
import { FormReactive, USER_VIDEO_QUOTA } from '@app/shared'
-import { ADMIN_EMAIL, CACHE_PREVIEWS_SIZE, SIGNUP_LIMIT, TRANSCODING_THREADS } from '@app/shared/forms/form-validators/custom-config'
+import {
+ ADMIN_EMAIL,
+ CACHE_PREVIEWS_SIZE,
+ INSTANCE_NAME, INSTANCE_SHORT_DESCRIPTION, SERVICES_TWITTER_USERNAME,
+ SIGNUP_LIMIT,
+ TRANSCODING_THREADS
+} from '@app/shared/forms/form-validators/custom-config'
import { NotificationsService } from 'angular2-notifications'
-import { CustomConfig } from '../../../../../../shared/models/config/custom-config.model'
+import { CustomConfig } from '../../../../../../shared/models/server/custom-config.model'
@Component({
selector: 'my-edit-custom-config',
form: FormGroup
formErrors = {
+ instanceName: '',
+ instanceShortDescription: '',
+ instanceDescription: '',
+ instanceTerms: '',
+ instanceDefaultClientRoute: '',
+ instanceDefaultNSFWPolicy: '',
+ servicesTwitterUsername: '',
cachePreviewsSize: '',
signupLimit: '',
adminEmail: '',
userVideoQuota: '',
- transcodingThreads: ''
+ transcodingThreads: '',
+ customizationJavascript: '',
+ customizationCSS: ''
}
validationMessages = {
+ instanceShortDescription: INSTANCE_SHORT_DESCRIPTION.MESSAGES,
+ instanceName: INSTANCE_NAME.MESSAGES,
+ servicesTwitterUsername: SERVICES_TWITTER_USERNAME,
cachePreviewsSize: CACHE_PREVIEWS_SIZE.MESSAGES,
signupLimit: SIGNUP_LIMIT.MESSAGES,
adminEmail: ADMIN_EMAIL.MESSAGES,
userVideoQuota: USER_VIDEO_QUOTA.MESSAGES
}
+ private oldCustomJavascript: string
+ private oldCustomCSS: string
+
constructor (
private formBuilder: FormBuilder,
private router: Router,
private notificationsService: NotificationsService,
private configService: ConfigService,
- private serverService: ServerService
+ private serverService: ServerService,
+ private confirmService: ConfirmService
) {
super()
}
buildForm () {
const formGroupData = {
+ instanceName: [ '', INSTANCE_NAME.VALIDATORS ],
+ instanceShortDescription: [ '', INSTANCE_SHORT_DESCRIPTION.VALIDATORS ],
+ instanceDescription: [ '' ],
+ instanceTerms: [ '' ],
+ instanceDefaultClientRoute: [ '' ],
+ instanceDefaultNSFWPolicy: [ '' ],
+ servicesTwitterUsername: [ '', SERVICES_TWITTER_USERNAME.VALIDATORS ],
+ servicesTwitterWhitelisted: [ ],
cachePreviewsSize: [ '', CACHE_PREVIEWS_SIZE.VALIDATORS ],
signupEnabled: [ ],
signupLimit: [ '', SIGNUP_LIMIT.VALIDATORS ],
adminEmail: [ '', ADMIN_EMAIL.VALIDATORS ],
userVideoQuota: [ '', USER_VIDEO_QUOTA.VALIDATORS ],
transcodingThreads: [ '', TRANSCODING_THREADS.VALIDATORS ],
- transcodingEnabled: [ ]
+ transcodingEnabled: [ ],
+ customizationJavascript: [ '' ],
+ customizationCSS: [ '' ]
}
for (const resolution of this.resolutions) {
res => {
this.customConfig = res
+ this.oldCustomCSS = this.customConfig.instance.customizations.css
+ this.oldCustomJavascript = this.customConfig.instance.customizations.javascript
+
this.updateForm()
+ // Force form validation
+ this.forceCheck()
},
err => this.notificationsService.error('Error', err.message)
return this.form.value['signupEnabled'] === true
}
- formValidated () {
- const data = {
+ async formValidated () {
+ const newCustomizationJavascript = this.form.value['customizationJavascript']
+ const newCustomizationCSS = this.form.value['customizationCSS']
+
+ const customizations = []
+ if (newCustomizationJavascript && newCustomizationJavascript !== this.oldCustomJavascript) customizations.push('JavaScript')
+ if (newCustomizationCSS && newCustomizationCSS !== this.oldCustomCSS) customizations.push('CSS')
+
+ if (customizations.length !== 0) {
+ const customizationsText = customizations.join('/')
+
+ const message = `You set custom ${customizationsText}. ` +
+ 'This could lead to security issues or bugs if you do not understand it. ' +
+ 'Are you sure you want to update the configuration?'
+ const label = `Please type "I understand the ${customizationsText} I set" to confirm.`
+ const expectedInputValue = `I understand the ${customizationsText} I set`
+
+ const confirmRes = await this.confirmService.confirmWithInput(message, label, expectedInputValue)
+ if (confirmRes === false) return
+ }
+
+ const data: CustomConfig = {
+ instance: {
+ name: this.form.value['instanceName'],
+ shortDescription: this.form.value['instanceShortDescription'],
+ description: this.form.value['instanceDescription'],
+ terms: this.form.value['instanceTerms'],
+ defaultClientRoute: this.form.value['instanceDefaultClientRoute'],
+ defaultNSFWPolicy: this.form.value['instanceDefaultNSFWPolicy'],
+ customizations: {
+ javascript: this.form.value['customizationJavascript'],
+ css: this.form.value['customizationCSS']
+ }
+ },
+ services: {
+ twitter: {
+ username: this.form.value['servicesTwitterUsername'],
+ whitelisted: this.form.value['servicesTwitterWhitelisted']
+ }
+ },
cache: {
previews: {
size: this.form.value['cachePreviewsSize']
this.serverService.loadConfig()
this.updateForm()
+
+ this.notificationsService.success('Success', 'Configuration updated.')
},
err => this.notificationsService.error('Error', err.message)
private updateForm () {
const data = {
+ instanceName: this.customConfig.instance.name,
+ instanceShortDescription: this.customConfig.instance.shortDescription,
+ instanceDescription: this.customConfig.instance.description,
+ instanceTerms: this.customConfig.instance.terms,
+ instanceDefaultClientRoute: this.customConfig.instance.defaultClientRoute,
+ instanceDefaultNSFWPolicy: this.customConfig.instance.defaultNSFWPolicy,
+ servicesTwitterUsername: this.customConfig.services.twitter.username,
+ servicesTwitterWhitelisted: this.customConfig.services.twitter.whitelisted,
cachePreviewsSize: this.customConfig.cache.previews.size,
signupEnabled: this.customConfig.signup.enabled,
signupLimit: this.customConfig.signup.limit,
adminEmail: this.customConfig.admin.email,
userVideoQuota: this.customConfig.user.videoQuota,
transcodingThreads: this.customConfig.transcoding.threads,
- transcodingEnabled: this.customConfig.transcoding.enabled
+ transcodingEnabled: this.customConfig.transcoding.enabled,
+ customizationJavascript: this.customConfig.instance.customizations.javascript,
+ customizationCSS: this.customConfig.instance.customizations.css
}
for (const resolution of this.resolutions) {