Skip to content

[codex] Embed internal OS update checks on Tools page#2020

Draft
elibosley wants to merge 1 commit into
mainfrom
codex/internal-update-os-flow
Draft

[codex] Embed internal OS update checks on Tools page#2020
elibosley wants to merge 1 commit into
mainfrom
codex/internal-update-os-flow

Conversation

@elibosley
Copy link
Copy Markdown
Member

@elibosley elibosley commented Jun 1, 2026

Summary

  • Render the internal Update OS status flow directly on /Tools/Update instead of showing an account-app redirect prompt.
  • Automatically start the local update check on the Tools > Update OS page, or show the known update response when update data already exists.
  • Render the update-check response inline on the page using the existing modal content in embedded mode, similar to the downgrade page's embedded workflow.
  • Keep an explicit Check for Update action visible even when an update is already available, alongside the update CTA.
  • Update the standalone component test expectations for the internal and embedded Tools page flow.

Why

Users should be able to check for OS updates and use the internal updater from Tools > Update OS without leaving the OS. The previous landing prompt pushed them to the account app, and the update-check response appeared as a popup instead of as part of the page workflow.

Validation

  • pnpm type-check from web/
  • pnpm exec vitest run __test__/components/UpdateOs.test.ts __test__/components/CheckUpdateResponseModal.test.ts from web/

Summary by CodeRabbit

Release Notes

  • New Features

    • Added a dedicated "check for updates" button that appears when an update is available.
    • Improved update modal workflows with better organization of update information and responses.
  • Bug Fixes

    • Removed outdated redirect prompt to streamline the update experience.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jun 1, 2026

Review Change Stack

Walkthrough

This PR modularizes the UpdateOs component by removing Account-store integration, adding embedded modal rendering, implementing a dedicated refresh button, and updating tests to verify the new architecture. The standalone component now drives its own update-check and modal visibility on the tools update page via the updateOs store.

Changes

UpdateOs Component Refactor and Modal Updates

Layer / File(s) Summary
CheckUpdateResponseModal embedded rendering
web/src/components/UpdateOs/CheckUpdateResponseModal.vue
Component now supports an optional embedded prop (default false) and renders either a CardWrapper-based layout (when embedded) or a ResponsiveModal, with action buttons moved inline in embedded mode.
Status.vue refresh button and shared check handler
web/src/components/UpdateOs/Status.vue
Introduces checkForUpdates handler and showRefreshButton computed flag; adds a new conditional "check for update" button that invokes the shared handler and disables while checking.
UpdateOs.standalone refactor with modal integration
web/src/components/UpdateOs.standalone.vue
Removes Account-store wiring and redirect UI, switches to useUpdateOsStore initialization, simplifies onBeforeMount to set reboot version only, and adds onMounted logic that opens the modal or calls localCheckForUpdate on the tools update page when no reboot is pending. Template conditionally renders the update modals based on page context.
UpdateOs tests: mock updateOs store and add modal stubs
web/__test__/components/UpdateOs.test.ts
Removes BrandButton and WEBGUI_TOOLS_UPDATE mocks, introduces a dedicated useUpdateOsStore mock with update status fields and spies, adds stubs for UpdateOsCheckUpdateResponseModal and UpdateOsChangelogModal, resets the store state in beforeEach, and rewrites tests to assert store method calls and modal visibility across different route, rebootType, and availability scenarios.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 With Account waving goodbye,
UpdateOs stands tall and sky-high!
Modals embedded, buttons refresh,
The code now feels wonderfully fresh.
A hop, skip, and test—well designed!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title '[codex] Embed internal OS update checks on Tools page' directly and clearly describes the main change: embedding internal OS update functionality on the Tools page instead of redirecting elsewhere.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/internal-update-os-flow

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
web/__test__/components/UpdateOs.test.ts (1)

87-87: ⚡ Quick win

Rename these test cases to remove path-based wording that no longer affects behavior.

Current names suggest pathname controls rendering, but assertions now only verify status rendering independent of path.

Suggested rename pattern
-    it('shows the internal update status when path matches and rebootType is empty', async () => {
+    it('renders update status when rebootType is empty', async () => {

-    it('shows status when path does not match', async () => {
+    it('renders update status for non-Update paths', async () => {

-    it('shows status when rebootType is not empty', async () => {
+    it('renders update status when rebootType is set', async () => {

As per coding guidelines, “Test what the code does, not implementation details.”

Also applies to: 107-107, 126-126

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/__test__/components/UpdateOs.test.ts` at line 87, Rename the three test
case descriptions in UpdateOs.test.ts that reference path-based behavior (the
it(...) strings at the tests currently starting at lines with "shows the
internal update status when path matches and rebootType is empty" and the two
similar cases at the other locations) so they describe what the test actually
asserts: that the component renders the internal update status (and handles
rebootType being empty) regardless of pathname; update the it(...) titles to
something like "renders internal update status when rebootType is empty" (or
equivalent concise wording) for each affected test so the names reflect behavior
rather than path implementation details.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@web/__test__/components/UpdateOs.test.ts`:
- Around line 103-104: The test is asserting a prop on UpdateOsStatusStub which
only verifies the test stub, not the real UpdateOsStatus behavior; change the
test to either mount the real UpdateOsStatus component so you can assert its
runtime behavior (e.g., check emitted events or rendered DOM from
UpdateOsStatus) or remove the stub-prop assertion and instead assert observable
output — for example, keep
expect(wrapper.find('[data-testid="update-os-status"]').exists()).toBe(true) and
replace
expect(wrapper.findComponent(UpdateOsStatusStub).props('showUpdateCheck')).toBe(true)
with an assertion against the actual rendered DOM or emitted event from
UpdateOsStatus (or mount UpdateOs and assert its prop/state) using
wrapper.findComponent(UpdateOsStatus) or inspecting its emitted events.

---

Nitpick comments:
In `@web/__test__/components/UpdateOs.test.ts`:
- Line 87: Rename the three test case descriptions in UpdateOs.test.ts that
reference path-based behavior (the it(...) strings at the tests currently
starting at lines with "shows the internal update status when path matches and
rebootType is empty" and the two similar cases at the other locations) so they
describe what the test actually asserts: that the component renders the internal
update status (and handles rebootType being empty) regardless of pathname;
update the it(...) titles to something like "renders internal update status when
rebootType is empty" (or equivalent concise wording) for each affected test so
the names reflect behavior rather than path implementation details.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 8658f9da-443f-4dc7-9d07-2c18eb570b92

📥 Commits

Reviewing files that changed from the base of the PR and between 97f5425 and 43ce321.

📒 Files selected for processing (4)
  • plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.plugin.manager/Update.page
  • web/__test__/components/UpdateOs.test.ts
  • web/src/components/UpdateOs.standalone.vue
  • web/src/components/UpdateOs/Status.vue

Comment on lines +103 to +104
expect(wrapper.find('[data-testid="update-os-status"]').exists()).toBe(true);
expect(wrapper.findComponent(UpdateOsStatusStub).props('showUpdateCheck')).toBe(true);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Avoid asserting a stub-only prop that the real component doesn’t define.

This assertion can pass even if production behavior is wrong, because it only verifies data passed into a test stub, not UpdateOsStatus runtime behavior.

Suggested change
-      expect(wrapper.findComponent(UpdateOsStatusStub).props('showUpdateCheck')).toBe(true);
+      // Assert rendered behavior instead of stub-only prop plumbing.
+      expect(wrapper.find('[data-testid="update-os-status"]').exists()).toBe(true);

As per coding guidelines, “Test what the code does, not implementation details like exact error message wording.”

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
expect(wrapper.find('[data-testid="update-os-status"]').exists()).toBe(true);
expect(wrapper.findComponent(UpdateOsStatusStub).props('showUpdateCheck')).toBe(true);
expect(wrapper.find('[data-testid="update-os-status"]').exists()).toBe(true);
// Assert rendered behavior instead of stub-only prop plumbing.
expect(wrapper.find('[data-testid="update-os-status"]').exists()).toBe(true);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/__test__/components/UpdateOs.test.ts` around lines 103 - 104, The test is
asserting a prop on UpdateOsStatusStub which only verifies the test stub, not
the real UpdateOsStatus behavior; change the test to either mount the real
UpdateOsStatus component so you can assert its runtime behavior (e.g., check
emitted events or rendered DOM from UpdateOsStatus) or remove the stub-prop
assertion and instead assert observable output — for example, keep
expect(wrapper.find('[data-testid="update-os-status"]').exists()).toBe(true) and
replace
expect(wrapper.findComponent(UpdateOsStatusStub).props('showUpdateCheck')).toBe(true)
with an assertion against the actual rendered DOM or emitted event from
UpdateOsStatus (or mount UpdateOs and assert its prop/state) using
wrapper.findComponent(UpdateOsStatus) or inspecting its emitted events.

@elibosley elibosley force-pushed the codex/internal-update-os-flow branch from 43ce321 to 6e81f99 Compare June 1, 2026 16:53
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@web/src/components/UpdateOs.standalone.vue`:
- Around line 76-81: The parent passes a no-op prop show-update-check to the
UpdateOsStatus component; either remove that prop from the caller or wire it
into the child’s visibility logic. To fix: in UpdateOsStatus
(UpdateOs/Status.vue) add a prop showUpdateCheck (Boolean, default false) and
include it in the computed showRefreshButton (alongside updateAvailable,
showRebootButton, and props.showExternalDowngrade) so the “check for update”
button respects showUpdateCheck, or alternatively remove
:show-update-check="true" from the UpdateOs.standalone.vue usage to avoid
passing an unused prop (change whichever approach matches intent).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 00d566c2-7c8d-4fad-b6f3-d99534e21147

📥 Commits

Reviewing files that changed from the base of the PR and between 43ce321 and 6e81f99.

📒 Files selected for processing (4)
  • plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.plugin.manager/Update.page
  • web/__test__/components/UpdateOs.test.ts
  • web/src/components/UpdateOs.standalone.vue
  • web/src/components/UpdateOs/Status.vue
🚧 Files skipped from review as they are similar to previous changes (3)
  • plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.plugin.manager/Update.page
  • web/src/components/UpdateOs/Status.vue
  • web/test/components/UpdateOs.test.ts

Comment on lines +76 to +81
<UpdateOsStatus
:show-update-check="true"
:title="t('updateOs.updateUnraidOs')"
:subtitle="subtitle"
/>
<UpdateOsThirdPartyDrivers v-if="rebootType === 'thirdPartyDriversDownloading'" />
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Confirm UpdateOsStatus declares and uses a showUpdateCheck prop
fd -i 'Status.vue' -p 'UpdateOs'
rg -nP -C3 '(showUpdateCheck|show-update-check)' -g '*Status.vue'
# Inspect the defineProps block for the component
ast-grep --pattern 'defineProps<$_>()'

Repository: unraid/api

Length of output: 150


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# 1) Find where UpdateOsStatus is defined/implemented
rg -n "UpdateOsStatus" web/src/components/UpdateOs.standalone.vue web/src/components -S

# 2) Locate any Status component that corresponds to UpdateOsStatus
fd -e vue -a -t f . web/src/components -S | head -n 200

# 3) Search for the prop name variants across the repo
rg -n "(showUpdateCheck|show-update-check)" web/src/components -S
rg -n "(showUpdateCheck|show-update-check)" web/src -S

# 4) Find the component file that likely declares showUpdateCheck
#    If UpdateOsStatus is imported from another file, inspect that.
imports=$(rg -n "import\s+.*UpdateOsStatus.*from" web/src/components/UpdateOs.standalone.vue -S || true)
echo "$imports"

# 5) If we can locate the file, inspect defineProps/props usage for showUpdateCheck
#    (we'll re-run with the discovered file if needed)

Repository: unraid/api

Length of output: 715


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="web/src/components/UpdateOs/Status.vue"
if [ ! -f "$FILE" ]; then
  echo "Missing file: $FILE"
  exit 1
fi

echo "== wc -l =="
wc -l "$FILE"

echo "== occurrences of showUpdateCheck/show-update-check =="
rg -n "(showUpdateCheck|show-update-check)" "$FILE" -S || true

echo "== defineProps/props block context =="
# Show likely prop declaration area (covers both defineProps and classic props:)
rg -n -C5 "(defineProps|props\s*:)" "$FILE" -S || true

echo "== template usage around any showUpdateCheck reference =="
# If occurrences exist, show a bit more context for each match
rg -n -C8 "(showUpdateCheck|show-update-check)" "$FILE" -S || true

Repository: unraid/api

Length of output: 566


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="web/src/components/UpdateOs/Status.vue"
rg -n "(\$attrs|useAttrs|attrs\s*\.|attrs\s*\[|inheritAttrs)" "$FILE" -S || true
rg -n "show-update-check|showUpdateCheck" "$FILE" -S || true

Repository: unraid/api

Length of output: 36


🏁 Script executed:

#!/bin/bash
set -euo pipefail

rg -n "(showUpdateCheck|show-update-check)" web/src/components/UpdateOs -S || true
rg -n "(showUpdateCheck|show-update-check)" web/src -S || true

Repository: unraid/api

Length of output: 132


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="web/src/components/UpdateOs/Status.vue"

echo "== occurrences: showRefreshButton =="
rg -n "showRefreshButton" "$FILE" -S || true

echo "== occurrences: updateCheck / update-check =="
rg -n "(updateCheck|update-check|checkFor|check for|updates)" "$FILE" -S || true

echo "== template region around any refresh-related UI =="
rg -n "refresh" "$FILE" -S || true

# show a small window around the first few refresh/update occurrences (if any)
FIRST=$(rg -n "(refresh|update|updates|check)" "$FILE" -S | head -n 1 | cut -d: -f1 || true)
if [ -n "${FIRST:-}" ]; then
  START=$((FIRST-15))
  END=$((FIRST+60))
  [ $START -lt 1 ] && START=1
  echo "== showing lines $START-$END around first match line $FIRST =="
  sed -n "${START},${END}p" "$FILE" | nl -ba -w2 -s':'
fi

Repository: unraid/api

Length of output: 771


🏁 Script executed:

#!/bin/bash
set -euo pipefail

FILE="web/src/components/UpdateOs/Status.vue"
echo "=== Props area (lines 1-60) ==="
sed -n '1,80p' "$FILE"

echo
echo "=== showRefreshButton computed area (lines 70-130) ==="
sed -n '70,140p' "$FILE"

echo
echo "=== Template refresh/update UI (lines 200-270) ==="
sed -n '200,280p' "$FILE"

Repository: unraid/api

Length of output: 7665


show-update-check is not consumed by UpdateOsStatus (no-op)

<UpdateOsStatus
  :show-update-check="true"
  :title="t('updateOs.updateUnraidOs')"
  :subtitle="subtitle"
/>

web/src/components/UpdateOs/Status.vue does not declare showUpdateCheck in its props, and the “check for update” button is controlled by v-if="showRefreshButton" where showRefreshButton is computed from updateAvailable, showRebootButton, and props.showExternalDowngrade—not showUpdateCheck. Remove the prop from the parent or wire showUpdateCheck into the button visibility logic.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/components/UpdateOs.standalone.vue` around lines 76 - 81, The parent
passes a no-op prop show-update-check to the UpdateOsStatus component; either
remove that prop from the caller or wire it into the child’s visibility logic.
To fix: in UpdateOsStatus (UpdateOs/Status.vue) add a prop showUpdateCheck
(Boolean, default false) and include it in the computed showRefreshButton
(alongside updateAvailable, showRebootButton, and props.showExternalDowngrade)
so the “check for update” button respects showUpdateCheck, or alternatively
remove :show-update-check="true" from the UpdateOs.standalone.vue usage to avoid
passing an unused prop (change whichever approach matches intent).

@codecov
Copy link
Copy Markdown

codecov Bot commented Jun 1, 2026

Codecov Report

❌ Patch coverage is 29.83425% with 127 lines in your changes missing coverage. Please review.
✅ Project coverage is 52.60%. Comparing base (97f5425) to head (9d7219d).

Files with missing lines Patch % Lines
...c/components/UpdateOs/CheckUpdateResponseModal.vue 0.78% 126 Missing ⚠️
web/src/components/UpdateOs.standalone.vue 97.36% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2020      +/-   ##
==========================================
- Coverage   52.61%   52.60%   -0.01%     
==========================================
  Files        1035     1035              
  Lines       72033    72174     +141     
  Branches     8239     8258      +19     
==========================================
+ Hits        37901    37968      +67     
- Misses      34006    34080      +74     
  Partials      126      126              

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

This plugin has been deployed to Cloudflare R2 and is available for testing.
Download it at this URL:

https://preview.dl.unraid.net/unraid-api/tag/PR2020/dynamix.unraid.net.plg

@elibosley elibosley force-pushed the codex/internal-update-os-flow branch from 6e81f99 to 9d7219d Compare June 1, 2026 17:26
@elibosley elibosley changed the title [codex] Allow internal OS update checks from Tools page [codex] Embed internal OS update checks on Tools page Jun 1, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
web/src/components/UpdateOs/CheckUpdateResponseModal.vue (1)

287-430: 🏗️ Heavy lift

Embedded layout duplicates the ResponsiveModal content.

The embedded CardWrapper block (lines 288-429) is a near-verbatim copy of the inner ResponsiveModal content (lines 440-610): the title/description header, loading state, update-highlight section, no-update content, extra-links, ignored-releases list, and the "more options" tooltip + action buttons are all repeated. The two copies have already diverged (see the missing ignore-release tooltip below), which is exactly the failure mode duplication invites. Consider extracting the shared body into a child component (or a single slot rendered inside either CardWrapper or ResponsiveModal) so both modes stay in sync.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/components/UpdateOs/CheckUpdateResponseModal.vue` around lines 287 -
430, The CardWrapper block duplicates the same modal body rendered in
ResponsiveModal (causing drift); extract the shared content (title/description,
loading state, update/no-update sections, extraLinks, ignored releases, and
action button area) into a single child component (e.g., UpdateCheckBody) or a
named slot, and then render that component/slot inside both CardWrapper and
ResponsiveModal; ensure the new component accepts and emits the same props/state
used in the template (modalCopy, checkForUpdatesLoading, available,
availableWithRenewal, ignoreThisRelease, userFormattedReleaseDate,
availableRequiresAuth, extraLinks, updateOsIgnoredReleases, actionButtons, t,
accountStore.updateOs()) so behavior and event bindings (including Switch
v-model and BrandButton clicks) remain unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@web/src/components/UpdateOs/CheckUpdateResponseModal.vue`:
- Around line 415-427: The embedded rendering of actionButtons drops the tooltip
for the Close button when ignoreThisRelease is true; update the v-for block that
renders actionButtons so that when ignoreThisRelease is true and the current
item corresponds to the Close action (identify by item.key === 'close' or the
localized text match), wrap that BrandButton with the same Tooltip using the
translation key updateOs.checkUpdateResponseModal.youCanOptBackInTo; keep all
other props and the `@click` behavior intact. Ensure you reference the existing
actionButtons array, ignoreThisRelease flag, BrandButton component and the
translation key so the embedded branch mirrors the ResponsiveModal tooltip
behavior.

---

Nitpick comments:
In `@web/src/components/UpdateOs/CheckUpdateResponseModal.vue`:
- Around line 287-430: The CardWrapper block duplicates the same modal body
rendered in ResponsiveModal (causing drift); extract the shared content
(title/description, loading state, update/no-update sections, extraLinks,
ignored releases, and action button area) into a single child component (e.g.,
UpdateCheckBody) or a named slot, and then render that component/slot inside
both CardWrapper and ResponsiveModal; ensure the new component accepts and emits
the same props/state used in the template (modalCopy, checkForUpdatesLoading,
available, availableWithRenewal, ignoreThisRelease, userFormattedReleaseDate,
availableRequiresAuth, extraLinks, updateOsIgnoredReleases, actionButtons, t,
accountStore.updateOs()) so behavior and event bindings (including Switch
v-model and BrandButton clicks) remain unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 3df4c64c-7cba-4789-86ab-b831bfe6a1ac

📥 Commits

Reviewing files that changed from the base of the PR and between 6e81f99 and 9d7219d.

📒 Files selected for processing (4)
  • web/__test__/components/UpdateOs.test.ts
  • web/src/components/UpdateOs.standalone.vue
  • web/src/components/UpdateOs/CheckUpdateResponseModal.vue
  • web/src/components/UpdateOs/Status.vue
🚧 Files skipped from review as they are similar to previous changes (3)
  • web/src/components/UpdateOs/Status.vue
  • web/src/components/UpdateOs.standalone.vue
  • web/test/components/UpdateOs.test.ts

Comment on lines +415 to +427
<div v-if="actionButtons.length > 0" :class="cn('xs:!flex-row flex flex-col justify-end gap-3')">
<BrandButton
v-for="item in actionButtons"
:key="item.text"
:variant="item.variant ?? undefined"
:icon="item.icon"
:icon-right="item.iconRight"
:icon-right-hover-display="item.iconRightHoverDisplay"
:text="item.text ?? ''"
:title="item.title ? item.title : undefined"
@click="item.click?.()"
/>
</div>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Embedded mode drops the ignore-release tooltip on the close button.

In the ResponsiveModal branch, when ignoreThisRelease is true and the action is the localized Close button, the button is wrapped in a tooltip showing updateOs.checkUpdateResponseModal.youCanOptBackInTo (lines 575-595). The embedded branch renders all action buttons directly, so this guidance no longer appears when a release is being ignored from the Tools page. If this is intentional, ignore; otherwise mirror the conditional tooltip wrapper here.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@web/src/components/UpdateOs/CheckUpdateResponseModal.vue` around lines 415 -
427, The embedded rendering of actionButtons drops the tooltip for the Close
button when ignoreThisRelease is true; update the v-for block that renders
actionButtons so that when ignoreThisRelease is true and the current item
corresponds to the Close action (identify by item.key === 'close' or the
localized text match), wrap that BrandButton with the same Tooltip using the
translation key updateOs.checkUpdateResponseModal.youCanOptBackInTo; keep all
other props and the `@click` behavior intact. Ensure you reference the existing
actionButtons array, ignoreThisRelease flag, BrandButton component and the
translation key so the embedded branch mirrors the ResponsiveModal tooltip
behavior.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant