@@ -, +, @@ - Launch a search at the OPAC - Check some biblios - Go on another page - Check some biblios - Come back to the first page and check that already checked biblio is automatically checked. - Click on the "Browse selected biblios >>" link - Check that you are able to browse results you had checked. - check some biblios from several pages - add them to the cart - add them to a list --- .../bootstrap/en/includes/opac-bottom.inc | 4 + .../bootstrap/en/includes/page-numbers.inc | 4 +- .../opac-tmpl/bootstrap/en/modules/opac-detail.tt | 70 +++---- .../opac-tmpl/bootstrap/en/modules/opac-results.tt | 36 +++- koha-tmpl/opac-tmpl/bootstrap/js/basket.js | 42 +++-- koha-tmpl/opac-tmpl/bootstrap/js/commons.js | 72 +++++++ .../lib/jquery/plugins/jquery.cookie.min.js | 1 + .../bootstrap/lib/jquery/plugins/jquery.json.js | 199 ++++++++++++++++++++ 8 files changed, 377 insertions(+), 51 deletions(-) create mode 100644 koha-tmpl/opac-tmpl/bootstrap/js/commons.js create mode 100644 koha-tmpl/opac-tmpl/bootstrap/lib/jquery/plugins/jquery.cookie.min.js create mode 100644 koha-tmpl/opac-tmpl/bootstrap/lib/jquery/plugins/jquery.json.js --- a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-bottom.inc +++ a/koha-tmpl/opac-tmpl/bootstrap/en/includes/opac-bottom.inc @@ -79,6 +79,10 @@ + + + + --- a/koha-tmpl/opac-tmpl/bootstrap/js/basket.js +++ a/koha-tmpl/opac-tmpl/bootstrap/js/basket.js @@ -157,17 +157,25 @@ function SelectAll(){ } function addMultiple(){ + var bibnums = getContextBiblioNumbers(); var c_value = ""; - if(document.bookbag_form.biblionumber.length > 0) { - for (var i=0; i < document.bookbag_form.biblionumber.length; i++) { - if (document.bookbag_form.biblionumber[i].checked) { - c_value = c_value + document.bookbag_form.biblionumber[i].value + "/"; - } + if ( bibnums.length > 0 ) { + for ( var i = 0 ; i < bibnums.length ; i++ ) { + c_value = c_value + bibnums[i] + "/"; } addSelRecords(c_value); } else { - c_value = c_value + document.bookbag_form.biblionumber.value + "/"; - addSelRecords(c_value); + if(document.bookbag_form.biblionumber.length > 0) { + for (var i=0; i < document.bookbag_form.biblionumber.length; i++) { + if (document.bookbag_form.biblionumber[i].checked) { + c_value = c_value + document.bookbag_form.biblionumber[i].value + "/"; + } + } + addSelRecords(c_value); + } else { + c_value = c_value + document.bookbag_form.biblionumber.value + "/"; + addSelRecords(c_value); + } } } @@ -433,20 +441,28 @@ function addSelToShelf() { /// vShelfAdd() builds url string for multiple-biblio adds. function vShelfAdd() { - bibs= new Array; + var bibnums = getContextBiblioNumbers(); + bibs = new Array; + if ( bibnums.length > 0 ) { + for ( var i = 0 ; i < bibnums.length ; i++ ) { + bibs.push("biblionumber=" + bibnums[i]); + } + return bibs.join("&"); + } else { if(document.bookbag_form.biblionumber.length > 0) { - for (var i=0; i < document.bookbag_form.biblionumber.length; i++) { - if (document.bookbag_form.biblionumber[i].checked) { - bibs.push("biblionumber=" + document.bookbag_form.biblionumber[i].value); - } + for (var i=0; i < document.bookbag_form.biblionumber.length; i++) { + if (document.bookbag_form.biblionumber[i].checked) { + bibs.push("biblionumber=" + document.bookbag_form.biblionumber[i].value); } - if (bibs.length == 0) { showListsUpdate(MSG_NO_RECORD_SELECTED); } + } + if (bibs.length == 0) { showListsUpdate(MSG_NO_RECORD_SELECTED); } return bibs.join("&"); } else { if (document.bookbag_form.biblionumber.checked) { return "biblionumber=" + document.bookbag_form.biblionumber.value; } } + } } function showCart(){ --- a/koha-tmpl/opac-tmpl/bootstrap/js/commons.js +++ a/koha-tmpl/opac-tmpl/bootstrap/js/commons.js @@ -0,0 +1,72 @@ +// Extends jQuery API +// http://www.wskidmore.com/downloads/jquery-uniqueArray.min.js +jQuery.extend({uniqueArray:function(e){if($.isArray(e)){var c={};var a,b;for(b=0,a=e.length;b + */ +(function ($) { + 'use strict'; + + var escape = /["\\\x00-\x1f\x7f-\x9f]/g, + meta = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + hasOwn = Object.prototype.hasOwnProperty; + + /** + * jQuery.toJSON + * Converts the given argument into a JSON representation. + * + * @param o {Mixed} The json-serializable *thing* to be converted + * + * If an object has a toJSON prototype, that will be used to get the representation. + * Non-integer/string keys are skipped in the object, as are keys that point to a + * function. + * + */ + $.toJSON = typeof JSON === 'object' && JSON.stringify ? JSON.stringify : function (o) { + if (o === null) { + return 'null'; + } + + var pairs, k, name, val, + type = $.type(o); + + if (type === 'undefined') { + return undefined; + } + + // Also covers instantiated Number and Boolean objects, + // which are typeof 'object' but thanks to $.type, we + // catch them here. I don't know whether it is right + // or wrong that instantiated primitives are not + // exported to JSON as an {"object":..}. + // We choose this path because that's what the browsers did. + if (type === 'number' || type === 'boolean') { + return String(o); + } + if (type === 'string') { + return $.quoteString(o); + } + if (typeof o.toJSON === 'function') { + return $.toJSON(o.toJSON()); + } + if (type === 'date') { + var month = o.getUTCMonth() + 1, + day = o.getUTCDate(), + year = o.getUTCFullYear(), + hours = o.getUTCHours(), + minutes = o.getUTCMinutes(), + seconds = o.getUTCSeconds(), + milli = o.getUTCMilliseconds(); + + if (month < 10) { + month = '0' + month; + } + if (day < 10) { + day = '0' + day; + } + if (hours < 10) { + hours = '0' + hours; + } + if (minutes < 10) { + minutes = '0' + minutes; + } + if (seconds < 10) { + seconds = '0' + seconds; + } + if (milli < 100) { + milli = '0' + milli; + } + if (milli < 10) { + milli = '0' + milli; + } + return '"' + year + '-' + month + '-' + day + 'T' + + hours + ':' + minutes + ':' + seconds + + '.' + milli + 'Z"'; + } + + pairs = []; + + if ($.isArray(o)) { + for (k = 0; k < o.length; k++) { + pairs.push($.toJSON(o[k]) || 'null'); + } + return '[' + pairs.join(',') + ']'; + } + + // Any other object (plain object, RegExp, ..) + // Need to do typeof instead of $.type, because we also + // want to catch non-plain objects. + if (typeof o === 'object') { + for (k in o) { + // Only include own properties, + // Filter out inherited prototypes + if (hasOwn.call(o, k)) { + // Keys must be numerical or string. Skip others + type = typeof k; + if (type === 'number') { + name = '"' + k + '"'; + } else if (type === 'string') { + name = $.quoteString(k); + } else { + continue; + } + type = typeof o[k]; + + // Invalid values like these return undefined + // from toJSON, however those object members + // shouldn't be included in the JSON string at all. + if (type !== 'function' && type !== 'undefined') { + val = $.toJSON(o[k]); + pairs.push(name + ':' + val); + } + } + } + return '{' + pairs.join(',') + '}'; + } + }; + + /** + * jQuery.evalJSON + * Evaluates a given json string. + * + * @param str {String} + */ + $.evalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) { + /*jshint evil: true */ + return eval('(' + str + ')'); + }; + + /** + * jQuery.secureEvalJSON + * Evals JSON in a way that is *more* secure. + * + * @param str {String} + */ + $.secureEvalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function (str) { + var filtered = + str + .replace(/\\["\\\/bfnrtu]/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''); + + if (/^[\],:{}\s]*$/.test(filtered)) { + /*jshint evil: true */ + return eval('(' + str + ')'); + } + throw new SyntaxError('Error parsing JSON, source is not valid.'); + }; + + /** + * jQuery.quoteString + * Returns a string-repr of a string, escaping quotes intelligently. + * Mostly a support function for toJSON. + * Examples: + * >>> jQuery.quoteString('apple') + * "apple" + * + * >>> jQuery.quoteString('"Where are we going?", she asked.') + * "\"Where are we going?\", she asked." + */ + $.quoteString = function (str) { + if (str.match(escape)) { + return '"' + str.replace(escape, function (a) { + var c = meta[a]; + if (typeof c === 'string') { + return c; + } + c = a.charCodeAt(); + return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); + }) + '"'; + } + return '"' + str + '"'; + }; + +}(jQuery)); --