From 7b56485c747cc36c300fc6a100572fd4e2f57afd Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Tue, 4 Mar 2025 15:51:43 +0100 Subject: [PATCH] report progress for quick exports --- packages/web/src/utility/exportFileTools.ts | 19 +++++++++++++++++-- packages/web/src/utility/snackbar.ts | 6 ++++++ packages/web/src/widgets/Snackbar.svelte | 12 ++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/packages/web/src/utility/exportFileTools.ts b/packages/web/src/utility/exportFileTools.ts index c973eac48..e80fed076 100644 --- a/packages/web/src/utility/exportFileTools.ts +++ b/packages/web/src/utility/exportFileTools.ts @@ -1,6 +1,12 @@ import { ScriptWriter, ScriptWriterJson } from 'dbgate-tools'; import getElectron from './getElectron'; -import { showSnackbar, showSnackbarInfo, showSnackbarError, closeSnackbar } from '../utility/snackbar'; +import { + showSnackbar, + showSnackbarInfo, + showSnackbarError, + closeSnackbar, + updateSnackbarProgressMessage, +} from '../utility/snackbar'; import resolveApi, { resolveApiHeaders } from './resolveApi'; import { apiCall, apiOff, apiOn } from './api'; import { normalizeExportColumnMap } from '../impexp/createImpExpScript'; @@ -70,9 +76,17 @@ async function runImportExportScript({ script, runningMessage, canceledMessage, ], }); + function handleRunnerProgress(data) { + const rows = data.writtenRowsCount || data.readRowCount; + if (rows) { + updateSnackbarProgressMessage(snackId, `${rows} rows processed`); + } + } + function handleRunnerDone() { closeSnackbar(snackId); apiOff(`runner-done-${runid}`, handleRunnerDone); + apiOff(`runner-progress-${runid}`, handleRunnerProgress); if (isCanceled) { showSnackbarError(canceledMessage); } else { @@ -82,6 +96,7 @@ async function runImportExportScript({ script, runningMessage, canceledMessage, } apiOn(`runner-done-${runid}`, handleRunnerDone); + apiOn(`runner-progress-${runid}`, handleRunnerProgress); } export async function saveExportedFile(filters, defaultPath, extension, dataName, getScript: (filaPath: string) => {}) { @@ -141,7 +156,7 @@ function generateQuickExportScript( script.assignValue(colmapVar, colmap); } - script.copyStream(sourceVar, targetVar, colmapVar); + script.copyStream(sourceVar, targetVar, colmapVar, 'data'); script.endLine(); return script.getScript(); diff --git a/packages/web/src/utility/snackbar.ts b/packages/web/src/utility/snackbar.ts index 4214a109c..b7ee16eab 100644 --- a/packages/web/src/utility/snackbar.ts +++ b/packages/web/src/utility/snackbar.ts @@ -8,6 +8,7 @@ export interface SnackbarButton { export interface SnackbarInfo { message: string; + progressMessage?: string; icon?: string; autoClose?: boolean; allowClose?: boolean; @@ -59,6 +60,11 @@ export function showSnackbarError(message: string) { export function closeSnackbar(snackId: string) { openedSnackbars.update(x => x.filter(x => x.id != snackId)); } + +export function updateSnackbarProgressMessage(snackId: string, progressMessage: string) { + openedSnackbars.update(x => x.map(x => (x.id === snackId ? { ...x, progressMessage } : x))); +} + // showSnackbar({ // icon: 'img ok', // message: 'Test snackbar', diff --git a/packages/web/src/widgets/Snackbar.svelte b/packages/web/src/widgets/Snackbar.svelte index 61bc6f522..83a1fa768 100644 --- a/packages/web/src/widgets/Snackbar.svelte +++ b/packages/web/src/widgets/Snackbar.svelte @@ -10,6 +10,7 @@ export let autoClose = false; export let allowClose = false; export let buttons = []; + export let progressMessage = null; function handleClose() { openedSnackbars.update(x => x.filter(x => x.id != id)); @@ -25,6 +26,11 @@ {message} + {#if progressMessage} +
+ {progressMessage} +
+ {/if} {#if allowClose}
@@ -83,4 +89,10 @@ .button { margin: 5px; } + + .progress-message { + color: var(--theme-font-3); + margin: 10px; + margin-left: 30px; + }