From a3650314ee1e556209f0b46ab4fdcd258de3fd55 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 a '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. Any comments are welcome, this is WIP. Thanks To+ 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 --- .../intranet-tmpl/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 9d4446c..308e3a0 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 1011224..117a232 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 %] @@ -693,15 +718,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 0000000..d3a3c45 --- /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 ); -- 1.7.7.4