From 270977f884ca0176cf8e88ffd99a55b0e07514db Mon Sep 17 00:00:00 2001 From: Andy Lee Date: Tue, 15 Sep 2026 16:20:05 +0800 Subject: [PATCH] feat: use prime logo when server-flavor is prime Signed-off-by: Andy Lee --- .../images/dark/suse-virtualization.svg | 1 + .../assets/images/suse-virtualization.svg | 1 + pkg/harvester/components/SettingList.vue | 5 +-- pkg/harvester/config/harvester-cluster.js | 35 ++++++++++++++----- pkg/harvester/l10n/en-us.yaml | 2 ++ .../pages/c/_cluster/brand/index.vue | 16 +++++++-- pkg/harvester/store/harvester-common.js | 19 ++++++++++ 7 files changed, 66 insertions(+), 13 deletions(-) create mode 100644 pkg/harvester/assets/images/dark/suse-virtualization.svg create mode 100644 pkg/harvester/assets/images/suse-virtualization.svg diff --git a/pkg/harvester/assets/images/dark/suse-virtualization.svg b/pkg/harvester/assets/images/dark/suse-virtualization.svg new file mode 100644 index 00000000..3d6b2784 --- /dev/null +++ b/pkg/harvester/assets/images/dark/suse-virtualization.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/harvester/assets/images/suse-virtualization.svg b/pkg/harvester/assets/images/suse-virtualization.svg new file mode 100644 index 00000000..a1565a6f --- /dev/null +++ b/pkg/harvester/assets/images/suse-virtualization.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pkg/harvester/components/SettingList.vue b/pkg/harvester/components/SettingList.vue index cf8713a5..25ee55b1 100644 --- a/pkg/harvester/components/SettingList.vue +++ b/pkg/harvester/components/SettingList.vue @@ -53,7 +53,7 @@ export default { }; }, - computed: { ...mapGetters({ t: 'i18n/t' }) }, + computed: { ...mapGetters({ t: 'i18n/t', isHarvesterPrime: 'harvester-common/isHarvesterPrime' }) }, watch: { settings: { @@ -269,7 +269,8 @@ export default { v-if="!setting.hide" class="settings-value" > -
{{ setting.json }}
+
{{ $store.getters['harvester-common/privateLabel'] }}
+
{{ setting.json }}
{{ setting.data.value || setting.data.default }}
{{ t(setting.enum) }}
{{ setting.custom }}
diff --git a/pkg/harvester/config/harvester-cluster.js b/pkg/harvester/config/harvester-cluster.js index 53eb6ddd..a2bb21c7 100644 --- a/pkg/harvester/config/harvester-cluster.js +++ b/pkg/harvester/config/harvester-cluster.js @@ -57,6 +57,7 @@ import { } from './table-headers'; import { ADD_ONS } from './harvester-map'; import { registerAddonSideNav } from '../utils/dynamic-nav'; +import { setVendor } from '@shell/config/private-label'; const TEMPLATE = HCI.VM_VERSION; const MONITORING_GROUP = 'Monitoring & Logging::Monitoring'; @@ -109,15 +110,31 @@ export function init($plugin, store) { } }; - store.dispatch('setIsSingleProduct', { - productName: PRODUCT_NAME, - logo: require(`@shell/assets/images/providers/harvester.svg`), - productNameKey: 'harvester.productLabel', - getVersionInfo: (store) => store.getters[`${ PRODUCT_NAME }/byId`]?.(HCI.SETTING, 'server-version')?.value || 'unknown', - afterLoginRoute: home, - logoRoute: home, - supportCustomLogo: true - }); + store.watch( + (_state, getters) => ({ + isHarvesterPrime: !!getters['harvester-common/isHarvesterPrime'], + isDark: getters['prefs/theme'] === 'dark', + privateLabel: getters['harvester-common/privateLabel'] + }), + ({ isHarvesterPrime, isDark, privateLabel }) => { + const primeLogo = isDark ? require('../assets/images/dark/suse-virtualization.svg') : require('../assets/images/suse-virtualization.svg'); + + setVendor(privateLabel || ''); + + const primeLabelKey = privateLabel ? 'harvester.branding.primeLabel' : 'harvester.branding.primeEmptyLabel'; + + store.dispatch('setIsSingleProduct', { + productName: PRODUCT_NAME, + logo: isHarvesterPrime ? primeLogo : require(`@shell/assets/images/providers/harvester.svg`), + productNameKey: isHarvesterPrime ? primeLabelKey : 'harvester.productLabel', + getVersionInfo: (store) => store.getters[`${ PRODUCT_NAME }/byId`]?.(HCI.SETTING, 'server-version')?.value || 'unknown', + afterLoginRoute: home, + logoRoute: home, + supportCustomLogo: !isHarvesterPrime + }); + }, + { immediate: true } + ); } product({ diff --git a/pkg/harvester/l10n/en-us.yaml b/pkg/harvester/l10n/en-us.yaml index 785378a8..bb3a1f64 100644 --- a/pkg/harvester/l10n/en-us.yaml +++ b/pkg/harvester/l10n/en-us.yaml @@ -84,6 +84,8 @@ dialog: harvester: branding: + primeLabel: '{vendor}' + primeEmptyLabel: '' logos: tip: 'Upload a logo to replace the Harvester logo in the top-level navigation header. Image height should be 21 pixels with a max width of 200 pixels. Max file size is 20KB. Accepted formats: JPEG, PNG, SVG.' favicon: diff --git a/pkg/harvester/pages/c/_cluster/brand/index.vue b/pkg/harvester/pages/c/_cluster/brand/index.vue index 047d57dc..fd493e2a 100644 --- a/pkg/harvester/pages/c/_cluster/brand/index.vue +++ b/pkg/harvester/pages/c/_cluster/brand/index.vue @@ -63,6 +63,7 @@ export default { return { vendor: getVendor(), uiPLSetting: {}, + privateLabelDraft: null, uiLogoDarkSetting: {}, uiLogoDark: '', uiLogoLightSetting: {}, @@ -81,6 +82,17 @@ export default { }; }, computed: { + isHarvesterPrime() { + return !!this.$store.getters['harvester-common/isHarvesterPrime']; + }, + privateLabel: { + get() { + return this.privateLabelDraft ?? (this.isHarvesterPrime ? this.$store.getters['harvester-common/privateLabel'] : this.uiPLSetting.value); + }, + set(value) { + this.privateLabelDraft = value; + } + }, mode() { const schema = this.$store.getters[`management/schemaFor`](MANAGEMENT.SETTING); @@ -112,7 +124,7 @@ export default { this.errors.push(e); }, async save(btnCB) { - this.uiPLSetting.value = this.uiPLSetting.value.replaceAll(/[\<>&=#()"]/gm, ''); + this.uiPLSetting.value = (this.privateLabel || '').replaceAll(/[\<>&=#()"]/gm, ''); if (this.customizeLogo) { this.uiLogoLightSetting.value = this.uiLogoLight; this.uiLogoDarkSetting.value = this.uiLogoDark; @@ -169,7 +181,7 @@ export default {
{ + const setting = rootGetters['harvester/byId']?.(HCI.SETTING, 'server-flavor'); + + return (setting?.value || setting?.default) === 'prime'; + }, + + privateLabel: (_state, getters, _rootState, rootGetters) => { + const setting = rootGetters['management/byId']?.(MANAGEMENT.SETTING, SETTING.PL); + const value = setting?.value || ''; + + if (getters.isHarvesterPrime && value === (setting?.default || 'Harvester')) { + return ''; + } + + return value; + }, + getBundleId(state) { return state.latestBundleId; },