mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-14 02:06:29 +00:00
refactor hotkeys
This commit is contained in:
@@ -9,6 +9,7 @@ var BlueprintDeleteModal = React.createClass({
|
|||||||
},
|
},
|
||||||
componentDidMount: function () {
|
componentDidMount: function () {
|
||||||
this.unsubscribe = PlanetStore.listen(this.onListen)
|
this.unsubscribe = PlanetStore.listen(this.onListen)
|
||||||
|
React.findDOMNode(this.refs.submit).focus()
|
||||||
},
|
},
|
||||||
componentWillUnmount: function () {
|
componentWillUnmount: function () {
|
||||||
this.unsubscribe()
|
this.unsubscribe()
|
||||||
@@ -23,12 +24,18 @@ var BlueprintDeleteModal = React.createClass({
|
|||||||
stopPropagation: function (e) {
|
stopPropagation: function (e) {
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
},
|
},
|
||||||
|
handleKeyDown: function (e) {
|
||||||
|
if ((e.keyCode === 13 && e.metaKey)) {
|
||||||
|
e.preventDefault()
|
||||||
|
this.submit()
|
||||||
|
}
|
||||||
|
},
|
||||||
submit: function () {
|
submit: function () {
|
||||||
PlanetActions.deleteBlueprint(this.props.blueprint.id)
|
PlanetActions.deleteBlueprint(this.props.blueprint.id)
|
||||||
},
|
},
|
||||||
render: function () {
|
render: function () {
|
||||||
return (
|
return (
|
||||||
<div onClick={this.stopPropagation} className='BlueprintDeleteModal modal'>
|
<div onKeyDown={this.handleKeyDown} onClick={this.stopPropagation} className='BlueprintDeleteModal modal'>
|
||||||
<div className='modal-header'>
|
<div className='modal-header'>
|
||||||
<h1>Delete Blueprint</h1>
|
<h1>Delete Blueprint</h1>
|
||||||
</div>
|
</div>
|
||||||
@@ -37,8 +44,8 @@ var BlueprintDeleteModal = React.createClass({
|
|||||||
</div>
|
</div>
|
||||||
<div className='modal-footer'>
|
<div className='modal-footer'>
|
||||||
<div className='modal-control'>
|
<div className='modal-control'>
|
||||||
<button onClick={this.props.close} className='btn-default'>Cancle</button>
|
<button onClick={this.props.close} className='btn-default'>Cancel</button>
|
||||||
<button onClick={this.submit} className='btn-primary'>Delete</button>
|
<button ref='submit' onClick={this.submit} className='btn-primary'>Delete</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ var BlueprintForm = React.createClass({
|
|||||||
handleKeyDown: function (e) {
|
handleKeyDown: function (e) {
|
||||||
if (e.keyCode === 13 && e.metaKey) {
|
if (e.keyCode === 13 && e.metaKey) {
|
||||||
this.submit()
|
this.submit()
|
||||||
|
e.stopPropagation()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
render: function () {
|
render: function () {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ var ModalBase = React.createClass({
|
|||||||
render: function () {
|
render: function () {
|
||||||
if (this.props.isOpen) {
|
if (this.props.isOpen) {
|
||||||
return (
|
return (
|
||||||
<div onClick={this.props.close} className='ModalBase'>
|
<div ref='modal' onClick={this.props.close} className='ModalBase'>
|
||||||
{this.props.children}
|
{this.props.children}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -2,11 +2,6 @@ var React = require('react/addons')
|
|||||||
var moment = require('moment')
|
var moment = require('moment')
|
||||||
|
|
||||||
var CodeViewer = require('../Components/CodeViewer')
|
var CodeViewer = require('../Components/CodeViewer')
|
||||||
var ModalBase = require('../Components/ModalBase')
|
|
||||||
var SnippetEditModal = require('../Components/SnippetEditModal')
|
|
||||||
var SnippetDeleteModal = require('../Components/SnippetDeleteModal')
|
|
||||||
var BlueprintEditModal = require('../Components/BlueprintEditModal')
|
|
||||||
var BlueprintDeleteModal = require('../Components/BlueprintDeleteModal')
|
|
||||||
|
|
||||||
var ForceUpdate = require('../Mixins/ForceUpdate')
|
var ForceUpdate = require('../Mixins/ForceUpdate')
|
||||||
var Markdown = require('../Mixins/Markdown')
|
var Markdown = require('../Mixins/Markdown')
|
||||||
@@ -14,31 +9,15 @@ var Markdown = require('../Mixins/Markdown')
|
|||||||
var PlanetArticleDetail = React.createClass({
|
var PlanetArticleDetail = React.createClass({
|
||||||
mixins: [ForceUpdate(60000), Markdown],
|
mixins: [ForceUpdate(60000), Markdown],
|
||||||
propTypes: {
|
propTypes: {
|
||||||
article: React.PropTypes.object
|
article: React.PropTypes.object,
|
||||||
|
onOpenEditModal: React.PropTypes.func,
|
||||||
|
onOpenDeleteModal: React.PropTypes.func
|
||||||
},
|
},
|
||||||
getInitialState: function () {
|
getInitialState: function () {
|
||||||
return {
|
return {
|
||||||
isEditModalOpen: false
|
isEditModalOpen: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
openEditModal: function () {
|
|
||||||
this.setState({isEditModalOpen: true})
|
|
||||||
},
|
|
||||||
closeEditModal: function () {
|
|
||||||
this.setState({isEditModalOpen: false})
|
|
||||||
},
|
|
||||||
submitEditModal: function () {
|
|
||||||
this.setState({isEditModalOpen: false})
|
|
||||||
},
|
|
||||||
openDeleteModal: function () {
|
|
||||||
this.setState({isDeleteModalOpen: true})
|
|
||||||
},
|
|
||||||
closeDeleteModal: function () {
|
|
||||||
this.setState({isDeleteModalOpen: false})
|
|
||||||
},
|
|
||||||
submitDeleteModal: function () {
|
|
||||||
this.setState({isDeleteModalOpen: false})
|
|
||||||
},
|
|
||||||
render: function () {
|
render: function () {
|
||||||
var article = this.props.article
|
var article = this.props.article
|
||||||
|
|
||||||
@@ -55,17 +34,9 @@ var PlanetArticleDetail = React.createClass({
|
|||||||
<div className='viewer-header'>
|
<div className='viewer-header'>
|
||||||
<i className='fa fa-code fa-fw'></i> {article.callSign} <small className='updatedAt'>{moment(article.updatedAt).fromNow()}</small>
|
<i className='fa fa-code fa-fw'></i> {article.callSign} <small className='updatedAt'>{moment(article.updatedAt).fromNow()}</small>
|
||||||
<span className='control-group'>
|
<span className='control-group'>
|
||||||
<button onClick={this.openEditModal} className='btn-default btn-square btn-sm'><i className='fa fa-edit fa-fw'></i></button>
|
<button onClick={this.props.onOpenEditModal} className='btn-default btn-square btn-sm'><i className='fa fa-edit fa-fw'></i></button>
|
||||||
<button onClick={this.openDeleteModal} className='btn-default btn-square btn-sm'><i className='fa fa-trash fa-fw'></i></button>
|
<button onClick={this.props.onOpenDeleteModal} className='btn-default btn-square btn-sm'><i className='fa fa-trash fa-fw'></i></button>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<ModalBase isOpen={this.state.isEditModalOpen} close={this.closeEditModal}>
|
|
||||||
<SnippetEditModal snippet={article} submit={this.submitEditModal} close={this.closeEditModal}/>
|
|
||||||
</ModalBase>
|
|
||||||
|
|
||||||
<ModalBase isOpen={this.state.isDeleteModalOpen} close={this.closeDeleteModal}>
|
|
||||||
<SnippetDeleteModal snippet={article} submit={this.submitDeleteModal} close={this.closeDeleteModal}/>
|
|
||||||
</ModalBase>
|
|
||||||
</div>
|
</div>
|
||||||
<div className='viewer-body'>
|
<div className='viewer-body'>
|
||||||
<div className='viewer-detail'>
|
<div className='viewer-detail'>
|
||||||
@@ -84,17 +55,9 @@ var PlanetArticleDetail = React.createClass({
|
|||||||
<div className='viewer-header'>
|
<div className='viewer-header'>
|
||||||
<i className='fa fa-file-text-o fa-fw'></i> {article.title} <small className='updatedAt'>{moment(article.updatedAt).fromNow()}</small>
|
<i className='fa fa-file-text-o fa-fw'></i> {article.title} <small className='updatedAt'>{moment(article.updatedAt).fromNow()}</small>
|
||||||
<span className='control-group'>
|
<span className='control-group'>
|
||||||
<button onClick={this.openEditModal} className='btn-default btn-square btn-sm'><i className='fa fa-edit fa-fw'></i></button>
|
<button onClick={this.props.onOpenEditModal} className='btn-default btn-square btn-sm'><i className='fa fa-edit fa-fw'></i></button>
|
||||||
<button onClick={this.openDeleteModal} className='btn-default btn-square btn-sm'><i className='fa fa-trash fa-fw'></i></button>
|
<button onClick={this.props.onOpenDeleteModal} className='btn-default btn-square btn-sm'><i className='fa fa-trash fa-fw'></i></button>
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<ModalBase isOpen={this.state.isEditModalOpen} close={this.closeEditModal}>
|
|
||||||
<BlueprintEditModal blueprint={article} submit={this.submitEditModal} close={this.closeEditModal}/>
|
|
||||||
</ModalBase>
|
|
||||||
|
|
||||||
<ModalBase isOpen={this.state.isDeleteModalOpen} close={this.closeDeleteModal}>
|
|
||||||
<BlueprintDeleteModal blueprint={article} submit={this.submitDeleteModal} close={this.closeDeleteModal}/>
|
|
||||||
</ModalBase>
|
|
||||||
</div>
|
</div>
|
||||||
<div className='viewer-body'>
|
<div className='viewer-body'>
|
||||||
<div className='tags'><i className='fa fa-tags'/>{tags}</div>
|
<div className='tags'><i className='fa fa-tags'/>{tags}</div>
|
||||||
|
|||||||
@@ -8,20 +8,10 @@ var Markdown = require('../Mixins/Markdown')
|
|||||||
var PlanetArticleList = React.createClass({
|
var PlanetArticleList = React.createClass({
|
||||||
mixins: [ReactRouter.Navigation, ReactRouter.State, ForceUpdate(60000), Markdown],
|
mixins: [ReactRouter.Navigation, ReactRouter.State, ForceUpdate(60000), Markdown],
|
||||||
propTypes: {
|
propTypes: {
|
||||||
articles: React.PropTypes.array,
|
articles: React.PropTypes.array
|
||||||
onPressDown: React.PropTypes.func,
|
|
||||||
onPressUp: React.PropTypes.func
|
|
||||||
},
|
},
|
||||||
handleKeyDown: function (e) {
|
handleKeyDown: function (e) {
|
||||||
switch (e.keyCode) {
|
e.preventDefault()
|
||||||
case 38:
|
|
||||||
e.preventDefault()
|
|
||||||
this.props.onPressUp()
|
|
||||||
break
|
|
||||||
case 40:
|
|
||||||
e.preventDefault()
|
|
||||||
this.props.onPressDown()
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
render: function () {
|
render: function () {
|
||||||
var articles = this.props.articles.map(function (article) {
|
var articles = this.props.articles.map(function (article) {
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ var PlanetHeader = React.createClass({
|
|||||||
},
|
},
|
||||||
getInitialState: function () {
|
getInitialState: function () {
|
||||||
return {
|
return {
|
||||||
isMenuDropDownOpen: false
|
isMenuDropDownOpen: false,
|
||||||
|
search: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
componentDidMount: function () {
|
componentDidMount: function () {
|
||||||
@@ -32,6 +33,11 @@ var PlanetHeader = React.createClass({
|
|||||||
this.setState({search: e.target.value})
|
this.setState({search: e.target.value})
|
||||||
this.props.onSearchChange(e.target.value)
|
this.props.onSearchChange(e.target.value)
|
||||||
},
|
},
|
||||||
|
handleKeyDown: function (e) {
|
||||||
|
if (e.keyCode === 27) {
|
||||||
|
React.findDOMNode(this.refs.search).blur()
|
||||||
|
}
|
||||||
|
},
|
||||||
render: function () {
|
render: function () {
|
||||||
var currentPlanetName = this.props.currentPlanet.name
|
var currentPlanetName = this.props.currentPlanet.name
|
||||||
|
|
||||||
@@ -48,7 +54,7 @@ var PlanetHeader = React.createClass({
|
|||||||
</div>
|
</div>
|
||||||
<span className='searchInput'>
|
<span className='searchInput'>
|
||||||
<i className='fa fa-search'/>
|
<i className='fa fa-search'/>
|
||||||
<input onChange={this.handleChange} value={this.state.search} ref='search' tabIndex='1' type='text' className='inline-input circleInput' placeholder='Search...'/>
|
<input onKeyDown={this.handleKeyDown} onChange={this.handleChange} value={this.state.search} ref='search' tabIndex='1' type='text' className='inline-input circleInput' placeholder='Search...'/>
|
||||||
</span>
|
</span>
|
||||||
<a className='downloadBtn btn-primary'>Download Mac app</a>
|
<a className='downloadBtn btn-primary'>Download Mac app</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
var React = require('react/addons')
|
var React = require('react/addons')
|
||||||
|
|
||||||
var ModalBase = require('../Components/ModalBase')
|
|
||||||
var LaunchModal = require('../Components/LaunchModal')
|
|
||||||
|
|
||||||
var PlanetNavigator = React.createClass({
|
var PlanetNavigator = React.createClass({
|
||||||
propTypes: {
|
propTypes: {
|
||||||
currentPlanet: React.PropTypes.shape({
|
currentPlanet: React.PropTypes.shape({
|
||||||
@@ -10,31 +7,14 @@ var PlanetNavigator = React.createClass({
|
|||||||
}),
|
}),
|
||||||
currentUser: React.PropTypes.shape({
|
currentUser: React.PropTypes.shape({
|
||||||
name: React.PropTypes.string
|
name: React.PropTypes.string
|
||||||
})
|
}),
|
||||||
|
onOpenLaunchModal: React.PropTypes.func
|
||||||
},
|
},
|
||||||
getInitialState: function () {
|
getInitialState: function () {
|
||||||
return {
|
return {
|
||||||
isLaunchModalOpen: false
|
isLaunchModalOpen: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
handleKeyDown: function (e) {
|
|
||||||
if (e.keyCode === 13 && e.metaKey) {
|
|
||||||
e.preventDefault()
|
|
||||||
this.openLaunchModal()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
componentDidMount: function () {
|
|
||||||
document.addEventListener('keydown', this.handleKeyDown, false)
|
|
||||||
},
|
|
||||||
componentWillUnmount: function () {
|
|
||||||
document.removeEventListener('keydown', this.handleKeyDown, false)
|
|
||||||
},
|
|
||||||
openLaunchModal: function () {
|
|
||||||
this.setState({isLaunchModalOpen: true})
|
|
||||||
},
|
|
||||||
closeLaunchModal: function () {
|
|
||||||
this.setState({isLaunchModalOpen: false})
|
|
||||||
},
|
|
||||||
submitLaunchModal: function (ret) {
|
submitLaunchModal: function (ret) {
|
||||||
console.log(ret)
|
console.log(ret)
|
||||||
this.setState({isLaunchModalOpen: false})
|
this.setState({isLaunchModalOpen: false})
|
||||||
@@ -42,12 +22,9 @@ var PlanetNavigator = React.createClass({
|
|||||||
render: function () {
|
render: function () {
|
||||||
return (
|
return (
|
||||||
<div className='PlanetNavigator'>
|
<div className='PlanetNavigator'>
|
||||||
<button onClick={this.openLaunchModal} className='btn-primary btn-block'>
|
<button onClick={this.props.onOpenLaunchModal} className='btn-primary btn-block'>
|
||||||
<i className='fa fa-rocket fa-fw'/> Launch
|
<i className='fa fa-rocket fa-fw'/> Launch
|
||||||
</button>
|
</button>
|
||||||
<ModalBase isOpen={this.state.isLaunchModalOpen} close={this.closeLaunchModal}>
|
|
||||||
<LaunchModal submit={this.submitLaunchModal} close={this.closeLaunchModal}/>
|
|
||||||
</ModalBase>
|
|
||||||
<nav>
|
<nav>
|
||||||
<a>
|
<a>
|
||||||
<i className='fa fa-home fa-fw'/> Home
|
<i className='fa fa-home fa-fw'/> Home
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ var SnippetDeleteModal = React.createClass({
|
|||||||
},
|
},
|
||||||
componentDidMount: function () {
|
componentDidMount: function () {
|
||||||
this.unsubscribe = PlanetStore.listen(this.onListen)
|
this.unsubscribe = PlanetStore.listen(this.onListen)
|
||||||
|
React.findDOMNode(this.refs.submit).focus()
|
||||||
},
|
},
|
||||||
componentWillUnmount: function () {
|
componentWillUnmount: function () {
|
||||||
this.unsubscribe()
|
this.unsubscribe()
|
||||||
@@ -23,12 +24,18 @@ var SnippetDeleteModal = React.createClass({
|
|||||||
stopPropagation: function (e) {
|
stopPropagation: function (e) {
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
},
|
},
|
||||||
|
handleKeyDown: function (e) {
|
||||||
|
if ((e.keyCode === 13 && e.metaKey)) {
|
||||||
|
e.preventDefault()
|
||||||
|
this.submit()
|
||||||
|
}
|
||||||
|
},
|
||||||
submit: function () {
|
submit: function () {
|
||||||
PlanetActions.deleteSnippet(this.props.snippet.id)
|
PlanetActions.deleteSnippet(this.props.snippet.id)
|
||||||
},
|
},
|
||||||
render: function () {
|
render: function () {
|
||||||
return (
|
return (
|
||||||
<div onClick={this.stopPropagation} className='SnippetDeleteModal modal'>
|
<div onKeyDown={this.handleKeyDown} onClick={this.stopPropagation} className='SnippetDeleteModal modal'>
|
||||||
<div className='modal-header'>
|
<div className='modal-header'>
|
||||||
<h1>Delete Snippet</h1>
|
<h1>Delete Snippet</h1>
|
||||||
</div>
|
</div>
|
||||||
@@ -37,8 +44,8 @@ var SnippetDeleteModal = React.createClass({
|
|||||||
</div>
|
</div>
|
||||||
<div className='modal-footer'>
|
<div className='modal-footer'>
|
||||||
<div className='modal-control'>
|
<div className='modal-control'>
|
||||||
<button onClick={this.props.close} className='btn-default'>Cancle</button>
|
<button onClick={this.props.close} className='btn-default'>Cancel</button>
|
||||||
<button onClick={this.submit} className='btn-primary'>Delete</button>
|
<button ref='submit' onClick={this.submit} className='btn-primary'>Delete</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ var SnippetForm = React.createClass({
|
|||||||
handleKeyDown: function (e) {
|
handleKeyDown: function (e) {
|
||||||
if (e.keyCode === 13 && e.metaKey) {
|
if (e.keyCode === 13 && e.metaKey) {
|
||||||
this.submit()
|
this.submit()
|
||||||
|
e.stopPropagation()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
render: function () {
|
render: function () {
|
||||||
|
|||||||
@@ -5,6 +5,12 @@ var PlanetHeader = require('../Components/PlanetHeader')
|
|||||||
var PlanetNavigator = require('../Components/PlanetNavigator')
|
var PlanetNavigator = require('../Components/PlanetNavigator')
|
||||||
var PlanetArticleList = require('../Components/PlanetArticleList')
|
var PlanetArticleList = require('../Components/PlanetArticleList')
|
||||||
var PlanetArticleDetail = require('../Components/PlanetArticleDetail')
|
var PlanetArticleDetail = require('../Components/PlanetArticleDetail')
|
||||||
|
var ModalBase = require('../Components/ModalBase')
|
||||||
|
var LaunchModal = require('../Components/LaunchModal')
|
||||||
|
var SnippetEditModal = require('../Components/SnippetEditModal')
|
||||||
|
var SnippetDeleteModal = require('../Components/SnippetDeleteModal')
|
||||||
|
var BlueprintEditModal = require('../Components/BlueprintEditModal')
|
||||||
|
var BlueprintDeleteModal = require('../Components/BlueprintDeleteModal')
|
||||||
|
|
||||||
var PlanetActions = require('../Actions/PlanetActions')
|
var PlanetActions = require('../Actions/PlanetActions')
|
||||||
|
|
||||||
@@ -27,11 +33,13 @@ module.exports = React.createClass({
|
|||||||
this.unsubscribe = PlanetStore.listen(this.onFetched)
|
this.unsubscribe = PlanetStore.listen(this.onFetched)
|
||||||
|
|
||||||
PlanetActions.fetchPlanet(this.props.params.userName + '/' + this.props.params.planetName)
|
PlanetActions.fetchPlanet(this.props.params.userName + '/' + this.props.params.planetName)
|
||||||
|
document.addEventListener('keydown', this.handleKeyDown)
|
||||||
},
|
},
|
||||||
componentWillUnmount: function () {
|
componentWillUnmount: function () {
|
||||||
this.unsubscribe()
|
this.unsubscribe()
|
||||||
|
document.removeEventListener('keydown', this.handleKeyDown)
|
||||||
},
|
},
|
||||||
getIndexOfCurrentArticle: function () {
|
getFilteredIndexOfCurrentArticle: function () {
|
||||||
var params = this.props.params
|
var params = this.props.params
|
||||||
var index = 0
|
var index = 0
|
||||||
|
|
||||||
@@ -53,12 +61,35 @@ module.exports = React.createClass({
|
|||||||
|
|
||||||
return index
|
return index
|
||||||
},
|
},
|
||||||
|
getIndexOfCurrentArticle: function () {
|
||||||
|
var params = this.props.params
|
||||||
|
var index = 0
|
||||||
|
|
||||||
|
if (this.isActive('snippets')) {
|
||||||
|
this.state.currentPlanet.Articles.some(function (_article, _index) {
|
||||||
|
if (_article.type === 'snippet' && _article.localId === parseInt(params.localId, 10)) {
|
||||||
|
index = _index
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else if (this.isActive('blueprints')) {
|
||||||
|
this.state.currentPlanet.Articles.some(function (_article, _index) {
|
||||||
|
if (_article.type === 'blueprint' && _article.localId === parseInt(params.localId, 10)) {
|
||||||
|
index = _index
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return index
|
||||||
|
},
|
||||||
selectArticleByIndex: function (index) {
|
selectArticleByIndex: function (index) {
|
||||||
var article = this.state.filteredArticles[index]
|
var article = this.state.filteredArticles[index]
|
||||||
var params = this.props.params
|
var params = this.props.params
|
||||||
|
|
||||||
if (article == null) {
|
if (article == null) {
|
||||||
this.transitionTo('planetHome', params)
|
this.transitionTo('planetHome', params)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (article.type === 'snippet') {
|
if (article.type === 'snippet') {
|
||||||
@@ -76,28 +107,42 @@ module.exports = React.createClass({
|
|||||||
selectNextArticle: function () {
|
selectNextArticle: function () {
|
||||||
if (this.state.currentPlanet == null || this.state.filteredArticles.length === 0) return
|
if (this.state.currentPlanet == null || this.state.filteredArticles.length === 0) return
|
||||||
|
|
||||||
var index = this.getIndexOfCurrentArticle()
|
var index = this.getFilteredIndexOfCurrentArticle()
|
||||||
|
|
||||||
if (index < this.state.filteredArticles.length - 1) {
|
if (index < this.state.filteredArticles.length - 1) {
|
||||||
this.selectArticleByIndex(index + 1)
|
this.selectArticleByIndex(index + 1)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
selectPriorArticle: function () {
|
selectPriorArticle: function () {
|
||||||
if (this.state.currentPlanet == null || this.state.filteredArticles.length === 0) return
|
if (this.state.currentPlanet == null || this.state.filteredArticles.length === 0) {
|
||||||
|
return
|
||||||
var index = this.getIndexOfCurrentArticle()
|
}
|
||||||
|
var index = this.getFilteredIndexOfCurrentArticle()
|
||||||
|
|
||||||
if (index > 0) {
|
if (index > 0) {
|
||||||
this.selectArticleByIndex(index - 1)
|
this.selectArticleByIndex(index - 1)
|
||||||
|
} else {
|
||||||
|
React.findDOMNode(this).querySelector('.PlanetHeader .searchInput input').focus()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onFetched: function (res) {
|
onFetched: function (res) {
|
||||||
var articles = this.state.currentPlanet == null ? null : this.state.currentPlanet.Articles
|
var articles = this.state.currentPlanet == null ? null : this.state.currentPlanet.Articles
|
||||||
|
var filteredArticles = this.state.filteredArticles
|
||||||
|
|
||||||
if (res.status === 'planetFetched') {
|
if (res.status === 'planetFetched') {
|
||||||
var planet = res.data
|
var planet = res.data
|
||||||
this.setState({currentPlanet: planet, filteredArticles: planet.Articles}, function () {
|
this.setState({currentPlanet: planet, filteredArticles: planet.Articles}, function () {
|
||||||
if (planet.Articles.length > 0) {
|
if (this.state.filteredArticles.length > 0) {
|
||||||
|
if (this.props.params.localId == null) {
|
||||||
|
var article = this.state.filteredArticles[0]
|
||||||
|
if (article == null) return
|
||||||
|
this.transitionTo(article.type === 'snippet' ? 'snippets' : 'blueprints', {
|
||||||
|
userName: this.props.params.userName,
|
||||||
|
planetName: this.props.params.planetName,
|
||||||
|
localId: planet.Articles[0].localId
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
if (this.isActive('snippets')) {
|
if (this.isActive('snippets')) {
|
||||||
this.transitionTo('snippets', {
|
this.transitionTo('snippets', {
|
||||||
userName: this.props.params.userName,
|
userName: this.props.params.userName,
|
||||||
@@ -117,6 +162,7 @@ module.exports = React.createClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
var article = res.data
|
var article = res.data
|
||||||
|
var filteredIndex = this.getFilteredIndexOfCurrentArticle()
|
||||||
var index = this.getIndexOfCurrentArticle()
|
var index = this.getIndexOfCurrentArticle()
|
||||||
|
|
||||||
if (article.PlanetId === this.state.currentPlanet.id) {
|
if (article.PlanetId === this.state.currentPlanet.id) {
|
||||||
@@ -124,7 +170,7 @@ module.exports = React.createClass({
|
|||||||
case 'articleCreated':
|
case 'articleCreated':
|
||||||
articles.unshift(article)
|
articles.unshift(article)
|
||||||
|
|
||||||
this.setState({planet: this.state.currentPlanet}, function () {
|
this.setState({planet: this.state.currentPlanet, filteredArticles: filteredArticles}, function () {
|
||||||
this.selectArticleByIndex(0)
|
this.selectArticleByIndex(0)
|
||||||
})
|
})
|
||||||
break
|
break
|
||||||
@@ -132,16 +178,17 @@ module.exports = React.createClass({
|
|||||||
articles.splice(index, 1)
|
articles.splice(index, 1)
|
||||||
articles.unshift(article)
|
articles.unshift(article)
|
||||||
|
|
||||||
this.setState({planet: this.state.currentPlanet})
|
this.setState({planet: this.state.currentPlanet, filteredArticles: filteredArticles})
|
||||||
break
|
break
|
||||||
case 'articleDeleted':
|
case 'articleDeleted':
|
||||||
articles.splice(index, 1)
|
articles.splice(index, 1)
|
||||||
|
|
||||||
this.setState({planet: this.state.currentPlanet}, function () {
|
this.setState({planet: this.state.currentPlanet, filteredArticles: filteredArticles}, function () {
|
||||||
|
this.closeDeleteModal()
|
||||||
if (index > 0) {
|
if (index > 0) {
|
||||||
this.selectArticleByIndex(index - 1)
|
this.selectArticleByIndex(filteredIndex - 1)
|
||||||
} else {
|
} else {
|
||||||
this.selectArticleByIndex(index)
|
this.selectArticleByIndex(filteredIndex)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -178,40 +225,159 @@ module.exports = React.createClass({
|
|||||||
this.selectArticleByIndex(0)
|
this.selectArticleByIndex(0)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
openLaunchModal: function () {
|
||||||
|
this.setState({isLaunchModalOpen: true})
|
||||||
|
},
|
||||||
|
closeLaunchModal: function () {
|
||||||
|
this.setState({isLaunchModalOpen: false})
|
||||||
|
},
|
||||||
|
openEditModal: function () {
|
||||||
|
this.setState({isEditModalOpen: true})
|
||||||
|
},
|
||||||
|
closeEditModal: function () {
|
||||||
|
this.setState({isEditModalOpen: false})
|
||||||
|
},
|
||||||
|
submitEditModal: function () {
|
||||||
|
this.setState({isEditModalOpen: false})
|
||||||
|
},
|
||||||
|
openDeleteModal: function () {
|
||||||
|
this.setState({isDeleteModalOpen: true})
|
||||||
|
},
|
||||||
|
closeDeleteModal: function () {
|
||||||
|
this.setState({isDeleteModalOpen: false})
|
||||||
|
},
|
||||||
|
submitDeleteModal: function () {
|
||||||
|
this.setState({isDeleteModalOpen: false})
|
||||||
|
},
|
||||||
|
handleKeyDown: function (e) {
|
||||||
|
console.log(e.keyCode)
|
||||||
|
if (this.state.isLaunchModalOpen) {
|
||||||
|
if (e.keyCode === 27) this.closeLaunchModal()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (this.state.isEditModalOpen) {
|
||||||
|
if (e.keyCode === 27) this.closeEditModal()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (this.state.isDeleteModalOpen) {
|
||||||
|
if (e.keyCode === 27) this.closeDeleteModal()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((e.keyCode === 13 && e.metaKey)) {
|
||||||
|
e.preventDefault()
|
||||||
|
this.openLaunchModal()
|
||||||
|
}
|
||||||
|
var searchInput = React.findDOMNode(this).querySelector('.PlanetHeader .searchInput input')
|
||||||
|
|
||||||
|
if (document.activeElement === searchInput) {
|
||||||
|
switch (e.keyCode) {
|
||||||
|
case 38:
|
||||||
|
e.preventDefault()
|
||||||
|
break
|
||||||
|
case 40:
|
||||||
|
e.preventDefault()
|
||||||
|
searchInput.blur()
|
||||||
|
break
|
||||||
|
case 27:
|
||||||
|
searchInput.blur()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (document.activeElement !== searchInput) {
|
||||||
|
switch (e.keyCode) {
|
||||||
|
case 38:
|
||||||
|
e.preventDefault()
|
||||||
|
this.selectPriorArticle()
|
||||||
|
break
|
||||||
|
case 40:
|
||||||
|
e.preventDefault()
|
||||||
|
this.selectNextArticle()
|
||||||
|
break
|
||||||
|
case 27:
|
||||||
|
searchInput.focus()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (e.keyCode) {
|
||||||
|
case 65:
|
||||||
|
e.preventDefault()
|
||||||
|
this.openLaunchModal()
|
||||||
|
break
|
||||||
|
case 68:
|
||||||
|
e.preventDefault()
|
||||||
|
this.openDeleteModal()
|
||||||
|
break
|
||||||
|
case 69:
|
||||||
|
e.preventDefault()
|
||||||
|
this.openEditModal()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
render: function () {
|
render: function () {
|
||||||
var user = AuthStore.getUser()
|
var user = AuthStore.getUser()
|
||||||
if (user == null) return (<div/>)
|
if (user == null) return (<div/>)
|
||||||
if (this.state.currentPlanet == null) return (<div/>)
|
if (this.state.currentPlanet == null) return (<div/>)
|
||||||
|
|
||||||
var content = (<div>Nothing selected</div>)
|
|
||||||
var localId = parseInt(this.props.params.localId, 10)
|
var localId = parseInt(this.props.params.localId, 10)
|
||||||
|
|
||||||
|
var article
|
||||||
if (this.isActive('snippets')) {
|
if (this.isActive('snippets')) {
|
||||||
this.state.currentPlanet.Articles.some(function (article) {
|
this.state.currentPlanet.Articles.some(function (_article) {
|
||||||
if (article.type === 'snippet' && localId === article.localId) {
|
if (_article.type === 'snippet' && localId === _article.localId) {
|
||||||
content = (
|
article = _article
|
||||||
<PlanetArticleDetail article={article}/>
|
|
||||||
)
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
} else if (this.isActive('blueprints')) {
|
} else if (this.isActive('blueprints')) {
|
||||||
this.state.currentPlanet.Articles.some(function (article) {
|
this.state.currentPlanet.Articles.some(function (_article) {
|
||||||
if (article.type === 'blueprint' && localId === article.localId) {
|
if (_article.type === 'blueprint' && localId === _article.localId) {
|
||||||
content = (
|
article = _article
|
||||||
<PlanetArticleDetail article={article}/>
|
|
||||||
)
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var content = article != null ? (
|
||||||
|
<PlanetArticleDetail article={article} onOpenEditModal={this.openEditModal} onOpenDeleteModal={this.openDeleteModal}/>
|
||||||
|
) : (
|
||||||
|
<div>Nothing selected</div>
|
||||||
|
)
|
||||||
|
|
||||||
|
var editModal = article != null ? (article.type === 'snippet' ? (
|
||||||
|
<SnippetEditModal snippet={article} submit={this.submitEditModal} close={this.closeEditModal}/>
|
||||||
|
) : (
|
||||||
|
<BlueprintEditModal blueprint={article} submit={this.submitEditModal} close={this.closeEditModal}/>
|
||||||
|
)) : null
|
||||||
|
|
||||||
|
var deleteModal = article != null ? (article.type === 'snippet' ? (
|
||||||
|
<SnippetDeleteModal snippet={article} close={this.closeDeleteModal}/>
|
||||||
|
) : (
|
||||||
|
<BlueprintDeleteModal blueprint={article} close={this.closeDeleteModal}/>
|
||||||
|
)) : null
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='PlanetContainer'>
|
<div className='PlanetContainer'>
|
||||||
|
<ModalBase isOpen={this.state.isLaunchModalOpen} close={this.closeLaunchModal}>
|
||||||
|
<LaunchModal submit={this.submitLaunchModal} close={this.closeLaunchModal}/>
|
||||||
|
</ModalBase>
|
||||||
|
|
||||||
|
<ModalBase isOpen={this.state.isEditModalOpen} close={this.closeEditModal}>
|
||||||
|
{editModal}
|
||||||
|
</ModalBase>
|
||||||
|
|
||||||
|
<ModalBase isOpen={this.state.isDeleteModalOpen} close={this.closeDeleteModal}>
|
||||||
|
{deleteModal}
|
||||||
|
</ModalBase>
|
||||||
|
|
||||||
<PlanetHeader onSearchChange={this.handleSearchChange} currentPlanet={this.state.currentPlanet} currentUser={user}/>
|
<PlanetHeader onSearchChange={this.handleSearchChange} currentPlanet={this.state.currentPlanet} currentUser={user}/>
|
||||||
<PlanetNavigator currentPlanet={this.state.currentPlanet} currentUser={user}/>
|
<PlanetNavigator onOpenLaunchModal={this.openLaunchModal} currentPlanet={this.state.currentPlanet} currentUser={user}/>
|
||||||
<PlanetArticleList onPressUp={this.selectPriorArticle} onPressDown={this.selectNextArticle} articles={this.state.filteredArticles}/>
|
<PlanetArticleList articles={this.state.filteredArticles}/>
|
||||||
{content}
|
{content}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user