Skip to content

Commit

Permalink
feat(Table): styled SortIndicator added
Browse files Browse the repository at this point in the history
  • Loading branch information
DanisAvko committed Sep 17, 2024
1 parent ffd60ca commit f9ac529
Show file tree
Hide file tree
Showing 34 changed files with 195 additions and 37 deletions.
41 changes: 27 additions & 14 deletions src/components/BaseHeaderCell/BaseHeaderCell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
getCellStyles,
getHeaderCellAriaColIndex,
getHeaderCellClassModes,
getKeyDownToggleSortingHandler,
} from '../../utils';
import type {BaseResizeHandleProps} from '../BaseResizeHandle';
import {BaseResizeHandle} from '../BaseResizeHandle';
Expand All @@ -24,6 +25,7 @@ export interface BaseHeaderCellProps<TData, TValue> {
renderResizeHandle?: (props: BaseResizeHandleProps<TData, TValue>) => React.ReactNode;
renderSortIndicator?: (props: BaseSortIndicatorProps<TData, TValue>) => React.ReactNode;
resizeHandleClassName?: string;
sortClassName?: string;
sortIndicatorClassName?: string;
attributes?:
| React.ThHTMLAttributes<HTMLTableCellElement>
Expand All @@ -40,6 +42,7 @@ export const BaseHeaderCell = <TData, TValue>({
renderResizeHandle,
renderSortIndicator,
resizeHandleClassName,
sortClassName,
sortIndicatorClassName,
attributes: attributesProp,
}: BaseHeaderCellProps<TData, TValue>) => {
Expand All @@ -58,25 +61,35 @@ export const BaseHeaderCell = <TData, TValue>({
className={b('header-cell', getHeaderCellClassModes(header), className)}
colSpan={header.colSpan > 1 ? header.colSpan : undefined}
rowSpan={rowSpan > 1 ? rowSpan : undefined}
onClick={header.column.getToggleSortingHandler()}
aria-sort={getAriaSort(header.column.getIsSorted())}
aria-colindex={getHeaderCellAriaColIndex(header)}
{...attributes}
style={getCellStyles(header, attributes?.style)}
>
{flexRender(header.column.columnDef.header, header.getContext())}{' '}
{header.column.getCanSort() &&
(renderSortIndicator ? (
renderSortIndicator({
className: b('sort-indicator', sortIndicatorClassName),
header,
})
) : (
<BaseSortIndicator
className={b('sort-indicator', sortIndicatorClassName)}
header={header}
/>
))}
{header.column.getCanSort() ? (
<span
className={b('sort', sortClassName)}
role="button"
tabIndex={0}
onClick={header.column.getToggleSortingHandler()}
onKeyDown={getKeyDownToggleSortingHandler(header)}
>
{flexRender(header.column.columnDef.header, header.getContext())}{' '}
{renderSortIndicator ? (
renderSortIndicator({
className: b('sort-indicator', sortIndicatorClassName),
header,
})
) : (
<BaseSortIndicator
className={b('sort-indicator', sortIndicatorClassName)}
header={header}
/>
)}
</span>
) : (
flexRender(header.column.columnDef.header, header.getContext())
)}
{header.column.getCanResize() &&
(renderResizeHandle ? (
renderResizeHandle({
Expand Down
3 changes: 3 additions & 0 deletions src/components/BaseHeaderRow/BaseHeaderRow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export interface BaseHeaderRowProps<TData, TValue = unknown>
renderResizeHandle?: (props: BaseResizeHandleProps<TData, TValue>) => React.ReactNode;
renderSortIndicator: BaseHeaderCellProps<TData, TValue>['renderSortIndicator'];
resizeHandleClassName?: BaseHeaderCellProps<TData, TValue>['resizeHandleClassName'];
sortClassName: BaseHeaderCellProps<TData, TValue>['sortClassName'];
sortIndicatorClassName: BaseHeaderCellProps<TData, TValue>['sortIndicatorClassName'];
attributes?:
| React.HTMLAttributes<HTMLTableRowElement>
Expand All @@ -37,6 +38,7 @@ export const BaseHeaderRow = <TData, TValue = unknown>({
renderResizeHandle,
renderSortIndicator,
resizeHandleClassName,
sortClassName,
sortIndicatorClassName,
attributes: attributesProp,
cellAttributes,
Expand Down Expand Up @@ -68,6 +70,7 @@ export const BaseHeaderRow = <TData, TValue = unknown>({
renderResizeHandle={renderResizeHandle}
renderSortIndicator={renderSortIndicator}
resizeHandleClassName={resizeHandleClassName}
sortClassName={sortClassName}
sortIndicatorClassName={sortIndicatorClassName}
attributes={cellAttributes}
/>
Expand Down
1 change: 0 additions & 1 deletion src/components/BaseSortIndicator/BaseSortIndicator.scss
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ $blockTable: '.#{variables.$ns}table';
#{$block} {
display: inline-flex;
margin-inline-start: 4px;
vertical-align: middle;
transform: rotate(0);

color: var(--g-color-text-hint);
Expand Down
10 changes: 5 additions & 5 deletions src/components/BaseTable/BaseTable.scss
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,11 @@ $block: '.#{variables.$ns}table';
font-weight: 500;
}

&__header-cell {
&_sortable {
cursor: pointer;
user-select: none;
}
&__sort {
display: inline-flex;
align-items: center;
cursor: pointer;
user-select: none;
}

&__cell,
Expand Down
4 changes: 4 additions & 0 deletions src/components/BaseTable/BaseTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ export interface BaseTableProps<TData, TScrollElement extends Element | Window =
rowClassName?: BaseRowProps<TData>['className'];
/** The row virtualizer instance returned from `useRowVirtualizer` or `useWindowRowVirtualizer` hooks */
rowVirtualizer?: Virtualizer<TScrollElement, HTMLTableRowElement>;
/** CSS classes for the sort content wrapper inside `<th>` elements */
sortClassName?: BaseHeaderRowProps<TData>['sortClassName'];
/** CSS classes for the sort indicator inside `<th>` elements */
sortIndicatorClassName?: BaseHeaderRowProps<TData>['sortIndicatorClassName'];
/** Makes the `<tfoot>` element sticky */
Expand Down Expand Up @@ -137,6 +139,7 @@ export const BaseTable = React.forwardRef(
rowAttributes,
rowClassName,
rowVirtualizer,
sortClassName,
sortIndicatorClassName,
stickyFooter = false,
stickyHeader = false,
Expand Down Expand Up @@ -243,6 +246,7 @@ export const BaseTable = React.forwardRef(
renderResizeHandle={renderResizeHandle}
renderSortIndicator={renderSortIndicator}
resizeHandleClassName={resizeHandleClassName}
sortClassName={sortClassName}
sortIndicatorClassName={sortIndicatorClassName}
attributes={headerRowAttributes}
cellAttributes={headerCellAttributes}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';

import {useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import {columns} from '../constants/columns';
import {data} from '../constants/data';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';

import {useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import {columns} from '../constants/columns';

import {cnEmptyContentStory} from './EmptyContentStory.classname';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import React from 'react';
import type {ExpandedState, Row} from '@tanstack/react-table';

import {useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import type {GroupOrItem} from '../constants/grouping';
import {columns, data} from '../constants/grouping';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import React from 'react';
import type {ExpandedState, Row} from '@tanstack/react-table';

import {useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import {columns} from '../constants/columns';
import type {Item} from '../types';
import {generateData} from '../utils';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type {ColumnDef, ExpandedState, Row, RowSelectionState} from '@tanstack/r

import {selectionColumn} from '../../../../constants';
import {useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import type {GroupOrItem} from '../constants/grouping';
import {data, columns as originalColumns} from '../constants/grouping';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import React from 'react';
import type {ColumnDef} from '@tanstack/react-table';

import {useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import {columns as nestedColumns} from '../constants/columns';
import {data} from '../constants/data';
import type {Item} from '../types';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import type {ColumnDef} from '@tanstack/react-table';

import {dragHandleColumn} from '../../../../constants';
import {useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {ReorderingProvider} from '../../../ReorderingProvider';
import type {ReorderingProviderProps} from '../../../ReorderingProvider';
import {BaseTable} from '../../BaseTable';
import {columns as originalColumns} from '../constants/columns';
import {data as originalData} from '../constants/data';
import type {Item} from '../types';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import type {ColumnDef} from '@tanstack/react-table';
import {dragHandleColumn} from '../../../../constants';
import {useTable, useWindowRowVirtualizer} from '../../../../hooks';
import {getVirtualRowRangeExtractor} from '../../../../utils';
import {BaseTable} from '../../../BaseTable';
import {ReorderingProvider} from '../../../ReorderingProvider';
import type {ReorderingProviderProps} from '../../../ReorderingProvider';
import {BaseTable} from '../../BaseTable';
import {columns as originalColumns} from '../constants/columns';
import type {Item} from '../types';
import {generateData} from '../utils';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';

import {useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import {columns} from '../constants/columns';
import {data} from '../constants/data';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import React from 'react';
import type {SortingState} from '@tanstack/react-table';

import {useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import {columns} from '../constants/columns';
import {data} from '../constants/data';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';

import {useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import {columns} from '../constants/columns';
import {generateData} from '../utils';

Expand Down
2 changes: 1 addition & 1 deletion src/components/BaseTable/__stories__/stories/TreeStory.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import React from 'react';
import type {ExpandedState} from '@tanstack/react-table';

import {useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import {columns, data} from '../constants/tree';

export const TreeStory = () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import React from 'react';
import type {ExpandedState, Row} from '@tanstack/react-table';

import {useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import type {TreeGroupItem} from '../constants/tree';
import {groupsColumns, groupsData} from '../constants/tree';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';

import {useRowVirtualizer, useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import {columns} from '../constants/columns';
import {generateData} from '../utils';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';

import {useTable, useWindowRowVirtualizer} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import {columns} from '../constants/columns';
import {generateData} from '../utils';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type {ColumnDef, RowSelectionState} from '@tanstack/react-table';

import {selectionColumn} from '../../../../constants';
import {useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import {columns as originalColumns} from '../constants/columns';
import {data} from '../constants/data';
import type {Item} from '../types';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from 'react';

import {useTable} from '../../../../hooks';
import {BaseTable} from '../../../BaseTable';
import {BaseTable} from '../../BaseTable';
import {columns} from '../constants/columns';
import {data} from '../constants/data';

Expand Down
3 changes: 3 additions & 0 deletions src/components/SortIndicator/SortIndicator.classname.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import {block} from '../../utils';

export const b = block('styled-sort-indicator');
15 changes: 15 additions & 0 deletions src/components/SortIndicator/SortIndicator.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
@use '../variables';

$block: '.#{variables.$ns}styled-sort-indicator';

#{$block} {
display: inline-flex;
padding-block: 1px;

color: var(--g-color-text-hint);

&_order_asc,
&_order_desc {
color: var(--g-color-text-primary);
}
}
41 changes: 41 additions & 0 deletions src/components/SortIndicator/SortIndicator.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import React from 'react';

import {
ArrowDown as ArrowDownIcon,
ArrowUpArrowDown as ArrowUpArrowDownIcon,
ArrowUp as ArrowUpIcon,
} from '@gravity-ui/icons';
import {Icon} from '@gravity-ui/uikit';

import type {BaseSortIndicatorProps} from '../BaseSortIndicator';

import {b} from './SortIndicator.classname';

import './SortIndicator.scss';

export interface SortIndicatorProps<TData, TValue> extends BaseSortIndicatorProps<TData, TValue> {}

export const SortIndicator = <TData, TValue>({
className,
header,
}: SortIndicatorProps<TData, TValue>) => {
const order = header.column.getIsSorted();

let icon;
switch (order) {
case 'asc':
icon = ArrowUpIcon;
break;
case 'desc':
icon = ArrowDownIcon;
break;
default:
icon = ArrowUpArrowDownIcon;
}

return (
<span className={b({order}, className)}>
<Icon data={icon} size={16} />
</span>
);
};
1 change: 1 addition & 0 deletions src/components/SortIndicator/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './SortIndicator';
9 changes: 9 additions & 0 deletions src/components/Table/Table.scss
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,15 @@ $block: '.#{variables.$ns}styled-table';
@include mixins.text-subheader-1();
}

&__sort {
gap: var(--g-spacing-1);
border-radius: var(--g-border-radius-xs);

&:focus-visible {
outline: 2px solid var(--g-color-line-focus);
}
}

&__cell,
&__header-cell,
&__footer-cell {
Expand Down
Loading

0 comments on commit f9ac529

Please sign in to comment.