1 import * as React from 'react';
3 import { c, msgid } from 'ttag';
5 import { Checkbox, Icon, Loader, TableHeaderCell, TableRowSticky, Tooltip } from '@proton/components';
6 import { SORT_DIRECTION } from '@proton/shared/lib/constants';
7 import { getNumAccessesTooltipMessage } from '@proton/shared/lib/drive/translations';
9 import { stopPropagation } from '../../../utils/stopPropagation';
10 import SortDropdown from '../../sections/SortDropdown';
11 import { SelectionState } from '../hooks/useSelectionControls';
12 import type { SortParams } from '../interface';
13 import { useSelection } from '../state/useSelection';
18 scrollAreaRef: React.RefObject<HTMLDivElement>;
21 activeSortingText?: string;
22 onSort?: (sortParams: SortParams<T>) => void;
23 sortField?: SortParams<T>['sortField'];
25 sortOrder?: SortParams<T>['sortOrder'];
28 export const GridHeader = <T extends string>({
39 const selection = useSelection();
41 const handleSort = (key: T) => {
42 if (!sortField || !sortOrder || !onSort) {
47 sortField === key && sortOrder === SORT_DIRECTION.ASC ? SORT_DIRECTION.DESC : SORT_DIRECTION.ASC;
49 onSort({ sortField: key as T, sortOrder: direction });
52 const getSortDirectionForKey = (key: T) => (sortField === key ? sortOrder : undefined);
54 const selectedCount = selection?.selectedItemIds.length;
57 <thead onContextMenu={stopPropagation}>
58 <TableRowSticky scrollAreaRef={scrollAreaRef}>
59 <TableHeaderCell className="file-browser-header-checkbox-cell">
60 <div role="presentation" key="select-all" className="flex pl-2" onClick={stopPropagation}>
62 indeterminate={selection?.selectionState === SelectionState.SOME}
63 className="expand-click-area mr-1"
65 checked={selection?.selectionState !== SelectionState.NONE}
67 selection?.selectionState === SelectionState.SOME
68 ? selection?.clearSelections
69 : selection?.toggleAllSelected
73 <span className="ml-2">
75 msgid`${selectedCount} selected`,
76 `${selectedCount} selected`,
82 {selection?.selectionState !== SelectionState.NONE && isLoading ? (
83 <Loader className="flex shrink-0" />
87 {selection?.selectionState === SelectionState.NONE && sortFields?.length && sortField && (
91 style={{ '--w-custom': '10em' }}
92 onSort={() => handleSort(sortField)}
93 direction={getSortDirectionForKey(sortField)}
97 {sortField === 'numAccesses' && (
98 <Tooltip className="pl-1" title={getNumAccessesTooltipMessage()}>
99 <Icon name="info-circle" size={3.5} alt={getNumAccessesTooltipMessage()} />
105 className="file-browser-header-sort-cell"
106 sortFields={sortFields}
107 sortField={sortField}