1
0
mirror of https://github.com/BoostIo/Boostnote synced 2025-12-14 18:26:26 +00:00

Compare commits

...

10 Commits

Author SHA1 Message Date
Rokt33r
5fa37dbffb Merge branch 'dev'
* dev:
  version 0.2.10 - Hotkeyの設定機能 - Stylus refactor
2015-09-02 01:02:32 +09:00
Rokt33r
c6307e4ad3 version 0.2.10
- Hotkeyの設定機能
- Stylus refactor
2015-09-02 01:02:04 +09:00
Rokt33r
06a54d451c Merge branch 'dev'
* dev:
  0.2.9 API server changed, bump electron version 0.31.0
2015-08-31 01:34:15 +09:00
Rokt33r
e317075815 0.2.9 API server changed, bump electron version 0.31.0 2015-08-31 01:33:32 +09:00
Rokt33r
45541a255b Merge branch 'dev'
* dev:
  - StylusでコンパイルされたCSSをCachingする(ロディングが短くなる) - Planet name changeのときにエラーハンドリング追加 + Bug fix - TeamのMemberを編集する場合、自分を編集することはできない - FinderにMarkdownのリンクがちゃんと外部に飛ぶように - Tray iconがちゃんと表示 - ArticleDetailのCodeアイコンがちゃんと表示されない
2015-08-30 05:31:13 +09:00
Rokt33r
3ab423d695 - StylusでコンパイルされたCSSをCachingする(ロディングが短くなる)
- Planet name changeのときにエラーハンドリング追加 + Bug fix
- TeamのMemberを編集する場合、自分を編集することはできない
- FinderにMarkdownのリンクがちゃんと外部に飛ぶように
- Tray iconがちゃんと表示
- ArticleDetailのCodeアイコンがちゃんと表示されない
2015-08-30 05:30:54 +09:00
Rokt33r
345d7b427a Merge branch 'dev'
* dev:
  Loading font 微調整
2015-08-26 18:27:42 +09:00
Rokt33r
de6d6b692e Loading font 微調整 2015-08-26 18:27:19 +09:00
Rokt33r
b2845e2284 Merge branch 'dev'
* dev:
  version 0.2.7  - Planet, Team作成の時Error message表示  - MarkdownのCode blockの背景を薄い灰色にする  - 権限なしのPlanetには  - SignUpに規約/Privacyの外部リンク追加  - Loading画面追加  - Font 添付(Lato regular)  - UserContainerでのTeam Label変更
2015-08-26 18:23:04 +09:00
Rokt33r
47383c347c version 0.2.7
- Planet, Team作成の時Error message表示
 - MarkdownのCode blockの背景を薄い灰色にする
 - 権限なしのPlanetには
 - SignUpに規約/Privacyの外部リンク追加
 - Loading画面追加
 - Font 添付(Lato regular)
 - UserContainerでのTeam Label変更
2015-08-26 18:22:46 +09:00
35 changed files with 440 additions and 135 deletions

3
.gitmodules vendored
View File

@@ -1,3 +1,6 @@
[submodule "browser/ace"]
path = browser/ace
url = https://github.com/ajaxorg/ace-builds.git
[submodule "browser/electron-stylus"]
path = browser/electron-stylus
url = https://github.com/Rokt33r/electron-stylus.git

BIN
Lato-Regular.ttf Normal file

Binary file not shown.

BIN
Lato-Regular.woff Normal file

Binary file not shown.

BIN
Lato-Regular.woff2 Normal file

Binary file not shown.

View File

@@ -2,10 +2,9 @@ var React = require('react/addons')
var CodeViewer = require('../../main/Components/CodeViewer')
var Markdown = require('../../main/Mixins/Markdown')
var MarkdownPreview = require('../../main/Components/MarkdownPreview')
module.exports = React.createClass({
mixins: [Markdown],
propTypes: {
currentArticle: React.PropTypes.object
},
@@ -28,7 +27,7 @@ module.exports = React.createClass({
<div className='FinderDetail'>
<div className='header'><i className='fa fa-file-text-o fa-fw'/> {article.title}</div>
<div className='content'>
<div className='marked' dangerouslySetInnerHTML={{__html: ' ' + this.markdown(article.content)}}></div>
<MarkdownPreview className='marked' content={article.content}/>
</div>
</div>
)

View File

@@ -8,6 +8,17 @@
<link rel="stylesheet" href="../../node_modules/font-awesome/css/font-awesome.min.css" media="screen" title="no title" charset="utf-8">
<link rel="shortcut icon" href="favicon.ico">
<style>
@font-face {
font-family: 'Lato';
src: url('../../Lato-Regular.woff2') format('woff2'), /* Modern Browsers */
url('../../Lato-Regular.woff') format('woff'), /* Modern Browsers */
url('../../Lato-Regular.ttf') format('truetype');
font-style: normal;
font-weight: normal;
text-rendering: optimizeLegibility;
}
</style>
<script>
document.addEventListener('mousewheel', function(e) {
if(e.deltaY % 1 !== 0) {
@@ -47,14 +58,13 @@
}
});
}
require('electron-stylus')(__dirname + '/../styles/finder/index.styl')
</script>
</head>
<body>
<div id="content"></div>
<script src="../ace/src-min/ace.js"></script>
<script>
require('../electron-stylus')(__dirname + '/../styles/finder/index.styl', 'finderCss')
require('node-jsx').install({ harmony: true, extension: '.jsx' })
require('./index.jsx')
</script>

View File

@@ -1,6 +1,3 @@
var remote = require('remote')
var version = remote.getGlobal('version')
var React = require('react/addons')
var ExternalLink = require('../Mixins/ExternalLink')
@@ -19,8 +16,9 @@ module.exports = React.createClass({
}
},
render: function () {
var version = global.version
return (
<div className='AboutModal modal'>
<div className='PreferencesModal sideNavModal modal'>
<div className='about1'>
<img className='logo' src='resources/favicon-230x230.png'/>
<div className='appInfo'>Boost {version == null || version.length === 0 ? 'DEV version' : 'v' + version}</div>

View File

@@ -69,7 +69,6 @@ module.exports = React.createClass({
this.setState({
passwordSubmitStatus: 'sending'
}, function () {
console.log(this.state.password)
Hq.changePassword(this.state.password)
.then(function (res) {
this.setState({
@@ -103,9 +102,9 @@ module.exports = React.createClass({
}
return (
<div className='EditProfileModal modal tabModal'>
<div className='EditProfileModal sideNavModal modal'>
<div className='leftPane'>
<div className='tabLabel'>Edit profile</div>
<div className='modalLabel'>Edit profile</div>
<div className='tabList'>
<button className={this.state.currentTab === 'userInfo' ? 'active' : ''} onClick={this.selectTab('userInfo')}><i className='fa fa-user fa-fw'/> User Info</button>
<button className={this.state.currentTab === 'password' ? 'active' : ''} onClick={this.selectTab('password')}><i className='fa fa-lock fa-fw'/> Password</button>
@@ -119,7 +118,7 @@ module.exports = React.createClass({
},
renderUserInfoTab: function () {
return (
<div className='userInfoTab'>
<div className='userInfoTab tab'>
<div className='formField'>
<label>Profile Name</label>
<input valueLink={this.linkState('user.profileName')}/>
@@ -142,18 +141,18 @@ module.exports = React.createClass({
},
renderPasswordTab: function () {
return (
<div className='passwordTab'>
<div className='passwordTab tab'>
<div className='formField'>
<label>Current password</label>
<input valueLink={this.linkState('password.currentPassword')}/>
<input type='password' valueLink={this.linkState('password.currentPassword')}/>
</div>
<div className='formField'>
<label>New password</label>
<input valueLink={this.linkState('password.newPassword')}/>
<input type='password' valueLink={this.linkState('password.newPassword')}/>
</div>
<div className='formField'>
<label>Confirmation</label>
<input valueLink={this.linkState('password.passwordConfirmation')}/>
<input type='password' valueLink={this.linkState('password.passwordConfirmation')}/>
</div>
<div className='formConfirm'>

View File

@@ -11,7 +11,7 @@ var Modal = require('../Mixins/Modal')
var UserStore = require('../Stores/UserStore')
var AboutModal = require('./AboutModal')
var PreferencesModal = require('./PreferencesModal')
var PlanetCreateModal = require('./PlanetCreateModal')
var TeamCreateModal = require('./TeamCreateModal')
var LogoutModal = require('./LogoutModal')
@@ -65,8 +65,8 @@ module.exports = React.createClass({
openTeamCreateModal: function () {
this.openModal(TeamCreateModal, {user: this.state.currentUser, transitionTo: this.transitionTo})
},
openAboutModal: function () {
this.openModal(AboutModal)
openPreferencesModal: function () {
this.openModal(PreferencesModal)
},
openPlanetCreateModal: function () {
this.openModal(PlanetCreateModal, {transitionTo: this.transitionTo})
@@ -168,7 +168,7 @@ module.exports = React.createClass({
<ul className='controlGroup'>
<li>
<button onClick={this.openAboutModal}><i className='fa fa-info-circle fa-fw'/> About this app</button>
<button onClick={this.openPreferencesModal}><i className='fa fa-gears fa-fw'/> Preferences</button>
</li>
<li>
<button onClick={this.handleLogoutClick}><i className='fa fa-sign-out fa-fw'/> Log out</button>

View File

@@ -66,7 +66,7 @@ module.exports = React.createClass({
<div className='detailHeader'>
<div className='itemLeft'>
<ProfileImage className='profileImage' size='25' email={article.User.email}/>
<i className='fa fa-file-text-o fa-fw'></i>
<i className='fa fa-code fa-fw'></i>
</div>
<div className='itemRight'>

View File

@@ -25,7 +25,8 @@ module.exports = React.createClass({
name: '',
public: true
},
ownerName: ownerName
ownerName: ownerName,
error: null
}
},
componentDidMount: function () {
@@ -42,7 +43,7 @@ module.exports = React.createClass({
}
},
handleSubmit: function () {
this.setState({errorMessage: null}, function () {
this.setState({error: null}, function () {
Hq.createPlanet(this.state.ownerName, this.state.planet)
.then(function (res) {
var planet = res.body
@@ -57,8 +58,21 @@ module.exports = React.createClass({
}.bind(this))
.catch(function (err) {
console.error(err)
if (err.status === 403) {
this.setState({errorMessage: err.response.body.message})
if (err.status == null) return this.setState({error: {message: 'Check your network connection'}})
switch (err.status) {
case 403:
this.setState({error: err.response.body})
break
case 422:
this.setState({error: {message: 'Planet name should be Alphanumeric with _, -'}})
break
case 409:
this.setState({error: {message: 'The entered name already in use'}})
break
default:
this.setState({error: {message: 'Unexpected error occured! please try again'}})
}
}.bind(this))
})
@@ -86,7 +100,7 @@ module.exports = React.createClass({
</select>
</div>
{this.state.errorMessage != null ? (<p className='errorAlert'>{this.state.errorMessage}</p>) : null}
{this.state.error != null ? (<p className='errorAlert'>{this.state.error.message != null ? this.state.error.message : 'Error message undefined'}</p>) : null}
<button onClick={this.handleSubmit} className='submitButton'>
<i className='fa fa-check'/>

View File

@@ -10,11 +10,20 @@ module.exports = React.createClass({
mixins: [Modal, Navigation],
propTypes: {
planet: React.PropTypes.shape({
name: React.PropTypes.string
name: React.PropTypes.string,
Owner: React.PropTypes.shape({
id: React.PropTypes.number,
userType: React.PropTypes.string
})
}),
search: React.PropTypes.string,
toggleCodeFilter: React.PropTypes.func,
toggleNoteFilter: React.PropTypes.func
toggleNoteFilter: React.PropTypes.func,
currentUser: React.PropTypes.shape({
id: React.PropTypes.number,
userType: React.PropTypes.string,
Teams: React.PropTypes.array
})
},
getInitialState: function () {
return {
@@ -24,6 +33,17 @@ module.exports = React.createClass({
openLaunchModal: function () {
this.openModal(LaunchModal, {planet: this.props.planet, transitionTo: this.transitionTo})
},
isMyPlanet: function () {
if (this.props.currentUser == null) return false
if (this.props.planet.Owner.userType === 'person' && this.props.planet.Owner.id !== this.props.currentUser.id) return false
if (this.props.planet.Owner.userType === 'team' && !this.props.currentUser.Teams.some(function (team) {
if (team.id === this.props.planet.Owner.id) return true
return false
}.bind(this))) return false
return true
},
render: function () {
var keywords = this.props.search.split(' ')
var usingCodeFilter = keywords.some(function (keyword) {
@@ -37,9 +57,11 @@ module.exports = React.createClass({
return (
<div className='PlanetNavigator'>
{this.isMyPlanet() ? (
<button onClick={this.openLaunchModal} className='launchButton btn-primary btn-block'>
<i className='fa fa-rocket fa-fw'/> Launch
</button>
) : null}
<nav className='articleFilters'>
<a className={usingCodeFilter && !usingNoteFilter ? 'active' : ''} onClick={this.props.toggleCodeFilter}>
<i className='fa fa-code fa-fw'/> Codes

View File

@@ -58,18 +58,44 @@ module.exports = React.createClass({
handleSavePlanetProfile: function (e) {
var planet = this.props.planet
this.setState({profileSubmitStatus: 'sending'}, function () {
this.setState({profileFormStatus: 'sending', profileFormError: null}, function () {
Hq.updatePlanet(planet.userName, planet.name, this.state.planet)
.then(function (res) {
var planet = res.body
this.setState({profileSubmitStatus: 'done'})
console.log(planet)
this.setState({profileFormStatus: 'done'})
PlanetStore.Actions.update(planet)
this.props.close()
}.bind(this))
.catch(function (err) {
this.setState({profileSubmitStatus: 'error'})
console.error(err)
var newState = {
profileFormStatus: 'error'
}
if (err.status == null) {
newState.profileFormError = {message: 'Check your network connection'}
return this.setState(newState)
}
switch (err.status) {
case 403:
newState.profileFormError = err.response.body
this.setState(newState)
break
case 422:
newState.profileFormError = {message: 'Planet name should be Alphanumeric with _, -'}
this.setState(newState)
break
case 409:
newState.profileFormError = {message: 'The entered name already in use'}
this.setState(newState)
break
default:
newState.profileFormError = {message: 'Undefined error please try again'}
this.setState(newState)
}
}.bind(this))
})
},
@@ -99,9 +125,9 @@ module.exports = React.createClass({
content = this.state.currentTab === 'profile' ? this.renderPlanetProfileTab() : this.renderPlanetDeleteTab()
return (
<div className='PlanetSettingModal modal tabModal'>
<div className='PlanetSettingModal sideNavModal modal'>
<div className='leftPane'>
<h1 className='tabLabel'>Planet setting</h1>
<h1 className='modalLabel'>Planet setting</h1>
<nav className='tabList'>
<button onClick={this.activePlanetProfile} className={this.state.currentTab === 'profile' ? 'active' : ''}><i className='fa fa-globe fa-fw'/> Planet profile</button>
<button onClick={this.activePlanetDelete} className={this.state.currentTab === 'delete' ? 'active' : ''}><i className='fa fa-trash fa-fw'/> Delete Planet</button>
@@ -116,7 +142,7 @@ module.exports = React.createClass({
},
renderPlanetProfileTab: function () {
return (
<div className='planetProfileTab'>
<div className='planetProfileTab tab'>
<div className='formField'>
<label>Planet name </label>
<input valueLink={this.linkState('planet.name')}/>
@@ -130,11 +156,11 @@ module.exports = React.createClass({
<div className='formConfirm'>
<button onClick={this.handleSavePlanetProfile} className='saveButton btn-primary'>Save</button>
<div className={'alertInfo' + (this.state.profileSubmitStatus === 'sending' ? '' : ' hide')}>on Sending...</div>
<div className={'alertInfo' + (this.state.profileFormStatus === 'sending' ? '' : ' hide')}>on Sending...</div>
<div className={'alertError' + (this.state.profileSubmitStatus === 'error' ? '' : ' hide')}>Connection failed.. Try again.</div>
<div className={'alertError' + (this.state.profileFormStatus === 'error' ? '' : ' hide')}>{this.state.profileFormError != null ? this.state.profileFormError.message : 'Unexpected error occured! please try again'}</div>
<div className={'alertSuccess' + (this.state.profileSubmitStatus === 'done' ? '' : ' hide')}>Successfully done!!</div>
<div className={'alertSuccess' + (this.state.profileFormStatus === 'done' ? '' : ' hide')}>Successfully done!!</div>
</div>
</div>
)
@@ -143,7 +169,7 @@ module.exports = React.createClass({
var disabled = !this.state.deleteConfirmation.match(new RegExp('^' + this.props.planet.userName + '/' + this.props.planet.name + '$'))
return (
<div className='planetDeleteTab'>
<div className='planetDeleteTab tab'>
<p>Are you sure to destroy <strong>'{this.props.planet.userName + '/' + this.props.planet.name}'</strong>?</p>
<p>If you are sure, write <strong>'{this.props.planet.userName + '/' + this.props.planet.name}'</strong> to input below and click <strong>'{this.state.randomDeleteText}'</strong> button.</p>
<input valueLink={this.linkState('deleteConfirmation')} placeholder='userName/planetName'/>

View File

@@ -0,0 +1,112 @@
var ipc = require('ipc')
var remote = require('remote')
var React = require('react/addons')
var LinkedState = require('../Mixins/LinkedState')
var ExternalLink = require('../Mixins/ExternalLink')
var KeyCaster = require('../Mixins/KeyCaster')
module.exports = React.createClass({
mixins: [LinkedState, ExternalLink, KeyCaster('aboutModal')],
propTypes: {
close: React.PropTypes.func
},
getInitialState: function () {
var keymap = remote.getGlobal('keymap')
console.log(keymap)
return {
currentTab: 'settings',
keymap: keymap
}
},
onKeyCast: function (e) {
switch (e.status) {
case 'closeModal':
this.props.close()
break
}
},
activeSettings: function () {
this.setState({currentTab: 'settings'})
},
activeAbout: function () {
this.setState({currentTab: 'about'})
},
saveKeymap: function () {
ipc.send('hotkeyUpdated', JSON.stringify(this.state.keymap))
},
render: function () {
var content = this.state.currentTab === 'settings' ? this.renderSettingsTab() : this.renderAboutTab()
return (
<div className='PreferencesModal sideNavModal modal'>
<div className='leftPane'>
<h1 className='modalLabel'>Preferences</h1>
<nav className='tabList'>
<button onClick={this.activeSettings} className={this.state.currentTab === 'settings' ? 'active' : ''}><i className='fa fa-gear fa-fw'/> Settings</button>
<button onClick={this.activeAbout} className={this.state.currentTab === 'about' ? 'active' : ''}><i className='fa fa-info-circle fa-fw'/> About this app</button>
</nav>
</div>
<div className='rightPane'>
{content}
</div>
</div>
)
},
renderSettingsTab: function () {
return (
<div className='settingsTab tab'>
<div className='categoryLabel'>Hotkey</div>
<div className='formField'>
<label>Toggle finder</label>
<input valueLink={this.linkState('keymap.toggleFinder')}/>
</div>
<div className='formConfirm'>
<button onClick={this.saveKeymap}>Save</button>
</div>
<div className='example'>
<h3>Example</h3>
<ul>
<li><code>0</code> to <code>9</code></li>
<li><code>A</code> to <code>Z</code></li>
<li><code>F1</code> to <code>F24</code></li>
<li>Punctuations like <code>~</code>, <code>!</code>, <code>@</code>, <code>#</code>, <code>$</code>, etc.</li>
<li><code>Plus</code></li>
<li><code>Space</code></li>
<li><code>Backspace</code></li>
<li><code>Delete</code></li>
<li><code>Insert</code></li>
<li><code>Return</code> (or <code>Enter</code> as alias)</li>
<li><code>Up</code>, <code>Down</code>, <code>Left</code> and <code>Right</code></li>
<li><code>Home</code> and <code>End</code></li>
<li><code>PageUp</code> and <code>PageDown</code></li>
<li><code>Escape</code> (or <code>Esc</code> for short)</li>
<li><code>VolumeUp</code>, <code>VolumeDown</code> and <code>VolumeMute</code></li>
<li><code>MediaNextTrack</code>, <code>MediaPreviousTrack</code>, <code>MediaStop</code> and <code>MediaPlayPause</code></li>
</ul>
</div>
</div>
)
},
renderAboutTab: function () {
var version = global.version
return (
<div className='aboutTab tab'>
<div className='about1'>
<img className='logo' src='resources/favicon-230x230.png'/>
<div className='appInfo'>Boost {version == null || version.length === 0 ? 'DEV version' : 'v' + version}</div>
</div>
<div className='about2'>
<div className='externalLabel'>External links</div>
<ul className='externalList'>
<li><a onClick={this.openExternal} href='http://b00st.io'>Boost Homepage <i className='fa fa-external-link'/></a></li>
<li><a onClick={this.openExternal} href='http://boostio.github.io/regulations.html'>Regulation <i className='fa fa-external-link'/></a></li>
<li><a onClick={this.openExternal} href='http://boostio.github.io/privacypolicies.html'>Private policy <i className='fa fa-external-link'/></a></li>
</ul>
</div>
</div>
)
}
})

View File

@@ -22,7 +22,8 @@ module.exports = React.createClass({
return {
team: {
name: ''
}
},
error: null
}
},
componentDidMount: function () {
@@ -39,6 +40,7 @@ module.exports = React.createClass({
}
},
handleSubmit: function () {
this.setState({error: null}, function () {
Hq.createTeam(this.props.user.name, this.state.team)
.then(function (res) {
var currentUser = JSON.parse(localStorage.getItem('currentUser'))
@@ -55,13 +57,27 @@ module.exports = React.createClass({
}.bind(this))
.catch(function (err) {
console.error(err)
if (err.status == null) return this.setState({error: {message: 'Check your network connection'}})
switch (err.status) {
case 422:
this.setState({error: {message: 'Team name should be Alphanumeric with _, -'}})
break
case 409:
this.setState({error: {message: 'The entered name already in use'}})
break
default:
this.setState({error: {message: 'Error message undefined'}})
}
}.bind(this))
})
},
render: function () {
return (
<div className='TeamCreateModal modal'>
<input ref='teamName' valueLink={this.linkState('team.name')} className='nameInput stripInput' placeholder='Create new team'/>
{this.state.error != null ? (<p className='errorAlert'>{this.state.error.message != null ? this.state.error.message : 'Unintended error occured'}</p>) : null}
<button onClick={this.handleSubmit} className='submitButton'>
<i className='fa fa-check'/>
</button>

View File

@@ -176,9 +176,9 @@ module.exports = React.createClass({
}
return (
<div className='TeamSettingsModal modal tabModal'>
<div className='TeamSettingsModal sideNavModal modal'>
<div className='leftPane'>
<div className='tabLabel'>Team settings</div>
<div className='modalLabel'>Team settings</div>
<div className='tabList'>
<button className={this.state.currentTab === 'teamInfo' ? 'active' : ''} onClick={this.selectTab('teamInfo')}><i className='fa fa-info-circle fa-fw'/> Team Info</button>
<button className={this.state.currentTab === 'members' ? 'active' : ''} onClick={this.selectTab('members')}><i className='fa fa-users fa-fw'/> Members</button>
@@ -192,7 +192,7 @@ module.exports = React.createClass({
},
renderTeamInfoTab: function () {
return (
<div className='userInfoTab'>
<div className='userInfoTab tab'>
<div className='formField'>
<label>Profile Name</label>
<input valueLink={this.linkState('team.profileName')}/>
@@ -239,7 +239,7 @@ module.exports = React.createClass({
var belowLimit = members.length < 5
return (
<div className='membersTab'>
<div className='membersTab tab'>
<table className='memberTable'>
<thead>
<tr>

View File

@@ -55,7 +55,6 @@ module.exports = React.createClass({
return
} else {
this.transitionTo('home')
return
}
}

View File

@@ -399,7 +399,8 @@ module.exports = React.createClass({
showAll={this.showAll}
toggleCodeFilter={this.toggleCodeFilter}
toggleNoteFilter={this.toggleNoteFilter}
planet={this.state.planet}/>
planet={this.state.planet}
currentUser={this.state.currentUser}/>
<PlanetArticleList showOnlyWithTag={this.applyTagFilter} ref='list' articles={filteredArticles}/>

View File

@@ -6,10 +6,11 @@ var Link = ReactRouter.Link
var AuthFilter = require('../Mixins/AuthFilter')
var LinkedState = require('../Mixins/LinkedState')
var ExternalLink = require('../Mixins/ExternalLink')
var Hq = require('../Services/Hq')
module.exports = React.createClass({
mixins: [LinkedState, ReactRouter.Navigation, AuthFilter.OnlyGuest],
mixins: [LinkedState, ReactRouter.Navigation, AuthFilter.OnlyGuest, ExternalLink],
getInitialState: function () {
return {
user: {},
@@ -129,7 +130,7 @@ module.exports = React.createClass({
</div>
</form>
<p className='alert'>会員登録することで当サイトの利用規約及びCookieの使用を含むデータに関するポリシーに同意するものとします</p>
<p className='alert'>会員登録することで<a onClick={this.openExternal} href='http://boostio.github.io/regulations.html'>当サイトの利用規約</a>及び<a onClick={this.openExternal} href='http://boostio.github.io/privacypolicies.html'>Cookieの使用を含むデータに関するポリシー</a>に同意するものとします</p>
</div>
)
}

View File

@@ -318,7 +318,7 @@ module.exports = React.createClass({
})
return (
<div key={'user-' + team.id} className='planetGroup'>
<div className='planetGroupLabel'>{team.name}</div>
<div className='planetGroupLabel'>{team.profileName} <small>@{team.name}</small></div>
<ul className='planets'>
{planets}
{isOwner ? (<li><button onClick={this.openPlanetCreateModalWithOwnerName(team.name)} className='createPlanetButton'><i className='fa fa-plus-square-o'/> Create new planet</button></li>) : null}
@@ -353,7 +353,7 @@ module.exports = React.createClass({
<div className='planetList'>
<div className='planetLabel'>{planetCount} {planetCount > 1 ? 'Planets' : 'Planet'}</div>
<div className='planetGroup'>
<div className='planetGroupLabel'>{user.profileName}</div>
<div className='planetGroupLabel'>{user.profileName} <small>@{user.name}</small></div>
<ul className='planets'>
{userPlanets}
{isOwner ? (<li><button onClick={this.openPlanetCreateModalWithOwnerName(user.name)} className='createPlanetButton'><i className='fa fa-plus-square-o'/> Create new planet</button></li>) : null}

View File

@@ -53,6 +53,14 @@ module.exports = Reflux.createStore({
localStorage.setItem('currentUser', JSON.stringify(currentUser))
UserStore.Actions.update(currentUser)
planet.Codes.forEach(function (code) {
code.type = 'code'
})
planet.Notes.forEach(function (note) {
note.type = 'note'
})
// Update the planet
localStorage.setItem('planet-' + planet.id, JSON.stringify(planet))

View File

@@ -1,16 +1,55 @@
<!DOCTYPE html>
<html>
<head>
<script>
var version = require('remote').getGlobal('version')
document.title = 'Boost ' + ((version == null || version.length === 0) ? 'DEV version' : 'v' + version)
</script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
<link rel="stylesheet" href="../../node_modules/font-awesome/css/font-awesome.min.css" media="screen" title="no title" charset="utf-8">
<link rel="shortcut icon" href="favicon.ico">
<style>
@font-face {
font-family: 'Lato';
src: url('../../Lato-Regular.woff2') format('woff2'), /* Modern Browsers */
url('../../Lato-Regular.woff') format('woff'), /* Modern Browsers */
url('../../Lato-Regular.ttf') format('truetype');
font-style: normal;
font-weight: normal;
text-rendering: optimizeLegibility;
}
#loadingCover{
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
box-sizing: border-box;
padding: 65px 0;
font-family: sans-serif;
}
#loadingCover img{
display: block;
margin: 75px auto 5px;
width: 160px;
height: 160px;
}
#loadingCover .message{
font-size: 30px;
text-align: center;
line-height: 1.6;
font-weight: 100;
color: #888;
}
</style>
</head>
<body>
<div id="loadingCover">
<img src="resources/favicon-230x230.png">
<div class='message'>Loading...</div>
</div>
<div id="content"></div>
<script>
if (!Object.assign) {
Object.defineProperty(Object, 'assign', {
@@ -45,13 +84,14 @@
});
}
require('electron-stylus')(__dirname + '/../styles/main/index.styl')
</script>
</head>
<body>
<div id="content"></div>
<script src="../ace/src-min/ace.js"></script>
<script>
var version = require('remote').require('app').getVersion()
global.version = version
document.title = 'Boost ' + ((version == null || version.length === 0) ? 'DEV version' : 'v' + version)
require('../electron-stylus')(__dirname + '/../styles/main/index.styl', 'mainCss')
// require('../electron-stylus')(__dirname + '/../styles/main/index.styl')
require('node-jsx').install({ harmony: true, extension: '.jsx' })
require('./index.jsx')
</script>

View File

@@ -34,7 +34,13 @@ var routes = (
</Route>
</Route>
)
var loadingCover = document.getElementById('loadingCover')
ReactRouter.run(routes, ReactRouter.HashLocation, function (Root) {
React.render(<Root/>, document.getElementById('content'))
if (loadingCover != null) {
loadingCover.parentNode.removeChild(loadingCover)
loadingCover = null
}
})

View File

@@ -294,6 +294,9 @@
.planetGroupLabel
font-size 1.1em
margin-bottom 15px
small
font-size 0.8em
color inactiveTextColor
.planets
margin-left 15px
li

View File

@@ -63,12 +63,14 @@ marked()
font-size 0.9em
color black
text-decoration none
background-color #F6F6F6
pre
padding 5px
border solid 1px borderColor
border-radius 5px
overflow-x auto
margin-bottom 15px
background-color #F6F6F6
&>code
padding 0
border none

View File

@@ -32,14 +32,14 @@
.modal-control
float right
.tabModal
.sideNavModal
height 500px
.leftPane
absolute top bottom left
width 175px
padding 20px
border-right solid 1px borderColor
.tabLabel
.modalLabel
font-size 1.5em
margin-top 25px
margin-bottom 35px
@@ -57,9 +57,7 @@
left 175px
padding 15px
overflow-y auto
.EditProfileModal, .PlanetSettingModal, .TeamSettingsModal
.userInfoTab, .passwordTab, .planetProfileTab, .userInfoTab, .membersTab
.tab
padding-top 45px
.formField
position relative
@@ -97,7 +95,7 @@
float right
padding 12px 10px
border-radius 5px
width 200px
width 320px
font-size 1em
overflow-x hidden
white-space nowrap
@@ -111,6 +109,33 @@
alertSuccess()
.alertError
alertError()
.PreferencesModal
.settingsTab
.categoryLabel
font-size 1.5em
margin-bottom 25px
.example
marked()
.aboutTab
padding-top 30px
.about1
margin-bottom 25px
.logo
display block
margin 0 auto
.appInfo
font-size 1.5em
text-align center
.about2
width 200px
margin 0 auto
.externalLabel
font-size 1.2em
margin-bottom 15px
.externalList
li
margin-bottom 15px
.PlanetSettingModal
.planetDeleteTab
padding-top 65px
p
@@ -139,7 +164,7 @@
float right
padding 12px 10px
border-radius 5px
width 200px
width 320px
font-size 1em
overflow-x hidden
white-space nowrap
@@ -153,6 +178,7 @@
alertSuccess()
.alertError
alertError()
.TeamSettingsModal
.membersTab
.memberTable
width 100%
@@ -262,25 +288,6 @@
border-radius 5px
marked()
.AboutModal
width 320px
.about1
margin-bottom 25px
.logo
display block
margin 0 auto
.appInfo
font-size 1.5em
text-align center
.about2
width 200px
margin 0 auto
.externalLabel
font-size 1.2em
margin-bottom 15px
.externalList
li
margin-bottom 15px
.PlanetCreateModal.modal, .TeamCreateModal.modal, .AddMemberModal.modal
padding 60px 0

View File

@@ -1,4 +1,4 @@
module.exports = {
apiUrl: 'http://codexen-server-dev2.elasticbeanstalk.com/'
apiUrl: 'https://api.b00st.io/'
// apiUrl: 'http://localhost:8000/'
}

57
main.js
View File

@@ -4,6 +4,7 @@ var Menu = require('menu')
var MenuItem = require('menu-item')
var Tray = require('tray')
var ipc = require('ipc')
var jetpack = require('fs-jetpack')
require('crash-reporter').start()
@@ -19,7 +20,6 @@ var update = null
// })
var version = app.getVersion()
global.version = version
var versionText = (version == null || version.length === 0) ? 'DEV version' : 'v' + version
var nn = require('node-notifier')
var autoUpdater = require('auto-updater')
@@ -27,6 +27,7 @@ var path = require('path')
autoUpdater
.on('error', function (err, message) {
console.error(message)
nn.notify({
title: 'Error! ' + versionText,
icon: path.join(__dirname, 'browser/main/resources/favicon-230x230.png'),
@@ -34,11 +35,7 @@ autoUpdater
})
})
.on('checking-for-update', function () {
nn.notify({
title: 'Boost launched!! ' + versionText,
icon: path.join(__dirname, 'browser/main/resources/favicon-230x230.png'),
message: 'Checking update is available....'
})
// Connecting
})
.on('update-available', function () {
nn.notify({
@@ -85,7 +82,7 @@ app.on('ready', function () {
Menu.setApplicationMenu(menu)
// menu end
appIcon = new Tray(__dirname + '/tray-icon.png')
appIcon.setToolTip('Codexen')
appIcon.setToolTip('Boost')
var trayMenu = new Menu()
trayMenu.append(new MenuItem({
@@ -133,7 +130,8 @@ app.on('ready', function () {
'web-preferences': {
'overlay-scrollbars': true,
'skip-taskbar': true
}
},
'standard-window': false
})
popUpWindow.loadUrl('file://' + __dirname + '/browser/finder/index.electron.html')
@@ -141,16 +139,54 @@ app.on('ready', function () {
popUpWindow.on('blur', function () {
popUpWindow.hide()
})
popUpWindow.setVisibleOnAllWorkspaces(true)
var globalShortcut = require('global-shortcut')
console.log('jetpack launch')
var userDataPath = app.getPath('userData')
if (!jetpack.cwd(userDataPath).exists('keymap.json')) {
jetpack.cwd(userDataPath).file('keymap.json', {content: '{}'})
}
try {
global.keymap = JSON.parse(jetpack.cwd(userDataPath).read('keymap.json', 'utf-8'))
} catch (err) {
jetpack.cwd(userDataPath).file('keymap.json', {content: '{}'})
global.keymap = {}
}
if (global.keymap.toggleFinder == null) global.keymap.toggleFinder = 'ctrl+tab+shift'
var toggleFinderKey = global.keymap.toggleFinder
globalShortcut.register('ctrl+tab+shift', function () {
try {
globalShortcut.register(toggleFinderKey, function () {
if (mainWindow != null && !mainWindow.isFocused()) {
mainWindow.hide()
}
popUpWindow.show()
})
} catch (err) {
console.log(err.name)
}
ipc.on('hotkeyUpdated', function (event, newKeymap) {
console.log('got new keymap')
console.log(newKeymap)
globalShortcut.unregisterAll()
global.keymap = JSON.parse(newKeymap)
jetpack.cwd(userDataPath).file('keymap.json', {content: JSON.stringify(global.keymap)})
var toggleFinderKey = global.keymap.toggleFinder != null ? global.keymap.toggleFinder : 'ctrl+tab+shift'
try {
globalShortcut.register(toggleFinderKey, function () {
if (mainWindow != null && !mainWindow.isFocused()) {
mainWindow.hide()
}
popUpWindow.show()
})
} catch (err) {
console.log(err.name)
}
})
global.hideFinder = function () {
if (mainWindow == null || !mainWindow.isVisible()) {
@@ -168,7 +204,8 @@ function makeNewMainWindow () {
'zoom-factor': 1.0,
'web-preferences': {
'overlay-scrollbars': true
}
},
'standard-window': false
})
if (update != null) {
mainWindow.webContents.on('did-finish-load', function () {

View File

@@ -5,7 +5,7 @@ module.exports = [
label: 'Electron',
submenu: [
{
label: 'About Electron',
label: 'About Boost',
selector: 'orderFrontStandardAboutPanel:'
},
{
@@ -19,7 +19,7 @@ module.exports = [
type: 'separator'
},
{
label: 'Hide Electron',
label: 'Hide Boost',
accelerator: 'Command+H',
selector: 'hide:'
},
@@ -89,13 +89,13 @@ module.exports = [
click: function () {
BrowserWindow.getFocusedWindow().reload()
}
// },
// {
// label: 'Toggle DevTools',
// accelerator: 'Alt+Command+I',
// click: function () {
// BrowserWindow.getFocusedWindow().toggleDevTools()
// }
},
{
label: 'Toggle DevTools',
accelerator: 'Alt+Command+I',
click: function () {
BrowserWindow.getFocusedWindow().toggleDevTools()
}
}
]
},

View File

@@ -1,6 +1,6 @@
{
"name": "boost",
"version": "0.2.6",
"version": "0.2.10",
"description": "Boost App",
"main": "main.js",
"scripts": {
@@ -31,8 +31,8 @@
},
"homepage": "https://github.com/Rokt33r/codexen-app#readme",
"dependencies": {
"electron-stylus": "^0.1.0",
"font-awesome": "^4.3.0",
"fs-jetpack": "^0.7.0",
"markdown-it": "^4.3.1",
"md5": "^2.0.0",
"moment": "^2.10.3",
@@ -43,6 +43,7 @@
"react-router": "^0.13.3",
"react-select": "^0.5.4",
"reflux": "^0.2.8",
"stylus": "^0.52.0",
"superagent": "^1.2.0",
"superagent-promise": "^1.0.3"
},

Binary file not shown.

Before

Width:  |  Height:  |  Size: 463 B

After

Width:  |  Height:  |  Size: 959 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 924 B

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB