View | Details | Raw Unified | Return to bug 23282
Collapse All | Expand All

(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchMod-edit.tt (-2 / +2 lines)
Lines 148-154 $(document).ready(function(){ Link Here
148
148
149
<p id="selections"><strong>Show/hide columns:</strong> <span class="selected"><input type="checkbox" checked="checked" id="showall"/><label for="showall">Show all columns</label></span> <span><input type="checkbox" id="hideall"/><label for="hideall">Hide all columns</label></span> 
149
<p id="selections"><strong>Show/hide columns:</strong> <span class="selected"><input type="checkbox" checked="checked" id="showall"/><label for="showall">Show all columns</label></span> <span><input type="checkbox" id="hideall"/><label for="hideall">Hide all columns</label></span> 
150
        [% FOREACH item_header_loo IN item_header_loop %]
150
        [% FOREACH item_header_loo IN item_header_loop %]
151
        <span class="selected"><input id="checkheader[% loop.count | html %]" type="checkbox" checked="checked" /> <label for="checkheader[% loop.count | html %]">[% item_header_loo.header_value | html %]</label> </span>
151
        <span class="selected"><input id="checkheader[% loop.count | html %]" type="checkbox" checked="checked" /> <label for="checkheader[% loop.count | html %]">[% item_header_loo.lib | html %]</label> </span>
152
        [% END %]
152
        [% END %]
153
</p>
153
</p>
154
        <table id="itemst">
154
        <table id="itemst">
Lines 158-164 $(document).ready(function(){ Link Here
158
        <th class="anti-the">Title</th>
158
        <th class="anti-the">Title</th>
159
        <th class="holds_count" title="Item holds / Total holds">Holds</th>
159
        <th class="holds_count" title="Item holds / Total holds">Holds</th>
160
        [% FOREACH item_header_loo IN item_header_loop %]
160
        [% FOREACH item_header_loo IN item_header_loop %]
161
        <th> [% item_header_loo.header_value | html %] </th>
161
        <th> [% item_header_loo.lib | html %] </th>
162
        [% END %] 
162
        [% END %] 
163
    </tr>
163
    </tr>
164
      </thead>
164
      </thead>
(-)a/tools/batchMod.pl (-203 / +211 lines)
Lines 99-104 my %cookies = parse CGI::Cookie($cookie); Link Here
99
my $sessionID = $cookies{'CGISESSID'}->value;
99
my $sessionID = $cookies{'CGISESSID'}->value;
100
100
101
101
102
103
104
# now, build the item form for entering a new item
105
my @loop_data =();
106
my $i=0;
107
my $branch_limit = C4::Context->userenv ? C4::Context->userenv->{"branch"} : "";
108
109
my $libraries = Koha::Libraries->search({}, { order_by => ['branchname'] })->unblessed;# build once ahead of time, instead of multiple times later.
110
111
# Adding a default choice, in case the user does not want to modify the branch
112
my $nochange_branch = { branchname => '', value => '', selected => 1 };
113
unshift (@$libraries, $nochange_branch);
114
115
my $pref_itemcallnumber = C4::Context->preference('itemcallnumber');
116
117
# Getting list of subfields to keep when restricted batchmod edit is enabled
118
my $subfieldsToAllowForBatchmod = C4::Context->preference('SubfieldsToAllowForRestrictedBatchmod');
119
my $allowAllSubfields = (
120
    not defined $subfieldsToAllowForBatchmod
121
      or $subfieldsToAllowForBatchmod eq q||
122
) ? 1 : 0;
123
my @subfieldsToAllow = split(/ /, $subfieldsToAllowForBatchmod);
124
125
our @item_subfields;
126
foreach my $tag (sort keys %{$tagslib}) {
127
    # loop through each subfield
128
    foreach my $subfield (sort keys %{$tagslib->{$tag}}) {
129
        next if IsMarcStructureInternal( $tagslib->{$tag}{$subfield} );
130
        next if (not $allowAllSubfields and $restrictededition && !grep { $tag . '$' . $subfield eq $_ } @subfieldsToAllow );
131
    	next if ($tagslib->{$tag}->{$subfield}->{'tab'} ne "10");
132
        # barcode and stocknumber are not meant to be batch-modified
133
    	next if $tagslib->{$tag}->{$subfield}->{'kohafield'} eq 'items.barcode';
134
    	next if $tagslib->{$tag}->{$subfield}->{'kohafield'} eq 'items.stocknumber';
135
	my %subfield_data;
136
137
    push @item_subfields, { subfield => $subfield, lib => $tagslib->{$tag}->{$subfield}->{lib} };
138
139
	my $index_subfield = int(rand(1000000)); 
140
	if ($subfield eq '@'){
141
	    $subfield_data{id} = "tag_".$tag."_subfield_00_".$index_subfield;
142
	} else {
143
	    $subfield_data{id} = "tag_".$tag."_subfield_".$subfield."_".$index_subfield;
144
	}
145
	$subfield_data{tag}        = $tag;
146
	$subfield_data{subfield}   = $subfield;
147
	$subfield_data{marc_lib}   ="<span id=\"error$i\" title=\"".$tagslib->{$tag}->{$subfield}->{lib}."\">".$tagslib->{$tag}->{$subfield}->{lib}."</span>";
148
	$subfield_data{mandatory}  = $tagslib->{$tag}->{$subfield}->{mandatory};
149
	$subfield_data{repeatable} = $tagslib->{$tag}->{$subfield}->{repeatable};
150
	my ($x,$value);
151
   if ( $use_default_values) {
152
	    $value = $tagslib->{$tag}->{$subfield}->{defaultvalue};
153
	    # get today date & replace YYYY, MM, DD if provided in the default value
154
            my $today = dt_from_string;
155
            my $year  = $today->year;
156
            my $month = $today->month;
157
            my $day   = $today->day;
158
            $value =~ s/YYYY/$year/g;
159
            $value =~ s/MM/$month/g;
160
            $value =~ s/DD/$day/g;
161
	}
162
	$subfield_data{visibility} = "display:none;" if (($tagslib->{$tag}->{$subfield}->{hidden} > 4) || ($tagslib->{$tag}->{$subfield}->{hidden} < -4));
163
    # testing branch value if IndependentBranches.
164
165
	if ( $tagslib->{$tag}->{$subfield}->{authorised_value} ) {
166
	my @authorised_values;
167
	my %authorised_lib;
168
	# builds list, depending on authorised value...
169
170
    if ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "branches" ) {
171
        foreach my $library (@$libraries) {
172
            push @authorised_values, $library->{branchcode};
173
            $authorised_lib{$library->{branchcode}} = $library->{branchname};
174
        }
175
        $value = "";
176
    }
177
    elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) {
178
        push @authorised_values, "";
179
        my $itemtypes = Koha::ItemTypes->search_with_localization;
180
        while ( my $itemtype = $itemtypes->next ) {
181
            push @authorised_values, $itemtype->itemtype;
182
            $authorised_lib{$itemtype->itemtype} = $itemtype->translated_description;
183
        }
184
        $value = "";
185
186
          #---- class_sources
187
      }
188
      elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "cn_source" ) {
189
          push @authorised_values, "" unless ( $tagslib->{$tag}->{$subfield}->{mandatory} );
190
            
191
          my $class_sources = GetClassSources();
192
          my $default_source = C4::Context->preference("DefaultClassificationSource");
193
          
194
          foreach my $class_source (sort keys %$class_sources) {
195
              next unless $class_sources->{$class_source}->{'used'} or
196
                          ($value and $class_source eq $value)      or
197
                          ($class_source eq $default_source);
198
              push @authorised_values, $class_source;
199
              $authorised_lib{$class_source} = $class_sources->{$class_source}->{'description'};
200
          }
201
		  $value = '';
202
203
          #---- "true" authorised value
204
      }
205
      else {
206
          push @authorised_values, ""; # unless ( $tagslib->{$tag}->{$subfield}->{mandatory} );
207
208
          my @avs = Koha::AuthorisedValues->search({ category => $tagslib->{$tag}->{$subfield}->{authorised_value}, branchcode => $branch_limit },{order_by=>'lib'});
209
          for my $av ( @avs ) {
210
              push @authorised_values, $av->authorised_value;
211
              $authorised_lib{$av->authorised_value} = $av->lib;
212
          }
213
          $value="";
214
      }
215
        $subfield_data{marc_value} = {
216
            type    => 'select',
217
            id      => "tag_".$tag."_subfield_".$subfield."_".$index_subfield,
218
            name    => "field_value",
219
            values  => \@authorised_values,
220
            labels  => \%authorised_lib,
221
            default => $value,
222
        };
223
    # it's a thesaurus / authority field
224
    }
225
    elsif ( $tagslib->{$tag}->{$subfield}->{authtypecode} ) {
226
        $subfield_data{marc_value} = {
227
            type         => 'text1',
228
            id           => $subfield_data{id},
229
            value        => $value,
230
            authtypecode => $tagslib->{$tag}->{$subfield}->{authtypecode},
231
        }
232
    }
233
    elsif ( $tagslib->{$tag}->{$subfield}->{value_builder} ) { # plugin
234
        require Koha::FrameworkPlugin;
235
        my $plugin = Koha::FrameworkPlugin->new( {
236
            name => $tagslib->{$tag}->{$subfield}->{'value_builder'},
237
            item_style => 1,
238
        });
239
        my $temp;
240
        my $pars= { dbh => $dbh, record => $temp, tagslib => $tagslib,
241
            id => $subfield_data{id}, tabloop => \@loop_data };
242
        $plugin->build( $pars );
243
        if( !$plugin->errstr ) {
244
            $subfield_data{marc_value} = {
245
                type       => 'text2',
246
                id         => $subfield_data{id},
247
                value      => $value,
248
                javascript => $plugin->javascript,
249
                noclick    => $plugin->noclick,
250
            };
251
        } else {
252
            warn $plugin->errstr;
253
            $subfield_data{marc_value} = { # supply default input form
254
                type       => 'text',
255
                id         => $subfield_data{id},
256
                value      => $value,
257
            };
258
        }
259
    }
260
    elsif ( $tag eq '' ) {       # it's an hidden field
261
            $subfield_data{marc_value} = {
262
                type       => 'hidden',
263
                id         => $subfield_data{id},
264
                value      => $value,
265
            };
266
    }
267
    elsif ( $tagslib->{$tag}->{$subfield}->{'hidden'} ) {   # FIXME: shouldn't input type be "hidden" ?
268
        $subfield_data{marc_value} = {
269
                type       => 'text',
270
                id         => $subfield_data{id},
271
                value      => $value,
272
        };
273
    }
274
    elsif ( length($value) > 100
275
            or (C4::Context->preference("marcflavour") eq "UNIMARC" and
276
                  300 <= $tag && $tag < 400 && $subfield eq 'a' )
277
            or (C4::Context->preference("marcflavour") eq "MARC21"  and
278
                  500 <= $tag && $tag < 600                     )
279
          ) {
280
        # oversize field (textarea)
281
        $subfield_data{marc_value} = {
282
                type       => 'textarea',
283
                id         => $subfield_data{id},
284
                value      => $value,
285
        };
286
    } else {
287
        # it's a standard field
288
        $subfield_data{marc_value} = {
289
                type       => 'text',
290
                id         => $subfield_data{id},
291
                value      => $value,
292
        };
293
    }
294
#   $subfield_data{marc_value}="<input type=\"text\" name=\"field_value\">";
295
    push (@loop_data, \%subfield_data);
296
    $i++
297
  }
298
} # -- End foreach tag
299
300
301
302
303
102
#--- ----------------------------------------------------------------------------
304
#--- ----------------------------------------------------------------------------
103
if ($op eq "action") {
305
if ($op eq "action") {
104
#-------------------------------------------------------------------------------
306
#-------------------------------------------------------------------------------
Lines 294-299 if ($op eq "show"){ Link Here
294
        }
496
        }
295
    }
497
    }
296
498
499
500
501
502
297
    # Flag to tell the template there are valid results, hidden or not
503
    # Flag to tell the template there are valid results, hidden or not
298
    if(scalar(@itemnumbers) > 0){ $template->param("itemresults" => 1); }
504
    if(scalar(@itemnumbers) > 0){ $template->param("itemresults" => 1); }
299
    # Only display the items if there are no more than pref MaxItemsToProcessForBatchMod or MaxItemsToDisplayForBatchDel
505
    # Only display the items if there are no more than pref MaxItemsToProcessForBatchMod or MaxItemsToDisplayForBatchDel
Lines 308-507 if ($op eq "show"){ Link Here
308
        # Even if we do not display the items, we need the itemnumbers
514
        # Even if we do not display the items, we need the itemnumbers
309
        $template->param(itemnumbers_array => \@itemnumbers);
515
        $template->param(itemnumbers_array => \@itemnumbers);
310
    }
516
    }
311
# now, build the item form for entering a new item
312
my @loop_data =();
313
my $i=0;
314
my $branch_limit = C4::Context->userenv ? C4::Context->userenv->{"branch"} : "";
315
316
my $libraries = Koha::Libraries->search({}, { order_by => ['branchname'] })->unblessed;# build once ahead of time, instead of multiple times later.
317
318
# Adding a default choice, in case the user does not want to modify the branch
319
my $nochange_branch = { branchname => '', value => '', selected => 1 };
320
unshift (@$libraries, $nochange_branch);
321
322
my $pref_itemcallnumber = C4::Context->preference('itemcallnumber');
323
324
# Getting list of subfields to keep when restricted batchmod edit is enabled
325
my $subfieldsToAllowForBatchmod = C4::Context->preference('SubfieldsToAllowForRestrictedBatchmod');
326
my $allowAllSubfields = (
327
    not defined $subfieldsToAllowForBatchmod
328
      or $subfieldsToAllowForBatchmod eq q||
329
) ? 1 : 0;
330
my @subfieldsToAllow = split(/ /, $subfieldsToAllowForBatchmod);
331
332
foreach my $tag (sort keys %{$tagslib}) {
333
    # loop through each subfield
334
    foreach my $subfield (sort keys %{$tagslib->{$tag}}) {
335
        next if IsMarcStructureInternal( $tagslib->{$tag}{$subfield} );
336
        next if (not $allowAllSubfields and $restrictededition && !grep { $tag . '$' . $subfield eq $_ } @subfieldsToAllow );
337
    	next if ($tagslib->{$tag}->{$subfield}->{'tab'} ne "10");
338
        # barcode and stocknumber are not meant to be batch-modified
339
    	next if $tagslib->{$tag}->{$subfield}->{'kohafield'} eq 'items.barcode';
340
    	next if $tagslib->{$tag}->{$subfield}->{'kohafield'} eq 'items.stocknumber';
341
	my %subfield_data;
342
 
343
	my $index_subfield = int(rand(1000000)); 
344
	if ($subfield eq '@'){
345
	    $subfield_data{id} = "tag_".$tag."_subfield_00_".$index_subfield;
346
	} else {
347
	    $subfield_data{id} = "tag_".$tag."_subfield_".$subfield."_".$index_subfield;
348
	}
349
	$subfield_data{tag}        = $tag;
350
	$subfield_data{subfield}   = $subfield;
351
	$subfield_data{marc_lib}   ="<span id=\"error$i\" title=\"".$tagslib->{$tag}->{$subfield}->{lib}."\">".$tagslib->{$tag}->{$subfield}->{lib}."</span>";
352
	$subfield_data{mandatory}  = $tagslib->{$tag}->{$subfield}->{mandatory};
353
	$subfield_data{repeatable} = $tagslib->{$tag}->{$subfield}->{repeatable};
354
	my ($x,$value);
355
   if ( $use_default_values) {
356
	    $value = $tagslib->{$tag}->{$subfield}->{defaultvalue};
357
	    # get today date & replace YYYY, MM, DD if provided in the default value
358
            my $today = dt_from_string;
359
            my $year  = $today->year;
360
            my $month = $today->month;
361
            my $day   = $today->day;
362
            $value =~ s/YYYY/$year/g;
363
            $value =~ s/MM/$month/g;
364
            $value =~ s/DD/$day/g;
365
	}
366
	$subfield_data{visibility} = "display:none;" if (($tagslib->{$tag}->{$subfield}->{hidden} > 4) || ($tagslib->{$tag}->{$subfield}->{hidden} < -4));
367
    # testing branch value if IndependentBranches.
368
369
	if ( $tagslib->{$tag}->{$subfield}->{authorised_value} ) {
370
	my @authorised_values;
371
	my %authorised_lib;
372
	# builds list, depending on authorised value...
373
374
    if ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "branches" ) {
375
        foreach my $library (@$libraries) {
376
            push @authorised_values, $library->{branchcode};
377
            $authorised_lib{$library->{branchcode}} = $library->{branchname};
378
        }
379
        $value = "";
380
    }
381
    elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) {
382
        push @authorised_values, "";
383
        my $itemtypes = Koha::ItemTypes->search_with_localization;
384
        while ( my $itemtype = $itemtypes->next ) {
385
            push @authorised_values, $itemtype->itemtype;
386
            $authorised_lib{$itemtype->itemtype} = $itemtype->translated_description;
387
        }
388
        $value = "";
389
390
          #---- class_sources
391
      }
392
      elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "cn_source" ) {
393
          push @authorised_values, "" unless ( $tagslib->{$tag}->{$subfield}->{mandatory} );
394
            
395
          my $class_sources = GetClassSources();
396
          my $default_source = C4::Context->preference("DefaultClassificationSource");
397
          
398
          foreach my $class_source (sort keys %$class_sources) {
399
              next unless $class_sources->{$class_source}->{'used'} or
400
                          ($value and $class_source eq $value)      or
401
                          ($class_source eq $default_source);
402
              push @authorised_values, $class_source;
403
              $authorised_lib{$class_source} = $class_sources->{$class_source}->{'description'};
404
          }
405
		  $value = '';
406
407
          #---- "true" authorised value
408
      }
409
      else {
410
          push @authorised_values, ""; # unless ( $tagslib->{$tag}->{$subfield}->{mandatory} );
411
412
          my @avs = Koha::AuthorisedValues->search({ category => $tagslib->{$tag}->{$subfield}->{authorised_value}, branchcode => $branch_limit },{order_by=>'lib'});
413
          for my $av ( @avs ) {
414
              push @authorised_values, $av->authorised_value;
415
              $authorised_lib{$av->authorised_value} = $av->lib;
416
          }
417
          $value="";
418
      }
419
        $subfield_data{marc_value} = {
420
            type    => 'select',
421
            id      => "tag_".$tag."_subfield_".$subfield."_".$index_subfield,
422
            name    => "field_value",
423
            values  => \@authorised_values,
424
            labels  => \%authorised_lib,
425
            default => $value,
426
        };
427
    # it's a thesaurus / authority field
428
    }
429
    elsif ( $tagslib->{$tag}->{$subfield}->{authtypecode} ) {
430
        $subfield_data{marc_value} = {
431
            type         => 'text1',
432
            id           => $subfield_data{id},
433
            value        => $value,
434
            authtypecode => $tagslib->{$tag}->{$subfield}->{authtypecode},
435
        }
436
    }
437
    elsif ( $tagslib->{$tag}->{$subfield}->{value_builder} ) { # plugin
438
        require Koha::FrameworkPlugin;
439
        my $plugin = Koha::FrameworkPlugin->new( {
440
            name => $tagslib->{$tag}->{$subfield}->{'value_builder'},
441
            item_style => 1,
442
        });
443
        my $temp;
444
        my $pars= { dbh => $dbh, record => $temp, tagslib => $tagslib,
445
            id => $subfield_data{id}, tabloop => \@loop_data };
446
        $plugin->build( $pars );
447
        if( !$plugin->errstr ) {
448
            $subfield_data{marc_value} = {
449
                type       => 'text2',
450
                id         => $subfield_data{id},
451
                value      => $value,
452
                javascript => $plugin->javascript,
453
                noclick    => $plugin->noclick,
454
            };
455
        } else {
456
            warn $plugin->errstr;
457
            $subfield_data{marc_value} = { # supply default input form
458
                type       => 'text',
459
                id         => $subfield_data{id},
460
                value      => $value,
461
            };
462
        }
463
    }
464
    elsif ( $tag eq '' ) {       # it's an hidden field
465
            $subfield_data{marc_value} = {
466
                type       => 'hidden',
467
                id         => $subfield_data{id},
468
                value      => $value,
469
            };
470
    }
471
    elsif ( $tagslib->{$tag}->{$subfield}->{'hidden'} ) {   # FIXME: shouldn't input type be "hidden" ?
472
        $subfield_data{marc_value} = {
473
                type       => 'text',
474
                id         => $subfield_data{id},
475
                value      => $value,
476
        };
477
    }
478
    elsif ( length($value) > 100
479
            or (C4::Context->preference("marcflavour") eq "UNIMARC" and
480
                  300 <= $tag && $tag < 400 && $subfield eq 'a' )
481
            or (C4::Context->preference("marcflavour") eq "MARC21"  and
482
                  500 <= $tag && $tag < 600                     )
483
          ) {
484
        # oversize field (textarea)
485
        $subfield_data{marc_value} = {
486
                type       => 'textarea',
487
                id         => $subfield_data{id},
488
                value      => $value,
489
        };
490
    } else {
491
        # it's a standard field
492
        $subfield_data{marc_value} = {
493
                type       => 'text',
494
                id         => $subfield_data{id},
495
                value      => $value,
496
        };
497
    }
498
#   $subfield_data{marc_value}="<input type=\"text\" name=\"field_value\">";
499
    push (@loop_data, \%subfield_data);
500
    $i++
501
  }
502
} # -- End foreach tag
503
504
505
517
506
    # what's the next op ? it's what we are not in : an add if we're editing, otherwise, and edit.
518
    # what's the next op ? it's what we are not in : an add if we're editing, otherwise, and edit.
507
    $template->param(
519
    $template->param(
Lines 573-584 sub BuildItemsData{ Link Here
573
							&& $tag        ne $itemtagfield 
585
							&& $tag        ne $itemtagfield 
574
							&& $subfcode   ne $itemtagsubfield);
586
							&& $subfcode   ne $itemtagsubfield);
575
587
576
					$witness{$subfcode} = $tagslib->{$tag}->{$subfcode}->{lib} if ($tagslib->{$tag}->{$subfcode}->{tab}  eq 10);
588
                    $witness{$subfcode} = $tagslib->{$tag}->{$subfcode}->{lib};
577
					if ($tagslib->{$tag}->{$subfcode}->{tab}  eq 10) {
589
                    $this_row{$subfcode} = GetAuthorisedValueDesc( $tag, $subfcode, $subfvalue, '', $tagslib ) || $subfvalue;
578
						$this_row{$subfcode}=GetAuthorisedValueDesc( $tag,
579
									$subfcode, $subfvalue, '', $tagslib) 
580
									|| $subfvalue;
581
					}
582
590
583
					$this_row{itemnumber} = $subfvalue if ($tag eq $itemtagfield && $subfcode eq $itemtagsubfield);
591
					$this_row{itemnumber} = $subfvalue if ($tag eq $itemtagfield && $subfcode eq $itemtagsubfield);
584
				}
592
				}
Lines 606-612 sub BuildItemsData{ Link Here
606
		my @witnesscodessorted=sort keys %witness;
614
		my @witnesscodessorted=sort keys %witness;
607
		for my $row ( @big_array ) {
615
		for my $row ( @big_array ) {
608
			my %row_data;
616
			my %row_data;
609
			my @item_fields = map +{ field => $_ || '' }, @$row{ @witnesscodessorted };
617
            my @item_fields = map +{ field => $_ || '' }, @$row{ map { $_->{subfield} } @item_subfields };
618
610
			$row_data{item_value} = [ @item_fields ];
619
			$row_data{item_value} = [ @item_fields ];
611
			$row_data{itemnumber} = $row->{itemnumber};
620
			$row_data{itemnumber} = $row->{itemnumber};
612
			#reporting this_row values
621
			#reporting this_row values
Lines 622-628 sub BuildItemsData{ Link Here
622
      $row_data{onloan} = $is_on_loan ? 1 : 0;
631
      $row_data{onloan} = $is_on_loan ? 1 : 0;
623
			push(@item_value_loop,\%row_data);
632
			push(@item_value_loop,\%row_data);
624
		}
633
		}
625
		my @header_loop=map { { header_value=> $witness{$_}} } @witnesscodessorted;
634
        my @header_loop = @item_subfields;
626
635
627
	return { item_loop        => \@item_value_loop, item_header_loop => \@header_loop };
636
	return { item_loop        => \@item_value_loop, item_header_loop => \@header_loop };
628
}
637
}
629
- 

Return to bug 23282