From 191f2cacbfd93273084f81987e0269e16d9241b7 Mon Sep 17 00:00:00 2001 From: William Grant Date: Sun, 25 Mar 2018 12:27:04 +0200 Subject: [PATCH 1/8] Show confirmation dialog when deleting notes from the context menu if set in preferences --- browser/main/NoteList/index.js | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/browser/main/NoteList/index.js b/browser/main/NoteList/index.js index e97f7aef..c3ebd9e0 100644 --- a/browser/main/NoteList/index.js +++ b/browser/main/NoteList/index.js @@ -574,22 +574,29 @@ class NoteList extends React.Component { }) } + confirmDeleteNote (selectedNotes) { + const noteExp = selectedNotes.length > 1 ? 'notes' : 'note' + const dialogueButtonIndex = dialog.showMessageBox(remote.getCurrentWindow(), { + type: 'warning', + message: i18n.__('Confirm note deletion'), + detail: `This will permanently remove ${selectedNotes.length} ${noteExp}.`, + buttons: [i18n.__('Confirm'), i18n.__('Cancel')] + }) + + return dialogueButtonIndex === 1 ? false : true + } + deleteNote () { const { dispatch } = this.props const { selectedNoteKeys } = this.state const notes = this.notes.map((note) => Object.assign({}, note)) const selectedNotes = findNotesByKeys(notes, selectedNoteKeys) const firstNote = selectedNotes[0] + const confirmDeletion = this.props.config.ui.confirmDeletion if (firstNote.isTrashed) { - const noteExp = selectedNotes.length > 1 ? 'notes' : 'note' - const dialogueButtonIndex = dialog.showMessageBox(remote.getCurrentWindow(), { - type: 'warning', - message: i18n.__('Confirm note deletion'), - detail: `This will permanently remove ${selectedNotes.length} ${noteExp}.`, - buttons: [i18n.__('Confirm'), i18n.__('Cancel')] - }) - if (dialogueButtonIndex === 1) return + if (!this.confirmDeleteNote(selectedNotes)) return + Promise.all( selectedNotes.map((note) => { return dataApi @@ -610,6 +617,10 @@ class NoteList extends React.Component { }) console.log('Notes were all deleted') } else { + if (confirmDeletion) { + if (!this.confirmDeleteNote(selectedNotes)) return + } + Promise.all( selectedNotes.map((note) => { note.isTrashed = true From a9b75f752e9cdef0aec6d155090fa1626c233b97 Mon Sep 17 00:00:00 2001 From: William Grant Date: Sun, 25 Mar 2018 18:28:02 +0200 Subject: [PATCH 2/8] updated node version in travis.yml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c68d1063..36542f3c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - 6 + - 7 script: - npm run lint && npm run test - 'if [[ ${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH} = "master" ]]; then npm install -g grunt npm@5.2 && grunt pre-build; fi' From 871ab428c295972dfe0e1de1f0efac068a1e642e Mon Sep 17 00:00:00 2001 From: William Grant Date: Sun, 25 Mar 2018 18:42:48 +0200 Subject: [PATCH 3/8] Revert "updated node version in travis.yml" This reverts commit a9b75f752e9cdef0aec6d155090fa1626c233b97. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 36542f3c..c68d1063 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - 7 + - 6 script: - npm run lint && npm run test - 'if [[ ${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH} = "master" ]]; then npm install -g grunt npm@5.2 && grunt pre-build; fi' From 56231edc3a7c295d2d11951c93ed982a1a4b5be3 Mon Sep 17 00:00:00 2001 From: William Grant Date: Sun, 25 Mar 2018 18:43:54 +0200 Subject: [PATCH 4/8] fix delete confirmation method --- browser/main/NoteList/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/main/NoteList/index.js b/browser/main/NoteList/index.js index c3ebd9e0..e5b5403c 100644 --- a/browser/main/NoteList/index.js +++ b/browser/main/NoteList/index.js @@ -583,7 +583,7 @@ class NoteList extends React.Component { buttons: [i18n.__('Confirm'), i18n.__('Cancel')] }) - return dialogueButtonIndex === 1 ? false : true + return dialogueButtonIndex != 1 } deleteNote () { From 4f98995fe4fc98f41fd5629d6349511245225324 Mon Sep 17 00:00:00 2001 From: William Grant Date: Sun, 25 Mar 2018 18:47:21 +0200 Subject: [PATCH 5/8] ... that second equals --- browser/main/NoteList/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/main/NoteList/index.js b/browser/main/NoteList/index.js index e5b5403c..029d9dcd 100644 --- a/browser/main/NoteList/index.js +++ b/browser/main/NoteList/index.js @@ -583,7 +583,7 @@ class NoteList extends React.Component { buttons: [i18n.__('Confirm'), i18n.__('Cancel')] }) - return dialogueButtonIndex != 1 + return dialogueButtonIndex !== 1 } deleteNote () { From be94edde0f4908755c5520a688013d25bc9d547c Mon Sep 17 00:00:00 2001 From: Sosuke Suzuki Date: Tue, 10 Apr 2018 16:26:50 +0900 Subject: [PATCH 6/8] extract confirmDeleteNote function --- browser/lib/confirmDeleteNote.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 browser/lib/confirmDeleteNote.js diff --git a/browser/lib/confirmDeleteNote.js b/browser/lib/confirmDeleteNote.js new file mode 100644 index 00000000..80d1ffc7 --- /dev/null +++ b/browser/lib/confirmDeleteNote.js @@ -0,0 +1,23 @@ +import electron from 'electron' +import i18n from 'browser/lib/i18n' +const { remote } = electron +const { dialog } = remote + +export function confirmDeleteNote (confirmDeletion, permanent) { + if (confirmDeletion || permanent) { + const alertConfig = { + ype: 'warning', + message: i18n.__('Confirm note deletion'), + detail: i18n.__('This will permanently remove this note.'), + buttons: [i18n.__('Confirm'), i18n.__('Cancel')] + } + + const dialogButtonIndex = dialog.showMessageBox( + remote.getCurrentWindow(), alertConfig + ) + + return dialogButtonIndex === 0 + } + + return true +} From ce440351a51766ba5823a5f9f7b9670756f1a126 Mon Sep 17 00:00:00 2001 From: Sosuke Suzuki Date: Tue, 10 Apr 2018 16:28:05 +0900 Subject: [PATCH 7/8] use extracted confirmDeleteNote function --- browser/main/Detail/MarkdownNoteDetail.js | 10 +++++----- browser/main/Detail/SnippetNoteDetail.js | 10 +++++----- browser/main/Detail/index.js | 2 -- browser/main/NoteList/index.js | 21 ++++----------------- 4 files changed, 14 insertions(+), 29 deletions(-) diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js index 6821bf2f..05883c0e 100755 --- a/browser/main/Detail/MarkdownNoteDetail.js +++ b/browser/main/Detail/MarkdownNoteDetail.js @@ -28,6 +28,7 @@ import InfoPanelTrashed from './InfoPanelTrashed' import { formatDate } from 'browser/lib/date-formatter' import { getTodoPercentageOfCompleted } from 'browser/lib/getTodoStatus' import striptags from 'striptags' +import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote' class MarkdownNoteDetail extends React.Component { constructor (props) { @@ -181,10 +182,10 @@ class MarkdownNoteDetail extends React.Component { handleTrashButtonClick (e) { const { note } = this.state const { isTrashed } = note - const { confirmDeletion } = this.props + const { confirmDeletion } = this.props.config.ui if (isTrashed) { - if (confirmDeletion(true)) { + if (confirmDeleteNote(confirmDeletion, true)) { const {note, dispatch} = this.props dataApi .deleteNote(note.storage, note.key) @@ -201,7 +202,7 @@ class MarkdownNoteDetail extends React.Component { .then(() => ee.emit('list:next')) } } else { - if (confirmDeletion()) { + if (confirmDeleteNote(confirmDeletion, false)) { note.isTrashed = true this.setState({ @@ -437,8 +438,7 @@ MarkdownNoteDetail.propTypes = { style: PropTypes.shape({ left: PropTypes.number }), - ignorePreviewPointerEvents: PropTypes.bool, - confirmDeletion: PropTypes.bool.isRequired + ignorePreviewPointerEvents: PropTypes.bool } export default CSSModules(MarkdownNoteDetail, styles) diff --git a/browser/main/Detail/SnippetNoteDetail.js b/browser/main/Detail/SnippetNoteDetail.js index 620de512..411027d5 100644 --- a/browser/main/Detail/SnippetNoteDetail.js +++ b/browser/main/Detail/SnippetNoteDetail.js @@ -27,6 +27,7 @@ import InfoPanel from './InfoPanel' import InfoPanelTrashed from './InfoPanelTrashed' import { formatDate } from 'browser/lib/date-formatter' import i18n from 'browser/lib/i18n' +import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote' function pass (name) { switch (name) { @@ -197,10 +198,10 @@ class SnippetNoteDetail extends React.Component { handleTrashButtonClick (e) { const { note } = this.state const { isTrashed } = note - const { confirmDeletion } = this.props + const { confirmDeletion } = this.props.config.ui if (isTrashed) { - if (confirmDeletion(true)) { + if (confirmDeleteNote(confirmDeletion, true)) { const {note, dispatch} = this.props dataApi .deleteNote(note.storage, note.key) @@ -217,7 +218,7 @@ class SnippetNoteDetail extends React.Component { .then(() => ee.emit('list:next')) } } else { - if (confirmDeletion()) { + if (confirmDeleteNote(confirmDeletion, false)) { note.isTrashed = true this.setState({ @@ -883,8 +884,7 @@ SnippetNoteDetail.propTypes = { style: PropTypes.shape({ left: PropTypes.number }), - ignorePreviewPointerEvents: PropTypes.bool, - confirmDeletion: PropTypes.bool.isRequired + ignorePreviewPointerEvents: PropTypes.bool } export default CSSModules(SnippetNoteDetail, styles) diff --git a/browser/main/Detail/index.js b/browser/main/Detail/index.js index df38132c..32d20a32 100644 --- a/browser/main/Detail/index.js +++ b/browser/main/Detail/index.js @@ -82,7 +82,6 @@ class Detail extends React.Component { this.confirmDeletion(permanent)} ref='root' {..._.pick(this.props, [ 'dispatch', @@ -99,7 +98,6 @@ class Detail extends React.Component { this.confirmDeletion(permanent)} ref='root' {..._.pick(this.props, [ 'dispatch', diff --git a/browser/main/NoteList/index.js b/browser/main/NoteList/index.js index 029d9dcd..2d672664 100644 --- a/browser/main/NoteList/index.js +++ b/browser/main/NoteList/index.js @@ -18,6 +18,7 @@ import copy from 'copy-to-clipboard' import AwsMobileAnalyticsConfig from 'browser/main/lib/AwsMobileAnalyticsConfig' import Markdown from '../../lib/markdown' import i18n from 'browser/lib/i18n' +import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote' const { remote } = require('electron') const { Menu, MenuItem, dialog } = remote @@ -574,28 +575,16 @@ class NoteList extends React.Component { }) } - confirmDeleteNote (selectedNotes) { - const noteExp = selectedNotes.length > 1 ? 'notes' : 'note' - const dialogueButtonIndex = dialog.showMessageBox(remote.getCurrentWindow(), { - type: 'warning', - message: i18n.__('Confirm note deletion'), - detail: `This will permanently remove ${selectedNotes.length} ${noteExp}.`, - buttons: [i18n.__('Confirm'), i18n.__('Cancel')] - }) - - return dialogueButtonIndex !== 1 - } - deleteNote () { const { dispatch } = this.props const { selectedNoteKeys } = this.state const notes = this.notes.map((note) => Object.assign({}, note)) const selectedNotes = findNotesByKeys(notes, selectedNoteKeys) const firstNote = selectedNotes[0] - const confirmDeletion = this.props.config.ui.confirmDeletion + const { confirmDeletion } = this.props.config.ui if (firstNote.isTrashed) { - if (!this.confirmDeleteNote(selectedNotes)) return + if (!confirmDeleteNote(confirmDeletion, true)) return Promise.all( selectedNotes.map((note) => { @@ -617,9 +606,7 @@ class NoteList extends React.Component { }) console.log('Notes were all deleted') } else { - if (confirmDeletion) { - if (!this.confirmDeleteNote(selectedNotes)) return - } + if (!confirmDeleteNote(confirmDeletion, false)) return Promise.all( selectedNotes.map((note) => { From eafccc4fc41ce737a6d244ac52d3ac147c08ec00 Mon Sep 17 00:00:00 2001 From: Sosuke Suzuki Date: Tue, 10 Apr 2018 16:44:04 +0900 Subject: [PATCH 8/8] remove confirmDeletion function --- browser/main/Detail/index.js | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/browser/main/Detail/index.js b/browser/main/Detail/index.js index 32d20a32..7d2b4cba 100644 --- a/browser/main/Detail/index.js +++ b/browser/main/Detail/index.js @@ -33,26 +33,6 @@ class Detail extends React.Component { ee.off('detail:delete', this.deleteHandler) } - confirmDeletion (permanent) { - if (this.props.config.ui.confirmDeletion || permanent) { - const electron = require('electron') - const { remote } = electron - const { dialog } = remote - - const alertConfig = { - type: 'warning', - message: i18n.__('Confirm note deletion'), - detail: i18n.__('This will permanently remove this note.'), - buttons: [i18n.__('Confirm'), i18n.__('Cancel')] - } - - const dialogueButtonIndex = dialog.showMessageBox(remote.getCurrentWindow(), alertConfig) - return dialogueButtonIndex === 0 - } - - return true - } - render () { const { location, data, config } = this.props let note = null