From 6873aec01740ea7c70a5e20a3f3bce6e76bca410 Mon Sep 17 00:00:00 2001 From: ivan Date: Fri, 30 Apr 2010 02:32:39 +0000 Subject: [PATCH] communigate (phase 2): rules: show conditions/actions on rule browse, fix rule edit for conditions and actions without op/param, fix rule edit stickiness on errors. RT#7514 --- FS/FS/Mason.pm | 2 + FS/FS/Schema.pm | 18 +++---- FS/FS/cgp_rule_action.pm | 2 +- FS/FS/cgp_rule_condition.pm | 4 +- httemplate/browse/cgp_rule.html | 40 ++++++++++++++- httemplate/edit/cgp_rule.html | 58 ++++++++++++++++++++-- httemplate/elements/select-cgp_rule_action.html | 8 +-- httemplate/elements/select-cgp_rule_condition.html | 8 +-- 8 files changed, 115 insertions(+), 25 deletions(-) diff --git a/FS/FS/Mason.pm b/FS/FS/Mason.pm index 41c472d76..9ac9f6741 100644 --- a/FS/FS/Mason.pm +++ b/FS/FS/Mason.pm @@ -235,6 +235,8 @@ if ( -e $addl_handler_use_file ) { use FS::cust_bill_pkg_discount; use FS::svc_mailinglist; use FS::cgp_rule; + use FS::cgp_rule_condition; + use FS::cgp_rule_action; # Sammath Naur if ( $FS::Mason::addl_handler_use ) { diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index dcd618df1..07e5b309b 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -1801,11 +1801,11 @@ sub tables_hashref { 'cgp_rule_condition' => { 'columns' => [ - 'ruleconditionnum', 'serial', '', '', '', '', - 'condition', 'varchar', '', $char_d, '', '', - 'op', 'varchar', '', $char_d, '', '', - 'params', 'varchar', '', 255, '', '', - 'rulenum', 'int', '', '', '', '', + 'ruleconditionnum', 'serial', '', '', '', '', + 'condition', 'varchar', '', $char_d, '', '', + 'op', 'varchar', 'NULL', $char_d, '', '', + 'params', 'varchar', 'NULL', 255, '', '', + 'rulenum', 'int', '', '', '', '', ], 'primary_key' => 'ruleconditionnum', 'unique' => [], @@ -1814,10 +1814,10 @@ sub tables_hashref { 'cgp_rule_action' => { 'columns' => [ - 'ruleactionnum', 'serial', '', '', '', '', - 'action', 'varchar', '', $char_d, '', '', - 'params', 'varchar', '', 255, '', '', - 'rulenum', 'int', '', '', '', '', + 'ruleactionnum', 'serial', '', '', '', '', + 'action', 'varchar', '', $char_d, '', '', + 'params', 'varchar', 'NULL', 255, '', '', + 'rulenum', 'int', '', '', '', '', ], 'primary_key' => 'ruleactionnum', 'unique' => [], diff --git a/FS/FS/cgp_rule_action.pm b/FS/FS/cgp_rule_action.pm index 6dfd42427..170ab58db 100644 --- a/FS/FS/cgp_rule_action.pm +++ b/FS/FS/cgp_rule_action.pm @@ -111,7 +111,7 @@ sub check { my $error = $self->ut_numbern('ruleactionnum') || $self->ut_text('action') - || $self->ut_text('params') + || $self->ut_textn('params') || $self->ut_foreign_key('rulenum', 'cgp_rule', 'rulenum') ; return $error if $error; diff --git a/FS/FS/cgp_rule_condition.pm b/FS/FS/cgp_rule_condition.pm index f91b3e6f6..cfb671063 100644 --- a/FS/FS/cgp_rule_condition.pm +++ b/FS/FS/cgp_rule_condition.pm @@ -115,8 +115,8 @@ sub check { my $error = $self->ut_numbern('ruleconditionnum') || $self->ut_text('condition') - || $self->ut_text('op') - || $self->ut_text('params') + || $self->ut_textn('op') + || $self->ut_textn('params') || $self->ut_foreign_key('rulenum', 'cgp_rule', 'rulenum') ; return $error if $error; diff --git a/httemplate/browse/cgp_rule.html b/httemplate/browse/cgp_rule.html index 3bf4d69bd..ea11d62bf 100644 --- a/httemplate/browse/cgp_rule.html +++ b/httemplate/browse/cgp_rule.html @@ -7,13 +7,15 @@ 'order_by' => 'ORDER BY priority DESC', }, 'count_query' => $count_query, - 'header' => [ 'Priority', 'Name', '' ], + 'header' => [ 'Priority', 'Name', 'Conditions', 'Actions', '' ], 'fields' => [ sub { shift->priority || 'Inactive'; }, 'name', + $condition_sub, + $action_sub, sub { 'Delete'; }, ], #'align' - 'links' => [ $edit_sub, $edit_sub, $del_sub ], + 'links' => [ $edit_sub, $edit_sub, '', '', $del_sub ], ) %> <%init> @@ -40,6 +42,40 @@ my $html_init = qq(View this $svc_label

). qq!Add new rule

!; +my $condition_sub = sub { + my $cgp_rule = shift; + + [ map { + [ + { data => $_->condition, + #align => + }, + { data => $_->op, + align => 'center', + }, + { data => $_->params, + #align => + }, + ]; + } + $cgp_rule->cgp_rule_condition + ]; +}; + +my $action_sub = sub { + my $cgp_rule = shift; + + [ map { + [ + { data => $_->action }, + #{ data => '
'.$_->params.'
' }, #gets very big.. limit to + { data => $_->params }, # some actions? + ]; + } + $cgp_rule->cgp_rule_action + ]; +}; + my $edit_sub = [ $p.'edit/cgp_rule.html?', 'rulenum' ]; my $del_sub = [ $p.'misc/delete-cgp_rule.html?', 'rulenum' ]; #XXX javascript areyousure or something diff --git a/httemplate/edit/cgp_rule.html b/httemplate/edit/cgp_rule.html index adf993f25..d9c19a150 100644 --- a/httemplate/edit/cgp_rule.html +++ b/httemplate/edit/cgp_rule.html @@ -23,8 +23,7 @@ 'type' => 'select-cgp_rule_condition', 'o2m_table' => 'cgp_rule_condition', 'm2_label' => 'Condition', - #XXX m2_error_callback - 'm2_error_callback' => sub {}, + 'm2_error_callback' => $m2_error_callback_cond, }, { 'type' => 'tablebreak-tr-title', 'value' => 'Actions', @@ -33,8 +32,7 @@ 'type' => 'select-cgp_rule_action', 'o2m_table' => 'cgp_rule_action', 'm2_label' => 'Action', - #XXX m2_error_callback - 'm2_error_callback' => sub {}, + 'm2_error_callback' => $m2_error_callback_action, }, ], 'new_callback' => sub { my( $cgi, $cgp_rule ) = @_; @@ -48,7 +46,57 @@ my %opt = @_; -#my $svcnum #huh XXX #my $viewall_url = $p. "browse/$table.html?svcnum=$svcnum"; +my $m2_error_callback_cond = sub { + my($cgi, $object) = @_; + + my @fields = qw( condition op params ); + my @gfields = ( '', map "_$_", @fields ); + + map { + if ( /^ruleconditionnum(\d+)$/ ) { + my $num = $1; + if ( grep $cgi->param("ruleconditionnum$num$_"), @gfields ) { + my $x = new FS::cgp_rule_condition { + 'ruleconditionnum' => $cgi->param("ruleconditionnum$num"), + map { $_ => scalar($cgi->param("ruleconditionnum${num}_$_")) } @fields, + }; + $x; + } else { + (); + } + } else { + (); + } + } + $cgi->param; +}; + +my $m2_error_callback_action = sub { + my($cgi, $object) = @_; + + my @fields = qw( action params ); + my @gfields = ( '', map "_$_", @fields ); + + map { + if ( /^ruleactionnum(\d+)$/ ) { + my $num = $1; + if ( grep $cgi->param("ruleactionnum$num$_"), @gfields ) { + my $x = new FS::cgp_rule_condition { + 'ruleactionnum' => $cgi->param("ruleactionnum$num"), + map { $_ => scalar($cgi->param("ruleactionnum${num}_$_")) } @fields, + }; + $x; + } else { + (); + } + } else { + (); + } + } + $cgi->param; + +}; + diff --git a/httemplate/elements/select-cgp_rule_action.html b/httemplate/elements/select-cgp_rule_action.html index 9ac930633..7cefdc4b5 100644 --- a/httemplate/elements/select-cgp_rule_action.html +++ b/httemplate/elements/select-cgp_rule_action.html @@ -6,8 +6,7 @@ 'field' => $name.'_action', 'id' => $id.'_action', 'options' => \@actions, - 'curr_value' => scalar($cgi->param($name.'_action')) - || $cgp_rule_action->action, + 'curr_value' => $action, 'labels' => { '' => 'Select Action' }, 'onchange' => $name.'_changed', 'style' => 'vertical-align:top', @@ -108,7 +107,10 @@ if ( $curr_value ) { $cgp_rule_action = new FS::cgp_rule_action {}; } -my $disabled = $noparam{$curr_value} ? 'DISABLED' : ''; +my $action = scalar($cgi->param($name.'_action')) + || $cgp_rule_action->action; + +my $disabled = $noparam{$action} ? 'DISABLED' : ''; my $style = $disabled ? 'STYLE="visibility:hidden"' : ''; diff --git a/httemplate/elements/select-cgp_rule_condition.html b/httemplate/elements/select-cgp_rule_condition.html index 0c305d916..622cbe86d 100644 --- a/httemplate/elements/select-cgp_rule_condition.html +++ b/httemplate/elements/select-cgp_rule_condition.html @@ -6,8 +6,7 @@ 'field' => $name.'_condition', 'id' => $id.'_condition', 'options' => \@conditions, - 'curr_value' => scalar($cgi->param($name.'_condition')) - || $cgp_rule_condition->condition, + 'curr_value' => $condition, 'labels' => { '' => 'Select Condition' }, 'onchange' => $name.'_changed', ) @@ -190,7 +189,10 @@ if ( $curr_value ) { $cgp_rule_condition = new FS::cgp_rule_condition {}; } -my @op = &$cond2op($curr_value); +my $condition = scalar($cgi->param($name.'_condition')) + || $cgp_rule_condition->condition; + +my @op = &$cond2op($condition); my $disabled = scalar(@op) ? '' : 1; my $style = $disabled ? 'visibility:hidden' : ''; -- 2.11.0