123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- import FeatureBadge from 'sentry/components/badge/featureBadge';
- import {t} from 'sentry/locale';
- import ConfigStore from 'sentry/stores/configStore';
- import type {Organization} from 'sentry/types/organization';
- import type {Project} from 'sentry/types/project';
- import {hasCustomMetrics} from 'sentry/utils/metrics/features';
- import type {NavigationSection} from 'sentry/views/settings/types';
- type ConfigParams = {
- debugFilesNeedsReview?: boolean;
- organization?: Organization;
- project?: Project;
- };
- const pathPrefix = '/settings/:orgId/projects/:projectId';
- export default function getConfiguration({
- project,
- organization,
- debugFilesNeedsReview,
- }: ConfigParams): NavigationSection[] {
- const plugins = (project?.plugins || []).filter(plugin => plugin.enabled);
- const isSelfHostedErrorsOnly = ConfigStore.get('isSelfHostedErrorsOnly');
- return [
- {
- name: t('Project'),
- items: [
- {
- path: `${pathPrefix}/`,
- index: true,
- title: t('General Settings'),
- description: t('Configure general settings for a project'),
- },
- {
- path: `${pathPrefix}/teams/`,
- title: t('Project Teams'),
- description: t('Manage team access for a project'),
- },
- {
- path: `${pathPrefix}/alerts/`,
- title: t('Alert Settings'),
- description: t('Project alert settings'),
- },
- {
- path: `${pathPrefix}/tags/`,
- title: t('Tags & Context'),
- description: t("View and manage a project's tags and context"),
- },
- {
- path: `${pathPrefix}/environments/`,
- title: t('Environments'),
- description: t('Manage environments in a project'),
- },
- {
- path: `${pathPrefix}/ownership/`,
- title: t('Ownership Rules'),
- description: t('Manage ownership rules for a project'),
- },
- {
- path: `${pathPrefix}/data-forwarding/`,
- title: t('Data Forwarding'),
- },
- {
- path: `${pathPrefix}/user-feedback/`,
- title: t('User Feedback'),
- show: () => !isSelfHostedErrorsOnly,
- },
- ],
- },
- {
- name: t('Processing'),
- items: [
- {
- path: `${pathPrefix}/filters/`,
- title: t('Inbound Filters'),
- description: t(
- "Configure a project's inbound filters (e.g. browsers, messages)"
- ),
- },
- {
- path: `${pathPrefix}/security-and-privacy/`,
- title: t('Security & Privacy'),
- description: t(
- 'Configuration related to dealing with sensitive data and other security settings. (Data Scrubbing, Data Privacy, Data Scrubbing) for a project'
- ),
- },
- {
- path: `${pathPrefix}/issue-grouping/`,
- title: t('Issue Grouping'),
- },
- {
- path: `${pathPrefix}/processing-issues/`,
- title: t('Processing Issues'),
- show: () => {
- // NOTE: both `project` and `options` are non-null here.
- return 'sentry:reprocessing_active' in (project?.options ?? {});
- },
- // eslint-disable-next-line @typescript-eslint/no-shadow
- badge: ({project}) => {
- const issues = project?.processingIssues ?? 0;
- return issues <= 0 ? null : issues > 99 ? '99+' : issues;
- },
- },
- {
- path: `${pathPrefix}/debug-symbols/`,
- title: t('Debug Files'),
- badge: debugFilesNeedsReview ? () => 'warning' : undefined,
- },
- {
- path: `${pathPrefix}/proguard/`,
- title: t('ProGuard'),
- },
- {
- path: `${pathPrefix}/source-maps/`,
- title: t('Source Maps'),
- },
- {
- path: `${pathPrefix}/performance/`,
- title: t('Performance'),
- show: () =>
- !!organization?.features?.includes('performance-view') &&
- !isSelfHostedErrorsOnly,
- },
- {
- path: `${pathPrefix}/metrics/`,
- title: t('Metrics'),
- show: () =>
- !!(organization && hasCustomMetrics(organization)) && !isSelfHostedErrorsOnly,
- },
- {
- path: `${pathPrefix}/replays/`,
- title: t('Replays'),
- show: () =>
- !!organization?.features?.includes('session-replay-ui') &&
- !isSelfHostedErrorsOnly,
- },
- ],
- },
- {
- name: t('SDK Setup'),
- items: [
- {
- path: `${pathPrefix}/keys/`,
- title: t('Client Keys (DSN)'),
- description: t("View and manage the project's client keys (DSN)"),
- },
- {
- path: `${pathPrefix}/loader-script/`,
- title: t('Loader Script'),
- description: t("View and manage the project's Loader Script"),
- },
- {
- path: `${pathPrefix}/remote-config/`,
- badge: () => <FeatureBadge type="experimental" />,
- title: t('Remote Config'),
- description: t("View and manage the project's Remote Configuration"),
- show: organization?.features.includes('remote-config'),
- },
- {
- path: `${pathPrefix}/release-tracking/`,
- title: t('Releases'),
- },
- {
- path: `${pathPrefix}/security-headers/`,
- title: t('Security Headers'),
- },
- ],
- },
- {
- name: t('Legacy Integrations'),
- items: [
- {
- path: `${pathPrefix}/plugins/`,
- title: t('Legacy Integrations'),
- description: t('View, enable, and disable all integrations for a project'),
- id: 'legacy_integrations',
- recordAnalytics: true,
- },
- ...plugins.map(plugin => ({
- path: `${pathPrefix}/plugins/${plugin.id}/`,
- title: plugin.name,
- show: opts => opts?.access?.has('project:write') && !plugin.isDeprecated,
- id: 'plugin_details',
- recordAnalytics: true,
- })),
- ],
- },
- ];
- }
|