12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- // eslint-disable-next-line no-restricted-imports
- import {withRouter, WithRouterProps} from 'react-router';
- import {LocationDescriptor} from 'history';
- import * as qs from 'query-string';
- import Link, {LinkProps} from 'sentry/components/links/link';
- import {extractSelectionParameters} from 'sentry/components/organizations/pageFilters/utils';
- interface Props extends WithRouterProps {
- /**
- * Location that is being linked to
- */
- to: LocationDescriptor;
- children?: React.ReactNode;
- /**
- * Styles applied to the component's root
- */
- className?: string;
- /**
- * Click event (not for navigation)
- */
- onClick?: LinkProps['onClick'];
- /**
- * Inline styles
- */
- style?: React.CSSProperties;
- }
- /**
- * A modified link used for navigating between organization level pages that
- * will keep the global selection values (projects, environments, time) in the
- * querystring when navigating if it's present
- *
- * Falls back to <a> if there is no router present.
- */
- function GlobalSelectionLink(props: Props) {
- const {location, to} = props;
- const globalQuery = extractSelectionParameters(location?.query);
- const hasGlobalQuery = Object.keys(globalQuery).length > 0;
- const query =
- typeof to === 'object' && to.query ? {...globalQuery, ...to.query} : globalQuery;
- if (location) {
- const toWithGlobalQuery: LocationDescriptor = !hasGlobalQuery
- ? {}
- : typeof to === 'string'
- ? {pathname: to, query}
- : {...to, query};
- const routerProps = hasGlobalQuery
- ? {...props, to: toWithGlobalQuery}
- : {...props, to};
- return <Link {...routerProps} />;
- }
- let queryStringObject = {};
- if (typeof to === 'object' && to.search) {
- queryStringObject = qs.parse(to.search);
- }
- queryStringObject = {...queryStringObject, ...globalQuery};
- if (typeof to === 'object' && to.query) {
- queryStringObject = {...queryStringObject, ...to.query};
- }
- const queryString = qs.stringify(queryStringObject);
- const url =
- (typeof to === 'string' ? to : to.pathname) + (queryString ? `?${queryString}` : '');
- return <a {...props} href={url} />;
- }
- export default withRouter(GlobalSelectionLink);
|