Skip to content
This repository was archived by the owner on Apr 5, 2022. It is now read-only.

Commit 1a744cf

Browse files
authored
Merge pull request #359 from cjdev/CJPM-18357
make company selector a class component
2 parents b38c7bc + 7333615 commit 1a744cf

3 files changed

Lines changed: 115 additions & 54 deletions

File tree

packages/visual-stack-docs/src/containers/Components/Docs/company-selector.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,18 @@ export default () => (
1010
{snippets => (
1111
<>
1212
<Snippet tag="s1" src={snippets} />
13+
<br/>
14+
<Snippet tag="s4" src={snippets} />
15+
{/* s4:start */}
16+
<CompanySelector
17+
selectedCompany={{ name: 'Foobar', id: '111111' }}
18+
companies={[
19+
{ name: 'Foobar', id: '111111' },
20+
{ name: 'Bazbox', id: '222222' },
21+
]}
22+
/>
23+
{/* s4:end */}
24+
<br/>
1325
<Snippet tag="s2" src={snippets} />
1426
{/* s2:start */}
1527
<CompanySelector
@@ -18,8 +30,20 @@ export default () => (
1830
{ name: 'Foobar', id: '111111' },
1931
{ name: 'Bazbox', id: '222222' },
2032
]}
33+
selectText="Look!"
34+
searchAccountsText="These are the accounts."
2135
/>
2236
{/* s2:end */}
37+
<br/>
38+
<Snippet tag="s3" src={snippets} />
39+
{/* s3:start */}
40+
<CompanySelector
41+
selectedCompany={{ name: 'Foobar', id: '111111' }}
42+
companies={[
43+
{ name: 'Foobar', id: '111111' }
44+
]}
45+
/>
46+
{/* s3:end */}
2347
</>
2448
)}
2549
</Demo>

packages/visual-stack/src/components/CompanySelector/CompanySelector.css

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
}
1212

1313
.top-nav-dropdown-container {
14-
float: right;
14+
float: left;
15+
max-width: 220px;
16+
max-height: 32px;
1517
}
1618

1719
.account-dropdown {

packages/visual-stack/src/components/CompanySelector/index.js

Lines changed: 88 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,98 @@
1-
import React, { useState } from 'react';
1+
import React from 'react';
22
import ReactSelect, { components } from 'react-select';
33

44
import companySelectorStyle from './CompanySelectorStyle';
55
import './CompanySelector.css';
66

7-
/**
8-
*
9-
* @param {object} selectedCompany The currently selected company
10-
* @param {string} selectedCompany.name
11-
* @param {string} selectedCompany.id The company id
12-
* @param {array} companies A list of companies of the same shape as `selectedCompany`
13-
* @returns {JSX.Element}
14-
*/
15-
export const CompanySelector = ({ selectedCompany, companies }) => {
16-
const hasMultipleCompanies = companies.length > 1;
17-
18-
const [isDropdownExpanded, setIsDropdownExpanded] = useState(false);
19-
const [company, setCompany] = useState({
20-
name: selectedCompany ? selectedCompany.name : null,
21-
id: selectedCompany ? selectedCompany.id : null,
22-
});
23-
24-
const collapseDropdown = company => {
25-
if (company) setCompany(company);
26-
setIsDropdownExpanded(false);
7+
export class CompanySelector extends React.Component {
8+
container = React.createRef();
9+
state = {
10+
isDropdownExpanded: false,
11+
company: { name: null, id: null },
2712
};
2813

29-
const expandDropdown = () => setIsDropdownExpanded(true);
14+
constructor(props) {
15+
super(props);
16+
if (this.props.selectedCompany)
17+
this.state.company = {
18+
name: this.props.selectedCompany.name,
19+
id: this.props.selectedCompany.id,
20+
};
21+
this.collapseDropdown = this.collapseDropdown.bind(this);
22+
this.expandDropdown = this.expandDropdown.bind(this);
23+
this.handleClickOutside = this.handleClickOutside.bind(this);
24+
}
3025

31-
return (
32-
<div className="top-nav-dropdown-container">
33-
<MenuItem
34-
name="AccountIndicator"
35-
title={company.name}
36-
text={`(${company.id})`}
37-
dataId={'topnav-accountswitcher'}
38-
onClick={hasMultipleCompanies ? () => expandDropdown() : () => {}}
39-
showDownArrow={hasMultipleCompanies}
40-
additionalClasses={'account-dropdown'}
41-
/>
42-
{hasMultipleCompanies ? (
43-
<CompanySelectorDropdown
44-
companies={companies}
45-
selectedCompany={company.id}
46-
show={isDropdownExpanded}
47-
collapseDropdown={x => collapseDropdown(x)}
26+
componentDidMount() {
27+
document.addEventListener('mousedown', this.handleClickOutside);
28+
}
29+
30+
componentWillUnmount() {
31+
document.removeEventListener('mousedown', this.handleClickOutside);
32+
}
33+
34+
collapseDropdown(company) {
35+
if (company) {
36+
this.setState({ company: company });
37+
if (this.props.updateCompanyCallback) this.props.updateCompanyCallback();
38+
}
39+
console.log('collapse dropdown');
40+
this.setState({ isDropdownExpanded: false });
41+
}
42+
43+
expandDropdown() {
44+
console.log('expand dropdown');
45+
this.setState({ isDropdownExpanded: true });
46+
}
47+
48+
handleClickOutside = (event) => {
49+
if (
50+
this.container.current &&
51+
!this.container.current.contains(event.target)
52+
) {
53+
console.log('click outside collapse');
54+
this.setState({ isDropdownExpanded: false });
55+
}
56+
};
57+
58+
render() {
59+
const hasMultipleCompanies = this.props.companies.length > 1;
60+
61+
return (
62+
<div className="top-nav-dropdown-container" ref={this.container}>
63+
<MenuItem
64+
name="AccountIndicator"
65+
title={this.state.company.name}
66+
text={`(${this.state.company.id})`}
67+
dataId={'topnav-accountswitcher'}
68+
onClick={
69+
hasMultipleCompanies ? () => this.expandDropdown() : () => {}
70+
}
71+
showDownArrow={hasMultipleCompanies}
72+
additionalClasses={'account-dropdown'}
4873
/>
49-
) : (
50-
<div />
51-
)}
52-
</div>
53-
);
54-
};
74+
{hasMultipleCompanies ? (
75+
<CompanySelectorDropdown
76+
{...this.props}
77+
companies={this.props.companies}
78+
selectedCompany={this.state.company.id}
79+
show={this.state.isDropdownExpanded}
80+
collapseDropdown={(x) => this.collapseDropdown(x)}
81+
/>
82+
) : (
83+
<div />
84+
)}
85+
</div>
86+
);
87+
}
88+
}
5589

5690
const CompanySelectorDropdown = ({
5791
companies,
5892
selectedCompany,
5993
show,
6094
collapseDropdown,
95+
...restProps
6196
}) => {
6297
const changeCompany = (value, { action }) => {
6398
if (action === 'select-option') {
@@ -69,10 +104,10 @@ const CompanySelectorDropdown = ({
69104
};
70105

71106
const companyList = companies
72-
.map(c => ({ value: c, label: `${c.name} (${c.id})` }))
107+
.map((c) => ({ value: c, label: `${c.name} (${c.id})` }))
73108
.sort((a, b) => a.label.toUpperCase().localeCompare(b.label.toUpperCase()));
74109

75-
const CustomMenu = props => (
110+
const CustomMenu = (props) => (
76111
<components.Menu {...props}>
77112
{props.children}
78113
<div
@@ -89,7 +124,7 @@ const CompanySelectorDropdown = ({
89124
</components.Menu>
90125
);
91126

92-
const CustomInput = props => (
127+
const CustomInput = (props) => (
93128
<components.Input {...props} autoFocus>
94129
{props.children}
95130
</components.Input>
@@ -98,7 +133,7 @@ const CompanySelectorDropdown = ({
98133
return show ? (
99134
<div className="top-nav-dropdown company-switcher-dropdown">
100135
<DropdownHeader
101-
label={'Select Account'}
136+
label={restProps.selectText || 'Select Account'}
102137
collapseDropdown={collapseDropdown}
103138
/>
104139
<ReactSelect
@@ -107,8 +142,8 @@ const CompanySelectorDropdown = ({
107142
menuIsOpen={true}
108143
onChange={changeCompany}
109144
options={companyList}
110-
isOptionSelected={option => option.value === selectedCompany}
111-
placeholder={<CompanySelectorPlaceholder />}
145+
isOptionSelected={(option) => option.value === selectedCompany}
146+
placeholder={<CompanySelectorPlaceholder {...restProps} />}
112147
/>
113148
</div>
114149
) : (
@@ -160,7 +195,7 @@ const DropdownHeader = ({ label, collapseDropdown }) => (
160195
</div>
161196
);
162197

163-
const CompanySelectorPlaceholder = () => (
198+
const CompanySelectorPlaceholder = ({ ...restProps }) => (
164199
<>
165200
<div
166201
style={{
@@ -187,7 +222,7 @@ const CompanySelectorPlaceholder = () => (
187222
top: '-2px',
188223
}}
189224
>
190-
{'Search for accounts...'}
225+
{restProps.searchAccountsText || 'Search for accounts...'}
191226
</div>
192227
</>
193228
);

0 commit comments

Comments
 (0)