From 4aa4d41ce5f1323d7b22a504400a10a888c58da0 Mon Sep 17 00:00:00 2001 From: simith Date: Fri, 27 Feb 2015 08:09:09 -0500 Subject: [PATCH] Bug 13364: Add a call number browser in item edition page MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit When editing an item, the call number browser search for existing call number. If it shows a line is green between two calli numbers, the call numbers searched is available. If the call number is highlighted in red, it means that it already exists. This can be used to avoid repeated call numbers in your collection. The call number browser also shows its position relative to the rest of the collection. Sponsored-by: CCSR To test : 1) Go to MARC bibliographic framework Home › Administration › MARC frameworks 2) Click in MARC structure (Default framework) 3) Search field 952 and click in subfields 4) Edit subfield o (Full call number) 5) Click Display more constraints 6) In Others Options, Plugin, Choose cn_browser.pl and save changes 7) Search a record and edit its items Validate : three points (…) beside Full call number input 8) Click in … Validate : if it can not find the given call number, a green line is shown. Otherwise, the given call number is highlighted in red. Followed test plan. Works as expected. Signed-off-by: Marc Véron Signed-off-by: Magnus Works as advertised. QA scripts pass. Tested together with other patches. Works as expected. Signed-off-by: Marc Véron Bug 13364 - fix datatables.inc http://bugs.koha-community.org/show_bug.cgi?id=13364 Signed-off-by: Magnus Works as advertised. QA scripts pass. Tested together with other patches, works as expected. Signed-off-by: Marc Véron Bug 13364 - Add a call number browser in item edition page - QA fixed Tested together with other patches. Signed-off-by: Marc Véron Bug 13364 - Add a call number browser in item edition page - QA fixed II Tested together with oter patches. Signed-off-by: Marc Véron Signed-off-by: Jonathan Druart Signed-off-by: Tomas Cohen Arazi --- cataloguing/value_builder/cn_browser.pl | 162 ++++++++++++++++++ .../prog/en/css/staff-global.css | 5 + .../cataloguing/value_builder/cn_browser.tt | 61 +++++++ 3 files changed, 228 insertions(+) create mode 100755 cataloguing/value_builder/cn_browser.pl create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/cn_browser.tt diff --git a/cataloguing/value_builder/cn_browser.pl b/cataloguing/value_builder/cn_browser.pl new file mode 100755 index 0000000000..c1ccbd2b86 --- /dev/null +++ b/cataloguing/value_builder/cn_browser.pl @@ -0,0 +1,162 @@ +use Modern::Perl; +no warnings 'redefine'; + +use CGI; +use C4::Auth; +use C4::ClassSource; + +sub plugin_parameters { + my ( $dbh, $record, $tagslib, $i, $tabloop ) = @_; + return ""; +} + +sub plugin_javascript { + my ( $dbh, $record, $tagslib, $field_number, $tabloop ) = @_; + my $function_name = "328" . ( int( rand(100000) ) + 1 ); + my $res = " + +"; + + return ( $function_name, $res ); +} + +sub plugin { + my ($input) = @_; + my $cgi = new CGI; + my $params = $cgi->Vars; + my $results_per_page = 30; + my $current_page = $cgi->param('page') || 1; + + my ( $template, $loggedinuser, $cookie ) = get_template_and_user( + { template_name => "cataloguing/value_builder/cn_browser.tt", + query => $cgi, + type => "intranet", + authnotrequired => 0, + flagsrequired => { tools => 'cn_browser', catalogue => 1 }, + } + ); + + my $cn_sort; + + my $dbh = C4::Context->dbh; + my $sth; + my @cn; + my $query; + my $real_limit = $results_per_page / 2; + my $rows_lt = 999; + my $rows_gt = 999; + my $search; + my $globalGreen = 0; + my $lt = ''; + my $gt = ''; + my $q; + + if ( $q = $cgi->param('q') ) { + $search = $q; + } + if ( $cgi->param('lt') ) { + $lt = $cgi->param('lt'); + $search = $lt; + } + if ( $cgi->param('gt') ) { + $gt = $cgi->param('gt'); + $search = $gt; + } + + #Don't show half the results of show lt or gt + $real_limit = $results_per_page if $search ne $q; + $cn_sort = GetClassSort( undef, undef, $search ); + my $cn_sort_q = GetClassSort( undef, undef, $q ); + + my $red = 0; + if ( $search ne $gt ) { + my $green = 0; + + #Results before the cn_sort + $query = "SELECT b.title, itemcallnumber, biblionumber, barcode, cn_sort, branchname, author + FROM items AS i + JOIN biblio AS b USING (biblionumber) + LEFT OUTER JOIN branches ON (branches.branchcode = homebranch) + WHERE cn_sort < '$cn_sort' + AND itemcallnumber != '' + ORDER BY cn_sort DESC, itemnumber + LIMIT $real_limit;"; + $sth = $dbh->prepare($query); + $sth->execute(); + while ( my $data = $sth->fetchrow_hashref ) { + if ( $data->{itemcallnumber} eq $q ) { + $data->{background} = 'red'; + $red = 1; + } elsif ( ( GetClassSort( undef, undef, $data->{itemcallnumber} ) lt $cn_sort_q ) && !$green && !$red ) { + if ( $#cn != -1 ) { + unshift @cn, { 'background' => 'green' }; + $globalGreen = 1; + } + $green = 1; + } + unshift @cn, $data; + } + $rows_lt = $sth->rows; + $sth->finish; + } + + if ( $search ne $lt ) { + my $green = 0; + + #Results after the cn_sort + $query = "SELECT b.title, itemcallnumber, biblionumber, i.cn_sort, branchname, author + FROM items AS i + JOIN biblio AS b USING (biblionumber) + LEFT OUTER JOIN branches ON (branches.branchcode = homebranch) + WHERE i.cn_sort >= '$cn_sort' + AND itemcallnumber != '' + ORDER BY cn_sort, itemnumber + LIMIT $real_limit"; + $sth = $dbh->prepare($query); + $sth->execute(); + + while ( my $data = $sth->fetchrow_hashref ) { + if ( $data->{itemcallnumber} eq $q ) { + $data->{background} = 'red'; + $red = 1; + } elsif ( ( GetClassSort( undef, undef, $data->{itemcallnumber} ) gt $cn_sort_q ) && !$green && !$red && !$globalGreen ) { + push @cn, { 'background' => 'green' }; + $green = 1; + } + push @cn, $data; + } + $rows_gt = $sth->rows; + + if ( !$green && !$red && !$globalGreen ) { + push @cn, { 'background' => 'green' }; + } + + $sth->finish; + } + + $template->param( 'q' => $q ); + $template->param( 'cn_loop' => \@cn ) if $#cn != -1; + $template->param( 'popup' => defined( $cgi->param('popup') ) ); + + output_html_with_http_headers $cgi, $cookie, $template->output; +} + +1; 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 dddeaa54c8..4f3fa8a8e3 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css +++ b/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css @@ -2793,3 +2793,8 @@ div.lastchecked { .hq-author { font-weight: bold; } + +div#course_reserves_wrapper > table#course_reserves { + margin: auto; + width:90%; +} diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/cn_browser.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/cn_browser.tt new file mode 100644 index 0000000000..b7f341622f --- /dev/null +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/value_builder/cn_browser.tt @@ -0,0 +1,61 @@ +[% INCLUDE 'doc-head-open.inc' %] +Koha › Tools + +[% INCLUDE 'doc-head-close.inc' %] +[% INCLUDE 'datatables.inc' %] + + +[% UNLESS ( popup ) %] +[% INCLUDE 'header.inc' %] +[% INCLUDE 'cat-search.inc' %] +[% END %] + + + +

Call numbers browser

+ +
+
+ + + +
+
+
+ + + + + + + + +[% FOREACH cn_loo IN cn_loop %] + + + + + +[% END %] + +
Call NumberTitleBranch
[% cn_loo.itemcallnumber %] + + [% cn_loo.title %] [% cn_loo.subtitle %] [% cn_loo.subtitle2 %] + [% IF ( cn_loo.author ) %] + by [% cn_loo.author %] + [% END %] + + [% cn_loo.branchname %]
+ +
-- 2.39.5