The Basics

What it is

NumericRange is a combo component of two fields allowing users to enter a range of numbers. You can set the input type to match either numeric input or currency input. If enabled, they can enter one number while leaving the other blank allowing the user to define a selection of “More than X” or “Less than Y”. 

How it works

  • The user clicks or focuses on Input, which makes it active. 

  • While the field is active, the user can enter and edit data in it. 

  • When finished, the user navigates away from the Input. 

    • If currency is enabled, the number will default to having .00 at the end, or if only one decimal place was entered, will add the trailing zero to the end for readability. If an integer is added, the .00 will be added. Users will be prevented from adding more than two numbers to the right of the decimal. 

When to use

  • To ask users to enter a specific numeric range, such as an estimated cost range.

When not to use

  • To ask users to input a single value number or currency (see Forge Input). 

What to use instead

How to use

NumericRange can be used as a standalone component, but it is better when used with Form and FormField. Form provides a consistent, responsive layout, and FormField adds formatting for labels, error message handling, and hint text. 

Limiting and disabling options 

For example: 

  • isCurrency - Enables currency formatting and error handling 
  • isInteger - Enables restriction to whole numbers. Only enabled on Numeric non-currency inputs. 
  • Set a range for the values - Using max and min value props you can restrict the range. This is also how you would restrict to positive values. 
  • Include null values - When used with filters allows users to include null values in their search . 
  • Require values - Require one or both fields be filled. 

Use labels and hint text to explain any restrictions. 

Style

Design details

Required fields 

Forge offers three options to indicate required form fields. See Form for details. 

Spacing and size 

The height of this component and the vertical space around it vary according to the form layout (i.e., medium, compact, super-compact). See Form for layout variations. 

Placement and hierarchy

Doesn't apply to this component. 

Content

Use sentence case for label text (“Patient name”, not “Patient Name”). 

Demos

Required Currency Range Share

Coding

Developer tips

Repository

Implementation links

NumericRangeInput directory in Bitbucket

Implementation details

It is strongly recommended to familiarize yourself with the Forge source code. While this documentation is a best effort to document the intent and usage of a component, sometimes some features only become clear when looking at the source code. Also, looking at Forge's source code may help identify and fix bugs in either your application or Forge itself.

Storybook files

Forge maintains at least one storybook file per component. While the primary audience for these files is typically the Forge team, these storybook files may cover usages of the component not covered by a demo. The storybook for the latest version of forge can be found at go/forge-storybook.

Testing library

Forge strongly encourages using testing-library to write tests for your application.

"The more your tests resemble the way your software is used, the more confidence they can give you."

If you're having trouble testing a Forge component using testing-library, it would be a good idea to see how Forge tests its own components. For the most part, Forge tries to use screen.getByRole as much as it can, as that API provides the best feedback on a11y compliance. Forge discourages the use of document.querySelector and screen.getByTestId as both APIs encourage using implementation details to test your component, and discourage adding roles to your component.

With that being said, many of Forge's components were not built with accessability in mind. These components do break the recommendations listed above.

Import statements

In Nimbus applications

athenaOne serves the Forge bundle independently from your application's bundle. Importing Forge components directly from '@athena/forge' takes advantage of this feature.

import { NumericRangeInput } from '@athena/forge'

In standalone applications

Importing components using the exact path to the module takes advantage of webpack's tree shaking feature. Webpack will include only that module and its dependencies.

import NumericRangeInput from '@athena/forge/NumericRangeInput';

To use this import guidance, Typescript applications must use typescript >= 4.7.3, and should add this setting to their tsconfig.json file:

{
"compilerOptions": {
"moduleResolution": "Node16",
}
}

If this setting doesn't work for your application, use this import statement instead:

import NumericRangeInput from '@athena/forge/dist/NumericRangeInput';

Props