Example #1
0
  renderLanguage() {
    const { field, scriptingLangs, isDeprecatedLang } = this.state;

    return field.scripted ? (
      <EuiFormRow
        label="Language"
        helpText={isDeprecatedLang ? (
          <span>
            <EuiIcon type="alert" color="warning" size="s" />&nbsp;
            <strong>Deprecation Warning:</strong>&nbsp;
            <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;
  }
Example #2
0
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" />&nbsp;
                  <EuiIcon type="link" />
                </EuiLink>
              ),
              scriptsInAggregation: (
                <EuiLink target="_window" href={getDocLink('scriptedFields.scriptAggs')}>
                  <FormattedMessage
                    id="common.ui.fieldEditor.warningCallOutLabel.scriptsInAggregationLink"
                    defaultMessage="scripts in aggregations"
                  />&nbsp;
                  <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;
};
Example #3
0
  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" />&nbsp;
            <strong>
              <FormattedMessage
                id="common.ui.fieldEditor.warningHeader"
                defaultMessage="Deprecation Warning:"
              />
            </strong>&nbsp;
            <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;
  }
Example #4
0
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" />&nbsp;
                <EuiIcon type="link" />
              </EuiLink>
            ),
            syntax: (
              <EuiLink
                target="_window"
                href={getDocLink('scriptedFields.painlessSyntax')}
              >
                <FormattedMessage id="common.ui.fieldEditor.syntax.painlessLabel.syntaxLink" defaultMessage="syntax" />&nbsp;
                <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" />
                &nbsp;<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>| & ^ ~ &#x3C;&#x3C; &#x3E;&#x3E; &#x3E;&#x3E;&#x3E;</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>&#x3C; &#x3C;= == &#x3E;= &#x3E;</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>
);