From 6b81eebb02afa26f3952130888a0c19c8d62d22f Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 20 May 2013 18:05:16 -0700 Subject: [PATCH] Add initial available packages view --- src/app/atom.coffee | 6 +++ .../available-packages-config-panel.coffee | 40 +++++++++++++++++++ src/app/config-view.coffee | 2 + src/app/package-config-view.coffee | 30 ++++++++++++++ 4 files changed, 78 insertions(+) create mode 100644 src/app/available-packages-config-panel.coffee create mode 100644 src/app/package-config-view.coffee diff --git a/src/app/atom.coffee b/src/app/atom.coffee index ee6dde228..be7e58f57 100644 --- a/src/app/atom.coffee +++ b/src/app/atom.coffee @@ -81,6 +81,12 @@ _.extend atom, else throw new Error("Could not resolve '#{id}' to a package path") + packageExists: (id) -> + if fsUtils.isDirectory(id) + true + else + fsUtils.isDirectory(fsUtils.resolve(config.packageDirPaths..., id)) + resolvePackagePath: _.memoize (id) -> return id if fsUtils.isDirectory(id) path = fsUtils.resolve(config.packageDirPaths..., id) diff --git a/src/app/available-packages-config-panel.coffee b/src/app/available-packages-config-panel.coffee new file mode 100644 index 000000000..3a5540112 --- /dev/null +++ b/src/app/available-packages-config-panel.coffee @@ -0,0 +1,40 @@ +ConfigPanel = require 'config-panel' +PackageConfigView = require 'package-config-view' +{$$} = require 'space-pen' +$ = require 'jquery' +{spawn} = require 'child_process' +roaster = require 'roaster' +async = require 'async' + +### +# Internal # +### + +module.exports = +class AvailablePackagesConfigPanel extends ConfigPanel + @content: -> + @div => + @legend 'Available Packages' + + initialize: -> + apm = require.resolve '.bin/apm' + apmProcess = spawn(apm, ['available', '--json']) + chunks = [] + apmProcess.stdout.on 'data', (chunk) -> chunks.push(chunk) + apmProcess.on 'close', (code) => + if code is 0 + try + packages = JSON.parse(Buffer.concat(chunks).toString()) ? [] + catch error + packages = [] + console.error(error.stack ? error) + + if packages.length > 0 + queue = async.queue (pack, callback) -> + roaster pack.description, {}, (error, html) -> + pack.descriptionHtml = html + callback() + queue.push(pack) for pack in packages + queue.drain = => + for pack in packages + @append(new PackageConfigView(pack, @operationQueue)) diff --git a/src/app/config-view.coffee b/src/app/config-view.coffee index 271ee44c6..c7bea80e1 100644 --- a/src/app/config-view.coffee +++ b/src/app/config-view.coffee @@ -5,6 +5,7 @@ GeneralConfigPanel = require 'general-config-panel' EditorConfigPanel = require 'editor-config-panel' ThemeConfigPanel = require 'theme-config-panel' PackageConfigPanel = require 'package-config-panel' +AvailablePackagesConfigPanel = require 'available-packages-config-panel' ### # Internal # @@ -39,6 +40,7 @@ class ConfigView extends View @addPanel('Editor', new EditorConfigPanel) @addPanel('Themes', new ThemeConfigPanel) @addPanel('Installed Packages', new PackageConfigPanel) + @addPanel('Available Packages', new AvailablePackagesConfigPanel) addPanel: (name, panel) -> panelItem = $$ -> @li name: name, => @a name diff --git a/src/app/package-config-view.coffee b/src/app/package-config-view.coffee new file mode 100644 index 000000000..f30f67b49 --- /dev/null +++ b/src/app/package-config-view.coffee @@ -0,0 +1,30 @@ +{View} = require 'space-pen' + +module.exports = +class PackageConfigView extends View + @content: -> + @div class: 'panel', => + @div outlet: 'heading', class: 'panel-heading', => + @span outlet: 'name' + @button outlet: 'action', class: 'btn btn-small btn-primary pull-right' + @div outlet: 'description' + @div outlet: 'versions', class: 'panel-footer' + + initialize: (@pack, @queue) -> + @versions.text("Version: #{@pack.version}") + @name.text(@pack.name) + if @pack.descriptionHtml + @description.html(pack.descriptionHtml) + else if @pack.description + @description.text(@pack.description) + else + @description.text('No further description available.') + + @updateInstallState() + + updateInstallState: -> + @installed = atom.packageExists(@pack.name) + if @installed + @action.text('Uninstall') + else + @action.text('Install')