render()

in packages/eui/src/components/form/range/range.tsx [136:335]


  render() {
    const { defaultFullWidth } = this.context as FormContextValue;
    const {
      className,
      compressed,
      disabled,
      fullWidth = defaultFullWidth,
      isLoading,
      readOnly,
      id: propsId,
      max,
      min,
      name,
      step,
      showLabels,
      showInput,
      inputPopoverProps,
      showTicks,
      tickInterval,
      ticks,
      levels,
      showRange,
      showValue,
      valueAppend,
      valuePrepend,
      onBlur,
      onChange,
      onFocus,
      value,
      tabIndex,
      isInvalid,
      theme,
      ...rest
    } = this.props;

    const { id } = this.state;

    const showInputOnly = showInput === 'inputWithPopover';
    const canShowDropdown = showInputOnly && !readOnly && !disabled;

    const theInput: ReactNode = !!showInput ? (
      <EuiRangeInput
        id={id}
        min={min}
        max={max}
        step={step}
        value={value}
        readOnly={readOnly}
        disabled={disabled}
        compressed={compressed}
        onChange={this.handleOnChange}
        name={name}
        onFocus={canShowDropdown ? this.onInputFocus : onFocus}
        onBlur={canShowDropdown ? this.onInputBlur : onBlur}
        fullWidth={showInputOnly && fullWidth}
        isLoading={showInputOnly && isLoading}
        isInvalid={isInvalid}
        autoSize={!showInputOnly}
        {...rest}
      />
    ) : null;

    const classes = classNames('euiRange', className);

    const styles = euiRangeStyles(theme);
    const cssStyles = [styles.euiRange, showInput && styles.hasInput];
    const thumbColor = levels && getLevelColor(levels, Number(value));

    const sliderScreenReaderInstructions = (
      <EuiI18n
        token="euiRange.sliderScreenReaderInstructions"
        default="You are in a custom range slider. Use the Up and Down arrow keys to change the value."
      />
    );

    const theRange = (
      <EuiRangeWrapper
        className={classes}
        css={cssStyles}
        fullWidth={fullWidth}
        compressed={compressed}
      >
        {showLabels && (
          <EuiRangeLabel side="min" disabled={disabled}>
            {min}
          </EuiRangeLabel>
        )}
        <EuiRangeTrack
          trackWidth={this.state.trackWidth}
          disabled={disabled}
          compressed={compressed}
          max={max}
          min={min}
          step={step}
          showTicks={showTicks}
          tickInterval={tickInterval}
          ticks={ticks}
          levels={levels}
          onChange={this.handleOnChange}
          value={value}
          aria-hidden={!!showInput}
          showRange={showRange}
        >
          <EuiRangeSlider
            ariaValueText={
              ticks ? this.handleAriaValueText(ticks, value) : undefined
            }
            id={showInput ? undefined : id} // Attach id only to the input if there is one
            name={name}
            min={min}
            max={max}
            step={step}
            value={value}
            disabled={disabled}
            onChange={this.handleOnChange}
            showTicks={showTicks}
            showRange={showRange}
            tabIndex={showInput ? -1 : tabIndex}
            onMouseDown={
              showInputOnly
                ? () => (this.preventPopoverClose = true)
                : undefined
            }
            onFocus={showInput === true ? undefined : onFocus}
            onBlur={showInputOnly ? this.onInputBlur : onBlur}
            aria-hidden={!!showInput}
            thumbColor={thumbColor}
            {...rest}
            onResize={this.setTrackWidth}
          />

          {showRange && this.isValid && (
            <EuiRangeHighlight
              showTicks={showTicks}
              min={Number(min)}
              max={Number(max)}
              lowerValue={Number(min)}
              upperValue={Number(value)}
              levels={levels}
              trackWidth={this.state.trackWidth}
            />
          )}

          {showValue && !!String(value).length && (
            <EuiRangeTooltip
              value={value}
              max={max}
              min={min}
              name={name}
              showTicks={showTicks}
              valuePrepend={valuePrepend}
              valueAppend={valueAppend}
            />
          )}
        </EuiRangeTrack>
        {showLabels && (
          <EuiRangeLabel side="max" disabled={disabled}>
            {max}
          </EuiRangeLabel>
        )}
        {showInput && !showInputOnly && (
          <>
            <div
              className={
                showTicks || ticks
                  ? 'euiRange__slimHorizontalSpacer'
                  : 'euiRange__horizontalSpacer'
              }
              css={
                showTicks || ticks
                  ? styles.euiRange__slimHorizontalSpacer
                  : styles.euiRange__horizontalSpacer
              }
            />
            {theInput}
          </>
        )}
      </EuiRangeWrapper>
    );

    const thePopover = showInputOnly ? (
      <EuiInputPopover
        {...inputPopoverProps}
        className={classNames(
          'euiRange__popover',
          inputPopoverProps?.className
        )}
        input={theInput!} // `showInputOnly` confirms existence
        fullWidth={fullWidth}
        isOpen={this.state.isPopoverOpen}
        closePopover={this.closePopover}
        disableFocusTrap={true}
        popoverScreenReaderText={sliderScreenReaderInstructions}
      >
        {theRange}
      </EuiInputPopover>
    ) : undefined;

    return thePopover ? thePopover : theRange;
  }