<feed xmlns='http://www.w3.org/2005/Atom'>
<title>BMC/OpenBmc/webui-vue.git/src/api, 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-06-18T14:19:37+00:00</updated>
<entry>
<title>Fix sensors page being empty</title>
<updated>2026-06-18T14:19:37+00:00</updated>
<author>
<name>Grégoire Layet</name>
<email>gregoire.layet@9elements.com</email>
</author>
<published>2026-06-18T08:05:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/commit/?id=bfad598fcb7b55178a9d1a0dbf60cdcfbcefd37f'/>
<id>urn:sha1:bfad598fcb7b55178a9d1a0dbf60cdcfbcefd37f</id>
<content type='text'>
Issue:
The sensors page should list all sensors from all hosts.
This is not the case.

The commit adding this issue was 'Implemented Power page with VueQuery
and Composition API'
99099183438d878391f66d3c674fa2cd037a7840
Committed on June 9, 2026 [1]

The commit add to the discoverParentsWithSubResource function the select
query parameter to the parentCollectionPath.
As of today this function is only used in useAllSubResources.
The useAllSubResources function is also only used once, with the
parentCollectionPath='/redfish/v1/Chassis'.

This path get back :
{
  "@odata.id": "/redfish/v1/Systems",
  "@odata.type": "#ComputerSystemCollection.ComputerSystemCollection",
  "Members": [
    {
      "@odata.id": "/redfish/v1/Systems/system"
    }
  ],
  "Members@odata.count": 1,
  "Name": "Computer System Collection"
}

If this is filtered with the select='Sensors', then we have nothing.

There is no reason to apply the select filter to the
parentCollectionPath query.

Solution:
This patch remove the filter on the parentCollectionPath query.

Tested:
- all sensors are now visible in the sensors page

[1] https://github.com/openbmc/webui-vue/commit/99099183438d878391f66d3c674fa2cd037a7840

Change-Id: I0a35f9468a9583e4e87b6fd21cd9d81c08fd4fbe
Signed-off-by: Grégoire Layet &lt;gregoire.layet@9elements.com&gt;
</content>
</entry>
<entry>
<title>Implemented Power page with VueQuery and Composition API</title>
<updated>2026-06-09T16:55:25+00:00</updated>
<author>
<name>Nikhil Ashoka</name>
<email>a.nikhil@ibm.com</email>
</author>
<published>2026-02-06T12:01:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/commit/?id=99099183438d878391f66d3c674fa2cd037a7840'/>
<id>urn:sha1:99099183438d878391f66d3c674fa2cd037a7840</id>
<content type='text'>
This change switches power control to the EnvironmentMetrics-based
Redfish endpoint, derives minimum and maximum power cap values
dynamically from Redfish data, and updates ControlMode and SetPoint
handling to align with the latest schema.

Key changes:

1. Power control API and Redfish types:
- Removes src/api/services/powerControlService.ts; fetching and
PATCH are handled in the composable using shared Redfish utilities
- Adds EnvironmentMetrics and PowerLimitWatts types in
src/api/types/redfish.ts with proper ControlMode enum
('Automatic' | 'Disabled' | 'Manual' | 'Override')
- Chassis gains an EnvironmentMetrics link
- Composable resolves the Chassis collection via
useRedfishCollection&lt;Chassis&gt;('/redfish/v1/Chassis'), picks the
first chassis with EnvironmentMetrics, and fetches that resource
with useQuery; mutation sends PATCH and invalidates queries to
refetch fresh server state (returns Promise&lt;void&gt;; view owns
user-facing messages)

2. Power control composable
(src/components/Composables/usePowerControl.ts):
- Replaces Vuex PowerControlStore with a Composition API-based
composable
- Uses useRedfishRoot() and useRedfishCollection for cached
ServiceRoot and Chassis; uses TanStack Query to load and cache
EnvironmentMetrics power data
- Configures staleTime (30s freshness window) and refetchInterval
(30s automatic polling when tab visible) for live power
consumption updates
- Note: Only controls the first Chassis with EnvironmentMetrics in
multi-chassis systems (intentional for current use case)
- Forwards AbortSignal to API calls for proper request cancellation
- Reuses shouldRetry function from useAllSubResources
- Derives dynamic min and max power cap values from Redfish
PowerLimitWatts.AllowableMin/Max
- Provides a mutation for submitting updated SetPoint and
ControlMode; omits SetPoint when disabling to avoid sending
invalid values
- Handles all ControlMode enum values (Automatic, Disabled, Manual,
Override); UI sets Automatic/Disabled but preserves Manual/Override
when read from server
- Type-safe parameters (number | null instead of string coercion)

3. Toast composable and global plugin:
- useToast.ts (renamed from .js) uses bootstrap-vue-next useToast()
with TypeScript types; keeps successToast/errorToast API with
i18n titles
- Type restricted to string for simplicity; includes TODO for
potential VNode support expansion if needed
- src/plugins/toast.js continues to expose global $toast for
Options API
- BVToastMixin.js updated to use modelValue and extract VNode
content for consistency with bootstrap-vue-next 0.40.8
- Both implementations use isStatus: true for consistent toast
styling with status icons

4. Views modernization:
- Refactors src/views/ResourceManagement/Power.vue to use
&lt;script setup&gt;, usePowerControl(), and the new toast composable;
submitForm uses try/catch and
t('pageServerPowerOperations.toast.*') for success/error toasts
- Implements value caching to preserve user's typed input when
toggling power cap checkbox on/off
- Guards form sync watcher with v$.value?.$dirty check to prevent
overwriting in-progress edits during background refetch
- Loader semantics: show on first load (isLoading) and mutations,
but render cached data instantly on subsequent visits with silent
background refetch (avoids flicker)
- Renamed validator from 'between' to 'withinPowerCapRange' to
avoid confusion with Vuelidate's built-in validator
- Handles all ControlMode values (Automatic, Disabled, Manual,
Override) in form state synchronization
- Refactors src/views/Overview/OverviewPower.vue to read from the
power control composable instead of Vuex; implements settled
computed to emit overview-power-complete only when chassis
collection is fetched AND either no EnvironmentMetrics exists or
metrics query has completed (prevents premature completion)
- Shows power cap for all active control modes (Automatic, Manual,
Override)
- Removes mapState/mapActions usage and related Vuex wiring

5. Store cleanup and typing:
- Deletes src/store/modules/ResourceManagement/PowerControlStore.js
- Removes PowerControlStore registration from src/store/index.js
- Updates src/store/api.d.ts to match actual implementation
(set_auth_token with snake_case, accepts string | null |
undefined)
- Adds src/i18n.d.ts to provide basic typing for the shared api

Tested-by: Manual testing on development server
- Power consumption and cap values load correctly from
  EnvironmentMetrics with automatic 30-second polling (refetchInterval)
  when tab is visible
- Min and max power cap values reflect dynamic limits from Redfish
- Updating the power cap and enable state sends correct SetPoint and
  ControlMode values; SetPoint is omitted when disabling
- All ControlMode values (Automatic, Disabled, Manual, Override) are
  handled correctly
- User's typed values are preserved when toggling power cap checkbox
- Form edits are not overwritten by background refetch (dirty state
  guard)
- Success/error toasts show localized messages with consistent
  modelValue-based timing and status icons
- Overview power card reflects updated power state; overview loader
  waits for both chassis and metrics queries to settle before
  completing
- Request cancellation works properly on component unmount

Change-Id: Ic61631efd8790150a5e2914822f1dd25bd77305a
Signed-off-by: Nikhil Ashoka &lt;a.nikhil@ibm.com&gt;
</content>
</entry>
<entry>
<title>Implemented dynamic fetching of the sensors</title>
<updated>2026-03-09T08:48:27+00:00</updated>
<author>
<name>Nishant Tiwari</name>
<email>tiwari.nishant@ibm.com</email>
</author>
<published>2026-03-03T14:54:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/commit/?id=3ab2bc9910067076f89b713d027eefbfa8344ff9'/>
<id>urn:sha1:3ab2bc9910067076f89b713d027eefbfa8344ff9</id>
<content type='text'>
This commit updates the implementation to dynamically
discover all chassis and fetch sensors from each.

Changes include:

- Updated useSensors to use /redfish/v1/Chassis collection endpoint
- Fixed discoverParentsWithSubResource to properly check individual
  chassis members for Sensors sub-resource

The implementation now automatically discovers all chassis, fetches
sensors from each, and deduplicates results by @odata.id.

Tested: Verified sensors display from all chassis in
 multi-chassis systems

Change-Id: Idadaef1be1b019cdded52ce7debe6f5f795e985e
Signed-off-by: Nishant Tiwari &lt;tiwari.nishant@ibm.com&gt;
</content>
</entry>
<entry>
<title>Implemented Sensors page with VueQuery and Composition API</title>
<updated>2026-02-13T09:54:27+00:00</updated>
<author>
<name>Nishant Tiwari</name>
<email>tiwari.nishant@ibm.com</email>
</author>
<published>2026-01-28T14:48:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/BMC/OpenBmc/webui-vue.git/commit/?id=d3b05033fe82aed6c53f4f2b52c23d3bd285d423'/>
<id>urn:sha1:d3b05033fe82aed6c53f4f2b52c23d3bd285d423</id>
<content type='text'>
Introduce reusable Redfish API infrastructure and modernize the Sensors
page to use Vue 3 Composition API with TanStack Query, eliminating the
need for Vuex store patterns for server state management.

This change provides a foundation for migrating other hardware status
pages (Memory, Processors, Drives, etc.) to a more maintainable and
performant architecture.

Key changes:

1. Generic Redfish composables (src/api/composables/):
   - useRedfishRoot.ts: Caches ServiceRoot and detects OData support
   - useRedfishCollection.ts: Smart collection fetcher with OData
     $expand/$select support and graceful fallback
   - useAllSubResources.ts: Generic pattern for fetching nested
     resources from parent collections

2. Sensors page modernization:
   - Migrated from Vuex store to TanStack Query (Vue Query)
   - Created useSensors.ts composable for data fetching
   - Removed legacy Thermal and PowerSubsystem endpoints
   - Now uses only modern /Chassis/{id}/Sensors collection
   - Maintains existing UI/UX with Bootstrap Vue table

3. TypeScript support:
   - Added tsconfig.json and webpack ts-loader configuration
   - Created required Redfish type definitions
   - Preserves Redfish PascalCase property names

4. Performance optimizations:
   - Auto-detects and uses OData $expand for fewer API calls
   - Implements automatic caching and deduplication
   - Smart retry logic with exponential backoff
   - 30-second stale time with 5-minute garbage collection

Benefits for future development:

- The generic composables are designed for reuse across components:
  // Fetch all Memory from all Systems
  useAllSubResources&lt;Memory&gt;('/redfish/v1/Systems', 'Memory')

  // Fetch all Drives from all Storage
  useAllSubResources&lt;Drive&gt;('/redfish/v1/Storage', 'Drives')

- Implemented TypeScript types
- Reuses existing Bootstrap table components
- Preserves existing UI/UX
- Focuses on infrastructure reusability

This pattern eliminates boilerplate Vuex store code and provides
better developer experience with automatic loading states, error
handling, and background refetching.

Tested-by: Manual testing on development server
- Sensors page loads correctly
- OData optimization works when supported
- Graceful fallback when OData unavailable
- All table functionality preserved (sorting, filtering,
  export, cancel and searching)

Change-Id: Id605319140f607b295d24085f3681f09ac0d5ebd
Signed-off-by: Nishant Tiwari &lt;tiwari.nishant@ibm.com&gt;
</content>
</entry>
</feed>
