environmentPageFilter.tsx 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import {useState} from 'react';
  2. import {withRouter, WithRouterProps} from 'react-router';
  3. import styled from '@emotion/styled';
  4. import {updateEnvironments} from 'sentry/actionCreators/pageFilters';
  5. import DropdownButton from 'sentry/components/dropdownButton';
  6. import MultipleEnvironmentSelector from 'sentry/components/organizations/multipleEnvironmentSelector';
  7. import {IconWindow} from 'sentry/icons';
  8. import {t} from 'sentry/locale';
  9. import PageFiltersStore from 'sentry/stores/pageFiltersStore';
  10. import {useLegacyStore} from 'sentry/stores/useLegacyStore';
  11. import space from 'sentry/styles/space';
  12. import useOrganization from 'sentry/utils/useOrganization';
  13. import useProjects from 'sentry/utils/useProjects';
  14. type Props = {
  15. router: WithRouterProps['router'];
  16. /**
  17. * Reset these URL params when we fire actions (custom routing only)
  18. */
  19. resetParamsOnChange?: string[];
  20. };
  21. function EnvironmentPageFilter({router, resetParamsOnChange = []}: Props) {
  22. const {projects, initiallyLoaded: projectsLoaded} = useProjects();
  23. const organization = useOrganization();
  24. const {selection, pinnedFilters, isReady} = useLegacyStore(PageFiltersStore);
  25. const [selectedEnvironments, setSelectedEnvironments] = useState<string[] | null>(null);
  26. const handleChangeEnvironments = (environments: string[] | null) => {
  27. setSelectedEnvironments(environments);
  28. };
  29. const handleUpdateEnvironments = (quickSelectedEnvs?: string[]) => {
  30. updateEnvironments(quickSelectedEnvs ?? selectedEnvironments, router, {
  31. save: true,
  32. resetParams: resetParamsOnChange,
  33. });
  34. };
  35. const customDropdownButton = ({isOpen, getActorProps, summary}) => {
  36. return (
  37. <StyledDropdownButton isOpen={isOpen} {...getActorProps()}>
  38. <DropdownTitle>
  39. <IconWindow />
  40. <TitleContainer>{summary}</TitleContainer>
  41. </DropdownTitle>
  42. </StyledDropdownButton>
  43. );
  44. };
  45. const customLoadingIndicator = (
  46. <StyledDropdownButton showChevron={false} disabled>
  47. <DropdownTitle>
  48. <IconWindow />
  49. {t('Loading\u2026')}
  50. </DropdownTitle>
  51. </StyledDropdownButton>
  52. );
  53. return (
  54. <MultipleEnvironmentSelector
  55. organization={organization}
  56. projects={projects}
  57. loadingProjects={!projectsLoaded || !isReady}
  58. selectedProjects={selection.projects}
  59. value={selection.environments}
  60. onChange={handleChangeEnvironments}
  61. onUpdate={handleUpdateEnvironments}
  62. customDropdownButton={customDropdownButton}
  63. customLoadingIndicator={customLoadingIndicator}
  64. pinned={pinnedFilters.has('environments')}
  65. />
  66. );
  67. }
  68. const StyledDropdownButton = styled(DropdownButton)`
  69. width: 100%;
  70. height: 40px;
  71. `;
  72. const TitleContainer = styled('div')`
  73. overflow: hidden;
  74. white-space: nowrap;
  75. text-overflow: ellipsis;
  76. flex: 1 1 0%;
  77. margin-left: ${space(1)};
  78. `;
  79. const DropdownTitle = styled('div')`
  80. display: flex;
  81. overflow: hidden;
  82. align-items: center;
  83. flex: 1;
  84. `;
  85. export default withRouter(EnvironmentPageFilter);