buttons.print.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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( config.exportOptions );
  75. var addRow = function ( d, tag ) {
  76. var str = '<tr>';
  77. for ( var i=0, ien=d.length ; i<ien ; i++ ) {
  78. str += '<'+tag+'>'+d[i]+'</'+tag+'>';
  79. }
  80. return str + '</tr>';
  81. };
  82. // Construct a table for printing
  83. var html = '<table class="'+dt.table().node().className+'">';
  84. if ( config.header ) {
  85. html += '<thead>'+ addRow( data.header, 'th' ) +'</thead>';
  86. }
  87. html += '<tbody>';
  88. for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
  89. html += addRow( data.body[i], 'td' );
  90. }
  91. html += '</tbody>';
  92. if ( config.footer && data.footer ) {
  93. html += '<tfoot>'+ addRow( data.footer, 'th' ) +'</tfoot>';
  94. }
  95. // Open a new window for the printable table
  96. var win = window.open( '', '' );
  97. var title = config.title;
  98. if ( typeof title === 'function' ) {
  99. title = title();
  100. }
  101. if ( title.indexOf( '*' ) !== -1 ) {
  102. title= title.replace( '*', $('title').text() );
  103. }
  104. win.document.close();
  105. // Inject the title and also a copy of the style and link tags from this
  106. // document so the table can retain its base styling. Note that we have
  107. // to use string manipulation as IE won't allow elements to be created
  108. // in the host document and then appended to the new window.
  109. var head = '<title>'+title+'</title>';
  110. $('style, link').each( function () {
  111. head += _styleToAbs( this );
  112. } );
  113. try {
  114. win.document.head.innerHTML = head; // Work around for Edge
  115. }
  116. catch (e) {
  117. $(win.document.head).html( head ); // Old IE
  118. }
  119. // Inject the table and other surrounding information
  120. win.document.body.innerHTML =
  121. '<h1>'+title+'</h1>'+
  122. '<div>'+
  123. (typeof config.message === 'function' ?
  124. config.message( dt, button, config ) :
  125. config.message
  126. )+
  127. '</div>'+
  128. html;
  129. $(win.document.body).addClass('dt-print-view');
  130. $('img', win.document.body).each( function ( i, img ) {
  131. img.setAttribute( 'src', _relToAbs( img.getAttribute('src') ) );
  132. } );
  133. if ( config.customize ) {
  134. config.customize( win );
  135. }
  136. setTimeout( function () {
  137. if ( config.autoPrint ) {
  138. win.print(); // blocking - so close will not
  139. win.close(); // execute until this is done
  140. }
  141. }, 250 );
  142. },
  143. title: '*',
  144. message: '',
  145. exportOptions: {},
  146. header: true,
  147. footer: false,
  148. autoPrint: true,
  149. customize: null
  150. };
  151. return DataTable.Buttons;
  152. }));