diff --git a/src/entities/note.js b/src/entities/note.js index 5e2de26a4..566335c01 100644 --- a/src/entities/note.js +++ b/src/entities/note.js @@ -67,6 +67,10 @@ class Note extends Entity { if (!this.noteContent) { throw new Error("Note content not found for noteId=" + this.noteId); } + + if (this.isStringNote()) { + this.noteContent.content = this.noteContent.content.toString("UTF-8"); + } } return this.noteContent; @@ -126,6 +130,11 @@ class Note extends Entity { return (this.type === "code" || this.type === "file" || this.type === "render") && this.mime === "text/html"; } + /** @returns {boolean} true if the note has string content (not binary) */ + isStringNote() { + return ["text", "code", "relation-map"].includes(this.type) || this.mime.startsWith('text/'); + } + /** @returns {string} JS script environment - either "frontend" or "backend" */ getScriptEnv() { if (this.isHtml() || (this.isJavaScript() && this.mime.endsWith('env=frontend'))) { diff --git a/src/public/javascripts/dialogs/export.js b/src/public/javascripts/dialogs/export.js index 14d872df8..332a362f6 100644 --- a/src/public/javascripts/dialogs/export.js +++ b/src/public/javascripts/dialogs/export.js @@ -21,6 +21,7 @@ let exportId = ''; async function showDialog(defaultType) { // each opening of the dialog resets the exportId so we don't associate it with previous exports anymore exportId = ''; + $exportButton.removeAttr("disabled"); $exportNoteCountWrapper.hide(); $exportNoteCount.text('0'); @@ -45,6 +46,7 @@ async function showDialog(defaultType) { } $form.submit(() => { + // disabling so export can't be triggered again $exportButton.attr("disabled", "disabled"); const exportType = $dialog.find("input[name='export-type']:checked").val(); diff --git a/src/routes/api/notes.js b/src/routes/api/notes.js index a7e70b4a9..cdb9c078f 100644 --- a/src/routes/api/notes.js +++ b/src/routes/api/notes.js @@ -12,11 +12,9 @@ async function getNote(req) { return [404, "Note " + noteId + " has not been found."]; } - if (["text", "code", "relation-map"].includes(note.type) || note.mime.startsWith('text/')) { + if (note.isStringNote()) { const noteContent = await note.getNoteContent(); - noteContent.content = noteContent.content.toString("UTF-8"); - if (note.type === 'file') { noteContent.content = noteContent.content.substr(0, 10000); } diff --git a/src/services/export/opml.js b/src/services/export/opml.js index 9aef5033b..26160e0cc 100644 --- a/src/services/export/opml.js +++ b/src/services/export/opml.js @@ -10,7 +10,7 @@ async function exportToOpml(exportContext, branch, res) { const branch = await repository.getBranch(branchId); const note = await branch.getNote(); - if (await note.hasLabel('excludeFromExport')) { + if (!note.isStringNote() || await note.hasLabel('excludeFromExport')) { return; }