<%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 % foreach my $option ( keys %$options ) { % } % } % 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; % }
<% &{$layer_callback}($layer, $layer_fields, $layer_values, $layer_prefix) %>
% } % } <%once> my $conf = new FS::Conf; my $money_char = $conf->config('money_char') || '$'; my $date_noinit = 0; <%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 = ""; 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; if ( $include eq 'date' ) { # several important differences from other tr-* $html .= include( '/elements/tr-input-date-field.html', { 'name' => "$layer_prefix$field", 'value' => $value, 'label' => $lf->{label}, 'format'=> $lf->{format}, 'noinit'=> $date_noinit, } ); $date_noinit = 1; } else { $include = "input-$include" if $include =~ /^(text|money|percentage)$/; $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, ); } } #foreach $field $html .= '
'; return $html; }