1
0
mirror of https://github.com/flarum/core.git synced 2025-07-24 18:21:33 +02:00

Further refinements to admin extensions page

This commit is contained in:
Toby Zerner
2015-10-13 12:27:10 +10:30
parent b3e52c0474
commit 3974235455
3 changed files with 74 additions and 107 deletions

View File

@@ -11,31 +11,7 @@ import listItems from 'flarum/helpers/listItems';
export default class ExtensionsPage extends Component {
view() {
const groups = [
{keyword: 'discussion', title: 'Discussions', extensions: []},
{keyword: 'formatting', title: 'Formatting', extensions: []},
{keyword: 'moderation', title: 'Moderation', extensions: []},
{keyword: 'theme', title: 'Themes', extensions: []},
{keyword: 'authentication', title: 'Authentication', extensions: []},
{keyword: 'locale', title: 'Language Packs', extensions: []},
{title: 'Other', extensions: []}
];
Object.keys(app.extensions).forEach(id => {
const extension = app.extensions[id];
const keywords = extension.keywords;
const grouped = keywords && groups.some(group => {
if (keywords.indexOf(group.keyword) !== -1) {
group.extensions.push(extension);
return true;
}
});
if (!grouped) {
groups[groups.length - 1].extensions.push(extension);
}
});
const extensions = Object.keys(app.extensions).map(id => app.extensions[id]);
return (
<div className="ExtensionsPage">
@@ -52,31 +28,35 @@ export default class ExtensionsPage extends Component {
<div className="ExtensionsPage-list">
<div className="container">
{groups.filter(group => group.extensions.length).map(group => (
<div className="ExtensionGroup">
<h3>{group.title}</h3>
<ul className="ExtensionList">
{group.extensions
.sort((a, b) => a.extra['flarum-extension'].title.localeCompare(b.extra['flarum-extension'].title))
.map(extension => {
return <li className={'ExtensionListItem ' + (!this.isEnabled(extension.id) ? 'disabled' : '')}>
<ul className="ExtensionListItem-controls" style={extension.extra['flarum-extension'].icon}>
{listItems(this.controlItems(extension.id).toArray())}
</ul>
<div className="ExtensionListItem-content">
<span className="ExtensionListItem-icon ExtensionIcon" style={extension.extra['flarum-extension'].icon}>
{extension.extra['flarum-extension'].icon ? icon(extension.extra['flarum-extension'].icon.name) : ''}
</span>
<h4 className="ExtensionListItem-title" title={extension.description}>
{extension.extra['flarum-extension'].title}
</h4>
<div className="ExtensionListItem-version">{extension.version}</div>
</div>
</li>;
})}
</ul>
</div>
))}
<ul className="ExtensionList">
{extensions
.sort((a, b) => a.extra['flarum-extension'].title.localeCompare(b.extra['flarum-extension'].title))
.map(extension => {
const controls = this.controlItems(extension.id).toArray();
return <li className={'ExtensionListItem ' + (!this.isEnabled(extension.id) ? 'disabled' : '')}>
<div className="ExtensionListItem-content">
<span className="ExtensionListItem-icon ExtensionIcon" style={extension.extra['flarum-extension'].icon}>
{extension.extra['flarum-extension'].icon ? icon(extension.extra['flarum-extension'].icon.name) : ''}
</span>
{controls.length ? (
<Dropdown
className="ExtensionListItem-controls"
buttonClassName="Button Button--icon Button--flat"
menuClassName="Dropdown-menu--right"
icon="ellipsis-h">
{controls}
</Dropdown>
) : ''}
<label className="ExtensionListItem-title">
<input type="checkbox" checked={this.isEnabled(extension.id)} onclick={this.toggle.bind(this, extension.id)}/> {' '}
{extension.extra['flarum-extension'].title}
</label>
<div className="ExtensionListItem-version">{extension.version}</div>
</div>
</li>;
})}
</ul>
</div>
</div>
</div>
@@ -85,37 +65,19 @@ export default class ExtensionsPage extends Component {
controlItems(name) {
const items = new ItemList();
const extension = app.extensions[name];
const enabled = this.isEnabled(name);
if (app.extensionSettings[name]) {
items.add('settings', Button.component({
icon: 'cog',
className: 'Button',
children: 'Settings',
onclick: app.extensionSettings[name]
}));
}
items.add('toggle', Button.component({
icon: 'power-off',
className: 'Button',
children: enabled ? 'Disable' : 'Enable',
onclick: () => {
app.request({
url: app.forum.attribute('apiUrl') + '/extensions/' + name,
method: 'PATCH',
data: {enabled: !enabled}
}).then(() => window.location.reload());
app.modal.show(new LoadingModal());
}
}));
if (!enabled) {
items.add('uninstall', Button.component({
icon: 'trash-o',
className: 'Button',
children: 'Uninstall',
onclick: () => {
app.request({
@@ -136,4 +98,19 @@ export default class ExtensionsPage extends Component {
return enabled.indexOf(name) !== -1;
}
toggle(id) {
const enabled = this.isEnabled(id);
app.request({
url: app.forum.attribute('apiUrl') + '/extensions/' + id,
method: 'PATCH',
data: {enabled: !enabled}
}).then(() => {
if (enabled) localStorage.setItem('enabledExtension', id);
window.location.reload();
});
app.modal.show(new LoadingModal());
}
}

View File

@@ -54,4 +54,12 @@ export default function boot(app) {
}).start();
app.booted = true;
// If an extension has just been enabled, then we will run its settings
// callback.
const enabled = localStorage.getItem('enabledExtension');
if (enabled && app.extensionSettings[enabled]) {
app.extensionSettings[enabled]();
localStorage.removeItem('enabledExtension');
}
}