Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add error if filter index pattern is missing #66979

Merged
merged 36 commits into from
Jun 3, 2020
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
666aa4b
add error if filter index pattern is gone
May 19, 2020
21f662e
docs change - why?
May 19, 2020
3e4d0f1
Merge branch 'master' of github.com:elastic/kibana into bug/missing-i…
May 20, 2020
fceecd1
Fix i18n
May 20, 2020
75764a9
Added a functional test for broken filters (field + index pattern)
May 20, 2020
6f9ba3b
Clarify readme
lizozom May 20, 2020
a33a037
Moved readme
May 20, 2020
1018766
New warning status
May 21, 2020
45881b7
Merge branch 'bug/missing-index-pattern-filter' of github.com:lizozom…
May 21, 2020
ed2f9e9
Remove getAll
May 21, 2020
129fc90
Merge commit 'dcfa4850098972b6b00fe869048e61602aea4683' into bug/miss…
May 27, 2020
7bf4315
git pull upstream master
May 27, 2020
ceb4fca
Merge branch 'master' of github.com:elastic/kibana into bug/missing-i…
May 27, 2020
448539b
Fix translation files
May 27, 2020
65e0526
Fix merge
May 27, 2020
ae6735b
added filterbar texts
May 27, 2020
4a7322e
disabled correction
May 27, 2020
886477f
Disable check in maps test until #64861 is resolved
May 27, 2020
4af37a8
Fix tests, warning state is not disabled.
May 27, 2020
ddaa338
Merge remote-tracking branch 'upstream/master' into bug/missing-index…
May 27, 2020
e007ac2
Adjust warning filter - ignore filters from "foreign" index pattern, …
May 28, 2020
fc58070
Merge branch 'master' of github.com:elastic/kibana into bug/missing-i…
May 28, 2020
2d85783
Add an additional unrelaeted filter test
May 28, 2020
cccae76
Update src/plugins/data/public/ui/filter_bar/_global_filter_item.scss
lizozom May 28, 2020
7cd51cb
Update src/plugins/data/public/ui/filter_bar/_global_filter_item.scss
lizozom May 28, 2020
cf9cada
Fixed test data
May 31, 2020
84cbd04
Merge branch 'master' of github.com:elastic/kibana into bug/missing-i…
May 31, 2020
61e2eda
Merge branch 'bug/missing-index-pattern-filter' of github.com:lizozom…
May 31, 2020
2756099
Revert mapping
May 31, 2020
67f418a
Update data with missing test
May 31, 2020
0bc2fbd
Update test to match data
May 31, 2020
10a3441
Merge branch 'master' into bug/missing-index-pattern-filter
elasticmachine Jun 1, 2020
49605a0
Merge branch 'master' of github.com:elastic/kibana into bug/missing-i…
Jun 2, 2020
da75691
Merge branch 'bug/missing-index-pattern-filter' of github.com:lizozom…
Jun 2, 2020
fbd22ce
Code review
Jun 2, 2020
f25a7fb
Merge branch 'master' into bug/missing-index-pattern-filter
elasticmachine Jun 2, 2020
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
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
<b>Signature:</b>

```typescript
baseFormattersPublic: (import("../../common").FieldFormatInstanceType | typeof DateFormat)[]
baseFormattersPublic: (typeof DateFormat | import("../../common").FieldFormatInstanceType)[]
lizozom marked this conversation as resolved.
Show resolved Hide resolved
```
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<b>Signature:</b>

```typescript
SearchBar: React.ComponentClass<Pick<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "intl" | "indexPatterns" | "refreshInterval" | "customSubmitButton" | "screenTitle" | "dataTestSubj" | "showQueryBar" | "showQueryInput" | "showFilterBar" | "showDatePicker" | "showAutoRefreshOnly" | "isRefreshPaused" | "dateRangeFrom" | "dateRangeTo" | "showSaveQuery" | "savedQuery" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated" | "onClearSavedQuery" | "onRefresh" | "timeHistory" | "onFiltersUpdated" | "onRefreshChange">, "query" | "isLoading" | "filters" | "indexPatterns" | "refreshInterval" | "customSubmitButton" | "screenTitle" | "dataTestSubj" | "showQueryBar" | "showQueryInput" | "showFilterBar" | "showDatePicker" | "showAutoRefreshOnly" | "isRefreshPaused" | "dateRangeFrom" | "dateRangeTo" | "showSaveQuery" | "savedQuery" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated" | "onClearSavedQuery" | "onRefresh" | "timeHistory" | "onFiltersUpdated" | "onRefreshChange">, any> & {
WrappedComponent: React.ComponentType<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "intl" | "indexPatterns" | "refreshInterval" | "customSubmitButton" | "screenTitle" | "dataTestSubj" | "showQueryBar" | "showQueryInput" | "showFilterBar" | "showDatePicker" | "showAutoRefreshOnly" | "isRefreshPaused" | "dateRangeFrom" | "dateRangeTo" | "showSaveQuery" | "savedQuery" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated" | "onClearSavedQuery" | "onRefresh" | "timeHistory" | "onFiltersUpdated" | "onRefreshChange"> & ReactIntl.InjectedIntlProps>;
SearchBar: React.ComponentClass<Pick<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "intl" | "indexPatterns" | "onFiltersUpdated" | "customSubmitButton" | "screenTitle" | "dataTestSubj" | "showQueryBar" | "showQueryInput" | "showFilterBar" | "showDatePicker" | "showAutoRefreshOnly" | "isRefreshPaused" | "refreshInterval" | "dateRangeFrom" | "dateRangeTo" | "showSaveQuery" | "savedQuery" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated" | "onClearSavedQuery" | "onRefresh" | "timeHistory" | "onRefreshChange">, "query" | "isLoading" | "filters" | "indexPatterns" | "onFiltersUpdated" | "customSubmitButton" | "screenTitle" | "dataTestSubj" | "showQueryBar" | "showQueryInput" | "showFilterBar" | "showDatePicker" | "showAutoRefreshOnly" | "isRefreshPaused" | "refreshInterval" | "dateRangeFrom" | "dateRangeTo" | "showSaveQuery" | "savedQuery" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated" | "onClearSavedQuery" | "onRefresh" | "timeHistory" | "onRefreshChange">, any> & {
WrappedComponent: React.ComponentType<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "intl" | "indexPatterns" | "onFiltersUpdated" | "customSubmitButton" | "screenTitle" | "dataTestSubj" | "showQueryBar" | "showQueryInput" | "showFilterBar" | "showDatePicker" | "showAutoRefreshOnly" | "isRefreshPaused" | "refreshInterval" | "dateRangeFrom" | "dateRangeTo" | "showSaveQuery" | "savedQuery" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated" | "onClearSavedQuery" | "onRefresh" | "timeHistory" | "onRefreshChange"> & ReactIntl.InjectedIntlProps>;
}
```
10 changes: 10 additions & 0 deletions src/plugins/data/common/es_query/filters/get_display_value.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import { Filter } from '../filters';

function getValueFormatter(indexPattern?: IIndexPattern, key?: string) {
if (!indexPattern || !key) return;

let format = get(indexPattern, ['fields', 'byName', key, 'format']);
if (!format && (indexPattern.fields as any).getByName) {
// TODO: Why is indexPatterns sometimes a map and sometimes an array?
Expand All @@ -45,6 +46,15 @@ function getValueFormatter(indexPattern?: IIndexPattern, key?: string) {
export function getDisplayValueFromFilter(filter: Filter, indexPatterns: IIndexPattern[]): string {
const indexPattern = getIndexPatternFromFilter(filter, indexPatterns);

if (!indexPattern) {
throw new Error(
i18n.translate('data.filter.filterBar.indexNotFound', {
defaultMessage: 'Index pattern {indexPattern} not found',
values: { indexPattern: filter.meta.index },
})
);
}

if (typeof filter.meta.value === 'function') {
const valueFormatter: any = getValueFormatter(indexPattern, filter.meta.key);
return filter.meta.value(valueFormatter);
Expand Down
6 changes: 3 additions & 3 deletions src/plugins/data/public/public.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ export class AggParamType<TAggConfig extends IAggConfig = IAggConfig> extends Ba
// Warning: (ae-missing-release-tag) "baseFormattersPublic" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public (undocumented)
export const baseFormattersPublic: (import("../../common").FieldFormatInstanceType | typeof DateFormat)[];
export const baseFormattersPublic: (typeof DateFormat | import("../../common").FieldFormatInstanceType)[];

// Warning: (ae-missing-release-tag) "BUCKET_TYPES" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
Expand Down Expand Up @@ -1576,8 +1576,8 @@ export const search: {
// Warning: (ae-missing-release-tag) "SearchBar" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public (undocumented)
export const SearchBar: React.ComponentClass<Pick<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "intl" | "indexPatterns" | "refreshInterval" | "customSubmitButton" | "screenTitle" | "dataTestSubj" | "showQueryBar" | "showQueryInput" | "showFilterBar" | "showDatePicker" | "showAutoRefreshOnly" | "isRefreshPaused" | "dateRangeFrom" | "dateRangeTo" | "showSaveQuery" | "savedQuery" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated" | "onClearSavedQuery" | "onRefresh" | "timeHistory" | "onFiltersUpdated" | "onRefreshChange">, "query" | "isLoading" | "filters" | "indexPatterns" | "refreshInterval" | "customSubmitButton" | "screenTitle" | "dataTestSubj" | "showQueryBar" | "showQueryInput" | "showFilterBar" | "showDatePicker" | "showAutoRefreshOnly" | "isRefreshPaused" | "dateRangeFrom" | "dateRangeTo" | "showSaveQuery" | "savedQuery" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated" | "onClearSavedQuery" | "onRefresh" | "timeHistory" | "onFiltersUpdated" | "onRefreshChange">, any> & {
WrappedComponent: React.ComponentType<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "intl" | "indexPatterns" | "refreshInterval" | "customSubmitButton" | "screenTitle" | "dataTestSubj" | "showQueryBar" | "showQueryInput" | "showFilterBar" | "showDatePicker" | "showAutoRefreshOnly" | "isRefreshPaused" | "dateRangeFrom" | "dateRangeTo" | "showSaveQuery" | "savedQuery" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated" | "onClearSavedQuery" | "onRefresh" | "timeHistory" | "onFiltersUpdated" | "onRefreshChange"> & ReactIntl.InjectedIntlProps>;
export const SearchBar: React.ComponentClass<Pick<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "intl" | "indexPatterns" | "onFiltersUpdated" | "customSubmitButton" | "screenTitle" | "dataTestSubj" | "showQueryBar" | "showQueryInput" | "showFilterBar" | "showDatePicker" | "showAutoRefreshOnly" | "isRefreshPaused" | "refreshInterval" | "dateRangeFrom" | "dateRangeTo" | "showSaveQuery" | "savedQuery" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated" | "onClearSavedQuery" | "onRefresh" | "timeHistory" | "onRefreshChange">, "query" | "isLoading" | "filters" | "indexPatterns" | "onFiltersUpdated" | "customSubmitButton" | "screenTitle" | "dataTestSubj" | "showQueryBar" | "showQueryInput" | "showFilterBar" | "showDatePicker" | "showAutoRefreshOnly" | "isRefreshPaused" | "refreshInterval" | "dateRangeFrom" | "dateRangeTo" | "showSaveQuery" | "savedQuery" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated" | "onClearSavedQuery" | "onRefresh" | "timeHistory" | "onRefreshChange">, any> & {
WrappedComponent: React.ComponentType<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "intl" | "indexPatterns" | "onFiltersUpdated" | "customSubmitButton" | "screenTitle" | "dataTestSubj" | "showQueryBar" | "showQueryInput" | "showFilterBar" | "showDatePicker" | "showAutoRefreshOnly" | "isRefreshPaused" | "refreshInterval" | "dateRangeFrom" | "dateRangeTo" | "showSaveQuery" | "savedQuery" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated" | "onClearSavedQuery" | "onRefresh" | "timeHistory" | "onRefreshChange"> & ReactIntl.InjectedIntlProps>;
};

// Warning: (ae-forgotten-export) The symbol "SearchBarOwnProps" needs to be exported by the entry point index.d.ts
Expand Down
23 changes: 9 additions & 14 deletions src/plugins/data/public/ui/filter_bar/filter_item.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ import {
toggleFilterPinned,
toggleFilterDisabled,
} from '../../../common';
import { getNotifications } from '../../services';

interface Props {
id: string;
Expand Down Expand Up @@ -65,26 +64,21 @@ class FilterItemUI extends Component<Props, State> {
public render() {
const { filter, id } = this.props;
const { negate, disabled } = filter.meta;
let hasError: boolean = false;
let errorMessage: string | undefined;

let valueLabel;
try {
valueLabel = getDisplayValueFromFilter(filter, this.props.indexPatterns);
} catch (e) {
getNotifications().toasts.addError(e, {
title: this.props.intl.formatMessage({
id: 'data.filter.filterBar.labelErrorMessage',
defaultMessage: 'Failed to display filter',
}),
});
valueLabel = this.props.intl.formatMessage({
errorMessage = valueLabel = this.props.intl.formatMessage({
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Notification was removed as it renders multiple times - showing the error message on the filter is clear enough.

id: 'data.filter.filterBar.labelErrorText',
defaultMessage: 'Error',
defaultMessage: `Error: ${e.message}`,
});
hasError = true;
}
const dataTestSubjKey = filter.meta.key ? `filter-key-${filter.meta.key}` : '';
const dataTestSubjValue = filter.meta.value ? `filter-value-${valueLabel}` : '';
const dataTestSubjValue = filter.meta.value
? `filter-value-${!!errorMessage ? 'error' : valueLabel}`
: '';
const dataTestSubjDisabled = `filter-${
this.props.filter.meta.disabled ? 'disabled' : 'enabled'
}`;
Expand All @@ -93,8 +87,8 @@ class FilterItemUI extends Component<Props, State> {
const classes = classNames(
'globalFilterItem',
{
'globalFilterItem-isDisabled': disabled || hasError,
'globalFilterItem-isInvalid': hasError,
'globalFilterItem-isDisabled': disabled || !!errorMessage,
'globalFilterItem-isInvalid': !!errorMessage,
'globalFilterItem-isPinned': isFilterPinned(filter),
'globalFilterItem-isExcluded': negate,
},
Expand All @@ -105,6 +99,7 @@ class FilterItemUI extends Component<Props, State> {
<FilterView
filter={filter}
valueLabel={valueLabel}
errorMessage={errorMessage}
className={classes}
iconOnClick={() => this.props.onRemove()}
onClick={this.handleBadgeClick}
Expand Down
12 changes: 8 additions & 4 deletions src/plugins/data/public/ui/filter_bar/filter_view/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import { Filter, isFilterPinned } from '../../../../common';
interface Props {
filter: Filter;
valueLabel: string;
errorMessage?: string;
[propName: string]: any;
}

Expand All @@ -34,14 +35,17 @@ export const FilterView: FC<Props> = ({
iconOnClick,
onClick,
valueLabel,
errorMessage,
...rest
}: Props) => {
const [ref, innerText] = useInnerText();

let title = i18n.translate('data.filter.filterBar.moreFilterActionsMessage', {
defaultMessage: 'Filter: {innerText}. Select for more filter actions.',
values: { innerText },
});
let title =
errorMessage ||
i18n.translate('data.filter.filterBar.moreFilterActionsMessage', {
defaultMessage: 'Filter: {innerText}. Select for more filter actions.',
values: { innerText },
});

if (isFilterPinned(filter)) {
title = `${i18n.translate('data.filter.filterBar.pinnedFilterPrefix', {
Expand Down