renderLanguage() { const { field, scriptingLangs, isDeprecatedLang } = this.state; return field.scripted ? ( <EuiFormRow label="Language" helpText={isDeprecatedLang ? ( <span> <EuiIcon type="alert" color="warning" size="s" /> <strong>Deprecation Warning:</strong> <EuiCode>{field.lang}</EuiCode> is deprecated and support will be removed in the next major version of Kibana and Elasticsearch. We recommend using {( <EuiLink target="_window" href={getDocLink('scriptedFields.painless')}>Painless</EuiLink> )} for new scripted fields. </span> ) : null} > <EuiSelect value={field.lang} options={scriptingLangs.map(lang => { return { value: lang, text: lang }; })} data-test-subj="editorFieldLang" onChange={(e) => { this.onLangChange(e.target.value); }} /> </EuiFormRow> ) : null; }
export const ScriptingWarningCallOut = ({ isVisible = false, }) => { return isVisible ? ( <Fragment> <EuiCallOut title={<FormattedMessage id="common.ui.fieldEditor.warningCallOutHeader" defaultMessage="Proceed with caution" />} color="warning" iconType="alert" > <p> <FormattedMessage id="common.ui.fieldEditor.warningCallOutLabel.callOutDetail" defaultMessage="Please familiarize yourself with {scripFields} and with {scriptsInAggregation} before using scripted fields." values={{ scripFields: ( <EuiLink target="_window" href={getDocLink('scriptedFields.scriptFields')}> <FormattedMessage id="common.ui.fieldEditor.warningCallOutLabel.scripFieldsLink" defaultMessage="script fields" /> <EuiIcon type="link" /> </EuiLink> ), scriptsInAggregation: ( <EuiLink target="_window" href={getDocLink('scriptedFields.scriptAggs')}> <FormattedMessage id="common.ui.fieldEditor.warningCallOutLabel.scriptsInAggregationLink" defaultMessage="scripts in aggregations" /> <EuiIcon type="link" /> </EuiLink> ) }} /> </p> <p> <FormattedMessage id="common.ui.fieldEditor.warningCallOut.descriptionLabel" defaultMessage="Scripted fields can be used to display and aggregate calculated values. As such, they can be very slow, and if done incorrectly, can cause Kibana to be unusable. There's no safety net here. If you make a typo, unexpected exceptions will be thrown all over the place!" /> </p> </EuiCallOut> <EuiSpacer size="m" /> </Fragment> ) : null; };
renderLanguage() { const { field, scriptingLangs, isDeprecatedLang } = this.state; const { intl } = this.props; return field.scripted ? ( <EuiFormRow label={intl.formatMessage({ id: 'common.ui.fieldEditor.languageLabel', defaultMessage: 'Language' })} helpText={isDeprecatedLang ? ( <span> <EuiIcon type="alert" color="warning" size="s" /> <strong> <FormattedMessage id="common.ui.fieldEditor.warningHeader" defaultMessage="Deprecation Warning:" /> </strong> <FormattedMessage id="common.ui.fieldEditor.warningLabel.warningDetail" defaultMessage="{language} is deprecated and support will be removed in the next major version of Kibana and Elasticsearch. We recommend using {painlessLink} for new scripted fields." values={{ language: <EuiCode>{field.lang}</EuiCode>, painlessLink: ( <EuiLink target="_window" href={getDocLink('scriptedFields.painless')}> <FormattedMessage id="common.ui.fieldEditor.warningLabel.painlessLinkLabel" defaultMessage="Painless" /> </EuiLink> ) }} /> </span> ) : null} > <EuiSelect value={field.lang} options={scriptingLangs.map(lang => { return { value: lang, text: lang }; })} data-test-subj="editorFieldLang" onChange={(e) => { this.onLangChange(e.target.value); }} /> </EuiFormRow> ) : null; }
export const ScriptingSyntax = () => ( <Fragment> <EuiSpacer /> <EuiText> <h3> <FormattedMessage id="common.ui.fieldEditor.syntaxHeader" defaultMessage="Syntax" /> </h3> <p> <FormattedMessage id="common.ui.fieldEditor.syntax.defaultLabel.defaultDetail" defaultMessage="By default, Kibana scripted fields use {painless}, a simple and secure scripting language designed specifically for use with Elasticsearch, to access values in the document use the following format:" values={{ painless: ( <EuiLink target="_window" href={getDocLink('scriptedFields.painless')} > <FormattedMessage id="common.ui.fieldEditor.syntax.defaultLabel.painlessLink" defaultMessage="Painless" /> {' '}<EuiIcon type="link" /> </EuiLink> ) }} /> </p> <p> <EuiCode> <FormattedMessage id="common.ui.fieldEditor.syntax.default.formatLabel" defaultMessage="doc['some_field'].value" /> </EuiCode> </p> <p> <FormattedMessage id="common.ui.fieldEditor.syntax.painlessLabel.painlessDetail" defaultMessage="Painless is powerful but easy to use. It provides access to many {javaAPIs}. Read up on its {syntax} and you'll be up to speed in no time!" values={{ javaAPIs: ( <EuiLink target="_window" href={getDocLink('scriptedFields.painlessApi')} > <FormattedMessage id="common.ui.fieldEditor.syntax.painlessLabel.javaAPIsLink" defaultMessage="native Java APIs" /> <EuiIcon type="link" /> </EuiLink> ), syntax: ( <EuiLink target="_window" href={getDocLink('scriptedFields.painlessSyntax')} > <FormattedMessage id="common.ui.fieldEditor.syntax.painlessLabel.syntaxLink" defaultMessage="syntax" /> <EuiIcon type="link" /> </EuiLink> ) }} /> </p> <p> <FormattedMessage id="common.ui.fieldEditor.syntax.kibanaLabel" defaultMessage="Kibana currently imposes one special limitation on the painless scripts you write. They cannot contain named functions." /> </p> <p> <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.commonLabel.commonDetail" defaultMessage="Coming from an older version of Kibana? The {lucene} you know and love are still available. Lucene expressions are a lot like JavaScript, but limited to basic arithmetic, bitwise and comparison operations." values={{ lucene: ( <EuiLink target="_window" href={getDocLink('scriptedFields.luceneExpressions')} > <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.commonLabel.luceneLink" defaultMessage="Lucene Expressions" /> <EuiIcon type="link" /> </EuiLink> ) }} /> </p> <p> <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.limitsLabel" defaultMessage="There are a few limitations when using Lucene Expressions:" /> </p> <ul> <li> <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.limits.typesLabel" defaultMessage="Only numeric, boolean, date, and geo_point fields may be accessed" /> </li> <li> <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.limits.fieldsLabel" defaultMessage="Stored fields are not available" /> </li> <li> <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.limits.sparseLabel" defaultMessage="If a field is sparse (only some documents contain a value), documents missing the field will have a value of 0" /> </li> </ul> <p> <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.operationsLabel" defaultMessage="Here are all the operations available to lucene expressions:" /> </p> <ul> <li> <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.operations.arithmeticLabel" defaultMessage="Arithmetic operators: {operators}" values={{ operators: <code>+ - * / %</code> }} /> </li> <li> <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.operations.bitwiseLabel" defaultMessage="Bitwise operators: {operators}" values={{ operators: <code>| & ^ ~ << >> >>></code> }} /> </li> <li> <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.operations.booleanLabel" defaultMessage="Boolean operators (including the ternary operator): {operators}" values={{ operators: <code>&& || ! ?:</code> }} /> </li> <li> <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.operations.comparisonLabel" defaultMessage="Comparison operators: {operators}" values={{ operators: <code>< <= == >= ></code> }} /> </li> <li> <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.operations.mathLabel" defaultMessage="Common mathematic functions: {operators}" values={{ operators: <code>abs ceil exp floor ln log10 logn max min sqrt pow</code> }} /> </li> <li> <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.operations.trigLabel" defaultMessage="Trigonometric library functions: {operators}" values={{ operators: <code>acosh acos asinh asin atanh atan atan2 cosh cos sinh sin tanh tan</code> }} /> </li> <li> <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.operations.distanceLabel" defaultMessage="Distance functions: {operators}" values={{ operators: <code>haversin</code> }} /> </li> <li> <FormattedMessage id="common.ui.fieldEditor.syntax.lucene.operations.miscellaneousLabel" defaultMessage="Miscellaneous functions: {operators}" values={{ operators: <code>min, max</code> }} /> </li> </ul> </EuiText> </Fragment> );