From c38a76d587bb2cf0e2d02933bd99b5b2b9c3bb70 Mon Sep 17 00:00:00 2001 From: asmsuechan Date: Tue, 13 Jun 2017 11:06:00 +0900 Subject: [PATCH] Add importer which imports files from .md/.txt --- browser/main/NoteList/index.js | 50 ++++++++++++++++++++++++++++++++++ lib/main-menu.js | 14 ++++++++++ 2 files changed, 64 insertions(+) diff --git a/browser/main/NoteList/index.js b/browser/main/NoteList/index.js index feccd3af..2c6abce2 100644 --- a/browser/main/NoteList/index.js +++ b/browser/main/NoteList/index.js @@ -9,6 +9,8 @@ import ConfigManager from 'browser/main/lib/ConfigManager' import NoteItem from 'browser/components/NoteItem' import NoteItemSimple from 'browser/components/NoteItemSimple' import searchFromNotes from 'browser/lib/search' +import fs from 'fs' +import { hashHistory } from 'react-router' const { remote } = require('electron') const { Menu, MenuItem, dialog } = remote @@ -42,6 +44,7 @@ class NoteList extends React.Component { this.alertIfSnippetHandler = () => { this.alertIfSnippet() } + this.importFromFileHandler = this.importFromFile.bind(this) this.jumpToTopHandler = () => { this.jumpToTop() @@ -59,6 +62,7 @@ class NoteList extends React.Component { ee.on('list:isMarkdownNote', this.alertIfSnippetHandler) ee.on('list:top', this.jumpToTopHandler) ee.on('list:jumpToTop', this.jumpToTopHandler) + ee.on('import:file', this.importFromFileHandler) } componentWillReceiveProps (nextProps) { @@ -80,6 +84,7 @@ class NoteList extends React.Component { ee.off('list:isMarkdownNote', this.alertIfSnippetHandler) ee.off('list:top', this.jumpToTopHandler) ee.off('list:jumpToTop', this.jumpToTopHandler) + ee.off('import:file', this.importFromFileHandler) } componentDidUpdate (prevProps) { @@ -365,6 +370,51 @@ class NoteList extends React.Component { e.dataTransfer.setData('note', noteData) } + importFromFile () { + const { dispatch, location } = this.props + + const options = { + filters: [ + { name: 'Documents', extensions: ['md', 'txt']} + ], + properties: ['openFile'] + } + + const targetIndex = _.findIndex(this.notes, (note) => { + return note != null && note.storage + '-' + note.key === location.query.key + }) + + const storageKey = this.notes[targetIndex].storage + const folderKey = this.notes[targetIndex].folder + + dialog.showOpenDialog(remote.getCurrentWindow(), options, (filepaths) => { + if (filepaths === undefined) return + filepaths.forEach((filepath) => { + fs.readFile(filepath, (err, data) => { + if (err) throw Error('File reading error: ', err) + // TODO: fill the title + const newNote = { + content: data.toString(), + folder: folderKey, + title: '', + type: 'MARKDOWN_NOTE' + } + dataApi.createNote(storageKey, newNote) + .then((note) => { + dispatch({ + type: 'UPDATE_NOTE', + note: note + }) + hashHistory.push({ + pathname: location.pathname, + query: {key: note.storage + '-' + note.key} + }) + }) + }) + }) + }) + } + render () { let { location, notes, config, dispatch } = this.props let sortFunc = config.sortBy === 'CREATED_AT' diff --git a/lib/main-menu.js b/lib/main-menu.js index 6c239771..8e26d356 100644 --- a/lib/main-menu.js +++ b/lib/main-menu.js @@ -92,6 +92,20 @@ const file = { { type: 'separator' }, + { + label: 'Import from', + submenu: [ + { + label: 'Plain Text, MarkDown (.txt, .md)', + click () { + mainWindow.webContents.send('import:file') + } + } + ] + }, + { + type: 'separator' + }, { label: 'Delete Note', accelerator: macOS ? 'Control+Backspace' : 'Control+Delete',