diff options
Diffstat (limited to 'src/settings/components/ui')
-rw-r--r-- | src/settings/components/ui/AddButton.tsx (renamed from src/settings/components/ui/AddButton.jsx) | 5 | ||||
-rw-r--r-- | src/settings/components/ui/DeleteButton.tsx (renamed from src/settings/components/ui/DeleteButton.jsx) | 5 | ||||
-rw-r--r-- | src/settings/components/ui/Input.jsx | 60 | ||||
-rw-r--r-- | src/settings/components/ui/Input.tsx | 82 |
4 files changed, 90 insertions, 62 deletions
diff --git a/src/settings/components/ui/AddButton.jsx b/src/settings/components/ui/AddButton.tsx index 185a03b..0577068 100644 --- a/src/settings/components/ui/AddButton.jsx +++ b/src/settings/components/ui/AddButton.tsx @@ -1,7 +1,10 @@ import './AddButton.scss'; import React from 'react'; -class AddButton extends React.Component { +interface Props extends React.AllHTMLAttributes<HTMLInputElement> { +} + +class AddButton extends React.Component<Props> { render() { return <input className='ui-add-button' type='button' value='✚' diff --git a/src/settings/components/ui/DeleteButton.jsx b/src/settings/components/ui/DeleteButton.tsx index 75811cd..f0ef6c9 100644 --- a/src/settings/components/ui/DeleteButton.jsx +++ b/src/settings/components/ui/DeleteButton.tsx @@ -1,7 +1,10 @@ import './DeleteButton.scss'; import React from 'react'; -class DeleteButton extends React.Component { +interface Props extends React.AllHTMLAttributes<HTMLInputElement> { +} + +class DeleteButton extends React.Component<Props> { render() { return <input className='ui-delete-button' type='button' value='✖' diff --git a/src/settings/components/ui/Input.jsx b/src/settings/components/ui/Input.jsx deleted file mode 100644 index 13a246b..0000000 --- a/src/settings/components/ui/Input.jsx +++ /dev/null @@ -1,60 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import './Input.scss'; - -class Input extends React.Component { - - renderText(props) { - let inputClassName = props.error ? 'input-error' : ''; - return <div className='settings-ui-input'> - <label htmlFor={props.id}>{ props.label }</label> - <input type='text' className={inputClassName} {...props} /> - </div>; - } - - renderRadio(props) { - let inputClassName = props.error ? 'input-error' : ''; - return <div className='settings-ui-input'> - <label> - <input type='radio' className={inputClassName} {...props} /> - { props.label } - </label> - </div>; - } - - renderTextArea(props) { - let inputClassName = props.error ? 'input-error' : ''; - return <div className='settings-ui-input'> - <label - htmlFor={props.id} - >{ props.label }</label> - <textarea className={inputClassName} {...props} /> - <p className='settings-ui-input-error'>{ this.props.error }</p> - </div>; - } - - render() { - let { type } = this.props; - - switch (this.props.type) { - case 'text': - return this.renderText(this.props); - case 'radio': - return this.renderRadio(this.props); - case 'textarea': - return this.renderTextArea(this.props); - default: - console.warn(`Unsupported input type ${type}`); - } - return null; - } -} - -Input.propTypes = { - type: PropTypes.string, - error: PropTypes.string, - label: PropTypes.string, - value: PropTypes.string, -}; - -export default Input; diff --git a/src/settings/components/ui/Input.tsx b/src/settings/components/ui/Input.tsx new file mode 100644 index 0000000..b7593b9 --- /dev/null +++ b/src/settings/components/ui/Input.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import './Input.scss'; + +interface Props extends React.AllHTMLAttributes<HTMLElement> { + name: string; + type: string; + error?: string; + label: string; + value: string; + onValueChange?: (name: string, value: string) => void; + onBlur?: (e: React.FocusEvent<Element>) => void; +} + +class Input extends React.Component<Props> { + renderText(props: Props) { + let inputClassName = props.error ? 'input-error' : ''; + let pp = { ...props }; + delete pp.onValueChange; + return <div className='settings-ui-input'> + <label htmlFor={props.id}>{ props.label }</label> + <input + type='text' className={inputClassName} + onChange={this.bindOnChange.bind(this)} + { ...pp } /> + </div>; + } + + renderRadio(props: Props) { + let inputClassName = props.error ? 'input-error' : ''; + let pp = { ...props }; + delete pp.onValueChange; + return <div className='settings-ui-input'> + <label> + <input + type='radio' className={inputClassName} + onChange={this.bindOnChange.bind(this)} + { ...pp } /> + { props.label } + </label> + </div>; + } + + renderTextArea(props: Props) { + let inputClassName = props.error ? 'input-error' : ''; + let pp = { ...props }; + delete pp.onValueChange; + return <div className='settings-ui-input'> + <label + htmlFor={props.id} + >{ props.label }</label> + <textarea + className={inputClassName} + onChange={this.bindOnChange.bind(this)} + { ...pp } /> + <p className='settings-ui-input-error'>{ this.props.error }</p> + </div>; + } + + render() { + let { type } = this.props; + + switch (this.props.type) { + case 'text': + return this.renderText(this.props); + case 'radio': + return this.renderRadio(this.props); + case 'textarea': + return this.renderTextArea(this.props); + default: + console.warn(`Unsupported input type ${type}`); + } + return null; + } + + bindOnChange(e: React.ChangeEvent<HTMLInputElement|HTMLTextAreaElement>) { + if (this.props.onValueChange) { + this.props.onValueChange(e.target.name, e.target.value); + } + } +} + +export default Input; |