Bugzilla – Attachment 20225 Details for
Bug 10404
Add previous/next browsing to staff client search results
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 10404: add previous/next browsing to staff client
Bug-10404-add-previousnext-browsing-to-staff-clien.patch (text/plain), 49.06 KB, created by
Kyle M Hall (khall)
on 2013-08-09 13:17:51 UTC
(
hide
)
Description:
Bug 10404: add previous/next browsing to staff client
Filename:
MIME Type:
Creator:
Kyle M Hall (khall)
Created:
2013-08-09 13:17:51 UTC
Size:
49.06 KB
patch
obsolete
>From f8116d755fe7860fc47c3a0d884e8188bf4c7659 Mon Sep 17 00:00:00 2001 >From: Jared Camins-Esakov <jcamins@cpbibliography.com> >Date: Wed, 10 Jul 2013 18:02:27 -0400 >Subject: [PATCH] Bug 10404: add previous/next browsing to staff client > >Although previous/next browsing was added for searches in the OPAC >in 2011, the staff client has been without any sort of search browsing. >Until now. This patch is an all-singing, all-dancing, all-compatible >implementation of search browsing that will work across multiple >browser tabs and on any browser since IE7 (though the staff client >layout is broken on IE7). > >To test: >1) Perform a search that will bring up multiple results. >2) View one of the results. >3) Use the Previous and Next links to browse along the search results. >4) Use the "Return to results" button to check that you end up at the > correct page of results, even if you page through more than 20 > records. >5) Sign off. > >Signed-off-by: Owen Leonard <oleonard@myacpl.org> >Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> >Passes koha-qa.pl, works as advertised. >--- > catalogue/ISBDdetail.pl | 1 + > catalogue/MARCdetail.pl | 1 + > catalogue/detail.pl | 1 + > catalogue/labeledMARCdetail.pl | 1 + > catalogue/moredetail.pl | 1 + > catalogue/search.pl | 11 + > cataloguing/addbiblio.pl | 14 +- > cataloguing/additem.pl | 12 +- > koha-tmpl/intranet-tmpl/js/browser.js | 90 ++++ > koha-tmpl/intranet-tmpl/lib/shims/json2.js | 486 ++++++++++++++++++++ > koha-tmpl/intranet-tmpl/lib/shims/json2.min.js | 1 + > .../intranet-tmpl/prog/en/css/staff-global.css | 43 ++- > .../prog/en/includes/browser-strings.inc | 7 + > .../prog/en/modules/catalogue/ISBDdetail.tt | 11 + > .../prog/en/modules/catalogue/MARCdetail.tt | 7 + > .../prog/en/modules/catalogue/detail.tt | 10 + > .../prog/en/modules/catalogue/labeledMARCdetail.tt | 7 + > .../prog/en/modules/catalogue/moredetail.tt | 11 + > .../prog/en/modules/catalogue/results.tt | 22 + > .../prog/en/modules/cataloguing/addbiblio.tt | 8 + > .../prog/en/modules/cataloguing/additem.tt | 8 + > 21 files changed, 741 insertions(+), 12 deletions(-) > create mode 100644 koha-tmpl/intranet-tmpl/js/browser.js > create mode 100644 koha-tmpl/intranet-tmpl/lib/shims/json2.js > create mode 100644 koha-tmpl/intranet-tmpl/lib/shims/json2.min.js > create mode 100644 koha-tmpl/intranet-tmpl/prog/en/includes/browser-strings.inc > >diff --git a/catalogue/ISBDdetail.pl b/catalogue/ISBDdetail.pl >index f094160..28b5c2d 100755 >--- a/catalogue/ISBDdetail.pl >+++ b/catalogue/ISBDdetail.pl >@@ -109,6 +109,7 @@ $template->param ( > z3950_search_params => C4::Search::z3950_search_args(GetBiblioData($biblionumber)), > ocoins => GetCOinSBiblio($record), > C4::Search::enabled_staff_search_views, >+ searchid => $query->param('searchid'), > ); > > >diff --git a/catalogue/MARCdetail.pl b/catalogue/MARCdetail.pl >index d8079bd..835568a 100755 >--- a/catalogue/MARCdetail.pl >+++ b/catalogue/MARCdetail.pl >@@ -333,6 +333,7 @@ $template->param ( > marcview => 1, > z3950_search_params => C4::Search::z3950_search_args($biblio), > C4::Search::enabled_staff_search_views, >+ searchid => $query->param('searchid'), > ); > > my ( $holdcount, $holds ) = C4::Reserves::GetReservesFromBiblionumber($biblionumber,1); >diff --git a/catalogue/detail.pl b/catalogue/detail.pl >index ab1df8a..72258fd 100755 >--- a/catalogue/detail.pl >+++ b/catalogue/detail.pl >@@ -360,6 +360,7 @@ $template->param( > subscriptions => \@subs, > subscriptionsnumber => $subscriptionsnumber, > subscriptiontitle => $dat->{title}, >+ searchid => $query->param('searchid'), > ); > > # $debug and $template->param(debug_display => 1); >diff --git a/catalogue/labeledMARCdetail.pl b/catalogue/labeledMARCdetail.pl >index 9d2a14e..e82e3b9 100755 >--- a/catalogue/labeledMARCdetail.pl >+++ b/catalogue/labeledMARCdetail.pl >@@ -134,6 +134,7 @@ $template->param ( > labeledmarcview => 1, > z3950_search_params => C4::Search::z3950_search_args($biblio), > C4::Search::enabled_staff_search_views, >+ searchid => $query->param('searchid'), > ); > > my ( $holdcount, $holds ) = C4::Reserves::GetReservesFromBiblionumber($biblionumber,1); >diff --git a/catalogue/moredetail.pl b/catalogue/moredetail.pl >index f0cfb13..e092827 100755 >--- a/catalogue/moredetail.pl >+++ b/catalogue/moredetail.pl >@@ -214,6 +214,7 @@ $template->param( > hidepatronname => $hidepatronname, > ); > $template->param(ONLY_ONE => 1) if ( $itemnumber && $showncount != @items ); >+$template->{'VARS'}->{'searchid'} = $query->param('searchid'); > > > my ( $holdcount, $holds ) = GetReservesFromBiblionumber($biblionumber,1); >diff --git a/catalogue/search.pl b/catalogue/search.pl >index e1154c3..09707ef 100755 >--- a/catalogue/search.pl >+++ b/catalogue/search.pl >@@ -150,6 +150,7 @@ use C4::Members qw(GetMember); > use C4::VirtualShelves; > use URI::Escape; > use POSIX qw(ceil floor); >+use String::Random; > use C4::Branch; # GetBranches > > my $DisplayMultiPlaceHold = C4::Context->preference("DisplayMultiPlaceHold"); >@@ -673,6 +674,16 @@ for (my $i=0;$i<@servers;$i++) { > } #/end of the for loop > #$template->param(FEDERATED_RESULTS => \@results_array); > >+$template->{'VARS'}->{'searchid'} = $cgi->param('searchid') >+ || String::Random::random_string('ssssssss'); >+my $gotonumber = $cgi->param('gotoNumber'); >+if ($gotonumber eq 'last' || $gotonumber eq 'first') { >+ $template->{'VARS'}->{'gotoNumber'} = $gotonumber; >+} >+$template->{'VARS'}->{'gotoPage'} = 'detail.pl'; >+my $gotopage = $cgi->param('gotoPage'); >+$template->{'VARS'}->{'gotoPage'} = $gotopage >+ if $gotopage =~ m/^(ISBD|labeledMARC|MARC|more)?detail.pl$/; > > $template->param( > #classlist => $classlist, >diff --git a/cataloguing/addbiblio.pl b/cataloguing/addbiblio.pl >index 5e050ae..cb40396 100755 >--- a/cataloguing/addbiblio.pl >+++ b/cataloguing/addbiblio.pl >@@ -724,6 +724,7 @@ my $op = $input->param('op'); > my $mode = $input->param('mode'); > my $frameworkcode = $input->param('frameworkcode'); > my $redirect = $input->param('redirect'); >+my $searchid = $input->param('searchid'); > my $dbh = C4::Context->dbh; > my $hostbiblionumber = $input->param('hostbiblionumber'); > my $hostitemnumber = $input->param('hostitemnumber'); >@@ -889,7 +890,7 @@ if ( $op eq "addbiblio" ) { > } > else { > print $input->redirect( >- "/cgi-bin/koha/cataloguing/additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode" >+ "/cgi-bin/koha/cataloguing/additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode&searchid=$searchid" > ); > exit; > } >@@ -898,20 +899,20 @@ if ( $op eq "addbiblio" ) { > my $defaultview = C4::Context->preference('IntranetBiblioDefaultView'); > my $views = { C4::Search::enabled_staff_search_views }; > if ($defaultview eq 'isbd' && $views->{can_view_ISBD}) { >- print $input->redirect("/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=$biblionumber"); >+ print $input->redirect("/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=$biblionumber&searchid=$searchid"); > } elsif ($defaultview eq 'marc' && $views->{can_view_MARC}) { >- print $input->redirect("/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode"); >+ print $input->redirect("/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode&searchid=$searchid"); > } elsif ($defaultview eq 'labeled_marc' && $views->{can_view_labeledMARC}) { >- print $input->redirect("/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=$biblionumber"); >+ print $input->redirect("/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=$biblionumber&searchid=$searchid"); > } else { >- print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber"); >+ print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber&searchid=$searchid"); > } > exit; > > } > elsif ($redirect eq "just_save"){ > my $tab = $input->param('current_tab'); >- print $input->redirect("/cgi-bin/koha/cataloguing/addbiblio.pl?biblionumber=$biblionumber&framework=$frameworkcode&tab=$tab"); >+ print $input->redirect("/cgi-bin/koha/cataloguing/addbiblio.pl?biblionumber=$biblionumber&framework=$frameworkcode&tab=$tab&searchid=$searchid"); > } > else { > $template->param( >@@ -998,5 +999,6 @@ $template->param( > borrowernumber => $loggedinuser, > tab => $input->param('tab') > ); >+$template->{'VARS'}->{'searchid'} = $searchid; > > output_html_with_http_headers $input, $cookie, $template->output; >diff --git a/cataloguing/additem.pl b/cataloguing/additem.pl >index 36978bc..f2a5ccb 100755 >--- a/cataloguing/additem.pl >+++ b/cataloguing/additem.pl >@@ -315,6 +315,7 @@ my $itemnumber = $input->param('itemnumber'); > my $op = $input->param('op'); > my $hostitemnumber = $input->param('hostitemnumber'); > my $marcflavour = C4::Context->preference("marcflavour"); >+my $searchid = $input->param('searchid'); > # fast cataloguing datas > my $fa_circborrowernumber = $input->param('circborrowernumber'); > my $fa_barcode = $input->param('barcode'); >@@ -538,7 +539,7 @@ if ($op eq "additem") { > # check that there is no issue on this item before deletion. > $error = &DelItemCheck($dbh,$biblionumber,$itemnumber); > if($error == 1){ >- print $input->redirect("additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode"); >+ print $input->redirect("additem.pl?biblionumber=$biblionumber&frameworkcode=$frameworkcode&searchid=$searchid"); > }else{ > push @errors,$error; > $nextop="additem"; >@@ -570,13 +571,13 @@ if ($op eq "additem") { > my $defaultview = C4::Context->preference('IntranetBiblioDefaultView'); > my $views = { C4::Search::enabled_staff_search_views }; > if ($defaultview eq 'isbd' && $views->{can_view_ISBD}) { >- print $input->redirect("/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=$biblionumber"); >+ print $input->redirect("/cgi-bin/koha/catalogue/ISBDdetail.pl?biblionumber=$biblionumber&searchid=$searchid"); > } elsif ($defaultview eq 'marc' && $views->{can_view_MARC}) { >- print $input->redirect("/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=$biblionumber"); >+ print $input->redirect("/cgi-bin/koha/catalogue/MARCdetail.pl?biblionumber=$biblionumber&searchid=$searchid"); > } elsif ($defaultview eq 'labeled_marc' && $views->{can_view_labeledMARC}) { >- print $input->redirect("/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=$biblionumber"); >+ print $input->redirect("/cgi-bin/koha/catalogue/labeledMARCdetail.pl?biblionumber=$biblionumber&searchid=$searchid"); > } else { >- print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber"); >+ print $input->redirect("/cgi-bin/koha/catalogue/detail.pl?biblionumber=$biblionumber&searchid=$searchid"); > } > exit; > } >@@ -822,6 +823,7 @@ $template->param( > popup => $input->param('popup') ? 1: 0, > C4::Search::enabled_staff_search_views, > ); >+$template->{'VARS'}->{'searchid'} = $searchid; > > if ($frameworkcode eq 'FA'){ > # fast cataloguing datas >diff --git a/koha-tmpl/intranet-tmpl/js/browser.js b/koha-tmpl/intranet-tmpl/js/browser.js >new file mode 100644 >index 0000000..bd73a4f >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/js/browser.js >@@ -0,0 +1,90 @@ >+if ( KOHA === undefined ) var KOHA = {}; >+ >+KOHA.browser = function (searchid, biblionumber) { >+ var me = this; >+ this.searchid = searchid; >+ >+ if (me.searchid) { >+ me.searchCookie = JSON.parse($.cookie(searchid)); >+ } >+ >+ var browseRecords = function (searchid, movement) { >+ var newSearchPos = me.curPos + movement; >+ if (newSearchPos > me.searchCookie.results.length - 1) { >+ window.location = '/cgi-bin/koha/catalogue/search.pl?' + decodeURIComponent(me.searchCookie.query) + '&limit=' + decodeURIComponent(me.searchCookie.limit) + '&sort=' + me.searchCookie.sort + '&gotoPage=detail.pl&gotoNumber=first&searchid=' + searchid + '&offset=' + newSearchPos; >+ } else if (newSearchPos < 0) { >+ window.location = '/cgi-bin/koha/catalogue/search.pl?' + decodeURIComponent(me.searchCookie.query) + '&limit=' + decodeURIComponent(me.searchCookie.limit) + '&sort=' + me.searchCookie.sort + '&gotoPage=detail.pl&gotoNumber=last&searchid=' + searchid + '&offset=' + (me.offset - me.searchCookie.pagelen); >+ } else { >+ window.location = window.location.href.replace('biblionumber=' + biblionumber, 'biblionumber=' + me.searchCookie.results[newSearchPos]); >+ } >+ } >+ >+ this.create = function (offset, query, limit, sort, newresults) { >+ if (me.searchCookie) { >+ if (offset === me.searchCookie.offset - newresults.length) { >+ me.searchCookie.results = newresults.concat(me.searchCookie.results); >+ } else if (searchOffset = me.searchCookie.offset + newresults.length) { >+ me.searchCookie.results = me.searchCookie.results.concat(newresults); >+ } else { >+ delete me.searchCookie; >+ } >+ } >+ if (!me.searchCookie) { >+ me.searchCookie = { offset: offset, >+ query: query, >+ limit: limit, >+ sort: sort, >+ pagelen: newresults.length, >+ results: newresults >+ }; >+ } >+ $.cookie(me.searchid, JSON.stringify(me.searchCookie), { path: '/' }); >+ $(document).ready(function () { >+ $('#searchresults table tr a[href*="detail.pl"]').click(function (ev) { >+ ev.preventDefault(); >+ window.location = $(this).attr('href') + '&searchid=' + me.searchid; >+ }); >+ }); >+ }; >+ >+ this.show = function () { >+ if (me.searchCookie) { >+ me.curPos = $.inArray(biblionumber, me.searchCookie.results); >+ me.offset = Math.floor((me.searchCookie.offset + me.curPos - 1) / me.searchCookie.pagelen) * me.searchCookie.pagelen; >+ >+ $(document).ready(function () { >+ if (me.curPos > -1) { >+ var searchURL = '/cgi-bin/koha/catalogue/search.pl?' + decodeURIComponent(me.searchCookie.query) + '&limit=' + decodeURIComponent(me.searchCookie.limit) + '&sort=' + me.searchCookie.sort + '&searchid=' + me.searchid + '&offset=' + me.offset; >+ var prevbutton; >+ var nextbutton; >+ if (me.curPos === 0 && me.searchCookie.offset === 1) { >+ prevbutton = '<span id="browse-previous" class="browse-button">« ' + BROWSER_PREVIOUS + '</span>'; >+ } else { >+ prevbutton = '<a href="#" id="browse-previous" class="browse-button">« ' + BROWSER_PREVIOUS + '</a>'; >+ } >+ if (me.curPos === me.searchCookie.results.length && me.searchCookie.total == me.curPos + me.searchCookie.offset) { >+ nextbutton = '<span id="browse-next" class="browse-button">' + BROWSER_NEXT + ' »</span>'; >+ } else { >+ nextbutton = '<a href="#" id="browse-next" class="browse-button">' + BROWSER_NEXT + ' »</a>'; >+ } >+ $('#menu').before('<div class="browse-controls"><div class="browse-controls-inner"><div class="browse-label"><a href="' + searchURL + '" id="browse-return-to-results" class="browse-button">' + BROWSER_RETURN_TO_SEARCH + '</a></div><div>' + prevbutton + nextbutton + '</div></div></div>'); >+ $('a#browse-previous').click(function (ev) { >+ ev.preventDefault(); >+ browseRecords(searchid, -1); >+ }); >+ $('a#browse-next').click(function (ev) { >+ ev.preventDefault(); >+ browseRecords(me.searchid, 1); >+ }); >+ $('a[href*="biblionumber="]').click(function (ev) { >+ ev.preventDefault(); >+ window.location = $(this).attr('href') + '&searchid=' + me.searchid; >+ }); >+ $('form[name="f"]').append('<input type="hidden" name="searchid" value="' + me.searchid + '"></input>'); >+ } >+ }); >+ } >+ }; >+ >+ return me; >+}; >diff --git a/koha-tmpl/intranet-tmpl/lib/shims/json2.js b/koha-tmpl/intranet-tmpl/lib/shims/json2.js >new file mode 100644 >index 0000000..d89ecc7 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/lib/shims/json2.js >@@ -0,0 +1,486 @@ >+/* >+ json2.js >+ 2013-05-26 >+ >+ Public Domain. >+ >+ NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. >+ >+ See http://www.JSON.org/js.html >+ >+ >+ This code should be minified before deployment. >+ See http://javascript.crockford.com/jsmin.html >+ >+ USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO >+ NOT CONTROL. >+ >+ >+ This file creates a global JSON object containing two methods: stringify >+ and parse. >+ >+ JSON.stringify(value, replacer, space) >+ value any JavaScript value, usually an object or array. >+ >+ replacer an optional parameter that determines how object >+ values are stringified for objects. It can be a >+ function or an array of strings. >+ >+ space an optional parameter that specifies the indentation >+ of nested structures. If it is omitted, the text will >+ be packed without extra whitespace. If it is a number, >+ it will specify the number of spaces to indent at each >+ level. If it is a string (such as '\t' or ' '), >+ it contains the characters used to indent at each level. >+ >+ This method produces a JSON text from a JavaScript value. >+ >+ When an object value is found, if the object contains a toJSON >+ method, its toJSON method will be called and the result will be >+ stringified. A toJSON method does not serialize: it returns the >+ value represented by the name/value pair that should be serialized, >+ or undefined if nothing should be serialized. The toJSON method >+ will be passed the key associated with the value, and this will be >+ bound to the value >+ >+ For example, this would serialize Dates as ISO strings. >+ >+ Date.prototype.toJSON = function (key) { >+ function f(n) { >+ // Format integers to have at least two digits. >+ return n < 10 ? '0' + n : n; >+ } >+ >+ return this.getUTCFullYear() + '-' + >+ f(this.getUTCMonth() + 1) + '-' + >+ f(this.getUTCDate()) + 'T' + >+ f(this.getUTCHours()) + ':' + >+ f(this.getUTCMinutes()) + ':' + >+ f(this.getUTCSeconds()) + 'Z'; >+ }; >+ >+ You can provide an optional replacer method. It will be passed the >+ key and value of each member, with this bound to the containing >+ object. The value that is returned from your method will be >+ serialized. If your method returns undefined, then the member will >+ be excluded from the serialization. >+ >+ If the replacer parameter is an array of strings, then it will be >+ used to select the members to be serialized. It filters the results >+ such that only members with keys listed in the replacer array are >+ stringified. >+ >+ Values that do not have JSON representations, such as undefined or >+ functions, will not be serialized. Such values in objects will be >+ dropped; in arrays they will be replaced with null. You can use >+ a replacer function to replace those with JSON values. >+ JSON.stringify(undefined) returns undefined. >+ >+ The optional space parameter produces a stringification of the >+ value that is filled with line breaks and indentation to make it >+ easier to read. >+ >+ If the space parameter is a non-empty string, then that string will >+ be used for indentation. If the space parameter is a number, then >+ the indentation will be that many spaces. >+ >+ Example: >+ >+ text = JSON.stringify(['e', {pluribus: 'unum'}]); >+ // text is '["e",{"pluribus":"unum"}]' >+ >+ >+ text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); >+ // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' >+ >+ text = JSON.stringify([new Date()], function (key, value) { >+ return this[key] instanceof Date ? >+ 'Date(' + this[key] + ')' : value; >+ }); >+ // text is '["Date(---current time---)"]' >+ >+ >+ JSON.parse(text, reviver) >+ This method parses a JSON text to produce an object or array. >+ It can throw a SyntaxError exception. >+ >+ The optional reviver parameter is a function that can filter and >+ transform the results. It receives each of the keys and values, >+ and its return value is used instead of the original value. >+ If it returns what it received, then the structure is not modified. >+ If it returns undefined then the member is deleted. >+ >+ Example: >+ >+ // Parse the text. Values that look like ISO date strings will >+ // be converted to Date objects. >+ >+ myData = JSON.parse(text, function (key, value) { >+ var a; >+ if (typeof value === 'string') { >+ a = >+/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); >+ if (a) { >+ return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], >+ +a[5], +a[6])); >+ } >+ } >+ return value; >+ }); >+ >+ myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { >+ var d; >+ if (typeof value === 'string' && >+ value.slice(0, 5) === 'Date(' && >+ value.slice(-1) === ')') { >+ d = new Date(value.slice(5, -1)); >+ if (d) { >+ return d; >+ } >+ } >+ return value; >+ }); >+ >+ >+ This is a reference implementation. You are free to copy, modify, or >+ redistribute. >+*/ >+ >+/*jslint evil: true, regexp: true */ >+ >+/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, >+ call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, >+ getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, >+ lastIndex, length, parse, prototype, push, replace, slice, stringify, >+ test, toJSON, toString, valueOf >+*/ >+ >+ >+// Create a JSON object only if one does not already exist. We create the >+// methods in a closure to avoid creating global variables. >+ >+if (typeof JSON !== 'object') { >+ JSON = {}; >+} >+ >+(function () { >+ 'use strict'; >+ >+ function f(n) { >+ // Format integers to have at least two digits. >+ return n < 10 ? '0' + n : n; >+ } >+ >+ if (typeof Date.prototype.toJSON !== 'function') { >+ >+ Date.prototype.toJSON = function () { >+ >+ return isFinite(this.valueOf()) >+ ? this.getUTCFullYear() + '-' + >+ f(this.getUTCMonth() + 1) + '-' + >+ f(this.getUTCDate()) + 'T' + >+ f(this.getUTCHours()) + ':' + >+ f(this.getUTCMinutes()) + ':' + >+ f(this.getUTCSeconds()) + 'Z' >+ : null; >+ }; >+ >+ String.prototype.toJSON = >+ Number.prototype.toJSON = >+ Boolean.prototype.toJSON = function () { >+ return this.valueOf(); >+ }; >+ } >+ >+ var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, >+ escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, >+ gap, >+ indent, >+ meta = { // table of character substitutions >+ '\b': '\\b', >+ '\t': '\\t', >+ '\n': '\\n', >+ '\f': '\\f', >+ '\r': '\\r', >+ '"' : '\\"', >+ '\\': '\\\\' >+ }, >+ rep; >+ >+ >+ function quote(string) { >+ >+// If the string contains no control characters, no quote characters, and no >+// backslash characters, then we can safely slap some quotes around it. >+// Otherwise we must also replace the offending characters with safe escape >+// sequences. >+ >+ escapable.lastIndex = 0; >+ return escapable.test(string) ? '"' + string.replace(escapable, function (a) { >+ var c = meta[a]; >+ return typeof c === 'string' >+ ? c >+ : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); >+ }) + '"' : '"' + string + '"'; >+ } >+ >+ >+ function str(key, holder) { >+ >+// Produce a string from holder[key]. >+ >+ var i, // The loop counter. >+ k, // The member key. >+ v, // The member value. >+ length, >+ mind = gap, >+ partial, >+ value = holder[key]; >+ >+// If the value has a toJSON method, call it to obtain a replacement value. >+ >+ if (value && typeof value === 'object' && >+ typeof value.toJSON === 'function') { >+ value = value.toJSON(key); >+ } >+ >+// If we were called with a replacer function, then call the replacer to >+// obtain a replacement value. >+ >+ if (typeof rep === 'function') { >+ value = rep.call(holder, key, value); >+ } >+ >+// What happens next depends on the value's type. >+ >+ switch (typeof value) { >+ case 'string': >+ return quote(value); >+ >+ case 'number': >+ >+// JSON numbers must be finite. Encode non-finite numbers as null. >+ >+ return isFinite(value) ? String(value) : 'null'; >+ >+ case 'boolean': >+ case 'null': >+ >+// If the value is a boolean or null, convert it to a string. Note: >+// typeof null does not produce 'null'. The case is included here in >+// the remote chance that this gets fixed someday. >+ >+ return String(value); >+ >+// If the type is 'object', we might be dealing with an object or an array or >+// null. >+ >+ case 'object': >+ >+// Due to a specification blunder in ECMAScript, typeof null is 'object', >+// so watch out for that case. >+ >+ if (!value) { >+ return 'null'; >+ } >+ >+// Make an array to hold the partial results of stringifying this object value. >+ >+ gap += indent; >+ partial = []; >+ >+// Is the value an array? >+ >+ if (Object.prototype.toString.apply(value) === '[object Array]') { >+ >+// The value is an array. Stringify every element. Use null as a placeholder >+// for non-JSON values. >+ >+ length = value.length; >+ for (i = 0; i < length; i += 1) { >+ partial[i] = str(i, value) || 'null'; >+ } >+ >+// Join all of the elements together, separated with commas, and wrap them in >+// brackets. >+ >+ v = partial.length === 0 >+ ? '[]' >+ : gap >+ ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' >+ : '[' + partial.join(',') + ']'; >+ gap = mind; >+ return v; >+ } >+ >+// If the replacer is an array, use it to select the members to be stringified. >+ >+ if (rep && typeof rep === 'object') { >+ length = rep.length; >+ for (i = 0; i < length; i += 1) { >+ if (typeof rep[i] === 'string') { >+ k = rep[i]; >+ v = str(k, value); >+ if (v) { >+ partial.push(quote(k) + (gap ? ': ' : ':') + v); >+ } >+ } >+ } >+ } else { >+ >+// Otherwise, iterate through all of the keys in the object. >+ >+ for (k in value) { >+ if (Object.prototype.hasOwnProperty.call(value, k)) { >+ v = str(k, value); >+ if (v) { >+ partial.push(quote(k) + (gap ? ': ' : ':') + v); >+ } >+ } >+ } >+ } >+ >+// Join all of the member texts together, separated with commas, >+// and wrap them in braces. >+ >+ v = partial.length === 0 >+ ? '{}' >+ : gap >+ ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' >+ : '{' + partial.join(',') + '}'; >+ gap = mind; >+ return v; >+ } >+ } >+ >+// If the JSON object does not yet have a stringify method, give it one. >+ >+ if (typeof JSON.stringify !== 'function') { >+ JSON.stringify = function (value, replacer, space) { >+ >+// The stringify method takes a value and an optional replacer, and an optional >+// space parameter, and returns a JSON text. The replacer can be a function >+// that can replace values, or an array of strings that will select the keys. >+// A default replacer method can be provided. Use of the space parameter can >+// produce text that is more easily readable. >+ >+ var i; >+ gap = ''; >+ indent = ''; >+ >+// If the space parameter is a number, make an indent string containing that >+// many spaces. >+ >+ if (typeof space === 'number') { >+ for (i = 0; i < space; i += 1) { >+ indent += ' '; >+ } >+ >+// If the space parameter is a string, it will be used as the indent string. >+ >+ } else if (typeof space === 'string') { >+ indent = space; >+ } >+ >+// If there is a replacer, it must be a function or an array. >+// Otherwise, throw an error. >+ >+ rep = replacer; >+ if (replacer && typeof replacer !== 'function' && >+ (typeof replacer !== 'object' || >+ typeof replacer.length !== 'number')) { >+ throw new Error('JSON.stringify'); >+ } >+ >+// Make a fake root object containing our value under the key of ''. >+// Return the result of stringifying the value. >+ >+ return str('', {'': value}); >+ }; >+ } >+ >+ >+// If the JSON object does not yet have a parse method, give it one. >+ >+ if (typeof JSON.parse !== 'function') { >+ JSON.parse = function (text, reviver) { >+ >+// The parse method takes a text and an optional reviver function, and returns >+// a JavaScript value if the text is a valid JSON text. >+ >+ var j; >+ >+ function walk(holder, key) { >+ >+// The walk method is used to recursively walk the resulting structure so >+// that modifications can be made. >+ >+ var k, v, value = holder[key]; >+ if (value && typeof value === 'object') { >+ for (k in value) { >+ if (Object.prototype.hasOwnProperty.call(value, k)) { >+ v = walk(value, k); >+ if (v !== undefined) { >+ value[k] = v; >+ } else { >+ delete value[k]; >+ } >+ } >+ } >+ } >+ return reviver.call(holder, key, value); >+ } >+ >+ >+// Parsing happens in four stages. In the first stage, we replace certain >+// Unicode characters with escape sequences. JavaScript handles many characters >+// incorrectly, either silently deleting them, or treating them as line endings. >+ >+ text = String(text); >+ cx.lastIndex = 0; >+ if (cx.test(text)) { >+ text = text.replace(cx, function (a) { >+ return '\\u' + >+ ('0000' + a.charCodeAt(0).toString(16)).slice(-4); >+ }); >+ } >+ >+// In the second stage, we run the text against regular expressions that look >+// for non-JSON patterns. We are especially concerned with '()' and 'new' >+// because they can cause invocation, and '=' because it can cause mutation. >+// But just to be safe, we want to reject all unexpected forms. >+ >+// We split the second stage into 4 regexp operations in order to work around >+// crippling inefficiencies in IE's and Safari's regexp engines. First we >+// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we >+// replace all simple value tokens with ']' characters. Third, we delete all >+// open brackets that follow a colon or comma or that begin the text. Finally, >+// we look to see that the remaining characters are only whitespace or ']' or >+// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. >+ >+ if (/^[\],:{}\s]*$/ >+ .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') >+ .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') >+ .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { >+ >+// In the third stage we use the eval function to compile the text into a >+// JavaScript structure. The '{' operator is subject to a syntactic ambiguity >+// in JavaScript: it can begin a block or an object literal. We wrap the text >+// in parens to eliminate the ambiguity. >+ >+ j = eval('(' + text + ')'); >+ >+// In the optional fourth stage, we recursively walk the new structure, passing >+// each name/value pair to a reviver function for possible transformation. >+ >+ return typeof reviver === 'function' >+ ? walk({'': j}, '') >+ : j; >+ } >+ >+// If the text is not JSON parseable, then a SyntaxError is thrown. >+ >+ throw new SyntaxError('JSON.parse'); >+ }; >+ } >+}()); >diff --git a/koha-tmpl/intranet-tmpl/lib/shims/json2.min.js b/koha-tmpl/intranet-tmpl/lib/shims/json2.min.js >new file mode 100644 >index 0000000..60c8c13 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/lib/shims/json2.min.js >@@ -0,0 +1 @@ >+if(typeof JSON!=="object"){JSON={}}!function(){"use strict";function f(n){return n<10?"0"+n:n}if(typeof Date.prototype.toJSON!=="function"){Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()}}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+string+'"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==="object"&&typeof value.toJSON==="function"){value=value.toJSON(key)}if(typeof rep==="function"){value=rep.call(holder,key,value)}switch(typeof value){case"string":return quote(value);case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==="[object Array]"){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||"null"}v=partial.length===0?"[]":gap?"[\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"]":"["+partial.join(",")+"]";gap=mind;return v}if(rep&&typeof rep==="object"){length=rep.length;for(i=0;i<length;i+=1){if(typeof rep[i]==="string"){k=rep[i];v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}else{for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}v=partial.length===0?"{}":gap?"{\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"}":"{"+partial.join(",")+"}";gap=mind;return v}}if(typeof JSON.stringify!=="function"){JSON.stringify=function(value,replacer,space){var i;gap="";indent="";if(typeof space==="number"){for(i=0;i<space;i+=1){indent+=" "}}else if(typeof space==="string"){indent=space}rep=replacer;if(replacer&&typeof replacer!=="function"&&(typeof replacer!=="object"||typeof replacer.length!=="number")){throw new Error("JSON.stringify")}return str("",{"":value})}}if(typeof JSON.parse!=="function"){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==="object"){for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){j=eval("("+text+")");return typeof reviver==="function"?walk({"":j},""):j}throw new SyntaxError("JSON.parse")}}}(); >\ No newline at end of file >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 0fa93ab..086489b 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css >+++ b/koha-tmpl/intranet-tmpl/prog/en/css/staff-global.css >@@ -2589,4 +2589,45 @@ fieldset.rows table.mceListBox { > text-indent: 100%; > white-space: nowrap; > overflow: hidden; >-} >\ No newline at end of file >+} >+ >+.browse-controls { >+ padding-top: 1em; >+ margin-left: 1.1em; >+ border-right: 1px solid #b9d8d9; >+ margin-right: .5em; >+ padding-bottom: 1em; >+} >+ >+.browse-controls-inner { >+ padding: 0.3em; >+ background: #e8f0f6; >+ border-top-left-radius: 5px; >+ border-bottom-left-radius: 5px; >+ border: 1px solid #b9d8d9; >+} >+ >+#browse-return-to-results { >+ display: block; >+ text-align: center; >+} >+ >+.browse-button { >+ border: 1px solid #b9d8d9; >+ color: #004d99; >+ padding: .4em .6em; >+ display: inline-block; >+} >+ >+span.browse-button { >+ background: #fafafa; >+ color: #222; >+} >+ >+.browse-button:hover { >+ background: #fafafa; >+} >+ >+#browse-next { >+ float: right; >+} >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/browser-strings.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/browser-strings.inc >new file mode 100644 >index 0000000..3dda230 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/browser-strings.inc >@@ -0,0 +1,7 @@ >+<script type="text/javascript"> >+//<![CDATA[ >+ var BROWSER_RETURN_TO_SEARCH = _("Return to results"); >+ var BROWSER_PREVIOUS = _("Previous"); >+ var BROWSER_NEXT = _("Next"); >+//]]> >+</script> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/ISBDdetail.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/ISBDdetail.tt >index 9169f93..1c61305 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/ISBDdetail.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/ISBDdetail.tt >@@ -7,6 +7,17 @@ > [% END %] > </title> > [% INCLUDE 'doc-head-close.inc' %] >+[% INCLUDE 'browser-strings.inc' %] >+<!--[if lt IE 9]> >+<script type="text/javascript" src="[% interface %]/lib/shims/json2.min.js"></script> >+<![endif]--> >+<script type="text/javascript" src="[% interface %]/js/browser.js"></script> >+<script type="text/javascript"> >+//<![CDATA[ >+ var browser = KOHA.browser('[% searchid %]', parseInt('[% biblionumber %]', 10)); >+ browser.show(); >+//]]> >+</script> > </head> > <body id="catalog_ISBDdetail" class="catalog"> > >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/MARCdetail.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/MARCdetail.tt >index a9ab8d6..fd78eeb 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/MARCdetail.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/MARCdetail.tt >@@ -7,8 +7,15 @@ > [% END %] > </title> > [% INCLUDE 'doc-head-close.inc' %] >+[% INCLUDE 'browser-strings.inc' %] >+<!--[if lt IE 9]> >+<script type="text/javascript" src="[% interface %]/lib/shims/json2.min.js"></script> >+<![endif]--> >+<script type="text/javascript" src="[% interface %]/js/browser.js"></script> > <script type="text/javascript"> > //<![CDATA[ >+ var browser = KOHA.browser('[% searchid %]', parseInt('[% biblionumber %]', 10)); >+ browser.show(); > > $(document).ready(function() { > $('#bibliotabs').tabs(); >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 b3a4240..2c135fb 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tt >@@ -51,9 +51,11 @@ function verify_images() { > } > }); > } >+ > $(document).ready(function() { > $('#bibliodetails').tabs(); > $('#search-form').focus(); >+ > }); > [% IF ( AmazonCoverImages ) %]$(window).load(function() { > verify_images(); >@@ -63,10 +65,18 @@ function verify_images() { > <link rel="stylesheet" type="text/css" href="[% themelang %]/css/datatables.css" /> > <script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.dataTables.min.js"></script> > <script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.dataTables.columnFilter.js"></script> >+[% INCLUDE 'browser-strings.inc' %] >+<!--[if lt IE 9]> >+<script type="text/javascript" src="[% interface %]/lib/shims/json2.min.js"></script> >+<![endif]--> >+<script type="text/javascript" src="[% interface %]/js/browser.js"></script> > [% INCLUDE 'datatables-strings.inc' %] > <script type="text/javascript" src="[% themelang %]/js/datatables.js"></script> > <script type="text/javascript"> > //<![CDATA[ >+ var browser = KOHA.browser('[% searchid %]', parseInt('[% biblionumber %]', 10)); >+ browser.show(); >+ > function activate_filters(id) { > table = $("#" + id + " table"); > if (table.length == 1) { >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/labeledMARCdetail.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/labeledMARCdetail.tt >index 5a59f61..882a90c 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/labeledMARCdetail.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/labeledMARCdetail.tt >@@ -10,8 +10,15 @@ > > [% INCLUDE 'doc-head-close.inc' %] > >+ [% INCLUDE 'browser-strings.inc' %] >+ <!--[if lt IE 9]> >+ <script type="text/javascript" src="[% interface %]/lib/shims/json2.min.js"></script> >+ <![endif]--> >+ <script type="text/javascript" src="[% interface %]/js/browser.js"></script> > <script type="text/javascript"> > //<![CDATA[ >+ var browser = KOHA.browser('[% searchid %]', parseInt('[% biblionumber %]', 10)); >+ browser.show(); > function Changefwk(FwkList) > { > var fwk = FwkList.options[FwkList.selectedIndex].value; >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt >index 5234e28..205ddd7 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tt >@@ -2,6 +2,17 @@ > <title>Koha › Catalog › Item details for [% title %] [% FOREACH subtitl IN subtitle %] [% subtitl.subfield %][% END %]</title> > [% INCLUDE 'doc-head-close.inc' %] > <style type="text/css">h3{padding-top: 1em; border-top: 2px solid #CCCCCC;}</style> >+[% INCLUDE 'browser-strings.inc' %] >+<!--[if lt IE 9]> >+<script type="text/javascript" src="[% interface %]/lib/shims/json2.min.js"></script> >+<![endif]--> >+<script type="text/javascript" src="[% interface %]/js/browser.js"></script> >+<script type="text/javascript"> >+//<![CDATA[ >+ var browser = KOHA.browser('[% searchid %]', parseInt('[% biblionumber %]', 10)); >+ browser.show(); >+//]]> >+</script> > </head> > <body id="catalog_moredetail" class="catalog"> > [% USE KohaDates %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/results.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/results.tt >index db5aaec..29faab4 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/results.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/results.tt >@@ -1,6 +1,11 @@ > [% INCLUDE 'doc-head-open.inc' %] > <title>Koha › Catalog › [% IF ( searchdesc ) %]Results of search [% IF ( query_desc ) %]for '[% query_desc | html %]'[% END %][% IF ( limit_desc ) %] with limit(s): '[% limit_desc | html %]'[% END %][% ELSE %]You did not specify any search criteria[% END %]</title> > [% INCLUDE 'doc-head-close.inc' %] >+[% INCLUDE 'browser-strings.inc' %] >+<!--[if lt IE 9]> >+<script type="text/javascript" src="[% interface %]/lib/shims/json2.min.js"></script> >+<![endif]--> >+<script type="text/javascript" src="[% interface %]/js/browser.js"></script> > <script type="text/javascript"> > //<![CDATA[ > var MSG_NO_ITEM_SELECTED = _("Nothing is selected."); >@@ -126,6 +131,23 @@ $('#sort_by').change(function() { > $("#highlight_toggle_on" ).hide().click(function() {highlightOn() ;}); > $("#highlight_toggle_off").show().click(function() {highlightOff();}); > [% END %] >+ >+ [% IF (SEARCH_RESULTS) %] >+ var newresults = [ >+ [%- FOREACH result IN SEARCH_RESULTS -%] >+ [%- result.biblionumber %], >+ [%- END -%] >+ ]; >+ var browser = KOHA.browser('[% searchid %]', parseInt('[% biblionumber %]', 10)); >+ browser.create([% SEARCH_RESULTS.first.result_number %], '[% query_cgi | uri %]', '[% limit_cgi | uri %]', '[% sort_cgi | uri %]', newresults); >+ [% END %] >+ [% IF (gotoPage && gotoNumber) %] >+ [% IF (gotoNumber == 'first') %] >+ window.location = '/cgi-bin/koha/catalogue/[% gotoPage %]?biblionumber=' + [% SEARCH_RESULTS.first.biblionumber %] + '&searchid=[% searchid %]'; >+ [% ELSIF (gotoNumber == 'last') %] >+ window.location = '/cgi-bin/koha/catalogue/[% gotoPage %]?biblionumber=' + [% SEARCH_RESULTS.last.biblionumber %] + '&searchid=[% searchid %]'; >+ [% END %] >+ [% END %] > }); > > >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt >index 2b0dcba..fc6cf23 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt >@@ -3,8 +3,16 @@ > [% INCLUDE 'doc-head-close.inc' %] > <script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.fixFloat.js"></script> > <script type="text/javascript" src="[% themelang %]/js/cataloging.js"></script> >+[% INCLUDE 'browser-strings.inc' %] >+<!--[if lt IE 9]> >+<script type="text/javascript" src="[% interface %]/lib/shims/json2.min.js"></script> >+<![endif]--> >+<script type="text/javascript" src="[% interface %]/js/browser.js"></script> > <script type="text/javascript"> > //<![CDATA[ >+ var browser = KOHA.browser('[% searchid %]', parseInt('[% biblionumber %]', 10)); >+ browser.show(); >+ > $(window).load(function(){ > $("#loading").hide(); > }); >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt >index 3c385a6..8cc064b 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/additem.tt >@@ -2,8 +2,16 @@ > <title>Koha › Cataloging › [% title |html %] [% IF ( author ) %] by [% author %][% END %] (Record #[% biblionumber %]) › Items</title> > [% INCLUDE 'doc-head-close.inc' %] > <script type="text/javascript" src="[% themelang %]/js/cataloging.js"></script> >+[% INCLUDE 'browser-strings.inc' %] >+<!--[if lt IE 9]> >+<script type="text/javascript" src="[% interface %]/lib/shims/json2.min.js"></script> >+<![endif]--> >+<script type="text/javascript" src="[% interface %]/js/browser.js"></script> > <script type="text/javascript"> > //<![CDATA[ >+ var browser = KOHA.browser('[% searchid %]', parseInt('[% biblionumber %]', 10)); >+ browser.show(); >+ > $(document).ready(function(){ > [% IF (popup) %] > [% IF (opisadd) %] >-- >1.7.2.5
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 10404
:
20025
|
20132
|
20176
|
20177
|
20215
| 20225 |
20226