diff options
Diffstat (limited to 'httemplate/elements/selectlayers.html')
-rw-r--r-- | httemplate/elements/selectlayers.html | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/httemplate/elements/selectlayers.html b/httemplate/elements/selectlayers.html new file mode 100644 index 0000000..89fe41b --- /dev/null +++ b/httemplate/elements/selectlayers.html @@ -0,0 +1,242 @@ +<%doc> + +Example: + + include( '/elements/selectlayers.html', + 'field' => $key, # SELECT element NAME (passed as form field) + # also used as ID and a unique key for layers and + # functions + 'curr_value' => $selected_layer, + 'options' => [ 'option1', 'option2' ], + 'labels' => { 'option1' => 'Option 1 Label', + 'option2' => 'Option 2 Label', + }, + + #XXX put this handling it its own selectlayers-fields.html element? + 'layer_prefix' => 'prefix_', #optional prefix for fieldnames + 'layer_fields' => { 'layer' => [ 'fieldname', + { label => 'fieldname2', + type => 'text', #implemented: + # text, money, fixed, + # hidden, checkbox, + # checkbox-multiple, + # select, select-agent, + # select-pkg_class, + # select-part_referral, + # select-taxclass, + # select-table, + #XXX tbd: + # more? + }, + ... + ], + 'layer2' => [ 'l2fieldname', + ... + ], + }, + + #current values for layer fields above + 'layer_values' => { 'layer' => { 'fieldname' => 'current_value', + 'fieldname2' => 'field2value', + ... + }, + 'layer2' => { 'l2fieldname' => 'l2value', + ... + }, + ... + }, + + #or manual control, instead of layer_fields and layer_values above + #called with args: my( $layer, $layer_fields, $layer_values, $layer_prefix ) + 'layer_callback' => + + 'html_between => '', #optional HTML displayed between the SELECT and the + #layers, scalar or coderef ('field' passed as a param) + 'onchange' => '', #javascript code run when the SELECT changes + # ("what" is the element) + 'js_only' => 0, #set true to return only the JS portions + 'html_only' => 0, #set true to return only the HTML portions + 'select_only' => 0, #set true to return only the <SELECT> HTML + 'layers_only' => 0, #set true to return only the layers <DIV> HTML + ) + +</%doc> +% unless ( grep $opt{$_}, qw(html_only js_only select_only layers_only) ) { + <SCRIPT TYPE="text/javascript"> +% } +% unless ( grep $opt{$_}, qw(html_only select_only layers_only) ) { + +% if ( $opt{layermap} ) { +% my %map = %{ $opt{layermap} }; + var layermap = { "":"", + <% join(',', map { qq("$_":"$map{$_}") } keys %map ) %> + }; +% } + + function <% $key %>changed(what) { + + <% $opt{'onchange'} %> + + var <% $key %>layer = what.options[what.selectedIndex].value; + +% foreach my $layer ( @layers ) { +% +% if ( $opt{layermap} ) { + if ( layermap[ <% $key %>layer ] == "<% $layer %>" ) { +% } else { + if (<% $key %>layer == "<% $layer %>" ) { +% } + +% foreach my $not ( grep { $_ ne $layer } @layers ) { +% my $element = "document.getElementById('${key}d$not').style"; + <% $element %>.display = "none"; + <% $element %>.zIndex = 0; +% } + +% my $element = "document.getElementById('${key}d$layer').style"; + <% $element %>.display = ""; + <% $element %>.zIndex = 1; + + } +% } + + //<% $opt{'onchange'} %> + + } +% } +% unless ( grep $opt{$_}, qw(html_only js_only select_only layers_only) ) { + </SCRIPT> +% } +% +% unless ( grep $opt{$_}, qw(js_only layers_only) ) { + + <SELECT NAME = "<% $key %>" + ID = "<% $key %>" + previousValue = "<% $selected %>" + previousText = "<% $options{$selected} %>" + onChange="<% $key %>changed(this);" + > + +% foreach my $option ( keys %$options ) { + + <OPTION VALUE="<% $option %>" + <% $option eq $selected ? ' SELECTED' : '' %> + ><% $options->{$option} %></OPTION> + +% } + + </SELECT> + +% } +% unless ( grep $opt{$_}, qw(js_only select_only layers_only) ) { + +<% ref($between) ? &{$between}($key) : $between %> + +% } +% +% unless ( grep $opt{$_}, qw(js_only select_only) ) { + +% foreach my $layer ( @layers ) { +% my $selected_layer; +% if ( $opt{layermap} ) { +% $selected_layer = $opt{layermap}->{$selected}; +% } else { +% $selected_layer = $selected; +% } + + <DIV ID="<% $key %>d<% $layer %>" + STYLE="<% $selected_layer eq $layer + ? 'display: "" ; z-index: 1' + : 'display: none; z-index: 0' + %>" + > + + <% &{$layer_callback}($layer, $layer_fields, $layer_values, $layer_prefix) %> + + </DIV> + +% } + +% } +<%once> + +my $conf = new FS::Conf; +my $money_char = $conf->config('money_char') || '$'; + +</%once> +<%init> + +my %opt = @_; + +#use Data::Dumper; +#warn Dumper(%opt); + +my $key = $opt{field}; # || 'generate_one' #? + +tie my %options, 'Tie::IxHash', + map { $_ => $opt{'labels'}->{$_} } + @{ $opt{'options'} }; #just arrayref for now + +my $between = exists($opt{html_between}) ? $opt{html_between} : ''; +my $options = \%options; + +my @layers = (); +if ( $opt{layermap} ) { + my %layers = map { $opt{layermap}->{$_} => 1 } keys %options; + @layers = keys %layers; +} else { + @layers = keys %options; +} + +my $selected = exists($opt{curr_value}) ? $opt{curr_value} : ''; + +#XXX eek. also eek $layer_fields in the layer_callback() call... +my $layer_fields = $opt{layer_fields}; +my $layer_values = $opt{layer_values}; +my $layer_prefix = $opt{layer_prefix}; + +my $layer_callback = $opt{layer_callback} || \&layer_callback; + +sub layer_callback { + my( $layer, $layer_fields, $layer_values, $layer_prefix ) = @_; + + return '' unless $layer && exists $layer_fields->{$layer}; + tie my %fields, 'Tie::IxHash', @{ $layer_fields->{$layer} }; + + #XXX this should become an element itself... (false laziness w/edit.html) + # but at least all the elements inside are the shared mason elements now + + return '' unless keys %fields; + my $html = "<TABLE>"; + + foreach my $field ( keys %fields ) { + + my $lf = ref($fields{$field}) + ? $fields{$field} + : { 'label'=>$fields{$field} }; + + my $value = $layer_values->{$layer}{$field}; + + my $type = $lf->{type} || 'text'; + + my $include = $type; + $include = "input-$include" if $include =~ /^(text|money)$/; + $include = "tr-$include" unless $include eq 'hidden'; + + $html .= include( "/elements/$include.html", + %$lf, + 'field' => "$layer_prefix$field", + 'id' => "$layer_prefix$field", #separate? + #don't want field0_label0...? + 'label_id' => $layer_prefix.$field."_label", + + 'value' => ( $lf->{'value'} || $value ), #hmm. + 'curr_value' => $value, + ); + + } + $html .= '</TABLE>'; + return $html; +} + +</%init> |