diff --git a/spec/app/package-config-panel-spec.coffee b/spec/app/package-config-panel-spec.coffee index ff49c5866..88c09de4a 100644 --- a/spec/app/package-config-panel-spec.coffee +++ b/spec/app/package-config-panel-spec.coffee @@ -34,7 +34,7 @@ describe "PackageConfigPanel", -> panel = new PackageConfigPanel installedCallback = jasmine.createSpy("installed packages callback") - panel.installed.on("installed-packages-loaded", installedCallback) + panel.packageEventEmitter.on("installed-packages-loaded", installedCallback) waitsFor -> installedCallback.callCount > 0 describe 'Installed tab', -> diff --git a/src/app/available-packages-config-panel.coffee b/src/app/available-packages-config-panel.coffee index 14c5e445a..ce5544dd0 100644 --- a/src/app/available-packages-config-panel.coffee +++ b/src/app/available-packages-config-panel.coffee @@ -3,7 +3,6 @@ ConfigPanel = require 'config-panel' packageManager = require 'package-manager' ### Internal ### - module.exports = class AvailablePackagesConfigPanel extends ConfigPanel @content: -> @@ -11,12 +10,14 @@ class AvailablePackagesConfigPanel extends ConfigPanel @div outlet: 'loadingArea', class: 'alert alert-info loading-area', => @span 'Loading available packages\u2026' - initialize: -> - packageManager.getAvailable (error, packages=[]) => + initialize: (@packageEventEmitter) -> + packageManager.getAvailable (error, @packages=[]) => @loadingArea.hide() if error? console.error(error.stack ? error) else - for pack in packages - @append(new PackageConfigView(pack)) - @trigger('available-packages-loaded', [packages]) + for pack in @packages + @append(new PackageConfigView(pack, @packageEventEmitter)) + @packageEventEmitter.trigger('available-packages-loaded', [@packages]) + + getPackageCount: -> @packages.length diff --git a/src/app/installed-packages-config-panel.coffee b/src/app/installed-packages-config-panel.coffee index 060290d80..12c7c9c26 100644 --- a/src/app/installed-packages-config-panel.coffee +++ b/src/app/installed-packages-config-panel.coffee @@ -4,17 +4,39 @@ PackageConfigView = require 'package-config-view' packageManager = require 'package-manager' ### Internal ### - module.exports = class InstalledPackagesConfigPanel extends ConfigPanel @content: -> @div class: 'installed-packages', => @div outlet: 'loadingArea', class: 'alert alert-info loading-area', => @span 'Loading installed packages\u2026' + @div outlet: 'packagesArea' - initialize: -> - packages = _.sortBy(atom.getAvailablePackageMetadata(), 'name') - packageManager.renderMarkdownInMetadata packages, => + initialize: (@packageEventEmitter) -> + @packages = _.sortBy(atom.getAvailablePackageMetadata(), 'name') + packageManager.renderMarkdownInMetadata @packages, => @loadingArea.hide() - @append(new PackageConfigView(pack)) for pack in packages - @trigger 'installed-packages-loaded', [packages] + for pack in @packages + @packagesArea.append(new PackageConfigView(pack, @packageEventEmitter)) + @packageEventEmitter.trigger 'installed-packages-loaded', [@packages] + + @packageEventEmitter.on 'package-installed', (pack) => @addPackage(pack) + @packageEventEmitter.on 'package-uninstalled', (pack) => @removePackage(pack) + + removePackage: ({name}) -> + @packages = _.reject @packages, (pack) -> pack.name is name + @packagesArea.children("[name=#{name}]").remove() + + addPackage: (pack) -> + @packages.push(pack) + @packages = _.sortBy(@packages, 'name') + index = @packages.indexOf(pack) + view = new PackageConfigView(pack, @packageEventEmitter) + if index is 0 + @packagesArea.prepend(view) + else if index is @packages.length - 1 + @packagesArea.append(view) + else + @packagesArea.children(":eq(#{index})").before(view) + + getPackageCount: -> @packages.length diff --git a/src/app/package-config-panel.coffee b/src/app/package-config-panel.coffee index 39fead24f..444e9e9fb 100644 --- a/src/app/package-config-panel.coffee +++ b/src/app/package-config-panel.coffee @@ -1,9 +1,13 @@ ConfigPanel = require 'config-panel' InstalledPackagesConfigPanel = require 'installed-packages-config-panel' AvailablePackagesConfigPanel = require 'available-packages-config-panel' +_ = require 'underscore' +EventEmitter = require 'event-emitter' + +class PackageEventEmitter +_.extend PackageEventEmitter.prototype, EventEmitter ### Internal ### - module.exports = class PackageConfigPanel extends ConfigPanel @content: -> @@ -16,10 +20,13 @@ class PackageConfigPanel extends ConfigPanel @li outlet: 'availableLink', => @a 'Available', => @span class: 'badge pull-right', outlet: 'availableCount' - @subview 'installed', new InstalledPackagesConfigPanel() - @subview 'available', new AvailablePackagesConfigPanel() initialize: -> + @packageEventEmitter = new PackageEventEmitter() + @installed = new InstalledPackagesConfigPanel(@packageEventEmitter) + @available = new AvailablePackagesConfigPanel(@packageEventEmitter) + @append(@installed, @available) + @available.hide() @installedLink.on 'click', => @@ -34,8 +41,8 @@ class PackageConfigPanel extends ConfigPanel @availableLink.addClass('active') @available.show() - @installed.on 'installed-packages-loaded', (event, packages) => - @installedCount.text(packages.length) + @packageEventEmitter.on 'installed-packages-loaded package-installed package-uninstalled', => + @installedCount.text(@installed.getPackageCount()) - @available.on 'available-packages-loaded', (event, packages) => - @availableCount.text(packages.length) + @packageEventEmitter.on 'available-packages-loaded', => + @availableCount.text(@available.getPackageCount()) diff --git a/src/app/package-config-view.coffee b/src/app/package-config-view.coffee index c653732f0..7b807e9d6 100644 --- a/src/app/package-config-view.coffee +++ b/src/app/package-config-view.coffee @@ -34,7 +34,7 @@ class PackageConfigView extends View bundled: false updateAvailable: false - initialize: (@pack, @queue) -> + initialize: (@pack, @packageEventEmitter) -> @updatePackageState() @attr('name', @pack.name) @@ -103,10 +103,16 @@ class PackageConfigView extends View packageManager.install(@pack, packageManagerCallback) else @defaultAction.text('Uninstalling\u2026') - packageManager.uninstall(@pack, packageManagerCallback) + packageManager.uninstall @pack, (error) => + unless error? + @packageEventEmitter.trigger('package-uninstalled', @pack) + packageManagerCallback() else @defaultAction.text('Installing\u2026') - packageManager.install(@pack, packageManagerCallback) + packageManager.install @pack, (error) => + unless error? + @packageEventEmitter.trigger('package-installed', @pack) + packageManagerCallback() @updateDefaultAction()