fix A/R report
[freeside.git] / httemplate / elements / selectlayersx.html
1 <%doc>
2
3 Example:
4
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
8                             # functions
9     'curr_value'   => $selected_layer,
10     'options'      => [ 'option1', 'option2' ],
11     'labels'       => { 'option1' => 'Option 1 Label',
12                         'option2' => 'Option 2 Label',
13                       },
14
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:
20                                                          # text, money, fixed,
21                                                          # hidden, checkbox,
22                                                          # checkbox-multiple,
23                                                          # select, select-agent,
24                                                          # select-pkg_class,
25                                                          # select-part_referral,
26                                                          # select-taxclass,
27                                                          # select-table,
28                                                          #XXX tbd:
29                                                          # more?
30                                       },
31                                       ...
32                                     ],
33                         'layer2' => [ 'l2fieldname',
34                                       ...
35                                     ],
36                       },
37
38     #current values for layer fields above
39     'layer_values' => { 'layer'  => { 'fieldname'  => 'current_value',
40                                       'fieldname2' => 'field2value',
41                                       ...
42                                     },
43                         'layer2' => { 'l2fieldname' => 'l2value',
44                                       ...
45                                     },
46                         ...
47                       },
48
49     #or manual control, instead of layer_fields and layer_values above
50     #called with args: my( $layer, $layer_fields, $layer_values, $layer_prefix )
51     'layer_callback' => 
52
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
61   )
62
63 </%doc>
64 % unless ( grep $opt{$_}, qw(html_only js_only select_only layers_only) ) {
65 <SCRIPT TYPE="text/javascript">
66 % }
67 % unless ( grep $opt{$_}, qw(html_only select_only layers_only) ) {
68
69 %   unless ($selectlayersx_init) {
70
71 var selectlayerx_info = {};
72
73 function selectlayersx_changed (field) {
74
75   var what = document.getElementById(field);
76   selectlayerx_info[field]['onchange'](what);
77
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;
85     } else {
86       iterobj.style.display = "none";
87       iterobj.style.zIndex  = 0;
88     }
89   }
90
91 }
92
93 %     $selectlayersx_init = 1;
94 %   } #selectlayersx_init
95
96 selectlayerx_info['<% $key %>'] = {};
97 selectlayerx_info['<% $key %>']['onchange'] = function (what) { <% $opt{'onchange'} %> };
98 selectlayerx_info['<% $key %>']['layers']   = <% encode_json(\@layers) %>;
99
100
101 % } #unless html_only/select_only/layers_only
102 % unless ( grep $opt{$_}, qw(html_only js_only select_only layers_only) ) {
103 </SCRIPT>
104 % }
105 %
106 % unless ( grep $opt{$_}, qw(js_only layers_only) ) {
107
108     <SELECT NAME          = "<% $key %>"
109             ID            = "<% $key %>"
110             previousValue = "<% $selected %>"
111             previousText  = "<% $options{$selected} %>"
112             onChange="selectlayersx_changed('<% $key %>')"
113     >
114
115 %     foreach my $option ( keys %$options ) {
116
117         <OPTION VALUE="<% $option %>"
118                 <% $option eq $selected ? ' SELECTED' : '' %>
119         ><% $options->{$option} |h %></OPTION>
120
121 %     }
122
123     </SELECT>
124
125 % }
126 % unless ( grep $opt{$_}, qw(js_only select_only layers_only) ) {
127
128 <% ref($between) ? &{$between}($key) : $between %>
129
130 % }
131 %
132 % unless ( grep $opt{$_}, qw(js_only select_only) ) {
133
134 %   foreach my $layer ( @layers ) {
135 %     my $selected_layer;
136 %     $selected_layer = $selected;
137
138       <DIV ID="<% $key %>d<% $layer %>"
139            STYLE="<% $selected_layer eq $layer
140                        ? 'display: block; z-index: 1'
141                        : 'display: none; z-index: 0'
142                   %>"
143       >
144
145         <% &{$layer_callback}($layer, $layer_fields, $layer_values, $layer_prefix) %>
146
147       </DIV>
148
149 %   }
150
151 % }
152 <%once>
153
154 my $conf = new FS::Conf;
155 my $money_char = $conf->config('money_char') || '$';
156 my $date_noinit = 0;
157
158 </%once>
159 <%shared>
160
161 my $selectlayersx_init = 0;
162
163 </%shared>
164 <%init>
165
166 my %opt = @_;
167
168 #use Data::Dumper;
169 #warn Dumper(%opt);
170
171 my $key = $opt{field}; # || 'generate_one' #?
172
173 tie my %options, 'Tie::IxHash',
174    map { $_ => $opt{'labels'}->{$_} }
175        @{ $opt{'options'} }; #just arrayref for now
176
177 my $between = exists($opt{html_between}) ? $opt{html_between} : '';
178 my $options = \%options;
179
180 my @layers = ();
181 @layers = keys %options;
182
183 my $selected = exists($opt{curr_value}) ? $opt{curr_value} : '';
184
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};
189
190 my $layer_callback = $opt{layer_callback} || \&layer_callback;
191
192 sub layer_callback {
193   my( $layer, $layer_fields, $layer_values, $layer_prefix ) = @_;
194
195   return  '' unless $layer && exists $layer_fields->{$layer};
196   tie my %fields, 'Tie::IxHash', @{ $layer_fields->{$layer} };
197
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
200
201   return '' unless keys %fields;
202   my $html = "<TABLE>";
203
204   foreach my $field ( keys %fields ) {
205
206     my $lf = ref($fields{$field})
207                ? $fields{$field}
208                : { 'label'=>$fields{$field} };
209
210     my $value = $layer_values->{$layer}{$field};
211
212     my $type = $lf->{type} || 'text';
213
214     my $include = $type;
215
216     if ( $include eq 'date' ) {
217       # several important differences from other tr-*
218       $html .= include( '/elements/tr-input-date-field.html',
219         {
220           'name'  => "$layer_prefix$field",
221           'value' => $value,
222           'label' => $lf->{label},
223           'format'=> $lf->{format},
224           'noinit'=> $date_noinit,
225         }
226       );
227       $date_noinit = 1;
228     }
229     else {
230       $include = "input-$include" if $include =~ /^(text|money|percentage)$/;
231       $include = "tr-$include" unless $include eq 'hidden';
232       $html .= include( "/elements/$include.html",
233                         %$lf,
234                         'field'      => "$layer_prefix$field",
235                         'id'         => "$layer_prefix$field", #separate?
236                         #don't want field0_label0...?
237                         'label_id'   => $layer_prefix.$field."_label",
238
239                         'value'      => ( $lf->{'value'} || $value ), #hmm.
240                         'curr_value' => $value,
241                     );
242     }
243   } #foreach $field
244   $html .= '</TABLE>';
245   return $html;
246 }
247
248 </%init>