From e251cf34c4f3e8ca28d9183868adc4558d49f0d9 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Fri, 2 Oct 2015 17:49:16 +0930 Subject: [PATCH] Use composer.json for extension metadata --- js/admin/src/components/ExtensionsPage.js | 38 ++++++++++++++--------- src/Support/ExtensionManager.php | 15 +++++++-- 2 files changed, 35 insertions(+), 18 deletions(-) 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();