From 9d32d89217d9465e0ba2b7e6d5b44480400eb293 Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Thu, 5 Jan 2017 06:00:54 +0900 Subject: [PATCH 01/24] Clean Lint issue and Update gh-pages --- gh-pages | 2 +- src/components/CodeEditor.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gh-pages b/gh-pages index 765e1661cf..abd4b511f2 160000 --- a/gh-pages +++ b/gh-pages @@ -1 +1 @@ -Subproject commit 765e1661cf977576d1f6a55d9546eaaa2ad089ed +Subproject commit abd4b511f242893000b929892d9443d4a1585e1e diff --git a/src/components/CodeEditor.js b/src/components/CodeEditor.js index c8bd6cd5c2..7af14c5334 100644 --- a/src/components/CodeEditor.js +++ b/src/components/CodeEditor.js @@ -194,14 +194,14 @@ class CodeEditor extends React.Component { checkTaskItem (line) { const splitted = this.codemirror.getValue().split('\n') - const match = /- \[(x| )\]/.exec(splitted[line - 1]) + const match = /- \[(x| )]/.exec(splitted[line - 1]) if (!match) return if (match[1] === 'x') { - splitted[line - 1] = splitted[line - 1].replace(/- \[x\]/, '- [ ]') + splitted[line - 1] = splitted[line - 1].replace(/- \[x]/, '- [ ]') } else { - splitted[line - 1] = splitted[line - 1].replace(/- \[ \]/, '- [x]') + splitted[line - 1] = splitted[line - 1].replace(/- \[ ]/, '- [x]') } this.codemirror.setValue(splitted.join('\n')) From 51c32eca2d827e9d1ac589c74e2b60fd0c6b3598 Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Thu, 5 Jan 2017 06:06:02 +0900 Subject: [PATCH 02/24] Bump up to v0.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 222f310228..1e6b472277 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "inpad", "productName": "Inpad", - "version": "0.1.0", + "version": "0.2.0", "description": "A Polished Notes App with Github Flavored Markdown", "main": "app/index.js", "repository": { From 4e7edbeca17f02ccbdf216c90dc2caab4711564d Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Fri, 6 Jan 2017 12:33:07 +0900 Subject: [PATCH 03/24] :art: Add Loading screen --- app/lib/main.html | 38 ++++++++++++++++++++++++++++++++++-- app/lib/main.production.html | 38 ++++++++++++++++++++++++++++++++++-- src/main/Main.js | 17 +++++++++++----- 3 files changed, 84 insertions(+), 9 deletions(-) diff --git a/app/lib/main.html b/app/lib/main.html index 133a177e22..7a4dad68aa 100644 --- a/app/lib/main.html +++ b/app/lib/main.html @@ -10,6 +10,9 @@ +
+ +

Loading...

+
diff --git a/app/lib/main.production.html b/app/lib/main.production.html index a0acb3ac25..e19142ab56 100644 --- a/app/lib/main.production.html +++ b/app/lib/main.production.html @@ -10,6 +10,9 @@ +
+ +

Loading...

+
diff --git a/src/main/Main.js b/src/main/Main.js index fcd7c24baa..581d8aab89 100644 --- a/src/main/Main.js +++ b/src/main/Main.js @@ -9,6 +9,10 @@ import { NAV_MIN_WIDTH } from 'lib/consts' import ipc from './lib/ipc' import NoteList from './NoteList' +function hideLoadingScreen () { + document.body.removeChild(document.getElementById('loading')) +} + const { remote } = require('electron') const Root = styled.div` @@ -108,13 +112,16 @@ class Main extends React.Component { dataAPI.loadAllStorages() .then(storageMap => { - dispatch({ - type: 'LOAD_ALL_STORAGES', - payload: { - storageMap - } + return dispatch(disaptch => { + dispatch({ + type: 'LOAD_ALL_STORAGES', + payload: { + storageMap + } + }) }) }) + .then(hideLoadingScreen) } componentWillUnmount () { From 5438f03ec92219cf8f4bbd602c5e7c5ca568d774 Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Fri, 6 Jan 2017 12:36:49 +0900 Subject: [PATCH 04/24] :art: set dracula as a default codemirror theme --- src/lib/consts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/consts.js b/src/lib/consts.js index de0f7aaf18..086340f4f5 100644 --- a/src/lib/consts.js +++ b/src/lib/consts.js @@ -20,14 +20,14 @@ export const DEFAULT_CONFIG = new Map({ editorFontSize: 14, editorFontFamily: 'Consolas, "Liberation Mono", Menlo, Courier', - editorTheme: 'default', + editorTheme: 'dracula', // space, tab editorIndentStyle: 'space', editorIndentSize: 2, previewFontSize: 14, previewFontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial', - previewCodeBlockTheme: 'default', + previewCodeBlockTheme: 'dracula', previewCodeBlockFontFamily: 'Consolas, "Liberation Mono", Menlo, Courier' }) From b31b3de7fe31d309caa960f82cbfcdbc841faf2a Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Fri, 6 Jan 2017 16:51:33 +0900 Subject: [PATCH 05/24] :art: Update loading screen style --- app/lib/main.html | 11 +++++++---- app/lib/main.production.html | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/app/lib/main.html b/app/lib/main.html index 7a4dad68aa..e2718a264a 100644 --- a/app/lib/main.html +++ b/app/lib/main.html @@ -23,13 +23,13 @@ } @keyframes pulse { 0% { - transform: scale(0.95); + opacity: 0.6; } 50% { - transform: scale(1.05); + opacity: 0.9; } 100% { - transform: scale(0.95); + opacity: 0.6; } } #loading { @@ -46,10 +46,13 @@ background-color: white; } #loading img { - animation: pulse 1s ease-in-out infinite; + animation: pulse 1.5s ease-in-out infinite; } #loading p { font-size: 24px; + color: gray; + animation: pulse 1.5s ease-in-out infinite; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } diff --git a/app/lib/main.production.html b/app/lib/main.production.html index e19142ab56..f9d818b9f8 100644 --- a/app/lib/main.production.html +++ b/app/lib/main.production.html @@ -23,13 +23,13 @@ } @keyframes pulse { 0% { - transform: scale(0.95); + opacity: 0.6; } 50% { - transform: scale(1.05); + opacity: 0.9; } 100% { - transform: scale(0.95); + opacity: 0.6; } } #loading { @@ -46,10 +46,13 @@ background-color: white; } #loading img { - animation: pulse 1s ease-in-out infinite; + animation: pulse 1.5s ease-in-out infinite; } #loading p { font-size: 24px; + color: gray; + animation: pulse 1.5s ease-in-out infinite; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } From 4423f43a75877c835710ff8cdaeda6c208cb33ea Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Sat, 7 Jan 2017 16:38:50 +0900 Subject: [PATCH 06/24] :shirt: Lint Add todo parser --- docs/development/database.md | 10 ++++++---- package.json | 6 ++++-- specs/main/lib/data/renameFolder.spec.js | 2 +- src/main/NoteList/Detail.js | 2 +- src/main/lib/dataAPI/createNote.js | 4 ++-- src/main/lib/dataAPI/deleteFolder.js | 8 ++++---- src/main/lib/dataAPI/loadStorage.js | 2 +- src/main/lib/dataAPI/renameFolder.js | 4 ++-- src/main/lib/dataAPI/updateNote.js | 2 +- src/main/lib/dataAPI/upsertFolder.js | 2 +- src/main/lib/redux/reducers/storageMap.js | 2 +- tools/webpack-test.html | 2 -- 12 files changed, 24 insertions(+), 22 deletions(-) diff --git a/docs/development/database.md b/docs/development/database.md index ae18c3ede7..408bc92325 100644 --- a/docs/development/database.md +++ b/docs/development/database.md @@ -27,7 +27,7 @@ type | conventions -------|-------------------- Note | `note:$RANDOM_HASH$` Folder | `folder:$PATH_OF_FOLDER$` -Tag | `tag:$TAG$` +Tag | `tag:$TAG_NAME$` ### `$RANDOM_HASH$` @@ -37,11 +37,13 @@ This is a string of 10 Random bytes. It can be issued easily by `main/lib/util.r ### `$PATH_OF_FOLDERS$` -This string should be a valid path. When creating a folder, the app will convert it into a valid path if it is invalid. +This string should be a valid path for Unix. `/` character will be used for seperating directory components. -### `$TAG$` +When creating a folder, the app will convert it into a valid path if it is invalid. -Tag is a lowcased alphanumeric string. Spaces will be replaced with `_`. +### `$TAG_NAME$` + +Any character can be used for tag name. ## Schemes diff --git a/package.json b/package.json index 1e6b472277..c7fb697452 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "description": "A Polished Notes App with Github Flavored Markdown", "main": "app/index.js", "repository": { - "type" : "git", - "url" : "https://github.com/Sarah-Seo/Inpad.git" + "type": "git", + "url": "https://github.com/Sarah-Seo/Inpad.git" }, "scripts": { "start": "electron app/index.js", @@ -18,6 +18,7 @@ "shasum": "shasum -a 256 dist/mac/Inpad-$npm_package_version.dmg", "lint": "standard", "webpack": "NODE_ENV=development webpack-dev-server --config webpack.config.js", + "todo": "fixme -i 'compiled/**' -i 'dist/**' -i 'resources/**' -i 'node_modules/**'", "test:run": "NODE_ENV=test electron ./tools/webpack-test.js", "test:serve": "NODE_ENV=test webpack-dev-server --config webpack.config.js", "rebuild": "electron-rebuild" @@ -49,6 +50,7 @@ "extract-text-webpack-plugin": "^2.0.0-beta.4", "file-loader": "^0.9.0", "filenamify": "^1.2.1", + "fixme": "^0.4.2", "immutable": "^3.8.1", "json-loader": "^0.5.4", "lodash": "^4.16.6", diff --git a/specs/main/lib/data/renameFolder.spec.js b/specs/main/lib/data/renameFolder.spec.js index 8956cb7484..0ac8b98791 100644 --- a/specs/main/lib/data/renameFolder.spec.js +++ b/specs/main/lib/data/renameFolder.spec.js @@ -53,7 +53,7 @@ export default t => { }) .then(fetchFolder) .then(res => { - t.fail('The folder should not exist.') + t.fail('The folder must not exist.') }) .catch(err => { if (err.name !== 'not_found') { diff --git a/src/main/NoteList/Detail.js b/src/main/NoteList/Detail.js index 1da71ccc5e..e17014ffba 100644 --- a/src/main/NoteList/Detail.js +++ b/src/main/NoteList/Detail.js @@ -59,7 +59,7 @@ class Detail extends React.Component { const nextNoteKey = nextProps.noteKey const { noteKey } = this.props - // Note changed + // If note switched, save current note and refresh inputs if (nextNoteKey !== noteKey) { if (noteKey != null) { this.dispatchUpdate() diff --git a/src/main/lib/dataAPI/createNote.js b/src/main/lib/dataAPI/createNote.js index 2fd9ed914c..82cd826b12 100644 --- a/src/main/lib/dataAPI/createNote.js +++ b/src/main/lib/dataAPI/createNote.js @@ -11,7 +11,7 @@ export default function createNote (storageName, payload) { function genNoteId () { let id = util.randomBytes() return db.get(NOTE_ID_PREFIX + id) - .then((doc) => { + .then(doc => { if (doc == null) return id return genNoteId() }) @@ -24,7 +24,7 @@ export default function createNote (storageName, payload) { const now = new Date().toJSON() return genNoteId() - .then((noteId) => { + .then(noteId => { return db .put(Object.assign({}, payload, { _id: NOTE_ID_PREFIX + noteId, diff --git a/src/main/lib/dataAPI/deleteFolder.js b/src/main/lib/dataAPI/deleteFolder.js index 8e98ed4c51..0d6aba218c 100644 --- a/src/main/lib/dataAPI/deleteFolder.js +++ b/src/main/lib/dataAPI/deleteFolder.js @@ -8,16 +8,16 @@ export default function deleteFolder (storageName, folderName) { const db = getDB(storageName) return db .get(FOLDER_ID_PREFIX + folderName) - .then((doc) => { + .then(doc => { doc._deleted = true return db.put(doc) }) - .then(() => { + .then(res => { return db.put(noteView) .catch(err => { if (err.name !== 'conflict') throw err }) - .then(() => { + .then(res => { return db.query('notes/by_folder', { key: folderName, include_docs: true @@ -31,7 +31,7 @@ export default function deleteFolder (storageName, folderName) { return db.bulkDocs(docs) }) }) - .then((res) => { + .then(res => { return { id: folderName } diff --git a/src/main/lib/dataAPI/loadStorage.js b/src/main/lib/dataAPI/loadStorage.js index 3523d30eaa..0f6ecf7825 100644 --- a/src/main/lib/dataAPI/loadStorage.js +++ b/src/main/lib/dataAPI/loadStorage.js @@ -19,7 +19,7 @@ import { export default function loadStorage (name) { return getDB(name) .allDocs({include_docs: true}) - .then((data) => { + .then(data => { let { noteMap, folderMap, tagMap } = data.rows.reduce((sum, row) => { if (isNoteId.test(row.id)) { let noteId = row.id.substring(NOTE_ID_PREFIX.length) diff --git a/src/main/lib/dataAPI/renameFolder.js b/src/main/lib/dataAPI/renameFolder.js index aa3495a2a0..3c79694c6e 100644 --- a/src/main/lib/dataAPI/renameFolder.js +++ b/src/main/lib/dataAPI/renameFolder.js @@ -24,7 +24,7 @@ export default function renameFolder (name, folderName, newFolderName) { _id: FOLDER_ID_PREFIX + newFolderName }, doc)) }) - .then(() => { + .then(res => { return db.put(noteView) .catch(err => { if (err.name !== 'conflict') throw err @@ -43,7 +43,7 @@ export default function renameFolder (name, folderName, newFolderName) { return db.bulkDocs(docs) }) }) - .then((res) => { + .then(res => { return { id: folderName } diff --git a/src/main/lib/dataAPI/updateNote.js b/src/main/lib/dataAPI/updateNote.js index 76a0f07008..6d8f955a66 100644 --- a/src/main/lib/dataAPI/updateNote.js +++ b/src/main/lib/dataAPI/updateNote.js @@ -9,7 +9,7 @@ export default function updateNote (storageName, noteId, payload) { const db = getDB(storageName) return db.get(NOTE_ID_PREFIX + noteId) - .then((doc) => { + .then(doc => { payload = Object.assign({}, doc, _.pick(payload, ['meta', 'content', 'tags', 'folder']), { diff --git a/src/main/lib/dataAPI/upsertFolder.js b/src/main/lib/dataAPI/upsertFolder.js index 4c78d272ab..88fd139418 100644 --- a/src/main/lib/dataAPI/upsertFolder.js +++ b/src/main/lib/dataAPI/upsertFolder.js @@ -8,7 +8,7 @@ export default function upsertFolder (storageName, folderName) { const db = getDB(storageName) return db .get(FOLDER_ID_PREFIX + folderName) - .catch((err) => { + .catch(err => { if (err.name === 'not_found') return {} throw err }) diff --git a/src/main/lib/redux/reducers/storageMap.js b/src/main/lib/redux/reducers/storageMap.js index c2123b3d31..d7a3f60471 100644 --- a/src/main/lib/redux/reducers/storageMap.js +++ b/src/main/lib/redux/reducers/storageMap.js @@ -112,7 +112,7 @@ function storageMap (state = defaultStorageMap, action) { noteId ], note) - // note is moved to another folder + // move note if folder changed if (oldNote.get('folder') !== note.get('folder')) { state = state.updateIn([ storageName, diff --git a/tools/webpack-test.html b/tools/webpack-test.html index e79cf894c3..474eb07272 100644 --- a/tools/webpack-test.html +++ b/tools/webpack-test.html @@ -26,8 +26,6 @@
- - From 02a09568888b7fb64988bc715c4d224619e87bfc Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Sat, 7 Jan 2017 16:39:09 +0900 Subject: [PATCH 07/24] :fire: Remove unused resources --- resources/dmg.png | Bin 23851 -> 0 bytes resources/dmg@2x.png | Bin 58556 -> 0 bytes resources/install.gif | Bin 184821 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/dmg.png delete mode 100644 resources/dmg@2x.png delete mode 100644 resources/install.gif diff --git a/resources/dmg.png b/resources/dmg.png deleted file mode 100644 index 682118bb96b048e990b7131b6d4daa03a86aba07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23851 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 a^E%hkRX&>~ngKrw{)`RH4NCP~BK`?lTU@vR diff --git a/resources/dmg@2x.png b/resources/dmg@2x.png deleted file mode 100644 index f8d17150ae4bf90b7b32c6613ea7028a2ec4b81b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58556 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 In9c3~2lI+KQUCw| diff --git a/resources/install.gif b/resources/install.gif deleted file mode 100644 index b0520e64c93209b36b1214db9e3d02d13cf1ceae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184821 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 z 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�yzascz9E4xL*6(@{D&d?0Y9)rG-^u05 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 WBSlvJV=Mi31}HwC;^Dx+U=09V&NdwY From fc426ec1f8b61c9b454b92f6fa0eaafde6ee3037 Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Sat, 7 Jan 2017 16:40:02 +0900 Subject: [PATCH 08/24] :art: Trim result when stripping node --- specs/lib/markdown.spec.js | 12 ++++++------ src/lib/metaMapper.js | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/specs/lib/markdown.spec.js b/specs/lib/markdown.spec.js index 67a326ea88..3c9de21e9d 100644 --- a/specs/lib/markdown.spec.js +++ b/specs/lib/markdown.spec.js @@ -41,20 +41,20 @@ $$$ export default t => { let parsed1 = markdown.parse(rawString1) - t.equal(parsed1.data.title, '😄 This is a title\n') - t.equal(parsed1.data.preview, 'Preview line\n') + t.equal(parsed1.data.title, '😄 This is a title') + t.equal(parsed1.data.preview, 'Preview line') let parsed2 = markdown.parse(rawString2) - t.equal(parsed2.data.title, 'This should be title\n') - t.equal(parsed2.data.preview, 'this should be a previewed content\n') + t.equal(parsed2.data.title, 'This should be title') + t.equal(parsed2.data.preview, 'this should be a previewed content') let parsed3 = markdown.parse('') t.equal(parsed3.data.title, '') t.equal(parsed3.data.preview, '') let parsed4 = markdown.parse(rawString4) - t.equal(parsed4.data.title, 'Awesome Electron Awesome\n') - t.equal(parsed4.data.preview, 'Useful resources for creating apps with Electron\n') + t.equal(parsed4.data.title, 'Awesome Electron Awesome') + t.equal(parsed4.data.preview, 'Useful resources for creating apps with Electron') // let parsedMath = markdown.parse(mathString) // console.log(parsedMath.toString()) diff --git a/src/lib/metaMapper.js b/src/lib/metaMapper.js index 537c0801e4..9be19a51b8 100644 --- a/src/lib/metaMapper.js +++ b/src/lib/metaMapper.js @@ -9,7 +9,7 @@ function stripNode (node) { return '' } - return parser.process(parser.stringify(JSON.parse(JSON.stringify(node)))).toString() + return parser.process(parser.stringify(JSON.parse(JSON.stringify(node)))).toString().trim() } /** From 447d84a4e505378d4873f134385a62849ab93947 Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Sat, 7 Jan 2017 16:41:02 +0900 Subject: [PATCH 09/24] :art: Set Octicon to use current color by default --- src/components/Octicon.js | 1 + src/lib/themes.js | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/components/Octicon.js b/src/components/Octicon.js index 839d71bf6e..d08b828077 100644 --- a/src/components/Octicon.js +++ b/src/components/Octicon.js @@ -21,6 +21,7 @@ const Root = styled.svg` width: 1em; height: 1em; vertical-align: middle; + fill: currentColor; ${p => p.pulse ? pulseStyle : ''} ` diff --git a/src/lib/themes.js b/src/lib/themes.js index 896e3af9d0..99abd9af9e 100644 --- a/src/lib/themes.js +++ b/src/lib/themes.js @@ -55,9 +55,6 @@ const defaultTheme = { opacity: 0.5; cursor: not-allowed; } - .Octicon { - fill: ${defaultUIColor}; - } ` } From d1fa7b635962a08c7e40a6a58d05ab6ce8c3d143 Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Sat, 7 Jan 2017 17:21:14 +0900 Subject: [PATCH 10/24] :art: Update dataApi for tags --- specs/main/lib/data/createNote.spec.js | 13 ++-- specs/main/lib/data/deleteTag.spec.js | 55 +++++++++++++++ specs/main/lib/data/renameTag.spec.js | 98 ++++++++++++++++++++++++++ specs/main/lib/data/upsertTag.spec.js | 28 ++++++++ specs/utils/DummyDB.js | 19 ++++- src/main/lib/dataAPI/consts.js | 9 +++ src/main/lib/dataAPI/deleteTag.js | 41 +++++++++++ src/main/lib/dataAPI/index.js | 8 ++- src/main/lib/dataAPI/renameTag.js | 62 ++++++++++++++++ src/main/lib/dataAPI/upsertTag.js | 26 +++++++ 10 files changed, 351 insertions(+), 8 deletions(-) create mode 100644 specs/main/lib/data/deleteTag.spec.js create mode 100644 specs/main/lib/data/renameTag.spec.js create mode 100644 specs/main/lib/data/upsertTag.spec.js create mode 100644 src/main/lib/dataAPI/deleteTag.js create mode 100644 src/main/lib/dataAPI/renameTag.js create mode 100644 src/main/lib/dataAPI/upsertTag.js diff --git a/specs/main/lib/data/createNote.spec.js b/specs/main/lib/data/createNote.spec.js index 0f0d0a9cfb..c921d31bb9 100644 --- a/specs/main/lib/data/createNote.spec.js +++ b/specs/main/lib/data/createNote.spec.js @@ -7,11 +7,13 @@ import { const dbName = __filename const db = new DummyDB(dbName) +const folderName = 'Test Folder' +const tagName = 'test_tag' const note = { meta: {}, content: 'test', - tags: ['test_tag'], - folder: 'Notes', + tags: [tagName], + folder: folderName, createdAt: new Date(), updatedAt: new Date() } @@ -23,14 +25,15 @@ function fetchNote (noteId) { export default t => { return createNote(dbName, note) .then(res => { - t.equal(res.note.get('content'), 'test') + t.equal(res.note.get('content'), note.content) return res.id }) .then(fetchNote) .then(res => { t.ok(res != null) - t.equal(res.content, 'test') - t.equal(res.tags[0], 'test_tag') + t.equal(res.content, note.content) + t.equal(res.folder, folderName) + t.equal(res.tags[0], tagName) }) } diff --git a/specs/main/lib/data/deleteTag.spec.js b/specs/main/lib/data/deleteTag.spec.js new file mode 100644 index 0000000000..9f83863e12 --- /dev/null +++ b/specs/main/lib/data/deleteTag.spec.js @@ -0,0 +1,55 @@ +import deleteTag from 'main/lib/dataAPI/deleteTag' +import DummyDB from 'specs/utils/DummyDB' +import { + FOLDER_ID_PREFIX +} from 'main/lib/dataAPI/consts' + +const dbName = __filename +const db = new DummyDB(dbName) + +const tagName = 'Testt Tag' +const noteId = 'testnote' +const note = { + title: 'test', + content: 'test\ncontent', + tags: ['test_tag'], + tag: tagName +} + +function createDummyTag () { + return db.createTag(tagName) +} + +function createDummyNote () { + return db.createNote(noteId, note) +} + +function fetchTag () { + return db + .get(FOLDER_ID_PREFIX + tagName) +} + +export const before = t => { + return createDummyTag() + .then(createDummyNote) +} + +export default t => { + return deleteTag(dbName, tagName) + .then(tag => { + t.equal(tag.id, tagName) + }) + .then(fetchTag) + .then(res => { + t.fail('The tag should not exist.') + }) + .catch(err => { + if (err.name !== 'not_found') { + throw err + } + }) +} + +export const after = t => { + return db.destory() +} diff --git a/specs/main/lib/data/renameTag.spec.js b/specs/main/lib/data/renameTag.spec.js new file mode 100644 index 0000000000..c5c43e591c --- /dev/null +++ b/specs/main/lib/data/renameTag.spec.js @@ -0,0 +1,98 @@ +import renameTag from 'main/lib/dataAPI/renameTag' +import DummyDB from 'specs/utils/DummyDB' +import { + TAG_ID_PREFIX, + NOTE_ID_PREFIX +} from 'main/lib/dataAPI/consts' + +const dbName = __filename +const db = new DummyDB(dbName) + +const tagName = 'Test Tag' +const newTagName = 'Renamed Tag' +const noteId = 'testnote' +const note = { + title: 'test', + content: 'test\ncontent', + tags: [tagName], + folder: 'Notes' +} +const anotherNoteId = 'anothernote' +const anotherNote = { + title: 'tesasdfasdft', + content: 'tesasdfasdft\ncontent', + tags: [tagName], + folder: 'Notes' +} + +function createDummyTag () { + return db.createTag(tagName) +} + +function createDummyNote () { + return db.createNote(noteId, note) +} + +function createAnotherDummyNote () { + return db.createNote(anotherNoteId, anotherNote) +} + +function fetchTag () { + return db + .get(TAG_ID_PREFIX + tagName) +} + +function fetchRenamedTag () { + return db + .get(TAG_ID_PREFIX + newTagName) +} + +function fetchNote () { + return db + .get(NOTE_ID_PREFIX + noteId) +} + +function fetchAnotherNote () { + return db + .get(NOTE_ID_PREFIX + anotherNoteId) +} + +export const before = t => { + return createDummyTag() + .then(createDummyNote) + .then(createAnotherDummyNote) +} + +export default t => { + return renameTag(dbName, tagName, newTagName) + .then(tag => { + t.equal(tag.id, tagName) + }) + .then(fetchTag) + .then(res => { + t.fail('The tag must be deleted.') + }) + .catch(err => { + if (err.name !== 'not_found') { + throw err + } + }) + .then(fetchNote) + .then(res => { + t.ok(res.tags.indexOf(tagName) === -1) + t.ok(res.tags.indexOf(newTagName) > -1) + }) + .then(fetchAnotherNote) + .then(res => { + t.ok(res.tags.indexOf(tagName) === -1) + t.ok(res.tags.indexOf(newTagName) > -1) + }) + .then(fetchRenamedTag) + .then(res => { + t.equal(res._id, TAG_ID_PREFIX + newTagName) + }) +} + +export const after = t => { + return db.destory() +} diff --git a/specs/main/lib/data/upsertTag.spec.js b/specs/main/lib/data/upsertTag.spec.js new file mode 100644 index 0000000000..38eab6896b --- /dev/null +++ b/specs/main/lib/data/upsertTag.spec.js @@ -0,0 +1,28 @@ +import upsertTag from 'main/lib/dataAPI/upsertTag' +import DummyDB from 'specs/utils/DummyDB' +import { + TAG_ID_PREFIX +} from 'main/lib/dataAPI/consts' + +const dbName = __filename +const db = new DummyDB(dbName) + +function fetchTag () { + return db + .get(TAG_ID_PREFIX + 'Test_tag') +} + +export default t => { + return upsertTag(dbName, 'Test_tag') + .then(tag => { + t.equal(tag.id, 'Test_tag') + }) + .then(fetchTag) + .then(res => { + t.ok(res != null) + }) +} + +export const after = t => { + return db.destory() +} diff --git a/specs/utils/DummyDB.js b/specs/utils/DummyDB.js index aa49683d14..ec361bbaa5 100644 --- a/specs/utils/DummyDB.js +++ b/specs/utils/DummyDB.js @@ -1,5 +1,6 @@ import { FOLDER_ID_PREFIX, + TAG_ID_PREFIX, NOTE_ID_PREFIX } from 'main/lib/dataAPI/consts' import PouchDB from 'lib/PouchDB' @@ -17,7 +18,7 @@ class DummyDB { createFolder (folderName, overrides) { return this.db .get(FOLDER_ID_PREFIX + folderName) - .catch((err) => { + .catch(err => { if (err.name === 'not_found') return {} throw err }) @@ -28,6 +29,20 @@ class DummyDB { }) } + createTag (tagName, overrides) { + return this.db + .get(TAG_ID_PREFIX + tagName) + .catch(err => { + if (err.name === 'not_found') return {} + throw err + }) + .then(doc => { + return this.db.put(Object.assign({}, doc, overrides, { + _id: TAG_ID_PREFIX + tagName + })) + }) + } + createNote (noteId, overrides) { overrides = Object.assign({ meta: {}, @@ -46,7 +61,7 @@ class DummyDB { return this.db .get(NOTE_ID_PREFIX + noteId) - .catch((err) => { + .catch(err => { if (err.name === 'not_found') return {} throw err }) diff --git a/src/main/lib/dataAPI/consts.js b/src/main/lib/dataAPI/consts.js index 97ccb3c642..7f7c768b09 100644 --- a/src/main/lib/dataAPI/consts.js +++ b/src/main/lib/dataAPI/consts.js @@ -13,6 +13,15 @@ export const noteView = { map: `function mapFun(doc) { emit(doc.folder); }` + }, + by_tag: { + map: `function mapFun(doc) { + if (Array.isArray(doc.tags)) { + doc.tags.forEach(tag => { + emit(tag) + }) + } + }` } } } diff --git a/src/main/lib/dataAPI/deleteTag.js b/src/main/lib/dataAPI/deleteTag.js new file mode 100644 index 0000000000..bde2568cf1 --- /dev/null +++ b/src/main/lib/dataAPI/deleteTag.js @@ -0,0 +1,41 @@ +import { getDB } from './context' +import { + TAG_ID_PREFIX, + noteView +} from './consts' + +export default function deleteTag (storageName, tagName) { + const db = getDB(storageName) + return db + .get(TAG_ID_PREFIX + tagName) + .then(doc => { + doc._deleted = true + return db.put(doc) + }) + .then(res => { + return db.put(noteView) + .catch(err => { + if (err.name !== 'conflict') throw err + }) + .then(res => { + return db.query('notes/by_tag', { + key: tagName, + include_docs: true + }) + }) + .then(function (result) { + let docs = result.rows.map(row => { + row.doc.tags = row.doc.tags + .filter(tag => tag !== tagName) + + return row.doc + }) + return db.bulkDocs(docs) + }) + }) + .then((res) => { + return { + id: tagName + } + }) +} diff --git a/src/main/lib/dataAPI/index.js b/src/main/lib/dataAPI/index.js index a24632e8e2..159cdce6fc 100644 --- a/src/main/lib/dataAPI/index.js +++ b/src/main/lib/dataAPI/index.js @@ -6,6 +6,9 @@ import renameFolder from './renameFolder' import createNote from './createNote' import updateNote from './updateNote' import deleteNote from './deleteNote' +import upsertTag from './upsertTag' +import renameTag from './renameTag' +import deleteTag from './deleteTag' export default { loadStorage, @@ -15,5 +18,8 @@ export default { renameFolder, createNote, updateNote, - deleteNote + deleteNote, + upsertTag, + renameTag, + deleteTag } diff --git a/src/main/lib/dataAPI/renameTag.js b/src/main/lib/dataAPI/renameTag.js new file mode 100644 index 0000000000..9f9abf286c --- /dev/null +++ b/src/main/lib/dataAPI/renameTag.js @@ -0,0 +1,62 @@ +/** + * TODO: Rename tag + * 1. find all notes with target tag + * 2. delete old tag + * 3. create new tag + * 4. apply to notes + */ + +import { getDB } from './context' +import { + TAG_ID_PREFIX, + noteView +} from './consts' + +export default function renameTag (name, tagName, newTagName) { + const db = getDB(name) + return db + .get(TAG_ID_PREFIX + tagName) + .then(doc => { + doc._deleted = true + return db.put(doc) + }) + .then(res => { + return db.get(TAG_ID_PREFIX + newTagName) + }) + .catch(err => { + if (err.name === 'not_found') return {} + throw err + }) + .then(doc => { + return db.put(Object.assign({ + _id: TAG_ID_PREFIX + newTagName + }, doc)) + }) + .then(res => { + return db.put(noteView) + .catch(err => { + if (err.name !== 'conflict') throw err + }) + .then(() => { + return db.query('notes/by_tag', { + key: tagName, + include_docs: true + }) + }) + .then(function (result) { + let docs = result.rows.map(row => { + row.doc.tags = row.doc.tags + .filter(tag => tag !== tagName && tag !== newTagName) + .concat([newTagName]) + + return row.doc + }) + return db.bulkDocs(docs) + }) + }) + .then(res => { + return { + id: tagName + } + }) +} diff --git a/src/main/lib/dataAPI/upsertTag.js b/src/main/lib/dataAPI/upsertTag.js new file mode 100644 index 0000000000..18474ec099 --- /dev/null +++ b/src/main/lib/dataAPI/upsertTag.js @@ -0,0 +1,26 @@ +import { Map } from 'immutable' +import { getDB } from './context' +import { + TAG_ID_PREFIX +} from './consts' + +export default function upsertTag (storageName, tagName) { + const db = getDB(storageName) + return db + .get(TAG_ID_PREFIX + tagName) + .catch(err => { + if (err.name === 'not_found') return {} + throw err + }) + .then(doc => { + return db.put(Object.assign({ + _id: TAG_ID_PREFIX + tagName + }, doc)) + }) + .then(res => { + return { + id: tagName, + tag: new Map({rev: res.rev}) + } + }) +} From 68a6ded66ebfbd5347ebb1be2655246a1e3cb468 Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Sat, 7 Jan 2017 22:15:07 +0900 Subject: [PATCH 11/24] :art: Map notes by tag --- docs/development/keymap-and-commands.md | 1 + specs/main/lib/data/createNote.spec.js | 11 +- specs/main/lib/data/deleteFolder.spec.js | 2 +- specs/main/lib/data/deleteTag.spec.js | 30 ++- specs/utils/DummyDB.js | 4 + src/lib/consts.js | 3 +- src/main/Nav/FolderButton.js | 34 +-- src/main/Nav/Nav.js | 290 +++++++++++++++++----- src/main/Nav/StorageSection.js | 246 +++++++++++------- src/main/Nav/TagButton.js | 217 ++++++++++++++++ src/main/NoteList/NoteList.js | 21 ++ src/main/TitleBar/TitleBar.js | 7 +- src/main/lib/dataAPI/consts.js | 11 +- src/main/lib/dataAPI/createNote.js | 26 +- src/main/lib/dataAPI/deleteFolder.js | 7 +- src/main/lib/dataAPI/deleteTag.js | 14 +- src/main/lib/dataAPI/loadStorage.js | 19 +- src/main/lib/dataAPI/renameFolder.js | 4 +- src/main/lib/dataAPI/renameTag.js | 4 +- src/main/lib/redux/reducers/storageMap.js | 116 ++++++++- src/main/routes.js | 1 + 21 files changed, 858 insertions(+), 210 deletions(-) create mode 100644 src/main/Nav/TagButton.js diff --git a/docs/development/keymap-and-commands.md b/docs/development/keymap-and-commands.md index b4e9e5dd7a..15c10f7bf1 100644 --- a/docs/development/keymap-and-commands.md +++ b/docs/development/keymap-and-commands.md @@ -66,6 +66,7 @@ Right | Right | `list:focus` Up | Up | `nav:up` Down | Down | `nav:down` D | D | `nav:delete` +Tab | Tab | `nav:toggle-tab` ### Commands diff --git a/specs/main/lib/data/createNote.spec.js b/specs/main/lib/data/createNote.spec.js index c921d31bb9..e3955d9e53 100644 --- a/specs/main/lib/data/createNote.spec.js +++ b/specs/main/lib/data/createNote.spec.js @@ -1,7 +1,8 @@ import createNote from 'main/lib/dataAPI/createNote' import DummyDB from 'specs/utils/DummyDB' import { - NOTE_ID_PREFIX + NOTE_ID_PREFIX, + TAG_ID_PREFIX } from 'main/lib/dataAPI/consts' const dbName = __filename @@ -22,6 +23,10 @@ function fetchNote (noteId) { return db.get(NOTE_ID_PREFIX + noteId) } +function fetchTag () { + return db.get(TAG_ID_PREFIX + tagName) +} + export default t => { return createNote(dbName, note) .then(res => { @@ -35,6 +40,10 @@ export default t => { t.equal(res.folder, folderName) t.equal(res.tags[0], tagName) }) + .then(fetchTag) + .then(doc => { + t.equal(doc._id, TAG_ID_PREFIX + tagName) + }) } export const after = t => { diff --git a/specs/main/lib/data/deleteFolder.spec.js b/specs/main/lib/data/deleteFolder.spec.js index faf3a74b78..d44a8bb345 100644 --- a/specs/main/lib/data/deleteFolder.spec.js +++ b/specs/main/lib/data/deleteFolder.spec.js @@ -47,7 +47,7 @@ export default t => { }) .then(fetchFolder) .then(res => { - t.fail('The folder should not exist.') + t.fail('The folder must not exist.') }) .catch(err => { if (err.name !== 'not_found') { diff --git a/specs/main/lib/data/deleteTag.spec.js b/specs/main/lib/data/deleteTag.spec.js index 9f83863e12..abfcb279b4 100644 --- a/specs/main/lib/data/deleteTag.spec.js +++ b/specs/main/lib/data/deleteTag.spec.js @@ -1,7 +1,8 @@ import deleteTag from 'main/lib/dataAPI/deleteTag' import DummyDB from 'specs/utils/DummyDB' import { - FOLDER_ID_PREFIX + TAG_ID_PREFIX, + NOTE_ID_PREFIX } from 'main/lib/dataAPI/consts' const dbName = __filename @@ -12,8 +13,7 @@ const noteId = 'testnote' const note = { title: 'test', content: 'test\ncontent', - tags: ['test_tag'], - tag: tagName + tags: [tagName] } function createDummyTag () { @@ -24,14 +24,32 @@ function createDummyNote () { return db.createNote(noteId, note) } +function fetchNote () { + return db.get(NOTE_ID_PREFIX + noteId) +} + function fetchTag () { return db - .get(FOLDER_ID_PREFIX + tagName) + .get(TAG_ID_PREFIX + tagName) +} + +function createWrongView () { + return db.get('_design/notes') + .catch(err => { + if (err.name !== 'not_found') throw err + }) + .then(doc => { + return db.put(Object.assign({}, doc, { + _id: '_design/notes', + views: {} + })) + }) } export const before = t => { return createDummyTag() .then(createDummyNote) + .then(createWrongView) } export default t => { @@ -39,6 +57,10 @@ export default t => { .then(tag => { t.equal(tag.id, tagName) }) + .then(fetchNote) + .then(res => { + t.equal(res.tags.length, 0) + }) .then(fetchTag) .then(res => { t.fail('The tag should not exist.') diff --git a/specs/utils/DummyDB.js b/specs/utils/DummyDB.js index ec361bbaa5..36dc1649b6 100644 --- a/specs/utils/DummyDB.js +++ b/specs/utils/DummyDB.js @@ -76,6 +76,10 @@ class DummyDB { return this.db.get(...args) } + put (...args) { + return this.db.put(...args) + } + destroy (...args) { return this.db.destroy(...args) } diff --git a/src/lib/consts.js b/src/lib/consts.js index 086340f4f5..48d87aa97e 100644 --- a/src/lib/consts.js +++ b/src/lib/consts.js @@ -54,7 +54,8 @@ export const DEFAULT_KEYMAP = Immutable.fromJS({ Right: 'list:focus', Up: 'nav:up', Down: 'nav:down', - D: 'nav:delete' + D: 'nav:delete', + Tab: 'nav:toggle-tab' }, list: { Enter: 'detail:focus', diff --git a/src/main/Nav/FolderButton.js b/src/main/Nav/FolderButton.js index 23690a3fba..1e4643b69d 100644 --- a/src/main/Nav/FolderButton.js +++ b/src/main/Nav/FolderButton.js @@ -14,7 +14,7 @@ const Root = styled.div` ` const Button = styled(LinkButton)` - display: block; + display: flex; width: 100%; height: 24px; line-height: 24px; @@ -28,9 +28,6 @@ const Button = styled(LinkButton)` text-decoration: none; text-align: left; font-size: 12px; - .Octicon { - fill: ${p => p.theme.color}; - } &:hover { background-color: ${p => p.theme.buttonHoverColor}; } @@ -45,12 +42,17 @@ const Button = styled(LinkButton)` color: ${p => p.isFocused ? p.theme.activeInverseColor : p.theme.color}; - .Octicon { - fill: ${p => p.isFocused - ? p.theme.activeInverseColor - : p.theme.color}; + .count { + color: inherit; } } + .label { + flex: 1; + } + .count { + font-size: 10px; + color: ${p => p.theme.inactiveColor}; + } ` const RenameInput = styled.input` @@ -105,7 +107,7 @@ class FolderButton extends React.Component { } this.handleInputBlur = e => { - this.finishRenaming() + this.confirmRenaming() } this.handleInputKeyDown = e => { @@ -113,7 +115,7 @@ class FolderButton extends React.Component { switch (e.keyCode) { case 13: - this.finishRenaming() + this.confirmRenaming() break case 27: this.cancelRenaming() @@ -196,7 +198,7 @@ class FolderButton extends React.Component { }) } - finishRenaming () { + confirmRenaming () { this.setState({ isRenaming: false }, () => { @@ -216,10 +218,7 @@ class FolderButton extends React.Component { payload: { storageName, folderName, - newFolderName: newFolderName, - folder: new Map([ - ['notes', new Set()] - ]) + newFolderName } }) }) @@ -227,7 +226,7 @@ class FolderButton extends React.Component { } render () { - const { folderURL, folderName, isFocused } = this.props + const { folderURL, folderName, folderMeta, isFocused } = this.props return ( - {folderName} + {folderName} + {folderMeta.get('notes').size} } diff --git a/src/main/Nav/Nav.js b/src/main/Nav/Nav.js index aa3b8f56c4..87f0b96131 100644 --- a/src/main/Nav/Nav.js +++ b/src/main/Nav/Nav.js @@ -16,40 +16,59 @@ const Root = styled.div` flex-direction: column; min-width: ${NAV_MIN_WIDTH}px; background-color: ${p => p.theme.uiBackgroundColor}; - &:focus { - outline: none; - } -` - -const StorageList = styled.div` - width: 100%; - overflow-y: auto; - flex: 1; -` - -const BottomButton = styled.button` - display: block; - width: 100%; - height: 30px; - line-height: 30px; - margin: 0; - padding: 0 10px; - background-color: ${p => p.theme.buttonBackgroundColor}; - border: none; outline: none; - cursor: pointer; - color: ${p => p.theme.color}; - text-decoration: none; - text-align: left; - font-size: 12px; - .Octicon { - fill: ${p => p.theme.color}; + .tabs { + text-align: center; + margin-top: 5px; + margin-bottom: -5px; } - &:hover { - background-color: ${p => p.theme.buttonHoverColor}; + .tabs button { + ${p => p.theme.button} + background-color: ${p => p.theme.uiBackgroundColor}; + border-radius: 0; + margin-right: -1px; + box-sizing: border-box; + height: 20px; + &:first-child { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + } + &:last-child { + margin-right: 0; + border-right: ${p => p.theme.border}; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } + &.active { + color: ${p => p.theme.activeColor}; + } } - &:active { - background-color: ${p => p.theme.buttonActiveColor}; + .list { + width: 100%; + overflow-y: auto; + flex: 1; + } + .bottomButton { + display: block; + width: 100%; + height: 30px; + line-height: 30px; + margin: 0; + padding: 0 10px; + background-color: ${p => p.theme.buttonBackgroundColor}; + border: none; + outline: none; + cursor: pointer; + color: ${p => p.theme.color}; + text-decoration: none; + text-align: left; + font-size: 12px; + &:hover { + background-color: ${p => p.theme.buttonHoverColor}; + } + &:active { + background-color: ${p => p.theme.buttonActiveColor}; + } } ` @@ -58,26 +77,30 @@ class Nav extends React.Component { super(props) this.state = { - isFocused: false + isFocused: false, + // folders, tags + tab: 'folders' } } componentDidMount () { - window.addEventListener('nav:new-folder', this.handleNewFolderClick) - window.addEventListener('nav:focus', this.handleWindowFocus) - window.addEventListener('nav:up', this.handleWindowUp) - window.addEventListener('nav:down', this.handleWindowDown) - window.addEventListener('nav:delete', this.handleWindowDelete) + window.addEventListener('nav:new-folder', this.handleNavNewFolder) + window.addEventListener('nav:focus', this.handleNavFocus) + window.addEventListener('nav:up', this.handleNavUp) + window.addEventListener('nav:down', this.handleNavDown) + window.addEventListener('nav:delete', this.handleNavDelete) + window.addEventListener('nav:toggle-tab', this.handleNavToggleTab) this.focus() } componentWillUnmount () { - window.removeEventListener('nav:new-folder', this.handleNewFolderClick) - window.removeEventListener('nav:focus', this.handleWindowFocus) - window.removeEventListener('nav:up', this.handleWindowUp) - window.removeEventListener('nav:down', this.handleWindowDown) - window.removeEventListener('nav:delete', this.handleWindowDelete) + window.removeEventListener('nav:new-folder', this.handleNavNewFolder) + window.removeEventListener('nav:focus', this.handleNavFocus) + window.removeEventListener('nav:up', this.handleNavUp) + window.removeEventListener('nav:down', this.handleNavDown) + window.removeEventListener('nav:delete', this.handleNavDelete) + window.removeEventListener('nav:toggle-tab', this.handleNavToggleTab) } handleKeyDown = e => { @@ -90,8 +113,24 @@ class Nav extends React.Component { } } - handleNewFolderClick = e => { - this.refs['storage-' + this.context.router.params.storageName].createNewFolder() + handleNavNewFolder = e => { + this.setState({ + tab: 'folders' + }, () => { + this.refs['storage-' + this.context.router.params.storageName].createNew() + }) + } + + handleNewButtonClick = e => { + switch (this.state.tab) { + case 'tags': + this.refs['storage-' + this.context.router.params.storageName].createNew('tags') + break + case 'folders': + default: + this.refs['storage-' + this.context.router.params.storageName].createNew('folders') + break + } } handleFocus = e => { @@ -104,25 +143,31 @@ class Nav extends React.Component { handleBlur = e => { if (isFinallyBlurred(e, this.root)) { + const { tagName } = this.context.router.params + const nextTab = tagName != null + ? 'tags' + : 'folders' + this.setState({ + tab: nextTab, isFocused: false }) } } - handleWindowFocus = e => { + handleNavFocus = e => { this.focus() } - handleWindowUp = e => { + handleNavUp = e => { this.move(-1) } - handleWindowDown = e => { + handleNavDown = e => { this.move() } - handleWindowDelete = e => { + handleNavDelete = e => { const { router } = this.context const { storageName, folderName } = router.params if (this.state.isFocused && folderName != null && folderName !== 'Notes') { @@ -130,24 +175,53 @@ class Nav extends React.Component { } } + handleNavToggleTab = e => { + this.toggleTab() + } + + handleFoldersTabClick = e => { + this.switchTab('folders') + } + + handleTagsTabClick = e => { + this.switchTab('tags') + } + move (offset = 1) { const { router } = this.context - const { storageName, folderName } = router.params + const { storageName, folderName, tagName } = router.params - const currentIndex = folderName == null - ? this.linkList.indexOf(storageName) - : this.linkList.indexOf(storageName + '/' + folderName) + if (this.state.tab !== 'tags') { + const currentIndex = folderName == null + ? this.linkList.indexOf(storageName) + : this.linkList.indexOf(storageName + '/' + folderName) - const nextIndex = currentIndex + offset + const nextIndex = currentIndex + offset - if (nextIndex > -1 && nextIndex < this.linkList.length) { - const nextLink = this.linkList[nextIndex] - .replace(/\//, '/folders/') + if (nextIndex > -1 && nextIndex < this.linkList.length) { + const nextLink = this.linkList[nextIndex] + .replace(/\//, '/folders/') - router.push('storages/' + nextLink) - return true + router.push('storages/' + nextLink) + return true + } + return false + } else { + const currentIndex = tagName == null + ? this.linkList.indexOf(storageName) + : this.linkList.indexOf(storageName + '/' + tagName) + + const nextIndex = currentIndex + offset + + if (nextIndex > -1 && nextIndex < this.linkList.length) { + const nextLink = this.linkList[nextIndex] + .replace(/\//, '/tags/') + + router.push('storages/' + nextLink) + return true + } + return false } - return false } focus () { @@ -185,6 +259,55 @@ class Nav extends React.Component { }) } + deleteTag = (storageName, tagName) => { + const { store, router } = this.context + + Dialog.showMessageBox({ + message: `Are you sure you want to delete "${tagName}"?`, + detail: 'All Notes will be untagged.', + buttons: ['Confirm', 'Cancel'] + }, (index) => { + if (index === 0) { + const isCurrentTag = (storageName === router.params.storageName) && (tagName === router.params.tagName) + if (isCurrentTag && !this.move(1)) { + this.move(-1) + } + store + .dispatch(dispatch => { + return dataAPI.deleteTag(storageName, tagName) + .then(res => { + dispatch({ + type: 'DELETE_TAG', + payload: { + storageName, + tagName + } + }) + this.focus() + }) + }) + } + }) + } + + switchTab = (nextTab, shouldKeepFocus = true) => { + this.setState({ + tab: nextTab + }, () => { + if (shouldKeepFocus) { + this.focus() + } + }) + } + + toggleTab () { + const nextTab = this.state.tab === 'folders' + ? 'tags' + : 'folders' + + this.switchTab(nextTab, true) + } + render () { const { storageMap } = this.props @@ -200,15 +323,28 @@ class Nav extends React.Component { if (b === 'notes') return 1 return a.localeCompare(b) }) - this.linkList = this.linkList.concat(folderMap.map((folder, key) => storageName + '/' + key).toArray()) + + const tagMap = storageData.get('tagMap') + .sortBy((v, key) => key.toLowerCase(), (a, b) => { + return a.localeCompare(b) + }) + + this.linkList = this.state.tab !== 'tags' + ? this.linkList.concat(folderMap.map((folder, key) => storageName + '/' + key).toArray()) + : this.linkList.concat(tagMap.map((tag, key) => storageName + '/' + key).toArray()) + return }) .toArray() @@ -221,14 +357,36 @@ class Nav extends React.Component { onFocus={this.handleFocus} onBlur={this.handleBlur} > - +
+ + +
+
{storageList} - - + ) } diff --git a/src/main/Nav/StorageSection.js b/src/main/Nav/StorageSection.js index e02a4547d0..d8f6462d9e 100644 --- a/src/main/Nav/StorageSection.js +++ b/src/main/Nav/StorageSection.js @@ -1,12 +1,13 @@ import React, { PropTypes } from 'react' import styled from 'styled-components' -import { Octicon, LinkButton } from 'components' -import FolderButton from './FolderButton' -import ContextMenu from 'main/lib/ContextMenu' -import dataAPI from 'main/lib/dataAPI' -import filenamify from 'filenamify' import { Map, Set } from 'immutable' import { routerShape } from 'react-router' +import filenamify from 'filenamify' +import ContextMenu from 'main/lib/ContextMenu' +import dataAPI from 'main/lib/dataAPI' +import { Octicon, LinkButton } from 'components' +import FolderButton from './FolderButton' +import TagButton from './TagButton' const NavButton = styled(LinkButton)` display: block; @@ -23,9 +24,6 @@ const NavButton = styled(LinkButton)` text-decoration: none; text-align: left; font-size: 12px; - .Octicon { - fill: ${p => p.theme.color}; - } &:hover { background-color: ${p => p.theme.buttonHoverColor}; } @@ -40,11 +38,6 @@ const NavButton = styled(LinkButton)` color: ${p => p.isFocused ? p.theme.activeInverseColor : p.theme.color}; - .Octicon { - fill: ${p => p.isFocused - ? p.theme.activeInverseColor - : p.theme.color}; - } } ` @@ -74,55 +67,70 @@ class StorageSection extends React.Component { super(props) this.state = { - isCreatingFolder: false, - newName: '' + isCreating: false, + newName: '', + mode: 'folders' } + } - this.createNewFolder = this.createNewFolder.bind(this) + handleNavButtonContextMenu = e => { + ContextMenu.open([ + { + label: 'New Folder...', + click: () => this.createNew() + } + ]) + } - this.handleNavButtonContextMenu = e => { - ContextMenu.open([ - { - label: 'New Folder...', - click: () => this.createNewFolder() - } - ]) - } + handleNewNameInputChange = e => { + this.setState({ + newName: e.target.value + }) + } - this.handleNewNameInputChange = e => { - this.setState({ - newName: e.target.value - }) + handleNewNameInputKeyDown = e => { + e.stopPropagation() + switch (e.keyCode) { + case 13: + this.confirmCreating() + break + case 27: + this.cancelCreating() + break } + } - this.handleNewNameInputKeyDown = e => { - e.stopPropagation() - switch (e.keyCode) { - case 13: - this.confirmCreating() - break - case 27: - this.cancelCreating() - break - } - } + handleNewNameInputBlur = e => { + this.confirmCreating() + } - this.handleNewNameInputBlur = e => { - this.confirmCreating() - } + createNewFolder = () => { + this.createNew('folders') } - createNewFolder () { - const { folderMap } = this.props + createNewTag = () => { + this.createNew('tags') + } + + createNew = (tab = 'folders') => { + const { switchTab, folderMap, tagMap } = this.props + switchTab(tab, false) let count = 0 let newName = 'New Folder' - while (folderMap.has(newName)) { - newName = `New Folder (${++count})` + if (tab === 'folders') { + while (folderMap.has(newName)) { + newName = `New Folder (${++count})` + } + } else { + newName = 'New Tag' + while (tagMap.has(newName)) { + newName = `New Tag (${++count})` + } } this.setState({ - isCreatingFolder: true, + isCreating: true, newName }, () => { this.newNameInput.focus() @@ -144,36 +152,61 @@ class StorageSection extends React.Component { } confirmCreating () { - const { storageName } = this.props + const { storageName, tab } = this.props const { store, router } = this.context const newName = this.resolveNewName(this.state.newName) - store - .dispatch(dispatch => { - return dataAPI - .upsertFolder(storageName, newName) - .then(res => { - const folderName = res.id - dispatch({ - type: 'UPDATE_FOLDER', - payload: { - storageName, - folderName: folderName, - folder: new Map([ - ['notes', new Set()] - ]) - } + if (tab === 'folders') { + store + .dispatch(dispatch => { + return dataAPI + .upsertFolder(storageName, newName) + .then(res => { + const folderName = res.id + dispatch({ + type: 'UPDATE_FOLDER', + payload: { + storageName, + folderName: folderName, + folder: new Map([ + ['notes', new Set()] + ]) + } + }) + return folderName + }) + }) + .then(folderName => { + router.push('/storages/' + storageName + '/folders/' + folderName) + }) + } else { + store + .dispatch(dispatch => { + return dataAPI + .upsertTag(storageName, newName) + .then(res => { + const tagName = res.id + dispatch({ + type: 'UPDATE_TAG', + payload: { + storageName, + tagName: tagName, + tag: new Map([ + ['notes', new Set()] + ]) + } + }) + return tagName }) - return folderName - }) - }) - .then(folderName => { - router.push('/storages/' + storageName + '/folders/' + folderName) - }) + }) + .then(tagName => { + router.push('/storages/' + storageName + '/tags/' + tagName) + }) + } this.setState({ - isCreatingFolder: false + isCreating: false }, () => { this.storageButton.focus() }) @@ -181,34 +214,61 @@ class StorageSection extends React.Component { cancelCreating () { this.setState({ - isCreatingFolder: false, + isCreating: false, newName: 'New Folder' }, () => { this.storageButton.focus() }) } + renderList () { + const { tab, storageName, folderMap, tagMap, isFocused, deleteFolder, deleteTag } = this.props + + if (tab === 'folders') { + return folderMap + .map((meta, folderName) => { + const folderURL = `/storages/${storageName}/folders/${folderName}` + + return + {folderName} + + }) + .toArray() + } else { + return tagMap + .map((meta, tagName) => { + const tagURL = `/storages/${storageName}/tags/${tagName}` + + return + }) + .toArray() + } + } + render () { - const { storageName, folderMap, isFocused, deleteFolder } = this.props - - const folderList = folderMap - .map((meta, folderName) => { - const folderURL = `/storages/${storageName}/folders/${folderName}` - - return - {folderName} - - }) - .toArray() + const { storageName, isFocused } = this.props + + const list = this.renderList() const storageURL = `/storages/${storageName}/all-notes` @@ -223,8 +283,8 @@ class StorageSection extends React.Component { > {storageName} - {folderList} - {this.state.isCreatingFolder && + {list} + {this.state.isCreating && (this.newNameInput = c)} diff --git a/src/main/Nav/TagButton.js b/src/main/Nav/TagButton.js new file mode 100644 index 0000000000..65db83693a --- /dev/null +++ b/src/main/Nav/TagButton.js @@ -0,0 +1,217 @@ +import React, { PropTypes } from 'react' +import styled from 'styled-components' +import { LinkButton, Octicon } from 'components' +import ContextMenu from 'main/lib/ContextMenu' +import dataAPI from 'main/lib/dataAPI' +import { routerShape } from 'react-router' + +const Root = styled.div` + display: flex; + align-items: center; + height: 24px; +` + +const Button = styled(LinkButton)` + display: flex; + width: 100%; + height: 24px; + line-height: 24px; + margin: 0; + padding: 0 10px; + background-color: ${p => p.theme.buttonBackgroundColor}; + border: none; + outline: none; + cursor: pointer; + color: ${p => p.theme.color}; + text-decoration: none; + text-align: left; + font-size: 12px; + &:hover { + background-color: ${p => p.theme.buttonHoverColor}; + } + &:active { + background-color: ${p => p.theme.buttonActiveColor}; + } + &.active { + font-weight: bold; + background-color: ${p => p.isFocused + ? p.theme.activeColor + : p.theme.buttonActiveColor}; + color: ${p => p.isFocused + ? p.theme.activeInverseColor + : p.theme.color}; + .count { + color: inherit; + } + } + .label { + flex: 1; + } + .count { + font-size: 10px; + color: ${p => p.theme.inactiveColor}; + } +` + +const RenameInput = styled.input` + ${p => p.theme.input} + height: 20px; + line-height: 20px; + padding: 0 5px; + display: block; + width: 100%; + margin: 0 10px; + box-sizing: border-box; + flex: 1; +` + +class TagButton extends React.Component { + constructor (props) { + super(props) + + this.state = { + isRenaming: false, + newName: props.tagName + } + + this.handleContextMenu = e => { + ContextMenu.open([ + { + label: 'Rename Tag...', + click: e => this.rename() + }, + { + label: 'Delete Tag...', + click: e => this.delete() + }, + { + type: 'separator' + }, + { + label: 'New Tag...', + click: e => this.props.createNewButton() + } + ]) + } + + this.handleInputBlur = e => { + this.confirmRenaming() + } + + this.handleInputKeyDown = e => { + e.stopPropagation() + + switch (e.keyCode) { + case 13: + this.confirmRenaming() + break + case 27: + this.cancelRenaming() + break + } + } + + this.handleInputChange = e => { + this.setState({ + newName: this.input.value + }) + } + } + + rename () { + this.setState({ + isRenaming: true, + newName: this.props.tagName + }, () => { + this.input.focus() + this.input.select() + }) + } + + delete () { + const { storageName, tagName, deleteTag } = this.props + deleteTag(storageName, tagName) + } + + cancelRenaming () { + this.setState({ + isRenaming: false + }, () => { + this.button.focus() + }) + } + + confirmRenaming () { + this.setState({ + isRenaming: false + }, () => { + const { storageName, resolveNewName, tagName } = this.props + const { store, router } = this.context + + const newTagName = resolveNewName(this.state.newName) + + dataAPI + .renameTag(storageName, tagName, newTagName) + .then(res => { + if (router.params.tagName === tagName) { + router.push(`/storages/${storageName}/tags/${newTagName}`) + } + store.dispatch({ + type: 'RENAME_TAG', + payload: { + storageName, + tagName, + newTagName + } + }) + }) + }) + } + + render () { + const { tagURL, tagName, tagMeta, isFocused } = this.props + + return ( + + {this.state.isRenaming + ? (this.input = c)} + value={this.state.newName} + onBlur={this.handleInputBlur} + onKeyDown={this.handleInputKeyDown} + onChange={this.handleInputChange} + /> + : + } + + ) + } +} + +TagButton.propTypes = { + tagURL: PropTypes.string, + tag: PropTypes.string, + storageName: PropTypes.string, + deleteTag: PropTypes.func +} + +TagButton.contextTypes = { + store: PropTypes.shape({ + dispatch: PropTypes.func + }), + router: routerShape +} + +export default TagButton diff --git a/src/main/NoteList/NoteList.js b/src/main/NoteList/NoteList.js index 9c145c3e85..454cd4d88e 100644 --- a/src/main/NoteList/NoteList.js +++ b/src/main/NoteList/NoteList.js @@ -406,6 +406,27 @@ class NoteList extends React.Component { if (noteSet == null) return new Map() + notes = noteSet + .map(noteId => { + return [ + noteId, + storageMap + .getIn([params.storageName, 'noteMap', noteId]) + ] + }) + .toArray() + notes = new Map(notes) + } else if (params.tagName != null) { + let noteSet = storageMap + .getIn([ + params.storageName, + 'tagMap', + params.tagName, + 'notes' + ]) + + if (noteSet == null) return new Map() + notes = noteSet .map(noteId => { return [ diff --git a/src/main/TitleBar/TitleBar.js b/src/main/TitleBar/TitleBar.js index 41d7ef58b3..97f3c5b769 100644 --- a/src/main/TitleBar/TitleBar.js +++ b/src/main/TitleBar/TitleBar.js @@ -267,6 +267,11 @@ class TitleBar extends React.Component { folderName = 'Notes' } + let tags = [] + if (_.isString(router.params.tagName)) { + tags.push(router.params.tagName) + } + // TODO: this should be moved to redux saga dataAPI .createNote(storageName, { @@ -276,7 +281,7 @@ class TitleBar extends React.Component { preview: '' }, content: '', - tags: [] + tags }) .then(res => { store.dispatch({ diff --git a/src/main/lib/dataAPI/consts.js b/src/main/lib/dataAPI/consts.js index 7f7c768b09..790a4deba7 100644 --- a/src/main/lib/dataAPI/consts.js +++ b/src/main/lib/dataAPI/consts.js @@ -5,17 +5,22 @@ export const isNoteId = new RegExp(`^${NOTE_ID_PREFIX}.+`) export const isFolderId = new RegExp(`^${FOLDER_ID_PREFIX}.+`) export const isTagId = new RegExp(`^${TAG_ID_PREFIX}.+`) -// Views for reducin' & mappin' -export const noteView = { +export const notesView = { _id: '_design/notes', views: { by_folder: { map: `function mapFun(doc) { - emit(doc.folder); + if (!/^note:.+/.test(doc._id)) { + return + } + emit(doc.folder) }` }, by_tag: { map: `function mapFun(doc) { + if (!/^note:.+/.test(doc._id)) { + return + } if (Array.isArray(doc.tags)) { doc.tags.forEach(tag => { emit(tag) diff --git a/src/main/lib/dataAPI/createNote.js b/src/main/lib/dataAPI/createNote.js index 82cd826b12..2a57271db2 100644 --- a/src/main/lib/dataAPI/createNote.js +++ b/src/main/lib/dataAPI/createNote.js @@ -1,6 +1,7 @@ import { getDB } from './context' import { - NOTE_ID_PREFIX + NOTE_ID_PREFIX, + TAG_ID_PREFIX } from './consts' import { Map, Set } from 'immutable' import util from 'lib/util' @@ -25,12 +26,25 @@ export default function createNote (storageName, payload) { return genNoteId() .then(noteId => { - return db - .put(Object.assign({}, payload, { - _id: NOTE_ID_PREFIX + noteId, - createdAt: now, - updatedAt: now + return Promise + .all(payload.tags.map(tag => { + return db.get(TAG_ID_PREFIX + tag) + .catch(err => { + if (err.name === 'not_found') { + return db.put({ + _id: TAG_ID_PREFIX + tag + }) + } + throw err + }) })) + .then(res => { + return db.put(Object.assign({}, payload, { + _id: NOTE_ID_PREFIX + noteId, + createdAt: now, + updatedAt: now + })) + }) .then(res => { return { id: noteId, diff --git a/src/main/lib/dataAPI/deleteFolder.js b/src/main/lib/dataAPI/deleteFolder.js index 0d6aba218c..4eaed926da 100644 --- a/src/main/lib/dataAPI/deleteFolder.js +++ b/src/main/lib/dataAPI/deleteFolder.js @@ -1,7 +1,7 @@ import { getDB } from './context' import { FOLDER_ID_PREFIX, - noteView + notesView } from './consts' export default function deleteFolder (storageName, folderName) { @@ -12,8 +12,11 @@ export default function deleteFolder (storageName, folderName) { doc._deleted = true return db.put(doc) }) + .catch(err => { + if (err.name !== 'not_found') throw err + }) .then(res => { - return db.put(noteView) + return db.put(notesView) .catch(err => { if (err.name !== 'conflict') throw err }) diff --git a/src/main/lib/dataAPI/deleteTag.js b/src/main/lib/dataAPI/deleteTag.js index bde2568cf1..58da0e5080 100644 --- a/src/main/lib/dataAPI/deleteTag.js +++ b/src/main/lib/dataAPI/deleteTag.js @@ -1,7 +1,7 @@ import { getDB } from './context' import { TAG_ID_PREFIX, - noteView + notesView } from './consts' export default function deleteTag (storageName, tagName) { @@ -12,10 +12,16 @@ export default function deleteTag (storageName, tagName) { doc._deleted = true return db.put(doc) }) + .catch(err => { + if (err.name !== 'not_found') throw err + }) .then(res => { - return db.put(noteView) + return db.put(notesView) .catch(err => { - if (err.name !== 'conflict') throw err + if (err.name === 'conflict') { + return + } + throw err }) .then(res => { return db.query('notes/by_tag', { @@ -33,7 +39,7 @@ export default function deleteTag (storageName, tagName) { return db.bulkDocs(docs) }) }) - .then((res) => { + .then(res => { return { id: tagName } diff --git a/src/main/lib/dataAPI/loadStorage.js b/src/main/lib/dataAPI/loadStorage.js index 0f6ecf7825..995c254849 100644 --- a/src/main/lib/dataAPI/loadStorage.js +++ b/src/main/lib/dataAPI/loadStorage.js @@ -6,7 +6,8 @@ import { TAG_ID_PREFIX, isNoteId, isFolderId, - isTagId + isTagId, + notesView } from './consts' /** @@ -17,8 +18,18 @@ import { * including `notes` and `folders` field */ export default function loadStorage (name) { - return getDB(name) - .allDocs({include_docs: true}) + const db = getDB(name) + return db + .get(notesView._id) + .catch(err => { + if (err.name === 'not_found') return notesView + }) + .then(doc => { + return db.put(Object.assign(doc, notesView)) + }) + .then(res => { + return db.allDocs({include_docs: true}) + }) .then(data => { let { noteMap, folderMap, tagMap } = data.rows.reduce((sum, row) => { if (isNoteId.test(row.id)) { @@ -38,7 +49,7 @@ export default function loadStorage (name) { })) } else if (isTagId.test(row.id)) { let tagName = row.id.substring(TAG_ID_PREFIX.length) - sum.folderMap = sum.tagMap.set(tagName, new Map({ + sum.tagMap = sum.tagMap.set(tagName, new Map({ notes: new Set() })) } diff --git a/src/main/lib/dataAPI/renameFolder.js b/src/main/lib/dataAPI/renameFolder.js index 3c79694c6e..7d8221bf08 100644 --- a/src/main/lib/dataAPI/renameFolder.js +++ b/src/main/lib/dataAPI/renameFolder.js @@ -1,7 +1,7 @@ import { getDB } from './context' import { FOLDER_ID_PREFIX, - noteView + notesView } from './consts' export default function renameFolder (name, folderName, newFolderName) { @@ -25,7 +25,7 @@ export default function renameFolder (name, folderName, newFolderName) { }, doc)) }) .then(res => { - return db.put(noteView) + return db.put(notesView) .catch(err => { if (err.name !== 'conflict') throw err }) diff --git a/src/main/lib/dataAPI/renameTag.js b/src/main/lib/dataAPI/renameTag.js index 9f9abf286c..4fcc212a15 100644 --- a/src/main/lib/dataAPI/renameTag.js +++ b/src/main/lib/dataAPI/renameTag.js @@ -9,7 +9,7 @@ import { getDB } from './context' import { TAG_ID_PREFIX, - noteView + notesView } from './consts' export default function renameTag (name, tagName, newTagName) { @@ -33,7 +33,7 @@ export default function renameTag (name, tagName, newTagName) { }, doc)) }) .then(res => { - return db.put(noteView) + return db.put(notesView) .catch(err => { if (err.name !== 'conflict') throw err }) diff --git a/src/main/lib/redux/reducers/storageMap.js b/src/main/lib/redux/reducers/storageMap.js index d7a3f60471..4849833f18 100644 --- a/src/main/lib/redux/reducers/storageMap.js +++ b/src/main/lib/redux/reducers/storageMap.js @@ -1,4 +1,4 @@ -import { Map, OrderedMap } from 'immutable' +import { Map, OrderedMap, Set } from 'immutable' const defaultStorageMap = OrderedMap() @@ -17,6 +17,17 @@ function storageMap (state = defaultStorageMap, action) { ], folder) } + case 'UPDATE_TAG': + { + const { storageName, tagName, tag } = action.payload + + return state.setIn([ + storageName, + 'tagMap', + tagName + ], + tag) + } case 'DELETE_FOLDER': { const { storageName, folderName } = action.payload @@ -32,7 +43,7 @@ function storageMap (state = defaultStorageMap, action) { .reduce((state, noteId) => { return state.deleteIn([ storageName, - 'notes', + 'noteMap', noteId ]) }, state) @@ -43,6 +54,33 @@ function storageMap (state = defaultStorageMap, action) { folderName ]) } + case 'DELETE_TAG': + { + const { storageName, tagName } = action.payload + + // Untag notes + const noteSet = state.getIn([ + storageName, + 'tagMap', + tagName, + 'notes' + ]) + state = noteSet + .reduce((state, noteId) => { + return state.updateIn([ + storageName, + 'noteMap', + noteId, + 'tags' + ], tags => tags.delete(tagName)) + }, state) + + return state.deleteIn([ + storageName, + 'tagMap', + tagName + ]) + } case 'MOVE_FOLDER': { const { storageName, folderName, newFolderName } = action.payload @@ -77,7 +115,39 @@ function storageMap (state = defaultStorageMap, action) { newFolderName ], new Map([['notes', noteSet]])) } - // TODO: Need tag reducers + case 'RENAME_TAG': + { + const { storageName, tagName, newTagName } = action.payload + + // Update note.tags attribute + const noteSet = state.getIn([ + storageName, + 'tagMap', + tagName, + 'notes' + ]) + state = noteSet + .reduce((state, noteId) => { + return state.updateIn([ + storageName, + 'noteMap', + noteId + ], note => note.update('tags', tags => tags.delete(tagName).add(newTagName))) + }, state) + + state = state.deleteIn([ + storageName, + 'tagMap', + tagName + ]) + + // Create new tag + return state.setIn([ + storageName, + 'tagMap', + newTagName + ], new Map([['notes', noteSet]])) + } case 'CREATE_NOTE': { const { storageName, noteId, note } = action.payload @@ -94,6 +164,19 @@ function storageMap (state = defaultStorageMap, action) { 'notes' ], noteSet => noteSet.add(noteId)) + state = note.get('tags') + .reduce((sum, tag) => { + return sum.updateIn([ + storageName, + 'tagMap', + tag, + 'notes' + ], noteSet => { + if (noteSet == null) noteSet = new Set() + return noteSet.add(noteId) + }) + }, state) + return state } case 'UPDATE_NOTE': @@ -128,6 +211,33 @@ function storageMap (state = defaultStorageMap, action) { 'notes' ], noteSet => noteSet.add(noteId)) } + + state = oldNote.get('tags') + .reduce((sum, tag) => { + return sum.updateIn([ + storageName, + 'tagMap', + tag, + 'notes' + ], noteSet => { + if (noteSet == null) noteSet = new Set() + return noteSet.delete(noteId) + }) + }, state) + + state = note.get('tags') + .reduce((sum, tag) => { + return sum.updateIn([ + storageName, + 'tagMap', + tag, + 'notes' + ], noteSet => { + if (noteSet == null) noteSet = new Set() + return noteSet.add(noteId) + }) + }, state) + return state } case 'DELETE_NOTE': diff --git a/src/main/routes.js b/src/main/routes.js index 4a514b405a..4fd10f9e42 100644 --- a/src/main/routes.js +++ b/src/main/routes.js @@ -13,6 +13,7 @@ const routes = ( + From 864261c22d5839ca83e0a8ef7d65f9c119e350e1 Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Sun, 8 Jan 2017 16:15:03 +0900 Subject: [PATCH 12/24] :white_check_mark: Use Jest --- .babelrc | 5 +- package.json | 41 +++++++++- specs/__functional__/lib/markdown.spec.js | 66 +++++++++++++++ .../main/lib/dataApi/createNote.spec.js | 53 ++++++++++++ .../main/lib/dataApi/deleteFolder.spec.js | 82 +++++++++++++++++++ .../main/lib/dataApi}/deleteNote.spec.js | 42 +++++----- .../main/lib/dataApi}/deleteTag.spec.js | 54 ++++++------ .../main/lib/dataApi/loadAllStorages.spec.js | 21 +++++ .../main/lib/dataApi/loadStorage.spec.js | 46 +++++++++++ .../main/lib/dataApi}/renameFolder.spec.js | 60 +++++++------- .../main/lib/dataApi}/renameTag.spec.js | 74 ++++++++--------- .../main/lib/dataApi/updateNote.spec.js | 66 +++++++++++++++ .../main/lib/dataApi/upsertFolder.spec.js | 30 +++++++ .../main/lib/dataApi/upsertTag.spec.js | 29 +++++++ .../LocalStorageMock.js} | 4 +- specs/__mocks__/fileMock.js | 1 + specs/__mocks__/styleMock.js | 1 + specs/lib/markdown.spec.js | 61 -------------- specs/main/lib/data/createNote.spec.js | 51 ------------ specs/main/lib/data/deleteFolder.spec.js | 70 ---------------- specs/main/lib/data/loadAllStorages.spec.js | 20 ----- specs/main/lib/data/loadStorage.spec.js | 44 ---------- specs/main/lib/data/updateNote.spec.js | 54 ------------ specs/main/lib/data/upsertFolder.spec.js | 28 ------- specs/main/lib/data/upsertTag.spec.js | 28 ------- specs/utils/setup.js | 5 ++ src/main/lib/dataAPI/deleteFolder.js | 15 ++++ src/main/lib/dataAPI/deleteTag.js | 15 ++++ src/main/lib/dataAPI/updateNote.js | 22 ++++- tools/webpack-test-entry.js | 82 ------------------- tools/webpack-test.html | 51 ------------ tools/webpack-test.js | 21 ----- webpack.config.js | 16 ---- 33 files changed, 605 insertions(+), 653 deletions(-) create mode 100644 specs/__functional__/lib/markdown.spec.js create mode 100644 specs/__functional__/main/lib/dataApi/createNote.spec.js create mode 100644 specs/__functional__/main/lib/dataApi/deleteFolder.spec.js rename specs/{main/lib/data => __functional__/main/lib/dataApi}/deleteNote.spec.js (53%) rename specs/{main/lib/data => __functional__/main/lib/dataApi}/deleteTag.spec.js (58%) create mode 100644 specs/__functional__/main/lib/dataApi/loadAllStorages.spec.js create mode 100644 specs/__functional__/main/lib/dataApi/loadStorage.spec.js rename specs/{main/lib/data => __functional__/main/lib/dataApi}/renameFolder.spec.js (50%) rename specs/{main/lib/data => __functional__/main/lib/dataApi}/renameTag.spec.js (50%) create mode 100644 specs/__functional__/main/lib/dataApi/updateNote.spec.js create mode 100644 specs/__functional__/main/lib/dataApi/upsertFolder.spec.js create mode 100644 specs/__functional__/main/lib/dataApi/upsertTag.spec.js rename specs/{mock/LocalStorage.js => __mocks__/LocalStorageMock.js} (88%) create mode 100644 specs/__mocks__/fileMock.js create mode 100644 specs/__mocks__/styleMock.js delete mode 100644 specs/lib/markdown.spec.js delete mode 100644 specs/main/lib/data/createNote.spec.js delete mode 100644 specs/main/lib/data/deleteFolder.spec.js delete mode 100644 specs/main/lib/data/loadAllStorages.spec.js delete mode 100644 specs/main/lib/data/loadStorage.spec.js delete mode 100644 specs/main/lib/data/updateNote.spec.js delete mode 100644 specs/main/lib/data/upsertFolder.spec.js delete mode 100644 specs/main/lib/data/upsertTag.spec.js create mode 100644 specs/utils/setup.js delete mode 100644 tools/webpack-test-entry.js delete mode 100644 tools/webpack-test.html delete mode 100644 tools/webpack-test.js diff --git a/.babelrc b/.babelrc index 24a13da0f0..47f1cb609d 100644 --- a/.babelrc +++ b/.babelrc @@ -43,9 +43,8 @@ "react" ], "plugins": [ - "react-hot-loader/babel", - "transform-class-properties", - "rewire" + "transform-es2015-modules-commonjs", + "transform-class-properties" ] } } diff --git a/package.json b/package.json index c7fb697452..76d63f505e 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,9 @@ "shasum": "shasum -a 256 dist/mac/Inpad-$npm_package_version.dmg", "lint": "standard", "webpack": "NODE_ENV=development webpack-dev-server --config webpack.config.js", + "test": "NODE_ENV=test jest", + "test:watch": "NODE_ENV=test jest --watch", "todo": "fixme -i 'compiled/**' -i 'dist/**' -i 'resources/**' -i 'node_modules/**'", - "test:run": "NODE_ENV=test electron ./tools/webpack-test.js", - "test:serve": "NODE_ENV=test webpack-dev-server --config webpack.config.js", "rebuild": "electron-rebuild" }, "keywords": [ @@ -34,9 +34,10 @@ "devDependencies": { "babel-core": "^6.18.0", "babel-eslint": "^7.1.1", + "babel-jest": "^18.0.0", "babel-loader": "^6.2.7", - "babel-plugin-rewire": "^1.0.0", "babel-plugin-transform-class-properties": "^6.19.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.18.0", "babel-preset-es2015": "^6.18.0", "babel-preset-react": "^6.16.0", "babel-preset-stage-2": "^6.18.0", @@ -47,11 +48,13 @@ "electron-devtools-installer": "^2.0.1", "electron-rebuild": "^1.3.0", "env-cmd": "^4.0.0", + "eslint-plugin-jest": "^1.0.2", "extract-text-webpack-plugin": "^2.0.0-beta.4", "file-loader": "^0.9.0", "filenamify": "^1.2.1", "fixme": "^0.4.2", "immutable": "^3.8.1", + "jest": "^18.1.0", "json-loader": "^0.5.4", "lodash": "^4.16.6", "moment": "^2.17.0", @@ -90,7 +93,37 @@ "katex": "^0.6.0" }, "standard": { - "parser": "babel-eslint" + "parser": "babel-eslint", + "plugins": [ + "jest" + ], + "envs": [ + "jest" + ] + }, + "jest": { + "setupFiles": [ + "/specs/utils/setup.js" + ], + "testPathIgnorePatterns": [ + "/node_modules/" + ], + "moduleFileExtensions": [ + "js", + "jsx", + "json" + ], + "moduleDirectories": [ + "node_modules" + ], + "moduleNameMapper": { + "^main(.*)$": "/src/main$1", + "^lib(.*)$": "/src/lib$1", + "^components(.*)$": "/src/components$1", + "^specs(.*)$": "/specs$1", + "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/specs/__mocks__/fileMock.js", + "\\.(css|less)$": "/specs/__mocks__/styleMock.js" + } }, "build": { "appId": "com.electron.Inpad", diff --git a/specs/__functional__/lib/markdown.spec.js b/specs/__functional__/lib/markdown.spec.js new file mode 100644 index 0000000000..3cd2d76afa --- /dev/null +++ b/specs/__functional__/lib/markdown.spec.js @@ -0,0 +1,66 @@ +import markdown from 'lib/markdown' + +const contentWithEmojiTitle = ` +This is not a title + +# :smile: **This** is a title + +Preview line + +- [ ] task1 +- [x] task2 +- [ ] task3 + +` + +const contentWithOutHeading = ` +This should be title + +this should be a previewed content +` + +const contentWithImg = ` +# Awesome Electron [![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome) + +[](http://electron.atom.io) + +> Useful resources for creating apps with [Electron](http://electron.atom.io) +` + +// const mathString = ` +// L is lift force, +// $$\\rho$$ is air density, +// $$v$$ is true airspeed, +// $$A$$ is the wing area, and +// $$C_L$$ is the lift coefficient at the desired angle of attack + +// $$$ +// L = \\frac{1}{2} \\rho v^2 A C_L +// $$$ +// ` + +describe('markdown', () => { + it('should parse emoji', () => { + const parsed = markdown.parse(contentWithEmojiTitle) + expect(parsed.data.title).toEqual('😄 This is a title') + expect(parsed.data.preview).toEqual('Preview line') + }) + + it('should return first line as a title', () => { + const parsed = markdown.parse(contentWithOutHeading) + expect(parsed.data.title).toEqual('This should be title') + expect(parsed.data.preview).toEqual('this should be a previewed content') + }) + + it('should handle empty string', () => { + const parsed = markdown.parse('') + expect(parsed.data.title).toEqual('') + expect(parsed.data.preview).toEqual('') + }) + + it('skip img when finding preview', () => { + const parsed = markdown.parse(contentWithImg) + expect(parsed.data.title).toEqual('Awesome Electron Awesome') + expect(parsed.data.preview).toEqual('Useful resources for creating apps with Electron') + }) +}) diff --git a/specs/__functional__/main/lib/dataApi/createNote.spec.js b/specs/__functional__/main/lib/dataApi/createNote.spec.js new file mode 100644 index 0000000000..096b88fcf2 --- /dev/null +++ b/specs/__functional__/main/lib/dataApi/createNote.spec.js @@ -0,0 +1,53 @@ +import createNote from 'main/lib/dataAPI/createNote' +import DummyDB from 'specs/utils/DummyDB' +import { + NOTE_ID_PREFIX, + TAG_ID_PREFIX +} from 'main/lib/dataAPI/consts' + +const dbName = __filename +const db = new DummyDB(dbName) + +function fetchNote (noteId) { + return db.get(NOTE_ID_PREFIX + noteId) +} + +function fetchTag () { + return db.get(TAG_ID_PREFIX + tagName) +} + +const folderName = 'Test Folder' +const tagName = 'test_tag' +const note = { + meta: {}, + content: 'test', + tags: [tagName], + folder: folderName, + createdAt: new Date(), + updatedAt: new Date() +} + +describe('dataApi.createNote', () => { + it('should create a note', () => { + return createNote(dbName, note) + .then(res => { + expect(res.note.get('content')).toEqual(note.content) + return res.id + }) + .then(fetchNote) + .then(res => { + expect(res).not.toBeNull() + expect(res.content).toEqual(note.content) + expect(res.folder).toEqual(folderName) + expect(res.tags[0]).toEqual(tagName) + }) + .then(fetchTag) + .then(doc => { + expect(doc._id).toEqual(TAG_ID_PREFIX + tagName) + }) + }) + + afterAll(() => { + return db.destory() + }) +}) diff --git a/specs/__functional__/main/lib/dataApi/deleteFolder.spec.js b/specs/__functional__/main/lib/dataApi/deleteFolder.spec.js new file mode 100644 index 0000000000..a030a04064 --- /dev/null +++ b/specs/__functional__/main/lib/dataApi/deleteFolder.spec.js @@ -0,0 +1,82 @@ +import deleteFolder from 'main/lib/dataAPI/deleteFolder' +import DummyDB from 'specs/utils/DummyDB' +import { + FOLDER_ID_PREFIX, + NOTE_ID_PREFIX +} from 'main/lib/dataAPI/consts' + +const dbName = __filename +const db = new DummyDB(dbName) + +const folderName = 'Testt Folder' +const noteId = 'testnote' +const note = { + title: 'test', + content: 'test\ncontent', + tags: ['test_tag'], + folder: folderName +} + +function createDummyFolder () { + return db.createFolder(folderName) +} + +function createDummyNote () { + return db.createNote(noteId, note) +} + +function fetchFolder () { + return db + .get(FOLDER_ID_PREFIX + folderName) +} + +function fetchNote () { + return db + .get(NOTE_ID_PREFIX + noteId) +} + +function createWrongView () { + return db.get('_design/notes') + .catch(err => { + if (err.name !== 'not_found') throw err + }) + .then(doc => { + return db.put(Object.assign({}, doc, { + _id: '_design/notes', + views: {} + })) + }) +} + +describe('dataAPI.deleteFolder', () => { + beforeAll(() => { + return createDummyFolder() + .then(createDummyNote) + .then(createWrongView) + }) + + it('should delete folder and its notes', () => { + return deleteFolder(dbName, folderName) + .then(folder => { + expect(folder.id).toEqual(folderName) + }) + .then(fetchFolder) + .then(res => { + throw new Error('should not fired') + }) + .catch(err => { + expect(err.message).toEqual('missing') + }) + .then(fetchNote) + .then(res => { + throw new Error('should not fired') + }) + .catch(err => { + expect(err.message).toEqual('missing') + }) + }) + + afterAll(() => { + return db.destory() + }) +}) diff --git a/specs/main/lib/data/deleteNote.spec.js b/specs/__functional__/main/lib/dataApi/deleteNote.spec.js similarity index 53% rename from specs/main/lib/data/deleteNote.spec.js rename to specs/__functional__/main/lib/dataApi/deleteNote.spec.js index e518479ff6..269139b05f 100644 --- a/specs/main/lib/data/deleteNote.spec.js +++ b/specs/__functional__/main/lib/dataApi/deleteNote.spec.js @@ -24,26 +24,26 @@ function fetchNote (noteId) { return db.get(NOTE_ID_PREFIX + noteId) } -export const before = t => { - return createdDummyNote() -} +describe('dataAPI.deleteNote', () => { + beforeAll(() => { + return createdDummyNote() + }) -export default t => { - return deleteNote(dbName, noteId) - .then(res => { - return res.id - }) - .then(fetchNote) - .then(res => { - t.fail('The note should not exist.') - }) - .catch(err => { - if (err.name !== 'not_found') { - throw err - } - }) -} + it('should delete a note', () => { + return deleteNote(dbName, noteId) + .then(res => { + return res.id + }) + .then(fetchNote) + .then(res => { + throw new Error('should not fired') + }) + .catch(err => { + expect(err.message).toEqual('missing') + }) + }) -export const after = t => { - return db.destory() -} + afterAll(() => { + return db.destory() + }) +}) diff --git a/specs/main/lib/data/deleteTag.spec.js b/specs/__functional__/main/lib/dataApi/deleteTag.spec.js similarity index 58% rename from specs/main/lib/data/deleteTag.spec.js rename to specs/__functional__/main/lib/dataApi/deleteTag.spec.js index abfcb279b4..c3e03e2bed 100644 --- a/specs/main/lib/data/deleteTag.spec.js +++ b/specs/__functional__/main/lib/dataApi/deleteTag.spec.js @@ -46,32 +46,32 @@ function createWrongView () { }) } -export const before = t => { - return createDummyTag() - .then(createDummyNote) - .then(createWrongView) -} +describe('dataAPI.deleteTag', () => { + beforeAll(() => { + return createDummyTag() + .then(createDummyNote) + .then(createWrongView) + }) -export default t => { - return deleteTag(dbName, tagName) - .then(tag => { - t.equal(tag.id, tagName) - }) - .then(fetchNote) - .then(res => { - t.equal(res.tags.length, 0) - }) - .then(fetchTag) - .then(res => { - t.fail('The tag should not exist.') - }) - .catch(err => { - if (err.name !== 'not_found') { - throw err - } - }) -} + it('should delete a tag and untag its notes', () => { + return deleteTag(dbName, tagName) + .then(tag => { + expect(tag.id).toEqual(tagName) + }) + .then(fetchNote) + .then(res => { + expect(res.tags.length).toEqual(0) + }) + .then(fetchTag) + .then(res => { + throw new Error('should not fired') + }) + .catch(err => { + expect(err.message).toEqual('missing') + }) + }) -export const after = t => { - return db.destory() -} + afterAll(() => { + return db.destory() + }) +}) diff --git a/specs/__functional__/main/lib/dataApi/loadAllStorages.spec.js b/specs/__functional__/main/lib/dataApi/loadAllStorages.spec.js new file mode 100644 index 0000000000..b47a207ed7 --- /dev/null +++ b/specs/__functional__/main/lib/dataApi/loadAllStorages.spec.js @@ -0,0 +1,21 @@ +import loadAllStorages from 'main/lib/dataAPI/loadAllStorages' + +describe('dataAPI.loadAllStorages', () => { + beforeAll(() => { + window.localStorage.setItem('storages', JSON.stringify([{name: 'Test Storage'}])) + }) + + it('load all storages', () => { + return loadAllStorages() + .then(storageMap => { + const storages = ['Notebook', 'Test Storage'] + storages.forEach(storageName => { + expect(storageMap.hasIn([storageName])).toBeTruthy() + expect(storageMap.hasIn([storageName, 'noteMap'])).toBeTruthy() + expect(storageMap.hasIn([storageName, 'folderMap'])).toBeTruthy() + expect(storageMap.hasIn([storageName, 'folderMap', 'Notes'])).toBeTruthy() + expect(storageMap.hasIn([storageName, 'tagMap'])).toBeTruthy() + }) + }) + }) +}) diff --git a/specs/__functional__/main/lib/dataApi/loadStorage.spec.js b/specs/__functional__/main/lib/dataApi/loadStorage.spec.js new file mode 100644 index 0000000000..f6589dbbb3 --- /dev/null +++ b/specs/__functional__/main/lib/dataApi/loadStorage.spec.js @@ -0,0 +1,46 @@ +import loadStorage from 'main/lib/dataAPI/loadStorage' +import DummyDB from 'specs/utils/DummyDB' + +const dbName = __filename +const db = new DummyDB(dbName) + +const folderName = 'Test Folder' +const noteId = 'testnote' +const note = { + content: 'test\ncontent', + tags: ['test_tag'], + folder: folderName +} + +function createDummyFolder () { + return db.createFolder(folderName) +} + +function createDummyNote () { + return db.createNote(noteId, note) +} + +describe('dataAPI.loadStorage', () => { + beforeAll(() => { + return createDummyFolder(folderName) + .then(createDummyNote) + }) + + it('should load a storage', () => { + return loadStorage(dbName) + .then(storageMap => { + expect(storageMap.has('noteMap')).toBeTruthy() + expect(storageMap.has('folderMap')).toBeTruthy() + expect(storageMap.hasIn(['folderMap', folderName])).toBeTruthy() + expect(storageMap.hasIn(['folderMap', folderName, 'notes'])).toBeTruthy() + expect(storageMap.getIn(['folderMap', folderName, 'notes']).includes(noteId)).toBeTruthy() + expect(storageMap.hasIn(['tagMap'])).toBeTruthy() + expect(storageMap.hasIn(['tagMap', 'test_tag', 'notes'])).toBeTruthy() + expect(storageMap.getIn(['tagMap', 'test_tag', 'notes']).first()).toEqual(noteId) + }) + }) + + afterAll(() => { + return db.destory() + }) +}) diff --git a/specs/main/lib/data/renameFolder.spec.js b/specs/__functional__/main/lib/dataApi/renameFolder.spec.js similarity index 50% rename from specs/main/lib/data/renameFolder.spec.js rename to specs/__functional__/main/lib/dataApi/renameFolder.spec.js index 0ac8b98791..60bf3a5dd1 100644 --- a/specs/main/lib/data/renameFolder.spec.js +++ b/specs/__functional__/main/lib/dataApi/renameFolder.spec.js @@ -41,35 +41,35 @@ function fetchNote () { .get(NOTE_ID_PREFIX + noteId) } -export const before = t => { - return createDummyFolder() - .then(createDummyNote) -} +describe('dataAPI.renameFolder', () => { + beforeAll(() => { + return createDummyFolder() + .then(createDummyNote) + }) -export default t => { - return renameFolder(dbName, folderName, newFolderName) - .then(folder => { - t.equal(folder.id, folderName) - }) - .then(fetchFolder) - .then(res => { - t.fail('The folder must not exist.') - }) - .catch(err => { - if (err.name !== 'not_found') { - throw err - } - }) - .then(fetchNote) - .then(res => { - t.equal(res.folder, newFolderName) - }) - .then(fetchRenamedFolder) - .then(res => { - t.equal(res._id, FOLDER_ID_PREFIX + newFolderName) - }) -} + it('should delete old folder and create a new folder and move all notes to the new folder', () => { + return renameFolder(dbName, folderName, newFolderName) + .then(folder => { + expect(folder.id).toEqual(folderName) + }) + .then(fetchFolder) + .then(res => { + throw new Error('should not fired') + }) + .catch(err => { + expect(err.message).toEqual('missing') + }) + .then(fetchNote) + .then(res => { + expect(res.folder).toEqual(newFolderName) + }) + .then(fetchRenamedFolder) + .then(res => { + expect(res._id).toEqual(FOLDER_ID_PREFIX + newFolderName) + }) + }) -export const after = t => { - return db.destory() -} + afterAll(() => { + return db.destory() + }) +}) diff --git a/specs/main/lib/data/renameTag.spec.js b/specs/__functional__/main/lib/dataApi/renameTag.spec.js similarity index 50% rename from specs/main/lib/data/renameTag.spec.js rename to specs/__functional__/main/lib/dataApi/renameTag.spec.js index c5c43e591c..98e10c4d26 100644 --- a/specs/main/lib/data/renameTag.spec.js +++ b/specs/__functional__/main/lib/dataApi/renameTag.spec.js @@ -57,42 +57,42 @@ function fetchAnotherNote () { .get(NOTE_ID_PREFIX + anotherNoteId) } -export const before = t => { - return createDummyTag() - .then(createDummyNote) - .then(createAnotherDummyNote) -} +describe('dataAPI.renameFolder', () => { + beforeAll(() => { + return createDummyTag() + .then(createDummyNote) + .then(createAnotherDummyNote) + }) -export default t => { - return renameTag(dbName, tagName, newTagName) - .then(tag => { - t.equal(tag.id, tagName) - }) - .then(fetchTag) - .then(res => { - t.fail('The tag must be deleted.') - }) - .catch(err => { - if (err.name !== 'not_found') { - throw err - } - }) - .then(fetchNote) - .then(res => { - t.ok(res.tags.indexOf(tagName) === -1) - t.ok(res.tags.indexOf(newTagName) > -1) - }) - .then(fetchAnotherNote) - .then(res => { - t.ok(res.tags.indexOf(tagName) === -1) - t.ok(res.tags.indexOf(newTagName) > -1) - }) - .then(fetchRenamedTag) - .then(res => { - t.equal(res._id, TAG_ID_PREFIX + newTagName) - }) -} + it('should delete old tag and create a new tag and update all notes', () => { + return renameTag(dbName, tagName, newTagName) + .then(tag => { + expect(tag.id).toEqual(tagName) + }) + .then(fetchTag) + .then(res => { + throw new Error('should not fired') + }) + .catch(err => { + expect(err.message).toEqual('missing') + }) + .then(fetchNote) + .then(res => { + expect(res.tags.indexOf(tagName) === -1).toBeTruthy() + expect(res.tags.indexOf(newTagName) > -1).toBeTruthy() + }) + .then(fetchAnotherNote) + .then(res => { + expect(res.tags.indexOf(tagName) === -1).toBeTruthy() + expect(res.tags.indexOf(newTagName) > -1).toBeTruthy() + }) + .then(fetchRenamedTag) + .then(res => { + expect(res._id).toEqual(TAG_ID_PREFIX + newTagName) + }) + }) -export const after = t => { - return db.destory() -} + afterAll(() => { + return db.destory() + }) +}) diff --git a/specs/__functional__/main/lib/dataApi/updateNote.spec.js b/specs/__functional__/main/lib/dataApi/updateNote.spec.js new file mode 100644 index 0000000000..d1a858dd25 --- /dev/null +++ b/specs/__functional__/main/lib/dataApi/updateNote.spec.js @@ -0,0 +1,66 @@ +import updateNote from 'main/lib/dataAPI/updateNote' +import DummyDB from 'specs/utils/DummyDB' +import { + NOTE_ID_PREFIX, + TAG_ID_PREFIX +} from 'main/lib/dataAPI/consts' + +const dbName = __filename +const db = new DummyDB(dbName) + +const noteId = 'testNote' +const note = { + content: 'test', + tags: ['test_tag'], + folder: 'Notes', + createdAt: new Date(), + updatedAt: new Date() +} +const newNote = { + meta: { + title: 'changed' + }, + content: 'changed', + tags: ['changed'] +} + +function createdDummyNote () { + return db.createNote(noteId, note) +} + +function fetchNote (noteId) { + return db.get(NOTE_ID_PREFIX + noteId) +} + +function fetchNewTag () { + return db.get(TAG_ID_PREFIX + newNote.tags[0]) +} + +describe('dataAPI.updateNote', () => { + beforeAll(() => { + return createdDummyNote() + }) + + it('should update note', () => { + return updateNote(dbName, noteId, newNote) + .then(res => { + expect(res.note.get('content')).toEqual('changed') + return res.id + }) + .then(fetchNote) + .then(res => { + expect(res).not.toBeNull() + expect(res.content).toEqual('changed') + expect(res.tags[0]).toEqual('changed') + }) + .then(fetchNewTag) + .then(res => { + expect(res).not.toBeNull() + expect(res._id).toEqual(TAG_ID_PREFIX + newNote.tags[0]) + }) + }) + + afterAll(() => { + return db.destory() + }) +}) diff --git a/specs/__functional__/main/lib/dataApi/upsertFolder.spec.js b/specs/__functional__/main/lib/dataApi/upsertFolder.spec.js new file mode 100644 index 0000000000..41a95bb715 --- /dev/null +++ b/specs/__functional__/main/lib/dataApi/upsertFolder.spec.js @@ -0,0 +1,30 @@ +import upsertFolder from 'main/lib/dataAPI/upsertFolder' +import DummyDB from 'specs/utils/DummyDB' +import { + FOLDER_ID_PREFIX +} from 'main/lib/dataAPI/consts' + +const dbName = __filename +const db = new DummyDB(dbName) + +function fetchFolder () { + return db + .get(FOLDER_ID_PREFIX + 'Test Folder') +} + +describe('dataAPI.upsertFolder', () => { + it('should create a folder', () => { + return upsertFolder(dbName, 'Test Folder') + .then(folder => { + expect(folder.id).toEqual('Test Folder') + }) + .then(fetchFolder) + .then(res => { + expect(res).not.toBeNull() + }) + }) + + afterAll(() => { + return db.destory() + }) +}) diff --git a/specs/__functional__/main/lib/dataApi/upsertTag.spec.js b/specs/__functional__/main/lib/dataApi/upsertTag.spec.js new file mode 100644 index 0000000000..9be0e69e7c --- /dev/null +++ b/specs/__functional__/main/lib/dataApi/upsertTag.spec.js @@ -0,0 +1,29 @@ +import upsertTag from 'main/lib/dataAPI/upsertTag' +import DummyDB from 'specs/utils/DummyDB' +import { + TAG_ID_PREFIX +} from 'main/lib/dataAPI/consts' + +const dbName = __filename +const db = new DummyDB(dbName) + +function fetchTag () { + return db + .get(TAG_ID_PREFIX + 'Test_tag') +} + +describe('dataAPI.upsertTag', () => { + it('should create a tag', () => { + return upsertTag(dbName, 'Test_tag') + .then(tag => { + expect(tag.id).toEqual('Test_tag') + }) + .then(fetchTag) + .then(res => { + expect(res != null).toBeTruthy() + }) + }) + afterAll(() => { + return db.destory() + }) +}) diff --git a/specs/mock/LocalStorage.js b/specs/__mocks__/LocalStorageMock.js similarity index 88% rename from specs/mock/LocalStorage.js rename to specs/__mocks__/LocalStorageMock.js index 6ba343c3e3..e95683ee45 100644 --- a/specs/mock/LocalStorage.js +++ b/specs/__mocks__/LocalStorageMock.js @@ -1,4 +1,4 @@ -class LocalStorage { +class LocalStorageMock { constructor () { this.data = {} @@ -28,4 +28,4 @@ class LocalStorage { } } -export default LocalStorage +export default LocalStorageMock diff --git a/specs/__mocks__/fileMock.js b/specs/__mocks__/fileMock.js new file mode 100644 index 0000000000..0e56c5b5f7 --- /dev/null +++ b/specs/__mocks__/fileMock.js @@ -0,0 +1 @@ +module.exports = 'test-file-stub' diff --git a/specs/__mocks__/styleMock.js b/specs/__mocks__/styleMock.js new file mode 100644 index 0000000000..4ba52ba2c8 --- /dev/null +++ b/specs/__mocks__/styleMock.js @@ -0,0 +1 @@ +module.exports = {} diff --git a/specs/lib/markdown.spec.js b/specs/lib/markdown.spec.js deleted file mode 100644 index 3c9de21e9d..0000000000 --- a/specs/lib/markdown.spec.js +++ /dev/null @@ -1,61 +0,0 @@ -import markdown from 'lib/markdown' - -const rawString1 = ` -This is not a title - -# :smile: **This** is a title - -Preview line - -- [ ] task1 -- [x] task2 -- [ ] task3 - -` - -const rawString2 = ` -This should be title - -this should be a previewed content -` - -const rawString4 = ` -# Awesome Electron [![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome) - -[](http://electron.atom.io) - -> Useful resources for creating apps with [Electron](http://electron.atom.io) -` - -const mathString = ` -L is lift force, -$$\\rho$$ is air density, -$$v$$ is true airspeed, -$$A$$ is the wing area, and -$$C_L$$ is the lift coefficient at the desired angle of attack - -$$$ -L = \\frac{1}{2} \\rho v^2 A C_L -$$$ -` - -export default t => { - let parsed1 = markdown.parse(rawString1) - t.equal(parsed1.data.title, '😄 This is a title') - t.equal(parsed1.data.preview, 'Preview line') - - let parsed2 = markdown.parse(rawString2) - t.equal(parsed2.data.title, 'This should be title') - t.equal(parsed2.data.preview, 'this should be a previewed content') - - let parsed3 = markdown.parse('') - t.equal(parsed3.data.title, '') - t.equal(parsed3.data.preview, '') - - let parsed4 = markdown.parse(rawString4) - t.equal(parsed4.data.title, 'Awesome Electron Awesome') - t.equal(parsed4.data.preview, 'Useful resources for creating apps with Electron') - - // let parsedMath = markdown.parse(mathString) - // console.log(parsedMath.toString()) -} diff --git a/specs/main/lib/data/createNote.spec.js b/specs/main/lib/data/createNote.spec.js deleted file mode 100644 index e3955d9e53..0000000000 --- a/specs/main/lib/data/createNote.spec.js +++ /dev/null @@ -1,51 +0,0 @@ -import createNote from 'main/lib/dataAPI/createNote' -import DummyDB from 'specs/utils/DummyDB' -import { - NOTE_ID_PREFIX, - TAG_ID_PREFIX -} from 'main/lib/dataAPI/consts' - -const dbName = __filename -const db = new DummyDB(dbName) - -const folderName = 'Test Folder' -const tagName = 'test_tag' -const note = { - meta: {}, - content: 'test', - tags: [tagName], - folder: folderName, - createdAt: new Date(), - updatedAt: new Date() -} - -function fetchNote (noteId) { - return db.get(NOTE_ID_PREFIX + noteId) -} - -function fetchTag () { - return db.get(TAG_ID_PREFIX + tagName) -} - -export default t => { - return createNote(dbName, note) - .then(res => { - t.equal(res.note.get('content'), note.content) - return res.id - }) - .then(fetchNote) - .then(res => { - t.ok(res != null) - t.equal(res.content, note.content) - t.equal(res.folder, folderName) - t.equal(res.tags[0], tagName) - }) - .then(fetchTag) - .then(doc => { - t.equal(doc._id, TAG_ID_PREFIX + tagName) - }) -} - -export const after = t => { - return db.destory() -} diff --git a/specs/main/lib/data/deleteFolder.spec.js b/specs/main/lib/data/deleteFolder.spec.js deleted file mode 100644 index d44a8bb345..0000000000 --- a/specs/main/lib/data/deleteFolder.spec.js +++ /dev/null @@ -1,70 +0,0 @@ -import deleteFolder from 'main/lib/dataAPI/deleteFolder' -import DummyDB from 'specs/utils/DummyDB' -import { - FOLDER_ID_PREFIX, - NOTE_ID_PREFIX -} from 'main/lib/dataAPI/consts' - -const dbName = __filename -const db = new DummyDB(dbName) - -const folderName = 'Testt Folder' -const noteId = 'testnote' -const note = { - title: 'test', - content: 'test\ncontent', - tags: ['test_tag'], - folder: folderName -} - -function createDummyFolder () { - return db.createFolder(folderName) -} - -function createDummyNote () { - return db.createNote(noteId, note) -} - -function fetchFolder () { - return db - .get(FOLDER_ID_PREFIX + folderName) -} - -function fetchNote () { - return db - .get(NOTE_ID_PREFIX + noteId) -} - -export const before = t => { - return createDummyFolder() - .then(createDummyNote) -} - -export default t => { - return deleteFolder(dbName, folderName) - .then(folder => { - t.equal(folder.id, folderName) - }) - .then(fetchFolder) - .then(res => { - t.fail('The folder must not exist.') - }) - .catch(err => { - if (err.name !== 'not_found') { - throw err - } - }) - .then(fetchNote) - .then(res => { - t.fail('The note should not exist.') - }) - .catch(err => { - if (err.name !== 'not_found') { - throw err - } - }) -} - -export const after = t => { - return db.destory() -} diff --git a/specs/main/lib/data/loadAllStorages.spec.js b/specs/main/lib/data/loadAllStorages.spec.js deleted file mode 100644 index e3dd80cb02..0000000000 --- a/specs/main/lib/data/loadAllStorages.spec.js +++ /dev/null @@ -1,20 +0,0 @@ -import loadAllStorages from 'main/lib/dataAPI/loadAllStorages' -import LocalStorage from 'specs/mock/LocalStorage' - -const localStorage = new LocalStorage() -localStorage.setItem('storages', JSON.stringify([{name: 'Test Storage'}])) -loadAllStorages.__Rewire__('localStorage', localStorage) - -export default t => { - return loadAllStorages() - .then(storageMap => { - const storages = ['Notebook', 'Test Storage'] - storages.forEach(storageName => { - t.ok(storageMap.hasIn([storageName])) - t.ok(storageMap.hasIn([storageName, 'noteMap'])) - t.ok(storageMap.hasIn([storageName, 'folderMap'])) - t.ok(storageMap.hasIn([storageName, 'folderMap', 'Notes'])) - t.ok(storageMap.hasIn([storageName, 'tagMap'])) - }) - }) -} diff --git a/specs/main/lib/data/loadStorage.spec.js b/specs/main/lib/data/loadStorage.spec.js deleted file mode 100644 index c83fb4671e..0000000000 --- a/specs/main/lib/data/loadStorage.spec.js +++ /dev/null @@ -1,44 +0,0 @@ -import loadStorage from 'main/lib/dataAPI/loadStorage' -import DummyDB from 'specs/utils/DummyDB' - -const dbName = __filename -const db = new DummyDB(dbName) - -const folderName = 'Test Folder' -const noteId = 'testnote' -const note = { - content: 'test\ncontent', - tags: ['test_tag'], - folder: folderName -} - -function createDummyFolder () { - return db.createFolder(folderName) -} - -function createDummyNote () { - return db.createNote(noteId, note) -} - -export const before = t => { - return createDummyFolder(folderName) - .then(createDummyNote) -} - -export default t => { - return loadStorage(dbName) - .then(storageMap => { - t.ok(storageMap.has('noteMap')) - t.ok(storageMap.has('folderMap')) - t.ok(storageMap.hasIn(['folderMap', folderName])) - t.ok(storageMap.hasIn(['folderMap', folderName, 'notes'])) - t.ok(storageMap.getIn(['folderMap', folderName, 'notes']).includes(noteId)) - t.ok(storageMap.hasIn(['tagMap'])) - t.ok(storageMap.hasIn(['tagMap', 'test_tag', 'notes'])) - t.equal(storageMap.getIn(['tagMap', 'test_tag', 'notes']).first(), noteId) - }) -} - -export const after = t => { - return db.destory() -} diff --git a/specs/main/lib/data/updateNote.spec.js b/specs/main/lib/data/updateNote.spec.js deleted file mode 100644 index a429266f6a..0000000000 --- a/specs/main/lib/data/updateNote.spec.js +++ /dev/null @@ -1,54 +0,0 @@ -import updateNote from 'main/lib/dataAPI/updateNote' -import DummyDB from 'specs/utils/DummyDB' -import { - NOTE_ID_PREFIX -} from 'main/lib/dataAPI/consts' - -const dbName = __filename -const db = new DummyDB(dbName) - -const noteId = 'testNote' -const note = { - content: 'test', - tags: ['test_tag'], - folder: 'Notes', - createdAt: new Date(), - updatedAt: new Date() -} -const newNote = { - meta: { - title: 'changed' - }, - content: 'changed', - tags: ['changed'] -} - -function createdDummyNote () { - return db.createNote(noteId, note) -} - -function fetchNote (noteId) { - return db.get(NOTE_ID_PREFIX + noteId) -} - -export const before = t => { - return createdDummyNote() -} - -export default t => { - return updateNote(dbName, noteId, newNote) - .then(res => { - t.equal(res.note.get('content'), 'changed') - return res.id - }) - .then(fetchNote) - .then(res => { - t.ok(res != null) - t.equal(res.content, 'changed') - t.equal(res.tags[0], 'changed') - }) -} - -export const after = t => { - return db.destory() -} diff --git a/specs/main/lib/data/upsertFolder.spec.js b/specs/main/lib/data/upsertFolder.spec.js deleted file mode 100644 index e02ccf9243..0000000000 --- a/specs/main/lib/data/upsertFolder.spec.js +++ /dev/null @@ -1,28 +0,0 @@ -import upsertFolder from 'main/lib/dataAPI/upsertFolder' -import DummyDB from 'specs/utils/DummyDB' -import { - FOLDER_ID_PREFIX -} from 'main/lib/dataAPI/consts' - -const dbName = __filename -const db = new DummyDB(dbName) - -function fetchFolder () { - return db - .get(FOLDER_ID_PREFIX + 'Test Folder') -} - -export default t => { - return upsertFolder(dbName, 'Test Folder') - .then(folder => { - t.equal(folder.id, 'Test Folder') - }) - .then(fetchFolder) - .then(res => { - t.ok(res != null) - }) -} - -export const after = t => { - return db.destory() -} diff --git a/specs/main/lib/data/upsertTag.spec.js b/specs/main/lib/data/upsertTag.spec.js deleted file mode 100644 index 38eab6896b..0000000000 --- a/specs/main/lib/data/upsertTag.spec.js +++ /dev/null @@ -1,28 +0,0 @@ -import upsertTag from 'main/lib/dataAPI/upsertTag' -import DummyDB from 'specs/utils/DummyDB' -import { - TAG_ID_PREFIX -} from 'main/lib/dataAPI/consts' - -const dbName = __filename -const db = new DummyDB(dbName) - -function fetchTag () { - return db - .get(TAG_ID_PREFIX + 'Test_tag') -} - -export default t => { - return upsertTag(dbName, 'Test_tag') - .then(tag => { - t.equal(tag.id, 'Test_tag') - }) - .then(fetchTag) - .then(res => { - t.ok(res != null) - }) -} - -export const after = t => { - return db.destory() -} diff --git a/specs/utils/setup.js b/specs/utils/setup.js new file mode 100644 index 0000000000..7f5b2004df --- /dev/null +++ b/specs/utils/setup.js @@ -0,0 +1,5 @@ +import LocalStorageMock from 'specs/__mocks__/LocalStorageMock' + +Object.defineProperty(window, 'localStorage', { + value: new LocalStorageMock() +}) diff --git a/src/main/lib/dataAPI/deleteFolder.js b/src/main/lib/dataAPI/deleteFolder.js index 4eaed926da..cd6eeb63fa 100644 --- a/src/main/lib/dataAPI/deleteFolder.js +++ b/src/main/lib/dataAPI/deleteFolder.js @@ -26,6 +26,21 @@ export default function deleteFolder (storageName, folderName) { include_docs: true }) }) + .catch(err => { + if (err.message === 'ddoc notes has no view named by_folder') { + return db.get(notesView._id) + .then(ddoc => { + return db.put(Object.assign(ddoc, notesView)) + }) + .then(res => { + return db.query('notes/by_folder', { + key: folderName, + include_docs: true + }) + }) + } + throw err + }) .then(function (result) { let docs = result.rows.map(row => { row.doc._deleted = true diff --git a/src/main/lib/dataAPI/deleteTag.js b/src/main/lib/dataAPI/deleteTag.js index 58da0e5080..cd6f9dc283 100644 --- a/src/main/lib/dataAPI/deleteTag.js +++ b/src/main/lib/dataAPI/deleteTag.js @@ -29,6 +29,21 @@ export default function deleteTag (storageName, tagName) { include_docs: true }) }) + .catch(err => { + if (err.message === 'ddoc notes has no view named by_tag') { + return db.get(notesView._id) + .then(ddoc => { + return db.put(Object.assign(ddoc, notesView)) + }) + .then(res => { + return db.query('notes/by_tag', { + key: tagName, + include_docs: true + }) + }) + } + throw err + }) .then(function (result) { let docs = result.rows.map(row => { row.doc.tags = row.doc.tags diff --git a/src/main/lib/dataAPI/updateNote.js b/src/main/lib/dataAPI/updateNote.js index 6d8f955a66..dc83cb1e3a 100644 --- a/src/main/lib/dataAPI/updateNote.js +++ b/src/main/lib/dataAPI/updateNote.js @@ -1,6 +1,7 @@ import { getDB } from './context' import { - NOTE_ID_PREFIX + NOTE_ID_PREFIX, + TAG_ID_PREFIX } from './consts' import { Map, Set } from 'immutable' import _ from 'lodash' @@ -17,8 +18,23 @@ export default function updateNote (storageName, noteId, payload) { _rev: doc._rev, updatedAt: new Date().toJSON() }) - return db - .put(payload) + + return Promise + .all(payload.tags.map(tag => { + return db.get(TAG_ID_PREFIX + tag) + .catch(err => { + if (err.name === 'not_found') { + return db.put({ + _id: TAG_ID_PREFIX + tag + }) + } + throw err + }) + })) + .then(res => { + return db + .put(payload) + }) .then(res => { return { id: noteId, diff --git a/tools/webpack-test-entry.js b/tools/webpack-test-entry.js deleted file mode 100644 index d3d2168faf..0000000000 --- a/tools/webpack-test-entry.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * # Test entry - * - * Grab `*.spec.js` files - * - * TODO: Render result as a react - * - */ - -const _ = require('lodash') -const assert = require('assert') -const t = assert - -function runTest (key, spec, isReloaded) { - return Promise.resolve() - .then(function doBefore () { - if (_.isFunction(spec.before)) { - return spec.before(t) - } - }) - .catch(function handleBeforeError (err) { - console.warn('Test(Before) failed: ' + key) - console.error(err.stack || err) - throw new Error('NO_TEST') - }) - .then(function doTest () { - if (_.isFunction(spec.default)) { - return Promise.resolve(spec.default(t)) - .then(function showResult (v) { - console.info(`%c${key} ${(isReloaded ? 're-' : '')}tested successfully.`, 'color: green;') - }) - } else { - console.warn(`${key} has no test`) - } - }) - .catch(function handleTestError (err) { - // Skip if the error already caught. - if (err.message !== 'NO_TEST') { - console.warn('Test failed: ' + key) - console.error(err.stack || err) - } - }) - .then(function doAfter () { - if (_.isFunction(spec.before)) { - return spec.before(t) - } - }) - .catch(function handleAfterError (err) { - console.warn('Test(After) failed: ' + key) - console.error(err.stack || err) - }) -} - -function loadContext () { - return require.context('../specs', true, /\.spec\.js$/) -} - -let specContext = loadContext() - -let modules = {} -specContext.keys().forEach(function (key) { - let spec = specContext(key) - modules[key] = spec - runTest(key, spec, false) -}) - -if (module.hot) { - module.hot.accept(specContext.id, function () { - let reloadedContext = loadContext() - let changedModules = reloadedContext.keys() - .map(function (key) { - return [key, reloadedContext(key)] - }) - .filter(function (reloadedModule) { - return modules[reloadedModule[0]] !== reloadedModule[1] - }) - changedModules.forEach(function (specTuple) { - modules[specTuple[0]] = specTuple[1] - runTest(specTuple[0], specTuple[1], true) - }) - }) -} diff --git a/tools/webpack-test.html b/tools/webpack-test.html deleted file mode 100644 index 474eb07272..0000000000 --- a/tools/webpack-test.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - Inpad Test - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/webpack-test.js b/tools/webpack-test.js deleted file mode 100644 index 3e9cf5c023..0000000000 --- a/tools/webpack-test.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict' - -const electron = require('electron') -const { app, BrowserWindow } = electron -const path = require('path') - -let mainWindow = null - -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit() - } -}) - -app.on('ready', () => { - mainWindow = new BrowserWindow({ - width: 800, - height: 600 - }) - mainWindow.loadURL('file://' + path.join(__dirname, '/webpack-test.html')) -}) diff --git a/webpack.config.js b/webpack.config.js index 78912484fc..cd759eff31 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -129,22 +129,6 @@ switch (process.env.NODE_ENV) { config.entry.main = devEntry.concat(config.entry.main) config.entry.preferences = devEntry.concat(config.entry.preferences) break - case 'test': - config.plugins.push(new webpack.HotModuleReplacementPlugin()) - - config.entry = { - test: [ - 'webpack-dev-server/client?http://localhost:' + 8081, - 'webpack/hot/only-dev-server', - './tools/webpack-test-entry.js' - ] - } - - config.output.publicPath = 'http://localhost:' + 8081 + '/assets/' - config.devServer.port = 8081 - config.node.__filename = true - config.node.__dirname = true - config.resolve.alias.specs = path.join(__dirname, 'specs') } module.exports = config From 51c120c900357c62e7e157203d69dbce9f70e507 Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Sun, 8 Jan 2017 16:21:24 +0900 Subject: [PATCH 13/24] :green_heart: Init Travis --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..b16d7f9235 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - "6" \ No newline at end of file From 938e3c68f29d4d3087983973f625064fe8c01a6b Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Tue, 10 Jan 2017 15:44:45 +0900 Subject: [PATCH 14/24] :white_check_mark: Add test for storageMap reducer --- .../main/lib/dataApi/createNote.spec.js | 9 ++ .../main/lib/dataApi/updateNote.spec.js | 10 ++ .../lib/redux/reducers/storageMap.spec.js | 121 ++++++++++++++++++ specs/utils/DummyStorageMap.js | 81 ++++++++++++ src/main/lib/dataAPI/createNote.js | 12 ++ src/main/lib/dataAPI/updateNote.js | 12 ++ src/main/lib/redux/reducers/storageMap.js | 11 +- 7 files changed, 253 insertions(+), 3 deletions(-) create mode 100644 specs/__functional__/main/lib/redux/reducers/storageMap.spec.js create mode 100644 specs/utils/DummyStorageMap.js diff --git a/specs/__functional__/main/lib/dataApi/createNote.spec.js b/specs/__functional__/main/lib/dataApi/createNote.spec.js index 096b88fcf2..71a73df0c0 100644 --- a/specs/__functional__/main/lib/dataApi/createNote.spec.js +++ b/specs/__functional__/main/lib/dataApi/createNote.spec.js @@ -2,6 +2,7 @@ import createNote from 'main/lib/dataAPI/createNote' import DummyDB from 'specs/utils/DummyDB' import { NOTE_ID_PREFIX, + FOLDER_ID_PREFIX, TAG_ID_PREFIX } from 'main/lib/dataAPI/consts' @@ -12,6 +13,10 @@ function fetchNote (noteId) { return db.get(NOTE_ID_PREFIX + noteId) } +function fetchFolder () { + return db.get(FOLDER_ID_PREFIX + folderName) +} + function fetchTag () { return db.get(TAG_ID_PREFIX + tagName) } @@ -41,6 +46,10 @@ describe('dataApi.createNote', () => { expect(res.folder).toEqual(folderName) expect(res.tags[0]).toEqual(tagName) }) + .then(fetchFolder) + .then(doc => { + expect(doc._id).toEqual(FOLDER_ID_PREFIX + folderName) + }) .then(fetchTag) .then(doc => { expect(doc._id).toEqual(TAG_ID_PREFIX + tagName) diff --git a/specs/__functional__/main/lib/dataApi/updateNote.spec.js b/specs/__functional__/main/lib/dataApi/updateNote.spec.js index d1a858dd25..526cfe1dea 100644 --- a/specs/__functional__/main/lib/dataApi/updateNote.spec.js +++ b/specs/__functional__/main/lib/dataApi/updateNote.spec.js @@ -2,6 +2,7 @@ import updateNote from 'main/lib/dataAPI/updateNote' import DummyDB from 'specs/utils/DummyDB' import { NOTE_ID_PREFIX, + FOLDER_ID_PREFIX, TAG_ID_PREFIX } from 'main/lib/dataAPI/consts' @@ -21,6 +22,7 @@ const newNote = { title: 'changed' }, content: 'changed', + folder: 'Other Folder', tags: ['changed'] } @@ -36,6 +38,10 @@ function fetchNewTag () { return db.get(TAG_ID_PREFIX + newNote.tags[0]) } +function fetchNewFolder () { + return db.get(FOLDER_ID_PREFIX + newNote.folder) +} + describe('dataAPI.updateNote', () => { beforeAll(() => { return createdDummyNote() @@ -53,6 +59,10 @@ describe('dataAPI.updateNote', () => { expect(res.content).toEqual('changed') expect(res.tags[0]).toEqual('changed') }) + .then(fetchNewFolder) + .then(res => { + expect(res._id).toEqual(FOLDER_ID_PREFIX + newNote.folder) + }) .then(fetchNewTag) .then(res => { expect(res).not.toBeNull() diff --git a/specs/__functional__/main/lib/redux/reducers/storageMap.spec.js b/specs/__functional__/main/lib/redux/reducers/storageMap.spec.js new file mode 100644 index 0000000000..56b08e82df --- /dev/null +++ b/specs/__functional__/main/lib/redux/reducers/storageMap.spec.js @@ -0,0 +1,121 @@ +import { Map, OrderedMap, Set } from 'immutable' +import storageMap from 'main/lib/redux/reducers/storageMap' +import DummyStorageMap from 'specs/utils/DummyStorageMap' + +describe('storageMap', () => { + it('should create a note with tags and folder', () => { + const state = new DummyStorageMap().getState() + + const action = { + type: 'CREATE_NOTE', + payload: { + storageName: 'Notebook', + noteId: 'test', + note: new Map({ + folder: 'Test folder', + tags: new Set(['new', 'tag']) + }) + } + } + + const nextState = storageMap(state, action) + // it should create a note + expect(nextState.getIn(['Notebook', 'noteMap', action.payload.noteId, 'content'])).toEqual(action.payload.note.get('content')) + // it should create a folder + expect(nextState.hasIn(['Notebook', 'folderMap', action.payload.note.get('folder')])).toBeTruthy() + // it should create tags + action.payload.note.get('tags') + .forEach(tagName => { + expect(nextState.hasIn(['Notebook', 'tagMap', tagName])).toBeTruthy() + }) + }) + + it('should delete a folder and its notes', () => { + const state = new DummyStorageMap() + .createNote('Notebook', 'test', { + folder: 'Test folder' + }) + .createNote('Notebook', 'test2', { + folder: 'Test folder' + }) + .createNote('Notebook', 'test3', { + folder: 'Another folder' + }) + .getState() + + const action = { + type: 'DELETE_FOLDER', + payload: { + storageName: 'Notebook', + folderName: 'Test folder' + } + } + + const nextState = storageMap(state, action) + // The notes, test and test2, should be deleted + expect(nextState.hasIn(['Notebook', 'noteMap', 'test'])).toBeFalsy() + expect(nextState.hasIn(['Notebook', 'noteMap', 'test2'])).toBeFalsy() + // test3 should exist + expect(nextState.hasIn(['Notebook', 'noteMap', 'test3'])).toBeTruthy() + // it should delete tag + expect(nextState.hasIn(['Notebook', 'folderMap', action.payload.folderName])).toBeFalsy() + }) + + it('should delete a tag and untag its notes', () => { + const state = new DummyStorageMap() + .createNote('Notebook', 'test', { + tags: ['new', 'tag'] + }) + .createNote('Notebook', 'test2', { + tags: ['new', 'tag2'] + }) + .getState() + + const action = { + type: 'DELETE_TAG', + payload: { + storageName: 'Notebook', + tagName: 'new' + } + } + + const nextState = storageMap(state, action) + // it should untag all notes + expect(nextState.getIn(['Notebook', 'noteMap', 'test', 'tags']).has('new')).toBeFalsy() + expect(nextState.getIn(['Notebook', 'noteMap', 'test2', 'tags']).has('new')).toBeFalsy() + // it should delete tag + expect(nextState.hasIn(['Notebook', 'tagMap', action.payload.tagName])).toBeFalsy() + }) + + it('should move a tag and update tag attribute of its notes', () => { + const state = new DummyStorageMap() + .createNote('Notebook', 'test', { + tags: ['new', 'tag'] + }) + .createNote('Notebook', 'test2', { + tags: ['new', 'tag2'] + }) + .getState() + + const action = { + type: 'RENAME_TAG', + payload: { + storageName: 'Notebook', + tagName: 'new', + newTagName: 'newer' + } + } + + const nextState = storageMap(state, action) + // Notes should be untagged the target tag + expect(nextState.getIn(['Notebook', 'noteMap', 'test', 'tags']).has('new')).toBeFalsy() + expect(nextState.getIn(['Notebook', 'noteMap', 'test2', 'tags']).has('new')).toBeFalsy() + // Notes should have the renamed tag + expect(nextState.getIn(['Notebook', 'noteMap', 'test', 'tags']).has('newer')).toBeTruthy() + expect(nextState.getIn(['Notebook', 'noteMap', 'test2', 'tags']).has('newer')).toBeTruthy() + // Old tag should be deleted + expect(nextState.hasIn(['Notebook', 'tagMap', action.payload.tagName])).toBeFalsy() + // New Tag should be created + expect(nextState.hasIn(['Notebook', 'tagMap', action.payload.newTagName])).toBeTruthy() + }) +}) diff --git a/specs/utils/DummyStorageMap.js b/specs/utils/DummyStorageMap.js new file mode 100644 index 0000000000..4a4d4340b4 --- /dev/null +++ b/specs/utils/DummyStorageMap.js @@ -0,0 +1,81 @@ +import Immutable, { OrderedMap, Set } from 'immutable' + +function reviver (k, v) { + var isIndexed = Immutable.Iterable.isIndexed(v) + return isIndexed ? v.toSet() : v.toMap() +} + +function fromJS (obj) { + return Immutable.fromJS(obj, reviver) +} + +const defaultNote = { + content: 'test', + folder: 'Notes', + tags: [], + meta: { + title: 'test', + preview: '' + } +} + +export default class DummyStorageMap { + constructor () { + this.state = OrderedMap(fromJS({ + Notebook: { + noteMap: {}, + folderMap: { + Note: { + notes: [] + } + }, + tagMap: {} + } + })) + } + + getState () { + return this.state + } + + createNote (storageName, noteId, note, preventSideEffect = false) { + // Add a note + const newNote = fromJS(Object.assign({}, defaultNote, note)) + this.state = this.state.setIn([storageName, 'noteMap', noteId], newNote) + + if (!preventSideEffect) { + // Update its folder + this.state = this.state.updateIn([storageName, 'folderMap', newNote.get('folder'), 'notes'], noteSet => { + if (noteSet == null) return new Set([noteId]) + return noteSet.add(noteId) + }) + + // Update its tags + newNote.get('tags').forEach(tagName => { + this.state = this.state.updateIn([storageName, 'tagMap', tagName, 'notes'], noteSet => { + if (noteSet == null) return new Set([noteId]) + return noteSet.add(noteId) + }) + }) + } + + return this + } + + createTag (storageName, tagName) { + this.state = this.state.updateIn([storageName, 'tagMap', tagName], tag => { + if (tag == null) return fromJS({notes: []}) + return tag + }) + + return this + } + + createFolder (storageName, folderName) { + this.state = this.state.updateIn([storageName, 'folderMap', folderName], folder => { + if (folder == null) return fromJS({notes: []}) + return folder + }) + return this + } +} diff --git a/src/main/lib/dataAPI/createNote.js b/src/main/lib/dataAPI/createNote.js index 2a57271db2..7f19b3d297 100644 --- a/src/main/lib/dataAPI/createNote.js +++ b/src/main/lib/dataAPI/createNote.js @@ -1,6 +1,7 @@ import { getDB } from './context' import { NOTE_ID_PREFIX, + FOLDER_ID_PREFIX, TAG_ID_PREFIX } from './consts' import { Map, Set } from 'immutable' @@ -38,6 +39,17 @@ export default function createNote (storageName, payload) { throw err }) })) + .then(res => { + return db.get(FOLDER_ID_PREFIX + payload.folder) + .catch(err => { + if (err.name === 'not_found') { + return db.put({ + _id: FOLDER_ID_PREFIX + payload.folder + }) + } + throw err + }) + }) .then(res => { return db.put(Object.assign({}, payload, { _id: NOTE_ID_PREFIX + noteId, diff --git a/src/main/lib/dataAPI/updateNote.js b/src/main/lib/dataAPI/updateNote.js index dc83cb1e3a..1b41da499b 100644 --- a/src/main/lib/dataAPI/updateNote.js +++ b/src/main/lib/dataAPI/updateNote.js @@ -1,6 +1,7 @@ import { getDB } from './context' import { NOTE_ID_PREFIX, + FOLDER_ID_PREFIX, TAG_ID_PREFIX } from './consts' import { Map, Set } from 'immutable' @@ -31,6 +32,17 @@ export default function updateNote (storageName, noteId, payload) { throw err }) })) + .then(res => { + return db.get(FOLDER_ID_PREFIX + payload.folder) + .catch(err => { + if (err.name === 'not_found') { + return db.put({ + _id: FOLDER_ID_PREFIX + payload.folder + }) + } + throw err + }) + }) .then(res => { return db .put(payload) diff --git a/src/main/lib/redux/reducers/storageMap.js b/src/main/lib/redux/reducers/storageMap.js index 4849833f18..61cc08a2c7 100644 --- a/src/main/lib/redux/reducers/storageMap.js +++ b/src/main/lib/redux/reducers/storageMap.js @@ -132,7 +132,9 @@ function storageMap (state = defaultStorageMap, action) { storageName, 'noteMap', noteId - ], note => note.update('tags', tags => tags.delete(tagName).add(newTagName))) + ], note => note.update('tags', tags => { + return tags.delete(tagName).add(newTagName) + })) }, state) state = state.deleteIn([ @@ -162,7 +164,10 @@ function storageMap (state = defaultStorageMap, action) { 'folderMap', note.get('folder'), 'notes' - ], noteSet => noteSet.add(noteId)) + ], noteSet => { + if (noteSet == null) return new Set([noteId]) + return noteSet.add(noteId) + }) state = note.get('tags') .reduce((sum, tag) => { @@ -172,7 +177,7 @@ function storageMap (state = defaultStorageMap, action) { tag, 'notes' ], noteSet => { - if (noteSet == null) noteSet = new Set() + if (noteSet == null) return new Set([noteId]) return noteSet.add(noteId) }) }, state) From a816f5b1e250b3e4fa01b8dda4864e60ad8b9590 Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Tue, 10 Jan 2017 16:01:35 +0900 Subject: [PATCH 15/24] :art: Enable note to drag and drop to tag --- src/main/Nav/Nav.js | 7 ----- src/main/Nav/TagButton.js | 53 +++++++++++++++++++++++++++++++++-- src/main/NoteList/Detail.js | 6 ++++ src/main/NoteList/NoteItem.js | 5 ++-- 4 files changed, 60 insertions(+), 11 deletions(-) diff --git a/src/main/Nav/Nav.js b/src/main/Nav/Nav.js index 87f0b96131..3f53b2e033 100644 --- a/src/main/Nav/Nav.js +++ b/src/main/Nav/Nav.js @@ -143,13 +143,7 @@ class Nav extends React.Component { handleBlur = e => { if (isFinallyBlurred(e, this.root)) { - const { tagName } = this.context.router.params - const nextTab = tagName != null - ? 'tags' - : 'folders' - this.setState({ - tab: nextTab, isFocused: false }) } @@ -333,7 +327,6 @@ class Nav extends React.Component { ? this.linkList.concat(folderMap.map((folder, key) => storageName + '/' + key).toArray()) : this.linkList.concat(tagMap.map((tag, key) => storageName + '/' + key).toArray()) - return { + this.setState({ + isDragEntered: true + }) + } + + handleDragLeave = e => { + this.setState({ + isDragEntered: false + }) + } + + handleDrop = e => { + const data = JSON.parse(e.dataTransfer.getData('application/json')) + + this.setState({ + isDragEntered: false + }, () => { + this.parseDropData(data) + }) + } + + parseDropData (data) { + const { storageName, tagName } = this.props + const { store } = this.context + + switch (data.type) { + case 'MOVE_NOTE': + const noteId = data.payload.noteKey + + dataAPI + .updateNote(storageName, noteId, {tags: data.payload.note.tags.concat([tagName])}) + .then(res => { + store.dispatch({ + type: 'UPDATE_NOTE', + payload: { + storageName, + noteId: res.id, + note: res.note + } + }) + }) + } + } + rename () { this.setState({ isRenaming: true, @@ -170,9 +215,13 @@ class TagButton extends React.Component { render () { const { tagURL, tagName, tagMeta, isFocused } = this.props - + // TODO: Drag & drop to tag note return ( - + {this.state.isRenaming ? (this.input = c)} diff --git a/src/main/NoteList/Detail.js b/src/main/NoteList/Detail.js index e17014ffba..5ab5db42eb 100644 --- a/src/main/NoteList/Detail.js +++ b/src/main/NoteList/Detail.js @@ -70,6 +70,12 @@ class Detail extends React.Component { tags: new Set(nextProps.note.get('tags')), content: nextProps.note.get('content') }) + } else { + if (!nextProps.note.get('tags').equals(this.props.note.get('tags'))) { + this.setState({ + tags: new Set(nextProps.note.get('tags')) + }) + } } } diff --git a/src/main/NoteList/NoteItem.js b/src/main/NoteList/NoteItem.js index 2d2086cb62..fbccb6debc 100644 --- a/src/main/NoteList/NoteItem.js +++ b/src/main/NoteList/NoteItem.js @@ -187,14 +187,15 @@ class NoteItem extends React.Component { } handleDragStart = e => { - const { noteKey } = this.props + const { noteKey, note } = this.props e.dataTransfer.effectAllowed = 'move' e.dataTransfer.dropEffect = 'move' e.dataTransfer.setData('application/json', JSON.stringify({ type: 'MOVE_NOTE', payload: { - noteKey + noteKey, + note } })) From a7312d58a510c7acef0a32a71bfddbb70fc0d367 Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Tue, 10 Jan 2017 16:06:17 +0900 Subject: [PATCH 16/24] :art: Add bottom margin to math block --- src/components/MarkdownPreview.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/MarkdownPreview.js b/src/components/MarkdownPreview.js index 47fc27fff1..06797a3ac3 100644 --- a/src/components/MarkdownPreview.js +++ b/src/components/MarkdownPreview.js @@ -56,6 +56,10 @@ class MarkdownPreview extends React.Component { text-align: center; } + div.katex { + margin-bottom: 16px; + } + .katex .frac-line { top: 0.9em; position: relative; From 1a2844b998619e54e534e997dd64ef3f249cf3d6 Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Wed, 11 Jan 2017 12:32:46 +0900 Subject: [PATCH 17/24] :bug: Fix wrong tag behavior Resolve tag name to prevent duplication --- .../lib/redux/reducers/storageMap.spec.js | 2 +- src/main/Nav/StorageSection.js | 75 +++++++++++-------- src/main/Nav/TagButton.js | 2 +- src/main/NoteList/NoteList.js | 6 +- src/main/lib/redux/reducers/storageMap.js | 20 +++-- 5 files changed, 61 insertions(+), 44 deletions(-) diff --git a/specs/__functional__/main/lib/redux/reducers/storageMap.spec.js b/specs/__functional__/main/lib/redux/reducers/storageMap.spec.js index 56b08e82df..43da5ba6cf 100644 --- a/specs/__functional__/main/lib/redux/reducers/storageMap.spec.js +++ b/specs/__functional__/main/lib/redux/reducers/storageMap.spec.js @@ -1,4 +1,4 @@ -import { Map, OrderedMap, Set } from 'immutable' +import { Map, Set } from 'immutable' import storageMap from 'main/lib/redux/reducers/storageMap' import DummyStorageMap from 'specs/utils/DummyStorageMap' diff --git a/src/main/Nav/StorageSection.js b/src/main/Nav/StorageSection.js index d8f6462d9e..76bf8aae29 100644 --- a/src/main/Nav/StorageSection.js +++ b/src/main/Nav/StorageSection.js @@ -1,6 +1,6 @@ import React, { PropTypes } from 'react' import styled from 'styled-components' -import { Map, Set } from 'immutable' +import { Map } from 'immutable' import { routerShape } from 'react-router' import filenamify from 'filenamify' import ContextMenu from 'main/lib/ContextMenu' @@ -139,13 +139,29 @@ class StorageSection extends React.Component { } resolveNewName = newName => { - const { folderMap } = this.props + const { folderMap, tagMap, tab } = this.props let count = 0 - let originalName = filenamify(newName, {replacement: '_'}) - let resolvedName = originalName - while (folderMap.has(resolvedName)) { - resolvedName = `${originalName} (${++count})` + let resolvedName + if (tab === 'folders') { + let originalName = filenamify(newName, {replacement: '_'}) + .trim() + resolvedName = originalName + if (resolvedName.length === 0) { + originalName = 'New Folder' + } + while (folderMap.has(resolvedName)) { + resolvedName = `${originalName} (${++count})` + } + } else { + let originalName = newName.trim() + resolvedName = originalName + if (resolvedName.length === 0) { + originalName = 'New Tag' + } + while (tagMap.has(resolvedName)) { + resolvedName = `${originalName} (${++count})` + } } return resolvedName @@ -156,7 +172,6 @@ class StorageSection extends React.Component { const { store, router } = this.context const newName = this.resolveNewName(this.state.newName) - if (tab === 'folders') { store .dispatch(dispatch => { @@ -169,9 +184,7 @@ class StorageSection extends React.Component { payload: { storageName, folderName: folderName, - folder: new Map([ - ['notes', new Set()] - ]) + folder: new Map() } }) return folderName @@ -181,28 +194,28 @@ class StorageSection extends React.Component { router.push('/storages/' + storageName + '/folders/' + folderName) }) } else { - store - .dispatch(dispatch => { - return dataAPI - .upsertTag(storageName, newName) - .then(res => { - const tagName = res.id - dispatch({ - type: 'UPDATE_TAG', - payload: { - storageName, - tagName: tagName, - tag: new Map([ - ['notes', new Set()] - ]) - } + if (newName.length > 0) { + store + .dispatch(dispatch => { + return dataAPI + .upsertTag(storageName, newName) + .then(res => { + const tagName = res.id + dispatch({ + type: 'UPDATE_TAG', + payload: { + storageName, + tagName: tagName, + tag: new Map() + } + }) + return tagName }) - return tagName - }) - }) - .then(tagName => { - router.push('/storages/' + storageName + '/tags/' + tagName) - }) + }) + .then(tagName => { + router.push('/storages/' + storageName + '/tags/' + tagName) + }) + } } this.setState({ diff --git a/src/main/Nav/TagButton.js b/src/main/Nav/TagButton.js index 4d30d6fcd9..9852842f87 100644 --- a/src/main/Nav/TagButton.js +++ b/src/main/Nav/TagButton.js @@ -215,7 +215,7 @@ class TagButton extends React.Component { render () { const { tagURL, tagName, tagMeta, isFocused } = this.props - // TODO: Drag & drop to tag note + return ( Date: Wed, 11 Jan 2017 15:42:27 +0900 Subject: [PATCH 18/24] :bug: Fix design issues Fix wrapping tag label Fix layout bug of tag list in detail --- src/main/NoteList/Detail.js | 3 +-- src/main/NoteList/NoteItem.js | 1 + src/main/NoteList/TagSelect.js | 36 ++++++++++++++++++++++------------ 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/main/NoteList/Detail.js b/src/main/NoteList/Detail.js index 5ab5db42eb..f343bfa807 100644 --- a/src/main/NoteList/Detail.js +++ b/src/main/NoteList/Detail.js @@ -23,8 +23,7 @@ const StatusBar = styled.div` const StatusBarLeft = styled.div` flex: 1; - padding: 0 10px; - overflow-x: auto; + padding: 0 5px; ` const StatusBarRight = styled.div` diff --git a/src/main/NoteList/NoteItem.js b/src/main/NoteList/NoteItem.js index fbccb6debc..73427aaff6 100644 --- a/src/main/NoteList/NoteItem.js +++ b/src/main/NoteList/NoteItem.js @@ -112,6 +112,7 @@ const Root = styled.div` border-radius: 3px; background-color: ${p => p.theme.buttonBackgroundColor}; color: ${p => p.theme.color}; + white-space: nowrap; } .tags .count { position: absolute; diff --git a/src/main/NoteList/TagSelect.js b/src/main/NoteList/TagSelect.js index c5ddcd8786..e83295533f 100644 --- a/src/main/NoteList/TagSelect.js +++ b/src/main/NoteList/TagSelect.js @@ -5,34 +5,46 @@ import ImmutablePropTypes from 'react-immutable-proptypes' const Root = styled.div` height: 30px; - display: flex; + position: relative; align-items: center; .Octicon { fill: ${p => p.theme.inactiveColor}; + position: absolute; + left: 2px; + top: 7px; + width: 16px; } .list { + position: absolute; + left: 10px; + top: 4px; + right: 0; display: flex; align-items: center; + padding: 0 10px; + overflow: auto; } .item { -webkit-user-select: none; margin: 0 2px; - height: 20px; + height: 22px; font-size: 13px; border: ${p => p.theme.border}; - line-height: 20px; + line-height: 22px; padding: 0 6px; border-radius: 4px; cursor: default; color: ${p => p.theme.color}; + box-sizing: border-box; &:hover { background-color: ${p => p.theme.buttonHoverColor}; } } input { + box-sizing: border-box; margin: 0 2px; - height: 20px; - line-height: 20px; + height: 22px; + line-height: 22px; padding: 0; width: 100px; border: none; @@ -138,14 +150,14 @@ class TagSelect extends React.Component {
{tagList} + (this.input = c)} + value={this.state.newTag} + onChange={this.handleInputChange} + onKeyDown={this.handleInputKeyDown} + placeholder='Add Tags...' + />
- (this.input = c)} - value={this.state.newTag} - onChange={this.handleInputChange} - onKeyDown={this.handleInputKeyDown} - placeholder='Add Tags...' - />
) } From 501766d679b2472a0c9f5c68a868b13762bfc896 Mon Sep 17 00:00:00 2001 From: Sarah Seo Date: Wed, 11 Jan 2017 15:43:20 +0900 Subject: [PATCH 19/24] Persist tab state --- src/lib/consts.js | 2 ++ src/main/Main.js | 1 + src/main/Nav/Nav.js | 25 +++++++++++++++++++------ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/lib/consts.js b/src/lib/consts.js index 48d87aa97e..669bfbd65f 100644 --- a/src/lib/consts.js +++ b/src/lib/consts.js @@ -32,6 +32,8 @@ export const DEFAULT_CONFIG = new Map({ }) export const DEFAULT_STATUS = Map({ + // folders, tags + navTab: 'folders', navWidth: 150, noteListWidth: 200, // NORMAL, COMPACT diff --git a/src/main/Main.js b/src/main/Main.js index 581d8aab89..b836d9cacc 100644 --- a/src/main/Main.js +++ b/src/main/Main.js @@ -174,6 +174,7 @@ class Main extends React.Component {