diff --git a/src/public/app/components/root_command_executor.js b/src/public/app/components/root_command_executor.js index bac07af70..63d86ae46 100644 --- a/src/public/app/components/root_command_executor.js +++ b/src/public/app/components/root_command_executor.js @@ -54,6 +54,15 @@ export default class RootCommandExecutor extends Component { openService.openNoteExternally(noteId, mime); } } + + openNoteCustomCommand() { + const noteId = appContext.tabManager.getActiveContextNoteId(); + const mime = appContext.tabManager.getActiveContextNoteMime() + + if (noteId) { + openService.openNoteCustom(noteId, mime); + } + } enterProtectedSessionCommand() { protectedSessionService.enterProtectedSession(); diff --git a/src/public/app/services/open.js b/src/public/app/services/open.js index 2d0ef6091..9d6f3c931 100644 --- a/src/public/app/services/open.js +++ b/src/public/app/services/open.js @@ -47,6 +47,62 @@ async function openNoteExternally(noteId, mime) { } } +async function openNoteCustom(noteId, mime) { + if (utils.isElectron()) { + const resp = await server.post(`notes/${noteId}/save-to-tmp-dir`); + const filePath = resp.tmpFilePath; + const { exec } = utils.dynamicRequire('child_process'); + const platform = process.platform; + if (platform === 'linux') { + const terminals = ['gnome-terminal', 'konsole', 'xterm', 'xfce4-terminal', 'mate-terminal', 'rxvt', 'terminator', 'terminology']; + const openFileWithTerminal = (terminal) => { + const command = `${terminal} -e 'mimeopen -d "${filePath}"'`; + console.log(`Open Note custom: ${command} `); + exec(command, (error, stdout, stderr) => { + if (error) { + console.error(`Open Note custom: Failed to open file with ${terminal}: ${error}`); + searchTerminal(terminals.indexOf(terminal) + 1); + } else { + console.log(`Open Note custom: File opened with ${terminal}. ${stdout}`); + } + }); + }; + const searchTerminal = (index) => { + const terminal = terminals[index]; + if (!terminal) { + console.error('Open Note custom: No terminal found!'); + open(getFileUrl(noteId), { url: true }); + return; + } + exec(`which ${terminal}`, (error, stdout, stderr) => { + if (stdout.trim()) { + openFileWithTerminal(terminal); + } else { + searchTerminal(index + 1); + } + }); + }; + searchTerminal(0); + } else if (platform === 'win32') { + if (filePath.indexOf("/") !== -1) { + //Note that the path separator must be \ instead of / + filePath = filePath.replace(/\//g, "\\"); + } + const command = `rundll32.exe shell32.dll,OpenAs_RunDLL ` + filePath; + exec(command, (err, stdout, stderr) => { + if (err) { + console.error("Open Note custom: ", err); + open(getFileUrl(noteId), { url: true }); + return; + } + }); + } else { + console.log('Currently "Open Note custom" only supports linux and windows systems'); + open(getFileUrl(noteId), { url: true }); + } + } + } + function downloadNoteRevision(noteId, noteRevisionId) { const url = getUrlForDownload(`api/notes/${noteId}/revisions/${noteRevisionId}/download`); @@ -76,6 +132,7 @@ export default { download, downloadFileNote, openNoteExternally, + openNoteCustom, downloadNoteRevision, getUrlForDownload } diff --git a/src/public/app/widgets/buttons/note_actions.js b/src/public/app/widgets/buttons/note_actions.js index fb2c19918..de2ad33f9 100644 --- a/src/public/app/widgets/buttons/note_actions.js +++ b/src/public/app/widgets/buttons/note_actions.js @@ -29,6 +29,7 @@ const TPL = ` Search in note Note source Open note externally + Open note custom (beta) Import files Export note Delete note @@ -67,6 +68,7 @@ export default class NoteActionsWidget extends NoteContextAwareWidget { this.$widget.on('click', '.dropdown-item', () => this.$widget.find("[data-toggle='dropdown']").dropdown('toggle')); this.$openNoteExternallyButton = this.$widget.find(".open-note-externally-button"); + this.$openNoteCustomButton = this.$widget.find(".open-note-custom-button"); this.$deleteNoteButton = this.$widget.find(".delete-note-button"); this.$deleteNoteButton.on("click", () => { @@ -88,6 +90,7 @@ export default class NoteActionsWidget extends NoteContextAwareWidget { this.$renderNoteButton.toggle(note.type === 'render'); this.$openNoteExternallyButton.toggle(utils.isElectron()); + this.$openNoteCustomButton.toggle(utils.isElectron()); } toggleDisabled($el, enable) {