blib/lib/CGI/Lazy/Widget/Dataset.pm | |||
---|---|---|---|
Criterion | Covered | Total | % |
statement | 18 | 421 | 4.2 |
branch | 0 | 206 | 0.0 |
condition | 0 | 18 | 0.0 |
subroutine | 6 | 24 | 25.0 |
pod | 7 | 18 | 38.8 |
total | 31 | 687 | 4.5 |
line | stmt | bran | cond | sub | pod | time | code |
---|---|---|---|---|---|---|---|
1 | package CGI::Lazy::Widget::Dataset; | ||||||
2 | |||||||
3 | 1 | 1 | 6 | use strict; | |||
1 | 1 | ||||||
1 | 42 | ||||||
4 | |||||||
5 | 1 | 1 | 6 | use JavaScript::Minifier qw(minify); | |||
1 | 2 | ||||||
1 | 60 | ||||||
6 | 1 | 1 | 6 | use JSON; | |||
1 | 1 | ||||||
1 | 6 | ||||||
7 | 1 | 1 | 123 | use CGI::Lazy::Globals; | |||
1 | 2 | ||||||
1 | 93 | ||||||
8 | 1 | 1 | 6 | use Tie::IxHash; | |||
1 | 2 | ||||||
1 | 23 | ||||||
9 | |||||||
10 | 1 | 1 | 5 | use base qw(CGI::Lazy::Widget); | |||
1 | 2 | ||||||
1 | 6303 | ||||||
11 | |||||||
12 | our $tableCaptionVar = "CAPTION"; | ||||||
13 | our $headingItemVar = "HEADING.ITEM."; | ||||||
14 | our $bodyRowLoopVar = "ROW.LOOP"; | ||||||
15 | our $bodyRowName = "ROW"; | ||||||
16 | our $surroundingDivName = "DIV.MAIN"; | ||||||
17 | our $deleteID = "DELETE.ID"; | ||||||
18 | our $deleteFlag = "DELETE.FLAG"; | ||||||
19 | our $deletename; | ||||||
20 | |||||||
21 | #---------------------------------------------------------------------------------------- | ||||||
22 | sub buildCheckbox { | ||||||
23 | 0 | 0 | 0 | my $self = shift; | |||
24 | 0 | my $fieldname = shift; | |||||
25 | 0 | my $webcontrol = shift; | |||||
26 | 0 | my $value = shift; | |||||
27 | |||||||
28 | 0 | 0 | if ($webcontrol->{value}) { | ||||
0 | |||||||
29 | 0 | 0 | if ($value eq $webcontrol->{value}) { | ||||
30 | 0 | return ($webcontrol->{value}, ' checked '); | |||||
31 | } else { | ||||||
32 | 0 | return ($webcontrol->{value}); | |||||
33 | } | ||||||
34 | |||||||
35 | } elsif ($webcontrol->{sql}) { | ||||||
36 | 0 | my ($query, @binds) = @{$webcontrol->{sql}}; | |||||
0 | |||||||
37 | 0 | my $lookupvalue = $self->q->db->get($query, @binds); | |||||
38 | |||||||
39 | 0 | 0 | if ($value eq $lookupvalue) { | ||||
40 | 0 | return ($lookupvalue, ' checked '); | |||||
41 | } else { | ||||||
42 | 0 | return ($lookupvalue); | |||||
43 | } | ||||||
44 | } | ||||||
45 | } | ||||||
46 | |||||||
47 | #---------------------------------------------------------------------------------------- | ||||||
48 | sub buildHeadings { | ||||||
49 | 0 | 0 | 0 | my $self = shift; | |||
50 | |||||||
51 | 0 | 0 | $deletename = $self->vars->{deleteName} || 'Delete'; | ||||
52 | 0 | my $headings = {}; | |||||
53 | 0 | my $recset = $self->recordset; | |||||
54 | |||||||
55 | 0 | $headings->{$headingItemVar.$_} = $recset->label($_) for $recset->visibleFields; | |||||
56 | 0 | 0 | $headings->{$headingItemVar."DELETE"} = $deletename unless $self->vars->{nodelete}; | ||||
57 | |||||||
58 | 0 | return $headings; | |||||
59 | } | ||||||
60 | |||||||
61 | #---------------------------------------------------------------------------------------- | ||||||
62 | sub buildSelect { | ||||||
63 | 0 | 0 | 0 | my $self = shift; | |||
64 | 0 | my $fieldname = shift; | |||||
65 | 0 | my $webcontrol = shift; | |||||
66 | 0 | my $value = shift; | |||||
67 | |||||||
68 | 0 | my $list = []; | |||||
69 | |||||||
70 | 0 | my $vals = {}; | |||||
71 | 0 | tie %$vals, 'Tie::IxHash'; | |||||
72 | |||||||
73 | 0 | 0 | if ($webcontrol->{values} ) { | ||||
0 | |||||||
74 | 0 | 0 | if (ref $webcontrol->{values} eq 'HASH') { | ||||
0 | |||||||
75 | 0 | 0 | $vals->{''} = '' unless $webcontrol->{notNull}; | ||||
76 | 0 | $vals = $webcontrol->{values}; | |||||
77 | } elsif (ref $webcontrol->{values} eq 'ARRAY') { | ||||||
78 | 0 | 0 | $vals->{''} = '' unless $webcontrol->{notNull}; | ||||
79 | 0 | $vals->{$_} = $_ for @{$webcontrol->{values}}; | |||||
0 | |||||||
80 | } else { | ||||||
81 | 0 | return; | |||||
82 | } | ||||||
83 | |||||||
84 | |||||||
85 | } elsif ($webcontrol->{sql}) { | ||||||
86 | 0 | my ($query, @binds) = @{$webcontrol->{sql}}; | |||||
0 | |||||||
87 | 0 | 0 | $vals->{''} = '' unless $webcontrol->{notNull}; | ||||
88 | 0 | $vals->{$_->[0]} = $_->[1] for @{$self->q->db->getarray($query, @binds)}; | |||||
0 | |||||||
89 | |||||||
90 | } | ||||||
91 | |||||||
92 | 0 | foreach (keys %$vals) { | |||||
93 | |||||||
94 | 0 | 0 | if ($vals->{$_} eq $value) { | ||||
95 | 0 | push @$list, {'ITEM.LABEL' => $_, 'ITEM.VALUE' => $vals->{$_}, 'ITEM.SELECTED' => ' selected '}; | |||||
96 | |||||||
97 | } else { | ||||||
98 | 0 | push @$list, {'ITEM.LABEL' => $_, 'ITEM.VALUE' => $vals->{$_}}; | |||||
99 | } | ||||||
100 | } | ||||||
101 | |||||||
102 | 0 | return $list; | |||||
103 | } | ||||||
104 | |||||||
105 | #---------------------------------------------------------------------------------------- | ||||||
106 | sub buildRadio { | ||||||
107 | 0 | 0 | 0 | my $self = shift; | |||
108 | 0 | my $fieldname = shift; | |||||
109 | 0 | my $webcontrol = shift; | |||||
110 | 0 | my $webname = shift; | |||||
111 | 0 | my $webID = shift; | |||||
112 | 0 | my $value = shift; | |||||
113 | |||||||
114 | 0 | my $list = []; | |||||
115 | 0 | my $vals = {}; | |||||
116 | 0 | tie %$vals, 'Tie::IxHash'; | |||||
117 | |||||||
118 | 0 | 0 | if ($webcontrol->{values} ) { | ||||
0 | |||||||
119 | |||||||
120 | 0 | 0 | if (ref $webcontrol->{values} eq 'HASH') { | ||||
0 | |||||||
121 | 0 | $vals = $webcontrol->{values}; | |||||
122 | } elsif (ref $webcontrol->{values} eq 'ARRAY') { | ||||||
123 | 0 | $vals->{$_} = $_ for @{$webcontrol->{values}}; | |||||
0 | |||||||
124 | } else { | ||||||
125 | 0 | return; | |||||
126 | } | ||||||
127 | |||||||
128 | |||||||
129 | } elsif ($webcontrol->{sql} ) { | ||||||
130 | 0 | my ($query, @binds) = @{$webcontrol->{sql}}; | |||||
0 | |||||||
131 | |||||||
132 | 0 | $vals->{$_->[0]} = $_->[1] for @{$self->q->db->getarray($query, @binds)}; | |||||
0 | |||||||
133 | |||||||
134 | } | ||||||
135 | |||||||
136 | 0 | foreach (keys %$vals) { | |||||
137 | 0 | 0 | if ($vals->{$_} eq $value) { | ||||
138 | 0 | push @$list, { | |||||
139 | "ID.".$fieldname => $webID."-$_", | ||||||
140 | 'NAME.'.$fieldname => $webname, | ||||||
141 | 'VALUELABEL.'.$fieldname => $_, | ||||||
142 | 'VALUE.'.$fieldname => $vals->{$_}, | ||||||
143 | 'CHECKED.'.$fieldname => ' checked ', | ||||||
144 | }; | ||||||
145 | |||||||
146 | } else { | ||||||
147 | 0 | push @$list, { | |||||
148 | "ID.".$fieldname => $webID."-$_", | ||||||
149 | 'NAME.'.$fieldname => $webname, | ||||||
150 | 'VALUELABEL.'.$fieldname => $_, | ||||||
151 | 'VALUE.'.$fieldname => $vals->{$_}, | ||||||
152 | }; | ||||||
153 | |||||||
154 | } | ||||||
155 | } | ||||||
156 | |||||||
157 | 0 | return $list; | |||||
158 | |||||||
159 | } | ||||||
160 | |||||||
161 | #---------------------------------------------------------------------------------------- | ||||||
162 | sub buildvalidator { | ||||||
163 | 0 | 0 | 0 | my $self = shift; | |||
164 | |||||||
165 | 0 | my $validator = {}; | |||||
166 | |||||||
167 | 0 | foreach ( @{$self->recordset->visibleFields}) { | |||||
0 | |||||||
168 | 0 | 0 | if ($self->recordset->validator($_)) { | ||||
169 | 0 | my $rules = $self->recordset->validator($_); | |||||
170 | 0 | $rules->{label} = $self->recordset->label($_); | |||||
171 | 0 | 0 | if ($self->type eq "multi") { | ||||
0 | |||||||
172 | 0 | $validator->{$self->widgetID."-".$_."--".1} = $rules; | |||||
173 | } elsif ($self->type eq "single") { | ||||||
174 | 0 | $validator->{$self->widgetID."-".$_} = $rules; | |||||
175 | } | ||||||
176 | } | ||||||
177 | } | ||||||
178 | |||||||
179 | 0 | $self->{_validator} = $validator; | |||||
180 | } | ||||||
181 | |||||||
182 | #---------------------------------------------------------------------------------------- | ||||||
183 | sub contents { | ||||||
184 | 0 | 0 | 1 | my $self = shift; | |||
185 | 0 | my %args = @_; | |||||
186 | |||||||
187 | 0 | my $widgetID = $self->widgetID; | |||||
188 | 0 | my $vars = $self->vars; | |||||
189 | 0 | my $template; | |||||
190 | |||||||
191 | 0 | 0 | if ($args{mode} eq 'readonly') { | ||||
192 | 0 | $template = $vars->{readOnlyTemplate}; #some form of template is required | |||||
193 | } else { | ||||||
194 | 0 | $template = $vars->{template}; | |||||
195 | } | ||||||
196 | |||||||
197 | 0 | my $type = $vars->{type}; | |||||
198 | 0 | my $multiType = $vars->{multiType}; | |||||
199 | 0 | 0 | my $containerID = $vars->{containerId} || $widgetID; | ||||
200 | 0 | my $tableCaptionValue = $vars->{tableCaption}; #can be blank | |||||
201 | 0 | my $recset = $vars->{recordset}; #required | |||||
202 | 0 | my $lookups = $vars->{lookups}; #if this isn't set, then new records will only contain what's on the screen | |||||
203 | 0 | my $standalone = $vars->{standalone}; #if set, widget will include its own open and close tags | |||||
204 | 0 | my $defaults = $vars->{defaultvalues}; #if this isn't set, then new records will only contain what's on the screen | |||||
205 | 0 | my $nodelete = $vars->{nodelete}; | |||||
206 | 0 | my $flagcolor = $vars->{flagColor}; | |||||
207 | 0 | my $headings = $vars->{headings}; | |||||
208 | |||||||
209 | 0 | my $formOpenTag = ''; | |||||
210 | 0 | my $formCloseTag = ''; | |||||
211 | 0 | my $validator = {}; | |||||
212 | 0 | my $tmplvars = {}; | |||||
213 | |||||||
214 | 0 | 0 | $type = 'multi' unless $type; | ||||
215 | |||||||
216 | 0 | 0 | if ($type eq 'single') { | ||||
217 | 0 | 0 | $multiType = 'list' unless $multiType; | ||||
218 | } | ||||||
219 | |||||||
220 | 0 | 0 | if ($standalone) { | ||||
221 | 0 | 0 | $formOpenTag = $vars->{formOpenTag} || $self->q->start_form({-method => 'post', -action => $self->q->url}); | ||||
222 | 0 | $formCloseTag = $self->q->end_form; | |||||
223 | } | ||||||
224 | |||||||
225 | |||||||
226 | 0 | 0 | $recset->select(@{$args{binds}}) unless $args{mode} eq 'blank'; | ||||
0 | |||||||
227 | # $self->q->util->debug->edump($recset->data); | ||||||
228 | |||||||
229 | 0 | $self->{_multi} = 0; | |||||
230 | 0 | 0 | $self->{_empty} = scalar @{$recset->data} ? 0 : 1;; | ||||
0 | |||||||
231 | |||||||
232 | 0 | my $headingsdiv; | |||||
233 | |||||||
234 | 0 | 0 | if ($type eq 'multi') { | ||||
0 | |||||||
235 | 0 | 0 | 0 | if ($headings && $headings eq 'none') { | |||
0 | |||||||
236 | |||||||
237 | } elsif ($headings) { | ||||||
238 | 0 | $headingsdiv .= $self->q->template($headings)->process($self->headings); | |||||
239 | |||||||
240 | } else { | ||||||
241 | 0 | $tmplvars->{$headingItemVar.$_} = $recset->label($_) for $recset->visibleFields; | |||||
242 | 0 | 0 | $tmplvars->{$headingItemVar."DELETE"} = $deletename unless $nodelete; | ||||
243 | } | ||||||
244 | |||||||
245 | 0 | my $bodyRowLoop = []; | |||||
246 | |||||||
247 | 0 | my $newrecordindex = 0; | |||||
248 | |||||||
249 | 0 | for (my $i = 0; $i < @{$recset->data}; $i++) { | |||||
0 | |||||||
250 | 0 | my $row = {}; | |||||
251 | 0 | my $rownum = $i + 1; | |||||
252 | 0 | my $ID = $recset->data->[$i]->{$recset->primarykey}; | |||||
253 | |||||||
254 | 0 | $row->{$bodyRowName} = $widgetID."Row".$rownum; | |||||
255 | 0 | 0 | $row->{$deleteID} = "$widgetID-$rownum" unless $nodelete; | ||||
256 | 0 | 0 | $row->{$deleteFlag} = 1 unless $nodelete; | ||||
257 | 0 | $row->{PRIMARYKEY} = $ID; | |||||
258 | |||||||
259 | 0 | foreach my $fieldname (keys %{$recset->data->[$i]}) { | |||||
0 | |||||||
260 | 0 | 0 | if ($recset->handle($fieldname)) { #if we've been given a handle for this field, set it | ||||
261 | 0 | ${$recset->handle($fieldname)} = $recset->data->[$i]->{$fieldname}; | |||||
0 | |||||||
262 | } | ||||||
263 | |||||||
264 | 0 | 0 | unless ($recset->hidden($fieldname)) { #don't add hidden fields | ||||
265 | 0 | my $webname = "$widgetID-:UPDATE:".$fieldname."-:-".$ID."::".$rownum; | |||||
266 | 0 | my $webID = "$widgetID-".$fieldname."--".$rownum; | |||||
267 | |||||||
268 | 0 | $row->{"NAME.".$fieldname} = $webname; | |||||
269 | 0 | $row->{"ID.".$fieldname} = $webID; | |||||
270 | 0 | 0 | $row->{'LABEL.'.$fieldname} = $recset->label($fieldname) unless $recset->noLabel($fieldname); | ||||
271 | |||||||
272 | 0 | my $value; | |||||
273 | |||||||
274 | 0 | 0 | if ($recset->outputMask($fieldname)) { | ||||
275 | 0 | $value = sprintf $recset->outputMask($fieldname), $recset->data->[$i]->{$fieldname}; | |||||
276 | } else { | ||||||
277 | 0 | $value= $recset->data->[$i]->{$fieldname}; | |||||
278 | } | ||||||
279 | |||||||
280 | 0 | 0 | if ($recset->webcontrol($fieldname)) { | ||||
281 | 0 | my $webcontrol = $recset->webcontrol($fieldname); | |||||
282 | 0 | my $type = $webcontrol->{type}; | |||||
283 | |||||||
284 | 0 | 0 | if ($type eq 'select') { #build variables for web controls | ||||
0 | |||||||
0 | |||||||
285 | 0 | $row->{"LOOP.".$fieldname} = $self->buildSelect($fieldname, $webcontrol, $value); | |||||
286 | } elsif ($type eq 'checkbox') { | ||||||
287 | 0 | ($row->{"VALUE.".$fieldname}, $row->{"CHECKED.".$fieldname}) = $self->buildCheckbox($fieldname, $webcontrol, $value); | |||||
288 | } elsif ($type eq 'radio') { | ||||||
289 | 0 | $row->{"LOOP.".$fieldname} = $self->buildRadio($fieldname, $webcontrol, $webname, $webID, $value ); | |||||
290 | } else { | ||||||
291 | 0 | $row->{"VALUE.".$fieldname} = $value; | |||||
292 | } | ||||||
293 | |||||||
294 | } else { | ||||||
295 | 0 | $row->{"VALUE.".$fieldname} = $value; | |||||
296 | |||||||
297 | } | ||||||
298 | |||||||
299 | 0 | 0 | if ($recset->validator($fieldname)) { | ||||
300 | 0 | my $rule = $recset->validator($fieldname); | |||||
301 | 0 | $rule->{label} = $recset->label($fieldname); | |||||
302 | 0 | $validator->{"$widgetID-".$fieldname."--".$rownum} = $rule; | |||||
303 | } | ||||||
304 | } | ||||||
305 | } | ||||||
306 | |||||||
307 | 0 | $newrecordindex = $rownum; | |||||
308 | 0 | push @$bodyRowLoop, $row; | |||||
309 | } | ||||||
310 | |||||||
311 | #blank record for inserts | ||||||
312 | |||||||
313 | 0 | my $defaultstring = join ",", sort keys %$defaults; | |||||
314 | 0 | my $blankrow = {}; | |||||
315 | 0 | $newrecordindex++; | |||||
316 | 0 | $blankrow->{$bodyRowName} = $widgetID."Row".$newrecordindex; | |||||
317 | 0 | 0 | $blankrow->{$deleteID} = "$widgetID-$newrecordindex" unless $nodelete; | ||||
318 | 0 | 0 | $blankrow->{$deleteFlag} = 1 unless $nodelete; | ||||
319 | 0 | foreach my $field ( @{$recset->visibleFields}) { | |||||
0 | |||||||
320 | 0 | my $webname = "$widgetID-".$field."--".$newrecordindex; | |||||
321 | 0 | my $webID = "$widgetID-".$field."--".$newrecordindex; | |||||
322 | |||||||
323 | 0 | $blankrow->{"NAME.".$field} = $webname; | |||||
324 | 0 | $blankrow->{"ID.".$field} = $webID; | |||||
325 | 0 | 0 | $blankrow->{'LABEL.'.$field} = $recset->label($field) unless $recset->noLabel($field); | ||||
326 | |||||||
327 | 0 | 0 | if ($recset->webcontrol($field)) { | ||||
328 | 0 | my $webcontrol = $recset->webcontrol($field); | |||||
329 | 0 | my $type = $webcontrol->{type}; | |||||
330 | |||||||
331 | 0 | 0 | if ($type eq 'select') { #build variables for web dropdowns | ||||
0 | |||||||
0 | |||||||
332 | 0 | $blankrow->{"LOOP.".$field} = $self->buildSelect($field, $webcontrol); | |||||
333 | |||||||
334 | } elsif ($type eq 'checkbox') { | ||||||
335 | 0 | ($blankrow->{"VALUE.".$field}, $blankrow->{"CHECKED.".$field}) = $self->buildCheckbox($field, $webcontrol); | |||||
336 | |||||||
337 | } elsif ($type eq 'radio') { | ||||||
338 | 0 | $blankrow->{"LOOP.".$field} = $self->buildRadio($field, $webcontrol, $webname, $webID); | |||||
339 | |||||||
340 | } else { | ||||||
341 | 0 | $blankrow->{"VALUE.".$field} = ''; | |||||
342 | |||||||
343 | } | ||||||
344 | |||||||
345 | } else { | ||||||
346 | 0 | $blankrow->{"VALUE.".$field} = ''; | |||||
347 | } | ||||||
348 | |||||||
349 | 0 | 0 | if ($recset->validator($field)) { | ||||
350 | 0 | my $rule = $recset->validator($field); | |||||
351 | 0 | $rule->{label} = $recset->label($field); | |||||
352 | 0 | $validator->{"$widgetID-".$field."--".$newrecordindex} = $rule; | |||||
353 | } | ||||||
354 | } | ||||||
355 | |||||||
356 | 0 | push @$bodyRowLoop, $blankrow; | |||||
357 | |||||||
358 | 0 | $self->{_validator} = $validator; | |||||
359 | |||||||
360 | 0 | $tmplvars->{$tableCaptionVar} = $tableCaptionValue; | |||||
361 | 0 | $tmplvars->{$bodyRowLoopVar} = $bodyRowLoop; | |||||
362 | |||||||
363 | } elsif ($type eq 'single') { | ||||||
364 | 0 | 0 | if (scalar @{$recset->data} > 1) { | ||||
0 | 0 | ||||||
0 | |||||||
365 | 0 | 0 | unless ($vars->{multiType} eq 'sequential') { #there are configurations where we don't want to display multi | ||||
366 | 0 | $self->{_multi} = 1; | |||||
367 | 0 | return $self->displaySingleList(%args); | |||||
368 | } | ||||||
369 | } elsif (scalar @{$recset->data} == 0) { | ||||||
370 | 0 | $self->{_empty} = 1; | |||||
371 | } | ||||||
372 | |||||||
373 | 0 | my $recordnum = 0; #which record of a multiple return to display, if we're not doing displaySingleList | |||||
374 | |||||||
375 | 0 | foreach my $field (keys %{$args{vars}}) { | |||||
0 | |||||||
376 | 0 | 0 | if ($field eq '-recordnum') { | ||||
0 | |||||||
377 | 0 | $recordnum = $args{vars}->{$field}; | |||||
378 | } elsif ($args{vars}->{$field}->{handle}) { | ||||||
379 | 0 | my $ref = $args{vars}->{$field}->{handle}; | |||||
380 | 0 | $$ref = $recset->data->[$recordnum]->{$field}; | |||||
381 | } | ||||||
382 | } | ||||||
383 | |||||||
384 | 0 | 0 | my $ID = $recset->data->[$recordnum]->{$recset->primarykey} || ''; | ||||
385 | |||||||
386 | 0 | 0 | if ($args{mode} eq 'blank') { | ||||
387 | 0 | foreach my $fieldname (keys %{$recset->fieldlist}) { | |||||
0 | |||||||
388 | 0 | 0 | unless ($recset->hidden($fieldname)) { | ||||
389 | 0 | my $webname = "$widgetID-:INSERT:".$fieldname."--"; | |||||
390 | 0 | my $webID = "$widgetID-".$fieldname; | |||||
391 | |||||||
392 | 0 | 0 | $tmplvars->{'LABEL.'.$fieldname} = $recset->label($fieldname) unless $recset->noLabel($fieldname); | ||||
393 | 0 | $tmplvars->{'NAME.'.$fieldname} = $webname; | |||||
394 | 0 | $tmplvars->{"ID.".$fieldname} = $webID; | |||||
395 | |||||||
396 | 0 | 0 | if ($recset->webcontrol($fieldname)) { | ||||
397 | 0 | my $webcontrol = $recset->webcontrol($fieldname); | |||||
398 | 0 | my $type = $webcontrol->{type}; | |||||
399 | |||||||
400 | 0 | 0 | if ($type eq 'select') { #build variables for web dropdowns | ||||
0 | |||||||
0 | |||||||
401 | 0 | $tmplvars->{"LOOP.".$fieldname} = $self->buildSelect($fieldname, $webcontrol); | |||||
402 | } elsif ($type eq 'checkbox') { | ||||||
403 | 0 | ($tmplvars->{"VALUE.".$fieldname}, $tmplvars->{"CHECKED.".$fieldname}) = $self->buildCheckbox($fieldname, $webcontrol); | |||||
404 | } elsif ($type eq 'radio') { | ||||||
405 | 0 | $tmplvars->{"LOOP.".$fieldname} = $self->buildRadio($fieldname, $webcontrol, $webname, $webID); | |||||
406 | } else { | ||||||
407 | |||||||
408 | } | ||||||
409 | } | ||||||
410 | } | ||||||
411 | } | ||||||
412 | } else { | ||||||
413 | 0 | foreach my $fieldname (keys %{$recset->fieldlist}) { | |||||
0 | |||||||
414 | 0 | my $value; | |||||
415 | |||||||
416 | 0 | 0 | if ($recset->outputMask($fieldname)) { | ||||
417 | 0 | $value = sprintf $recset->outputMask($fieldname), $recset->data->[$recordnum]->{$fieldname}; | |||||
418 | } else { | ||||||
419 | 0 | $value = $recset->data->[$recordnum]->{$fieldname}; | |||||
420 | } | ||||||
421 | |||||||
422 | 0 | 0 | if ($recset->handle($fieldname)) { #if we've been given a handle for this field, set it | ||||
423 | 0 | ${$recset->handle($fieldname)} = $recset->data->[$recordnum]->{$fieldname}; | |||||
0 | |||||||
424 | } | ||||||
425 | |||||||
426 | 0 | 0 | unless ($recset->hidden($fieldname)) { | ||||
427 | 0 | my $webname = "$widgetID-:UPDATE:".$fieldname."-:-".$ID; | |||||
428 | 0 | my $webID = "$widgetID-".$fieldname; | |||||
429 | |||||||
430 | 0 | 0 | $tmplvars->{'LABEL.'.$fieldname} = $recset->label($fieldname) unless $recset->noLabel($fieldname); | ||||
431 | 0 | $tmplvars->{'NAME.'.$fieldname} = $webname; | |||||
432 | 0 | $tmplvars->{"ID.".$fieldname} = $webID; | |||||
433 | 0 | $tmplvars->{PRIMARYKEY} = $ID; | |||||
434 | |||||||
435 | 0 | 0 | if ($recset->webcontrol($fieldname)) { | ||||
436 | 0 | my $webcontrol = $recset->webcontrol($fieldname); | |||||
437 | 0 | my $type = $webcontrol->{type}; | |||||
438 | |||||||
439 | 0 | 0 | if ($type eq 'select') { #build variables for web dropdowns | ||||
0 | |||||||
0 | |||||||
440 | 0 | $tmplvars->{"LOOP.".$fieldname} = $self->buildSelect($fieldname, $webcontrol, $value); | |||||
441 | } elsif ($type eq 'checkbox') { | ||||||
442 | 0 | ($tmplvars->{"VALUE.".$fieldname}, $tmplvars->{"CHECKED.".$fieldname}) = $self->buildCheckbox($fieldname, $webcontrol, $value); | |||||
443 | } elsif ($type eq 'radio') { | ||||||
444 | 0 | $tmplvars->{"LOOP.".$fieldname} = $self->buildRadio($fieldname, $webcontrol, $webname, $webID, $value ); | |||||
445 | } else { | ||||||
446 | 0 | $tmplvars->{"VALUE.".$fieldname} = $value; | |||||
447 | |||||||
448 | } | ||||||
449 | } else { | ||||||
450 | 0 | $tmplvars->{"VALUE.".$fieldname} = $value; | |||||
451 | } | ||||||
452 | } | ||||||
453 | } | ||||||
454 | } | ||||||
455 | } | ||||||
456 | |||||||
457 | 0 | foreach my $extra (keys %{$self->vars->{extravars}} ) { | |||||
0 | |||||||
458 | 0 | my $type = $self->vars->{extravars}->{$extra}->{type}; | |||||
459 | 0 | 0 | if (ref $self->vars->{extravars}->{$extra}->{value} ) { | ||||
460 | 0 | $tmplvars->{"NAME.$extra"} = "$widgetID-$extra"; | |||||
461 | 0 | $tmplvars->{"ID.$extra"} = "$widgetID-$extra"; | |||||
462 | 0 | $tmplvars->{"VALUE.$extra"} = ${$self->vars->{extravars}->{$extra}->{value}}; | |||||
0 | |||||||
463 | } else { | ||||||
464 | 0 | $tmplvars->{"NAME.$extra"} = "$widgetID-$extra"; | |||||
465 | 0 | $tmplvars->{"ID.$extra"} = "$widgetID-$extra"; | |||||
466 | 0 | $tmplvars->{"VALUE.$extra"} = $self->vars->{extravars}->{$extra}->{value}; | |||||
467 | } | ||||||
468 | } | ||||||
469 | |||||||
470 | 0 | 0 | my $divopen = $args{nodiv} ? '' : " "; |
||||
471 | 0 | 0 | my $divclose = $args{nodiv} ? '' : ""; | ||||
472 | 0 | $validator = $self->q->jswrap("var ".$self->widgetID ."Validator = ".to_json($self->validator).";"); | |||||
473 | 0 | my $primarykey = $self->recordset->primarykey; | |||||
474 | |||||||
475 | 0 | my $searchObjectName = $self->widgetID.'SearchObject'; | |||||
476 | |||||||
477 | 0 | my $searchObject = to_json([map {$widgetID."-".$_} @{$recset->visibleFields}]); | |||||
0 | |||||||
0 | |||||||
478 | |||||||
479 | 0 | my $jsvalidatorname = $widgetID."Validator"; | |||||
480 | 0 | my $jscontrollername = $widgetID."Controller"; | |||||
481 | 0 | my $jsmultisearchname = $widgetID."MultiSearchPrimaryKey"; | |||||
482 | |||||||
483 | 0 | my $javascript = < | |||||
484 | var $jscontrollername = new datasetController('$widgetID', $jsvalidatorname, '$containerID', $searchObject, '$flagcolor'); | ||||||
485 | var $jsmultisearchname = '$primarykey'; | ||||||
486 | END | ||||||
487 | |||||||
488 | 0 | 0 | if ($javascript) { | ||||
489 | 0 | 0 | $javascript = minify(input => $javascript) unless $self->q->config->noMinify; | ||||
490 | } | ||||||
491 | |||||||
492 | 0 | my $js = $self->q->jswrap($javascript); | |||||
493 | |||||||
494 | 0 | return $headingsdiv. | |||||
495 | $divopen. | ||||||
496 | $validator. | ||||||
497 | $js. | ||||||
498 | $formOpenTag. | ||||||
499 | $self->q->template($template)->process($tmplvars). | ||||||
500 | $formCloseTag. | ||||||
501 | $divclose; | ||||||
502 | } | ||||||
503 | |||||||
504 | #---------------------------------------------------------------------------------------- | ||||||
505 | sub display { | ||||||
506 | 0 | 0 | 1 | my $self = shift; | |||
507 | 0 | my %args = @_; | |||||
508 | |||||||
509 | 0 | my $preloadLookup = $self->preloadLookup; | |||||
510 | |||||||
511 | 0 | return $preloadLookup. | |||||
512 | $self->contents(%args); | ||||||
513 | } | ||||||
514 | |||||||
515 | #---------------------------------------------------------------------------------------- | ||||||
516 | sub displaySingleList { | ||||||
517 | 0 | 0 | 1 | my $self = shift; | |||
518 | 0 | my %args = @_; | |||||
519 | |||||||
520 | 0 | my $standalone = $self->vars->{standalone}; | |||||
521 | 0 | my $formOpenTag = ''; | |||||
522 | 0 | my $formCloseTag = ''; | |||||
523 | 0 | my $widgetID = $self->vars->{id}; | |||||
524 | 0 | my $recset = $self->recordset; | |||||
525 | 0 | my @fieldlist = $recset->multipleFieldList; | |||||
526 | 0 | my @labels = $recset->multipleFieldLabels; | |||||
527 | |||||||
528 | 0 | my $surroundingDivName = "DIV.MAIN"; | |||||
529 | 0 | my $tableCaptionVar = "CAPTION"; | |||||
530 | 0 | my $headingItemVar = "HEADING.ITEM."; | |||||
531 | 0 | my $bodyRowLoopVar = "ROW.LOOP"; | |||||
532 | 0 | my $bodyRowName = "ROW"; | |||||
533 | |||||||
534 | 0 | 0 | if ($standalone) { | ||||
535 | 0 | 0 | $formOpenTag = $self->vars->{formOpenTag} || $self->q->start_form({-method => 'post', -action => $self->q->url}); | ||||
536 | 0 | $formCloseTag = $self->q->end_form; | |||||
537 | } | ||||||
538 | |||||||
539 | 0 | my $bodyRowLoop = []; | |||||
540 | |||||||
541 | 0 | my $primarykey = $recset->primarykey; | |||||
542 | |||||||
543 | 0 | foreach my $record (@{$recset->data}) { | |||||
0 | |||||||
544 | 0 | my $row = {}; | |||||
545 | 0 | 0 | my $ID = $record->{$primarykey} || ''; | ||||
546 | |||||||
547 | 0 | foreach my $field (keys %{$record}) { | |||||
0 | |||||||
548 | 0 | 0 | if ($recset->multipleField($field)) { | ||||
549 | 0 | $row->{PRIMARYKEY} = $ID; | |||||
550 | |||||||
551 | 0 | 0 | if ($recset->webcontrol($field)) { | ||||
552 | 0 | my $webcontrol = $recset->webcontrol($field); | |||||
553 | 0 | my $type = $webcontrol->{type}; | |||||
554 | |||||||
555 | 0 | 0 | if ($type eq 'select') { #build variables for web dropdowns | ||||
0 | |||||||
0 | |||||||
556 | 0 | $row->{"VALUE.".$field} = "". | |||||
557 | $self->singleListSelect($field, $webcontrol, $record->{$field}). | ||||||
558 | ""; | ||||||
559 | |||||||
560 | } elsif ($type eq 'checkbox') { | ||||||
561 | 0 | $row->{"VALUE.".$field} = "". | |||||
562 | $self->singleListCheckbox($field, $webcontrol, $record->{$field}). | ||||||
563 | ""; | ||||||
564 | } elsif ($type eq 'radio') { | ||||||
565 | 0 | $row->{"VALUE.".$field} = "". | |||||
566 | $self->singleListRadio($field, $webcontrol, $record->{$field}). | ||||||
567 | ""; | ||||||
568 | } else { | ||||||
569 | 0 | $row->{"VALUE.".$field} = "".$record->{$field}.""; | |||||
570 | } | ||||||
571 | |||||||
572 | } else { | ||||||
573 | 0 | $row->{"VALUE.".$field} = "".$record->{$field}.""; | |||||
574 | |||||||
575 | } | ||||||
576 | } | ||||||
577 | } | ||||||
578 | |||||||
579 | 0 | push @$bodyRowLoop, $row; | |||||
580 | } | ||||||
581 | |||||||
582 | 0 | my $tmplvars = { | |||||
583 | $bodyRowLoopVar => $bodyRowLoop, | ||||||
584 | |||||||
585 | }; | ||||||
586 | |||||||
587 | 0 | $tmplvars->{$headingItemVar.$_} = $recset->label($_) for $recset->multipleFieldList; | |||||
588 | |||||||
589 | 0 | 0 | my $divopen = $args{nodiv} ? '' : " "; |
||||
590 | 0 | 0 | my $divclose = $args{nodiv} ? '' : ""; | ||||
591 | |||||||
592 | 0 | return $divopen. | |||||
593 | $formOpenTag. | ||||||
594 | $self->q->template($self->vars->{multipleTemplate})->process($tmplvars). | ||||||
595 | $formCloseTag. | ||||||
596 | $divclose; | ||||||
597 | } | ||||||
598 | |||||||
599 | #---------------------------------------------------------------------------------------- | ||||||
600 | sub empty { | ||||||
601 | 0 | 0 | 1 | my $self = shift; | |||
602 | |||||||
603 | 0 | return $self->{_empty}; | |||||
604 | } | ||||||
605 | |||||||
606 | #---------------------------------------------------------------------------------------- | ||||||
607 | sub headings { | ||||||
608 | 0 | 0 | 0 | my $self = shift; | |||
609 | |||||||
610 | 0 | return $self->{_headings}; | |||||
611 | } | ||||||
612 | |||||||
613 | #---------------------------------------------------------------------------------------- | ||||||
614 | sub multi { | ||||||
615 | 0 | 0 | 1 | my $self = shift; | |||
616 | |||||||
617 | 0 | return $self->{_multi}; | |||||
618 | } | ||||||
619 | |||||||
620 | #---------------------------------------------------------------------------------------- | ||||||
621 | sub new { | ||||||
622 | 0 | 0 | 1 | my $class = shift; | |||
623 | 0 | my $q = shift; | |||||
624 | 0 | my $vars = shift; | |||||
625 | |||||||
626 | 0 | 0 | unless (ref $vars->{recordset} eq 'CGI::Lazy::DB::RecordSet') { | ||||
627 | 0 | $vars->{recordset} = $q->db->recordset($vars->{recordset}); | |||||
628 | } | ||||||
629 | |||||||
630 | 0 | my $self = { | |||||
631 | _q => $q, | ||||||
632 | _vars => $vars, | ||||||
633 | _recordset => $vars->{recordset}, | ||||||
634 | _type => $vars->{type}, | ||||||
635 | _multiType => $vars->{multiType}, | ||||||
636 | _widgetID => $vars->{id}, | ||||||
637 | }; | ||||||
638 | |||||||
639 | 0 | bless $self, $class; | |||||
640 | |||||||
641 | # $q->util->debug->edump($self->recordset); | ||||||
642 | |||||||
643 | 0 | $self->{_headings} = $self->buildHeadings; | |||||
644 | |||||||
645 | 0 | $self->buildvalidator; | |||||
646 | |||||||
647 | 0 | return $self; | |||||
648 | } | ||||||
649 | |||||||
650 | #---------------------------------------------------------------------------------------- | ||||||
651 | sub searchResults { | ||||||
652 | 0 | 0 | 0 | my $self = shift; | |||
653 | 0 | my %args = @_; | |||||
654 | |||||||
655 | 0 | my $html = $self->rawContents(%args); | |||||
656 | |||||||
657 | 0 | my $outgoing = '{"validator" : '.$self->validator.', "html" : "'.$html.'"}'; | |||||
658 | |||||||
659 | 0 | return $outgoing; | |||||
660 | } | ||||||
661 | |||||||
662 | #---------------------------------------------------------------------------------------- | ||||||
663 | sub singleListCheckbox { | ||||||
664 | 0 | 0 | 0 | my $self = shift; | |||
665 | 0 | my $fieldname = shift; | |||||
666 | 0 | my $webcontrol = shift; | |||||
667 | 0 | my $value = shift; | |||||
668 | |||||||
669 | 0 | 0 | if ($webcontrol->{value}) { | ||||
0 | |||||||
670 | 0 | 0 | if ($value eq $webcontrol->{value}) { | ||||
671 | 0 | return 'yes'; | |||||
672 | } else { | ||||||
673 | 0 | return 'no'; | |||||
674 | } | ||||||
675 | |||||||
676 | } elsif ($webcontrol->{sql}) { | ||||||
677 | 0 | my ($query, @binds) = @{$webcontrol->{sql}}; | |||||
0 | |||||||
678 | 0 | my $lookupvalue = $self->q->db->get($query, @binds); | |||||
679 | |||||||
680 | 0 | 0 | if ($value eq $lookupvalue) { | ||||
681 | 0 | return 'yes'; | |||||
682 | } else { | ||||||
683 | 0 | return 'no'; | |||||
684 | } | ||||||
685 | } | ||||||
686 | } | ||||||
687 | |||||||
688 | #---------------------------------------------------------------------------------------- | ||||||
689 | sub singleListRadio { | ||||||
690 | 0 | 0 | 0 | my $self = shift; | |||
691 | 0 | my $fieldname = shift; | |||||
692 | 0 | my $webcontrol = shift; | |||||
693 | 0 | my $value = shift; | |||||
694 | |||||||
695 | 0 | my $list = []; | |||||
696 | 0 | my $vals = {}; | |||||
697 | 0 | tie %$vals, 'Tie::IxHash'; | |||||
698 | |||||||
699 | 0 | 0 | if ($webcontrol->{values} ) { | ||||
0 | |||||||
700 | |||||||
701 | 0 | 0 | if (ref $webcontrol->{values} eq 'HASH') { | ||||
0 | |||||||
702 | 0 | $vals = $webcontrol->{values}; | |||||
703 | } elsif (ref $webcontrol->{values} eq 'ARRAY') { | ||||||
704 | 0 | $vals->{$_} = $_ for @{$webcontrol->{values}}; | |||||
0 | |||||||
705 | } else { | ||||||
706 | 0 | return; | |||||
707 | } | ||||||
708 | |||||||
709 | |||||||
710 | } elsif ($webcontrol->{sql} ) { | ||||||
711 | 0 | my ($query, @binds) = @{$webcontrol->{sql}}; | |||||
0 | |||||||
712 | |||||||
713 | 0 | $vals->{$_->[0]} = $_->[1] for @{$self->q->db->getarray($query, @binds)}; | |||||
0 | |||||||
714 | |||||||
715 | } | ||||||
716 | |||||||
717 | 0 | foreach (sort keys %$vals) { | |||||
718 | 0 | 0 | if ($vals->{$_} eq $value) { | ||||
719 | 0 | return $_; | |||||
720 | |||||||
721 | } | ||||||
722 | } | ||||||
723 | |||||||
724 | } | ||||||
725 | |||||||
726 | #---------------------------------------------------------------------------------------- | ||||||
727 | sub singleListSelect { | ||||||
728 | 0 | 0 | 0 | my $self = shift; | |||
729 | 0 | my $fieldname = shift; | |||||
730 | 0 | my $webcontrol = shift; | |||||
731 | 0 | my $value = shift; | |||||
732 | |||||||
733 | 0 | my $list = []; | |||||
734 | |||||||
735 | 0 | my $vals = {}; | |||||
736 | 0 | tie %$vals, 'Tie::IxHash'; | |||||
737 | |||||||
738 | 0 | 0 | if ($webcontrol->{values} ) { | ||||
0 | |||||||
739 | 0 | 0 | if (ref $webcontrol->{values} eq 'HASH') { | ||||
0 | |||||||
740 | 0 | 0 | $vals->{''} = '' unless $webcontrol->{notNull}; | ||||
741 | 0 | $vals = $webcontrol->{values}; | |||||
742 | } elsif (ref $webcontrol->{values} eq 'ARRAY') { | ||||||
743 | 0 | 0 | $vals->{''} = '' unless $webcontrol->{notNull}; | ||||
744 | 0 | $vals->{$_} = $_ for @{$webcontrol->{values}}; | |||||
0 | |||||||
745 | } else { | ||||||
746 | 0 | return; | |||||
747 | } | ||||||
748 | |||||||
749 | |||||||
750 | } elsif ($webcontrol->{sql}) { | ||||||
751 | 0 | my ($query, @binds) = @{$webcontrol->{sql}}; | |||||
0 | |||||||
752 | 0 | 0 | $vals->{''} = '' unless $webcontrol->{notNull}; | ||||
753 | 0 | $vals->{$_->[0]} = $_->[1] for @{$self->q->db->getarray($query, @binds)}; | |||||
0 | |||||||
754 | |||||||
755 | } | ||||||
756 | |||||||
757 | 0 | foreach (keys %$vals) { | |||||
758 | 0 | 0 | if ($vals->{$_} eq $value) { | ||||
759 | # return $vals->{$_}; | ||||||
760 | 0 | return $_; | |||||
761 | } | ||||||
762 | } | ||||||
763 | } | ||||||
764 | |||||||
765 | #---------------------------------------------------------------------------------------- | ||||||
766 | sub type { | ||||||
767 | 0 | 0 | 0 | my $self = shift; | |||
768 | |||||||
769 | 0 | return $self->{_type}; | |||||
770 | } | ||||||
771 | |||||||
772 | #---------------------------------------------------------------------------------------- | ||||||
773 | sub vars { | ||||||
774 | 0 | 0 | 1 | my $self = shift; | |||
775 | |||||||
776 | 0 | return $self->{_vars}; | |||||
777 | |||||||
778 | } | ||||||
779 | |||||||
780 | 1 | ||||||
781 | |||||||
782 | __END__ |