123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- import styled from '@emotion/styled';
- import {LocationDescriptorObject} from 'history';
- import omit from 'lodash/omit';
- import Link from 'sentry/components/links/link';
- import {IconArrow} from 'sentry/icons';
- export type Alignments = 'left' | 'right' | undefined;
- export type Directions = 'desc' | 'asc' | undefined;
- type Props = {
- align: Alignments;
- canSort: boolean;
- direction: Directions;
- generateSortLink: () => LocationDescriptorObject | undefined;
- title: React.ReactNode;
- onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;
- };
- function SortLink({align, title, canSort, generateSortLink, onClick, direction}: Props) {
- const target = generateSortLink();
- if (!target || !canSort) {
- return <StyledNonLink align={align}>{title}</StyledNonLink>;
- }
- const arrow = !direction ? null : (
- <StyledIconArrow size="xs" direction={direction === 'desc' ? 'down' : 'up'} />
- );
- return (
- <StyledLink align={align} to={target} onClick={onClick}>
- {title} {arrow}
- </StyledLink>
- );
- }
- type LinkProps = React.ComponentPropsWithoutRef<typeof Link>;
- type StyledLinkProps = LinkProps & {align: Alignments};
- const StyledLink = styled((props: StyledLinkProps) => {
- const forwardProps = omit(props, ['align']);
- return <Link {...forwardProps} />;
- })`
- display: block;
- width: 100%;
- white-space: nowrap;
- color: inherit;
- &:hover,
- &:active,
- &:focus,
- &:visited {
- color: inherit;
- }
- ${(p: StyledLinkProps) => (p.align ? `text-align: ${p.align};` : '')}
- `;
- const StyledNonLink = styled('div')<{align: Alignments}>`
- display: block;
- width: 100%;
- white-space: nowrap;
- ${(p: {align: Alignments}) => (p.align ? `text-align: ${p.align};` : '')}
- `;
- const StyledIconArrow = styled(IconArrow)`
- vertical-align: top;
- `;
- export default SortLink;
|