For Dashboard Designers Reference InputView
Wednesday, May 22, 2024 9:28 AMInputView (beta version)
Label: :IA_Function
Property: type: InputView
Inherits from: Function and View
The InputView Function creates HTML dynamic forms based on a defined schema.
The form can consist of various input widgets such as text boxes, textareas, file widgets, dropdowns, action and submit buttons. Changes on input widgets and presses on action buttons trigger events, which the users can use for their custom logic.
Please note that this is currently in BETA version so you should expect future breaking changes.
Parameters
InputView is build on top of the VueFormGenerator library.
The schema
and data
(model
in VueFormGenerator) parameters are being relayed to VueFormGenerator and are well-documented in the official documentation.
Key | Description | Default value | Possible values |
---|---|---|---|
data |
Initial values and data structure for the form's input fields (model in VueFormGenerator) |
Object | |
schema |
Form fields description | Object | |
options |
Additional options for the forms behaviour (see) | Object | |
updateDelay |
Amount of delay time in milliseconds before form change events are fired |
500 | Positive Number |
Changes to the official schema
Available optional fields
The optional fields that are available in Graphileon are:
- cleave - Format input text content when you are typing
- image - Image select field (URL or upload in base64 string)
- selectEx - Select list
- rangeSlider - Range slider
- spectrum - Color picker
- switch - Switch field (toggle two values (on/off, yes/no, active/inactive)
fields
and buttons
as objects
Following the official documentation fields
should be an array (of field declarations). In order to make schema updates easier, in Graphileon, you can declare fields
alternatively as an object. This way you can name (key) fields and target them with trigger updates (ex: $schema.fields.myField.options
instead of $schema.fields.0.options
).
This is also the case for field buttons. You can set the buttons
property as an object, instead of an array
.
button
Additional properties
Key | Description | Default value | Possible values |
---|---|---|---|
action |
Value used to trigger-match the button (this value is present on the trigger as (%).action when the button is clicked). See example for the submit field |
String |
Removed properties
The onSubmit
property is set internally by Graphileon to trigger the submit
event, so you should not set this property in the field declaration because it will be overwritten.
submit
Additional properties
Key | Description | Default value | Possible values |
---|---|---|---|
action |
Value used to trigger-match the button (this value is present on the trigger as (%).action when the button is clicked). See example bellow | String |
|
disableOnClick |
If enabled, disables the field to prevent reuse. | false |
true / false |
throttle |
Number of milliseconds the field will be temporarily disabled after every use. | integer |
Example for action
For the field:
save: {
type: 'submit',
buttonText: 'Save',
action: 'save'
}
the submit
event will be:
{
type: "submit",
action: "save",
field: {...},
data: {...},
isValid: true,
errors: [...]
}
and trigger will be:
{
type: "submit",
action: "save",
...
}
Removed properties
The onclick
property is set internally by Graphileon to trigger the button
event, so you should not set this property in the button's declaration because it will be overwritten.
validateAsync
and validateDebounceTime
settings are ignored because the change
event validates the form everytime it's triggered. Set updateDelay
parameter to the number of milliseconds to wait before an update (and validation) is triggered.
Customization of validation messages
This page of the official VueFormGenerator documentation shows how to customize validation messages. This will not work in Graphileon.
To customize validation messages, in Graphileon, set the validator
property of the field as an object similar to:
{
...// other field properties
validator: {
validator: "string",
messages: {
fieldIsRequired: "The password is required!",
textTooSmall: "Password must be at least {1} characters"
}
}
}
Showing multiple fields on the same line
Normally the view displays one input field per line. To split a line between multiple fields:
- The space will be distributed using the 12 column grid system
- Make sure the field definitions are adjacent
- In each field definition add
"styleClasses": "col-<x>"
(replace<x>
with a number from 1 to 12 representing the number of columns the field should occupy)
Additional field types
fileRead
fileRead
can be used to load contents of local text files (CSV, JSON, TXT, etc.) into the application (frontend) without uploading them to a server.
This field is not intended to be used with binary files (images, sounds, fonts, executables, etc.).
To customize the behaviour of the fileRead
use the following properties in the field's schema
:
Key | Description | Default value | Possible values |
---|---|---|---|
allowedMimeTypes |
MIME types allowed for the file selected for read. If empty any MIME type is allowed | [] |
Array of Strings |
deniedMimeTypes |
MIME types not allowed for the file selected for read. | [] |
Array of Strings |
maxSize |
Maxmimum allowed size in bytes for the file selected for read | Infinity |
Number |
minSize |
Minimum allowed size in bytes for the file selected for read | 0 |
Number |
icon |
FontAwesome icon to show on the button to select the file. | folder-open |
string as icon identifier/class |
fileUpload
fileUpload
is an URL input type field with an additional Upload button. Using the button one can upload a file to a preselected location (URL). If the upload finishes successfully, the input will be updated with the location (download URL) of the uploaded file.
To customize the behaviour of the uploadField
use the following properties in the field's schema
:
Key | Description | Default value | Possible values |
---|---|---|---|
allowedMimeTypes |
MIME types allowed for the file selected for upload. If empty any MIME type is allowed | [] |
Array of Strings |
deniedMimeTypes |
MIME types not allowed for the file selected for upload. | [] |
Array of Strings |
editable |
Enables the ability to manually edit (or paste) the URL to the field | false |
false / true |
fileKey |
Key used for the uploaded file in the POST-ed (upload) form data | file |
nonempty string |
formData |
Addional data sent in the upload process. This data is send along with the file ({<fileKey>: <file-content>, ...formData} ) to the upload endpoint |
null |
Object |
maxSize |
Maxmimum allowed size in bytes for the file selected for upload | Infinity |
Number |
minSize |
Minimum allowed size in bytes for the file selected for upload | 0 |
Number |
params |
Parameters used for the upload process. See jQuery Ajax settings. This allowes maximum customization of the upload process if needed. | {type: 'POST', url: '/api/file/create', processData: false, contentType: false, crossDomain: true, dataType: 'json'} |
Object |
urlFromResponse |
Path to the download URL in the upload response or function used to calculate the download URL from the response | data.download_link |
Object path as String or Function(response) |
errorFromResponse |
Function called to customize the error message when the upload fails | null |
function(XHR) |
separator
separator
field type can be used to add a horizontal line to better visually separate two fields or two field sets.
treeSelect
treeSelect
field is a select type input field with complex functionalities like: list select, tree dropdown select, multiple select, tag like selected values, normal and asynchronous search. It is built on top of the VueTreeselect library. There you can find the structure of the option records and also all the properties that can be configured for this field type.
Customize label of selected treeSelect options
The options for treeSelect
can have the selectedLabel
optional property. This can be used to customize the option's label when it is displayed in the selected options area.
jsonViewer
The jsonViewer
field is an input field with powerful view options like showing structured JSON data with a value edit option or read-only. It is built on top of the Vue JSON Viewer library. There you can find the properties of jsonViewer.
Events
An InputView can emit the following events:
Each of these events generates its own event data object. The structure of these event data objects is given below.
Type: change
Occurrence: Triggered when a user changes the data of any input field on the form.
Additional event properties (besides the inherited properties):
Key | Description | Possible values |
---|---|---|
data |
Full data of the form | Object |
fieldKey |
Key of the field as defined in the schema | String |
fieldPath |
Path to the schema field definition | Array of string |
isValid |
Specifies if the data validation was successfull | Boolean |
key |
The name of input field on which the change has occurred. Value is the model property of the field definition which corresponds to the key (or path to the property) of the resulting data structure |
String |
oldValue |
Previous value of the changed form field | any |
value |
Current updated value of the changed form field | any |
Type: submit
Occurrence: Triggered when a user clicks on a submit button.
Additional event properties (besides the inherited properties):
Key | Description | Possible values |
---|---|---|
action |
action property value of the used button (field) |
String |
data |
Full data from the form. | Object |
errors |
List of errors generated during data validation | Array of objects |
field |
Whole field definition of the used submit button | Object |
fieldKey |
Key of the field as defined in the schema | String |
fieldPath |
Path to the schema field definition | Array of string |
isValid |
Specifies if the data validation was successfull | Boolean |
Type: button
Occurrence: Triggered when a user clicks on a field button (other than a submit).
Additional event properties (besides the inherited properties):
Key | Description | Possible values |
---|---|---|
action |
action property value of the used button |
String |
button |
Whole field definition of the used button | Object |
data |
Full data from the form. | Object |
errors |
List of errors generated during data validation | Array of objects |
isValid |
Specifies if the data validation was successfull | Boolean |
Type: treeSearch
Occurrence: Triggered when a user uses the search functionality of a treeSelect
field that has async: true
. This event is used to trigger asynchronous (or server side) options searching or filtering.
Additional event properties (besides the inherited properties):
Key | Description | Possible values |
---|---|---|
data |
Full data from the form. | Object |
errors |
List of errors generated during data validation | Array of objects |
field |
Whole field definition of the used treeSelect field | Object |
fieldKey |
Key of the field as defined in the schema | String |
fieldPath |
Path to the schema field definition | Array of string |
isValid |
Specifies if the data validation was successfull | Boolean |
search |
Search string entered by the user | String |
Asynchronous options search for treeSelect
(with async
: true
)
To set the result of the search you need to update, with a trigger, the field's options
and forSearch
properties. options
should receive the list of options and forSearch
the original search string.
For example if the user typed opt
on a treeSelect
field named search
the updating trigger (to the InputView
) should be:
{
"type": "success", // may vary
"$_instance": "_previous",
"$schema.fields.search.options": (%).data,
"$schema.fields.search.forSearch": (%)._path.search
}
Having:
(%).data: [{id: 1, label: 'option 1'}, {id: 2, label: 'option 2'}, ...] // result of the search
(%)._path.search: 'opt' // what user searched for; search property of the treeSearch event
Example InputView
setup
Below is an example InputView setup used for the Quick Search functionality.
{
"type": "InputView",
"$data": "evaluate({
store: 'application',
entity: 'node',
labels: [],
type: null,
property: null,
value: null,
limit: 50
})",
"$schema": "evaluate({
fields: {
store: {
type: "select",
label: "Store",
model: "store",
required: true,
hideNoneSelectedText: true,
values: map(
filter((@).stores,{type: 'neo4j'}),
(store) => ({id: store.name, name: store.name})
)
},
entity: {
type: "radios",
label: "Find",
model: "entity",
required: true,
hideNoneSelectedText: true,
values: [
{value: "node", name: "Nodes"},
{value: "relation", name: "Relationships"}
]
},
labels: {
type: "treeSelect",
label: "With Labels",
model: "labels",
multiple: true,
placeholder: '',
async: true,
cacheOptions: false,
clearOnSelect: true,
options: []
},
type: {
type: "treeSelect",
label: "With Type",
model: "type",
placeholder: '',
cacheOptions: false,
visible: false,
async: true,
options: []
},
property: {
type: "treeSelect",
label: "Has Property",
model: "property",
async: true,
cacheOptions: false,
disableFuzzyMatching: true,
options: [],
placeholder: '',
},
value: {
type: "input",
inputType: "text",
label: "Has Value",
model: "value"
},
limit: {
type: "input",
inputType: "number",
label: "Limit",
model: "limit",
value: 50,
min: 0,
required: true
},
submit: {
type: "submit",
buttonText: "Show",
buttons: [
{
label: 'Reset',
action: 'reset'
},
{
label: 'Cancel',
action: 'cancel'
}
]
}
}
})",
"name": "Quick Find"
}