Skip to content

Commit e4b2c42

Browse files
committed
ModeSelect
1 parent 746df92 commit e4b2c42

7 files changed

Lines changed: 1042 additions & 33 deletions

File tree

browser/main/HomePage/ArticleDetail.js

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,13 @@ import ModeIcon from 'boost/components/ModeIcon'
66
import MarkdownPreview from 'boost/components/MarkdownPreview'
77
import CodeEditor from 'boost/components/CodeEditor'
88
import { IDLE_MODE, CREATE_MODE, EDIT_MODE, switchMode, switchArticle, switchFolder, clearSearch, updateArticle, destroyArticle, NEW } from 'boost/actions'
9-
import aceModes from 'boost/ace-modes'
10-
import Select from 'react-select'
119
import linkState from 'boost/linkState'
1210
import FolderMark from 'boost/components/FolderMark'
1311
import TagLink from 'boost/components/TagLink'
1412
import TagSelect from 'boost/components/TagSelect'
13+
import ModeSelect from 'boost/components/ModeSelect'
1514
import activityRecord from 'boost/activityRecord'
1615

17-
var modeOptions = aceModes.map(function (mode) {
18-
return {
19-
label: mode,
20-
value: mode
21-
}
22-
})
23-
2416
function makeInstantArticle (article) {
2517
return Object.assign({}, article)
2618
}
@@ -219,7 +211,16 @@ export default class ArticleDetail extends React.Component {
219211
handleModeChange (value) {
220212
let article = this.state.article
221213
article.mode = value
222-
this.setState({article: article})
214+
this.setState({
215+
article: article,
216+
previewMode: false
217+
})
218+
}
219+
220+
handleModeSelectBlur () {
221+
if (this.refs.code != null) {
222+
this.refs.code.editor.focus()
223+
}
223224
}
224225

225226
handleContentChange (e, value) {
@@ -232,6 +233,14 @@ export default class ArticleDetail extends React.Component {
232233
this.setState({previewMode: !this.state.previewMode})
233234
}
234235

236+
handleTitleKeyDown (e) {
237+
console.log(e.keyCode)
238+
if (e.keyCode === 9) {
239+
e.preventDefault()
240+
this.refs.mode.handleIdleSelectClick()
241+
}
242+
}
243+
235244
renderEdit () {
236245
let { folders } = this.props
237246

@@ -272,22 +281,21 @@ export default class ArticleDetail extends React.Component {
272281
<div className='detailPanel'>
273282
<div className='header'>
274283
<div className='title'>
275-
<input placeholder='Title' ref='title' valueLink={this.linkState('article.title')}/>
284+
<input onKeyDown={e => this.handleTitleKeyDown(e)} placeholder='Title' ref='title' valueLink={this.linkState('article.title')}/>
276285
</div>
277-
<Select
286+
<ModeSelect
278287
ref='mode'
279-
onChange={value => this.handleModeChange(value)}
280-
clearable={false}
281-
options={modeOptions}
282-
placeholder='select mode...'
288+
onChange={e => this.handleModeChange(e)}
283289
value={this.state.article.mode}
284290
className='mode'
291+
onBlur={() => this.handleModeSelectBlur()}
285292
/>
286293
</div>
287294

288295
{this.state.previewMode
289296
? <MarkdownPreview content={this.state.article.content}/>
290297
: (<CodeEditor
298+
ref='code'
291299
onChange={(e, value) => this.handleContentChange(e, value)}
292300
readOnly={false}
293301
mode={this.state.article.mode}

browser/styles/main/HomeContainer/components/ArticleDetail.styl

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,11 +160,62 @@ iptFocusBorderColor = #369DCD
160160
display block
161161
height 33px
162162
margin-top 12px
163-
width 120px
163+
width 150px
164164
margin-right 15px
165+
border-radius 5px
166+
border solid 1px borderColor
167+
transition 0.1s
168+
&.idle
169+
background-color darken(white, 5%)
170+
cursor pointer
171+
&:hover
172+
background-color white
173+
.ModeIcon
174+
float left
175+
width 25px
176+
line-height 33px
177+
text-align center
178+
.modeLabel
179+
line-height 30px
180+
&.edit
181+
background-color white
182+
input
183+
width 150px
184+
line-height 30px
185+
padding 0 10px
186+
border none
187+
outline none
188+
background-color transparent
189+
font-size 14px
190+
.modeOptions
191+
position fixed
192+
width 150px
193+
z-index 10
194+
margin-top 5px
195+
border 1px solid borderColor
196+
border-radius 5px
197+
background-color white
198+
max-height 250px
199+
overflow-y auto
200+
.option
201+
height 33px
202+
line-height 33px
203+
cursor pointer
204+
&.active, &:hover.active
205+
background-color brandColor
206+
color white
207+
.ModeIcon
208+
width 30px
209+
text-align center
210+
display inline-block
211+
&:hover
212+
background-color darken(white, 10%)
213+
214+
215+
165216
.title
166217
absolute left top bottom
167-
right 120px
218+
right 150px
168219
padding 0 15px
169220
input
170221
width 100%

lib/components/CodeEditor.js

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import React from 'react'
22
import ReactDOM from 'react-dom'
3+
import modes from 'boost/vars/modes'
4+
import _ from 'lodash'
35
var ace = window.ace
46

57
module.exports = React.createClass({
@@ -32,11 +34,12 @@ module.exports = React.createClass({
3234
editor.setReadOnly(!!this.props.readOnly)
3335

3436
var session = editor.getSession()
35-
if (this.props.mode != null && this.props.mode.length > 0) {
36-
session.setMode('ace/mode/' + this.props.mode)
37-
} else {
38-
session.setMode('ace/mode/text')
39-
}
37+
let mode = _.findWhere(modes, {name: this.props.mode})
38+
let syntaxMode = mode != null
39+
? mode.mode
40+
: 'text'
41+
session.setMode('ace/mode/' + syntaxMode)
42+
4043
session.setUseSoftTabs(true)
4144
session.setOption('useWorker', false)
4245
session.setUseWrapMode(true)
@@ -57,11 +60,11 @@ module.exports = React.createClass({
5760
}
5861
if (prevProps.mode !== this.props.mode) {
5962
var session = this.state.editor.getSession()
60-
if (this.props.mode != null && this.props.mode.length > 0) {
61-
session.setMode('ace/mode/' + this.props.mode)
62-
} else {
63-
session.setMode('ace/mode/text')
64-
}
63+
let mode = _.findWhere(modes, {name: this.props.mode})
64+
let syntaxMode = mode != null
65+
? mode.mode
66+
: 'text'
67+
session.setMode('ace/mode/' + syntaxMode)
6568
}
6669
},
6770
render: function () {

lib/components/ModeIcon.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ export default class ModeIcon extends React.Component {
3232
return 'devicon-sass-original'
3333

3434
// Compile
35-
case 'c_cpp':
35+
case 'c':
3636
return 'devicon-c-plain'
37+
case 'cpp':
38+
return 'devicon-cplusplus-plain'
3739
case 'csharp':
3840
return 'devicon-csharp-plain'
3941
case 'objc':
@@ -60,17 +62,16 @@ export default class ModeIcon extends React.Component {
6062
return 'fa fa-fw fa-terminal'
6163

6264
case 'text':
63-
case 'plain_text':
6465
case 'markdown':
6566
return 'fa fa-fw fa-file-text-o'
6667
}
6768
return 'fa fa-fw fa-code'
6869
}
6970

7071
render () {
71-
var className = this.getClassName()
72+
let className = `ModeIcon ${this.getClassName()} ${this.props.className}`
7273
return (
73-
<i className={this.props.className + ' ' + className}/>
74+
<i className={className}/>
7475
)
7576
}
7677
}

0 commit comments

Comments
 (0)