-import { Component, OnInit } from '@angular/core'
+import { Component, OnInit, AfterViewChecked, ViewChild } from '@angular/core'
import { ConfigService } from '@app/+admin/config/shared/config.service'
import { ServerService } from '@app/core/server/server.service'
import { CustomConfigValidatorsService, FormReactive, UserValidatorsService } from '@app/shared'
import { Notifier } from '@app/core'
import { CustomConfig } from '../../../../../../shared/models/server/custom-config.model'
import { I18n } from '@ngx-translate/i18n-polyfill'
-import { BuildFormDefaultValues, FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
+import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
+import { SelectItem } from 'primeng/api'
+import { forkJoin } from 'rxjs'
+import { ServerConfig } from '@shared/models'
+import { ViewportScroller } from '@angular/common'
+import { NgbTabset } from '@ng-bootstrap/ng-bootstrap'
@Component({
selector: 'my-edit-custom-config',
templateUrl: './edit-custom-config.component.html',
styleUrls: [ './edit-custom-config.component.scss' ]
})
-export class EditCustomConfigComponent extends FormReactive implements OnInit {
+export class EditCustomConfigComponent extends FormReactive implements OnInit, AfterViewChecked {
+ @ViewChild('tabs') tabs: NgbTabset
+
+ initDone = false
customConfig: CustomConfig
- resolutions: string[] = []
+ resolutions: { id: string, label: string, description?: string }[] = []
transcodingThreadOptions: { label: string, value: number }[] = []
+ languageItems: SelectItem[] = []
+ categoryItems: SelectItem[] = []
+
+ private serverConfig: ServerConfig
+
constructor (
+ private viewportScroller: ViewportScroller,
protected formValidatorService: FormValidatorService,
private customConfigValidatorsService: CustomConfigValidatorsService,
private userValidatorsService: UserValidatorsService,
super()
this.resolutions = [
- this.i18n('240p'),
- this.i18n('360p'),
- this.i18n('480p'),
- this.i18n('720p'),
- this.i18n('1080p')
+ {
+ id: '0p',
+ label: this.i18n('Audio-only'),
+ description: this.i18n('A <code>.mp4</code> that keeps the original audio track, with no video')
+ },
+ {
+ id: '240p',
+ label: this.i18n('240p')
+ },
+ {
+ id: '360p',
+ label: this.i18n('360p')
+ },
+ {
+ id: '480p',
+ label: this.i18n('480p')
+ },
+ {
+ id: '720p',
+ label: this.i18n('720p')
+ },
+ {
+ id: '1080p',
+ label: this.i18n('1080p')
+ },
+ {
+ id: '2160p',
+ label: this.i18n('2160p')
+ }
]
this.transcodingThreadOptions = [
return this.configService.videoQuotaDailyOptions
}
+ get availableThemes () {
+ return this.serverConfig.theme.registered
+ .map(t => t.name)
+ }
+
getResolutionKey (resolution: string) {
return 'transcoding.resolutions.' + resolution
}
ngOnInit () {
+ this.serverConfig = this.serverService.getTmpConfig()
+ this.serverService.getConfig()
+ .subscribe(config => this.serverConfig = config)
+
const formGroupData: { [key in keyof CustomConfig ]: any } = {
instance: {
name: this.customConfigValidatorsService.INSTANCE_NAME,
shortDescription: this.customConfigValidatorsService.INSTANCE_SHORT_DESCRIPTION,
description: null,
+
+ isNSFW: false,
+ defaultNSFWPolicy: null,
+
terms: null,
+ codeOfConduct: null,
+
+ creationReason: null,
+ moderationInformation: null,
+ administrator: null,
+ maintenanceLifetime: null,
+ businessModel: null,
+
+ hardwareInformation: null,
+
+ categories: null,
+ languages: null,
+
defaultClientRoute: null,
- defaultNSFWPolicy: null,
+
customizations: {
javascript: null,
css: null
}
},
+ theme: {
+ default: null
+ },
services: {
twitter: {
username: this.customConfigValidatorsService.SERVICES_TWITTER_USERNAME,
enabled: null,
threads: this.customConfigValidatorsService.TRANSCODING_THREADS,
allowAdditionalExtensions: null,
- resolutions: {}
+ allowAudioFiles: null,
+ resolutions: {},
+ hls: {
+ enabled: null
+ },
+ webtorrent: {
+ enabled: null
+ }
+ },
+ autoBlacklist: {
+ videos: {
+ ofUsers: {
+ enabled: null
+ }
+ }
+ },
+ followers: {
+ instance: {
+ enabled: null,
+ manualApproval: null
+ }
+ },
+ followings: {
+ instance: {
+ autoFollowBack: {
+ enabled: null
+ },
+ autoFollowIndex: {
+ enabled: null,
+ indexUrl: this.customConfigValidatorsService.INDEX_URL
+ }
+ }
}
}
}
}
for (const resolution of this.resolutions) {
- defaultValues.transcoding.resolutions[resolution] = 'false'
- formGroupData.transcoding.resolutions[resolution] = null
+ defaultValues.transcoding.resolutions[resolution.id] = 'false'
+ formGroupData.transcoding.resolutions[resolution.id] = null
}
this.buildForm(formGroupData)
+ this.loadForm()
+ this.checkTranscodingFields()
+ }
- this.configService.getCustomConfig()
- .subscribe(
- res => {
- this.customConfig = res
-
- this.updateForm()
- // Force form validation
- this.forceCheck()
- },
-
- err => this.notifier.error(err.message)
- )
+ ngAfterViewChecked () {
+ if (!this.initDone) {
+ this.initDone = true
+ this.gotoAnchor()
+ }
}
isTranscodingEnabled () {
return this.form.value['signup']['enabled'] === true
}
+ isAutoFollowIndexEnabled () {
+ return this.form.value['followings']['instance']['autoFollowIndex']['enabled'] === true
+ }
+
async formValidated () {
- this.configService.updateCustomConfig(this.form.value)
+ this.configService.updateCustomConfig(this.form.getRawValue())
.subscribe(
res => {
this.customConfig = res
// Reload general configuration
- this.serverService.loadConfig()
+ this.serverService.resetConfig()
this.updateForm()
)
}
+ getSelectedLanguageLabel () {
+ return this.i18n('{{\'{0} languages selected')
+ }
+
+ getDefaultLanguageLabel () {
+ return this.i18n('No language')
+ }
+
+ getSelectedCategoryLabel () {
+ return this.i18n('{{\'{0} categories selected')
+ }
+
+ getDefaultCategoryLabel () {
+ return this.i18n('No category')
+ }
+
+ gotoAnchor () {
+ const hashToTab = {
+ 'customizations': 'advanced-configuration'
+ }
+ const hash = window.location.hash.replace('#', '')
+
+ if (hash && Object.keys(hashToTab).includes(hash)) {
+ this.tabs.select(hashToTab[hash])
+ setTimeout(() => this.viewportScroller.scrollToAnchor(hash), 100)
+ }
+ }
+
private updateForm () {
this.form.patchValue(this.customConfig)
}
+ private loadForm () {
+ forkJoin([
+ this.configService.getCustomConfig(),
+ this.serverService.getVideoLanguages(),
+ this.serverService.getVideoCategories()
+ ]).subscribe(
+ ([ config, languages, categories ]) => {
+ this.customConfig = config
+
+ this.languageItems = languages.map(l => ({ label: l.label, value: l.id }))
+ this.categoryItems = categories.map(l => ({ label: l.label, value: l.id }))
+
+ this.updateForm()
+ // Force form validation
+ this.forceCheck()
+ },
+
+ err => this.notifier.error(err.message)
+ )
+ }
+
+ private checkTranscodingFields () {
+ const hlsControl = this.form.get('transcoding.hls.enabled')
+ const webtorrentControl = this.form.get('transcoding.webtorrent.enabled')
+
+ webtorrentControl.valueChanges
+ .subscribe(newValue => {
+ if (newValue === false && !hlsControl.disabled) {
+ hlsControl.disable()
+ }
+
+ if (newValue === true && !hlsControl.enabled) {
+ hlsControl.enable()
+ }
+ })
+
+ hlsControl.valueChanges
+ .subscribe(newValue => {
+ if (newValue === false && !webtorrentControl.disabled) {
+ webtorrentControl.disable()
+ }
+
+ if (newValue === true && !webtorrentControl.enabled) {
+ webtorrentControl.enable()
+ }
+ })
+ }
}