Skip to content

Commit

Permalink
Merge pull request #1792 from martinpovolny/pull-request-lgalis-add_e…
Browse files Browse the repository at this point in the history
…xpression_support_to_custom_button_editor

Enablement and Visibility expression UI for custom buttons
  • Loading branch information
h-kataria committed Aug 2, 2017
2 parents d2c0a20 + a6bdb57 commit 67768fe
Show file tree
Hide file tree
Showing 19 changed files with 225 additions and 36 deletions.
63 changes: 58 additions & 5 deletions app/controllers/application_controller/buttons.rb
Expand Up @@ -112,6 +112,7 @@ def automate_button_field_changed
@edit[:new][:button_icon] = params[:button_icon] if params[:button_icon]
@edit[:new][:button_color] = params[:button_color] if params[:button_color]
@edit[:new][:dialog_id] = params[:dialog_id] if params[:dialog_id]
@edit[:new][:disabled_text] = params[:disabled_text] if params[:disabled_text]
visibility_box_edit
end

Expand All @@ -124,7 +125,7 @@ def automate_button_field_changed
page.replace("form_role_visibility", :partial => "layouts/role_visibility", :locals => {:rec_id => (@custom_button.id || "new").to_s, :action => "automate_button_field_changed"})
end
unless params[:target_class]
@changed = (@edit[:new] != @edit[:current])
@changed = session[:changed] = (@edit[:new] != @edit[:current])
page << javascript_for_miq_button_visibility(@changed)
end
page << "miqSparkle(false);"
Expand Down Expand Up @@ -451,17 +452,27 @@ def group_create_update(typ)

def button_create_update(typ)
@edit = session[:edit]
@custom_button = @edit[:custom_button]
@record = @custom_button = @edit[:custom_button]
@changed = (@edit[:new] != @edit[:current])

case params[:button]
when 'cancel' then ab_button_cancel(typ)
when 'add' then ab_button_add
when 'save' then ab_button_save
when 'reset' then ab_button_reset
when 'enablement_expression', 'visibility_expression' then ab_expression
end
end

def ab_expression
@changed = session[:changed] = (@edit[:new] != @edit[:current])
@expkey = params[:button].to_sym
@edit[:visibility_expression_table] = exp_build_table_or_nil(@edit[:new][:visibility_expression])
@edit[:enablement_expression_table] = exp_build_table_or_nil(@edit[:new][:enablement_expression])
@in_a_form = true
replace_right_cell(:nodetype => x_node)
end

def ab_button_cancel(typ)
if typ == "update"
add_flash(_("Edit of Custom Button \"%{name}\" was cancelled by the user") % {:name => @edit[:current][:name]})
Expand Down Expand Up @@ -563,6 +574,7 @@ def ab_button_save
add_flash(_("Custom Button \"%{name}\" was saved") % {:name => @edit[:new][:description]})
@edit = session[:edit] = nil
ab_get_node_info(x_node) if x_active_tree == :ab_tree
build_filter_exp_table
replace_right_cell(:nodetype => x_node, :replace_trees => x_active_tree == :ab_tree ? [:ab] : [:sandt])
else
@custom_button.errors.each do |field, msg|
Expand All @@ -578,7 +590,6 @@ def ab_button_save
end

def ab_button_reset
ab_button_reset
button_set_form_vars
@changed = session[:changed] = false
add_flash(_("All changes have been reset"), :warning)
Expand Down Expand Up @@ -652,7 +663,7 @@ def button_new_edit(typ)
CustomButton.find(from_cid(params[:id]))
button_set_form_vars
@in_a_form = true
session[:changed] = false
@changed = session[:changed] = false
@breadcrumbs = []
title = if typ == "new"
_("Add Button")
Expand Down Expand Up @@ -823,6 +834,7 @@ def button_set_record_vars(button)
button.userid = session[:userid]
button.uri = @edit[:uri]
button[:options] = {}
button.disabled_text = @edit[:new][:disabled_text]
# button[:options][:target_attr_name] = @edit[:new][:target_attr_name]
button.uri_path, button.uri_attributes, button.uri_message = CustomButton.parse_uri(@edit[:uri])
button.uri_attributes["request"] = @edit[:new][:object_request]
Expand All @@ -844,7 +856,37 @@ def button_set_record_vars(button)
button.visibility[:roles] = ["_ALL_"]
end
button_set_resource_action(button)
# @custom_button.resource_action = @edit[:new][:dialog_id] ? Dialog.find_by_id(@edit[:new][:dialog_id]) : nil
button_set_expressions_record(button)
end

def button_set_expressions_record(button)
exp_remove_tokens(@edit[:new][:visibility_expression])
exp_remove_tokens(@edit[:new][:enablement_expression])
button.visibility_expression = @edit[:new][:visibility_expression]["???"] ? nil : MiqExpression.new(@edit[:new][:visibility_expression])
button.enablement_expression = @edit[:new][:enablement_expression]["???"] ? nil : MiqExpression.new(@edit[:new][:enablement_expression])
end

def field_expression_model
@custom_button.applies_to_class ||= (x_active_tree == :ab_tree ? @sb[:target_classes][@resolve[:target_class]] : "ServiceTemplate")
end

def button_set_expression_vars(field_expression, field_expression_table)
@edit[:new][field_expression] = @custom_button[field_expression].kind_of?(MiqExpression) ? @custom_button[field_expression].exp : nil
# Populate exp editor fields for the expression column
@edit[field_expression] ||= ApplicationController::Filter::Expression.new
@edit[field_expression][:expression] = [] # Store exps in an array
if @edit[:new][field_expression].blank?
@edit[field_expression][:expression] = {"???" => "???"} # Set as new exp element
@edit[:new][field_expression] = copy_hash(@edit[field_expression][:expression]) # Copy to new exp
else
@edit[field_expression][:expression] = copy_hash(@edit[:new][field_expression])
end
@edit[field_expression_table] = exp_build_table_or_nil(@edit[field_expression][:expression])

@expkey = field_expression # Set expression key to expression
@edit[field_expression].history.reset(@edit[field_expression][:expression])
@edit[field_expression][:exp_table] = exp_build_table(@edit[field_expression][:expression])
@edit[field_expression][:exp_model] = field_expression_model # Set model for the exp editor
end

def button_set_resource_action(button)
Expand Down Expand Up @@ -914,12 +956,16 @@ def button_set_form_vars
:description => @custom_button.description,
:button_icon => @custom_button.options.try(:[], :button_icon),
:button_color => @custom_button.options.try(:[], :button_color),
:disabled_text => @custom_button.disabled_text,
:display => @custom_button.options.try(:[], :display).nil? ? true : @custom_button.options[:display],
:open_url => @custom_button.options.try(:[], :open_url) ? @custom_button.options[:open_url] : false,
:display_for => @custom_button.options.try(:[], :display_for) ? @custom_button.options[:display_for] : 'single',
:submit_how => @custom_button.options.try(:[], :submit_how) ? @custom_button.options[:submit_how] : 'one',
:object_message => @custom_button.uri_message || "create",
)
button_set_expression_vars(:enablement_expression, :enablement_expression_table)
button_set_expression_vars(:visibility_expression, :visibility_expression_table)

@edit[:current] = copy_hash(@edit[:new])

@edit[:visibility_types] = [["<To All>", "all"], ["<By Role>", "role"]]
Expand All @@ -946,6 +992,7 @@ def button_set_form_vars
get_available_dialogs
@edit[:current] = copy_hash(@edit[:new])
session[:edit] = @edit
@changed = session[:changed] = (@edit[:new] != @edit[:current])
end

# Set user record variables to new values
Expand Down Expand Up @@ -1144,4 +1191,10 @@ def selected_consecutive?
is_consecutive = last_idx - first_idx + 1 <= params[:selected_fields].length
[is_consecutive, first_idx, last_idx]
end

# Get information for a condition
def build_filter_exp_table
@visibility_expression_table = @custom_button.visibility_expression.kind_of?(MiqExpression) ? exp_build_table(@custom_button.visibility_expression.exp) : nil
@enablement_expression_table = @custom_button.enablement_expression.kind_of?(MiqExpression) ? exp_build_table(@custom_button.enablement_expression.exp) : nil
end
end
12 changes: 6 additions & 6 deletions app/controllers/application_controller/filter.rb
Expand Up @@ -30,7 +30,7 @@ def exp_button
end

if flash_errors?
javascript_flash(:flash_div_id => 'adv_search_flash')
javascript_flash(:flash_div_id => 'exp_editor_flash')
else
if ["commit", "not", "remove"].include?(params[:pressed])
copy = copy_hash(@edit[@expkey][:expression])
Expand All @@ -45,8 +45,8 @@ def exp_button
@edit[@expkey][:exp_table] = exp_build_table(@edit[@expkey][:expression])
render :update do |page|
page << javascript_prologue
page.replace("flash_msg_div", :partial => "layouts/flash_msg")
# page.replace("form_expression_div", :partial=>"form_expression")
# Don't need to replace flash div as it's included throught
# exp_editor. That is rendered either throught adv_search_body or directly.
if !@edit[:adv_search_open].nil?
page.replace("adv_search_body", :partial => "layouts/adv_search_body")
page.replace("adv_search_footer", :partial => "layouts/adv_search_footer")
Expand All @@ -73,7 +73,7 @@ def exp_token_pressed
token = params[:token].to_i
if token == @edit[@expkey][:exp_token] || # User selected same token as already selected
(@edit[@expkey][:exp_token] && @edit[:edit_exp].key?("???")) # or new token in process
javascript_flash(:spinner_off => true)
javascript_flash(:flash_div_id => 'exp_editor_flash', :spinner_off => true)
else
exp = exp_find_by_token(@edit[@expkey][:expression], token)
@edit[:edit_exp] = copy_hash(exp)
Expand Down Expand Up @@ -120,11 +120,11 @@ def exp_changed
page << javascript_prologue
end
elsif @refresh_div.to_s == 'flash_msg_div'
javascript_flash
javascript_flash(:flash_div_id => 'exp_editor_flash')
else
render :update do |page|
page << javascript_prologue
page.replace("flash_msg_div", :partial => "layouts/flash_msg")
page.replace("exp_editor_flash", :partial => "layouts/flash_msg", :locals => {:flash_div_id => 'exp_editor_flash'})
page.replace("exp_atom_editor_div", :partial => "layouts/exp_atom/editor")

page << ENABLE_CALENDAR if @edit[@expkey].calendar_needed?
Expand Down
5 changes: 5 additions & 0 deletions app/controllers/application_controller/filter/subst_mixin.rb
@@ -1,5 +1,10 @@
module ApplicationController::Filter::SubstMixin
include ActiveSupport::Concern
def exp_build_table_or_nil(exp)
return nil if exp == {"???" => "???"}
exp_build_table(exp)
end

# Build an array of expression symbols by recursively traversing the MiqExpression object
# and inserting sequential tokens for each expression part
def exp_build_table(exp, quick_search = false)
Expand Down
24 changes: 12 additions & 12 deletions app/controllers/miq_ae_customization_controller.rb
Expand Up @@ -409,22 +409,22 @@ def setup_presenter_based_on_active_tree(nodetype, presenter)
end
end

def right_cell_text_for_node(record, model_name)
if record && record.id
_("Editing %{model} \"%{name}\"") % {:name => record.name,
:model => ui_lookup(:model => model_name)}
else
_("Adding a new %{model}") % {:model => ui_lookup(:model => model_name)}
end
end

def setup_presenter_for_ab_tree(nodetype, presenter)
case nodetype
when 'button_edit'
@right_cell_text = if @custom_button && @custom_button.id
_("Editing %{model} \"%{name}\"") % {:name => @custom_button.name,
:model => ui_lookup(:model => "CustomButton")}
else
_("Adding a new %{model}") % {:model => ui_lookup(:model => "CustomButton")}
end
@right_cell_text = right_cell_text_for_node(@custom_button, "CustomButton")
presenter.update(:main_div, render_proc[:partial => "shared/buttons/ab_form"])
when 'group_edit'
@right_cell_text = if @custom_button_set && @custom_button_set.id
_("Editing %{model} \"%{name}\"") % {:name => @custom_button_set.name,
:model => ui_lookup(:model => "CustomButtonSet")}
else
_("Adding a new %{model}") % {:model => ui_lookup(:model => "CustomButtonSet")}
end
@right_cell_text = right_cell_text_for_node(@custom_button_set, "CustomButonSet")
when 'group_reorder'
@right_cell_text = _("%{models} Group Reorder") % {:models => ui_lookup(:models => "CustomButton")}
end
Expand Down
Expand Up @@ -54,8 +54,7 @@ def ab_get_node_info(node)
end
elsif @nodetype.length == 1 && nodeid[1] == "ub" # Unassigned buttons group selected
@sb[:buttons] = []
@right_cell_text = _("%{typ} Button Group \"Unassigned Buttons\"") %
{:typ => @sb[:target_classes].invert[nodeid[2]]}
@right_cell_text = _("%{typ} Button Group \"Unassigned Buttons\"") % {:typ => @sb[:target_classes].invert[nodeid[2]]}
uri = CustomButton.buttons_for(nodeid[2]).sort_by(&:name)
unless uri.blank?
uri.each do |b|
Expand Down Expand Up @@ -100,6 +99,8 @@ def ab_get_node_info(node)
# selected button is under assigned folder
@resolve[:new][:target_class] = @sb[:target_classes].invert[@nodetype[1]]
end
@visibility_expression_table = exp_build_table(@custom_button.visibility_expression.exp) if @custom_button.visibility_expression.kind_of?(MiqExpression)
@enablement_expression_table = exp_build_table(@custom_button.enablement_expression.exp) if @custom_button.enablement_expression.kind_of?(MiqExpression)
@right_cell_text = _("Button \"%{name}\"") % {:name => @custom_button.name}
else # assigned buttons node/folder
@sb[:applies_to_class] = @nodetype[1]
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/miq_policy_controller.rb
Expand Up @@ -1070,7 +1070,7 @@ def build_expression(parent, model)
else
@edit[:expression][:expression] = copy_hash(@edit[:new][:expression])
end
@edit[:expression_table] = @edit[:expression][:expression] == {"???" => "???"} ? nil : exp_build_table(@edit[:expression][:expression])
@edit[:expression_table] = exp_build_table_or_nil(@edit[:expression][:expression])

@expkey = :expression # Set expression key to expression
@edit[@expkey].history.reset(@edit[:expression][:expression])
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/miq_policy_controller/alerts.rb
Expand Up @@ -380,7 +380,7 @@ def alert_build_blank_exp
@edit[:expression][:expression] = [] # Store exps in an array
@edit[:expression][:expression] = {"???" => "???"} # Set as new exp element
@edit[:new][:expression] = copy_hash(@edit[:expression][:expression]) # Copy to new exp
@edit[:expression_table] = @edit[:expression][:expression] == {"???" => "???"} ? nil : exp_build_table(@edit[:expression][:expression])
@edit[:expression_table] = exp_build_table_or_nil(@edit[:expression][:expression])

@expkey = :expression # Set expression key to expression
@edit[@expkey].history.reset(@edit[:expression][:expression])
Expand Down
8 changes: 4 additions & 4 deletions app/controllers/miq_policy_controller/conditions.rb
Expand Up @@ -90,8 +90,8 @@ def condition_edit
when "expression", "applies_to_exp"
session[:changed] = (@edit[:new] != @edit[:current])
@expkey = params[:button].to_sym
@edit[:expression_table] = @edit[:new][:expression] == {"???" => "???"} ? nil : exp_build_table(@edit[:new][:expression])
@edit[:scope_table] = @edit[:new][:applies_to_exp] == {"???" => "???"} ? nil : exp_build_table(@edit[:new][:applies_to_exp])
@edit[:expression_table] = exp_build_table_or_nil(@edit[:new][:expression])
@edit[:scope_table] = exp_build_table_or_nil(@edit[:new][:applies_to_exp])
replace_right_cell(:nodetype => "co")
end
end
Expand Down Expand Up @@ -188,7 +188,7 @@ def condition_build_edit_screen
else
@edit[:expression][:expression] = copy_hash(@edit[:new][:expression])
end
@edit[:expression_table] = @edit[:expression][:expression] == {"???" => "???"} ? nil : exp_build_table(@edit[:expression][:expression])
@edit[:expression_table] = exp_build_table_or_nil(@edit[:expression][:expression])

@expkey = :expression # Set expression key to expression
@edit[@expkey].history.reset(@edit[:expression][:expression])
Expand All @@ -204,7 +204,7 @@ def condition_build_edit_screen
else
@edit[:applies_to_exp][:expression] = copy_hash(@edit[:new][:applies_to_exp])
end
@edit[:scope_table] = @edit[:applies_to_exp][:expression] == {"???" => "???"} ? nil : exp_build_table(@edit[:applies_to_exp][:expression])
@edit[:scope_table] = exp_build_table_or_nil(@edit[:applies_to_exp][:expression])

@expkey = :applies_to_exp # Set temporarily while building applies_to_exp exp editor vars
@edit[@expkey].history.reset(@edit[:applies_to_exp][:expression])
Expand Down
2 changes: 0 additions & 2 deletions app/views/layouts/_adv_search_body.html.haml
Expand Up @@ -8,7 +8,6 @@
= " (#{h(@edit[@expkey][:selected][:description])})"
- elsif @edit && @edit[:adv_search_report]
= " (from report #{h(@edit[:adv_search_report])})"
= render :partial => 'layouts/flash_msg', :locals => {:flash_div_id => 'adv_search_flash'}
%br
- if @edit && @edit[@expkey][:expression]
= render(:partial => 'layouts/exp_editor')
Expand Down Expand Up @@ -50,7 +49,6 @@
= _("Choose a %{model} report filter") % {:model => ui_lookup(:model => @edit[@expkey][:exp_model])}
- elsif mode == "save"
.modal-body
= render :partial => 'layouts/flash_msg', :locals => {:flash_div_id => 'adv_search_flash'}
.form-horizontal.static
.form-group
%label.control-label.col-md-5
Expand Down
25 changes: 25 additions & 0 deletions app/views/layouts/_custom_button_expression.html.haml
@@ -0,0 +1,25 @@
-# expression_type
- table_key = "#{expression_type}_table".to_sym

.div{:id => "form_#{expression_type}_div"}
- if @expkey == expression_type
%h3= title + _("(Choose an element of the expression to edit)")
= render :partial => 'layouts/exp_editor'
- else
%h3= title + _('(Press the "Edit" button to edit the expression)')
= link_to(image_tag('toolbars/edit.png', :border => "0", :alt => (t = _("Edit this Expression"))),
{:action => 'button_update', :button => expression_type},
{"data-miq_sparkle_on" => true, "data-miq_sparkle_off" => true, :remote => true, "data-method" => :post, :title => t})
%br
- if @edit[table_key].nil?
= render :partial => 'layouts/info_msg',
:locals => {:message => _("No enablement expression defined.")}
- else
- @edit[table_key].each do |token|
- if !["AND", "OR", "(", ")"].include?([token].flatten.first)
= h([token].flatten.first)
- else
%font{:color => "black"}
%b
= h([token].flatten.first)
1 change: 1 addition & 0 deletions app/views/layouts/_exp_editor.html.haml
Expand Up @@ -7,6 +7,7 @@
= javascript_tag("ManageIQ.expEditor.second.title = '#{@edit[@expkey][:val2][:title]}';")

#exp_editor_div
= render :partial => 'layouts/flash_msg', :locals => {:flash_div_id => 'exp_editor_flash'}
%fieldset
.toolbar-pf-actions
.form-group
Expand Down
3 changes: 3 additions & 0 deletions app/views/layouts/_role_enablement_expression.html.haml
@@ -0,0 +1,3 @@
= render :partial => 'layouts/custom_button_expression',
:locals => {:expression_type => :enablement_expression,
:title => _('Enablement Expression')}
3 changes: 3 additions & 0 deletions app/views/layouts/_role_visibility_expression.html.haml
@@ -0,0 +1,3 @@
= render :partial => 'layouts/custom_button_expression',
:locals => {:expression_type => :visibility_expression,
:title => _('Visibility Expression')}
12 changes: 11 additions & 1 deletion app/views/shared/buttons/_ab_form.html.haml
Expand Up @@ -90,7 +90,17 @@
options_for_select([[_('Submit all'), 'all'], [_('One by one'), 'one']], @edit[:new][:submit_how]),
"data-miq_sparkle_on" => true,
)
= render(:partial => "layouts/role_enablement_expression",
:locals => {:rec_id => @custom_button ? @custom_button.id : 'new', :action => "automate_button_field_changed"})
%h3
= _('Disabled Button Text')
.form-horizontal.static
= text_field_tag("disabled_text", @edit[:new][:disabled_text],
:maxlength => 50,
:class => "form-control",
"data-miq_observe" => {:interval => '.5', :url => url}.to_json)
= render(:partial => "layouts/role_visibility_expression",
:locals => {:rec_id => @custom_button ? @custom_button.id : 'new', :action => "automate_button_field_changed"})
= render(:partial => "layouts/ae_resolve_options",
:locals => {:resolve => @edit,
:form_action => "ae_resolve",
Expand Down

0 comments on commit 67768fe

Please sign in to comment.