1<template> 2 <b-container fluid="xl"> 3 <page-title :description="$t('pagePower.description')" /> 4 5 <b-row> 6 <b-col sm="8" md="6" xl="12"> 7 <dl> 8 <dt>{{ $t('pagePower.powerConsumption') }}</dt> 9 <dd> 10 {{ 11 powerConsumptionValue 12 ? `${powerConsumptionValue} W` 13 : $t('global.status.notAvailable') 14 }} 15 </dd> 16 </dl> 17 </b-col> 18 </b-row> 19 20 <b-form @submit.prevent="submitForm"> 21 <b-form-group :disabled="loading"> 22 <b-row class="mb-3"> 23 <b-col sm="8" md="6" xl="12"> 24 <b-form-group :label="$t('pagePower.powerCapSettingLabel')"> 25 <b-form-checkbox 26 v-model="isPowerCapFieldEnabled" 27 data-test-id="power-checkbox-togglePowerCapField" 28 name="power-cap-setting" 29 > 30 {{ $t('pagePower.powerCapSettingData') }} 31 </b-form-checkbox> 32 </b-form-group> 33 </b-col> 34 </b-row> 35 36 <b-row class="mb-3"> 37 <b-col sm="8" md="6" xl="3"> 38 <b-form-group 39 id="input-group-1" 40 :label="$t('pagePower.powerCapLabel')" 41 label-for="input-1" 42 > 43 <b-form-text id="power-help-text"> 44 {{ 45 $t('pagePower.powerCapLabelTextInfo', { 46 min: 1, 47 max: 10000, 48 }) 49 }} 50 </b-form-text> 51 52 <b-form-input 53 id="input-1" 54 v-model.number="powerCapValue" 55 :disabled="!isPowerCapFieldEnabled" 56 data-test-id="power-input-powerCapValue" 57 type="number" 58 aria-describedby="power-help-text" 59 :state="getValidationState(v$.powerCapValue)" 60 ></b-form-input> 61 62 <b-form-invalid-feedback id="input-live-feedback" role="alert"> 63 <template v-if="v$.powerCapValue.required.$invalid"> 64 {{ $t('global.form.fieldRequired') }} 65 </template> 66 <template v-else-if="v$.powerCapValue.between.$invalid"> 67 {{ $t('global.form.invalidValue') }} 68 </template> 69 </b-form-invalid-feedback> 70 </b-form-group> 71 </b-col> 72 </b-row> 73 74 <b-button 75 variant="primary" 76 type="submit" 77 data-test-id="power-button-savePowerCapValue" 78 class="mt-3" 79 > 80 {{ $t('global.action.save') }} 81 </b-button> 82 </b-form-group> 83 </b-form> 84 </b-container> 85</template> 86 87<script> 88import PageTitle from '@/components/Global/PageTitle'; 89import LoadingBarMixin, { loading } from '@/components/Mixins/LoadingBarMixin'; 90import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js'; 91import { useVuelidate } from '@vuelidate/core'; 92 93import BVToastMixin from '@/components/Mixins/BVToastMixin'; 94import { requiredIf, between } from '@vuelidate/validators'; 95import { mapGetters } from 'vuex'; 96import { useI18n } from 'vue-i18n'; 97 98export default { 99 name: 'Power', 100 components: { PageTitle }, 101 mixins: [VuelidateMixin, BVToastMixin, LoadingBarMixin], 102 beforeRouteLeave(to, from, next) { 103 this.hideLoader(); 104 next(); 105 }, 106 setup() { 107 return { 108 v$: useVuelidate(), 109 }; 110 }, 111 data() { 112 return { 113 $t: useI18n().t, 114 loading, 115 }; 116 }, 117 computed: { 118 ...mapGetters({ 119 powerConsumptionValue: 'powerControl/powerConsumptionValue', 120 }), 121 122 /** 123 Computed property isPowerCapFieldEnabled is used to enable or disable the input field. 124 The input field is enabled when the powercapValue property is not null. 125 **/ 126 isPowerCapFieldEnabled: { 127 get() { 128 return this.powerCapValue !== null; 129 }, 130 set(value) { 131 this.v$.$reset(); 132 let newValue = null; 133 if (value) { 134 if (this.powerCapValue) { 135 newValue = this.powerCapValue; 136 } else { 137 newValue = ''; 138 } 139 } 140 this.$store.dispatch('powerControl/setPowerCapUpdatedValue', newValue); 141 }, 142 }, 143 powerCapValue: { 144 get() { 145 return this.$store.getters['powerControl/powerCapValue']; 146 }, 147 set(value) { 148 this.v$.$touch(); 149 this.$store.dispatch('powerControl/setPowerCapUpdatedValue', value); 150 }, 151 }, 152 }, 153 created() { 154 this.startLoader(); 155 this.$store 156 .dispatch('powerControl/getPowerControl') 157 .finally(() => this.endLoader()); 158 }, 159 validations: { 160 powerCapValue: { 161 between: between(1, 10000), 162 required: requiredIf(function () { 163 return this.isPowerCapFieldEnabled; 164 }), 165 }, 166 }, 167 methods: { 168 submitForm() { 169 this.v$.$touch(); 170 if (this.v$.$invalid) return; 171 this.startLoader(); 172 this.$store 173 .dispatch('powerControl/setPowerControl', this.powerCapValue) 174 .then((message) => this.successToast(message)) 175 .catch(({ message }) => this.errorToast(message)) 176 .finally(() => this.endLoader()); 177 }, 178 }, 179}; 180</script> 181