Cleanup prefill and edit flow. (#66105)

This commit is contained in:
Phillip Burch 2020-05-11 19:08:02 -05:00 committed by GitHub
parent 0802ccc262
commit 6d95b68c72
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 44 deletions

View file

@ -74,6 +74,7 @@ export const Expressions: React.FC<Props> = props => {
fetch: alertsContext.http.fetch, fetch: alertsContext.http.fetch,
toastWarning: alertsContext.toastNotifications.addWarning, toastWarning: alertsContext.toastNotifications.addWarning,
}); });
const [timeSize, setTimeSize] = useState<number | undefined>(1); const [timeSize, setTimeSize] = useState<number | undefined>(1);
const [timeUnit, setTimeUnit] = useState<TimeUnit>('m'); const [timeUnit, setTimeUnit] = useState<TimeUnit>('m');
const derivedIndexPattern = useMemo(() => createDerivedIndexPattern('metrics'), [ const derivedIndexPattern = useMemo(() => createDerivedIndexPattern('metrics'), [
@ -173,52 +174,57 @@ export const Expressions: React.FC<Props> = props => {
[alertParams.criteria, setAlertParams] [alertParams.criteria, setAlertParams]
); );
useEffect(() => { const preFillAlertCriteria = useCallback(() => {
const md = alertsContext.metadata; const md = alertsContext.metadata;
if (md) { if (md && md.currentOptions?.metrics) {
if (md.currentOptions?.metrics) { setAlertParams(
setAlertParams( 'criteria',
'criteria', md.currentOptions.metrics.map(metric => ({
md.currentOptions.metrics.map(metric => ({ metric: metric.field,
metric: metric.field, comparator: Comparator.GT,
comparator: Comparator.GT, threshold: [],
threshold: [], timeSize,
timeSize, timeUnit,
timeUnit, aggType: metric.aggregation,
aggType: metric.aggregation, }))
})) );
);
} else {
setAlertParams('criteria', [defaultExpression]);
}
if (md.currentOptions) {
if (md.currentOptions.filterQuery) {
setAlertParams('filterQueryText', md.currentOptions.filterQuery);
setAlertParams(
'filterQuery',
convertKueryToElasticSearchQuery(md.currentOptions.filterQuery, derivedIndexPattern) ||
''
);
} else if (md.currentOptions.groupBy && md.series) {
const filter = `${md.currentOptions.groupBy}: "${md.series.id}"`;
setAlertParams('filterQueryText', filter);
setAlertParams(
'filterQuery',
convertKueryToElasticSearchQuery(filter, derivedIndexPattern) || ''
);
}
setAlertParams('groupBy', md.currentOptions.groupBy);
}
setAlertParams('sourceId', source?.id);
} else { } else {
if (!alertParams.criteria) { setAlertParams('criteria', [defaultExpression]);
setAlertParams('criteria', [defaultExpression]); }
} }, [alertsContext.metadata, setAlertParams, timeSize, timeUnit]);
if (!alertParams.sourceId) {
setAlertParams('sourceId', source?.id || 'default'); const preFillAlertFilter = useCallback(() => {
} const md = alertsContext.metadata;
if (md && md.currentOptions?.filterQuery) {
setAlertParams('filterQueryText', md.currentOptions.filterQuery);
setAlertParams(
'filterQuery',
convertKueryToElasticSearchQuery(md.currentOptions.filterQuery, derivedIndexPattern) || ''
);
} else if (md && md.currentOptions?.groupBy && md.series) {
const filter = `${md.currentOptions?.groupBy}: "${md.series.id}"`;
setAlertParams('filterQueryText', filter);
setAlertParams(
'filterQuery',
convertKueryToElasticSearchQuery(filter, derivedIndexPattern) || ''
);
}
}, [alertsContext.metadata, derivedIndexPattern, setAlertParams]);
useEffect(() => {
if (alertParams.criteria && alertParams.criteria.length) {
setTimeSize(alertParams.criteria[0].timeSize);
setTimeUnit(alertParams.criteria[0].timeUnit);
} else {
preFillAlertCriteria();
}
if (!alertParams.filterQuery) {
preFillAlertFilter();
}
if (!alertParams.sourceId) {
setAlertParams('sourceId', source?.id || 'default');
} }
}, [alertsContext.metadata, defaultExpression, source]); // eslint-disable-line react-hooks/exhaustive-deps }, [alertsContext.metadata, defaultExpression, source]); // eslint-disable-line react-hooks/exhaustive-deps

View file

@ -13,6 +13,11 @@ export const oneOfLiterals = (arrayOfLiterals: Readonly<string[]>) =>
}); });
export const validateIsStringElasticsearchJSONFilter = (value: string) => { export const validateIsStringElasticsearchJSONFilter = (value: string) => {
if (value === '') {
// Allow clearing the filter.
return;
}
const errorMessage = 'filterQuery must be a valid Elasticsearch filter expressed in JSON'; const errorMessage = 'filterQuery must be a valid Elasticsearch filter expressed in JSON';
try { try {
const parsedValue = JSON.parse(value); const parsedValue = JSON.parse(value);