diff --git a/x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx b/x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx index 0f7544e0ecd89..7180db27afdc6 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/components/data_view_select_popover.tsx @@ -26,7 +26,7 @@ import { useTriggerUiActionServices } from '../es_query/util'; import { EsQueryRuleMetaData } from '../es_query/types'; export interface DataViewSelectPopoverProps { - dataView: DataView; + dataView?: DataView; metadata?: EsQueryRuleMetaData; onSelectDataView: (selectedDataView: DataView) => void; onChangeMetaData: (metadata: EsQueryRuleMetaData) => void; @@ -150,7 +150,7 @@ export const DataViewSelectPopover: React.FunctionComponent { setDataViewPopoverOpen(true); }} - isInvalid={!dataView.id} + isInvalid={!dataView?.id} /> } isOpen={dataViewPopoverOpen} @@ -191,7 +191,7 @@ export const DataViewSelectPopover: React.FunctionComponent setSearchSource(fetchedSearchSource)) + .then(setSearchSource) .catch(setParamsError); }; diff --git a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/search_source_expression_form.tsx b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/search_source_expression_form.tsx index 7717d5c3b6838..a439748500a48 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/search_source_expression_form.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/es_query/expression/search_source_expression_form.tsx @@ -35,7 +35,7 @@ const HIDDEN_FILTER_PANEL_OPTIONS: SearchBarProps['hiddenFilterPanelOptions'] = ]; interface LocalState { - index: DataView; + index?: DataView; filter: Filter[]; query: Query; thresholdComparator: CommonRuleParams['thresholdComparator']; @@ -100,7 +100,7 @@ export const SearchSourceExpressionForm = (props: SearchSourceExpressionFormProp return { ...currentState, [action.type]: action.payload }; }, { - index: searchSource.getField('index')!, + index: searchSource.getField('index'), query: searchSource.getField('query')! as Query, filter: mapAndFlattenFilters(searchSource.getField('filter') as Filter[]), threshold: ruleParams.threshold ?? DEFAULT_VALUES.THRESHOLD, diff --git a/x-pack/test/functional_with_es_ssl/apps/discover/search_source_alert.ts b/x-pack/test/functional_with_es_ssl/apps/discover/search_source_alert.ts index 1b6d7ad9c3187..22518669681ed 100644 --- a/x-pack/test/functional_with_es_ssl/apps/discover/search_source_alert.ts +++ b/x-pack/test/functional_with_es_ssl/apps/discover/search_source_alert.ts @@ -151,9 +151,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { supertest.delete(`/api/actions/connector/${id}`).set('kbn-xsrf', 'foo').expect(204, ''); const defineSearchSourceAlert = async (alertName: string) => { - await testSubjects.click('discoverAlertsButton'); - await testSubjects.click('discoverCreateAlertButton'); - await retry.waitFor('rule name value is correct', async () => { await testSubjects.setValue('ruleNameInput', alertName); const ruleName = await testSubjects.getAttribute('ruleNameInput', 'value'); @@ -175,6 +172,24 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.click('saveRuleButton'); }; + const openDiscoverAlertFlyout = async () => { + await testSubjects.click('discoverAlertsButton'); + await testSubjects.click('discoverCreateAlertButton'); + }; + + const openManagementAlertFlyout = async () => { + await PageObjects.common.navigateToApp('management'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.click('triggersActions'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.click('createFirstRuleButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.click('.es-query-SelectOption'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.click('queryFormType_searchSource'); + await PageObjects.header.waitUntilLoadingHasFinished(); + }; + const getResultsLink = async () => { // getting the link await dataGrid.clickRowToggle(); @@ -237,15 +252,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { log.debug('create output index'); await createOutputDataIndex(); - log.debug('create data views'); - const sourceDataViewResponse = await createDataView(SOURCE_DATA_INDEX); - const outputDataViewResponse = await createDataView(OUTPUT_DATA_INDEX); - log.debug('create connector'); connectorId = await createConnector(); - - sourceDataViewId = sourceDataViewResponse.body.data_view.id; - outputDataViewId = outputDataViewResponse.body.data_view.id; }); after(async () => { @@ -257,6 +265,21 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await security.testUser.restoreDefaults(); }); + it('should create an alert when there is no data view', async () => { + await openManagementAlertFlyout(); + + // should not have data view selected by default + const dataViewSelector = await testSubjects.find('selectDataViewExpression'); + expect(await dataViewSelector.getVisibleText()).to.eql('DATA VIEW\nSelect a data view'); + + log.debug('create data views'); + const sourceDataViewResponse = await createDataView(SOURCE_DATA_INDEX); + const outputDataViewResponse = await createDataView(OUTPUT_DATA_INDEX); + + sourceDataViewId = sourceDataViewResponse.body.data_view.id; + outputDataViewId = outputDataViewResponse.body.data_view.id; + }); + it('should navigate to alert results via view in app link', async () => { await PageObjects.common.navigateToApp('discover'); await PageObjects.discover.waitUntilSearchingHasFinished(); @@ -264,6 +287,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.timePicker.setCommonlyUsedTime('Last_15 minutes'); // create an alert + await openDiscoverAlertFlyout(); await defineSearchSourceAlert(RULE_NAME); await PageObjects.header.waitUntilLoadingHasFinished(); @@ -377,6 +401,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.discover.addRuntimeField('runtime-message-field', `emit('mock-message')`); // create an alert + await openDiscoverAlertFlyout(); await defineSearchSourceAlert('test-adhoc-alert'); await PageObjects.header.waitUntilLoadingHasFinished(); sourceAdHocDataViewId = await PageObjects.discover.getCurrentDataViewId();