diff options
author | Shin'ya Ueoka <ueokande@i-beam.org> | 2019-05-07 21:16:47 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-07 21:16:47 +0900 |
commit | 05ef6a8ca35aaa801c11eb6b4896caa3690058af (patch) | |
tree | 2c7708ca91ac2b462cc86aa28612e3d3943496f3 /src/settings/components/form/SearchForm.tsx | |
parent | 457d954e08923b4accd28a919c72d0b61db1bb98 (diff) | |
parent | 27d0a7f37d24a0ad68a8ccb7dee18fc1d00eea58 (diff) |
Merge pull request #578 from ueokande/move-to-typescript
Move to TypeScript
Diffstat (limited to 'src/settings/components/form/SearchForm.tsx')
-rw-r--r-- | src/settings/components/form/SearchForm.tsx | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/settings/components/form/SearchForm.tsx b/src/settings/components/form/SearchForm.tsx new file mode 100644 index 0000000..67dbeba --- /dev/null +++ b/src/settings/components/form/SearchForm.tsx @@ -0,0 +1,86 @@ +import './SearchForm.scss'; +import React from 'react'; +import AddButton from '../ui/AddButton'; +import DeleteButton from '../ui/DeleteButton'; +import { FormSearch } from '../../../shared/SettingData'; + +interface Props { + value: FormSearch; + onChange: (value: FormSearch) => void; + onBlur: () => void; +} + +class SearchForm extends React.Component<Props> { + public static defaultProps: Props = { + value: FormSearch.valueOf({ default: '', engines: []}), + onChange: () => {}, + onBlur: () => {}, + } + + render() { + let value = this.props.value.toJSON(); + return <div className='form-search-form'> + <div className='form-search-form-header'> + <div className='column-name'>Name</div> + <div className='column-url'>URL</div> + <div className='column-option'>Default</div> + </div> + { + value.engines.map((engine, index) => { + return <div key={index} className='form-search-form-row'> + <input data-index={index} type='text' name='name' + className='column-name' value={engine[0]} + onChange={this.bindValue.bind(this)} + onBlur={this.props.onBlur} + /> + <input data-index={index} type='text' name='url' + placeholder='http://example.com/?q={}' + className='column-url' value={engine[1]} + onChange={this.bindValue.bind(this)} + onBlur={this.props.onBlur} + /> + <div className='column-option'> + <input data-index={index} type='radio' name='default' + checked={value.default === engine[0]} + onChange={this.bindValue.bind(this)} /> + <DeleteButton data-index={index} name='delete' + onClick={this.bindValue.bind(this)} /> + </div> + </div>; + }) + } + <AddButton name='add' style={{ float: 'right' }} + onClick={this.bindValue.bind(this)} /> + </div>; + } + + bindValue(e: any) { + let value = this.props.value.toJSON(); + let name = e.target.name; + let index = Number(e.target.getAttribute('data-index')); + let next: typeof value = { + default: value.default, + engines: value.engines.slice(), + }; + + if (name === 'name') { + next.engines[index][0] = e.target.value; + next.default = value.engines[index][0]; + } else if (name === 'url') { + next.engines[index][1] = e.target.value; + } else if (name === 'default') { + next.default = value.engines[index][0]; + } else if (name === 'add') { + next.engines.push(['', '']); + } else if (name === 'delete') { + next.engines.splice(index, 1); + } + + this.props.onChange(FormSearch.valueOf(next)); + if (name === 'delete' || name === 'default') { + this.props.onBlur(); + } + } +} + +export default SearchForm; |