pageTimeRangeSelector.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import {useState} from 'react';
  2. import styled from '@emotion/styled';
  3. import TimeRangeSelector from 'sentry/components/organizations/timeRangeSelector';
  4. import {Panel} from 'sentry/components/panels';
  5. import {DEFAULT_RELATIVE_PERIODS} from 'sentry/constants';
  6. import {t} from 'sentry/locale';
  7. import space from 'sentry/styles/space';
  8. import {defined} from 'sentry/utils';
  9. type Props = React.ComponentProps<typeof TimeRangeSelector> & {
  10. className?: string;
  11. showPin?: boolean;
  12. };
  13. function PageTimeRangeSelector({className, customDropdownButton, ...props}: Props) {
  14. const [isCalendarOpen, setIsCalendarOpen] = useState(false);
  15. return (
  16. <DropdownDate
  17. className={className}
  18. isCalendarOpen={isCalendarOpen}
  19. hasCustomButton={defined(customDropdownButton)}
  20. >
  21. <TimeRangeSelector
  22. key={`period:${props.relative}-start:${props.start}-end:${props.end}-utc:${props.utc}-defaultPeriod:${props.defaultPeriod}`}
  23. label={<DropdownLabel>{t('Date Range:')}</DropdownLabel>}
  24. onToggleSelector={isOpen => setIsCalendarOpen(isOpen)}
  25. relativeOptions={DEFAULT_RELATIVE_PERIODS}
  26. customDropdownButton={customDropdownButton}
  27. detached
  28. {...props}
  29. />
  30. </DropdownDate>
  31. );
  32. }
  33. const DropdownDate = styled(Panel)<{hasCustomButton: boolean; isCalendarOpen: boolean}>`
  34. padding: 0;
  35. margin: 0;
  36. ${p =>
  37. !p.hasCustomButton &&
  38. `
  39. display: flex;
  40. justify-content: center;
  41. align-items: center;
  42. height: 42px;
  43. background: ${p.theme.background};
  44. border: 1px solid ${p.theme.border};
  45. border-radius: ${p.theme.borderRadius};
  46. font-size: ${p.theme.fontSizeMedium};
  47. color: ${p.theme.textColor};
  48. > div {
  49. width: 100%;
  50. align-self: stretch;
  51. }
  52. /* StyledItemHeader used to show selected value of TimeRangeSelector */
  53. > div > div:first-child > div {
  54. padding: 0 ${space(2)};
  55. }
  56. /* Menu that dropdowns from TimeRangeSelector */
  57. > div > div:last-child:not(:first-child) {
  58. /* Remove awkward 1px width difference on dropdown due to border */
  59. min-width: calc(100% + 2px);
  60. transform: translateX(-1px);
  61. right: auto;
  62. }
  63. `}
  64. `;
  65. const DropdownLabel = styled('span')`
  66. text-align: left;
  67. font-weight: 600;
  68. color: ${p => p.theme.textColor};
  69. > span:last-child {
  70. font-weight: 400;
  71. }
  72. `;
  73. export default PageTimeRangeSelector;