You need to sign in or sign up before continuing.
Commit ff0ca31b authored by Gabriel Macena's avatar Gabriel Macena

Refactored the MultipleSelectField component to use the new CheckboxListMenuItem.

parent f8ba2c6c
import * as React from 'react'
import { MultipleSelectFieldItem } from './MultipleSelectField'
import { CheckboxListItem } from '../CheckboxListItem'
export interface CheckboxListMenuItemProps {
item: MultipleSelectFieldItem,
checked: boolean,
onToggleCheck (checked: boolean, item: MultipleSelectFieldItem): void
}
export class CheckboxListMenuItem extends React.PureComponent<CheckboxListMenuItemProps> {
constructor (props: CheckboxListMenuItemProps) {
super(props)
this.onToggleCheck = this.onToggleCheck.bind(this)
}
render () {
const { item, checked } = this.props
return <CheckboxListItem
id={item.id}
key={item.id}
label={item.label}
checked={checked}
onToggleCheck={this.onToggleCheck}
/>
}
private onToggleCheck (checked: boolean, event: Event) {
if (this.props.onToggleCheck) this.props.onToggleCheck(checked, this.props.item)
}
}
...@@ -5,6 +5,7 @@ import { CheckboxListItem } from '../CheckboxListItem' ...@@ -5,6 +5,7 @@ import { CheckboxListItem } from '../CheckboxListItem'
import DropdownMenu, { DropdownMenuProps } from 'react-md/lib/Menus/DropdownMenu' import DropdownMenu, { DropdownMenuProps } from 'react-md/lib/Menus/DropdownMenu'
import TextField, { TextFieldProps, TextFieldLineDirections, TextFieldTypes } from 'react-md/lib/TextFields/TextField' import TextField, { TextFieldProps, TextFieldLineDirections, TextFieldTypes } from 'react-md/lib/TextFields/TextField'
import { HorizontalAnchors, VerticalAnchors, LayoverPositions, LayoverAnchor } from 'react-md/lib/Helpers/Layover' import { HorizontalAnchors, VerticalAnchors, LayoverPositions, LayoverAnchor } from 'react-md/lib/Helpers/Layover'
import { CheckboxListMenuItem } from './CheckboxListMenuItem'
export interface MultipleSelectFieldItem { export interface MultipleSelectFieldItem {
id: string id: string
...@@ -232,11 +233,10 @@ export class MultipleSelectField extends React.PureComponent<MultipleSelectField ...@@ -232,11 +233,10 @@ export class MultipleSelectField extends React.PureComponent<MultipleSelectField
filter filter
} = this.props } = this.props
const { checked, inputValue } = this.state const { checked, inputValue } = this.state
const items = this._filter(menuItems, inputValue).map((item, index) => <CheckboxListItem const items = this._filter(menuItems, inputValue).map((item, index) => <CheckboxListMenuItem
id={String(index)} item={item}
key={item.id} key={item.id}
label={item.label} checked={item.checked || checked[item.id]}
checked={item.checked || checked[index]}
onToggleCheck={this._handleToggleCheck} onToggleCheck={this._handleToggleCheck}
/>) />)
return <DropdownMenu return <DropdownMenu
...@@ -267,13 +267,12 @@ export class MultipleSelectField extends React.PureComponent<MultipleSelectField ...@@ -267,13 +267,12 @@ export class MultipleSelectField extends React.PureComponent<MultipleSelectField
this.setState({ inputValue }) this.setState({ inputValue })
if (this.props.onInputChange) this.props.onInputChange(inputValue, e) if (this.props.onInputChange) this.props.onInputChange(inputValue, e)
} }
private _handleToggleCheck (checked: boolean, event: Event) { private _handleToggleCheck (checked: boolean, item: MultipleSelectFieldItem) {
const element = event.currentTarget as HTMLInputElement if (item.checked === undefined) {
if (this.props.menuItems[element.id].checked === undefined) {
this.setState(state => ({ this.setState(state => ({
checked: { ...state.checked, [element.id]: checked } checked: { ...state.checked, [item.id]: checked }
})) }))
} }
this.props.onToggleCheck(checked, this.props.menuItems[element.id].id) this.props.onToggleCheck(checked, item.id)
} }
} }
export * from './MultipleSelectField' export * from './MultipleSelectField'
export * from './CheckboxListMenuItem'
export { MultipleSelectField as default } from './MultipleSelectField' export { MultipleSelectField as default } from './MultipleSelectField'
...@@ -37,3 +37,14 @@ storiesOf('MultipleSelectField', module) ...@@ -37,3 +37,14 @@ storiesOf('MultipleSelectField', module)
}} }}
menuPosition={MultipleSelectField.Positions.BELOW} menuPosition={MultipleSelectField.Positions.BELOW}
/>) />)
.add('with filter', () => <DefaultMultipleSelectField
className='md-cell--2'
menuDefaultVisible
inputDefaultValue='item 2'
filter={(items, text) => text ? items.filter(item => item.label.includes(text.toString())) : items}
menuAnchor={{
x: MultipleSelectField.HorizontalAnchors.INNER_LEFT,
y: MultipleSelectField.VerticalAnchors.BOTTOM
}}
menuPosition={MultipleSelectField.Positions.BELOW}
/>)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment