Bug 13364: Add a call number browser in item edition page

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 <veron@veron.ch>

Signed-off-by: Magnus <magnus@enger.priv.no>
Works as advertised. QA scripts pass.

Tested together with other patches. Works as expected.
Signed-off-by: Marc Véron <veron@veron.ch>

Bug 13364 - fix datatables.inc

http://bugs.koha-community.org/show_bug.cgi?id=13364
Signed-off-by: Magnus <magnus@enger.priv.no>
Works as advertised. QA scripts pass.

Tested together with other patches, works as expected.
Signed-off-by: Marc Véron <veron@veron.ch>

Bug 13364 - Add a call number browser in item edition page - QA fixed

Tested together with other patches.
Signed-off-by: Marc Véron <veron@veron.ch>

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 <veron@veron.ch>

Signed-off-by: Jonathan Druart <jonathan.druart@biblibre.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
This commit is contained in:
simith 2015-02-27 08:09:09 -05:00 committed by Tomas Cohen Arazi
parent 767d9b3b29
commit 4aa4d41ce5
3 changed files with 228 additions and 0 deletions

View File

@ -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 = "
<script type=\"text/javascript\">
//<![CDATA[
function Focus$function_name(subfield_managed) {
return 1;
}
function Blur$function_name(subfield_managed) {
return 1;
}
function Clic$function_name(i) {
q = document.getElementById('$field_number');
window.open(\"../cataloguing/plugin_launcher.pl?plugin_name=cn_browser.pl&popup&q=\"+q.value,\"cnbrowser\",\"width=500,height=400,toolbar=false,scrollbars=yes\");
}
//]]>
</script>
";
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;

View File

@ -2793,3 +2793,8 @@ div.lastchecked {
.hq-author {
font-weight: bold;
}
div#course_reserves_wrapper > table#course_reserves {
margin: auto;
width:90%;
}

View File

@ -0,0 +1,61 @@
[% INCLUDE 'doc-head-open.inc' %]
<title>Koha &rsaquo; Tools</title>
<link rel="stylesheet" type="text/css" href="[% themelang %]/css/datatables.css" />
[% INCLUDE 'doc-head-close.inc' %]
[% INCLUDE 'datatables.inc' %]
</head>
<body>
[% UNLESS ( popup ) %]
[% INCLUDE 'header.inc' %]
[% INCLUDE 'cat-search.inc' %]
[% END %]
<script language="JavaScript">
$(document).ready(function()
{
$("#cn_browser_table").DataTable({"paging": false, "bFilter": false, "info": false, "bSort": false});
$("#cn_browser_submit").click(function(){
window.location.href='/cgi-bin/koha/cataloguing/plugin_launcher.pl?plugin_name=cn_browser.pl&popup&q='+$("#cn_browser_input").val();
return false;
});
}
);
</script>
<h1 style="text-align:center">Call numbers browser</h1>
<div style="margin:auto;text-align:center;">
<form method="get" action="cn_browser.pl">
<label for="searchcn">Search call number:</label>
<input type="text" id="cn_browser_input" name="q" value="[% q %]" />
<input id="cn_browser_submit" type="submit" value="Search" />
</form>
</div>
<br />
<table id="cn_browser_table">
<thead><tr>
<th>Call Number</th>
<th>Title</th>
<th>Branch</th>
</tr></thead>
<tbody>
[% FOREACH cn_loo IN cn_loop %]
<tr>
<td style="background:[% cn_loo.background %];">[% cn_loo.itemcallnumber %]</td>
<td style="background:[% cn_loo.background %];">
<a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=[% cn_loo.biblionumber %]">
[% cn_loo.title %] [% cn_loo.subtitle %] [% cn_loo.subtitle2 %]
[% IF ( cn_loo.author ) %]
<span>by</span> [% cn_loo.author %]
[% END %]
</a>
</td>
<td style="background:[% cn_loo.background %];">[% cn_loo.branchname %]</td>
</tr>
[% END %]
</tbody>
</table>
<br />