diff options
author | ivan <ivan> | 2007-08-01 22:26:52 +0000 |
---|---|---|
committer | ivan <ivan> | 2007-08-01 22:26:52 +0000 |
commit | eb4ff7f73c5d4bdf74a3472448b5a195598ff4cd (patch) | |
tree | bb38241e8c865c3bca861da7749071feeadd2b5b /httemplate/elements/selectlayers.html | |
parent | 32b5d3a31f112a381f0a15ac5e3a2204242f3405 (diff) |
event refactor, landing on HEAD!
Diffstat (limited to 'httemplate/elements/selectlayers.html')
-rw-r--r-- | httemplate/elements/selectlayers.html | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/httemplate/elements/selectlayers.html b/httemplate/elements/selectlayers.html new file mode 100644 index 000000000..4496892ff --- /dev/null +++ b/httemplate/elements/selectlayers.html @@ -0,0 +1,201 @@ +<%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-table, + #XXX tbd: + # more? + }, + ... + ], + 'layer2' => [ 'l2fieldname', + ... + ], + + #current values for layer fields above + 'layer_values' => { 'layer' => { 'fieldname' => 'current_value', + 'fieldname2' => 'field2value', + ... + }, + 'layer2' => { 'l2fieldname' => 'l2value', + ... + }, + ... + }, + + '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 + ) + +</%doc> +% unless ( $opt{html_only} || $opt{js_only} ) { + <SCRIPT TYPE="text/javascript"> +% } +% unless ( $opt{html_only} ) { + //alert('start function define'); + function <% $key %>changed(what) { + + <% $opt{'onchange'} %> + + var <% $key %>layer = what.options[what.selectedIndex].value; + +% foreach my $layer ( keys %$options ) { + + if (<% $key %>layer == "<% $layer %>" ) { + +% foreach my $not ( grep { $_ ne $layer } keys %$options ) { +% 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'} %> + + } + //alert('end function define'); +% } +% unless ( $opt{html_only} || $opt{js_only} ) { + </SCRIPT> +% } +% +% unless ( $opt{js_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> + +<% ref($between) ? &{$between}($key) : $between %> + +% foreach my $layer ( keys %$options ) { + + <DIV ID="<% $key %>d<% $layer %>" + STYLE="<% $layer eq $selected + ? '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 $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}; + +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> |