1- import React , { useState } from 'react' ;
1+ import React from 'react' ;
22import ReactSelect , { components } from 'react-select' ;
33
44import companySelectorStyle from './CompanySelectorStyle' ;
55import './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
5690const 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