# Custom Controls

Airkit provides a way for a Builder to create their own customized [Web Controls](../../web-controls/web-controls-overview) which can then be used multiple times within an application. Simplistically, Custom Controls are an amalgamation of conventional, off-the-shelf Web Controls combined together to create Custom Controls. Creating Custom Controls allows for modularity of an application's Web Controls where components grouped together can be inserted rather than individual components of the Custom Control having to be repetitively inserted each time. Additionally, modifying the definition of the Custom Control will modify all instances of Custom Control allowing for ease of updating functionality.

One way of thinking of Custom Controls is to use hamburgers as an analogy. Defining a new Custom Control is akin to designing a custom hamburger - one can select all their desired ingredients from a menu of ingredients (existing Web Controls) and then order as many of them as they want.

The only difference being that with Custom Controls, if the hamburger is redesigned or updated (the definition of the Custom Control), all existing hamburgers will reflect these changes. This pattern is similar to those familiar with Object Oriented Programming.

![mceclip0.gif](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-2f67336b0cf85cae142d82d5ed0aa09351d4d9f7%2Fcustom-controls-v180-0.gif?alt=media)

#### Example of Custom Control

The below illustration shows an instance of a Custom Control that contains a Text Input which validates whether or not the input is a valid email address and displays a warning message if it isn't.  This example consists of a Label, a Text Input and a Label that displays a warning if the inputted value is not a valid email.

![organizing info](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-9034ea932c6f750f8d8be468a6f32cb7e25da76a%2Fcustom-controls-v180-1.png?alt=media)

The Custom Control saves the Builder from having to manually insert an email label, a text input and another label displaying each time - instead, another _instance_ of the Custom Control can be created. This pattern makes it convenient for a Builder to build modular, reusable, Web Controls instead of adding each set of Web Controls manually and duplicating the desired logic.

### Template Parameters

Like Web Pages, Custom Controls can have variables defined within them to store data. However, unlike Web Pages, care must be taken to ensure that the correct type of variable is defined (in addition to selecting the intended Data Type) depending on the intended use. It is important to note that this is not referring to the Data Type assigned to the variable.

&#x20;

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-903057c2e668dc4a041081b8ef0a7ba60a21b2f6%2Fcustom-controls-v180-2.png?alt=media)

####

Template Inputs > Template Variables

These are variables that can accept inputs from outside each instance of the Custom Controls. This is the desired variable type where data needs to be passed from the Web Page or Web Flow into the Custom Control.

In the below example, a variable named `email_label` has been created which expects a Text data type and if not passed any data, contains the Text of "Email:".

It should be noted that the `Is read-only` property determines whether or not the data within the variable can be modified `after first receiving data`.

* **Is read-only (checked)** - This allows for preset or placeholder logic or data to be stored in the variable. Data external to the Custom Control can be passed to this variable as a _reference_, and hence, it cannot be modified from within the Custom Control.
* **Is read-only (unchecked)** - This disallows preset or placeholder values to be stored in the variable. This setting allows the data outside the Custom Control _stored in external variables_ to be modified. Note that expressions that are passed to the Custom Control and are not stored in an external variable cannot be modified.

mceclip0.png

#### Theme Inputs

Theme Inputs allow a Variant to be passed through to the Custom Control which can then be passed through to the individual Web Controls. Applying a Variant to a Web Control within a Custom Control is a three-step process.\
First, the Theme Input variable must be defined along with the expected Data Type.

![organizing info](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-555505a48eaaef03e911150a0acd8277dff3ea5c%2Fcustom-controls-v180-3.png?alt=media)

Second, the Theme Input variable must be passed to the desired Web Control which can be accessed using the `input.` namespace.&#x20;

![organizing info](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-f45ff7e1498896629ca094bcbbd6c77c2b664689%2Fcustom-controls-v180-4.png?alt=media)

Third, the Variant Substitution must take place on the instance of the desired Custom Control under the **style** object.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-d5ed7570f9bb9f89054e990a94fc73819a09fc9a%2Fcustom-controls-v180-5.png?alt=media)

&#x20;                       &#x20;

By default, the Web Controls within a Custom Control will take on the selected Variant when defining the Web Control in the Custom Control.

#### Template Slots

Template Slots allow for Web Controls to be added within instances of a Custom Control.&#x20;

As the name implies, the Template Slot behaves like a Container - other Web Controls can then be created within it. To achieve the aformentioned functionality, a builder must follow these three steps:

First, create the Template Slot variable when defining the Custom Control:

![organizing info](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-d7fca45edbe22abf0cf741963a0fc7cca56c54d3%2Fcustom-controls-v180-6.png?alt=media)

Second, add the Template Slot on the instance of the Custom Control.

![organizing info](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-7e39caf7a1aa69f481a130393720a8a311c530fd%2Fcustom-controls-v180-7.png?alt=media)

Third, add the desired controls to the new Template Slot

#### Control Variables

Control Variables are useful when a Builder only seeks to store data pertaining only to functionality within the Custom Control that does not need to be accessed outside it.&#x20;

![organizing info](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-6cb83f6fbd49ba7ef88f456d17c6a62ec8ac5331%2Fcustom-controls-v180-8.png?alt=media)

An example of this would be a variable used to store whether or not the input on a text input is valid - this fact is unlikely to be relevant outside the Custom Control as it is only used to display a warning label within the Custom Control without serving any other purpose.

Control Variables can be preset with values that will be set for each instance of the Custom Control, but can never be modified from outside the scope of the Custom Control.

### Creating an Email Validation Custom Control

#### Creating the Custom Control

When working with Custom Controls, its helpful to understand the difference between _defining_ _the_ Custom Control and _instantiating a_ Custom Control.  For those who are familiar with Object Orientated Programming, this pattern is similar to defining Classes and creating instances (Objects) of them.

Custom Controls are defined in Studio under the Advanced Tab within the [Tree](../../studio/studio).&#x20;

To create a new Custom Control, within **Web Flows Builder** > **Advanced** > **My Controls**, click on the **+** to add a new Custom Control .&#x20;

![organizing info](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-448b4167c80d0c34f1e985f0c227620b3a5a7348%2Fcustom-controls-v180-9.png?alt=media)

A new Custom Control will appear with a container, in which Web Controls can be defined . This is similar to to how Web Controls would usually be added to a Web Page.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-ff89d52febc99d8ea2123c6108805fa0cb2bae24%2Fcustom-controls-v180-10.png?alt=media)

After Custom Controls have been defined, instances can then be created in the same way as conventional Web Controls under the Custom category when adding Controls on a Web Page.&#x20;

\[block:image] { "images": \[ { "image": \[] } ] } \[/block]

#### Email Validation Example

The following example shows the creation of a basic Custom Control which contains three Web Controls and some inputs:

1. A text input where an App User can enter an email address.&#x20;
2. A customizable label just above the text input.  By default this label, displays the text of "Email:".  However, the Custom Control can also accept a Text input to change the displayed value to something like "User Email:", for example.
3. A label that only appears if the User-inputted value is not a valid email address which requests the App User to enter a valid email address

This Custom Control will also accept styling Variants so that the App Builder can ensure that it fits the application's styling.

First, add a Label to the Custom Control, followed by a Text Input and another Label. The Custom Control should then look like the following example.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-93d32c2f7adfd5a61aa47c8007ef9e0550313cb8%2Fcustom-controls-v180-11.png?alt=media)

Next, program the first Label to display the text of **"Email:"** and accept inputs for it to be customized for each instance. Select the Custom Control on the Tree and add a **Template Variable** and name it `email_label` and pass the value of **"Email:"** to it.  It should be noted that the `Is read-only` value simply means that once the value has been set, it cannot be modified.  Use the expression editor for the label within the Inspector to pass the `email_label` variable to it.

Next, add another Template Variable named `email_input` Template Variable and have this bound to the Email Input by selecting it on the Tree or Stage and setting the Data Binding to `email_input`.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-2836230e02e3ba410eda6167bf1ff9d535597261%2Fcustom-controls-v180-12.png?alt=media)

To pass a Variant to the Custom Control, a Theme Input must be defined. Click on the '+' icon under **Theme Inputs** to add a new one and select Label Variant.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-01fb9b612c234f682459bf3c96d9a661ad020cf9%2Fcustom-controls-v180-13?alt=media).png)

Pass a name for the variable into the Name field and call it `styling_input`, for example.

![organizing info](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-5f1ef955e26dd9a1f3137bee29fdc5af68d41346%2Fcustom-controls-v180-14.png?alt=media)

Next, add a Control Variable to mark whether or not the value is a valid email address. Keep in mind that Control Variables cannot be modified from outside the Custom Control and should only be used for locally-needed values. Our case of `is_valid_email` is a good example of a value that only needs to be known locally within this Custom Control.

![organizing info](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-27118155a61cc903f1a0f67b0263dc63454b754e%2Fcustom-controls-v180-15.png?alt=media)

The text input should then be bound to the new `email_input`  Template Variable by selecting the Text Input on the Stage or Tree and setting the Data Binding value to `email_input`. Note that Airkit's auto-complete will provide you with the list of available variables within the scope of the Custom Control.

![organizing info](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-d2c8642b2a8eb1e4c278e323a48a60dff94c796b%2Fcustom-controls-v180-16.png?alt=media)

Next, change the styling of the warning label so that the text appears red in color (2g)&#x20;

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-01fb9b612c234f682459bf3c96d9a661ad020cf9%2Fcustom-controls-v180-17?alt=media).png)

Next, set the `Is Visible` property to change the text to be **"Enter valid email address".**

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-d08b6156b3d11e7045a5d6308884d013873d35ad%2Fcustom-controls-v180-18.png?alt=media)

Next, program the Text Input with a Set Variable action the input On Blur (when the app user clicks away from the Text Input) with the code of `IF(ISEMAIL(email_input), TRUE, FALSE)`&#x20;

![organizing info](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-ba068cfc2832b4e39f8ba39cd8dba40b92f38bdd%2Fcustom-controls-v180-19.png?alt=media) ![organizing info](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-9e875c85e45308323f6ebae2dae1dfbbde0398a2%2Fcustom-controls-v180-20.png?alt=media)

Once all of this has been set, multiple instances of this Custom Control can be instantiated within the Airkit App.

### Custom Control Styling

Newly created Web Controls are set with the selected Variant upon definition.  In many cases, Web Controls only have one, default Variant.

Custom Controls can also receive Variants within Theme Inputs (see above) which must be defined under Template Parameters > Theme Inputs. In the below example, a input variable of `label_example` has been defined for the Custom Control.&#x20;

![organizing info](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-aa974a4f94a629f50e80026e0b415c9e888831fe%2Fcustom-controls-v180-21.png?alt=media)

This allows for a styling Variant to be passed to **each created instance** of the Custom Control, as shown in the below example.

![](https://2093598723-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FC2DgLBPTrwoEhWaU24LL%2Fuploads%2Fgit-blob-01fb9b612c234f682459bf3c96d9a661ad020cf9%2Fcustom-controls-v180-22?alt=media).png)
