diff --git a/js/admin/src/components/ExtensionsPage.js b/js/admin/src/components/ExtensionsPage.js
index 21f32bc6a..2c6b6e0d4 100644
--- a/js/admin/src/components/ExtensionsPage.js
+++ b/js/admin/src/components/ExtensionsPage.js
@@ -26,29 +26,31 @@ export default class ExtensionsPage extends Component {
- {app.extensions
- .sort((a, b) => a.name.localeCompare(b.name))
- .map(extension => (
- -
+ {Object.keys(app.extensions)
+ .sort((a, b) => app.extensions[a].extra['flarum-extension'].title.localeCompare(app.extensions[b].extra['flarum-extension'].title))
+ .map(name => {
+ const extension = app.extensions[name];
+
+ return
-
{Dropdown.component({
icon: 'ellipsis-v',
- children: this.controlItems(extension).toArray(),
+ children: this.controlItems(name).toArray(),
className: 'ExtensionListItem-controls',
buttonClassName: 'Button Button--icon Button--flat',
menuClassName: 'Dropdown-menu--right'
})}
-
- {extension.icon ? icon(extension.icon.name) : ''}
+
+ {extension.extra['flarum-extension'].icon ? icon(extension.extra['flarum-extension'].icon.name) : ''}
- {extension.title}{' '}
+ {extension.extra['flarum-extension'].title}{' '}
{extension.version}
{extension.description}
-
- ))}
+ ;
+ })}
@@ -56,9 +58,15 @@ export default class ExtensionsPage extends Component {
);
}
- controlItems(extension) {
+ controlItems(name) {
const items = new ItemList();
- const enabled = this.isEnabled(extension.name);
+ const extension = app.extensions[name];
+ const enabled = this.isEnabled(name);
+
+ items.add('info',
+ Package Name: {extension.name}
+ Installed in: {name}
+ );
if (app.extensionSettings[extension.name]) {
items.add('settings', Button.component({
@@ -73,7 +81,7 @@ export default class ExtensionsPage extends Component {
children: enabled ? 'Disable' : 'Enable',
onclick: () => {
app.request({
- url: app.forum.attribute('apiUrl') + '/extensions/' + extension.name,
+ url: app.forum.attribute('apiUrl') + '/extensions/' + name,
method: 'PATCH',
data: {enabled: !enabled}
}).then(() => window.location.reload());
@@ -88,8 +96,8 @@ export default class ExtensionsPage extends Component {
children: 'Uninstall',
onclick: () => {
app.request({
- url: app.forum.attribute('apiUrl') + '/extensions/' + extension.name,
- method: 'DELETE',
+ url: app.forum.attribute('apiUrl') + '/extensions/' + name,
+ method: 'DELETE'
}).then(() => window.location.reload());
app.modal.show(new LoadingModal());
diff --git a/src/Support/ExtensionManager.php b/src/Support/ExtensionManager.php
index 86e7dabaa..3b6904a2f 100644
--- a/src/Support/ExtensionManager.php
+++ b/src/Support/ExtensionManager.php
@@ -10,6 +10,7 @@
namespace Flarum\Support;
+use Flarum\Core;
use Flarum\Support\ServiceProvider;
use Flarum\Core\Settings\SettingsRepository;
use Illuminate\Contracts\Container\Container;
@@ -37,9 +38,17 @@ class ExtensionManager
$dirs = array_diff(scandir($extensionsDir), ['.', '..']);
$extensions = [];
+ $installed = json_decode(file_get_contents(public_path('vendor/composer/installed.json')), true);
+
foreach ($dirs as $dir) {
- if (file_exists($manifest = $extensionsDir . '/' . $dir . '/flarum.json')) {
- $extensions[] = json_decode(file_get_contents($manifest));
+ if (file_exists($manifest = $extensionsDir . '/' . $dir . '/composer.json')) {
+ $extensions[$dir] = json_decode(file_get_contents($manifest), true);
+
+ foreach ($installed as $package) {
+ if ($package['name'] === $extensions[$dir]['name']) {
+ $extensions[$dir]['version'] = $package['version'];
+ }
+ }
}
}
@@ -79,7 +88,7 @@ class ExtensionManager
public function migrate($extension, $up = true)
{
- $migrationDir = base_path('../extensions/' . $extension . '/migrations');
+ $migrationDir = public_path('extensions/' . $extension . '/migrations');
$this->app->bind('Illuminate\Database\Schema\Builder', function ($container) {
return $container->make('Illuminate\Database\ConnectionInterface')->getSchemaBuilder();