Skip to content

Commit 62084f1

Browse files
committed
Clean up code and add proptypes
1 parent 90a02c8 commit 62084f1

File tree

5 files changed

+69
-41
lines changed

5 files changed

+69
-41
lines changed

components/SLDSLookup/Menu/Item/index.jsx

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ class Item extends React.Component {
1717
}
1818

1919
componentWillReceiveProps(nextProps){
20-
if(nextProps.isActive !== this.props.isActive){
21-
this.props.setActiveDescendant(nextProps.id);
20+
if(nextProps.isActive !== this.props.isActive && (nextProps.isActive === true)){
21+
this.props.setFocus(this.props.id);
2222
}
2323
}
2424

@@ -42,17 +42,13 @@ class Item extends React.Component {
4242

4343
render(){
4444
let className = 'slds-lookup__item';
45-
46-
//TODO: make isActive styles into a class??
4745
let id = this.props.id;
48-
let styles = {};
4946
if(this.props.isActive) className += ' slds-theme--shade';
5047

5148
return (
52-
//IMPORTANT: id is used to set lookup's input's aria-activedescendant
49+
//IMPORTANT: anchor id is used to set lookup's input's aria-activedescendant
5350
<li
5451
className={className}
55-
style={styles}
5652
role="presentaion">
5753
<a
5854
href={this.props.href}
@@ -68,7 +64,17 @@ class Item extends React.Component {
6864
</li>
6965
)
7066
}
71-
7267
}
7368

69+
Item.propTypes = {
70+
id: React.PropTypes.string,
71+
setFocus: React.PropTypes.func,
72+
isActive: React.PropTypes.bool,
73+
onSelect: React.PropTypes.func,
74+
searchTerm: React.PropTypes.string,
75+
};
76+
77+
Item.defaultProps = {
78+
};
79+
7480
module.exports = Item;

components/SLDSLookup/Menu/index.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ class Menu extends React.Component {
3030
renderItems(){
3131
return this.props.items.filter(this.filter, this).map((c, i) => {
3232
//isActive means it is aria-activedescendant
33-
const isActive = this.props.activeIndex === i ? true : false;
34-
return <Item key={c.id} id={c.id} setActiveDescendant={this.props.setActiveDescendant} isActive={isActive} onSelect={this.props.onSelect} searchTerm={this.props.searchTerm}>{c}</Item>
33+
const isActive = this.props.focusIndex === i ? true : false;
34+
return <Item key={c.id} id={c.id} setFocus={this.props.setFocus} isActive={isActive} onSelect={this.props.onSelect} searchTerm={this.props.searchTerm}>{c}</Item>
3535
});
3636
}
3737

@@ -47,4 +47,20 @@ class Menu extends React.Component {
4747
)
4848
}
4949
}
50+
51+
Menu.propTypes = {
52+
searchTerm: React.PropTypes.string,
53+
filterWith: React.PropTypes.func,
54+
onSelect: React.PropTypes.func,
55+
label: React.PropTypes.string,
56+
items: React.PropTypes.array,
57+
setFocus: React.PropTypes.func,
58+
getListLength: React.PropTypes.func,
59+
listLength: React.PropTypes.number,
60+
focusIndex: React.PropTypes.number,
61+
};
62+
63+
Menu.defaultProps = {
64+
};
65+
5066
module.exports = Menu;

components/SLDSLookup/index.jsx

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,34 +22,35 @@ const defaultFilter = (term, item) => {
2222
class SLDSLookup extends React.Component {
2323
constructor(props) {
2424
super(props);
25-
this.props.items.map((item, index) => {
26-
return item.id = 'item-' + index;
27-
})
25+
26+
//Dynamically assign ids to list items to reference for focusing and selecting items
27+
this.props.items.map((item, index) => { return item.id = 'item-' + index; })
2828

2929
this.state = {
3030
searchTerm: '',
3131
isOpen:false,
32-
activeItem:null,
32+
currentFocus:null,
33+
focusIndex:null,
3334
selectedIndex: null,
34-
activeIndex:null,
3535
listLength:this.props.items.length
3636
};
3737
}
3838

3939
//=================================================
40-
// Set Active Descendant (on key down/up, set currently focused/hovered item in list)
40+
// Using down/up keys, set Focus on list item and assign it to aria-activedescendant attribute in input.
41+
// Need to keep track of filtered list length to be able to increment/decrement the focus index so it's contained to the number of available list items.
4142
increaseIndex(){
4243
let items = this.state.listLength - 1;
43-
this.setState({ activeIndex: this.state.activeIndex < items ? this.state.activeIndex + 1 : 0 })
44+
this.setState({ focusIndex: this.state.focusIndex < items ? this.state.focusIndex + 1 : 0 })
4445
}
4546

4647
decreaseIndex(){
4748
let items = this.state.listLength - 1;
48-
this.setState({ activeIndex: this.state.activeIndex > 0 ? this.state.activeIndex - 1 : items })
49+
this.setState({ focusIndex: this.state.focusIndex > 0 ? this.state.focusIndex - 1 : items })
4950
}
5051

51-
setActiveDescendant(id){
52-
this.setState({activeItem:id});
52+
setFocus(id){
53+
this.setState({currentFocus:id});
5354
}
5455

5556
getListLength(qty){
@@ -61,7 +62,6 @@ class SLDSLookup extends React.Component {
6162
//=================================================
6263
// Select menu item (onClick or on key enter/space)
6364
selectItem(itemId){
64-
//console.log('selectItem fired');
6565
let index = itemId.replace('item-', '');
6666
this.setState({
6767
selectedIndex: index,
@@ -81,7 +81,7 @@ class SLDSLookup extends React.Component {
8181
handleClose() {
8282
this.setState({
8383
isOpen:false,
84-
activeIndex:null
84+
focusIndex:null
8585
})
8686
}
8787

@@ -108,25 +108,25 @@ class SLDSLookup extends React.Component {
108108
event.keyCode === KEYS.ESCAPE ? this.handleClose() : this.handleClick();
109109

110110
//If user hits tab key, move aria activedescendant to first menu item
111-
if(event.keyCode === KEYS.TAB && this.state.activeIndex === null){
112-
this.setState({activeIndex: 0});
111+
if(event.keyCode === KEYS.TAB && this.state.focusIndex === null){
112+
this.setState({focusIndex: 0});
113113
EventUtil.trapImmediate(event);
114114
}
115115
//If user hits down key, advance aria activedescendant to next item
116-
else if(event.keyCode === KEYS.DOWN && this.state.activeIndex !== null){
116+
else if(event.keyCode === KEYS.DOWN && this.state.focusIndex !== null){
117117
EventUtil.trapImmediate(event);
118118
this.increaseIndex();
119119
}
120120
//If user hits up key, advance aria activedescendant to previous item
121-
else if(event.keyCode === KEYS.UP && this.state.activeIndex !== null){
121+
else if(event.keyCode === KEYS.UP && this.state.focusIndex !== null){
122122
EventUtil.trapImmediate(event);
123123
this.decreaseIndex();
124124
}
125125

126126
//If user hits enter/space key, select current activedescendant item
127-
else if((event.keyCode === KEYS.ENTER || event.keyCode === KEYS.SPACE) && this.state.activeIndex !== null){
127+
else if((event.keyCode === KEYS.ENTER || event.keyCode === KEYS.SPACE) && this.state.focusIndex !== null){
128128
EventUtil.trapImmediate(event);
129-
this.selectItem(this.state.activeItem);
129+
this.selectItem(this.state.currentFocus);
130130
}
131131
}
132132
}
@@ -141,10 +141,10 @@ class SLDSLookup extends React.Component {
141141
onSelect={this.selectItem.bind(this)}
142142
label={this.props.label}
143143
items={this.props.items}
144-
setActiveDescendant={this.setActiveDescendant.bind(this)}
144+
setFocus={this.setFocus.bind(this)}
145145
getListLength={this.getListLength.bind(this)}
146146
listLength={this.state.listLength}
147-
activeIndex={this.state.activeIndex}/>;
147+
focusIndex={this.state.focusIndex}/>;
148148
}else{
149149
return null;
150150
}
@@ -169,11 +169,10 @@ class SLDSLookup extends React.Component {
169169

170170
render(){
171171
let inputClasses = this.state.selectedIndex === null ? 'slds-input':'slds-input slds-hide';
172-
let compClasses = this.state.selectedIndex === null ? "slds-lookup ignore-react-onclickoutside":"slds-lookup ignore-react-onclickoutside slds-has-selection";
173-
console.log('activeIndex ', this.state.activeIndex);
172+
let componentClasses = this.state.selectedIndex === null ? "slds-lookup ignore-react-onclickoutside":"slds-lookup ignore-react-onclickoutside slds-has-selection";
174173

175174
return (
176-
<div className={compClasses} data-select="single" data-scope="single" data-typeahead="true">
175+
<div className={componentClasses} data-select="single" data-scope="single" data-typeahead="true">
177176
<section className="slds-form-element">
178177
<label className="slds-form-element__label" forHTML="lookup">{this.props.label}</label>
179178

@@ -187,7 +186,7 @@ class SLDSLookup extends React.Component {
187186
aria-label="lookup"
188187
aria-haspopup="true"
189188
aria-autocomplete="list"
190-
aria-activedescendant={this.state.activeItem ? this.state.activeItem:""}
189+
aria-activedescendant={this.state.currentFocus ? this.state.currentFocus:""}
191190
aria-expanded={this.state.isOpen}
192191
role="combobox"
193192
onChange={this.handleChange.bind(this)}
@@ -205,11 +204,18 @@ class SLDSLookup extends React.Component {
205204
}
206205
}
207206

207+
208+
SLDSLookup.propTypes = {
209+
items: React.PropTypes.array,
210+
label: React.PropTypes.string,
211+
};
212+
208213
SLDSLookup.defaultProps = {
209214
filterWith: defaultFilter,
210215
onItemSelect: function(item){
211-
//console.log('onItemSelect should be defined');
216+
//console.log('onItemSelect should be defined');
212217
}
213218
};
219+
214220
module.exports = SLDSLookup;
215221

components/SLDSModal/index.jsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ module.exports = React.createClass( {
5757
},
5858

5959
componentDidMount () {
60-
console.log('!!! window.activeElement !!! ',document.activeElement);
60+
//console.log('!!! window.activeElement !!! ',document.activeElement);
6161
this.setState({returnFocusTo:document.activeElement})
6262
if(!this.state.revealed){
6363
setTimeout(()=>{
@@ -93,11 +93,11 @@ module.exports = React.createClass( {
9393
},
9494

9595
getModal() {
96-
return <div className={'slds-modal' +(this.state.revealed?' slds-fade-in-open':'')}
96+
return <div className={'slds-modal' +(this.state.revealed?' slds-fade-in-open':'')}
9797
onClick={this.closeModal}>
98-
<div
98+
<div
9999
role='dialog'
100-
className='slds-modal__container'
100+
className='slds-modal__container'
101101
onClick={(e)=>{EventUtil.trap(e);}}>
102102
<div className='slds-modal__header'>
103103
<h2 className='slds-text-heading--medium'>{this.props.title}</h2>
@@ -141,7 +141,7 @@ module.exports = React.createClass( {
141141

142142

143143
if(this.state.isClosing){
144-
console.log('CLOSING: ');
144+
//console.log('CLOSING: ');
145145

146146
if(this.isMounted()){
147147
const el = this.getDOMNode().parentNode;

demo/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ const { Route, DefaultRoute, RouteHandler, Link } = Router;
77
import { SLDSSettings } from '../components/';
88
SLDSSettings.setAssetsPath('demo/assets/');
99

10-
console.log('SLDSSettings.getAssetsPath: '+SLDSSettings.getAssetsPath());
10+
//console.log('SLDSSettings.getAssetsPath: '+SLDSSettings.getAssetsPath());
1111

1212
import App from './App';
1313
import HomePage from './pages/HomePage';

0 commit comments

Comments
 (0)