blob: 6f844ce06a72f24bb40951ed75bf86bae42307d8 [file] [log] [blame]
Sean Zhangdb47b7e2024-06-12 10:28:41 +03001<template>
2 <b-modal
3 id="modal-add-ipv6"
4 ref="modal"
5 :title="$t('pageNetwork.table.addIpv6Address')"
6 @hidden="resetForm"
7 >
8 <b-form id="form-ipv6" @submit.prevent="handleSubmit">
9 <b-row>
10 <b-col sm="6">
11 <b-form-group
12 :label="$t('pageNetwork.modal.ipAddress')"
13 label-for="ipAddress"
14 >
15 <b-form-input
16 id="ipAddress"
17 v-model="form.ipAddress"
18 type="text"
Surya Venkatesan4626aec2024-09-19 15:06:49 +053019 :state="getValidationState(v$.form.ipAddress)"
20 @input="v$.form.ipAddress.$touch()"
Sean Zhangdb47b7e2024-06-12 10:28:41 +030021 />
22 <b-form-invalid-feedback role="alert">
Surya Venkatesan4626aec2024-09-19 15:06:49 +053023 <template v-if="v$.form.ipAddress.required.$invalid">
Sean Zhangdb47b7e2024-06-12 10:28:41 +030024 {{ $t('global.form.fieldRequired') }}
25 </template>
Surya Venkatesan4626aec2024-09-19 15:06:49 +053026 <template v-if="v$.form.ipAddress.validateIpv6.$invalid">
Sean Zhangdb47b7e2024-06-12 10:28:41 +030027 {{ $t('global.form.invalidFormat') }}
28 </template>
29 </b-form-invalid-feedback>
30 </b-form-group>
31 </b-col>
32 <b-col sm="6">
33 <b-form-group
34 :label="$t('pageNetwork.modal.prefixLength')"
35 label-for="prefixLength"
36 >
37 <b-form-input
38 id="prefixLength"
39 v-model="form.prefixLength"
40 type="text"
Surya Venkatesan4626aec2024-09-19 15:06:49 +053041 :state="getValidationState(v$.form.prefixLength)"
42 @input="v$.form.prefixLength.$touch()"
Sean Zhangdb47b7e2024-06-12 10:28:41 +030043 />
44 <b-form-invalid-feedback role="alert">
Surya Venkatesan4626aec2024-09-19 15:06:49 +053045 <template v-if="v$.form.prefixLength.required.$invalid">
Sean Zhangdb47b7e2024-06-12 10:28:41 +030046 {{ $t('global.form.fieldRequired') }}
47 </template>
Surya Venkatesan4626aec2024-09-19 15:06:49 +053048 <template
49 v-if="v$.form.prefixLength.validatePrefixLength.$invalid"
50 >
Sean Zhangdb47b7e2024-06-12 10:28:41 +030051 {{ $t('global.form.invalidFormat') }}
52 </template>
53 </b-form-invalid-feedback>
54 </b-form-group>
55 </b-col>
56 </b-row>
57 </b-form>
58 <template #modal-footer="{ cancel }">
59 <b-button variant="secondary" @click="cancel()">
60 {{ $t('global.action.cancel') }}
61 </b-button>
62 <b-button form="form-ipv6" type="submit" variant="primary" @click="onOk">
63 {{ $t('global.action.add') }}
64 </b-button>
65 </template>
66 </b-modal>
67</template>
68
69<script>
70import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
Surya Venkatesan4626aec2024-09-19 15:06:49 +053071import { required } from '@vuelidate/validators';
72import { helpers } from 'vuelidate/lib/validators';
73import { useI18n } from 'vue-i18n';
74import { useVuelidate } from '@vuelidate/core';
Sean Zhangdb47b7e2024-06-12 10:28:41 +030075
76const validateIpv6 = helpers.regex(
77 'validateIpv6',
78 /^((?:[a-fA-F0-9]{1,4}:){7}[a-fA-F0-9]{1,4}|(?:[a-fA-F0-9]{1,4}:){1,7}:|(?:[a-fA-F0-9]{1,4}:){1,6}:[a-fA-F0-9]{1,4}|(?:[a-fA-F0-9]{1,4}:){1,5}(?::[a-fA-F0-9]{1,4}){1,2}|(?:[a-fA-F0-9]{1,4}:){1,4}(?::[a-fA-F0-9]{1,4}){1,3}|(?:[a-fA-F0-9]{1,4}:){1,3}(?::[a-fA-F0-9]{1,4}){1,4}|(?:[a-fA-F0-9]{1,4}:){1,2}(?::[a-fA-F0-9]{1,4}){1,5}|[a-fA-F0-9]{1,4}:(?::[a-fA-F0-9]{1,4}){1,6}|:(?::[a-fA-F0-9]{1,4}){1,7}|::|(?:[a-fA-F0-9]{1,4}:){6}(?:[0-9]{1,3}\.){3}[0-9]{1,3}|::(?:[a-fA-F0-9]{1,4}:){0,5}(?:[0-9]{1,3}\.){3}[0-9]{1,3}|(?:[a-fA-F0-9]{1,4}:){1,5}:(?:[0-9]{1,3}\.){3}[0-9]{1,3}|(?:[a-fA-F0-9]{1,4}:){1,4}:(?:[0-9]{1,3}\.){3}[0-9]{1,3}|(?:[a-fA-F0-9]{1,4}:){1,3}:(?:[0-9]{1,3}\.){3}[0-9]{1,3}|(?:[a-fA-F0-9]{1,4}:){1,2}:(?:[0-9]{1,3}\.){3}[0-9]{1,3}|[a-fA-F0-9]{1,4}:(?:[0-9]{1,3}\.){3}[0-9]{1,3}|::(?:[0-9]{1,3}\.){3}[0-9]{1,3})$/,
79);
80
81const validatePrefixLength = helpers.regex(
82 'validatePrefixLength',
83 /^(12[0-8]|1[0-9]|[1-9][0-9]|[0-9])$/,
84);
85
86export default {
87 mixins: [VuelidateMixin],
Hariharan Rangasamyc5d60f52025-10-31 12:58:56 +053088 emits: ['ok', 'hidden'],
Surya Venkatesan4626aec2024-09-19 15:06:49 +053089 setup() {
90 return {
91 v$: useVuelidate(),
92 };
93 },
Sean Zhangdb47b7e2024-06-12 10:28:41 +030094 data() {
95 return {
Surya Venkatesan4626aec2024-09-19 15:06:49 +053096 $t: useI18n().t,
Sean Zhangdb47b7e2024-06-12 10:28:41 +030097 form: {
98 ipAddress: '',
99 prefixLength: '',
100 },
101 };
102 },
103 validations() {
104 return {
105 form: {
106 ipAddress: {
107 required,
108 validateIpv6,
109 },
110 prefixLength: {
111 required,
112 validatePrefixLength,
113 },
114 },
115 };
116 },
117 methods: {
118 handleSubmit() {
Surya Venkatesan4626aec2024-09-19 15:06:49 +0530119 this.v$.$touch();
120 if (this.v$.$invalid) return;
Sean Zhangdb47b7e2024-06-12 10:28:41 +0300121 this.$emit('ok', {
122 Address: this.form.ipAddress,
123 PrefixLength: parseInt(this.form.prefixLength),
124 });
125 this.closeModal();
126 },
127 closeModal() {
128 this.$nextTick(() => {
129 this.$refs.modal.hide();
130 });
131 },
132 resetForm() {
133 this.form.ipAddress = null;
134 this.form.prefixLength = null;
Surya Venkatesan4626aec2024-09-19 15:06:49 +0530135 this.v$.$reset();
Sean Zhangdb47b7e2024-06-12 10:28:41 +0300136 this.$emit('hidden');
137 },
138 onOk(bvModalEvt) {
139 // prevent modal close
140 bvModalEvt.preventDefault();
141 this.handleSubmit();
142 },
143 },
144};
145</script>