aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2017-11-25 14:59:03 +0900
committerShin'ya Ueoka <ueokande@i-beam.org>2017-11-26 11:45:05 +0900
commitdf10208ed5dfbc823eb1979272903d74f02a898c (patch)
treed7e99cb2af7e62f509cc87b3b0439d2a70adc7fc /src
parentbbad1c6c6adf65de031111340f8bf5e46cc41ca6 (diff)
blacklist form
Diffstat (limited to 'src')
-rw-r--r--src/settings/components/form/blacklist-form.jsx47
-rw-r--r--src/settings/components/form/blacklist-form.scss9
-rw-r--r--src/settings/components/index.jsx29
-rw-r--r--src/shared/default-settings.js3
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': [],
}
};