1+ import classNames from "classnames" ;
12import {
23 Dispatch ,
34 DragEvent ,
@@ -9,92 +10,83 @@ import {
910 SetStateAction ,
1011 useCallback
1112} from "react" ;
12- import classNames from "classnames " ;
13+ import { FaArrowsAltV } from "./icons/FaArrowsAltV " ;
1314import { FaLongArrowAltDown } from "./icons/FaLongArrowAltDown" ;
1415import { FaLongArrowAltUp } from "./icons/FaLongArrowAltUp" ;
15- import { FaArrowsAltV } from "./icons/FaArrowsAltV" ;
1616
17- import { ColumnResizerProps } from "./ColumnResizer " ;
17+ import { useColumn , useColumnsStore , useDatagridConfig } from "../model/hooks/injection-hooks " ;
1818import { ColumnId , GridColumn } from "../typings/GridColumn" ;
19+ import { ColumnResizerProps } from "./ColumnResizer" ;
1920
2021export interface HeaderProps {
21- className ?: string ;
22- gridId : string ;
23- column : GridColumn ;
24- sortable : boolean ;
25- resizable : boolean ;
26- filterable : boolean ;
27- hidable : boolean ;
28- draggable : boolean ;
29- filterWidget ?: ReactNode ;
30- preview ?: boolean ;
22+ isLast ?: boolean ;
3123 resizer : ReactElement < ColumnResizerProps > ;
24+
3225 dropTarget ?: [ ColumnId , "before" | "after" ] ;
3326 isDragging ?: [ ColumnId | undefined , ColumnId , ColumnId | undefined ] ;
3427 setDropTarget : Dispatch < SetStateAction < [ ColumnId , "before" | "after" ] | undefined > > ;
3528 setIsDragging : Dispatch < SetStateAction < [ ColumnId | undefined , ColumnId , ColumnId | undefined ] | undefined > > ;
36- swapColumns : ( source : ColumnId , target : [ ColumnId , "before" | "after" ] ) => void ;
3729}
3830
3931export function Header ( props : HeaderProps ) : ReactElement {
40- const canSort = props . sortable && props . column . canSort ;
41- const canDrag = props . draggable && ( props . column . canDrag ?? false ) ;
32+ const { columnsFilterable, id : gridId } = useDatagridConfig ( ) ;
33+ const columnsStore = useColumnsStore ( ) ;
34+ const column = useColumn ( ) ;
35+ const { canDrag, canSort } = column ;
36+
4237 const draggableProps = useDraggable (
4338 canDrag ,
44- props . swapColumns ,
39+ columnsStore . swapColumns . bind ( columnsStore ) ,
4540 props . dropTarget ,
4641 props . setDropTarget ,
4742 props . isDragging ,
4843 props . setIsDragging
4944 ) ;
5045
51- const sortIcon = canSort ? getSortIcon ( props . column ) : null ;
52- const sortProps = canSort ? getSortProps ( props . column ) : null ;
53- const caption = props . column . header . trim ( ) ;
46+ const sortIcon = canSort ? getSortIcon ( column ) : null ;
47+ const sortProps = canSort ? getSortProps ( column ) : null ;
48+ const caption = column . header . trim ( ) ;
5449
5550 return (
5651 < div
57- aria-sort = { getAriaSort ( canSort , props . column ) }
58- className = { classNames (
59- "th" ,
60- {
61- "hidden-column-preview" :
62- props . preview && ( ! props . column . isAvailable || ( props . hidable && props . column . isHidden ) )
63- } ,
64- {
65- [ `drop-${ props . dropTarget ?. [ 1 ] } ` ] : props . column . columnId === props . dropTarget ?. [ 0 ] ,
66- dragging : props . column . columnId === props . isDragging ?. [ 1 ] ,
67- "dragging-over-self" : props . column . columnId === props . isDragging ?. [ 1 ] && ! props . dropTarget
68- }
69- ) }
52+ aria-sort = { getAriaSort ( canSort , column ) }
53+ className = { classNames ( "th" , {
54+ [ `drop-${ props . dropTarget ?. [ 1 ] } ` ] : column . columnId === props . dropTarget ?. [ 0 ] ,
55+ dragging : column . columnId === props . isDragging ?. [ 1 ] ,
56+ "dragging-over-self" : column . columnId === props . isDragging ?. [ 1 ] && ! props . dropTarget
57+ } ) }
7058 role = "columnheader"
7159 style = { ! canSort ? { cursor : "unset" } : undefined }
7260 title = { caption }
73- ref = { ref => props . column . setHeaderElementRef ( ref ) }
74- data-column-id = { props . column . columnId }
61+ ref = { ref => column . setHeaderElementRef ( ref ) }
62+ data-column-id = { column . columnId }
7563 onDrop = { draggableProps . onDrop }
7664 onDragEnter = { draggableProps . onDragEnter }
7765 onDragOver = { draggableProps . onDragOver }
7866 >
7967 < div
8068 className = { classNames ( "column-container" ) }
81- id = { `${ props . gridId } -column${ props . column . columnId } ` }
69+ id = { `${ gridId } -column${ column . columnId } ` }
8270 draggable = { draggableProps . draggable }
8371 onDragStart = { draggableProps . onDragStart }
8472 onDragEnd = { draggableProps . onDragEnd }
8573 >
8674 < div
87- className = { classNames ( "column-header" , { clickable : canSort } , props . className ) }
75+ className = { classNames ( "column-header" , { clickable : canSort } , `align-column- ${ column . alignment } ` ) }
8876 style = { { pointerEvents : props . isDragging ? "none" : undefined } }
8977 { ...sortProps }
9078 aria-label = { canSort ? "sort " + caption : caption }
9179 >
9280 < span > { caption . length > 0 ? caption : "\u00a0" } </ span >
9381 { sortIcon }
9482 </ div >
95- { props . filterable && props . filterWidget }
83+ { columnsFilterable && (
84+ < div className = "filter" style = { { pointerEvents : props . isDragging ? "none" : undefined } } >
85+ { columnsStore . columnFilters [ column . columnIndex ] ?. renderFilterWidgets ( ) }
86+ </ div >
87+ ) }
9688 </ div >
97- { props . resizable && props . column . canResize && props . resizer }
89+ { column . canResize ? props . resizer : null }
9890 </ div >
9991 ) ;
10092}
0 commit comments