mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-14 18:26:26 +00:00
Compare commits
12 Commits
0.4.1-beta
...
0.4.1-beta
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ee4ac7371c | ||
|
|
d5265407b9 | ||
|
|
954b3e9fc5 | ||
|
|
7d9894bef7 | ||
|
|
3b34698e8b | ||
|
|
263cb581c4 | ||
|
|
1c9cb4516c | ||
|
|
ac4ceccb4f | ||
|
|
e731b7882d | ||
|
|
84e0728ff3 | ||
|
|
666bc18e91 | ||
|
|
8f83124a0d |
@@ -89,13 +89,6 @@ module.exports = [
|
|||||||
click: function () {
|
click: function () {
|
||||||
BrowserWindow.getFocusedWindow().reload()
|
BrowserWindow.getFocusedWindow().reload()
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Toggle DevTools',
|
|
||||||
accelerator: 'Alt+Command+I',
|
|
||||||
click: function () {
|
|
||||||
BrowserWindow.getFocusedWindow().toggleDevTools()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
var autoUpdater = require('auto-updater')
|
|
||||||
var nn = require('node-notifier')
|
|
||||||
var app = require('app')
|
|
||||||
var path = require('path')
|
|
||||||
|
|
||||||
var version = app.getVersion()
|
|
||||||
var versionText = (version == null || version.length === 0) ? 'DEV version' : 'v' + version
|
|
||||||
var versionNotified = false
|
|
||||||
autoUpdater
|
|
||||||
.on('error', function (err, message) {
|
|
||||||
console.error(err)
|
|
||||||
console.error(message)
|
|
||||||
console.log(path.resolve(__dirname, '../resources/favicon-230x230.png'))
|
|
||||||
nn.notify({
|
|
||||||
title: 'Error! ' + versionText,
|
|
||||||
icon: path.resolve(__dirname, '../resources/favicon-230x230.png'),
|
|
||||||
message: message
|
|
||||||
})
|
|
||||||
})
|
|
||||||
// .on('checking-for-update', function () {
|
|
||||||
// // Connecting
|
|
||||||
// console.log('checking...')
|
|
||||||
// })
|
|
||||||
.on('update-available', function () {
|
|
||||||
nn.notify({
|
|
||||||
title: 'Update is available!! ' + versionText,
|
|
||||||
icon: path.resolve(__dirname, '../resources/favicon-230x230.png'),
|
|
||||||
message: 'Download started.. wait for the update ready.'
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.on('update-not-available', function () {
|
|
||||||
if (!versionNotified) {
|
|
||||||
nn.notify({
|
|
||||||
title: 'Latest Build!! ' + versionText,
|
|
||||||
icon: path.resolve(__dirname, '../resources/favicon-230x230.png'),
|
|
||||||
message: 'Hope you to enjoy our app :D'
|
|
||||||
})
|
|
||||||
versionNotified = true
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
module.exports = autoUpdater
|
|
||||||
@@ -14,10 +14,8 @@ import remote from 'remote'
|
|||||||
var hideFinder = remote.getGlobal('hideFinder')
|
var hideFinder = remote.getGlobal('hideFinder')
|
||||||
import clipboard from 'clipboard'
|
import clipboard from 'clipboard'
|
||||||
|
|
||||||
var notifier = require('node-notifier')
|
function notify (...args) {
|
||||||
var path = require('path')
|
return new window.Notification(...args)
|
||||||
function getIconPath () {
|
|
||||||
return path.resolve(global.__dirname, '../../resources/favicon-230x230.png')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
require('../styles/finder/index.styl')
|
require('../styles/finder/index.styl')
|
||||||
@@ -66,10 +64,8 @@ class FinderMain extends React.Component {
|
|||||||
clipboard.writeText(activeArticle.content)
|
clipboard.writeText(activeArticle.content)
|
||||||
activityRecord.emit('FINDER_COPY')
|
activityRecord.emit('FINDER_COPY')
|
||||||
|
|
||||||
notifier.notify({
|
notify('Saved to Clipboard!', {
|
||||||
icon: getIconPath(),
|
body: 'Paste it wherever you want!'
|
||||||
'title': 'Saved to Clipboard!',
|
|
||||||
'message': 'Paste it wherever you want!'
|
|
||||||
})
|
})
|
||||||
hideFinder()
|
hideFinder()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,13 @@ class HomePage extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleKeyDown (e) {
|
handleKeyDown (e) {
|
||||||
|
if (process.env.BOOST_ENV === 'development' && e.keyCode === 73 && e.metaKey && e.altKey) {
|
||||||
|
e.preventDefault()
|
||||||
|
e.stopPropagation()
|
||||||
|
require('remote').require('browser-window').getFocusedWindow().toggleDevTools()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if (isModalOpen()) {
|
if (isModalOpen()) {
|
||||||
if (e.keyCode === 27) closeModal()
|
if (e.keyCode === 27) closeModal()
|
||||||
return
|
return
|
||||||
@@ -218,42 +225,6 @@ function remap (state) {
|
|||||||
let activeArticle = _.findWhere(articles, {key: status.articleKey})
|
let activeArticle = _.findWhere(articles, {key: status.articleKey})
|
||||||
if (activeArticle == null) activeArticle = articles[0]
|
if (activeArticle == null) activeArticle = articles[0]
|
||||||
|
|
||||||
// remove Unsaved new article if user is not CREATE_MODE
|
|
||||||
if (status.mode !== CREATE_MODE) {
|
|
||||||
let targetIndex = _.findIndex(articles, article => article.status === NEW)
|
|
||||||
|
|
||||||
if (targetIndex >= 0) articles.splice(targetIndex, 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// switching CREATE_MODE
|
|
||||||
// restrict
|
|
||||||
// 1. team have one folder at least
|
|
||||||
// or Change IDLE MODE
|
|
||||||
if (status.mode === CREATE_MODE) {
|
|
||||||
let newArticle = _.findWhere(articles, {status: 'NEW'})
|
|
||||||
console.log('targetFolders')
|
|
||||||
let FolderKey = targetFolders.length > 0
|
|
||||||
? targetFolders[0].key
|
|
||||||
: folders[0].key
|
|
||||||
|
|
||||||
if (newArticle == null) {
|
|
||||||
newArticle = {
|
|
||||||
id: null,
|
|
||||||
key: keygen(),
|
|
||||||
title: '',
|
|
||||||
content: '',
|
|
||||||
mode: 'markdown',
|
|
||||||
tags: [],
|
|
||||||
FolderKey: FolderKey,
|
|
||||||
status: NEW
|
|
||||||
}
|
|
||||||
articles.unshift(newArticle)
|
|
||||||
}
|
|
||||||
activeArticle = newArticle
|
|
||||||
} else if (status.mode === CREATE_MODE) {
|
|
||||||
status.mode = IDLE_MODE
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
folders,
|
folders,
|
||||||
status,
|
status,
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import MarkdownPreview from 'boost/components/MarkdownPreview'
|
|||||||
import CodeEditor from 'boost/components/CodeEditor'
|
import CodeEditor from 'boost/components/CodeEditor'
|
||||||
import {
|
import {
|
||||||
IDLE_MODE,
|
IDLE_MODE,
|
||||||
CREATE_MODE,
|
|
||||||
EDIT_MODE,
|
EDIT_MODE,
|
||||||
switchMode,
|
switchMode,
|
||||||
switchArticle,
|
switchArticle,
|
||||||
@@ -15,6 +14,7 @@ import {
|
|||||||
clearSearch,
|
clearSearch,
|
||||||
lockStatus,
|
lockStatus,
|
||||||
unlockStatus,
|
unlockStatus,
|
||||||
|
clearNewArticle,
|
||||||
updateArticle,
|
updateArticle,
|
||||||
destroyArticle,
|
destroyArticle,
|
||||||
NEW
|
NEW
|
||||||
@@ -114,7 +114,7 @@ export default class ArticleDetail extends React.Component {
|
|||||||
|
|
||||||
componentDidUpdate (prevProps) {
|
componentDidUpdate (prevProps) {
|
||||||
let isModeChanged = prevProps.status.mode !== this.props.status.mode
|
let isModeChanged = prevProps.status.mode !== this.props.status.mode
|
||||||
if (isModeChanged && this.props.status.mode !== IDLE_MODE) {
|
if (isModeChanged && this.props.status.mode === EDIT_MODE) {
|
||||||
ReactDOM.findDOMNode(this.refs.title).focus()
|
ReactDOM.findDOMNode(this.refs.title).focus()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -124,6 +124,7 @@ export default class ArticleDetail extends React.Component {
|
|||||||
|
|
||||||
let isArticleChanged = nextProps.activeArticle != null && (nextProps.activeArticle.key !== this.state.article.key)
|
let isArticleChanged = nextProps.activeArticle != null && (nextProps.activeArticle.key !== this.state.article.key)
|
||||||
let isModeChanged = nextProps.status.mode !== this.props.status.mode
|
let isModeChanged = nextProps.status.mode !== this.props.status.mode
|
||||||
|
|
||||||
// Reset article input
|
// Reset article input
|
||||||
if (isArticleChanged || (isModeChanged && nextProps.status.mode !== IDLE_MODE)) {
|
if (isArticleChanged || (isModeChanged && nextProps.status.mode !== IDLE_MODE)) {
|
||||||
Object.assign(nextState, {
|
Object.assign(nextState, {
|
||||||
@@ -248,12 +249,15 @@ export default class ArticleDetail extends React.Component {
|
|||||||
let { activeArticle, dispatch } = this.props
|
let { activeArticle, dispatch } = this.props
|
||||||
|
|
||||||
dispatch(unlockStatus())
|
dispatch(unlockStatus())
|
||||||
if (activeArticle.status === NEW) dispatch(switchArticle(null))
|
if (activeArticle.status === NEW) {
|
||||||
|
dispatch(clearNewArticle())
|
||||||
|
dispatch(switchArticle(null))
|
||||||
|
}
|
||||||
dispatch(switchMode(IDLE_MODE))
|
dispatch(switchMode(IDLE_MODE))
|
||||||
}
|
}
|
||||||
|
|
||||||
handleSaveButtonClick (e) {
|
handleSaveButtonClick (e) {
|
||||||
let { dispatch, folders, filters } = this.props
|
let { dispatch, folders, status } = this.props
|
||||||
let article = this.state.article
|
let article = this.state.article
|
||||||
let newArticle = Object.assign({}, article)
|
let newArticle = Object.assign({}, article)
|
||||||
|
|
||||||
@@ -277,7 +281,7 @@ export default class ArticleDetail extends React.Component {
|
|||||||
// Searchを初期化し、更新先のFolder filterをかける
|
// Searchを初期化し、更新先のFolder filterをかける
|
||||||
// かかれていない時に
|
// かかれていない時に
|
||||||
// Searchを初期化する
|
// Searchを初期化する
|
||||||
if (filters.folder.length !== 0) dispatch(switchFolder(folder.name))
|
if (status.targetFolders.length > 0) dispatch(switchFolder(folder.name))
|
||||||
else dispatch(clearSearch())
|
else dispatch(clearSearch())
|
||||||
dispatch(switchArticle(newArticle.key))
|
dispatch(switchArticle(newArticle.key))
|
||||||
}
|
}
|
||||||
@@ -319,8 +323,6 @@ export default class ArticleDetail extends React.Component {
|
|||||||
let article = this.state.article
|
let article = this.state.article
|
||||||
article.tags = tags
|
article.tags = tags
|
||||||
|
|
||||||
this.setState({article: article})
|
|
||||||
|
|
||||||
let _isTagChanged = _.difference(article.tags, this.props.activeArticle.tags).length > 0 || _.difference(this.props.activeArticle.tags, article.tags).length > 0
|
let _isTagChanged = _.difference(article.tags, this.props.activeArticle.tags).length > 0 || _.difference(this.props.activeArticle.tags, article.tags).length > 0
|
||||||
|
|
||||||
let { isTitleChanged, isContentChanged, isArticleEdited, isModeChanged } = this.state
|
let { isTitleChanged, isContentChanged, isArticleEdited, isModeChanged } = this.state
|
||||||
@@ -500,7 +502,6 @@ export default class ArticleDetail extends React.Component {
|
|||||||
if (activeArticle == null) return this.renderEmpty()
|
if (activeArticle == null) return this.renderEmpty()
|
||||||
|
|
||||||
switch (status.mode) {
|
switch (status.mode) {
|
||||||
case CREATE_MODE:
|
|
||||||
case EDIT_MODE:
|
case EDIT_MODE:
|
||||||
return this.renderEdit()
|
return this.renderEdit()
|
||||||
case IDLE_MODE:
|
case IDLE_MODE:
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import React, { PropTypes } from 'react'
|
import React, { PropTypes } from 'react'
|
||||||
import { findWhere } from 'lodash'
|
import { findWhere } from 'lodash'
|
||||||
import { setSearchFilter, switchFolder, switchMode, CREATE_MODE } from 'boost/actions'
|
import { setSearchFilter, switchFolder, switchMode, switchArticle, updateArticle, EDIT_MODE } from 'boost/actions'
|
||||||
import { openModal } from 'boost/modal'
|
import { openModal } from 'boost/modal'
|
||||||
import FolderMark from 'boost/components/FolderMark'
|
import FolderMark from 'boost/components/FolderMark'
|
||||||
import Preferences from 'boost/components/modal/Preferences'
|
import Preferences from 'boost/components/modal/Preferences'
|
||||||
import CreateNewFolder from 'boost/components/modal/CreateNewFolder'
|
import CreateNewFolder from 'boost/components/modal/CreateNewFolder'
|
||||||
|
import keygen from 'boost/keygen'
|
||||||
|
|
||||||
import remote from 'remote'
|
import remote from 'remote'
|
||||||
let userName = remote.getGlobal('process').env.USER
|
let userName = remote.getGlobal('process').env.USER
|
||||||
@@ -65,9 +66,27 @@ export default class ArticleNavigator extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleNewPostButtonClick (e) {
|
handleNewPostButtonClick (e) {
|
||||||
let { dispatch } = this.props
|
let { dispatch, folders, status } = this.props
|
||||||
|
let { targetFolders } = status
|
||||||
|
|
||||||
dispatch(switchMode(CREATE_MODE))
|
let FolderKey = targetFolders.length > 0
|
||||||
|
? targetFolders[0].key
|
||||||
|
: folders[0].key
|
||||||
|
|
||||||
|
let newArticle = {
|
||||||
|
id: null,
|
||||||
|
key: keygen(),
|
||||||
|
title: '',
|
||||||
|
content: '',
|
||||||
|
mode: 'markdown',
|
||||||
|
tags: [],
|
||||||
|
FolderKey: FolderKey,
|
||||||
|
status: 'NEW'
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(updateArticle(newArticle))
|
||||||
|
dispatch(switchArticle(newArticle.key, true))
|
||||||
|
dispatch(switchMode(EDIT_MODE))
|
||||||
}
|
}
|
||||||
|
|
||||||
handleNewFolderButton (e) {
|
handleNewFolderButton (e) {
|
||||||
@@ -94,7 +113,7 @@ export default class ArticleNavigator extends React.Component {
|
|||||||
|
|
||||||
let folderElememts = folders.map((folder, index) => {
|
let folderElememts = folders.map((folder, index) => {
|
||||||
let isActive = findWhere(targetFolders, {key: folder.key})
|
let isActive = findWhere(targetFolders, {key: folder.key})
|
||||||
let articleCount = allArticles.filter(article => article.FolderKey === folder.key).length
|
let articleCount = allArticles.filter(article => article.FolderKey === folder.key && article.status !== 'NEW').length
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<button onClick={e => this.handleFolderButtonClick(folder.name)(e)} key={'folder-' + folder.key} className={isActive ? 'active' : ''}>
|
<button onClick={e => this.handleFolderButtonClick(folder.name)(e)} key={'folder-' + folder.key} className={isActive ? 'active' : ''}>
|
||||||
|
|||||||
@@ -18,6 +18,16 @@ window.addEventListener('online', function () {
|
|||||||
ipc.send('check-update', 'check-update')
|
ipc.send('check-update', 'check-update')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
function notify (...args) {
|
||||||
|
return new window.Notification(...args)
|
||||||
|
}
|
||||||
|
|
||||||
|
ipc.on('notify', function (title, message) {
|
||||||
|
notify(title, {
|
||||||
|
body: message
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
let routes = (
|
let routes = (
|
||||||
<Route path='/' component={MainPage}>
|
<Route path='/' component={MainPage}>
|
||||||
<IndexRoute name='home' component={HomePage}/>
|
<IndexRoute name='home' component={HomePage}/>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
// Action types
|
// Action types
|
||||||
|
export const CLEAR_NEW_ARTICLE = 'CLEAR_NEW_ARTICLE'
|
||||||
export const ARTICLE_UPDATE = 'ARTICLE_UPDATE'
|
export const ARTICLE_UPDATE = 'ARTICLE_UPDATE'
|
||||||
export const ARTICLE_DESTROY = 'ARTICLE_DESTROY'
|
export const ARTICLE_DESTROY = 'ARTICLE_DESTROY'
|
||||||
export const FOLDER_CREATE = 'FOLDER_CREATE'
|
export const FOLDER_CREATE = 'FOLDER_CREATE'
|
||||||
@@ -18,13 +19,18 @@ export const TOGGLE_TUTORIAL = 'TOGGLE_TUTORIAL'
|
|||||||
|
|
||||||
// Status - mode
|
// Status - mode
|
||||||
export const IDLE_MODE = 'IDLE_MODE'
|
export const IDLE_MODE = 'IDLE_MODE'
|
||||||
export const CREATE_MODE = 'CREATE_MODE'
|
|
||||||
export const EDIT_MODE = 'EDIT_MODE'
|
export const EDIT_MODE = 'EDIT_MODE'
|
||||||
|
|
||||||
// Article status
|
// Article status
|
||||||
export const NEW = 'NEW'
|
export const NEW = 'NEW'
|
||||||
|
|
||||||
// DB
|
// DB
|
||||||
|
export function clearNewArticle () {
|
||||||
|
return {
|
||||||
|
type: CLEAR_NEW_ARTICLE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function updateArticle (article) {
|
export function updateArticle (article) {
|
||||||
return {
|
return {
|
||||||
type: ARTICLE_UPDATE,
|
type: ARTICLE_UPDATE,
|
||||||
@@ -84,10 +90,13 @@ export function switchMode (mode) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function switchArticle (articleKey) {
|
export function switchArticle (articleKey, isNew) {
|
||||||
return {
|
return {
|
||||||
type: SWITCH_ARTICLE,
|
type: SWITCH_ARTICLE,
|
||||||
data: articleKey
|
data: {
|
||||||
|
key: articleKey,
|
||||||
|
isNew: isNew
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,10 @@ Post all records(except today)
|
|||||||
and remove all posted records
|
and remove all posted records
|
||||||
*/
|
*/
|
||||||
export function postRecords (data) {
|
export function postRecords (data) {
|
||||||
|
if (process.env.BOOST_ENV === 'development') {
|
||||||
|
console.log('post failed - on development')
|
||||||
|
return
|
||||||
|
}
|
||||||
let records = getAllRecords()
|
let records = getAllRecords()
|
||||||
records = records.filter(record => {
|
records = records.filter(record => {
|
||||||
return !isSameDate(new Date(), record.date)
|
return !isSameDate(new Date(), record.date)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import React, { PropTypes } from 'react'
|
import React, { PropTypes } from 'react'
|
||||||
import store from 'boost/store'
|
import store from 'boost/store'
|
||||||
import { unlockStatus } from 'boost/actions'
|
import { unlockStatus, clearNewArticle } from 'boost/actions'
|
||||||
|
|
||||||
export default class EditedAlert extends React.Component {
|
export default class EditedAlert extends React.Component {
|
||||||
handleNoButtonClick (e) {
|
handleNoButtonClick (e) {
|
||||||
@@ -10,6 +10,7 @@ export default class EditedAlert extends React.Component {
|
|||||||
handleYesButtonClick (e) {
|
handleYesButtonClick (e) {
|
||||||
store.dispatch(unlockStatus())
|
store.dispatch(unlockStatus())
|
||||||
store.dispatch(this.props.action)
|
store.dispatch(this.props.action)
|
||||||
|
store.dispatch(clearNewArticle())
|
||||||
this.props.close()
|
this.props.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import keygen from 'boost/keygen'
|
import keygen from 'boost/keygen'
|
||||||
|
|
||||||
let defaultContent = 'Boost is a brand new note App for programmers.\n\n> 下に日本語版があります。\n\n# \u25CEfeature\n\nBoost has some preponderant functions for efficient engineer\'s task.See some part of it.\n\n1. classify information by\u300CFolders\u300D\n2. deal with great variety of syntax\n3. Finder function\n\n\uFF0A\u3000\uFF0A\u3000\uFF0A\u3000\uFF0A\n\n# 1. classify information by \u300CFolders\u300D- access the information you needed easily.\n\n\u300CFolders\u300D which on the left side bar. Press plus button now. flexible way of classification.\n- Create Folder every language or flamework\n- Make Folder for your own casual memos\n\n# 2. Deal with a great variety of syntax \u2013 instead of your brain\nSave handy all information related with programming\n- Use markdown and gather api specification\n- Well using module and snippet\n\nSave them on Boost, you don\'t need to rewrite or re-search same code again.\n\n# 3. Load Finder function \u2013 now you don\'t need to spell command by hand typing.\n\n**Shift +cmd+tab** press buttons at same time.\nThen, the window will show up for search Boost contents that instant.\n\nUsing cursor key to chose, press enter, cmd+v to paste and\u2026 please check it out by your own eye.\n\n- Such command spl or linux which programmers often use but troublesome to hand type\n\n- (Phrases commonly used for e-mail or customer support)\n\nWe support preponderant efficiency\n\n\uFF0A\u3000\uFF0A\u3000\uFF0A\u3000\uFF0A\n\n## \u25CEfor more information\nFrequently updated with this blog ( http:\/\/blog-jp.b00st.io )\n\nHave wonderful programmer life!\n\n## Hack your memory**\n\n\n\n# 日本語版\n\n**Boost**は全く新しいエンジニアライクのノートアプリです。\n\n# ◎特徴\nBoostはエンジニアの仕事を圧倒的に効率化するいくつかの機能を備えています。\nその一部をご紹介します。\n1. Folderで情報を分類\n2. 豊富なsyantaxに対応\n3. Finder機能\n4. チーム機能(リアルタイム搭載)\n\n* * * *\n\n# 1. Folderで情報を分類、欲しい情報にすぐアクセス。\n左側のバーに存在する「Folders」。\n今すぐプラスボタンを押しましょう。\n分類の仕方も自由自在です。\n- 言語やフレームワークごとにFolderを作成\n- 自分用のカジュアルなメモをまとめる場としてFolderを作成\n\n\n# 2. 豊富なsyntaxに対応、自分の脳の代わりに。\nプログラミングに関する情報を全て、手軽に保存しましょう。\n- mdで、apiの仕様をまとめる\n- よく使うモジュールやスニペット\n\nBoostに保存しておくことで、何度も同じコードを書いたり調べたりする必要がなくなります。\n\n# 3. Finder機能を搭載、もうコマンドを手打ちする必要はありません。\n**「shift+cmd+tab」** を同時に押してみてください。\nここでは、一瞬でBoostの中身を検索するウィンドウを表示させることができます。\n\n矢印キーで選択、Enterを押し、cmd+vでペーストすると…続きはご自身の目でお確かめください。\n- sqlやlinux等の、よく使うが手打ちが面倒なコマンド\n- (メールやカスタマーサポート等でよく使うフレーズ)\n\n私たちは、圧倒的な効率性を支援します。\n\* * * *\n\n\n## ◎詳しくは\nこちらのブログ( http://blog-jp.b00st.io )にて随時更新しています。\n\nそれでは素晴らしいエンジニアライフを!\n\n## Hack your memory**'
|
let defaultContent = 'Boost is a brand new note App for programmers.\n\n> 下に日本語版があります。\n\n# \u25CEfeature\n\nBoost has some preponderant functions for efficient engineer\'s task.See some part of it.\n\n1. classify information by\u300CFolders\u300D\n2. deal with great variety of syntax\n3. Finder function\n\n\uFF0A\u3000\uFF0A\u3000\uFF0A\u3000\uFF0A\n\n# 1. classify information by \u300CFolders\u300D- access the information you needed easily.\n\n\u300CFolders\u300D which on the left side bar. Press plus button now. flexible way of classification.\n- Create Folder every language or flamework\n- Make Folder for your own casual memos\n\n# 2. Deal with a great variety of syntax \u2013 instead of your brain\nSave handy all information related with programming\n- Use markdown and gather api specification\n- Well using module and snippet\n\nSave them on Boost, you don\'t need to rewrite or re-search same code again.\n\n# 3. Load Finder function \u2013 now you don\'t need to spell command by hand typing.\n\n**Shift +ctrl+tab** press buttons at same time.\nThen, the window will show up for search Boost contents that instant.\n\nUsing cursor key to chose, press enter, cmd+v to paste and\u2026 please check it out by your own eye.\n\n- Such command spl or linux which programmers often use but troublesome to hand type\n\n- (Phrases commonly used for e-mail or customer support)\n\nWe support preponderant efficiency\n\n\uFF0A\u3000\uFF0A\u3000\uFF0A\u3000\uFF0A\n\n## \u25CEfor more information\nFrequently updated with this blog ( http:\/\/blog-jp.b00st.io )\n\nHave wonderful programmer life!\n\n## Hack your memory**\n\n\n\n# 日本語版\n\n**Boost**は全く新しいエンジニアライクのノートアプリです。\n\n# ◎特徴\nBoostはエンジニアの仕事を圧倒的に効率化するいくつかの機能を備えています。\nその一部をご紹介します。\n1. Folderで情報を分類\n2. 豊富なsyantaxに対応\n3. Finder機能\n\n\n* * * *\n\n# 1. Folderで情報を分類、欲しい情報にすぐアクセス。\n左側のバーに存在する「Folders」。\n今すぐプラスボタンを押しましょう。\n分類の仕方も自由自在です。\n- 言語やフレームワークごとにFolderを作成\n- 自分用のカジュアルなメモをまとめる場としてFolderを作成\n\n\n# 2. 豊富なsyntaxに対応、自分の脳の代わりに。\nプログラミングに関する情報を全て、手軽に保存しましょう。\n- mdで、apiの仕様をまとめる\n- よく使うモジュールやスニペット\n\nBoostに保存しておくことで、何度も同じコードを書いたり調べたりする必要がなくなります。\n\n# 3. Finder機能を搭載、もうコマンドを手打ちする必要はありません。\n**「shift+ctrl+tab」** を同時に押してみてください。\nここでは、一瞬でBoostの中身を検索するウィンドウを表示させることができます。\n\n矢印キーで選択、Enterを押し、cmd+vでペーストすると…続きはご自身の目でお確かめください。\n- sqlやlinux等の、よく使うが手打ちが面倒なコマンド\n- (メールやカスタマーサポート等でよく使うフレーズ)\n\n私たちは、圧倒的な効率性を支援します。\n\* * * *\n\n\n## ◎詳しくは\nこちらのブログ( http://blog-jp.b00st.io )にて随時更新しています。\n\nそれでは素晴らしいエンジニアライフを!\n\n## Hack your memory**'
|
||||||
|
|
||||||
export function init () {
|
export function init () {
|
||||||
console.log('initialize data store')
|
console.log('initialize data store')
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import {
|
|||||||
// Article action type
|
// Article action type
|
||||||
ARTICLE_UPDATE,
|
ARTICLE_UPDATE,
|
||||||
ARTICLE_DESTROY,
|
ARTICLE_DESTROY,
|
||||||
|
CLEAR_NEW_ARTICLE,
|
||||||
|
|
||||||
// Folder action type
|
// Folder action type
|
||||||
FOLDER_CREATE,
|
FOLDER_CREATE,
|
||||||
@@ -23,8 +24,7 @@ import {
|
|||||||
FOLDER_REPLACE,
|
FOLDER_REPLACE,
|
||||||
|
|
||||||
// view mode
|
// view mode
|
||||||
IDLE_MODE,
|
IDLE_MODE
|
||||||
CREATE_MODE
|
|
||||||
} from './actions'
|
} from './actions'
|
||||||
import dataStore from 'boost/dataStore'
|
import dataStore from 'boost/dataStore'
|
||||||
import keygen from 'boost/keygen'
|
import keygen from 'boost/keygen'
|
||||||
@@ -43,6 +43,9 @@ let data = dataStore.getData()
|
|||||||
let initialArticles = data.articles
|
let initialArticles = data.articles
|
||||||
let initialFolders = data.folders
|
let initialFolders = data.folders
|
||||||
|
|
||||||
|
let isStatusLocked = false
|
||||||
|
let isCreatingNew = false
|
||||||
|
|
||||||
function folders (state = initialFolders, action) {
|
function folders (state = initialFolders, action) {
|
||||||
state = state.slice()
|
state = state.slice()
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
@@ -121,10 +124,41 @@ function folders (state = initialFolders, action) {
|
|||||||
return state
|
return state
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let isCleaned = true
|
||||||
function articles (state = initialArticles, action) {
|
function articles (state = initialArticles, action) {
|
||||||
state = state.slice()
|
state = state.slice()
|
||||||
|
|
||||||
|
if (!isCreatingNew && !isCleaned) {
|
||||||
|
state = state.filter(article => article.status !== 'NEW')
|
||||||
|
isCleaned = true
|
||||||
|
}
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
|
case SWITCH_ARTICLE:
|
||||||
|
if (action.data.isNew) {
|
||||||
|
isCleaned = false
|
||||||
|
}
|
||||||
|
if (!isStatusLocked && !action.data.isNew) {
|
||||||
|
isCreatingNew = false
|
||||||
|
if (!isCleaned) {
|
||||||
|
state = state.filter(article => article.status !== 'NEW')
|
||||||
|
isCleaned = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return state
|
||||||
|
case SWITCH_FOLDER:
|
||||||
|
case SET_SEARCH_FILTER:
|
||||||
|
case SET_TAG_FILTER:
|
||||||
|
case CLEAR_SEARCH:
|
||||||
|
if (!isStatusLocked) {
|
||||||
|
isCreatingNew = false
|
||||||
|
if (!isCleaned) {
|
||||||
|
state = state.filter(article => article.status !== 'NEW')
|
||||||
|
isCleaned = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return state
|
||||||
|
case CLEAR_NEW_ARTICLE:
|
||||||
|
return state.filter(article => article.status !== 'NEW')
|
||||||
case ARTICLE_UPDATE:
|
case ARTICLE_UPDATE:
|
||||||
{
|
{
|
||||||
let article = action.data.article
|
let article = action.data.article
|
||||||
@@ -133,7 +167,8 @@ function articles (state = initialArticles, action) {
|
|||||||
if (targetIndex < 0) state.unshift(article)
|
if (targetIndex < 0) state.unshift(article)
|
||||||
else state.splice(targetIndex, 1, article)
|
else state.splice(targetIndex, 1, article)
|
||||||
|
|
||||||
dataStore.setArticles(null, state)
|
if (article.status !== 'NEW') dataStore.setArticles(null, state)
|
||||||
|
else isCreatingNew = true
|
||||||
return state
|
return state
|
||||||
}
|
}
|
||||||
case ARTICLE_DESTROY:
|
case ARTICLE_DESTROY:
|
||||||
@@ -162,16 +197,15 @@ function articles (state = initialArticles, action) {
|
|||||||
|
|
||||||
function status (state = initialStatus, action) {
|
function status (state = initialStatus, action) {
|
||||||
state = Object.assign({}, state)
|
state = Object.assign({}, state)
|
||||||
|
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
case TOGGLE_TUTORIAL:
|
case TOGGLE_TUTORIAL:
|
||||||
state.isTutorialOpen = !state.isTutorialOpen
|
state.isTutorialOpen = !state.isTutorialOpen
|
||||||
return state
|
return state
|
||||||
case LOCK_STATUS:
|
case LOCK_STATUS:
|
||||||
state.isStatusLocked = true
|
isStatusLocked = state.isStatusLocked = true
|
||||||
return state
|
return state
|
||||||
case UNLOCK_STATUS:
|
case UNLOCK_STATUS:
|
||||||
state.isStatusLocked = false
|
isStatusLocked = state.isStatusLocked = false
|
||||||
return state
|
return state
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,11 +222,10 @@ function status (state = initialStatus, action) {
|
|||||||
return state
|
return state
|
||||||
case SWITCH_MODE:
|
case SWITCH_MODE:
|
||||||
state.mode = action.data
|
state.mode = action.data
|
||||||
if (state.mode === CREATE_MODE) state.articleKey = null
|
|
||||||
|
|
||||||
return state
|
return state
|
||||||
case SWITCH_ARTICLE:
|
case SWITCH_ARTICLE:
|
||||||
state.articleKey = action.data
|
state.articleKey = action.data.key
|
||||||
state.mode = IDLE_MODE
|
state.mode = IDLE_MODE
|
||||||
|
|
||||||
return state
|
return state
|
||||||
|
|||||||
55
main.js
55
main.js
@@ -18,44 +18,61 @@ var update = null
|
|||||||
// if (process.platform !== 'darwin') app.quit()
|
// if (process.platform !== 'darwin') app.quit()
|
||||||
// })
|
// })
|
||||||
|
|
||||||
var version = app.getVersion()
|
var autoUpdater = require('auto-updater')
|
||||||
var versionText = (version == null || version.length === 0) ? 'DEV version' : 'v' + version
|
|
||||||
var nn = require('node-notifier')
|
|
||||||
var updater = require('./atom-lib/updater')
|
|
||||||
var path = require('path')
|
|
||||||
|
|
||||||
var appQuit = false
|
var appQuit = false
|
||||||
|
|
||||||
updater
|
var version = app.getVersion()
|
||||||
|
var versionText = (version == null || version.length === 0) ? 'DEV version' : 'v' + version
|
||||||
|
var versionNotified = false
|
||||||
|
autoUpdater
|
||||||
.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) {
|
.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) {
|
||||||
nn.notify({
|
|
||||||
title: 'Ready to Update!! ' + versionText,
|
|
||||||
icon: path.join(__dirname, '/resources/favicon-230x230.png'),
|
|
||||||
message: 'Click update button on Main window: ' + releaseName
|
|
||||||
})
|
|
||||||
update = quitAndUpdate
|
update = quitAndUpdate
|
||||||
|
|
||||||
if (mainWindow != null && !mainWindow.webContents.isLoading()) {
|
if (mainWindow != null) {
|
||||||
|
mainWindow.webContents.send('notify', 'Ready to Update! ' + releaseName, 'Click update button on Main window.')
|
||||||
mainWindow.webContents.send('update-available', 'Update available!')
|
mainWindow.webContents.send('update-available', 'Update available!')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.on('error', function (err, message) {
|
||||||
|
console.error(err)
|
||||||
|
if (mainWindow != null && !versionNotified) {
|
||||||
|
mainWindow.webContents.send('notify', 'Updater error!', message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// .on('checking-for-update', function () {
|
||||||
|
// // Connecting
|
||||||
|
// console.log('checking...')
|
||||||
|
// })
|
||||||
|
.on('update-available', function () {
|
||||||
|
if (mainWindow != null) {
|
||||||
|
mainWindow.webContents.send('notify', 'Update is available!', 'Download started.. wait for the update ready.')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.on('update-not-available', function () {
|
||||||
|
if (mainWindow != null && !versionNotified) {
|
||||||
|
versionNotified = true
|
||||||
|
mainWindow.webContents.send('notify', 'Latest Build!! ' + versionText, 'Hope you to enjoy our app :D')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
app.on('ready', function () {
|
app.on('ready', function () {
|
||||||
app.on('before-quit', function () {
|
app.on('before-quit', function () {
|
||||||
appQuit = true
|
appQuit = true
|
||||||
})
|
})
|
||||||
console.log('Version ' + version)
|
console.log('Version ' + version)
|
||||||
updater.setFeedUrl('http://orbital.b00st.io/rokt33r/boost-app/latest?version=' + version)
|
autoUpdater.setFeedUrl('http://orbital.b00st.io/rokt33r/boost-app/latest?version=' + version)
|
||||||
updater.checkForUpdates()
|
autoUpdater.checkForUpdates()
|
||||||
|
|
||||||
// menu start
|
// menu start
|
||||||
var template = require('./atom-lib/menu-template')
|
var template = require('./atom-lib/menu-template')
|
||||||
|
|
||||||
setInterval(function () {
|
setInterval(function () {
|
||||||
if (update == null) updater.checkForUpdates()
|
if (update == null) autoUpdater.checkForUpdates()
|
||||||
}, 1000 * 60 * 60 * 24)
|
}, 1000 * 60 * 60 * 24)
|
||||||
|
|
||||||
ipc.on('check-update', function (event, msg) {
|
ipc.on('check-update', function (event, msg) {
|
||||||
if (update == null) updater.checkForUpdates()
|
if (update == null) autoUpdater.checkForUpdates()
|
||||||
})
|
})
|
||||||
|
|
||||||
ipc.on('update-app', function (event, msg) {
|
ipc.on('update-app', function (event, msg) {
|
||||||
@@ -93,11 +110,13 @@ app.on('ready', function () {
|
|||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
mainWindow.hide()
|
mainWindow.hide()
|
||||||
})
|
})
|
||||||
if (update != null) {
|
|
||||||
mainWindow.webContents.on('did-finish-load', function () {
|
mainWindow.webContents.on('did-finish-load', function () {
|
||||||
|
if (update != null) {
|
||||||
mainWindow.webContents.send('update-available', 'whoooooooh!')
|
mainWindow.webContents.send('update-available', 'whoooooooh!')
|
||||||
})
|
} else {
|
||||||
|
autoUpdater.checkForUpdates()
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
|
||||||
app.on('activate-with-no-open-windows', function () {
|
app.on('activate-with-no-open-windows', function () {
|
||||||
if (mainWindow == null) return null
|
if (mainWindow == null) return null
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "boost",
|
"name": "boost",
|
||||||
"version": "0.4.1-beta.1",
|
"version": "0.4.1-beta.3",
|
||||||
"description": "Boost App",
|
"description": "Boost App",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "BOOST_ENV=development electron ./main.js",
|
"start": "BOOST_ENV=development electron ./main.js",
|
||||||
"webpack": "webpack-dev-server --hot --inline --config webpack.config.js",
|
"webpack": "webpack-dev-server --hot --inline --config webpack.config.js",
|
||||||
"compile": "NODE_ENV=production webpack --config webpack.config.production.js",
|
"compile": "NODE_ENV=production webpack --config webpack.config.production.js",
|
||||||
"build": "electron-packager ./ Boost --app-version=$npm_package_version $npm_package_config_platform $npm_package_config_version $npm_package_config_ignore --overwrite",
|
"build": "electron-packager ./ Boost --app-version=$npm_package_version $npm_package_config_platform $npm_package_config_version $npm_package_config_ignore --overwrite --asar",
|
||||||
"codesign": "codesign --verbose --deep --force --sign \"MAISIN solutions Inc.\" Boost-darwin-x64/Boost.app"
|
"codesign": "codesign --verbose --deep --force --sign \"MAISIN solutions Inc.\" Boost-darwin-x64/Boost.app"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
@@ -44,7 +44,6 @@
|
|||||||
"markdown-it": "^4.3.1",
|
"markdown-it": "^4.3.1",
|
||||||
"md5": "^2.0.0",
|
"md5": "^2.0.0",
|
||||||
"moment": "^2.10.3",
|
"moment": "^2.10.3",
|
||||||
"node-notifier": "^4.2.3",
|
|
||||||
"socket.io-client": "^1.3.6",
|
"socket.io-client": "^1.3.6",
|
||||||
"superagent": "^1.2.0",
|
"superagent": "^1.2.0",
|
||||||
"superagent-promise": "^1.0.3"
|
"superagent-promise": "^1.0.3"
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
var webpack = require('webpack')
|
var webpack = require('webpack')
|
||||||
module.exports = {
|
module.exports = {
|
||||||
devtool: 'source-map',
|
|
||||||
entry: {
|
entry: {
|
||||||
main: './browser/main/index.js',
|
main: './browser/main/index.js',
|
||||||
finder: './browser/finder/index.js'
|
finder: './browser/finder/index.js'
|
||||||
@@ -8,7 +7,7 @@ module.exports = {
|
|||||||
output: {
|
output: {
|
||||||
path: 'compiled',
|
path: 'compiled',
|
||||||
filename: '[name].js',
|
filename: '[name].js',
|
||||||
sourceMapFilename: '[name].map',
|
// sourceMapFilename: '[name].map',
|
||||||
libraryTarget: 'commonjs2'
|
libraryTarget: 'commonjs2'
|
||||||
},
|
},
|
||||||
module: {
|
module: {
|
||||||
@@ -31,12 +30,12 @@ module.exports = {
|
|||||||
'process.env': {
|
'process.env': {
|
||||||
'NODE_ENV': JSON.stringify('production')
|
'NODE_ENV': JSON.stringify('production')
|
||||||
}
|
}
|
||||||
|
}),
|
||||||
|
new webpack.optimize.UglifyJsPlugin({
|
||||||
|
compressor: {
|
||||||
|
warnings: false
|
||||||
|
}
|
||||||
})
|
})
|
||||||
// new webpack.optimize.UglifyJsPlugin({
|
|
||||||
// compressor: {
|
|
||||||
// warnings: false
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
],
|
],
|
||||||
externals: [
|
externals: [
|
||||||
'socket.io-client',
|
'socket.io-client',
|
||||||
|
|||||||
Reference in New Issue
Block a user