|  | <template> | 
|  | <div> | 
|  | <page-section :section-title="sectionTitle"> | 
|  | <b-card-group deck> | 
|  | <!-- Running image --> | 
|  | <b-card> | 
|  | <template #header> | 
|  | <p class="font-weight-bold m-0"> | 
|  | {{ $t('pageFirmware.cardTitleRunning') }} | 
|  | </p> | 
|  | </template> | 
|  | <dl class="mb-0"> | 
|  | <dt>{{ $t('pageFirmware.cardBodyVersion') }}</dt> | 
|  | <dd class="mb-0">{{ runningVersion }}</dd> | 
|  | </dl> | 
|  | </b-card> | 
|  |  | 
|  | <!-- Backup image --> | 
|  | <b-card> | 
|  | <template #header> | 
|  | <p class="font-weight-bold m-0"> | 
|  | {{ $t('pageFirmware.cardTitleBackup') }} | 
|  | </p> | 
|  | </template> | 
|  | <dl> | 
|  | <dt>{{ $t('pageFirmware.cardBodyVersion') }}</dt> | 
|  | <dd> | 
|  | <status-icon v-if="showBackupImageStatus" status="danger" /> | 
|  | <span v-if="showBackupImageStatus" class="sr-only"> | 
|  | {{ backupStatus }} | 
|  | </span> | 
|  | {{ backupVersion }} | 
|  | </dd> | 
|  | </dl> | 
|  | <b-btn | 
|  | v-if="!switchToBackupImageDisabled" | 
|  | v-b-modal.modal-switch-to-running | 
|  | data-test-id="firmware-button-switchToRunning" | 
|  | variant="link" | 
|  | size="sm" | 
|  | class="py-0 px-1 mt-2" | 
|  | :disabled="isPageDisabled || !backup || !isServerOff" | 
|  | > | 
|  | <icon-switch class="d-none d-sm-inline-block" /> | 
|  | {{ $t('pageFirmware.cardActionSwitchToRunning') }} | 
|  | </b-btn> | 
|  | </b-card> | 
|  | </b-card-group> | 
|  | </page-section> | 
|  | <modal-switch-to-running :backup="backupVersion" @ok="switchToRunning" /> | 
|  | </div> | 
|  | </template> | 
|  |  | 
|  | <script> | 
|  | import IconSwitch from '@carbon/icons-vue/es/arrows--horizontal/20'; | 
|  | import PageSection from '@/components/Global/PageSection'; | 
|  | import LoadingBarMixin, { loading } from '@/components/Mixins/LoadingBarMixin'; | 
|  | import BVToastMixin from '@/components/Mixins/BVToastMixin'; | 
|  |  | 
|  | import ModalSwitchToRunning from './FirmwareModalSwitchToRunning'; | 
|  |  | 
|  | export default { | 
|  | components: { IconSwitch, ModalSwitchToRunning, PageSection }, | 
|  | mixins: [BVToastMixin, LoadingBarMixin], | 
|  | props: { | 
|  | isPageDisabled: { | 
|  | required: true, | 
|  | type: Boolean, | 
|  | default: false, | 
|  | }, | 
|  | isServerOff: { | 
|  | required: true, | 
|  | type: Boolean, | 
|  | default: false, | 
|  | }, | 
|  | }, | 
|  | data() { | 
|  | return { | 
|  | loading, | 
|  | switchToBackupImageDisabled: | 
|  | process.env.VUE_APP_SWITCH_TO_BACKUP_IMAGE_DISABLED === 'true', | 
|  | }; | 
|  | }, | 
|  | computed: { | 
|  | isSingleFileUploadEnabled() { | 
|  | return this.$store.getters['firmware/isSingleFileUploadEnabled']; | 
|  | }, | 
|  | sectionTitle() { | 
|  | if (this.isSingleFileUploadEnabled) { | 
|  | return this.$t('pageFirmware.sectionTitleBmcCardsCombined'); | 
|  | } | 
|  | return this.$t('pageFirmware.sectionTitleBmcCards'); | 
|  | }, | 
|  | running() { | 
|  | return this.$store.getters['firmware/activeBmcFirmware']; | 
|  | }, | 
|  | backup() { | 
|  | return this.$store.getters['firmware/backupBmcFirmware']; | 
|  | }, | 
|  | runningVersion() { | 
|  | return this.running?.version || '--'; | 
|  | }, | 
|  | backupVersion() { | 
|  | return this.backup?.version || '--'; | 
|  | }, | 
|  | backupStatus() { | 
|  | return this.backup?.status || null; | 
|  | }, | 
|  | showBackupImageStatus() { | 
|  | return ( | 
|  | this.backupStatus === 'Critical' || this.backupStatus === 'Warning' | 
|  | ); | 
|  | }, | 
|  | }, | 
|  | methods: { | 
|  | switchToRunning() { | 
|  | this.startLoader(); | 
|  | const timerId = setTimeout(() => { | 
|  | this.endLoader(); | 
|  | this.infoToast(this.$t('pageFirmware.toast.verifySwitchMessage'), { | 
|  | title: this.$t('pageFirmware.toast.verifySwitch'), | 
|  | refreshAction: true, | 
|  | }); | 
|  | }, 60000); | 
|  |  | 
|  | this.$store | 
|  | .dispatch('firmware/switchBmcFirmwareAndReboot') | 
|  | .then(() => | 
|  | this.infoToast(this.$t('pageFirmware.toast.rebootStartedMessage'), { | 
|  | title: this.$t('pageFirmware.toast.rebootStarted'), | 
|  | }), | 
|  | ) | 
|  | .catch(({ message }) => { | 
|  | this.errorToast(message); | 
|  | clearTimeout(timerId); | 
|  | this.endLoader(); | 
|  | }); | 
|  | }, | 
|  | }, | 
|  | }; | 
|  | </script> |