1- import * as React from 'react' ;
21import { SortByDirection , Th , Thead , Tr } from '@patternfly/react-table' ;
32import _ from 'lodash' ;
4- import { Column , ColumnGroup , ColumnsId , getColumnGroups , getFullColumnName } from '../../utils/columns' ;
3+ import * as React from 'react' ;
4+ import { Column , ColumnGroup , ColumnsId , ColumnSizeMap , getColumnGroups , getFullColumnName } from '../../utils/columns' ;
55import './netflow-table-header.css' ;
66
77export type HeadersState = {
@@ -10,15 +10,24 @@ export type HeadersState = {
1010 headers : Column [ ] ;
1111} ;
1212
13+ export type ResizedElement = {
14+ target : HTMLElement ;
15+ startClientX : number ;
16+ startClentWidth : number ;
17+ } ;
18+
1319export const NetflowTableHeader : React . FC < {
1420 onSort : ( id : ColumnsId , direction : SortByDirection ) => void ;
1521 sortId : ColumnsId ;
1622 sortDirection : SortByDirection ;
1723 columns : Column [ ] ;
1824 setColumns : ( v : Column [ ] ) => void ;
25+ columnSizes : ColumnSizeMap ;
26+ setColumnSizes : ( v : ColumnSizeMap ) => void ;
1927 tableWidth : number ;
2028 isDark ?: boolean ;
21- } > = ( { onSort, sortId, sortDirection, columns, setColumns, tableWidth, isDark } ) => {
29+ } > = ( { onSort, sortId, sortDirection, columns, setColumns, columnSizes, setColumnSizes, tableWidth, isDark } ) => {
30+ const resizedElement = React . useRef < ResizedElement > ( ) ;
2231 const draggedElement = React . useRef < HTMLElement > ( ) ;
2332
2433 const [ headersState , setHeadersState ] = React . useState < HeadersState > ( {
@@ -27,6 +36,48 @@ export const NetflowTableHeader: React.FC<{
2736 headers : [ ]
2837 } ) ;
2938
39+ const mouseEvent = React . useCallback (
40+ ( e : MouseEvent ) => {
41+ const diffPx = e . clientX - resizedElement . current ! . startClientX ;
42+ switch ( e . type ) {
43+ case 'mousemove' :
44+ const minWidth = Number ( resizedElement . current ! . target . style . minWidth ?. replace ( 'px' , '' ) ) || 0 ;
45+ if ( Math . abs ( minWidth - diffPx ) > 10 ) {
46+ const minWidth = `${ resizedElement . current ! . startClentWidth + diffPx } px` ;
47+ columnSizes [ resizedElement . current ! . target . id as ColumnsId ] = minWidth ;
48+ resizedElement . current ! . target . style . minWidth = minWidth ;
49+ }
50+ break ;
51+ default :
52+ document . getElementById ( 'cursor-style' ) ! . remove ( ) ;
53+ resizedElement . current ! . target . classList . remove ( 'resizing' ) ;
54+ document . removeEventListener ( 'mousemove' , mouseEvent ) ;
55+ document . removeEventListener ( 'mouseup' , mouseEvent ) ;
56+ setColumnSizes ( columnSizes ) ;
57+ break ;
58+ }
59+ } ,
60+ [ columnSizes , setColumnSizes ]
61+ ) ;
62+
63+ const onMouseDown = React . useCallback (
64+ ( e : React . MouseEvent < HTMLElement > ) => {
65+ const target = e . currentTarget ;
66+ if ( target . classList . contains ( 'column' ) && e . nativeEvent . offsetX > target . clientWidth - 15 ) {
67+ target . classList . add ( 'resizing' ) ;
68+ const cursorStyle = document . createElement ( 'style' ) ;
69+ cursorStyle . innerHTML = '*{cursor: col-resize!important;}' ;
70+ cursorStyle . id = 'cursor-style' ;
71+ document . head . appendChild ( cursorStyle ) ;
72+ resizedElement . current = { target, startClientX : e . clientX , startClentWidth : target . clientWidth } ;
73+ document . addEventListener ( 'mousemove' , mouseEvent ) ;
74+ document . addEventListener ( 'mouseup' , mouseEvent ) ;
75+ e . preventDefault ( ) ;
76+ }
77+ } ,
78+ [ mouseEvent ]
79+ ) ;
80+
3081 const onDragStart = React . useCallback ( ( e : React . DragEvent < HTMLElement > ) => {
3182 const target = e . currentTarget ;
3283 target . classList . add ( 'dragged' ) ;
@@ -126,6 +177,7 @@ export const NetflowTableHeader: React.FC<{
126177 } }
127178 colSpan = { 1 }
128179 draggable
180+ onMouseDown = { onMouseDown }
129181 onDragStart = { onDragStart }
130182 onDragOver = { e => {
131183 if ( draggedElement . current ?. classList . contains ( 'column' ) ) {
@@ -140,20 +192,22 @@ export const NetflowTableHeader: React.FC<{
140192 onDrop = { onDrop }
141193 onDragEnd = { clearDragEffects }
142194 modifier = "wrap"
143- style = { { width : `${ Math . floor ( ( 100 * c . width ) / tableWidth ) } %` } }
195+ style = { { width : `${ Math . floor ( ( 100 * c . width ) / tableWidth ) } %` , minWidth : columnSizes [ c . id ] } }
144196 info = { c . tooltip ? { tooltip : c . tooltip } : undefined }
145197 >
146198 { headersState . useNested ? c . name : getFullColumnName ( c ) }
147199 </ Th >
148200 ) ;
149201 } ,
150202 [
203+ columnSizes ,
151204 columns ,
152205 headersState . nestedHeaders ,
153206 headersState . useNested ,
154207 isDark ,
155208 onDragStart ,
156209 onDrop ,
210+ onMouseDown ,
157211 onSort ,
158212 sortDirection ,
159213 sortId ,
0 commit comments