From e9e01165d4eb50d4b7d676255095a93dea0e4503 Mon Sep 17 00:00:00 2001 From: Eli Bosley Date: Sat, 10 Oct 2026 16:06:13 -0400 Subject: [PATCH 1/3] fix(web): refresh compact header expiry when server state changes --- .../components/HeaderServerStatus.test.ts | 93 +++++++++++++++++++ .../components/UserProfile/ServerStatus.vue | 11 ++- .../components/UserProfile/UptimeExpire.vue | 6 +- 3 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 web/__test__/components/HeaderServerStatus.test.ts diff --git a/web/__test__/components/HeaderServerStatus.test.ts b/web/__test__/components/HeaderServerStatus.test.ts new file mode 100644 index 0000000000..cb3e194648 --- /dev/null +++ b/web/__test__/components/HeaderServerStatus.test.ts @@ -0,0 +1,93 @@ +import { nextTick } from 'vue'; +import { createPinia, setActivePinia } from 'pinia'; +import { mount } from '@vue/test-utils'; + +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; + +import type { VueWrapper } from '@vue/test-utils'; + +import ServerStatus from '~/components/UserProfile/ServerStatus.vue'; +import UptimeExpire from '~/components/UserProfile/UptimeExpire.vue'; +import { useServerStore } from '~/store/server'; +import { createTestI18n } from '../utils/i18n'; + +vi.mock('~/store/server', async () => { + const { defineStore } = await import('pinia'); + return { + useServerStore: defineStore('server', { + state: () => ({ + state: 'LIFETIME', + uptime: Date.now() - 9 * 86400000, + expireTime: Date.now() + 14 * 86400000, + dateTimeFormat: { date: '%c', time: '%R' }, + }), + }), + }; +}); + +vi.mock('@unraid/ui', () => { + const slot = { template: '
' }; + return { + cn: (...values: string[]) => values.filter(Boolean).join(' '), + Tooltip: slot, + TooltipContent: slot, + TooltipProvider: slot, + TooltipTrigger: slot, + }; +}); + +describe('header uptime and expiry states', () => { + let wrapper: VueWrapper | undefined; + + beforeEach(() => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2026-10-10T12:00:00Z')); + setActivePinia(createPinia()); + }); + + afterEach(() => { + wrapper?.unmount(); + vi.clearAllTimers(); + vi.useRealTimers(); + }); + + it('refreshes the compact timestamp when a running server changes to a trial or expired trial', async () => { + wrapper = mount(ServerStatus, { + global: { plugins: [createTestI18n()], stubs: { UpcServerState: true } }, + }); + const server = useServerStore(); + expect(wrapper.text()).toContain('Uptime 9 days'); + + server.state = 'TRIAL'; + await nextTick(); + expect(wrapper.text()).toContain('Expires in 14 days'); + expect(wrapper.text()).not.toContain('Expires in 9 days'); + + server.expireTime = Date.now() + 17 * 86400000; + await nextTick(); + expect(wrapper.text()).toContain('Expires in 17 days'); + + server.state = 'ENOCONN'; + await nextTick(); + expect(wrapper.text()).toContain('Expires in 17 days'); + + server.state = 'EEXPIRED'; + server.expireTime = Date.now() - 2 * 86400000; + await nextTick(); + expect(wrapper.text()).toContain('Expired 2 days'); + }); + + it('keeps compact expiry to its largest unit while preserving the full expiry display', () => { + const server = useServerStore(); + server.state = 'TRIAL'; + server.expireTime = Date.now() + 14 * 86400000 + 2 * 3600000 + 3 * 60000; + wrapper = mount(UptimeExpire, { + props: { shortText: true }, + global: { plugins: [createTestI18n()] }, + }); + expect(wrapper.text()).toBe('Expires in 14 days'); + wrapper.unmount(); + wrapper = mount(UptimeExpire, { global: { plugins: [createTestI18n()] } }); + expect(wrapper.text()).toContain('14 days 2 hours 3 minutes'); + }); +}); diff --git a/web/src/components/UserProfile/ServerStatus.vue b/web/src/components/UserProfile/ServerStatus.vue index c1fcca2675..7d58147788 100644 --- a/web/src/components/UserProfile/ServerStatus.vue +++ b/web/src/components/UserProfile/ServerStatus.vue @@ -1,10 +1,19 @@ diff --git a/web/src/components/Header.standalone.vue b/web/src/components/Header.standalone.vue index 7630aad806..d68978cb24 100644 --- a/web/src/components/Header.standalone.vue +++ b/web/src/components/Header.standalone.vue @@ -29,12 +29,8 @@ import { useThemeStore } from '~/store/theme'; * multi-component header (`unraid-header-os-version` + `unraid-user-profile`) is * rendered instead. * - * Layout is a CSS grid so a single `actions` block (bell + account menu) can be - * repositioned across the breakpoint without duplicating stateful components: - * - mobile: app-style — logo + actions share the top row, then version, then - * status, then name. - * - sm+: two columns — logo/version on the left, status over name+actions on the - * right (the prior desktop look). + * A single grid keeps stateful controls mounted once. On mobile the version and + * update notice span the header width instead of competing with account actions. */ export interface Props { server?: Server | string; @@ -73,10 +69,6 @@ const theme = computed(() => themeStore.theme); const logoStyle = computed(() => props.headerLogoStyle === 'theme' ? 'theme' : 'gradient' ); -// On mobile the meta row spans full width over the banner image, so its text -// needs its own legibility treatment (drop-shadow) rather than the right-only -// banner gradient. Only when a banner image is present, otherwise the header is -// a solid color the theme text already reads against. const hasBanner = computed(() => theme.value?.banner === true); const dropdownOpen = ref(false); @@ -90,23 +82,15 @@ const copyLanIp = async () => { {{ name }} - +
+ - - - - + + + + +
diff --git a/web/src/components/Header/ArrayUsage.vue b/web/src/components/Header/ArrayUsage.vue index f52bff0d76..05602d1414 100644 --- a/web/src/components/Header/ArrayUsage.vue +++ b/web/src/components/Header/ArrayUsage.vue @@ -47,14 +47,18 @@ const hasData = computed(() => array.value != null); diff --git a/web/src/components/Header/HeaderVersion.vue b/web/src/components/Header/HeaderVersion.vue index b280d57bc7..9f9d327007 100644 --- a/web/src/components/Header/HeaderVersion.vue +++ b/web/src/components/Header/HeaderVersion.vue @@ -5,6 +5,7 @@ import { storeToRefs } from 'pinia'; import { useLazyQuery } from '@vue/apollo-composable'; import { + ArrowPathIcon, ArrowTopRightOnSquareIcon, BellAlertIcon, ClipboardDocumentIcon, @@ -116,7 +117,8 @@ const updateOsStatus = computed(() => { return { badge: { color: 'yellow', - icon: ExclamationTriangleIcon, + icon: + rebootType.value === 'thirdPartyDriversDownloading' ? ArrowPathIcon : ExclamationTriangleIcon, }, href: rebootType.value === 'downgrade' ? WEBGUI_TOOLS_DOWNGRADE : WEBGUI_TOOLS_UPDATE, text: t(rebootTypeText.value), @@ -146,7 +148,7 @@ const updateOsStatus = computed(() => { + + diff --git a/web/src/components/UserProfile/DropdownTrigger.vue b/web/src/components/UserProfile/DropdownTrigger.vue index 87a0c14be5..880ef54207 100644 --- a/web/src/components/UserProfile/DropdownTrigger.vue +++ b/web/src/components/UserProfile/DropdownTrigger.vue @@ -15,6 +15,8 @@ import BrandAvatar from '~/components/Brand/Avatar.vue'; import { useErrorsStore } from '~/store/errors'; import { useServerStore } from '~/store/server'; +const { compact = false } = defineProps<{ compact?: boolean }>(); + const { t } = useI18n(); const { errors } = storeToRefs(useErrorsStore()); @@ -68,7 +70,9 @@ const title = computed((): string => { /> - + + diff --git a/web/test-pages/combined-header.js b/web/test-pages/combined-header.js new file mode 100644 index 0000000000..5e721e54b2 --- /dev/null +++ b/web/test-pages/combined-header.js @@ -0,0 +1,199 @@ +import { createApp, h, ref } from 'vue'; +import { createPinia } from 'pinia'; +import { DefaultApolloClient, provideApolloClient } from '@vue/apollo-composable'; + +import { ApolloClient, ApolloLink, InMemoryCache, Observable } from '@apollo/client/core'; +import Header from '/src/components/Header.standalone.vue'; +import { ARRAY_CAPACITY_QUERY } from '/src/components/Header/arrayCapacity.query'; +import { notificationsOverview } from '/src/components/Notifications/graphql/notification.query'; +import { createI18nInstance, ensureLocale } from '/src/helpers/i18n-loader'; +import { useServerStore } from '/src/store/server'; +import { useThemeStore } from '/src/store/theme'; + +import '/src/assets/main.css'; +import '@unraid/ui/styles'; + +const params = new URLSearchParams(location.search); +let usedPercent = Math.min(100, Math.max(0, Number(params.get('used') || 38))); +let arrayState = params.get('array') === 'stopped' ? 'STOPPED' : 'STARTED'; +const arrayData = () => ({ + id: 'preview-array', + state: arrayState, + capacity: { kilobytes: { total: '100', free: String(100 - usedPercent), used: String(usedPercent) } }, +}); +const counts = { info: 0, warning: 0, alert: 0, total: 0 }; +if (params.get('notification')) { + counts[params.get('notification')] = 2; + counts.total = 2; +} +const overview = () => ({ unread: { ...counts }, archive: { info: 0, warning: 0, alert: 0, total: 0 } }); +const client = new ApolloClient({ + cache: new InMemoryCache(), + link: new ApolloLink( + (operation) => + new Observable((observer) => { + if (operation.query.definitions.some((def) => def.operation === 'subscription')) return; + const data = { + customization: null, + vars: null, + config: null, + owner: null, + registration: null, + cloud: null, + recalculateOverview: overview(), + array: arrayData(), + info: { + id: 'preview-info', + primaryNetwork: null, + os: { id: 'preview-os', hostname: 'Tower' }, + versions: { id: 'preview-versions', core: { unraid: '7.4.0-beta.3', api: '4.37.5' } }, + }, + notifications: { + id: 'preview-notifications', + overview: overview(), + list: [], + }, + }; + observer.next({ data }); + observer.complete(); + }) + ), +}); +provideApolloClient(client); +const pinia = createPinia(); +const server = { + name: params.has('long') ? 'Home-Media-and-Backup-Server-With-A-Long-Name' : 'Tower', + description: 'Media server', + osVersion: '7.4.0-beta.3', + rebootType: 'update', + state: params.get('license') || 'LIFETIME', + registered: false, + lanIp: '192.0.2.10', + connectPluginInstalled: params.has('no-connect') ? '' : 'dynamix.unraid.net.plg', + guid: 'PREVIEW-GUID', + keyfile: '', + dateTimeFormat: { date: '%c', time: '%R' }, + uptime: Date.now() - 9 * 86400000, + expireTime: Date.now() + (params.get('license') === 'EEXPIRED' ? -2 : 14) * 86400000, + deviceCount: 4, +}; +const theme = + getComputedStyle(document.documentElement).getPropertyValue('--theme-name').trim() || 'black'; +// Match the custom dark header and light text in the reported mobile banner. +if (params.get('header') === 'dark') { + document.documentElement.style.setProperty('--header-background-color', '#1c1b1b'); + document.documentElement.style.setProperty('--header-text-color', '#f2f2f2'); +} +const usage = ref(params.has('usage')); +const logoStyle = ref(params.get('logo') === 'theme' ? 'theme' : 'gradient'); +const app = createApp({ + setup() { + const themeStore = useThemeStore(); + const serverStore = useServerStore(); + const hasBanner = !params.has('no-banner'); + const hasFade = !params.has('no-fade'); + themeStore.setTheme({ + name: theme, + banner: hasBanner, + bannerGradient: hasFade, + descriptionShow: true, + }); + document.querySelector('#header').classList.toggle('image', hasBanner); + document.querySelector('#banner').checked = hasBanner; + document.querySelector('#fade').checked = hasFade; + if (!hasFade) document.documentElement.style.setProperty('--banner-gradient', 'none'); + document.querySelector('#usage').checked = usage.value; + document.querySelector('#long-name').checked = params.has('long'); + document.querySelector('#license').value = server.state; + document.querySelector('#logo-style').value = logoStyle.value; + document.querySelector('#array-state').value = arrayState; + document.querySelector('#array-used').value = usedPercent; + document.querySelector('#notification').value = params.get('notification') || 'none'; + + const setStatus = (status) => { + const updateAvailable = status === 'available' || status === 'renewal'; + const rebootType = ['update', 'downgrade', 'thirdPartyDriversDownloading'].includes(status) + ? status + : ''; + serverStore.rebootType = server.rebootType = rebootType; + serverStore.regUpdatesExpired = server.regUpdatesExpired = status === 'renewal'; + serverStore.regExp = server.regExp = status === 'renewal' ? 1 : 0; + serverStore.updateOsResponse = server.updateOsResponse = updateAvailable + ? { + version: '7.4.0-rc.1', + name: 'Unraid 7.4.0-rc.1', + date: '2026-10-09', + isEligible: status !== 'renewal', + isNewer: true, + changelog: null, + sha256: null, + } + : undefined; + document.querySelector('#reboot').checked = Boolean(rebootType); + document.querySelector('#operating-state').value = status; + }; + setStatus(params.get('status') || 'update'); + document + .querySelector('#operating-state') + .addEventListener('change', (event) => setStatus(event.target.value)); + document.querySelector('#array-state').addEventListener('change', (event) => { + arrayState = event.target.value; + client.writeQuery({ query: ARRAY_CAPACITY_QUERY, data: { array: arrayData() } }); + }); + document.querySelector('#array-used').addEventListener('change', (event) => { + usedPercent = Math.min(100, Math.max(0, Number(event.target.value))); + client.writeQuery({ query: ARRAY_CAPACITY_QUERY, data: { array: arrayData() } }); + }); + document.querySelector('#notification').addEventListener('change', (event) => { + Object.assign(counts, { info: 0, warning: 0, alert: 0, total: 0 }); + if (event.target.value !== 'none') { + counts[event.target.value] = 2; + counts.total = 2; + } + client.writeQuery({ + query: notificationsOverview, + data: { notifications: { id: 'preview-notifications', overview: overview() } }, + }); + }); + document + .querySelector('#logo-style') + .addEventListener('change', (event) => (logoStyle.value = event.target.value)); + document.querySelector('#fade').addEventListener('change', (event) => { + themeStore.setTheme({ bannerGradient: event.target.checked }); + document.documentElement.style.setProperty( + '--banner-gradient', + event.target.checked + ? 'linear-gradient(90deg, transparent 0, var(--header-gradient-end) var(--banner-gradient-stop, 30%))' + : 'none' + ); + }); + document.querySelector('#banner').addEventListener('change', (event) => { + themeStore.setTheme({ banner: event.target.checked }); + document.querySelector('#header').classList.toggle('image', event.target.checked); + }); + document + .querySelector('#reboot') + .addEventListener('change', (event) => setStatus(event.target.checked ? 'update' : 'normal')); + document + .querySelector('#long-name') + .addEventListener( + 'change', + (event) => + (serverStore.name = server.name = + event.target.checked ? 'Home-Media-and-Backup-Server-With-A-Long-Name' : 'Tower') + ); + document + .querySelector('#usage') + .addEventListener('change', (event) => (usage.value = event.target.checked)); + document.querySelector('#license').addEventListener('change', (event) => { + serverStore.state = server.state = event.target.value; + serverStore.expireTime = server.expireTime = + Date.now() + (event.target.value === 'EEXPIRED' ? -2 : 14) * 86400000; + }); + + return () => h(Header, { server, showArrayUsage: usage.value, headerLogoStyle: logoStyle.value }); + }, +}); +const i18n = createI18nInstance(); +await ensureLocale(i18n, params.get('locale') || 'en_US'); +app.use(pinia).use(i18n).provide(DefaultApolloClient, client).mount('#header-preview'); diff --git a/web/test-pages/header-banner.png b/web/test-pages/header-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..9981e9f03684764b43f61b14729f5d902120b847 GIT binary patch literal 62764 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 + + + + + Combined header preview + {% set resolvedTheme = query.theme or resolvedTheme %} + {% include "partials/styles.njk" %} + + + + +
+ + + + + + + + + + + +
+

Illustrative server data. Resize the browser and use ?theme=white, black, gray, or azure.

+ + + From bfaae1c9cd39e69c0415c28e2d6f80e647f404e2 Mon Sep 17 00:00:00 2001 From: Eli Bosley Date: Sat, 10 Oct 2026 16:22:31 -0400 Subject: [PATCH 3/3] fix(web): address combined header review feedback --- web/__test__/components/HeaderThemes.test.ts | 6 +++++- web/test-pages/combined-header.js | 8 ++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/web/__test__/components/HeaderThemes.test.ts b/web/__test__/components/HeaderThemes.test.ts index e582c5e1ea..762905501c 100644 --- a/web/__test__/components/HeaderThemes.test.ts +++ b/web/__test__/components/HeaderThemes.test.ts @@ -1,4 +1,5 @@ import { readFileSync } from 'node:fs'; +import { URL as NodeURL } from 'node:url'; import { nextTick, ref } from 'vue'; import { setActivePinia } from 'pinia'; @@ -189,7 +190,10 @@ describe('Header.standalone.vue theme layout', () => { it('embeds the original WebGUI logo asset without reconstructing its paths', () => { const image = mountWithTheme('white').get('.uh-logo-block img'); - const original = readFileSync('../api/dev/webGui/images/UN-logotype-gradient.svg', 'utf8'); + const original = readFileSync( + new NodeURL('../../../api/dev/webGui/images/UN-logotype-gradient.svg', import.meta.url), + 'utf8' + ); expect(decodeURIComponent(image.attributes('src')!.replace('data:image/svg+xml,', ''))).toBe( original ); diff --git a/web/test-pages/combined-header.js b/web/test-pages/combined-header.js index 5e721e54b2..143e59c1b0 100644 --- a/web/test-pages/combined-header.js +++ b/web/test-pages/combined-header.js @@ -14,7 +14,11 @@ import '/src/assets/main.css'; import '@unraid/ui/styles'; const params = new URLSearchParams(location.search); -let usedPercent = Math.min(100, Math.max(0, Number(params.get('used') || 38))); +const normalizeUsedPercent = (value) => { + const parsed = Number(value); + return Number.isFinite(parsed) ? Math.min(100, Math.max(0, parsed)) : 38; +}; +let usedPercent = normalizeUsedPercent(params.get('used') || 38); let arrayState = params.get('array') === 'stopped' ? 'STOPPED' : 'STARTED'; const arrayData = () => ({ id: 'preview-array', @@ -141,7 +145,7 @@ const app = createApp({ client.writeQuery({ query: ARRAY_CAPACITY_QUERY, data: { array: arrayData() } }); }); document.querySelector('#array-used').addEventListener('change', (event) => { - usedPercent = Math.min(100, Math.max(0, Number(event.target.value))); + usedPercent = normalizeUsedPercent(event.target.value); client.writeQuery({ query: ARRAY_CAPACITY_QUERY, data: { array: arrayData() } }); }); document.querySelector('#notification').addEventListener('change', (event) => {