| <template> | 
 |   <b-modal id="upload-certificate" ref="modal" @ok="onOk" @hidden="resetForm"> | 
 |     <template #modal-title> | 
 |       <template v-if="certificate"> | 
 |         {{ $t('pageCertificates.replaceCertificate') }} | 
 |       </template> | 
 |       <template v-else> | 
 |         {{ $t('pageCertificates.addNewCertificate') }} | 
 |       </template> | 
 |     </template> | 
 |     <b-form> | 
 |       <!-- Replace Certificate type --> | 
 |       <template v-if="certificate !== null"> | 
 |         <dl class="mb-4"> | 
 |           <dt>{{ $t('pageCertificates.modal.certificateType') }}</dt> | 
 |           <dd>{{ certificate.certificate }}</dd> | 
 |         </dl> | 
 |       </template> | 
 |  | 
 |       <!-- Add new Certificate type --> | 
 |       <template v-else> | 
 |         <b-form-group | 
 |           :label="$t('pageCertificates.modal.certificateType')" | 
 |           label-for="certificate-type" | 
 |         > | 
 |           <b-form-select | 
 |             id="certificate-type" | 
 |             v-model="form.certificateType" | 
 |             :options="certificateOptions" | 
 |             :state="getValidationState(v$.form.certificateType)" | 
 |             @input="v$.form.certificateType.$touch()" | 
 |           > | 
 |           </b-form-select> | 
 |           <b-form-invalid-feedback role="alert"> | 
 |             <template v-if="v$.form.certificateType.required.$invalid"> | 
 |               {{ $t('global.form.fieldRequired') }} | 
 |             </template> | 
 |           </b-form-invalid-feedback> | 
 |         </b-form-group> | 
 |       </template> | 
 |  | 
 |       <b-form-group :label="$t('pageCertificates.modal.certificateFile')"> | 
 |         <form-file | 
 |           id="certificate-file" | 
 |           v-model="form.file" | 
 |           accept=".pem" | 
 |           :state="getValidationState(v$.form.file)" | 
 |         > | 
 |           <template #invalid> | 
 |             <b-form-invalid-feedback role="alert"> | 
 |               {{ $t('global.form.required') }} | 
 |             </b-form-invalid-feedback> | 
 |           </template> | 
 |         </form-file> | 
 |       </b-form-group> | 
 |     </b-form> | 
 |     <template #modal-ok> | 
 |       <template v-if="certificate"> | 
 |         {{ $t('global.action.replace') }} | 
 |       </template> | 
 |       <template v-else> | 
 |         {{ $t('global.action.add') }} | 
 |       </template> | 
 |     </template> | 
 |     <template #modal-cancel> | 
 |       {{ $t('global.action.cancel') }} | 
 |     </template> | 
 |   </b-modal> | 
 | </template> | 
 |  | 
 | <script> | 
 | import { required, requiredIf } from '@vuelidate/validators'; | 
 | import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js'; | 
 | import { useVuelidate } from '@vuelidate/core'; | 
 |  | 
 | import FormFile from '@/components/Global/FormFile'; | 
 | import { useI18n } from 'vue-i18n'; | 
 |  | 
 | export default { | 
 |   components: { FormFile }, | 
 |   mixins: [VuelidateMixin], | 
 |   props: { | 
 |     certificate: { | 
 |       type: Object, | 
 |       default: null, | 
 |       validator: (prop) => { | 
 |         if (prop === null) return true; | 
 |         return ( | 
 |           Object.prototype.hasOwnProperty.call(prop, 'type') && | 
 |           Object.prototype.hasOwnProperty.call(prop, 'certificate') | 
 |         ); | 
 |       }, | 
 |     }, | 
 |   }, | 
 |   setup() { | 
 |     return { | 
 |       v$: useVuelidate(), | 
 |     }; | 
 |   }, | 
 |   data() { | 
 |     return { | 
 |       $t: useI18n().t, | 
 |       form: { | 
 |         certificateType: null, | 
 |         file: null, | 
 |       }, | 
 |     }; | 
 |   }, | 
 |   computed: { | 
 |     certificateTypes() { | 
 |       return this.$store.getters['certificates/availableUploadTypes']; | 
 |     }, | 
 |     certificateOptions() { | 
 |       return this.certificateTypes.map(({ type, label }) => { | 
 |         return { | 
 |           text: label, | 
 |           value: type, | 
 |         }; | 
 |       }); | 
 |     }, | 
 |   }, | 
 |   watch: { | 
 |     certificateOptions: function (options) { | 
 |       if (options.length) { | 
 |         this.form.certificateType = options[0].value; | 
 |       } | 
 |     }, | 
 |   }, | 
 |   validations() { | 
 |     return { | 
 |       form: { | 
 |         certificateType: { | 
 |           required: requiredIf(function () { | 
 |             return !this.certificate; | 
 |           }), | 
 |         }, | 
 |         file: { | 
 |           required, | 
 |         }, | 
 |       }, | 
 |     }; | 
 |   }, | 
 |   methods: { | 
 |     handleSubmit() { | 
 |       this.v$.$touch(); | 
 |       if (this.v$.$invalid) return; | 
 |       this.$emit('ok', { | 
 |         addNew: !this.certificate, | 
 |         file: this.form.file, | 
 |         location: this.certificate ? this.certificate.location : null, | 
 |         type: this.certificate | 
 |           ? this.certificate.type | 
 |           : this.form.certificateType, | 
 |       }); | 
 |       this.closeModal(); | 
 |     }, | 
 |     closeModal() { | 
 |       this.$nextTick(() => { | 
 |         this.$refs.modal.hide(); | 
 |       }); | 
 |     }, | 
 |     resetForm() { | 
 |       this.form.certificateType = this.certificateOptions.length | 
 |         ? this.certificateOptions[0].value | 
 |         : null; | 
 |       this.form.file = null; | 
 |       this.v$.$reset(); | 
 |     }, | 
 |     onOk(bvModalEvt) { | 
 |       // prevent modal close | 
 |       bvModalEvt.preventDefault(); | 
 |       this.handleSubmit(); | 
 |     }, | 
 |   }, | 
 | }; | 
 | </script> |