framework/js/admin/src/components/BasicsPage.js

138 lines
4.8 KiB
JavaScript
Raw Normal View History

2015-07-29 19:30:09 +08:00
import Component from 'flarum/Component';
import FieldSet from 'flarum/components/FieldSet';
import Select from 'flarum/components/Select';
import Button from 'flarum/components/Button';
export default class BasicsPage extends Component {
constructor(...args) {
super(...args);
this.loading = false;
this.fields = [
'forum_title',
'forum_description',
'default_locale',
'default_route',
'welcome_title',
'welcome_message'
];
this.values = {};
const config = app.forum.attribute('config');
this.fields.forEach(key => this.values[key] = m.prop(config[key]));
this.localeOptions = {};
const locales = app.forum.attribute('availableLocales');
for (const i in locales) {
this.localeOptions[i] = `${locales[i]} (${i})`;
}
}
view() {
return (
<div className="BasicsPage">
<div className="container">
<form onsubmit={this.onsubmit.bind(this)}>
{FieldSet.component({
label: 'Forum Title',
children: [
<input className="FormControl" value={this.values.forum_title()} oninput={m.withAttr('value', this.values.forum_title)}/>
]
})}
{FieldSet.component({
label: 'Forum Description',
children: [
<div className="helpText">
Enter a short sentence or two that describes your community. This will appear in the meta tag and show up in search engines.
</div>,
<textarea className="FormControl" value={this.values.forum_description()} oninput={m.withAttr('value', this.values.forum_description)}/>
]
})}
{Object.keys(this.localeOptions).length > 1
? FieldSet.component({
label: 'Default Language',
children: [
Select.component({
options: this.localeOptions,
onchange: this.values.default_locale
})
]
})
: ''}
{FieldSet.component({
label: 'Home Page',
className: 'BasicsPage-homePage',
children: [
<div className="helpText">
Choose the page which users will first see when they visit your forum. If entering a custom value, use the path relative to the forum root.
</div>,
<label className="checkbox">
<input type="radio" name="homePage" value="/all" checked={this.values.default_route() === '/all'} onclick={m.withAttr('value', this.values.default_route)}/>
All Discussions
</label>,
<label className="checkbox">
<input type="radio" name="homePage" value="custom" checked={this.values.default_route() !== '/all'} onclick={() => {
this.values.default_route('');
m.redraw(true);
this.$('.BasicsPage-homePage input').select();
}}/>
Custom <input className="FormControl" value={this.values.default_route()} onchange={m.withAttr('value', this.values.default_route)} style={this.values.default_route() !== '/all' ? 'margin-top: 5px' : 'display:none'}/>
</label>
]
})}
{FieldSet.component({
label: 'Welcome Banner',
className: 'BasicsPage-welcomeBanner',
children: [
<div className="helpText">
Configure the text that displays in the banner on the All Discussions page. Use this to welcome guests to your forum.
</div>,
<div className="BasicsPage-welcomeBanner-input">
<input className="FormControl" value={this.values.welcome_title()} oninput={m.withAttr('value', this.values.welcome_title)}/>
<textarea className="FormControl" value={this.values.welcome_message()} oninput={m.withAttr('value', this.values.welcome_message)}/>
</div>
]
})}
{Button.component({
type: 'submit',
className: 'Button Button--primary',
children: 'Save Changes',
loading: this.loading,
disabled: !this.changed()
})}
</form>
</div>
</div>
);
}
changed() {
const config = app.forum.attribute('config');
return this.fields.some(key => this.values[key]() !== config[key]);
}
onsubmit(e) {
e.preventDefault();
if (this.loading) return;
this.loading = true;
const config = {};
this.fields.forEach(key => config[key] = this.values[key]());
app.forum.save({config}).finally(() => {
this.loading = false;
m.redraw();
});
}
}