-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathindex.js
118 lines (114 loc) · 3.44 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/**
* @jsx React.DOM
*/
var AutocompleteFactory = function(
React,
bean,
Input,
DropdownMenu,
DropdownStateMixin,
MenuItem) {
return React.createClass({
mixins: [DropdownStateMixin],
getInitialState: function() {
return {
searchResults: []
}
},
componentDidMount: function() {
var self = this;
//Listen to events outside component
bean.on(document, 'click.rbaac', function() {
self.setState({
showResults: false
});
});
bean.on(document, 'keyup.rbaac', function(ev) {
if (ev.keyCode !== 27) return;
self.setState({
showResults: false
});
});
},
componentWillUnmount: function() {
bean.off(document, '.rbaac');
},
showResults: function() {
this.setState({
showResults: true
});
},
handleTyping: function(ev) {
var key = ev.target.value, self = this;
if (this.props.onSearch) {
this.setState({loading: true});
this.props.onSearch(key, function(results) {
self.setState({
searchResults: results,
loading: false
});
});
this.showResults();
}
},
searchResultClicked: function(i) {
var self = this;
return function(ev) {
ev.preventDefault();
ev.stopPropagation();
self.props.onItemSelect && self.props.onItemSelect(self.state.searchResults[i]);
self.setState({
showResults: false
});
};
},
renderResults: function() {
var self = this;
if (this.state.loading) return this.props.loadingContent || <li>Loading results..</li>;
if (!this.state.searchResults.length) return this.props.emptyContent || <li>No results.</li>;
return this.state.searchResults.map(function(one, i) {
return <MenuItem key={i} onClick={self.searchResultClicked(i)}>{self.props.itemContent ? self.props.itemContent(one) : one}</MenuItem>;
});
},
render: function() {
var cls = 'dropdown';
if (this.state.showResults) cls += ' open';
return (
<div className={cls}>
{ this.transferPropsTo(<Input className="dropdown-toggle"
onChange={this.handleTyping}
key={0}
type="text" />) }
<DropdownMenu ref="menu" key={1}>{this.renderResults()}</DropdownMenu>
</div>
);
}
});
};
if (typeof module === 'object' && module.exports) {
module.exports = AutocompleteFactory(
require('react'),
require('bean'),
require('react-bootstrap/Input'),
require('react-bootstrap/DropdownMenu'),
require('react-bootstrap/DropdownStateMixin'),
require('react-bootstrap/MenuItem'));
} else if (typeof define === 'function' && define.amd) {
define(function(require) {
return AutocompleteFactory(
require('react'),
require('bean'),
require('react-bootstrap/Input'),
require('react-bootstrap/DropdownMenu'),
require('react-bootstrap/DropdownStateMixin'),
require('react-bootstrap/MenuItem'));
});
} else {
window.ReactBootstrapAsyncAutocomplete = AutocompleteFactory(
window.React,
window.bean,
window.ReactBootstrap.Input,
window.ReactBootstrap.DropdownMenu,
window.ReactBootstrap.DropdownStateMixin,
window.ReactBootstrap.MenuItem);
}