Bug 7813: Ability to delete local cover images
authorTomas Cohen Arazi <tomascohen@gmail.com>
Fri, 30 Aug 2013 19:43:30 +0000 (16:43 -0300)
committerGalen Charlton <gmc@esilibrary.com>
Sat, 21 Sep 2013 18:08:51 +0000 (18:08 +0000)
This patch adds the ability to delete local cover images from the
detail page. It adds an 'X' button to trigger the deletion. It occurs
using a new SVC script called cover_images that accepts the following
parameters:

 - action
 - biblionumber (used for checking imagenumber validity)
 - imagenumber (repeatable)

It then deletes all valid images passed and returns a JSON object
containing the imagenumbers and the deletion status (1/0). The operation
is triggered using jQuery.ajax, and with the response the corresponding
images get deleted.

Note: currently one image is deleted at a time, but the code is there to
be used.

To test:
- Open the detail page fr a biblionumber containing one or more cover
  images, go to its images tab.
- Apply the patch, reload the page, go to the images tab.
- Thumbnails should look better than before ;-)
- An 'X' button should show below each cover.
- Clicking the 'X' button should trigger an alert message asking for
  confirmation.
 a) Cancel: nothing happens, reload the page and check nothing got
    deleted.
 b) Accept: the deleted image should be gone, reload the page to check
    it doesn't exist anymore and is not a browser/DOM manipulation trick.
- Signoff

Note: check having more cover images than those that fit the width and
see it wraps fine.

P.S. I chose not to implement every possible action on the svc script, but
another bug could be filled for more improvements.

Sponsored-by: Universidad Nacional de Cordoba
Signed-off-by: David Cook <dcook@prosentient.com.au>
Signed-off-by: Jonathan Druart <jonathan.druart@biblibre.com>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css
koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt
svc/cover_images [new file with mode: 0755]

index 9d4446c..308e3a0 100644 (file)
@@ -1398,6 +1398,10 @@ li.email {
        margin : auto;
 }
 
+.thumbnails > li {
+    list-style-type: none;
+}
+
 #searchresults ul li {
        font-size : 90%;
        list-style : url(../../img/item-bullet.gif);
index a9c042d..903f1ad 100644 (file)
@@ -52,11 +52,36 @@ function verify_images() {
         });
 }
 
-     $(document).ready(function() {
+    function removeLocalImage(imagenumber) {
+
+        $.ajax({
+            url: "/cgi-bin/koha/svc/cover_images?action=delete&biblionumber=" + [% biblionumber %] + "&imagenumber=" + imagenumber,
+            success: function(data) {
+                $(data).each( function(i) {
+                    if ( this.deleted == 1 ) {
+                        $('#imagenumber-' + this.imagenumber).remove();
+                    }
+                });
+            }
+        });
+
+    }
+
+    $(document).ready(function() {
         $('#bibliodetails').tabs();
         $('#search-form').focus();
+        $('.thumbnails > li > a > span').click(function() {
+            var result = confirm(_("Are you sure you want to delete this cover image?"));
+
+            if ( result == true ) {
+                var imagenumber = $(this).parent().parent().attr('id').split('-')[1];
+                removeLocalImage(imagenumber);
+            }
+
+            return false;
+        });
+    });
 
-     });
      [% IF ( AmazonCoverImages ) %]$(window).load(function() {
         verify_images();
      });[% END %]
@@ -697,15 +722,22 @@ function verify_images() {
 [% IF ( LocalCoverImages ) %]
 <div id="images">
 [% IF ( localimages.0 ) %]
-<p>Click on an image to view it in the image viewer</p>
+    <p>Click on an image to view it in the image viewer</p>
+    <ul class="thumbnails">
 [% FOREACH image IN localimages %]
-[% IF image %]
-<a class="localimage" href="/cgi-bin/koha/catalogue/imageviewer.pl?biblionumber=[% biblionumber %]&amp;imagenumber=[% image %]"><img alt="" src="/cgi-bin/koha/catalogue/image.pl?thumbnail=1&amp;imagenumber=[% image %]" /></a>
-[% END %]
+    [% IF image %]
+        <li id="imagenumber-[% image %]">
+            <a class="thumbnail" href="/cgi-bin/koha/catalogue/imageviewer.pl?biblionumber=[% biblionumber %]&amp;imagenumber=[% image %]">
+                <img alt="" src="/cgi-bin/koha/catalogue/image.pl?thumbnail=1&amp;imagenumber=[% image %]" />
+                <span class="remove">&times;</span>
+            </a>
+        </li>
+    [% END %]
 [% END %]
+    </ul>
 [% ELSE %]
 [% IF ( CAN_user_tools_upload_local_cover_images ) %]
-<p>No images have been uploaded for this bibliographic record yet. Please <a href='/cgi-bin/koha/tools/upload-cover-image.pl?biblionumber=[% biblionumber %]&amp;filetype=image'>upload</a> one.</p>
+    <p>No images have been uploaded for this bibliographic record yet. Please <a href='/cgi-bin/koha/tools/upload-cover-image.pl?biblionumber=[% biblionumber %]&amp;filetype=image'>upload</a> one.</p>
 [% END %]
 [% END %]
 </div>
diff --git a/svc/cover_images b/svc/cover_images
new file mode 100755 (executable)
index 0000000..d3a3c45
--- /dev/null
@@ -0,0 +1,77 @@
+#!/usr/bin/perl
+
+# Copyright 2013 Universidad Nacional de Cordoba
+#                Tomas Cohen Arazi
+#
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with Koha; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+use Modern::Perl;
+
+use CGI;
+use C4::Auth qw/check_cookie_auth/;
+use C4::Images;
+use JSON qw/to_json/;
+
+my $input = new CGI;
+
+my ( $auth_status, $sessionID ) =
+        check_cookie_auth(
+            $input->cookie('CGISESSID'),
+            { tools => 'upload_local_cover_images' } );
+
+if ( $auth_status ne "ok" ) {
+    exit 0;
+}
+
+my $action       = $input->param('action');
+my $biblionumber = $input->param('biblionumber');
+my @imagenumbers = $input->param('imagenumber');
+
+# Array to store the reponse JSON
+my $response = [];
+
+if ( $action eq "delete" ) {
+    # Build a hash of valid imagenumbers fr the given biblionumber
+    my %valid_imagenumbers = map {$_ => 1} ListImagesForBiblio($biblionumber);
+
+    foreach my $imagenumber ( @imagenumbers ) {
+        if ( exists( $valid_imagenumbers{ $imagenumber } ) ) {
+            DelImage($imagenumber);
+            push @$response, {
+                imagenumber => $imagenumber,
+                deleted => 1
+            };
+        } else {
+            push @$response, {
+                imagenumber => $imagenumber,
+                deleted => 0,
+                error => "MSG_INVALID_IMAGENUMBER"
+            };
+        }
+    }
+} else {
+    # invalid action
+    exit 0;
+}
+
+binmode STDOUT, ":encoding(UTF-8)";
+print $input->header(
+    -type => 'application/json',
+    -charset => 'UTF-8'
+);
+
+print to_json( $response );