mirror of
				https://github.com/Fabio286/antares.git
				synced 2025-06-05 21:59:22 +02:00 
			
		
		
		
	feat: unsaved file reminder closing file tabs
This commit is contained in:
		@@ -19,7 +19,10 @@
 | 
			
		||||
         <div ref="resizer" class="query-area-resizer" />
 | 
			
		||||
         <div ref="queryAreaFooter" class="workspace-query-runner-footer">
 | 
			
		||||
            <div class="workspace-query-buttons">
 | 
			
		||||
               <div @mouseenter="setCancelButtonVisibility(true)" @mouseleave="setCancelButtonVisibility(false)">
 | 
			
		||||
               <div
 | 
			
		||||
                  @mouseenter="setCancelButtonVisibility(true)"
 | 
			
		||||
                  @mouseleave="setCancelButtonVisibility(false)"
 | 
			
		||||
               >
 | 
			
		||||
                  <button
 | 
			
		||||
                     v-if="showCancel && isQuering"
 | 
			
		||||
                     class="btn btn-primary btn-sm cancellable"
 | 
			
		||||
@@ -109,7 +112,7 @@
 | 
			
		||||
                     :title="t('general.save')"
 | 
			
		||||
                     @click="saveQuery()"
 | 
			
		||||
                  >
 | 
			
		||||
                     <BaseIcon icon-name="mdiContentSaveOutline" :size="24" />
 | 
			
		||||
                     <BaseIcon icon-name="mdiHeartPlusOutline" :size="24" />
 | 
			
		||||
                  </button>
 | 
			
		||||
                  <button
 | 
			
		||||
                     class="btn btn-dark btn-sm"
 | 
			
		||||
@@ -117,13 +120,13 @@
 | 
			
		||||
                     :title="t('database.savedQueries')"
 | 
			
		||||
                     @click="openSavedModal()"
 | 
			
		||||
                  >
 | 
			
		||||
                     <BaseIcon icon-name="mdiStarOutline" :size="24" />
 | 
			
		||||
                     <BaseIcon icon-name="mdiNotebookHeartOutline" :size="24" />
 | 
			
		||||
                  </button>
 | 
			
		||||
               </div>
 | 
			
		||||
               <div class="btn-group">
 | 
			
		||||
                  <button
 | 
			
		||||
                     class="btn btn-dark btn-sm mr-0"
 | 
			
		||||
                     :disabled="!filePath"
 | 
			
		||||
                     :disabled="!filePath || lastSavedQuery === query"
 | 
			
		||||
                     :title="t('application.saveFile')"
 | 
			
		||||
                     @click="saveFile()"
 | 
			
		||||
                  >
 | 
			
		||||
@@ -275,7 +278,7 @@ import { uidGen } from 'common/libs/uidGen';
 | 
			
		||||
import { ipcRenderer } from 'electron';
 | 
			
		||||
import { storeToRefs } from 'pinia';
 | 
			
		||||
import { format } from 'sql-formatter';
 | 
			
		||||
import { Component, computed, onBeforeUnmount, onMounted, Prop, Ref, ref, watch } from 'vue';
 | 
			
		||||
import { Component, computed, onBeforeUnmount, onMounted, Prop, Ref, ref, toRaw, watch } from 'vue';
 | 
			
		||||
import { useI18n } from 'vue-i18n';
 | 
			
		||||
 | 
			
		||||
import BaseIcon from '@/components/BaseIcon.vue';
 | 
			
		||||
@@ -338,6 +341,7 @@ const queryName = ref('');
 | 
			
		||||
const query = ref('');
 | 
			
		||||
const filePath = ref('');
 | 
			
		||||
const lastQuery = ref('');
 | 
			
		||||
const lastSavedQuery = ref('');
 | 
			
		||||
const isCancelling = ref(false);
 | 
			
		||||
const showCancel = ref(false);
 | 
			
		||||
const autocommit = ref(true);
 | 
			
		||||
@@ -361,6 +365,9 @@ const databaseSchemas = computed(() => {
 | 
			
		||||
});
 | 
			
		||||
const hasResults = computed(() => results.value.length && results.value[0].rows);
 | 
			
		||||
const hasAffected = computed(() => affectedCount.value || (!resultsCount.value && affectedCount.value !== null));
 | 
			
		||||
const isChanged = computed(() => {
 | 
			
		||||
   return filePath.value && lastSavedQuery.value !== query.value;
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
watch(query, (val) => {
 | 
			
		||||
   clearTimeout(debounceTimeout.value);
 | 
			
		||||
@@ -426,6 +433,10 @@ watch(() => props.tab.content, () => {
 | 
			
		||||
      queryEditor.value.editor.session.setValue(query.value);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
watch(isChanged, (val) => {
 | 
			
		||||
   setUnsavedChanges({ uid: props.connection.uid, tUid: props.tabUid, isChanged: val });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const runQuery = async (query: string) => {
 | 
			
		||||
   if (!query || isQuering.value) return;
 | 
			
		||||
   isQuering.value = true;
 | 
			
		||||
@@ -725,23 +736,27 @@ const openFile = async () => {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const saveFileAs = async () => {
 | 
			
		||||
   const result = await Application.showSaveDialog({ filters: [{ name: 'SQL', extensions: ['sql'] }], defaultPath: `${queryName.value || 'query'}.sql` });
 | 
			
		||||
   // eslint-disable-next-line @typescript-eslint/no-explicit-any
 | 
			
		||||
   const result: any = await Application.showSaveDialog({ filters: [{ name: 'SQL', extensions: ['sql'] }], defaultPath: `${queryName.value || 'query'}.sql` });
 | 
			
		||||
   if (result && !result.canceled) {
 | 
			
		||||
      await Application.writeFile(result.filePath, query.value);
 | 
			
		||||
      addNotification({ status: 'success', message: t('general.actionSuccessful', { action: 'SAVE FILE' }) });
 | 
			
		||||
      addNotification({ status: 'success', message: t('general.actionSuccessful', { action: t('application.saveFile') }) });
 | 
			
		||||
      queryName.value = result.filePath.split('/').pop().split('\\').pop();
 | 
			
		||||
      filePath.value = result.filePath;
 | 
			
		||||
      lastSavedQuery.value = toRaw(query.value);
 | 
			
		||||
   }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const saveFile = async () => {
 | 
			
		||||
   await Application.writeFile(filePath.value, query.value);
 | 
			
		||||
   addNotification({ status: 'success', message: t('general.actionSuccessful', { action: 'SAVE FILE' }) });
 | 
			
		||||
   addNotification({ status: 'success', message: t('general.actionSuccessful', { action: t('application.saveFile') }) });
 | 
			
		||||
   lastSavedQuery.value = toRaw(query.value);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const loadFileContent = async (file: string) => {
 | 
			
		||||
   const content = await Application.readFile(file);
 | 
			
		||||
   query.value = content;
 | 
			
		||||
   lastSavedQuery.value = content;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
onMounted(() => {
 | 
			
		||||
@@ -844,4 +859,4 @@ onBeforeUnmount(() => {
 | 
			
		||||
    min-height: 200px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
</style>filePathsfilePathsfilePaths
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ export default class {
 | 
			
		||||
      return ipcRenderer.invoke('read-file', path);
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   static writeFile (path: string, content:any) {
 | 
			
		||||
   static writeFile (path: string, content: unknown) {
 | 
			
		||||
      return ipcRenderer.invoke('write-file', path, content);
 | 
			
		||||
   }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user