diff --git a/packages/web/src/commands/stdCommands.ts b/packages/web/src/commands/stdCommands.ts
index 4056ee530..853d2036a 100644
--- a/packages/web/src/commands/stdCommands.ts
+++ b/packages/web/src/commands/stdCommands.ts
@@ -5,6 +5,7 @@ import { ThemeDefinition } from 'dbgate-types';
import ConnectionModal from '../modals/ConnectionModal.svelte';
import { showModal } from '../modals/modalTools';
import newQuery from '../query/newQuery';
+import saveTabFile, { saveTabEnabledStore } from '../utility/saveTabFile';
function themeCommand(theme: ThemeDefinition) {
return {
@@ -64,3 +65,94 @@ registerCommand({
keyText: 'Ctrl+Q',
onClick: () => newQuery(),
});
+
+export function registerFileCommands({
+ idPrefix,
+ category,
+ editorStore,
+ editorStatusStore,
+ folder,
+ format,
+ fileExtension,
+ execute = false,
+ toggleComment = false,
+ findReplace = false,
+}) {
+ registerCommand({
+ id: idPrefix + '.save',
+ category,
+ name: 'Save',
+ keyText: 'Ctrl+S',
+ icon: 'icon save',
+ toolbar: true,
+ enabledStore: saveTabEnabledStore(editorStore),
+ onClick: () => saveTabFile(editorStore, false, folder, format, fileExtension),
+ });
+ registerCommand({
+ id: idPrefix + '.saveAs',
+ category,
+ name: 'Save As',
+ keyText: 'Ctrl+Shift+S',
+ enabledStore: saveTabEnabledStore(editorStore),
+ onClick: () => saveTabFile(editorStore, true, folder, format, fileExtension),
+ });
+
+ if (execute) {
+ registerCommand({
+ id: idPrefix + '.execute',
+ category,
+ name: 'Execute',
+ icon: 'icon run',
+ toolbar: true,
+ keyText: 'F5 | Ctrl+Enter',
+ enabledStore: derived(
+ [editorStore, editorStatusStore],
+ ([editor, status]) => editor != null && !(status as any).busy
+ ),
+ onClick: () => (get(editorStore) as any).execute(),
+ });
+ registerCommand({
+ id: idPrefix + '.kill',
+ category,
+ name: 'Kill',
+ icon: 'icon close',
+ toolbar: true,
+ enabledStore: derived(
+ [editorStore, editorStatusStore],
+ ([query, status]) => query != null && status && (status as any).isConnected
+ ),
+ onClick: () => (get(editorStore) as any).kill(),
+ });
+ }
+
+ if (toggleComment) {
+ registerCommand({
+ id: idPrefix + '.toggleComment',
+ category,
+ name: 'Toggle comment',
+ keyText: 'Ctrl+/',
+ disableHandleKeyText: 'Ctrl+/',
+ enabledStore: derived(editorStore, query => query != null),
+ onClick: () => (get(editorStore) as any).toggleComment(),
+ });
+ }
+
+ if (findReplace) {
+ registerCommand({
+ id: idPrefix + '.find',
+ category,
+ name: 'Find',
+ keyText: 'Ctrl+F',
+ enabledStore: derived(editorStore, query => query != null),
+ onClick: () => (get(editorStore) as any).find(),
+ });
+ registerCommand({
+ id: idPrefix + '.replace',
+ category,
+ keyText: 'Ctrl+H',
+ name: 'Replace',
+ enabledStore: derived(editorStore, query => query != null),
+ onClick: () => (get(editorStore) as any).replace(),
+ });
+ }
+}
diff --git a/packages/web/src/elements/TableControl.svelte b/packages/web/src/elements/TableControl.svelte
new file mode 100644
index 000000000..640bdf935
--- /dev/null
+++ b/packages/web/src/elements/TableControl.svelte
@@ -0,0 +1,86 @@
+
+
+
+
+
+ {#each columnList as col}
+ | {col.header} |
+ {/each}
+
+
+
+ {#each rows as row, index}
+ {
+ if (selectable) {
+ selectedIndex = index;
+ domTable.focus();
+ }
+ }}
+ >
+ {#each columnList as col}
+ {#if col.component}
+
+ {:else if col.formatter}
+ {col.formatter(row)}
+ {:else}
+ {row[col.fieldName]}
+ {/if}
+ {/each}
+
+ {/each}
+
+
+
+
diff --git a/packages/web/src/query/RunnerOutputFiles/CopyLink.svelte b/packages/web/src/query/RunnerOutputFiles/CopyLink.svelte
new file mode 100644
index 000000000..391468d96
--- /dev/null
+++ b/packages/web/src/query/RunnerOutputFiles/CopyLink.svelte
@@ -0,0 +1,19 @@
+
+
+ {
+ const file = electron.remote.dialog.showSaveDialogSync(electron.remote.getCurrentWindow(), {});
+ if (file) {
+ const fs = window.require('fs');
+ fs.copyFile(row.path, file, () => {});
+ }
+ }}
+>
+ save
+
diff --git a/packages/web/src/query/RunnerOutputFiles/DownloadLink.svelte b/packages/web/src/query/RunnerOutputFiles/DownloadLink.svelte
new file mode 100644
index 000000000..4dfdd3906
--- /dev/null
+++ b/packages/web/src/query/RunnerOutputFiles/DownloadLink.svelte
@@ -0,0 +1,10 @@
+
+
+
+ download
+
diff --git a/packages/web/src/query/RunnerOutputFiles/RunnerOutputFiles.svelte b/packages/web/src/query/RunnerOutputFiles/RunnerOutputFiles.svelte
new file mode 100644
index 000000000..451e5152e
--- /dev/null
+++ b/packages/web/src/query/RunnerOutputFiles/RunnerOutputFiles.svelte
@@ -0,0 +1,81 @@
+
+
+{#if !files || files.length == 0}
+
+{/if}
+
+ formatFileSize(row.size) },
+ !electron && {
+ fieldName: 'download',
+ header: 'Download',
+ component: DownloadLink,
+ getProps: row => ({
+ row,
+ runnerId,
+ }),
+ },
+ !electron && {
+ fieldName: 'copy',
+ header: 'Copy',
+ component: CopyLink,
+ getProps: row => ({
+ row,
+ runnerId,
+ }),
+ },
+ !electron && {
+ fieldName: 'show',
+ header: 'Show',
+ component: ShowLink,
+ getProps: row => ({
+ row,
+ runnerId,
+ }),
+ },
+ ]}
+/>
diff --git a/packages/web/src/query/RunnerOutputFiles/ShowLink.svelte b/packages/web/src/query/RunnerOutputFiles/ShowLink.svelte
new file mode 100644
index 000000000..df4b6cbaf
--- /dev/null
+++ b/packages/web/src/query/RunnerOutputFiles/ShowLink.svelte
@@ -0,0 +1,15 @@
+
+
+ {
+ electron.remote.shell.showItemInFolder(row.path);
+ }}
+>
+ show
+
diff --git a/packages/web/src/query/RunnerOutputFiles/index.js b/packages/web/src/query/RunnerOutputFiles/index.js
new file mode 100644
index 000000000..6d14d21ac
--- /dev/null
+++ b/packages/web/src/query/RunnerOutputFiles/index.js
@@ -0,0 +1 @@
+export { default } from './RunnerOutputFiles.svelte';
diff --git a/packages/web/src/query/RunnerOutputPane.svelte b/packages/web/src/query/RunnerOutputPane.svelte
new file mode 100644
index 000000000..7952cf942
--- /dev/null
+++ b/packages/web/src/query/RunnerOutputPane.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+ Messages
+
+
+
+ Output files
+
+
+
+
+
diff --git a/packages/web/src/tabs/QueryTab.svelte b/packages/web/src/tabs/QueryTab.svelte
index a479c4f47..853f5fb16 100644
--- a/packages/web/src/tabs/QueryTab.svelte
+++ b/packages/web/src/tabs/QueryTab.svelte
@@ -5,40 +5,6 @@
);
const currentQueryStatus = memberStore(currentQuery, query => query?.getStatus() || nullStore);
- registerCommand({
- id: 'query.execute',
- category: 'Query',
- name: 'Execute',
- icon: 'icon run',
- toolbar: true,
- keyText: 'F5 | Ctrl+Enter',
- enabledStore: derived(
- [currentQuery, currentQueryStatus],
- ([query, status]) => query != null && !(status as any).busy
- ),
- onClick: () => get(currentQuery).execute(),
- });
- registerCommand({
- id: 'query.kill',
- category: 'Query',
- name: 'Kill',
- icon: 'icon close',
- toolbar: true,
- enabledStore: derived(
- [currentQuery, currentQueryStatus],
- ([query, status]) => query != null && status && (status as any).isConnected
- ),
- onClick: () => get(currentQuery).kill(),
- });
- registerCommand({
- id: 'query.toggleComment',
- category: 'Query',
- name: 'Toggle comment',
- keyText: 'Ctrl+/',
- disableHandleKeyText: 'Ctrl+/',
- enabledStore: derived(currentQuery, query => query != null),
- onClick: () => get(currentQuery).toggleComment(),
- });
registerCommand({
id: 'query.formatCode',
category: 'Query',
@@ -46,29 +12,18 @@
enabledStore: derived(currentQuery, query => query != null),
onClick: () => get(currentQuery).formatCode(),
});
- registerCommand({
- id: 'query.find',
- category: 'Query',
- name: 'Find',
- keyText: 'Ctrl+F',
- enabledStore: derived(currentQuery, query => query != null),
- onClick: () => get(currentQuery).find(),
- });
- registerCommand({
- id: 'query.replace',
- category: 'Query',
- keyText: 'Ctrl+H',
- name: 'Replace',
- enabledStore: derived(currentQuery, query => query != null),
- onClick: () => get(currentQuery).replace(),
- });
- registerSaveCommands({
+ registerFileCommands({
idPrefix: 'query',
category: 'Query',
editorStore: currentQuery,
+ editorStatusStore: currentQueryStatus,
folder: 'sql',
format: 'text',
fileExtension: 'sql',
+
+ execute: true,
+ toggleComment:true,
+ findReplace:true
});
@@ -93,7 +48,7 @@
import memberStore from '../utility/memberStore';
import useEffect from '../utility/useEffect';
import ResultTabs from '../query/ResultTabs.svelte';
- import saveTabFile, { registerSaveCommands, saveTabEnabledStore } from '../utility/saveTabFile';
+ import { registerFileCommands } from '../commands/stdCommands';
export let tabid;
export let conid;
diff --git a/packages/web/src/utility/formatFileSize.ts b/packages/web/src/utility/formatFileSize.ts
new file mode 100644
index 000000000..059569559
--- /dev/null
+++ b/packages/web/src/utility/formatFileSize.ts
@@ -0,0 +1,6 @@
+export default function formatFileSize(size) {
+ if (size > 1000000000) return `${Math.round(size / 10000000000) * 10} GB`;
+ if (size > 1000000) return `${Math.round(size / 10000000) * 10} MB`;
+ if (size > 1000) return `${Math.round(size / 10000) * 10} KB`;
+ return `${size} bytes`;
+}
diff --git a/packages/web/src/utility/saveTabFile.ts b/packages/web/src/utility/saveTabFile.ts
index 204e600e2..897c506af 100644
--- a/packages/web/src/utility/saveTabFile.ts
+++ b/packages/web/src/utility/saveTabFile.ts
@@ -52,24 +52,3 @@ export default function saveTabFile(editorStore, saveAs, folder, format, fileExt
});
}
}
-
-export function registerSaveCommands({ idPrefix, category, editorStore, folder, format, fileExtension }) {
- registerCommand({
- id: idPrefix + '.save',
- category,
- name: 'Save',
- keyText: 'Ctrl+S',
- icon: 'icon save',
- toolbar: true,
- enabledStore: saveTabEnabledStore(editorStore),
- onClick: () => saveTabFile(editorStore, false, folder, format, fileExtension),
- });
- registerCommand({
- id: idPrefix + '.saveAs',
- category,
- name: 'Save As',
- keyText: 'Ctrl+Shift+S',
- enabledStore: saveTabEnabledStore(editorStore),
- onClick: () => saveTabFile(editorStore, true, folder, format, fileExtension),
- });
-}
diff --git a/packages/web/src/widgets/WidgetColumnBarItem.svelte b/packages/web/src/widgets/WidgetColumnBarItem.svelte
index ed543c7f1..92fdee3b5 100644
--- a/packages/web/src/widgets/WidgetColumnBarItem.svelte
+++ b/packages/web/src/widgets/WidgetColumnBarItem.svelte
@@ -1,4 +1,6 @@
- (visible = !visible)}>{title}
+ (visible = !visible)}>{title}
{#if visible}
{/if}
-
-
diff --git a/packages/web/src/widgets/WidgetTitle.svelte b/packages/web/src/widgets/WidgetTitle.svelte
new file mode 100644
index 000000000..44a972cfd
--- /dev/null
+++ b/packages/web/src/widgets/WidgetTitle.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+