From ab362b93a710bddcd385a6a468af6ff682673367 Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Fri, 30 Aug 2013 16:43:30 -0300 Subject: [PATCH] Bug 7813: Ability to delete local cover images 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 Signed-off-by: Jonathan Druart Signed-off-by: Galen Charlton --- .../prog/en/css/staff-global.css | 4 + .../prog/en/modules/catalogue/detail.tt | 46 +++++++++-- svc/cover_images | 77 +++++++++++++++++++ 3 files changed, 120 insertions(+), 7 deletions(-) create mode 100755 svc/cover_images diff --git a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css b/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css index 9d4446cac7..308e3a02b2 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css +++ b/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css @@ -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); diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt index a9c042dba7..903f1ad156 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt @@ -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 ) %]
[% IF ( localimages.0 ) %] -

Click on an image to view it in the image viewer

+

Click on an image to view it in the image viewer

+
    [% FOREACH image IN localimages %] -[% IF image %] - -[% END %] + [% IF image %] +
  • + + + × + +
  • + [% END %] [% END %] +
[% ELSE %] [% IF ( CAN_user_tools_upload_local_cover_images ) %] -

No images have been uploaded for this bibliographic record yet. Please upload one.

+

No images have been uploaded for this bibliographic record yet. Please upload one.

[% END %] [% END %]
diff --git a/svc/cover_images b/svc/cover_images new file mode 100755 index 0000000000..d3a3c45983 --- /dev/null +++ b/svc/cover_images @@ -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 ); -- 2.20.1