blob: 1ac6f146acf7db7d21f8562e757b0d853dcac5fa [file] [log] [blame]
Sean Zhangdb47b7e2024-06-12 10:28:41 +03001<template>
2 <b-modal
3 id="modal-default-gateway"
4 ref="modal"
5 :title="$t('pageNetwork.modal.editIPv6DefaultGatewayTitle')"
6 @hidden="resetForm"
7 >
8 <b-form id="gateway-settings" @submit.prevent="handleSubmit">
9 <b-row>
10 <b-col sm="6">
11 <b-form-group
12 :label="$t('pageNetwork.gateway')"
13 label-for="defaultGateway"
14 >
15 <b-form-input
16 id="defaultGateway"
17 v-model.trim="form.defaultGateway"
18 data-test-id="network-input-gateway"
19 type="text"
Surya Venkatesan4626aec2024-09-19 15:06:49 +053020 :state="getValidationState(v$.form.defaultGateway)"
21 @change="v$.form.defaultGateway.$touch()"
Sean Zhangdb47b7e2024-06-12 10:28:41 +030022 />
23 <b-form-invalid-feedback role="alert">
Surya Venkatesan4626aec2024-09-19 15:06:49 +053024 <div v-if="v$.form.defaultGateway.required.$invalid">
Sean Zhangdb47b7e2024-06-12 10:28:41 +030025 {{ $t('global.form.fieldRequired') }}
26 </div>
Surya Venkatesan4626aec2024-09-19 15:06:49 +053027 <div v-if="v$.form.defaultGateway.validateGateway.$invalid">
Sean Zhangdb47b7e2024-06-12 10:28:41 +030028 {{ $t('global.form.invalidFormat') }}
29 </div>
30 </b-form-invalid-feedback>
31 </b-form-group>
32 </b-col>
33 </b-row>
34 </b-form>
jason westoverd36ac8a2025-11-03 20:58:59 -060035 <template #footer="{ cancel }">
Sean Zhangdb47b7e2024-06-12 10:28:41 +030036 <b-button variant="secondary" @click="cancel()">
37 {{ $t('global.action.cancel') }}
38 </b-button>
39 <b-button
40 form="gateway-settings"
41 type="submit"
42 variant="primary"
43 @click="onOk"
44 >
45 {{ $t('global.action.add') }}
46 </b-button>
47 </template>
48 </b-modal>
49</template>
50
51<script>
52import VuelidateMixin from '@/components/Mixins/VuelidateMixin.js';
Surya Venkatesan4626aec2024-09-19 15:06:49 +053053import { required } from '@vuelidate/validators';
54import { helpers } from 'vuelidate/lib/validators';
55import { useVuelidate } from '@vuelidate/core';
56import { useI18n } from 'vue-i18n';
Sean Zhangdb47b7e2024-06-12 10:28:41 +030057
58const validateGateway = helpers.regex(
59 'validateGateway',
60 /^((?:[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})$/,
61);
62
63export default {
64 mixins: [VuelidateMixin],
65 props: {
jason westoverd36ac8a2025-11-03 20:58:59 -060066 modelValue: {
67 type: Boolean,
68 default: false,
69 },
Sean Zhangdb47b7e2024-06-12 10:28:41 +030070 defaultGateway: {
71 type: String,
72 default: '',
73 },
74 },
jason westoverd36ac8a2025-11-03 20:58:59 -060075 emits: ['ok', 'hidden', 'update:modelValue'],
Surya Venkatesan4626aec2024-09-19 15:06:49 +053076 setup() {
77 return {
78 v$: useVuelidate(),
79 };
80 },
Sean Zhangdb47b7e2024-06-12 10:28:41 +030081 data() {
82 return {
Surya Venkatesan4626aec2024-09-19 15:06:49 +053083 $t: useI18n().t,
Sean Zhangdb47b7e2024-06-12 10:28:41 +030084 form: {
85 defaultGateway: '',
86 },
87 };
88 },
89 watch: {
90 defaultGateway() {
91 this.form.defaultGateway = this.defaultGateway;
92 },
jason westoverd36ac8a2025-11-03 20:58:59 -060093 modelValue: {
94 handler(newValue) {
95 if (newValue) {
96 this.$nextTick(() => {
97 this.$refs.modal?.show();
98 });
99 }
100 },
101 immediate: true,
102 },
Sean Zhangdb47b7e2024-06-12 10:28:41 +0300103 },
104 validations() {
105 return {
106 form: {
107 defaultGateway: {
108 required,
109 validateGateway,
110 },
111 },
112 };
113 },
114 methods: {
115 handleSubmit() {
Surya Venkatesan4626aec2024-09-19 15:06:49 +0530116 this.v$.$touch();
117 if (this.v$.$invalid) return;
Sean Zhangdb47b7e2024-06-12 10:28:41 +0300118 this.$emit('ok', { IPv6DefaultGateway: this.form.defaultGateway });
119 this.closeModal();
120 },
121 closeModal() {
122 this.$nextTick(() => {
123 this.$refs.modal.hide();
124 });
125 },
126 resetForm() {
127 this.form.defaultGateway = this.defaultGateway;
Surya Venkatesan4626aec2024-09-19 15:06:49 +0530128 this.v$.$reset();
jason westoverd36ac8a2025-11-03 20:58:59 -0600129 this.$emit('update:modelValue', false);
Sean Zhangdb47b7e2024-06-12 10:28:41 +0300130 this.$emit('hidden');
131 },
132 onOk(bvModalEvt) {
133 // prevent modal close
134 bvModalEvt.preventDefault();
135 this.handleSubmit();
136 },
137 },
138};
139</script>