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 = {