[extensions-web: 20/75] Add a capability to undo an uninstalled extension.



commit f1de9a85142b39145c1c716d07dbe1e72c3c42ed
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Wed Sep 14 09:37:13 2011 -0400

    Add a capability to undo an uninstalled extension.

 sweettooth/extensions/views.py     |    1 +
 sweettooth/static/js/extensions.js |   41 ++++++++++++++++++++++++++++++++---
 2 files changed, 38 insertions(+), 4 deletions(-)
---
diff --git a/sweettooth/extensions/views.py b/sweettooth/extensions/views.py
index 2397544..1daa26a 100644
--- a/sweettooth/extensions/views.py
+++ b/sweettooth/extensions/views.py
@@ -184,6 +184,7 @@ class AjaxDetailsView(SingleObjectMixin, View):
             raise Http404()
 
         data = {
+            'pk': self.object.pk,
             'uuid': self.object.uuid,
             'name': self.object.name,
             'creator': self.object.creator.username,
diff --git a/sweettooth/static/js/extensions.js b/sweettooth/static/js/extensions.js
index 9024432..29bc35c 100644
--- a/sweettooth/static/js/extensions.js
+++ b/sweettooth/static/js/extensions.js
@@ -70,7 +70,8 @@ function($, messages, dbusProxy) {
         }
 
         $elem.data({'elem': $elem,
-                    'state': _state});
+                    'state': _state,
+                    'uninstalled': false});
 
         $switch.data('elem', $elem);
         $switch.switchify();
@@ -109,6 +110,14 @@ function($, messages, dbusProxy) {
                 $switch.switchify('insensitive', true);
                 messages.addError("This extension is not compatible with your version of GNOME.");
             }
+
+            if ($elem.data('uninstalled') && (newState == ExtensionState.ENABLED ||
+                                              newState == ExtensionState.ERROR ||
+                                              newState == ExtensionState.OUT_OF_DATE)) {
+                $elem.fadeIn({ queue: false }).slideDown();
+                $elem.data('uninstalled', false);
+            }
+
         });
         $elem.trigger('state-changed', _state);
         elems[uuid] = $elem;
@@ -118,10 +127,33 @@ function($, messages, dbusProxy) {
         var $container = $(this);
         dbusProxy.ListExtensions().done(function(extensions) {
             $.each(extensions, function(uuid, extension) {
+                function reinstall() {
+                    dbusProxy.InstallExtension(uuid, $elem.data('pk').toString());
+
+                    // If the user clicks "Install" we need to show that we
+                    // installed it by reattaching the element, but we can't do
+                    // that here -- the user might click "Cancel".
+                    $elem.data('uninstalled', true);
+
+                    message.slideUp();
+                }
+
                 function uninstall() {
                     dbusProxy.UninstallExtension(uuid).done(function(result) {
-                        if (result)
-                            $elem.fadeOut(function() { $elem.detach(); });
+                        if (result) {
+                            $elem.fadeOut({ queue: false }).slideUp({ queue: false });
+
+                            // Construct a dummy <p> node as we need something
+                            // to stuff everything else in...
+                            var messageHTML = $("<p>You uninstalled </p>").
+                                append($('<b>').text(extension.name)).
+                                append(". ").
+                                append($('<a>', {'href': '#'}).text("Undo?")).html();
+
+                            var message = messages.addInfo(messageHTML);
+                            message.find('a').click(reinstall);
+                            $elem.data('undo-uninstall-message', message);
+                        }
                     });
                 }
 
@@ -142,7 +174,8 @@ function($, messages, dbusProxy) {
                         find('span.author').html(" by <a href=\"/accounts/profile/"+result.creator+"\">"+result.creator+"</a>").end().
                         find('h3').html($('<a>', {'href': result.link}).text(extension.name)).end().
                         find('img.icon').attr('src', result.icon).end().
-                        append($('<button>', {'class': 'uninstall'}).text("Uninstall").bind('click', uninstall));
+                        append($('<button>', {'class': 'uninstall'}).text("Uninstall").bind('click', uninstall)).
+                        data('pk', result.pk);
                 });
 
                 // The DOM element's CSS styles won't be fully



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]