<feed xmlns='http://www.w3.org/2005/Atom'>
<title>BMC/OpenBmc/webui-vue.git/src/views, branch master</title>
<subtitle>Web-based user interface built on Vue.js for managing OpenBMC systems (mirror)</subtitle>
<id>https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/atom?h=master</id>
<link rel='self' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/'/>
<updated>2026-09-28T10:42:29+00:00</updated>
<entry>
<title>Add asset tag edit functionality to overview page</title>
<updated>2026-09-28T10:42:29+00:00</updated>
<author>
<name>Nishant Tiwari</name>
<email>tiwari.nishant@ibm.com</email>
</author>
<published>2026-07-16T08:27:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/commit/?id=85248e05cf5c44fc2a77135f829ae33b0d485e2f'/>
<id>urn:sha1:85248e05cf5c44fc2a77135f829ae33b0d485e2f</id>
<content type='text'>
Implemented the ability to view and edit the system asset tag directly
from the Overview page, including a modal dialog for editing, Vuex store
action for saving, and truncation in the app header.

Changes:
  - Added ModalAssetTag.vue component with:
    - Form input for editing the asset tag value
    - Vuelidate validation requiring a non-empty tag
  - Updated OverviewServer.vue to:
    - Display asset tag in the system information section
    - Add inline edit button using Carbon edit icon
    - Dispatch saveAssetTag store action with toast feedback
    - Refresh global system info after a successful save
  - Added saveAssetTag action to SystemStore.js using PATCH
    against the system path endpoint
  - Updated AppHeader.vue to truncate asset tags longer than
    30 characters with an ellipsis, preserving full value in
    the title attribute for accessibility
  - Added translation keys for asset tag label, modal title,
    and success/error toast messages in en-US, ka-GE, and
    ru-RU locale files

Testing:
  - Verified asset tag displays correctly in system info section
  - Verified modal opens, validates, and submits correctly
  - Verified PATCH request updates asset tag on the server
  - Validated success and error toast notifications display
  - Confirmed long asset tags are truncated in the header

Change-Id: I6ac51dfc24b9d40986b74e9220cff955b029d659
Signed-off-by: Nishant Tiwari &lt;tiwari.nishant@ibm.com&gt;
</content>
</entry>
<entry>
<title>Implemented Reboot BMC with TanStack Vue Query</title>
<updated>2026-09-28T08:33:30+00:00</updated>
<author>
<name>Nikhil Ashoka</name>
<email>a.nikhil@ibm.com</email>
</author>
<published>2026-07-21T11:13:20+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/commit/?id=4628f24b336ea30b288a4b50d42c0e50d8d62869'/>
<id>urn:sha1:4628f24b336ea30b288a4b50d42c0e50d8d62869</id>
<content type='text'>
This change migrates the Reboot BMC page from Vuex to TanStack Query
and Composition API

Key changes:

1. Redfish types (src/api/types/redfish.ts):
- Adds Manager interface with LastResetTime and Actions fields,
  typed in PascalCase to match the Redfish schema

2. BMC reboot composable
(src/components/Composables/useRebootBmc.ts):
- Replaces Vuex controls/getLastBmcRebootTime and controls/rebootBmc
  with a Composition API composable
- Uses useRedfishRoot() to resolve the Managers collection URI from
  ServiceRoot; fetches the first member (the BMC Manager) in queryFn
- Configures staleTime: Infinity and gcTime: Infinity because
  LastResetTime only changes on a reboot; onSuccess invalidation
  handles the one real change event, avoiding unnecessary refetches
- mutationFn is pure (no i18n strings, no toast calls); view owns
  all user-facing messages via try/catch
- onSuccess calls invalidateQueries only (no optimistic update,
  which would be immediately overwritten by the refetch)
- resetTarget prefers Actions['#Manager.Reset'].target from the
  cached Manager, falls back to the conventional Redfish path

3. View modernization
(src/views/Operations/RebootBmc/RebootBmc.vue):
- Refactors from Options API to &lt;script setup&gt;, using useRebootBmc(),
  useLoadingBar(), and useToast() composables
- Loader semantics: isLoading drives the loading bar on first fetch
  only; cached data renders instantly on re-navigation with a silent
  background refetch (no flicker)
- Reboot button disabled when bmcQuery.isError is true, preventing
  mutation dispatch with an unavailable reset target
- Confirm dialog uses eventBus.$emit('confirm:open', ...) directly,
  matching the $confirm global property contract without Options API

4. Store cleanup
(src/store/modules/Operations/ControlStore.js):
- Removes lastBmcRebootTime state, getter, and setLastBmcRebootTime
  mutation (now owned by bmcQuery in the composable)
- Removes getLastBmcRebootTime and rebootBmc actions (replaced by
  useQuery and useMutation in useRebootBmc.ts)
- Removes unused i18n import
- Remaining ControlStore state (isOperationInProgress,
  lastPowerOperationTime) and server power actions are unchanged;
  they are still used by ServerPowerOperations.vue and Firmware.vue

5. Toast rendering fix (src/components/Composables/useToast.ts,
   src/plugins/toast.js):
- Fixes modelValue: false → true for danger/error toasts in both
  the Composition API useToast composable and the Options API
  ToastPlugin; modelValue: false suppressed toast rendering
  entirely in bootstrap-vue-next, making error toasts invisible
  app-wide

Tested-by: Manual testing on development server
- Last BMC reboot time loads correctly from Manager.LastResetTime
- Reboot button triggers GracefulRestart POST; success and error
  toasts display with localized messages
- Loading bar shows on first page load and during reboot POST;
  subsequent visits render cached data instantly
- Read-only user receives the global Unauthorized toast (403
  interceptor) followed by the page-level error toast

Change-Id: I5d49527f176041958e48889d6261780fcffdd9df
Signed-off-by: Nikhil Ashoka &lt;a.nikhil@ibm.com&gt;
</content>
</entry>
<entry>
<title>Fix reversed expand chevron in the event log table</title>
<updated>2026-09-17T03:10:51+00:00</updated>
<author>
<name>Bill Chan</name>
<email>bill_chan@jabil.com</email>
</author>
<published>2026-09-14T02:32:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/commit/?id=8538dca185982882a0d72986f45c6a76c18b4048'/>
<id>urn:sha1:8538dca185982882a0d72986f45c6a76c18b4048</id>
<content type='text'>
The expand button in Event Logs draws its chevron upside down in both
states: collapsed shows an up chevron, expanded shows a down one.

_tables.scss rotates the icon 180 degrees for any button inside a
.table-row-expand cell that does not carry .collapsed:

    .table-row-expand .btn:not(.collapsed) svg {
        transform: rotate(180deg);
    }

EventLogs opts into that rule through tdClass: 'table-row-expand' but
never applies .collapsed to the button, so the selector matches in both
states and the rotation is permanent.  The template swaps two icons by
hand, chevron--down when collapsed and chevron--up when expanded, and
the constant rotation inverts each of them.

The swap predates the rule and was correct when written.  Before
f4861f9 the stylesheet rotated only .btn.collapsed, which these buttons
never match, so nothing was rotated and the explicit icons showed
through.  Inverting the selector to :not(.collapsed) captured every
button that had opted out of the class.

Adopt the pattern the other nine pages using .table-row-expand already
follow, Certificates and every Inventory table among them: bind
.collapsed to the row state and render chevron--down alone, letting the
stylesheet supply the flip.  chevron--down rotated 180 degrees is
chevron--up exactly, the two path definitions mapping onto each other
point for point under (x,y) -&gt; (32-x, 32-y), so the rendered result is
what the template always intended.  IconChevronUp is then unused and is
removed.

Tested:
eslint and vite build are clean on the modified file.  A scan of every
.vue file using .table-row-expand confirms this was the last one not
binding .collapsed; the other nine already did.

Confirmed in a browser: the expand chevron points down while the row
is collapsed and up while it is expanded.

Change-Id: I2b0e28ca31d6a363c3f18cf308f17dbf09e74c0f
Signed-off-by: Bill Chan &lt;bill_chan@jabil.com&gt;
</content>
</entry>
<entry>
<title>Revert policy selection on save error</title>
<updated>2026-09-15T06:29:40+00:00</updated>
<author>
<name>Vedangi Mittal</name>
<email>vedangimittal3004@gmail.com</email>
</author>
<published>2026-08-20T09:57:36+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/commit/?id=de35b5132d1af03ba119068fe14e5c31294d2b46'/>
<id>urn:sha1:de35b5132d1af03ba119068fe14e5c31294d2b46</id>
<content type='text'>
When a readonly user changes the policy and clicks save,
the failed request left the radio group stuck on the new
selection.
Replace the split computed getter/setter with
a local `selectedPolicy` data property and explicitly
reset it to the store value on error.

Change-Id: I1785384f0a654c8daa447a70e44336bb22ffa4d2
Signed-off-by: Vedangi Mittal &lt;vedangimittal3004@gmail.com&gt;
</content>
</entry>
<entry>
<title>Fix form conditions that test nonexistent properties</title>
<updated>2026-08-28T02:47:57+00:00</updated>
<author>
<name>Bill Chan</name>
<email>bill_chan@jabil.com</email>
</author>
<published>2026-08-25T09:53:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/commit/?id=5c139d53429a8309418a19f226d0c3d4c0c6b8be'/>
<id>urn:sha1:5c139d53429a8309418a19f226d0c3d4c0c6b8be</id>
<content type='text'>
Four conditions read a property that does not exist, so none of them
evaluates the way its author intended.

DateTime guards a block that shifts the third NTP address into the
second slot after a successful save.  The condition reads
this.form.ntp.thirdAddres, while the form model defines thirdAddress,
so it has never been true.  Correcting the name would not make the
block run: submitForm filters the empty entry out of the request and
then calls setNtpValues(), which rebuilds form.ntp from the compacted
list, so by the time the callback runs the second address is already
populated and the third already empty.  updateDateTime does not commit
ntpServers either, so the watcher cannot reopen a hole.  Remove the
block rather than correct the name - a correctly spelled condition
that is always false reads as live code, and invites a later refactor
to revive a shift that would then run twice.  The guard above it,
if (!isNTPEnabled) return, existed only to protect that block and goes
with it.

ModalSettings and ModalAddDestination test validators that are not
declared.  lockoutDuration is validated by minValue but the template
reads minvalue; lockoutThreshold and port are validated by minValue
and maxValue but their templates read minLength and maxLength.  Each
reference yields undefined and the conditions negate it, so the branch
is taken every time the invalid-feedback block renders, leaving the
range message in the DOM even for a valid field, where CSS hides it.
The message that appears is the right one today only because each of
those fields has a single other validator; it would become wrong,
silently, as soon as another one is added.

Test the validator's $invalid flag instead, which is the form these
same files already use for required.$invalid and ipAddress.$invalid.
Negating the validator entry itself would not work either: in
Vuelidate 2 it is an object, so the branch would never be taken.

Tested:
In a browser against a QEMU BMC, machine cypress, with each case run
on this commit and on its parent.

Settings &gt; Date and time, NTP selected, first address set, second
empty, third set: after Save the third value appears in the second
field within 100ms and the third field is empty, identically before
and after this change.  That compaction is setNtpValues() inside
submitForm, not the removed block.  The success toast still appears.

Account policy settings: a lockout threshold of 99999 reports "Value
must be between 0 - 65535" and an empty one reports "Field required";
with unlock method set to manual, a lockout duration of 0 reports
"Must be at least 1" and an empty one "Field required".  SNMP alerts &gt;
Add destination: a port of 99999 and a port of abc both report "Value
must be between 0 - 65535", while 161 and empty are accepted.  Every
one of those messages is identical before and after.  The only
difference observed is that before this change the range message is
present but hidden for a valid field, and after it nothing is
rendered.

Also verified that every corrected name is declared where it is now
read, that a scan of all .vue files reports no Vuelidate reference
whose validator is undeclared in the same file, that eslint passes on
all three files, and that prettier 3.4.2 reports both modal files
clean.

Change-Id: Ib59a22296452e890877e784d3077b166d6d81fc5
Signed-off-by: Bill Chan &lt;bill_chan@jabil.com&gt;
</content>
</entry>
<entry>
<title>Fix translation bugs and remove unused keys</title>
<updated>2026-08-20T09:25:37+00:00</updated>
<author>
<name>Nikhil Ashoka</name>
<email>a.nikhil@ibm.com</email>
</author>
<published>2026-07-31T14:09:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/commit/?id=1322c5b754bbd147caa4065721eb9e5a2928a924'/>
<id>urn:sha1:1322c5b754bbd147caa4065721eb9e5a2928a924</id>
<content type='text'>
- Fix three structural bugs found by locale audit:
  - ka-GE: rename pageFirmware.sectionTitleHostCards to
  sectionTitleBiosCards to match the key used by
  FirmwareCardsBios.vue.
  - ru-RU: move global.offline.okToRetryCancelToLogin out of
  global.toast.offline to global.offline, restoring the correct
  nesting path that matches en-US and ka-GE.
  - PostCodeLogs: fix deleteAllLogs confirm dialog to reference
  pagePostCodeLogs.modal.deleteAllMessage/Title instead of
  pageEventLogs.modal.*, decoupling the two pages so future
  wording changes to Event Logs cannot silently affect Post
  Code Logs.
- TableDns: fix delete action title passed as a raw key string
  literal to TableRowAction; wrap with i18n.global.t() so the
  translated string is rendered instead of the key path.
- Remove 30 unused translation keys from all three locale files
(en-US, ru-RU, ka-GE). They were not being used.

Change-Id: I7edd9b326e1a4ad096508d5ed1661e1234c7f571
Signed-off-by: Nikhil Ashoka &lt;a.nikhil@ibm.com&gt;
</content>
</entry>
<entry>
<title>Fix header checkbox select-all in View All mode</title>
<updated>2026-08-13T04:49:26+00:00</updated>
<author>
<name>Aravinth Sri Krishna Raja Raghavan</name>
<email>aravinths@ami.com</email>
</author>
<published>2026-07-17T11:08:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/commit/?id=8f93ea76414a0be46813f1cc6615f309c5943137'/>
<id>urn:sha1:8f93ea76414a0be46813f1cc6615f309c5943137</id>
<content type='text'>
When "View All" is selected under Items per Page, perPage is 0. The
selection logic fell back to `this.perPage || 10`, treating the falsy
0 as a page size of 10. Clicking the header checkbox therefore selected
only the first 10 displayed logs instead of all of them, and the
selected count did not reflect the true total.

Treat perPage === 0 as "View All" so the computed page bounds span
every item. The calculation is centralized in a getPageBounds() helper
shared by the select-all handler and the header checkbox state logic,
keeping the two paths consistent.

Also fix a UI state bug where, after a resolve/unresolve action, the
row checkboxes appeared unselected but the selection header remained
visible and still referenced the stale selection. clearSelectedRows()
is now called in a finally() block so it runs whether the dispatch
succeeds or fails, keeping the selection state consistent.

fix issue for:
https://github.com/openbmc/webui-vue/issues/142

Change-Id: I46b33c1d73c633d6c7df446ceecaf4222be9ea90
Signed-off-by: Aravinth Sri Krishna Raja Raghavan &lt;aravinths@ami.com&gt;
</content>
</entry>
<entry>
<title>Replace v-model with :model-value in Policies</title>
<updated>2026-08-12T13:31:34+00:00</updated>
<author>
<name>Nikhil Ashoka</name>
<email>a.nikhil@ibm.com</email>
</author>
<published>2026-07-20T12:09:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/commit/?id=e29b33388edead7f2fb6c00a071f991ed17526dc'/>
<id>urn:sha1:e29b33388edead7f2fb6c00a071f991ed17526dc</id>
<content type='text'>
* Replaced v-model with :model-value on SSH, IPMI, vTPM, RTAD toggles
  and Session Timeout select, since the bound computed properties are
  read-only getters backed by the Vuex store.
* Removed no-op setters (set(newValue) { return newValue; }) from all
  five computed properties that existed solely to satisfy v-model's
  two-way binding requirement.
* Simplified rtadState and vtpmState boolean expressions from if/else
  blocks to a single equality check.
* State changes continue to flow through the existing
  @update:model-value handlers which dispatch the appropriate Vuex
  store actions.
* This change is a follow-up action from
  https://gerrit.openbmc.org/c/openbmc/webui-vue/+/89544 which
  implemented Basic Auth using :model-value — applying the same pattern
  consistently across all other policy toggles on the page.
* Tested: Policies page loads correctly, all toggles and session
  timeout select reflect store state. Enable/Disable interactions
  dispatch store actions as expected.

Change-Id: Ibb2ee51615ed23a397dd9b99eb99e2920320f8a4
Signed-off-by: Nikhil Ashoka &lt;a.nikhil@ibm.com&gt;
</content>
</entry>
<entry>
<title>Add Access Denied alert to SOL console</title>
<updated>2026-06-25T06:39:00+00:00</updated>
<author>
<name>Aravinth S</name>
<email>aravinths@ami.com</email>
</author>
<published>2026-05-21T11:58:46+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/commit/?id=f286d820e441325a86733fe7433be9d001a9a9d9'/>
<id>urn:sha1:f286d820e441325a86733fe7433be9d001a9a9d9</id>
<content type='text'>
Non-admin users navigating to the Serial Over LAN page had no
clear feedback — the page either failed silently or showed a
generic error. Show the SOL button and nav item to all users
and render an Access Denied alert when the session lacks the
required privilege.

A reusable AccessDeniedAlert global component is introduced
so other restricted pages can adopt the same pattern with a
single line.

Change-Id: Ifbb93bb966c801b3a72230e8f3b752b62ef22929
Signed-off-by: Aravinth Sri Krishna Raja Raghavan &lt;aravinths@ami.com&gt;
</content>
</entry>
<entry>
<title>Fix typo in useDnsStateIpv6 computed property</title>
<updated>2026-06-22T10:27:30+00:00</updated>
<author>
<name>Aravinth S</name>
<email>aravinths@ami.com</email>
</author>
<published>2026-06-22T10:20:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/commit/?id=d65f41eb764fc8f1281ebed09da152416ebb4707'/>
<id>urn:sha1:d65f41eb764fc8f1281ebed09da152416ebb4707</id>
<content type='text'>
The computed property useDnsStateIpv6 in NetworkGlobalSettings.vue
had a duplicate 'v6' suffix, referencing useDnsEnabledIpv6v6 which
does not exist on the store object.

Correct the typo to useDnsEnabledIpv6 to match the property
defined in the setGlobalNetworkSettings mutation in NetworkStore.js.

Change-Id: I8772d62a81e8825f936c08d2f9056531d6ae811e
Signed-off-by: Aravinth Sri Krishna Raja Raghavan &lt;aravinths@ami.com&gt;
</content>
</entry>
</feed>
