| Age | Commit message (Collapse) | Author | Files | Lines |
|
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 <script setup>, 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 <a.nikhil@ibm.com>
|
|
Vue 3's vue-i18n requires useI18n() to be called within setup()
or reactive contexts. Calling it in Options API data() creates
disconnected i18n instances that cannot resolve linked messages.
Component fixes:
- Enable globalInjection in i18n.js for automatic $t injection
- Remove explicit useI18n() imports from 84 components that
incorrectly called useI18n().t in their data() functions
Unit test fixes:
- Mock @/i18n module in jest.setup.js because Webpack's
require.context() does not work in Jest, leaving the real
module with no locale messages loaded
- Re-export real createI18nInstance so i18n unit tests work
- Update snapshots to reflect real translated text instead
of raw translation keys
- Fix b-form-radio/checkbox stubs to wrap content in div for
proper data-test-id attribute inheritance
- Remove duplicate i18n plugin installations from individual
test files that caused 'already registered' warnings
- Suppress expected missing-key warning in vendor overlay test
Tested:
- Sanity testing on webui, ensured translations work.
- All Unit tests pass (19/19) with no Errors or Warnings.
Change-Id: I9789acd823261eccc7affde0957dd22e8fec06b1
Signed-off-by: Jason Westover <jwestover@nvidia.com>
|
|
Complete migration from Bootstrap 4 (bootstrap-vue) to Bootstrap 5
(bootstrap-vue-next) and remove the @vue/compat plugin to finalize
the Vue 3 migration.
Bundle size impact:
- Before (Bootstrap 4 + bootstrap-vue): 535 KiB gzipped
- After (Bootstrap 5 + bootstrap-vue-next): 511 KiB gzipped
- Reduction: 24 KiB (4.5% smaller)
Package updates:
- Update bootstrap 4.6.2 -> 5.3.8
- Update bootstrap-vue 2.23.1 -> bootstrap-vue-next 0.40.8
- Remove @vue/compat plugin
- Update vue 3.4.29 -> 3.5.24 and related packages
- Add mitt 3.0.1 for global event bus
- Add vue-demi 0.14.10 for library compatibility
Bootstrap 5 CSS updates:
- Replace directional classes: ml/mr/pl/pr -> ms/me/ps/pe
- Replace text-left/right -> text-start/end
- Replace sr-only -> visually-hidden / visually-hidden-focusable
- Update media breakpoint xs -> sm (Bootstrap 5 removed xs)
- Update color functions: gray("700") -> $gray-700
- Add form-switch border-radius for curved toggles
- Update alert, table, toast, form, and button styles
Bootstrap-Vue-Next API changes:
- Use createBootstrap() for plugin registration
- Update modal footer slots: #modal-footer -> #footer
- Fix form select events: @change -> @update:model-value
- Add v-model bindings to modals instead of manual show()/hide()
- Update toast system with custom plugin wrapping useToast()
- Register components and directives explicitly
Vue 3 specific updates:
- Replace $root.$emit with mitt event bus (eventBus.js)
- Update render function from h(App) to createApp(App)
- Add emits option to components
- Use h() instead of $createElement in mixins
- Add Vue 3 compile-time feature flags with documentation
- Update event listeners: $on/$off to eventBus methods
- Add beforeUnmount cleanup for event listeners
New components and significant additions:
- src/plugins/toast.js - Custom toast plugin wrapping useToast() for
Options API compatibility
- src/components/Global/ConfirmModal.vue - Global confirmation dialog
shim to replace Bootstrap 4's removed bvModal.msgBoxConfirm
- src/eventBus.js - mitt-based event bus with Vue 2-compatible API
- Navigation state preservation on page refresh implemented
Critical fixes:
- Add global API interceptor to strip Vue reactivity from payloads
- Preserve binary data (File, Blob, FormData) in API requests
- Fix Generate CSR modal v-model binding for proper open/close
- Remove debug logging and fix jest configuration
- Fix responsive text visibility in AppHeader
- Update BVTableSelectableMixin for proper row selection
- Fix BVToastMixin VNode rendering for Vue 3
Vue 3 modal fixes (lazy-loaded components):
- Add v-model support to network modals (ModalIpv4, ModalIpv6, ModalDns,
ModalHostname, ModalMacAddress, ModalDefaultGateway) by adding
modelValue prop, watcher on modelValue that triggers show(), and
update:modelValue emit in resetForm
- Remove lazy loading from TableIpv4, TableIpv6, TableDns to ensure
modal component refs are available when v-model triggers
- Fix modal title accessibility by adding title prop to modals
(ModalAddDestination, ModalUser, ModalAddRoleGroup, etc.)
i18n fixes (computed properties):
- Fix computed properties using i18n translations in ModalAddRoleGroup,
ModalUser, and ModalUploadCertificate
- Move useI18n() call from data() to setup() and return i18n object
- Use i18n.t() instead of $t in computed properties and templates
- Prevents "this.$t is not a function" and "_ctx.$t is not a function"
errors in Vue 3
Toast notification fixes:
- Fix toast progress bar visibility by setting progressProps to
undefined (documented way to opt-out) instead of false
- Change modelValue prop to interval for auto-dismiss timing
- Remove temporary CSS display:none hack from _toasts.scss
Network settings fixes:
- Fix checkbox @change event sending Vue reactive proxy object instead
of boolean by casting with !! operator in changeDomainNameState and
related methods in NetworkGlobalSettings.vue
- Ensures API receives plain boolean values in PATCH requests
Navigation fixes:
- Fix nav-link styling for navigation items without children by
replacing b-nav-item with router-link in AppNavigation.vue
- Prevents blue font color from .nav-link CSS class
Configuration updates:
- Remove vue-compat webpack configuration
- Add Vue 3 feature flags (__VUE_OPTIONS_API__, etc.)
- Add .cursor to .gitignore
Accessibility improvements:
- Add autocomplete attributes to password and credential inputs
- Add modal title props for screen reader support
Build completes successfully and UI behavior matches pre-migration.
Extracted features (to be submitted in follow-up PRs):
The following features were removed from this migration PR to keep it
focused on the Bootstrap 5 upgrade. They will be submitted separately:
1. UnresponsiveModal - Server connectivity watchdog with auto-retry
2. Auth token persistence - sessionStorage support for X-Auth-Token
3. Hardware store error handling - try/catch, dynamic discovery
4. Login page connecting indicator - Backend polling with spinner
5. Test updates - Jest setup and snapshot updates for
Bootstrap-Vue-Next
6. Documentation updates - Vue 3 and Vue I18n v9+ API documentation
7. Enhanced ConfirmModal - Feature-rich confirmation dialog with
custom actions
Change-Id: Ib76a58f324b3c926cf536e6e4626e4271639de38
Signed-off-by: Jason Westover <jwestover@nvidia.com>
|
|
Configure sass in the vue.config.js file and remove the
import of the scss file from each page. The styles are
handled by the css loaderOptions in the config file.
Every component and page has the appropriate style applied.
The appearance adjusts to the openBmc webui in Vue 2.
Change-Id: I3773c063646185b80b7bd61d05aa80a993cbd121
Signed-off-by: Surya Venkatesan <suryav@ami.com>
|
|
While navigating to the pages i18n, vuelidate, and filters errors
occurred. i18n, and vuelidate code changes in each page adapted to
vue3. Filter global function for date and time format implemented
in the main.js file and those files which as called the filter
functions.
Change-Id: If1a2ee22d47750faef1c35ef2c263299067d9a20
Signed-off-by: Surya Venkatesan <suryav@ami.com>
|
|
Start the process of porting everything to Vue 3. I have most things
working. npm run-scripts build works, npm install works. prettier
passes. Styles load, login works, webui loads.
This was primarily done using the linked documents below. It makes the
following design decisions:
1. Vue is put in compat 2 mode, which allows most of the components to
work as-is.
2. Bootstrap v4 is used along with bootstrap-vue to keep our components
working.
3. Minor changes are made to load the latest versions of vue-router,
vuex, and vue-i18n.
I suspect this patchset is good enough to start with, and we can clean
up the broken things one patchset at a time. The things that need to
happen are:
1. Get remaining features working again. This primiarily is vue-i18n
for mixins, and non vue components. This likely needs to be done by
not pulling in i18n into the non vue components, then using the .Vue
files to do the internationalization in the component context, NOT in
the mixin context. Alternatively, we could drop MixIns alltogether.
2. Get custom styles working again. Previously, we used some path
hackery in vue.config.js to optionally pre-load styles. This stops
working now that we're required to @import our modules. Likely we
need some rearangement of the paths such that custom styles are a
complete replacement (possibly importing the original) rather than
additive with overrides. That's a guess, but I don't really see
anyone else doing customization the way we've defined it here.
3. Bootstrap 5 no longer requires ANY custom vue modules, as it has
dropped the jquery dependency. We won't be able to pull in bootstrap
5 all at once, so pull in bootstrap 5 under an alias, like
"bootstrap5" that we can optionally import 5 or 4.
4. One at a time, start porting components over to Vue3 syntax and
bootstrap 5. This will be the bulk of the manual work and review.
The only thing I think left is getting unit tests passing, which I
commented out the pre-commit hook to make this PR.
Tested: Code builds. Needs better testing.
[1] https://router.vuejs.org/guide/migration/
[2] https://vue-i18n.intlify.dev/guide/migration/vue3
[3] https://vuelidate-next.netlify.app/migration_guide.html#package-name-and-imports
Change-Id: I5bb3187b9efbf2e4ff63e57994bc528756e2a981
Signed-off-by: Ed Tanous <ed@tanous.net>
|
|
Users of common WIMP GUIs (as opposed to interfaces primarily meant for
touch input) expect dialog boxes to have keyboard focus set on the
button for default action so that it can be executed by a single key
press. Usually that is chosen to proceed with the operation but in cases
where that leads to data loss the UI designers often pre-select Cancel
as a precaution.
This patch adds suitable property to all invocations of msgBoxConfirm()
method of `this.$bvModal` BootstrapVue object. For regular actions the
confirmation button is selected and can be activated by Enter or Space
bar. For actions deemed dangerous Cancel is focused instead so it takes
two key presses (first being Tab to shift the focus) to prooceed.
This also improves accessibility following the Web Content Accessibility
Guidelines (WCAG) published by W3C.
Tested: manually verified that modals are consistently shown with the
specified button focused, Enter and Space bar key presses produce the
same effect as left pointer button click: when Cancel is focused it just
closes the window, when OK is focused it sends the corresponding request
to the Redfish endpoint.
Change-Id: I66bfd02e48e08dc18994b11bbdd5d6b3ea27047f
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
|
|
This is the third update to the information architecture changes and
has the following changes:
- The control section has been updated to operations
- The server led page has been removed
- The firmware page is moved to operations section
Signed-off-by: Sandeepa Singh <sandeepa.singh@ibm.com>
Change-Id: I2e23da447890d7bee51892e1f782d5f2db6dded4
|