effective_datatables 3.2.7 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/dataTables/buttons/buttons.bootstrap.js +3 -1
- data/app/assets/javascripts/dataTables/buttons/buttons.colVis.js +19 -10
- data/app/assets/javascripts/dataTables/buttons/buttons.html5.js +126 -77
- data/app/assets/javascripts/dataTables/buttons/buttons.print.js +45 -35
- data/app/assets/javascripts/dataTables/buttons/dataTables.buttons.js +177 -9
- data/app/assets/javascripts/dataTables/dataTables.bootstrap.js +1 -1
- data/app/assets/javascripts/dataTables/jquery.dataTables.js +15217 -15281
- data/app/assets/javascripts/dataTables/responsive/dataTables.responsive.js +1183 -1065
- data/app/assets/javascripts/dataTables/responsive/responsive.bootstrap.js +59 -55
- data/app/assets/stylesheets/dataTables/buttons/buttons.bootstrap.css +56 -0
- data/app/assets/stylesheets/dataTables/dataTables.bootstrap.css +10 -7
- data/app/assets/stylesheets/dataTables/responsive/responsive.bootstrap.css +10 -11
- data/app/assets/stylesheets/effective_datatables/_filters.scss +1 -0
- data/app/assets/stylesheets/effective_datatables/_overrides.scss +13 -15
- data/app/assets/stylesheets/effective_datatables.scss +0 -1
- data/app/helpers/effective_datatables_helper.rb +1 -1
- data/lib/effective_datatables/version.rb +1 -1
- metadata +1 -2
- data/app/assets/stylesheets/dataTables/colReorder/colReorder.bootstrap.css +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d15e87f91c336f09837c05c1cd19ae3eb109aa5c
|
4
|
+
data.tar.gz: 02baa43cac7e7ecb1b0dbdee89d22512e98af70a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4df1c018bc13eb6bfe06a9309b52081dfe5f7840fc136a7d9b31d8ac06d8d1fde0c1ea1e66bbee7a3616238fba866f9eb572e3c75d7b8ffb451b33411e1dc4fb
|
7
|
+
data.tar.gz: 6daf450e7860fa17e318c1b29e65b3cad892eb3b94fc235186db44b3c31073c9c08621b3c9963b21a3bae29fc602dc54939645946df68ae34be87f7c8e79b4dd
|
@@ -49,7 +49,9 @@ $.extend( true, DataTable.Buttons.defaults, {
|
|
49
49
|
className: 'dt-button-collection dropdown-menu',
|
50
50
|
button: {
|
51
51
|
tag: 'li',
|
52
|
-
className: 'dt-button'
|
52
|
+
className: 'dt-button',
|
53
|
+
active: 'active',
|
54
|
+
disabled: 'disabled'
|
53
55
|
},
|
54
56
|
buttonLiner: {
|
55
57
|
tag: 'a',
|
@@ -48,7 +48,8 @@ $.extend( DataTable.ext.buttons, {
|
|
48
48
|
className: 'buttons-colvis',
|
49
49
|
buttons: [ {
|
50
50
|
extend: 'columnsToggle',
|
51
|
-
columns: conf.columns
|
51
|
+
columns: conf.columns,
|
52
|
+
columnText: conf.columnText
|
52
53
|
} ]
|
53
54
|
};
|
54
55
|
},
|
@@ -58,7 +59,8 @@ $.extend( DataTable.ext.buttons, {
|
|
58
59
|
var columns = dt.columns( conf.columns ).indexes().map( function ( idx ) {
|
59
60
|
return {
|
60
61
|
extend: 'columnToggle',
|
61
|
-
columns: idx
|
62
|
+
columns: idx,
|
63
|
+
columnText: conf.columnText
|
62
64
|
};
|
63
65
|
} ).toArray();
|
64
66
|
|
@@ -69,7 +71,8 @@ $.extend( DataTable.ext.buttons, {
|
|
69
71
|
columnToggle: function ( dt, conf ) {
|
70
72
|
return {
|
71
73
|
extend: 'columnVisibility',
|
72
|
-
columns: conf.columns
|
74
|
+
columns: conf.columns,
|
75
|
+
columnText: conf.columnText
|
73
76
|
};
|
74
77
|
},
|
75
78
|
|
@@ -79,7 +82,8 @@ $.extend( DataTable.ext.buttons, {
|
|
79
82
|
return {
|
80
83
|
extend: 'columnVisibility',
|
81
84
|
columns: idx,
|
82
|
-
visibility: conf.visibility
|
85
|
+
visibility: conf.visibility,
|
86
|
+
columnText: conf.columnText
|
83
87
|
};
|
84
88
|
} ).toArray();
|
85
89
|
|
@@ -90,7 +94,7 @@ $.extend( DataTable.ext.buttons, {
|
|
90
94
|
columnVisibility: {
|
91
95
|
columns: undefined, // column selector
|
92
96
|
text: function ( dt, button, conf ) {
|
93
|
-
return conf._columnText( dt, conf
|
97
|
+
return conf._columnText( dt, conf );
|
94
98
|
},
|
95
99
|
className: 'buttons-columnVisibility',
|
96
100
|
action: function ( e, dt, button, conf ) {
|
@@ -107,7 +111,7 @@ $.extend( DataTable.ext.buttons, {
|
|
107
111
|
|
108
112
|
dt
|
109
113
|
.on( 'column-visibility.dt'+conf.namespace, function (e, settings) {
|
110
|
-
if ( ! settings.bDestroying ) {
|
114
|
+
if ( ! settings.bDestroying && settings.nTable == dt.settings()[0].nTable ) {
|
111
115
|
that.active( dt.column( conf.columns ).visible() );
|
112
116
|
}
|
113
117
|
} )
|
@@ -124,7 +128,7 @@ $.extend( DataTable.ext.buttons, {
|
|
124
128
|
|
125
129
|
var col = dt.column( conf.columns );
|
126
130
|
|
127
|
-
that.text( conf._columnText( dt, conf
|
131
|
+
that.text( conf._columnText( dt, conf ) );
|
128
132
|
that.active( col.visible() );
|
129
133
|
} );
|
130
134
|
|
@@ -136,16 +140,21 @@ $.extend( DataTable.ext.buttons, {
|
|
136
140
|
.off( 'column-reorder.dt'+conf.namespace );
|
137
141
|
},
|
138
142
|
|
139
|
-
_columnText: function ( dt,
|
143
|
+
_columnText: function ( dt, conf ) {
|
140
144
|
// Use DataTables' internal data structure until this is presented
|
141
145
|
// is a public API. The other option is to use
|
142
146
|
// `$( column(col).node() ).text()` but the node might not have been
|
143
147
|
// populated when Buttons is constructed.
|
144
|
-
var idx = dt.column(
|
145
|
-
|
148
|
+
var idx = dt.column( conf.columns ).index();
|
149
|
+
var title = dt.settings()[0].aoColumns[ idx ].sTitle
|
146
150
|
.replace(/\n/g," ") // remove new lines
|
151
|
+
.replace(/<br\s*\/?>/gi, " ") // replace line breaks with spaces
|
147
152
|
.replace( /<.*?>/g, "" ) // strip HTML
|
148
153
|
.replace(/^\s+|\s+$/g,""); // trim
|
154
|
+
|
155
|
+
return conf.columnText ?
|
156
|
+
conf.columnText( dt, idx, title ) :
|
157
|
+
title;
|
149
158
|
}
|
150
159
|
},
|
151
160
|
|
@@ -228,35 +228,6 @@ DataTable.fileSave = _saveAs;
|
|
228
228
|
* Local (private) functions
|
229
229
|
*/
|
230
230
|
|
231
|
-
/**
|
232
|
-
* Get the file name for an exported file.
|
233
|
-
*
|
234
|
-
* @param {object} config Button configuration
|
235
|
-
* @param {boolean} incExtension Include the file name extension
|
236
|
-
*/
|
237
|
-
var _filename = function ( config, incExtension )
|
238
|
-
{
|
239
|
-
// Backwards compatibility
|
240
|
-
var filename = config.filename === '*' && config.title !== '*' && config.title !== undefined ?
|
241
|
-
config.title :
|
242
|
-
config.filename;
|
243
|
-
|
244
|
-
if ( typeof filename === 'function' ) {
|
245
|
-
filename = filename();
|
246
|
-
}
|
247
|
-
|
248
|
-
if ( filename.indexOf( '*' ) !== -1 ) {
|
249
|
-
filename = $.trim( filename.replace( '*', $('title').text() ) );
|
250
|
-
}
|
251
|
-
|
252
|
-
// Strip characters which the OS will object to
|
253
|
-
filename = filename.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g, "");
|
254
|
-
|
255
|
-
return incExtension === undefined || incExtension === true ?
|
256
|
-
filename+config.extension :
|
257
|
-
filename;
|
258
|
-
};
|
259
|
-
|
260
231
|
/**
|
261
232
|
* Get the sheet name for Excel exports.
|
262
233
|
*
|
@@ -270,25 +241,7 @@ var _sheetname = function ( config )
|
|
270
241
|
sheetName = config.sheetName.replace(/[\[\]\*\/\\\?\:]/g, '');
|
271
242
|
}
|
272
243
|
|
273
|
-
return sheetName;
|
274
|
-
};
|
275
|
-
|
276
|
-
/**
|
277
|
-
* Get the title for an exported file.
|
278
|
-
*
|
279
|
-
* @param {object} config Button configuration
|
280
|
-
*/
|
281
|
-
var _title = function ( config )
|
282
|
-
{
|
283
|
-
var title = config.title;
|
284
|
-
|
285
|
-
if ( typeof title === 'function' ) {
|
286
|
-
title = title();
|
287
|
-
}
|
288
|
-
|
289
|
-
return title.indexOf( '*' ) !== -1 ?
|
290
|
-
title.replace( '*', $('title').text() || 'Exported data' ) :
|
291
|
-
title;
|
244
|
+
return sheetName;
|
292
245
|
};
|
293
246
|
|
294
247
|
/**
|
@@ -473,7 +426,7 @@ function _addToZip( zip, obj ) {
|
|
473
426
|
|
474
427
|
// Safari, IE and Edge will put empty name space attributes onto
|
475
428
|
// various elements making them useless. This strips them out
|
476
|
-
str = str.replace( /<(
|
429
|
+
str = str.replace( /<([^<>]*?) xmlns=""([^<>]*?)>/g, '<$1 $2>' );
|
477
430
|
|
478
431
|
zip.file( name, str );
|
479
432
|
}
|
@@ -498,13 +451,13 @@ function _createNode( doc, nodeName, opts ) {
|
|
498
451
|
$(tempNode).attr( opts.attr );
|
499
452
|
}
|
500
453
|
|
501
|
-
if( opts.children ) {
|
454
|
+
if ( opts.children ) {
|
502
455
|
$.each( opts.children, function ( key, value ) {
|
503
456
|
tempNode.appendChild( value );
|
504
|
-
});
|
457
|
+
} );
|
505
458
|
}
|
506
459
|
|
507
|
-
if( opts.text ) {
|
460
|
+
if ( opts.text !== null && opts.text !== undefined ) {
|
508
461
|
tempNode.appendChild( doc.createTextNode( opts.text ) );
|
509
462
|
}
|
510
463
|
}
|
@@ -527,7 +480,10 @@ function _excelColWidth( data, col ) {
|
|
527
480
|
}
|
528
481
|
|
529
482
|
for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
|
530
|
-
|
483
|
+
var point = data.body[i][col];
|
484
|
+
str = point !== null && point !== undefined ?
|
485
|
+
point.toString() :
|
486
|
+
'';
|
531
487
|
|
532
488
|
// If there is a newline character, workout the width of the column
|
533
489
|
// based on the longest line in the string
|
@@ -549,7 +505,7 @@ function _excelColWidth( data, col ) {
|
|
549
505
|
|
550
506
|
// Max width rather than having potentially massive column widths
|
551
507
|
if ( max > 40 ) {
|
552
|
-
|
508
|
+
return 52; // 40 * 1.3
|
553
509
|
}
|
554
510
|
}
|
555
511
|
|
@@ -602,6 +558,7 @@ var excelStrings = {
|
|
602
558
|
'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+
|
603
559
|
'<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">'+
|
604
560
|
'<sheetData/>'+
|
561
|
+
'<mergeCells count="0"/>'+
|
605
562
|
'</worksheet>',
|
606
563
|
|
607
564
|
"xl/styles.xml":
|
@@ -709,11 +666,11 @@ var excelStrings = {
|
|
709
666
|
'<xf numFmtId="0" fontId="2" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
|
710
667
|
'<xf numFmtId="0" fontId="3" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
|
711
668
|
'<xf numFmtId="0" fontId="4" fillId="2" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
|
712
|
-
'<xf numFmtId="0" fontId="0" fillId="
|
713
|
-
'<xf numFmtId="0" fontId="1" fillId="
|
714
|
-
'<xf numFmtId="0" fontId="2" fillId="
|
715
|
-
'<xf numFmtId="0" fontId="3" fillId="
|
716
|
-
'<xf numFmtId="0" fontId="4" fillId="
|
669
|
+
'<xf numFmtId="0" fontId="0" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
|
670
|
+
'<xf numFmtId="0" fontId="1" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
|
671
|
+
'<xf numFmtId="0" fontId="2" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
|
672
|
+
'<xf numFmtId="0" fontId="3" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
|
673
|
+
'<xf numFmtId="0" fontId="4" fillId="3" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
|
717
674
|
'<xf numFmtId="0" fontId="0" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
|
718
675
|
'<xf numFmtId="0" fontId="1" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
|
719
676
|
'<xf numFmtId="0" fontId="2" fillId="4" borderId="0" applyFont="1" applyFill="1" applyBorder="1"/>'+
|
@@ -824,7 +781,12 @@ DataTable.ext.buttons.copyHtml5 = {
|
|
824
781
|
},
|
825
782
|
|
826
783
|
action: function ( e, dt, button, config ) {
|
784
|
+
this.processing( true );
|
785
|
+
|
786
|
+
var that = this;
|
827
787
|
var exportData = _exportData( dt, config );
|
788
|
+
var info = dt.buttons.exportInfo( config );
|
789
|
+
var newline = _newLine(config);
|
828
790
|
var output = exportData.str;
|
829
791
|
var hiddenDiv = $('<div/>')
|
830
792
|
.css( {
|
@@ -836,6 +798,18 @@ DataTable.ext.buttons.copyHtml5 = {
|
|
836
798
|
left: 0
|
837
799
|
} );
|
838
800
|
|
801
|
+
if ( info.title ) {
|
802
|
+
output = info.title + newline + newline + output;
|
803
|
+
}
|
804
|
+
|
805
|
+
if ( info.messageTop ) {
|
806
|
+
output = info.messageTop + newline + newline + output;
|
807
|
+
}
|
808
|
+
|
809
|
+
if ( info.messageBottom ) {
|
810
|
+
output = output + newline + newline + info.messageBottom;
|
811
|
+
}
|
812
|
+
|
839
813
|
if ( config.customize ) {
|
840
814
|
output = config.customize( output, config );
|
841
815
|
}
|
@@ -863,6 +837,8 @@ DataTable.ext.buttons.copyHtml5 = {
|
|
863
837
|
}, exportData.rows ),
|
864
838
|
2000
|
865
839
|
);
|
840
|
+
|
841
|
+
this.processing( false );
|
866
842
|
return;
|
867
843
|
}
|
868
844
|
}
|
@@ -896,10 +872,12 @@ DataTable.ext.buttons.copyHtml5 = {
|
|
896
872
|
.on( 'keydown.buttons-copy', function (e) {
|
897
873
|
if ( e.keyCode === 27 ) { // esc
|
898
874
|
close();
|
875
|
+
that.processing( false );
|
899
876
|
}
|
900
877
|
} )
|
901
878
|
.on( 'copy.buttons-copy cut.buttons-copy', function () {
|
902
879
|
close();
|
880
|
+
that.processing( false );
|
903
881
|
} );
|
904
882
|
},
|
905
883
|
|
@@ -911,7 +889,13 @@ DataTable.ext.buttons.copyHtml5 = {
|
|
911
889
|
|
912
890
|
header: true,
|
913
891
|
|
914
|
-
footer: false
|
892
|
+
footer: false,
|
893
|
+
|
894
|
+
title: '*',
|
895
|
+
|
896
|
+
messageTop: '*',
|
897
|
+
|
898
|
+
messageBottom: '*'
|
915
899
|
};
|
916
900
|
|
917
901
|
//
|
@@ -931,8 +915,11 @@ DataTable.ext.buttons.csvHtml5 = {
|
|
931
915
|
},
|
932
916
|
|
933
917
|
action: function ( e, dt, button, config ) {
|
918
|
+
this.processing( true );
|
919
|
+
|
934
920
|
// Set the text
|
935
921
|
var output = _exportData( dt, config ).str;
|
922
|
+
var info = dt.buttons.exportInfo(config);
|
936
923
|
var charset = config.charset;
|
937
924
|
|
938
925
|
if ( config.customize ) {
|
@@ -958,9 +945,11 @@ DataTable.ext.buttons.csvHtml5 = {
|
|
958
945
|
|
959
946
|
_saveAs(
|
960
947
|
new Blob( [output], {type: 'text/csv'+charset} ),
|
961
|
-
|
948
|
+
info.filename,
|
962
949
|
true
|
963
950
|
);
|
951
|
+
|
952
|
+
this.processing( false );
|
964
953
|
},
|
965
954
|
|
966
955
|
filename: '*',
|
@@ -997,6 +986,9 @@ DataTable.ext.buttons.excelHtml5 = {
|
|
997
986
|
},
|
998
987
|
|
999
988
|
action: function ( e, dt, button, config ) {
|
989
|
+
this.processing( true );
|
990
|
+
|
991
|
+
var that = this;
|
1000
992
|
var rowPos = 0;
|
1001
993
|
var getXml = function ( type ) {
|
1002
994
|
var str = excelStrings[ type ];
|
@@ -1048,7 +1040,10 @@ DataTable.ext.buttons.excelHtml5 = {
|
|
1048
1040
|
for ( var j=0, jen=_excelSpecials.length ; j<jen ; j++ ) {
|
1049
1041
|
var special = _excelSpecials[j];
|
1050
1042
|
|
1051
|
-
|
1043
|
+
// TODO Need to provide the ability for the specials to say
|
1044
|
+
// if they are returning a string, since at the moment it is
|
1045
|
+
// assumed to be a number
|
1046
|
+
if ( row[i].match && ! row[i].match(/^0\d+/) && row[i].match( special.match ) ) {
|
1052
1047
|
var val = row[i].replace(/[^\d\.\-]/g, '');
|
1053
1048
|
|
1054
1049
|
if ( special.fmt ) {
|
@@ -1124,9 +1119,34 @@ DataTable.ext.buttons.excelHtml5 = {
|
|
1124
1119
|
config.customizeData( data );
|
1125
1120
|
}
|
1126
1121
|
|
1122
|
+
var mergeCells = function ( row, colspan ) {
|
1123
|
+
var mergeCells = $('mergeCells', rels);
|
1124
|
+
|
1125
|
+
mergeCells[0].appendChild( _createNode( rels, 'mergeCell', {
|
1126
|
+
attr: {
|
1127
|
+
ref: 'A'+row+':'+createCellPos(colspan)+row
|
1128
|
+
}
|
1129
|
+
} ) );
|
1130
|
+
mergeCells.attr( 'count', mergeCells.attr( 'count' )+1 );
|
1131
|
+
$('row:eq('+(row-1)+') c', rels).attr( 's', '51' ); // centre
|
1132
|
+
};
|
1133
|
+
|
1134
|
+
// Title and top messages
|
1135
|
+
var exportInfo = dt.buttons.exportInfo( config );
|
1136
|
+
if ( exportInfo.title ) {
|
1137
|
+
addRow( [exportInfo.title], rowPos );
|
1138
|
+
mergeCells( rowPos, data.header.length-1 );
|
1139
|
+
}
|
1140
|
+
|
1141
|
+
if ( exportInfo.messageTop ) {
|
1142
|
+
addRow( [exportInfo.messageTop], rowPos );
|
1143
|
+
mergeCells( rowPos, data.header.length-1 );
|
1144
|
+
}
|
1145
|
+
|
1146
|
+
// Table itself
|
1127
1147
|
if ( config.header ) {
|
1128
1148
|
addRow( data.header, rowPos );
|
1129
|
-
$('row c', rels).attr( 's', '2' ); // bold
|
1149
|
+
$('row:last c', rels).attr( 's', '2' ); // bold
|
1130
1150
|
}
|
1131
1151
|
|
1132
1152
|
for ( var n=0, ie=data.body.length ; n<ie ; n++ ) {
|
@@ -1138,6 +1158,12 @@ DataTable.ext.buttons.excelHtml5 = {
|
|
1138
1158
|
$('row:last c', rels).attr( 's', '2' ); // bold
|
1139
1159
|
}
|
1140
1160
|
|
1161
|
+
// Below the table
|
1162
|
+
if ( exportInfo.messageBottom ) {
|
1163
|
+
addRow( [exportInfo.messageBottom], rowPos );
|
1164
|
+
mergeCells( rowPos, data.header.length-1 );
|
1165
|
+
}
|
1166
|
+
|
1141
1167
|
// Set column widths
|
1142
1168
|
var cols = _createNode( rels, 'cols' );
|
1143
1169
|
$('worksheet', rels).prepend( cols );
|
@@ -1172,15 +1198,17 @@ DataTable.ext.buttons.excelHtml5 = {
|
|
1172
1198
|
zip
|
1173
1199
|
.generateAsync( zipConfig )
|
1174
1200
|
.then( function ( blob ) {
|
1175
|
-
_saveAs( blob,
|
1201
|
+
_saveAs( blob, exportInfo.filename );
|
1202
|
+
that.processing( false );
|
1176
1203
|
} );
|
1177
1204
|
}
|
1178
1205
|
else {
|
1179
1206
|
// JSZip 2.5
|
1180
1207
|
_saveAs(
|
1181
1208
|
zip.generate( zipConfig ),
|
1182
|
-
|
1209
|
+
exportInfo.filename
|
1183
1210
|
);
|
1211
|
+
this.processing( false );
|
1184
1212
|
}
|
1185
1213
|
},
|
1186
1214
|
|
@@ -1192,7 +1220,13 @@ DataTable.ext.buttons.excelHtml5 = {
|
|
1192
1220
|
|
1193
1221
|
header: true,
|
1194
1222
|
|
1195
|
-
footer: false
|
1223
|
+
footer: false,
|
1224
|
+
|
1225
|
+
title: '*',
|
1226
|
+
|
1227
|
+
messageTop: '*',
|
1228
|
+
|
1229
|
+
messageBottom: '*'
|
1196
1230
|
};
|
1197
1231
|
|
1198
1232
|
//
|
@@ -1210,8 +1244,11 @@ DataTable.ext.buttons.pdfHtml5 = {
|
|
1210
1244
|
},
|
1211
1245
|
|
1212
1246
|
action: function ( e, dt, button, config ) {
|
1213
|
-
|
1247
|
+
this.processing( true );
|
1248
|
+
|
1249
|
+
var that = this;
|
1214
1250
|
var data = dt.buttons.exportData( config.exportOptions );
|
1251
|
+
var info = dt.buttons.exportInfo( config );
|
1215
1252
|
var rows = [];
|
1216
1253
|
|
1217
1254
|
if ( config.header ) {
|
@@ -1282,17 +1319,25 @@ DataTable.ext.buttons.pdfHtml5 = {
|
|
1282
1319
|
}
|
1283
1320
|
};
|
1284
1321
|
|
1285
|
-
if (
|
1286
|
-
|
1287
|
-
|
1288
|
-
|
1289
|
-
|
1290
|
-
|
1322
|
+
if ( info.messageTop ) {
|
1323
|
+
doc.content.unshift( {
|
1324
|
+
text: info.messageTop,
|
1325
|
+
style: 'message',
|
1326
|
+
margin: [ 0, 0, 0, 12 ]
|
1327
|
+
} );
|
1291
1328
|
}
|
1292
1329
|
|
1293
|
-
if (
|
1330
|
+
if ( info.messageBottom ) {
|
1331
|
+
doc.content.push( {
|
1332
|
+
text: info.messageBottom,
|
1333
|
+
style: 'message',
|
1334
|
+
margin: [ 0, 0, 0, 12 ]
|
1335
|
+
} );
|
1336
|
+
}
|
1337
|
+
|
1338
|
+
if ( info.title ) {
|
1294
1339
|
doc.content.unshift( {
|
1295
|
-
text:
|
1340
|
+
text: info.title,
|
1296
1341
|
style: 'title',
|
1297
1342
|
margin: [ 0, 0, 0, 12 ]
|
1298
1343
|
} );
|
@@ -1306,12 +1351,14 @@ DataTable.ext.buttons.pdfHtml5 = {
|
|
1306
1351
|
|
1307
1352
|
if ( config.download === 'open' && ! _isDuffSafari() ) {
|
1308
1353
|
pdf.open();
|
1354
|
+
this.processing( false );
|
1309
1355
|
}
|
1310
1356
|
else {
|
1311
1357
|
pdf.getBuffer( function (buffer) {
|
1312
1358
|
var blob = new Blob( [buffer], {type:'application/pdf'} );
|
1313
1359
|
|
1314
|
-
_saveAs( blob,
|
1360
|
+
_saveAs( blob, info.filename );
|
1361
|
+
that.processing( false );
|
1315
1362
|
} );
|
1316
1363
|
}
|
1317
1364
|
},
|
@@ -1332,7 +1379,9 @@ DataTable.ext.buttons.pdfHtml5 = {
|
|
1332
1379
|
|
1333
1380
|
footer: false,
|
1334
1381
|
|
1335
|
-
|
1382
|
+
messageTop: '*',
|
1383
|
+
|
1384
|
+
messageBottom: '*',
|
1336
1385
|
|
1337
1386
|
customize: null,
|
1338
1387
|
|
@@ -40,30 +40,42 @@ var DataTable = $.fn.dataTable;
|
|
40
40
|
var _link = document.createElement( 'a' );
|
41
41
|
|
42
42
|
/**
|
43
|
-
*
|
44
|
-
*
|
43
|
+
* Clone link and style tags, taking into account the need to change the source
|
44
|
+
* path.
|
45
45
|
*
|
46
46
|
* @param {node} el Element to convert
|
47
47
|
*/
|
48
|
-
var
|
48
|
+
var _styleToAbs = function( el ) {
|
49
49
|
var url;
|
50
50
|
var clone = $(el).clone()[0];
|
51
51
|
var linkHost;
|
52
52
|
|
53
53
|
if ( clone.nodeName.toLowerCase() === 'link' ) {
|
54
|
-
|
55
|
-
|
54
|
+
clone.href = _relToAbs( clone.href );
|
55
|
+
}
|
56
56
|
|
57
|
-
|
58
|
-
|
59
|
-
if ( linkHost.indexOf('/') === -1 && _link.pathname.indexOf('/') !== 0) {
|
60
|
-
linkHost += '/';
|
61
|
-
}
|
57
|
+
return clone.outerHTML;
|
58
|
+
};
|
62
59
|
|
63
|
-
|
60
|
+
/**
|
61
|
+
* Convert a URL from a relative to an absolute address so it will work
|
62
|
+
* correctly in the popup window which has no base URL.
|
63
|
+
*
|
64
|
+
* @param {string} href URL
|
65
|
+
*/
|
66
|
+
var _relToAbs = function( href ) {
|
67
|
+
// Assign to a link on the original page so the browser will do all the
|
68
|
+
// hard work of figuring out where the file actually is
|
69
|
+
_link.href = href;
|
70
|
+
var linkHost = _link.host;
|
71
|
+
|
72
|
+
// IE doesn't have a trailing slash on the host
|
73
|
+
// Chrome has it on the pathname
|
74
|
+
if ( linkHost.indexOf('/') === -1 && _link.pathname.indexOf('/') !== 0) {
|
75
|
+
linkHost += '/';
|
64
76
|
}
|
65
77
|
|
66
|
-
return
|
78
|
+
return _link.protocol+"//"+linkHost+_link.pathname+_link.search;
|
67
79
|
};
|
68
80
|
|
69
81
|
|
@@ -75,7 +87,11 @@ DataTable.ext.buttons.print = {
|
|
75
87
|
},
|
76
88
|
|
77
89
|
action: function ( e, dt, button, config ) {
|
78
|
-
var data = dt.buttons.exportData(
|
90
|
+
var data = dt.buttons.exportData(
|
91
|
+
$.extend( {decodeEntities: false}, config.exportOptions ) // XSS protection
|
92
|
+
);
|
93
|
+
var exportInfo = dt.buttons.exportInfo( config );
|
94
|
+
|
79
95
|
var addRow = function ( d, tag ) {
|
80
96
|
var str = '<tr>';
|
81
97
|
|
@@ -102,28 +118,19 @@ DataTable.ext.buttons.print = {
|
|
102
118
|
if ( config.footer && data.footer ) {
|
103
119
|
html += '<tfoot>'+ addRow( data.footer, 'th' ) +'</tfoot>';
|
104
120
|
}
|
121
|
+
html += '</table>';
|
105
122
|
|
106
123
|
// Open a new window for the printable table
|
107
124
|
var win = window.open( '', '' );
|
108
|
-
var title = config.title;
|
109
|
-
|
110
|
-
if ( typeof title === 'function' ) {
|
111
|
-
title = title();
|
112
|
-
}
|
113
|
-
|
114
|
-
if ( title.indexOf( '*' ) !== -1 ) {
|
115
|
-
title= title.replace( '*', $('title').text() );
|
116
|
-
}
|
117
|
-
|
118
125
|
win.document.close();
|
119
126
|
|
120
127
|
// Inject the title and also a copy of the style and link tags from this
|
121
128
|
// document so the table can retain its base styling. Note that we have
|
122
129
|
// to use string manipulation as IE won't allow elements to be created
|
123
130
|
// in the host document and then appended to the new window.
|
124
|
-
var head = '<title>'+title+'</title>';
|
131
|
+
var head = '<title>'+exportInfo.title+'</title>';
|
125
132
|
$('style, link').each( function () {
|
126
|
-
head +=
|
133
|
+
head += _styleToAbs( this );
|
127
134
|
} );
|
128
135
|
|
129
136
|
try {
|
@@ -135,32 +142,35 @@ DataTable.ext.buttons.print = {
|
|
135
142
|
|
136
143
|
// Inject the table and other surrounding information
|
137
144
|
win.document.body.innerHTML =
|
138
|
-
'<h1>'+title+'</h1>'+
|
139
|
-
'<div>'+
|
140
|
-
|
141
|
-
|
142
|
-
config.message
|
143
|
-
)+
|
144
|
-
'</div>'+
|
145
|
-
html;
|
145
|
+
'<h1>'+exportInfo.title+'</h1>'+
|
146
|
+
'<div>'+(exportInfo.messageTop || '')+'</div>'+
|
147
|
+
html+
|
148
|
+
'<div>'+(exportInfo.messageBottom || '')+'</div>';
|
146
149
|
|
147
150
|
$(win.document.body).addClass('dt-print-view');
|
148
151
|
|
152
|
+
$('img', win.document.body).each( function ( i, img ) {
|
153
|
+
img.setAttribute( 'src', _relToAbs( img.getAttribute('src') ) );
|
154
|
+
} );
|
155
|
+
|
149
156
|
if ( config.customize ) {
|
150
157
|
config.customize( win );
|
151
158
|
}
|
152
159
|
|
160
|
+
// Allow stylesheets time to load
|
153
161
|
setTimeout( function () {
|
154
162
|
if ( config.autoPrint ) {
|
155
163
|
win.print(); // blocking - so close will not
|
156
164
|
win.close(); // execute until this is done
|
157
165
|
}
|
158
|
-
},
|
166
|
+
}, 1000 );
|
159
167
|
},
|
160
168
|
|
161
169
|
title: '*',
|
162
170
|
|
163
|
-
|
171
|
+
messageTop: '*',
|
172
|
+
|
173
|
+
messageBottom: '*',
|
164
174
|
|
165
175
|
exportOptions: {},
|
166
176
|
|