3030 node .querySelector (' select' )? .selectedOptions [0 ]? .value ??
3131 dataTablesExportStrip (data),
3232 };
33+
34+ let getColumnVisibility = function (dt , idx , node ) {
35+ try {
36+ var $tableFromNode = $ (node).closest (' table' );
37+
38+ if ($tableFromNode .length === 0 ) {
39+ return false ;
40+ }
41+
42+ var $header = $tableFromNode .find (' thead th' ).eq (idx);
43+
44+ var isDomVisible = $header .length > 0 && $header .is (' :visible' ) && $header .css (' display' ) !== ' none' ;
45+
46+ return isDomVisible;
47+ } catch (e) {
48+ return true ; // Default to visible if there's an error
49+ }
50+ };
3351
3452 // Create an export buttons configuration that can be applied to any table
3553 window .crud .exportButtonsConfig = [
4462 extend: ' copyHtml5' ,
4563 exportOptions: {
4664 columns : function ( idx , data , node ) {
47- // Use the current table from the crud.table object
4865 var dt = $ (node).closest (' table' ).DataTable ();
49- var $column = dt .column (idx);
50- return ($column .visible () && $ (node).attr (' data-visible-in-export' ) != ' false' ) || $ (node).attr (' data-force-export' ) == ' true' ;
66+ var isVisible = getColumnVisibility (dt, idx, node);
67+ var isExportable = $ (node).attr (' data-visible-in-export' ) == ' true' ;
68+ var isForceExport = $ (node).attr (' data-force-export' ) == ' true' ;
69+
70+ if (isForceExport && isExportable) {
71+ return true ;
72+ }
73+ return isVisible && isExportable;
5174 },
5275 format: dataTablesExportFormat,
5376 },
54- action : function (e , dt , button , config ) {
55- window .crud .responsiveToggle (dt);
56- $ .fn .DataTable .ext .buttons .copyHtml5 .action .call (this , e, dt, button, config);
57- window .crud .responsiveToggle (dt);
58- }
5977 },
6078 {
6179 name: ' excelHtml5' ,
6280 extend: ' excelHtml5' ,
6381 exportOptions: {
6482 columns : function ( idx , data , node ) {
6583 var dt = $ (node).closest (' table' ).DataTable ();
66- var $column = dt .column (idx);
67- return ($column .visible () && $ (node).attr (' data-visible-in-export' ) != ' false' ) || $ (node).attr (' data-force-export' ) == ' true' ;
84+ var isVisible = getColumnVisibility (dt, idx, node);
85+ var isExportable = $ (node).attr (' data-visible-in-export' ) == ' true' ;
86+ var isForceExport = $ (node).attr (' data-force-export' ) == ' true' ;
87+
88+ if (isForceExport && isExportable) {
89+ return true ;
90+ }
91+ return isVisible && isExportable;
6892 },
6993 format: dataTablesExportFormat,
7094 },
71- action : function (e , dt , button , config ) {
72- window .crud .responsiveToggle (dt);
73- $ .fn .DataTable .ext .buttons .excelHtml5 .action .call (this , e, dt, button, config);
74- window .crud .responsiveToggle (dt);
75- }
7695 },
7796 {
7897 name: ' csvHtml5' ,
7998 extend: ' csvHtml5' ,
8099 exportOptions: {
81100 columns : function ( idx , data , node ) {
82101 var dt = $ (node).closest (' table' ).DataTable ();
83- var $column = dt .column (idx);
84- return ($column .visible () && $ (node).attr (' data-visible-in-export' ) != ' false' ) || $ (node).attr (' data-force-export' ) == ' true' ;
102+ var isVisible = getColumnVisibility (dt, idx, node);
103+ var isExportable = $ (node).attr (' data-visible-in-export' ) == ' true' ;
104+ var isForceExport = $ (node).attr (' data-force-export' ) == ' true' ;
105+
106+ if (isForceExport && isExportable) {
107+ return true ;
108+ }
109+
110+ return isVisible && isExportable;
85111 },
86112 format: dataTablesExportFormat,
87113 },
88- action : function (e , dt , button , config ) {
89- window .crud .responsiveToggle (dt);
90- $ .fn .DataTable .ext .buttons .csvHtml5 .action .call (this , e, dt, button, config);
91- window .crud .responsiveToggle (dt);
92- }
93114 },
94115 {
95116 name: ' pdfHtml5' ,
96117 extend: ' pdfHtml5' ,
97118 exportOptions: {
98119 columns : function ( idx , data , node ) {
99120 var dt = $ (node).closest (' table' ).DataTable ();
100- var $column = dt .column (idx);
101- return ($column .visible () && $ (node).attr (' data-visible-in-export' ) != ' false' ) || $ (node).attr (' data-force-export' ) == ' true' ;
121+ var isVisible = getColumnVisibility (dt, idx, node);
122+ var isExportable = $ (node).attr (' data-visible-in-export' ) == ' true' ;
123+ var isForceExport = $ (node).attr (' data-force-export' ) == ' true' ;
124+
125+ if (isForceExport && isExportable) {
126+ return true ;
127+ }
128+
129+ return isVisible && isExportable;
102130 },
103131 format: dataTablesExportFormat,
104132 },
105- orientation: ' landscape' ,
106- action : function (e , dt , button , config ) {
107- window .crud .responsiveToggle (dt);
108- $ .fn .DataTable .ext .buttons .pdfHtml5 .action .call (this , e, dt, button, config);
109- window .crud .responsiveToggle (dt);
110- }
133+ orientation: ' landscape'
111134 },
112135 {
113136 name: ' print' ,
114137 extend: ' print' ,
115138 exportOptions: {
116139 columns : function ( idx , data , node ) {
117140 var dt = $ (node).closest (' table' ).DataTable ();
118- var $column = dt .column (idx);
119- return ($column .visible () && $ (node).attr (' data-visible-in-export' ) != ' false' ) || $ (node).attr (' data-force-export' ) == ' true' ;
141+ var isVisible = getColumnVisibility (dt, idx, node);
142+ var isExportable = $ (node).attr (' data-visible-in-export' ) == ' true' ;
143+ var isForceExport = $ (node).attr (' data-force-export' ) == ' true' ;
144+
145+ if (isForceExport && isExportable) {
146+ return true ;
147+ }
148+
149+ return isVisible && isExportable;
120150 },
121151 format: dataTablesExportFormat,
122152 },
123153 orientation: ' landscape' ,
124- action : function (e , dt , button , config ) {
125- window .crud .responsiveToggle (dt);
126- $ .fn .DataTable .ext .buttons .print .action .call (this , e, dt, button, config);
127- window .crud .responsiveToggle (dt);
128- }
129154 }
130155 ]
131156 }
164189
165190 // Add the function to the draw event queue
166191 window .crud .defaultTableConfig .addFunctionToDataTablesDrawEventQueue (' moveExportButtonsToTopRight' );
192+
193+ window .crud .setupExportHandlers = function (tableId ) {
194+ tableId = tableId || ' crudTable' ;
195+ var table = window .crud .tables [tableId];
196+
197+ if (! table || ! table .buttons ) return ;
198+
199+ // Add click handlers to all export buttons
200+ table .buttons ().each (function (button , idx ) {
201+ var buttonNode = button .node ;
202+ if (buttonNode && (
203+ buttonNode .classList .contains (' buttons-pdf' ) ||
204+ buttonNode .classList .contains (' buttons-excel' ) ||
205+ buttonNode .classList .contains (' buttons-csv' ) ||
206+ buttonNode .classList .contains (' buttons-copy' ) ||
207+ buttonNode .classList .contains (' buttons-print' )
208+ )) {
209+ // Remove any existing handlers
210+ $ (buttonNode).off (' click.responsiveExport' );
211+
212+ // Add our custom handler
213+ $ (buttonNode).on (' click.responsiveExport' , function (e ) {
214+ e .preventDefault ();
215+ e .stopImmediatePropagation ();
216+
217+ window .crud .responsiveToggle (table);
218+
219+ setTimeout (function () {
220+ $ (buttonNode).off (' click.responsiveExport' );
221+
222+ $ (buttonNode).trigger (' click' );
223+
224+ setTimeout (function () {
225+ $ (buttonNode).on (' click.responsiveExport' , arguments .callee );
226+ }, 100 );
227+ }, 50 );
228+ });
229+ }
230+ });
231+ };
232+
233+ // Add the export handler setup to the draw event queue
234+ window .crud .defaultTableConfig .addFunctionToDataTablesDrawEventQueue (' setupExportHandlers' );
167235 < / script>
168236 @push (' after_styles' )
169237 @basset (' https://cdn.datatables.net/buttons/3.2.0/css/buttons.bootstrap5.min.css' )
170238 @endpush
171- @endif
239+ @endif
0 commit comments