List view: Fix action pre-filter for multiselect actions

Evaluates pre-filter for individual actions (i.e., when action.preFilter is 
specified)
every time a multi-select row is checked orunchecked. This allows multi-select
actions to be shown/hidden on a per-row basis.


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/b58371e5
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/b58371e5
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/b58371e5

Branch: refs/heads/vpc-toolkit-hugo
Commit: b58371e5204feb431395f383a36c5d99d11d002e
Parents: 733102c
Author: Brian Federle <[email protected]>
Authored: Tue Jul 15 13:30:56 2014 -0700
Committer: Brian Federle <[email protected]>
Committed: Tue Jul 15 13:30:56 2014 -0700

----------------------------------------------------------------------
 ui/scripts/ui/widgets/listView.js | 48 +++++++++++++++++++++++++++++-----
 1 file changed, 42 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b58371e5/ui/scripts/ui/widgets/listView.js
----------------------------------------------------------------------
diff --git a/ui/scripts/ui/widgets/listView.js 
b/ui/scripts/ui/widgets/listView.js
index 509c802..9626a64 100644
--- a/ui/scripts/ui/widgets/listView.js
+++ b/ui/scripts/ui/widgets/listView.js
@@ -1748,12 +1748,21 @@
         // List view header actions
         if (listViewData.actions) {
             $.each(listViewData.actions, function(actionName, action) {
-                if (!action.isHeader || (
-                    action.preFilter && !action.preFilter({
+                var preFilter = function(extendContext) {
+                    var context = $.extend(true, {},
+                        $listView.data('view-args').context ? 
$listView.data('view-args').context : cloudStack.context);
+
+                    if (extendContext) {
+                        $.extend(context, extendContext);
+                    }
+
+                    return action.preFilter ? action.preFilter({
                         id: listViewData.id,
-                        context: $listView.data('view-args').context ? 
$listView.data('view-args').context : cloudStack.context
-                    })
-                )) return true;
+                        context: context
+                    }) : null;
+                }
+
+                if (!action.isHeader || (action.preFilter && !preFilter())) 
return true;
 
                 var $action = $('<div>')
                     .addClass('button action main-action 
reduced-hide').addClass(actionName)
@@ -1764,6 +1773,10 @@
                 if (action.isMultiSelectAction) {
                     $action.addClass('multiSelectAction');
                     $action.hide();
+
+                    if (action.preFilter) {
+                        $action.data('list-view-action-prefilter', preFilter);
+                    }
                 }
 
                 $toolbar.append($action)
@@ -2234,9 +2247,32 @@
     };
 
     var toggleMultiSelectActions = function($listView, enabled) {
+        var $multiSelectActions = 
$listView.find('div.main-action.multiSelectAction');
+
         $listView.find('div.action.add')[enabled ? 'hide' : 'show']();
         $listView.find('div.main-action:not(.multiSelectAction)')[enabled ? 
'hide' : 'show']();
-        $listView.find('div.main-action.multiSelectAction')[enabled ? 'show' : 
'hide']();
+        $multiSelectActions.hide();
+
+        if (enabled) {
+            $multiSelectActions.filter(function() {
+                var preFilter = $(this).data('list-view-action-prefilter');
+                var $selectedVMs;
+                var context = {};
+
+                if (preFilter) {
+                    $selectedVMs = $listView.find('tbody 
tr').filter(function() {
+                        return $(this).find('td.multiselect 
input[type=checkbox]:checked').size()
+                    });
+                    context[$listView.data('view-args').activeSection] = 
$selectedVMs.map(function(index, item) {
+                        return $(item).data('json-obj');
+                    });
+
+                    return preFilter(context);
+                }
+
+                return true;
+            }).show();
+        }
     }
 
     $.fn.listView = function(args, options) {

Reply via email to