savedSearchSelector.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import styled from '@emotion/styled';
  2. import DropdownButton from 'sentry/components/dropdownButton';
  3. import DropdownControl from 'sentry/components/dropdownControl';
  4. import {t} from 'sentry/locale';
  5. import overflowEllipsis from 'sentry/styles/overflowEllipsis';
  6. import {Organization, SavedSearch} from 'sentry/types';
  7. import SavedSearchMenu from './savedSearchMenu';
  8. type Props = {
  9. onSavedSearchDelete: (savedSearch: SavedSearch) => void;
  10. onSavedSearchSelect: (savedSearch: SavedSearch) => void;
  11. organization: Organization;
  12. savedSearchList: SavedSearch[];
  13. sort: string;
  14. query?: string;
  15. };
  16. function SavedSearchSelector({
  17. savedSearchList,
  18. onSavedSearchDelete,
  19. onSavedSearchSelect,
  20. organization,
  21. query,
  22. sort,
  23. }: Props) {
  24. function getTitle() {
  25. const savedSearch = savedSearchList.find(
  26. search => search.query === query && search.sort === sort
  27. );
  28. return savedSearch ? savedSearch.name : t('Custom Search');
  29. }
  30. return (
  31. <DropdownControl
  32. menuWidth="35vw"
  33. blendWithActor
  34. button={({isOpen, getActorProps}) => (
  35. <StyledDropdownButton {...getActorProps()} isOpen={isOpen}>
  36. <ButtonTitle>{getTitle()}</ButtonTitle>
  37. </StyledDropdownButton>
  38. )}
  39. >
  40. <SavedSearchMenu
  41. organization={organization}
  42. savedSearchList={savedSearchList}
  43. onSavedSearchSelect={onSavedSearchSelect}
  44. onSavedSearchDelete={onSavedSearchDelete}
  45. query={query}
  46. sort={sort}
  47. />
  48. </DropdownControl>
  49. );
  50. }
  51. export default SavedSearchSelector;
  52. const StyledDropdownButton = styled(DropdownButton)`
  53. color: ${p => p.theme.textColor};
  54. background-color: ${p => p.theme.background};
  55. border-right: 0;
  56. border-color: ${p => p.theme.border};
  57. z-index: ${p => p.theme.zIndex.dropdownAutocomplete.actor};
  58. border-radius: ${p =>
  59. p.isOpen
  60. ? `${p.theme.borderRadius} 0 0 0`
  61. : `${p.theme.borderRadius} 0 0 ${p.theme.borderRadius}`};
  62. white-space: nowrap;
  63. max-width: 200px;
  64. margin-right: 0;
  65. &:hover,
  66. &:focus,
  67. &:active {
  68. border-color: ${p => p.theme.border};
  69. border-right: 0;
  70. }
  71. `;
  72. const ButtonTitle = styled('span')`
  73. ${overflowEllipsis}
  74. `;