From a6e3dbd825ccf9a5380098b587f67ecc5157a94e Mon Sep 17 00:00:00 2001 From: Dick Choi Date: Thu, 21 Jul 2016 23:44:00 +0900 Subject: [PATCH] change folder --- browser/main/Detail/FolderSelect.js | 10 ++--- browser/main/Detail/MarkdownNoteDetail.js | 45 ++++++++++++++++++----- browser/main/Detail/SnippetNoteDetail.js | 30 +++++++++++++++ browser/main/Detail/index.js | 7 +++- browser/main/lib/dataApi.js | 39 ++++++++++++++++++-- browser/main/store.js | 7 ++++ 6 files changed, 118 insertions(+), 20 deletions(-) diff --git a/browser/main/Detail/FolderSelect.js b/browser/main/Detail/FolderSelect.js index a937275a..dd23616c 100644 --- a/browser/main/Detail/FolderSelect.js +++ b/browser/main/Detail/FolderSelect.js @@ -166,20 +166,20 @@ class FolderSelect extends React.Component { } } - handleOptionClick (folderKey) { + handleOptionClick (storageKey, folderKey) { return (e) => { e.stopPropagation() this.setState({ status: 'FOCUS' }, () => { - this.setValue(folderKey) + this.setValue(storageKey + '-' + folderKey) this.refs.root.focus() }) } } - setValue (folderKey) { - this.value = folderKey + setValue (value) { + this.value = value this.props.onChange() } @@ -208,7 +208,7 @@ class FolderSelect extends React.Component { : 'search-optionList-item' } key={option.storage.key + '-' + option.folder.key} - onClick={(e) => this.handleOptionClick(option.folder.key)(e)} + onClick={(e) => this.handleOptionClick(option.storage.key, option.folder.key)(e)} > { this.refs.content.reload() this.refs.tags.reset() @@ -114,7 +110,36 @@ class MarkdownNoteDetail extends React.Component { } handleFolderChange (e) { + let { note } = this.state + let value = this.refs.folder.value + let splitted = value.split('-') + let newStorageKey = splitted.shift() + let newFolderKey = splitted.shift() + dataApi + .moveNote(note.storage, note.folder, note.key, newStorageKey, newFolderKey) + .then((newNote) => { + this.setState({ + isMovingNote: true, + note: Object.assign({}, newNote) + }, () => { + let { dispatch, location } = this.props + dispatch({ + type: 'MOVE_NOTE', + note: note, + newNote: newNote + }) + hashHistory.replace({ + pathname: location.pathname, + query: { + key: newNote.uniqueKey + } + }) + this.setState({ + isMovingNote: false + }) + }) + }) } handleStarButtonClick (e) { diff --git a/browser/main/Detail/SnippetNoteDetail.js b/browser/main/Detail/SnippetNoteDetail.js index d6181b67..b3bb6443 100644 --- a/browser/main/Detail/SnippetNoteDetail.js +++ b/browser/main/Detail/SnippetNoteDetail.js @@ -8,6 +8,7 @@ import FolderSelect from './FolderSelect' import Commander from 'browser/main/lib/Commander' import dataApi from 'browser/main/lib/dataApi' import modes from 'browser/lib/modes' +import { hashHistory } from 'react-router' const electron = require('electron') const { remote } = electron @@ -118,7 +119,36 @@ class SnippetNoteDetail extends React.Component { } handleFolderChange (e) { + let { note } = this.state + let value = this.refs.folder.value + let splitted = value.split('-') + let newStorageKey = splitted.shift() + let newFolderKey = splitted.shift() + dataApi + .moveNote(note.storage, note.folder, note.key, newStorageKey, newFolderKey) + .then((newNote) => { + this.setState({ + isMovingNote: true, + note: Object.assign({}, newNote) + }, () => { + let { dispatch, location } = this.props + dispatch({ + type: 'MOVE_NOTE', + note: note, + newNote: newNote + }) + hashHistory.replace({ + pathname: location.pathname, + query: { + key: newNote.uniqueKey + } + }) + this.setState({ + isMovingNote: false + }) + }) + }) } handleStarButtonClick (e) { diff --git a/browser/main/Detail/index.js b/browser/main/Detail/index.js index 22239ccf..c9139ce5 100644 --- a/browser/main/Detail/index.js +++ b/browser/main/Detail/index.js @@ -4,6 +4,7 @@ import styles from './Detail.styl' import _ from 'lodash' import MarkdownNoteDetail from './MarkdownNoteDetail' import SnippetNoteDetail from './SnippetNoteDetail' +import dataApi from 'browser/main/lib/dataApi' const electron = require('electron') @@ -51,7 +52,8 @@ class Detail extends React.Component { 'dispatch', 'storages', 'style', - 'ignorePreviewPointerEvents' + 'ignorePreviewPointerEvents', + 'location' ])} /> ) @@ -65,7 +67,8 @@ class Detail extends React.Component { 'dispatch', 'storages', 'style', - 'ignorePreviewPointerEvents' + 'ignorePreviewPointerEvents', + 'location' ])} /> ) diff --git a/browser/main/lib/dataApi.js b/browser/main/lib/dataApi.js index 10362b64..010e03d4 100644 --- a/browser/main/lib/dataApi.js +++ b/browser/main/lib/dataApi.js @@ -18,12 +18,15 @@ function queueSaveFolder (storageKey, folderKey) { clearTimeout(task.timer) }) queuedTasks = queuedTasks.filter((task) => task.storage !== storageKey || task.folder !== folderKey) - let newTimer = setTimeout(() => { let folderNotes = notes.filter((note) => note.storage === storageKey && note.folder === folderKey) sander .writeFile(path.join(storage.cache.path, folderKey, 'data.json'), JSON.stringify({ - notes: folderNotes + notes: folderNotes.map((note) => { + let json = note.toJSON() + delete json.storage + return json + }) })) }, 1500) @@ -398,6 +401,35 @@ function removeNote (storageKey, folderKey, noteKey, input) { } +function moveNote (storageKey, folderKey, noteKey, newStorageKey, newFolderKey) { + let note = _.find(notes, { + key: noteKey, + storage: storageKey, + folder: folderKey + }) + if (note == null) throw new Error('Note doesn\'t exist.') + + let storage = _.find(storages, {key: newStorageKey}) + if (storage == null) throw new Error('Storage doesn\'t exist.') + let folder = _.find(storage.data.folders, {key: newFolderKey}) + if (folder == null) throw new Error('Folder doesn\'t exist.') + note.storage = storage.key + note.data.storage = storage.key + note.folder = folder.key + note.data.folder = folder.key + let key = note.key + while (notes.some((note) => note.storage === storage.key && note.folder === folder.key && note.key === key)) { + key = keygen() + } + note.key = key + note.data.key = key + note.uniqueKey = `${note.storage}-${note.folder}-${note.key}` + console.log(note.uniqueKey) + queueSaveFolder(storageKey, folderKey) + return note.save() + .then(() => note.toJSON()) +} + export default { init, addStorage, @@ -408,5 +440,6 @@ export default { createMarkdownNote, createSnippetNote, updateNote, - removeNote + removeNote, + moveNote } diff --git a/browser/main/store.js b/browser/main/store.js index 93060405..85dac683 100644 --- a/browser/main/store.js +++ b/browser/main/store.js @@ -79,6 +79,13 @@ function notes (state = [], action) { notes.push(action.note) return notes } + case 'MOVE_NOTE': + { + let notes = state.slice() + notes = notes.filter((note) => note.key !== action.note.key || note.folder !== action.note.folder || note.storage !== action.note.storage) + notes.push(action.newNote) + return notes + } } return state }