antares/src/renderer/components/ModalNewSchema.vue

144 lines
4.8 KiB
Vue
Raw Normal View History

2020-09-25 12:39:58 +02:00
<template>
2022-04-25 13:45:07 +02:00
<Teleport to="#window-content">
<div class="modal active">
<a class="modal-overlay" @click.stop="closeModal" />
<div class="modal-container p-0">
<div class="modal-header pl-2">
<div class="modal-title h6">
<div class="d-flex">
<i class="mdi mdi-24px mdi-database-plus mr-1" />
<span class="cut-text">{{ $t('message.createNewSchema') }}</span>
</div>
2020-09-25 12:39:58 +02:00
</div>
2022-04-25 13:45:07 +02:00
<a class="btn btn-clear c-hand" @click.stop="closeModal" />
2020-09-25 12:39:58 +02:00
</div>
2022-04-25 13:45:07 +02:00
<div class="modal-body pb-0">
<div class="content">
<form class="form-horizontal" @submit.prevent="createSchema">
<div class="form-group">
<div class="col-3">
<label class="form-label">{{ $t('word.name') }}</label>
</div>
<div class="col-9">
<input
ref="firstInput"
v-model="database.name"
class="form-input"
type="text"
required
:placeholder="$t('message.schemaName')"
2020-09-25 12:39:58 +02:00
>
2022-04-25 13:45:07 +02:00
</div>
2020-09-25 12:39:58 +02:00
</div>
2022-04-25 13:45:07 +02:00
<div v-if="customizations.collations" class="form-group">
<div class="col-3">
<label class="form-label">{{ $t('word.collation') }}</label>
</div>
<div class="col-9">
<BaseSelect
v-model="database.collation"
class="form-select"
:options="collations"
option-label="collation"
option-track-by="collation"
/>
2022-04-25 13:45:07 +02:00
<small>{{ $t('message.serverDefault') }}: {{ defaultCollation }}</small>
</div>
</div>
</form>
</div>
</div>
<div class="modal-footer">
<button
class="btn btn-primary mr-2"
:class="{'loading': isLoading}"
@click.stop="createSchema"
>
{{ $t('word.add') }}
</button>
<button class="btn btn-link" @click.stop="closeModal">
{{ $t('word.close') }}
</button>
2020-09-25 12:39:58 +02:00
</div>
</div>
</div>
2022-04-25 13:45:07 +02:00
</Teleport>
2020-09-25 12:39:58 +02:00
</template>
<script setup lang="ts">
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
import { storeToRefs } from 'pinia';
2022-04-30 00:47:37 +02:00
import { useNotificationsStore } from '@/stores/notifications';
import { useWorkspacesStore } from '@/stores/workspaces';
2021-03-17 11:15:14 +01:00
import Schema from '@/ipc-api/Schema';
import BaseSelect from '@/components/BaseSelect.vue';
2020-09-25 12:39:58 +02:00
const { addNotification } = useNotificationsStore();
const workspacesStore = useWorkspacesStore();
2022-04-30 00:47:37 +02:00
const { getSelected: selectedWorkspace } = storeToRefs(workspacesStore);
2022-04-30 00:47:37 +02:00
const { getWorkspace, getDatabaseVariable } = workspacesStore;
2022-04-30 00:47:37 +02:00
const emit = defineEmits(['reload', 'close']);
const firstInput: Ref<HTMLInputElement> = ref(null);
const isLoading = ref(false);
const database = ref({
name: '',
collation: ''
});
const collations = computed(() => getWorkspace(selectedWorkspace.value).collations);
const customizations = computed(() => getWorkspace(selectedWorkspace.value).customizations);
const defaultCollation = computed(() => getDatabaseVariable(selectedWorkspace.value, 'collation_server') ? getDatabaseVariable(selectedWorkspace.value, 'collation_server').value : '');
database.value = { ...database.value, collation: defaultCollation.value };
const createSchema = async () => {
isLoading.value = true;
try {
const { status, response } = await Schema.createSchema({
uid: selectedWorkspace.value,
...database.value
});
2020-09-25 12:39:58 +02:00
if (status === 'success') {
closeModal();
emit('reload');
2020-09-25 12:39:58 +02:00
}
else
addNotification({ status: 'error', message: response });
2020-09-25 12:39:58 +02:00
}
catch (err) {
addNotification({ status: 'error', message: err.stack });
}
isLoading.value = false;
};
const closeModal = () => {
emit('close');
2020-09-25 12:39:58 +02:00
};
const onKey = (e: KeyboardEvent) => {
e.stopPropagation();
if (e.key === 'Escape')
closeModal();
};
window.addEventListener('keydown', onKey);
setTimeout(() => {
firstInput.value.focus();
}, 20);
onBeforeUnmount(() => {
window.removeEventListener('keydown', onKey);
});
2020-09-25 12:39:58 +02:00
</script>
<style scoped>
.modal-container {
max-width: 360px;
}
</style>