my @deltags = ();
my %counts = ();
my @errors = ();
+my $perBibResults = {};
+
+# Indexes of @errors that do not apply to a particular biblionumber.
+my @globalErrorIndexes = ();
sub ajax_auth_cgi ($) { # returns CGI object
- my $needed_flags = shift;
+ my $needed_flags = shift;
my %cookies = fetch CGI::Cookie;
my $input = CGI->new;
my $sessid = $cookies{'CGISESSID'}->value || $input->param('CGISESSID');
$debug and
print STDERR "($auth_status, $auth_sessid) = check_cookie_auth($sessid," . Dumper($needed_flags) . ")\n";
if ($auth_status ne "ok") {
- output_ajax_with_http_headers $input,
+ output_with_http_headers $input, undef,
"window.alert('Your CGI session cookie ($sessid) is not current. " .
- "Please refresh the page and try again.');\n";
+ "Please refresh the page and try again.');\n", 'js';
exit 0;
}
$debug and print STDERR "AJAX request: " . Dumper($input),
my $query = ($is_ajax) ? &ajax_auth_cgi({}) : CGI->new();
unless (C4::Context->preference('TagsEnabled')) {
push @errors, {+ tagsdisabled=>1 };
+ push @globalErrorIndexes, $#errors;
} else {
foreach ($query->param) {
if (/^newtag(.*)/) {
unless ($biblionumber =~ /^\d+$/) {
$debug and warn "$_ references non numerical biblionumber '$biblionumber'";
push @errors, {+'badparam' => $_ };
+ push @globalErrorIndexes, $#errors;
next;
}
$newtags{$biblionumber} = $query->param($_);
if ($add_op) {
unless ($loggedinuser) {
push @errors, {+'login' => 1 };
+ push @globalErrorIndexes, $#errors;
%newtags=(); # zero out any attempted additions
@deltags=(); # zero out any attempted deletions
}
if (scalar @newtags_keys) {
$scrubber = C4::Scrubber->new();
foreach my $biblionumber (@newtags_keys) {
+ my $bibResults = {adds=>0, errors=>[]};
my @values = split /[;,]/, $newtags{$biblionumber};
foreach (@values) {
s/^\s*(.+)\s*$/$1/;
unless ($clean_tag eq $_) {
if ($clean_tag =~ /\S/) {
push @errors, {scrubbed=>$clean_tag};
+ push @{$bibResults->{errors}}, {scrubbed=>$clean_tag};
} else {
push @errors, {scrubbed_all_bad=>1};
+ push @{$bibResults->{errors}}, {scrubbed_all_bad=>1};
next; # we don't add it if there's nothing left!
}
}
add_tag($biblionumber,$clean_tag,$loggedinuser) ;
if ($result) {
$counts{$biblionumber}++;
+ $bibResults->{adds}++;
} else {
push @errors, {failed_add_tag=>$clean_tag};
+ push @{$bibResults->{errors}}, {failed_add_tag=>$clean_tag};
$debug and warn "add_tag($biblionumber,$clean_tag,$loggedinuser...) returned bad result (" . (defined $result ? $result : 'UNDEF') .")";
}
}
+ $perBibResults->{$biblionumber} = $bibResults;
}
}
my $dels = 0;
my $sum = 0;
foreach (values %counts) {$sum += $_;}
my $js_reply = sprintf("response = {\n\tadded: %d,\n\tdeleted: %d,\n\terrors: %d",$sum,$dels,scalar @errors);
+
+ # If no add attempts were made, flag global errors.
+ if (@globalErrorIndexes) {
+ $js_reply .= ",\n\tglobal_errors: [";
+ my $first = 1;
+ foreach (@globalErrorIndexes) {
+ $js_reply .= "," unless $first;
+ $first = 0;
+ $js_reply .= "\n\t\t$_";
+ }
+ $js_reply .= "\n\t]";
+ }
+
my $err_string = '';
if (scalar @errors) {
$err_string = ",\n\talerts: ["; # open response_function
}
$err_string .= "\n\t]\n"; # close response_function
}
- output_ajax_with_http_headers($query, "$js_reply\n$err_string};");
+
+ # Add per-biblionumber results for use on results page
+ my $js_perbib = "";
+ for my $bib (keys %$perBibResults) {
+ my $bibResult = $perBibResults->{$bib};
+ my $js_bibres = ",\n\t$bib: {\n\t\tadded: $bibResult->{adds}";
+ $js_bibres .= ",\n\t\terrors: [";
+ my $i = 0;
+ foreach (@{$bibResult->{errors}}) {
+ $js_bibres .= "," if ($i);
+ my $key = (keys %$_)[0];
+ $js_bibres .= "\n\t\t\t KOHA.Tags.tag_message.$key(\"" . $_->{$key} . '")';
+ $i++;
+ }
+ $js_bibres .= "\n\t\t]\n\t}";
+ $js_perbib .= $js_bibres;
+ }
+
+ output_with_http_headers($query, undef, "$js_reply\n$err_string\n$js_perbib\n};", 'js');
exit;
}