Skip to content

Commit c5efa08

Browse files
committed
Merge pull request #37 from salesforce-ux/lookups-refactor
Lookups refactor
2 parents a860be2 + b973330 commit c5efa08

File tree

5 files changed

+81
-112
lines changed

5 files changed

+81
-112
lines changed

components/SLDSLookup/Menu/ActionItem/index.jsx

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,26 @@ class ActionItem extends React.Component {
1919
if(nextProps.isActive !== this.props.isActive && nextProps.isActive === true) this.props.setFocus(this.props.id);
2020
}
2121

22-
renderIcon(){
23-
if(this.props.icon){
24-
return <Icon name={this.props.icon} category="utility" size="x-small" className="slds-icon-text-default" />
22+
render(){
23+
let content, id, icon;
24+
if(this.props.item === 'search'){
25+
content = (this.props.searchTerm ? '"' + this.props.searchTerm + '"' : "") + ' in ' + this.props.type + 's';
26+
id = 'searchRecords';
27+
icon = 'search';
28+
}
29+
else if(this.props.item === 'newItem'){
30+
content = 'New ' + this.props.type;
31+
id = 'addNewItem';
32+
icon = 'add';
2533
}
26-
}
2734

28-
render(){
2935
let className = 'slds-button';
3036
if(this.props.isActive) className += ' slds-theme--shade'
3137

3238
return (
33-
<button id={this.props.id} tabIndex="-1" className={className} onClick={this.props.onSelect} onMouseDown={this.props.onSelect}>
34-
{this.renderIcon()}
35-
{this.props.children}
39+
<button id={id} tabIndex="-1" className={className}>
40+
<Icon name={icon} category="utility" size="x-small" className="slds-icon-text-default" />
41+
{content}
3642
</button>
3743
)
3844
}

components/SLDSLookup/Menu/index.js

Lines changed: 35 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
import React, { Component } from 'react';
1111
import Item from './Item';
12-
import ActionItem from './ActionItem';
1312
import {Icon} from "../../SLDSIcons";
1413

1514
class Menu extends React.Component {
@@ -35,63 +34,48 @@ class Menu extends React.Component {
3534
}
3635
}
3736

38-
getHeader(){
39-
if(this.props.header !== false && this.props.header !== undefined){
40-
41-
let content = (this.props.searchTerm ? '"' + this.props.searchTerm + '"' : "") + ' in ' + this.props.type + 's';
42-
if(this.props.header !== true) content = this.props.header;
43-
37+
renderHeader(){
38+
if(this.props.header){
4439
let headerActive = false;
45-
this.props.focusIndex === 0 ? headerActive = true: headerActive = false;
46-
47-
return (
48-
<div className="slds-lookup__item">
49-
<ActionItem
50-
id='searchRecords'
51-
icon={this.props.header === true ? 'search' : false}
52-
type={this.props.type}
53-
isActive={headerActive}
54-
setFocus={this.props.setFocus}
55-
onSelect={this.props.headerClick}
56-
>
57-
{content}
58-
</ActionItem>
59-
</div>
60-
)
40+
let isActiveClass = null;
41+
if(this.props.focusIndex === 0){
42+
headerActive = true;
43+
isActiveClass = 'slds-theme--shade';
44+
}else{
45+
headerActive = false;
46+
isActiveClass = '';
47+
}
48+
49+
return <div className={isActiveClass}>{this.props.header}</div>;
6150
}
6251
}
6352

64-
getFooter(){
65-
if(this.props.footer != false && this.props.footer !== undefined){
66-
67-
let content = 'New ' + this.props.type;
68-
if(this.props.footer !== true) content = this.props.footer;
69-
53+
renderFooter(){
54+
if(this.props.footer){
7055
let footerActive = false;
71-
this.props.focusIndex === this.props.listLength+1 ? footerActive = true: footerActive = false;
72-
73-
return (
74-
<div className="slds-lookup__item">
75-
<ActionItem
76-
id='addNewItem'
77-
icon={this.props.footer === true ? 'add' : false}
78-
type={this.props.type}
79-
isActive={footerActive}
80-
setFocus={this.props.setFocus}
81-
onSelect={this.props.footerClick}
82-
>
83-
{content}
84-
</ActionItem>
85-
</div>
86-
)
56+
let isActiveClass = null;
57+
if(this.props.focusIndex === this.props.listLength+1){
58+
footerActive = true;
59+
isActiveClass = 'slds-theme--shade';
60+
}else{
61+
footerActive = false;
62+
isActiveClass = '';
63+
}
64+
65+
return <div className={isActiveClass}>{this.props.footer}</div>;
8766
}
8867
}
8968

9069
renderItems(){
9170
return this.props.items.filter(this.filter, this).map((c, i) => {
9271
//isActive means it is aria-activedescendant
93-
const isActive = this.props.focusIndex === i + 1 ? true : false;
9472
const id = c.id;
73+
let isActive = false;
74+
if(this.props.header){
75+
isActive = this.props.focusIndex === i + 1? true : false;
76+
}else{
77+
isActive = this.props.focusIndex === i ? true : false;
78+
}
9579
return <Item
9680
key={id}
9781
id={id}
@@ -110,20 +94,15 @@ class Menu extends React.Component {
11094
}
11195

11296
render(){
113-
let isNewItemBtnActive = false;
114-
let isSearchRecordsActive = false;
115-
this.props.focusIndex === this.props.listLength + 1 ? isNewItemBtnActive = true : isNewItemBtnActive = false;
116-
this.props.focusIndex === 0 ? isSearchRecordsActive = true: isSearchRecordsActive = false;
117-
11897
return (
119-
<section>
120-
{this.getHeader()}
98+
<section id="menuContainer">
99+
{this.renderHeader()}
121100

122101
<ul id="list" className="slds-lookup__list" role="presentation" ref="list">
123102
{this.renderItems()}
124103
</ul>
125104

126-
{this.getFooter()}
105+
{this.renderFooter()}
127106
</section>
128107
)
129108
}
@@ -139,6 +118,8 @@ Menu.propTypes = {
139118
filterWith: React.PropTypes.func,
140119
getListLength: React.PropTypes.func,
141120
setFocus: React.PropTypes.func,
121+
header: React.PropTypes.element,
122+
footer: React.PropTypes.element,
142123
};
143124

144125
Menu.defaultProps = {

components/SLDSLookup/index.jsx

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -93,16 +93,6 @@ class SLDSLookup extends React.Component {
9393
});
9494
}
9595

96-
footerClick(){
97-
this.handleClose();
98-
if(this.props.onFooterClick) this.props.onFooterClick();
99-
}
100-
101-
headerClick(){
102-
this.handleClose();
103-
if(this.props.onHeaderClick) this.props.onHeaderClick();
104-
}
105-
10696
//=================================================
10797
// Event Listeners on Input
10898
handleClose() {
@@ -157,13 +147,13 @@ class SLDSLookup extends React.Component {
157147
//If user hits enter/space key, select current activedescendant item
158148
else if((event.keyCode === KEYS.ENTER || event.keyCode === KEYS.SPACE) && this.state.focusIndex !== null){
159149
EventUtil.trapImmediate(event);
160-
//If the focus is on the first fixed Action Item in Menu
161-
if(this.state.focusIndex === 0){
162-
this.headerClick();
150+
//If the focus is on the first fixed Action Item in Menu, click it
151+
if(this.props.header && this.state.focusIndex === 0){
152+
document.getElementById('menuContainer').firstChild.children[0].click();
163153
}
164-
//If the focus is on the last fixed Action Item in Menu
165-
else if(this.state.focusIndex === (this.state.listLength + 1)){
166-
this.footerClick();
154+
//If the focus is on the last fixed Action Item in Menu, click it
155+
else if(this.props.footer && this.state.focusIndex === (this.state.listLength + 1)){
156+
document.getElementById('menuContainer').lastChild.children[0].click();
167157
}
168158
//If not, then select menu item
169159
else{
@@ -198,16 +188,13 @@ class SLDSLookup extends React.Component {
198188
setFocus={this.setFocus.bind(this)}
199189
onSelect={this.selectItem.bind(this)}
200190
header={this.props.header}
201-
headerClick={this.headerClick.bind(this)}
202191
footer={this.props.footer}
203-
footerClick={this.footerClick.bind(this)}
204192
/>;
205193
}
206194
}
207195

208196
renderSimpleMenu(){
209197
if(this.state.isOpen){
210-
211198
return <div className="ignore-react-onclickoutside slds-lookup__menu" role="listbox" ref="scroll">
212199
{ this.renderMenuContent() }
213200
</div>;
@@ -248,7 +235,7 @@ class SLDSLookup extends React.Component {
248235
}
249236

250237
modifyItems () {
251-
const items = this.props.items.map((item, index) => {
238+
const items = this.props.items.map((item, index) => {
252239
return {
253240
id : 'item-' + index,
254241
label: item.label,
@@ -312,8 +299,6 @@ SLDSLookup.propTypes = {
312299
filterWith: React.PropTypes.func,
313300
onItemSelect: React.PropTypes.func,
314301
onChange: React.PropTypes.func,
315-
onFooterClick: React.PropTypes.func,
316-
onHeaderClick: React.PropTypes.func,
317302
modal: React.PropTypes.bool,
318303
disabled: React.PropTypes.bool,
319304
};

demo/code-snippets/SLDSLookupPage.txt

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,3 @@
1-
Default Props Prop Values
2-
* header={false} [true, false, custom DOM node]
3-
* footer={false} [true, false, custom DOM node]
4-
5-
true renders default header or footer
6-
false does not render header or footer
7-
pass in custom DOM node to render in header or footer
8-
91
const items = [
102
{label:'Paddy\'s Pub'},
113
{label:'Tyrell Corp'},
@@ -20,10 +12,8 @@ const items = [
2012
label="Accounts"
2113
type="account"
2214
header={this.getHeader()}
23-
footer={true}
15+
footer={this.getFooter()}
2416
onChange={this.onChange}
25-
onItemSelect={this.onItemSelect}
26-
onHeaderClick={this.searchRecords}
27-
onFooterClick={this.newItem} />
17+
onItemSelect={this.onItemSelect} />
2818

2919

demo/pages/HomePage/LookupBaseSection.jsx

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
1111

1212
import React from 'react';
1313
import SLDSLookup from '../../../components/SLDSLookup';
14-
1514
import {default as PrismCode} from 'react-prism/lib/PrismCode';
16-
15+
import ActionItem from '../../../components/SLDSLookup/Menu/ActionItem';
1716

1817
const items = [
1918
{label:'Paddy\'s Pub'},
@@ -36,14 +35,6 @@ module.exports = React.createClass( {
3635
return {};
3736
},
3837

39-
newItem(){
40-
alert('New Item Clicked');
41-
},
42-
43-
customHeaderClick(){
44-
alert('custom header clicked');
45-
},
46-
4738
onChange(newValue){
4839
console.log('New search term: ', newValue);
4940
},
@@ -52,9 +43,27 @@ module.exports = React.createClass( {
5243
console.log(item , ' Selected');
5344
},
5445

46+
headerClick(){
47+
console.log('=====> Lookup Header Clicked');
48+
},
49+
50+
footerClick(){
51+
console.log('=====> Lookup Footer Clicked');
52+
},
53+
5554
getHeader(){
56-
return(
57-
<div>MY CUSTOM HEADER</div>
55+
return (
56+
<div className="slds-lookup__item" onClick={this.headerClick} onMouseDown={this.headerClick}>
57+
<ActionItem item='search' type='account' searchTerm={searchTerm} />
58+
</div>
59+
)
60+
},
61+
62+
getFooter(){
63+
return (
64+
<div className="slds-lookup__item" onClick={this.footerClick} onMouseDown={this.footerClick}>
65+
<ActionItem item='newItem' type='account' />
66+
</div>
5867
)
5968
},
6069

@@ -76,12 +85,10 @@ module.exports = React.createClass( {
7685
<div className="slds-p-vertical--large">
7786
<SLDSLookup
7887
items={items}
79-
label="Accounts"
88+
label="Account"
8089
type="account"
8190
header={this.getHeader()}
82-
onHeaderClick={this.customHeaderClick}
83-
footer={true}
84-
onFooterClick={this.newItem}
91+
footer={this.getFooter()}
8592
onChange={this.onChange}
8693
onItemSelect={this.selectItem}
8794
/>

0 commit comments

Comments
 (0)