filterBar.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import styled from '@emotion/styled';
  2. import type {Location} from 'history';
  3. import ButtonBar from 'sentry/components/buttonBar';
  4. import {CompactSelect} from 'sentry/components/compactSelect';
  5. import ProjectPageFilter from 'sentry/components/projectPageFilter';
  6. import SearchBar from 'sentry/components/searchBar';
  7. import {t} from 'sentry/locale';
  8. import {space} from 'sentry/styles/space';
  9. import TeamFilter from './list/rules/teamFilter';
  10. import {getQueryStatus, getTeamParams} from './utils';
  11. interface Props {
  12. location: Location<any>;
  13. onChangeFilter: (activeFilters: string[]) => void;
  14. onChangeSearch: (query: string) => void;
  15. hasStatusFilters?: boolean;
  16. onChangeStatus?: (status: string) => void;
  17. }
  18. function FilterBar({
  19. location,
  20. onChangeSearch,
  21. onChangeFilter,
  22. onChangeStatus,
  23. hasStatusFilters,
  24. }: Props) {
  25. const selectedTeams = getTeamParams(location.query.team);
  26. const selectedStatus = getQueryStatus(location.query.status);
  27. return (
  28. <Wrapper>
  29. <FilterButtons gap={1.5}>
  30. <TeamFilter selectedTeams={selectedTeams} handleChangeFilter={onChangeFilter} />
  31. <ProjectPageFilter />
  32. {hasStatusFilters && onChangeStatus && (
  33. <CompactSelect
  34. triggerProps={{
  35. prefix: t('Status'),
  36. }}
  37. options={[
  38. {
  39. value: 'all',
  40. label: t('All'),
  41. },
  42. {
  43. value: 'open',
  44. label: t('Active'),
  45. },
  46. {
  47. value: 'closed',
  48. label: t('Inactive'),
  49. },
  50. ]}
  51. value={selectedStatus}
  52. onChange={({value}) => onChangeStatus(value)}
  53. />
  54. )}
  55. </FilterButtons>
  56. <SearchBar
  57. placeholder={t('Search by name')}
  58. query={location.query?.name}
  59. onSearch={onChangeSearch}
  60. />
  61. </Wrapper>
  62. );
  63. }
  64. export default FilterBar;
  65. const Wrapper = styled('div')`
  66. display: grid;
  67. gap: ${space(1.5)};
  68. margin-bottom: ${space(2)};
  69. @media (min-width: ${p => p.theme.breakpoints.small}) {
  70. grid-template-columns: min-content 1fr;
  71. }
  72. `;
  73. const FilterButtons = styled(ButtonBar)`
  74. @media (max-width: ${p => p.theme.breakpoints.small}) {
  75. display: flex;
  76. align-items: flex-start;
  77. gap: ${space(1.5)};
  78. }
  79. @media (min-width: ${p => p.theme.breakpoints.small}) {
  80. display: grid;
  81. grid-auto-columns: minmax(auto, 300px);
  82. }
  83. `;