datePageFilter.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import {withRouter, WithRouterProps} from 'react-router';
  2. import styled from '@emotion/styled';
  3. import {updateDateTime} from 'sentry/actionCreators/pageFilters';
  4. import PageFilterDropdownButton from 'sentry/components/organizations/pageFilters/pageFilterDropdownButton';
  5. import TimeRangeSelector, {
  6. ChangeData,
  7. } from 'sentry/components/organizations/timeRangeSelector';
  8. import PageTimeRangeSelector from 'sentry/components/pageTimeRangeSelector';
  9. import {IconCalendar} from 'sentry/icons';
  10. import PageFiltersStore from 'sentry/stores/pageFiltersStore';
  11. import {useLegacyStore} from 'sentry/stores/useLegacyStore';
  12. import useOrganization from 'sentry/utils/useOrganization';
  13. type Props = Omit<
  14. React.ComponentProps<typeof TimeRangeSelector>,
  15. 'organization' | 'start' | 'end' | 'utc' | 'relative' | 'onUpdate'
  16. > &
  17. WithRouterProps & {
  18. /**
  19. * Reset these URL params when we fire actions (custom routing only)
  20. */
  21. resetParamsOnChange?: string[];
  22. };
  23. function DatePageFilter({router, resetParamsOnChange, ...props}: Props) {
  24. const {selection, desyncedFilters} = useLegacyStore(PageFiltersStore);
  25. const organization = useOrganization();
  26. const {start, end, period, utc} = selection.datetime;
  27. const handleUpdate = (timePeriodUpdate: ChangeData) => {
  28. const {relative, ...startEndUtc} = timePeriodUpdate;
  29. const newTimePeriod = {
  30. period: relative,
  31. ...startEndUtc,
  32. };
  33. updateDateTime(newTimePeriod, router, {save: true, resetParams: resetParamsOnChange});
  34. };
  35. const customDropdownButton = ({getActorProps, isOpen}) => {
  36. let label;
  37. if (start && end) {
  38. const startString = start.toLocaleString('default', {
  39. month: 'short',
  40. day: 'numeric',
  41. });
  42. const endString = end.toLocaleString('default', {month: 'short', day: 'numeric'});
  43. label = `${startString} - ${endString}`;
  44. } else {
  45. label = period?.toUpperCase();
  46. }
  47. return (
  48. <PageFilterDropdownButton
  49. isOpen={isOpen}
  50. icon={<IconCalendar />}
  51. highlighted={desyncedFilters.has('datetime')}
  52. {...getActorProps()}
  53. >
  54. <DropdownTitle>
  55. <TitleContainer>{label}</TitleContainer>
  56. </DropdownTitle>
  57. </PageFilterDropdownButton>
  58. );
  59. };
  60. return (
  61. <StyledPageTimeRangeSelector
  62. organization={organization}
  63. start={start}
  64. end={end}
  65. relative={period}
  66. utc={utc}
  67. onUpdate={handleUpdate}
  68. label={<IconCalendar color="textColor" />}
  69. customDropdownButton={customDropdownButton}
  70. {...props}
  71. />
  72. );
  73. }
  74. const StyledPageTimeRangeSelector = styled(PageTimeRangeSelector)`
  75. flex-grow: 0;
  76. flex-shrink: 0;
  77. flex-basis: fit-content;
  78. position: relative;
  79. width: 100%;
  80. height: 100%;
  81. background: ${p => p.theme.background};
  82. border: none;
  83. box-shadow: none;
  84. `;
  85. const TitleContainer = styled('div')`
  86. overflow: hidden;
  87. white-space: nowrap;
  88. text-overflow: ellipsis;
  89. flex: 1 1 0%;
  90. `;
  91. const DropdownTitle = styled('div')`
  92. display: flex;
  93. overflow: hidden;
  94. align-items: center;
  95. flex: 1;
  96. `;
  97. export default withRouter(DatePageFilter);