From 2ee94a3a69a73250e9cf252ec1c6199a61ecbea3 Mon Sep 17 00:00:00 2001 From: zadam Date: Mon, 14 Oct 2019 10:31:58 +0200 Subject: [PATCH] changed import progress notification so it shows up for drag & drop as well --- Dockerfile | 2 +- bin/build-server.sh | 2 +- package-lock.json | 74 ++++++++-------- src/public/javascripts/desktop.js | 1 + src/public/javascripts/dialogs/import.js | 86 ++----------------- .../javascripts/services/drag_and_drop.js | 4 +- src/public/javascripts/services/import.js | 66 ++++++++++++++ src/public/javascripts/services/info.js | 4 +- .../javascripts/services/note_detail.js | 4 +- src/public/javascripts/services/ws.js | 1 + src/routes/api/import.js | 7 +- src/services/import/tar.js | 4 - src/services/import_context.js | 11 ++- src/views/dialogs/import.ejs | 4 - 14 files changed, 136 insertions(+), 134 deletions(-) create mode 100644 src/public/javascripts/services/import.js diff --git a/Dockerfile b/Dockerfile index 30a586e95..aa4a40d27 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:12.11.1-alpine +FROM node:12.12.0-alpine # Create app directory WORKDIR /usr/src/app diff --git a/bin/build-server.sh b/bin/build-server.sh index 65fe5a858..e327ba30f 100755 --- a/bin/build-server.sh +++ b/bin/build-server.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash PKG_DIR=dist/trilium-linux-x64-server-src -NODE_VERSION=12.11.1 +NODE_VERSION=12.12.0 if [ "$1" != "DONTCOPY" ] then diff --git a/package-lock.json b/package-lock.json index 8414e3c9e..beaf8d12e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -842,7 +842,7 @@ "dependencies": { "file-type": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" } } @@ -1226,7 +1226,7 @@ }, "uuid": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" } } @@ -1260,7 +1260,7 @@ "dependencies": { "semver": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz", "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" } } @@ -1280,7 +1280,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "requires": { "readable-stream": "^2.3.5", @@ -1465,7 +1465,7 @@ }, "buf-compare": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buf-compare/-/buf-compare-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/buf-compare/-/buf-compare-1.0.1.tgz", "integrity": "sha1-/vKNqLgROgoNtEMLC2Rntpcws0o=", "dev": true }, @@ -1525,12 +1525,12 @@ "dependencies": { "file-type": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" }, "uuid": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" } } @@ -1619,7 +1619,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { "core-util-is": "~1.0.0", @@ -1756,7 +1756,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { "ansi-styles": "^2.2.1", @@ -2039,7 +2039,7 @@ }, "commander": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "requires": { "graceful-readlink": ">= 1.0.0" @@ -2751,7 +2751,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { "core-util-is": "~1.0.0", @@ -5475,7 +5475,7 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "get-value": { @@ -5703,7 +5703,7 @@ }, "got": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "resolved": "http://registry.npmjs.org/got/-/got-5.7.1.tgz", "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", "requires": { "create-error-class": "^3.0.1", @@ -6556,7 +6556,7 @@ }, "into-stream": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "resolved": "http://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", "requires": { "from2": "^2.1.1", @@ -6792,7 +6792,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" }, "is-obj-prop": { @@ -7353,7 +7353,7 @@ }, "load-json-file": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "requires": { "graceful-fs": "^4.1.2", @@ -7836,7 +7836,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "minimist-options": { @@ -7897,7 +7897,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -7905,7 +7905,7 @@ "dependencies": { "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } @@ -8060,7 +8060,7 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "got": { @@ -8096,7 +8096,7 @@ }, "p-cancelable": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "resolved": "http://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" }, "p-event": { @@ -8220,7 +8220,7 @@ "dependencies": { "file-type": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" } } @@ -8245,7 +8245,7 @@ "dependencies": { "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "pify": { @@ -8302,7 +8302,7 @@ }, "get-stream": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", "requires": { "object-assign": "^4.0.1", @@ -8332,7 +8332,7 @@ "dependencies": { "get-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" } } @@ -8372,7 +8372,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "prepend-http": { @@ -8504,7 +8504,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { "core-util-is": "~1.0.0", @@ -9052,7 +9052,7 @@ }, "onetime": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" }, "open": { @@ -9168,7 +9168,7 @@ }, "os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { @@ -9217,7 +9217,7 @@ }, "p-is-promise": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" }, "p-limit": { @@ -10401,7 +10401,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { @@ -10494,7 +10494,7 @@ }, "query-string": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "resolved": "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "requires": { "decode-uri-component": "^0.2.0", @@ -10640,7 +10640,7 @@ }, "readable-stream": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { "core-util-is": "~1.0.0", @@ -11714,7 +11714,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" @@ -11739,7 +11739,7 @@ }, "strip-dirs": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", "requires": { "chalk": "^1.0.0", @@ -12005,7 +12005,7 @@ }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { @@ -12024,7 +12024,7 @@ }, "readable-stream": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { "core-util-is": "~1.0.0", diff --git a/src/public/javascripts/desktop.js b/src/public/javascripts/desktop.js index 5f33fd985..fafc2e5f7 100644 --- a/src/public/javascripts/desktop.js +++ b/src/public/javascripts/desktop.js @@ -29,6 +29,7 @@ import macInit from './services/mac_init.js'; import cssLoader from './services/css_loader.js'; import dateNoteService from './services/date_notes.js'; import sidebarService from './services/sidebar.js'; +import importService from './services/import.js'; window.glob.isDesktop = utils.isDesktop; window.glob.isMobile = utils.isMobile; diff --git a/src/public/javascripts/dialogs/import.js b/src/public/javascripts/dialogs/import.js index d7d6edd4a..2dad707f3 100644 --- a/src/public/javascripts/dialogs/import.js +++ b/src/public/javascripts/dialogs/import.js @@ -1,16 +1,11 @@ -import treeService from '../services/tree.js'; import utils from '../services/utils.js'; import treeUtils from "../services/tree_utils.js"; -import server from "../services/server.js"; -import infoService from "../services/info.js"; -import ws from "../services/ws.js"; +import importService from "../services/import.js"; const $dialog = $("#import-dialog"); const $form = $("#import-form"); const $noteTitle = $dialog.find(".import-note-title"); const $fileUploadInput = $("#import-file-upload-input"); -const $importProgressCountWrapper = $("#import-progress-count-wrapper"); -const $importProgressCount = $("#import-progress-count"); const $importButton = $("#import-button"); const $safeImportCheckbox = $("#safe-import-checkbox"); const $shrinkImagesCheckbox = $("#shrink-images-checkbox"); @@ -18,16 +13,11 @@ const $textImportedAsTextCheckbox = $("#text-imported-as-text-checkbox"); const $codeImportedAsCodeCheckbox = $("#code-imported-as-code-checkbox"); const $explodeArchivesCheckbox = $("#explode-archives-checkbox"); -let importId; -let importIntoNoteId = null; +let parentNoteId = null; export async function showDialog(node) { utils.closeActiveDialog(); - // each opening of the dialog resets the importId so we don't associate it with previous imports anymore - importId = ''; - $importProgressCountWrapper.hide(); - $importProgressCount.text('0'); $fileUploadInput.val('').change(); // to trigger Import button disabling listener below $safeImportCheckbox.prop("checked", true); @@ -38,9 +28,9 @@ export async function showDialog(node) { glob.activeDialog = $dialog; - importIntoNoteId = node.data.noteId; + parentNoteId = node.data.noteId; - $noteTitle.text(await treeUtils.getNoteTitle(importIntoNoteId)); + $noteTitle.text(await treeUtils.getNoteTitle(parentNoteId)); $dialog.modal(); } @@ -49,18 +39,14 @@ $form.submit(() => { // disabling so that import is not triggered again. $importButton.attr("disabled", "disabled"); - importIntoNote(importIntoNoteId); + importIntoNote(parentNoteId); return false; }); -async function importIntoNote(importNoteId) { +async function importIntoNote(parentNoteId) { const files = Array.from($fileUploadInput[0].files); // shallow copy since we're resetting the upload button below - // we generate it here (and not on opening) for the case when you try to import multiple times from the same - // dialog (which shouldn't happen, but still ...) - importId = utils.randomString(10); - const options = { safeImport: boolToString($safeImportCheckbox), shrinkImages: boolToString($shrinkImagesCheckbox), @@ -69,73 +55,15 @@ async function importIntoNote(importNoteId) { explodeArchives: boolToString($explodeArchivesCheckbox) }; - await uploadFiles(importNoteId, files, options); - $dialog.modal('hide'); -} -export async function uploadFiles(importNoteId, files, options) { - if (files.length === 0) { - return; - } - - let noteId; - - for (const file of files) { - const formData = new FormData(); - formData.append('upload', file); - formData.append('importId', importId); - - for (const key in options) { - formData.append(key, options[key]); - } - - ({noteId} = await $.ajax({ - url: baseApiUrl + 'notes/' + importNoteId + '/import', - headers: server.getHeaders(), - data: formData, - dataType: 'json', - type: 'POST', - timeout: 60 * 60 * 1000, - contentType: false, // NEEDED, DON'T REMOVE THIS - processData: false, // NEEDED, DON'T REMOVE THIS - })); - } - - infoService.showMessage("Import finished successfully."); - - await treeService.reloadNote(importNoteId); - - if (noteId) { - const node = await treeService.activateNote(noteId); - - node.setExpanded(true); - } + await importService.uploadFiles(parentNoteId, files, options); } function boolToString($el) { return $el.is(":checked") ? "true" : "false"; } -ws.subscribeToMessages(async message => { - if (message.type === 'import-error') { - infoService.showError(message.message); - $dialog.modal('hide'); - return; - } - - if (!message.importId || message.importId !== importId) { - // incoming messages must correspond to this import instance - return; - } - - if (message.type === 'import-progress-count') { - $importProgressCountWrapper.slideDown(); - - $importProgressCount.text(message.progressCount); - } -}); - $fileUploadInput.change(() => { if ($fileUploadInput.val()) { $importButton.removeAttr("disabled"); diff --git a/src/public/javascripts/services/drag_and_drop.js b/src/public/javascripts/services/drag_and_drop.js index 0253f8dbf..2fa1f9087 100644 --- a/src/public/javascripts/services/drag_and_drop.js +++ b/src/public/javascripts/services/drag_and_drop.js @@ -30,9 +30,9 @@ const dragAndDropSetup = { if (dataTransfer && dataTransfer.files && dataTransfer.files.length > 0) { const files = [...dataTransfer.files]; // chrome has issue that dataTransfer.files empties after async operation - const importDialog = await import('../dialogs/import.js'); + const importService = await import('./import.js'); - importDialog.uploadFiles(node.data.noteId, files, { + importService.uploadFiles(node.data.noteId, files, { safeImport: true, shrinkImages: true, textImportedAsText: true, diff --git a/src/public/javascripts/services/import.js b/src/public/javascripts/services/import.js new file mode 100644 index 000000000..ab100d303 --- /dev/null +++ b/src/public/javascripts/services/import.js @@ -0,0 +1,66 @@ +import infoService from "./info.js"; +import treeService from "./tree.js"; +import server from "./server.js"; +import ws from "./ws.js"; +import utils from "./utils.js"; + +export async function uploadFiles(parentNoteId, files, options) { + if (files.length === 0) { + return; + } + + const importId = utils.randomString(10); + let noteId; + let counter = 0; + + for (const file of files) { + counter++; + + const formData = new FormData(); + formData.append('upload', file); + formData.append('importId', importId); + formData.append('last', counter === files.length ? "true" : "false"); + + for (const key in options) { + formData.append(key, options[key]); + } + + ({noteId} = await $.ajax({ + url: baseApiUrl + 'notes/' + parentNoteId + '/import', + headers: server.getHeaders(), + data: formData, + dataType: 'json', + type: 'POST', + timeout: 60 * 60 * 1000, + contentType: false, // NEEDED, DON'T REMOVE THIS + processData: false, // NEEDED, DON'T REMOVE THIS + })); + } +} + +ws.subscribeToMessages(async message => { + if (message.type === 'import-error') { + infoService.showError(message.message); + return; + } + + if (message.type === 'import-progress-count') { + infoService.showMessage("Import in progress: " + message.progressCount, 1000); + } + + if (message.type === 'import-succeeded') { + infoService.showMessage("Import finished successfully.", 5000); + + await treeService.reloadNote(message.parentNoteId); + + if (message.importedNoteId) { + const node = await treeService.activateNote(message.importedNoteId); + + node.setExpanded(true); + } + } +}); + +export default { + uploadFiles +} \ No newline at end of file diff --git a/src/public/javascripts/services/info.js b/src/public/javascripts/services/info.js index 2df8ed600..198c9e9e6 100644 --- a/src/public/javascripts/services/info.js +++ b/src/public/javascripts/services/info.js @@ -1,13 +1,13 @@ import ws from "./ws.js"; import utils from "./utils.js"; -function showMessage(message) { +function showMessage(message, delay = 3000) { console.debug(utils.now(), "message: ", message); $.notify({ icon: 'jam jam-check', message: message - }, getNotifySettings('success', 3000)); + }, getNotifySettings('success', delay)); } function showAndLogError(message, delay = 10000) { diff --git a/src/public/javascripts/services/note_detail.js b/src/public/javascripts/services/note_detail.js index 49e2e3211..e332e4ec4 100644 --- a/src/public/javascripts/services/note_detail.js +++ b/src/public/javascripts/services/note_detail.js @@ -345,9 +345,9 @@ $tabContentsContainer.on("drop", async e => { const files = [...e.originalEvent.dataTransfer.files]; // chrome has issue that dataTransfer.files empties after async operation - const importDialog = await import("../dialogs/import.js"); + const importService = await import("./import.js"); - importDialog.uploadFiles(activeNote.noteId, files, { + importService.uploadFiles(activeNote.noteId, files, { safeImport: true, shrinkImages: true, textImportedAsText: true, diff --git a/src/public/javascripts/services/ws.js b/src/public/javascripts/services/ws.js index 977342058..19df68ae4 100644 --- a/src/public/javascripts/services/ws.js +++ b/src/public/javascripts/services/ws.js @@ -1,5 +1,6 @@ import utils from './utils.js'; import infoService from "./info.js"; +import treeService from "./tree.js"; const $outstandingSyncsCount = $("#outstanding-syncs-count"); diff --git a/src/routes/api/import.js b/src/routes/api/import.js index 12796a1ab..049aedfc1 100644 --- a/src/routes/api/import.js +++ b/src/routes/api/import.js @@ -13,7 +13,7 @@ const ImportContext = require('../../services/import_context'); async function importToBranch(req) { const {parentNoteId} = req.params; - const {importId} = req.body; + const {importId, last} = req.body; const options = { safeImport: req.body.safeImport !== 'false', @@ -65,6 +65,11 @@ async function importToBranch(req) { return [500, message]; } + if (last === "true") { + // small timeout to avoid race condition (message is received before the transaction is committed) + setTimeout(() => importContext.importSucceeded(parentNoteId, note.noteId), 1000); + } + // import has deactivated note events so note cache is not updated // instead we force it to reload (can be async) noteCacheService.load(); diff --git a/src/services/import/tar.js b/src/services/import/tar.js index c07446acd..5d6399167 100644 --- a/src/services/import/tar.js +++ b/src/services/import/tar.js @@ -116,11 +116,7 @@ async function importTar(importContext, fileBuffer, importRootNote) { function getNoteId(noteMeta, filePath) { const filePathNoExt = getTextFileWithoutExtension(filePath); - console.log(`Searching for noteId of filePath ${filePath} with meta: ${!!noteMeta}`); - if (filePathNoExt in createdPaths) { - console.log("Found existing path", filePathNoExt, createdPaths[filePathNoExt]); - return createdPaths[filePathNoExt]; } diff --git a/src/services/import_context.js b/src/services/import_context.js index ea29f5c75..a4961fa28 100644 --- a/src/services/import_context.js +++ b/src/services/import_context.js @@ -33,7 +33,7 @@ class ImportContext { async increaseProgressCount() { this.progressCount++; - if (Date.now() - this.lastSentCountTs >= 500) { + if (Date.now() - this.lastSentCountTs >= 1000) { this.lastSentCountTs = Date.now(); await ws.sendMessageToAllClients({ @@ -51,6 +51,15 @@ class ImportContext { message: message }); } + + // must remaing non-static + async importSucceeded(parentNoteId, importedNoteId) { + await ws.sendMessageToAllClients({ + type: 'import-succeeded', + parentNoteId: parentNoteId, + importedNoteId: importedNoteId + }); + } } module.exports = ImportContext; \ No newline at end of file diff --git a/src/views/dialogs/import.ejs b/src/views/dialogs/import.ejs index 6c908e57f..1cd6637ae 100644 --- a/src/views/dialogs/import.ejs +++ b/src/views/dialogs/import.ejs @@ -9,10 +9,6 @@