datePageFilter.tsx 3.6 KB

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