11import {
2+ ColumnPinningPosition ,
23 ColumnResizeMode ,
34 flexRender ,
45 Header ,
@@ -11,6 +12,7 @@ import { useTableContext } from '../EdsDataGridContext'
1112import { Filter } from './Filter'
1213import styled from 'styled-components'
1314import { tokens } from '@equinor/eds-tokens'
15+ import { useMemo } from 'react'
1416
1517type Props < T > = {
1618 header : Header < T , unknown >
@@ -44,6 +46,7 @@ const ResizeInner = styled.div`
4446const Resizer = styled . div < ResizeProps > `
4547 transform: ${ ( props ) =>
4648 props . $columnResizeMode === 'onEnd' ? 'translateX(0px)' : 'none' } ;
49+
4750 ${ ResizeInner } {
4851 opacity: ${ ( props ) => ( props . $isResizing ? 1 : 0 ) } ;
4952 }
@@ -60,10 +63,26 @@ const Resizer = styled.div<ResizeProps>`
6063 justify-content: flex-end;
6164`
6265
63- const Cell = styled ( Table . Cell ) < { sticky : boolean } > `
66+ const Cell = styled ( Table . Cell ) < {
67+ $sticky : boolean
68+ $pinned : ColumnPinningPosition
69+ $offset : number
70+ } > `
6471 font-weight: bold;
6572 height: 30px;
66- position: ${ ( p ) => ( p . sticky ? 'sticky' : 'relative' ) } ;
73+ position: ${ ( p ) => ( p . $sticky || p . $pinned ? 'sticky' : 'relative' ) } ;
74+ top: 0;
75+ ${ ( p ) => {
76+ if ( p . $pinned ) {
77+ return `${ p . $pinned } : ${ p . $offset } px;`
78+ }
79+ return ''
80+ } }
81+ z-index: ${ ( p ) => {
82+ if ( p . $sticky && p . $pinned ) return 13
83+ if ( p . $sticky || p . $pinned ) return 12
84+ return 'auto'
85+ } } ;
6786 &:hover ${ ResizeInner } {
6887 background: ${ tokens . colors . interactive . primary__hover . rgba } ;
6988 opacity: 1;
@@ -73,16 +92,31 @@ const Cell = styled(Table.Cell)<{ sticky: boolean }>`
7392export function TableHeaderCell < T > ( { header, columnResizeMode } : Props < T > ) {
7493 const ctx = useTableContext ( )
7594 const table = ctx . table
95+ const pinned = header . column . getIsPinned ( )
96+ const offset = useMemo < number > ( ( ) => {
97+ if ( ! pinned ) {
98+ return null
99+ }
100+ return pinned === 'left'
101+ ? header . getStart ( )
102+ : table . getTotalSize ( ) - header . getStart ( ) - header . getSize ( )
103+ } , [ pinned , header , table ] )
76104 return header . isPlaceholder ? (
77105 < Cell
78- sticky = { ctx . stickyHeader }
106+ $sticky = { ctx . stickyHeader }
107+ $offset = { offset }
108+ $pinned = { pinned }
79109 className = { ctx . headerClass ? ctx . headerClass ( header . column ) : '' }
80- style = { ctx . headerStyle ? ctx . headerStyle ( header . column ) : { } }
110+ style = { {
111+ ...( ctx . headerStyle ? ctx . headerStyle ( header . column ) : { } ) ,
112+ } }
81113 aria-hidden = { true }
82114 />
83115 ) : (
84116 < Cell
85- sticky = { ctx . stickyHeader }
117+ $sticky = { ctx . stickyHeader }
118+ $offset = { offset }
119+ $pinned = { pinned }
86120 className = { ctx . headerClass ? ctx . headerClass ( header . column ) : '' }
87121 aria-sort = { getSortLabel ( header . column . getIsSorted ( ) ) }
88122 { ...{
0 commit comments