From e00eb171bec976924234e6a4055a1b2ffd847cec Mon Sep 17 00:00:00 2001 From: Rory Powell Date: Mon, 5 Jun 2023 14:01:46 +0100 Subject: [PATCH 1/3] WIP logo url fixes --- .../builder/portal/settings/branding.svelte | 44 ++++++++++++------- .../builder/src/stores/portal/organisation.js | 7 ++- .../src/api/controllers/global/configs.ts | 24 ++++++++-- 3 files changed, 53 insertions(+), 22 deletions(-) diff --git a/packages/builder/src/pages/builder/portal/settings/branding.svelte b/packages/builder/src/pages/builder/portal/settings/branding.svelte index ae22d310a1..ed858c2228 100644 --- a/packages/builder/src/pages/builder/portal/settings/branding.svelte +++ b/packages/builder/src/pages/builder/portal/settings/branding.svelte @@ -45,13 +45,13 @@ let updated = false $: onConfigUpdate(config, mounted) - $: init = Object.keys(config).length > 0 + $: initialised = Object.keys(config).length > 0 $: isCloud = $admin.cloud $: brandingEnabled = $licensing.brandingEnabled const onConfigUpdate = () => { - if (!mounted || updated || !init) { + if (!mounted || updated || !initialised) { return } updated = true @@ -122,34 +122,31 @@ return response } - async function saveConfig() { - saving = true - + async function saveFiles() { if (logoFile) { const logoResp = await uploadLogo(logoFile) if (logoResp.url) { - config = { - ...config, - logoUrl: logoResp.url, - } logoFile = null logoPreview = null } + config.logoUrl = undefined + } else { + config.logoUrl = "" } if (faviconFile) { const faviconResp = await uploadFavicon(faviconFile) if (faviconResp.url) { - config = { - ...config, - faviconUrl: faviconResp.url, - } faviconFile = null faviconPreview = null } + config.faviconUrl = undefined + } else { + config.faviconUrl = "" } + } - // Trim + function trimFields() { const userStrings = [ "metaTitle", "platformTitle", @@ -168,11 +165,18 @@ ...config, ...trimmed, } + } + + async function saveConfig() { + saving = true + + await saveFiles() + trimFields() try { // Update settings await organisation.save(config) - await organisation.init() + await init() notifications.success("Branding settings updated") } catch (e) { console.error("Branding updated failed", e) @@ -182,8 +186,10 @@ saving = false } - onMount(async () => { - await organisation.init() + async function init() { + if (!$organisation.loaded) { + await organisation.init() + } config = { faviconUrl: $organisation.faviconUrl, @@ -197,6 +203,10 @@ metaImageUrl: $organisation.metaImageUrl, metaTitle: $organisation.metaTitle, } + } + + onMount(async () => { + await init() mounted = true }) diff --git a/packages/builder/src/stores/portal/organisation.js b/packages/builder/src/stores/portal/organisation.js index ed7dd36636..bd8cf80fc1 100644 --- a/packages/builder/src/stores/portal/organisation.js +++ b/packages/builder/src/stores/portal/organisation.js @@ -23,6 +23,7 @@ const DEFAULT_CONFIG = { oidcCallbackUrl: "", googleCallbackUrl: "", isSSOEnforced: false, + loaded: false } export function createOrganisationStore() { @@ -43,6 +44,10 @@ export function createOrganisationStore() { delete storeConfig.googleDatasourceConfigured delete storeConfig.oidcCallbackUrl delete storeConfig.googleCallbackUrl + + // delete internal store field + delete storeConfig.loaded + await API.saveConfig({ type: "settings", config: { ...storeConfig, ...config }, @@ -54,7 +59,7 @@ export function createOrganisationStore() { subscribe, set, save, - init, + init } } diff --git a/packages/worker/src/api/controllers/global/configs.ts b/packages/worker/src/api/controllers/global/configs.ts index afbb7c931d..ec55d294f9 100644 --- a/packages/worker/src/api/controllers/global/configs.ts +++ b/packages/worker/src/api/controllers/global/configs.ts @@ -22,7 +22,7 @@ import { isOIDCConfig, isSettingsConfig, isSMTPConfig, - OIDCConfigs, + OIDCConfigs, SettingsBrandingConfig, SettingsInnerConfig, SSOConfig, SSOConfigType, @@ -142,13 +142,29 @@ async function hasActivatedConfig(ssoConfigs?: SSOConfigs) { return !!Object.values(ssoConfigs).find(c => c?.activated) } -async function verifySettingsConfig(config: SettingsInnerConfig) { +async function verifySettingsConfig( + config: SettingsInnerConfig & SettingsBrandingConfig, + existingConfig?: SettingsInnerConfig & SettingsBrandingConfig +) { if (config.isSSOEnforced) { const valid = await hasActivatedConfig() if (!valid) { throw new Error("Cannot enforce SSO without an activated configuration") } } + + // always preserve file attributes + // these should be set via upload instead + // only allow for deletion by checking empty string to bypass this behaviour + + if (existingConfig && config.logoUrl !== "") { + config.logoUrl = existingConfig.logoUrl + config.logoUrlEtag = existingConfig.logoUrlEtag + } + if (existingConfig && config.faviconUrl !== "") { + config.faviconUrl = existingConfig.faviconUrl + config.faviconUrlEtag = existingConfig.faviconUrlEtag + } } async function verifySSOConfig(type: SSOConfigType, config: SSOConfig) { @@ -198,7 +214,7 @@ export async function save(ctx: UserCtx) { await email.verifyConfig(config) break case ConfigType.SETTINGS: - await verifySettingsConfig(config) + await verifySettingsConfig(config, existingConfig?.config) break case ConfigType.GOOGLE: await verifyGoogleConfig(config) @@ -325,7 +341,7 @@ export async function publicSettings( config.faviconUrl = objectStore.getGlobalFileUrl( "settings", "faviconUrl", - branding.faviconUrl + branding.faviconUrlEtag ) } From f20653d4cade84b5802bcea233dfdb3d6e1c960a Mon Sep 17 00:00:00 2001 From: Dean Date: Mon, 5 Jun 2023 15:20:04 +0100 Subject: [PATCH 2/3] Branding fixes --- .../builder/portal/settings/branding.svelte | 14 ++++++------- .../builder/src/stores/portal/organisation.js | 6 +++--- .../src/api/controllers/global/configs.ts | 21 ++++++++++--------- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/packages/builder/src/pages/builder/portal/settings/branding.svelte b/packages/builder/src/pages/builder/portal/settings/branding.svelte index ed858c2228..ec2159d62b 100644 --- a/packages/builder/src/pages/builder/portal/settings/branding.svelte +++ b/packages/builder/src/pages/builder/portal/settings/branding.svelte @@ -44,7 +44,7 @@ let config = {} let updated = false - $: onConfigUpdate(config, mounted) + $: onConfigUpdate(config) $: initialised = Object.keys(config).length > 0 $: isCloud = $admin.cloud @@ -130,8 +130,6 @@ logoPreview = null } config.logoUrl = undefined - } else { - config.logoUrl = "" } if (faviconFile) { @@ -141,8 +139,6 @@ faviconPreview = null } config.faviconUrl = undefined - } else { - config.faviconUrl = "" } } @@ -190,7 +186,6 @@ if (!$organisation.loaded) { await organisation.init() } - config = { faviconUrl: $organisation.faviconUrl, logoUrl: $organisation.logoUrl, @@ -272,6 +267,7 @@ faviconFile = e.detail faviconPreview = null } else { + faviconFile = null clone.faviconUrl = "" } config = clone @@ -418,7 +414,11 @@ Upgrade {/if} - diff --git a/packages/builder/src/stores/portal/organisation.js b/packages/builder/src/stores/portal/organisation.js index bd8cf80fc1..ab33c7a5fa 100644 --- a/packages/builder/src/stores/portal/organisation.js +++ b/packages/builder/src/stores/portal/organisation.js @@ -23,7 +23,7 @@ const DEFAULT_CONFIG = { oidcCallbackUrl: "", googleCallbackUrl: "", isSSOEnforced: false, - loaded: false + loaded: false, } export function createOrganisationStore() { @@ -33,7 +33,7 @@ export function createOrganisationStore() { async function init() { const tenantId = get(auth).tenantId const settingsConfigDoc = await API.getTenantConfig(tenantId) - set({ ...DEFAULT_CONFIG, ...settingsConfigDoc.config }) + set({ ...DEFAULT_CONFIG, ...settingsConfigDoc.config, loaded: true }) } async function save(config) { @@ -59,7 +59,7 @@ export function createOrganisationStore() { subscribe, set, save, - init + init, } } diff --git a/packages/worker/src/api/controllers/global/configs.ts b/packages/worker/src/api/controllers/global/configs.ts index ec55d294f9..03da8cce88 100644 --- a/packages/worker/src/api/controllers/global/configs.ts +++ b/packages/worker/src/api/controllers/global/configs.ts @@ -22,7 +22,8 @@ import { isOIDCConfig, isSettingsConfig, isSMTPConfig, - OIDCConfigs, SettingsBrandingConfig, + OIDCConfigs, + SettingsBrandingConfig, SettingsInnerConfig, SSOConfig, SSOConfigType, @@ -336,15 +337,6 @@ export async function publicSettings( ) } - if (branding.faviconUrl && branding.faviconUrl !== "") { - // @ts-ignore - config.faviconUrl = objectStore.getGlobalFileUrl( - "settings", - "faviconUrl", - branding.faviconUrlEtag - ) - } - // google const googleConfig = await configs.getGoogleConfig() const googleDatasourceConfigured = @@ -368,6 +360,15 @@ export async function publicSettings( config: { ...config, ...branding, + ...(branding.faviconUrl && branding.faviconUrl !== "" + ? { + faviconUrl: objectStore.getGlobalFileUrl( + "settings", + "faviconUrl", + branding.faviconUrlEtag + ), + } + : { faviconUrl: undefined }), google, googleDatasourceConfigured, oidc, From 0a7669ad2d7687347fa7478cf177ebefc075cf0d Mon Sep 17 00:00:00 2001 From: Dean Date: Mon, 5 Jun 2023 16:26:27 +0100 Subject: [PATCH 3/3] PR feedback --- .../src/api/controllers/global/configs.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/worker/src/api/controllers/global/configs.ts b/packages/worker/src/api/controllers/global/configs.ts index 03da8cce88..0f22d4aae0 100644 --- a/packages/worker/src/api/controllers/global/configs.ts +++ b/packages/worker/src/api/controllers/global/configs.ts @@ -337,6 +337,16 @@ export async function publicSettings( ) } + // enrich the favicon url - empty url means deleted + const faviconUrl = + branding.faviconUrl && branding.faviconUrl !== "" + ? objectStore.getGlobalFileUrl( + "settings", + "faviconUrl", + branding.faviconUrlEtag + ) + : undefined + // google const googleConfig = await configs.getGoogleConfig() const googleDatasourceConfigured = @@ -360,15 +370,7 @@ export async function publicSettings( config: { ...config, ...branding, - ...(branding.faviconUrl && branding.faviconUrl !== "" - ? { - faviconUrl: objectStore.getGlobalFileUrl( - "settings", - "faviconUrl", - branding.faviconUrlEtag - ), - } - : { faviconUrl: undefined }), + ...{ faviconUrl }, google, googleDatasourceConfigured, oidc,