From 60fc621cd4ed2679cd7e81e4e3410c18d1cd3ff9 Mon Sep 17 00:00:00 2001 From: zadam Date: Tue, 8 Nov 2022 22:36:15 +0100 Subject: [PATCH] add keyboard action to force creating note revisions, #2147 --- src/public/app/services/entrypoints.js | 8 ++++++++ src/routes/api/notes.js | 19 ++++++++++++++++++- src/routes/routes.js | 1 + src/services/keyboard_actions.js | 6 ++++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/public/app/services/entrypoints.js b/src/public/app/services/entrypoints.js index e18691c0f..c9eaa867c 100644 --- a/src/public/app/services/entrypoints.js +++ b/src/public/app/services/entrypoints.js @@ -201,4 +201,12 @@ export default class Entrypoints extends Component { activeContextChangedEvent() { this.hideAllTooltips(); } + + async forceSaveNoteRevisionCommand() { + const noteId = appContext.tabManager.getActiveContextNoteId(); + + await server.post(`notes/${noteId}/revision`); + + toastService.showMessage("Note revision has been created."); + } } diff --git a/src/routes/api/notes.js b/src/routes/api/notes.js index ea69e7de5..ebb345623 100644 --- a/src/routes/api/notes.js +++ b/src/routes/api/notes.js @@ -6,6 +6,7 @@ const sql = require('../../services/sql'); const utils = require('../../services/utils'); const log = require('../../services/log'); const TaskContext = require('../../services/task_context'); +const protectedSessionService = require('../../services/protected_session'); const fs = require('fs'); const becca = require("../../becca/becca"); @@ -305,6 +306,21 @@ function uploadModifiedFile(req) { note.setContent(fileContent); } +function forceSaveNoteRevision(req) { + const {noteId} = req.params; + const note = becca.getNote(noteId); + + if (!note) { + return [404, `Note ${noteId} not found.`]; + } + + if (!note.isContentAvailable()) { + return [400, `Note revision of a protected note cannot be created outside of a protected session.`]; + } + + note.saveNoteRevision(); +} + module.exports = { getNote, updateNoteContent, @@ -319,5 +335,6 @@ module.exports = { duplicateSubtree, eraseDeletedNotesNow, getDeleteNotesPreview, - uploadModifiedFile + uploadModifiedFile, + forceSaveNoteRevision }; diff --git a/src/routes/routes.js b/src/routes/routes.js index d843252f7..5df0c9b0b 100644 --- a/src/routes/routes.js +++ b/src/routes/routes.js @@ -254,6 +254,7 @@ function register(app) { apiRoute(PUT, '/api/notes/:noteId/content', notesApiRoute.updateNoteContent); apiRoute(DELETE, '/api/notes/:noteId', notesApiRoute.deleteNote); apiRoute(PUT, '/api/notes/:noteId/undelete', notesApiRoute.undeleteNote); + apiRoute(POST, '/api/notes/:noteId/revision', notesApiRoute.forceSaveNoteRevision); apiRoute(POST, '/api/notes/:parentNoteId/children', notesApiRoute.createNote); apiRoute(PUT, '/api/notes/:noteId/sort-children', notesApiRoute.sortChildNotes); apiRoute(PUT, '/api/notes/:noteId/protect/:isProtected', notesApiRoute.protectNote); diff --git a/src/services/keyboard_actions.js b/src/services/keyboard_actions.js index 2ee04fa5e..9e223d46b 100644 --- a/src/services/keyboard_actions.js +++ b/src/services/keyboard_actions.js @@ -500,6 +500,12 @@ const DEFAULT_KEYBOARD_ACTIONS = [ defaultShortcuts: ["CommandOrControl+Alt+C"], description: "Copy selected text without formatting", scope: "text-detail" + }, + { + actionName: "forceSaveNoteRevision", + defaultShortcuts: [], + description: "Force creating / saving new note revision of the active note", + scope: "window" } ];