From c437c89cfa459be59709f35ffe86785d645a0e7e Mon Sep 17 00:00:00 2001 From: Jeppe Bundgaard Date: Wed, 27 May 2026 13:23:22 +0200 Subject: [PATCH] Add release management enhancements, runtime-aware frontend updates, and extensive test coverage - Implement release update detection, asset preloading, and frontend version management. - Add unit and E2E tests for release update workflows, widget behavior, and failure scenarios. - Introduce new services for handling release ping, error reporting, and update installation workflows. - Extend i18n for release-related components and error report localization. - Add `ReleaseFrontendVersionBadge.vue` and related styles to display frontend update statuses. --- README.md | 22 + src/App.vue | 2 - .../department/pos/PosDepartmentMVP.vue | 42 +- .../PosDepartmentStepMobileButtonClearAll.vue | 35 +- .../displays/selfServe/SelfServeLaneStep.vue | 16 +- .../displays/selfServe/SelfServeTaskList.vue | 8 +- .../selfServe/SelfServeVehicleStep.vue | 10 + src/components/global/ErrorReportLauncher.vue | 45 +- .../page/wrappers/RestrictedPageWrapper.vue | 66 ++- .../release/ReleaseChannelSelector.vue | 14 +- .../release/ReleaseChannelSidebarSelector.vue | 80 ++- .../release/ReleaseFrontendVersionBadge.vue | 115 ++++ .../release/ReleaseUpdateWidget.vue | 232 ++++++++ src/components/session/token/SessionUser.vue | 137 ++++- src/components/shop/POSDepartmentProcess.vue | 78 ++- .../viewport/page/headers/DesktopHeader.vue | 8 +- .../page/headers/DesktopNavigationBuefy.vue | 39 ++ .../viewport/page/headers/MobileHeader.vue | 5 +- .../page/headers/MobileNavigation.vue | 40 +- .../viewport/page/headers/TabletHeader.vue | 8 +- src/composables/useWashSessionActions.js | 1 + src/i18n/generated/da-v2.json | 52 +- src/i18n/generated/de-v2.json | 52 +- src/i18n/generated/en-v2.json | 4 + src/i18n/generated/global-v2.json | 34 +- src/i18n/generated/no-v2.json | 54 +- src/i18n/generated/sv-v2.json | 54 +- src/i18n/locales/da.json | 34 +- src/i18n/locales/de.json | 34 +- src/i18n/locales/en.json | 34 +- src/i18n/locales/no.json | 34 +- src/i18n/locales/sv.json | 34 +- .../phrases/compat/configuration/index.json | 1 + .../da/phrases/compat/error_report/index.json | 51 +- .../da/phrases/compat/self_wash/index.json | 6 + .../phrases/compat/configuration/index.json | 3 +- .../de/phrases/compat/error_report/index.json | 49 +- .../de/phrases/compat/self_wash/index.json | 6 + .../phrases/compat/configuration/index.json | 1 + .../en/phrases/compat/error_report/index.json | 3 + .../en/phrases/compat/self_wash/index.json | 6 + .../global/shared/configuration/index.json | 3 +- .../global/shared/error_report/index.json | 33 ++ .../source/global/shared/self_wash/index.json | 6 + .../phrases/compat/configuration/index.json | 3 +- .../no/phrases/compat/error_report/index.json | 51 +- .../no/phrases/compat/self_wash/index.json | 6 + .../phrases/compat/configuration/index.json | 3 +- .../sv/phrases/compat/error_report/index.json | 51 +- .../sv/phrases/compat/self_wash/index.json | 6 + src/main.js | 16 - src/services/apiHealth.js | 57 ++ src/services/errorReportLauncher.js | 7 + src/services/releaseBootstrap.js | 21 +- src/services/releaseUpdate.js | 515 ++++++++++++++++++ src/services/selfServeDynamicImage.js | 95 +++- .../modules/Pos/posRouteState.js | 40 +- .../self-serve/DepartmentSelfServeStudio.vue | 78 ++- .../userDashboard/wash/MyWashStart.vue | 71 ++- tests/e2e/connectivityIssue.spec.ts | 2 +- tests/e2e/errorReports.spec.ts | 68 ++- tests/e2e/pos-mobile-order-flow.spec.js | 79 ++- tests/e2e/release-channel-unavailable.spec.js | 58 +- tests/e2e/release-update-widget.spec.js | 225 ++++++++ tests/e2e/self-serve-studio-flow.spec.js | 6 +- tests/e2e/self-serve-wash.spec.js | 2 +- tests/e2e/session-bootstrap.spec.ts | 85 +++ tests/unit/api-health.spec.js | 82 +++ tests/unit/my-wash-start.spec.js | 69 ++- tests/unit/pos-department-process.spec.js | 57 ++ tests/unit/pos-route-state.spec.js | 85 ++- tests/unit/release-bootstrap.spec.js | 24 + tests/unit/release-channel-selector.spec.js | 128 ++++- tests/unit/release-manager-i18n.spec.js | 6 + tests/unit/release-update.spec.js | 197 +++++++ tests/unit/restricted-page-wrapper.spec.js | 112 ++++ tests/unit/self-serve-dynamic-image.spec.js | 61 +++ tests/unit/self-serve-lane-step.spec.js | 81 +++ .../unit/self-serve-studio-task-scope.spec.js | 7 +- tests/unit/self-serve-task-list.spec.js | 9 + tests/unit/self-serve-vehicle-step.spec.js | 43 +- tests/unit/session-bootstrap.spec.js | 134 +++++ tests/unit/use-wash-session-actions.spec.js | 12 +- tests/unit/vite-api-proxy.spec.js | 22 +- vite.config.js | 30 +- 85 files changed, 3888 insertions(+), 407 deletions(-) create mode 100644 src/components/release/ReleaseFrontendVersionBadge.vue create mode 100644 src/components/release/ReleaseUpdateWidget.vue create mode 100644 src/i18n/source/global/shared/error_report/index.json create mode 100644 src/services/apiHealth.js create mode 100644 src/services/errorReportLauncher.js create mode 100644 src/services/releaseUpdate.js create mode 100644 tests/e2e/release-update-widget.spec.js create mode 100644 tests/e2e/session-bootstrap.spec.ts create mode 100644 tests/unit/api-health.spec.js create mode 100644 tests/unit/release-update.spec.js create mode 100644 tests/unit/restricted-page-wrapper.spec.js create mode 100644 tests/unit/self-serve-dynamic-image.spec.js create mode 100644 tests/unit/self-serve-lane-step.spec.js create mode 100644 tests/unit/session-bootstrap.spec.js diff --git a/README.md b/README.md index 13825300..7f12b538 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,28 @@ npm install npm run dev ``` +By default, the Vite dev server proxies `/api/*` to the remote stable API at +`https://api-v2.truckwash.io/master/api`. This lets the Vue app run locally +without a local PHP API container. + +To develop against a local PHP API instead: + +```powershell +$env:VITE_API_PROXY_TARGET="http://localhost"; npm run dev +``` + +To use another remote API route: + +```powershell +$env:VITE_API_PROXY_BASE_PATH="/canary/api"; npm run dev +``` + +For compatible local gateways that expect the `/api` prefix to be preserved: + +```powershell +$env:VITE_API_PROXY_TARGET="http://localhost"; $env:VITE_API_PROXY_STRIP_PREFIX="false"; npm run dev +``` + ### Compile and Minify for Production ```sh diff --git a/src/App.vue b/src/App.vue index 7e5185ed..bcc69e36 100644 --- a/src/App.vue +++ b/src/App.vue @@ -18,7 +18,6 @@ const { t, te, locale } = useI18n({ useScope: "global" }); const APP_TITLE = "Truck Wash"; const LayoutV2 = defineAsyncComponent(() => import("@/components/page/wrappers/LayoutV2.vue")); const DefaultPageWrapper = defineAsyncComponent(() => import("@/components/page/wrappers/DefaultPageWrapper.vue")); -const VersionCheck = defineAsyncComponent(() => import("@/components/global/VersionCheck.vue")); const RequestQueueProgress = defineAsyncComponent(() => import("@/components/global/RequestQueueProgress.vue")); const ErrorReportLauncher = defineAsyncComponent(() => import("@/components/global/ErrorReportLauncher.vue")); const ReleaseChannelUnavailable = defineAsyncComponent(() => @@ -123,7 +122,6 @@ watch([() => route.fullPath, locale], updateDocumentTitle, { immediate: true });
-
diff --git a/src/components/displays/department/pos/PosDepartmentMVP.vue b/src/components/displays/department/pos/PosDepartmentMVP.vue index b2773aa8..a5fd67d0 100644 --- a/src/components/displays/department/pos/PosDepartmentMVP.vue +++ b/src/components/displays/department/pos/PosDepartmentMVP.vue @@ -1,7 +1,16 @@ diff --git a/src/components/displays/department/pos/steps/mobile/elements/PosDepartmentStepMobileButtonClearAll.vue b/src/components/displays/department/pos/steps/mobile/elements/PosDepartmentStepMobileButtonClearAll.vue index d9a3783f..dc05d66d 100644 --- a/src/components/displays/department/pos/steps/mobile/elements/PosDepartmentStepMobileButtonClearAll.vue +++ b/src/components/displays/department/pos/steps/mobile/elements/PosDepartmentStepMobileButtonClearAll.vue @@ -1,34 +1,27 @@