formio-sfds
Version:
The Form.io theme for sf.gov
214 lines (169 loc) • 7.83 kB
Markdown
---
title: Patches
---
# Patches to formio.js
## Form options
Our patched version of `Formio.createForm()` adds support for the following
options:
#### `page` option
This sets the initial page of the form by its index (position) in the list of
_visible_ pages starting from 1 (the first page, 2 is the second, and so
on). Also note:
- The [`data` option](#data-option) is applied before `page`, so if the desired
page is conditionally hidden you will need to also provide data that will
satisfy the conditions.
- The [`focus` option](#data-option) is applied _after_ `page`, and will override
the page selection if the focused component is on a different page.
#### `focus` option
This attempts to focus a specific component by its unique "key" once it's
loaded. Use this when testing validations on a specific field, or to scroll to
a specific part of the form. Also note:
- The [`data` option](#data-option) is applied before `focus`, so if components
(or their pages) are conditionally hidden you may need to pass data that will
satisfy the conditions.
- The [`page` option](#data-option) is applied before `focus`, but you shouldn't
need to use both because the form will set the initial page automatically in
order to focus the right component.
#### `data` option
If provided, the `data` option will be passed along as the form's initial
submission. See also: the [`prefill` option](#prefill-option).
#### `googleTranslate` option
If `googleTranslate` is `false`, the `translate="no"` attribute and
`notranslate` class are added to the form element wrapper to prevent Google
Translate from touching it. This is preferable (but not required!) when
translations are provided via the `i18n` option, since Google Translate will
attempt to translate any element that _doesn't_ have the `notranslate` class,
and may replace a human translation with a machine translation.
#### `i18n` option
If the `i18n` option is a string, it's treated as a JSON URL from which to
load localizations (translations of form content and field info). See [the
localization docs](./localization.md) for more info.
#### `hooks` option
If the `hooks` option is an object, any value that isn't a function is
converted to a [declarative action](#declarative-actions). See formiojs's
[hooks documentation](https://github.com/formio/formio.js/wiki/Form-Renderer#hooks)
for the list of available hooks.
#### `on` option
Like `hooks`, the `on` object can be used to specify [declarative
actions](#declarative-actions) for any of formiojs's
[known form events](https://github.com/formio/formio.js/wiki/Form-Renderer#events).
#### `prefill` option
The `prefill` option allows you to pre-fill form inputs with submission
data:
* The value `querystring` will cause pre-fill values to be parsed from
`window.location.search`. E.g. `?foo=bar` will initialze the form
submission as `{foo: 'bar'}`.
* The value `hash` will cause pre-fill values to be parsed from
`window.location.hash` (afer the leading `#`), so `#foo=bar` will
initialize the form submission as `{foo: 'bar'}`.
* Otherwise, if `prefill` is an instance of [URLSearchParams], the form
submission will be initialized using its entries.
#### `formioSFDSOptOut` option
Setting the `formioSFDSOptOut` option to `true` disables all of the following
customizations for your form:
* Scoped style modifications. **Note:** template modifications can't be opted
out because they're provided at the theme level, so you'll need to style the
selectors generated by [this theme's templates](src/templates), not the
built-in ones!
* Select components will not be rendered as plain old `<select>` elements by
default, and the `autocomplete` tag will be ignored.
* Custom [event handlers](#on-option) will not be registered.
* The [`prefill` option](#prefill-option) will be ignored.
## Form upgrades
Unless otherwise noted, all of the upgrades below can be opted out of with the
[`formioSFDSOptOut` option](#formiosfdsoptout-option).
* Detects the form rendering language (locale) by looking for the closest
element with a `lang` attribute.
* Select components are made to always use the `html5` "widget" (an HTML
`<select>` element), _unless_ the `autocomplete` tag also exists on the
component (if `component.tags.include('autocomplete')`).
* Form elements are wrapped in `<div class="formio-sfds">`, which allows the
element itself to receive styles defined in the [scoped CSS](#scoped-css).
* All components get `validateOn: 'blur'`, which defers validation of fields
until the input is blurred. The default is `change`, which triggers
validation whenever an input changes, and can trigger disruptive validation
errors while the user is typing.
## Declarative actions
The `hooks` and `on` options allow you to customize form behaviors using a
limited vocabulary of "declarative" actions. Each key of these objects is
the name of a hook or event, and its value is an object with a single key
that corresponds to one of the following actions:
* `redirect` takes either a URL string or an object with a `url` key and
redirects (by setting `window.location`) to the URL. Submission data
values may be interpolated in the redirect URL as `{key}`, where `key` is
the API key of the form input. For example:
```json
{
"on": {
"submit": {
"redirect": "/confirm?username={username}"
}
}
}
```
* `validateWithService` passes the submission data to an HTTP web service
for validation. The `url` is the URL of the web service, and may contain
form value interpolations (e.g. `{username}` expands to
`form.submission.data.username`), `method` tells it the HTTP verb
(default: `POST`), and `messages` is an optional object containing custom
messages for different types of errors, such as
`{empty: "error message if the response was empty"}`. For instance, you
might wish to validate a username field via an external service that
would respond with an error if the provided username is already taken:
```json
{
"hooks": {
"beforeSubmit": {
"validateWithService": {
"url": "https://some-validation-service.example.com/username/{username}"
}
}
}
}
```
If the web service fails, _or_ if it's successful and the response JSON
has an `errors` or `error` key, those are reported as errors and will
abort `beforeSubmit` hooks.
* `values` validates submissions by comparing the value of the submission
data with each key in the `values` object. For instance, to ensure that
the `foo` form input has a value of `"bar"` before submission:
```json
{
"hooks": {
"beforeSubmit": {
"values": {
"foo": "bar"
}
}
}
}
```
## Icons
SFDS icons are rendered using [selector observer](https://github.com/josh/selector-observer)
to replace the contents of elements with a `data-icon` attribute with the
corresponding SVG icon at runtime, i.e. turning this:
```html
<span data-icon="next" aria-label="Next"></span>
```
into this:
```html
<span data-icon="next" aria-label="Next">
<svg ...></svg>
</span>
```
FontAwesome icons (any element with an `fa-*` class name) rendered by Formio
have the `data-icon` attribute icon added, which in turn triggers the SVG icon
insertion described above, turning this:
```html
<i class="fa-info some-class"></i>
```
into this:
```html
<i data-icon="info" class="some-class">
<svg ...></svg>
</i>
```
See [icons in Figma] and [the source](../src/icons/index.js) for a full list of
valid `data-icon` attribute values.
[icons in Figma]: https://www.figma.com/file/Eyr2mvPBRMkkecBmbkkGogvP/Assets?node-id=38%3A8
[URLSearchParams]: https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams