Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 15 additions & 10 deletions static/app/components/core/compactSelect/composite.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ import {CompositeSelect} from './composite';
describe('CompactSelect', () => {
it('renders', async () => {
render(
<CompositeSelect menuTitle="Menu title">
<CompositeSelect
menuTitle="Menu title"
trigger={props => <button {...props}>Open menu</button>}
>
<CompositeSelect.Region
label="Region 1"
value="choice_one"
Expand Down Expand Up @@ -66,7 +69,7 @@ describe('CompactSelect', () => {

it('renders disabled trigger button', async () => {
render(
<CompositeSelect disabled>
<CompositeSelect disabled trigger={props => <button {...props}>Open menu</button>}>
<CompositeSelect.Region
label="Region 1"
onChange={jest.fn()}
Expand All @@ -85,7 +88,7 @@ describe('CompactSelect', () => {
// focus state. This test ensures that focus moves seamlessly between regions.
it('manages focus between regions', async () => {
render(
<CompositeSelect>
<CompositeSelect trigger={props => <button {...props}>Open menu</button>}>
<CompositeSelect.Region
label="Region 1"
onChange={jest.fn()}
Expand Down Expand Up @@ -142,7 +145,7 @@ describe('CompactSelect', () => {
const region1Mock = jest.fn();
const region2Mock = jest.fn();
render(
<CompositeSelect>
<CompositeSelect trigger={props => <button {...props}>Open menu</button>}>
<CompositeSelect.Region
label="Region 1"
onChange={region1Mock}
Expand Down Expand Up @@ -171,9 +174,8 @@ describe('CompactSelect', () => {
// select Choice One
await userEvent.click(screen.getByRole('option', {name: 'Choice One'}));

// Region 1's callback is called, and trigger label is updated
// Region 1's callback is called
expect(region1Mock).toHaveBeenCalledWith({value: 'choice_one', label: 'Choice One'});
expect(screen.getByRole('button', {name: 'Choice One'})).toBeInTheDocument();
Comment on lines -174 to -176
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

note: we no longer automatically update trigger labels for CompositeSelect, as we always have to pass in a custom trigger.


// open the menu again
await userEvent.click(screen.getByRole('button'));
Expand Down Expand Up @@ -209,12 +211,15 @@ describe('CompactSelect', () => {
expect(region2Mock).toHaveBeenCalledWith([
{value: 'choice_three', label: 'Choice Three'},
]);
expect(screen.getByRole('button', {name: 'Choice One +1'})).toBeInTheDocument();
});

it('can search', async () => {
render(
<CompositeSelect searchable searchPlaceholder="Search placeholder…">
<CompositeSelect
searchable
searchPlaceholder="Search placeholder…"
trigger={props => <button {...props}>Open menu</button>}
>
<CompositeSelect.Region
label="Region 1"
onChange={jest.fn()}
Expand Down Expand Up @@ -256,7 +261,7 @@ describe('CompactSelect', () => {

it('works with grid lists', async () => {
render(
<CompositeSelect grid>
<CompositeSelect grid trigger={props => <button {...props}>Open menu</button>}>
<CompositeSelect.Region
label="Region 1"
value="choice_one"
Expand Down Expand Up @@ -322,7 +327,7 @@ describe('CompactSelect', () => {
it('can use numbers as values', async () => {
const onChange = jest.fn();
render(
<CompositeSelect>
<CompositeSelect trigger={props => <button {...props}>Open menu</button>}>
<CompositeSelect.Region
label="Region 1"
value={1}
Expand Down
24 changes: 12 additions & 12 deletions static/app/components/core/compactSelect/composite.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import {Fragment, useState} from 'react';

import {Button} from '@sentry/scraps/button';

import {Flex} from 'sentry/components/core/layout';
import {IconSentry, IconStar} from 'sentry/icons';
import * as Storybook from 'sentry/stories';
Expand Down Expand Up @@ -78,12 +80,11 @@ export default Storybook.story('CompositeSelect', story => {
<code>options</code>.
</p>
<CompositeSelect
triggerProps={{
children: 'Select an Option',
showChevron: false,
icon: <IconSentry />,
size: 'sm',
}}
trigger={props => (
<Button icon={<IconSentry />} size="sm" {...props}>
Select an Option
</Button>
)}
>
<CompositeSelect.Region
label="Month"
Expand Down Expand Up @@ -125,12 +126,11 @@ export default Storybook.story('CompositeSelect', story => {

<Flex gap="md">
<CompositeSelect
triggerProps={{
size: 'sm',
icon: <IconSentry />,
children: 'Composite Select Single Select',
showChevron: false,
}}
trigger={props => (
<Button icon={<IconSentry />} size="sm" {...props}>
Composite Select Single Select
</Button>
)}
>
<CompositeSelect.Region
label="Mains"
Expand Down
4 changes: 3 additions & 1 deletion static/app/components/core/compactSelect/composite.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,15 @@ type CompositeSelectChild =
| null
| undefined;

export interface CompositeSelectProps extends ControlProps {
export interface CompositeSelectProps
extends Omit<ControlProps, 'triggerProps' | 'trigger'> {
/**
* The "regions" inside this composite selector. Each region functions as a separated,
* self-contained selectable list (each renders as a `ul` with its own list state)
* whose values don't interfere with one another.
*/
children: CompositeSelectChild | CompositeSelectChild[];
trigger: NonNullable<ControlProps['trigger']>;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
type CompositeSelectProps,
} from 'sentry/components/core/compactSelect/composite';
import type {SelectOption} from 'sentry/components/core/compactSelect/types';
import DropdownButton from 'sentry/components/dropdownButton';
import {IconSort} from 'sentry/icons';
import {t} from 'sentry/locale';
import {useLocation} from 'sentry/utils/useLocation';
Expand Down Expand Up @@ -77,12 +78,16 @@ export function SortSelector({onChangeOrder, onChangeSort, order, sort, size}: P
return (
<CompositeSelect
size={size}
triggerProps={{
prefix: t('Sort By'),
'aria-label': t('Sort Cron Monitors'),
icon: <IconSort />,
children: `${label} \u2014 ${orderLabel}`,
}}
trigger={props => (
<DropdownButton
aria-label={t('Sort Cron Monitors')}
icon={<IconSort />}
prefix={t('Sort By')}
{...props}
>
{`${label} \u2014 ${orderLabel}`}
</DropdownButton>
)}
>
<CompositeSelect.Region
aria-label={t('Sort Options')}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type {SelectOption} from 'sentry/components/core/compactSelect';
import {CompositeSelect} from 'sentry/components/core/compactSelect/composite';
import DropdownButton from 'sentry/components/dropdownButton';
import {IconSliders} from 'sentry/icons';
import {t} from 'sentry/locale';
import type {OrgRole} from 'sentry/types/organization';
Expand Down Expand Up @@ -54,7 +55,11 @@ function MembersFilter({roles, query, onChange}: Props) {

return (
<CompositeSelect
triggerProps={{icon: <IconSliders />, size: 'md', children: t('Filter')}}
trigger={props => (
<DropdownButton {...props} size="md" icon={<IconSliders />}>
{t('Filter')}
</DropdownButton>
)}
maxMenuHeight="22rem"
size="sm"
>
Expand Down
Loading