From 21901b8adae37967d2adb8491e4225736cf922aa Mon Sep 17 00:00:00 2001 From: Evan Purkhiser Date: Tue, 16 Apr 2024 18:32:09 -0400 Subject: [PATCH] ref(ui): Allow ordering of groups in SentryProjectSelectorField --- .../sentryProjectSelectorField.spec.tsx | 9 ++++---- .../fields/sentryProjectSelectorField.tsx | 22 +++++++++---------- .../views/monitors/components/monitorForm.tsx | 8 +++---- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/static/app/components/forms/fields/sentryProjectSelectorField.spec.tsx b/static/app/components/forms/fields/sentryProjectSelectorField.spec.tsx index 5ddca1501fb1e4..525e82dfbe6f74 100644 --- a/static/app/components/forms/fields/sentryProjectSelectorField.spec.tsx +++ b/static/app/components/forms/fields/sentryProjectSelectorField.spec.tsx @@ -43,9 +43,10 @@ describe('SentryProjectSelectorField', () => { render( (project.slug === 'other-project' ? 'other' : 'main')} - groupLabels={{ - main: 'Main projects', - }} + groups={[ + {key: 'main', label: 'Main projects'}, + {key: 'other', label: 'Other'}, + ]} onChange={mock} name="project" projects={projects} @@ -55,6 +56,6 @@ describe('SentryProjectSelectorField', () => { await selectEvent.openMenu(screen.getByText(/choose sentry project/i)); expect(screen.getByText('Main projects')).toBeInTheDocument(); - expect(screen.getByText('other')).toBeInTheDocument(); + expect(screen.getByText('Other')).toBeInTheDocument(); }); }); diff --git a/static/app/components/forms/fields/sentryProjectSelectorField.tsx b/static/app/components/forms/fields/sentryProjectSelectorField.tsx index 527db2f488fcbe..36d4fc73654036 100644 --- a/static/app/components/forms/fields/sentryProjectSelectorField.tsx +++ b/static/app/components/forms/fields/sentryProjectSelectorField.tsx @@ -1,5 +1,3 @@ -import groupBy from 'lodash/groupBy'; - import IdBadge from 'sentry/components/idBadge'; import {t} from 'sentry/locale'; import type {Project} from 'sentry/types'; @@ -16,16 +14,16 @@ type GroupProjects = (project: Project) => string; // projects can be passed as a direct prop as well export interface RenderFieldProps extends InputFieldProps { avatarSize?: number; - /** - * When using groupProjects you can specify the labels of the groups as a - * mapping of the key returned for the groupProjects to the label - */ - groupLabels?: Record; /** * Controls grouping of projects within the field. Useful to prioritize some * projects above others */ groupProjects?: GroupProjects; + /** + * When using groupProjects you must specify the labels of the groups as a + * list of key and label. The ordering determines the order of the groups. + */ + groups?: Array<{key: string; label: React.ReactNode}>; projects?: Project[]; /** * Use the slug as the select field value. Without setting this the numeric id @@ -37,7 +35,7 @@ export interface RenderFieldProps extends InputFieldProps { function SentryProjectSelectorField({ projects, groupProjects, - groupLabels, + groups, avatarSize = 20, placeholder = t('Choose Sentry project'), valueIsSlug, @@ -61,9 +59,11 @@ function SentryProjectSelectorField({ const projectOptions = projects && groupProjects ? // Create project groups when groupProjects is in use - Object.entries(groupBy(projects, groupProjects)).map(([key, projectsGroup]) => ({ - label: groupLabels?.[key] ?? key, - options: projectsGroup.map(projectToOption), + groups?.map(({key, label}) => ({ + label, + options: projects + .filter(project => groupProjects(project) === key) + .map(projectToOption), })) : // Otherwise just map projects to the options projects?.map(projectToOption); diff --git a/static/app/views/monitors/components/monitorForm.tsx b/static/app/views/monitors/components/monitorForm.tsx index 24aa9245e759ed..e907ca0726274a 100644 --- a/static/app/views/monitors/components/monitorForm.tsx +++ b/static/app/views/monitors/components/monitorForm.tsx @@ -291,10 +291,10 @@ function MonitorForm({ groupProjects={project => platformsWithGuides.includes(project.platform) ? 'suggested' : 'other' } - groupLabels={{ - suggested: t('Suggested Projects'), - other: t('Other Projects'), - }} + groups={[ + {key: 'suggested', label: t('Suggested Projects')}, + {key: 'other', label: t('Other Projects')}, + ]} projects={filteredProjects} placeholder={t('Choose Project')} disabled={!!monitor}