From b58371e5204feb431395f383a36c5d99d11d002e Mon Sep 17 00:00:00 2001 From: Brian Federle Date: Tue, 15 Jul 2014 13:30:56 -0700 Subject: [PATCH] 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. --- ui/scripts/ui/widgets/listView.js | 48 +++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/ui/scripts/ui/widgets/listView.js b/ui/scripts/ui/widgets/listView.js index 509c802c4f4..9626a64667c 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 = $('
') .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) {