This plugin aims to provide you with very specific and improved fields for the admin panel.
We've tried to keep styling as consistent as possible with the existing admin UI, however if there are any issues please report them!
Every field will come with its own usage instructions and structure. These are subject to change!
All fields have had changes to standardise how the field parameters are structured. Field overrides will now be mandatory and come first across fields.
| Payload | Better fields |
|---|---|
| 1.x | < 1.0 |
| 2.x | > 1.0 |
yarn add @nouance/payload-better-fields-plugin
# OR
npm i @nouance/payload-better-fields-plugin- Slug field
- Combo field
- Number field
- Pattern field
- Range field
- Colour Text field
- Telephone field
- Alert Box field
We've tried to re-use the internal components of Payload as much as possible. Where we can't we will re-use the CSS variables used in the core theme to ensure as much compatibility with user customisations.
If you want to further customise the CSS of these components, every component comes with a unique class wrapper in the format of bf<field-name>Wrapper, eg bfPatternFieldWrapper, to help you target these inputs consistently.
import { CollectionConfig } from 'payload/types'
import { SlugField } from '@nouance/payload-better-fields-plugin'
const Examples: CollectionConfig = {
slug: 'examples',
admin: {
useAsTitle: 'title',
},
fields: [
{
name: 'title',
type: 'text',
},
...SlugField(
{
name: 'slug',
admin: {
position: 'sidebar',
},
},
{
useFields: ['title', 'subtitle'],
},
),
],
}The SlugField accepts the following parameters
-
overrides-TextFieldrequired Textfield overrides -
config-
useFields-string[]defaults to['title'] -
appendOnDuplication-booleandefaults tofalse| Adds a validation hook that appends-1to your slug to avoid conflicts (experimental) -
slugify- Options to be passed to the slugify function
@default { lower: true, remove: /[*+~.()'"!?#\.,:@]/g }
-
-
checkbox-
enable-booleandefaults totrue| Enable or disable the checkbox field -
overrides-CheckboxField| Checkbox field overrides
-
Here is a more full example:
...SlugField(
{
name: 'secondSlug',
admin: {
position: 'sidebar',
},
},
{
useFields: ['nested.heading'],
},
{
enable: true,
overrides: {
name: 'secondEdit',
},
},
)index and unique are set to true by default
import { CollectionConfig } from 'payload/types'
import { ComboField } from '@nouance/payload-better-fields-plugin'
const Examples: CollectionConfig = {
slug: 'examples',
admin: {
useAsTitle: 'fullName',
},
fields: [
{
type: 'row',
fields: [
{
name: 'firstName',
type: 'text',
},
{
name: 'lastName',
type: 'text',
},
],
},
...ComboField(['firstName', 'lastName'], { name: 'fullName' }),
],
}The ComboField accepts the following parameters
-
overrides-TextFieldrequired for name attribute -
fieldToUse-string[]required -
options-
separator-stringdefaults to' ' -
initial-stringThe starting string value before all fields are concatenated -
callback-(value: string) => stringYou can apply a callback to modify each field value if you want to preprocess them
-
source | react-number-format NumericFormat
import { CollectionConfig } from 'payload/types'
import { NumberField } from '@nouance/payload-better-fields-plugin'
const Examples: CollectionConfig = {
slug: 'examples',
admin: {
useAsTitle: 'fullName',
},
fields: [
{
name: 'title',
type: 'text',
},
...NumberField(
{
name: 'price',
required: true,
},
{
prefix: '$ ',
suffix: ' %',
thousandSeparator: ',',
decimalScale: 2,
fixedDecimalScale: true,
},
),
],
}The NumberField accepts the following parameters
-
overrides-NumberFieldrequired for name attribute -
format-NumericFormatPropsrequired, accepts props for NumericFormatcallback- you can override the internal callback on the value, thevaluewill be a string so you need to handle the conversion to an int or float yourself via parseFloat
// example callback: (value) => parseFloat(value) + 20,
source | react-number-format PatternFormat
import { CollectionConfig } from 'payload/types'
import { PatternField } from '@nouance/payload-better-fields-plugin'
const Examples: CollectionConfig = {
slug: 'examples',
admin: {
useAsTitle: 'fullName',
},
fields: [
{
name: 'title',
type: 'text',
},
...PatternField(
{
format: '+1 (###) #### ###',
prefix: '% ',
allowEmptyFormatting: true,
mask: '_',
},
{
name: 'telephone',
type: 'text',
required: false,
admin: {
placeholder: '% 20',
},
},
),
],
}The PatternField accepts the following parameters
-
overrides-TextFieldrequired for name attribute -
format-PatternFormatPropsrequired, accepts props for PatternFormat-
formatrequired, input for the pattern to be applied -
callback- you can override the internal callback on the value, thevaluewill be a string so you need to handle the conversion to an int or float yourself via parseFloat
// example callback: (value) => value + 'ID',
-
We recommend using a text field in Payload.
import { CollectionConfig } from 'payload/types'
import { RangeField } from '@nouance/payload-better-fields-plugin'
const Examples: CollectionConfig = {
slug: 'examples',
admin: {
useAsTitle: 'title',
},
fields: [
{
name: 'title',
type: 'text',
},
...RangeField(
{ min: 5, max: 200, step: 5 },
{
name: 'groups',
},
),
],
}
export default ExamplesThe RangeField accepts the following parameters
-
overrides-NumberFieldrequired for name attribute -
config- required-
min-numberdefaults to 1 -
max-numberdefaults to 100 -
step-numberdefaults to 1 -
showPreview-booleandefaults to false, shows a preview box of the underlying selected value,n/afor null -
markers-NumberMarker[]array of markers to be visually set, accepts an optional label{ value: number, label?: string}[]
-
import { CollectionConfig } from 'payload/types'
import { ColourTextField } from '@nouance/payload-better-fields-plugin'
const Examples: CollectionConfig = {
slug: 'examples',
admin: {
useAsTitle: 'title',
},
fields: [
{
name: 'title',
type: 'text',
},
...ColourTextField({
name: 'colour',
}),
],
}
export default ExamplesThe ColourTextField accepts the following parameters
overrides-TextFieldrequired for name attribute
source | react-phone-number-input
import { CollectionConfig } from 'payload/types'
import { TelephoneField } from '@nouance/payload-better-fields-plugin'
const Examples: CollectionConfig = {
slug: 'examples',
admin: {
useAsTitle: 'title',
},
fields: [
{
name: 'title',
type: 'text',
},
...TelephoneField({
name: 'telephone',
admin: {
placeholder: '+1 2133 734 253',
},
}),
],
}
export default ExamplesThe TelephoneField accepts the following parameters
-
overrides-TextFieldrequired fornameattribute -
config-Configoptional, allows for overriding attributes in the phone field-
internationaldefaults totrue| Forces international formatting -
defaultCountryaccepts a 2-letter country code eg.'US'| If defaultCountry is specified then the phone number can be input both in "international" format and "national" format -
countryaccepts a 2-letter country code eg.'US'| If country is specified then the phone number can only be input in "national" (not "international") format -
initialValueFormatIf an initial value is passed, and initialValueFormat is "national", then the initial value is formatted in national format -
withCountryCallingCodeIf country is specified and international property is true then the phone number can only be input in "international" format for that country -
countryCallingCodeEditable -
smartCaretWhen the user attempts to insert a digit somewhere in the middle of a phone number, the caret position is moved right before the next available digit skipping any punctuation in between -
useNationalFormatForDefaultCountryValueWhen defaultCountry is defined and the initial value corresponds to defaultCountry, then the value will be formatted as a national phone number by default -
countrySelectPropsunicodeFlagsdefaults tofalse| Set totrueto render Unicode flag icons instead of SVG images
-
import { CollectionConfig } from 'payload/types'
import { AlertBoxField } from '@nouance/payload-better-fields-plugin'
const Examples: CollectionConfig = {
slug: 'examples',
admin: {
useAsTitle: 'title',
},
fields: [
{
name: 'title',
type: 'text',
},
...AlertBoxField({
name: 'alert',
{
type: 'info',
message: 'Please be aware that the title is required for the mobile app.',
}
}),
],
}
export default ExamplesThe AlertBoxField accepts the following parameters
-
overrides-UIFieldrequired fornameattribute -
config-Configrequired-
type- a selection ofinfo|alert|errorwhich come with different styles -
message- required string -
className- optional string to help you style individual alerts better -
icon- optional, default is enabled-
enable- boolean, turn off the icon -
Element- React component to override the provided icon
-
-
If you want to make this field appear conditionally, you should use the field's admin conditional config as provided by Payload.
For development purposes, there is a full working example of how this plugin might be used in the dev directory of this repo.
git clone [email protected]:NouanceLabs/payload-better-fields-plugin.git \
cd payload-better-fields-plugin && yarn \
cd demo && yarn \
cp .env.example .env \
vim .env \ # add your payload details
yarn dev






