From 22e5e693c54ec03091c38422476f10e550935084 Mon Sep 17 00:00:00 2001 From: simith Date: Mon, 1 Dec 2014 09:17:22 -0500 Subject: [PATCH 1/4] Add a call number browser in item edition page http://bugs.koha-community.org/show_bug.cgi?id=13364 Signed-off-by: Paola Rossi --- cataloguing/value_builder/cn_browser.pl | 177 ++++++++++++++++++++ .../lib/jquery/plugins/jquery.tablesorter.min.js | 2 + .../prog/en/modules/tools/cn_browser.tt | 76 +++++++++ 3 files changed, 255 insertions(+) create mode 100755 cataloguing/value_builder/cn_browser.pl create mode 100644 koha-tmpl/intranet-tmpl/lib/jquery/plugins/jquery.tablesorter.min.js create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/tools/cn_browser.tt diff --git a/cataloguing/value_builder/cn_browser.pl b/cataloguing/value_builder/cn_browser.pl new file mode 100755 index 0000000..de4bc20 --- /dev/null +++ b/cataloguing/value_builder/cn_browser.pl @@ -0,0 +1,177 @@ +#!/usr/bin/perl + +use strict; +use warnings; +no warnings 'redefine'; + +use CGI; +use C4::Auth; +use C4::Output; +use POSIX; +use C4::ClassSource; +use URI::Escape; +use Data::Dumper; + +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 => "tools/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 $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); + # die $query; + $sth->execute(); + while ( my $data = $sth->fetchrow_hashref ) { + if ($data->{itemcallnumber} eq $q) { + $data->{background} = 'red'; + $red = 1; + } + elsif (($data->{cn_sort} lt $cn_sort_q) && !$green && !$red) { + if ($#cn != -1) { + unshift @cn, {'background' => 'green'}; + } + $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); + # die $query; + $sth->execute(); + while ( my $data = $sth->fetchrow_hashref ) { + if ($data->{itemcallnumber} eq $q) { + $data->{background} = 'red'; + $red = 1; + } + elsif (($data->{cn_sort} gt $cn_sort_q) && !$green && !$red) { + if ($#cn != -1) { + push @cn, {'background' => 'green'}; + } + $green = 1; + } + push @cn, $data; + } + $rows_gt = $sth->rows; + $sth->finish; + } + + $template->param('q' => $q); + $template->param('cn_loop' => \@cn) if $#cn != -1; + $template->param('popup' => defined($cgi->param('popup'))); + + # die Dumper @cn; + + #die $rows_lt . '-' . $rows_gt . '-' . $real_limit; + + my $url = "cn_browser.pl?q=$q"; + my $first_result = $cn[0]->{itemcallnumber}; + my $last_result = $cn[-1]->{itemcallnumber}; + $template->param('first_result' => $first_result) if $rows_lt >= $real_limit; + $template->param('last_result' => $last_result) if $rows_gt >= $real_limit; + $template->param('url' => $url); + + + output_html_with_http_headers $cgi, $cookie, $template->output; +} + +1; diff --git a/koha-tmpl/intranet-tmpl/lib/jquery/plugins/jquery.tablesorter.min.js b/koha-tmpl/intranet-tmpl/lib/jquery/plugins/jquery.tablesorter.min.js new file mode 100644 index 0000000..64c7007 --- /dev/null +++ b/koha-tmpl/intranet-tmpl/lib/jquery/plugins/jquery.tablesorter.min.js @@ -0,0 +1,2 @@ + +(function($){$.extend({tablesorter:new function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'.',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}var rows=table.tBodies[0].rows;if(table.tBodies[0].rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;ib)?1:0));};function sortTextDesc(a,b){return((ba)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){$this.trigger("sortStart");var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){var $cell=$(this);var i=this.column;this.order=this.count++%2;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;iKoha › Tools +[% INCLUDE 'doc-head-close.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 %]
+ +
+ + +[% INCLUDE 'intranet-bottom.inc' %] -- 1.7.10.4