# Form component Shows a Form from APS (see it live: [Form Quickstart](https://embed.plnkr.co/YSLXTqb3DtMhVJSqXKkE/)) ## Contents - [Basic Usage](#basic-usage) - [Properties](#properties) - [Advanced properties](#advanced-properties) - [Events](#events) - [Details](#details) - [Custom empty form template](#custom-empty-form-template) - [Controlling outcome execution behaviour](#controlling-outcome-execution-behaviour) - [Field Validators](#field-validators) - [Other documentation](#other-documentation) - [Common scenarios](#common-scenarios) - [See also](#see-also) ## Basic Usage ```html ``` **Display form instance by task id:** ```html ``` For an existing Task both form and values will be fetched and displayed. **Display form definition by form id:** ```html ``` Only form definition will be fetched. **Display form definition by form name:** ```html ``` **Display form definition by ECM nodeId:** In this case the metadata of the node are showed in an activiti Form. If there is no form definied in activiti for the type of the node, a new form will be automaticaly created in Activiti. ```html ``` **Display form definition by form name, and store the form field as metadata:** The param nameNode is optional. ```html ``` **Display form definition by ECM nodeId:** In this case the metadata of the node are shown in an activiti Form, and store the form field as metadata. The param nameNode is optional. ```html ``` ### Properties | Name | Type | Default value | Description | | ---- | ---- | ------------- | ----------- | | form | `FormModel` | | Underlying form model instance. | | taskId | `string` | | Task id to fetch corresponding form and values. | | nodeId | `string` | | Content Services node ID for the form metadata. | | formId | `string` | | The id of the form definition to load and display with custom values. | | formName | `string` | | Name of the form definition to load and display with custom values. | | saveMetadata | `boolean` | `false` | Toggle saving of form metadata. | | data | `FormValues` | | Custom form values map to be used with the rendered form. | | path | `string` | | Path of the folder where the metadata will be stored. | | nameNode | `string` | | Name to assign to the new node where the metadata are stored. | | showTitle | `boolean` | `true` | Toggle rendering of the form title. | | showCompleteButton | `boolean` | `true` | Toggle rendering of the `Complete` outcome button. | | disableCompleteButton | `boolean` | `false` | If true then the `Complete` outcome button is shown but it will be disabled. | | disableStartProcessButton | `boolean` | `false` | If true then the `Start Process` outcome button is shown but it will be disabled. | | showSaveButton | `boolean` | `true` | Toggle rendering of the `Save` outcome button. | | showDebugButton | `boolean` | `false` | Toggle debug options. | | readOnly | `boolean` | `false` | Toggle readonly state of the form. Forces all form widgets to render as readonly if enabled. | | showRefreshButton | `boolean` | `true` | Toggle rendering of the `Refresh` button. | | showValidationIcon | `boolean` | `true` | Toggle rendering of the validation icon next to the form title. | | fieldValidators | `FormFieldValidator[]` | `[]` | Contains a list of form field validator instances. | ### Events | Name | Type | Description | | ---- | ---- | ----------- | | formSaved | `EventEmitter` | Emitted when the form is submitted with the `Save` or custom outcomes. | | formCompleted | `EventEmitter` | Emitted when the form is submitted with the `Complete` outcome. | | formContentClicked | `EventEmitter` | Emitted when form content is clicked. | | formLoaded | `EventEmitter` | Emitted when the form is loaded or reloaded. | | formDataRefreshed | `EventEmitter` | Emitted when form values are refreshed due to a data property change. | | executeOutcome | `EventEmitter` | Emitted when any outcome is executed. Default behaviour can be prevented via `event.preventDefault()`. | | onError | `EventEmitter` | Emitted when any error occurs. | ## Details All `form*` events receive an instance of the `FormModel` as event argument for ease of development: **MyView.component.html** ```html ``` **MyView.component.ts** ```ts onFormSaved(form: FormModel) { console.log(form); } ``` ### Custom empty form template You can add a template that will be show if no form definition has been found ```html

Empty form

``` ### Controlling outcome execution behaviour If absolutely needed it is possible taking full control over form outcome execution by means of `executeOutcome` event. This event is fired upon each outcome execution, both system and custom ones. You can prevent default behaviour by calling `event.preventDefault()`. This allows for example having custom form validation scenarios and/or additional validation summary presentation. Alternatively you may want just running additional code on outcome execution without suppressing default one. **MyView.component.html** ```html ``` **MyView.component.ts** ```ts import { FormOutcomeEvent } from '@alfresco/adf-core'; export class MyView { validateForm(event: FormOutcomeEvent) { let outcome = event.outcome; // you can also get additional properties of outcomes // if you defined them within outcome definition if (outcome) { let form = outcome.form; if (form) { // check/update the form here event.preventDefault(); } } } } ``` There are two additional functions that can be of a great value when controlling outcomes: - `saveTaskForm()` - saves current form - `completeTaskForm(outcome?: string)` - save and complete form with a given outcome name **Please note that if `event.preventDefault()` is not called then default outcome behaviour will also be executed after your custom code.** ### Field Validators You can supply a set of validator objects to the form using the `fieldValidators` property. Each validator implements checks for a particular type of data (eg, a date validator might check that the date in the field falls between 1980 and 2017). ADF supplies a standard set of validators that handle most common cases but you can also implement your own custom validators to replace or extend the set. See the [FormFieldValidator](FormFieldValidator.md) class for full details and examples. ## Other documentation ### Common scenarios #### Changing field value based on another field Create a simple Form with a dropdown widget (id: `type`), and a multiline text (id: `description`). ```ts formService.formFieldValueChanged.subscribe((e: FormFieldEvent) => { if (e.field.id === 'type') { const fields: FormFieldModel[] = e.form.getFormFields(); const description = fields.find(f => f.id === 'description'); if (description != null) { console.log(description); description.value = 'Type set to ' + e.field.value; } } }); ``` You subscribe to the `formFieldValueChanged` event and check whether event is raised for the `type` widget, then you search for a `description` widget and assign its value to some simple text. The result should be as following: ![](docassets/images/form-service-sample-01.png) #### Listen all form Events If you want to listen all the events fired in the form you can subscribe to this Subject : ```ts formService.formEvents.subscribe((event: Event) => { console.log('Event fired:' + event.type); console.log('Event Target:' + event.target); }); ``` ## See also - [Stencils](stencils.md) - [FormFieldValidator](FormFieldValidator.md) - [Extensibility](extensibility.md) - [Form rendering service](form-rendering.service.md) - [Form field model](form-field.model.md)