sagacity/script/datatables/Buttons-1.0.3/js/buttons.print.js
2018-05-07 10:51:08 -04:00

129 lines
2.8 KiB
JavaScript

/*!
* Print button for Buttons and DataTables.
* 2015 SpryMedia Ltd - datatables.net/license
*/
(function($, DataTable) {
"use strict";
var _link = document.createElement( 'a' );
/**
* Convert a `link` tag's URL from a relative to an absolute address so it will
* work correctly in the popup window which has no base URL.
*
* @param {node} el Element to convert
*/
var _relToAbs = function( el ) {
var url;
var clone = $(el).clone()[0];
var linkHost;
if ( clone.nodeName.toLowerCase() === 'link' ) {
_link.href = clone.href;
linkHost = _link.host;
// IE doesn't have a trailing slash on the host
// Chrome has it on the pathname
if ( linkHost.indexOf('/') === -1 && _link.pathname.indexOf('/') !== 0) {
linkHost += '/';
}
clone.href = _link.protocol+"//"+linkHost+_link.pathname+_link.search;
}
return clone.outerHTML;
};
DataTable.ext.buttons.print = {
className: 'buttons-print',
text: function ( dt ) {
return dt.i18n( 'buttons.print', 'Print' );
},
action: function ( e, dt, button, config ) {
var data = dt.buttons.exportData( config.exportOptions );
var addRow = function ( d, tag ) {
var str = '<tr>';
for ( var i=0, ien=d.length ; i<ien ; i++ ) {
str += '<'+tag+'>'+d[i]+'</'+tag+'>';
}
return str + '</tr>';
};
// Construct a table for printing
var html = '<table class="'+dt.table().node().className+'">';
if ( config.header ) {
html += '<thead>'+ addRow( data.header, 'th' ) +'</thead>';
}
html += '<tbody>';
for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
html += addRow( data.body[i], 'td' );
}
html += '</tbody>';
if ( config.footer ) {
html += '<thead>'+ addRow( data.footer, 'th' ) +'</thead>';
}
// Open a new window for the printable table
var win = window.open( '', '' );
var title = config.title.replace( '*', $('title').text() );
win.document.close();
// Inject the title and also a copy of the style and link tags from this
// document so the table can retain its base styling. Note that we have
// to use string manipulation as IE won't allow elements to be created
// in the host document and then appended to the new window.
var head = '<title>'+title+'</title>';
$('style, link').each( function () {
head += _relToAbs( this );
} );
$(win.document.head).html( head );
// Inject the table and other surrounding information
$(win.document.body).html(
'<h1>'+title+'</h1>'+
'<div>'+config.message+'</div>'+
html
);
if ( config.customize ) {
config.customize( win );
}
setTimeout( function () {
if ( config.autoPrint ) {
win.print(); // blocking - so close will not
win.close(); // execute until this is done
}
}, 250 );
},
title: '*',
message: '',
exportOptions: {},
header: true,
footer: false,
autoPrint: true,
customize: null
};
})(jQuery, jQuery.fn.dataTable);