libraryTab.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import {Fragment} from 'react';
  2. import styled from '@emotion/styled';
  3. import Alert from 'sentry/components/alert';
  4. import {t} from 'sentry/locale';
  5. import space from 'sentry/styles/space';
  6. import {Organization} from 'sentry/types';
  7. import {WidgetType} from 'sentry/views/dashboardsV2/types';
  8. import {
  9. DEFAULT_WIDGETS,
  10. WidgetTemplate,
  11. } from 'sentry/views/dashboardsV2/widgetLibrary/data';
  12. import WidgetLibraryCard from 'sentry/views/dashboardsV2/widgetLibrary/widgetCard';
  13. type Props = {
  14. errored: boolean;
  15. organization: Organization;
  16. selectedWidgets: WidgetTemplate[];
  17. setErrored: (errored: boolean) => void;
  18. setSelectedWidgets: (widgets: WidgetTemplate[]) => void;
  19. };
  20. function DashboardWidgetLibraryTab({
  21. selectedWidgets,
  22. errored,
  23. organization,
  24. setSelectedWidgets,
  25. setErrored,
  26. }: Props) {
  27. let defaultWidgets = DEFAULT_WIDGETS;
  28. if (!!!organization.features.includes('dashboards-releases')) {
  29. defaultWidgets = defaultWidgets.filter(
  30. widget => !!!(widget.widgetType === WidgetType.RELEASE)
  31. );
  32. }
  33. return (
  34. <Fragment>
  35. {errored && !!!selectedWidgets.length ? (
  36. <Alert type="error">
  37. {t(
  38. 'Please select at least one Widget from our Library. Alternatively, you can build a custom widget from scratch.'
  39. )}
  40. </Alert>
  41. ) : null}
  42. <WidgetLibraryGrid>
  43. {defaultWidgets.map((widgetCard, index) => {
  44. return (
  45. <WidgetLibraryCard
  46. data-test-id={`widget-library-card-${index}`}
  47. key={widgetCard.title}
  48. widget={widgetCard}
  49. selectedWidgets={selectedWidgets}
  50. setSelectedWidgets={setSelectedWidgets}
  51. setErrored={setErrored}
  52. />
  53. );
  54. })}
  55. </WidgetLibraryGrid>
  56. </Fragment>
  57. );
  58. }
  59. const WidgetLibraryGrid = styled('div')`
  60. display: grid;
  61. grid-template-columns: repeat(2, minmax(100px, 1fr));
  62. grid-template-rows: repeat(2, max-content);
  63. row-gap: ${space(1.5)};
  64. column-gap: ${space(2)};
  65. /* 700px is the max width of the modal */
  66. @media (max-width: 700px) {
  67. grid-template-columns: auto;
  68. }
  69. `;
  70. export default DashboardWidgetLibraryTab;