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"