projectFilters.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import styled from '@emotion/styled';
  2. import {DatePageFilter} from 'sentry/components/organizations/datePageFilter';
  3. import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter';
  4. import PageFilterBar from 'sentry/components/organizations/pageFilterBar';
  5. import SmartSearchBar from 'sentry/components/smartSearchBar';
  6. import {t} from 'sentry/locale';
  7. import {space} from 'sentry/styles/space';
  8. import type {Tag} from 'sentry/types';
  9. import {SEMVER_TAGS} from 'sentry/utils/discover/fields';
  10. import type {TagValueLoader} from '../issueList/types';
  11. type Props = {
  12. onSearch: (q: string) => void;
  13. query: string;
  14. relativeDateOptions: React.ComponentProps<typeof DatePageFilter>['relativeOptions'];
  15. tagValueLoader: TagValueLoader;
  16. };
  17. function ProjectFilters({query, relativeDateOptions, tagValueLoader, onSearch}: Props) {
  18. const getTagValues = async (tag: Tag, currentQuery: string): Promise<string[]> => {
  19. const values = await tagValueLoader(tag.key, currentQuery);
  20. return values.map(({value}) => value);
  21. };
  22. return (
  23. <FiltersWrapper>
  24. <PageFilterBar>
  25. <EnvironmentPageFilter />
  26. <DatePageFilter relativeOptions={relativeDateOptions} />
  27. </PageFilterBar>
  28. <SmartSearchBar
  29. searchSource="project_filters"
  30. query={query}
  31. placeholder={t('Search by release version, build, package, or stage')}
  32. hasRecentSearches={false}
  33. supportedTags={{
  34. ...SEMVER_TAGS,
  35. release: {
  36. key: 'release',
  37. name: 'release',
  38. },
  39. }}
  40. maxMenuHeight={500}
  41. onSearch={onSearch}
  42. onGetTagValues={getTagValues}
  43. />
  44. </FiltersWrapper>
  45. );
  46. }
  47. const FiltersWrapper = styled('div')`
  48. display: grid;
  49. grid-template-columns: minmax(0, max-content) 1fr;
  50. gap: ${space(2)};
  51. @media (max-width: ${p => p.theme.breakpoints.small}) {
  52. grid-template-columns: minmax(0, 1fr);
  53. }
  54. `;
  55. export default ProjectFilters;