communigate (phase 2): rules: adding conditions and actions to rule edit. RT#7514
authorivan <ivan>
Thu, 29 Apr 2010 07:40:46 +0000 (07:40 +0000)
committerivan <ivan>
Thu, 29 Apr 2010 07:40:46 +0000 (07:40 +0000)
FS/FS/cgp_rule.pm
httemplate/edit/cgp_rule.html
httemplate/edit/process/cgp_rule.html
httemplate/elements/input-text.html
httemplate/elements/select-cgp_rule_action.html
httemplate/elements/select-cgp_rule_condition.html
httemplate/elements/select.html

index 7e5c9fe..82e7122 100644 (file)
@@ -1,7 +1,7 @@
 package FS::cgp_rule;
 
 use strict;
-use base qw( FS::Record );
+use base qw( FS::o2m_Common FS::Record );
 use FS::Record qw( qsearch qsearchs dbh );
 use FS::cust_svc;
 use FS::cgp_rule_condition;
index 6f2d801..adf993f 100644 (file)
                          },
              'fields' => [ 'name',
                            'comment',
-                           { 'field'   => 'priority',
-                             'type'    => 'select',
-                             'options' => [ 0 .. 10 ],
-                             'labels'  => { 0 => 'Inactive' },
+                           { 'field'     => 'priority',
+                             'type'      => 'select',
+                             'options'   => [ 0 .. 10 ],
+                             'labels'    => { 0 => 'Inactive' },
                            },
-                           { 'field'   => 'svcnum', 'type' => 'hidden', },
-                           { 'type'    => 'tablebreak-tr-title',
-                             'value'   => 'Conditions',
+                           { 'field'     => 'svcnum', 'type' => 'hidden', },
+                           { 'type'      => 'tablebreak-tr-title',
+                             'value'     => 'Conditions',
                            },
-                           { 'field'   => 'ruleconditionnum',
-                             'type'    => 'select-cgp_rule_condition',
+                           { 'field'     => 'ruleconditionnum',
+                             'type'      => 'select-cgp_rule_condition',
                              'o2m_table' => 'cgp_rule_condition',
-                             'm2_label' => 'Condition',
+                             'm2_label'  => 'Condition',
                              #XXX m2_error_callback
+                             'm2_error_callback' => sub {},
                            },
-                           { 'type'    => 'tablebreak-tr-title',
-                             'value'   => 'Actions',
+                           { 'type'      => 'tablebreak-tr-title',
+                             'value'     => 'Actions',
                            },
-                           { 'field'   => 'ruleactionnum',
-                             'type'    => 'select-cgp_rule_action',
+                           { 'field'     => 'ruleactionnum',
+                             'type'      => 'select-cgp_rule_action',
                              'o2m_table' => 'cgp_rule_action',
-                             'm2_label' => 'Action',
+                             'm2_label'  => 'Action',
                              #XXX m2_error_callback
+                             'm2_error_callback' => sub {},
                            },
                          ],
              'new_callback' => sub { my( $cgi, $cgp_rule ) = @_;
index 3880b56..f427b6c 100644 (file)
@@ -1,6 +1,16 @@
 <% include( 'elements/process.html',
-              'table'    => 'cgp_rule',
-              'redirect' => $redirect,
+              'table'       => 'cgp_rule',
+              'redirect'    => $redirect,
+              'process_o2m' => [
+                {
+                  'table' => 'cgp_rule_condition',
+                  'fields' => [qw( condition op params )],
+                },
+                {
+                  'table' => 'cgp_rule_action',
+                  'fields' => [qw( action params )],
+                },
+              ],
           )
 %>
 <%init>
index 9db0643..fb50a50 100644 (file)
@@ -31,13 +31,17 @@ $opt{'disabled'} = &{ $opt{'disabled'} }( \%opt )
 $opt{'disabled'} = 'DISABLED'
   if $opt{'disabled'} && $opt{'disabled'} !~ /disabled/i; # uuh... yeah?
 
-my @style = ();
+my @style = ref($opt{'style'})
+              ? @{ $opt{'style'} }
+              : $opt{'style'}
+                ? ( $opt{'style'} )
+                : ();
 
 push @style, 'text-align: '. $opt{'text-align'}
   if $opt{'text-align'};
 
 push @style, 'background-color: #dddddd'
-  if $opt{'disabled'};
+  if $opt{'disabled'} && ! $opt{'nodarken_disabled'};
 
 my $style = scalar(@style) ? 'STYLE="'. join(';', @style). '"' : '';
 
index 25c3a25..9ac9306 100644 (file)
@@ -1,22 +1,59 @@
-%# XXX CSS to verticially align the select vs. the textarea
-<% include( 'select.html',
-              %opt,
-              'options' => \@actions, #reverse order if we ever need to specify
-              'labels'  => { '' => 'Select Action' },
-          )
-%>
-    <TEXTAREA NAME          = "<% $opt{field} %>_params"
-%#              ID            = "<% $opt{id} %>"
-%#              <% $rows %>
-%#              <% $cols %>
-%#              <% $onchange %>
-%#    ><% $curr_value |h %></TEXTAREA>
-    >
-%# XXX curr value
-    </TEXTAREA>
-<%init>
+% unless ( $opt{'js_only'} ) {
 
-my %opt = @_;
+    <INPUT TYPE="hidden" NAME="<%$name%>" ID="<%$id%>" VALUE="<%$curr_value%>">
+
+    <% include( 'select.html',
+                  'field'      => $name.'_action',
+                  'id'         => $id.'_action',
+                  'options'    => \@actions,
+                  'curr_value' => scalar($cgi->param($name.'_action'))
+                                  || $cgp_rule_action->action,
+                  'labels'     => { '' => 'Select Action' },
+                  'onchange'   => $name.'_changed',
+                  'style'      => 'vertical-align:top',
+              )
+    %>
+
+    <TEXTAREA NAME          = "<% $name %>_params"
+                ID          = "<% $id %>_params"
+                <% $disabled %>
+                <% $style %>
+%#                <% $rows %>
+%#                <% $cols %>
+%#                <% $onchange %>
+      ><% scalar($cgi->param($name.'_params')) || $cgp_rule_action->params |h %></TEXTAREA>
+
+% }
+% unless ( $opt{'html_only'} || $opt{'js_only'} ) {
+    <SCRIPT TYPE="text/javascript">
+% }
+% unless ( $opt{'html_only'} ) {
+
+    function <% $name %>_changed(what) {
+
+        <% $opt{'onchange'} %>
+
+        var <% $name %>_value = what.options[what.selectedIndex].value;
+
+        var params_Element = what.form.<% $name %>_params;
+
+        // if bool, hide/disable _op and _params entirely
+        if ( <%$name%>_value == '' || <%$name%>_value == 'Stop Processing' || <%$name%>_value == 'Discard' ) {
+          params_Element.disabled = true;
+          params_Element.style.visibility = "hidden";
+        } else {
+          params_Element.disabled = false;
+          params_Element.style.visibility = "visible";
+
+        }
+        
+    }
+
+% }
+% unless ( $opt{'html_only'} || $opt{'js_only'} ) {
+    </SCRIPT>
+% }
+<%once>
 
 my @actions = (
   '',
@@ -50,6 +87,28 @@ my @actions = (
   'Accept Request',
 );
 
-#XXX hmm, hide textarea w/Stop Processing,Discard like _condition.html
+my %noparam = ( map { $_=>1 } '', 'Stop Processing', 'Discard' );
+
+</%once>
+<%init>
+
+my %opt = @_;
+
+my $name = $opt{'element_name'} || $opt{'field'} || 'ruleactionnum';
+#my $id = $opt{'id'} || 'contactnum';
+my $id = $opt{'id'} || $opt{'field'} || 'ruleactionnum';
+
+my $curr_value = $opt{'curr_value'} || $opt{'value'};
+
+my $cgp_rule_action;
+if ( $curr_value ) {
+  $cgp_rule_action = qsearchs('cgp_rule_action',
+                                { 'ruleactionnum' => $curr_value } );
+} else {
+  $cgp_rule_action = new FS::cgp_rule_action {};
+}
+
+my $disabled = $noparam{$curr_value} ? 'DISABLED' : '';
+my $style = $disabled ? 'STYLE="visibility:hidden"' : '';
 
-</%Init>
+</%init>
index eaf7211..0c305d9 100644 (file)
@@ -1,25 +1,42 @@
 % unless ( $opt{'js_only'} ) {
+
+  <INPUT TYPE="hidden" NAME="<%$name%>" ID="<%$id%>" VALUE="<% $curr_value %>">
+
   <% include( 'select.html',
-                %opt,
-                'options'  => \@conditions,
-                'labels'   => { '' => 'Select Condition' },
-                'onchange' => $key.'_changed',
+                'field'      => $name.'_condition',
+                'id'         => $id.'_condition',
+                'options'    => \@conditions,
+                'curr_value' => scalar($cgi->param($name.'_condition'))
+                                  || $cgp_rule_condition->condition,
+                'labels'     => { '' => 'Select Condition' },
+                'onchange'   => $name.'_changed',
             )
   %>
+
   <% include( 'select.html',
-                'name' => $opt{'field'}.'_op',
-                'id'   => $key.'_op',
-                'options' => \@op,
-                #XXX curr op
+                'field'      => $name.'_op',
+                'id'         => $id.'_op',
+                'options'    => \@op,
+                'curr_value' => scalar($cgi->param($name.'_op'))
+                                  || $cgp_rule_condition->op,
+                'disabled'   => $disabled,
+                'style'      => $style,
             )
   %>
+
   <% include( 'input-text.html',
-                'name' => $opt{'field'}.'_params',
-                'id'   => $key.'_params',
-                #XXX curr value... anything else?
+                'field'      => $name.'_params',
+                'id'         => $id.'_params',
+                'curr_value' => scalar($cgi->param($name.'_params'))
+                                  || $cgp_rule_condition->params,
+                'disabled'   => $disabled,
+                'style'      => $style,
+                'nodarken_disabled' => 1,
             )
   %>
+
 % # could add more UI sugar for date/time ranges, string #lists, etc.
+
 % }
 % unless ( $opt{'html_only'} || $opt{'js_only'} ) {
     <SCRIPT TYPE="text/javascript">
         what.options[length] = optionName;
       }
 
-      function <% $key %>_changed(what) {
+      function <% $name %>_changed(what) {
 
-        <% $opt{'onchange'} %>
+        <% $onchange %>
 
-        var <% $key %>_value = what.options[what.selectedIndex].value;
-        //alert ("condition changed to " + <% $key %>_value );
+        var <% $name %>_value = what.options[what.selectedIndex].value;
 
-        var op_Element = what.form.<% $key %>_op;
-        var params_Element = what.form.<% $key %>_params;
+        var op_Element = what.form.<% $name %>_op;
+        var params_Element = what.form.<% $name %>_params;
 
         //cond2op in javascript... not as elegant cause my js << my perl
 
         // if bool, hide/disable _op and _params entirely
-        if ( <%$key%>_value == '' || <%$key%>_value == 'Human Generated' ) {
+        if ( <%$name%>_value == '' || <%$name%>_value == 'Human Generated' ) {
           op_Element.disabled = true;
           op_Element.style.visibility = "hidden";
           params_Element.disabled = true;
         var OpArray = [ 'is', 'is not' ];
 
         // if lt_ge, add em
-        if ( <%$key%>_value == 'Message Size' || <%$key%>_value == 'Time of Day' || <%$key%>_value == 'Current Date' ) {
+        if ( <%$name%>_value == 'Message Size' || <%$name%>_value == 'Time of Day' || <%$name%>_value == 'Current Date' ) {
           OpArray.push('less than');
           OpArray.push('greater than');
         }
 
         // unless no_in, add em
-        if ( <%$key%>_value != 'Message Size' && <%$key%>_value != 'Current Date' && <%$key%>_value != 'Existing Mailbox' ) {
+        if ( <%$name%>_value != 'Message Size' && <%$name%>_value != 'Current Date' && <%$name%>_value != 'Existing Mailbox' ) {
           OpArray.push('in');
           OpArray.push('not in');
         }
@@ -73,7 +89,7 @@
 
         // update the _op select with this new array
         for ( var s = 0; s < OpArray.length; s++ )
-            opt(what.form.<% $key %>_op, OpArray[s], OpArray[s]);
+            opt(what.form.<% $name %>_op, OpArray[s], OpArray[s]);
 
         // show _op and _params (in case we were a bool before)
         op_Element.disabled = false;
@@ -123,22 +139,22 @@ my @conditions = (
   'Each Route'
 );
 
-my %bool = ( #hide the op and valud dropdowns entirely
-  '' => 1, #XXX hide _op and _params on "Select Condition"
-  'Human Generated' => 1,
-);
+my %bool = ( map { $_=>1 } ( #hide the op and valud dropdowns entirely
+  '',
+  'Human Generated',
+));
 
-my %no_in = ( #hide in/not in
-  'Message Size' => 1,
-  'Current Date' => 1,
-  'Existing Mailbox' => 1,
-);
+my %no_in = ( map { $_=>1 } ( #hide in/not in
+  'Message Size',
+  'Current Date',
+  'Existing Mailbox',
+));
 
-my %lt_gt = ( #add less than/greater than
-  'Message Size' => 1,
-  'Time of Day', => 1,
-  'Current Date', => 1,
-);
+my %lt_gt = ( map { $_=>1 } ( #add less than/greater than
+  'Message Size',
+  'Time of Day',
+  'Current Date',
+));
 
 my $cond2op = sub {
   my $cond = shift;
@@ -154,10 +170,29 @@ my $cond2op = sub {
 
 my %opt = @_;
 
-my $key = $opt{'field'} || $opt{'id'};
+my $name = $opt{'element_name'} || $opt{'field'} || 'ruleconditionnum';
+#my $id = $opt{'id'} || 'contactnum';
+my $id = $opt{'id'} || $opt{'field'} || 'ruleconditionnum';
+
+my $curr_value = $opt{'curr_value'} || $opt{'value'};
+
+my $onchange = '';
+if ( $opt{'onchange'} ) {
+  $onchange = $opt{'onchange'};
+  $onchange .= '(what)' unless $onchange =~ /\(\w*\);?$/;
+}
+
+my $cgp_rule_condition;
+if ( $curr_value ) {
+  $cgp_rule_condition = qsearchs('cgp_rule_condition',
+                                   { 'ruleconditionnum' => $curr_value } );
+} else {
+  $cgp_rule_condition = new FS::cgp_rule_condition {};
+}
+
+my @op = &$cond2op($curr_value);
 
-#XXX curr value -> hidden op / param / param selects depending
-#my @op = &$cond2op($curr_value);
-my @op = &$cond2op();
+my $disabled = scalar(@op) ? '' : 1;
+my $style = $disabled ? 'visibility:hidden' : '';
 
 </%init>
index 268e0d2..5249a6d 100644 (file)
@@ -4,6 +4,8 @@
         ID            = "<% $opt{id} %>"
         previousValue = "<% $curr_value %>"
         previousText  = "<% $labels->{$curr_value} || $curr_value %>"
+        <% $style %>
+        <% $opt{disabled} %>
         <% $onchange %>
 >
 
@@ -60,4 +62,18 @@ if ( $opt{'onchange'} ) {
   $onchange = 'onChange="'. $onchange. '"' unless $onchange =~ /^onChange=/i;
 }
 
+$opt{'disabled'} = &{ $opt{'disabled'} }( \%opt )
+  if ref($opt{'disabled'}) eq 'CODE';
+$opt{'disabled'} = 'DISABLED'
+  if $opt{'disabled'} && $opt{'disabled'} !~ /disabled/i; # uuh... yeah?
+
+my @style = ref($opt{'style'})
+              ? @{ $opt{'style'} }
+              : $opt{'style'}
+                ? ( $opt{'style'} )
+                : ();
+
+my $style = scalar(@style) ? 'STYLE="'. join(';', @style). '"' : '';
+
+
 </%init>