header.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import * as React from 'react';
  2. import Breadcrumbs from 'app/components/breadcrumbs';
  3. import Button from 'app/components/button';
  4. import ButtonBar from 'app/components/buttonBar';
  5. import Confirm from 'app/components/confirm';
  6. import EditableText from 'app/components/editableText';
  7. import * as Layout from 'app/components/layouts/thirds';
  8. import Link from 'app/components/links/link';
  9. import {t} from 'app/locale';
  10. import {DashboardDetails} from '../types';
  11. type Props = {
  12. title: string;
  13. orgSlug: string;
  14. goBackLocation: React.ComponentProps<typeof Link>['to'];
  15. dashboardTitle: DashboardDetails['title'];
  16. onChangeTitle: (title: string) => void;
  17. onSave?: (event: React.MouseEvent) => void;
  18. onDelete?: () => void;
  19. disabled?: boolean;
  20. isEditing?: boolean;
  21. };
  22. function Header({
  23. title,
  24. orgSlug,
  25. goBackLocation,
  26. dashboardTitle,
  27. onChangeTitle,
  28. onSave,
  29. onDelete,
  30. isEditing,
  31. }: Props) {
  32. return (
  33. <Layout.Header>
  34. <Layout.HeaderContent>
  35. <Breadcrumbs
  36. crumbs={[
  37. {
  38. to: `/organizations/${orgSlug}/dashboards/`,
  39. label: t('Dashboards'),
  40. },
  41. {
  42. to: goBackLocation,
  43. label: dashboardTitle,
  44. },
  45. {label: t('Widget Builder')},
  46. ]}
  47. />
  48. <Layout.Title>
  49. <EditableText
  50. value={title}
  51. onChange={onChangeTitle}
  52. errorMessage={t('Please set a title for this widget')}
  53. successMessage={t('Widget title updated successfully')}
  54. />
  55. </Layout.Title>
  56. </Layout.HeaderContent>
  57. <Layout.HeaderActions>
  58. <ButtonBar gap={1}>
  59. <Button
  60. title={t(
  61. "You’re seeing the metrics project because you have the feature flag 'organizations:metrics' enabled. Send us feedback via email."
  62. )}
  63. href="mailto:metrics-feedback@sentry.io?subject=Metrics Feedback"
  64. >
  65. {t('Give Feedback')}
  66. </Button>
  67. <Button to={goBackLocation}>{t('Cancel')}</Button>
  68. {isEditing && onDelete && (
  69. <Confirm
  70. priority="danger"
  71. message={t('Are you sure you want to delete this widget?')}
  72. onConfirm={onDelete}
  73. >
  74. <Button priority="danger">{t('Delete')}</Button>
  75. </Confirm>
  76. )}
  77. <Button
  78. priority="primary"
  79. onClick={onSave}
  80. disabled={!onSave}
  81. title={!onSave ? t('This feature is not yet available') : undefined}
  82. >
  83. {isEditing ? t('Update Widget') : t('Add Widget')}
  84. </Button>
  85. </ButtonBar>
  86. </Layout.HeaderActions>
  87. </Layout.Header>
  88. );
  89. }
  90. export default Header;