diff --git a/package.json b/package.json
index b9299fc40..f1d3b51ac 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"private": true,
- "version": "5.5.7-beta.59",
+ "version": "5.5.7-alpha.60",
"name": "dbgate-all",
"workspaces": [
"packages/*",
diff --git a/packages/api/src/utility/directories.js b/packages/api/src/utility/directories.js
index 0d5c70bf2..99617c1a2 100644
--- a/packages/api/src/utility/directories.js
+++ b/packages/api/src/utility/directories.js
@@ -110,7 +110,12 @@ function getPluginBackendPath(packageName) {
return path.join(packagedPluginsDir(), packageName, 'dist', 'backend.js');
}
- return path.join(pluginsdir(), packageName, 'dist', 'backend.js');
+ const res = path.join(pluginsdir(), packageName, 'dist', 'backend.js')
+ if (fs.existsSync(res)) {
+ return res;
+ }
+
+ return require.resolve(packageName);
}
let archiveLinksCache = {};
diff --git a/packages/web/src/modals/modalTools.ts b/packages/web/src/modals/modalTools.ts
index 83bdee52f..3c3f4a3d8 100644
--- a/packages/web/src/modals/modalTools.ts
+++ b/packages/web/src/modals/modalTools.ts
@@ -2,18 +2,22 @@ import { openedModals } from '../stores';
import { get } from 'svelte/store';
import uuidv1 from 'uuid/v1';
import _ from 'lodash';
+import invalidateCommands from '../commands/invalidateCommands';
export function showModal(component, props = {}) {
const modalId = uuidv1();
openedModals.update(x => [...x, { component, modalId, props }]);
+ invalidateCommands();
}
export function closeModal(modalId) {
openedModals.update(x => x.filter(y => y.modalId != modalId));
+ invalidateCommands();
}
export function closeCurrentModal() {
openedModals.update(modals => modals.slice(0, modals.length - 1));
+ invalidateCommands();
}
export function getActiveModalId() {
diff --git a/packages/web/src/query/SqlEditor.svelte b/packages/web/src/query/SqlEditor.svelte
index b7870756f..e86623835 100644
--- a/packages/web/src/query/SqlEditor.svelte
+++ b/packages/web/src/query/SqlEditor.svelte
@@ -59,6 +59,7 @@
on:blur
bind:this={domEditor}
options={{
+ ...$$props.options,
enableBasicAutocompletion: true,
}}
/>
diff --git a/packages/web/src/settings/SettingsModal.svelte b/packages/web/src/settings/SettingsModal.svelte
index 8dd8e2e68..362047098 100644
--- a/packages/web/src/settings/SettingsModal.svelte
+++ b/packages/web/src/settings/SettingsModal.svelte
@@ -21,6 +21,7 @@
import SqlEditor from '../query/SqlEditor.svelte';
import {
currentEditorFontSize,
+ currentEditorWrapEnabled,
currentEditorTheme,
currentEditorKeybindigMode,
extensions,
@@ -163,6 +164,14 @@ ORDER BY
/>
+
+
+ ($currentEditorWrapEnabled = e.target.checked)}
+ />
+
+
diff --git a/packages/web/src/stores.ts b/packages/web/src/stores.ts
index 7cffe2eb5..76dd67dc1 100644
--- a/packages/web/src/stores.ts
+++ b/packages/web/src/stores.ts
@@ -108,6 +108,9 @@ export const currentEditorTheme = getElectron()
export const currentEditorKeybindigMode = getElectron()
? writableSettingsValue(null, 'currentEditorKeybindigMode')
: writableWithStorage(null, 'currentEditorKeybindigMode');
+export const currentEditorWrapEnabled = getElectron()
+ ? writableSettingsValue(false, 'currentEditorWrapEnabled')
+ : writableWithStorage(false, 'currentEditorWrapEnabled');
export const currentEditorFontSize = getElectron()
? writableSettingsValue(null, 'currentEditorFontSize')
: writableWithStorage(null, 'currentEditorFontSize');
@@ -330,3 +333,9 @@ selectedDatabaseObjectAppObject.subscribe(value => {
selectedDatabaseObjectAppObjectValue = value;
});
export const getSelectedDatabaseObjectAppObject = () => selectedDatabaseObjectAppObjectValue;
+
+let openedModalsValue = [];
+openedModals.subscribe(value => {
+ openedModalsValue = value;
+});
+export const getOpenedModals = () => openedModalsValue;
diff --git a/packages/web/src/tabpanel/TabsPanel.svelte b/packages/web/src/tabpanel/TabsPanel.svelte
index e83e9a585..ef720a730 100644
--- a/packages/web/src/tabpanel/TabsPanel.svelte
+++ b/packages/web/src/tabpanel/TabsPanel.svelte
@@ -155,6 +155,19 @@
);
const closeOthersInMultiTab = multiTabIndex =>
closeTabFunc((x, active) => x.tabid != active.tabid && (x.multiTabIndex || 0) == multiTabIndex);
+ const reopenClosedTab = () => {
+ const lastClosedTabId = getOpenedTabs()
+ .filter(x => x.closedTime)
+ .sort((a, b) => b.closedTime - a.closedTime)[0]?.tabid;
+
+ if (!lastClosedTabId) return;
+
+ openedTabs.update(x =>
+ x.map(tab =>
+ tab.tabid === lastClosedTabId ? { ...tab, selected: true, closedTime: null } : { ...tab, selected: false }
+ )
+ );
+ };
function getTabDbName(tab, connectionList) {
if (tab.tabComponent == 'ConnectionTab') return 'Connections';
@@ -224,7 +237,12 @@
category: 'Tabs',
name: 'Close tab',
keyText: isElectronAvailable() ? 'CtrlOrCommand+W' : null,
- testEnabled: () => getOpenedTabs().filter(x => !x.closedTime).length >= 1,
+ testEnabled: () => {
+ const hasAnyOtherTab = getOpenedTabs().filter(x => !x.closedTime).length >= 1;
+ const hasAnyModalOpen = getOpenedModals().length > 0;
+
+ return hasAnyOtherTab && !hasConfirmModalOpen;
+ },
onClick: closeCurrentTab,
});
@@ -244,6 +262,15 @@
onClick: closeTabsButCurrentDb,
});
+ registerCommand({
+ id: 'tabs.reopenClosedTab',
+ category: 'Tabs',
+ name: 'Reopen closed tab',
+ keyText: 'CtrlOrCommand+Shift+T',
+ testEnabled: () => getOpenedTabs().filter(x => x.closedTime).length >= 1,
+ onClick: reopenClosedTab,
+ });
+
registerCommand({
id: 'tabs.addToFavorites',
category: 'Tabs',
@@ -283,6 +310,7 @@
draggingDbGroupTarget,
draggingTab,
draggingTabTarget,
+ getOpenedModals,
} from '../stores';
import tabs from '../tabs';
import { setSelectedTab, switchCurrentDatabase } from '../utility/common';
diff --git a/packages/web/src/tabs/QueryTab.svelte b/packages/web/src/tabs/QueryTab.svelte
index bdd769e81..2618ca133 100644
--- a/packages/web/src/tabs/QueryTab.svelte
+++ b/packages/web/src/tabs/QueryTab.svelte
@@ -62,7 +62,7 @@
import VerticalSplitter from '../elements/VerticalSplitter.svelte';
import SqlEditor from '../query/SqlEditor.svelte';
import useEditorData from '../query/useEditorData';
- import { extensions } from '../stores';
+ import { currentEditorWrapEnabled, extensions } from '../stores';
import applyScriptTemplate from '../utility/applyScriptTemplate';
import { changeTab, markTabUnsaved } from '../utility/common';
import { getDatabaseInfo, useConnectionInfo } from '../utility/metadataLoaders';
@@ -154,6 +154,7 @@
$: connection = useConnectionInfo({ conid });
$: driver = findEngineDriver($connection, $extensions);
+ $: enableWrap = $currentEditorWrapEnabled || false;
$: effect = useEffect(() => {
return onSession(sessionId);
@@ -427,6 +428,9 @@
{conid}
{database}
splitterOptions={driver?.getQuerySplitterOptions('editor')}
+ options={{
+ wrap: enableWrap,
+ }}
value={$editorState.value || ''}
menu={createMenu()}
on:input={e => {
@@ -453,6 +457,9 @@
mode={driver?.editorMode || 'sql'}
value={$editorState.value || ''}
splitterOptions={driver?.getQuerySplitterOptions('editor')}
+ options={{
+ wrap: enableWrap,
+ }}
menu={createMenu()}
on:input={e => setEditorData(e.detail)}
on:focus={() => {
diff --git a/plugins/dbgate-plugin-postgres/src/frontend/drivers.js b/plugins/dbgate-plugin-postgres/src/frontend/drivers.js
index bd97e6747..5b70fe74c 100644
--- a/plugins/dbgate-plugin-postgres/src/frontend/drivers.js
+++ b/plugins/dbgate-plugin-postgres/src/frontend/drivers.js
@@ -2,7 +2,7 @@ const { driverBase } = global.DBGATE_PACKAGES['dbgate-tools'];
const Dumper = require('./Dumper');
const { postgreSplitterOptions } = require('dbgate-query-splitter/lib/options');
-const spatialTypes = ['GEOGRAPHY'];
+const spatialTypes = ['GEOGRAPHY','GEOMETRY'];
/** @type {import('dbgate-types').SqlDialect} */
const dialect = {