UNPKG

formio-sfds

Version:
214 lines (169 loc) 7.83 kB
--- 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