@@ -, +, @@ embedded columns This option adds x-koha-embed header to request. This option if true sets x-koha-query header with stringyfied json of filters +$('.table_selector').api({ + columns: [ + { + data: function(row, type, val, meta) { + return ''+row.holds.patron.firstname+''; + }, + orderable: true, + searchable: true + } + ] +}); +$('.table_selector').api({ + columns: [ + { + data: 'holds.patron.firstname', + render: function(row, type, val, meta) { + return ''+row.holds.patron.firstname+''; + }, + orderable: true, + searchable: true + } + ] +}); --- koha-tmpl/intranet-tmpl/prog/js/datatables.js | 28 +++++- .../opac-tmpl/bootstrap/js/datatables.js | 88 +++++++++++++++++++ 2 files changed, 114 insertions(+), 2 deletions(-) --- a/koha-tmpl/intranet-tmpl/prog/js/datatables.js +++ a/koha-tmpl/intranet-tmpl/prog/js/datatables.js @@ -527,6 +527,10 @@ jQuery.fn.dataTable.ext.errMode = function(settings, note, message) { if(options.embed) { xhr.setRequestHeader('x-koha-embed', Array.isArray(options.embed)?options.embed.join(','):options.embed); } + if(options.header_filter && options.query_parameters) { + xhr.setRequestHeader('x-koha-query', options.query_parameters); + delete options.query_parameters; + } }, 'dataFilter': function(data, type) { var json = {data: JSON.parse(data)}; @@ -547,8 +551,28 @@ jQuery.fn.dataTable.ext.errMode = function(settings, note, message) { var filter = data.search.value; if (filter != '') { - dataSet.name = filter; + var query_parameters = settings.aoColumns + .filter(function(col) { + return col.bSearchable && typeof col.data == 'string' + }) + .map(function(col) { + var part = {}; + part[!col.data.includes('.')?'me.'+col.data:col.data] = filter; + return part; + }); + + if(query_parameters.length) { + query_parameters = JSON.stringify(query_parameters.length === 1?query_parameters[0]:query_parameters); + if(options.header_filter) { + options.query_parameters = query_parameters; + } else { + dataSet.q = query_parameters; + } + } + dataSet._match = 'starts_with'; + } else { + delete options.query_parameters; } if(options.columns) { @@ -557,7 +581,7 @@ jQuery.fn.dataTable.ext.errMode = function(settings, note, message) { var order_col = e.column; var order_by = options.columns[order_col].data; var order_dir = e.dir == 'asc' ? '+' : '-'; - dataSet._order_by = order_dir + order_by; + dataSet._order_by = order_dir + (!order_by.includes('.')?'me.'+order_by:order_by); }); } --- a/koha-tmpl/opac-tmpl/bootstrap/js/datatables.js +++ a/koha-tmpl/opac-tmpl/bootstrap/js/datatables.js @@ -123,3 +123,91 @@ jQuery.extend( jQuery.fn.dataTableExt.sort, { }); }()); + +(function($) { + + $.fn.api = function(options) { + var settings = null; + if(options) { + settings = $.extend(true, {}, dataTablesDefaults, { + 'deferRender': true, + "paging": true, + 'serverSide': true, + 'searching': true, + 'pagingType': 'full', + 'ajax': { + 'type': 'GET', + 'cache': true, + 'dataSrc': 'data', + 'beforeSend': function(xhr, settings) { + this._xhr = xhr; + if(options.embed) { + xhr.setRequestHeader('x-koha-embed', Array.isArray(options.embed)?options.embed.join(','):options.embed); + } + if(options.header_filter && options.query_parameters) { + xhr.setRequestHeader('x-koha-query', options.query_parameters); + delete options.query_parameters; + } + }, + 'dataFilter': function(data, type) { + var json = {data: JSON.parse(data)}; + if(total = this._xhr.getResponseHeader('x-total-count')) { + json.recordsTotal = total; + json.recordsFiltered = total; + } + return JSON.stringify(json); + }, + 'data': function( data, settings ) { + var length = data.length; + var start = data.start; + + var dataSet = { + _page: Math.floor(start/length) + 1, + _per_page: length + }; + + var filter = data.search.value; + if (filter != '') { + var query_parameters = settings.aoColumns + .filter(function(col) { + return col.bSearchable && typeof col.data == 'string' + }) + .map(function(col) { + var part = {}; + part[!col.data.includes('.')?'me.'+col.data:col.data] = filter; + return part; + }); + + if(query_parameters.length) { + query_parameters = JSON.stringify(query_parameters.length === 1?query_parameters[0]:query_parameters); + if(options.header_filter) { + options.query_parameters = query_parameters; + } else { + dataSet.q = query_parameters; + } + } + + dataSet._match = 'starts_with'; + } else { + delete options.query_parameters; + } + + if(options.columns) { + var order = data.order; + order.forEach(function (e,i) { + var order_col = e.column; + var order_by = options.columns[order_col].data; + var order_dir = e.dir == 'asc' ? '+' : '-'; + dataSet._order_by = order_dir + (!order_by.includes('.')?'me.'+order_by:order_by); + }); + } + + return dataSet; + } + } + }, options); + } + return $(this).dataTable(settings); + }; + +})(jQuery); --