mirror of https://github.com/apache/cloudstack.git
104 lines
3.5 KiB
JavaScript
104 lines
3.5 KiB
JavaScript
// Licensed to the Apache Software Foundation (ASF) under one
|
|
// or more contributor license agreements. See the NOTICE file
|
|
// distributed with this work for additional information
|
|
// regarding copyright ownership. The ASF licenses this file
|
|
// to you under the Apache License, Version 2.0 (the
|
|
// "License"); you may not use this file except in compliance
|
|
// with the License. You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing,
|
|
// software distributed under the License is distributed on an
|
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
// KIND, either express or implied. See the License for the
|
|
// specific language governing permissions and limitations
|
|
// under the License.
|
|
|
|
import { vueProps } from '@/vue-app'
|
|
import { getAPI } from '@/api'
|
|
|
|
export async function applyCustomGuiTheme (accountid, domainid) {
|
|
await fetch('config.json').then(response => response.json()).then(config => {
|
|
vueProps.$config = config
|
|
})
|
|
|
|
let guiTheme
|
|
|
|
if (accountid != null) {
|
|
guiTheme = await fetchGuiTheme({ accountid: accountid })
|
|
}
|
|
|
|
if (guiTheme === undefined && domainid != null) {
|
|
guiTheme = await fetchGuiTheme({ domainid: domainid })
|
|
}
|
|
|
|
if (guiTheme === undefined) {
|
|
guiTheme = await fetchGuiTheme({ commonname: window.location.hostname })
|
|
}
|
|
|
|
if (guiTheme === undefined) {
|
|
guiTheme = await fetchGuiTheme({ listonlydefaulttheme: true })
|
|
}
|
|
|
|
await applyDynamicCustomization(guiTheme)
|
|
}
|
|
|
|
async function fetchGuiTheme (params) {
|
|
return await getAPI('listGuiThemes', params).then(response => {
|
|
if (response.listguithemesresponse.guiThemes) {
|
|
return response.listguithemesresponse.guiThemes[0]
|
|
}
|
|
}).catch(error => {
|
|
console.error('Error fetching GUI theme:', error)
|
|
return null
|
|
})
|
|
}
|
|
|
|
async function applyDynamicCustomization (response) {
|
|
let jsonConfig
|
|
|
|
if (response?.jsonconfiguration) {
|
|
jsonConfig = JSON.parse(response?.jsonconfiguration)
|
|
}
|
|
|
|
// Sets custom GUI fields only if is not nullish.
|
|
vueProps.$config.appTitle = jsonConfig?.appTitle ?? vueProps.$config.appTitle
|
|
vueProps.$config.footer = jsonConfig?.footer ?? vueProps.$config.footer
|
|
vueProps.$config.loginFooter = jsonConfig?.loginFooter ?? vueProps.$config.loginFooter
|
|
vueProps.$config.logo = jsonConfig?.logo ?? vueProps.$config.logo
|
|
vueProps.$config.minilogo = jsonConfig?.minilogo ?? vueProps.$config.minilogo
|
|
vueProps.$config.banner = jsonConfig?.banner ?? vueProps.$config.banner
|
|
|
|
if (jsonConfig?.error) {
|
|
vueProps.$config.error[403] = jsonConfig?.error[403] ?? vueProps.$config.error[403]
|
|
vueProps.$config.error[404] = jsonConfig?.error[404] ?? vueProps.$config.error[404]
|
|
vueProps.$config.error[500] = jsonConfig?.error[500] ?? vueProps.$config.error[500]
|
|
}
|
|
|
|
if (jsonConfig?.plugins) {
|
|
jsonConfig.plugins.forEach(plugin => {
|
|
vueProps.$config.plugins.push(plugin)
|
|
})
|
|
}
|
|
|
|
vueProps.$config.favicon = jsonConfig?.favicon ?? vueProps.$config.favicon
|
|
vueProps.$config.css = response?.css ?? null
|
|
|
|
await applyStaticCustomization(vueProps.$config.favicon, vueProps.$config.css)
|
|
}
|
|
|
|
async function applyStaticCustomization (favicon, css) {
|
|
document.getElementById('favicon').href = favicon
|
|
|
|
let style = document.getElementById('guiThemeCSS')
|
|
if (style != null) {
|
|
style.innerHTML = css
|
|
} else {
|
|
style = document.createElement('style')
|
|
style.setAttribute('id', 'guiThemeCSS')
|
|
style.innerHTML = css
|
|
document.body.appendChild(style)
|
|
}
|
|
}
|