datePageFilter.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import {Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import {updateDateTime} from 'sentry/actionCreators/pageFilters';
  4. import Datetime from 'sentry/components/dateTime';
  5. import {DatePageFilter as NewDatePageFilter} from 'sentry/components/organizations/datePageFilter';
  6. import PageFilterDropdownButton from 'sentry/components/organizations/pageFilters/pageFilterDropdownButton';
  7. import PageFilterPinIndicator from 'sentry/components/organizations/pageFilters/pageFilterPinIndicator';
  8. import TimeRangeSelector, {
  9. ChangeData,
  10. } from 'sentry/components/organizations/timeRangeSelector';
  11. import {IconCalendar} from 'sentry/icons';
  12. import {
  13. DEFAULT_DAY_END_TIME,
  14. DEFAULT_DAY_START_TIME,
  15. getFormattedDate,
  16. } from 'sentry/utils/dates';
  17. import useOrganization from 'sentry/utils/useOrganization';
  18. import usePageFilters from 'sentry/utils/usePageFilters';
  19. import useRouter from 'sentry/utils/useRouter';
  20. type Props = Omit<
  21. React.ComponentProps<typeof TimeRangeSelector>,
  22. 'organization' | 'start' | 'end' | 'utc' | 'relative' | 'onUpdate'
  23. > & {
  24. menuFooterMessage?: string;
  25. /**
  26. * Reset these URL params when we fire actions (custom routing only)
  27. */
  28. resetParamsOnChange?: string[];
  29. };
  30. function OldDatePageFilter({
  31. resetParamsOnChange,
  32. disabled,
  33. storageNamespace,
  34. ...props
  35. }: Props) {
  36. const router = useRouter();
  37. const {selection, desyncedFilters} = usePageFilters();
  38. const organization = useOrganization();
  39. const {start, end, period, utc} = selection.datetime;
  40. const handleUpdate = (timePeriodUpdate: ChangeData) => {
  41. const {relative, ...startEndUtc} = timePeriodUpdate;
  42. const newTimePeriod = {
  43. period: relative,
  44. ...startEndUtc,
  45. };
  46. updateDateTime(newTimePeriod, router, {
  47. save: true,
  48. resetParams: resetParamsOnChange,
  49. storageNamespace,
  50. });
  51. };
  52. const customDropdownButton = ({getActorProps, isOpen}) => {
  53. let label;
  54. if (start && end) {
  55. const startTimeFormatted = getFormattedDate(start, 'HH:mm:ss', {local: true});
  56. const endTimeFormatted = getFormattedDate(end, 'HH:mm:ss', {local: true});
  57. const showDateOnly =
  58. startTimeFormatted === DEFAULT_DAY_START_TIME &&
  59. endTimeFormatted === DEFAULT_DAY_END_TIME;
  60. label = (
  61. <Fragment>
  62. <Datetime date={start} dateOnly={showDateOnly} />
  63. {' – '}
  64. <Datetime date={end} dateOnly={showDateOnly} />
  65. </Fragment>
  66. );
  67. } else {
  68. label = period?.toUpperCase();
  69. }
  70. return (
  71. <PageFilterDropdownButton
  72. detached
  73. disabled={disabled}
  74. hideBottomBorder={false}
  75. isOpen={isOpen}
  76. highlighted={desyncedFilters.has('datetime')}
  77. data-test-id="page-filter-timerange-selector"
  78. icon={
  79. <PageFilterPinIndicator filter="datetime">
  80. <IconCalendar />
  81. </PageFilterPinIndicator>
  82. }
  83. {...getActorProps()}
  84. >
  85. <TitleContainer>{label}</TitleContainer>
  86. </PageFilterDropdownButton>
  87. );
  88. };
  89. return (
  90. <TimeRangeSelector
  91. organization={organization}
  92. start={start}
  93. end={end}
  94. relative={period}
  95. utc={utc}
  96. onUpdate={handleUpdate}
  97. customDropdownButton={customDropdownButton}
  98. disabled={disabled}
  99. showPin
  100. detached
  101. {...props}
  102. />
  103. );
  104. }
  105. const TitleContainer = styled('div')`
  106. text-align: left;
  107. ${p => p.theme.overflowEllipsis}
  108. `;
  109. function DatePageFilter(props: Props) {
  110. const organization = useOrganization();
  111. if (organization.features.includes('new-page-filter')) {
  112. return <NewDatePageFilter {...props} />;
  113. }
  114. return <OldDatePageFilter {...props} />;
  115. }
  116. export default DatePageFilter;