Skip to content

Commit 3c3a9c7

Browse files
authored
feat(explore): Better autocompletion of numeric attributes in has (#92209)
This replaces the user input with the matching numeric attribute in the value of a has filter.
1 parent d9d0f15 commit 3c3a9c7

File tree

2 files changed

+87
-4
lines changed

2 files changed

+87
-4
lines changed

static/app/components/searchQueryBuilder/index.spec.tsx

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3481,8 +3481,7 @@ describe('SearchQueryBuilder', function () {
34813481
);
34823482

34833483
await userEvent.click(getLastInput());
3484-
await userEvent.keyboard('foo:');
3485-
await userEvent.keyboard('{Escape}');
3484+
await userEvent.keyboard('foo:{Escape}');
34863485

34873486
expect(
34883487
screen.getByRole('button', {name: 'Edit key for filter: tags[foo,string]'})
@@ -3498,8 +3497,7 @@ describe('SearchQueryBuilder', function () {
34983497
);
34993498

35003499
await userEvent.click(getLastInput());
3501-
await userEvent.keyboard('bar:');
3502-
await userEvent.keyboard('{Escape}');
3500+
await userEvent.keyboard('bar:{Escape}');
35033501

35043502
expect(
35053503
screen.getByRole('button', {name: 'Edit key for filter: tags[bar,number]'})
@@ -3543,5 +3541,75 @@ describe('SearchQueryBuilder', function () {
35433541
screen.getByRole('button', {name: 'Edit key for filter: tags[bar,number]'})
35443542
).toHaveTextContent('bar');
35453543
});
3544+
3545+
it('replaces string key in has with suggestion on enter', async function () {
3546+
render(
3547+
<SearchQueryBuilder
3548+
{...defaultProps}
3549+
getSuggestedFilterKey={getSuggestedFilterKey}
3550+
/>
3551+
);
3552+
3553+
await userEvent.click(getLastInput());
3554+
await userEvent.keyboard('has:foo{Enter}{Escape}');
3555+
3556+
expect(
3557+
screen.getByRole('button', {name: 'Edit value for filter: has'})
3558+
).toHaveTextContent('foo');
3559+
expect(screen.getByLabelText('has:tags[foo,string]')).toBeInTheDocument();
3560+
});
3561+
3562+
it('replaces number key in has with suggestion on enter', async function () {
3563+
render(
3564+
<SearchQueryBuilder
3565+
{...defaultProps}
3566+
getSuggestedFilterKey={getSuggestedFilterKey}
3567+
/>
3568+
);
3569+
3570+
await userEvent.click(getLastInput());
3571+
await userEvent.keyboard('has:bar{Enter}{Escape}');
3572+
3573+
expect(
3574+
screen.getByRole('button', {name: 'Edit value for filter: has'})
3575+
).toHaveTextContent('bar');
3576+
expect(screen.getByLabelText('has:tags[bar,number]')).toBeInTheDocument();
3577+
});
3578+
3579+
it('replaces string key in has with suggestion on blur', async function () {
3580+
render(
3581+
<SearchQueryBuilder
3582+
{...defaultProps}
3583+
getSuggestedFilterKey={getSuggestedFilterKey}
3584+
/>
3585+
);
3586+
3587+
await userEvent.click(getLastInput());
3588+
await userEvent.keyboard('has:foo{Enter}');
3589+
await userEvent.click(document.body);
3590+
3591+
expect(
3592+
screen.getByRole('button', {name: 'Edit value for filter: has'})
3593+
).toHaveTextContent('foo');
3594+
expect(screen.getByLabelText('has:tags[foo,string]')).toBeInTheDocument();
3595+
});
3596+
3597+
it('replaces number key in has with suggestion on blur', async function () {
3598+
render(
3599+
<SearchQueryBuilder
3600+
{...defaultProps}
3601+
getSuggestedFilterKey={getSuggestedFilterKey}
3602+
/>
3603+
);
3604+
3605+
await userEvent.click(getLastInput());
3606+
await userEvent.keyboard('has:bar{Enter}');
3607+
await userEvent.click(document.body);
3608+
3609+
expect(
3610+
screen.getByRole('button', {name: 'Edit value for filter: has'})
3611+
).toHaveTextContent('bar');
3612+
expect(screen.getByLabelText('has:tags[bar,number]')).toBeInTheDocument();
3613+
});
35463614
});
35473615
});

static/app/components/searchQueryBuilder/tokens/filter/valueCombobox.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,7 @@ export function SearchQueryBuilderValueCombobox({
532532
const organization = useOrganization();
533533
const {
534534
getFieldDefinition,
535+
getSuggestedFilterKey,
535536
filterKeys,
536537
dispatch,
537538
searchSource,
@@ -617,6 +618,19 @@ export function SearchQueryBuilderValueCombobox({
617618

618619
const updateFilterValue = useCallback(
619620
(value: string) => {
621+
if (token.filter === FilterType.HAS) {
622+
const suggested = getSuggestedFilterKey(value);
623+
if (suggested) {
624+
dispatch({
625+
type: 'UPDATE_TOKEN_VALUE',
626+
token,
627+
value: suggested,
628+
});
629+
onCommit();
630+
return true;
631+
}
632+
}
633+
620634
const cleanedValue = cleanFilterValue({
621635
valueType: getFilterValueType(token, fieldDefinition),
622636
value,
@@ -682,6 +696,7 @@ export function SearchQueryBuilderValueCombobox({
682696
[
683697
token,
684698
fieldDefinition,
699+
getSuggestedFilterKey,
685700
canSelectMultipleValues,
686701
analyticsData,
687702
selectedValuesUnescaped,

0 commit comments

Comments
 (0)