Skip to content

Commit 6be0741

Browse files
committed
Merge branch 'master' into button
2 parents 9677b1b + 5faf65d commit 6be0741

File tree

4 files changed

+75
-26
lines changed

4 files changed

+75
-26
lines changed

components/SLDSLookup/Menu/Item/index.jsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,27 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
1010
import React, { Component } from 'react';
1111
import {Icon} from "../../../SLDSIcons";
1212
import {EventUtil} from '../../../utils';
13+
import escapeRegExp from 'lodash.escaperegexp';
1314

1415
class Item extends React.Component {
1516
constructor(props) {
1617
super(props);
1718
}
1819

1920
componentWillReceiveProps(nextProps){
20-
if(nextProps.isActive !== this.props.isActive && nextProps.isActive === true){
21+
if (nextProps.isActive !== this.props.isActive && nextProps.isActive === true) {
2122
this.scrollFocus();
2223
this.props.setFocus(this.props.id);
2324
}
2425
}
2526

2627
boldSearchText(children) {
27-
const term = this.props.searchTerm;
28-
if(!children || !term) return children;
29-
const regex = new RegExp('(' + term + ')', 'gi');
28+
let regex = this.props.boldRegex
29+
if (!regex) {
30+
const term = this.props.searchTerm;
31+
if(!children || !term) return children;
32+
regex = new RegExp('(' + escapeRegExp(term) + ')', 'gi');
33+
}
3034
return React.Children.map(children, c => {
3135
return (typeof c === 'string') ? <span dangerouslySetInnerHTML={{ __html: c.replace(regex, '<mark>$1</mark>')}}></span> : c;
3236
});
@@ -53,7 +57,7 @@ class Item extends React.Component {
5357

5458
return (
5559
//IMPORTANT: anchor id is used to set lookup's input's aria-activedescendant
56-
<li className={className} role="presentaion">
60+
<li className={className} role="presentation">
5761
<a
5862
href={this.props.href}
5963
id={id}
@@ -83,7 +87,8 @@ Item.propTypes = {
8387
setFocus: React.PropTypes.func,
8488
handleItemFocus: React.PropTypes.func,
8589
onSelect: React.PropTypes.func,
86-
data: React.PropTypes.object
90+
data: React.PropTypes.object,
91+
boldRegex: React.PropTypes.instanceOf(RegExp)
8792
};
8893

8994
Item.defaultProps = {

components/SLDSLookup/Menu/index.js

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -53,43 +53,67 @@ class Menu extends React.Component {
5353
return <div className={isActiveClass}>{this.props.footer}</div>;
5454
}
5555
}
56+
renderMessages(){
57+
return this.props.messages.map((message) => {
58+
return <li className="slds-lookup__message" aria-live="polite">{message}</li>;
59+
});
60+
}
61+
62+
renderErrors(){
63+
return this.props.errors.map((error) => {
64+
return <li className="slds-lookup__error" aria-live="polite">{error}</li>;
65+
});
66+
}
5667

5768
renderItems(){
5869
return this.props.items.filter(this.filter, this).map((c, i) => {
5970
//isActive means it is aria-activedescendant
6071
const id = c.id;
6172
let isActive = false;
6273
if(this.props.header){
63-
isActive = this.props.focusIndex === i + 1? true : false;
74+
isActive = this.props.focusIndex === i + 1 ? true : false;
6475
}else{
6576
isActive = this.props.focusIndex === i ? true : false;
6677
}
6778
return <Item
68-
key={id}
69-
id={id}
70-
type={this.props.type}
71-
searchTerm={this.props.searchTerm}
72-
index={i}
73-
isActive={isActive}
74-
setFocus={this.props.setFocus}
75-
handleItemFocus={this.handleItemFocus.bind(this)}
76-
onSelect={this.props.onSelect}
77-
data={c.data}
79+
key={id}
80+
id={id}
81+
type={this.props.type}
82+
searchTerm={this.props.searchTerm}
83+
index={i}
84+
isActive={isActive}
85+
setFocus={this.props.setFocus}
86+
handleItemFocus={this.handleItemFocus.bind(this)}
87+
onSelect={this.props.onSelect}
88+
data={c.data}
89+
boldRegex={this.props.boldRegex}
7890
>
7991
{c}
8092
</Item>
8193
});
8294
}
8395

96+
renderContent() {
97+
if (this.props.errors.length)
98+
return this.renderErrors
99+
else if (this.props.items.length === 0)
100+
return <li className="slds-lookup__message" aria-live="polite">{this.props.emptyMessage}</li>;
101+
102+
elements = this.renderItems()
103+
if (this.props.messages.length){
104+
return elements.concat(this.renderMessages());
105+
}
106+
return elements;
107+
108+
}
109+
84110
render(){
85111
return (
86112
<section id="menuContainer">
87113
{this.renderHeader()}
88-
89114
<ul id="list" className="slds-lookup__list" role="presentation" ref="list">
90-
{this.renderItems()}
115+
{this.renderContent()}
91116
</ul>
92-
93117
{this.renderFooter()}
94118
</section>
95119
)
@@ -103,9 +127,13 @@ Menu.propTypes = {
103127
focusIndex: React.PropTypes.number,
104128
listLength: React.PropTypes.number,
105129
items: React.PropTypes.array,
130+
emptyMessage: React.PropTypes.string,
131+
messages: React.PropTypes.arrayOf(React.PropTypes.string),
132+
errors: React.PropTypes.arrayOf(React.PropTypes.string),
106133
filterWith: React.PropTypes.func,
107134
getListLength: React.PropTypes.func,
108135
setFocus: React.PropTypes.func,
136+
boldRegex: React.PropTypes.instanceOf(RegExp),
109137
};
110138

111139
Menu.defaultProps = {

components/SLDSLookup/index.jsx

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ class SLDSLookup extends React.Component {
3737
focusIndex:null,
3838
selectedIndex: null,
3939
listLength:this.props.items.length,
40-
items:[]
40+
items:[],
41+
errors:[],
42+
messages:[],
4143
};
42-
43-
4444
}
4545

4646
componentDidMount(){
@@ -97,6 +97,7 @@ class SLDSLookup extends React.Component {
9797
selectedIndex: null,
9898
isOpen: true,
9999
});
100+
if(this.props.onItemUnselect) this.props.onItemUnselect();
100101
}
101102

102103
//=================================================
@@ -225,12 +226,16 @@ class SLDSLookup extends React.Component {
225226
focusIndex={this.state.focusIndex}
226227
listLength={this.state.listLength}
227228
items={this.state.items}
229+
emptyMessage={this.props.emptyMessage}
230+
messages={this.state.messages}
231+
errors={this.state.errors}
228232
filterWith={this.props.filterWith}
229233
getListLength={this.getListLength.bind(this)}
230234
setFocus={this.setFocus.bind(this)}
231235
onSelect={this.selectItem.bind(this)}
232236
header={this.getHeader()}
233237
footer={this.getFooter()}
238+
boldRegex={this.props.boldRegex}
234239
/>;
235240
}
236241
}
@@ -254,7 +259,7 @@ class SLDSLookup extends React.Component {
254259
{this.renderMenuContent()}
255260
</SLDSPopover>;
256261
}
257-
};
262+
}
258263

259264
renderSelectedItem(){
260265
let selectedItem = this.props.items[this.state.selectedIndex].label;
@@ -293,6 +298,12 @@ class SLDSLookup extends React.Component {
293298
if(newProps.items){
294299
this.modifyItems(newProps.items);
295300
}
301+
if (newProps.message){
302+
this.setState({message: newProps.message});
303+
}
304+
if (newProps.error){
305+
this.setState({errors: newProps.error});
306+
}
296307
}
297308

298309
render(){
@@ -328,7 +339,6 @@ class SLDSLookup extends React.Component {
328339
value={this.state.searchTerm}
329340
/>
330341
</div>
331-
332342
{this.props.modal?this.renderModalMenu():this.renderSimpleMenu()}
333343
</section>
334344
</div>
@@ -339,13 +349,19 @@ class SLDSLookup extends React.Component {
339349

340350
SLDSLookup.propTypes = {
341351
items: React.PropTypes.array,
352+
errors: React.PropTypes.arrayOf(React.PropTypes.string),
353+
emptyMessage: React.PropTypes.string,
354+
messages: React.PropTypes.arrayOf(React.PropTypes.string),
355+
errors: React.PropTypes.arrayOf(React.PropTypes.string),
342356
label: React.PropTypes.string,
343357
type: React.PropTypes.string,
344358
filterWith: React.PropTypes.func,
345359
onItemSelect: React.PropTypes.func,
360+
onItemUnselect: React.PropTypes.func,
346361
onChange: React.PropTypes.func,
347362
modal: React.PropTypes.bool,
348363
disabled: React.PropTypes.bool,
364+
boldRegex: React.PropTypes.instanceOf(RegExp),
349365
};
350366

351367
SLDSLookup.defaultProps = {

demo/pages/HomePage/PicklistBaseSection.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ module.exports = React.createClass( {
5757
<div className="slds-p-vertical--large">
5858
<SLDSPicklistBase
5959
options={[
60-
{label:'A Option Option Super Super Long',value:'A0'},
60+
{label:'A Option Option Super Super Long',value:'A0', title: 'Greg'},
6161
{label:'B Option',value:'B0'},
6262
{label:'C Option',value:'C0'},
6363
{label:'D Option',value:'D0'},

0 commit comments

Comments
 (0)