mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-14 18:26:26 +00:00
Compare commits
67 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
87f9589be3 | ||
|
|
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 | ||
|
|
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
|
||||
@@ -52,7 +52,7 @@ export default class CodeEditor extends React.Component {
|
||||
indentUnit: this.props.indentSize,
|
||||
tabSize: this.props.indentSize,
|
||||
indentWithTabs: this.props.indentType !== 'space',
|
||||
keyMap: 'sublime',
|
||||
keyMap: this.props.keyMap,
|
||||
inputStyle: 'textarea',
|
||||
extraKeys: {
|
||||
Tab: function (cm) {
|
||||
@@ -102,6 +102,9 @@ export default class CodeEditor extends React.Component {
|
||||
if (prevProps.fontFamily !== this.props.fontFamily) {
|
||||
needRefresh = true
|
||||
}
|
||||
if (prevProps.keyMap !== this.props.keyMap) {
|
||||
needRefresh = true
|
||||
}
|
||||
|
||||
if (prevProps.indentSize !== this.props.indentSize) {
|
||||
this.editor.setOption('indentUnit', this.props.indentSize)
|
||||
@@ -194,6 +197,7 @@ CodeEditor.propTypes = {
|
||||
CodeEditor.defaultProps = {
|
||||
readOnly: false,
|
||||
theme: 'xcode',
|
||||
keyMap: 'sublime',
|
||||
fontSize: 14,
|
||||
fontFamily: 'Monaco, Consolas',
|
||||
indentSize: 4,
|
||||
|
||||
@@ -166,6 +166,7 @@ class MarkdownEditor extends React.Component {
|
||||
mode='GitHub Flavored Markdown'
|
||||
value={value}
|
||||
theme={config.editor.theme}
|
||||
keyMap={config.editor.keyMap}
|
||||
fontFamily={config.editor.fontFamily}
|
||||
fontSize={editorFontSize}
|
||||
indentType={config.editor.indentType}
|
||||
@@ -179,6 +180,7 @@ class MarkdownEditor extends React.Component {
|
||||
}
|
||||
style={previewStyle}
|
||||
theme={config.ui.theme}
|
||||
keyMap={config.editor.keyMap}
|
||||
fontSize={config.preview.fontSize}
|
||||
fontFamily={config.preview.fontFamily}
|
||||
codeBlockTheme={config.preview.codeBlockTheme}
|
||||
|
||||
@@ -140,7 +140,7 @@ export default class MarkdownPreview extends React.Component {
|
||||
|
||||
this.refs.root.contentWindow.document.head.innerHTML = `
|
||||
<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" id="codeTheme">
|
||||
`
|
||||
@@ -184,9 +184,9 @@ export default class MarkdownPreview extends React.Component {
|
||||
}
|
||||
|
||||
setCodeTheme (theme) {
|
||||
theme = consts.THEMES.some((_theme) => _theme === theme)
|
||||
theme = consts.THEMES.some((_theme) => _theme === theme) && theme !== 'default'
|
||||
? theme
|
||||
: 'default'
|
||||
: 'elegant'
|
||||
this.getWindow().document.getElementById('codeTheme').href = `${appPath}/node_modules/codemirror/theme/${theme}.css`
|
||||
}
|
||||
|
||||
|
||||
@@ -75,8 +75,8 @@ const NoteItem = ({ isActive, note, dateDisplay, handleNoteClick, handleNoteCont
|
||||
: <i styleName='item-title-icon' className='fa fa-fw fa-file-text-o' />
|
||||
}
|
||||
|
||||
{note.isStarred ?
|
||||
<i styleName='item-star' className='fa fa-star' /> : ''
|
||||
{note.isStarred
|
||||
? <i styleName='item-star' className='fa fa-star' /> : ''
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
@@ -91,10 +91,10 @@ NoteItem.propTypes = {
|
||||
type: PropTypes.string.isRequired,
|
||||
title: PropTypes.string.isrequired,
|
||||
tags: PropTypes.array,
|
||||
isStarred: PropTypes.bool.isRequired,
|
||||
isStarred: PropTypes.bool.isRequired
|
||||
}),
|
||||
handleNoteClick: PropTypes.func.isRequired,
|
||||
handleNoteContextMenu: PropTypes.func.isRequired,
|
||||
handleNoteContextMenu: PropTypes.func.isRequired
|
||||
}
|
||||
|
||||
export default CSSModules(NoteItem, styles)
|
||||
|
||||
@@ -40,10 +40,10 @@ NoteItemSimple.propTypes = {
|
||||
storage: PropTypes.string.isRequired,
|
||||
key: PropTypes.string.isRequired,
|
||||
type: PropTypes.string.isRequired,
|
||||
title: PropTypes.string.isrequired,
|
||||
title: PropTypes.string.isrequired
|
||||
}),
|
||||
handleNoteClick: PropTypes.func.isRequired,
|
||||
handleNoteContextMenu: PropTypes.func.isRequired,
|
||||
handleNoteContextMenu: PropTypes.func.isRequired
|
||||
}
|
||||
|
||||
export default CSSModules(NoteItemSimple, styles)
|
||||
|
||||
@@ -12,7 +12,7 @@ export default class ProfileImage extends React.Component {
|
||||
className={className}
|
||||
width={this.props.size}
|
||||
height={this.props.size}
|
||||
src={src}/>
|
||||
src={src} />
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,17 +17,17 @@ const SideNavFilter = ({
|
||||
isFolded, isHomeActive, handleAllNotesButtonClick,
|
||||
isStarredActive, handleStarredButtonClick
|
||||
}) => (
|
||||
<div styleName={ isFolded ? 'menu--folded' : 'menu' }>
|
||||
<div styleName={isFolded ? 'menu--folded' : 'menu'}>
|
||||
<button styleName={isHomeActive ? 'menu-button--active' : 'menu-button'}
|
||||
onClick={handleAllNotesButtonClick}
|
||||
>
|
||||
<i className='fa fa-book fa-fw'/>
|
||||
<i className='fa fa-book fa-fw' />
|
||||
<span styleName='menu-button-label'>All Notes</span>
|
||||
</button>
|
||||
<button styleName={isStarredActive ? 'menu-button--active' : 'menu-button'}
|
||||
onClick={handleStarredButtonClick}
|
||||
>
|
||||
<i className='fa fa-star fa-fw'/>
|
||||
<i className='fa fa-star fa-fw' />
|
||||
<span styleName='menu-button-label'>Starred</span>
|
||||
</button>
|
||||
</div>
|
||||
@@ -38,7 +38,7 @@ SideNavFilter.propTypes = {
|
||||
isHomeActive: PropTypes.bool.isRequired,
|
||||
handleAllNotesButtonClick: PropTypes.func.isRequired,
|
||||
isStarredActive: PropTypes.bool.isRequired,
|
||||
handleStarredButtonClick: PropTypes.func.isRequired,
|
||||
handleStarredButtonClick: PropTypes.func.isRequired
|
||||
}
|
||||
|
||||
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 styles from './SnippetTab.styl'
|
||||
import context from 'browser/lib/context'
|
||||
@@ -117,7 +117,7 @@ class SnippetTab extends React.Component {
|
||||
<button styleName='deleteButton'
|
||||
onClick={(e) => this.handleDeleteButtonClick(e)}
|
||||
>
|
||||
<i className='fa fa-times'/>
|
||||
<i className='fa fa-times' />
|
||||
</button>
|
||||
}
|
||||
</div>
|
||||
|
||||
@@ -27,8 +27,8 @@ const StorageItem = ({
|
||||
onClick={handleButtonClick}
|
||||
onContextMenu={handleContextMenu}
|
||||
>
|
||||
<span styleName={isFolded ?
|
||||
'folderList-item-name--folded' : 'folderList-item-name'
|
||||
<span styleName={isFolded
|
||||
? 'folderList-item-name--folded' : 'folderList-item-name'
|
||||
}
|
||||
style={{borderColor: folderColor}}
|
||||
>
|
||||
@@ -52,7 +52,7 @@ StorageItem.propTypes = {
|
||||
folderName: PropTypes.string.isRequired,
|
||||
folderColor: PropTypes.string,
|
||||
isFolded: PropTypes.bool.isRequired,
|
||||
noteCount: PropTypes.number,
|
||||
noteCount: PropTypes.number
|
||||
}
|
||||
|
||||
export default CSSModules(StorageItem, styles)
|
||||
|
||||
@@ -39,6 +39,8 @@
|
||||
border-width 0 0 0 3px
|
||||
border-style solid
|
||||
border-color transparent
|
||||
overflow hidden
|
||||
text-overflow ellipsis
|
||||
|
||||
.folderList-item-noteCount
|
||||
float right
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import React, { PropTypes } from 'react'
|
||||
import React from 'react'
|
||||
import CSSModules from 'browser/lib/CSSModules'
|
||||
import styles from './NoteDetail.styl'
|
||||
import MarkdownPreview from 'browser/components/MarkdownPreview'
|
||||
@@ -97,9 +97,7 @@ class NoteDetail extends React.Component {
|
||||
let { note, config } = this.props
|
||||
if (note == null) {
|
||||
return (
|
||||
<div styleName='root'>
|
||||
|
||||
</div>
|
||||
<div styleName='root' />
|
||||
)
|
||||
}
|
||||
|
||||
@@ -154,6 +152,7 @@ class NoteDetail extends React.Component {
|
||||
fontSize={editorFontSize}
|
||||
indentType={config.editor.indentType}
|
||||
indentSize={editorIndentSize}
|
||||
keyMap={config.editor.keyMap}
|
||||
readOnly
|
||||
ref={'code-' + index}
|
||||
/>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import React, { PropTypes } from 'react'
|
||||
import React from 'react'
|
||||
import NoteItem from 'browser/components/NoteItem'
|
||||
import moment from 'moment'
|
||||
|
||||
@@ -54,12 +54,11 @@ class NoteList extends React.Component {
|
||||
}
|
||||
|
||||
render () {
|
||||
let { storageMap, notes, index } = this.props
|
||||
let { notes, index } = this.props
|
||||
|
||||
let notesList = notes
|
||||
.slice(0, 10 + 10 * this.state.range)
|
||||
.map((note, _index) => {
|
||||
|
||||
const isActive = (index === _index)
|
||||
const key = `${note.storage}-${note.key}`
|
||||
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 styles from './StorageSection.styl'
|
||||
import StorageItem from 'browser/components/StorageItem'
|
||||
|
||||
@@ -2,7 +2,6 @@ import React, { PropTypes } from 'react'
|
||||
import ReactDOM from 'react-dom'
|
||||
import { connect, Provider } from 'react-redux'
|
||||
import _ from 'lodash'
|
||||
import ipc from './ipcClient'
|
||||
import store from './store'
|
||||
import CSSModules from 'browser/lib/CSSModules'
|
||||
import styles from './FinderMain.styl'
|
||||
@@ -351,7 +350,7 @@ function refreshData () {
|
||||
|
||||
ReactDOM.render((
|
||||
<Provider store={store}>
|
||||
<Finder/>
|
||||
<Finder />
|
||||
</Provider>
|
||||
), document.getElementById('content'), function () {
|
||||
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 _ from 'lodash'
|
||||
|
||||
CodeMirror.modeInfo.push({name: 'Stylus', mime: 'text/x-styl', mode: 'stylus', ext: ['styl'], alias: ['styl']})
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
/**
|
||||
* @fileoverview Formatting date string.
|
||||
*/
|
||||
import moment from 'moment';
|
||||
import moment from 'moment'
|
||||
|
||||
/**
|
||||
* @description Return date string. For example, 'Sep.9, 2016 12:00'.
|
||||
* @param {mixed}
|
||||
* @return {string}
|
||||
*/
|
||||
export function getLastUpdated(date) {
|
||||
export function getLastUpdated (date) {
|
||||
const m = moment(date)
|
||||
if (!m.isValid()) {
|
||||
throw Error('Invalid argument.');
|
||||
throw Error('Invalid argument.')
|
||||
}
|
||||
|
||||
return m.format('MMM D, gggg H:mm')
|
||||
|
||||
@@ -58,7 +58,7 @@ md.use(math, {
|
||||
})
|
||||
md.use(require('markdown-it-footnote'))
|
||||
// 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 nextLine = startLine + 1
|
||||
let terminatorRules = state.md.block.ruler.getRules('paragraph')
|
||||
|
||||
@@ -128,8 +128,8 @@ class FolderSelect extends React.Component {
|
||||
}
|
||||
|
||||
nextOption () {
|
||||
let { storages } = this.props
|
||||
let { optionIndex } = this.state
|
||||
let { folders } = this.props
|
||||
|
||||
optionIndex++
|
||||
if (optionIndex >= folders.length) optionIndex = 0
|
||||
@@ -262,13 +262,11 @@ class FolderSelect extends React.Component {
|
||||
: <div styleName='idle'>
|
||||
<div styleName='idle-label'>
|
||||
<span styleName='idle-label-name'
|
||||
style={{borderColor: currentOption.folder.color}}
|
||||
style={{color: currentOption.folder.color}}
|
||||
>
|
||||
{currentOption.folder.name}
|
||||
<span styleName='idle-label-name-surfix'>in {currentOption.storage.name}</span>
|
||||
{currentOption.folder.name} /
|
||||
</span>
|
||||
</div>
|
||||
<i styleName='idle-caret' className='fa fa-fw fa-caret-down'/>
|
||||
</div>
|
||||
}
|
||||
|
||||
|
||||
@@ -7,29 +7,28 @@
|
||||
transition 0.15s
|
||||
user-select none
|
||||
&:hover
|
||||
background-color white
|
||||
border-color $ui-borderColor
|
||||
background-color $ui-button--hover-backgroundColor
|
||||
|
||||
.root--search, .root--focus
|
||||
@extend .root
|
||||
background-color white
|
||||
background-color $ui-noteDetail-backgroundColor = #F4F4F4
|
||||
border-color $ui-input--focus-borderColor
|
||||
width 100px
|
||||
&:hover
|
||||
background-color white
|
||||
border-color $ui-input--focus-borderColor
|
||||
|
||||
.idle
|
||||
position relative
|
||||
cursor pointer
|
||||
|
||||
.idle-label
|
||||
absolute left top
|
||||
padding 0 0 0 5px
|
||||
right 20px
|
||||
overflow ellipsis
|
||||
|
||||
.idle-label-name
|
||||
border-left solid 4px transparent
|
||||
padding 2px 5px
|
||||
font-size 16px
|
||||
padding 2px
|
||||
|
||||
.idle-label-name-surfix
|
||||
font-size 10px
|
||||
color $ui-inactive-text-color
|
||||
@@ -60,9 +59,9 @@
|
||||
max-height 450px
|
||||
overflow auto
|
||||
z-index 200
|
||||
border $ui-border
|
||||
background-color white
|
||||
border-radius 2px
|
||||
box-shadow 2px 2px 10px gray
|
||||
|
||||
.search-optionList-item
|
||||
height 34px
|
||||
@@ -115,8 +114,8 @@ body[data-theme="dark"]
|
||||
|
||||
.search-optionList
|
||||
color white
|
||||
border-color $ui-dark-borderColor
|
||||
background-color $ui-dark-button--hover-backgroundColor
|
||||
box-shadow 2px 2px 10px black
|
||||
|
||||
.search-optionList-item
|
||||
&:hover
|
||||
|
||||
@@ -21,7 +21,7 @@ const LastUpdatedString = ({ date }) => {
|
||||
}
|
||||
|
||||
LastUpdatedString.propTypes = {
|
||||
date: PropTypes.string,
|
||||
date: PropTypes.string
|
||||
}
|
||||
|
||||
export default CSSModules(LastUpdatedString, styles)
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
.info-right-date
|
||||
display inline
|
||||
line-height 24px
|
||||
padding-right 25px
|
||||
font-size 11px
|
||||
color $ui-button-color
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import styles from './MarkdownNoteDetail.styl'
|
||||
import MarkdownEditor from 'browser/components/MarkdownEditor'
|
||||
import StarButton from './StarButton'
|
||||
import TagSelect from './TagSelect'
|
||||
import LastUpdatedString from './LastUpdatedString'
|
||||
import FolderSelect from './FolderSelect'
|
||||
import dataApi from 'browser/main/lib/dataApi'
|
||||
import { hashHistory } from 'react-router'
|
||||
import ee from 'browser/main/lib/eventEmitter'
|
||||
@@ -219,6 +219,15 @@ class MarkdownNoteDetail extends React.Component {
|
||||
onClick={(e) => this.handleStarButtonClick(e)}
|
||||
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
|
||||
ref='tags'
|
||||
value={this.state.note.tags}
|
||||
@@ -226,7 +235,6 @@ class MarkdownNoteDetail extends React.Component {
|
||||
/>
|
||||
</div>
|
||||
<div styleName='info-right'>
|
||||
<LastUpdatedString date={note.updatedAt} />
|
||||
<button styleName='info-right-button'
|
||||
onClick={(e) => this.handleContextButtonClick(e)}
|
||||
>
|
||||
@@ -248,6 +256,7 @@ class MarkdownNoteDetail extends React.Component {
|
||||
|
||||
<StatusBar
|
||||
{..._.pick(this.props, ['config', 'location', 'dispatch'])}
|
||||
date={note.updatedAt}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -16,6 +16,19 @@ $info-margin-under-border = 27px
|
||||
padding 0 5px
|
||||
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
|
||||
width 34px
|
||||
height 34px
|
||||
|
||||
@@ -5,7 +5,7 @@ import CodeEditor from 'browser/components/CodeEditor'
|
||||
import MarkdownEditor from 'browser/components/MarkdownEditor'
|
||||
import StarButton from './StarButton'
|
||||
import TagSelect from './TagSelect'
|
||||
import LastUpdatedString from './LastUpdatedString'
|
||||
import FolderSelect from './FolderSelect'
|
||||
import dataApi from 'browser/main/lib/dataApi'
|
||||
import { hashHistory } from 'react-router'
|
||||
import ee from 'browser/main/lib/eventEmitter'
|
||||
@@ -14,6 +14,7 @@ import SnippetTab from 'browser/components/SnippetTab'
|
||||
import StatusBar from '../StatusBar'
|
||||
import context from 'browser/lib/context'
|
||||
import ConfigManager from 'browser/main/lib/ConfigManager'
|
||||
import _ from 'lodash'
|
||||
|
||||
function pass (name) {
|
||||
switch (name) {
|
||||
@@ -508,6 +509,7 @@ class SnippetNoteDetail extends React.Component {
|
||||
fontSize={editorFontSize}
|
||||
indentType={config.editor.indentType}
|
||||
indentSize={editorIndentSize}
|
||||
keyMap={config.editor.keyMap}
|
||||
onChange={(e) => this.handleCodeChange(index)(e)}
|
||||
ref={'code-' + index}
|
||||
/>
|
||||
@@ -527,6 +529,15 @@ class SnippetNoteDetail extends React.Component {
|
||||
onClick={(e) => this.handleStarButtonClick(e)}
|
||||
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
|
||||
ref='tags'
|
||||
value={this.state.note.tags}
|
||||
@@ -534,11 +545,10 @@ class SnippetNoteDetail extends React.Component {
|
||||
/>
|
||||
</div>
|
||||
<div styleName='info-right'>
|
||||
<LastUpdatedString date={note.updatedAt} />
|
||||
<button styleName='info-right-button'
|
||||
onClick={(e) => this.handleContextButtonClick(e)}
|
||||
>
|
||||
<i className='fa fa-ellipsis-v'/>
|
||||
<i className='fa fa-ellipsis-v' />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -563,7 +573,7 @@ class SnippetNoteDetail extends React.Component {
|
||||
<button styleName='plusButton'
|
||||
onClick={(e) => this.handleTabPlusButtonClick(e)}
|
||||
>
|
||||
<i className='fa fa-plus'/>
|
||||
<i className='fa fa-plus' />
|
||||
</button>
|
||||
</div>
|
||||
{viewList}
|
||||
@@ -577,24 +587,25 @@ class SnippetNoteDetail extends React.Component {
|
||||
? 'Select Syntax...'
|
||||
: this.state.note.snippets[this.state.snippetIndex].mode
|
||||
}
|
||||
<i className='fa fa-caret-down'/>
|
||||
<i className='fa fa-caret-down' />
|
||||
</button>
|
||||
<button
|
||||
onClick={(e) => this.handleIndentTypeButtonClick(e)}
|
||||
>
|
||||
Indent: {config.editor.indentType}
|
||||
<i className='fa fa-caret-down'/>
|
||||
<i className='fa fa-caret-down' />
|
||||
</button>
|
||||
<button
|
||||
onClick={(e) => this.handleIndentSizeButtonClick(e)}
|
||||
>
|
||||
size: {config.editor.indentSize}
|
||||
<i className='fa fa-caret-down'/>
|
||||
<i className='fa fa-caret-down' />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<StatusBar
|
||||
{..._.pick(this.props, ['config', 'location', 'dispatch'])}
|
||||
date={note.updatedAt}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
|
||||
.override
|
||||
absolute bottom left
|
||||
left 60px
|
||||
height 23px
|
||||
z-index 1
|
||||
button
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
.root
|
||||
position absolute
|
||||
left 7px
|
||||
top 0
|
||||
padding 0
|
||||
|
||||
@@ -8,7 +8,7 @@ class TagSelect extends React.Component {
|
||||
super(props)
|
||||
|
||||
this.state = {
|
||||
newTag: '',
|
||||
newTag: ''
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ class TagSelect extends React.Component {
|
||||
<button styleName='tag-removeButton'
|
||||
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>
|
||||
</span>
|
||||
)
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
.root
|
||||
position absolute
|
||||
display inline-block
|
||||
top 19px
|
||||
left 44px
|
||||
user-select none
|
||||
vertical-align middle
|
||||
width 300px
|
||||
|
||||
@@ -112,7 +112,7 @@ class Main extends React.Component {
|
||||
ConfigManager.set({ navWidth })
|
||||
dispatch({
|
||||
type: 'SET_NAV_WIDTH',
|
||||
navWidth,
|
||||
navWidth
|
||||
})
|
||||
})
|
||||
}
|
||||
@@ -169,7 +169,7 @@ class Main extends React.Component {
|
||||
onMouseDown={(e) => this.handleLeftSlideMouseDown(e)}
|
||||
draggable='false'
|
||||
>
|
||||
<div styleName='slider-hitbox'/>
|
||||
<div styleName='slider-hitbox' />
|
||||
</div>
|
||||
}
|
||||
<div styleName={config.isSideNavFolded ? 'body--expanded' : 'body'}
|
||||
|
||||
@@ -324,8 +324,8 @@ class NoteList extends React.Component {
|
||||
const isDefault = config.listStyle === 'DEFAULT'
|
||||
const isActive = location.query.key === note.storage + '-' + note.key
|
||||
const dateDisplay = moment(
|
||||
config.sortBy === 'CREATED_AT' ?
|
||||
note.createdAt : note.updatedAt
|
||||
config.sortBy === 'CREATED_AT'
|
||||
? note.createdAt : note.updatedAt
|
||||
).fromNow()
|
||||
const key = `${note.storage}-${note.key}`
|
||||
|
||||
@@ -376,7 +376,7 @@ class NoteList extends React.Component {
|
||||
}
|
||||
onClick={(e) => this.handleListStyleButtonClick(e, 'DEFAULT')}
|
||||
>
|
||||
<i className='fa fa-th-large'/>
|
||||
<i className='fa fa-th-large' />
|
||||
</button>
|
||||
<button styleName={config.listStyle === 'SMALL'
|
||||
? 'control-button--active'
|
||||
@@ -384,7 +384,7 @@ class NoteList extends React.Component {
|
||||
}
|
||||
onClick={(e) => this.handleListStyleButtonClick(e, 'SMALL')}
|
||||
>
|
||||
<i className='fa fa-list-ul'/>
|
||||
<i className='fa fa-list-ul' />
|
||||
</button>
|
||||
</div>
|
||||
<div styleName='list'
|
||||
|
||||
@@ -181,7 +181,7 @@ class StorageItem extends React.Component {
|
||||
<button styleName='header-addFolderButton'
|
||||
onClick={(e) => this.handleAddFolderButtonClick(e)}
|
||||
>
|
||||
<i className='fa fa-plus'/>
|
||||
<i className='fa fa-plus' />
|
||||
</button>
|
||||
}
|
||||
|
||||
|
||||
@@ -7,9 +7,6 @@ import ConfigManager from 'browser/main/lib/ConfigManager'
|
||||
import StorageItem from './StorageItem'
|
||||
import SideNavFilter from 'browser/components/SideNavFilter'
|
||||
|
||||
const electron = require('electron')
|
||||
const { remote } = electron
|
||||
|
||||
class SideNav extends React.Component {
|
||||
// TODO: should not use electron stuff v0.7
|
||||
handleMenuButtonClick (e) {
|
||||
@@ -65,7 +62,7 @@ class SideNav extends React.Component {
|
||||
<button styleName='top-menu'
|
||||
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>
|
||||
</button>
|
||||
</div>
|
||||
@@ -87,8 +84,8 @@ class SideNav extends React.Component {
|
||||
onClick={(e) => this.handleToggleButtonClick(e)}
|
||||
>
|
||||
{isFolded
|
||||
? <i className='fa fa-angle-double-right'/>
|
||||
: <i className='fa fa-angle-double-left'/>
|
||||
? <i className='fa fa-angle-double-right' />
|
||||
: <i className='fa fa-angle-double-left' />
|
||||
}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -2,6 +2,7 @@ import React, { PropTypes } from 'react'
|
||||
import CSSModules from 'browser/lib/CSSModules'
|
||||
import styles from './StatusBar.styl'
|
||||
import ZoomManager from 'browser/main/lib/ZoomManager'
|
||||
import LastUpdatedString from '../Detail/LastUpdatedString'
|
||||
|
||||
const electron = require('electron')
|
||||
const { remote, ipcRenderer } = electron
|
||||
@@ -52,22 +53,23 @@ class StatusBar extends React.Component {
|
||||
<div className='StatusBar'
|
||||
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'
|
||||
onClick={(e) => this.handleZoomButtonClick(e)}
|
||||
>
|
||||
<i className='fa fa-search-plus' />
|
||||
{Math.floor(config.zoom * 100)}%
|
||||
</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>
|
||||
)
|
||||
}
|
||||
@@ -77,7 +79,8 @@ StatusBar.contextTypes = {
|
||||
status: PropTypes.shape({
|
||||
updateReady: PropTypes.bool.isRequired
|
||||
}).isRequired,
|
||||
config: PropTypes.shape({}).isRequired
|
||||
config: PropTypes.shape({}).isRequired,
|
||||
date: PropTypes.string
|
||||
}
|
||||
|
||||
StatusBar.propTypes = {
|
||||
|
||||
@@ -10,8 +10,6 @@ import ConfigManager from 'browser/main/lib/ConfigManager'
|
||||
import dataApi from 'browser/main/lib/dataApi'
|
||||
|
||||
const OSX = window.process.platform === 'darwin'
|
||||
const { remote } = require('electron')
|
||||
const { Menu, MenuItem } = remote
|
||||
|
||||
class TopBar extends React.Component {
|
||||
constructor (props) {
|
||||
@@ -71,10 +69,10 @@ class TopBar extends React.Component {
|
||||
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})
|
||||
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 {
|
||||
storage,
|
||||
@@ -262,8 +260,8 @@ class TopBar extends React.Component {
|
||||
<span styleName='control-search-optionList-item-folder-surfix'>in {storage.name}</span>
|
||||
</div>
|
||||
{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-file-text-o'/>
|
||||
? <i styleName='control-search-optionList-item-type' className='fa fa-code' />
|
||||
: <i styleName='control-search-optionList-item-type' className='fa fa-file-text-o' />
|
||||
}
|
||||
{note.title}
|
||||
</div>
|
||||
@@ -276,7 +274,7 @@ class TopBar extends React.Component {
|
||||
>
|
||||
<div styleName='control'>
|
||||
<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'
|
||||
onFocus={(e) => this.handleSearchFocus(e)}
|
||||
onBlur={(e) => this.handleSearchBlur(e)}
|
||||
@@ -303,14 +301,14 @@ class TopBar extends React.Component {
|
||||
<button styleName='left-search-clearButton'
|
||||
onClick={(e) => this.handleSearchClearButton(e)}
|
||||
>
|
||||
<i className='fa fa-times'/>
|
||||
<i className='fa fa-times' />
|
||||
</button>
|
||||
}
|
||||
|
||||
</div>
|
||||
<button styleName='control-newPostButton'
|
||||
onClick={(e) => this.handleNewPostButtonClick(e)}>
|
||||
<i className='fa fa-plus'/>
|
||||
<i className='fa fa-plus' />
|
||||
<span styleName='control-newPostButton-tooltip'>
|
||||
Make a Note {OSX ? '⌘' : '^'} + n
|
||||
</span>
|
||||
|
||||
@@ -25,6 +25,7 @@ export const DEFAULT_CONFIG = {
|
||||
},
|
||||
editor: {
|
||||
theme: 'default',
|
||||
keyMap: 'sublime',
|
||||
fontSize: '14',
|
||||
fontFamily: 'Monaco, Consolas',
|
||||
indentType: 'space',
|
||||
@@ -34,7 +35,7 @@ export const DEFAULT_CONFIG = {
|
||||
preview: {
|
||||
fontSize: '14',
|
||||
fontFamily: 'Lato',
|
||||
codeBlockTheme: 'xcode',
|
||||
codeBlockTheme: 'elegant',
|
||||
lineNumber: true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,10 +20,10 @@ class ModalBase extends React.Component {
|
||||
render () {
|
||||
return (
|
||||
<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 : (
|
||||
<Provider store={store}>
|
||||
<this.state.component {...this.state.componentProps} close={this.close}/>
|
||||
<this.state.component {...this.state.componentProps} close={this.close} />
|
||||
</Provider>
|
||||
)}
|
||||
</div>
|
||||
@@ -33,7 +33,7 @@ class ModalBase extends React.Component {
|
||||
|
||||
let el = document.createElement('div')
|
||||
document.body.appendChild(el)
|
||||
let modalBase = ReactDOM.render(<ModalBase/>, el)
|
||||
let modalBase = ReactDOM.render(<ModalBase />, el)
|
||||
|
||||
export function openModal (component, props) {
|
||||
if (modalBase == null) { return }
|
||||
|
||||
@@ -33,13 +33,13 @@ export default class DeleteArticleModal extends React.Component {
|
||||
render () {
|
||||
return (
|
||||
<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='control'>
|
||||
<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='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>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import React, { PropTypes } from 'react'
|
||||
import React from 'react'
|
||||
import CSSModules from 'browser/lib/CSSModules'
|
||||
import styles from './InitModal.styl'
|
||||
import dataApi from 'browser/main/lib/dataApi'
|
||||
import store from 'browser/main/store'
|
||||
import { hashHistory } from 'react-router'
|
||||
import _ from 'lodash'
|
||||
import keygen from 'browser/lib/keygen'
|
||||
|
||||
const CSON = require('@rokt33r/season')
|
||||
const path = require('path')
|
||||
@@ -197,7 +196,7 @@ class InitModal extends React.Component {
|
||||
render () {
|
||||
if (this.state.isLoading) {
|
||||
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>
|
||||
}
|
||||
@@ -235,7 +234,7 @@ class InitModal extends React.Component {
|
||||
|
||||
{this.state.legacyStorageExists &&
|
||||
<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>
|
||||
}
|
||||
|
||||
@@ -247,7 +246,7 @@ class InitModal extends React.Component {
|
||||
>
|
||||
{this.state.isSending
|
||||
? <span>
|
||||
<i className='fa fa-spin fa-spinner'/> Loading...
|
||||
<i className='fa fa-spin fa-spinner' /> Loading...
|
||||
</span>
|
||||
: 'Let\'s Go!'
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import React, { PropTypes } from 'react'
|
||||
import React from 'react'
|
||||
import CSSModules from 'browser/lib/CSSModules'
|
||||
import styles from './NewNoteModal.styl'
|
||||
import dataApi from 'browser/main/lib/dataApi'
|
||||
@@ -114,8 +114,8 @@ class NewNoteModal extends React.Component {
|
||||
>
|
||||
<i styleName='control-button-icon'
|
||||
className='fa fa-file-text-o'
|
||||
/><br/>
|
||||
<span styleName='control-button-label'>Markdown Note</span><br/>
|
||||
/><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>
|
||||
</button>
|
||||
|
||||
@@ -126,14 +126,14 @@ class NewNoteModal extends React.Component {
|
||||
>
|
||||
<i styleName='control-button-icon'
|
||||
className='fa fa-code'
|
||||
/><br/>
|
||||
<span styleName='control-button-label'>Snippet Note</span><br/>
|
||||
/><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>
|
||||
</button>
|
||||
|
||||
</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>
|
||||
)
|
||||
|
||||
@@ -94,6 +94,10 @@
|
||||
p
|
||||
line-height 1.2
|
||||
|
||||
.note-for-keymap
|
||||
margin-left: 10px
|
||||
font-size: 12px
|
||||
|
||||
colorDarkControl()
|
||||
border-color $ui-dark-borderColor
|
||||
background-color $ui-dark-backgroundColor
|
||||
|
||||
@@ -7,8 +7,6 @@ import store from 'browser/main/store'
|
||||
const electron = require('electron')
|
||||
const ipc = electron.ipcRenderer
|
||||
|
||||
const OSX = global.process.platform === 'darwin'
|
||||
|
||||
class HotkeyTab extends React.Component {
|
||||
constructor (props) {
|
||||
super(props)
|
||||
@@ -150,7 +148,7 @@ class HotkeyTab extends React.Component {
|
||||
}
|
||||
|
||||
HotkeyTab.propTypes = {
|
||||
dispatch: PropTypes.func,
|
||||
dispatch: PropTypes.func
|
||||
}
|
||||
|
||||
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 styles from './InfoTab.styl'
|
||||
|
||||
@@ -26,7 +26,7 @@ class InfoTab extends React.Component {
|
||||
|
||||
<div styleName='top'>
|
||||
<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='appId'>Boostnote {appVersion}</div>
|
||||
<div styleName='description'>
|
||||
@@ -34,7 +34,7 @@ class InfoTab extends React.Component {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div styleName='clear'></div>
|
||||
<div styleName='clear' />
|
||||
<div styleName='madeBy'>Made by
|
||||
<a href='http://maisin.co/'
|
||||
onClick={(e) => this.handleLinkClick(e)}
|
||||
|
||||
@@ -106,7 +106,10 @@ class UnstyledFolderItem extends React.Component {
|
||||
const popover = { position: 'absolute', zIndex: 2 }
|
||||
const cover = {
|
||||
position: 'fixed',
|
||||
top: 0, right: 0, bottom: 0, left: 0
|
||||
top: 0,
|
||||
right: 0,
|
||||
bottom: 0,
|
||||
left: 0
|
||||
}
|
||||
const pickerStyle = Object.assign({}, {
|
||||
position: 'absolute'
|
||||
@@ -137,7 +140,7 @@ class UnstyledFolderItem extends React.Component {
|
||||
</div>
|
||||
: null
|
||||
}
|
||||
<i className='fa fa-square'/>
|
||||
<i className='fa fa-square' />
|
||||
</button>
|
||||
<input styleName='folderList-item-left-nameInput'
|
||||
value={this.state.folder.name}
|
||||
@@ -368,17 +371,17 @@ class StorageItem extends React.Component {
|
||||
: <div styleName='header-label'
|
||||
onClick={(e) => this.handleLabelClick(e)}
|
||||
>
|
||||
<i className='fa fa-folder-open'/>
|
||||
<i className='fa fa-folder-open' />
|
||||
{storage.name}
|
||||
<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 styleName='header-control'>
|
||||
<button styleName='header-control-button'
|
||||
onClick={(e) => this.handleNewFolderButtonClick(e)}
|
||||
>
|
||||
<i className='fa fa-plus'/>
|
||||
<i className='fa fa-plus' />
|
||||
<span styleName='header-control-button-tooltip'
|
||||
style={{left: -20}}
|
||||
>Add Folder</span>
|
||||
@@ -386,7 +389,7 @@ class StorageItem extends React.Component {
|
||||
<button styleName='header-control-button'
|
||||
onClick={(e) => this.handleExternalButtonClick(e)}
|
||||
>
|
||||
<i className='fa fa-external-link'/>
|
||||
<i className='fa fa-external-link' />
|
||||
<span styleName='header-control-button-tooltip'
|
||||
style={{left: -50}}
|
||||
>Open Storage folder</span>
|
||||
@@ -394,7 +397,7 @@ class StorageItem extends React.Component {
|
||||
<button styleName='header-control-button'
|
||||
onClick={(e) => this.handleUnlinkButtonClick(e)}
|
||||
>
|
||||
<i className='fa fa-unlink'/>
|
||||
<i className='fa fa-unlink' />
|
||||
<span styleName='header-control-button-tooltip'
|
||||
style={{left: -10}}
|
||||
>Unlink</span>
|
||||
|
||||
@@ -72,7 +72,7 @@ class StoragesTab extends React.Component {
|
||||
<button styleName='list-control-addStorageButton'
|
||||
onClick={(e) => this.handleAddStorageButton(e)}
|
||||
>
|
||||
<i className='fa fa-plus'/> Add Storage
|
||||
<i className='fa fa-plus' /> Add Storage
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -5,9 +5,6 @@ import ConfigManager from 'browser/main/lib/ConfigManager'
|
||||
import store from 'browser/main/store'
|
||||
import consts from 'browser/lib/consts'
|
||||
|
||||
const electron = require('electron')
|
||||
const ipc = electron.ipcRenderer
|
||||
|
||||
const OSX = global.process.platform === 'darwin'
|
||||
|
||||
class UiTab extends React.Component {
|
||||
@@ -34,7 +31,8 @@ class UiTab extends React.Component {
|
||||
fontFamily: this.refs.editorFontFamily.value,
|
||||
indentType: this.refs.editorIndentType.value,
|
||||
indentSize: this.refs.editorIndentSize.value,
|
||||
switchPreview: this.refs.editorSwitchPreview.value
|
||||
switchPreview: this.refs.editorSwitchPreview.value,
|
||||
keyMap: this.refs.editorKeyMap.value
|
||||
}
|
||||
config.preview = {
|
||||
fontSize: this.refs.previewFontSize.value,
|
||||
@@ -181,6 +179,23 @@ class UiTab extends React.Component {
|
||||
</select>
|
||||
</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-section'>
|
||||
<div styleName='group-section-label'>
|
||||
|
||||
@@ -43,7 +43,7 @@ class Preferences extends React.Component {
|
||||
|
||||
switch (this.state.currentTab) {
|
||||
case 'INFO':
|
||||
return <InfoTab/>
|
||||
return <InfoTab />
|
||||
case 'HOTKEY':
|
||||
return (
|
||||
<HotkeyTab
|
||||
@@ -86,9 +86,9 @@ class Preferences extends React.Component {
|
||||
|
||||
let tabs = [
|
||||
{target: 'STORAGES', label: 'Storages'},
|
||||
{target: 'HOTKEY', label: 'Hotkey'},
|
||||
{target: 'UI', label: 'UI'},
|
||||
{target: 'INFO', label: 'Info'}
|
||||
{target: 'HOTKEY', label: 'Hotkey'},
|
||||
{target: 'UI', label: 'UI'},
|
||||
{target: 'INFO', label: 'Info'}
|
||||
]
|
||||
|
||||
let navButtons = tabs.map((tab) => {
|
||||
|
||||
@@ -29,11 +29,6 @@ $ npm run hot
|
||||
```
|
||||
> 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.
|
||||
|
||||
> ### Notice
|
||||
|
||||
10
gruntfile.js
10
gruntfile.js
@@ -5,16 +5,16 @@ const packager = require('electron-packager')
|
||||
const WIN = process.platform === 'win32'
|
||||
|
||||
module.exports = function (grunt) {
|
||||
var auth_code
|
||||
var authCode
|
||||
try {
|
||||
auth_code = grunt.file.readJSON('secret/auth_code.json')
|
||||
authCode = grunt.file.readJSON('secret/auth_code.json')
|
||||
} catch (e) {
|
||||
if (e.origError.code === 'ENOENT') {
|
||||
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 WIN_CERT_PASSWORD = auth_code != null ? auth_code.WIN_CERT_PASSWORD : ''
|
||||
const OSX_COMMON_NAME = authCode != null ? authCode.OSX_COMMON_NAME : ''
|
||||
const WIN_CERT_PASSWORD = authCode != null ? authCode.WIN_CERT_PASSWORD : ''
|
||||
|
||||
var initConfig = {
|
||||
pkg: grunt.file.readJSON('package.json'),
|
||||
@@ -98,7 +98,7 @@ module.exports = function (grunt) {
|
||||
prune: true,
|
||||
overwrite: true,
|
||||
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) {
|
||||
case 'win':
|
||||
|
||||
@@ -1,19 +1,10 @@
|
||||
const electron = require('electron')
|
||||
const app = electron.app
|
||||
const Menu = electron.Menu
|
||||
|
||||
var finderWindow = null
|
||||
|
||||
app.on('ready', function () {
|
||||
if (process.platform === 'darwin') {
|
||||
app.dock.hide()
|
||||
}
|
||||
|
||||
// var template = require('./finder-menu')
|
||||
// var menu = Menu.buildFromTemplate(template)
|
||||
// Menu.setApplicationMenu(menu)
|
||||
|
||||
finderWindow = require('./finder-window')
|
||||
})
|
||||
|
||||
module.exports = app
|
||||
|
||||
@@ -31,16 +31,17 @@
|
||||
<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/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="../compiled/raphael.js"></script>
|
||||
<script src="../compiled/flowchart.js"></script>
|
||||
<script src="../node_modules/raphael/raphael.min.js"></script>
|
||||
<script src="../node_modules/flowchart.js/release/flowchart.min.js"></script>
|
||||
|
||||
<script src="../compiled/katex.js"></script>
|
||||
<script src="../compiled/react.js"></script>
|
||||
<script src="../compiled/react-dom.js"></script>
|
||||
<script src="../compiled/redux.js"></script>
|
||||
<script src="../compiled/react-redux.js"></script>
|
||||
<script src="../node_modules/katex/dist/katex.min.js"></script>
|
||||
<script src="../node_modules/react/dist/react.min.js"></script>
|
||||
<script src="../node_modules/react-dom/dist/react-dom.min.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>
|
||||
window._ = require('lodash');
|
||||
</script>
|
||||
|
||||
@@ -2,7 +2,6 @@ const electron = require('electron')
|
||||
const app = electron.app
|
||||
const Menu = electron.Menu
|
||||
const ipc = electron.ipcMain
|
||||
const autoUpdater = electron.autoUpdater
|
||||
const path = require('path')
|
||||
const ChildProcess = require('child_process')
|
||||
const _ = require('lodash')
|
||||
@@ -11,9 +10,8 @@ const GhReleases = require('electron-gh-releases')
|
||||
var ipcServer = null
|
||||
|
||||
var mainWindow = null
|
||||
var finderWindow = null
|
||||
|
||||
var shouldQuit = app.makeSingleInstance(function(commandLine, workingDirectory) {
|
||||
var shouldQuit = app.makeSingleInstance(function (commandLine, workingDirectory) {
|
||||
if (mainWindow) {
|
||||
if (process.platform === 'win32') {
|
||||
mainWindow.minimize()
|
||||
@@ -26,12 +24,8 @@ var shouldQuit = app.makeSingleInstance(function(commandLine, workingDirectory)
|
||||
|
||||
if (shouldQuit) {
|
||||
app.quit()
|
||||
return
|
||||
}
|
||||
|
||||
var version = app.getVersion()
|
||||
var versionText = (version == null || version.length === 0) ? 'DEV version' : 'v' + version
|
||||
|
||||
var isUpdateReady = false
|
||||
|
||||
var ghReleasesOpts = {
|
||||
@@ -108,14 +102,9 @@ app.on('ready', function () {
|
||||
Menu.setApplicationMenu(menu)
|
||||
break
|
||||
case 'win32':
|
||||
finderWindow = require('./finder-window')
|
||||
mainWindow.setMenu(menu)
|
||||
break
|
||||
case 'linux':
|
||||
// Finder is available on cinnamon only.
|
||||
if (process.env.DESKTOP_SESSION === 'cinnamon') {
|
||||
finderWindow = require('./finder-window')
|
||||
}
|
||||
Menu.setApplicationMenu(menu)
|
||||
mainWindow.setMenu(menu)
|
||||
}
|
||||
|
||||
@@ -169,7 +169,7 @@ var help = {
|
||||
submenu: [
|
||||
{
|
||||
label: 'Boostnote official site',
|
||||
click: function () { shell.openExternal('https://b00st.io/') }
|
||||
click: function () { shell.openExternal('https://boostnote.io/') }
|
||||
},
|
||||
{
|
||||
label: 'Issue Tracker',
|
||||
|
||||
@@ -2,12 +2,15 @@ const electron = require('electron')
|
||||
const app = electron.app
|
||||
const BrowserWindow = electron.BrowserWindow
|
||||
const path = require('path')
|
||||
const Config = require('electron-config')
|
||||
const config = new Config()
|
||||
|
||||
var showMenu = process.platform !== 'win32'
|
||||
let windowSize = config.get('windowsize') || { width: 1080, height: 720 }
|
||||
|
||||
var mainWindow = new BrowserWindow({
|
||||
width: 1080,
|
||||
height: 720,
|
||||
let mainWindow = new BrowserWindow({
|
||||
width: windowSize.width,
|
||||
height: windowSize.height,
|
||||
minWidth: 500,
|
||||
minHeight: 320,
|
||||
autoHideMenuBar: showMenu,
|
||||
@@ -46,6 +49,7 @@ if (process.platform !== 'linux' || process.env.DESKTOP_SESSION === 'cinnamon')
|
||||
})
|
||||
|
||||
app.on('before-quit', function (e) {
|
||||
config.set('windowsize', mainWindow.getBounds())
|
||||
mainWindow.removeAllListeners()
|
||||
})
|
||||
} else {
|
||||
|
||||
@@ -57,22 +57,23 @@
|
||||
<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/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/edit/continuelist.js"></script>
|
||||
|
||||
<script src="../compiled/raphael.js"></script>
|
||||
<script src="../compiled/flowchart.js"></script>
|
||||
<script src="../node_modules/raphael/raphael.min.js"></script>
|
||||
<script src="../node_modules/flowchart.js/release/flowchart.min.js"></script>
|
||||
<script>
|
||||
window._ = require('lodash')
|
||||
</script>
|
||||
<script src="../node_modules/js-sequence-diagrams/fucknpm/sequence-diagram-min.js"></script>
|
||||
|
||||
<script src="../compiled/katex.js"></script>
|
||||
<script src="../compiled/react.js"></script>
|
||||
<script src="../compiled/react-dom.js"></script>
|
||||
<script src="../compiled/redux.js"></script>
|
||||
<script src="../compiled/react-redux.js"></script>
|
||||
<script src="../node_modules/js-sequence-diagrams/fucknpm/sequence-diagram-min.js"></script>
|
||||
<script src="../node_modules/katex/dist/katex.min.js"></script>
|
||||
<script src="../node_modules/react/dist/react.min.js"></script>
|
||||
<script src="../node_modules/react-dom/dist/react-dom.min.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'>
|
||||
const electron = require('electron')
|
||||
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",
|
||||
"version": "0.8.0",
|
||||
"version": "0.8.1",
|
||||
"description": "Boostnote",
|
||||
"main": "index.js",
|
||||
"license": "GPL-3.0",
|
||||
@@ -8,10 +8,10 @@
|
||||
"start": "electron ./index.js",
|
||||
"hot": "electron ./index.js --hot",
|
||||
"webpack": "webpack-dev-server --hot --inline --config webpack.config.js",
|
||||
"postinstall": "npm run vendor",
|
||||
"vendor": "oh-my-cdn",
|
||||
"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": {
|
||||
"electron-version": "1.2.8"
|
||||
@@ -44,15 +44,18 @@
|
||||
"bugs": {
|
||||
"url": "https://github.com/BoostIO/Boostnote/issues"
|
||||
},
|
||||
"homepage": "https://b00st.io",
|
||||
"homepage": "https://boostnote.io",
|
||||
"dependencies": {
|
||||
"@rokt33r/markdown-it-math": "^4.0.1",
|
||||
"@rokt33r/season": "^5.3.0",
|
||||
"codemirror": "^5.19.0",
|
||||
"electron-config": "^0.2.1",
|
||||
"electron-gh-releases": "^2.0.2",
|
||||
"flowchart.js": "^1.6.5",
|
||||
"font-awesome": "^4.3.0",
|
||||
"immutable": "^3.8.1",
|
||||
"js-sequence-diagrams": "^1000000.0.6",
|
||||
"katex": "^0.6.0",
|
||||
"lodash": "^4.11.1",
|
||||
"markdown-it": "^6.0.1",
|
||||
"markdown-it-checkbox": "^1.1.0",
|
||||
@@ -62,6 +65,11 @@
|
||||
"mixpanel": "^0.4.1",
|
||||
"moment": "^2.10.3",
|
||||
"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",
|
||||
"superagent": "^1.2.0",
|
||||
"superagent-promise": "^1.0.3"
|
||||
@@ -81,6 +89,9 @@
|
||||
"dom-storage": "^2.0.2",
|
||||
"electron-packager": "^6.0.0",
|
||||
"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",
|
||||
"grunt": "^0.4.5",
|
||||
"grunt-electron-installer": "^1.2.0",
|
||||
@@ -88,7 +99,6 @@
|
||||
"jsdom": "^9.4.2",
|
||||
"merge-stream": "^1.0.0",
|
||||
"nib": "^1.1.0",
|
||||
"oh-my-cdn": "^0.1.1",
|
||||
"react": "^15.3.0",
|
||||
"react-color": "^2.2.2",
|
||||
"react-css-modules": "^3.7.6",
|
||||
@@ -107,14 +117,9 @@
|
||||
"grunt-electron-installer-debian": "^0.2.0"
|
||||
},
|
||||
"optional": false,
|
||||
"standard": {
|
||||
"globals": [
|
||||
"localStorage"
|
||||
]
|
||||
},
|
||||
"ava": {
|
||||
"files": [
|
||||
"tests/**/*.js"
|
||||
"tests/**/*-test.js"
|
||||
],
|
||||
"require": [
|
||||
"babel-register"
|
||||
|
||||
41
readme-ja.md
41
readme-ja.md
@@ -1,36 +1,28 @@
|
||||
# Boostnote
|
||||
|
||||
> [Boostnote store](https://boostnote.paintory.com/)をはじめました!! :tada: そして、[Pateron](https://www.patreon.com/boostnote)からも私達を支援することができます!
|
||||
> [Boostnote shop](https://boostnote.paintory.com/)をはじめました!! :tada:
|
||||
そして、[Pateron](https://www.patreon.com/boostnote)からも私達を支援することができます!
|
||||
|
||||

|
||||
|
||||
オープンソースノートアプリ
|
||||
|
||||
次の用務がある場合にはIssue trackerを利用してください。
|
||||
**ロードマップ・リクエスト一覧は[こちら](https://github.com/BoostIO/Boostnote/wiki/List-of-the-requested-features)です!**
|
||||
皆さんからのプルリクをお待ちしています!
|
||||
|
||||
以下のような場合には、Issue trackerを利用してください。
|
||||
- Boostnoteに関して質問したい時
|
||||
- Boostnoteや計画事項にフィードバックがしたい時
|
||||
- Boostnoteにバグを報告したい時
|
||||
- Boostnoteに寄与したい時
|
||||
|
||||
|
||||
## Goal
|
||||
|
||||
単に何かを書くのが楽しくなってほしいです。 :grinning:
|
||||
書くことが楽しくなって欲しいです。 :grinning:
|
||||
|
||||
- ターゲット OS : OSX, Windows, Linux(後々はモバイルも!)
|
||||
- Cloud : Google drive, Dropbox, One drive, iCloud...
|
||||
- オープンソースで残ること!
|
||||
|
||||
## 印象を受けたアプリ/サービス
|
||||
|
||||
- Atom
|
||||
- Quiver
|
||||
- Evernote
|
||||
- GitKraken
|
||||
- GitBook
|
||||
- Gist
|
||||
- Gistbox
|
||||
- Snippets Lab
|
||||
|
||||
|
||||
## Using stack
|
||||
|
||||
@@ -50,12 +42,12 @@
|
||||
|
||||
## Goods
|
||||
|
||||
<img src="https://b00st.io/images/t3.png" width="250"/>
|
||||
<img src="https://b00st.io/images/t1.png" width="250"/>
|
||||
<img src="https://boostnote.io/images/t3.png" width="250"/>
|
||||
<img src="https://boostnote.io/images/t1.png" width="250"/>
|
||||
|
||||
[Boostnote store](https://boostnote.paintory.com/)から幾つかのグッズを販売しています。
|
||||
[Boostnote shop](https://boostnote.paintory.com/)から幾つかのグッズを販売しています。
|
||||
|
||||
商品は全世界何処でも届けることができます。このストアは[Paintory](https://paintory.com/)から提供されます。
|
||||
商品は全世界どこへでも届ける事が出来ます!
|
||||
|
||||
## Donation
|
||||
|
||||
@@ -63,11 +55,13 @@
|
||||
|
||||
## 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)
|
||||
- [Kazu Yokomizo](https://github.com/kazup01)
|
||||
|
||||
## Contributors
|
||||
|
||||
- [Kazu Yokomizo](https://github.com/kazup01)
|
||||
- [dojineko](https://github.com/dojineko)
|
||||
- [Romain Bazile](https://github.com/gromain)
|
||||
- [Bruno Paz](https://github.com/brpaz)
|
||||
@@ -75,10 +69,9 @@
|
||||
- [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.
|
||||
Copyright (C) 2017 Maisin&Co.
|
||||
|
||||
[GPL v3](./LICENSE).
|
||||
|
||||
@@ -51,8 +51,8 @@
|
||||
|
||||
## Goods
|
||||
|
||||
<img src="https://b00st.io/images/t3.png" width="250"/>
|
||||
<img src="https://b00st.io/images/t1.png" width="250"/>
|
||||
<img src="https://boostnote.io/images/t3.png" width="250"/>
|
||||
<img src="https://boostnote.io/images/t1.png" width="250"/>
|
||||
|
||||
[Boostnote store](https://boostnote.paintory.com/)에서 몇가지 상품들을 팔고있습니다.
|
||||
|
||||
|
||||
70
readme.md
70
readme.md
@@ -5,68 +5,32 @@
|
||||
<br>
|
||||
<br>
|
||||
</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">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)
|
||||
|
||||
## 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)
|
||||
[](https://travis-ci.org/BoostIO/Boostnote)
|
||||
|
||||
## 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)
|
||||
- [Kazu Yokomizo](https://github.com/kazup01)
|
||||
|
||||
## 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)
|
||||
[Great contributors](https://github.com/BoostIO/Boostnote/graphs/contributors) :tada:
|
||||
|
||||
## Copyright & License
|
||||
Copyright (C) 2016 MAISIN&CO.
|
||||
|
||||
## More Information
|
||||
* Website: http://boostnote.io/
|
||||
* Roadmap(upcoming features and bug fixes): https://goo.gl/Mdu44q
|
||||
* 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).
|
||||
|
||||
@@ -36,7 +36,7 @@ test.beforeEach((t) => {
|
||||
})
|
||||
|
||||
test.serial('Initialize All Storages', (t) => {
|
||||
const { v1StorageData, legacyStorageData, emptyStorageData } = t.context
|
||||
const { v1StorageData, legacyStorageData } = t.context
|
||||
return Promise.resolve()
|
||||
.then(function test () {
|
||||
return init()
|
||||
|
||||
@@ -12,7 +12,6 @@ const TestDummy = require('../fixtures/TestDummy')
|
||||
const sander = require('sander')
|
||||
const os = require('os')
|
||||
const CSON = require('@rokt33r/season')
|
||||
const faker = require('faker')
|
||||
|
||||
const storagePath = path.join(os.tmpdir(), 'test/move-note')
|
||||
const storagePath2 = path.join(os.tmpdir(), 'test/move-note2')
|
||||
Reference in New Issue
Block a user