@@ -21,8 +21,8 @@ function renderTable() {
2121 if ( tableFitInPageChecked == true ) tableFitInPageChecked = "checked" ;
2222 else tableFitInPageChecked = "" ;
2323
24- if ( tableFitInPage == true ) $ ( "#result" ) . css ( { width : "100%" , "table-layout" : "fixed" , "white-space" : "normal" } ) ;
25- else $ ( "#result" ) . css ( { width : "100%" , "table-layout" : "auto" , "white-space" : "nowrap" } ) ;
24+ if ( tableFitInPage == true ) $ ( "#result" ) . css ( { width : "100%" , "min-width" : "" , " table-layout" : "fixed" , "white-space" : "normal" } ) ;
25+ else $ ( "#result" ) . css ( { width : "max-content" , "min-width" : " 100%", "table-layout" : "auto" , "white-space" : "nowrap" } ) ;
2626
2727 let tablePageLength = parseInt ( globalStorageLoad ( "table.pageLength" ) ) ;
2828 if ( isNaN ( tablePageLength ) ) tablePageLength = 20 ;
@@ -112,13 +112,14 @@ function renderTable() {
112112 if ( globalResultset . records . length > 0 ) {
113113 const dataTable = $ ( "#result" ) . DataTable ( {
114114 orderCellsTop : true ,
115- fixedHeader : true ,
115+ fixedHeader : tableFitInPage ,
116116 paging : true ,
117117 pageLength : tablePageLength ,
118118 lengthChange : true ,
119119 columns : tableColumns ,
120120 data : tableRecords ,
121121 deferRender : true ,
122+ autoWidth : tableFitInPage ,
122123 dom : "<Blf>rt<ip>" ,
123124 order : [ ] ,
124125 lengthMenu : [
@@ -162,6 +163,8 @@ function renderTable() {
162163 else
163164 wrapper . prepend ( exportEl ) ;
164165 } , 50 ) ;
166+
167+ attachColumnResizers ( $ ( "#result" ) ) ;
165168 } ,
166169 } ) ;
167170
@@ -177,6 +180,59 @@ function renderTable() {
177180 $ ( "#result_filter>label>input" ) . val ( "" ) ;
178181}
179182
183+ // Adds a drag handle on the right edge of every header cell so the user can
184+ // resize individual columns. When the first column is resized the table is
185+ // switched to `table-layout: fixed` so further column widths are stable.
186+ function attachColumnResizers ( $table ) {
187+ if ( ! $table || ! $table . length ) return ;
188+
189+ $table . find ( "thead th" ) . each ( function ( ) {
190+ let $th = $ ( this ) ;
191+ if ( $th . find ( ".col-resizer" ) . length ) return ;
192+
193+ let $grip = $ ( "<span class='col-resizer' title='Drag to resize column'></span>" ) ;
194+ $th . append ( $grip ) ;
195+
196+ $grip . on ( "mousedown" , function ( e ) {
197+ e . preventDefault ( ) ;
198+ e . stopPropagation ( ) ;
199+
200+ let startX = e . pageX ;
201+ let startWidth = $th . outerWidth ( ) ;
202+
203+ // Freeze every column at its current width so only the resized one moves.
204+ if ( ! $table . hasClass ( "col-resized" ) ) {
205+ $table . find ( "thead th" ) . each ( function ( ) {
206+ let $c = $ ( this ) ;
207+ let w = $c . outerWidth ( ) ;
208+ $c . css ( { width : w + "px" , "min-width" : w + "px" } ) ;
209+ } ) ;
210+ $table . css ( "table-layout" , "fixed" ) . addClass ( "col-resized" ) ;
211+ }
212+
213+ $grip . addClass ( "resizing" ) ;
214+ $ ( "body" ) . addClass ( "col-resizing" ) ;
215+
216+ $ ( document ) . on ( "mousemove.colresize" , function ( ev ) {
217+ let delta = ev . pageX - startX ;
218+ let newW = Math . max ( 40 , startWidth + delta ) ;
219+ $th . css ( { width : newW + "px" , "min-width" : newW + "px" } ) ;
220+ } ) ;
221+
222+ $ ( document ) . on ( "mouseup.colresize" , function ( ) {
223+ $ ( document ) . off ( "mousemove.colresize mouseup.colresize" ) ;
224+ $grip . removeClass ( "resizing" ) ;
225+ $ ( "body" ) . removeClass ( "col-resizing" ) ;
226+ } ) ;
227+ } ) ;
228+
229+ // Prevent the click from triggering DataTables column sort.
230+ $grip . on ( "click" , function ( e ) {
231+ e . stopPropagation ( ) ;
232+ } ) ;
233+ } ) ;
234+ }
235+
180236function toggleExportMenu ( btn ) {
181237 let menu = $ ( btn ) . siblings ( ".dt-export-menu" ) ;
182238 let isOpen = menu . hasClass ( "open" ) ;
0 commit comments