Tags: unraid/api
Tags
feat(onboarding): add shared loading states (#1945) ## Summary This PR adds a shared onboarding loading state and reuses it anywhere the onboarding modal can feel stalled while waiting on async work. ## Problem We had a few spots in onboarding where the UI could appear to hang: - Closing the modal from the `x` could lag while the close flow completed. - Some onboarding steps depend on server data before they can render useful content. - Those waits did not have a consistent loading treatment, so the modal could feel unresponsive. ## What changed - Added a reusable `OnboardingLoadingState` component for onboarding-specific loading UI. - Updated `OnboardingModal` to swap into that loading state while the exit flow is finishing. - Reused the same loading state when the modal is waiting on enough onboarding context to resolve the next step. - Reused the loading state in the internal boot step while internal boot context is loading. - Reused the loading state in the plugins step while installed plugin data is loading. - Added English localization strings for the new loading copy. - Extended onboarding tests to cover the new loading behavior. ## User-facing behavior Users can now see the loading state in these places: - After confirming exit from the onboarding modal via the `x` flow. - While the modal is still waiting on onboarding context needed to determine which step to render. - In the plugins step while the installed plugins query is still pending. - In the internal boot step while storage boot options are still loading. ## Not in scope The core settings step still renders immediately from default or draft values and then hydrates server-backed values as queries resolve. This PR does not add a full loading screen for that step. ## Files of interest - `web/src/components/Onboarding/components/OnboardingLoadingState.vue` - `web/src/components/Onboarding/OnboardingModal.vue` - `web/src/components/Onboarding/steps/OnboardingInternalBootStep.vue` - `web/src/components/Onboarding/steps/OnboardingPluginsStep.vue` - `web/src/locales/en.json` - `web/__test__/components/Onboarding/OnboardingModal.test.ts` - `web/__test__/components/Onboarding/OnboardingPluginsStep.test.ts` ## Verification Passed locally: - `cd web && pnpm type-check` - `cd web && pnpm lint` - `cd web && pnpm exec vitest run __test__/components/Onboarding/OnboardingModal.test.ts __test__/components/Onboarding/internalBoot.test.ts __test__/components/Onboarding/OnboardingPluginsStep.test.ts` - `cd api && pnpm type-check` - `cd api && pnpm lint` - `cd api && pnpm test` Known local note: - `cd web && pnpm test` still fails in this worktree because of a local `@unraid/ui` build/module-resolution issue in the worktree setup. The failure reproduced across unrelated suites and did not point back to the onboarding change itself. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added a reusable onboarding loading-state UI and used it in the modal, plugin list, and internal boot step. * Modal now shows a closing/loading state and disables interaction while the close flow is in progress. * **Tests** * Tests added/updated to assert the modal shows the loading state while close is pending; test mocks include a spinner. * **Localization** * Added i18n strings for loading and closing states. * **Chores** * Registered the new global component type. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
chore(main): release 4.31.1 (#1951) 🤖 I have created a release *beep* *boop* --- ## [4.31.1](v4.31.0...v4.31.1) (2026-03-23) ### Bug Fixes * **onboarding:** separate apply and completion flows ([#1948](#1948)) ([5be53a4](5be53a4)) * reload var state when emhttp writes temp files ([#1950](#1950)) ([7265105](7265105)) * **state-watch:** watch canonical ini files atomically ([#1953](#1953)) ([6471b3f](6471b3f)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
chore(main): release 4.31.0 (#1939) 🤖 I have created a release *beep* *boop* --- ## [4.31.0](v4.30.1...v4.31.0) (2026-03-23) ### Features * **api:** support encrypted array start inputs ([#1944](#1944)) ([018a8d5](018a8d5)) * **onboarding:** add shared loading states ([#1945](#1945)) ([776c8cc](776c8cc)) * Serverside state for onboarding display ([#1936](#1936)) ([682d51c](682d51c)) ### Bug Fixes * **api:** reconcile emhttp state without spinning disks ([#1946](#1946)) ([d3e0b95](d3e0b95)) * **onboarding:** auto-open incomplete onboarding on 7.3+ ([#1940](#1940)) ([f0241a8](f0241a8)) * **onboarding:** replace internal boot native selects ([#1942](#1942)) ([d6ea032](d6ea032)) * preserve onboarding resume state on reload ([#1941](#1941)) ([91f7fe9](91f7fe9)) * recover VM availability after reconnect ([#1947](#1947)) ([e064de7](e064de7)) * Unify callback server payloads ([#1938](#1938)) ([f58fcc0](f58fcc0)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
fix(web): unify UPC license actions into manage/trial entry (#1929) ## Summary - Collapse UPC legacy license actions (`redeem`, `purchase`, `recover`, `activate`) into a single entry. - Show a single button label of `Manage License / Start Trial` when trial start is available. - Keep the action routed through Manage License (`myKeys`) to preserve one-click behavior. - Restore `trialStart` account/server action plumbing so trial availability can be represented in UPC state/action lists. ## Testing - `pnpm exec vitest run __test__/store/account.test.ts __test__/components/Registration.test.ts __test__/store/server.test.ts` - `pnpm type-check` <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Introduced a new "Start Trial" action available from the license management menu, allowing users to begin a trial period even without an active license key. * Enhanced the license management interface by consolidating multiple license-related actions (activate, recover, purchase, redeem, and start trial) into a unified "Manage License" view with dynamic, context-aware menu labels. * **Tests** * Added test coverage for the new trial start functionality across account and component tests. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
fix(onboarding): add explicit EFI loader path for flash entry (#1926) ## Summary - update API onboarding internal-boot BIOS update flow to create the flash UEFI entry with an explicit loader path - keep scope API-only (no webgui repo changes) - update onboarding internal-boot service spec to assert the new efibootmgr args ## Why Some motherboards fail to boot the USB entry in UEFI mode when the NVRAM boot entry is created without an explicit loader path, even when `EFI/BOOT/BOOTX64.EFI` exists. ## Change Details - flash boot entry command now includes `-l \EFI\BOOT\BOOTX64.EFI` - internal boot entry behavior is unchanged ## Testing - attempted: `pnpm --filter ./api test src/unraid-api/graph/resolvers/onboarding/onboarding-internal-boot.service.spec.ts` - note: not executed in this fresh worktree because dependencies are not installed (`vitest: command not found`) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Boot entry creation now includes the EFI loader path, improving reliability of system boot setup. * Skips creating BIOS entries for disks that cannot be resolved from assignable disks and avoids adding invalid boot entries. * **Improvements** * Internal-boot UI now prefers disk serial number first (then disk ID, then device) for more consistent selection. * Expanded diagnostic and debug logging around boot device resolution and BIOS/boot update flows. * **Tests** * Tests updated to cover assignable-disk resolution, expected output messages for unresolved disks, and BIOS update paths. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
chore(main): release 4.30.1 (#1931) 🤖 I have created a release *beep* *boop* --- ## [4.30.1](v4.30.0...v4.30.1) (2026-03-18) ### Bug Fixes * **web:** unify UPC license actions into manage/trial entry ([#1929](#1929)) ([164198c](164198c)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
chore(main): release 4.30.0 (#1858) 🤖 I have created a release *beep* *boop* --- ## [4.30.0](v4.29.2...v4.30.0) (2026-03-18) ### Features * add internal boot step to onboarding flow ([#1881](#1881)) ([337aecc](337aecc)) * Add TPM licensing availability to registration ([#1908](#1908)) ([aa162eb](aa162eb)) * add UPS power ([#1874](#1874)) ([b531aed](b531aed)) * **api:** alert when usb boot has internal boot target ([#1898](#1898)) ([b94df47](b94df47)) * **api:** expose internal boot devices in array GraphQL ([#1894](#1894)) ([0736709](0736709)) * docker overview ([#1855](#1855)) ([9ef1cf1](9ef1cf1)) * **docker:** add update actions to container context menu ([#1867](#1867)) ([4ca3e06](4ca3e06)) * **docker:** disable containers page file modification ([#1870](#1870)) ([aaa0372](aaa0372)) * issues/1597: Temperature Monitoring - Thanks @MitchellThompkins ([a1be458](a1be458)) * New Crowdin updates ([#1809](#1809)) ([a7b3f07](a7b3f07)) * New Crowdin updates ([#1883](#1883)) ([14a8fa8](14a8fa8)) * **onboarding:** add new onboarding flows for Unraid OS ([#1746](#1746)) ([15bd747](15bd747)) * registration and trial actions use Account app ([#1928](#1928)) ([c2c0425](c2c0425)) * share internal boot state ([#1921](#1921)) ([8e4d44d](8e4d44d)) * **web:** show TPM move control for trial licenses ([#1911](#1911)) ([d00fb63](d00fb63)) ### Bug Fixes * Add dedicated TPM license move option ([#1909](#1909)) ([36c56f7](36c56f7)) * allow free USB targets in onboarding internal boot setup ([#1903](#1903)) ([298da54](298da54)) * API key key display truncation ([#1890](#1890)) ([b12f75c](b12f75c)) * **api:** harden PHP wrapper args for newer PHP versions ([#1901](#1901)) ([849f177](849f177)) * **api:** prevent flash notification startup fd exhaustion ([#1893](#1893)) ([4b231ad](4b231ad)) * clear stale onboarding modal session state ([#1904](#1904)) ([23f7836](23f7836)) * consistently clear onboarding draft ([#1916](#1916)) ([199d803](199d803)) * correct graphql-api.log timestamp formatting ([#1918](#1918)) ([243c5a8](243c5a8)) * **deps:** pin dependencies ([#1878](#1878)) ([db88eb8](db88eb8)) * **docker:** change "visit" to "webui" & use correct link ([#1863](#1863)) ([cab0880](cab0880)) * **docker:** improve start/stop UX with visual feedback ([#1865](#1865)) ([c084e25](c084e25)) * **docker:** remove aggressive caching to ensure data correctness ([#1864](#1864)) ([1c1bae8](1c1bae8)) * **docker:** sync template mappings in organizer to prevent false orphan warnings ([#1866](#1866)) ([38a6f0c](38a6f0c)) * onboarding internal-boot warning panel contrast and semantics ([#1927](#1927)) ([bb6f241](bb6f241)) * **onboarding:** add explicit EFI loader path for flash entry ([#1926](#1926)) ([429b438](429b438)) * **onboarding:** extend onboarding refresh timeout ([#1925](#1925)) ([e2a5f44](e2a5f44)) * **onboarding:** persist installed plugins in summary ([#1915](#1915)) ([07f4ebd](07f4ebd)) * **onboarding:** refine storage boot setup UX ([#1900](#1900)) ([1108d0a](1108d0a)) * polish onboarding flow ([#1902](#1902)) ([8742cac](8742cac)) * preserve registration device limits after refresh ([#1905](#1905)) ([234bfc7](234bfc7)) * prevent onboarding on API errors ([#1917](#1917)) ([540d6f9](540d6f9)) * remap TPM guid prefix to 01 ([#1924](#1924)) ([5360b5b](5360b5b)) * Return null for corrupted/invalid API key files and add Connect fixtures test ([#1886](#1886)) ([013e6c5](013e6c5)) * share internal boot state across onboarding ([#1920](#1920)) ([f9b293f](f9b293f)) * too many file descriptors with thousands of notifications ([#1887](#1887)) ([7956987](7956987)) * Treat onboarding patch updates as completed ([#1884](#1884)) ([d03b25e](d03b25e)) * unify onboarding internal boot state refresh ([#1923](#1923)) ([d3032c1](d3032c1)) * **web:** refresh internal boot onboarding state ([#1913](#1913)) ([1ca2129](1ca2129)) * **web:** stop showing callback errors after successful key installs ([#1892](#1892)) ([45f1402](45f1402)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
fix: unraid-connect plugin not loaded when connect is installed (#1856) Previously, api plugins could only be installed as `peerDependencies` in the api. This change allows them to be listed as `dependencies` as well. This makes plugin loading (eg loading Connect) more robust. Tests: - [x] Re-logging on 7.3.0-beta.0.5
PreviousNext