From e8a08e8c611bef5f26b279aeac2467288ece2431 Mon Sep 17 00:00:00 2001 From: Nabil Ananthamangalath Date: Thu, 3 Oct 2024 19:24:38 +0530 Subject: [PATCH 1/5] Update Predictive dynamic memory dealloc help text (#290) - Updated the Predictive dynamic memory deallocation help-text in Memory page. Signed-off-by: Nabil Ananthamangalath --- src/locales/en-US.json | 9 ++-- .../ResourceManagement/ResourceMemoryStore.js | 52 ++++++++++-------- .../ResourceManagement/Memory/Memory.vue | 54 +++++++++++-------- 3 files changed, 66 insertions(+), 49 deletions(-) diff --git a/src/locales/en-US.json b/src/locales/en-US.json index 30035b9bf2..77b5c2179a 100644 --- a/src/locales/en-US.json +++ b/src/locales/en-US.json @@ -1137,9 +1137,8 @@ "logicalMemorySizeHeading": "Logical memory block size is used for partitioning. Changing the logical memory block size impacts system resource management.", "maxNumHugePages": "Max number huge pages", "memoryBlockSize": "Memory block size", - "predictiveMemoryGuardHeader": "Predictive Memory Guard", - "predictiveMemoryGuardTitle": "Predictive dynamic memory deallocation", - "predictiveMemoryGuardDescription": "Enable or Disable Predictive Guard for Memory Errors.", + "predictiveDynamicMemoryDeallocationTitle": "Predictive dynamic memory deallocation", + "predictiveDynamicMemoryDeallocationDescription": "The Hypervisor dynamically removes memory pages from memory that detected predictive failures. If this option is disabled, dynamic memory deallocation will not occur for the predictive memory failures.", "requestedHugePageMemory": "Requested huge page memory", "slotCountForNode0": "Slot Count for Node 0", "systemMemoryPageSetup": "Improve the application's performance by setting large virtual memory page sizes of 16GB each.", @@ -1162,7 +1161,7 @@ }, "toast": { "errorSavingActiveMemoryMirroringMode": "Error updating active memory mirroring mode", - "errorSavingPredictiveMemoryGuard": "Error updating predictive dynamic memory deallocation", + "errorSavingPredictiveDynamicMemoryDeallocation": "Error updating predictive dynamic memory deallocation", "errorSavingAdapterEnlargedCapacity": "Error updating I/O adapter enlarged capacity", "errorSavingLogicalMemory": "Error updating logical memory block size ", "errorSavingPageSetup": "Error updating system memory page setup", @@ -1170,7 +1169,7 @@ "successSavingAdapterEnlargedCapacity": "Successfully updated I/O adapter enlarged capacity", "successSavingLogicalMemory": "Successfully updated logical memory block size", "successSavingActiveMemoryMirroringMode": "Successfully updated active memory mirroring mode", - "successSavingPredictiveMemoryGuard": "Successfully updated predictive dynamic memory deallocation", + "successSavingPredictiveDynamicMemoryDeallocation": "Successfully updated predictive dynamic memory deallocation", "successSavingPageSetup": "Successfully updated system memory page setup", "successSavingAdapterDynamicCapacity": "Successfully updated I/O adapter drawer attachment", "errorSavingAdapterDynamicCapacity": "Error updating dynamic I/O adapter drawer attachment" diff --git a/src/store/modules/ResourceManagement/ResourceMemoryStore.js b/src/store/modules/ResourceManagement/ResourceMemoryStore.js index c04e92be7d..ad3bf8a5b1 100644 --- a/src/store/modules/ResourceManagement/ResourceMemoryStore.js +++ b/src/store/modules/ResourceManagement/ResourceMemoryStore.js @@ -13,7 +13,7 @@ export const ResourceMemoryStore = defineStore('resourceMemory', { numHugePages: null, hmcManaged: null, memoryMirroringMode: null, - predictiveMemoryGuard: null, + predictiveDynamicMemoryDeallocation: null, }), getters: { logicalMemorySizeOptionsGetter: (state) => state.logicalMemorySizeOptions, @@ -26,7 +26,8 @@ export const ResourceMemoryStore = defineStore('resourceMemory', { numHugePagesGetter: (state) => state.numHugePages, hmcManagedGetter: (state) => state.hmcManaged, memoryMirroringModeGetter: (state) => state.memoryMirroringMode, - predictiveMemoryGuardGetter: (state) => state.predictiveMemoryGuard, + predictiveDynamicMemoryDeallocationGetter: (state) => + state.predictiveDynamicMemoryDeallocation, }, actions: { async getMemorySizeOptions() { @@ -183,48 +184,57 @@ export const ResourceMemoryStore = defineStore('resourceMemory', { ); }); }, - async getPredictiveMemoryGuard() { + async getPredictiveDynamicMemoryDeallocation() { return await api .get( '/redfish/v1/Registries/BiosAttributeRegistry/BiosAttributeRegistry', ) .then(({ data: { RegistryEntries } }) => { - const predictiveMemoryGuard = RegistryEntries.Attributes.filter( - (Attribute) => Attribute.AttributeName == 'hb_predictive_mem_guard', - ); - if (predictiveMemoryGuard.length > 0) { - let predictiveMemoryGuardValue = - predictiveMemoryGuard[0].CurrentValue; + const predictiveDynamicMemoryDeallocation = + RegistryEntries.Attributes.filter( + (Attribute) => + Attribute.AttributeName == 'hb_predictive_mem_guard', + ); + if (predictiveDynamicMemoryDeallocation.length > 0) { + let predictiveDynamicMemoryDeallocationValue = + predictiveDynamicMemoryDeallocation[0].CurrentValue; let predictiveMemValue = - predictiveMemoryGuardValue == 'Enabled' ? true : false; - this.predictiveMemoryGuard = predictiveMemValue; + predictiveDynamicMemoryDeallocationValue == 'Enabled' + ? true + : false; + this.predictiveDynamicMemoryDeallocation = predictiveMemValue; } }) .catch((error) => console.log(error)); }, - async savePredictiveMemoryGuard(activePredictiveMemoryGuardValue) { - let updatedMirroringModeValue = activePredictiveMemoryGuardValue - ? 'Enabled' - : 'Disabled'; - this.predictiveMemoryGuard = activePredictiveMemoryGuardValue; - const updatedPredictiveMemoryGuard = { + async savePredictiveDynamicMemoryDeallocation( + activePredictiveDynamicMemoryDeallocationValue, + ) { + let updatedMirroringModeValue = + activePredictiveDynamicMemoryDeallocationValue ? 'Enabled' : 'Disabled'; + this.predictiveDynamicMemoryDeallocation = + activePredictiveDynamicMemoryDeallocationValue; + const updatedPredictiveDynamicMemoryDeallocation = { Attributes: { hb_predictive_mem_guard: updatedMirroringModeValue }, }; return api .patch( '/redfish/v1/Systems/system/Bios/Settings', - updatedPredictiveMemoryGuard, + updatedPredictiveDynamicMemoryDeallocation, ) .then(() => { return i18n.global.t( - 'pageMemory.toast.successSavingPredictiveMemoryGuard', + 'pageMemory.toast.successSavingPredictiveDynamicMemoryDeallocation', ); }) .catch((error) => { console.log(error); - this.predictiveMemoryGuard = !activePredictiveMemoryGuardValue; + this.predictiveDynamicMemoryDeallocation = + !activePredictiveDynamicMemoryDeallocationValue; throw new Error( - i18n.global.t('pageMemory.toast.errorSavingPredictiveMemoryGuard'), + i18n.global.t( + 'pageMemory.toast.errorSavingPredictiveDynamicMemoryDeallocation', + ), ); }); }, diff --git a/src/views/ResourceManagement/Memory/Memory.vue b/src/views/ResourceManagement/Memory/Memory.vue index 7f45564e18..693ebc192c 100644 --- a/src/views/ResourceManagement/Memory/Memory.vue +++ b/src/views/ResourceManagement/Memory/Memory.vue @@ -309,14 +309,18 @@
-

{{ $t('pageMemory.predictiveMemoryGuardDescription') }}

+

+ {{ + $t('pageMemory.predictiveDynamicMemoryDeallocationDescription') + }} +

@@ -327,30 +331,32 @@ >
- {{ $t('pageMemory.predictiveMemoryGuardHeader') }} + {{ $t('pageMemory.predictiveDynamicMemoryDeallocationTitle') }}
- + {{ '--' }} - + {{ $t('global.status.enabled') }} {{ $t('global.status.disabled') }}
- + {{ '--' }} - + {{ $t('global.status.enabled') }} {{ $t('global.status.disabled') }} @@ -392,7 +398,7 @@ const inputSystemMemoryPageSetup = ref(null); const inputIoAdapterCapacity = ref(null); const inputDynamicIoDrawerAttachmentCapacity = ref(null); const toggleActiveMemoryMirroring = ref(null); -const togglePredictiveMemoryGuard = ref(null); +const togglePredictiveDynamicMemoryDeallocation = ref(null); const refs = { logicalMemorySizeOption, @@ -400,7 +406,7 @@ const refs = { inputIoAdapterCapacity, inputDynamicIoDrawerAttachmentCapacity, toggleActiveMemoryMirroring, - togglePredictiveMemoryGuard, + togglePredictiveDynamicMemoryDeallocation, }; const form = ref({ @@ -439,10 +445,12 @@ const quickLinks = ref([ linkText: i18n.global.t('pageMemory.activeMemoryMirroringTitle'), }, { - id: 'togglePredictiveMemoryGuard', - dataRef: 'togglePredictiveMemoryGuard', - href: '#togglePredictiveMemoryGuard', - linkText: i18n.global.t('pageMemory.predictiveMemoryGuardTitle'), + id: 'togglePredictiveDynamicMemoryDeallocation', + dataRef: 'togglePredictiveDynamicMemoryDeallocation', + href: '#togglePredictiveDynamicMemoryDeallocation', + linkText: i18n.global.t( + 'pageMemory.predictiveDynamicMemoryDeallocationTitle', + ), }, ]); @@ -458,9 +466,9 @@ const activeMemoryMirroringState = computed({ }, }); -const predictiveMemoryGuardState = computed({ +const predictiveDynamicMemoryDeallocationState = computed({ get() { - return resourceMemoryStore.predictiveMemoryGuardGetter; + return resourceMemoryStore.predictiveDynamicMemoryDeallocationGetter; }, set(newValue) { return newValue; @@ -603,9 +611,9 @@ function changeActiveMemoryMirroringState(state) { .catch(({ message }) => errorToast(message)); } -function changePredictiveMemoryGuardState(state) { +function changePredictiveDynamicMemoryDeallocationState(state) { resourceMemoryStore - .savePredictiveMemoryGuard(state) + .savePredictiveDynamicMemoryDeallocation(state) .then((message) => successToast(message)) .catch(({ message }) => errorToast(message)); } @@ -620,7 +628,7 @@ onBeforeMount(() => { resourceMemoryStore.getMaxNumHugePages(), resourceMemoryStore.getHmcManaged(), resourceMemoryStore.getActiveMemoryMirroring(), - resourceMemoryStore.getPredictiveMemoryGuard(), + resourceMemoryStore.getPredictiveDynamicMemoryDeallocation(), ]).finally(() => endLoader()); }); From 65b9ad4dd0d6e8152ceec4fd6e57e2113b3a2799 Mon Sep 17 00:00:00 2001 From: Nikhil Ashoka <96164786+Nikhil-Ashoka@users.noreply.github.com> Date: Fri, 4 Oct 2024 19:09:03 +0530 Subject: [PATCH 2/5] Removed grey out option in Policies page (#293) - Removed grey out option for USB firmware update policy in Policies page for read-only users. - Defect: https://jazz07.rchland.ibm.com:13443/jazz/web/projects/CSSD#action=com.ibm.team.workitem.viewWorkItem&id=653718 Signed-off-by: Nikhil Ashoka --- src/views/SecurityAndAccess/Policies/Policies.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/views/SecurityAndAccess/Policies/Policies.vue b/src/views/SecurityAndAccess/Policies/Policies.vue index 566d43cc30..d34338bf78 100644 --- a/src/views/SecurityAndAccess/Policies/Policies.vue +++ b/src/views/SecurityAndAccess/Policies/Policies.vue @@ -148,7 +148,6 @@ id="usbFirmwareUpdatePolicySwitch" v-model="Policies.usbFirmwareUpdatePolicyEnabled" data-test-id="policies-toggle-usbFirmwareUpdatePolicy" - :disabled="!(username === 'admin' || username === 'service')" switch @update:modelValue="changeUsbFirmwareUpdatePolicyState" > From 8d2b9f426c6a021fb7be44420aae57f00e4838ee Mon Sep 17 00:00:00 2001 From: Nikhil Ashoka <96164786+Nikhil-Ashoka@users.noreply.github.com> Date: Fri, 4 Oct 2024 19:09:16 +0530 Subject: [PATCH 3/5] Updated Policies page (#294) - On error, the toggle state is going back to the expected value. - Resolved Unauthorised message showing up every time we navigate to Policies page. - Defects: https://jazz07.rchland.ibm.com:13443/jazz/web/projects/CSSD#action=com.ibm.team.workitem.viewWorkItem&id=653711 and https://jazz07.rchland.ibm.com:13443/jazz/web/projects/CSSD#action=com.ibm.team.workitem.viewWorkItem&id=653716 Signed-off-by: Nikhil Ashoka --- src/store/api.js | 8 +++++++- src/store/modules/SecurityAndAccess/PoliciesStore.js | 8 ++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/store/api.js b/src/store/api.js index 47932c872b..b1850ef73e 100644 --- a/src/store/api.js +++ b/src/store/api.js @@ -32,7 +32,13 @@ api.interceptors.response.use(undefined, (error) => { // Check if action is unauthorized. // Toast error message will appear on screen // when the action is unauthorized. - globalStore.setUnauthorized(); + // Hardware deconfiguration is an exception to this + const url = response.config.url; + const notGetMethod = response.config.method !== 'get'; + const coreUrl = 'redfish/v1/Systems/system/Processors'; + const memoryUrl = 'redfish/v1/Systems/system/Memory'; + if (!(url.includes(coreUrl) || url.includes(memoryUrl)) && notGetMethod) + globalStore.setUnauthorized(); } return Promise.reject(error); diff --git a/src/store/modules/SecurityAndAccess/PoliciesStore.js b/src/store/modules/SecurityAndAccess/PoliciesStore.js index b158c8b2a8..1d42167cf8 100644 --- a/src/store/modules/SecurityAndAccess/PoliciesStore.js +++ b/src/store/modules/SecurityAndAccess/PoliciesStore.js @@ -239,7 +239,7 @@ export const PoliciesStore = defineStore('policies', { }); }, async saveRtadState(updatedRtad) { - this.setRtadEnabled = updatedRtad; + this.rtadEnabled = updatedRtad; return await api .patch('/redfish/v1/Systems/system/Bios/Settings', { Attributes: { @@ -253,7 +253,7 @@ export const PoliciesStore = defineStore('policies', { }) .catch((error) => { console.log(error); - this.setRtadEnabled = !updatedRtad; + this.rtadEnabled = !updatedRtad; throw new Error( i18n.global.t('pagePolicies.toast.errorNetworkPolicyUpdate', { policy: i18n.global.t('pagePolicies.rtad'), @@ -315,7 +315,7 @@ export const PoliciesStore = defineStore('policies', { }); }, async saveHostUsbEnabled(updatedHostUsb) { - this.setHostUsbEnabled = updatedHostUsb; + this.hostUsbEnabled = updatedHostUsb; return await api .patch('/redfish/v1/Systems/system/Bios/Settings', { Attributes: { @@ -330,7 +330,7 @@ export const PoliciesStore = defineStore('policies', { }) .catch((error) => { console.log(error); - this.setHostUsbEnabled = !updatedHostUsb; + this.hostUsbEnabled = !updatedHostUsb; throw new Error( i18n.global.t('pagePolicies.toast.errorNetworkPolicyUpdate', { policy: i18n.global.t('pagePolicies.hostUsb'), From a32112a8e9580c4ba2b6bd9fa68be2773ebf78ea Mon Sep 17 00:00:00 2001 From: vedangimittal <69679625+vedangimittal@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:57:16 +0530 Subject: [PATCH 4/5] Implemented Sessions page (#284) - Implemented Sessions page - Jira story: https://jsw.ibm.com/browse/PFEBMC-2397 Signed-off-by: Vedangi Mittal --- src/components/Global/TableToolbar.vue | 2 +- src/router/routes.js | 9 + src/store/index.js | 2 + .../SecurityAndAccess/SessionsStore.js | 29 +- .../SecurityAndAccess/Sessions/Sessions.vue | 439 +++++++++--------- 5 files changed, 251 insertions(+), 230 deletions(-) diff --git a/src/components/Global/TableToolbar.vue b/src/components/Global/TableToolbar.vue index 76a610cb60..e0ee1bad47 100644 --- a/src/components/Global/TableToolbar.vue +++ b/src/components/Global/TableToolbar.vue @@ -13,7 +13,7 @@ :data-test-id="`table-button-${action.value}Selected`" variant="primary" class="d-block" - @click="emit('batch-action', action.value)" + @click="$emit('batch-action', action.value)" > {{ action.label }} diff --git a/src/router/routes.js b/src/router/routes.js index 79466005ce..be6c0d1857 100644 --- a/src/router/routes.js +++ b/src/router/routes.js @@ -19,6 +19,7 @@ import PowerRestorePolicy from '@/views/Settings/PowerRestorePolicy'; import ConcurrentMaintenance from '../views/HardwareStatus/ConcurrentMaintenance/ConcurrentMaintenance.vue'; import IBMiServiceFunctions from '@/views/Logs/IBMiServiceFunctions'; import Notices from '@/views/Notices/Notices.vue'; +import Sessions from '@/views/SecurityAndAccess/Sessions'; const roles = { administrator: 'Administrator', @@ -152,6 +153,14 @@ export const routes = [ title: i18n.global.t('appPageTitle.memory'), }, }, + { + path: '/security-and-access/sessions', + name: 'sessions', + component: Sessions, + meta: { + title: i18n.global.t('appPageTitle.sessions'), + }, + }, { path: '/:pathMatch(.*)*', name: 'page-not-found', diff --git a/src/store/index.js b/src/store/index.js index fd8e8dead4..8d296f97f2 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -15,6 +15,7 @@ import PowerPolicyStore from './modules/Settings/PowerPolicyStore'; import ConcurrentMaintenanceStore from './modules/HardwareStatus/ConcurrentMaintenanceStore'; import IBMiServiceFunctionsStore from './modules/Logs/IBMiServiceFunctionsStore'; import AuditLogsStore from './modules/Logs/AuditLogsStore'; +import SessionsStore from './modules/SecurityAndAccess/SessionsStore.js'; // ... (export use other stores) export { @@ -34,4 +35,5 @@ export { ConcurrentMaintenanceStore, IBMiServiceFunctionsStore, AuditLogsStore, + SessionsStore, }; diff --git a/src/store/modules/SecurityAndAccess/SessionsStore.js b/src/store/modules/SecurityAndAccess/SessionsStore.js index 794c75a7f4..b9848be307 100644 --- a/src/store/modules/SecurityAndAccess/SessionsStore.js +++ b/src/store/modules/SecurityAndAccess/SessionsStore.js @@ -1,20 +1,16 @@ import api, { getResponseCount } from '@/store/api'; import i18n from '@/i18n'; +import { defineStore } from 'pinia'; -const SessionsStore = { - namespaced: true, - state: { +export const SessionsStore = defineStore('sessions', { + state: () => ({ allConnections: [], - }, + }), getters: { - allConnections: (state) => state.allConnections, - }, - mutations: { - setAllConnections: (state, allConnections) => - (state.allConnections = allConnections), + allConnectionsGetter: (state) => state.allConnections, }, actions: { - async getSessionsData({ commit }) { + async getSessionsData() { return await api .get('/redfish/v1/SessionService/Sessions') .then((response) => @@ -29,19 +25,20 @@ const SessionsStore = { let filteredIPAddress = sessionUri.data?.ClientOriginIPAddress.split('::ffff:').pop(); return { + isSelected: false, clientID: sessionUri.data?.Context, username: sessionUri.data?.UserName, ipAddress: filteredIPAddress, uri: sessionUri.data['@odata.id'], }; }); - commit('setAllConnections', allConnectionsData); + this.allConnections = allConnectionsData; }) .catch((error) => { console.log('Client Session Data:', error); }); }, - async disconnectSessions({ dispatch }, uris = []) { + async disconnectSessions(uris) { const promises = uris.map((uri) => api.delete(uri).catch((error) => { console.log(error); @@ -51,7 +48,7 @@ const SessionsStore = { return await api .all(promises) .then((response) => { - dispatch('getSessionsData'); + this.getSessionsData(); return response; }) .then( @@ -60,7 +57,7 @@ const SessionsStore = { const toastMessages = []; if (successCount) { - const message = i18n.tc( + const message = i18n.global.t( 'pageSessions.toast.successDelete', successCount, ); @@ -68,7 +65,7 @@ const SessionsStore = { } if (errorCount) { - const message = i18n.tc( + const message = i18n.global.t( 'pageSessions.toast.errorDelete', errorCount, ); @@ -79,5 +76,5 @@ const SessionsStore = { ); }, }, -}; +}); export default SessionsStore; diff --git a/src/views/SecurityAndAccess/Sessions/Sessions.vue b/src/views/SecurityAndAccess/Sessions/Sessions.vue index 4ca2ff9123..7f482c8e7f 100644 --- a/src/views/SecurityAndAccess/Sessions/Sessions.vue +++ b/src/views/SecurityAndAccess/Sessions/Sessions.vue @@ -1,8 +1,8 @@ - - - + + + - - - + + - - - - + + + - - - + + + +

+ {{ + $t('pageSessions.modal.disconnectMessage', { count: count }, count) + }} +

+
+ - - From 14568f65d753cea6dd0aabf141149551d324361a Mon Sep 17 00:00:00 2001 From: Nabil Ananthamangalath Date: Mon, 30 Sep 2024 20:43:42 +0530 Subject: [PATCH 5/5] Initial commit --- .eslintrc.cjs | 5 +- src/assets/styles/bmc/custom/_card.scss | 15 + src/assets/styles/bmc/custom/_forms.scss | 10 + src/components/Global/FormFile.vue | 83 ++- src/components/Global/Toast.vue | 9 +- src/layouts/AppLayout.vue | 2 + src/router/routes.js | 9 + src/store/index.js | 4 + src/store/modules/GlobalStore.js | 5 + src/store/modules/HardwareStatus/BmcStore.js | 42 +- src/store/modules/Operations/FirmwareStore.js | 55 +- .../ResourceManagement/LicenseStore.js | 25 +- src/views/Operations/Firmware/Firmware.vue | 196 ++++--- .../Operations/Firmware/FirmwareAccessKey.vue | 41 +- .../Firmware/FirmwareAlertServerPower.vue | 41 +- .../Operations/Firmware/FirmwareCardsBmc.vue | 325 ++++++----- .../Operations/Firmware/FirmwareCardsHost.vue | 75 +-- .../Firmware/FirmwareFormUpdate.vue | 534 +++++++++--------- .../Firmware/FirmwareModalSwitchToRunning.vue | 25 +- .../Firmware/FirmwareModalUpdateFirmware.vue | 44 +- 20 files changed, 859 insertions(+), 686 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 692a3d08ca..05b73b649d 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -17,7 +17,10 @@ module.exports = { trailingComma: 'all', }, ], - 'vue/component-name-in-template-casing': ['error', 'kebab-case'], + 'vue/component-name-in-template-casing': [ + 'error', + 'PascalCase' | 'kebab-case', + ], }, ignorePatterns: ['*.timestamp-*.mjs'], overrides: [ diff --git a/src/assets/styles/bmc/custom/_card.scss b/src/assets/styles/bmc/custom/_card.scss index f863ceff9a..736ded97b5 100644 --- a/src/assets/styles/bmc/custom/_card.scss +++ b/src/assets/styles/bmc/custom/_card.scss @@ -3,3 +3,18 @@ background-color: theme-color-light($success) !important; } } + +.card-header, +.card-footer { + padding: 12px 20px; +} + +.card-body { + padding: 20px; +} + +@media (max-width: 576px) { + .card-deck > .card { + margin-bottom: 15px !important; + } +} diff --git a/src/assets/styles/bmc/custom/_forms.scss b/src/assets/styles/bmc/custom/_forms.scss index 866b06e69d..cbde393db1 100644 --- a/src/assets/styles/bmc/custom/_forms.scss +++ b/src/assets/styles/bmc/custom/_forms.scss @@ -59,6 +59,16 @@ div[role='group'] { } } +.form-control.form-control-file { + opacity: 0; + height: 0; + &:focus + span { + box-shadow: + inset 0 0 0 3px theme-color('primary'), + inset 0 0 0 5px $white; + } +} + .form-select, .form-check-label, .form-control { diff --git a/src/components/Global/FormFile.vue b/src/components/Global/FormFile.vue index 20ca1b80e5..6072f5f49a 100644 --- a/src/components/Global/FormFile.vue +++ b/src/components/Global/FormFile.vue @@ -1,39 +1,50 @@ - - diff --git a/src/views/Operations/Firmware/FirmwareAccessKey.vue b/src/views/Operations/Firmware/FirmwareAccessKey.vue index c551493c41..997987e8be 100644 --- a/src/views/Operations/Firmware/FirmwareAccessKey.vue +++ b/src/views/Operations/Firmware/FirmwareAccessKey.vue @@ -7,32 +7,39 @@
-- - {{ firmwareAccessKeyInfo.expirationDate | formatDate }} + {{ $filters.formatDate(firmwareAccessKeyInfo.expirationDate) }}
- {{ $t('pageFirmware.form.updateFirmware.manageAccessKeys') }} - +
- + + diff --git a/src/views/Operations/Firmware/FirmwareAlertServerPower.vue b/src/views/Operations/Firmware/FirmwareAlertServerPower.vue index 08e4ae91f5..996eed4cc6 100644 --- a/src/views/Operations/Firmware/FirmwareAlertServerPower.vue +++ b/src/views/Operations/Firmware/FirmwareAlertServerPower.vue @@ -30,22 +30,31 @@ - + + diff --git a/src/views/Operations/Firmware/FirmwareCardsBmc.vue b/src/views/Operations/Firmware/FirmwareCardsBmc.vue index a073849605..392b48709e 100644 --- a/src/views/Operations/Firmware/FirmwareCardsBmc.vue +++ b/src/views/Operations/Firmware/FirmwareCardsBmc.vue @@ -1,11 +1,11 @@ - + - + @@ -48,172 +48,187 @@

{{ $t('pageFirmware.temporary') }}

- {{ $t('pageFirmware.cardActionSwitchToRunning') }} - -
- + + +
- diff --git a/src/views/Operations/Firmware/FirmwareCardsHost.vue b/src/views/Operations/Firmware/FirmwareCardsHost.vue index b4a8e90daa..0b63fe9e62 100644 --- a/src/views/Operations/Firmware/FirmwareCardsHost.vue +++ b/src/views/Operations/Firmware/FirmwareCardsHost.vue @@ -1,10 +1,10 @@ -