Skip to content

Commit c91e400

Browse files
DominikB2014billyvg
authored andcommitted
feat(insights): save project selection by domain (#93145)
use `storageNamespace` to allow each domain (frontend, backend, mobile) to store their own project selection. This feature will only be available to eap users (which is in EA), to allow us to test with a smaller group.
1 parent d561a42 commit c91e400

File tree

12 files changed

+56
-19
lines changed

12 files changed

+56
-19
lines changed

static/app/actionCreators/pageFilters.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,11 @@ export function initializeUrlState({
365365

366366
PageFiltersStore.onInitializeUrlState(pageFilters, pinnedFilters, shouldPersist);
367367
if (shouldUpdateLocalStorage) {
368-
setPageFiltersStorage(organization.slug, new Set(['projects', 'environments']));
368+
setPageFiltersStorage(
369+
organization.slug,
370+
new Set(['projects', 'environments']),
371+
storageNamespace
372+
);
369373
}
370374

371375
if (shouldCheckDesyncedURLState) {

static/app/components/organizations/pageFilters/container.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,10 @@ function PageFiltersContainer({
173173
// Do not pass router to these actionCreators, as we do not want to update
174174
// routes since these state changes are happening due to a change of routes
175175
if (!noProjectChange) {
176-
updateProjects(newState.project || [], null, {environments: newEnvironments});
176+
updateProjects(newState.project || [], null, {
177+
environments: newEnvironments,
178+
storageNamespace,
179+
});
177180
}
178181

179182
// When the project stays the same, it's still possible that the

static/app/components/organizations/projectPageFilter/index.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import {makeProjectsPathname} from 'sentry/views/projects/pathname';
3535
import {ProjectPageFilterMenuFooter} from './menuFooter';
3636
import {ProjectPageFilterTrigger} from './trigger';
3737

38-
interface ProjectPageFilterProps
38+
export interface ProjectPageFilterProps
3939
extends Partial<
4040
Omit<
4141
HybridFilterProps<number>,
@@ -73,6 +73,11 @@ interface ProjectPageFilterProps
7373
* Reset these URL params when we fire actions (custom routing only)
7474
*/
7575
resetParamsOnChange?: string[];
76+
/**
77+
* Optional prefix for the storage key, for areas of the app that need separate pagefilters (i.e Insights)
78+
* TODO: ideally this can be determined by what's set in the PageFiltersContainer
79+
*/
80+
storageNamespace?: string;
7681
}
7782

7883
/**
@@ -94,6 +99,7 @@ export function ProjectPageFilter({
9499
projectOverride,
95100
resetParamsOnChange,
96101
footerMessage,
102+
storageNamespace,
97103
...selectProps
98104
}: ProjectPageFilterProps) {
99105
const user = useUser();
@@ -214,6 +220,7 @@ export function ProjectPageFilter({
214220
save: true,
215221
resetParams: resetParamsOnChange,
216222
environments: [], // Clear environments when switching projects
223+
storageNamespace,
217224
});
218225
},
219226
[
@@ -225,6 +232,7 @@ export function ProjectPageFilter({
225232
routes,
226233
onChange,
227234
mapNormalValueToURLValue,
235+
storageNamespace,
228236
]
229237
);
230238

static/app/views/insights/common/components/modulePageFilterBar.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {type ComponentProps, Fragment, useEffect, useState} from 'react';
1+
import {Fragment, useEffect, useState} from 'react';
22
import styled from '@emotion/styled';
33

44
import {Tooltip} from 'sentry/components/core/tooltip';
@@ -9,12 +9,12 @@ import {
99
} from 'sentry/components/organizations/datePageFilter';
1010
import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter';
1111
import PageFilterBar from 'sentry/components/organizations/pageFilterBar';
12-
import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter';
1312
import {IconBusiness} from 'sentry/icons';
1413
import {t} from 'sentry/locale';
1514
import {SECOND} from 'sentry/utils/formatters';
1615
import useOrganization from 'sentry/utils/useOrganization';
1716
import useProjects from 'sentry/utils/useProjects';
17+
import {InsightsProjectSelector} from 'sentry/views/insights/common/components/projectSelector';
1818
import {useHasFirstSpan} from 'sentry/views/insights/common/queries/useHasFirstSpan';
1919
import {QUERY_DATE_RANGE_LIMIT} from 'sentry/views/insights/settings';
2020
import type {ModuleName} from 'sentry/views/insights/types';
@@ -23,15 +23,13 @@ type Props = {
2323
moduleName: ModuleName;
2424
disableProjectFilter?: boolean; // This is used primarily for module summary pages when a project can't be selected
2525
extraFilters?: React.ReactNode;
26-
onProjectChange?: ComponentProps<typeof ProjectPageFilter>['onChange'];
2726
};
2827

2928
const CHANGE_PROJECT_TEXT = t('Make sure you have the correct project selected.');
3029
const DISABLED_OPTIONS = ['14d', '30d', '90d'];
3130

3231
export function ModulePageFilterBar({
3332
moduleName,
34-
onProjectChange,
3533
extraFilters,
3634
disableProjectFilter,
3735
}: Props) {
@@ -116,7 +114,7 @@ export function ModulePageFilterBar({
116114
of the readout ribbon which results in buttons being very large. */}
117115
<div>
118116
<PageFilterBar condensed>
119-
{!disableProjectFilter && <ProjectPageFilter onChange={onProjectChange} />}
117+
{!disableProjectFilter && <InsightsProjectSelector />}
120118
<EnvironmentPageFilter />
121119
<DatePageFilter {...dateFilterProps} />
122120
</PageFilterBar>

static/app/views/insights/common/components/modulePageProviders.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle';
55
import type {InsightEventKey} from 'sentry/utils/analytics/insightAnalyticEvents';
66
import useOrganization from 'sentry/utils/useOrganization';
77
import {WidgetSyncContextProvider} from 'sentry/views/dashboards/contexts/widgetSyncContext';
8+
import {useInsightsEap} from 'sentry/views/insights/common/utils/useEap';
89
import {useHasDataTrackAnalytics} from 'sentry/views/insights/common/utils/useHasDataTrackAnalytics';
910
import {useModuleTitles} from 'sentry/views/insights/common/utils/useModuleTitle';
11+
import {useDomainViewFilters} from 'sentry/views/insights/pages/useFilters';
1012
import {INSIGHTS_TITLE, QUERY_DATE_RANGE_LIMIT} from 'sentry/views/insights/settings';
1113
import type {ModuleName} from 'sentry/views/insights/types';
1214

@@ -28,6 +30,8 @@ export function ModulePageProviders({
2830
}: Props) {
2931
const organization = useOrganization();
3032
const moduleTitles = useModuleTitles();
33+
const useEap = useInsightsEap();
34+
const {view} = useDomainViewFilters();
3135

3236
const hasDateRangeQueryLimit = organization.features.includes(
3337
'insights-query-date-range-limit'
@@ -41,9 +45,12 @@ export function ModulePageProviders({
4145
.filter(Boolean)
4246
.join(' — ');
4347

48+
const storageNamespace = useEap ? view : undefined;
49+
4450
return (
4551
<PageFiltersContainer
4652
maxPickableDays={hasDateRangeQueryLimit ? QUERY_DATE_RANGE_LIMIT : undefined}
53+
storageNamespace={storageNamespace}
4754
>
4855
<SentryDocumentTitle title={fullPageTitle} orgSlug={organization.slug}>
4956
<Layout.Page>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import type {ProjectPageFilterProps} from 'sentry/components/organizations/projectPageFilter';
2+
import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter';
3+
import {useInsightsEap} from 'sentry/views/insights/common/utils/useEap';
4+
import {useDomainViewFilters} from 'sentry/views/insights/pages/useFilters';
5+
6+
type Props = Omit<ProjectPageFilterProps, 'storageNamespace'>;
7+
8+
export function InsightsProjectSelector(props: Props) {
9+
const useEap = useInsightsEap();
10+
const {view} = useDomainViewFilters();
11+
12+
const storageNamespace = useEap ? view : undefined;
13+
14+
return <ProjectPageFilter {...props} storageNamespace={storageNamespace} />;
15+
}

static/app/views/insights/mobile/screens/views/screensLandingPage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {TabbedCodeSnippet} from 'sentry/components/onboarding/gettingStartedDoc/
88
import {DatePageFilter} from 'sentry/components/organizations/datePageFilter';
99
import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter';
1010
import PageFilterBar from 'sentry/components/organizations/pageFilterBar';
11-
import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter';
1211
import {PageHeadingQuestionTooltip} from 'sentry/components/pageHeadingQuestionTooltip';
1312
import {t} from 'sentry/locale';
1413
import {space} from 'sentry/styles/space';
@@ -19,6 +18,7 @@ import {useLocation} from 'sentry/utils/useLocation';
1918
import {useNavigate} from 'sentry/utils/useNavigate';
2019
import {ModulePageProviders} from 'sentry/views/insights/common/components/modulePageProviders';
2120
import {ModuleBodyUpsellHook} from 'sentry/views/insights/common/components/moduleUpsellHookWrapper';
21+
import {InsightsProjectSelector} from 'sentry/views/insights/common/components/projectSelector';
2222
import {
2323
useMetrics,
2424
useSpanMetrics,
@@ -274,7 +274,7 @@ function ScreensLandingPage() {
274274
<Layout.Main fullWidth>
275275
<Container>
276276
<PageFilterBar condensed>
277-
<ProjectPageFilter onChange={handleProjectChange} />
277+
<InsightsProjectSelector onChange={handleProjectChange} />
278278
<EnvironmentPageFilter />
279279
<DatePageFilter />
280280
</PageFilterBar>

static/app/views/insights/pages/backend/backendOverviewPage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {NoAccess} from 'sentry/components/noAccess';
77
import {DatePageFilter} from 'sentry/components/organizations/datePageFilter';
88
import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter';
99
import PageFilterBar from 'sentry/components/organizations/pageFilterBar';
10-
import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter';
1110
import {space} from 'sentry/styles/space';
1211
import {trackAnalytics} from 'sentry/utils/analytics';
1312
import {PageAlert} from 'sentry/utils/performance/contexts/pageAlert';
@@ -21,6 +20,7 @@ import useOrganization from 'sentry/utils/useOrganization';
2120
import usePageFilters from 'sentry/utils/usePageFilters';
2221
import useProjects from 'sentry/utils/useProjects';
2322
import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLayout';
23+
import {InsightsProjectSelector} from 'sentry/views/insights/common/components/projectSelector';
2424
import {ToolRibbon} from 'sentry/views/insights/common/components/ribbon';
2525
import {STARRED_SEGMENT_TABLE_QUERY_KEY} from 'sentry/views/insights/common/components/tableCells/starredSegmentCell';
2626
import OverviewApiLatencyChartWidget from 'sentry/views/insights/common/components/widgets/overviewApiLatencyChartWidget';
@@ -204,7 +204,7 @@ function EAPBackendOverviewPage() {
204204
<ModuleLayout.Full>
205205
<ToolRibbon>
206206
<PageFilterBar condensed>
207-
<ProjectPageFilter />
207+
<InsightsProjectSelector />
208208
<EnvironmentPageFilter />
209209
<DatePageFilter />
210210
</PageFilterBar>

static/app/views/insights/pages/domainOverviewPageProviders.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ import {MEPSettingProvider} from 'sentry/utils/performance/contexts/metricsEnhan
55
import {useLocation} from 'sentry/utils/useLocation';
66
import useOrganization from 'sentry/utils/useOrganization';
77
import {OVERVIEW_PAGE_TITLE} from 'sentry/views/insights/pages/settings';
8+
import {useDomainViewFilters} from 'sentry/views/insights/pages/useFilters';
89

910
export function DomainOverviewPageProviders({children}: {children: React.ReactNode}) {
1011
const organization = useOrganization();
1112
const location = useLocation();
13+
const {view} = useDomainViewFilters();
1214

1315
return (
1416
<NoProjectMessage organization={organization}>
15-
<PageFiltersContainer>
17+
<PageFiltersContainer storageNamespace={view}>
1618
<SentryDocumentTitle title={OVERVIEW_PAGE_TITLE} orgSlug={organization.slug}>
1719
<MEPSettingProvider location={location}>{children}</MEPSettingProvider>
1820
</SentryDocumentTitle>

static/app/views/insights/pages/frontend/frontendOverviewPage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {NoAccess} from 'sentry/components/noAccess';
99
import {DatePageFilter} from 'sentry/components/organizations/datePageFilter';
1010
import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter';
1111
import PageFilterBar from 'sentry/components/organizations/pageFilterBar';
12-
import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter';
1312
import {t} from 'sentry/locale';
1413
import {trackAnalytics} from 'sentry/utils/analytics';
1514
import {
@@ -28,6 +27,7 @@ import useOrganization from 'sentry/utils/useOrganization';
2827
import usePageFilters from 'sentry/utils/usePageFilters';
2928
import useProjects from 'sentry/utils/useProjects';
3029
import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLayout';
30+
import {InsightsProjectSelector} from 'sentry/views/insights/common/components/projectSelector';
3131
import {ToolRibbon} from 'sentry/views/insights/common/components/ribbon';
3232
import {STARRED_SEGMENT_TABLE_QUERY_KEY} from 'sentry/views/insights/common/components/tableCells/starredSegmentCell';
3333
import {useEAPSpans} from 'sentry/views/insights/common/queries/useDiscover';
@@ -254,7 +254,7 @@ function EAPOverviewPage() {
254254
<ModuleLayout.Full>
255255
<ToolRibbon>
256256
<PageFilterBar condensed>
257-
<ProjectPageFilter />
257+
<InsightsProjectSelector />
258258
<EnvironmentPageFilter />
259259
<DatePageFilter />
260260
</PageFilterBar>

static/app/views/insights/pages/mobile/mobileOverviewPage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import {NoAccess} from 'sentry/components/noAccess';
66
import {DatePageFilter} from 'sentry/components/organizations/datePageFilter';
77
import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter';
88
import PageFilterBar from 'sentry/components/organizations/pageFilterBar';
9-
import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter';
109
import {trackAnalytics} from 'sentry/utils/analytics';
1110
import {
1211
canUseMetricsData,
@@ -24,6 +23,7 @@ import useOrganization from 'sentry/utils/useOrganization';
2423
import usePageFilters from 'sentry/utils/usePageFilters';
2524
import useProjects from 'sentry/utils/useProjects';
2625
import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLayout';
26+
import {InsightsProjectSelector} from 'sentry/views/insights/common/components/projectSelector';
2727
import {ToolRibbon} from 'sentry/views/insights/common/components/ribbon';
2828
import {STARRED_SEGMENT_TABLE_QUERY_KEY} from 'sentry/views/insights/common/components/tableCells/starredSegmentCell';
2929
import {useEAPSpans} from 'sentry/views/insights/common/queries/useDiscover';
@@ -228,7 +228,7 @@ function EAPMobileOverviewPage() {
228228
<ModuleLayout.Full>
229229
<ToolRibbon>
230230
<PageFilterBar condensed>
231-
<ProjectPageFilter />
231+
<InsightsProjectSelector />
232232
<EnvironmentPageFilter />
233233
<DatePageFilter />
234234
</PageFilterBar>

static/app/views/insights/pages/platform/shared/layout.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ import {NoAccess} from 'sentry/components/noAccess';
66
import {DatePageFilter} from 'sentry/components/organizations/datePageFilter';
77
import {EnvironmentPageFilter} from 'sentry/components/organizations/environmentPageFilter';
88
import PageFilterBar from 'sentry/components/organizations/pageFilterBar';
9-
import {ProjectPageFilter} from 'sentry/components/organizations/projectPageFilter';
109
import TransactionNameSearchBar from 'sentry/components/performance/searchBar';
1110
import {MutableSearch} from 'sentry/utils/tokenizeSearch';
1211
import {useLocation} from 'sentry/utils/useLocation';
1312
import useOrganization from 'sentry/utils/useOrganization';
1413
import * as ModuleLayout from 'sentry/views/insights/common/components/moduleLayout';
14+
import {InsightsProjectSelector} from 'sentry/views/insights/common/components/projectSelector';
1515
import {ToolRibbon} from 'sentry/views/insights/common/components/ribbon';
1616
import {useOnboardingProject} from 'sentry/views/insights/common/queries/useOnboardingProject';
1717
import {BackendHeader} from 'sentry/views/insights/pages/backend/backendPageHeader';
@@ -69,7 +69,7 @@ export function PlatformLandingPageLayout({
6969
<ModuleLayout.Full>
7070
<ToolRibbon>
7171
<PageFilterBar condensed>
72-
<ProjectPageFilter resetParamsOnChange={['starred']} />
72+
<InsightsProjectSelector resetParamsOnChange={['starred']} />
7373
<EnvironmentPageFilter />
7474
<DatePageFilter />
7575
</PageFilterBar>

0 commit comments

Comments
 (0)