mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-05-01 05:03:57 +00:00
quick exports - basic skeleton working
This commit is contained in:
@@ -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]}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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: ';',
|
||||||
|
|||||||
@@ -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,
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user