mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-14 18:26:26 +00:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f54eb52b2 | ||
|
|
a3847ce1c9 | ||
|
|
1e7415b692 | ||
|
|
ff950ef28a | ||
|
|
51bd12c6cf | ||
|
|
5fa37dbffb | ||
|
|
c6307e4ad3 | ||
|
|
06a54d451c | ||
|
|
e317075815 | ||
|
|
45541a255b | ||
|
|
3ab423d695 | ||
|
|
345d7b427a | ||
|
|
de6d6b692e | ||
|
|
b2845e2284 | ||
|
|
47383c347c |
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,3 +1,6 @@
|
|||||||
[submodule "browser/ace"]
|
[submodule "browser/ace"]
|
||||||
path = browser/ace
|
path = browser/ace
|
||||||
url = https://github.com/ajaxorg/ace-builds.git
|
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
BIN
Lato-Regular.ttf
Normal file
Binary file not shown.
BIN
Lato-Regular.woff
Normal file
BIN
Lato-Regular.woff
Normal file
Binary file not shown.
BIN
Lato-Regular.woff2
Normal file
BIN
Lato-Regular.woff2
Normal file
Binary file not shown.
1
browser/electron-stylus
Submodule
1
browser/electron-stylus
Submodule
Submodule browser/electron-stylus added at 6d86de7c66
@@ -2,10 +2,9 @@ var React = require('react/addons')
|
|||||||
|
|
||||||
var CodeViewer = require('../../main/Components/CodeViewer')
|
var CodeViewer = require('../../main/Components/CodeViewer')
|
||||||
|
|
||||||
var Markdown = require('../../main/Mixins/Markdown')
|
var MarkdownPreview = require('../../main/Components/MarkdownPreview')
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
mixins: [Markdown],
|
|
||||||
propTypes: {
|
propTypes: {
|
||||||
currentArticle: React.PropTypes.object
|
currentArticle: React.PropTypes.object
|
||||||
},
|
},
|
||||||
@@ -28,7 +27,7 @@ module.exports = React.createClass({
|
|||||||
<div className='FinderDetail'>
|
<div className='FinderDetail'>
|
||||||
<div className='header'><i className='fa fa-file-text-o fa-fw'/> {article.title}</div>
|
<div className='header'><i className='fa fa-file-text-o fa-fw'/> {article.title}</div>
|
||||||
<div className='content'>
|
<div className='content'>
|
||||||
<div className='marked' dangerouslySetInnerHTML={{__html: ' ' + this.markdown(article.content)}}></div>
|
<MarkdownPreview className='marked' content={article.content}/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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="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">
|
<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>
|
<script>
|
||||||
document.addEventListener('mousewheel', function(e) {
|
document.addEventListener('mousewheel', function(e) {
|
||||||
if(e.deltaY % 1 !== 0) {
|
if(e.deltaY % 1 !== 0) {
|
||||||
@@ -47,14 +58,13 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
require('electron-stylus')(__dirname + '/../styles/finder/index.styl')
|
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="content"></div>
|
<div id="content"></div>
|
||||||
<script src="../ace/src-min/ace.js"></script>
|
<script src="../ace/src-min/ace.js"></script>
|
||||||
<script>
|
<script>
|
||||||
|
require('../electron-stylus')(__dirname + '/../styles/finder/index.styl', 'finderCss')
|
||||||
require('node-jsx').install({ harmony: true, extension: '.jsx' })
|
require('node-jsx').install({ harmony: true, extension: '.jsx' })
|
||||||
require('./index.jsx')
|
require('./index.jsx')
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
var remote = require('remote')
|
|
||||||
var version = remote.getGlobal('version')
|
|
||||||
|
|
||||||
var React = require('react/addons')
|
var React = require('react/addons')
|
||||||
|
|
||||||
var ExternalLink = require('../Mixins/ExternalLink')
|
var ExternalLink = require('../Mixins/ExternalLink')
|
||||||
@@ -19,8 +16,9 @@ module.exports = React.createClass({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
render: function () {
|
render: function () {
|
||||||
|
var version = global.version
|
||||||
return (
|
return (
|
||||||
<div className='AboutModal modal'>
|
<div className='PreferencesModal sideNavModal modal'>
|
||||||
<div className='about1'>
|
<div className='about1'>
|
||||||
<img className='logo' src='resources/favicon-230x230.png'/>
|
<img className='logo' src='resources/favicon-230x230.png'/>
|
||||||
<div className='appInfo'>Boost {version == null || version.length === 0 ? 'DEV version' : 'v' + version}</div>
|
<div className='appInfo'>Boost {version == null || version.length === 0 ? 'DEV version' : 'v' + version}</div>
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ var Hq = require('../Services/Hq')
|
|||||||
|
|
||||||
var KeyCaster = require('../Mixins/KeyCaster')
|
var KeyCaster = require('../Mixins/KeyCaster')
|
||||||
|
|
||||||
var UserStore = require('../Stores/UserStore')
|
|
||||||
|
|
||||||
var getOptions = function (input, callback) {
|
var getOptions = function (input, callback) {
|
||||||
Hq.searchUser(input)
|
Hq.searchUser(input)
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
@@ -58,7 +56,6 @@ module.exports = React.createClass({
|
|||||||
})
|
})
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
console.log(res.body)
|
console.log(res.body)
|
||||||
UserStore.Actions.addMember(res.body)
|
|
||||||
this.props.close()
|
this.props.close()
|
||||||
}.bind(this))
|
}.bind(this))
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ module.exports = React.createClass({
|
|||||||
},
|
},
|
||||||
submit: function () {
|
submit: function () {
|
||||||
var planet = this.props.planet
|
var planet = this.props.planet
|
||||||
Hq.destroyCode(planet.userName, planet.name, this.props.code.localId)
|
Hq.destroyCode(planet.Owner.name, planet.name, this.props.code.localId)
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
PlanetStore.Actions.destroyCode(res.body)
|
PlanetStore.Actions.destroyCode(res.body)
|
||||||
this.props.close()
|
this.props.close()
|
||||||
|
|||||||
@@ -15,14 +15,14 @@ var getOptions = function (input, callback) {
|
|||||||
Hq.searchTag(input)
|
Hq.searchTag(input)
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
callback(null, {
|
callback(null, {
|
||||||
options: res.body.map(function (tag) {
|
options: res.body.map(function (tag) {
|
||||||
return {
|
return {
|
||||||
label: tag.name,
|
label: tag.name,
|
||||||
value: tag.name
|
value: tag.name
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
complete: false
|
complete: false
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
@@ -88,18 +88,18 @@ module.exports = React.createClass({
|
|||||||
return tag.value
|
return tag.value
|
||||||
})
|
})
|
||||||
if (this.props.code == null) {
|
if (this.props.code == null) {
|
||||||
Hq.createCode(planet.userName, planet.name, this.state.code)
|
Hq.createCode(planet.Owner.name, planet.name, this.state.code)
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
var code = res.body
|
var code = res.body
|
||||||
PlanetStore.Actions.updateCode(code)
|
PlanetStore.Actions.updateCode(code)
|
||||||
this.props.close()
|
this.props.close()
|
||||||
this.props.transitionTo('codes', {userName: planet.userName, planetName: planet.name, localId: code.localId})
|
this.props.transitionTo('codes', {userName: planet.Owner.name, planetName: planet.name, localId: code.localId})
|
||||||
}.bind(this))
|
}.bind(this))
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
Hq.updateCode(planet.userName, planet.name, this.props.code.localId, this.state.code)
|
Hq.updateCode(planet.Owner.name, planet.name, this.props.code.localId, this.state.code)
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
var code = res.body
|
var code = res.body
|
||||||
PlanetStore.Actions.updateCode(code)
|
PlanetStore.Actions.updateCode(code)
|
||||||
|
|||||||
@@ -69,7 +69,6 @@ module.exports = React.createClass({
|
|||||||
this.setState({
|
this.setState({
|
||||||
passwordSubmitStatus: 'sending'
|
passwordSubmitStatus: 'sending'
|
||||||
}, function () {
|
}, function () {
|
||||||
console.log(this.state.password)
|
|
||||||
Hq.changePassword(this.state.password)
|
Hq.changePassword(this.state.password)
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
this.setState({
|
this.setState({
|
||||||
@@ -103,9 +102,9 @@ module.exports = React.createClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='EditProfileModal modal tabModal'>
|
<div className='EditProfileModal sideNavModal modal'>
|
||||||
<div className='leftPane'>
|
<div className='leftPane'>
|
||||||
<div className='tabLabel'>Edit profile</div>
|
<div className='modalLabel'>Edit profile</div>
|
||||||
<div className='tabList'>
|
<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 === '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>
|
<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 () {
|
renderUserInfoTab: function () {
|
||||||
return (
|
return (
|
||||||
<div className='userInfoTab'>
|
<div className='userInfoTab tab'>
|
||||||
<div className='formField'>
|
<div className='formField'>
|
||||||
<label>Profile Name</label>
|
<label>Profile Name</label>
|
||||||
<input valueLink={this.linkState('user.profileName')}/>
|
<input valueLink={this.linkState('user.profileName')}/>
|
||||||
@@ -142,18 +141,18 @@ module.exports = React.createClass({
|
|||||||
},
|
},
|
||||||
renderPasswordTab: function () {
|
renderPasswordTab: function () {
|
||||||
return (
|
return (
|
||||||
<div className='passwordTab'>
|
<div className='passwordTab tab'>
|
||||||
<div className='formField'>
|
<div className='formField'>
|
||||||
<label>Current password</label>
|
<label>Current password</label>
|
||||||
<input valueLink={this.linkState('password.currentPassword')}/>
|
<input type='password' valueLink={this.linkState('password.currentPassword')}/>
|
||||||
</div>
|
</div>
|
||||||
<div className='formField'>
|
<div className='formField'>
|
||||||
<label>New password</label>
|
<label>New password</label>
|
||||||
<input valueLink={this.linkState('password.newPassword')}/>
|
<input type='password' valueLink={this.linkState('password.newPassword')}/>
|
||||||
</div>
|
</div>
|
||||||
<div className='formField'>
|
<div className='formField'>
|
||||||
<label>Confirmation</label>
|
<label>Confirmation</label>
|
||||||
<input valueLink={this.linkState('password.passwordConfirmation')}/>
|
<input type='password' valueLink={this.linkState('password.passwordConfirmation')}/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='formConfirm'>
|
<div className='formConfirm'>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ var Modal = require('../Mixins/Modal')
|
|||||||
|
|
||||||
var UserStore = require('../Stores/UserStore')
|
var UserStore = require('../Stores/UserStore')
|
||||||
|
|
||||||
var AboutModal = require('./AboutModal')
|
var PreferencesModal = require('./PreferencesModal')
|
||||||
var PlanetCreateModal = require('./PlanetCreateModal')
|
var PlanetCreateModal = require('./PlanetCreateModal')
|
||||||
var TeamCreateModal = require('./TeamCreateModal')
|
var TeamCreateModal = require('./TeamCreateModal')
|
||||||
var LogoutModal = require('./LogoutModal')
|
var LogoutModal = require('./LogoutModal')
|
||||||
@@ -65,8 +65,8 @@ module.exports = React.createClass({
|
|||||||
openTeamCreateModal: function () {
|
openTeamCreateModal: function () {
|
||||||
this.openModal(TeamCreateModal, {user: this.state.currentUser, transitionTo: this.transitionTo})
|
this.openModal(TeamCreateModal, {user: this.state.currentUser, transitionTo: this.transitionTo})
|
||||||
},
|
},
|
||||||
openAboutModal: function () {
|
openPreferencesModal: function () {
|
||||||
this.openModal(AboutModal)
|
this.openModal(PreferencesModal)
|
||||||
},
|
},
|
||||||
openPlanetCreateModal: function () {
|
openPlanetCreateModal: function () {
|
||||||
this.openModal(PlanetCreateModal, {transitionTo: this.transitionTo})
|
this.openModal(PlanetCreateModal, {transitionTo: this.transitionTo})
|
||||||
@@ -94,15 +94,18 @@ module.exports = React.createClass({
|
|||||||
var params = this.getParams()
|
var params = this.getParams()
|
||||||
|
|
||||||
if (this.state.currentUser == null) {
|
if (this.state.currentUser == null) {
|
||||||
return (
|
return null
|
||||||
<div className='HomeNavigator'>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var planets = (this.state.currentUser.Planets.concat(this.state.currentUser.Teams.reduce(function (planets, team) {
|
var planets = this.state.currentUser.Planets.map(function (planet) {
|
||||||
return team.Planets == null ? planets : planets.concat(team.Planets)
|
planet.userName = this.state.currentUser.name
|
||||||
}, []))).map(function (planet, index) {
|
return planet
|
||||||
|
}.bind(this)).concat(this.state.currentUser.Teams.reduce(function (_planets, team) {
|
||||||
|
return _planets.concat(team.Planets == null ? [] : team.Planets.map(function (planet) {
|
||||||
|
planet.userName = team.name
|
||||||
|
return planet
|
||||||
|
}))
|
||||||
|
}, [])).map(function (planet, index) {
|
||||||
return (
|
return (
|
||||||
<li userName={planet.userName} planetName={planet.name} key={planet.id} className={params.userName === planet.userName && params.planetName === planet.name ? 'active' : ''}>
|
<li userName={planet.userName} planetName={planet.name} key={planet.id} className={params.userName === planet.userName && params.planetName === planet.name ? 'active' : ''}>
|
||||||
<Link to='planet' params={{userName: planet.userName, planetName: planet.name}}>
|
<Link to='planet' params={{userName: planet.userName, planetName: planet.name}}>
|
||||||
@@ -168,7 +171,7 @@ module.exports = React.createClass({
|
|||||||
|
|
||||||
<ul className='controlGroup'>
|
<ul className='controlGroup'>
|
||||||
<li>
|
<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>
|
||||||
<li>
|
<li>
|
||||||
<button onClick={this.handleLogoutClick}><i className='fa fa-sign-out fa-fw'/> Log out</button>
|
<button onClick={this.handleLogoutClick}><i className='fa fa-sign-out fa-fw'/> Log out</button>
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
var React = require('react')
|
var React = require('react')
|
||||||
|
|
||||||
|
var socket = require('../Services/socket')
|
||||||
|
|
||||||
var KeyCaster = require('../Mixins/KeyCaster')
|
var KeyCaster = require('../Mixins/KeyCaster')
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
@@ -23,6 +25,8 @@ module.exports = React.createClass({
|
|||||||
logout: function () {
|
logout: function () {
|
||||||
localStorage.removeItem('currentUser')
|
localStorage.removeItem('currentUser')
|
||||||
localStorage.removeItem('token')
|
localStorage.removeItem('token')
|
||||||
|
socket.reconnect()
|
||||||
|
|
||||||
this.props.transitionTo('login')
|
this.props.transitionTo('login')
|
||||||
this.props.close()
|
this.props.close()
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ module.exports = React.createClass({
|
|||||||
},
|
},
|
||||||
submit: function () {
|
submit: function () {
|
||||||
var planet = this.props.planet
|
var planet = this.props.planet
|
||||||
Hq.destroyNote(planet.userName, planet.name, this.props.note.localId)
|
Hq.destroyNote(planet.Owner.name, planet.name, this.props.note.localId)
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
PlanetStore.Actions.destroyNote(res.body)
|
PlanetStore.Actions.destroyNote(res.body)
|
||||||
this.props.close()
|
this.props.close()
|
||||||
|
|||||||
@@ -16,14 +16,14 @@ var getOptions = function (input, callback) {
|
|||||||
Hq.searchTag(input)
|
Hq.searchTag(input)
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
callback(null, {
|
callback(null, {
|
||||||
options: res.body.map(function (tag) {
|
options: res.body.map(function (tag) {
|
||||||
return {
|
return {
|
||||||
label: tag.name,
|
label: tag.name,
|
||||||
value: tag.name
|
value: tag.name
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
complete: false
|
complete: false
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
@@ -89,18 +89,18 @@ module.exports = React.createClass({
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (this.props.note == null) {
|
if (this.props.note == null) {
|
||||||
Hq.createNote(planet.userName, planet.name, this.state.note)
|
Hq.createNote(planet.Owner.name, planet.name, this.state.note)
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
var note = res.body
|
var note = res.body
|
||||||
PlanetStore.Actions.updateNote(note)
|
PlanetStore.Actions.updateNote(note)
|
||||||
this.props.close()
|
this.props.close()
|
||||||
this.props.transitionTo('notes', {userName: planet.userName, planetName: planet.name, localId: note.localId})
|
this.props.transitionTo('notes', {userName: planet.Owner.name, planetName: planet.name, localId: note.localId})
|
||||||
}.bind(this))
|
}.bind(this))
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
Hq.updateNote(planet.userName, planet.name, this.props.note.localId, this.state.note)
|
Hq.updateNote(planet.Owner.name, planet.name, this.props.note.localId, this.state.note)
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
var note = res.body
|
var note = res.body
|
||||||
PlanetStore.Actions.updateNote(note)
|
PlanetStore.Actions.updateNote(note)
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ module.exports = React.createClass({
|
|||||||
<div className='detailHeader'>
|
<div className='detailHeader'>
|
||||||
<div className='itemLeft'>
|
<div className='itemLeft'>
|
||||||
<ProfileImage className='profileImage' size='25' email={article.User.email}/>
|
<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>
|
||||||
|
|
||||||
<div className='itemRight'>
|
<div className='itemRight'>
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ module.exports = React.createClass({
|
|||||||
return function (e) {
|
return function (e) {
|
||||||
var params = this.getParams()
|
var params = this.getParams()
|
||||||
|
|
||||||
document.getElementById('articleEditButton').focus()
|
|
||||||
this.transitionTo('codes', {
|
this.transitionTo('codes', {
|
||||||
userName: params.userName,
|
userName: params.userName,
|
||||||
planetName: params.planetName,
|
planetName: params.planetName,
|
||||||
@@ -31,7 +30,6 @@ module.exports = React.createClass({
|
|||||||
return function (e) {
|
return function (e) {
|
||||||
var params = this.getParams()
|
var params = this.getParams()
|
||||||
|
|
||||||
document.getElementById('articleEditButton').focus()
|
|
||||||
this.transitionTo('notes', {
|
this.transitionTo('notes', {
|
||||||
userName: params.userName,
|
userName: params.userName,
|
||||||
planetName: params.planetName,
|
planetName: params.planetName,
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ module.exports = React.createClass({
|
|||||||
name: '',
|
name: '',
|
||||||
public: true
|
public: true
|
||||||
},
|
},
|
||||||
ownerName: ownerName
|
ownerName: ownerName,
|
||||||
|
error: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
componentDidMount: function () {
|
componentDidMount: function () {
|
||||||
@@ -42,7 +43,7 @@ module.exports = React.createClass({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
handleSubmit: function () {
|
handleSubmit: function () {
|
||||||
this.setState({errorMessage: null}, function () {
|
this.setState({error: null}, function () {
|
||||||
Hq.createPlanet(this.state.ownerName, this.state.planet)
|
Hq.createPlanet(this.state.ownerName, this.state.planet)
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
var planet = res.body
|
var planet = res.body
|
||||||
@@ -50,15 +51,28 @@ module.exports = React.createClass({
|
|||||||
PlanetStore.Actions.update(planet)
|
PlanetStore.Actions.update(planet)
|
||||||
|
|
||||||
if (this.props.transitionTo != null) {
|
if (this.props.transitionTo != null) {
|
||||||
this.props.transitionTo('planetHome', {userName: planet.userName, planetName: planet.name})
|
this.props.transitionTo('planetHome', {userName: planet.Owner.name, planetName: planet.name})
|
||||||
}
|
}
|
||||||
|
|
||||||
this.props.close()
|
this.props.close()
|
||||||
}.bind(this))
|
}.bind(this))
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
console.error(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))
|
}.bind(this))
|
||||||
})
|
})
|
||||||
@@ -86,7 +100,7 @@ module.exports = React.createClass({
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</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'>
|
<button onClick={this.handleSubmit} className='submitButton'>
|
||||||
<i className='fa fa-check'/>
|
<i className='fa fa-check'/>
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ module.exports = React.createClass({
|
|||||||
},
|
},
|
||||||
render: function () {
|
render: function () {
|
||||||
var currentPlanetName = this.props.currentPlanet.name
|
var currentPlanetName = this.props.currentPlanet.name
|
||||||
var currentUserName = this.props.currentPlanet.userName
|
var currentUserName = this.props.currentPlanet.Owner.name
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='PlanetHeader'>
|
<div className='PlanetHeader'>
|
||||||
|
|||||||
@@ -10,11 +10,20 @@ module.exports = React.createClass({
|
|||||||
mixins: [Modal, Navigation],
|
mixins: [Modal, Navigation],
|
||||||
propTypes: {
|
propTypes: {
|
||||||
planet: React.PropTypes.shape({
|
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,
|
search: React.PropTypes.string,
|
||||||
toggleCodeFilter: React.PropTypes.func,
|
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 () {
|
getInitialState: function () {
|
||||||
return {
|
return {
|
||||||
@@ -24,6 +33,17 @@ module.exports = React.createClass({
|
|||||||
openLaunchModal: function () {
|
openLaunchModal: function () {
|
||||||
this.openModal(LaunchModal, {planet: this.props.planet, transitionTo: this.transitionTo})
|
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 () {
|
render: function () {
|
||||||
var keywords = this.props.search.split(' ')
|
var keywords = this.props.search.split(' ')
|
||||||
var usingCodeFilter = keywords.some(function (keyword) {
|
var usingCodeFilter = keywords.some(function (keyword) {
|
||||||
@@ -37,9 +57,11 @@ module.exports = React.createClass({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='PlanetNavigator'>
|
<div className='PlanetNavigator'>
|
||||||
<button onClick={this.openLaunchModal} className='launchButton btn-primary btn-block'>
|
{this.isMyPlanet() ? (
|
||||||
<i className='fa fa-rocket fa-fw'/> Launch
|
<button onClick={this.openLaunchModal} className='launchButton btn-primary btn-block'>
|
||||||
</button>
|
<i className='fa fa-rocket fa-fw'/> Launch
|
||||||
|
</button>
|
||||||
|
) : null}
|
||||||
<nav className='articleFilters'>
|
<nav className='articleFilters'>
|
||||||
<a className={usingCodeFilter && !usingNoteFilter ? 'active' : ''} onClick={this.props.toggleCodeFilter}>
|
<a className={usingCodeFilter && !usingNoteFilter ? 'active' : ''} onClick={this.props.toggleCodeFilter}>
|
||||||
<i className='fa fa-code fa-fw'/> Codes
|
<i className='fa fa-code fa-fw'/> Codes
|
||||||
|
|||||||
@@ -14,7 +14,9 @@ module.exports = React.createClass({
|
|||||||
planet: React.PropTypes.shape({
|
planet: React.PropTypes.shape({
|
||||||
name: React.PropTypes.string,
|
name: React.PropTypes.string,
|
||||||
public: React.PropTypes.bool,
|
public: React.PropTypes.bool,
|
||||||
userName: React.PropTypes.string
|
Owner: React.PropTypes.shape({
|
||||||
|
name: React.PropTypes.string
|
||||||
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
getInitialState: function () {
|
getInitialState: function () {
|
||||||
@@ -58,18 +60,44 @@ module.exports = React.createClass({
|
|||||||
handleSavePlanetProfile: function (e) {
|
handleSavePlanetProfile: function (e) {
|
||||||
var planet = this.props.planet
|
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)
|
Hq.updatePlanet(planet.Owner.name, planet.name, this.state.planet)
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
var planet = res.body
|
var planet = res.body
|
||||||
|
console.log(planet)
|
||||||
this.setState({profileSubmitStatus: 'done'})
|
this.setState({profileFormStatus: 'done'})
|
||||||
|
|
||||||
PlanetStore.Actions.update(planet)
|
PlanetStore.Actions.update(planet)
|
||||||
|
this.props.close()
|
||||||
}.bind(this))
|
}.bind(this))
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
this.setState({profileSubmitStatus: 'error'})
|
|
||||||
console.error(err)
|
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))
|
}.bind(this))
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
@@ -77,7 +105,7 @@ module.exports = React.createClass({
|
|||||||
var planet = this.props.planet
|
var planet = this.props.planet
|
||||||
|
|
||||||
this.setState({deleteSubmitStatus: 'sending'}, function () {
|
this.setState({deleteSubmitStatus: 'sending'}, function () {
|
||||||
Hq.destroyPlanet(planet.userName, planet.name)
|
Hq.destroyPlanet(planet.Owner.name, planet.name)
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
var planet = res.body
|
var planet = res.body
|
||||||
|
|
||||||
@@ -99,9 +127,9 @@ module.exports = React.createClass({
|
|||||||
content = this.state.currentTab === 'profile' ? this.renderPlanetProfileTab() : this.renderPlanetDeleteTab()
|
content = this.state.currentTab === 'profile' ? this.renderPlanetProfileTab() : this.renderPlanetDeleteTab()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='PlanetSettingModal modal tabModal'>
|
<div className='PlanetSettingModal sideNavModal modal'>
|
||||||
<div className='leftPane'>
|
<div className='leftPane'>
|
||||||
<h1 className='tabLabel'>Planet setting</h1>
|
<h1 className='modalLabel'>Planet setting</h1>
|
||||||
<nav className='tabList'>
|
<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.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>
|
<button onClick={this.activePlanetDelete} className={this.state.currentTab === 'delete' ? 'active' : ''}><i className='fa fa-trash fa-fw'/> Delete Planet</button>
|
||||||
@@ -116,7 +144,7 @@ module.exports = React.createClass({
|
|||||||
},
|
},
|
||||||
renderPlanetProfileTab: function () {
|
renderPlanetProfileTab: function () {
|
||||||
return (
|
return (
|
||||||
<div className='planetProfileTab'>
|
<div className='planetProfileTab tab'>
|
||||||
<div className='formField'>
|
<div className='formField'>
|
||||||
<label>Planet name </label>
|
<label>Planet name </label>
|
||||||
<input valueLink={this.linkState('planet.name')}/>
|
<input valueLink={this.linkState('planet.name')}/>
|
||||||
@@ -130,22 +158,22 @@ module.exports = React.createClass({
|
|||||||
<div className='formConfirm'>
|
<div className='formConfirm'>
|
||||||
<button onClick={this.handleSavePlanetProfile} className='saveButton btn-primary'>Save</button>
|
<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>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
renderPlanetDeleteTab: function () {
|
renderPlanetDeleteTab: function () {
|
||||||
var disabled = !this.state.deleteConfirmation.match(new RegExp('^' + this.props.planet.userName + '/' + this.props.planet.name + '$'))
|
var disabled = !this.state.deleteConfirmation.match(new RegExp('^' + this.props.planet.Owner.name + '/' + this.props.planet.name + '$'))
|
||||||
|
|
||||||
return (
|
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>Are you sure to destroy <strong>'{this.props.planet.Owner.name + '/' + 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>
|
<p>If you are sure, write <strong>'{this.props.planet.Owner.name + '/' + 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'/>
|
<input valueLink={this.linkState('deleteConfirmation')} placeholder='userName/planetName'/>
|
||||||
<div className='formConfirm'>
|
<div className='formConfirm'>
|
||||||
<button disabled={disabled} onClick={this.handleDeletePlanetClick}>{this.state.randomDeleteText}</button>
|
<button disabled={disabled} onClick={this.handleDeletePlanetClick}>{this.state.randomDeleteText}</button>
|
||||||
|
|||||||
112
browser/main/Components/PreferencesModal.jsx
Normal file
112
browser/main/Components/PreferencesModal.jsx
Normal 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>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
var React = require('react/addons')
|
var React = require('react/addons')
|
||||||
|
|
||||||
var Hq = require('../Services/Hq')
|
var Hq = require('../Services/Hq')
|
||||||
|
var socket = require('../Services/socket')
|
||||||
|
|
||||||
var LinkedState = require('../Mixins/LinkedState')
|
var LinkedState = require('../Mixins/LinkedState')
|
||||||
var KeyCaster = require('../Mixins/KeyCaster')
|
var KeyCaster = require('../Mixins/KeyCaster')
|
||||||
@@ -22,7 +23,8 @@ module.exports = React.createClass({
|
|||||||
return {
|
return {
|
||||||
team: {
|
team: {
|
||||||
name: ''
|
name: ''
|
||||||
}
|
},
|
||||||
|
error: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
componentDidMount: function () {
|
componentDidMount: function () {
|
||||||
@@ -39,29 +41,45 @@ module.exports = React.createClass({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
handleSubmit: function () {
|
handleSubmit: function () {
|
||||||
Hq.createTeam(this.props.user.name, this.state.team)
|
this.setState({error: null}, function () {
|
||||||
.then(function (res) {
|
Hq.createTeam(this.props.user.name, this.state.team)
|
||||||
var currentUser = JSON.parse(localStorage.getItem('currentUser'))
|
.then(function (res) {
|
||||||
var team = res.body
|
var currentUser = JSON.parse(localStorage.getItem('currentUser'))
|
||||||
|
var team = res.body
|
||||||
|
|
||||||
currentUser.Teams.push(team)
|
currentUser.Teams.push(team)
|
||||||
localStorage.setItem('currentUser', JSON.stringify(currentUser))
|
localStorage.setItem('currentUser', JSON.stringify(currentUser))
|
||||||
UserStore.Actions.update(currentUser)
|
socket.reconnect(currentUser)
|
||||||
|
UserStore.Actions.update(currentUser)
|
||||||
|
|
||||||
if (this.props.transitionTo != null) {
|
if (this.props.transitionTo != null) {
|
||||||
this.props.transitionTo('userHome', {userName: team.name})
|
this.props.transitionTo('userHome', {userName: team.name})
|
||||||
}
|
}
|
||||||
this.props.close()
|
this.props.close()
|
||||||
}.bind(this))
|
}.bind(this))
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
console.error(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 () {
|
render: function () {
|
||||||
return (
|
return (
|
||||||
<div className='TeamCreateModal modal'>
|
<div className='TeamCreateModal modal'>
|
||||||
<input ref='teamName' valueLink={this.linkState('team.name')} className='nameInput stripInput' placeholder='Create new team'/>
|
<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'>
|
<button onClick={this.handleSubmit} className='submitButton'>
|
||||||
<i className='fa fa-check'/>
|
<i className='fa fa-check'/>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -43,12 +43,9 @@ module.exports = React.createClass({
|
|||||||
close: React.PropTypes.func
|
close: React.PropTypes.func
|
||||||
},
|
},
|
||||||
getInitialState: function () {
|
getInitialState: function () {
|
||||||
var team = this.props.team
|
|
||||||
return {
|
return {
|
||||||
currentTab: 'teamInfo',
|
currentTab: 'teamInfo',
|
||||||
team: {
|
team: this.props.team,
|
||||||
profileName: team.profileName
|
|
||||||
},
|
|
||||||
userSubmitStatus: null,
|
userSubmitStatus: null,
|
||||||
member: {
|
member: {
|
||||||
name: '',
|
name: '',
|
||||||
@@ -65,17 +62,10 @@ module.exports = React.createClass({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
onUserChange: function (res) {
|
onUserChange: function (res) {
|
||||||
var member
|
|
||||||
switch (res.status) {
|
switch (res.status) {
|
||||||
case 'memberAdded':
|
case 'userUpdated':
|
||||||
member = res.data
|
var user = res.data
|
||||||
if (member.TeamMember.TeamId === this.props.team.id) {
|
if (user.id === this.props.team.id) {
|
||||||
this.forceUpdate()
|
|
||||||
}
|
|
||||||
break
|
|
||||||
case 'memberRemoved':
|
|
||||||
member = res.data
|
|
||||||
if (member.TeamMember.TeamId === this.props.team.id) {
|
|
||||||
this.forceUpdate()
|
this.forceUpdate()
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
@@ -116,8 +106,7 @@ module.exports = React.createClass({
|
|||||||
role: this.state.member.role
|
role: this.state.member.role
|
||||||
})
|
})
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
UserStore.Actions.addMember(res.body)
|
this.setState({updatingMember: false, team: res.body})
|
||||||
this.setState({updatingMember: false})
|
|
||||||
}.bind(this))
|
}.bind(this))
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
@@ -135,8 +124,7 @@ module.exports = React.createClass({
|
|||||||
role: role
|
role: role
|
||||||
})
|
})
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
UserStore.Actions.addMember(res.body)
|
this.setState({updatingMember: false, team: res.body})
|
||||||
this.setState({updatingMember: false})
|
|
||||||
}.bind(this))
|
}.bind(this))
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
@@ -153,8 +141,7 @@ module.exports = React.createClass({
|
|||||||
userName: memberName
|
userName: memberName
|
||||||
})
|
})
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
UserStore.Actions.removeMember(res.body)
|
this.setState({updatingMember: false, team: res.body})
|
||||||
this.setState({updatingMember: false})
|
|
||||||
}.bind(this))
|
}.bind(this))
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
@@ -176,9 +163,9 @@ module.exports = React.createClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='TeamSettingsModal modal tabModal'>
|
<div className='TeamSettingsModal sideNavModal modal'>
|
||||||
<div className='leftPane'>
|
<div className='leftPane'>
|
||||||
<div className='tabLabel'>Team settings</div>
|
<div className='modalLabel'>Team settings</div>
|
||||||
<div className='tabList'>
|
<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 === '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>
|
<button className={this.state.currentTab === 'members' ? 'active' : ''} onClick={this.selectTab('members')}><i className='fa fa-users fa-fw'/> Members</button>
|
||||||
@@ -192,7 +179,7 @@ module.exports = React.createClass({
|
|||||||
},
|
},
|
||||||
renderTeamInfoTab: function () {
|
renderTeamInfoTab: function () {
|
||||||
return (
|
return (
|
||||||
<div className='userInfoTab'>
|
<div className='userInfoTab tab'>
|
||||||
<div className='formField'>
|
<div className='formField'>
|
||||||
<label>Profile Name</label>
|
<label>Profile Name</label>
|
||||||
<input valueLink={this.linkState('team.profileName')}/>
|
<input valueLink={this.linkState('team.profileName')}/>
|
||||||
@@ -212,7 +199,7 @@ module.exports = React.createClass({
|
|||||||
renderMembersTab: function () {
|
renderMembersTab: function () {
|
||||||
var currentUser = JSON.parse(localStorage.getItem('currentUser'))
|
var currentUser = JSON.parse(localStorage.getItem('currentUser'))
|
||||||
|
|
||||||
var members = this.props.team.Members.map(function (member) {
|
var members = this.state.team.Members.map(function (member) {
|
||||||
var isCurrentUser = currentUser.id === member.id
|
var isCurrentUser = currentUser.id === member.id
|
||||||
return (
|
return (
|
||||||
<tr>
|
<tr>
|
||||||
@@ -239,7 +226,7 @@ module.exports = React.createClass({
|
|||||||
var belowLimit = members.length < 5
|
var belowLimit = members.length < 5
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='membersTab'>
|
<div className='membersTab tab'>
|
||||||
<table className='memberTable'>
|
<table className='memberTable'>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ var Link = ReactRouter.Link
|
|||||||
var AuthFilter = require('../Mixins/AuthFilter')
|
var AuthFilter = require('../Mixins/AuthFilter')
|
||||||
var LinkedState = require('../Mixins/LinkedState')
|
var LinkedState = require('../Mixins/LinkedState')
|
||||||
var Hq = require('../Services/Hq')
|
var Hq = require('../Services/Hq')
|
||||||
|
var socket = require('../Services/socket')
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
mixins: [LinkedState, ReactRouter.Navigation, AuthFilter.OnlyGuest],
|
mixins: [LinkedState, ReactRouter.Navigation, AuthFilter.OnlyGuest],
|
||||||
@@ -47,6 +48,7 @@ module.exports = React.createClass({
|
|||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
localStorage.setItem('token', res.body.token)
|
localStorage.setItem('token', res.body.token)
|
||||||
localStorage.setItem('currentUser', JSON.stringify(res.body.user))
|
localStorage.setItem('currentUser', JSON.stringify(res.body.user))
|
||||||
|
socket.reconnect()
|
||||||
|
|
||||||
this.transitionTo('userHome', {userName: res.body.user.name})
|
this.transitionTo('userHome', {userName: res.body.user.name})
|
||||||
}.bind(this))
|
}.bind(this))
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ var Navigation = ReactRouter.Navigation
|
|||||||
var State = ReactRouter.State
|
var State = ReactRouter.State
|
||||||
|
|
||||||
var Hq = require('../Services/Hq')
|
var Hq = require('../Services/Hq')
|
||||||
|
var socket = require('../Services/socket')
|
||||||
|
|
||||||
var Modal = require('../Mixins/Modal')
|
var Modal = require('../Mixins/Modal')
|
||||||
|
|
||||||
@@ -17,7 +18,7 @@ var UserStore = require('../Stores/UserStore')
|
|||||||
var ContactModal = require('../Components/ContactModal')
|
var ContactModal = require('../Components/ContactModal')
|
||||||
|
|
||||||
function fetchPlanet (userName, planetName) {
|
function fetchPlanet (userName, planetName) {
|
||||||
Hq.fetchPlanet(userName, planetName)
|
return Hq.fetchPlanet(userName, planetName)
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
var planet = res.body
|
var planet = res.body
|
||||||
|
|
||||||
@@ -29,8 +30,9 @@ function fetchPlanet (userName, planetName) {
|
|||||||
note.type = 'note'
|
note.type = 'note'
|
||||||
})
|
})
|
||||||
|
|
||||||
console.log('planet-' + planet.id + ' fetched!')
|
|
||||||
localStorage.setItem('planet-' + planet.id, JSON.stringify(planet))
|
localStorage.setItem('planet-' + planet.id, JSON.stringify(planet))
|
||||||
|
|
||||||
|
return planet
|
||||||
})
|
})
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
@@ -55,22 +57,20 @@ module.exports = React.createClass({
|
|||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
this.transitionTo('home')
|
this.transitionTo('home')
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Hq.getUser()
|
Hq.getUser()
|
||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
var user = res.body
|
var user = res.body
|
||||||
localStorage.setItem('currentUser', JSON.stringify(user))
|
|
||||||
UserStore.Actions.update(user)
|
UserStore.Actions.update(user)
|
||||||
|
|
||||||
user.Planets.forEach(function (planet) {
|
user.Planets.forEach(function (planet) {
|
||||||
fetchPlanet(planet.userName, planet.name)
|
fetchPlanet(user.name, planet.name)
|
||||||
})
|
})
|
||||||
user.Teams.forEach(function (team) {
|
user.Teams.forEach(function (team) {
|
||||||
team.Planets.forEach(function (planet) {
|
team.Planets.forEach(function (planet) {
|
||||||
fetchPlanet(planet.userName, planet.name)
|
fetchPlanet(team.name, planet.name)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -41,10 +41,10 @@ module.exports = React.createClass({
|
|||||||
var planet = this.state.planet
|
var planet = this.state.planet
|
||||||
switch (article.type) {
|
switch (article.type) {
|
||||||
case 'code':
|
case 'code':
|
||||||
this.transitionTo('codes', {userName: planet.userName, planetName: planet.name, localId: article.localId})
|
this.transitionTo('codes', {userName: planet.Owner.name, planetName: planet.name, localId: article.localId})
|
||||||
break
|
break
|
||||||
case 'note':
|
case 'note':
|
||||||
this.transitionTo('notes', {userName: planet.userName, planetName: planet.name, localId: article.localId})
|
this.transitionTo('notes', {userName: planet.Owner.name, planetName: planet.name, localId: article.localId})
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -55,7 +55,7 @@ module.exports = React.createClass({
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nextProps.params.userName !== this.state.planet.userName || nextProps.params.planetName !== this.state.planet.name) {
|
if (nextProps.params.userName !== this.state.planet.Owner.name || nextProps.params.planetName !== this.state.planet.name) {
|
||||||
this.setState({
|
this.setState({
|
||||||
planet: null
|
planet: null
|
||||||
}, function () {
|
}, function () {
|
||||||
@@ -96,14 +96,14 @@ module.exports = React.createClass({
|
|||||||
if (this.state.planet.name === planet.name) {
|
if (this.state.planet.name === planet.name) {
|
||||||
this.setState({planet: planet})
|
this.setState({planet: planet})
|
||||||
} else {
|
} else {
|
||||||
this.transitionTo('planetHome', {userName: planet.userName, planetName: planet.name})
|
this.transitionTo('planetHome', {userName: planet.Owner.name, planetName: planet.name})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 'destroyed':
|
case 'destroyed':
|
||||||
planet = res.data
|
planet = res.data
|
||||||
if (this.state.planet.id === planet.id) {
|
if (this.state.planet.id === planet.id) {
|
||||||
this.transitionTo('userHome', {userName: this.state.planet.userName})
|
this.transitionTo('userHome', {userName: this.state.planet.Owner.name})
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 'codeUpdated':
|
case 'codeUpdated':
|
||||||
@@ -399,7 +399,8 @@ module.exports = React.createClass({
|
|||||||
showAll={this.showAll}
|
showAll={this.showAll}
|
||||||
toggleCodeFilter={this.toggleCodeFilter}
|
toggleCodeFilter={this.toggleCodeFilter}
|
||||||
toggleNoteFilter={this.toggleNoteFilter}
|
toggleNoteFilter={this.toggleNoteFilter}
|
||||||
planet={this.state.planet}/>
|
planet={this.state.planet}
|
||||||
|
currentUser={this.state.currentUser}/>
|
||||||
|
|
||||||
<PlanetArticleList showOnlyWithTag={this.applyTagFilter} ref='list' articles={filteredArticles}/>
|
<PlanetArticleList showOnlyWithTag={this.applyTagFilter} ref='list' articles={filteredArticles}/>
|
||||||
|
|
||||||
|
|||||||
@@ -6,10 +6,12 @@ var Link = ReactRouter.Link
|
|||||||
|
|
||||||
var AuthFilter = require('../Mixins/AuthFilter')
|
var AuthFilter = require('../Mixins/AuthFilter')
|
||||||
var LinkedState = require('../Mixins/LinkedState')
|
var LinkedState = require('../Mixins/LinkedState')
|
||||||
|
var ExternalLink = require('../Mixins/ExternalLink')
|
||||||
var Hq = require('../Services/Hq')
|
var Hq = require('../Services/Hq')
|
||||||
|
var socket = require('../Services/socket')
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
mixins: [LinkedState, ReactRouter.Navigation, AuthFilter.OnlyGuest],
|
mixins: [LinkedState, ReactRouter.Navigation, AuthFilter.OnlyGuest, ExternalLink],
|
||||||
getInitialState: function () {
|
getInitialState: function () {
|
||||||
return {
|
return {
|
||||||
user: {},
|
user: {},
|
||||||
@@ -32,6 +34,7 @@ module.exports = React.createClass({
|
|||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
localStorage.setItem('token', res.body.token)
|
localStorage.setItem('token', res.body.token)
|
||||||
localStorage.setItem('currentUser', JSON.stringify(res.body.user))
|
localStorage.setItem('currentUser', JSON.stringify(res.body.user))
|
||||||
|
socket.reconnect()
|
||||||
|
|
||||||
this.transitionTo('userHome', {userName: res.body.user.name})
|
this.transitionTo('userHome', {userName: res.body.user.name})
|
||||||
}.bind(this))
|
}.bind(this))
|
||||||
@@ -129,7 +132,7 @@ module.exports = React.createClass({
|
|||||||
</div>
|
</div>
|
||||||
</form>
|
</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>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -230,7 +230,7 @@ module.exports = React.createClass({
|
|||||||
var userPlanets = user.Planets.map(function (planet) {
|
var userPlanets = user.Planets.map(function (planet) {
|
||||||
return (
|
return (
|
||||||
<li key={'planet-' + planet.id}>
|
<li key={'planet-' + planet.id}>
|
||||||
<Link to='planet' params={{userName: planet.userName, planetName: planet.name}}>{planet.userName}/{planet.name}</Link>
|
<Link to='planet' params={{userName: user.name, planetName: planet.name}}>{user.name}/{planet.name}</Link>
|
||||||
{!planet.public ? (<i className='fa fa-lock'/>) : null}
|
{!planet.public ? (<i className='fa fa-lock'/>) : null}
|
||||||
</li>
|
</li>
|
||||||
)
|
)
|
||||||
@@ -288,7 +288,7 @@ module.exports = React.createClass({
|
|||||||
var userPlanets = user.Planets.map(function (planet) {
|
var userPlanets = user.Planets.map(function (planet) {
|
||||||
return (
|
return (
|
||||||
<li key={'planet-' + planet.id}>
|
<li key={'planet-' + planet.id}>
|
||||||
<Link to='planet' params={{userName: planet.userName, planetName: planet.name}}>{planet.userName}/{planet.name}</Link>
|
<Link to='planet' params={{userName: user.name, planetName: planet.name}}>{user.name}/{planet.name}</Link>
|
||||||
{!planet.public ? (<i className='fa fa-lock'/>) : null}
|
{!planet.public ? (<i className='fa fa-lock'/>) : null}
|
||||||
</li>
|
</li>
|
||||||
)
|
)
|
||||||
@@ -311,14 +311,14 @@ module.exports = React.createClass({
|
|||||||
var planets = (team.Planets == null ? [] : team.Planets).map(function (planet) {
|
var planets = (team.Planets == null ? [] : team.Planets).map(function (planet) {
|
||||||
return (
|
return (
|
||||||
<li key={'planet-' + planet.id}>
|
<li key={'planet-' + planet.id}>
|
||||||
<Link to='planet' params={{userName: planet.userName, planetName: planet.name}}>{planet.userName}/{planet.name}</Link>
|
<Link to='planet' params={{userName: team.name, planetName: planet.name}}>{team.name}/{planet.name}</Link>
|
||||||
{!planet.public ? (<i className='fa fa-lock'/>) : null}
|
{!planet.public ? (<i className='fa fa-lock'/>) : null}
|
||||||
</li>
|
</li>
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
return (
|
return (
|
||||||
<div key={'user-' + team.id} className='planetGroup'>
|
<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'>
|
<ul className='planets'>
|
||||||
{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}
|
{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='planetList'>
|
||||||
<div className='planetLabel'>{planetCount} {planetCount > 1 ? 'Planets' : 'Planet'}</div>
|
<div className='planetLabel'>{planetCount} {planetCount > 1 ? 'Planets' : 'Planet'}</div>
|
||||||
<div className='planetGroup'>
|
<div className='planetGroup'>
|
||||||
<div className='planetGroupLabel'>{user.profileName}</div>
|
<div className='planetGroupLabel'>{user.profileName} <small>@{user.name}</small></div>
|
||||||
<ul className='planets'>
|
<ul className='planets'>
|
||||||
{userPlanets}
|
{userPlanets}
|
||||||
{isOwner ? (<li><button onClick={this.openPlanetCreateModalWithOwnerName(user.name)} className='createPlanetButton'><i className='fa fa-plus-square-o'/> Create new planet</button></li>) : null}
|
{isOwner ? (<li><button onClick={this.openPlanetCreateModalWithOwnerName(user.name)} className='createPlanetButton'><i className='fa fa-plus-square-o'/> Create new planet</button></li>) : null}
|
||||||
|
|||||||
64
browser/main/Services/socket.js
Normal file
64
browser/main/Services/socket.js
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
/* global localStorage */
|
||||||
|
|
||||||
|
var config = require('../../../config')
|
||||||
|
var UserStore = require('../Stores/UserStore')
|
||||||
|
var PlanetStore = require('../Stores/PlanetStore')
|
||||||
|
|
||||||
|
var io = require('socket.io-client')(config.apiUrl)
|
||||||
|
|
||||||
|
io.on('connected', function (data) {
|
||||||
|
console.log('connected by WS')
|
||||||
|
reconnect()
|
||||||
|
})
|
||||||
|
|
||||||
|
io.on('userUpdated', function (data) {
|
||||||
|
console.log('userUpdated')
|
||||||
|
UserStore.Actions.update(data)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Planet
|
||||||
|
io.on('planetUpdated', function (data) {
|
||||||
|
console.log('planetUpdated')
|
||||||
|
PlanetStore.Actions.update(data)
|
||||||
|
})
|
||||||
|
|
||||||
|
io.on('planetDestroyed', function (data) {
|
||||||
|
console.log('planetDestroyed')
|
||||||
|
PlanetStore.Actions.destroy(data)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Article
|
||||||
|
io.on('codeUpdated', function (data) {
|
||||||
|
console.log('codeUpdated')
|
||||||
|
PlanetStore.Actions.updateCode(data)
|
||||||
|
})
|
||||||
|
io.on('codeDestroyed', function (data) {
|
||||||
|
console.log('codeDestroyed')
|
||||||
|
PlanetStore.Actions.destroyCode(data)
|
||||||
|
})
|
||||||
|
io.on('noteUpdated', function (data) {
|
||||||
|
console.log('noteUpdated')
|
||||||
|
PlanetStore.Actions.updateNote(data)
|
||||||
|
})
|
||||||
|
io.on('noteDestroyed', function (data) {
|
||||||
|
console.log('noteDestroyed')
|
||||||
|
PlanetStore.Actions.destroyNote(data)
|
||||||
|
})
|
||||||
|
|
||||||
|
var reconnect = function (currentUser) {
|
||||||
|
if (currentUser == null) currentUser = JSON.parse(localStorage.getItem('currentUser'))
|
||||||
|
if (currentUser != null) {
|
||||||
|
var rooms = ['user:' + currentUser.id].concat(currentUser.Teams.map(function (team) {
|
||||||
|
return 'user:' + team.id
|
||||||
|
}))
|
||||||
|
|
||||||
|
io.emit('room:sync', {rooms: rooms})
|
||||||
|
} else {
|
||||||
|
io.emit('room:sync', {rooms: []})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
io: io,
|
||||||
|
reconnect: reconnect
|
||||||
|
}
|
||||||
@@ -19,39 +19,59 @@ module.exports = Reflux.createStore({
|
|||||||
mixins: [Helper],
|
mixins: [Helper],
|
||||||
listenables: [actions],
|
listenables: [actions],
|
||||||
Actions: actions,
|
Actions: actions,
|
||||||
|
/*
|
||||||
|
Planet must be updated like below
|
||||||
|
Planet
|
||||||
|
Codes
|
||||||
|
Tags
|
||||||
|
User
|
||||||
|
Notes
|
||||||
|
Tags
|
||||||
|
User
|
||||||
|
Owner
|
||||||
|
*/
|
||||||
onUpdate: function (planet) {
|
onUpdate: function (planet) {
|
||||||
// Copy the planet object
|
// Copy the planet object
|
||||||
var aPlanet = Object.assign({}, planet)
|
var aPlanet = Object.assign({}, planet)
|
||||||
delete aPlanet.Codes
|
delete aPlanet.Codes
|
||||||
delete aPlanet.Notes
|
delete aPlanet.Notes
|
||||||
|
delete aPlanet.Owner
|
||||||
|
|
||||||
// Check if the planet should be updated to currentUser
|
// Check if the planet should be updated to currentUser
|
||||||
var currentUser = JSON.parse(localStorage.getItem('currentUser'))
|
var currentUser = JSON.parse(localStorage.getItem('currentUser'))
|
||||||
|
|
||||||
var ownedByCurrentUser = currentUser.id === aPlanet.OwnerId
|
var currentUserMustBeUpdated = false
|
||||||
|
|
||||||
|
var ownedByCurrentUser = currentUser.id === aPlanet.OwnerId
|
||||||
if (ownedByCurrentUser) {
|
if (ownedByCurrentUser) {
|
||||||
currentUser.Planets = this.updateItemToTargetArray(aPlanet, currentUser.Planets)
|
currentUser.Planets = this.updateItemToTargetArray(aPlanet, currentUser.Planets)
|
||||||
}
|
currentUserMustBeUpdated = true
|
||||||
|
} else {
|
||||||
if (!ownedByCurrentUser) {
|
|
||||||
var team = null
|
var team = null
|
||||||
currentUser.Teams.some(function (_team) {
|
if (currentUser.Teams.some(function (_team) {
|
||||||
if (_team.id === aPlanet.OwnerId) {
|
if (_team.id === aPlanet.OwnerId) {
|
||||||
team = _team
|
team = _team
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return
|
return false
|
||||||
})
|
})) {
|
||||||
|
|
||||||
if (team) {
|
|
||||||
team.Planets = this.updateItemToTargetArray(aPlanet, team.Planets)
|
team.Planets = this.updateItemToTargetArray(aPlanet, team.Planets)
|
||||||
|
currentUserMustBeUpdated = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update currentUser
|
// Update currentUser
|
||||||
localStorage.setItem('currentUser', JSON.stringify(currentUser))
|
if (currentUserMustBeUpdated) {
|
||||||
UserStore.Actions.update(currentUser)
|
UserStore.Actions.update(currentUser)
|
||||||
|
}
|
||||||
|
|
||||||
|
planet.Codes.forEach(function (code) {
|
||||||
|
code.type = 'code'
|
||||||
|
})
|
||||||
|
|
||||||
|
planet.Notes.forEach(function (note) {
|
||||||
|
note.type = 'note'
|
||||||
|
})
|
||||||
|
|
||||||
// Update the planet
|
// Update the planet
|
||||||
localStorage.setItem('planet-' + planet.id, JSON.stringify(planet))
|
localStorage.setItem('planet-' + planet.id, JSON.stringify(planet))
|
||||||
|
|||||||
@@ -4,18 +4,19 @@ var Reflux = require('reflux')
|
|||||||
|
|
||||||
var actions = Reflux.createActions([
|
var actions = Reflux.createActions([
|
||||||
'update',
|
'update',
|
||||||
'destroy',
|
'destroy'
|
||||||
'addMember',
|
|
||||||
'removeMember'
|
|
||||||
])
|
])
|
||||||
|
|
||||||
module.exports = Reflux.createStore({
|
module.exports = Reflux.createStore({
|
||||||
listenables: [actions],
|
listenables: [actions],
|
||||||
onUpdate: function (user) {
|
onUpdate: function (user) {
|
||||||
var currentUser = JSON.parse(localStorage.getItem('currentUser'))
|
if (this.socket == null) this.socket = require('../Services/socket')
|
||||||
|
|
||||||
|
var currentUser = JSON.parse(localStorage.getItem('currentUser'))
|
||||||
if (currentUser.id === user.id) {
|
if (currentUser.id === user.id) {
|
||||||
localStorage.setItem('currentUser', JSON.stringify(user))
|
localStorage.setItem('currentUser', JSON.stringify(user))
|
||||||
|
|
||||||
|
this.socket.reconnect(user)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (user.userType === 'team') {
|
if (user.userType === 'team') {
|
||||||
@@ -53,17 +54,5 @@ module.exports = Reflux.createStore({
|
|||||||
data: user
|
data: user
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
onAddMember: function (member) {
|
|
||||||
this.trigger({
|
|
||||||
status: 'memberAdded',
|
|
||||||
data: member
|
|
||||||
})
|
|
||||||
},
|
|
||||||
onRemoveMember: function (member) {
|
|
||||||
this.trigger({
|
|
||||||
status: 'memberRemoved',
|
|
||||||
data: member
|
|
||||||
})
|
|
||||||
},
|
|
||||||
Actions: actions
|
Actions: actions
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,16 +1,55 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<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 charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
|
<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="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">
|
<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>
|
<script>
|
||||||
if (!Object.assign) {
|
if (!Object.assign) {
|
||||||
Object.defineProperty(Object, 'assign', {
|
Object.defineProperty(Object, 'assign', {
|
||||||
@@ -45,13 +84,14 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
require('electron-stylus')(__dirname + '/../styles/main/index.styl')
|
|
||||||
</script>
|
</script>
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="content"></div>
|
|
||||||
<script src="../ace/src-min/ace.js"></script>
|
<script src="../ace/src-min/ace.js"></script>
|
||||||
<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('node-jsx').install({ harmony: true, extension: '.jsx' })
|
||||||
require('./index.jsx')
|
require('./index.jsx')
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -34,7 +34,13 @@ var routes = (
|
|||||||
</Route>
|
</Route>
|
||||||
</Route>
|
</Route>
|
||||||
)
|
)
|
||||||
|
var loadingCover = document.getElementById('loadingCover')
|
||||||
|
|
||||||
ReactRouter.run(routes, ReactRouter.HashLocation, function (Root) {
|
ReactRouter.run(routes, ReactRouter.HashLocation, function (Root) {
|
||||||
React.render(<Root/>, document.getElementById('content'))
|
React.render(<Root/>, document.getElementById('content'))
|
||||||
|
|
||||||
|
if (loadingCover != null) {
|
||||||
|
loadingCover.parentNode.removeChild(loadingCover)
|
||||||
|
loadingCover = null
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -294,6 +294,9 @@
|
|||||||
.planetGroupLabel
|
.planetGroupLabel
|
||||||
font-size 1.1em
|
font-size 1.1em
|
||||||
margin-bottom 15px
|
margin-bottom 15px
|
||||||
|
small
|
||||||
|
font-size 0.8em
|
||||||
|
color inactiveTextColor
|
||||||
.planets
|
.planets
|
||||||
margin-left 15px
|
margin-left 15px
|
||||||
li
|
li
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ global-reset()
|
|||||||
@import './containers/*'
|
@import './containers/*'
|
||||||
|
|
||||||
html, body
|
html, body
|
||||||
width 100%
|
width 100%
|
||||||
height 100%
|
height 100%
|
||||||
overflow hidden
|
overflow hidden
|
||||||
|
|
||||||
body
|
body
|
||||||
font-family "Lato"
|
font-family "Lato"
|
||||||
|
|||||||
@@ -5,28 +5,29 @@ marked()
|
|||||||
margin 15px 0
|
margin 15px 0
|
||||||
h1
|
h1
|
||||||
font-size 2em
|
font-size 2em
|
||||||
margin 0 auto 0.67em
|
border-bottom solid 2px borderColor
|
||||||
|
margin 0.67em auto
|
||||||
h2
|
h2
|
||||||
font-size 1.5em
|
font-size 1.5em
|
||||||
margin 0 auto 0.83em
|
margin 0.83em auto
|
||||||
h3
|
h3
|
||||||
font-size 1.17em
|
font-size 1.17em
|
||||||
margin 0 auto 1em
|
margin 1em auto
|
||||||
h4
|
h4
|
||||||
font-size 1em
|
font-size 1em
|
||||||
margin 0 auto 1.33em
|
margin 1.33em auto
|
||||||
h5
|
h5
|
||||||
font-size 0.83em
|
font-size 0.83em
|
||||||
margin 0 auto 1.67em
|
margin 1.67em auto
|
||||||
h6
|
h6
|
||||||
font-size 0.67em
|
font-size 0.67em
|
||||||
margin 2.33em auto
|
margin 2.33em auto
|
||||||
h1, h2, h3, h4, h5, h6
|
h1, h2, h3, h4, h5, h6
|
||||||
font-weight 400
|
font-weight 700
|
||||||
line-height 1.4em
|
line-height 1.8em
|
||||||
p
|
p
|
||||||
line-height 1.4em
|
line-height 1.8em
|
||||||
margin-bottom 15px
|
margin-bottom 25px
|
||||||
img
|
img
|
||||||
max-width 100%
|
max-width 100%
|
||||||
strong
|
strong
|
||||||
@@ -42,6 +43,7 @@ marked()
|
|||||||
ul
|
ul
|
||||||
list-style-type disc
|
list-style-type disc
|
||||||
padding-left 35px
|
padding-left 35px
|
||||||
|
margin-bottom 25px
|
||||||
li
|
li
|
||||||
display list-item
|
display list-item
|
||||||
margin 15px 0
|
margin 15px 0
|
||||||
@@ -52,6 +54,7 @@ marked()
|
|||||||
ol
|
ol
|
||||||
list-style-type decimal
|
list-style-type decimal
|
||||||
padding-left 35px
|
padding-left 35px
|
||||||
|
margin-bottom 25px
|
||||||
li
|
li
|
||||||
display list-item
|
display list-item
|
||||||
margin 15px 0
|
margin 15px 0
|
||||||
@@ -63,12 +66,14 @@ marked()
|
|||||||
font-size 0.9em
|
font-size 0.9em
|
||||||
color black
|
color black
|
||||||
text-decoration none
|
text-decoration none
|
||||||
|
background-color #F6F6F6
|
||||||
pre
|
pre
|
||||||
padding 5px
|
padding 5px
|
||||||
border solid 1px borderColor
|
border solid 1px borderColor
|
||||||
border-radius 5px
|
border-radius 5px
|
||||||
overflow-x auto
|
overflow-x auto
|
||||||
margin-bottom 15px
|
margin-bottom 25px
|
||||||
|
background-color #F6F6F6
|
||||||
&>code
|
&>code
|
||||||
padding 0
|
padding 0
|
||||||
border none
|
border none
|
||||||
|
|||||||
@@ -32,14 +32,14 @@
|
|||||||
.modal-control
|
.modal-control
|
||||||
float right
|
float right
|
||||||
|
|
||||||
.tabModal
|
.sideNavModal
|
||||||
height 500px
|
height 500px
|
||||||
.leftPane
|
.leftPane
|
||||||
absolute top bottom left
|
absolute top bottom left
|
||||||
width 175px
|
width 175px
|
||||||
padding 20px
|
padding 20px
|
||||||
border-right solid 1px borderColor
|
border-right solid 1px borderColor
|
||||||
.tabLabel
|
.modalLabel
|
||||||
font-size 1.5em
|
font-size 1.5em
|
||||||
margin-top 25px
|
margin-top 25px
|
||||||
margin-bottom 35px
|
margin-bottom 35px
|
||||||
@@ -57,9 +57,7 @@
|
|||||||
left 175px
|
left 175px
|
||||||
padding 15px
|
padding 15px
|
||||||
overflow-y auto
|
overflow-y auto
|
||||||
|
.tab
|
||||||
.EditProfileModal, .PlanetSettingModal, .TeamSettingsModal
|
|
||||||
.userInfoTab, .passwordTab, .planetProfileTab, .userInfoTab, .membersTab
|
|
||||||
padding-top 45px
|
padding-top 45px
|
||||||
.formField
|
.formField
|
||||||
position relative
|
position relative
|
||||||
@@ -97,7 +95,7 @@
|
|||||||
float right
|
float right
|
||||||
padding 12px 10px
|
padding 12px 10px
|
||||||
border-radius 5px
|
border-radius 5px
|
||||||
width 200px
|
width 320px
|
||||||
font-size 1em
|
font-size 1em
|
||||||
overflow-x hidden
|
overflow-x hidden
|
||||||
white-space nowrap
|
white-space nowrap
|
||||||
@@ -111,6 +109,33 @@
|
|||||||
alertSuccess()
|
alertSuccess()
|
||||||
.alertError
|
.alertError
|
||||||
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
|
.planetDeleteTab
|
||||||
padding-top 65px
|
padding-top 65px
|
||||||
p
|
p
|
||||||
@@ -139,7 +164,7 @@
|
|||||||
float right
|
float right
|
||||||
padding 12px 10px
|
padding 12px 10px
|
||||||
border-radius 5px
|
border-radius 5px
|
||||||
width 200px
|
width 320px
|
||||||
font-size 1em
|
font-size 1em
|
||||||
overflow-x hidden
|
overflow-x hidden
|
||||||
white-space nowrap
|
white-space nowrap
|
||||||
@@ -153,6 +178,7 @@
|
|||||||
alertSuccess()
|
alertSuccess()
|
||||||
.alertError
|
.alertError
|
||||||
alertError()
|
alertError()
|
||||||
|
.TeamSettingsModal
|
||||||
.membersTab
|
.membersTab
|
||||||
.memberTable
|
.memberTable
|
||||||
width 100%
|
width 100%
|
||||||
@@ -262,25 +288,6 @@
|
|||||||
border-radius 5px
|
border-radius 5px
|
||||||
marked()
|
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
|
.PlanetCreateModal.modal, .TeamCreateModal.modal, .AddMemberModal.modal
|
||||||
padding 60px 0
|
padding 60px 0
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
apiUrl: 'http://codexen-server-dev2.elasticbeanstalk.com/'
|
// apiUrl: 'https://api.b00st.io/'
|
||||||
|
apiUrl: 'https://api2.b00st.io/'
|
||||||
// apiUrl: 'http://localhost:8000/'
|
// apiUrl: 'http://localhost:8000/'
|
||||||
}
|
}
|
||||||
|
|||||||
69
main.js
69
main.js
@@ -4,6 +4,7 @@ var Menu = require('menu')
|
|||||||
var MenuItem = require('menu-item')
|
var MenuItem = require('menu-item')
|
||||||
var Tray = require('tray')
|
var Tray = require('tray')
|
||||||
var ipc = require('ipc')
|
var ipc = require('ipc')
|
||||||
|
var jetpack = require('fs-jetpack')
|
||||||
|
|
||||||
require('crash-reporter').start()
|
require('crash-reporter').start()
|
||||||
|
|
||||||
@@ -19,7 +20,6 @@ var update = null
|
|||||||
// })
|
// })
|
||||||
|
|
||||||
var version = app.getVersion()
|
var version = app.getVersion()
|
||||||
global.version = version
|
|
||||||
var versionText = (version == null || version.length === 0) ? 'DEV version' : 'v' + version
|
var versionText = (version == null || version.length === 0) ? 'DEV version' : 'v' + version
|
||||||
var nn = require('node-notifier')
|
var nn = require('node-notifier')
|
||||||
var autoUpdater = require('auto-updater')
|
var autoUpdater = require('auto-updater')
|
||||||
@@ -27,6 +27,7 @@ var path = require('path')
|
|||||||
|
|
||||||
autoUpdater
|
autoUpdater
|
||||||
.on('error', function (err, message) {
|
.on('error', function (err, message) {
|
||||||
|
console.error(message)
|
||||||
nn.notify({
|
nn.notify({
|
||||||
title: 'Error! ' + versionText,
|
title: 'Error! ' + versionText,
|
||||||
icon: path.join(__dirname, 'browser/main/resources/favicon-230x230.png'),
|
icon: path.join(__dirname, 'browser/main/resources/favicon-230x230.png'),
|
||||||
@@ -34,11 +35,7 @@ autoUpdater
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
.on('checking-for-update', function () {
|
.on('checking-for-update', function () {
|
||||||
nn.notify({
|
// Connecting
|
||||||
title: 'Boost launched!! ' + versionText,
|
|
||||||
icon: path.join(__dirname, 'browser/main/resources/favicon-230x230.png'),
|
|
||||||
message: 'Checking update is available....'
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
.on('update-available', function () {
|
.on('update-available', function () {
|
||||||
nn.notify({
|
nn.notify({
|
||||||
@@ -85,7 +82,7 @@ app.on('ready', function () {
|
|||||||
Menu.setApplicationMenu(menu)
|
Menu.setApplicationMenu(menu)
|
||||||
// menu end
|
// menu end
|
||||||
appIcon = new Tray(__dirname + '/tray-icon.png')
|
appIcon = new Tray(__dirname + '/tray-icon.png')
|
||||||
appIcon.setToolTip('Codexen')
|
appIcon.setToolTip('Boost')
|
||||||
|
|
||||||
var trayMenu = new Menu()
|
var trayMenu = new Menu()
|
||||||
trayMenu.append(new MenuItem({
|
trayMenu.append(new MenuItem({
|
||||||
@@ -131,9 +128,10 @@ app.on('ready', function () {
|
|||||||
'zoom-factor': 1.0,
|
'zoom-factor': 1.0,
|
||||||
'always-on-top': true,
|
'always-on-top': true,
|
||||||
'web-preferences': {
|
'web-preferences': {
|
||||||
'overlay-scrollbars': true,
|
'overlay-scrollbars': true,
|
||||||
'skip-taskbar': true
|
'skip-taskbar': true
|
||||||
}
|
},
|
||||||
|
'standard-window': false
|
||||||
})
|
})
|
||||||
|
|
||||||
popUpWindow.loadUrl('file://' + __dirname + '/browser/finder/index.electron.html')
|
popUpWindow.loadUrl('file://' + __dirname + '/browser/finder/index.electron.html')
|
||||||
@@ -141,15 +139,53 @@ app.on('ready', function () {
|
|||||||
popUpWindow.on('blur', function () {
|
popUpWindow.on('blur', function () {
|
||||||
popUpWindow.hide()
|
popUpWindow.hide()
|
||||||
})
|
})
|
||||||
|
|
||||||
popUpWindow.setVisibleOnAllWorkspaces(true)
|
popUpWindow.setVisibleOnAllWorkspaces(true)
|
||||||
|
|
||||||
var globalShortcut = require('global-shortcut')
|
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 {
|
||||||
if (mainWindow != null && !mainWindow.isFocused()) {
|
globalShortcut.register(toggleFinderKey, function () {
|
||||||
mainWindow.hide()
|
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)
|
||||||
}
|
}
|
||||||
popUpWindow.show()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
global.hideFinder = function () {
|
global.hideFinder = function () {
|
||||||
@@ -167,8 +203,9 @@ function makeNewMainWindow () {
|
|||||||
height: 720,
|
height: 720,
|
||||||
'zoom-factor': 1.0,
|
'zoom-factor': 1.0,
|
||||||
'web-preferences': {
|
'web-preferences': {
|
||||||
'overlay-scrollbars': true
|
'overlay-scrollbars': true
|
||||||
}
|
},
|
||||||
|
'standard-window': false
|
||||||
})
|
})
|
||||||
if (update != null) {
|
if (update != null) {
|
||||||
mainWindow.webContents.on('did-finish-load', function () {
|
mainWindow.webContents.on('did-finish-load', function () {
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ module.exports = [
|
|||||||
label: 'Electron',
|
label: 'Electron',
|
||||||
submenu: [
|
submenu: [
|
||||||
{
|
{
|
||||||
label: 'About Electron',
|
label: 'About Boost',
|
||||||
selector: 'orderFrontStandardAboutPanel:'
|
selector: 'orderFrontStandardAboutPanel:'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -19,7 +19,7 @@ module.exports = [
|
|||||||
type: 'separator'
|
type: 'separator'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Hide Electron',
|
label: 'Hide Boost',
|
||||||
accelerator: 'Command+H',
|
accelerator: 'Command+H',
|
||||||
selector: 'hide:'
|
selector: 'hide:'
|
||||||
},
|
},
|
||||||
@@ -89,13 +89,13 @@ module.exports = [
|
|||||||
click: function () {
|
click: function () {
|
||||||
BrowserWindow.getFocusedWindow().reload()
|
BrowserWindow.getFocusedWindow().reload()
|
||||||
}
|
}
|
||||||
// },
|
},
|
||||||
// {
|
{
|
||||||
// label: 'Toggle DevTools',
|
label: 'Toggle DevTools',
|
||||||
// accelerator: 'Alt+Command+I',
|
accelerator: 'Alt+Command+I',
|
||||||
// click: function () {
|
click: function () {
|
||||||
// BrowserWindow.getFocusedWindow().toggleDevTools()
|
BrowserWindow.getFocusedWindow().toggleDevTools()
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "boost",
|
"name": "boost",
|
||||||
"version": "0.2.6",
|
"version": "0.3.0",
|
||||||
"description": "Boost App",
|
"description": "Boost App",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -31,8 +31,8 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/Rokt33r/codexen-app#readme",
|
"homepage": "https://github.com/Rokt33r/codexen-app#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"electron-stylus": "^0.1.0",
|
|
||||||
"font-awesome": "^4.3.0",
|
"font-awesome": "^4.3.0",
|
||||||
|
"fs-jetpack": "^0.7.0",
|
||||||
"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",
|
||||||
@@ -43,6 +43,7 @@
|
|||||||
"react-router": "^0.13.3",
|
"react-router": "^0.13.3",
|
||||||
"react-select": "^0.5.4",
|
"react-select": "^0.5.4",
|
||||||
"reflux": "^0.2.8",
|
"reflux": "^0.2.8",
|
||||||
|
"stylus": "^0.52.0",
|
||||||
"superagent": "^1.2.0",
|
"superagent": "^1.2.0",
|
||||||
"superagent-promise": "^1.0.3"
|
"superagent-promise": "^1.0.3"
|
||||||
},
|
},
|
||||||
|
|||||||
BIN
tray-icon.png
BIN
tray-icon.png
Binary file not shown.
|
Before Width: | Height: | Size: 463 B After Width: | Height: | Size: 959 B |
BIN
tray-icon@2x.png
BIN
tray-icon@2x.png
Binary file not shown.
|
Before Width: | Height: | Size: 924 B After Width: | Height: | Size: 2.2 KiB |
BIN
tray-icon@4x.png
BIN
tray-icon@4x.png
Binary file not shown.
|
Before Width: | Height: | Size: 2.4 KiB |
Reference in New Issue
Block a user