-
Notifications
You must be signed in to change notification settings - Fork 8.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Logs UI] Refactor query bar state to hooks (#52656)
* [Logs UI] Refactor query bar state to hooks * Update typedef * Typecheck fix * Typecheck fix * Simplify log filter state * Remove WithLogFilter HOC and simplify hook further * Rename js to ts * Fix redirect imports * Fix link-to test accuracy * Fix link-to test * Simplify destructuring signature * Stylistic fixes * Move URL state to hook * Fix log filter URL state infinite loop * Revert "Fix log filter URL state infinite loop" This reverts commit 43302b3. * Revert "Move URL state to hook" This reverts commit c61f5b1. Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
- Loading branch information
1 parent
ace50d8
commit a03f395
Showing
22 changed files
with
223 additions
and
328 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
101 changes: 101 additions & 0 deletions
101
x-pack/legacy/plugins/infra/public/containers/logs/log_filter/log_filter_state.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
/* | ||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one | ||
* or more contributor license agreements. Licensed under the Elastic License; | ||
* you may not use this file except in compliance with the Elastic License. | ||
*/ | ||
|
||
import { useState, useMemo } from 'react'; | ||
import createContainer from 'constate'; | ||
import { IIndexPattern } from 'src/plugins/data/public'; | ||
import { esKuery } from '../../../../../../../../src/plugins/data/public'; | ||
import { convertKueryToElasticSearchQuery } from '../../../utils/kuery'; | ||
|
||
export interface KueryFilterQuery { | ||
kind: 'kuery'; | ||
expression: string; | ||
} | ||
|
||
export interface SerializedFilterQuery { | ||
query: KueryFilterQuery; | ||
serializedQuery: string; | ||
} | ||
|
||
interface LogFilterInternalStateParams { | ||
filterQuery: SerializedFilterQuery | null; | ||
filterQueryDraft: KueryFilterQuery | null; | ||
} | ||
|
||
export const logFilterInitialState: LogFilterInternalStateParams = { | ||
filterQuery: null, | ||
filterQueryDraft: null, | ||
}; | ||
|
||
export type LogFilterStateParams = Omit<LogFilterInternalStateParams, 'filterQuery'> & { | ||
filterQuery: SerializedFilterQuery['serializedQuery'] | null; | ||
filterQueryAsKuery: SerializedFilterQuery['query'] | null; | ||
isFilterQueryDraftValid: boolean; | ||
}; | ||
export interface LogFilterCallbacks { | ||
setLogFilterQueryDraft: (expression: string) => void; | ||
applyLogFilterQuery: (expression: string) => void; | ||
} | ||
|
||
export const useLogFilterState: (props: { | ||
indexPattern: IIndexPattern; | ||
}) => LogFilterStateParams & LogFilterCallbacks = ({ indexPattern }) => { | ||
const [state, setState] = useState(logFilterInitialState); | ||
const { filterQuery, filterQueryDraft } = state; | ||
|
||
const setLogFilterQueryDraft = useMemo(() => { | ||
const setDraft = (payload: KueryFilterQuery) => | ||
setState(prevState => ({ ...prevState, filterQueryDraft: payload })); | ||
return (expression: string) => | ||
setDraft({ | ||
kind: 'kuery', | ||
expression, | ||
}); | ||
}, []); | ||
const applyLogFilterQuery = useMemo(() => { | ||
const applyQuery = (payload: SerializedFilterQuery) => | ||
setState(prevState => ({ | ||
...prevState, | ||
filterQueryDraft: payload.query, | ||
filterQuery: payload, | ||
})); | ||
return (expression: string) => | ||
applyQuery({ | ||
query: { | ||
kind: 'kuery', | ||
expression, | ||
}, | ||
serializedQuery: convertKueryToElasticSearchQuery(expression, indexPattern), | ||
}); | ||
}, [indexPattern]); | ||
|
||
const isFilterQueryDraftValid = useMemo(() => { | ||
if (filterQueryDraft?.kind === 'kuery') { | ||
try { | ||
esKuery.fromKueryExpression(filterQueryDraft.expression); | ||
} catch (err) { | ||
return false; | ||
} | ||
} | ||
|
||
return true; | ||
}, [filterQueryDraft]); | ||
|
||
const serializedFilterQuery = useMemo(() => (filterQuery ? filterQuery.serializedQuery : null), [ | ||
filterQuery, | ||
]); | ||
|
||
return { | ||
...state, | ||
filterQueryAsKuery: state.filterQuery ? state.filterQuery.query : null, | ||
filterQuery: serializedFilterQuery, | ||
isFilterQueryDraftValid, | ||
setLogFilterQueryDraft, | ||
applyLogFilterQuery, | ||
}; | ||
}; | ||
|
||
export const LogFilterState = createContainer(useLogFilterState); |
46 changes: 46 additions & 0 deletions
46
x-pack/legacy/plugins/infra/public/containers/logs/log_filter/with_log_filter_url_state.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
/* | ||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one | ||
* or more contributor license agreements. Licensed under the Elastic License; | ||
* you may not use this file except in compliance with the Elastic License. | ||
*/ | ||
|
||
import React, { useContext } from 'react'; | ||
import { LogFilterState, LogFilterStateParams } from './log_filter_state'; | ||
import { replaceStateKeyInQueryString, UrlStateContainer } from '../../../utils/url_state'; | ||
|
||
type LogFilterUrlState = LogFilterStateParams['filterQueryAsKuery']; | ||
|
||
export const WithLogFilterUrlState: React.FC = () => { | ||
const { filterQueryAsKuery, applyLogFilterQuery } = useContext(LogFilterState.Context); | ||
return ( | ||
<UrlStateContainer | ||
urlState={filterQueryAsKuery} | ||
urlStateKey="logFilter" | ||
mapToUrlState={mapToFilterQuery} | ||
onChange={urlState => { | ||
if (urlState) { | ||
applyLogFilterQuery(urlState.expression); | ||
} | ||
}} | ||
onInitialize={urlState => { | ||
if (urlState) { | ||
applyLogFilterQuery(urlState.expression); | ||
} | ||
}} | ||
/> | ||
); | ||
}; | ||
|
||
const mapToFilterQuery = (value: any): LogFilterUrlState | undefined => | ||
value?.kind === 'kuery' && typeof value.expression === 'string' | ||
? { | ||
kind: value.kind, | ||
expression: value.expression, | ||
} | ||
: undefined; | ||
|
||
export const replaceLogFilterInQueryString = (expression: string) => | ||
replaceStateKeyInQueryString<LogFilterUrlState>('logFilter', { | ||
kind: 'kuery', | ||
expression, | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
100 changes: 0 additions & 100 deletions
100
x-pack/legacy/plugins/infra/public/containers/logs/with_log_filter.tsx
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.