diff options
author | Jonathan Prykop <jonathan@freeside.biz> | 2016-03-02 22:41:51 -0600 |
---|---|---|
committer | Jonathan Prykop <jonathan@freeside.biz> | 2016-03-02 22:41:51 -0600 |
commit | 3d8dcf062ffb2da2aa4969a516c210680dab266d (patch) | |
tree | cecb0f8cc4be1dacb805f0a5fcca99a7a4a46dc5 | |
parent | 48ce4f3863f2cd4a25eb79fecd3ed5b4b98150cf (diff) |
RT21463: Option to show disabled package definitions [refactored to use ajax]
-rw-r--r-- | httemplate/elements/select-part_pkg.html | 108 | ||||
-rw-r--r-- | httemplate/elements/select-table.html | 7 | ||||
-rw-r--r-- | httemplate/misc/xmlhttp-part_pkg.cgi | 31 |
3 files changed, 123 insertions, 23 deletions
diff --git a/httemplate/elements/select-part_pkg.html b/httemplate/elements/select-part_pkg.html index d54f2831b..fb45c0efa 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 7945bb450..4b6ddb40e 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 000000000..187833025 --- /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> |