| 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__ |