diff --git a/packages/web/package.json b/packages/web/package.json
index 57369f815..76393b09b 100644
--- a/packages/web/package.json
+++ b/packages/web/package.json
@@ -12,6 +12,7 @@
"@rollup/plugin-node-resolve": "^11.0.0",
"@rollup/plugin-typescript": "^6.0.0",
"@tsconfig/svelte": "^1.0.0",
+ "ace-builds": "^1.4.8",
"rollup": "^2.3.4",
"rollup-plugin-copy": "^3.3.0",
"rollup-plugin-css-only": "^3.1.0",
diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts
index 431b0e81b..4056ee530 100644
--- a/packages/web/src/commands/stdCommands.ts
+++ b/packages/web/src/commands/stdCommands.ts
@@ -4,6 +4,7 @@ import { derived, get } from 'svelte/store';
import { ThemeDefinition } from 'dbgate-types';
import ConnectionModal from '../modals/ConnectionModal.svelte';
import { showModal } from '../modals/modalTools';
+import newQuery from '../query/newQuery';
function themeCommand(theme: ThemeDefinition) {
return {
@@ -52,3 +53,14 @@ registerCommand({
name: 'Connection',
onClick: () => showModal(ConnectionModal),
});
+
+registerCommand({
+ id: 'new.query',
+ category: 'New',
+ icon: 'icon file',
+ toolbar: true,
+ toolbarOrder: 2,
+ name: 'Query',
+ keyText: 'Ctrl+Q',
+ onClick: () => newQuery(),
+});
diff --git a/packages/web/src/main.ts b/packages/web/src/main.ts
index caee79034..27e60d827 100644
--- a/packages/web/src/main.ts
+++ b/packages/web/src/main.ts
@@ -5,9 +5,7 @@ import './commands/stdCommands';
const app = new App({
target: document.body,
- props: {
- name: 'world',
- },
+ props: {},
});
export default app;
diff --git a/packages/web/src/query/AceEditor.svelte b/packages/web/src/query/AceEditor.svelte
new file mode 100644
index 000000000..64afe0fcb
--- /dev/null
+++ b/packages/web/src/query/AceEditor.svelte
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/packages/web/src/query/AceEditorCore.svelte b/packages/web/src/query/AceEditorCore.svelte
new file mode 100644
index 000000000..1810abdd3
--- /dev/null
+++ b/packages/web/src/query/AceEditorCore.svelte
@@ -0,0 +1,132 @@
+
+
+
diff --git a/packages/web/src/query/SqlEditor.svelte b/packages/web/src/query/SqlEditor.svelte
new file mode 100644
index 000000000..43c179af5
--- /dev/null
+++ b/packages/web/src/query/SqlEditor.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/packages/web/src/query/newQuery.ts b/packages/web/src/query/newQuery.ts
new file mode 100644
index 000000000..b54d4e305
--- /dev/null
+++ b/packages/web/src/query/newQuery.ts
@@ -0,0 +1,37 @@
+import _ from 'lodash';
+import { get } from 'svelte/store';
+import { currentDatabase } from '../stores';
+import openNewTab from '../utility/openNewTab';
+
+export default function newQuery({
+ tabComponent = 'QueryTab',
+ icon = 'img sql-file',
+ title = undefined,
+ initialData = undefined,
+ ...props
+} = {}) {
+ const $currentDatabase = get(currentDatabase);
+ const connection = _.get($currentDatabase, 'connection') || {};
+ const database = _.get($currentDatabase, 'name');
+
+ const tooltip = `${connection.displayName || connection.server}\n${database}`;
+
+ openNewTab(
+ {
+ title: title || 'Query #',
+ icon,
+ tooltip,
+ tabComponent,
+ props: {
+ ...props,
+ conid: connection._id,
+ database,
+ },
+ },
+ { editor: initialData }
+ );
+}
+
+export function newQueryDesign() {
+ return newQuery({ tabComponent: 'QueryDesignTab', icon: 'img query-design' });
+}
diff --git a/packages/web/src/tabs/QueryTab.svelte b/packages/web/src/tabs/QueryTab.svelte
index e69de29bb..fa6ef0525 100644
--- a/packages/web/src/tabs/QueryTab.svelte
+++ b/packages/web/src/tabs/QueryTab.svelte
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/packages/web/src/tabs/index.js b/packages/web/src/tabs/index.js
index 47dd335ab..f9307cd9c 100644
--- a/packages/web/src/tabs/index.js
+++ b/packages/web/src/tabs/index.js
@@ -1,7 +1,7 @@
import * as TableDataTab from './TableDataTab.svelte';
// import ViewDataTab from './ViewDataTab';
// import TableStructureTab from './TableStructureTab';
-// import QueryTab from './QueryTab';
+import * as QueryTab from './QueryTab.svelte';
// import ShellTab from './ShellTab';
// import InfoPageTab from './InfoPageTab';
// import ArchiveFileTab from './ArchiveFileTab';
@@ -16,18 +16,18 @@ import * as TableDataTab from './TableDataTab.svelte';
export default {
TableDataTab,
-// ViewDataTab,
-// TableStructureTab,
-// QueryTab,
-// InfoPageTab,
-// ShellTab,
-// ArchiveFileTab,
-// FreeTableTab,
-// PluginTab,
-// ChartTab,
-// MarkdownEditorTab,
-// MarkdownViewTab,
-// MarkdownPreviewTab,
-// FavoriteEditorTab,
-// QueryDesignTab,
+ // ViewDataTab,
+ // TableStructureTab,
+ QueryTab,
+ // InfoPageTab,
+ // ShellTab,
+ // ArchiveFileTab,
+ // FreeTableTab,
+ // PluginTab,
+ // ChartTab,
+ // MarkdownEditorTab,
+ // MarkdownViewTab,
+ // MarkdownPreviewTab,
+ // FavoriteEditorTab,
+ // QueryDesignTab,
};
diff --git a/packages/web/src/utility/openNewTab.ts b/packages/web/src/utility/openNewTab.ts
index 928afbb9d..c4b451132 100644
--- a/packages/web/src/utility/openNewTab.ts
+++ b/packages/web/src/utility/openNewTab.ts
@@ -20,6 +20,7 @@ export default async function openNewTab(newTab, initialData = undefined, option
let existing = null;
+
const { savedFile, savedFolder, savedFilePath } = newTab.props || {};
if (savedFile || savedFilePath) {
existing = oldTabs.find(
diff --git a/yarn.lock b/yarn.lock
index 3a65e273d..63dbf9a78 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -753,6 +753,11 @@ accepts@~1.3.4, accepts@~1.3.7:
mime-types "~2.1.24"
negotiator "0.6.2"
+ace-builds@^1.4.8:
+ version "1.4.12"
+ resolved "https://registry.yarnpkg.com/ace-builds/-/ace-builds-1.4.12.tgz#888efa386e36f4345f40b5233fcc4fe4c588fae7"
+ integrity sha512-G+chJctFPiiLGvs3+/Mly3apXTcfgE45dT5yp12BcWZ1kUs+gm0qd3/fv4gsz6fVag4mM0moHVpjHDIgph6Psg==
+
acorn-globals@^4.1.0:
version "4.3.4"
resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7"