antares/src/renderer/components/ModalEditSchema.vue

173 lines
5.4 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 ref="trapRef" class="modal-container p-0">
2022-04-25 13:45:07 +02:00
<div class="modal-header pl-2">
<div class="modal-title h6">
<div class="d-flex">
<i class="mdi mdi-24px mdi-database-edit mr-1" />
<span class="cut-text">{{ t('database.editSchema') }}</span>
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
<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">
<div class="form-group">
<div class="col-3">
<label class="form-label">{{ t('general.name') }}</label>
2022-04-25 13:45:07 +02:00
</div>
<div class="col-9">
<input
ref="firstInput"
2022-04-25 13:45:07 +02:00
v-model="database.name"
class="form-input"
type="text"
required
:placeholder="t('database.schemaName')"
2022-04-25 13:45:07 +02:00
readonly
>
</div>
2020-09-25 12:39:58 +02:00
</div>
2022-04-25 13:45:07 +02:00
<div class="form-group">
<div class="col-3">
<label class="form-label">{{ t('database.collation') }}</label>
2022-04-25 13:45:07 +02:00
</div>
<div class="col-9">
<BaseSelect
2022-04-25 13:45:07 +02:00
v-model="database.collation"
class="form-select"
:options="collations"
:max-visible-options="1000"
option-label="collation"
option-track-by="collation"
/>
<small>{{ t('database.serverDefault') }}: {{ defaultCollation }}</small>
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
</form>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-primary mr-2" @click.stop="updateSchema">
{{ t('application.update') }}
2022-04-25 13:45:07 +02:00
</button>
<button class="btn btn-link" @click.stop="closeModal">
{{ t('general.close') }}
2022-04-25 13:45:07 +02:00
</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">
2022-04-30 11:45:49 +02:00
import { storeToRefs } from 'pinia';
import { computed, onBeforeUnmount, Ref, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import BaseSelect from '@/components/BaseSelect.vue';
import { useFocusTrap } from '@/composables/useFocusTrap';
2021-03-17 11:15:14 +01:00
import Schema from '@/ipc-api/Schema';
import { useNotificationsStore } from '@/stores/notifications';
import { useWorkspacesStore } from '@/stores/workspaces';
const { t } = useI18n();
2020-09-25 12:39:58 +02:00
const props = defineProps({
selectedSchema: String
});
const emit = defineEmits(['close']);
const { addNotification } = useNotificationsStore();
const workspacesStore = useWorkspacesStore();
const { getSelected: selectedWorkspace } = storeToRefs(workspacesStore);
const { getWorkspace, getDatabaseVariable } = workspacesStore;
const { trapRef } = useFocusTrap();
const firstInput: Ref<HTMLInputElement> = ref(null);
const database = ref({
name: '',
prevName: '',
collation: '',
prevCollation: null
});
const collations = computed(() => getWorkspace(selectedWorkspace.value).collations);
const defaultCollation = computed(() => (getDatabaseVariable(selectedWorkspace.value, 'collation_server').value || ''));
const updateSchema = async () => {
if (database.value.collation !== database.value.prevCollation) {
2020-10-03 12:11:42 +02:00
try {
const { status, response } = await Schema.updateSchema({
uid: selectedWorkspace.value,
...database.value
});
2020-10-03 12:11:42 +02:00
if (status === 'success')
closeModal();
2020-10-03 12:11:42 +02:00
else
addNotification({ status: 'error', message: response });
2020-10-03 12:11:42 +02:00
}
catch (err) {
addNotification({ status: 'error', message: err.stack });
2020-09-25 12:39:58 +02:00
}
}
else closeModal();
2020-09-25 12:39:58 +02:00
};
const closeModal = () => emit('close');
const onKey =(e: KeyboardEvent) => {
e.stopPropagation();
if (e.key === 'Escape')
closeModal();
};
(async () => {
let actualCollation;
try {
const { status, response } = await Schema.getDatabaseCollation({ uid: selectedWorkspace.value, database: props.selectedSchema });
if (status === 'success')
actualCollation = response;
else
addNotification({ status: 'error', message: response });
}
catch (err) {
addNotification({ status: 'error', message: err.stack });
}
database.value = {
name: props.selectedSchema,
prevName: props.selectedSchema,
collation: actualCollation || defaultCollation.value,
prevCollation: actualCollation || defaultCollation.value
};
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 lang="scss">
2020-09-25 12:39:58 +02:00
.modal-container {
max-width: 360px;
}
</style>