-
-
Notifications
You must be signed in to change notification settings - Fork 32.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
New Component: Search Field #1446
Closed
Closed
Changes from all commits
Commits
Show all changes
19 commits
Select commit
Hold shift + click to select a range
849b4be
added search field, code is done but not working yet
renxx91 54c1b19
search-field update, going to sleep -.-
yongxu 09b5169
looks like working
yongxu d154a6c
Merge remote-tracking branch 'callemall/master' into search-field
yongxu 4bbd25b
update
yongxu 87afdc7
update
yongxu 9bc59b5
update
yongxu 5b19a78
finally usable
yongxu d189db5
tested
yongxu 0ab3fdd
Update search-field.jsx
yongxu e0ada05
Update search-field.jsx
yongxu cbe3d86
Update search-field.jsx
yongxu 5b490d3
added add value
yongxu 3e05eb4
Update search-field.jsx
yongxu 55bf0b1
Merge pull request #6 from callemall/master
yongxu d49de78
Merge pull request #8 from callemall/master
yongxu 8339138
Merge pull request #11 from yongxu/mui
yongxu fe39daa
Merge branch 'source' into search-field
yongxu fb49e6e
changed let to const
yongxu File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
let React = require('react'); | ||
|
||
let { SearchField } = require('material-ui'); | ||
let ComponentDoc = require('../../component-doc'); | ||
|
||
let Code = require('search-field-code'); | ||
|
||
class SearchFields extends React.Component { | ||
|
||
constructor(props) { | ||
super(props); | ||
} | ||
|
||
render() { | ||
|
||
let desc = null; | ||
|
||
return ( | ||
<ComponentDoc | ||
name="Search Field" | ||
code={Code} | ||
desc={desc} | ||
componentInfo={[{ | ||
name: 'Search Field', | ||
infoArray: [], | ||
}]}> | ||
|
||
<br/> | ||
|
||
<div> | ||
<SearchField | ||
onUpdateRequests={(t) => {console.log(t); return [t,t+t,t+t+t];}} | ||
onNewRequest={(t) => {console.log('request:'+t);}} /> | ||
|
||
<SearchField | ||
fullWidth={true} | ||
onUpdateRequests={(t) => {console.log(t); return [t,t+t,t+t+t];}} | ||
onNewRequest={(t) => {console.log('request:'+t);}} /> | ||
|
||
</div> | ||
|
||
</ComponentDoc> | ||
); | ||
|
||
} | ||
|
||
|
||
} | ||
|
||
module.exports = SearchFields; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
<SearchField | ||
onUpdateRequests={(t) => {console.log(t); return [t,t+t,t+t+t];}} | ||
onNewRequest={(t) => {console.log('request:'+t);}} /> | ||
|
||
<SearchField | ||
fullWidth={true} | ||
onUpdateRequests={(t) => {console.log(t); return [t,t+t,t+t+t];}} | ||
onNewRequest={(t) => {console.log('request:'+t);}} /> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,275 @@ | ||
const React = require('react/addons'); | ||
const ReactTransitionGroup = React.addons.TransitionGroup; | ||
const StylePropable = require('./mixins/style-propable'); | ||
const ClickAwayable = require('./mixins/click-awayable'); | ||
const TextField = require('./text-field'); | ||
const Menu = require('./menus/menu'); | ||
const MenuItem = require('./menus/menu-item'); | ||
|
||
const SearchField = React.createClass({ | ||
|
||
mixins: [ | ||
StylePropable, | ||
ClickAwayable, | ||
], | ||
|
||
contextTypes: { | ||
muiTheme: React.PropTypes.object, | ||
}, | ||
|
||
propTypes: { | ||
errorText: React.PropTypes.string, | ||
floatingLabelText: React.PropTypes.string, | ||
errorStyle: React.PropTypes.object, | ||
hintText: React.PropTypes.string, | ||
id: React.PropTypes.string, | ||
onChange: React.PropTypes.func, | ||
autoWidth: React.PropTypes.bool, | ||
menuStyle: React.PropTypes.object, | ||
listStyle: React.PropTypes.object, | ||
menuProps: React.PropTypes.object, | ||
menuCloseDelay: React.PropTypes.number, | ||
onUpdateRequests: React.PropTypes.func, | ||
onNewSearchRequest: React.PropTypes.func, | ||
}, | ||
|
||
getDefaultProps() { | ||
return { | ||
fullWidth: false, | ||
open: false, | ||
searchText: '', | ||
menuCloseDelay: 100, | ||
|
||
onChange: () => {}, | ||
onUpdateRequests: () => {}, | ||
onNewRequest: () => {}, | ||
}; | ||
}, | ||
|
||
getInitialState() { | ||
return { | ||
searchText: this.props.searchText, | ||
requestsList: null, | ||
}; | ||
}, | ||
|
||
componentWillMount(){ | ||
this.open = this.props.open; | ||
this.focusOnInput = true; | ||
}, | ||
|
||
componentClickAway() { | ||
this.close(); | ||
}, | ||
|
||
render() { | ||
let { | ||
style, | ||
errorStyle, | ||
floatingLabelText, | ||
hintText, | ||
fullWidth, | ||
menuStyle, | ||
menuProps, | ||
listStyle, | ||
...other, | ||
} = this.props; | ||
|
||
let requestsList = this.state.requestsList; | ||
|
||
let styles = { | ||
root: { | ||
display: 'inline-block', | ||
position: 'relative', | ||
width: this.props.fullWidth ? '100%' : 256, | ||
}, | ||
input: { | ||
}, | ||
error: { | ||
}, | ||
menu: { | ||
top: 40, | ||
left: 0, | ||
width: '100%', | ||
}, | ||
list: { | ||
display: 'block', | ||
width: this.props.fullWidth ? '100%' : 256, | ||
}, | ||
}; | ||
|
||
let textFieldProps = { | ||
style: this.mergeAndPrefix(styles.input, style), | ||
floatingLabelText: floatingLabelText, | ||
hintText: (!hintText && !floatingLabelText) ? '' : hintText, | ||
fullWidth: true, | ||
multiLine: false, | ||
errorStyle: this.mergeAndPrefix(styles.error, errorStyle), | ||
}; | ||
|
||
let mergedRootStyles = this.mergeAndPrefix(styles.root, style); | ||
let mergedMenuStyles = this.mergeStyles(styles.menu, menuStyle); | ||
|
||
|
||
let menu = this.open && requestsList ? ( | ||
<Menu | ||
{...menuProps} | ||
key="dropDownMenu" | ||
animated={true} | ||
autoWidth={false} | ||
initiallyKeyboardFocused={true} | ||
onEscKeyDown={()=>this.close()} | ||
onItemTouchTap={this._handleItemTouchTap} | ||
listStyle={this.mergeAndPrefix(styles.list, listStyle)} | ||
openDirection="bottom-left" | ||
style={mergedMenuStyles}> | ||
{ | ||
requestsList.map((request, index) => { | ||
switch(typeof request){ | ||
case 'string': | ||
return (<MenuItem | ||
disableFocusRipple={true} | ||
key={index} | ||
value={request} | ||
primaryText={request} | ||
/>); | ||
default: | ||
return null; | ||
} | ||
}) | ||
} | ||
</Menu> | ||
) : null; | ||
|
||
return ( | ||
<div style={mergedRootStyles} | ||
onKeyDown={(e)=>{ | ||
switch(e.keyCode){ | ||
case 27: //esc | ||
this.close(); | ||
break; | ||
case 38: //up arrow | ||
if(this.focusOnInput){ | ||
this.focusOnInput = false; | ||
this.open = true; | ||
this.forceUpdate(); | ||
} | ||
e.preventDefault(); | ||
break; | ||
case 40: //down arrow | ||
if(this.focusOnInput){ | ||
this.focusOnInput = false; | ||
this.open = true; | ||
this.forceUpdate(); | ||
} | ||
e.preventDefault(); | ||
break; | ||
default: | ||
break; | ||
} | ||
}}> | ||
<div | ||
style={{ | ||
widht:'100%', | ||
}} | ||
onClick={()=>{ | ||
this.updateRequests(this.state.searchText); | ||
}}> | ||
<TextField | ||
{...other} | ||
ref="searchTextField" | ||
value={this.state.searchText} | ||
onEnterKeyDown={()=>{ | ||
setTimeout(() => { | ||
this.close(); | ||
}, this.props.touchTapCloseDelay); | ||
this.props.onNewRequest(this.state.searchText); | ||
}} | ||
onChange={ | ||
this._handleSearchTextChange | ||
} | ||
onBlur={()=>{ | ||
if(this.focusOnInput && this.open) | ||
this.refs.searchTextField.focus(); | ||
}} | ||
onFocus={()=>{ | ||
this.focusOnInput = true; | ||
}} | ||
|
||
{...textFieldProps} /> | ||
</div> | ||
<ReactTransitionGroup>{menu}</ReactTransitionGroup> | ||
</div> | ||
); | ||
}, | ||
|
||
setValue(textValue) { | ||
this.setState({ | ||
searchText: textValue, | ||
}); | ||
}, | ||
|
||
getValue() { | ||
return this.state.searchText; | ||
}, | ||
|
||
close() { | ||
this.open = false; | ||
this.forceUpdate(); | ||
}, | ||
|
||
open() { | ||
this.open = true; | ||
this.forceUpdate(); | ||
}, | ||
|
||
_handleSearchTextChange(e){ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. would rather use |
||
|
||
let searchText = e.target.value; | ||
|
||
this.updateRequests(searchText); | ||
}, | ||
|
||
updateRequests(searchText){ | ||
let requestsListPromise = new Promise(function(resolve, reject) { | ||
let list = this.props.onUpdateRequests(searchText); | ||
if(list){ | ||
resolve(list); | ||
} | ||
else{ | ||
reject(); | ||
} | ||
}.bind(this)); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. no needed if you use arrow function |
||
|
||
requestsListPromise.then(list => { | ||
this.focusOnInput = true; | ||
this.open = true; | ||
this.setState({ | ||
searchText:searchText, | ||
requestsList:list, | ||
}); | ||
}, ()=>{ | ||
this.setState({ | ||
searchText:searchText, | ||
requestsList:null, | ||
}); | ||
this.close(); | ||
}); | ||
}, | ||
|
||
_handleItemTouchTap(e, child) { | ||
setTimeout(() => { | ||
this.close(); | ||
}, this.props.touchTapCloseDelay); | ||
|
||
let index=parseInt(child.key, 10); | ||
|
||
let chosenRequest=this.state.requestsList[index]; | ||
this.setState({searchText:chosenRequest}); | ||
this.props.onNewRequest(chosenRequest, index, this.state.requestsList); | ||
|
||
}, | ||
|
||
}); | ||
|
||
module.exports = SearchField; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
// JavaScript debounce function (as taken from Underscore.js): | ||
// Returns a function, that, as long as it continues to be invoked, will not | ||
// be triggered. The function will be called after it stops being called for | ||
// N milliseconds. If `immediate` is passed, trigger the function on the | ||
// leading edge, instead of the trailing. | ||
|
||
function debounce(func, wait, immediate) { | ||
let timeout; | ||
return function() { | ||
let context = this, args = arguments; | ||
let later = function() { | ||
timeout = null; | ||
if (!immediate) func.apply(context, args); | ||
}; | ||
let callNow = immediate && !timeout; | ||
clearTimeout(timeout); | ||
timeout = setTimeout(later, wait); | ||
if (callNow) func.apply(context, args); | ||
}; | ||
} | ||
|
||
module.exports = debounce; |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You could use https://github.com/callemall/material-ui/blob/master/src/utils/key-code.js