blob: 78f803afbb9d7069fac5fa1ee32f191ef69fc3c5 [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],
Surya Venkatesan4626aec2024-09-19 15:06:49 +053088 setup() {
89 return {
90 v$: useVuelidate(),
91 };
92 },
Sean Zhangdb47b7e2024-06-12 10:28:41 +030093 data() {
94 return {
Surya Venkatesan4626aec2024-09-19 15:06:49 +053095 $t: useI18n().t,
Sean Zhangdb47b7e2024-06-12 10:28:41 +030096 form: {
97 ipAddress: '',
98 prefixLength: '',
99 },
100 };
101 },
102 validations() {
103 return {
104 form: {
105 ipAddress: {
106 required,
107 validateIpv6,
108 },
109 prefixLength: {
110 required,
111 validatePrefixLength,
112 },
113 },
114 };
115 },
116 methods: {
117 handleSubmit() {
Surya Venkatesan4626aec2024-09-19 15:06:49 +0530118 this.v$.$touch();
119 if (this.v$.$invalid) return;
Sean Zhangdb47b7e2024-06-12 10:28:41 +0300120 this.$emit('ok', {
121 Address: this.form.ipAddress,
122 PrefixLength: parseInt(this.form.prefixLength),
123 });
124 this.closeModal();
125 },
126 closeModal() {
127 this.$nextTick(() => {
128 this.$refs.modal.hide();
129 });
130 },
131 resetForm() {
132 this.form.ipAddress = null;
133 this.form.prefixLength = null;
Surya Venkatesan4626aec2024-09-19 15:06:49 +0530134 this.v$.$reset();
Sean Zhangdb47b7e2024-06-12 10:28:41 +0300135 this.$emit('hidden');
136 },
137 onOk(bvModalEvt) {
138 // prevent modal close
139 bvModalEvt.preventDefault();
140 this.handleSubmit();
141 },
142 },
143};
144</script>