5 include( '/elements/selectlayers.html',
6 'field' => $key, # SELECT element NAME (passed as form field)
7 # also used as ID and a unique key for layers and
9 'curr_value' => $selected_layer,
10 'options' => [ 'option1', 'option2' ],
11 'labels' => { 'option1' => 'Option 1 Label',
12 'option2' => 'Option 2 Label',
15 #XXX put this handling it its own selectlayers-fields.html element?
16 'layer_prefix' => 'prefix_', #optional prefix for fieldnames
17 'layer_fields' => { 'layer' => [ 'fieldname',
18 { label => 'fieldname2',
19 type => 'text', #implemented:
23 # select, select-agent,
25 # select-part_referral,
33 'layer2' => [ 'l2fieldname',
38 #current values for layer fields above
39 'layer_values' => { 'layer' => { 'fieldname' => 'current_value',
40 'fieldname2' => 'field2value',
43 'layer2' => { 'l2fieldname' => 'l2value',
49 #or manual control, instead of layer_fields and layer_values above
50 #called with args: my( $layer, $layer_fields, $layer_values, $layer_prefix )
53 'html_between => '', #optional HTML displayed between the SELECT and the
54 #layers, scalar or coderef ('field' passed as a param)
55 'onchange' => '', #javascript code run when the SELECT changes
56 # ("what" is the element)
57 'js_only' => 0, #set true to return only the JS portions
58 'html_only' => 0, #set true to return only the HTML portions
59 'select_only' => 0, #set true to return only the <SELECT> HTML
60 'layers_only' => 0, #set true to return only the layers <DIV> HTML
64 % unless ( grep $opt{$_}, qw(html_only js_only select_only layers_only) ) {
65 <SCRIPT TYPE="text/javascript">
67 % unless ( grep $opt{$_}, qw(html_only select_only layers_only) ) {
69 % unless ($selectlayersx_init) {
71 var selectlayerx_info = {};
73 function selectlayersx_changed (field) {
75 var what = document.getElementById(field);
76 selectlayerx_info[field]['onchange'](what);
78 var selectedlayer = what.options[what.selectedIndex].value;
79 for (i=0; i < selectlayerx_info[field]['layers'].length; i++) {
80 var iterlayer = selectlayerx_info[field]['layers'][i];
81 var iterobj = document.getElementById(field+'d'+iterlayer);
82 if (selectedlayer == iterlayer) {
83 iterobj.style.display = "";
84 iterobj.style.zIndex = 1;
86 iterobj.style.display = "none";
87 iterobj.style.zIndex = 0;
93 % $selectlayersx_init = 1;
94 % } #selectlayersx_init
96 selectlayerx_info['<% $key %>'] = {};
97 selectlayerx_info['<% $key %>']['onchange'] = function (what) { <% $opt{'onchange'} %> };
98 selectlayerx_info['<% $key %>']['layers'] = <% encode_json(\@layers) %>;
101 % } #unless html_only/select_only/layers_only
102 % unless ( grep $opt{$_}, qw(html_only js_only select_only layers_only) ) {
106 % unless ( grep $opt{$_}, qw(js_only layers_only) ) {
108 <SELECT NAME = "<% $key %>"
110 previousValue = "<% $selected %>"
111 previousText = "<% $options{$selected} %>"
112 onChange="selectlayersx_changed('<% $key %>')"
115 % foreach my $option ( keys %$options ) {
117 <OPTION VALUE="<% $option %>"
118 <% $option eq $selected ? ' SELECTED' : '' %>
119 ><% $options->{$option} |h %></OPTION>
126 % unless ( grep $opt{$_}, qw(js_only select_only layers_only) ) {
128 <% ref($between) ? &{$between}($key) : $between %>
132 % unless ( grep $opt{$_}, qw(js_only select_only) ) {
134 % foreach my $layer ( @layers ) {
135 % my $selected_layer;
136 % $selected_layer = $selected;
138 <DIV ID="<% $key %>d<% $layer %>"
139 STYLE="<% $selected_layer eq $layer
140 ? 'display: block; z-index: 1'
141 : 'display: none; z-index: 0'
145 <% &{$layer_callback}($layer, $layer_fields, $layer_values, $layer_prefix) %>
154 my $conf = new FS::Conf;
155 my $money_char = $conf->config('money_char') || '$';
161 my $selectlayersx_init = 0;
171 my $key = $opt{field}; # || 'generate_one' #?
173 tie my %options, 'Tie::IxHash',
174 map { $_ => $opt{'labels'}->{$_} }
175 @{ $opt{'options'} }; #just arrayref for now
177 my $between = exists($opt{html_between}) ? $opt{html_between} : '';
178 my $options = \%options;
181 @layers = keys %options;
183 my $selected = exists($opt{curr_value}) ? $opt{curr_value} : '';
185 #XXX eek. also eek $layer_fields in the layer_callback() call...
186 my $layer_fields = $opt{layer_fields};
187 my $layer_values = $opt{layer_values};
188 my $layer_prefix = $opt{layer_prefix};
190 my $layer_callback = $opt{layer_callback} || \&layer_callback;
193 my( $layer, $layer_fields, $layer_values, $layer_prefix ) = @_;
195 return '' unless $layer && exists $layer_fields->{$layer};
196 tie my %fields, 'Tie::IxHash', @{ $layer_fields->{$layer} };
198 #XXX this should become an element itself... (false laziness w/edit.html)
199 # but at least all the elements inside are the shared mason elements now
201 return '' unless keys %fields;
202 my $html = "<TABLE>";
204 foreach my $field ( keys %fields ) {
206 my $lf = ref($fields{$field})
208 : { 'label'=>$fields{$field} };
210 my $value = $layer_values->{$layer}{$field};
212 my $type = $lf->{type} || 'text';
216 if ( $include eq 'date' ) {
217 # several important differences from other tr-*
218 $html .= include( '/elements/tr-input-date-field.html',
220 'name' => "$layer_prefix$field",
222 'label' => $lf->{label},
223 'format'=> $lf->{format},
224 'noinit'=> $date_noinit,
230 $include = "input-$include" if $include =~ /^(text|money|percentage)$/;
231 $include = "tr-$include" unless $include eq 'hidden';
232 $html .= include( "/elements/$include.html",
234 'field' => "$layer_prefix$field",
235 'id' => "$layer_prefix$field", #separate?
236 #don't want field0_label0...?
237 'label_id' => $layer_prefix.$field."_label",
239 'value' => ( $lf->{'value'} || $value ), #hmm.
240 'curr_value' => $value,