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 000000000..89fe41b1b --- /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> | 
