[freeside-commits] branch master updated. 3d8dcf062ffb2da2aa4969a516c210680dab266d

Jonathan Prykop jonathan at 420.am
Wed Mar 2 20:42:10 PST 2016


The branch, master has been updated
       via  3d8dcf062ffb2da2aa4969a516c210680dab266d (commit)
      from  48ce4f3863f2cd4a25eb79fecd3ed5b4b98150cf (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 3d8dcf062ffb2da2aa4969a516c210680dab266d
Author: Jonathan Prykop <jonathan at freeside.biz>
Date:   Wed Mar 2 22:41:51 2016 -0600

    RT21463: Option to show disabled package definitions [refactored to use ajax]

diff --git a/httemplate/elements/select-part_pkg.html b/httemplate/elements/select-part_pkg.html
index d54f283..fb45c0e 100644
--- a/httemplate/elements/select-part_pkg.html
+++ b/httemplate/elements/select-part_pkg.html
@@ -10,7 +10,9 @@ Example:
     #opt
     'part_pkg'   => \@records,
     'showdisabled' => 1, #defaults to 0, shows disabled if true
-    'toggle_disabled' => 1, #implies showdisabled, adds js to toggle display of disabled
+    'toggle_disabled' => 1, #adds js to toggle display of disabled
+                            #currently cannot be used with many other options
+                            #currently must be used with multiple or disable_empty
 
     #select-table.html options
   )
@@ -25,10 +27,6 @@ Example:
      'empty_label'    => 'Select package', #should this be the default?
      'label_callback' => $opt{'label_callback'} || sub { shift->pkg_comment_only },
      'hashref'        => \%hash,
-     $opt{'toggle_disabled'} ? (
-       'extra_option_attributes' => [ 'disabled' ],
-       'hidden_sub' => sub { my $rec = shift; $rec->disabled; },
-     ) : (),
      %opt,
 &>
 
@@ -36,18 +34,58 @@ Example:
 %   unless ($toggle_disabled_init) {
 %     $toggle_disabled_init = 1;
 
+<% include('/elements/xmlhttp.html',
+        'url'  => $fsurl.'misc/xmlhttp-part_pkg.cgi',
+        'subs' => [ 'load_part_pkg' ],
+   ) %>
+
 <SCRIPT>
-function toggle_disabled (id, disabled_on) {
+var toggle_disabled_part_pkg_list = undefined;
+function toggle_disabled_part_pkg (id,showdisabled,noload) {
+  // remove link text, only put it back if this works
+  var trigger = document.getElementById(id+'_switch');
+  trigger.innerHTML = '';
+  // if needed, load pkg_list before trying again
+  var pkg_list = toggle_disabled_part_pkg_list;
+  if (!pkg_list && !noload) {
+    load_part_pkg(
+      function (result) {
+        result = JSON.parse(result);
+        if (result) {
+          toggle_disabled_part_pkg_list = result;
+          toggle_disabled_part_pkg(id,showdisabled,true);
+        } else {
+          console.log('Error loading pkg list');
+        }
+      }
+    );
+    return;
+  }
+  if (!(pkg_list && pkg_list.length)) {
+    console.log('Cannot load pkg list, or pkg list empty');
+    return;
+  }
+  // remove all existing options, tracking which are selected
   var selectbox = document.getElementById(id);
-  for (var i = 0; i < selectbox.length; i++) {
-    var optionbox = selectbox.options[i];
-    if (optionbox.getAttribute('data-disabled')) {
-      optionbox.hidden = (disabled_on || optionbox.selected) ? false : true;
+  var selected = {};
+  for (var i = selectbox.length - 1; i >= 0; i--) {
+    var nextopt = selectbox.options[i];
+    selected[nextopt.value] = nextopt.selected;
+    nextopt.parentNode.removeChild(nextopt);
+  }
+  // regenerate options list from pkg list
+  for (var i = 0; i < pkg_list.length; i++) {
+    var pkginfo = pkg_list[i];
+    if (showdisabled || selected[pkginfo.pkgpart] || !pkginfo.disabled) {
+      var newopt = document.createElement('option');
+      newopt.value = pkginfo.pkgpart;
+      newopt.label = pkginfo.label;
+      newopt.selected = selected[newopt.value] ? true : false;
+      selectbox.appendChild(newopt);
     }
   }
-  var switchlink = document.getElementById(id+'_switch');
-  switchlink.innerHTML = disabled_on ? '<% emt("hide disabled packages") %>' : '<% emt("show disabled packages") %>';
-  switchlink.onclick = function () { toggle_disabled(id, disabled_on ? 0 : 1) };
+  trigger.innerHTML = showdisabled ? '<% $hidetext %>' : '<% $showtext %>';
+  trigger.onclick = function () { toggle_disabled_part_pkg(id,(showdisabled ? 0 : 1)) };
 }
 </SCRIPT>
 
@@ -56,8 +94,8 @@ function toggle_disabled (id, disabled_on) {
 <BR><A 
   HREF="javascript:void(0)"
   STYLE="font-size: smaller"
-  ONCLICK="toggle_disabled('<% $opt{'id'} %>',1)"
-  ID="<% $opt{'id'} %>_switch"><% emt("show disabled packages") %></A>
+  ONCLICK="toggle_disabled_part_pkg('<% $opt{'id'} %>',<% $showdisabled ? '0' : '1' %>)"
+  ID="<% $opt{'id'} %>_switch"><% $showdisabled ? $hidetext : $showtext %></A>
 
 % } # if $opt{'toggle_disabled'}
 
@@ -68,13 +106,42 @@ my $toggle_disabled_init = 0;
  
 my( %opt ) = @_;
 
+# toggle_disabled relies on matching search/label options with xmlhttp-part_pkg
+# it would be difficult to handle these in the current xmlhttp implementation
+# this is defensive coding, not a guarantee it'll work with options not listed here
+if ($opt{'toggle_disabled'}) {
+  foreach my $someopt ( qw(
+    records
+    part_pkg
+    table
+    agent_virt
+    agent_null
+    agent_null_right
+    name_col
+    label_callback
+    hashref
+    extra_sql
+    addl_from
+    order_by
+    pre_options
+    post_options
+  ) ) {
+    die "Cannot use toggle_disabled with $someopt"
+      if exists $opt{$someopt};
+  }
+}
+
+# this would be fairly easy to implement, but not needed right now
+die 'Use of toggle_disabled without multiple or disable_empty has not been implemented'
+  if $opt{'toggle_disabled'} && !($opt{'multiple'} || $opt{'disable_empty'});
+
 $opt{'records'} = delete $opt{'part_pkg'}
   if $opt{'part_pkg'};
 
-$opt{'showdisabled'} = 1 if $opt{'toggle_disabled'};
+my $showdisabled = $opt{'showdisabled'};
 
 my %hash = ();
-$hash{'disabled'} = '' unless $opt{'showdisabled'};
+$hash{'disabled'} = '' unless $showdisabled;
 
 if ( exists($opt{'classnum'}) && defined($opt{'classnum'}) ) {
   if ( $opt{'classnum'} > 0 ) {
@@ -84,7 +151,14 @@ if ( exists($opt{'classnum'}) && defined($opt{'classnum'}) ) {
   } #else -1 or not specified, all classes, so don't set classnum
 }
 
+# currently can't handle this, either
+die 'Use of toggle_disabled with classnum has not been implemented'
+  if exists $hash{'classnum'};
+
 $opt{'extra_sql'} .= ( keys(%hash) ? ' AND ' : ' WHERE ' ).
                      FS::part_pkg->curuser_pkgs_sql;
 
+my $showtext = emt("show disabled packages");
+my $hidetext = emt("hide disabled packages");
+
 </%init>
diff --git a/httemplate/elements/select-table.html b/httemplate/elements/select-table.html
index 7945bb4..4b6ddb4 100644
--- a/httemplate/elements/select-table.html
+++ b/httemplate/elements/select-table.html
@@ -51,12 +51,9 @@ Example:
                             #<SELECT> element
     'onchange'       => '', #javascript code
 
-    #params controlling the <OPTION>s
+    #params (well, a param) controlling the <OPTION>s
     'extra_option_attributes' => [ 'field' ], #field or method in $table objects
                                               #(are prefixed w/data- per HTML5)
-    'hidden_sub' => sub { my $rec = shift; $rec->disabled; }, #sets option hidden att if true
-                                                              #won't hide selected options
-                                                              #hidden att not supported IE < 11
 
     #special return options
     'js_only'      => 0, #set true to return only the JS portions (i.e. nothing)
@@ -111,10 +108,8 @@ Example:
 %     $selected =    ( ref($value) && $value->{$recvalue} )
 %                 || ( $value && $value eq $recvalue ); #not == because of value_col
 %   }
-%   $opt{'hidden_sub'} ||= sub { 0 };
     <OPTION VALUE="<% $recvalue %>"
             <% $selected ? ' SELECTED' : '' %>
-            <% (&{$opt{'hidden_sub'}}($record) && !$selected) ? ' hidden' : '' %>
 %           foreach my $att ( @{ $opt{'extra_option_attributes'} } ) {
               data-<% $att %>="<% $record->$att() |h %>"
 %           }
diff --git a/httemplate/misc/xmlhttp-part_pkg.cgi b/httemplate/misc/xmlhttp-part_pkg.cgi
new file mode 100644
index 0000000..1878330
--- /dev/null
+++ b/httemplate/misc/xmlhttp-part_pkg.cgi
@@ -0,0 +1,31 @@
+<% encode_json( \@return ) %>\
+<%init>
+
+# default returned records must maintain consistency with /elements/select-part_pkg.html
+
+my $extra_sql = ' WHERE ' . FS::part_pkg->curuser_pkgs_sql;
+
+# equivalent to agent_virt=1 and agent_null=1 in /elements/select-table.html
+$extra_sql .= ' AND ' . 
+  $FS::CurrentUser::CurrentUser->agentnums_sql(
+    'null' => 1,
+  );
+
+my @records = qsearch( {
+  'table'     => 'part_pkg',
+  'hashref'   => {},
+  'extra_sql' => $extra_sql,
+  'order_by'  => "ORDER BY pkg",
+});
+
+my @return = map { 
+  {
+    'pkgpart'  => $_->pkgpart,
+    'label'    => $_->pkg_comment_only,
+    'disabled' => $_->disabled,
+  }
+} @records;
+
+print STDERR Dumper(\@return);
+
+</%init>

-----------------------------------------------------------------------

Summary of changes:
 httemplate/elements/select-part_pkg.html |  108 +++++++++++++++++++++++++-----
 httemplate/elements/select-table.html    |    7 +-
 httemplate/misc/xmlhttp-part_pkg.cgi     |   31 +++++++++
 3 files changed, 123 insertions(+), 23 deletions(-)
 create mode 100644 httemplate/misc/xmlhttp-part_pkg.cgi




More information about the freeside-commits mailing list