From 5d1db1de31780662a05964adbdbe099e124d3b12 Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Sat, 14 Jan 2017 23:52:53 +0900 Subject: [PATCH 1/4] Add export as txt/md --- browser/components/MarkdownPreview.js | 32 +++++++++++++++++++++++++++ lib/main-menu.js | 20 +++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js index c5fbc949..fe4a5c56 100644 --- a/browser/components/MarkdownPreview.js +++ b/browser/components/MarkdownPreview.js @@ -6,6 +6,8 @@ import consts from 'browser/lib/consts' import Raphael from 'raphael' import flowchart from 'flowchart' import SequenceDiagram from 'js-sequence-diagrams' +import ee from 'browser/main/lib/eventEmitter' +import fs from 'fs' function decodeHTMLEntities (text) { var entities = [ @@ -25,6 +27,7 @@ function decodeHTMLEntities (text) { const { remote } = require('electron') const { app } = remote const path = require('path') +const dialog = remote.require('electron').dialog const markdownStyle = require('!!css!stylus?sourceMap!./markdown.styl')[0][1] const appPath = 'file://' + (process.env.NODE_ENV === 'production' @@ -90,6 +93,8 @@ export default class MarkdownPreview extends React.Component { this.mouseUpHandler = (e) => this.handleMouseUp(e) this.anchorClickHandler = (e) => this.handlePreviewAnchorClick(e) this.checkboxClickHandler = (e) => this.handleCheckboxClick(e) + this.saveAsTextHandler = () => this.handleSaveAsText() + this.saveAsMdHandler = () => this.handleSaveAsMd() } handlePreviewAnchorClick (e) { @@ -134,6 +139,29 @@ export default class MarkdownPreview extends React.Component { if (this.props.onMouseUp != null) this.props.onMouseUp(e) } + handleSaveAsText () { + this.exportAsDocument('txt') + } + + handleSaveAsMd () { + this.exportAsDocument('md') + } + + exportAsDocument (fileType) { + const options = { + filters: [ + { name: 'Documents', extensions: [fileType]} + ], + properties: ['openFile', 'createDirectory'] + } + dialog.showSaveDialog(remote.getCurrentWindow(), options, + (filename) => { + if (filename) { + fs.writeFile(filename, this.props.value, () => {}) + } + }) + } + componentDidMount () { this.refs.root.setAttribute('sandbox', 'allow-scripts') this.refs.root.contentWindow.document.body.addEventListener('contextmenu', this.contextMenuHandler) @@ -149,12 +177,16 @@ export default class MarkdownPreview extends React.Component { this.refs.root.contentWindow.document.addEventListener('mousedown', this.mouseDownHandler) this.refs.root.contentWindow.document.addEventListener('mouseup', this.mouseUpHandler) + ee.on('export:save-text', this.saveAsTextHandler) + ee.on('export:save-md', this.saveAsMdHandler) } componentWillUnmount () { this.refs.root.contentWindow.document.body.removeEventListener('contextmenu', this.contextMenuHandler) this.refs.root.contentWindow.document.removeEventListener('mousedown', this.mouseDownHandler) this.refs.root.contentWindow.document.removeEventListener('mouseup', this.mouseUpHandler) + ee.off('export:save-text', this.saveAsTextHandler) + ee.off('export:save-md', this.saveAsMdHandler) } componentDidUpdate (prevProps) { diff --git a/lib/main-menu.js b/lib/main-menu.js index 482c8b07..8e6ab4f4 100644 --- a/lib/main-menu.js +++ b/lib/main-menu.js @@ -62,6 +62,26 @@ var file = { { type: 'separator' }, + { + label: 'Export as', + submenu: [ + { + label: 'Plain Text (.txt)', + click: function () { + mainWindow.webContents.send('export:save-text') + } + }, + { + label: 'MarkDown (.md)', + click: function () { + mainWindow.webContents.send('export:save-md') + } + } + ] + }, + { + type: 'separator' + }, { label: 'Delete Note', accelerator: OSX ? 'Control + Backspace' : 'Control + Delete', From f48864a2e77231face1d649ae65dc341e2297690 Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Wed, 18 Jan 2017 10:09:12 +0900 Subject: [PATCH 2/4] Fix pointed part by review --- browser/components/MarkdownPreview.js | 16 +++++++++------- lib/main-menu.js | 4 ++-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js index fe4a5c56..7a376470 100644 --- a/browser/components/MarkdownPreview.js +++ b/browser/components/MarkdownPreview.js @@ -6,7 +6,7 @@ import consts from 'browser/lib/consts' import Raphael from 'raphael' import flowchart from 'flowchart' import SequenceDiagram from 'js-sequence-diagrams' -import ee from 'browser/main/lib/eventEmitter' +import eventEmitter from 'browser/main/lib/eventEmitter' import fs from 'fs' function decodeHTMLEntities (text) { @@ -27,7 +27,7 @@ function decodeHTMLEntities (text) { const { remote } = require('electron') const { app } = remote const path = require('path') -const dialog = remote.require('electron').dialog +const dialog = remote.dialog const markdownStyle = require('!!css!stylus?sourceMap!./markdown.styl')[0][1] const appPath = 'file://' + (process.env.NODE_ENV === 'production' @@ -157,7 +157,9 @@ export default class MarkdownPreview extends React.Component { dialog.showSaveDialog(remote.getCurrentWindow(), options, (filename) => { if (filename) { - fs.writeFile(filename, this.props.value, () => {}) + fs.writeFile(filename, this.props.value, (err) => { + if (err) throw err + }) } }) } @@ -177,16 +179,16 @@ export default class MarkdownPreview extends React.Component { this.refs.root.contentWindow.document.addEventListener('mousedown', this.mouseDownHandler) this.refs.root.contentWindow.document.addEventListener('mouseup', this.mouseUpHandler) - ee.on('export:save-text', this.saveAsTextHandler) - ee.on('export:save-md', this.saveAsMdHandler) + eventEmitter.on('export:save-text', this.saveAsTextHandler) + eventEmitter.on('export:save-md', this.saveAsMdHandler) } componentWillUnmount () { this.refs.root.contentWindow.document.body.removeEventListener('contextmenu', this.contextMenuHandler) this.refs.root.contentWindow.document.removeEventListener('mousedown', this.mouseDownHandler) this.refs.root.contentWindow.document.removeEventListener('mouseup', this.mouseUpHandler) - ee.off('export:save-text', this.saveAsTextHandler) - ee.off('export:save-md', this.saveAsMdHandler) + eventEmitter.off('export:save-text', this.saveAsTextHandler) + eventEmitter.off('export:save-md', this.saveAsMdHandler) } componentDidUpdate (prevProps) { diff --git a/lib/main-menu.js b/lib/main-menu.js index 8e6ab4f4..9ae151ea 100644 --- a/lib/main-menu.js +++ b/lib/main-menu.js @@ -67,13 +67,13 @@ var file = { submenu: [ { label: 'Plain Text (.txt)', - click: function () { + click () { mainWindow.webContents.send('export:save-text') } }, { label: 'MarkDown (.md)', - click: function () { + click () { mainWindow.webContents.send('export:save-md') } } From 221b6a2938464078891b9e1e5d5093944398f590 Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Fri, 20 Jan 2017 18:56:33 +0900 Subject: [PATCH 3/4] Alert users try to export md/txt in SNIPPET --- browser/main/NoteList/index.js | 19 +++++++++++++++++++ lib/main-menu.js | 2 ++ 2 files changed, 21 insertions(+) diff --git a/browser/main/NoteList/index.js b/browser/main/NoteList/index.js index 1edb2fb2..f9604469 100644 --- a/browser/main/NoteList/index.js +++ b/browser/main/NoteList/index.js @@ -38,6 +38,9 @@ class NoteList extends React.Component { this.focusHandler = () => { this.refs.list.focus() } + this.alertIfSnippetHnalder = () => { + this.alertIfSnippet() + } this.state = { } @@ -48,6 +51,7 @@ class NoteList extends React.Component { ee.on('list:next', this.selectNextNoteHandler) ee.on('list:prior', this.selectPriorNoteHandler) ee.on('list:focus', this.focusHandler) + ee.on('list:isMarkdownNote', this.alertIfSnippetHnalder) } componentWillReceiveProps (nextProps) { @@ -66,6 +70,7 @@ class NoteList extends React.Component { ee.off('list:next', this.selectNextNoteHandler) ee.off('list:prior', this.selectPriorNoteHandler) ee.off('list:focus', this.focusHandler) + ee.off('list:isMarkdownNote', this.alertIfSnippetHnalder) } componentDidUpdate (prevProps) { @@ -305,6 +310,20 @@ class NoteList extends React.Component { }) } + alertIfSnippet() { + let { location } = this.props + let targetIndex = _.findIndex(this.notes, (note) => { + return note.storage + '-' + note.key === location.query.key + }) + if (this.notes[targetIndex].type === 'SNIPPET_NOTE') { + dialog.showMessageBox(remote.getCurrentWindow(), { + type: 'warning', + message: 'Sorry!', + detail: 'md/text import is available only a markdown note.' + }) + } + } + render () { let { location, notes, config } = this.props let sortFunc = config.sortBy === 'CREATED_AT' diff --git a/lib/main-menu.js b/lib/main-menu.js index 9ae151ea..9a95fe1d 100644 --- a/lib/main-menu.js +++ b/lib/main-menu.js @@ -68,12 +68,14 @@ var file = { { label: 'Plain Text (.txt)', click () { + mainWindow.webContents.send('list:isMarkdownNote') mainWindow.webContents.send('export:save-text') } }, { label: 'MarkDown (.md)', click () { + mainWindow.webContents.send('list:isMarkdownNote') mainWindow.webContents.send('export:save-md') } } From 911ce7572f0b461e8ca2b19af38a8788ddd2148b Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Sat, 21 Jan 2017 15:44:48 +0900 Subject: [PATCH 4/4] Fix by review refs: https://github.com/BoostIO/Boostnote/pull/245#pullrequestreview-17800372 --- browser/main/NoteList/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/browser/main/NoteList/index.js b/browser/main/NoteList/index.js index f9604469..82c0bbc3 100644 --- a/browser/main/NoteList/index.js +++ b/browser/main/NoteList/index.js @@ -312,8 +312,8 @@ class NoteList extends React.Component { alertIfSnippet() { let { location } = this.props - let targetIndex = _.findIndex(this.notes, (note) => { - return note.storage + '-' + note.key === location.query.key + const targetIndex = _.findIndex(this.notes, (note) => { + return `${note.storage}-${note.key}` === location.query.key }) if (this.notes[targetIndex].type === 'SNIPPET_NOTE') { dialog.showMessageBox(remote.getCurrentWindow(), {