| Age | Commit message (Collapse) | Author | Files | Lines |
|
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 > 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 >
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 <bill_chan@jabil.com>
|
|
- Implemented styling changes to restore UI appearance,
behavior, margins, and sizing consistent with Vue 2.
- Fixed broken styling across the search bar, filters,
buttons, pagination, app navigation, cards, badges, and
toast messages.
Change-Id: If4aa37635136d94ebd3ad0a7533260bd788c2436
Signed-off-by: Vedangi Mittal <vedangimittal3004@gmail.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 the migration from Vuelidate v1 (vuelidate 0.7.7) to v2
(@vuelidate/core 2.0.3 and @vuelidate/validators 2.0.4).
Changes include:
- Replace imports from 'vuelidate/lib/validators' with
'@vuelidate/validators'
- Convert static 'validations:' objects to 'validations()' methods
which return the validation rules object
- Update helpers.regex() syntax from v1 two-arg format
helpers.regex('name', pattern) to v2 single-arg
helpers.regex(pattern)
- Create custom macAddress validator using regex since macAddress
is not included in @vuelidate/validators v2
- Remove deprecated vuelidate 0.7.7 package from dependencies
- Add unit tests for Vuelidate v2 migration verification
- Fix DateTime store to continue with DateTime update even if NTP
settings update fails
- Fix Network Table components (IPv4, IPv6, DNS) missing @ok event
handlers for Add modal dialogs
- Fix CSR country dropdown by restoring COUNTRY_LIST data and
moving useI18n() call to setup() function
- Fix disconnected modals in Network page by using eventBus to
communicate between child components and parent (hostname,
MAC address, default gateway edit buttons)
Tested:
- npm run build completes successfully
- npm run test:unit passes 66 new Vuelidate validation tests:
- VuelidateMixin.spec.js: getValidationState method tests
- TableDateFilter.spec.js: Date range validation tests
- ModalHostname.spec.js: Hostname validation tests
- ModalMacAddress.spec.js: MAC address validation tests
- ModalUser.spec.js: User form validation tests
- Manual testing performed:
- User Management: Create/edit user with password confirmation
- LDAP: Enable/disable with conditional field requirements
- Date/Time: Switch between NTP and manual modes
- Factory Reset: Confirm checkbox validation when server is on
- Network Settings: Add IPv4, IPv6, DNS addresses via modals
- Network Settings: Edit hostname, MAC address, default gateway
- Certificates: Generate CSR with country dropdown working
Change-Id: I0f6b5d89d1791b36977f1a3c16cbd10bca6a484a
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>
|
|
Warnings:
src/components/AppHeader/AppHeader.vue
235:18 warning The "refresh" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/components/Global/FormFile.vue
11:23 warning The "input" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/components/Global/Search.vue
64:18 warning The "change-search" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
68:18 warning The "clear-search" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/components/Global/TableDateFilter.vue
165:18 warning The "change" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/components/Global/TableFilter.vue
107:18 warning The "filter-change" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/components/Global/TableRowAction.vue
47:21 warning The "click-table-action" event has been triggered but
not declared on `emits` option vue/require-explicit-emits
src/components/Global/TableToolbar.vue
16:27 warning The "batch-action" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
23:27 warning The "clear-selected" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/Logs/Dumps/DumpsModalConfirmation.vue
85:18 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/Operations/FactoryReset/FactoryResetModal.vue
122:18 warning The "okConfirm" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/Operations/Firmware/FirmwareFormUpdate.vue
6:9 warning `<template>` require directive vue/no-lone-template
src/views/Operations/Firmware/FirmwareModalSwitchToRunning.vue
7:16 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/Operations/Firmware/FirmwareModalUpdateFirmware.vue
7:16 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/Operations/VirtualMedia/ModalConfigureConnection.vue
127:18 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/SecurityAndAccess/Certificates/ModalUploadCertificate.vue
147:18 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/SecurityAndAccess/Ldap/ModalAddRoleGroup.vue
147:18 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
163:18 warning The "hidden" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/SecurityAndAccess/UserManagement/ModalSettings.vue
200:18 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/SecurityAndAccess/UserManagement/ModalUser.vue
370:18 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
386:18 warning The "hidden" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/Settings/DateTime/DateTime.vue
328:18 warning The "change" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/Settings/Network/ModalDefaultGateway.vue
103:18 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
114:18 warning The "hidden" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/Settings/Network/ModalDns.vue
81:18 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
92:18 warning The "hidden" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/Settings/Network/ModalHostname.vue
99:18 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
110:18 warning The "hidden" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/Settings/Network/ModalIpv4.vue
148:18 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
165:18 warning The "hidden" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/Settings/Network/ModalIpv6.vue
120:18 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
135:18 warning The "hidden" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/Settings/Network/ModalMacAddress.vue
98:18 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
109:18 warning The "hidden" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
src/views/Settings/SnmpAlerts/ModalAddDestination.vue
124:18 warning The "ok" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
139:18 warning The "hidden" event has been triggered but not
declared on `emits` option vue/require-explicit-emits
Change-Id: I66fb82679cc12003ad435c5c73bb67c2d70b3658
Signed-off-by: Hariharan Rangasamy <hariharanr@ami.com>
|
|
The regex formula for formatting dates is no longer correct after
upgrading to Vue3. This commit corrects it by adding a `$` sign to the
end of the date pattern to avoid wrongly validate date in wrong
format.
Tested:
1. Log in to BMC Web and go to the date-time setting
2. Click "Manual" to fill Date field with the following
format: 2025-06-112
3. Can't save and show "Invalid format"
Change-Id: Ia1ff1e9cc9885772e6145732dab177949be60969
Signed-off-by: Huy Le Anh <hule@amperecomputing.com>
|
|
Invalid feedback element if condition change, Helper import change
in date time page and table date filter global component.
Change-Id: I1f01943229b78d4dff36f3905fe3781ba696d528
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>
|
|
All changes should be whitespace, and were done using npm run-script
lint.
Change-Id: I943c6b435c5c872841af5affc1e89910468b5ca6
Signed-off-by: Ed Tanous <ed@tanous.net>
|
|
The UI should not patch an empty string to the NTP server array
as this is not valid per redfish spec.
Filtered out empty strings from the array. After that, re-render
the ui and re-set ntp values.
Signed-off-by: Kenneth Fullbright <kennyneedsmilky@gmail.com>
Change-Id: I0086086dec5f49f7cb4305813b3c5ce0348368b5
|
|
This is the fourth update to information architecture changes and has
the following changes:
- The configuration section is updated to settings
- The date and time settings page is updated to date and time
- The network settings page is updated to network
- The power restore policy page in operations section is moved to
settings section
Signed-off-by: Sandeepa Singh <sandeepa.singh@ibm.com>
Change-Id: I6f5ab25f5227530be430bd39a4d9629b3bf09d8b
|