opac-shevles - fix for CSS alternating highlight lines
[koha.git] / opac / opac-shelves.pl
1 #!/usr/bin/perl
2
3 # Copyright 2000-2002 Katipo Communications
4 #
5 # This file is part of Koha.
6 #
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 2 of the License, or (at your option) any later
10 # version.
11 #
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License along with
17 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
18 # Suite 330, Boston, MA  02111-1307 USA
19
20
21 =head1 NAME
22
23     opac-shelves.pl
24
25 =head1 DESCRIPTION
26
27     this script is used to script to provide virtualshelf management
28
29 =head1 CGI PARAMETERS
30
31 =over 4
32
33 =item C<modifyshelfcontents>
34
35     if this script has to modify the shelf content.
36
37 =item C<shelfnumber>
38
39     to know on which shelf this script has to work.
40
41 =item C<addbarcode>
42
43 =item C<op>
44
45     op can equal the following values:
46         * 'modifsave' to save changes on the shelves
47         * 'modif' to change the template to allow modification of the shelves.
48
49 =item C<viewshelf>
50
51     to load the template with 'viewshelves param' which allows reading the shelves information.
52
53 =item C<shelves>
54
55     if == 1, then call the function shelves to add or delete a shelf.
56
57 =item C<addshelf>
58
59     if the param shelves == 1, then addshelf must be equals to the name of the shelf to add.
60
61 =back
62
63 =cut
64
65 use strict;
66 use warnings;
67 use CGI;
68 use C4::Output;
69 use C4::VirtualShelves;
70 use C4::Circulation;
71 use C4::Auth;
72 use C4::Output;
73 use C4::Biblio;
74
75 use vars qw($debug);
76
77 BEGIN { 
78         $debug = $ENV{DEBUG} || 0;
79 }
80
81 my $query = new CGI;
82
83 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
84     {
85         template_name   => "opac-shelves.tmpl",
86         query           => $query,
87         type            => "opac",
88         authnotrequired => 1,
89     }
90 );
91
92 if ( $query->param('modifyshelfcontents') ) {
93     my $shelfnumber = $query->param('viewshelf');
94     my $barcode     = $query->param('addbarcode');
95     my ($item) = GetItemnumberFromBarcode($barcode);
96     my ($biblio) = GetBiblioFromItemNumber($item->{'itemnumber'});
97     if ( ShelfPossibleAction( $loggedinuser, $shelfnumber, 'manage' ) ) {
98         AddToShelf( $biblio->{'biblionumber'}, $shelfnumber );
99         foreach ( $query->param ) {
100             /REM-(\d+)/ or next;
101                         $debug and warn "SHELVES: user $loggedinuser removing item $1 from shelf $shelfnumber";
102             DelFromShelf( $1, $shelfnumber );   # $1 is biblionumber
103         }
104     }
105 }
106
107 my $showadd = 1;
108 # set the default tab, etc.
109 my $shelf_type = $query->param('display');
110 if (defined $shelf_type) {
111         if ($shelf_type eq 'privateshelves')  {
112                 $template->param(showprivateshelves => 1);
113         } elsif ($shelf_type eq 'publicshelves') {
114                 $template->param(showpublicshelves => 1);
115                 $showadd = 0;
116         } else {
117                 $debug and warn "Invalid 'display' param ($shelf_type)";
118         }
119 } else {
120     $template->param(showprivateshelves => 1);
121 }
122
123 # getting the Shelves list
124 my $shelflist = GetShelves( $loggedinuser, 2 );
125 $template->param( { loggedinuser => $loggedinuser } );
126 my $op = $query->param('op');
127
128 SWITCH: {
129         if ( $op ) {
130                 if ( $op eq 'modifsave' ) {
131                         ModShelf(
132                                 $query->param('shelfnumber'), $query->param('shelfname'),
133                                 $loggedinuser,                $query->param('category'), $query->param('sortfield')
134                         );
135                         $shelflist = GetShelves( $loggedinuser, 2 );    # refresh after mods
136                 } elsif ( $op eq 'modif' ) {
137                         my ( $shelfnumber, $shelfname, $owner, $category, $sortfield ) =GetShelf( $query->param('shelf') );
138                         $template->param(
139                                 edit                => 1,
140                                 shelfnumber         => $shelfnumber,
141                                 shelfname           => $shelfname,
142                                 "category$category" => 1,
143                                 "sort_$sortfield"   => 1,
144                         );
145                 }
146                 last SWITCH;
147         }
148         if ( $query->param('viewshelf') ) {
149         #check that the user can view the shelf
150         my $shelfnumber = $query->param('viewshelf');
151         if ( ShelfPossibleAction( $loggedinuser, $shelfnumber, 'view' ) ) {
152             my $items = GetShelfContents($shelfnumber);
153                         $showadd = 1;
154                         my $i = 0;
155                         foreach (grep {$i++ % 2} @$items) {             # every other item
156                                 $_->{toggle} = 1;
157                         }
158             $template->param(
159                 shelfname   => $shelflist->{$shelfnumber}->{'shelfname'},
160                 shelfnumber => $shelfnumber,
161                 viewshelf   => $query->param('viewshelf'),
162                 manageshelf => &ShelfPossibleAction( $loggedinuser, $shelfnumber, 'manage' ),
163                 itemsloop   => $items,
164             );
165         } # else {;}  # FIXME - some kind of warning *may* be in order
166         last SWITCH;
167     }
168     if ( $query->param('shelves') ) {
169         if ( my $newshelf = $query->param('addshelf') ) {
170             my $shelfnumber = AddShelf(
171                 $newshelf,
172                 $query->param('owner'),
173                 $query->param('category')
174             );
175
176             if ( $shelfnumber == -1 ) {    #shelf already exists.
177                                 $showadd = 1;
178                 $template->param(
179                         shelfnumber => $shelfnumber,
180                         already     => $newshelf,
181                 );
182             } else {
183                 print $query->redirect("/cgi-bin/koha/opac-shelves.pl?viewshelf=$shelfnumber");
184                                 exit;           # can't redirect AND expect %line to DO anything!
185                         }
186         }
187         my @paramsloop;
188         foreach ( $query->param() ) {
189                         /^DEL-(\d+)/ or next;
190                         my %line;
191                         ( $line{status}, $line{count} ) = DelShelf($1);
192                         (defined $shelflist->{$1}) and delete $shelflist->{$1};
193                         # print $query->redirect("/cgi-bin/koha/opac-shelves.pl"); exit;
194                         # can't redirect and expect %line to DO anything!
195                         push( @paramsloop, \%line );
196         }
197                 $showadd = 1;
198         $template->param( 
199                         paramsloop => \@paramsloop,
200             shelves    => 1,
201         );
202         last SWITCH;
203     }
204 }
205
206 # rebuilding shelflist (in case a shelf has been added) is not necessary since add redirects!
207
208 $showadd and $template->param(showadd => 1);
209 my $color = 0;
210 my @shelvesloop;
211 my @shelveslooppriv;
212
213 foreach my $element (sort { lc($shelflist->{$a}->{'shelfname'}) cmp lc($shelflist->{$b}->{'shelfname'}) } keys %$shelflist) {
214         my %line;
215         $color = ($color) ? 0 : 1;
216         $color and $line{'toggle'} = $color;
217         $line{'shelf'} = $element;
218         $line{'shelfname'} = $shelflist->{$element}->{'shelfname'};
219         $line{'sortfield'} = $shelflist->{$element}->{'sortfield'};
220         $line{"category".$shelflist->{$element}->{'category'}} = 1;
221         $line{'shelfvirtualcount'} = $shelflist->{$element}->{'count'};
222         $line{'canmanage'} = ShelfPossibleAction($loggedinuser,$element,'manage');
223         if ($shelflist->{$element}->{'owner'} eq $loggedinuser) {
224                 $line{'mine'} = 1;
225         } else {
226                 $line{'firstname'} = $shelflist->{$element}->{'firstname'};
227                 $line{ 'surname' } = $shelflist->{$element}->{ 'surname' };
228         }
229         if ($shelflist->{$element}->{'category'} eq 2) {
230                 push (@shelvesloop,     \%line);
231         } elsif ($shelflist->{$element}->{'category'} eq 1) {
232         push (@shelveslooppriv, \%line);
233     }
234 }
235
236 $template->param(
237     shelveslooppriv => \@shelveslooppriv,
238     shelvesloop     => \@shelvesloop,
239     "BiblioDefaultView".C4::Context->preference("BiblioDefaultView") => 1,
240 );
241
242 output_html_with_http_headers $query, $cookie, $template->output;