import React from 'react' ; import { i18n } from '@osd/i18n' ; import { EuiButton , EuiSpacer , EuiText , EuiCodeBlock } from '@elastic/eui' ; import { FormattedMessage } from '@osd/i18n/react' ; import { ApplicationStart } from 'opensearch-dashboards/public' ; import { OsdError } from '../../../../opensearch_dashboards_utils/common' ; import { OpenSearchError , isOpenSearchError } from './types' ; import { IOpenSearchDashboardsSearchRequest } from '..' ; export class PainlessError extends OsdError { painlessStack ? : string ; constructor ( err , request ) { const rootCause = getRootCause ( err as OpenSearchError ) ; super ( i18n . translate ( 'data.painlessError.painlessScriptedFieldErrorMessage' , { defaultMessage : "Error executing Painless script: '{script}'." , values : { script : rootCause ?. script } , } ) ) ; this . painlessStack = rootCause ?. script_stack ? rootCause ?. script_stack . join ( '\n' ) : undefined ; } public getErrorMessage ( application ) { function onClick ( ) { application . navigateToApp ( 'management' , { path : `/opensearch-dashboards/indexPatterns` , } ) ; } return ( < > { this . message } < EuiSpacer size = "s" / > < EuiSpacer size = "s" / > { this . painlessStack ? ( < EuiCodeBlock data - test - subj = "painlessStackTrace" isCopyable = { true } paddingSize = "s" > { this . painlessStack } < /EuiCodeBlock>) : null} < EuiText textAlign = "right" > < EuiButton color = "danger" onClick = { onClick } size = "s" > < FormattedMessage id = "data.painlessError.buttonTxt" defaultMessage = "Edit script" / > < /EuiButton> < /EuiText> < />); } } function getFailedShards ( err ) { const failedShards = err . body ?. attributes ?. error ?. failed_shards || err . body ?. attributes ?. error ?. caused_by ?. failed_shards ; return failedShards ? failedShards [ 0 ] : undefined ; } function getRootCause ( err ) { return getFailedShards ( err ) ?. reason ; } export function isPainlessError ( err ) { if ( ! isOpenSearchError ( err ) ) return false ; const rootCause = getRootCause ( err as OpenSearchError ) ; if ( ! rootCause ) return false ; const { lang } = rootCause ; return lang === 'painless' ; }