1<template> 2 <div> 3 <div class="form-background p-3"> 4 <b-form @submit.prevent="onSubmitUpload"> 5 <!-- Workstation Upload --> 6 <b-form-group 7 :label="$t('pageFirmware.form.updateFirmware.imageFile')" 8 label-for="image-file" 9 class="mb-3" 10 > 11 <form-file 12 id="image-file" 13 :disabled="isPageDisabled" 14 :state="getValidationState(v$.file)" 15 aria-describedby="image-file-help-block" 16 @input="onFileUpload($event)" 17 > 18 <template #invalid> 19 <b-form-invalid-feedback role="alert"> 20 {{ $t('global.form.required') }} 21 </b-form-invalid-feedback> 22 </template> 23 </form-file> 24 </b-form-group> 25 26 <b-btn 27 data-test-id="firmware-button-startUpdate" 28 type="submit" 29 variant="primary" 30 :disabled="isPageDisabled" 31 > 32 {{ $t('pageFirmware.form.updateFirmware.startUpdate') }} 33 </b-btn> 34 </b-form> 35 </div> 36 37 <!-- Modals --> 38 <modal-update-firmware v-model="showUpdateModal" @ok="updateFirmware" /> 39 </div> 40</template> 41 42<script> 43import { required } from 'vuelidate/lib/validators'; 44 45import BVToastMixin from '@/components/Mixins/BVToastMixin'; 46import LoadingBarMixin, { loading } from '@/components/Mixins/LoadingBarMixin'; 47import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js'; 48import { useVuelidate } from '@vuelidate/core'; 49 50import FormFile from '@/components/Global/FormFile'; 51import ModalUpdateFirmware from './FirmwareModalUpdateFirmware'; 52import { useI18n } from 'vue-i18n'; 53import i18n from '@/i18n'; 54 55export default { 56 components: { FormFile, ModalUpdateFirmware }, 57 mixins: [BVToastMixin, LoadingBarMixin, VuelidateMixin], 58 props: { 59 isPageDisabled: { 60 required: true, 61 type: Boolean, 62 default: false, 63 }, 64 isServerOff: { 65 required: true, 66 type: Boolean, 67 }, 68 }, 69 setup() { 70 return { 71 v$: useVuelidate(), 72 }; 73 }, 74 data() { 75 return { 76 $t: useI18n().t, 77 loading, 78 showUpdateModal: false, 79 file: null, 80 isServerPowerOffRequired: 81 process.env.VUE_APP_SERVER_OFF_REQUIRED === 'true', 82 }; 83 }, 84 validations: { 85 file: { 86 required, 87 }, 88 }, 89 created() { 90 this.$store.dispatch('firmware/getUpdateServiceSettings'); 91 }, 92 methods: { 93 updateFirmware() { 94 this.startLoader(); 95 const timerId = setTimeout(() => { 96 this.endLoader(); 97 this.infoToast( 98 i18n.global.t('pageFirmware.toast.verifyUpdateMessage'), 99 { 100 title: i18n.global.t('pageFirmware.toast.verifyUpdate'), 101 refreshAction: true, 102 }, 103 ); 104 }, 360000); 105 this.infoToast(i18n.global.t('pageFirmware.toast.updateStartedMessage'), { 106 title: i18n.global.t('pageFirmware.toast.updateStarted'), 107 timestamp: true, 108 }); 109 this.dispatchWorkstationUpload(timerId); 110 }, 111 dispatchWorkstationUpload(timerId) { 112 this.$store 113 .dispatch('firmware/uploadFirmware', { 114 image: this.file, 115 }) 116 .catch(({ message }) => { 117 this.endLoader(); 118 this.errorToast(message); 119 clearTimeout(timerId); 120 }); 121 }, 122 onSubmitUpload() { 123 this.v$.$touch(); 124 if (this.v$.$invalid) return; 125 this.showUpdateModal = true; 126 }, 127 onFileUpload(file) { 128 this.file = file; 129 this.v$.file.$touch(); 130 }, 131 }, 132}; 133</script> 134