From 45b1cd3942eadc715e45b053f1ea0787c0c34d89 Mon Sep 17 00:00:00 2001 From: Dick Choi Date: Sat, 23 Jul 2016 15:28:17 +0900 Subject: [PATCH] delete note --- browser/components/CodeEditor.js | 3 +- browser/main/ArticleList.js | 144 ----------------- browser/main/Detail/MarkdownNoteDetail.js | 134 ++++++++++------ browser/main/Detail/MarkdownNoteDetail.styl | 30 ++++ browser/main/Detail/SnippetNoteDetail.js | 145 +++++++++++------- browser/main/Detail/SnippetNoteDetail.styl | 31 ++++ browser/main/Detail/index.js | 22 ++- browser/main/NoteList/index.js | 19 ++- browser/main/global.styl | 6 +- browser/main/lib/dataApi.js | 34 +++- browser/main/lib/eventEmitter.js | 26 ++++ browser/main/modals/InitModal.js | 139 +++++++++-------- browser/main/modals/InitModal.styl | 2 +- browser/main/modals/NewNoteModal.js | 3 + .../modals/PreferencesModal/StorageItem.js | 58 ++++++- .../modals/PreferencesModal/StorageItem.styl | 24 ++- browser/main/store.js | 7 + 17 files changed, 498 insertions(+), 329 deletions(-) delete mode 100644 browser/main/ArticleList.js create mode 100644 browser/main/lib/eventEmitter.js diff --git a/browser/components/CodeEditor.js b/browser/components/CodeEditor.js index 83bb8025..6ca06ab3 100644 --- a/browser/components/CodeEditor.js +++ b/browser/components/CodeEditor.js @@ -23,7 +23,6 @@ export default class CodeEditor extends React.Component { } el = el.parentNode } - console.log(isStillFocused) if (!isStillFocused && this.props.onBlur != null) this.props.onBlur(e) } @@ -165,7 +164,7 @@ export default class CodeEditor extends React.Component { let syntaxMode = mode != null ? mode.mode : 'text' - session.setMode('ace/mode' + syntaxMode) + session.setMode('ace/mode/' + syntaxMode) } if (prevProps.theme !== this.props.theme) { editor.setTheme('ace/theme/' + this.props.theme) diff --git a/browser/main/ArticleList.js b/browser/main/ArticleList.js deleted file mode 100644 index bcc7d6c3..00000000 --- a/browser/main/ArticleList.js +++ /dev/null @@ -1,144 +0,0 @@ -import React, { PropTypes } from 'react' -import ReactDOM from 'react-dom' -import ModeIcon from 'browser/components/ModeIcon' -import moment from 'moment' -import FolderMark from 'browser/components/FolderMark' -import _ from 'lodash' - -const electron = require('electron') -const remote = electron.remote -const ipc = electron.ipcRenderer - -export default class ArticleList extends React.Component { - constructor (props) { - super(props) - - this.focusHandler = (e) => this.focus() - } - - componentDidMount () { - this.refreshTimer = setInterval(() => this.forceUpdate(), 60 * 1000) - ipc.on('list-focus', this.focusHandler) - this.focus() - } - - componentWillUnmount () { - clearInterval(this.refreshTimer) - ipc.removeListener('list-focus', this.focusHandler) - } - - componentDidUpdate () { - return false - var index = articles.indexOf(null) - var el = ReactDOM.findDOMNode(this) - var li = el.querySelectorAll('.ArticleList>div')[index] - - if (li == null) { - return - } - - var overflowBelow = el.clientHeight + el.scrollTop < li.offsetTop + li.clientHeight - if (overflowBelow) { - el.scrollTop = li.offsetTop + li.clientHeight - el.clientHeight - } - var overflowAbove = el.scrollTop > li.offsetTop - if (overflowAbove) { - el.scrollTop = li.offsetTop - } - } - - focus () { - ReactDOM.findDOMNode(this).focus() - } - - // 移動ができなかったらfalseを返す: - selectPriorArticle () { - let { articles, activeArticle, dispatch } = this.props - let targetIndex = articles.indexOf(activeArticle) - 1 - let targetArticle = articles[targetIndex] - - if (targetArticle != null) { - dispatch(switchArticle(targetArticle.key)) - return true - } - return false - } - - selectNextArticle () { - let { articles, activeArticle, dispatch } = this.props - let targetIndex = articles.indexOf(activeArticle) + 1 - let targetArticle = articles[targetIndex] - - if (targetArticle != null) { - dispatch(switchArticle(targetArticle.key)) - return true - } - return false - } - - handleArticleClick (article) { - let { dispatch } = this.props - return function (e) { - dispatch(switchArticle(article.key)) - } - } - - handleArticleListKeyDown (e) { - if (e.metaKey || e.ctrlKey) return true - - if (e.keyCode === 65 && !e.shiftKey) { - e.preventDefault() - remote.getCurrentWebContents().send('top-new-post') - } - - if (e.keyCode === 65 && e.shiftKey) { - e.preventDefault() - remote.getCurrentWebContents().send('nav-new-folder') - } - - if (e.keyCode === 68) { - e.preventDefault() - remote.getCurrentWebContents().send('detail-delete') - } - - if (e.keyCode === 84) { - e.preventDefault() - remote.getCurrentWebContents().send('detail-title') - } - - if (e.keyCode === 69) { - e.preventDefault() - remote.getCurrentWebContents().send('detail-edit') - } - - if (e.keyCode === 83) { - e.preventDefault() - remote.getCurrentWebContents().send('detail-save') - } - - if (e.keyCode === 38) { - e.preventDefault() - this.selectPriorArticle() - } - - if (e.keyCode === 40) { - e.preventDefault() - this.selectNextArticle() - } - } - - render () { - let articleElements = [] - - return ( -
this.handleArticleListKeyDown(e)} className='ArticleList'> - {articleElements} -
- ) - } -} - -ArticleList.propTypes = { - dispatch: PropTypes.func, - repositories: PropTypes.array -} diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js index 9478bb87..6cb7ede3 100644 --- a/browser/main/Detail/MarkdownNoteDetail.js +++ b/browser/main/Detail/MarkdownNoteDetail.js @@ -5,9 +5,9 @@ import MarkdownEditor from 'browser/components/MarkdownEditor' import StarButton from './StarButton' import TagSelect from './TagSelect' import FolderSelect from './FolderSelect' -import Commander from 'browser/main/lib/Commander' import dataApi from 'browser/main/lib/dataApi' import { hashHistory } from 'react-router' +import ee from 'browser/main/lib/eventEmitter' const electron = require('electron') const { remote } = electron @@ -22,31 +22,22 @@ class MarkdownNoteDetail extends React.Component { note: Object.assign({ title: '', content: '', - isMovingNote: false + isMovingNote: false, + isDeleting: false }, props.note) } this.dispatchTimer = null } - componentDidMount () { - Commander.bind('note-detail', this) - } - - componentWillUnmount () { - Commander.release(this) - } - - fire (command) { - switch (command) { - case 'focus': - this.refs.content.focus() - } + focus () { + this.refs.content.focus() } componentWillReceiveProps (nextProps) { if (nextProps.note.key !== this.props.note.key && !this.isMovingNote) { this.setState({ - note: Object.assign({}, nextProps.note) + note: Object.assign({}, nextProps.note), + isDeleting: false }, () => { this.refs.content.reload() this.refs.tags.reset() @@ -176,11 +167,39 @@ class MarkdownNoteDetail extends React.Component { let menu = new Menu() menu.append(new MenuItem({ label: 'Delete', - click: (e) => this.handlePreferencesButtonClick(e) + click: (e) => this.handleDeleteMenuClick(e) })) menu.popup(remote.getCurrentWindow()) } + handleDeleteMenuClick (e) { + this.setState({ + isDeleting: true + }) + } + + handleDeleteConfirmButtonClick (e) { + let { note, dispatch } = this.props + dataApi + .removeNote(note.storage, note.folder, note.key) + .then(() => { + let dispatchHandler = () => { + dispatch({ + type: 'REMOVE_NOTE', + note: note + }) + } + ee.once('list:moved', dispatchHandler) + ee.emit('list:next') + }) + } + + handleDeleteCancelButtonClick (e) { + this.setState({ + isDeleting: false + }) + } + render () { let { storages, config } = this.props let { note } = this.state @@ -190,43 +209,58 @@ class MarkdownNoteDetail extends React.Component { style={this.props.style} styleName='root' > -
-
+ {this.state.isDeleting + ?
+
-
- this.handleFolderChange(e)} - /> -
-
- this.handleChange(e)} - /> + + Are you sure to delete this note? + + +
-
- this.handleStarButtonClick(e)} - isActive={note.isStarred} - /> - - + :
+
+
+ this.handleFolderChange(e)} + /> +
+
+ this.handleChange(e)} + /> +
+
+
+ this.handleStarButtonClick(e)} + isActive={note.isStarred} + /> + + +
-
+ }
Object.assign({}, snippet)) - }) + }), + isDeleting: false } } - componentDidMount () { - Commander.bind('note-detail', this) - } - - componentWillUnmount () { - Commander.release(this) - } - - fire (command) { - switch (command) { - case 'focus': - this.refs.description.focus() - } + focus () { + this.refs.description.focus() } componentWillReceiveProps (nextProps) { if (nextProps.note.key !== this.props.note.key) { + let nextNote = Object.assign({ + description: '' + }, nextProps.note, { + snippets: nextProps.note.snippets.map((snippet) => Object.assign({}, snippet)) + }) this.setState({ snippetIndex: 0, - note: Object.assign({ - description: '' - }, nextProps.note, { - snippets: nextProps.note.snippets.map((snippet) => Object.assign({}, snippet)) - }) + note: nextNote, + isDeleting: false }, () => { let { snippets } = this.state.note snippets.forEach((snippet, index) => { @@ -171,6 +163,7 @@ class SnippetNoteDetail extends React.Component { let menu = new Menu() menu.append(new MenuItem({ label: 'Export as a File', + disabled: true, click: (e) => this.handlePreferencesButtonClick(e) })) menu.append(new MenuItem({ @@ -185,11 +178,39 @@ class SnippetNoteDetail extends React.Component { let menu = new Menu() menu.append(new MenuItem({ label: 'Delete', - click: (e) => this.handlePreferencesButtonClick(e) + click: (e) => this.handleDeleteMenuClick(e) })) menu.popup(remote.getCurrentWindow()) } + handleDeleteMenuClick (e) { + this.setState({ + isDeleting: true + }) + } + + handleDeleteConfirmButtonClick (e) { + let { note, dispatch } = this.props + dataApi + .removeNote(note.storage, note.folder, note.key) + .then(() => { + let dispatchHandler = () => { + dispatch({ + type: 'REMOVE_NOTE', + note: note + }) + } + ee.once('list:moved', dispatchHandler) + ee.emit('list:next') + }) + } + + handleDeleteCancelButtonClick (e) { + this.setState({ + isDeleting: false + }) + } + handleTabPlusButtonClick (e) { let { note } = this.state @@ -360,43 +381,59 @@ class SnippetNoteDetail extends React.Component { style={this.props.style} styleName='root' > -
-
+ {this.state.isDeleting + ?
+
-
- this.handleFolderChange(e)} - /> -
-
- this.handleChange(e)} - /> + + Are you sure to delete this note? + + +
-
- this.handleStarButtonClick(e)} - isActive={note.isStarred} - /> - - + :
+
+
+ this.handleFolderChange(e)} + /> +
+
+ this.handleChange(e)} + /> +
+
+
+ this.handleStarButtonClick(e)} + isActive={note.isStarred} + /> + + +
-
+ } +