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} + + {/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} + +
{col.header}
+ + 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 @@ +
+ +
+ +