@commercetools-uikit/money-field

A controlled input component for money values with validation states and a label.

Usage no npm install needed!

<script type="module">
  import commercetoolsUikitMoneyField from 'https://cdn.skypack.dev/@commercetools-uikit/money-field';
</script>

README

MoneyField

Description

A controlled input component for money values with validation states and a label.

High Precision Money Values

The MoneyField component always operates on a value consisting of

{ amount: String, currencyCode: String }

The amount can have an arbitrary precision. When the precision of the amount exceeds the precision of that currency, then that Money Value is referred to as being "high precision".

⚠️ The MoneyField will allow high precision money values by default. If you want to discourage them, you need to add validation as shown in the example below, or the Examples/Forms story.

Installation

yarn add @commercetools-uikit/money-field
npm --save install @commercetools-uikit/money-field

Additionally install the peer dependencies (if not present)

yarn add react
npm --save install react

Usage

import MoneyField from '@commercetools-uikit/money-field';

const Example = () => (
  <MoneyField
    title="Price"
    value={{ amount: '20', currencyCode: 'EUR' }}
    onChange={(event) => alert(event.target.value)}
    currencies={['EUR', 'USD']}
  />
);

export default Example;

Properties

Props Type Required Default Description
id string Used as HTML id property. An id is auto-generated when it is not specified.
horizontalConstraint union
Possible values:
, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 'scale', 'auto'
'scale' Horizontal size limit of the input fields.
errors Record A map of errors. Error messages for known errors are rendered automatically.
Unknown errors will be forwarded to renderError
renderError Function
See signature.
Called with custom errors. This function can return a message which will be wrapped in an ErrorMessage. It can also return null to show no error.
isRequired boolean Indicates if the value is required. Shows an the "required asterisk" if so.
touched Object
See signature.
Indicates whether the currencyCode or amount fields were touched.
Errors will only be shown when the field was touched.
isTouched unknown
autoComplete string Used as HTML autocomplete property
name string The prefix used to create a HTML name property for the amount input field (${name}.amount) and the currency dropdown (${name}.currencyCode).
value Object
See signature.
Value of the input. Consists of the currency code and an amount. amount is a string representing the amount. A dot has to be used as the decimal separator.
currencies Array: string[] List of possible currencies. When not provided or empty, the component renders a label with the value's currency instead of a dropdown.
placeholder string Placeholder text for the amount input
onBlur Function
See signature.
Called when input is blurred
onFocus Function
See signature.
Called when input is focused
isDisabled boolean Indicates that the input cannot be modified (e.g not authorized, or changes currently saving).
isReadOnly boolean Indicates that the field is displaying read-only content
isAutofocussed boolean Focus the input on initial render
onChange Function
See signature.
Called with the event of the input or dropdown when either the currency or the amount have changed.
menuPortalTarget ReactSelectProps['menuPortalTarget'] Dom element to portal the currency select menu to
Props from React select was used
menuPortalZIndex number z-index value for the currency select menu portal
menuShouldBlockScroll ReactSelectProps['menuShouldBlockScroll'] whether the menu should block scroll while open
Props from React select was used
title union
Possible values:
string , ReactNode
Title of the label
hint union
Possible values:
string , ReactNode
Hint for the label. Provides a supplementary but important information regarding the behaviour of the input (e.g warn about uniqueness of a field, when it can only be set once), whereas description can describe it in more depth. Can also receive a hintIcon.
description union
Possible values:
string , ReactNode
Provides a description for the title.
onInfoButtonClick Function
See signature.
Function called when info button is pressed.
Info button will only be visible when this prop is passed.
hintIcon ReactElement Icon to be displayed beside the hint text.
Will only get rendered when hint is passed as well.
hasHighPrecisionBadge boolean Shows high precision badge in case current value uses high precision.

Signatures

Signature renderError

(key: string, error?: boolean) => ReactNode;

Signature touched

{
  amount?: boolean;
  currencyCode?: boolean;
}

Signature value

{
  amount: string;
  currencyCode: TCurrencyCode;
}

Signature onBlur

(event: TEvent) => void

Signature onFocus

(event: TEvent) => void

Signature onChange

(event: TEvent) => void

Signature onInfoButtonClick

() => void

data-* props

The component further forwards all data- attributes to the underlying input component.

errors

This object is a key-value map. The renderError prop will be called for each entry with the key and the value. The return value will be rendered inside an ErrorMessage component underneath the input.

The MoneyField supports some errors out of the box. Return undefined from renderError for these and the default errors will be shown instead. This prevents consumers from having to reimplement the same error messages for known errors while still keeping the flexibility of showing custom error messages for them.

When the key is known, and when the value is truthy, and when renderError returned undefined for that error entry, then the MoneyField will render an appropriate error automatically.

Known error keys are:

  • missing: tells the user that this field is required but no value was provided

Main Functions and use cases are:

  • Getting monetary value input with a currency from users (with cent precision or high precision)