import type { ButtonProps } from '@planview/pv-uikit' import { ButtonEmpty } from '@planview/pv-uikit' import { sizePx } from '@planview/pv-utilities' import React from 'react' import styled from 'styled-components' const FluidButton = styled(ButtonEmpty)` width: 100%; height: 100%; align-items: center; min-height: ${sizePx.small}; text-align: left; &:focus-visible { outline: none; } ` export type GridCellButtonProps = Omit< ButtonProps, 'children' | 'tabIndex' | 'withCaret' | 'size' > & { /** * Visible label. * * If no tooltip is provided and the visible label is truncated, a tooltip will automatically be applied showing the label on hover/focus */ label?: string /** * Accessible tab index. You should generally pass through the tabIndex * provided to the Renderer component. */ tabIndex: number } const GridCellButtonImpl = ({ label = '', ...rest }: GridCellButtonProps) => ( { //Prevent row being selected e.stopPropagation() rest.onClick?.(e) }} > {label} ) /** * * `import { GridCellButton } from '@planview/pv-grid'` * * The [GridCellButton](https://design.planview.com/components/grid/grid-renderer-button) is best suited for triggering actions within a grid, such as deleting a row or opening a modal. * * The component renders an `ButtonEmpty` with fluid height and width with a built-in tooltip. * * ### Responsiveness * The`GridCellButton` will apply a tooltip whenever the text is truncated. This behavior can be overridden by providing the `tooltip` prop * * ### Accessibility * When using the `GridCellButton` component in your Renderer function, it is important to set `focusStrategy` to `"inline"`. * This will make sure focus is applied on the button inside the grid-cell on keyboard navigation which is important for screen readers to be able to read out the * navigation state correctly. * * ```tsx * const deleteColumn: Column = { * id: 'delete', * label: '', * resizable: false, * width: size.small, * cell: { * focusStrategy: 'inline', * Renderer({ rowId, tabIndex }) { * return ( * } * onClick={() => * //some action here * } * /> * ) * }, * }, * }, * ``` */ export const GridCellButton = React.memo( GridCellButtonImpl ) as typeof GridCellButtonImpl