navigationConfiguration.tsx 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import {t} from 'sentry/locale';
  2. import {Organization, Project} from 'sentry/types';
  3. import {NavigationSection} from 'sentry/views/settings/types';
  4. type ConfigParams = {
  5. debugFilesNeedsReview?: boolean;
  6. organization?: Organization;
  7. project?: Project;
  8. };
  9. const pathPrefix = '/settings/:orgId/projects/:projectId';
  10. export default function getConfiguration({
  11. project,
  12. organization,
  13. debugFilesNeedsReview,
  14. }: ConfigParams): NavigationSection[] {
  15. const plugins = ((project && project.plugins) || []).filter(plugin => plugin.enabled);
  16. return [
  17. {
  18. name: t('Project'),
  19. items: [
  20. {
  21. path: `${pathPrefix}/`,
  22. index: true,
  23. title: t('General Settings'),
  24. description: t('Configure general settings for a project'),
  25. },
  26. {
  27. path: `${pathPrefix}/teams/`,
  28. title: t('Project Teams'),
  29. description: t('Manage team access for a project'),
  30. },
  31. {
  32. path: `${pathPrefix}/alerts/`,
  33. title: t('Alert Settings'),
  34. description: t('Project alert settings'),
  35. },
  36. {
  37. path: `${pathPrefix}/tags/`,
  38. title: t('Tags'),
  39. description: t("View and manage a project's tags"),
  40. },
  41. {
  42. path: `${pathPrefix}/environments/`,
  43. title: t('Environments'),
  44. description: t('Manage environments in a project'),
  45. },
  46. {
  47. path: `${pathPrefix}/ownership/`,
  48. title: organization?.features?.includes('streamline-targeting-context')
  49. ? t('Ownership Rules')
  50. : t('Issue Owners'),
  51. description: t('Manage ownership rules for a project'),
  52. },
  53. {
  54. path: `${pathPrefix}/data-forwarding/`,
  55. title: t('Data Forwarding'),
  56. },
  57. ],
  58. },
  59. {
  60. name: t('Processing'),
  61. items: [
  62. {
  63. path: `${pathPrefix}/filters/`,
  64. title: t('Inbound Filters'),
  65. description: t(
  66. "Configure a project's inbound filters (e.g. browsers, messages)"
  67. ),
  68. },
  69. {
  70. path: `${pathPrefix}/dynamic-sampling/`,
  71. title: t('Dynamic Sampling'),
  72. show: () => {
  73. const orgFeatures = organization?.features ?? [];
  74. return orgFeatures.includes('dynamic-sampling');
  75. },
  76. description: t(
  77. "Per-Project basis solution to configure sampling rules within Sentry's UI"
  78. ),
  79. badge: () => 'new',
  80. },
  81. {
  82. path: `${pathPrefix}/security-and-privacy/`,
  83. title: t('Security & Privacy'),
  84. description: t(
  85. 'Configuration related to dealing with sensitive data and other security settings. (Data Scrubbing, Data Privacy, Data Scrubbing) for a project'
  86. ),
  87. },
  88. {
  89. path: `${pathPrefix}/issue-grouping/`,
  90. title: t('Issue Grouping'),
  91. },
  92. {
  93. path: `${pathPrefix}/processing-issues/`,
  94. title: t('Processing Issues'),
  95. // eslint-disable-next-line @typescript-eslint/no-shadow
  96. badge: ({project}) => {
  97. if (!project) {
  98. return null;
  99. }
  100. if (project.processingIssues <= 0) {
  101. return null;
  102. }
  103. return project.processingIssues > 99 ? '99+' : project.processingIssues;
  104. },
  105. },
  106. {
  107. path: `${pathPrefix}/debug-symbols/`,
  108. title: t('Debug Files'),
  109. badge: debugFilesNeedsReview ? () => 'warning' : undefined,
  110. },
  111. {
  112. path: `${pathPrefix}/proguard/`,
  113. title: t('ProGuard'),
  114. },
  115. {
  116. path: `${pathPrefix}/source-maps/`,
  117. title: t('Source Maps'),
  118. },
  119. {
  120. path: `${pathPrefix}/performance/`,
  121. title: t('Performance'),
  122. show: () => !!organization?.features?.includes('performance-view'),
  123. },
  124. ],
  125. },
  126. {
  127. name: t('SDK Setup'),
  128. items: [
  129. {
  130. path: `${pathPrefix}/install/`,
  131. title: t('Instrumentation'),
  132. },
  133. {
  134. path: `${pathPrefix}/keys/`,
  135. title: t('Client Keys (DSN)'),
  136. description: t("View and manage the project's client keys (DSN)"),
  137. },
  138. {
  139. path: `${pathPrefix}/release-tracking/`,
  140. title: t('Releases'),
  141. },
  142. {
  143. path: `${pathPrefix}/security-headers/`,
  144. title: t('Security Headers'),
  145. },
  146. {
  147. path: `${pathPrefix}/user-feedback/`,
  148. title: t('User Feedback'),
  149. description: t('Configure user feedback reporting feature'),
  150. },
  151. ],
  152. },
  153. {
  154. name: t('Legacy Integrations'),
  155. items: [
  156. {
  157. path: `${pathPrefix}/plugins/`,
  158. title: t('Legacy Integrations'),
  159. description: t('View, enable, and disable all integrations for a project'),
  160. id: 'legacy_integrations',
  161. recordAnalytics: true,
  162. },
  163. ...plugins.map(plugin => ({
  164. path: `${pathPrefix}/plugins/${plugin.id}/`,
  165. title: plugin.name,
  166. show: opts => opts?.access?.has('project:write') && !plugin.isDeprecated,
  167. id: 'plugin_details',
  168. recordAnalytics: true,
  169. })),
  170. ],
  171. },
  172. ];
  173. }