mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-14 18:26:26 +00:00
Compare commits
146 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
16061a7eba | ||
|
|
8beb661af4 | ||
|
|
f7fb531902 | ||
|
|
b32b38bb0d | ||
|
|
6e5f6cc739 | ||
|
|
6624178864 | ||
|
|
4a66c6717c | ||
|
|
dd76bc027b | ||
|
|
1ae3f295f3 | ||
|
|
3cb2ce41fe | ||
|
|
5534319e93 | ||
|
|
c7373c15a5 | ||
|
|
dbf1d6403b | ||
|
|
95d74c6f5b | ||
|
|
f04b7db9fc | ||
|
|
900fa023fb | ||
|
|
ad9da44afb | ||
|
|
c827717202 | ||
|
|
7d3caa3c2e | ||
|
|
fde7fbccac | ||
|
|
56f06fa7d5 | ||
|
|
c0fba82e73 | ||
|
|
5438cd14a0 | ||
|
|
0d642b308d | ||
|
|
0b96472f72 | ||
|
|
675d0ed08c | ||
|
|
9c0f5c31c2 | ||
|
|
09ce59fd04 | ||
|
|
98cd83c4e0 | ||
|
|
1aec386656 | ||
|
|
b03cd9cd99 | ||
|
|
27265e210f | ||
|
|
c392c5d178 | ||
|
|
11fe420fac | ||
|
|
9b17a8fb5b | ||
|
|
27f3fd0032 | ||
|
|
1672d9fa5f | ||
|
|
59c9e11879 | ||
|
|
4523743150 | ||
|
|
2fdbe9de96 | ||
|
|
a617976c78 | ||
|
|
7201a98d78 | ||
|
|
472560e2bf | ||
|
|
96753fe0a0 | ||
|
|
83c2fdd161 | ||
|
|
911ce7572f | ||
|
|
0a24d7d4a7 | ||
|
|
c542062d4d | ||
|
|
eb7a195cce | ||
|
|
23a356164e | ||
|
|
de19c51061 | ||
|
|
221b6a2938 | ||
|
|
cda9d53c8e | ||
|
|
f043b0ffb3 | ||
|
|
28e0590327 | ||
|
|
ec6de1b91b | ||
|
|
2b0bdbf1c8 | ||
|
|
f48864a2e7 | ||
|
|
94c6578675 | ||
|
|
2af2399971 | ||
|
|
ebea01cecf | ||
|
|
5d1db1de31 | ||
|
|
6c528625d8 | ||
|
|
7b326b99af | ||
|
|
2a60ba95e0 | ||
|
|
6b98afaa02 | ||
|
|
cdb079dc81 | ||
|
|
2ac0d93caf | ||
|
|
41977e8726 | ||
|
|
b9e6a56a83 | ||
|
|
2468c8311f | ||
|
|
e8e05b20cd | ||
|
|
5bd0a446f1 | ||
|
|
ad4e50d542 | ||
|
|
13131a0d5c | ||
|
|
f007664745 | ||
|
|
87f9589be3 | ||
|
|
e059106a93 | ||
|
|
ada1b4de6b | ||
|
|
96413b9851 | ||
|
|
9699ef6319 | ||
|
|
dd8f4d60f0 | ||
|
|
372f2e7319 | ||
|
|
1957d87dd7 | ||
|
|
a148d17ba1 | ||
|
|
297553c240 | ||
|
|
f0fcaa6be7 | ||
|
|
cfa40f3ec1 | ||
|
|
832c43de88 | ||
|
|
1665e18edb | ||
|
|
fd1717046b | ||
|
|
7fe7c555bc | ||
|
|
411a7a8e80 | ||
|
|
196f5a7bf7 | ||
|
|
3fa326121a | ||
|
|
cce69bea3a | ||
|
|
f70cf7845d | ||
|
|
bd0a326128 | ||
|
|
897d99e043 | ||
|
|
b0f288e103 | ||
|
|
7d26d46c7b | ||
|
|
5c7804fc40 | ||
|
|
836f3af1ab | ||
|
|
67b89d4fe7 | ||
|
|
bc2d9d0fe2 | ||
|
|
79f33b9405 | ||
|
|
ed9ddee5f1 | ||
|
|
0d004b2f0a | ||
|
|
f41ff77d76 | ||
|
|
ae97a76d2e | ||
|
|
3ca18c04c6 | ||
|
|
2b03e6e956 | ||
|
|
010793a478 | ||
|
|
b136512ece | ||
|
|
9179c199fe | ||
|
|
cfa4dfa817 | ||
|
|
6a73a3af97 | ||
|
|
923c24fa6c | ||
|
|
4b1c8a3238 | ||
|
|
76508fbc3b | ||
|
|
2bfda95ed8 | ||
|
|
6e5082a470 | ||
|
|
a6cec44fc4 | ||
|
|
600fab4f23 | ||
|
|
12377b8caf | ||
|
|
250c6e488d | ||
|
|
3a9b57adae | ||
|
|
74415956ac | ||
|
|
33d7ed25a5 | ||
|
|
df2de5c081 | ||
|
|
7f4c58a84a | ||
|
|
a641a7b3e4 | ||
|
|
7437b26e3c | ||
|
|
ee6d41859f | ||
|
|
b368c3b5d8 | ||
|
|
b1ae2b0b6f | ||
|
|
27a6d53c7f | ||
|
|
4caf3a81be | ||
|
|
ab578f768f | ||
|
|
e4212e796a | ||
|
|
95b1ff9b41 | ||
|
|
684d2c411e | ||
|
|
42710cfee5 | ||
|
|
277004fd9b | ||
|
|
14f79c4c21 | ||
|
|
f88cd80dca |
3
.eslintignore
Normal file
3
.eslintignore
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
node_modules/
|
||||||
|
compiled/
|
||||||
|
dist/
|
||||||
6
.eslintrc
Normal file
6
.eslintrc
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"extends": ["standard", "standard-jsx"],
|
||||||
|
"rules": {
|
||||||
|
"no-useless-escape": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
6
.travis.yml
Normal file
6
.travis.yml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
language: node_js
|
||||||
|
node_js:
|
||||||
|
- 'stable'
|
||||||
|
- 'lts/*'
|
||||||
|
|
||||||
|
script: npm run lint && npm run test
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import React, { PropTypes } from 'react'
|
import React, { PropTypes } from 'react'
|
||||||
import _ from 'lodash'
|
import _ from 'lodash'
|
||||||
import CodeMirror from 'codemirror'
|
import CodeMirror from 'codemirror'
|
||||||
|
import path from 'path'
|
||||||
|
|
||||||
CodeMirror.modeURL = '../node_modules/codemirror/mode/%N/%N.js'
|
CodeMirror.modeURL = '../node_modules/codemirror/mode/%N/%N.js'
|
||||||
|
|
||||||
@@ -52,7 +53,7 @@ export default class CodeEditor extends React.Component {
|
|||||||
indentUnit: this.props.indentSize,
|
indentUnit: this.props.indentSize,
|
||||||
tabSize: this.props.indentSize,
|
tabSize: this.props.indentSize,
|
||||||
indentWithTabs: this.props.indentType !== 'space',
|
indentWithTabs: this.props.indentType !== 'space',
|
||||||
keyMap: 'sublime',
|
keyMap: this.props.keyMap,
|
||||||
inputStyle: 'textarea',
|
inputStyle: 'textarea',
|
||||||
extraKeys: {
|
extraKeys: {
|
||||||
Tab: function (cm) {
|
Tab: function (cm) {
|
||||||
@@ -102,6 +103,9 @@ export default class CodeEditor extends React.Component {
|
|||||||
if (prevProps.fontFamily !== this.props.fontFamily) {
|
if (prevProps.fontFamily !== this.props.fontFamily) {
|
||||||
needRefresh = true
|
needRefresh = true
|
||||||
}
|
}
|
||||||
|
if (prevProps.keyMap !== this.props.keyMap) {
|
||||||
|
needRefresh = true
|
||||||
|
}
|
||||||
|
|
||||||
if (prevProps.indentSize !== this.props.indentSize) {
|
if (prevProps.indentSize !== this.props.indentSize) {
|
||||||
this.editor.setOption('indentUnit', this.props.indentSize)
|
this.editor.setOption('indentUnit', this.props.indentSize)
|
||||||
@@ -160,6 +164,19 @@ export default class CodeEditor extends React.Component {
|
|||||||
this.editor.setCursor(cursor)
|
this.editor.setCursor(cursor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleDropImage (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
let imagePath = e.dataTransfer.files[0].path
|
||||||
|
let filename = path.basename(imagePath)
|
||||||
|
let imageMd = `})`
|
||||||
|
this.insertImage(imageMd)
|
||||||
|
}
|
||||||
|
|
||||||
|
insertImage (imageMd) {
|
||||||
|
const cm = this.editor
|
||||||
|
cm.setValue(cm.getValue() + imageMd)
|
||||||
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
let { className, fontFamily, fontSize } = this.props
|
let { className, fontFamily, fontSize } = this.props
|
||||||
fontFamily = _.isString(fontFamily) && fontFamily.length > 0
|
fontFamily = _.isString(fontFamily) && fontFamily.length > 0
|
||||||
@@ -177,6 +194,7 @@ export default class CodeEditor extends React.Component {
|
|||||||
fontFamily: fontFamily.join(', '),
|
fontFamily: fontFamily.join(', '),
|
||||||
fontSize: fontSize
|
fontSize: fontSize
|
||||||
}}
|
}}
|
||||||
|
onDrop={(e) => this.handleDropImage(e)}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -194,6 +212,7 @@ CodeEditor.propTypes = {
|
|||||||
CodeEditor.defaultProps = {
|
CodeEditor.defaultProps = {
|
||||||
readOnly: false,
|
readOnly: false,
|
||||||
theme: 'xcode',
|
theme: 'xcode',
|
||||||
|
keyMap: 'sublime',
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
fontFamily: 'Monaco, Consolas',
|
fontFamily: 'Monaco, Consolas',
|
||||||
indentSize: 4,
|
indentSize: 4,
|
||||||
|
|||||||
@@ -8,9 +8,12 @@ class MarkdownEditor extends React.Component {
|
|||||||
constructor (props) {
|
constructor (props) {
|
||||||
super(props)
|
super(props)
|
||||||
|
|
||||||
|
this.escapeFromEditor = ['Control', 'w']
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
status: 'PREVIEW',
|
status: 'PREVIEW',
|
||||||
renderValue: props.value
|
renderValue: props.value,
|
||||||
|
keyPressed: {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,6 +77,7 @@ class MarkdownEditor extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleBlur (e) {
|
handleBlur (e) {
|
||||||
|
this.setState({ keyPressed: [] })
|
||||||
let { config } = this.props
|
let { config } = this.props
|
||||||
if (config.editor.switchPreview === 'BLUR') {
|
if (config.editor.switchPreview === 'BLUR') {
|
||||||
let cursorPosition = this.refs.code.editor.getCursor()
|
let cursorPosition = this.refs.code.editor.getCursor()
|
||||||
@@ -142,6 +146,24 @@ class MarkdownEditor extends React.Component {
|
|||||||
this.renderPreview(this.props.value)
|
this.renderPreview(this.props.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleKeyDown(e) {
|
||||||
|
const keyPressed = Object.assign(this.state.keyPressed, {
|
||||||
|
[e.key]: true
|
||||||
|
})
|
||||||
|
this.setState({ keyPressed })
|
||||||
|
let isNoteHandlerKey = (el) => { return this.state.keyPressed[el] }
|
||||||
|
if (this.state.status === 'CODE' && this.escapeFromEditor.every(isNoteHandlerKey)) {
|
||||||
|
document.activeElement.blur()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handleKeyUp (e) {
|
||||||
|
const keyPressed = Object.assign(this.state.keyPressed, {
|
||||||
|
[e.key]: false
|
||||||
|
})
|
||||||
|
this.setState({ keyPressed })
|
||||||
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
let { className, value, config } = this.props
|
let { className, value, config } = this.props
|
||||||
|
|
||||||
@@ -160,12 +182,15 @@ class MarkdownEditor extends React.Component {
|
|||||||
}
|
}
|
||||||
onContextMenu={(e) => this.handleContextMenu(e)}
|
onContextMenu={(e) => this.handleContextMenu(e)}
|
||||||
tabIndex='-1'
|
tabIndex='-1'
|
||||||
|
onKeyDown={(e) => this.handleKeyDown(e)}
|
||||||
|
onKeyUp={(e) => this.handleKeyUp(e)}
|
||||||
>
|
>
|
||||||
<CodeEditor styleName='codeEditor'
|
<CodeEditor styleName='codeEditor'
|
||||||
ref='code'
|
ref='code'
|
||||||
mode='GitHub Flavored Markdown'
|
mode='GitHub Flavored Markdown'
|
||||||
value={value}
|
value={value}
|
||||||
theme={config.editor.theme}
|
theme={config.editor.theme}
|
||||||
|
keyMap={config.editor.keyMap}
|
||||||
fontFamily={config.editor.fontFamily}
|
fontFamily={config.editor.fontFamily}
|
||||||
fontSize={editorFontSize}
|
fontSize={editorFontSize}
|
||||||
indentType={config.editor.indentType}
|
indentType={config.editor.indentType}
|
||||||
@@ -179,6 +204,7 @@ class MarkdownEditor extends React.Component {
|
|||||||
}
|
}
|
||||||
style={previewStyle}
|
style={previewStyle}
|
||||||
theme={config.ui.theme}
|
theme={config.ui.theme}
|
||||||
|
keyMap={config.editor.keyMap}
|
||||||
fontSize={config.preview.fontSize}
|
fontSize={config.preview.fontSize}
|
||||||
fontFamily={config.preview.fontFamily}
|
fontFamily={config.preview.fontFamily}
|
||||||
codeBlockTheme={config.preview.codeBlockTheme}
|
codeBlockTheme={config.preview.codeBlockTheme}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import consts from 'browser/lib/consts'
|
|||||||
import Raphael from 'raphael'
|
import Raphael from 'raphael'
|
||||||
import flowchart from 'flowchart'
|
import flowchart from 'flowchart'
|
||||||
import SequenceDiagram from 'js-sequence-diagrams'
|
import SequenceDiagram from 'js-sequence-diagrams'
|
||||||
|
import eventEmitter from 'browser/main/lib/eventEmitter'
|
||||||
|
import fs from 'fs'
|
||||||
|
|
||||||
function decodeHTMLEntities (text) {
|
function decodeHTMLEntities (text) {
|
||||||
var entities = [
|
var entities = [
|
||||||
@@ -25,6 +27,7 @@ function decodeHTMLEntities (text) {
|
|||||||
const { remote } = require('electron')
|
const { remote } = require('electron')
|
||||||
const { app } = remote
|
const { app } = remote
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
|
const dialog = remote.dialog
|
||||||
|
|
||||||
const markdownStyle = require('!!css!stylus?sourceMap!./markdown.styl')[0][1]
|
const markdownStyle = require('!!css!stylus?sourceMap!./markdown.styl')[0][1]
|
||||||
const appPath = 'file://' + (process.env.NODE_ENV === 'production'
|
const appPath = 'file://' + (process.env.NODE_ENV === 'production'
|
||||||
@@ -49,6 +52,8 @@ body {
|
|||||||
}
|
}
|
||||||
code {
|
code {
|
||||||
font-family: ${codeBlockFontFamily.join(', ')};
|
font-family: ${codeBlockFontFamily.join(', ')};
|
||||||
|
background-color: rgba(0,0,0,0.04);
|
||||||
|
color: #CC305F;
|
||||||
}
|
}
|
||||||
.lineNumber {
|
.lineNumber {
|
||||||
${lineNumber && 'display: block !important;'}
|
${lineNumber && 'display: block !important;'}
|
||||||
@@ -90,6 +95,8 @@ export default class MarkdownPreview extends React.Component {
|
|||||||
this.mouseUpHandler = (e) => this.handleMouseUp(e)
|
this.mouseUpHandler = (e) => this.handleMouseUp(e)
|
||||||
this.anchorClickHandler = (e) => this.handlePreviewAnchorClick(e)
|
this.anchorClickHandler = (e) => this.handlePreviewAnchorClick(e)
|
||||||
this.checkboxClickHandler = (e) => this.handleCheckboxClick(e)
|
this.checkboxClickHandler = (e) => this.handleCheckboxClick(e)
|
||||||
|
this.saveAsTextHandler = () => this.handleSaveAsText()
|
||||||
|
this.saveAsMdHandler = () => this.handleSaveAsMd()
|
||||||
}
|
}
|
||||||
|
|
||||||
handlePreviewAnchorClick (e) {
|
handlePreviewAnchorClick (e) {
|
||||||
@@ -134,13 +141,38 @@ export default class MarkdownPreview extends React.Component {
|
|||||||
if (this.props.onMouseUp != null) this.props.onMouseUp(e)
|
if (this.props.onMouseUp != null) this.props.onMouseUp(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleSaveAsText () {
|
||||||
|
this.exportAsDocument('txt')
|
||||||
|
}
|
||||||
|
|
||||||
|
handleSaveAsMd () {
|
||||||
|
this.exportAsDocument('md')
|
||||||
|
}
|
||||||
|
|
||||||
|
exportAsDocument (fileType) {
|
||||||
|
const options = {
|
||||||
|
filters: [
|
||||||
|
{ name: 'Documents', extensions: [fileType]}
|
||||||
|
],
|
||||||
|
properties: ['openFile', 'createDirectory']
|
||||||
|
}
|
||||||
|
dialog.showSaveDialog(remote.getCurrentWindow(), options,
|
||||||
|
(filename) => {
|
||||||
|
if (filename) {
|
||||||
|
fs.writeFile(filename, this.props.value, (err) => {
|
||||||
|
if (err) throw err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
componentDidMount () {
|
componentDidMount () {
|
||||||
this.refs.root.setAttribute('sandbox', 'allow-scripts')
|
this.refs.root.setAttribute('sandbox', 'allow-scripts')
|
||||||
this.refs.root.contentWindow.document.body.addEventListener('contextmenu', this.contextMenuHandler)
|
this.refs.root.contentWindow.document.body.addEventListener('contextmenu', this.contextMenuHandler)
|
||||||
|
|
||||||
this.refs.root.contentWindow.document.head.innerHTML = `
|
this.refs.root.contentWindow.document.head.innerHTML = `
|
||||||
<style id='style'></style>
|
<style id='style'></style>
|
||||||
<link rel="stylesheet" href="${appPath}/compiled/katex-style.css">
|
<link rel="stylesheet" href="${appPath}/node_modules/katex/dist/katex.min.css">
|
||||||
<link rel="stylesheet" href="${appPath}/node_modules/codemirror/lib/codemirror.css">
|
<link rel="stylesheet" href="${appPath}/node_modules/codemirror/lib/codemirror.css">
|
||||||
<link rel="stylesheet" id="codeTheme">
|
<link rel="stylesheet" id="codeTheme">
|
||||||
`
|
`
|
||||||
@@ -149,12 +181,16 @@ export default class MarkdownPreview extends React.Component {
|
|||||||
|
|
||||||
this.refs.root.contentWindow.document.addEventListener('mousedown', this.mouseDownHandler)
|
this.refs.root.contentWindow.document.addEventListener('mousedown', this.mouseDownHandler)
|
||||||
this.refs.root.contentWindow.document.addEventListener('mouseup', this.mouseUpHandler)
|
this.refs.root.contentWindow.document.addEventListener('mouseup', this.mouseUpHandler)
|
||||||
|
eventEmitter.on('export:save-text', this.saveAsTextHandler)
|
||||||
|
eventEmitter.on('export:save-md', this.saveAsMdHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount () {
|
componentWillUnmount () {
|
||||||
this.refs.root.contentWindow.document.body.removeEventListener('contextmenu', this.contextMenuHandler)
|
this.refs.root.contentWindow.document.body.removeEventListener('contextmenu', this.contextMenuHandler)
|
||||||
this.refs.root.contentWindow.document.removeEventListener('mousedown', this.mouseDownHandler)
|
this.refs.root.contentWindow.document.removeEventListener('mousedown', this.mouseDownHandler)
|
||||||
this.refs.root.contentWindow.document.removeEventListener('mouseup', this.mouseUpHandler)
|
this.refs.root.contentWindow.document.removeEventListener('mouseup', this.mouseUpHandler)
|
||||||
|
eventEmitter.off('export:save-text', this.saveAsTextHandler)
|
||||||
|
eventEmitter.off('export:save-md', this.saveAsMdHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate (prevProps) {
|
componentDidUpdate (prevProps) {
|
||||||
@@ -184,9 +220,9 @@ export default class MarkdownPreview extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setCodeTheme (theme) {
|
setCodeTheme (theme) {
|
||||||
theme = consts.THEMES.some((_theme) => _theme === theme)
|
theme = consts.THEMES.some((_theme) => _theme === theme) && theme !== 'default'
|
||||||
? theme
|
? theme
|
||||||
: 'default'
|
: 'elegant'
|
||||||
this.getWindow().document.getElementById('codeTheme').href = `${appPath}/node_modules/codemirror/theme/${theme}.css`
|
this.getWindow().document.getElementById('codeTheme').href = `${appPath}/node_modules/codemirror/theme/${theme}.css`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,7 +255,7 @@ export default class MarkdownPreview extends React.Component {
|
|||||||
let syntax = CodeMirror.findModeByName(el.className)
|
let syntax = CodeMirror.findModeByName(el.className)
|
||||||
if (syntax == null) syntax = CodeMirror.findModeByName('Plain Text')
|
if (syntax == null) syntax = CodeMirror.findModeByName('Plain Text')
|
||||||
CodeMirror.requireMode(syntax.mode, () => {
|
CodeMirror.requireMode(syntax.mode, () => {
|
||||||
let content = el.innerHTML
|
let content = decodeHTMLEntities(el.innerHTML)
|
||||||
el.innerHTML = ''
|
el.innerHTML = ''
|
||||||
el.parentNode.className += ` cm-s-${codeBlockTheme} CodeMirror`
|
el.parentNode.className += ` cm-s-${codeBlockTheme} CodeMirror`
|
||||||
CodeMirror.runMode(content, syntax.mime, el, {
|
CodeMirror.runMode(content, syntax.mime, el, {
|
||||||
|
|||||||
@@ -75,8 +75,8 @@ const NoteItem = ({ isActive, note, dateDisplay, handleNoteClick, handleNoteCont
|
|||||||
: <i styleName='item-title-icon' className='fa fa-fw fa-file-text-o' />
|
: <i styleName='item-title-icon' className='fa fa-fw fa-file-text-o' />
|
||||||
}
|
}
|
||||||
|
|
||||||
{note.isStarred ?
|
{note.isStarred
|
||||||
<i styleName='item-star' className='fa fa-star' /> : ''
|
? <i styleName='item-star' className='fa fa-star' /> : ''
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -91,10 +91,10 @@ NoteItem.propTypes = {
|
|||||||
type: PropTypes.string.isRequired,
|
type: PropTypes.string.isRequired,
|
||||||
title: PropTypes.string.isrequired,
|
title: PropTypes.string.isrequired,
|
||||||
tags: PropTypes.array,
|
tags: PropTypes.array,
|
||||||
isStarred: PropTypes.bool.isRequired,
|
isStarred: PropTypes.bool.isRequired
|
||||||
}),
|
}),
|
||||||
handleNoteClick: PropTypes.func.isRequired,
|
handleNoteClick: PropTypes.func.isRequired,
|
||||||
handleNoteContextMenu: PropTypes.func.isRequired,
|
handleNoteContextMenu: PropTypes.func.isRequired
|
||||||
}
|
}
|
||||||
|
|
||||||
export default CSSModules(NoteItem, styles)
|
export default CSSModules(NoteItem, styles)
|
||||||
|
|||||||
@@ -40,10 +40,10 @@ NoteItemSimple.propTypes = {
|
|||||||
storage: PropTypes.string.isRequired,
|
storage: PropTypes.string.isRequired,
|
||||||
key: PropTypes.string.isRequired,
|
key: PropTypes.string.isRequired,
|
||||||
type: PropTypes.string.isRequired,
|
type: PropTypes.string.isRequired,
|
||||||
title: PropTypes.string.isrequired,
|
title: PropTypes.string.isrequired
|
||||||
}),
|
}),
|
||||||
handleNoteClick: PropTypes.func.isRequired,
|
handleNoteClick: PropTypes.func.isRequired,
|
||||||
handleNoteContextMenu: PropTypes.func.isRequired,
|
handleNoteContextMenu: PropTypes.func.isRequired
|
||||||
}
|
}
|
||||||
|
|
||||||
export default CSSModules(NoteItemSimple, styles)
|
export default CSSModules(NoteItemSimple, styles)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export default class ProfileImage extends React.Component {
|
|||||||
className={className}
|
className={className}
|
||||||
width={this.props.size}
|
width={this.props.size}
|
||||||
height={this.props.size}
|
height={this.props.size}
|
||||||
src={src}/>
|
src={src} />
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,17 +17,17 @@ const SideNavFilter = ({
|
|||||||
isFolded, isHomeActive, handleAllNotesButtonClick,
|
isFolded, isHomeActive, handleAllNotesButtonClick,
|
||||||
isStarredActive, handleStarredButtonClick
|
isStarredActive, handleStarredButtonClick
|
||||||
}) => (
|
}) => (
|
||||||
<div styleName={ isFolded ? 'menu--folded' : 'menu' }>
|
<div styleName={isFolded ? 'menu--folded' : 'menu'}>
|
||||||
<button styleName={isHomeActive ? 'menu-button--active' : 'menu-button'}
|
<button styleName={isHomeActive ? 'menu-button--active' : 'menu-button'}
|
||||||
onClick={handleAllNotesButtonClick}
|
onClick={handleAllNotesButtonClick}
|
||||||
>
|
>
|
||||||
<i className='fa fa-book fa-fw'/>
|
<i className='fa fa-book fa-fw' />
|
||||||
<span styleName='menu-button-label'>All Notes</span>
|
<span styleName='menu-button-label'>All Notes</span>
|
||||||
</button>
|
</button>
|
||||||
<button styleName={isStarredActive ? 'menu-button--active' : 'menu-button'}
|
<button styleName={isStarredActive ? 'menu-button--active' : 'menu-button'}
|
||||||
onClick={handleStarredButtonClick}
|
onClick={handleStarredButtonClick}
|
||||||
>
|
>
|
||||||
<i className='fa fa-star fa-fw'/>
|
<i className='fa fa-star fa-fw' />
|
||||||
<span styleName='menu-button-label'>Starred</span>
|
<span styleName='menu-button-label'>Starred</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -38,7 +38,7 @@ SideNavFilter.propTypes = {
|
|||||||
isHomeActive: PropTypes.bool.isRequired,
|
isHomeActive: PropTypes.bool.isRequired,
|
||||||
handleAllNotesButtonClick: PropTypes.func.isRequired,
|
handleAllNotesButtonClick: PropTypes.func.isRequired,
|
||||||
isStarredActive: PropTypes.bool.isRequired,
|
isStarredActive: PropTypes.bool.isRequired,
|
||||||
handleStarredButtonClick: PropTypes.func.isRequired,
|
handleStarredButtonClick: PropTypes.func.isRequired
|
||||||
}
|
}
|
||||||
|
|
||||||
export default CSSModules(SideNavFilter, styles)
|
export default CSSModules(SideNavFilter, styles)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { PropTypes } from 'react'
|
import React from 'react'
|
||||||
import CSSModules from 'browser/lib/CSSModules'
|
import CSSModules from 'browser/lib/CSSModules'
|
||||||
import styles from './SnippetTab.styl'
|
import styles from './SnippetTab.styl'
|
||||||
import context from 'browser/lib/context'
|
import context from 'browser/lib/context'
|
||||||
@@ -117,7 +117,7 @@ class SnippetTab extends React.Component {
|
|||||||
<button styleName='deleteButton'
|
<button styleName='deleteButton'
|
||||||
onClick={(e) => this.handleDeleteButtonClick(e)}
|
onClick={(e) => this.handleDeleteButtonClick(e)}
|
||||||
>
|
>
|
||||||
<i className='fa fa-times'/>
|
<i className='fa fa-times' />
|
||||||
</button>
|
</button>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ const StorageItem = ({
|
|||||||
onClick={handleButtonClick}
|
onClick={handleButtonClick}
|
||||||
onContextMenu={handleContextMenu}
|
onContextMenu={handleContextMenu}
|
||||||
>
|
>
|
||||||
<span styleName={isFolded ?
|
<span styleName={isFolded
|
||||||
'folderList-item-name--folded' : 'folderList-item-name'
|
? 'folderList-item-name--folded' : 'folderList-item-name'
|
||||||
}
|
}
|
||||||
style={{borderColor: folderColor}}
|
style={{borderColor: folderColor}}
|
||||||
>
|
>
|
||||||
@@ -52,7 +52,7 @@ StorageItem.propTypes = {
|
|||||||
folderName: PropTypes.string.isRequired,
|
folderName: PropTypes.string.isRequired,
|
||||||
folderColor: PropTypes.string,
|
folderColor: PropTypes.string,
|
||||||
isFolded: PropTypes.bool.isRequired,
|
isFolded: PropTypes.bool.isRequired,
|
||||||
noteCount: PropTypes.number,
|
noteCount: PropTypes.number
|
||||||
}
|
}
|
||||||
|
|
||||||
export default CSSModules(StorageItem, styles)
|
export default CSSModules(StorageItem, styles)
|
||||||
|
|||||||
@@ -39,6 +39,8 @@
|
|||||||
border-width 0 0 0 3px
|
border-width 0 0 0 3px
|
||||||
border-style solid
|
border-style solid
|
||||||
border-color transparent
|
border-color transparent
|
||||||
|
overflow hidden
|
||||||
|
text-overflow ellipsis
|
||||||
|
|
||||||
.folderList-item-noteCount
|
.folderList-item-noteCount
|
||||||
float right
|
float right
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ $list-width = 250px
|
|||||||
.result
|
.result
|
||||||
absolute left right bottom
|
absolute left right bottom
|
||||||
top $search-height
|
top $search-height
|
||||||
|
background-color $ui-noteDetail-backgroundColor
|
||||||
|
|
||||||
.result-nav
|
.result-nav
|
||||||
user-select none
|
user-select none
|
||||||
@@ -89,6 +90,9 @@ body[data-theme="dark"]
|
|||||||
.search-input
|
.search-input
|
||||||
color $ui-dark-text-color
|
color $ui-dark-text-color
|
||||||
|
|
||||||
|
.result
|
||||||
|
background-color $ui-dark-noteList-backgroundColor
|
||||||
|
|
||||||
.result-nav
|
.result-nav
|
||||||
background-color $ui-dark-backgroundColor
|
background-color $ui-dark-backgroundColor
|
||||||
label
|
label
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { PropTypes } from 'react'
|
import React from 'react'
|
||||||
import CSSModules from 'browser/lib/CSSModules'
|
import CSSModules from 'browser/lib/CSSModules'
|
||||||
import styles from './NoteDetail.styl'
|
import styles from './NoteDetail.styl'
|
||||||
import MarkdownPreview from 'browser/components/MarkdownPreview'
|
import MarkdownPreview from 'browser/components/MarkdownPreview'
|
||||||
@@ -97,9 +97,7 @@ class NoteDetail extends React.Component {
|
|||||||
let { note, config } = this.props
|
let { note, config } = this.props
|
||||||
if (note == null) {
|
if (note == null) {
|
||||||
return (
|
return (
|
||||||
<div styleName='root'>
|
<div styleName='root' />
|
||||||
|
|
||||||
</div>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,6 +152,7 @@ class NoteDetail extends React.Component {
|
|||||||
fontSize={editorFontSize}
|
fontSize={editorFontSize}
|
||||||
indentType={config.editor.indentType}
|
indentType={config.editor.indentType}
|
||||||
indentSize={editorIndentSize}
|
indentSize={editorIndentSize}
|
||||||
|
keyMap={config.editor.keyMap}
|
||||||
readOnly
|
readOnly
|
||||||
ref={'code-' + index}
|
ref={'code-' + index}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { PropTypes } from 'react'
|
import React from 'react'
|
||||||
import NoteItem from 'browser/components/NoteItem'
|
import NoteItem from 'browser/components/NoteItem'
|
||||||
import moment from 'moment'
|
import moment from 'moment'
|
||||||
|
|
||||||
@@ -54,12 +54,11 @@ class NoteList extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
let { storageMap, notes, index } = this.props
|
let { notes, index } = this.props
|
||||||
|
|
||||||
let notesList = notes
|
let notesList = notes
|
||||||
.slice(0, 10 + 10 * this.state.range)
|
.slice(0, 10 + 10 * this.state.range)
|
||||||
.map((note, _index) => {
|
.map((note, _index) => {
|
||||||
|
|
||||||
const isActive = (index === _index)
|
const isActive = (index === _index)
|
||||||
const key = `${note.storage}-${note.key}`
|
const key = `${note.storage}-${note.key}`
|
||||||
const dateDisplay = moment(note.updatedAt).fromNow()
|
const dateDisplay = moment(note.updatedAt).fromNow()
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { PropTypes } from 'react'
|
import React from 'react'
|
||||||
import CSSModules from 'browser/lib/CSSModules'
|
import CSSModules from 'browser/lib/CSSModules'
|
||||||
import styles from './StorageSection.styl'
|
import styles from './StorageSection.styl'
|
||||||
import StorageItem from 'browser/components/StorageItem'
|
import StorageItem from 'browser/components/StorageItem'
|
||||||
|
|||||||
@@ -67,12 +67,8 @@ class FinderMain extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleWindowBlur (e) {
|
handleWindowBlur (e) {
|
||||||
let { filter } = this.state
|
|
||||||
filter.type = 'ALL'
|
|
||||||
this.setState({
|
this.setState({
|
||||||
search: '',
|
search: '',
|
||||||
filter,
|
|
||||||
index: 0
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -351,7 +347,7 @@ function refreshData () {
|
|||||||
|
|
||||||
ReactDOM.render((
|
ReactDOM.render((
|
||||||
<Provider store={store}>
|
<Provider store={store}>
|
||||||
<Finder/>
|
<Finder />
|
||||||
</Provider>
|
</Provider>
|
||||||
), document.getElementById('content'), function () {
|
), document.getElementById('content'), function () {
|
||||||
refreshData()
|
refreshData()
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
import superagent from 'superagent'
|
|
||||||
import superagentPromise from 'superagent-promise'
|
|
||||||
|
|
||||||
export const SERVER_URL = 'https://b00st.io/'
|
|
||||||
// export const SERVER_URL = 'http://localhost:3333/'
|
|
||||||
|
|
||||||
export const request = superagentPromise(superagent, Promise)
|
|
||||||
|
|
||||||
export function shareViaPublicURL (input) {
|
|
||||||
return request
|
|
||||||
.post(SERVER_URL + 'apis/share')
|
|
||||||
// .set({
|
|
||||||
// Authorization: 'Bearer ' + auth.token()
|
|
||||||
// })
|
|
||||||
.send(input)
|
|
||||||
}
|
|
||||||
|
|
||||||
export default {
|
|
||||||
SERVER_URL,
|
|
||||||
shareViaPublicURL
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
import CodeMirror from 'codemirror'
|
import CodeMirror from 'codemirror'
|
||||||
import _ from 'lodash'
|
|
||||||
|
|
||||||
CodeMirror.modeInfo.push({name: 'Stylus', mime: 'text/x-styl', mode: 'stylus', ext: ['styl'], alias: ['styl']})
|
CodeMirror.modeInfo.push({name: 'Stylus', mime: 'text/x-styl', mode: 'stylus', ext: ['styl'], alias: ['styl']})
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
/**
|
/**
|
||||||
* @fileoverview Formatting date string.
|
* @fileoverview Formatting date string.
|
||||||
*/
|
*/
|
||||||
import moment from 'moment';
|
import moment from 'moment'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Return date string. For example, 'Sep.9, 2016 12:00'.
|
* @description Return date string. For example, 'Sep.9, 2016 12:00'.
|
||||||
* @param {mixed}
|
* @param {mixed}
|
||||||
* @return {string}
|
* @return {string}
|
||||||
*/
|
*/
|
||||||
export function getLastUpdated(date) {
|
export function getLastUpdated (date) {
|
||||||
const m = moment(date)
|
const m = moment(date)
|
||||||
if (!m.isValid()) {
|
if (!m.isValid()) {
|
||||||
throw Error('Invalid argument.');
|
throw Error('Invalid argument.')
|
||||||
}
|
}
|
||||||
|
|
||||||
return m.format('MMM D, gggg H:mm')
|
return m.format('MMM D, gggg H:mm')
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ md.use(math, {
|
|||||||
})
|
})
|
||||||
md.use(require('markdown-it-footnote'))
|
md.use(require('markdown-it-footnote'))
|
||||||
// Override task item
|
// Override task item
|
||||||
md.block.ruler.at('paragraph', function (state, startLine/*, endLine*/) {
|
md.block.ruler.at('paragraph', function (state, startLine/*, endLine */) {
|
||||||
let content, terminate, i, l, token
|
let content, terminate, i, l, token
|
||||||
let nextLine = startLine + 1
|
let nextLine = startLine + 1
|
||||||
let terminatorRules = state.md.block.ruler.getRules('paragraph')
|
let terminatorRules = state.md.block.ruler.getRules('paragraph')
|
||||||
|
|||||||
@@ -128,8 +128,8 @@ class FolderSelect extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
nextOption () {
|
nextOption () {
|
||||||
let { storages } = this.props
|
|
||||||
let { optionIndex } = this.state
|
let { optionIndex } = this.state
|
||||||
|
let { folders } = this.props
|
||||||
|
|
||||||
optionIndex++
|
optionIndex++
|
||||||
if (optionIndex >= folders.length) optionIndex = 0
|
if (optionIndex >= folders.length) optionIndex = 0
|
||||||
@@ -262,13 +262,11 @@ class FolderSelect extends React.Component {
|
|||||||
: <div styleName='idle'>
|
: <div styleName='idle'>
|
||||||
<div styleName='idle-label'>
|
<div styleName='idle-label'>
|
||||||
<span styleName='idle-label-name'
|
<span styleName='idle-label-name'
|
||||||
style={{borderColor: currentOption.folder.color}}
|
style={{color: currentOption.folder.color}}
|
||||||
>
|
>
|
||||||
{currentOption.folder.name}
|
{currentOption.folder.name} /
|
||||||
<span styleName='idle-label-name-surfix'>in {currentOption.storage.name}</span>
|
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<i styleName='idle-caret' className='fa fa-fw fa-caret-down'/>
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,29 +7,28 @@
|
|||||||
transition 0.15s
|
transition 0.15s
|
||||||
user-select none
|
user-select none
|
||||||
&:hover
|
&:hover
|
||||||
background-color white
|
background-color $ui-button--hover-backgroundColor
|
||||||
border-color $ui-borderColor
|
|
||||||
|
|
||||||
.root--search, .root--focus
|
.root--search, .root--focus
|
||||||
@extend .root
|
@extend .root
|
||||||
background-color white
|
background-color $ui-noteDetail-backgroundColor = #F4F4F4
|
||||||
border-color $ui-input--focus-borderColor
|
border-color $ui-input--focus-borderColor
|
||||||
|
width 100px
|
||||||
&:hover
|
&:hover
|
||||||
background-color white
|
|
||||||
border-color $ui-input--focus-borderColor
|
border-color $ui-input--focus-borderColor
|
||||||
|
|
||||||
.idle
|
.idle
|
||||||
position relative
|
position relative
|
||||||
cursor pointer
|
cursor pointer
|
||||||
|
|
||||||
.idle-label
|
.idle-label
|
||||||
absolute left top
|
|
||||||
padding 0 0 0 5px
|
|
||||||
right 20px
|
right 20px
|
||||||
overflow ellipsis
|
overflow ellipsis
|
||||||
|
|
||||||
.idle-label-name
|
.idle-label-name
|
||||||
border-left solid 4px transparent
|
font-size 16px
|
||||||
padding 2px 5px
|
padding 2px
|
||||||
|
|
||||||
.idle-label-name-surfix
|
.idle-label-name-surfix
|
||||||
font-size 10px
|
font-size 10px
|
||||||
color $ui-inactive-text-color
|
color $ui-inactive-text-color
|
||||||
@@ -60,9 +59,9 @@
|
|||||||
max-height 450px
|
max-height 450px
|
||||||
overflow auto
|
overflow auto
|
||||||
z-index 200
|
z-index 200
|
||||||
|
border $ui-border
|
||||||
background-color white
|
background-color white
|
||||||
border-radius 2px
|
border-radius 2px
|
||||||
box-shadow 2px 2px 10px gray
|
|
||||||
|
|
||||||
.search-optionList-item
|
.search-optionList-item
|
||||||
height 34px
|
height 34px
|
||||||
@@ -115,8 +114,8 @@ body[data-theme="dark"]
|
|||||||
|
|
||||||
.search-optionList
|
.search-optionList
|
||||||
color white
|
color white
|
||||||
|
border-color $ui-dark-borderColor
|
||||||
background-color $ui-dark-button--hover-backgroundColor
|
background-color $ui-dark-button--hover-backgroundColor
|
||||||
box-shadow 2px 2px 10px black
|
|
||||||
|
|
||||||
.search-optionList-item
|
.search-optionList-item
|
||||||
&:hover
|
&:hover
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ const LastUpdatedString = ({ date }) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
LastUpdatedString.propTypes = {
|
LastUpdatedString.propTypes = {
|
||||||
date: PropTypes.string,
|
date: PropTypes.string
|
||||||
}
|
}
|
||||||
|
|
||||||
export default CSSModules(LastUpdatedString, styles)
|
export default CSSModules(LastUpdatedString, styles)
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
.info-right-date
|
.info-right-date
|
||||||
display inline
|
display inline
|
||||||
|
line-height 24px
|
||||||
|
padding-right 25px
|
||||||
font-size 11px
|
font-size 11px
|
||||||
color $ui-button-color
|
color $ui-button-color
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import styles from './MarkdownNoteDetail.styl'
|
|||||||
import MarkdownEditor from 'browser/components/MarkdownEditor'
|
import MarkdownEditor from 'browser/components/MarkdownEditor'
|
||||||
import StarButton from './StarButton'
|
import StarButton from './StarButton'
|
||||||
import TagSelect from './TagSelect'
|
import TagSelect from './TagSelect'
|
||||||
import LastUpdatedString from './LastUpdatedString'
|
import FolderSelect from './FolderSelect'
|
||||||
import dataApi from 'browser/main/lib/dataApi'
|
import dataApi from 'browser/main/lib/dataApi'
|
||||||
import { hashHistory } from 'react-router'
|
import { hashHistory } from 'react-router'
|
||||||
import ee from 'browser/main/lib/eventEmitter'
|
import ee from 'browser/main/lib/eventEmitter'
|
||||||
@@ -219,6 +219,15 @@ class MarkdownNoteDetail extends React.Component {
|
|||||||
onClick={(e) => this.handleStarButtonClick(e)}
|
onClick={(e) => this.handleStarButtonClick(e)}
|
||||||
isActive={note.isStarred}
|
isActive={note.isStarred}
|
||||||
/>
|
/>
|
||||||
|
<div styleName='info-left-top'>
|
||||||
|
<FolderSelect styleName='info-left-top-folderSelect'
|
||||||
|
value={this.state.note.storage + '-' + this.state.note.folder}
|
||||||
|
ref='folder'
|
||||||
|
data={data}
|
||||||
|
onChange={(e) => this.handleFolderChange(e)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<TagSelect
|
<TagSelect
|
||||||
ref='tags'
|
ref='tags'
|
||||||
value={this.state.note.tags}
|
value={this.state.note.tags}
|
||||||
@@ -226,7 +235,6 @@ class MarkdownNoteDetail extends React.Component {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div styleName='info-right'>
|
<div styleName='info-right'>
|
||||||
<LastUpdatedString date={note.updatedAt} />
|
|
||||||
<button styleName='info-right-button'
|
<button styleName='info-right-button'
|
||||||
onClick={(e) => this.handleContextButtonClick(e)}
|
onClick={(e) => this.handleContextButtonClick(e)}
|
||||||
>
|
>
|
||||||
@@ -248,6 +256,7 @@ class MarkdownNoteDetail extends React.Component {
|
|||||||
|
|
||||||
<StatusBar
|
<StatusBar
|
||||||
{..._.pick(this.props, ['config', 'location', 'dispatch'])}
|
{..._.pick(this.props, ['config', 'location', 'dispatch'])}
|
||||||
|
date={note.updatedAt}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -16,6 +16,19 @@ $info-margin-under-border = 27px
|
|||||||
padding 0 5px
|
padding 0 5px
|
||||||
margin 0px 2px
|
margin 0px 2px
|
||||||
|
|
||||||
|
.info-left-top
|
||||||
|
display inline-block
|
||||||
|
height $info-height
|
||||||
|
line-height $info-height
|
||||||
|
|
||||||
|
.info-left-top-folderSelect
|
||||||
|
display inline-block
|
||||||
|
padding 0 3px
|
||||||
|
height 34px
|
||||||
|
line-height 34px
|
||||||
|
vertical-align middle
|
||||||
|
border-radius 3px
|
||||||
|
|
||||||
.info-left-button
|
.info-left-button
|
||||||
width 34px
|
width 34px
|
||||||
height 34px
|
height 34px
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import CodeEditor from 'browser/components/CodeEditor'
|
|||||||
import MarkdownEditor from 'browser/components/MarkdownEditor'
|
import MarkdownEditor from 'browser/components/MarkdownEditor'
|
||||||
import StarButton from './StarButton'
|
import StarButton from './StarButton'
|
||||||
import TagSelect from './TagSelect'
|
import TagSelect from './TagSelect'
|
||||||
import LastUpdatedString from './LastUpdatedString'
|
import FolderSelect from './FolderSelect'
|
||||||
import dataApi from 'browser/main/lib/dataApi'
|
import dataApi from 'browser/main/lib/dataApi'
|
||||||
import { hashHistory } from 'react-router'
|
import { hashHistory } from 'react-router'
|
||||||
import ee from 'browser/main/lib/eventEmitter'
|
import ee from 'browser/main/lib/eventEmitter'
|
||||||
@@ -14,6 +14,7 @@ import SnippetTab from 'browser/components/SnippetTab'
|
|||||||
import StatusBar from '../StatusBar'
|
import StatusBar from '../StatusBar'
|
||||||
import context from 'browser/lib/context'
|
import context from 'browser/lib/context'
|
||||||
import ConfigManager from 'browser/main/lib/ConfigManager'
|
import ConfigManager from 'browser/main/lib/ConfigManager'
|
||||||
|
import _ from 'lodash'
|
||||||
|
|
||||||
function pass (name) {
|
function pass (name) {
|
||||||
switch (name) {
|
switch (name) {
|
||||||
@@ -508,6 +509,7 @@ class SnippetNoteDetail extends React.Component {
|
|||||||
fontSize={editorFontSize}
|
fontSize={editorFontSize}
|
||||||
indentType={config.editor.indentType}
|
indentType={config.editor.indentType}
|
||||||
indentSize={editorIndentSize}
|
indentSize={editorIndentSize}
|
||||||
|
keyMap={config.editor.keyMap}
|
||||||
onChange={(e) => this.handleCodeChange(index)(e)}
|
onChange={(e) => this.handleCodeChange(index)(e)}
|
||||||
ref={'code-' + index}
|
ref={'code-' + index}
|
||||||
/>
|
/>
|
||||||
@@ -527,6 +529,15 @@ class SnippetNoteDetail extends React.Component {
|
|||||||
onClick={(e) => this.handleStarButtonClick(e)}
|
onClick={(e) => this.handleStarButtonClick(e)}
|
||||||
isActive={note.isStarred}
|
isActive={note.isStarred}
|
||||||
/>
|
/>
|
||||||
|
<div styleName='info-left-top'>
|
||||||
|
<FolderSelect styleName='info-left-top-folderSelect'
|
||||||
|
value={this.state.note.storage + '-' + this.state.note.folder}
|
||||||
|
ref='folder'
|
||||||
|
data={data}
|
||||||
|
onChange={(e) => this.handleFolderChange(e)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<TagSelect
|
<TagSelect
|
||||||
ref='tags'
|
ref='tags'
|
||||||
value={this.state.note.tags}
|
value={this.state.note.tags}
|
||||||
@@ -534,11 +545,10 @@ class SnippetNoteDetail extends React.Component {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div styleName='info-right'>
|
<div styleName='info-right'>
|
||||||
<LastUpdatedString date={note.updatedAt} />
|
|
||||||
<button styleName='info-right-button'
|
<button styleName='info-right-button'
|
||||||
onClick={(e) => this.handleContextButtonClick(e)}
|
onClick={(e) => this.handleContextButtonClick(e)}
|
||||||
>
|
>
|
||||||
<i className='fa fa-ellipsis-v'/>
|
<i className='fa fa-ellipsis-v' />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -563,7 +573,7 @@ class SnippetNoteDetail extends React.Component {
|
|||||||
<button styleName='plusButton'
|
<button styleName='plusButton'
|
||||||
onClick={(e) => this.handleTabPlusButtonClick(e)}
|
onClick={(e) => this.handleTabPlusButtonClick(e)}
|
||||||
>
|
>
|
||||||
<i className='fa fa-plus'/>
|
<i className='fa fa-plus' />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
{viewList}
|
{viewList}
|
||||||
@@ -577,24 +587,25 @@ class SnippetNoteDetail extends React.Component {
|
|||||||
? 'Select Syntax...'
|
? 'Select Syntax...'
|
||||||
: this.state.note.snippets[this.state.snippetIndex].mode
|
: this.state.note.snippets[this.state.snippetIndex].mode
|
||||||
}
|
}
|
||||||
<i className='fa fa-caret-down'/>
|
<i className='fa fa-caret-down' />
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={(e) => this.handleIndentTypeButtonClick(e)}
|
onClick={(e) => this.handleIndentTypeButtonClick(e)}
|
||||||
>
|
>
|
||||||
Indent: {config.editor.indentType}
|
Indent: {config.editor.indentType}
|
||||||
<i className='fa fa-caret-down'/>
|
<i className='fa fa-caret-down' />
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={(e) => this.handleIndentSizeButtonClick(e)}
|
onClick={(e) => this.handleIndentSizeButtonClick(e)}
|
||||||
>
|
>
|
||||||
size: {config.editor.indentSize}
|
size: {config.editor.indentSize}
|
||||||
<i className='fa fa-caret-down'/>
|
<i className='fa fa-caret-down' />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<StatusBar
|
<StatusBar
|
||||||
{..._.pick(this.props, ['config', 'location', 'dispatch'])}
|
{..._.pick(this.props, ['config', 'location', 'dispatch'])}
|
||||||
|
date={note.updatedAt}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -56,6 +56,7 @@
|
|||||||
|
|
||||||
.override
|
.override
|
||||||
absolute bottom left
|
absolute bottom left
|
||||||
|
left 60px
|
||||||
height 23px
|
height 23px
|
||||||
z-index 1
|
z-index 1
|
||||||
button
|
button
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
.root
|
.root
|
||||||
position absolute
|
|
||||||
left 7px
|
left 7px
|
||||||
top 0
|
top 0
|
||||||
padding 0
|
padding 0
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ class TagSelect extends React.Component {
|
|||||||
super(props)
|
super(props)
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
newTag: '',
|
newTag: ''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,7 +111,7 @@ class TagSelect extends React.Component {
|
|||||||
<button styleName='tag-removeButton'
|
<button styleName='tag-removeButton'
|
||||||
onClick={(e) => this.handleTagRemoveButtonClick(tag)(e)}
|
onClick={(e) => this.handleTagRemoveButtonClick(tag)(e)}
|
||||||
>
|
>
|
||||||
<i className='fa fa-times fa-fw tag-removeButton-icon'/>
|
<i className='fa fa-times fa-fw tag-removeButton-icon' />
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
.root
|
.root
|
||||||
position absolute
|
display inline-block
|
||||||
top 19px
|
top 19px
|
||||||
left 44px
|
|
||||||
user-select none
|
user-select none
|
||||||
vertical-align middle
|
vertical-align middle
|
||||||
width 300px
|
width 300px
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ class Main extends React.Component {
|
|||||||
ConfigManager.set({ navWidth })
|
ConfigManager.set({ navWidth })
|
||||||
dispatch({
|
dispatch({
|
||||||
type: 'SET_NAV_WIDTH',
|
type: 'SET_NAV_WIDTH',
|
||||||
navWidth,
|
navWidth
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -169,7 +169,7 @@ class Main extends React.Component {
|
|||||||
onMouseDown={(e) => this.handleLeftSlideMouseDown(e)}
|
onMouseDown={(e) => this.handleLeftSlideMouseDown(e)}
|
||||||
draggable='false'
|
draggable='false'
|
||||||
>
|
>
|
||||||
<div styleName='slider-hitbox'/>
|
<div styleName='slider-hitbox' />
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<div styleName={config.isSideNavFolded ? 'body--expanded' : 'body'}
|
<div styleName={config.isSideNavFolded ? 'body--expanded' : 'body'}
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ class NoteList extends React.Component {
|
|||||||
this.focusHandler = () => {
|
this.focusHandler = () => {
|
||||||
this.refs.list.focus()
|
this.refs.list.focus()
|
||||||
}
|
}
|
||||||
|
this.alertIfSnippetHnalder = () => {
|
||||||
|
this.alertIfSnippet()
|
||||||
|
}
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
}
|
}
|
||||||
@@ -48,6 +51,7 @@ class NoteList extends React.Component {
|
|||||||
ee.on('list:next', this.selectNextNoteHandler)
|
ee.on('list:next', this.selectNextNoteHandler)
|
||||||
ee.on('list:prior', this.selectPriorNoteHandler)
|
ee.on('list:prior', this.selectPriorNoteHandler)
|
||||||
ee.on('list:focus', this.focusHandler)
|
ee.on('list:focus', this.focusHandler)
|
||||||
|
ee.on('list:isMarkdownNote', this.alertIfSnippetHnalder)
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps (nextProps) {
|
componentWillReceiveProps (nextProps) {
|
||||||
@@ -66,6 +70,7 @@ class NoteList extends React.Component {
|
|||||||
ee.off('list:next', this.selectNextNoteHandler)
|
ee.off('list:next', this.selectNextNoteHandler)
|
||||||
ee.off('list:prior', this.selectPriorNoteHandler)
|
ee.off('list:prior', this.selectPriorNoteHandler)
|
||||||
ee.off('list:focus', this.focusHandler)
|
ee.off('list:focus', this.focusHandler)
|
||||||
|
ee.off('list:isMarkdownNote', this.alertIfSnippetHnalder)
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate (prevProps) {
|
componentDidUpdate (prevProps) {
|
||||||
@@ -305,6 +310,20 @@ class NoteList extends React.Component {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
alertIfSnippet() {
|
||||||
|
let { location } = this.props
|
||||||
|
const targetIndex = _.findIndex(this.notes, (note) => {
|
||||||
|
return `${note.storage}-${note.key}` === location.query.key
|
||||||
|
})
|
||||||
|
if (this.notes[targetIndex].type === 'SNIPPET_NOTE') {
|
||||||
|
dialog.showMessageBox(remote.getCurrentWindow(), {
|
||||||
|
type: 'warning',
|
||||||
|
message: 'Sorry!',
|
||||||
|
detail: 'md/text import is available only a markdown note.'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
let { location, notes, config } = this.props
|
let { location, notes, config } = this.props
|
||||||
let sortFunc = config.sortBy === 'CREATED_AT'
|
let sortFunc = config.sortBy === 'CREATED_AT'
|
||||||
@@ -324,8 +343,8 @@ class NoteList extends React.Component {
|
|||||||
const isDefault = config.listStyle === 'DEFAULT'
|
const isDefault = config.listStyle === 'DEFAULT'
|
||||||
const isActive = location.query.key === note.storage + '-' + note.key
|
const isActive = location.query.key === note.storage + '-' + note.key
|
||||||
const dateDisplay = moment(
|
const dateDisplay = moment(
|
||||||
config.sortBy === 'CREATED_AT' ?
|
config.sortBy === 'CREATED_AT'
|
||||||
note.createdAt : note.updatedAt
|
? note.createdAt : note.updatedAt
|
||||||
).fromNow()
|
).fromNow()
|
||||||
const key = `${note.storage}-${note.key}`
|
const key = `${note.storage}-${note.key}`
|
||||||
|
|
||||||
@@ -376,7 +395,7 @@ class NoteList extends React.Component {
|
|||||||
}
|
}
|
||||||
onClick={(e) => this.handleListStyleButtonClick(e, 'DEFAULT')}
|
onClick={(e) => this.handleListStyleButtonClick(e, 'DEFAULT')}
|
||||||
>
|
>
|
||||||
<i className='fa fa-th-large'/>
|
<i className='fa fa-th-large' />
|
||||||
</button>
|
</button>
|
||||||
<button styleName={config.listStyle === 'SMALL'
|
<button styleName={config.listStyle === 'SMALL'
|
||||||
? 'control-button--active'
|
? 'control-button--active'
|
||||||
@@ -384,7 +403,7 @@ class NoteList extends React.Component {
|
|||||||
}
|
}
|
||||||
onClick={(e) => this.handleListStyleButtonClick(e, 'SMALL')}
|
onClick={(e) => this.handleListStyleButtonClick(e, 'SMALL')}
|
||||||
>
|
>
|
||||||
<i className='fa fa-list-ul'/>
|
<i className='fa fa-list-ul' />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div styleName='list'
|
<div styleName='list'
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
.top-menu
|
.top-menu
|
||||||
navButtonColor()
|
navButtonColor()
|
||||||
height $topBar-height - 1
|
height $topBar-height
|
||||||
padding 0 15px
|
padding 0 15px
|
||||||
font-size 14px
|
font-size 14px
|
||||||
width 100%
|
width 100%
|
||||||
|
|||||||
@@ -181,7 +181,7 @@ class StorageItem extends React.Component {
|
|||||||
<button styleName='header-addFolderButton'
|
<button styleName='header-addFolderButton'
|
||||||
onClick={(e) => this.handleAddFolderButtonClick(e)}
|
onClick={(e) => this.handleAddFolderButtonClick(e)}
|
||||||
>
|
>
|
||||||
<i className='fa fa-plus'/>
|
<i className='fa fa-plus' />
|
||||||
</button>
|
</button>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,9 +7,6 @@ import ConfigManager from 'browser/main/lib/ConfigManager'
|
|||||||
import StorageItem from './StorageItem'
|
import StorageItem from './StorageItem'
|
||||||
import SideNavFilter from 'browser/components/SideNavFilter'
|
import SideNavFilter from 'browser/components/SideNavFilter'
|
||||||
|
|
||||||
const electron = require('electron')
|
|
||||||
const { remote } = electron
|
|
||||||
|
|
||||||
class SideNav extends React.Component {
|
class SideNav extends React.Component {
|
||||||
// TODO: should not use electron stuff v0.7
|
// TODO: should not use electron stuff v0.7
|
||||||
handleMenuButtonClick (e) {
|
handleMenuButtonClick (e) {
|
||||||
@@ -65,7 +62,7 @@ class SideNav extends React.Component {
|
|||||||
<button styleName='top-menu'
|
<button styleName='top-menu'
|
||||||
onClick={(e) => this.handleMenuButtonClick(e)}
|
onClick={(e) => this.handleMenuButtonClick(e)}
|
||||||
>
|
>
|
||||||
<i className='fa fa-navicon fa-fw'/>
|
<i className='fa fa-navicon fa-fw' />
|
||||||
<span styleName='top-menu-label'>Menu</span>
|
<span styleName='top-menu-label'>Menu</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -87,8 +84,8 @@ class SideNav extends React.Component {
|
|||||||
onClick={(e) => this.handleToggleButtonClick(e)}
|
onClick={(e) => this.handleToggleButtonClick(e)}
|
||||||
>
|
>
|
||||||
{isFolded
|
{isFolded
|
||||||
? <i className='fa fa-angle-double-right'/>
|
? <i className='fa fa-angle-double-right' />
|
||||||
: <i className='fa fa-angle-double-left'/>
|
: <i className='fa fa-angle-double-left' />
|
||||||
}
|
}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,12 +2,13 @@ import React, { PropTypes } from 'react'
|
|||||||
import CSSModules from 'browser/lib/CSSModules'
|
import CSSModules from 'browser/lib/CSSModules'
|
||||||
import styles from './StatusBar.styl'
|
import styles from './StatusBar.styl'
|
||||||
import ZoomManager from 'browser/main/lib/ZoomManager'
|
import ZoomManager from 'browser/main/lib/ZoomManager'
|
||||||
|
import LastUpdatedString from '../Detail/LastUpdatedString'
|
||||||
|
|
||||||
const electron = require('electron')
|
const electron = require('electron')
|
||||||
const { remote, ipcRenderer } = electron
|
const { remote, ipcRenderer } = electron
|
||||||
const { Menu, MenuItem, dialog } = remote
|
const { Menu, MenuItem, dialog } = remote
|
||||||
|
|
||||||
const zoomOptions = [0.8, 0.9, 1, 1.1, 1.2, 1.3]
|
const zoomOptions = [0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0]
|
||||||
|
|
||||||
class StatusBar extends React.Component {
|
class StatusBar extends React.Component {
|
||||||
updateApp () {
|
updateApp () {
|
||||||
@@ -52,22 +53,23 @@ class StatusBar extends React.Component {
|
|||||||
<div className='StatusBar'
|
<div className='StatusBar'
|
||||||
styleName='root'
|
styleName='root'
|
||||||
>
|
>
|
||||||
<div styleName='blank' />
|
|
||||||
{status.updateReady
|
|
||||||
? <button onClick={this.updateApp} styleName='update'>
|
|
||||||
<i styleName='update-icon' className='fa fa-cloud-download' /> Ready to Update!
|
|
||||||
</button>
|
|
||||||
: null
|
|
||||||
}
|
|
||||||
{/*<button styleName='help'>
|
|
||||||
<i className='fa fa-info-circle' />
|
|
||||||
</button>*/}
|
|
||||||
<button styleName='zoom'
|
<button styleName='zoom'
|
||||||
onClick={(e) => this.handleZoomButtonClick(e)}
|
onClick={(e) => this.handleZoomButtonClick(e)}
|
||||||
>
|
>
|
||||||
<i className='fa fa-search-plus' />
|
<i className='fa fa-search-plus' />
|
||||||
{Math.floor(config.zoom * 100)}%
|
{Math.floor(config.zoom * 100)}%
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
|
<div styleName='blank' />
|
||||||
|
|
||||||
|
{status.updateReady
|
||||||
|
? <button onClick={this.updateApp} styleName='update'>
|
||||||
|
<i styleName='update-icon' className='fa fa-cloud-download' /> Ready to Update!
|
||||||
|
</button>
|
||||||
|
: null
|
||||||
|
}
|
||||||
|
|
||||||
|
<LastUpdatedString date={this.props.date} />
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -77,7 +79,8 @@ StatusBar.contextTypes = {
|
|||||||
status: PropTypes.shape({
|
status: PropTypes.shape({
|
||||||
updateReady: PropTypes.bool.isRequired
|
updateReady: PropTypes.bool.isRequired
|
||||||
}).isRequired,
|
}).isRequired,
|
||||||
config: PropTypes.shape({}).isRequired
|
config: PropTypes.shape({}).isRequired,
|
||||||
|
date: PropTypes.string
|
||||||
}
|
}
|
||||||
|
|
||||||
StatusBar.propTypes = {
|
StatusBar.propTypes = {
|
||||||
|
|||||||
@@ -10,8 +10,6 @@ import ConfigManager from 'browser/main/lib/ConfigManager'
|
|||||||
import dataApi from 'browser/main/lib/dataApi'
|
import dataApi from 'browser/main/lib/dataApi'
|
||||||
|
|
||||||
const OSX = window.process.platform === 'darwin'
|
const OSX = window.process.platform === 'darwin'
|
||||||
const { remote } = require('electron')
|
|
||||||
const { Menu, MenuItem } = remote
|
|
||||||
|
|
||||||
class TopBar extends React.Component {
|
class TopBar extends React.Component {
|
||||||
constructor (props) {
|
constructor (props) {
|
||||||
@@ -26,14 +24,20 @@ class TopBar extends React.Component {
|
|||||||
this.newNoteHandler = () => {
|
this.newNoteHandler = () => {
|
||||||
this.handleNewPostButtonClick()
|
this.handleNewPostButtonClick()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.focusSearchHandler = () => {
|
||||||
|
this.handleOnSearchFocus()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount () {
|
componentDidMount () {
|
||||||
ee.on('top:new-note', this.newNoteHandler)
|
ee.on('top:new-note', this.newNoteHandler)
|
||||||
|
ee.on('top:focus-search', this.focusSearchHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount () {
|
componentWillUnmount () {
|
||||||
ee.off('top:new-note', this.newNoteHandler)
|
ee.off('top:new-note', this.newNoteHandler)
|
||||||
|
ee.off('top:focus-search', this.focusSearchHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
handleNewPostButtonClick (e) {
|
handleNewPostButtonClick (e) {
|
||||||
@@ -71,10 +75,10 @@ class TopBar extends React.Component {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (storage == null) alert('No storage to create a note')
|
if (storage == null) window.alert('No storage to create a note')
|
||||||
let folder = _.find(storage.folders, {key: params.folderKey})
|
let folder = _.find(storage.folders, {key: params.folderKey})
|
||||||
if (folder == null) folder = storage.folders[0]
|
if (folder == null) folder = storage.folders[0]
|
||||||
if (folder == null) alert('No folder to create a note')
|
if (folder == null) window.alert('No folder to create a note')
|
||||||
|
|
||||||
return {
|
return {
|
||||||
storage,
|
storage,
|
||||||
@@ -246,6 +250,14 @@ class TopBar extends React.Component {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleOnSearchFocus () {
|
||||||
|
if (this.state.searchPopupOpen) {
|
||||||
|
this.refs.search.childNodes[0].blur()
|
||||||
|
} else {
|
||||||
|
this.refs.search.childNodes[0].focus()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
let { config, style, data } = this.props
|
let { config, style, data } = this.props
|
||||||
let searchOptionList = this.getOptions()
|
let searchOptionList = this.getOptions()
|
||||||
@@ -262,8 +274,8 @@ class TopBar extends React.Component {
|
|||||||
<span styleName='control-search-optionList-item-folder-surfix'>in {storage.name}</span>
|
<span styleName='control-search-optionList-item-folder-surfix'>in {storage.name}</span>
|
||||||
</div>
|
</div>
|
||||||
{note.type === 'SNIPPET_NOTE'
|
{note.type === 'SNIPPET_NOTE'
|
||||||
? <i styleName='control-search-optionList-item-type' className='fa fa-code'/>
|
? <i styleName='control-search-optionList-item-type' className='fa fa-code' />
|
||||||
: <i styleName='control-search-optionList-item-type' className='fa fa-file-text-o'/>
|
: <i styleName='control-search-optionList-item-type' className='fa fa-file-text-o' />
|
||||||
}
|
}
|
||||||
{note.title}
|
{note.title}
|
||||||
</div>
|
</div>
|
||||||
@@ -276,7 +288,7 @@ class TopBar extends React.Component {
|
|||||||
>
|
>
|
||||||
<div styleName='control'>
|
<div styleName='control'>
|
||||||
<div styleName='control-search'>
|
<div styleName='control-search'>
|
||||||
<i styleName='control-search-icon' className='fa fa-search fa-fw'/>
|
<i styleName='control-search-icon' className='fa fa-search fa-fw' />
|
||||||
<div styleName='control-search-input'
|
<div styleName='control-search-input'
|
||||||
onFocus={(e) => this.handleSearchFocus(e)}
|
onFocus={(e) => this.handleSearchFocus(e)}
|
||||||
onBlur={(e) => this.handleSearchBlur(e)}
|
onBlur={(e) => this.handleSearchBlur(e)}
|
||||||
@@ -303,14 +315,14 @@ class TopBar extends React.Component {
|
|||||||
<button styleName='left-search-clearButton'
|
<button styleName='left-search-clearButton'
|
||||||
onClick={(e) => this.handleSearchClearButton(e)}
|
onClick={(e) => this.handleSearchClearButton(e)}
|
||||||
>
|
>
|
||||||
<i className='fa fa-times'/>
|
<i className='fa fa-times' />
|
||||||
</button>
|
</button>
|
||||||
}
|
}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<button styleName='control-newPostButton'
|
<button styleName='control-newPostButton'
|
||||||
onClick={(e) => this.handleNewPostButtonClick(e)}>
|
onClick={(e) => this.handleNewPostButtonClick(e)}>
|
||||||
<i className='fa fa-plus'/>
|
<i className='fa fa-plus' />
|
||||||
<span styleName='control-newPostButton-tooltip'>
|
<span styleName='control-newPostButton-tooltip'>
|
||||||
Make a Note {OSX ? '⌘' : '^'} + n
|
Make a Note {OSX ? '⌘' : '^'} + n
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export const DEFAULT_CONFIG = {
|
|||||||
listStyle: 'DEFAULT', // 'DEFAULT', 'SMALL'
|
listStyle: 'DEFAULT', // 'DEFAULT', 'SMALL'
|
||||||
hotkey: {
|
hotkey: {
|
||||||
toggleFinder: OSX ? 'Cmd + Alt + S' : 'Super + Alt + S',
|
toggleFinder: OSX ? 'Cmd + Alt + S' : 'Super + Alt + S',
|
||||||
toggleMain: OSX ? 'Cmd + Alt + L' : 'Super + Alt + E'
|
toggleMain: OSX ? 'Cmd + Alt + L' : 'Super + Alt + E',
|
||||||
},
|
},
|
||||||
ui: {
|
ui: {
|
||||||
theme: 'default',
|
theme: 'default',
|
||||||
@@ -25,6 +25,7 @@ export const DEFAULT_CONFIG = {
|
|||||||
},
|
},
|
||||||
editor: {
|
editor: {
|
||||||
theme: 'default',
|
theme: 'default',
|
||||||
|
keyMap: 'sublime',
|
||||||
fontSize: '14',
|
fontSize: '14',
|
||||||
fontFamily: 'Monaco, Consolas',
|
fontFamily: 'Monaco, Consolas',
|
||||||
indentType: 'space',
|
indentType: 'space',
|
||||||
@@ -34,7 +35,7 @@ export const DEFAULT_CONFIG = {
|
|||||||
preview: {
|
preview: {
|
||||||
fontSize: '14',
|
fontSize: '14',
|
||||||
fontFamily: 'Lato',
|
fontFamily: 'Lato',
|
||||||
codeBlockTheme: 'xcode',
|
codeBlockTheme: 'elegant',
|
||||||
lineNumber: true
|
lineNumber: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,10 +20,10 @@ class ModalBase extends React.Component {
|
|||||||
render () {
|
render () {
|
||||||
return (
|
return (
|
||||||
<div className={'ModalBase' + (this.state.isHidden ? ' hide' : '')}>
|
<div className={'ModalBase' + (this.state.isHidden ? ' hide' : '')}>
|
||||||
<div onClick={(e) => this.close(e)} className='modalBack'/>
|
<div onClick={(e) => this.close(e)} className='modalBack' />
|
||||||
{this.state.component == null ? null : (
|
{this.state.component == null ? null : (
|
||||||
<Provider store={store}>
|
<Provider store={store}>
|
||||||
<this.state.component {...this.state.componentProps} close={this.close}/>
|
<this.state.component {...this.state.componentProps} close={this.close} />
|
||||||
</Provider>
|
</Provider>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -33,7 +33,7 @@ class ModalBase extends React.Component {
|
|||||||
|
|
||||||
let el = document.createElement('div')
|
let el = document.createElement('div')
|
||||||
document.body.appendChild(el)
|
document.body.appendChild(el)
|
||||||
let modalBase = ReactDOM.render(<ModalBase/>, el)
|
let modalBase = ReactDOM.render(<ModalBase />, el)
|
||||||
|
|
||||||
export function openModal (component, props) {
|
export function openModal (component, props) {
|
||||||
if (modalBase == null) { return }
|
if (modalBase == null) { return }
|
||||||
|
|||||||
@@ -33,13 +33,13 @@ export default class DeleteArticleModal extends React.Component {
|
|||||||
render () {
|
render () {
|
||||||
return (
|
return (
|
||||||
<div className='DeleteArticleModal modal'>
|
<div className='DeleteArticleModal modal'>
|
||||||
<div className='title'><i className='fa fa-fw fa-trash'/> Delete an article.</div>
|
<div className='title'><i className='fa fa-fw fa-trash' /> Delete an article.</div>
|
||||||
|
|
||||||
<div className='message'>Do you really want to delete?</div>
|
<div className='message'>Do you really want to delete?</div>
|
||||||
|
|
||||||
<div className='control'>
|
<div className='control'>
|
||||||
<button ref='no' onClick={(e) => this.handleNoButtonClick(e)}><i className='fa fa-fw fa-close'/> No</button>
|
<button ref='no' onClick={(e) => this.handleNoButtonClick(e)}><i className='fa fa-fw fa-close' /> No</button>
|
||||||
<button ref='yes' onClick={(e) => this.handleYesButtonClick(e)} className='danger'><i className='fa fa-fw fa-check'/> Yes</button>
|
<button ref='yes' onClick={(e) => this.handleYesButtonClick(e)} className='danger'><i className='fa fa-fw fa-check' /> Yes</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
import React, { PropTypes } from 'react'
|
import React from 'react'
|
||||||
import CSSModules from 'browser/lib/CSSModules'
|
import CSSModules from 'browser/lib/CSSModules'
|
||||||
import styles from './InitModal.styl'
|
import styles from './InitModal.styl'
|
||||||
import dataApi from 'browser/main/lib/dataApi'
|
import dataApi from 'browser/main/lib/dataApi'
|
||||||
import store from 'browser/main/store'
|
import store from 'browser/main/store'
|
||||||
import { hashHistory } from 'react-router'
|
import { hashHistory } from 'react-router'
|
||||||
import _ from 'lodash'
|
import _ from 'lodash'
|
||||||
import keygen from 'browser/lib/keygen'
|
|
||||||
|
|
||||||
const CSON = require('@rokt33r/season')
|
const CSON = require('@rokt33r/season')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
@@ -197,7 +196,7 @@ class InitModal extends React.Component {
|
|||||||
render () {
|
render () {
|
||||||
if (this.state.isLoading) {
|
if (this.state.isLoading) {
|
||||||
return <div styleName='root--loading'>
|
return <div styleName='root--loading'>
|
||||||
<i styleName='spinner' className='fa fa-spin fa-spinner'/>
|
<i styleName='spinner' className='fa fa-spin fa-spinner' />
|
||||||
<div styleName='loadingMessage'>Preparing initialization...</div>
|
<div styleName='loadingMessage'>Preparing initialization...</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@@ -235,7 +234,7 @@ class InitModal extends React.Component {
|
|||||||
|
|
||||||
{this.state.legacyStorageExists &&
|
{this.state.legacyStorageExists &&
|
||||||
<div styleName='body-migration'>
|
<div styleName='body-migration'>
|
||||||
<label><input type='checkbox' checked={this.state.migrationRequested} onChange={(e) => this.handleMigrationRequestedChange(e)}/> Migrate old data from the legacy app v0.5</label>
|
<label><input type='checkbox' checked={this.state.migrationRequested} onChange={(e) => this.handleMigrationRequestedChange(e)} /> Migrate old data from the legacy app v0.5</label>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,7 +246,7 @@ class InitModal extends React.Component {
|
|||||||
>
|
>
|
||||||
{this.state.isSending
|
{this.state.isSending
|
||||||
? <span>
|
? <span>
|
||||||
<i className='fa fa-spin fa-spinner'/> Loading...
|
<i className='fa fa-spin fa-spinner' /> Loading...
|
||||||
</span>
|
</span>
|
||||||
: 'Let\'s Go!'
|
: 'Let\'s Go!'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,8 +28,6 @@
|
|||||||
right 10px
|
right 10px
|
||||||
height 30px
|
height 30px
|
||||||
padding 0 25px
|
padding 0 25px
|
||||||
border $ui-border
|
|
||||||
border-radius 2px
|
|
||||||
color $ui-text-color
|
color $ui-text-color
|
||||||
colorDefaultButton()
|
colorDefaultButton()
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { PropTypes } from 'react'
|
import React from 'react'
|
||||||
import CSSModules from 'browser/lib/CSSModules'
|
import CSSModules from 'browser/lib/CSSModules'
|
||||||
import styles from './NewNoteModal.styl'
|
import styles from './NewNoteModal.styl'
|
||||||
import dataApi from 'browser/main/lib/dataApi'
|
import dataApi from 'browser/main/lib/dataApi'
|
||||||
@@ -102,9 +102,10 @@ class NewNoteModal extends React.Component {
|
|||||||
<div styleName='header'>
|
<div styleName='header'>
|
||||||
<div styleName='title'>Make a Note</div>
|
<div styleName='title'>Make a Note</div>
|
||||||
</div>
|
</div>
|
||||||
<button styleName='closeButton'
|
<button styleName='closeButton' onClick={(e) => this.handleCloseButtonClick(e)}>
|
||||||
onClick={(e) => this.handleCloseButtonClick(e)}
|
<div styleName='close-mark'>X</div>
|
||||||
>Close</button>
|
<div styleName='close-text'>esc</div>
|
||||||
|
</button>
|
||||||
|
|
||||||
<div styleName='control'>
|
<div styleName='control'>
|
||||||
<button styleName='control-button'
|
<button styleName='control-button'
|
||||||
@@ -114,8 +115,8 @@ class NewNoteModal extends React.Component {
|
|||||||
>
|
>
|
||||||
<i styleName='control-button-icon'
|
<i styleName='control-button-icon'
|
||||||
className='fa fa-file-text-o'
|
className='fa fa-file-text-o'
|
||||||
/><br/>
|
/><br />
|
||||||
<span styleName='control-button-label'>Markdown Note</span><br/>
|
<span styleName='control-button-label'>Markdown Note</span><br />
|
||||||
<span styleName='control-button-description'>It is good for any type of documents. Check List, Code block and Latex block are available.</span>
|
<span styleName='control-button-description'>It is good for any type of documents. Check List, Code block and Latex block are available.</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
@@ -126,14 +127,14 @@ class NewNoteModal extends React.Component {
|
|||||||
>
|
>
|
||||||
<i styleName='control-button-icon'
|
<i styleName='control-button-icon'
|
||||||
className='fa fa-code'
|
className='fa fa-code'
|
||||||
/><br/>
|
/><br />
|
||||||
<span styleName='control-button-label'>Snippet Note</span><br/>
|
<span styleName='control-button-label'>Snippet Note</span><br />
|
||||||
<span styleName='control-button-description'>This format is specialized on managing snippets like Gist. Multiple snippets can be grouped as a note.
|
<span styleName='control-button-description'>This format is specialized on managing snippets like Gist. Multiple snippets can be grouped as a note.
|
||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div styleName='description'><i className='fa fa-arrows-h'/> Tab to switch format</div>
|
<div styleName='description'><i className='fa fa-arrows-h' /> Tab to switch format</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -14,20 +14,24 @@
|
|||||||
color $ui-text-color
|
color $ui-text-color
|
||||||
|
|
||||||
.closeButton
|
.closeButton
|
||||||
|
height 50px
|
||||||
position absolute
|
position absolute
|
||||||
top 10px
|
background-color transparent
|
||||||
|
color $ui-inactive-text-color
|
||||||
|
border none
|
||||||
|
top 1px
|
||||||
right 10px
|
right 10px
|
||||||
height 30px
|
text-align center
|
||||||
width 0 25px
|
width top-bar--height
|
||||||
border $ui-border
|
height top-bar--height
|
||||||
border-radius 2px
|
|
||||||
color $ui-text-color
|
|
||||||
colorDefaultButton()
|
|
||||||
|
|
||||||
.control
|
.control
|
||||||
padding 25px 15px 15px
|
padding 25px 15px 15px
|
||||||
text-align center
|
text-align center
|
||||||
|
|
||||||
|
.close-mark
|
||||||
|
font-size 15px
|
||||||
|
|
||||||
.control-button
|
.control-button
|
||||||
width 220px
|
width 220px
|
||||||
height 220px
|
height 220px
|
||||||
@@ -64,11 +68,6 @@ body[data-theme="dark"]
|
|||||||
border-color $ui-dark-borderColor
|
border-color $ui-dark-borderColor
|
||||||
color $ui-dark-text-color
|
color $ui-dark-text-color
|
||||||
|
|
||||||
.closeButton
|
|
||||||
border-color $ui-dark-borderColor
|
|
||||||
color $ui-dark-text-color
|
|
||||||
colorDarkDefaultButton()
|
|
||||||
|
|
||||||
.control-button
|
.control-button
|
||||||
border-color $ui-dark-borderColor
|
border-color $ui-dark-borderColor
|
||||||
color $ui-dark-text-color
|
color $ui-dark-text-color
|
||||||
|
|||||||
@@ -94,6 +94,10 @@
|
|||||||
p
|
p
|
||||||
line-height 1.2
|
line-height 1.2
|
||||||
|
|
||||||
|
.note-for-keymap
|
||||||
|
margin-left: 10px
|
||||||
|
font-size: 12px
|
||||||
|
|
||||||
colorDarkControl()
|
colorDarkControl()
|
||||||
border-color $ui-dark-borderColor
|
border-color $ui-dark-borderColor
|
||||||
background-color $ui-dark-backgroundColor
|
background-color $ui-dark-backgroundColor
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ import store from 'browser/main/store'
|
|||||||
const electron = require('electron')
|
const electron = require('electron')
|
||||||
const ipc = electron.ipcRenderer
|
const ipc = electron.ipcRenderer
|
||||||
|
|
||||||
const OSX = global.process.platform === 'darwin'
|
|
||||||
|
|
||||||
class HotkeyTab extends React.Component {
|
class HotkeyTab extends React.Component {
|
||||||
constructor (props) {
|
constructor (props) {
|
||||||
super(props)
|
super(props)
|
||||||
@@ -140,6 +138,7 @@ class HotkeyTab extends React.Component {
|
|||||||
<li><code>Escape</code> (or <code>Esc</code> for short)</li>
|
<li><code>Escape</code> (or <code>Esc</code> for short)</li>
|
||||||
<li><code>VolumeUp</code>, <code>VolumeDown</code> and <code>VolumeMute</code></li>
|
<li><code>VolumeUp</code>, <code>VolumeDown</code> and <code>VolumeMute</code></li>
|
||||||
<li><code>MediaNextTrack</code>, <code>MediaPreviousTrack</code>, <code>MediaStop</code> and <code>MediaPlayPause</code></li>
|
<li><code>MediaNextTrack</code>, <code>MediaPreviousTrack</code>, <code>MediaStop</code> and <code>MediaPlayPause</code></li>
|
||||||
|
<li><code>Control</code> (or <code>Ctrl</code> for short)</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@@ -150,7 +149,7 @@ class HotkeyTab extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
HotkeyTab.propTypes = {
|
HotkeyTab.propTypes = {
|
||||||
dispatch: PropTypes.func,
|
dispatch: PropTypes.func
|
||||||
}
|
}
|
||||||
|
|
||||||
export default CSSModules(HotkeyTab, styles)
|
export default CSSModules(HotkeyTab, styles)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { PropTypes } from 'react'
|
import React from 'react'
|
||||||
import CSSModules from 'browser/lib/CSSModules'
|
import CSSModules from 'browser/lib/CSSModules'
|
||||||
import styles from './InfoTab.styl'
|
import styles from './InfoTab.styl'
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ class InfoTab extends React.Component {
|
|||||||
|
|
||||||
<div styleName='top'>
|
<div styleName='top'>
|
||||||
<div styleName='icon-space'>
|
<div styleName='icon-space'>
|
||||||
<img styleName='icon' src='../resources/app.png' width='92' height='92'/>
|
<img styleName='icon' src='../resources/app.png' width='92' height='92' />
|
||||||
<div styleName='icon-right'>
|
<div styleName='icon-right'>
|
||||||
<div styleName='appId'>Boostnote {appVersion}</div>
|
<div styleName='appId'>Boostnote {appVersion}</div>
|
||||||
<div styleName='description'>
|
<div styleName='description'>
|
||||||
@@ -34,7 +34,7 @@ class InfoTab extends React.Component {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div styleName='clear'></div>
|
<div styleName='clear' />
|
||||||
<div styleName='madeBy'>Made by
|
<div styleName='madeBy'>Made by
|
||||||
<a href='http://maisin.co/'
|
<a href='http://maisin.co/'
|
||||||
onClick={(e) => this.handleLinkClick(e)}
|
onClick={(e) => this.handleLinkClick(e)}
|
||||||
|
|||||||
@@ -106,7 +106,10 @@ class UnstyledFolderItem extends React.Component {
|
|||||||
const popover = { position: 'absolute', zIndex: 2 }
|
const popover = { position: 'absolute', zIndex: 2 }
|
||||||
const cover = {
|
const cover = {
|
||||||
position: 'fixed',
|
position: 'fixed',
|
||||||
top: 0, right: 0, bottom: 0, left: 0
|
top: 0,
|
||||||
|
right: 0,
|
||||||
|
bottom: 0,
|
||||||
|
left: 0
|
||||||
}
|
}
|
||||||
const pickerStyle = Object.assign({}, {
|
const pickerStyle = Object.assign({}, {
|
||||||
position: 'absolute'
|
position: 'absolute'
|
||||||
@@ -137,7 +140,7 @@ class UnstyledFolderItem extends React.Component {
|
|||||||
</div>
|
</div>
|
||||||
: null
|
: null
|
||||||
}
|
}
|
||||||
<i className='fa fa-square'/>
|
<i className='fa fa-square' />
|
||||||
</button>
|
</button>
|
||||||
<input styleName='folderList-item-left-nameInput'
|
<input styleName='folderList-item-left-nameInput'
|
||||||
value={this.state.folder.name}
|
value={this.state.folder.name}
|
||||||
@@ -368,17 +371,17 @@ class StorageItem extends React.Component {
|
|||||||
: <div styleName='header-label'
|
: <div styleName='header-label'
|
||||||
onClick={(e) => this.handleLabelClick(e)}
|
onClick={(e) => this.handleLabelClick(e)}
|
||||||
>
|
>
|
||||||
<i className='fa fa-folder-open'/>
|
<i className='fa fa-folder-open' />
|
||||||
{storage.name}
|
{storage.name}
|
||||||
<span styleName='header-label-path'>({storage.path})</span>
|
<span styleName='header-label-path'>({storage.path})</span>
|
||||||
<i styleName='header-label-editButton' className='fa fa-pencil'/>
|
<i styleName='header-label-editButton' className='fa fa-pencil' />
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<div styleName='header-control'>
|
<div styleName='header-control'>
|
||||||
<button styleName='header-control-button'
|
<button styleName='header-control-button'
|
||||||
onClick={(e) => this.handleNewFolderButtonClick(e)}
|
onClick={(e) => this.handleNewFolderButtonClick(e)}
|
||||||
>
|
>
|
||||||
<i className='fa fa-plus'/>
|
<i className='fa fa-plus' />
|
||||||
<span styleName='header-control-button-tooltip'
|
<span styleName='header-control-button-tooltip'
|
||||||
style={{left: -20}}
|
style={{left: -20}}
|
||||||
>Add Folder</span>
|
>Add Folder</span>
|
||||||
@@ -386,7 +389,7 @@ class StorageItem extends React.Component {
|
|||||||
<button styleName='header-control-button'
|
<button styleName='header-control-button'
|
||||||
onClick={(e) => this.handleExternalButtonClick(e)}
|
onClick={(e) => this.handleExternalButtonClick(e)}
|
||||||
>
|
>
|
||||||
<i className='fa fa-external-link'/>
|
<i className='fa fa-external-link' />
|
||||||
<span styleName='header-control-button-tooltip'
|
<span styleName='header-control-button-tooltip'
|
||||||
style={{left: -50}}
|
style={{left: -50}}
|
||||||
>Open Storage folder</span>
|
>Open Storage folder</span>
|
||||||
@@ -394,7 +397,7 @@ class StorageItem extends React.Component {
|
|||||||
<button styleName='header-control-button'
|
<button styleName='header-control-button'
|
||||||
onClick={(e) => this.handleUnlinkButtonClick(e)}
|
onClick={(e) => this.handleUnlinkButtonClick(e)}
|
||||||
>
|
>
|
||||||
<i className='fa fa-unlink'/>
|
<i className='fa fa-unlink' />
|
||||||
<span styleName='header-control-button-tooltip'
|
<span styleName='header-control-button-tooltip'
|
||||||
style={{left: -10}}
|
style={{left: -10}}
|
||||||
>Unlink</span>
|
>Unlink</span>
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ class StoragesTab extends React.Component {
|
|||||||
<button styleName='list-control-addStorageButton'
|
<button styleName='list-control-addStorageButton'
|
||||||
onClick={(e) => this.handleAddStorageButton(e)}
|
onClick={(e) => this.handleAddStorageButton(e)}
|
||||||
>
|
>
|
||||||
<i className='fa fa-plus'/> Add Storage
|
<i className='fa fa-plus' /> Add Storage
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -5,9 +5,6 @@ import ConfigManager from 'browser/main/lib/ConfigManager'
|
|||||||
import store from 'browser/main/store'
|
import store from 'browser/main/store'
|
||||||
import consts from 'browser/lib/consts'
|
import consts from 'browser/lib/consts'
|
||||||
|
|
||||||
const electron = require('electron')
|
|
||||||
const ipc = electron.ipcRenderer
|
|
||||||
|
|
||||||
const OSX = global.process.platform === 'darwin'
|
const OSX = global.process.platform === 'darwin'
|
||||||
|
|
||||||
class UiTab extends React.Component {
|
class UiTab extends React.Component {
|
||||||
@@ -34,7 +31,8 @@ class UiTab extends React.Component {
|
|||||||
fontFamily: this.refs.editorFontFamily.value,
|
fontFamily: this.refs.editorFontFamily.value,
|
||||||
indentType: this.refs.editorIndentType.value,
|
indentType: this.refs.editorIndentType.value,
|
||||||
indentSize: this.refs.editorIndentSize.value,
|
indentSize: this.refs.editorIndentSize.value,
|
||||||
switchPreview: this.refs.editorSwitchPreview.value
|
switchPreview: this.refs.editorSwitchPreview.value,
|
||||||
|
keyMap: this.refs.editorKeyMap.value
|
||||||
}
|
}
|
||||||
config.preview = {
|
config.preview = {
|
||||||
fontSize: this.refs.previewFontSize.value,
|
fontSize: this.refs.previewFontSize.value,
|
||||||
@@ -181,6 +179,23 @@ class UiTab extends React.Component {
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div styleName='group-section'>
|
||||||
|
<div styleName='group-section-label'>
|
||||||
|
Editor Keymap
|
||||||
|
</div>
|
||||||
|
<div styleName='group-section-control'>
|
||||||
|
<select value={config.editor.keyMap}
|
||||||
|
ref='editorKeyMap'
|
||||||
|
onChange={(e) => this.handleUIChange(e)}
|
||||||
|
>
|
||||||
|
<option value='sublime'>default</option>
|
||||||
|
<option value='vim'>vim</option>
|
||||||
|
</select>
|
||||||
|
<span styleName='note-for-keymap'>Please reload boostnote after you change the keymap</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div styleName='group-header2'>Preview</div>
|
<div styleName='group-header2'>Preview</div>
|
||||||
<div styleName='group-section'>
|
<div styleName='group-section'>
|
||||||
<div styleName='group-section-label'>
|
<div styleName='group-section-label'>
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ class Preferences extends React.Component {
|
|||||||
|
|
||||||
switch (this.state.currentTab) {
|
switch (this.state.currentTab) {
|
||||||
case 'INFO':
|
case 'INFO':
|
||||||
return <InfoTab/>
|
return <InfoTab />
|
||||||
case 'HOTKEY':
|
case 'HOTKEY':
|
||||||
return (
|
return (
|
||||||
<HotkeyTab
|
<HotkeyTab
|
||||||
@@ -86,9 +86,9 @@ class Preferences extends React.Component {
|
|||||||
|
|
||||||
let tabs = [
|
let tabs = [
|
||||||
{target: 'STORAGES', label: 'Storages'},
|
{target: 'STORAGES', label: 'Storages'},
|
||||||
{target: 'HOTKEY', label: 'Hotkey'},
|
{target: 'HOTKEY', label: 'Hotkey'},
|
||||||
{target: 'UI', label: 'UI'},
|
{target: 'UI', label: 'UI'},
|
||||||
{target: 'INFO', label: 'Info'}
|
{target: 'INFO', label: 'Info'}
|
||||||
]
|
]
|
||||||
|
|
||||||
let navButtons = tabs.map((tab) => {
|
let navButtons = tabs.map((tab) => {
|
||||||
|
|||||||
@@ -75,3 +75,4 @@ body[data-theme="dark"]
|
|||||||
|
|
||||||
.control-input
|
.control-input
|
||||||
border-color $ui-dark-borderColor
|
border-color $ui-dark-borderColor
|
||||||
|
color $ui-dark-text-color
|
||||||
|
|||||||
@@ -1,23 +1,21 @@
|
|||||||
# Contributing to Boostnote
|
# Contributing to Boostnote
|
||||||
|
|
||||||
> English below.
|
|
||||||
|
|
||||||
## Pull requestの著作権について
|
|
||||||
|
|
||||||
Pull requestをすることはその変化分のコードの著作権をMAISIN&CO.に譲渡することに同意することになります。
|
|
||||||
|
|
||||||
アプリケーションのLicenseのをいつでも変える選択肢を残したいからです。
|
|
||||||
しかし、これはいずれかBoostnoteが有料の商用アプリになる可能性がある話ではありません。
|
|
||||||
もし、このアプリケーションで金を稼ごうとするならBoostnote専用のCloud storageの提供やMobile appとの連動、何か特殊なプレミアム機能の提供など形になると思います。
|
|
||||||
現在考えられているのは、GPL v3の場合、他のライセンスとの互換が不可能であるため、もしより自由なLicense(BSD, MIT)に変える時に改めて著作権者としてライセンスし直す選択肢を残したいぐらいのイメージです。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# Contributing to Boostnote(ENG)
|
|
||||||
|
|
||||||
## About copyright of Pull Request
|
## About copyright of Pull Request
|
||||||
|
|
||||||
If you make a pull request, It means you agree to transfer the copyright of the code changes to MAISIN&CO.
|
If you make a pull request, It means you agree to transfer the copyright of the code changes to MAISIN&CO.
|
||||||
|
|
||||||
It doesn't mean Boostnote will become a paid app. If we want to earn some money, We will try other way, which is some kind of cloud storage, Mobile app integration or some SPECIAL features.
|
It doesn't mean Boostnote will become a paid app. If we want to earn some money, We will try other way, which is some kind of cloud storage, Mobile app integration or some SPECIAL features.
|
||||||
Because GPL v3 is too strict to be compatible with any other License, We thought this is needed to replace the license with much freer one(like BSD, MIT) somewhen.
|
Because GPL v3 is too strict to be compatible with any other License, We thought this is needed to replace the license with much freer one(like BSD, MIT) somewhen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Contributing to Boostnote(Japanese)
|
||||||
|
|
||||||
|
## Pull requestの著作権について
|
||||||
|
|
||||||
|
Pull requestをすることはその変化分のコードの著作権をMAISIN&CO.に譲渡することに同意することになります。
|
||||||
|
|
||||||
|
アプリケーションのLicenseをいつでも変える選択肢を残したいと思うからです。
|
||||||
|
これはいずれかBoostnoteが有料の商用アプリになる可能性がある話ではありません。
|
||||||
|
もし、このアプリケーションに料金が発生する時は、Boostnote専用のCloud storageの提供やMobile appとの連動、何か特殊なプレミアム機能の提供など形になります。
|
||||||
|
現在考えられているのは、GPL v3の場合、他のライセンスとの互換が不可能であるため、もしより自由なLicense(BSD, MIT)に変える時に改めて著作権者としてライセンスし直す選択肢を残すイメージです。
|
||||||
|
|||||||
@@ -29,11 +29,6 @@ $ npm run hot
|
|||||||
```
|
```
|
||||||
> Actually the app can be start with `npm start`. However, the app will use the compiled script.
|
> Actually the app can be start with `npm start`. However, the app will use the compiled script.
|
||||||
|
|
||||||
If the app gets stuck on load, you may need to run the following.
|
|
||||||
```
|
|
||||||
$ npm run vendor
|
|
||||||
```
|
|
||||||
|
|
||||||
By this, webpack will watch the code changes and apply it automatically.
|
By this, webpack will watch the code changes and apply it automatically.
|
||||||
|
|
||||||
> ### Notice
|
> ### Notice
|
||||||
|
|||||||
10
gruntfile.js
10
gruntfile.js
@@ -5,16 +5,16 @@ const packager = require('electron-packager')
|
|||||||
const WIN = process.platform === 'win32'
|
const WIN = process.platform === 'win32'
|
||||||
|
|
||||||
module.exports = function (grunt) {
|
module.exports = function (grunt) {
|
||||||
var auth_code
|
var authCode
|
||||||
try {
|
try {
|
||||||
auth_code = grunt.file.readJSON('secret/auth_code.json')
|
authCode = grunt.file.readJSON('secret/auth_code.json')
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e.origError.code === 'ENOENT') {
|
if (e.origError.code === 'ENOENT') {
|
||||||
console.warn('secret/auth_code.json is not found. CodeSigning is not available.')
|
console.warn('secret/auth_code.json is not found. CodeSigning is not available.')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const OSX_COMMON_NAME = auth_code != null ? auth_code.OSX_COMMON_NAME : ''
|
const OSX_COMMON_NAME = authCode != null ? authCode.OSX_COMMON_NAME : ''
|
||||||
const WIN_CERT_PASSWORD = auth_code != null ? auth_code.WIN_CERT_PASSWORD : ''
|
const WIN_CERT_PASSWORD = authCode != null ? authCode.WIN_CERT_PASSWORD : ''
|
||||||
|
|
||||||
var initConfig = {
|
var initConfig = {
|
||||||
pkg: grunt.file.readJSON('package.json'),
|
pkg: grunt.file.readJSON('package.json'),
|
||||||
@@ -98,7 +98,7 @@ module.exports = function (grunt) {
|
|||||||
prune: true,
|
prune: true,
|
||||||
overwrite: true,
|
overwrite: true,
|
||||||
out: path.join(__dirname, 'dist'),
|
out: path.join(__dirname, 'dist'),
|
||||||
ignore: /node_modules\/ace-builds\/(?!src-min)|node_modules\/ace-builds\/(?=src-min-noconflict)|node_modules\/devicon\/icons|dist|^\/browser|^\/secret|\.babelrc|\.gitignore|^\/\.gitmodules|^\/gruntfile|^\/readme.md|^\/webpack|^\/appdmg\.json|^\/node_modules\/grunt/
|
ignore: /node_modules\/ace-builds\/(?!src-min)|node_modules\/ace-builds\/(?=src-min-noconflict)|node_modules\/devicon\/icons|^\/browser|^\/secret|\.babelrc|\.gitignore|^\/\.gitmodules|^\/gruntfile|^\/readme.md|^\/webpack|^\/appdmg\.json|^\/node_modules\/grunt/
|
||||||
}
|
}
|
||||||
switch (platform) {
|
switch (platform) {
|
||||||
case 'win':
|
case 'win':
|
||||||
|
|||||||
@@ -1,19 +1,14 @@
|
|||||||
const electron = require('electron')
|
const electron = require('electron')
|
||||||
const app = electron.app
|
const app = electron.app
|
||||||
const Menu = electron.Menu
|
|
||||||
|
|
||||||
var finderWindow = null
|
|
||||||
|
|
||||||
app.on('ready', function () {
|
app.on('ready', function () {
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
app.dock.hide()
|
app.dock.hide()
|
||||||
}
|
}
|
||||||
|
|
||||||
// var template = require('./finder-menu')
|
/* eslint-disable */
|
||||||
// var menu = Menu.buildFromTemplate(template)
|
|
||||||
// Menu.setApplicationMenu(menu)
|
|
||||||
|
|
||||||
finderWindow = require('./finder-window')
|
finderWindow = require('./finder-window')
|
||||||
|
/* eslint-enable */
|
||||||
})
|
})
|
||||||
|
|
||||||
module.exports = app
|
module.exports = app
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
const electron = require('electron')
|
const electron = require('electron')
|
||||||
const { app } = electron
|
const { app } = electron
|
||||||
const { systemPreferences } = electron
|
|
||||||
const BrowserWindow = electron.BrowserWindow
|
const BrowserWindow = electron.BrowserWindow
|
||||||
const Menu = electron.Menu
|
const Menu = electron.Menu
|
||||||
const MenuItem = electron.MenuItem
|
const MenuItem = electron.MenuItem
|
||||||
@@ -45,13 +44,9 @@ finderWindow.on('close', function (e) {
|
|||||||
finderWindow.hide()
|
finderWindow.hide()
|
||||||
})
|
})
|
||||||
|
|
||||||
var trayIcon = process.platform === 'darwin'
|
var trayIcon = process.platform === 'darwin' || process.platform === 'win32'
|
||||||
? !systemPreferences.isDarkMode()
|
? path.join(__dirname, '../resources/tray-icon-default.png')
|
||||||
? path.join(__dirname, '../resources/tray-icon-default.png')
|
: path.join(__dirname, '../resources/tray-icon.png')
|
||||||
: path.join(__dirname, '../resources/tray-icon-dark.png')
|
|
||||||
: process.platform === 'win32'
|
|
||||||
? path.join(__dirname, '../resources/tray-icon-dark.png')
|
|
||||||
: path.join(__dirname, '../resources/tray-icon.png')
|
|
||||||
var appIcon = new Tray(trayIcon)
|
var appIcon = new Tray(trayIcon)
|
||||||
appIcon.setToolTip('Boostnote')
|
appIcon.setToolTip('Boostnote')
|
||||||
if (process.platform === 'darwin') {
|
if (process.platform === 'darwin') {
|
||||||
|
|||||||
@@ -31,16 +31,17 @@
|
|||||||
<script src="../node_modules/codemirror/addon/mode/overlay.js"></script>
|
<script src="../node_modules/codemirror/addon/mode/overlay.js"></script>
|
||||||
<script src="../node_modules/codemirror/addon/mode/loadmode.js"></script>
|
<script src="../node_modules/codemirror/addon/mode/loadmode.js"></script>
|
||||||
<script src="../node_modules/codemirror/keymap/sublime.js"></script>
|
<script src="../node_modules/codemirror/keymap/sublime.js"></script>
|
||||||
|
<script src="../node_modules/codemirror/keymap/vim.js"></script>
|
||||||
<script src="../node_modules/codemirror/addon/runmode/runmode.js"></script>
|
<script src="../node_modules/codemirror/addon/runmode/runmode.js"></script>
|
||||||
|
|
||||||
<script src="../compiled/raphael.js"></script>
|
<script src="../node_modules/raphael/raphael.min.js"></script>
|
||||||
<script src="../compiled/flowchart.js"></script>
|
<script src="../node_modules/flowchart.js/release/flowchart.min.js"></script>
|
||||||
|
|
||||||
<script src="../compiled/katex.js"></script>
|
<script src="../node_modules/katex/dist/katex.min.js"></script>
|
||||||
<script src="../compiled/react.js"></script>
|
<script src="../node_modules/react/dist/react.min.js"></script>
|
||||||
<script src="../compiled/react-dom.js"></script>
|
<script src="../node_modules/react-dom/dist/react-dom.min.js"></script>
|
||||||
<script src="../compiled/redux.js"></script>
|
<script src="../node_modules/redux/dist/redux.min.js"></script>
|
||||||
<script src="../compiled/react-redux.js"></script>
|
<script src="../node_modules/react-redux/dist/react-redux.min.js"></script>
|
||||||
<script>
|
<script>
|
||||||
window._ = require('lodash');
|
window._ = require('lodash');
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ const electron = require('electron')
|
|||||||
const app = electron.app
|
const app = electron.app
|
||||||
const Menu = electron.Menu
|
const Menu = electron.Menu
|
||||||
const ipc = electron.ipcMain
|
const ipc = electron.ipcMain
|
||||||
const autoUpdater = electron.autoUpdater
|
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const ChildProcess = require('child_process')
|
const ChildProcess = require('child_process')
|
||||||
const _ = require('lodash')
|
const _ = require('lodash')
|
||||||
@@ -11,9 +10,8 @@ const GhReleases = require('electron-gh-releases')
|
|||||||
var ipcServer = null
|
var ipcServer = null
|
||||||
|
|
||||||
var mainWindow = null
|
var mainWindow = null
|
||||||
var finderWindow = null
|
|
||||||
|
|
||||||
var shouldQuit = app.makeSingleInstance(function(commandLine, workingDirectory) {
|
var shouldQuit = app.makeSingleInstance(function (commandLine, workingDirectory) {
|
||||||
if (mainWindow) {
|
if (mainWindow) {
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32') {
|
||||||
mainWindow.minimize()
|
mainWindow.minimize()
|
||||||
@@ -26,12 +24,8 @@ var shouldQuit = app.makeSingleInstance(function(commandLine, workingDirectory)
|
|||||||
|
|
||||||
if (shouldQuit) {
|
if (shouldQuit) {
|
||||||
app.quit()
|
app.quit()
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var version = app.getVersion()
|
|
||||||
var versionText = (version == null || version.length === 0) ? 'DEV version' : 'v' + version
|
|
||||||
|
|
||||||
var isUpdateReady = false
|
var isUpdateReady = false
|
||||||
|
|
||||||
var ghReleasesOpts = {
|
var ghReleasesOpts = {
|
||||||
@@ -108,14 +102,12 @@ app.on('ready', function () {
|
|||||||
Menu.setApplicationMenu(menu)
|
Menu.setApplicationMenu(menu)
|
||||||
break
|
break
|
||||||
case 'win32':
|
case 'win32':
|
||||||
|
/* eslint-disable */
|
||||||
finderWindow = require('./finder-window')
|
finderWindow = require('./finder-window')
|
||||||
|
/* eslint-disable */
|
||||||
mainWindow.setMenu(menu)
|
mainWindow.setMenu(menu)
|
||||||
break
|
break
|
||||||
case 'linux':
|
case 'linux':
|
||||||
// Finder is available on cinnamon only.
|
|
||||||
if (process.env.DESKTOP_SESSION === 'cinnamon') {
|
|
||||||
finderWindow = require('./finder-window')
|
|
||||||
}
|
|
||||||
Menu.setApplicationMenu(menu)
|
Menu.setApplicationMenu(menu)
|
||||||
mainWindow.setMenu(menu)
|
mainWindow.setMenu(menu)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,6 +59,35 @@ var file = {
|
|||||||
mainWindow.webContents.send('top:new-note')
|
mainWindow.webContents.send('top:new-note')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Focus Note',
|
||||||
|
accelerator: 'Control + E',
|
||||||
|
click () {
|
||||||
|
mainWindow.webContents.send('detail:focus')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'separator'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Export as',
|
||||||
|
submenu: [
|
||||||
|
{
|
||||||
|
label: 'Plain Text (.txt)',
|
||||||
|
click () {
|
||||||
|
mainWindow.webContents.send('list:isMarkdownNote')
|
||||||
|
mainWindow.webContents.send('export:save-text')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'MarkDown (.md)',
|
||||||
|
click () {
|
||||||
|
mainWindow.webContents.send('list:isMarkdownNote')
|
||||||
|
mainWindow.webContents.send('export:save-md')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: 'separator'
|
type: 'separator'
|
||||||
},
|
},
|
||||||
@@ -136,6 +165,33 @@ var view = {
|
|||||||
click: function () {
|
click: function () {
|
||||||
BrowserWindow.getFocusedWindow().toggleDevTools()
|
BrowserWindow.getFocusedWindow().toggleDevTools()
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'separator'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Next Note',
|
||||||
|
accelerator: 'Control + J',
|
||||||
|
click () {
|
||||||
|
mainWindow.webContents.send('list:next')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Previous Note',
|
||||||
|
accelerator: 'Control + U',
|
||||||
|
click () {
|
||||||
|
mainWindow.webContents.send('list:prior')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'separator'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Focus Search',
|
||||||
|
accelerator: 'Control + S',
|
||||||
|
click () {
|
||||||
|
mainWindow.webContents.send('top:focus-search')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -169,7 +225,7 @@ var help = {
|
|||||||
submenu: [
|
submenu: [
|
||||||
{
|
{
|
||||||
label: 'Boostnote official site',
|
label: 'Boostnote official site',
|
||||||
click: function () { shell.openExternal('https://b00st.io/') }
|
click: function () { shell.openExternal('https://boostnote.io/') }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Issue Tracker',
|
label: 'Issue Tracker',
|
||||||
|
|||||||
@@ -2,12 +2,15 @@ const electron = require('electron')
|
|||||||
const app = electron.app
|
const app = electron.app
|
||||||
const BrowserWindow = electron.BrowserWindow
|
const BrowserWindow = electron.BrowserWindow
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
|
const Config = require('electron-config')
|
||||||
|
const config = new Config()
|
||||||
|
|
||||||
var showMenu = process.platform !== 'win32'
|
var showMenu = process.platform !== 'win32'
|
||||||
|
let windowSize = config.get('windowsize') || { width: 1080, height: 720 }
|
||||||
|
|
||||||
var mainWindow = new BrowserWindow({
|
let mainWindow = new BrowserWindow({
|
||||||
width: 1080,
|
width: windowSize.width,
|
||||||
height: 720,
|
height: windowSize.height,
|
||||||
minWidth: 500,
|
minWidth: 500,
|
||||||
minHeight: 320,
|
minHeight: 320,
|
||||||
autoHideMenuBar: showMenu,
|
autoHideMenuBar: showMenu,
|
||||||
@@ -46,6 +49,12 @@ if (process.platform !== 'linux' || process.env.DESKTOP_SESSION === 'cinnamon')
|
|||||||
})
|
})
|
||||||
|
|
||||||
app.on('before-quit', function (e) {
|
app.on('before-quit', function (e) {
|
||||||
|
try {
|
||||||
|
config.set('windowsize', mainWindow.getBounds())
|
||||||
|
} catch (e) {
|
||||||
|
// ignore any errors because an error occurs only on update
|
||||||
|
// refs: https://github.com/BoostIO/Boostnote/issues/243
|
||||||
|
}
|
||||||
mainWindow.removeAllListeners()
|
mainWindow.removeAllListeners()
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -57,22 +57,23 @@
|
|||||||
<script src="../node_modules/codemirror/addon/mode/overlay.js"></script>
|
<script src="../node_modules/codemirror/addon/mode/overlay.js"></script>
|
||||||
<script src="../node_modules/codemirror/addon/mode/loadmode.js"></script>
|
<script src="../node_modules/codemirror/addon/mode/loadmode.js"></script>
|
||||||
<script src="../node_modules/codemirror/keymap/sublime.js"></script>
|
<script src="../node_modules/codemirror/keymap/sublime.js"></script>
|
||||||
|
<script src="../node_modules/codemirror/keymap/vim.js"></script>
|
||||||
<script src="../node_modules/codemirror/addon/runmode/runmode.js"></script>
|
<script src="../node_modules/codemirror/addon/runmode/runmode.js"></script>
|
||||||
|
|
||||||
<script src="../node_modules/codemirror/addon/edit/continuelist.js"></script>
|
<script src="../node_modules/codemirror/addon/edit/continuelist.js"></script>
|
||||||
|
|
||||||
<script src="../compiled/raphael.js"></script>
|
<script src="../node_modules/raphael/raphael.min.js"></script>
|
||||||
<script src="../compiled/flowchart.js"></script>
|
<script src="../node_modules/flowchart.js/release/flowchart.min.js"></script>
|
||||||
<script>
|
<script>
|
||||||
window._ = require('lodash')
|
window._ = require('lodash')
|
||||||
</script>
|
</script>
|
||||||
<script src="../node_modules/js-sequence-diagrams/fucknpm/sequence-diagram-min.js"></script>
|
|
||||||
|
|
||||||
<script src="../compiled/katex.js"></script>
|
<script src="../node_modules/js-sequence-diagrams/fucknpm/sequence-diagram-min.js"></script>
|
||||||
<script src="../compiled/react.js"></script>
|
<script src="../node_modules/katex/dist/katex.min.js"></script>
|
||||||
<script src="../compiled/react-dom.js"></script>
|
<script src="../node_modules/react/dist/react.min.js"></script>
|
||||||
<script src="../compiled/redux.js"></script>
|
<script src="../node_modules/react-dom/dist/react-dom.min.js"></script>
|
||||||
<script src="../compiled/react-redux.js"></script>
|
<script src="../node_modules/redux/dist/redux.min.js"></script>
|
||||||
|
<script src="../node_modules/react-redux/dist/react-redux.min.js"></script>
|
||||||
<script type='text/javascript'>
|
<script type='text/javascript'>
|
||||||
const electron = require('electron')
|
const electron = require('electron')
|
||||||
electron.webFrame.setZoomLevelLimits(1, 1)
|
electron.webFrame.setZoomLevelLimits(1, 1)
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"directory": "compiled",
|
|
||||||
"targets": {
|
|
||||||
"react": "https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react.js",
|
|
||||||
"react-dom": "https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react-dom.js",
|
|
||||||
"redux": "https://cdnjs.cloudflare.com/ajax/libs/redux/3.5.2/redux.js",
|
|
||||||
"react-redux": "https://unpkg.com/react-redux@4.4.5/dist/react-redux.min.js",
|
|
||||||
"katex": "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.6.0/katex.min.js",
|
|
||||||
"katex-style": "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.6.0/katex.min.css",
|
|
||||||
"raphael": "https://raw.githubusercontent.com/DmitryBaranovskiy/raphael/master/raphael.js",
|
|
||||||
"flowchart": "https://cdnjs.cloudflare.com/ajax/libs/flowchart/1.6.3/flowchart.js"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
29
package.json
29
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "boost",
|
"name": "boost",
|
||||||
"version": "0.8.0",
|
"version": "0.8.6",
|
||||||
"description": "Boostnote",
|
"description": "Boostnote",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
@@ -8,10 +8,10 @@
|
|||||||
"start": "electron ./index.js",
|
"start": "electron ./index.js",
|
||||||
"hot": "electron ./index.js --hot",
|
"hot": "electron ./index.js --hot",
|
||||||
"webpack": "webpack-dev-server --hot --inline --config webpack.config.js",
|
"webpack": "webpack-dev-server --hot --inline --config webpack.config.js",
|
||||||
"postinstall": "npm run vendor",
|
|
||||||
"vendor": "oh-my-cdn",
|
|
||||||
"compile": "grunt compile",
|
"compile": "grunt compile",
|
||||||
"test": "PWD=$(pwd) NODE_ENV=test ava"
|
"test": "PWD=$(pwd) NODE_ENV=test ava",
|
||||||
|
"fix": "npm run lint --fix",
|
||||||
|
"lint": "eslint ./**/*.js"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"electron-version": "1.2.8"
|
"electron-version": "1.2.8"
|
||||||
@@ -44,15 +44,18 @@
|
|||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/BoostIO/Boostnote/issues"
|
"url": "https://github.com/BoostIO/Boostnote/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://b00st.io",
|
"homepage": "https://boostnote.io",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@rokt33r/markdown-it-math": "^4.0.1",
|
"@rokt33r/markdown-it-math": "^4.0.1",
|
||||||
"@rokt33r/season": "^5.3.0",
|
"@rokt33r/season": "^5.3.0",
|
||||||
"codemirror": "^5.19.0",
|
"codemirror": "^5.19.0",
|
||||||
|
"electron-config": "^0.2.1",
|
||||||
"electron-gh-releases": "^2.0.2",
|
"electron-gh-releases": "^2.0.2",
|
||||||
|
"flowchart.js": "^1.6.5",
|
||||||
"font-awesome": "^4.3.0",
|
"font-awesome": "^4.3.0",
|
||||||
"immutable": "^3.8.1",
|
"immutable": "^3.8.1",
|
||||||
"js-sequence-diagrams": "^1000000.0.6",
|
"js-sequence-diagrams": "^1000000.0.6",
|
||||||
|
"katex": "^0.6.0",
|
||||||
"lodash": "^4.11.1",
|
"lodash": "^4.11.1",
|
||||||
"markdown-it": "^6.0.1",
|
"markdown-it": "^6.0.1",
|
||||||
"markdown-it-checkbox": "^1.1.0",
|
"markdown-it-checkbox": "^1.1.0",
|
||||||
@@ -62,6 +65,11 @@
|
|||||||
"mixpanel": "^0.4.1",
|
"mixpanel": "^0.4.1",
|
||||||
"moment": "^2.10.3",
|
"moment": "^2.10.3",
|
||||||
"node-ipc": "^8.1.0",
|
"node-ipc": "^8.1.0",
|
||||||
|
"raphael": "^2.2.7",
|
||||||
|
"react": "^15.0.2",
|
||||||
|
"react-dom": "^15.0.2",
|
||||||
|
"react-redux": "^4.4.5",
|
||||||
|
"redux": "^3.5.2",
|
||||||
"sander": "^0.5.1",
|
"sander": "^0.5.1",
|
||||||
"superagent": "^1.2.0",
|
"superagent": "^1.2.0",
|
||||||
"superagent-promise": "^1.0.3"
|
"superagent-promise": "^1.0.3"
|
||||||
@@ -81,6 +89,9 @@
|
|||||||
"dom-storage": "^2.0.2",
|
"dom-storage": "^2.0.2",
|
||||||
"electron-packager": "^6.0.0",
|
"electron-packager": "^6.0.0",
|
||||||
"electron-prebuilt": "^1.2.8",
|
"electron-prebuilt": "^1.2.8",
|
||||||
|
"eslint": "^3.13.1",
|
||||||
|
"eslint-config-standard": "^6.2.1",
|
||||||
|
"eslint-config-standard-jsx": "^3.2.0",
|
||||||
"faker": "^3.1.0",
|
"faker": "^3.1.0",
|
||||||
"grunt": "^0.4.5",
|
"grunt": "^0.4.5",
|
||||||
"grunt-electron-installer": "^1.2.0",
|
"grunt-electron-installer": "^1.2.0",
|
||||||
@@ -88,7 +99,6 @@
|
|||||||
"jsdom": "^9.4.2",
|
"jsdom": "^9.4.2",
|
||||||
"merge-stream": "^1.0.0",
|
"merge-stream": "^1.0.0",
|
||||||
"nib": "^1.1.0",
|
"nib": "^1.1.0",
|
||||||
"oh-my-cdn": "^0.1.1",
|
|
||||||
"react": "^15.3.0",
|
"react": "^15.3.0",
|
||||||
"react-color": "^2.2.2",
|
"react-color": "^2.2.2",
|
||||||
"react-css-modules": "^3.7.6",
|
"react-css-modules": "^3.7.6",
|
||||||
@@ -107,14 +117,9 @@
|
|||||||
"grunt-electron-installer-debian": "^0.2.0"
|
"grunt-electron-installer-debian": "^0.2.0"
|
||||||
},
|
},
|
||||||
"optional": false,
|
"optional": false,
|
||||||
"standard": {
|
|
||||||
"globals": [
|
|
||||||
"localStorage"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"ava": {
|
"ava": {
|
||||||
"files": [
|
"files": [
|
||||||
"tests/**/*.js"
|
"tests/**/*-test.js"
|
||||||
],
|
],
|
||||||
"require": [
|
"require": [
|
||||||
"babel-register"
|
"babel-register"
|
||||||
|
|||||||
97
readme-ja.md
97
readme-ja.md
@@ -1,84 +1,37 @@
|
|||||||
# Boostnote
|
<h1 align="center">
|
||||||
|
<a href="https://github.com/BoostIO/Boostnote"><img src="./resources/app.png" alt="Boostnote" width="180"></a>
|
||||||
> [Boostnote store](https://boostnote.paintory.com/)をはじめました!! :tada: そして、[Pateron](https://www.patreon.com/boostnote)からも私達を支援することができます!
|
<br>
|
||||||
|
Boostnote
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
</h1>
|
||||||
|
<h4 align="center">クールなプログラマーの為の、オープンソースのノートアプリ </h4>
|
||||||
|
<h5 align="center">macOS, Windows, Linuxで利用できます。</h5>
|
||||||
|
<h5 align="center">Built with Electron, React + Redux, Webpack and CSSModules</h5>
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
オープンソースノートアプリ
|
[](https://travis-ci.org/BoostIO/Boostnote)
|
||||||
|
|
||||||
次の用務がある場合にはIssue trackerを利用してください。
|
|
||||||
- Boostnoteに関して質問したい時
|
|
||||||
- Boostnoteや計画事項にフィードバックがしたい時
|
|
||||||
- Boostnoteにバグを報告したい時
|
|
||||||
- Boostnoteに寄与したい時
|
|
||||||
|
|
||||||
## Goal
|
|
||||||
|
|
||||||
単に何かを書くのが楽しくなってほしいです。 :grinning:
|
|
||||||
|
|
||||||
- ターゲット OS : OSX, Windows, Linux(後々はモバイルも!)
|
|
||||||
- Cloud : Google drive, Dropbox, One drive, iCloud...
|
|
||||||
- オープンソースで残ること!
|
|
||||||
|
|
||||||
## 印象を受けたアプリ/サービス
|
|
||||||
|
|
||||||
- Atom
|
|
||||||
- Quiver
|
|
||||||
- Evernote
|
|
||||||
- GitKraken
|
|
||||||
- GitBook
|
|
||||||
- Gist
|
|
||||||
- Gistbox
|
|
||||||
- Snippets Lab
|
|
||||||
|
|
||||||
|
|
||||||
## Using stack
|
|
||||||
|
|
||||||
- Electron
|
|
||||||
- React
|
|
||||||
- Webpack
|
|
||||||
- Redux
|
|
||||||
- CSSModules
|
|
||||||
|
|
||||||
## Codestyle
|
|
||||||
|
|
||||||
[](https://github.com/feross/standard)
|
|
||||||
|
|
||||||
## Development
|
|
||||||
|
|
||||||
- [Build](docs/build.md)
|
|
||||||
|
|
||||||
## Goods
|
|
||||||
|
|
||||||
<img src="https://b00st.io/images/t3.png" width="250"/>
|
|
||||||
<img src="https://b00st.io/images/t1.png" width="250"/>
|
|
||||||
|
|
||||||
[Boostnote store](https://boostnote.paintory.com/)から幾つかのグッズを販売しています。
|
|
||||||
|
|
||||||
商品は全世界何処でも届けることができます。このストアは[Paintory](https://paintory.com/)から提供されます。
|
|
||||||
|
|
||||||
## Donation
|
|
||||||
|
|
||||||
寄付は[Pateron page](https://www.patreon.com/boostnote)からできます。
|
|
||||||
|
|
||||||
## Author & Maintainer
|
## Author & Maintainer
|
||||||
|
- [Rokt33r](https://github.com/rokt33r)
|
||||||
[Rokt33r(Dick Choi of MAISIN&CO.)](https://github.com/rokt33r)
|
- [sota1235](https://github.com/sota1235)
|
||||||
|
- [Kohei TAKATA](https://github.com/kohei-takata)
|
||||||
|
- [asmsuechan](https://github.com/asmsuechan)
|
||||||
|
- [Kazu Yokomizo](https://github.com/kazup01)
|
||||||
|
|
||||||
## Contributors
|
## Contributors
|
||||||
|
[Great contributors](https://github.com/BoostIO/Boostnote/graphs/contributors) :tada:
|
||||||
|
|
||||||
- [Kazu Yokomizo](https://github.com/kazup01)
|
|
||||||
- [dojineko](https://github.com/dojineko)
|
|
||||||
- [Romain Bazile](https://github.com/gromain)
|
|
||||||
- [Bruno Paz](https://github.com/brpaz)
|
|
||||||
- [Fabian Mueller](https://github.com/dotcs)
|
|
||||||
- [Yoshihisa Mochihara](https://github.com/yosmoc)
|
|
||||||
- [Mike Resoli](https://github.com/mikeres0)
|
|
||||||
- [tjado](https://github.com/tejado)
|
|
||||||
- [sota1235](https://github.com/sota1235)
|
|
||||||
|
|
||||||
## Copyright & License
|
## More Information
|
||||||
|
* Website: http://boostnote.io/
|
||||||
|
* Roadmap(upcoming features and bug fixes): https://github.com/BoostIO/Boostnote/wiki/List-of-the-requested-features
|
||||||
|
* Boostnote Shop(Products are shipped to all over the world :+1:): https://boostnote.paintory.com/
|
||||||
|
* Donation: [Patreon](https://www.patreon.com/boostnote)
|
||||||
|
* Development: https://github.com/BoostIO/Boostnote/blob/master/docs/build.md
|
||||||
|
* Copyright (C) 2017 Maisin&Co.
|
||||||
|
|
||||||
Copyright (C) 2016 MAISIN&CO.
|
## License
|
||||||
|
|
||||||
[GPL v3](./LICENSE).
|
[GPL v3](./LICENSE).
|
||||||
|
|||||||
85
readme-ko.md
85
readme-ko.md
@@ -1,85 +0,0 @@
|
|||||||
# Boostnote
|
|
||||||
|
|
||||||
> [Boostnote store](https://boostnote.paintory.com/)가 생겼습니다!! :tada: 그리고,[Pateron](https://www.patreon.com/boostnote)에서도 저희를 지원 하실 수 있습니다.!
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
오픈소스 노트 앱
|
|
||||||
|
|
||||||
다음과 같은 용무가 있는 경우 이슈트래커를 이용해 주세요.
|
|
||||||
- Boostnote에 대해 질문을 하고 싶을 때
|
|
||||||
- Boostnote나 계획사항에 대해 피드백을 주고 싶을 때
|
|
||||||
- Boostnote에 버그를 보고하고 싶을 때
|
|
||||||
- Boostnote에 기여하고 싶을 때
|
|
||||||
|
|
||||||
저흰 Slack을 운영하고 있습니다. 혹시 좀 더 저희들과 깊게 관여하고 싶으시다면 @rokt33r에 초대를 부탁하세요.
|
|
||||||
|
|
||||||
## Goal
|
|
||||||
|
|
||||||
그냥 글쓰는게 즐거워지셨으면 좋겠어요. :grinning:
|
|
||||||
|
|
||||||
- 타겟 OS : OSX, Windows, Linux(나중엔 모바일까지도!)
|
|
||||||
- Cloud : Google drive, Dropbox, One drive, iCloud...
|
|
||||||
- 오픈소스로 남을 것!
|
|
||||||
|
|
||||||
## 영감받은 앱/서비스
|
|
||||||
|
|
||||||
- Atom
|
|
||||||
- Quiver
|
|
||||||
- Evernote
|
|
||||||
- GitKraken
|
|
||||||
- GitBook
|
|
||||||
- Gist
|
|
||||||
- Gistbox
|
|
||||||
- Snippets Lab
|
|
||||||
|
|
||||||
## Using stack
|
|
||||||
|
|
||||||
- Electron
|
|
||||||
- React
|
|
||||||
- Webpack
|
|
||||||
- Redux
|
|
||||||
- CSSModules
|
|
||||||
|
|
||||||
## Codestyle
|
|
||||||
|
|
||||||
[](https://github.com/feross/standard)
|
|
||||||
|
|
||||||
## Development
|
|
||||||
|
|
||||||
- [Build](docs/build.md)
|
|
||||||
|
|
||||||
## Goods
|
|
||||||
|
|
||||||
<img src="https://b00st.io/images/t3.png" width="250"/>
|
|
||||||
<img src="https://b00st.io/images/t1.png" width="250"/>
|
|
||||||
|
|
||||||
[Boostnote store](https://boostnote.paintory.com/)에서 몇가지 상품들을 팔고있습니다.
|
|
||||||
|
|
||||||
전세계 어디든 배송 가능합니다. 이 스토어는 [Paintory](https://paintory.com/)에서 제공됩니다.
|
|
||||||
|
|
||||||
## Donation
|
|
||||||
|
|
||||||
[Pateron page](https://www.patreon.com/boostnote)에서 기부 하실 수 있습니다.
|
|
||||||
|
|
||||||
## Author & Maintainer
|
|
||||||
|
|
||||||
[Rokt33r(Dick Choi of MAISIN&CO.)](https://github.com/rokt33r)
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
- [Kazu Yokomizo](https://github.com/kazup01)
|
|
||||||
- [dojineko](https://github.com/dojineko)
|
|
||||||
- [Romain Bazile](https://github.com/gromain)
|
|
||||||
- [Bruno Paz](https://github.com/brpaz)
|
|
||||||
- [Fabian Mueller](https://github.com/dotcs)
|
|
||||||
- [Yoshihisa Mochihara](https://github.com/yosmoc)
|
|
||||||
- [Mike Resoli](https://github.com/mikeres0)
|
|
||||||
- [tjado](https://github.com/tejado)
|
|
||||||
- [sota1235](https://github.com/sota1235)
|
|
||||||
|
|
||||||
## Copyright & License
|
|
||||||
|
|
||||||
Copyright (C) 2016 MAISIN&CO.
|
|
||||||
|
|
||||||
[GPL v3](./LICENSE).
|
|
||||||
71
readme.md
71
readme.md
@@ -5,68 +5,33 @@
|
|||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
</h1>
|
</h1>
|
||||||
<h4 align="center">Note app built for developers. </h4>
|
<h4 align="center">Note-taking app for programmers. </h4>
|
||||||
<h5 align="center">macOS, Windows and Linux</h5>
|
<h5 align="center">macOS, Windows and Linux</h5>
|
||||||
<h5 align="center">Built with Electron, React + Redux, Webpack and CSSModules</h5>
|
<h5 align="center">Built with Electron, React + Redux, Webpack and CSSModules</h5>
|
||||||
<h1> </h1>
|
|
||||||
|
|
||||||
> We launched our [Boostnote store](https://boostnote.paintory.com/)!! :tada: Also, you can support us via [Patreon](https://www.patreon.com/boostnote) and [Open collective](https://opencollective.com/boostnote)!
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
[日本語](./readme-ja.md) - [한국어](./readme-ko.md)
|
[](https://travis-ci.org/BoostIO/Boostnote)
|
||||||
|
|
||||||
## Goals
|
|
||||||
* We want our users to enjoying writing _anything_. :grinning:
|
|
||||||
* Open sourced forever!
|
|
||||||
|
|
||||||
See upcoming features and bug fixes [here](https://github.com/BoostIO/Boostnote/issues/68)
|
|
||||||
## Feedback
|
|
||||||
Please use the [issue tracker](https://github.com/BoostIO/Boostnote/issues) for questions, bug reporting and contribution information.
|
|
||||||
|
|
||||||
## Development
|
|
||||||
If you want to join our dev Slack group ask @rokt33r.
|
|
||||||
**[Build instructions](docs/build.md)**
|
|
||||||
|
|
||||||
[](https://github.com/feross/standard)
|
|
||||||
|
|
||||||
## Inspirations
|
|
||||||
- Atom
|
|
||||||
- Quiver
|
|
||||||
- Evernote
|
|
||||||
- GitKraken
|
|
||||||
- GitBook
|
|
||||||
- Gist
|
|
||||||
- Gistbox
|
|
||||||
- Snippets Lab
|
|
||||||
|
|
||||||
## Store
|
|
||||||
<img src="https://b00st.io/images/t3.png" width="250"/>
|
|
||||||
<img src="https://b00st.io/images/t1.png" width="250"/>
|
|
||||||
|
|
||||||
We're selling Boostnote goods on the [Boostnote store](https://boostnote.paintory.com/).
|
|
||||||
|
|
||||||
Products are shipped worldwide. Powered by [Paintory](https://paintory.com/)
|
|
||||||
|
|
||||||
## Donation
|
|
||||||
* [Patreon](https://www.patreon.com/boostnote)
|
|
||||||
* [Open collective](https://opencollective.com/boostnote)
|
|
||||||
|
|
||||||
## Author & Maintainer
|
## Author & Maintainer
|
||||||
[Rokt33r(Dick Choi of MAISIN&CO.)](https://github.com/rokt33r)
|
- [Rokt33r](https://github.com/rokt33r)
|
||||||
|
- [sota1235](https://github.com/sota1235)
|
||||||
|
- [Kohei TAKATA](https://github.com/kohei-takata)
|
||||||
|
- [asmsuechan](https://github.com/asmsuechan)
|
||||||
|
- [Kazu Yokomizo](https://github.com/kazup01)
|
||||||
|
|
||||||
## Contributors
|
## Contributors
|
||||||
- [Kazu Yokomizo](https://github.com/kazup01)
|
[Great contributors](https://github.com/BoostIO/Boostnote/graphs/contributors) :tada:
|
||||||
- [dojineko](https://github.com/dojineko)
|
|
||||||
- [Romain Bazile](https://github.com/gromain)
|
|
||||||
- [Bruno Paz](https://github.com/brpaz)
|
|
||||||
- [Fabian Mueller](https://github.com/dotcs)
|
|
||||||
- [Yoshihisa Mochihara](https://github.com/yosmoc)
|
|
||||||
- [Mike Resoli](https://github.com/mikeres0)
|
|
||||||
- [tjado](https://github.com/tejado)
|
|
||||||
- [sota1235](https://github.com/sota1235)
|
|
||||||
|
|
||||||
## Copyright & License
|
|
||||||
Copyright (C) 2016 MAISIN&CO.
|
## More Information
|
||||||
|
* Website: http://boostnote.io/
|
||||||
|
* Roadmap(upcoming features and bug fixes): https://github.com/BoostIO/Boostnote/wiki/List-of-the-requested-features
|
||||||
|
* Boostnote Shop(Products are shipped to all over the world :+1:): https://boostnote.paintory.com/
|
||||||
|
* Donation: [Patreon](https://www.patreon.com/boostnote)
|
||||||
|
* Development: https://github.com/BoostIO/Boostnote/blob/master/docs/build.md
|
||||||
|
* Copyright (C) 2017 Maisin&Co.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
[GPL v3](./LICENSE).
|
[GPL v3](./LICENSE).
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ test.beforeEach((t) => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
test.serial('Initialize All Storages', (t) => {
|
test.serial('Initialize All Storages', (t) => {
|
||||||
const { v1StorageData, legacyStorageData, emptyStorageData } = t.context
|
const { v1StorageData, legacyStorageData } = t.context
|
||||||
return Promise.resolve()
|
return Promise.resolve()
|
||||||
.then(function test () {
|
.then(function test () {
|
||||||
return init()
|
return init()
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ const TestDummy = require('../fixtures/TestDummy')
|
|||||||
const sander = require('sander')
|
const sander = require('sander')
|
||||||
const os = require('os')
|
const os = require('os')
|
||||||
const CSON = require('@rokt33r/season')
|
const CSON = require('@rokt33r/season')
|
||||||
const faker = require('faker')
|
|
||||||
|
|
||||||
const storagePath = path.join(os.tmpdir(), 'test/move-note')
|
const storagePath = path.join(os.tmpdir(), 'test/move-note')
|
||||||
const storagePath2 = path.join(os.tmpdir(), 'test/move-note2')
|
const storagePath2 = path.join(os.tmpdir(), 'test/move-note2')
|
||||||
Reference in New Issue
Block a user