1<template> 2 <b-modal 3 id="modal-hostname" 4 ref="modal" 5 :title="$t('pageNetwork.modal.editHostnameTitle')" 6 @hidden="resetForm" 7 > 8 <b-form id="hostname-settings" @submit.prevent="handleSubmit"> 9 <b-row> 10 <b-col sm="6"> 11 <b-form-group 12 :label="$t('pageNetwork.hostname')" 13 label-for="hostname" 14 > 15 <b-form-input 16 id="hostname" 17 v-model="form.hostname" 18 type="text" 19 :state="getValidationState(v$.form.hostname)" 20 @input="v$.form.hostname.$touch()" 21 /> 22 <b-form-invalid-feedback role="alert"> 23 <template v-if="v$.form.hostname.required.$invalid"> 24 {{ $t('global.form.fieldRequired') }} 25 </template> 26 <template v-if="v$.form.hostname.validateHostname.$invalid"> 27 {{ $t('global.form.lengthMustBeBetween', { min: 1, max: 64 }) }} 28 </template> 29 </b-form-invalid-feedback> 30 </b-form-group> 31 </b-col> 32 </b-row> 33 </b-form> 34 <template #footer="{ cancel }"> 35 <b-button variant="secondary" @click="cancel()"> 36 {{ $t('global.action.cancel') }} 37 </b-button> 38 <b-button 39 form="hostname-settings" 40 type="submit" 41 variant="primary" 42 @click="onOk" 43 > 44 {{ $t('global.action.add') }} 45 </b-button> 46 </template> 47 </b-modal> 48</template> 49 50<script> 51import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js'; 52import { useVuelidate } from '@vuelidate/core'; 53import { helpers } from 'vuelidate/lib/validators'; 54import { required } from '@vuelidate/validators'; 55import { useI18n } from 'vue-i18n'; 56 57const validateHostname = helpers.regex('validateHostname', /^\S{0,64}$/); 58 59export default { 60 mixins: [VuelidateMixin], 61 props: { 62 modelValue: { 63 type: Boolean, 64 default: false, 65 }, 66 hostname: { 67 type: String, 68 default: '', 69 }, 70 }, 71 emits: ['ok', 'hidden', 'update:modelValue'], 72 setup() { 73 return { 74 v$: useVuelidate(), 75 }; 76 }, 77 data() { 78 return { 79 $t: useI18n().t, 80 form: { 81 hostname: '', 82 }, 83 }; 84 }, 85 watch: { 86 hostname() { 87 this.form.hostname = this.hostname; 88 }, 89 modelValue: { 90 handler(newValue) { 91 if (newValue) { 92 this.$nextTick(() => { 93 this.$refs.modal?.show(); 94 }); 95 } 96 }, 97 immediate: true, 98 }, 99 }, 100 validations() { 101 return { 102 form: { 103 hostname: { 104 required, 105 validateHostname, 106 }, 107 }, 108 }; 109 }, 110 methods: { 111 handleSubmit() { 112 this.v$.$touch(); 113 if (this.v$.$invalid) return; 114 this.$emit('ok', { HostName: this.form.hostname }); 115 this.closeModal(); 116 }, 117 closeModal() { 118 this.$nextTick(() => { 119 this.$refs.modal.hide(); 120 }); 121 }, 122 resetForm() { 123 this.form.hostname = this.hostname; 124 this.v$.$reset(); 125 this.$emit('update:modelValue', false); 126 this.$emit('hidden'); 127 }, 128 onOk(bvModalEvt) { 129 // prevent modal close 130 bvModalEvt.preventDefault(); 131 this.handleSubmit(); 132 }, 133 }, 134}; 135</script> 136