Skip to content

Commit 8678648

Browse files
committed
Improve LuceneQueryEditor keyboard a11y, fixes #76
1 parent 7d0af35 commit 8678648

File tree

3 files changed

+35
-8
lines changed

3 files changed

+35
-8
lines changed

src/LogContext/components/LogContextUI.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,13 @@ export function LogContextUI(props: LogContextUIProps ){
6464
<LogContextQueryBuilderSidebar {...props} builder={builder} updateQuery={setParsedQuery} searchableFields={fields}/>
6565
<div className={css`width:100%; display:flex; flex-direction:column; gap:0.5rem; min-width:0;`}>
6666
{ActionBar}
67-
<LuceneQueryEditor value={builder.query} autocompleter={getSuggestions} onChange={builder.setQuery}/>
67+
<LuceneQueryEditor
68+
placeholder="Shift-Enter to run the query, Ctrl-Space to autocomplete"
69+
value={builder.query}
70+
autocompleter={getSuggestions}
71+
onChange={builder.setQuery}
72+
onSubmit={()=>runQuery()}
73+
/>
6874
</div>
6975
</DatasourceContext.Provider>
7076
</div>

src/components/LuceneQueryEditor.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { useObservableCallback, useSubscription } from 'observable-hooks'
44
import { css } from "@emotion/css";
55

66

7-
import CodeMirror, { ReactCodeMirrorRef } from '@uiw/react-codemirror';
7+
import CodeMirror, { ReactCodeMirrorRef, keymap } from '@uiw/react-codemirror';
88
import {linter, Diagnostic, lintGutter} from "@codemirror/lint"
99
import {autocompletion, CompletionContext} from "@codemirror/autocomplete"
1010
import { LuceneQuery } from "utils/lucene";
@@ -15,6 +15,7 @@ export type LuceneQueryEditorProps = {
1515
value: string,
1616
autocompleter: (word: string) => any,
1717
onChange: (query: string) => void
18+
onSubmit: (query: string) => void
1819
}
1920

2021
export function LuceneQueryEditor(props: LuceneQueryEditorProps){
@@ -61,6 +62,14 @@ export function LuceneQueryEditor(props: LuceneQueryEditorProps){
6162
placeholder={props.placeholder}
6263
value={props.value}
6364
onChange={onChange}
64-
extensions={[queryLinter, lintGutter(), autocomplete]}
65+
indentWithTab={false}
66+
extensions={[
67+
queryLinter, lintGutter(),
68+
autocomplete,
69+
keymap.of([{key:'Shift-Enter', run:(target)=>{
70+
props.onSubmit(target.state.doc.toString())
71+
return true;
72+
}}])
73+
]}
6574
/>);
6675
}

src/components/QueryEditor/index.tsx

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export const QueryEditor = ({ query, onChange, onRunQuery, datasource, range, ap
3434
query={query}
3535
range={range || getDefaultTimeRange()}
3636
>
37-
<QueryEditorForm value={query} />
37+
<QueryEditorForm value={query} onRunQuery={onRunQuery} />
3838
</ElasticsearchProvider>
3939
);
4040
};
@@ -54,21 +54,33 @@ export const useSearchableFields = getHook(SearchableFieldsContext)
5454

5555
interface Props {
5656
value: ElasticsearchQuery;
57+
onRunQuery: (query: string) => void
5758
}
5859

59-
export const ElasticSearchQueryField = ({ value, onChange }: { value?: string; onChange: (v: string) => void }) => {
60+
type ElasticSearchQueryFieldProps = {
61+
value?: string;
62+
onChange: (v: string) => void
63+
onSubmit: (v: string) => void
64+
}
65+
export const ElasticSearchQueryField = ({ value, onChange, onSubmit }: ElasticSearchQueryFieldProps) => {
6066
const styles = useStyles2(getStyles);
6167
const datasource = useDatasource()
6268
const { getSuggestions } = useDatasourceFields(datasource);
6369

6470
return (
6571
<div className={styles.queryItem}>
66-
<LuceneQueryEditor placeholder="Enter a lucene query" value={value || ''} autocompleter={getSuggestions} onChange={onChange}/>
72+
<LuceneQueryEditor
73+
placeholder="Enter a lucene query - Type Shift-Enter to run query, Ctrl-Space to autocomplete"
74+
value={value || ''}
75+
autocompleter={getSuggestions}
76+
onChange={onChange}
77+
onSubmit={onSubmit}
78+
/>
6779
</div>
6880
);
6981
};
7082

71-
const QueryEditorForm = ({ value }: Props) => {
83+
const QueryEditorForm = ({ value, onRunQuery }: Props) => {
7284
const dispatch = useDispatch();
7385
const nextId = useNextId();
7486
const styles = useStyles2(getStyles);
@@ -87,7 +99,7 @@ const QueryEditorForm = ({ value }: Props) => {
8799
</div>
88100
<div className={styles.root}>
89101
<InlineLabel width={17}>Lucene Query</InlineLabel>
90-
<ElasticSearchQueryField onChange={(query) => dispatch(changeQuery(query))} value={value?.query} />
102+
<ElasticSearchQueryField onChange={(query) => dispatch(changeQuery(query))} value={value?.query} onSubmit={onRunQuery} />
91103
</div>
92104

93105
<MetricAggregationsEditor nextId={nextId} />

0 commit comments

Comments
 (0)