From abf3325923eae7ffd5b368712710153ea7701da5 Mon Sep 17 00:00:00 2001 From: Pier-Jean Malandrino Date: Thu, 9 Apr 2026 15:51:59 +0200 Subject: [PATCH] feat: single source of truth for app version from health check Read version from the backend /api/health endpoint instead of hardcoding from package.json at build time. Add About section in Settings with link to the DZone design article. --- frontend/src/features/feature-flags/store.ts | 15 ++++- .../features/settings/ui/SettingsPanel.vue | 61 ++++++++++++++++++- frontend/src/shared/ui/AppSidebar.vue | 5 +- 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/frontend/src/features/feature-flags/store.ts b/frontend/src/features/feature-flags/store.ts index 967aaa7..8beff0e 100644 --- a/frontend/src/features/feature-flags/store.ts +++ b/frontend/src/features/feature-flags/store.ts @@ -7,6 +7,7 @@ type DeploymentMode = 'self-hosted' | 'huggingface' interface HealthResponse { status: string + version?: string engine: ConversionEngine deploymentMode?: DeploymentMode maxPageCount?: number @@ -41,6 +42,7 @@ export const useFeatureFlagStore = defineStore('feature-flags', () => { const deploymentMode = ref(null) const maxPageCount = ref(0) const maxFileSizeMb = ref(0) + const appVersion = ref(__APP_VERSION__) const loaded = ref(false) const error = ref(null) @@ -62,6 +64,7 @@ export const useFeatureFlagStore = defineStore('feature-flags', () => { deploymentMode.value = data.deploymentMode ?? 'self-hosted' maxPageCount.value = data.maxPageCount ?? 0 maxFileSizeMb.value = data.maxFileSizeMb ?? 0 + if (data.version) appVersion.value = data.version loaded.value = true error.value = null } catch (e) { @@ -70,5 +73,15 @@ export const useFeatureFlagStore = defineStore('feature-flags', () => { } } - return { engine, deploymentMode, maxPageCount, maxFileSizeMb, loaded, error, isEnabled, load } + return { + engine, + deploymentMode, + maxPageCount, + maxFileSizeMb, + appVersion, + loaded, + error, + isEnabled, + load, + } }) diff --git a/frontend/src/features/settings/ui/SettingsPanel.vue b/frontend/src/features/settings/ui/SettingsPanel.vue index 0356e1d..40fba3b 100644 --- a/frontend/src/features/settings/ui/SettingsPanel.vue +++ b/frontend/src/features/settings/ui/SettingsPanel.vue @@ -36,15 +36,43 @@ {{ version }} + + @@ -118,4 +146,35 @@ const { t } = useI18n() color: var(--text); font-family: 'IBM Plex Mono', monospace; } + +.about-link { + display: inline-flex; + align-items: center; + gap: 6px; + font-size: 13px; + color: var(--text-secondary); + text-decoration: none; + padding: 8px 12px; + border: 1px solid var(--border); + border-radius: var(--radius-sm); + background: var(--bg-elevated); + transition: all var(--transition); + width: fit-content; +} +.about-link:hover { + color: var(--accent); + border-color: var(--accent); + background: var(--accent-muted); +} +.about-link-icon { + width: 16px; + height: 16px; + flex-shrink: 0; +} +.about-link-external { + width: 12px; + height: 12px; + flex-shrink: 0; + opacity: 0.4; +} diff --git a/frontend/src/shared/ui/AppSidebar.vue b/frontend/src/shared/ui/AppSidebar.vue index 7a163f1..acf7523 100644 --- a/frontend/src/shared/ui/AppSidebar.vue +++ b/frontend/src/shared/ui/AppSidebar.vue @@ -97,10 +97,13 @@