apeman-react-checkbox
Version:
apeman react package for checkbox component.
100 lines (86 loc) • 2.25 kB
JSX
/**
* Checkbox component.
* @class ApCheckbox
*/
import React, { Component, PropTypes as types } from 'react'
import classnames from 'classnames'
import { ApIcon } from 'apeman-react-icon'
const DEFAULT_ICON = 'ion ion-android-checkbox-outline-blank'
const DEFAULT_CHECKED_ICON = 'ion ion-android-checkbox'
/** @lends ApCheckbox */
class ApCheckbox extends Component {
render () {
const s = this
let { props } = s
let {
id,
name,
value,
checked,
onChange
} = props
let iconClass = {
'ap-checkbox-icon-checked': checked,
[ props.checkedIcon ]: checked,
[ props.icon ]: !checked
}
let className = classnames('ap-checkbox', props.className, {
'ap-checkbox-checked': checked
})
return (
<label className={ className }
htmlFor={ id }
id={`${id}-wrap`}>
<ApIcon className={ classnames('ap-checkbox-icon', iconClass) }/>
<input type='checkbox'
className={ classnames('ap-checkbox-input') }
id={ id }
name={ name }
value={ value }
checked={ checked }
onChange={ onChange }/>
<span className={ classnames('ap-checkbox-title') }>{ props.title }</span>
</label>
)
}
}
Object.assign(ApCheckbox, {
// --------------------
// Specs
// --------------------
propTypes: {
/** Document id */
id: types.string.isRequired,
/** Name of checkbox input */
name: types.string.isRequired,
/** Value of checkbox input */
value: types.oneOfType([
types.string,
types.bool
]).isRequired,
/** Label title */
title: types.node,
/** Checked or not */
checked: types.bool,
/** Handle for change event */
onChange: types.func,
/** Icon class name for normal state */
icon: types.string,
/** Icon class name for checked state */
checkedIcon: types.string
},
defaultProps: {
id: null,
name: null,
value: '',
title: '',
checked: false,
onChange: null,
icon: DEFAULT_ICON,
checkedIcon: DEFAULT_CHECKED_ICON
},
DEFAULT_ICON,
DEFAULT_CHECKED_ICON
})
export default ApCheckbox