diff options
| -rw-r--r-- | src/settings/components/form/blacklist-form.jsx | 47 | ||||
| -rw-r--r-- | src/settings/components/form/blacklist-form.scss | 9 | ||||
| -rw-r--r-- | src/settings/components/index.jsx | 29 | ||||
| -rw-r--r-- | src/shared/default-settings.js | 3 | 
4 files changed, 75 insertions, 13 deletions
| diff --git a/src/settings/components/form/blacklist-form.jsx b/src/settings/components/form/blacklist-form.jsx new file mode 100644 index 0000000..83b54da --- /dev/null +++ b/src/settings/components/form/blacklist-form.jsx @@ -0,0 +1,47 @@ +import './blacklist-form.scss'; +import DeleteButton from '../ui/delete-button'; +import { h, Component } from 'preact'; + +class BlacklistForm extends Component { + +  render() { +    let value = this.props.value; +    if (!value) { +      value = []; +    } + +    return <div className='form-blacklist-form'> +      { +        value.map((url, index) => { +          return <div key={index} className='form-blacklist-form-row'> +            <input data-index={index} type='text' name='url' +              className='column-url' value={url} +              onChange={this.bindValue.bind(this)} /> +            <DeleteButton data-index={index} name='delete' +              onClick={this.bindValue.bind(this)} /> +          </div>; +        }) +      } +    </div>; +  } + +  bindValue(e) { +    if (!this.props.onChange) { +      return; +    } + +    let name = e.target.name; +    let index = e.target.getAttribute('data-index'); +    let next = this.props.value.slice(); + +    if (name === 'url') { +      next[index] = e.target.value; +    } else if (name === 'delete') { +      next.splice(index, 1); +    } + +    this.props.onChange(next); +  } +} + +export default BlacklistForm; diff --git a/src/settings/components/form/blacklist-form.scss b/src/settings/components/form/blacklist-form.scss new file mode 100644 index 0000000..a230d0d --- /dev/null +++ b/src/settings/components/form/blacklist-form.scss @@ -0,0 +1,9 @@ +.form-blacklist-form { +  &-row { +    display: flex; + +    .column-url { +      flex: 1; +    } +  } +} diff --git a/src/settings/components/index.jsx b/src/settings/components/index.jsx index e5b46ad..fb25df6 100644 --- a/src/settings/components/index.jsx +++ b/src/settings/components/index.jsx @@ -3,6 +3,7 @@ import { h, Component } from 'preact';  import Input from './ui/input';  import SearchEngineForm from './form/search-engine-form';  import KeymapsForm from './form/keymaps-form'; +import BlacklistForm from './form/blacklist-form';  import * as settingActions from 'settings/actions/setting';  import * as validator from 'shared/validators/setting'; @@ -42,14 +43,21 @@ class SettingsComponent extends Component {          <legend>Keybindings</legend>          <KeymapsForm            value={this.state.settings.form.keymaps} -          onChange={this.bindKeymapsForm.bind(this)} +          onChange={value => this.bindForm('keymaps', value)}          />        </fieldset>        <fieldset>          <legend>Search Engines</legend>          <SearchEngineForm            value={this.state.settings.form.search} -          onChange={this.bindSearchForm.bind(this)} +          onChange={value => this.bindForm('search', value)} +        /> +      </fieldset> +      <fieldset> +        <legend>Blacklist</legend> +        <BlacklistForm +          value={this.state.settings.form.blacklist} +          onChange={value => this.bindForm('blacklist', value)}          />        </fieldset>      </div>; @@ -110,16 +118,13 @@ class SettingsComponent extends Component {      }    } -  bindSearchForm(value) { -    let next = Object.assign({}, this.state); -    next.settings.form.search = value; -    this.setState(next); -    this.context.store.dispatch(settingActions.save(next.settings)); -  } - -  bindKeymapsForm(value) { -    let next = Object.assign({}, this.state); -    next.settings.form.keymaps = value; +  bindForm(name, value) { +    let next = Object.assign({}, this.state, { +      settings: Object.assign({}, this.state.settings, { +        form: Object.assign({}, this.state.settings.form) +      }) +    }); +    next.settings.form[name] = value;      this.setState(next);      this.context.store.dispatch(settingActions.save(next.settings));    } diff --git a/src/shared/default-settings.js b/src/shared/default-settings.js index 6d2013b..218390b 100644 --- a/src/shared/default-settings.js +++ b/src/shared/default-settings.js @@ -125,6 +125,7 @@ export default {          ['twitter', 'https,//twitter.com/search?q={}'],          ['wikipedia', 'https,//en.wikipedia.org/w/index.php?search={}'],        ] -    } +    }, +    'blacklist': [],    }  }; | 
