shinkansen-cogs
Version:
101 lines (87 loc) • 2.04 kB
JSX
/**
* @typedef {CogsTypes.OnEventType} OnEventType
* @typedef {CogsTypes.Super.Components.Field.FieldProps} FieldProps
* @typedef {CogsTypes.Components.Field.ValueProps} ValueProps
* @typedef {CogsTypes.Components.Field.CheckProps} CheckProps
*/
/**
* Field component
*/
import PropTypes from 'prop-types'
import Field from '#cogs/super/components/field'
/**
* @type {OnEventType}
*/
function DEFAULT_HANDLE_EVENT () {
//
}
/**
* @param {unknown} value
* @returns {string}
*/
export function toInputValue (value) {
return (value === undefined) ? '' : String(value)
}
/**
* ValueField component
*
* @extends {Field<FieldProps & ValueProps>}
*/
export class ValueField extends Field {}
ValueField.propTypes = {
...Field.propTypes,
defaultValue: PropTypes.string
}
/**
* CheckField component
*
* @extends {Field<FieldProps & CheckProps>}
*/
export class CheckField extends Field {
/**
* @param {CheckProps} props
* @returns {boolean}
*/
shouldComponentUpdate (props) {
const {
checked,
defaultChecked,
onClick,
...superProps
} = props
return (
(checked !== this.props.checked) ||
(defaultChecked !== this.props.defaultChecked) ||
super.shouldComponentUpdate(superProps) ||
(onClick !== this.props.onClick)
)
}
/**
* @param {{ target: { value?: string, checked?: boolean } }} event
* @returns {void}
*/
handleChange = ({ target: { value, checked } }) => {
const {
onChange = DEFAULT_HANDLE_EVENT,
name
} = this.props
onChange(name, value, checked)
}
/**
* @param {{ target: { value?: string, checked?: boolean } }} event
* @returns {void}
*/
handleClick = ({ target: { value, checked } }) => {
const {
onClick = DEFAULT_HANDLE_EVENT,
name
} = this.props
onClick(name, value, checked)
}
}
CheckField.propTypes = {
...Field.propTypes,
checked: PropTypes.bool,
defaultChecked: PropTypes.bool,
onClick: PropTypes.func
}