Commit 77f0fb87 authored by Isaac Pereira's avatar Isaac Pereira

Merge #1 into 'master' with new component 'CheckboxListMenuItem' to properly...

Merge #1 into 'master' with  new component 'CheckboxListMenuItem' to properly handle the item toggle action

Closes #1

MR !1
parents d2957d45 ff0ca31b
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}
/>)
This diff is collapsed.
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