mirror of
https://github.com/h44z/wg-portal.git
synced 2025-07-29 01:42:23 +00:00
111 lines
3.1 KiB
Vue
111 lines
3.1 KiB
Vue
|
<script setup>
|
||
|
import Modal from "./Modal.vue";
|
||
|
import {peerStore} from "@/stores/peers";
|
||
|
import {interfaceStore} from "@/stores/interfaces";
|
||
|
import {computed, ref} from "vue";
|
||
|
import { useI18n } from 'vue-i18n';
|
||
|
import { notify } from "@kyvg/vue3-notification";
|
||
|
import Vue3TagsInput from "vue3-tags-input";
|
||
|
import { freshInterface } from '@/helpers/models';
|
||
|
|
||
|
const { t } = useI18n()
|
||
|
|
||
|
const peers = peerStore()
|
||
|
const interfaces = interfaceStore()
|
||
|
|
||
|
const props = defineProps({
|
||
|
visible: Boolean,
|
||
|
})
|
||
|
|
||
|
const emit = defineEmits(['close'])
|
||
|
|
||
|
const selectedInterface = computed(() => {
|
||
|
let i = interfaces.GetSelected;
|
||
|
|
||
|
if (!i) {
|
||
|
i = freshInterface() // dummy interface to avoid 'undefined' exceptions
|
||
|
}
|
||
|
|
||
|
return i
|
||
|
})
|
||
|
|
||
|
function freshForm() {
|
||
|
return {
|
||
|
Identifiers: [],
|
||
|
Suffix: "",
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const formData = ref(freshForm())
|
||
|
|
||
|
const title = computed(() => {
|
||
|
if (!props.visible) {
|
||
|
return "" // otherwise interfaces.GetSelected will die...
|
||
|
}
|
||
|
if (selectedInterface.value.Mode === "server") {
|
||
|
return t("modals.peer-multi-create.headline-peer")
|
||
|
} else {
|
||
|
return t("modals.peer-multi-create.headline-endpoint")
|
||
|
}
|
||
|
})
|
||
|
|
||
|
function close() {
|
||
|
formData.value = freshForm()
|
||
|
emit('close')
|
||
|
}
|
||
|
|
||
|
function handleChangeUserIdentifiers(tags) {
|
||
|
formData.value.Identifiers = tags
|
||
|
}
|
||
|
|
||
|
async function save() {
|
||
|
if (formData.value.Identifiers.length === 0) {
|
||
|
notify({
|
||
|
title: "Missing Identifiers",
|
||
|
text: "At least one identifier is required to create a new peer.",
|
||
|
type: 'error',
|
||
|
})
|
||
|
return
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
await peers.CreateMultiplePeers(selectedInterface.value.Identifier, formData.value)
|
||
|
close()
|
||
|
} catch (e) {
|
||
|
console.log(e)
|
||
|
notify({
|
||
|
title: "Failed to create peers!",
|
||
|
text: e.toString(),
|
||
|
type: 'error',
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
</script>
|
||
|
|
||
|
<template>
|
||
|
<Modal :title="title" :visible="visible" @close="close">
|
||
|
<template #default>
|
||
|
<fieldset>
|
||
|
<div class="form-group">
|
||
|
<label class="form-label mt-4">{{ $t('modals.peer-multi-create.identifiers.label') }}</label>
|
||
|
<vue3-tags-input class="form-control" :tags="formData.Identifiers"
|
||
|
:placeholder="$t('modals.peer-multi-create.identifiers.placeholder')"
|
||
|
:add-tag-on-keys="[13, 188, 32, 9]"
|
||
|
@on-tags-changed="handleChangeUserIdentifiers"/>
|
||
|
<small class="form-text text-muted">{{ $t('modals.peer-multi-create.identifiers.description') }}</small>
|
||
|
</div>
|
||
|
<div class="form-group">
|
||
|
<label class="form-label mt-4">{{ $t('modals.peer-multi-create.prefix.label') }}</label>
|
||
|
<input type="text" class="form-control" :placeholder="$t('modals.peer-multi-create.prefix.placeholder')" v-model="formData.Suffix">
|
||
|
<small class="form-text text-muted">{{ $t('modals.peer-multi-create.prefix.description') }}</small>
|
||
|
</div>
|
||
|
</fieldset>
|
||
|
</template>
|
||
|
<template #footer>
|
||
|
<button class="btn btn-primary me-1" type="button" @click.prevent="save">{{ $t('general.save') }}</button>
|
||
|
<button class="btn btn-secondary" type="button" @click.prevent="close">{{ $t('general.close') }}</button>
|
||
|
</template>
|
||
|
</Modal>
|
||
|
</template>
|