- { Object.entries( SORTING_DIRECTIONS ).map(
- ( [ direction, info ] ) => {
+ { SORTING_DIRECTIONS.map(
+ ( direction: SortDirection ) => {
const isChecked =
+ view.sort &&
isSorted &&
view.sort.direction === direction;
@@ -134,7 +184,7 @@ const HeaderMenu = forwardRef( function HeaderMenu(
} }
>
- { info.label }
+ { sortLabels[ direction ] }
);
@@ -191,16 +241,24 @@ const HeaderMenu = forwardRef( function HeaderMenu(
);
} );
-function BulkSelectionCheckbox( {
+// @ts-expect-error Lift the `Item` type argument through the forwardRef.
+const HeaderMenu: < Item extends AnyItem >(
+ props: PropsWithoutRef< HeaderMenuProps< Item > > &
+ RefAttributes< HTMLButtonElement >
+) => ReturnType< typeof _HeaderMenu > = _HeaderMenu;
+
+function BulkSelectionCheckbox< Item extends AnyItem >( {
selection,
onSelectionChange,
data,
actions,
-} ) {
+}: BulkSelectionCheckboxProps< Item > ) {
const selectableItems = useMemo( () => {
return data.filter( ( item ) => {
return actions.some(
- ( action ) => action.supportsBulk && action.isEligible( item )
+ ( action ) =>
+ action.supportsBulk &&
+ ( ! action.isEligible || action.isEligible( item ) )
);
} );
}, [ data, actions ] );
@@ -210,7 +268,7 @@ function BulkSelectionCheckbox( {
className="dataviews-view-table-selection-checkbox"
__nextHasNoMarginBottom
checked={ areAllSelected }
- indeterminate={ ! areAllSelected && selection.length }
+ indeterminate={ ! areAllSelected && !! selection.length }
onChange={ () => {
if ( areAllSelected ) {
onSelectionChange( [] );
@@ -225,7 +283,7 @@ function BulkSelectionCheckbox( {
);
}
-function TableRow( {
+function TableRow< Item extends AnyItem >( {
hasBulkActions,
item,
actions,
@@ -236,7 +294,7 @@ function TableRow( {
getItemId,
onSelectionChange,
data,
-} ) {
+}: TableRowProps< Item > ) {
const hasPossibleBulkAction = useHasAPossibleBulkAction( actions, item );
const isSelected = selection.includes( id );
@@ -270,7 +328,7 @@ function TableRow( {
onClick={ () => {
if (
! isTouchDevice.current &&
- document.getSelection().type !== 'Range'
+ document.getSelection()?.type !== 'Range'
) {
if ( ! isSelected ) {
onSelectionChange(
@@ -305,7 +363,6 @@ function TableRow( {
>
( {
actions,
data,
fields,
@@ -372,10 +429,13 @@ function ViewTable( {
selection,
setOpenedFilter,
view,
-} ) {
- const headerMenuRefs = useRef( new Map() );
- const headerMenuToFocusRef = useRef();
- const [ nextHeaderMenuToFocus, setNextHeaderMenuToFocus ] = useState();
+}: ViewTableProps< Item > ) {
+ const headerMenuRefs = useRef<
+ Map< string, { node: HTMLButtonElement; fallback: string } >
+ >( new Map() );
+ const headerMenuToFocusRef = useRef< HTMLButtonElement >();
+ const [ nextHeaderMenuToFocus, setNextHeaderMenuToFocus ] =
+ useState< HTMLButtonElement >();
const hasBulkActions = useSomeItemHasAPossibleBulkAction( actions, data );
useEffect( () => {
@@ -393,13 +453,15 @@ function ViewTable( {
// Clearing out the focus directive is necessary to make sure
// future renders don't cause unexpected focus jumps.
headerMenuToFocusRef.current = nextHeaderMenuToFocus;
- setNextHeaderMenuToFocus();
+ setNextHeaderMenuToFocus( undefined );
return;
}
- const onHide = ( field ) => {
+ const onHide = ( field: NormalizedField< Item > ) => {
const hidden = headerMenuRefs.current.get( field.id );
- const fallback = headerMenuRefs.current.get( hidden.fallback );
+ const fallback = hidden
+ ? headerMenuRefs.current.get( hidden.fallback )
+ : undefined;
setNextHeaderMenuToFocus( fallback?.node );
};
const visibleFields = fields.filter(
@@ -408,7 +470,6 @@ function ViewTable( {
! [ view.layout.mediaField ].includes( field.id )
);
const hasData = !! data?.length;
- const sortValues = { asc: 'ascending', desc: 'descending' };
const primaryField = fields.find(
( field ) => field.id === view.layout.primaryField
@@ -450,8 +511,9 @@ function ViewTable( {
} }
data-field-id={ field.id }
aria-sort={
- view.sort?.field === field.id &&
- sortValues[ view.sort.direction ]
+ view.sort?.field === field.id
+ ? sortValues[ view.sort.direction ]
+ : undefined
}
scope="col"
>
@@ -504,7 +566,7 @@ function ViewTable( {
item={ item }
hasBulkActions={ hasBulkActions }
actions={ actions }
- id={ getItemId( item ) || index }
+ id={ getItemId( item ) || index.toString() }
visibleFields={ visibleFields }
primaryField={ primaryField }
selection={ selection }