buttons.print.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /*!
  2. * Print button for Buttons and DataTables.
  3. * 2016 SpryMedia Ltd - datatables.net/license
  4. */
  5. (function( factory ){
  6. if ( typeof define === 'function' && define.amd ) {
  7. // AMD
  8. define( ['jquery', 'datatables.net', 'datatables.net-buttons'], function ( $ ) {
  9. return factory( $, window, document );
  10. } );
  11. }
  12. else if ( typeof exports === 'object' ) {
  13. // CommonJS
  14. module.exports = function (root, $) {
  15. if ( ! root ) {
  16. root = window;
  17. }
  18. if ( ! $ || ! $.fn.dataTable ) {
  19. $ = require('datatables.net')(root, $).$;
  20. }
  21. if ( ! $.fn.dataTable.Buttons ) {
  22. require('datatables.net-buttons')(root, $);
  23. }
  24. return factory( $, root, root.document );
  25. };
  26. }
  27. else {
  28. // Browser
  29. factory( jQuery, window, document );
  30. }
  31. }(function( $, window, document, undefined ) {
  32. 'use strict';
  33. var DataTable = $.fn.dataTable;
  34. var _link = document.createElement( 'a' );
  35. /**
  36. * Clone link and style tags, taking into account the need to change the source
  37. * path.
  38. *
  39. * @param {node} el Element to convert
  40. */
  41. var _styleToAbs = function( el ) {
  42. var url;
  43. var clone = $(el).clone()[0];
  44. var linkHost;
  45. if ( clone.nodeName.toLowerCase() === 'link' ) {
  46. clone.href = _relToAbs( clone.href );
  47. }
  48. return clone.outerHTML;
  49. };
  50. /**
  51. * Convert a URL from a relative to an absolute address so it will work
  52. * correctly in the popup window which has no base URL.
  53. *
  54. * @param {string} href URL
  55. */
  56. var _relToAbs = function( href ) {
  57. // Assign to a link on the original page so the browser will do all the
  58. // hard work of figuring out where the file actually is
  59. _link.href = href;
  60. var linkHost = _link.host;
  61. // IE doesn't have a trailing slash on the host
  62. // Chrome has it on the pathname
  63. if ( linkHost.indexOf('/') === -1 && _link.pathname.indexOf('/') !== 0) {
  64. linkHost += '/';
  65. }
  66. return _link.protocol+"//"+linkHost+_link.pathname+_link.search;
  67. };
  68. DataTable.ext.buttons.print = {
  69. className: 'buttons-print',
  70. text: function ( dt ) {
  71. return dt.i18n( 'buttons.print', 'Print' );
  72. },
  73. action: function ( e, dt, button, config ) {
  74. var data = dt.buttons.exportData(
  75. $.extend( {decodeEntities: false}, config.exportOptions ) // XSS protection
  76. );
  77. var exportInfo = dt.buttons.exportInfo( config );
  78. var addRow = function ( d, tag ) {
  79. var str = '<tr>';
  80. for ( var i=0, ien=d.length ; i<ien ; i++ ) {
  81. str += '<'+tag+'>'+d[i]+'</'+tag+'>';
  82. }
  83. return str + '</tr>';
  84. };
  85. // Construct a table for printing
  86. var html = '<table class="'+dt.table().node().className+'">';
  87. if ( config.header ) {
  88. html += '<thead>'+ addRow( data.header, 'th' ) +'</thead>';
  89. }
  90. html += '<tbody>';
  91. for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
  92. html += addRow( data.body[i], 'td' );
  93. }
  94. html += '</tbody>';
  95. if ( config.footer && data.footer ) {
  96. html += '<tfoot>'+ addRow( data.footer, 'th' ) +'</tfoot>';
  97. }
  98. html += '</table>';
  99. // Open a new window for the printable table
  100. var win = window.open( '', '' );
  101. win.document.close();
  102. // Inject the title and also a copy of the style and link tags from this
  103. // document so the table can retain its base styling. Note that we have
  104. // to use string manipulation as IE won't allow elements to be created
  105. // in the host document and then appended to the new window.
  106. var head = '<title>'+exportInfo.title+'</title>';
  107. $('style, link').each( function () {
  108. head += _styleToAbs( this );
  109. } );
  110. try {
  111. win.document.head.innerHTML = head; // Work around for Edge
  112. }
  113. catch (e) {
  114. $(win.document.head).html( head ); // Old IE
  115. }
  116. // Inject the table and other surrounding information
  117. win.document.body.innerHTML =
  118. '<h1>'+exportInfo.title+'</h1>'+
  119. '<div>'+(exportInfo.messageTop || '')+'</div>'+
  120. html+
  121. '<div>'+(exportInfo.messageBottom || '')+'</div>';
  122. $(win.document.body).addClass('dt-print-view');
  123. $('img', win.document.body).each( function ( i, img ) {
  124. img.setAttribute( 'src', _relToAbs( img.getAttribute('src') ) );
  125. } );
  126. if ( config.customize ) {
  127. config.customize( win );
  128. }
  129. // Allow stylesheets time to load
  130. setTimeout( function () {
  131. if ( config.autoPrint ) {
  132. win.print(); // blocking - so close will not
  133. win.close(); // execute until this is done
  134. }
  135. }, 1000 );
  136. },
  137. title: '*',
  138. messageTop: '*',
  139. messageBottom: '*',
  140. exportOptions: {},
  141. header: true,
  142. footer: false,
  143. autoPrint: true,
  144. customize: null
  145. };
  146. return DataTable.Buttons;
  147. }));