quick exports - basic skeleton working

This commit is contained in:
Jan Prochazka
2021-06-06 10:25:52 +02:00
parent 50b90e181a
commit 27311afb31
5 changed files with 96 additions and 64 deletions

View File

@@ -47,15 +47,15 @@
{ {
divider: true, divider: true,
}, },
electron && {
label: 'Quick export',
isQuickExport: true,
functionName: 'tableReader',
},
{ {
label: 'Export', label: 'Export',
isExport: true, isExport: true,
}, },
// electron &&
{
label: 'Quick export',
isQuickExport: true,
},
{ {
label: 'Open in free table editor', label: 'Open in free table editor',
isOpenFreeTable: true, isOpenFreeTable: true,
@@ -114,14 +114,14 @@
{ {
divider: true, divider: true,
}, },
{
label: 'Export',
isExport: true,
},
electron && { electron && {
label: 'Quick export', label: 'Quick export',
isQuickExport: true, isQuickExport: true,
}, },
{
label: 'Export',
isExport: true,
},
{ {
label: 'Open in free table editor', label: 'Open in free table editor',
isOpenFreeTable: true, isOpenFreeTable: true,
@@ -175,14 +175,14 @@
{ {
divider: true, divider: true,
}, },
{
label: 'Export',
isExport: true,
},
electron && { electron && {
label: 'Quick export', label: 'Quick export',
isQuickExport: true, isQuickExport: true,
}, },
{
label: 'Export',
isExport: true,
},
{ {
label: 'Open in free table editor', label: 'Open in free table editor',
isOpenFreeTable: true, isOpenFreeTable: true,
@@ -275,14 +275,14 @@
}, },
}, },
}, },
{
label: 'Export',
isExport: true,
},
electron && { electron && {
label: 'Quick export', label: 'Quick export',
isQuickExport: true, isQuickExport: true,
}, },
{
label: 'Export',
isExport: true,
},
{ {
divider: true, divider: true,
}, },
@@ -399,16 +399,26 @@
if (menu.isQuickExport) { if (menu.isQuickExport) {
return { return {
text: menu.label, text: menu.label,
submenu: [ submenu: $extensions.quickExports.map(fmt => ({
{ text: fmt.label,
text: 'CSV file', onClick: async () => {
isQuickExport: true, const coninfo = await getConnectionInfo(data);
exportElectronFile(
data.pureName,
{
functionName: menu.functionName,
props: {
connection: {
..._.omit(coninfo, ['_id', 'displayName']),
..._.pick(data, ['database']),
},
..._.pick(data, ['pureName', 'schemaName']),
},
},
fmt
);
}, },
{ })),
text: 'Excel',
isQuickExport: true,
},
],
}; };
} }
@@ -425,8 +435,6 @@
sourceList: [data.pureName], sourceList: [data.pureName],
}, },
}); });
} else if (menu.isQuickExport) {
exportElectronFile(data);
} else if (menu.isOpenFreeTable) { } else if (menu.isOpenFreeTable) {
const coninfo = await getConnectionInfo(data); const coninfo = await getConnectionInfo(data);
openNewTab({ openNewTab({
@@ -511,6 +519,7 @@
<AppObjectCore <AppObjectCore
{...$$restProps} {...$$restProps}
module={$$props.module}
{data} {data}
title={data.schemaName ? `${data.schemaName}.${data.pureName}` : data.pureName} title={data.schemaName ? `${data.schemaName}.${data.pureName}` : data.pureName}
icon={icons[data.objectTypeField]} icon={icons[data.objectTypeField]}

View File

@@ -68,6 +68,7 @@
export let items; export let items;
export let top; export let top;
export let left; export let left;
export let onCloseParent;
let element; let element;
@@ -90,6 +91,7 @@
return; return;
} }
dispatch('close'); dispatch('close');
if (onCloseParent) onCloseParent();
if (item.onClick) item.onClick(); if (item.onClick) item.onClick();
} }
@@ -106,14 +108,23 @@
$: compacted = _.compact(extracted.map(x => mapItem(x, $commandsCustomized))); $: compacted = _.compact(extracted.map(x => mapItem(x, $commandsCustomized)));
$: filtered = compacted.filter(x => !x.disabled || !x.hideDisabled); $: filtered = compacted.filter(x => !x.disabled || !x.hideDisabled);
const handleClickOutside = event => {
// if (element && !element.contains(event.target) && !event.defaultPrevented) {
if (event.target.closest('ul.dropDownMenuMarker')) return;
dispatch('close');
};
onMount(() => {
document.addEventListener('mousedown', handleClickOutside, true);
return () => {
document.removeEventListener('mousedown', handleClickOutside, true);
};
});
</script> </script>
<ul <ul class="dropDownMenuMarker" style={`left: ${left}px; top: ${top}px`} bind:this={element}>
style={`left: ${left}px; top: ${top}px`}
use:clickOutside
on:clickOutside={() => dispatch('close')}
bind:this={element}
>
{#each filtered as item} {#each filtered as item}
{#if item.divider} {#if item.divider}
<li class="divider" /> <li class="divider" />
@@ -141,7 +152,14 @@
{/each} {/each}
</ul> </ul>
{#if submenuItem?.submenu} {#if submenuItem?.submenu}
<svelte:self items={submenuItem?.submenu} {...submenuOffset} /> <svelte:self
items={submenuItem?.submenu}
{...submenuOffset}
onCloseParent={() => {
if (onCloseParent) onCloseParent();
dispatch('close');
}}
/>
{/if} {/if}
<style> <style>

View File

@@ -1,29 +1,34 @@
import { showModal } from '../modals/modalTools'; import ScriptWriter from '../impexp/ScriptWriter';
import { get } from 'svelte/store';
import newQuery from '../query/newQuery';
import ImportExportModal from '../modals/ImportExportModal.svelte';
import getElectron from './getElectron'; import getElectron from './getElectron';
import { currentDatabase, extensions } from '../stores';
import { getUploadListener } from './uploadFiles';
import axiosInstance from '../utility/axiosInstance'; import axiosInstance from '../utility/axiosInstance';
import { getDatabaseFileLabel } from './getConnectionLabel';
function getFileFormatFilters(extensions) { export async function exportElectronFile(dataName, reader, format) {
return extensions.quickExports.map(x => ({ name: x.label, extensions: [x.extension] }));
}
export async function exportElectronFile() {
const electron = getElectron(); const electron = getElectron();
const ext = get(extensions); const filters = [{ name: format.label, extensions: [format.extension] }];
const filters = getFileFormatFilters(ext);
console.log('FLT', filters); const filePath = electron.remote.dialog.showSaveDialogSync(electron.remote.getCurrentWindow(), {
electron.remote.dialog filters,
.showSaveDialog(electron.remote.getCurrentWindow(), { defaultPath: `${dataName}.${format.extension}`,
filters, properties: ['showOverwriteConfirmation'],
}) });
.then(filePaths => { if (!filePath) return;
console.log('filePaths ASYNC2', filePaths);
const filePath = filePaths && filePaths[0]; const script = new ScriptWriter();
console.log('filePath', filePath);
}); const sourceVar = script.allocVariable();
script.assign(sourceVar, reader.functionName, reader.props);
console.log('format.createWriter(filePath, dataName)', format.createWriter(filePath, dataName));
const targetVar = script.allocVariable();
const writer = format.createWriter(filePath, dataName);
script.assign(targetVar, writer.functionName, writer.props);
script.copyStream(sourceVar, targetVar);
script.put();
console.log('script.getScript()', script.getScript());
const resp = await axiosInstance.post('runners/start', { script: script.getScript() });
const runid = resp.data.runid;
} }

View File

@@ -49,7 +49,7 @@ export default {
label: 'CSV file', label: 'CSV file',
extension: 'csv', extension: 'csv',
createWriter: (fileName) => ({ createWriter: (fileName) => ({
functionName: 'writer', functionName: 'writer@dbgate-plugin-csv',
props: { props: {
fileName, fileName,
delimiter: ',', delimiter: ',',
@@ -60,7 +60,7 @@ export default {
label: 'CSV file (semicolor separated)', label: 'CSV file (semicolor separated)',
extension: 'csv', extension: 'csv',
createWriter: (fileName) => ({ createWriter: (fileName) => ({
functionName: 'writer', functionName: 'writer@dbgate-plugin-csv',
props: { props: {
fileName, fileName,
delimiter: ';', delimiter: ';',

View File

@@ -68,11 +68,11 @@ export default {
{ {
label: 'MS Excel', label: 'MS Excel',
extension: 'xlsx', extension: 'xlsx',
createWriter: (fileName) => ({ createWriter: (fileName, dataName) => ({
functionName: 'writer', functionName: 'writer@dbgate-plugin-excel',
props: { props: {
fileName, fileName,
sheetName: 'data', sheetName: dataName,
}, },
}), }),
}, },