Interaction with Users

.. in Webix Apps
View Events
-
properties
- what do they look like?
-
methods
- what do they do?
-
events
- what happens?
View Events
-
view events
- onItemClick for button, list
- onAfterRender for all components
-
'global' Webix events
- onClick
- onRotate
-
native HTML events
- window.onresize
- input.onchange
Handling View Events
1) attachEvent(name, handler)
$$("mylist").attachEvent("onItemClick", function(){
webix.message("Item was clicked");
});2) on property in configuration
{
view:"list",
data:[ "Start", "Data", "Profile" ],
on:{
onItemClick:function(id){
webix.message("Item was clicked "+id);
}
}
}3) click property in configuration (for controls)
{ view:"button", value:"Click me", click:function(){
webix.message("Button was clicked");
}}* Event names are case-insensitive
* 'this' keyword within handler function points to the view, which event is handled
attachEvent or on?
1) The moment of handler definition
- attachEvent --> AFTER view creation
- on --> BEFORE view creation
webix.ui({
view:"list",
id:"mylist",
data:[ "Start", "Data", "Profile" ]
});
$$("mylist").attachEvent("onAfterRender", function(){
webix.message("List was rendered");
});Result: event will not fire on 1st render
2) Possibility to remove handler at runtime
- attachEvent: handler can be detached
- on: handler cannot be removed until view is destroyed
Handling Webix Global Events
Just webix.attachEvent
webix.attachEvent("onClick", function(){
webix.message("Mouse click detected");
});Handling HTML Events
webix.event (node, event, handler);
webix.event(window, "resize", function(){
webix.message("Window was resized");
});- event names come without on- prefix
-
webix.event is cross-browser. It calls
- node.addEventListener for normal browsers
- node.attachEvent for IE8
webix.event(document.getElementById("test"), "click", function(){
webix.message("Test div was clicked");
});webix.event($$("mylist").getNode(), "click", function(){
webix.message("List was clicked");
});Removing Event Handlers
var event2 = webix.event(window, "resize", function(){
webix.message("Window was resized");
});
webix.eventRemove(event2);var event1 = $$("mylist").attachEvent("onItemClick", function(){
webix.message("Item was clicked");
});
$$("mylist").detachEvent(event1);
attachEvent() --> detachEvent()
webix.event() --> webix.eventRemove()
config.on --> no way till view destruction :(

Any questions?
Interactive Dialogs
- Window
- Popup
- webix.alert
- webix.confirm
- webix.prompt
- webix.message
Messages
- webix.alert
webix.message({
text:"Please, fill in the form",
type:"error",
expire:-1
}); webix.message("Please, fill in the form"); webix.alert("Please, fill in the form"); webix.alert({
text: "Please, fill in the form",
title:"Attention"
}).then(function(){
/* some actions */
});- webix.message


Confirmation Dialog
- webix.confirm
webix.confirm("Form is incomplete. Continue?"); webix.confirm({
title:"Form is incomplete",
text:"Do you still want to continue?"
}).then(
function(){
webix.message("Confirmed");
},
function(){
webix.message("Rejected");
}
);
Prompt Dialog
- webix.prompt
webix.prompt("Please, enter you age.."); webix.prompt({
title: "Hi, bro",
text: "Please enter your name..",
ok: "Submit",
input:{
required:true
}
}).then(
function(result){
webix.message("Nice to meet you, "+result+"!");
},
function(){
webix.message("See you next time :(");
}
); 
Windows and Popups
webix.ui({
view:"window",
id:"mywindow",
height:250,
width:300,
position:"center",
move:true,
head:"My window",
body:{
template:"Some text"
}
}).show(); var win = webix.ui({
view:"window", id:"mywindow"
});
win.show();
//or
$$("mywindow").show();
Windows and Popups
webix.ui({
view:"window",
id:"mywindow",
move:true,
position:"center",
head:{
cols:[
{},
{ view:"icon", icon:"wxi-close" }
]
},
body:{
view:"datatable",
autoConfig:true,
autoheight:true,
autowidth:true,
data:[]
}
});
$$("mywindow").show();
//near some HTML element
$$("mywindow").show(node);
$$("mywindow").hide();Show window
Hide window
Close window
$$("mywindow").close();Getting User Data: Form
What does this form consist of?
{
view:"form",
width:280,
elements:[ // rows
{ type:"section", template:"Edit films"},
{ view:"text", label:"Title"},
{ view:"text", label:"Year"},
{ view:"text", label:"Rating"},
{ view:"text", label:"Votes"},
{ cols:[
{view:"button", css:"webix_primary",
value:"Add new"},
{view:"button", value:"Clear"}
]},
{}
]
}What other form elements can we use?

Form Elements
- getValue() and setValue() methods
- name property in configuration (you need to provide it)
To become form element, view needs:
{
view:"form",
elements:[
{ type:"section", template:"Edit films" },
{ view:"text", label:"Title", name:"title" },
{ view:"text", label:"Year", name:"year" },
{ view:"text", label:"Rating", name:"rating" },
{ cols:[
{ view:"button", css:"webix_primary", value:"Add new" },
{ view:"button", value:"Clear" }
]},
{}
]
}Magic of Element Name
- accessing controls via form.elements
{
view:"form",
id:"myform",
elements:[
{ view:"text", label:"Title", name:"title" },
{ view:"text", label:"Year", name:"year" },
{ view:"text", label:"Rating", name:"rating" }
]
}var titleInput = $$("myform").elements.title;
titleInput.setValue("");
- form setValues() and getValues() methods
$$("myform").setValues({
title:"My favourite film",
year:"2000",
rating:"125478"
});- can be validated within form
Form Values
- form can store any json
{
view:"form",
id:"myform",
elements:[
{ view:"text", label:"Title", name:"title" },
{ view:"text", label:"Year", name:"year" },
{ view:"text", label:"Rating", name:"rating" }
]
}$$("myform").setValues({
title:"My Firm",
year:"2000",
notes:"Watch next week"
});
console.log($$("myform").getValues());
/*
{
title:"My Firm",
year:"2000",
notes:"Watch next week"
}
*/Form API
- clear removes values from all elements
$$("myform").clear();- getFormView() of an element returns Form instance
var titleInput = $$("myform").elements.title;
var form = titleInput.getFormView();- setValues/getValues work with values
- elementsConfig sets common settings for elements
{
view:"form",
id:"myform",
elements:[
{ view:"text", label:"Title", name:"title" },
{ view:"text", label:"Year", name:"year" }
],
elementsConfig:{
labelPosition:"top"
}
}Form Events
- onChange for elements
* can be set via elementsConfig
{
view:"form",
elements:[
{ view:"text", label:"Title", name:"title", on:{
onChange:function(newv, oldv){
webix.message(newv);
}
}},
{ view:"text", label:"Year", name:"year"}
]
}- onChange for Form
{ view:"form", on:{
onChange:function(newv, oldv){
webix.message(newv);
}
}}Form Validation
{
view:"form", id:"myform",
elements:[
{view:"text", label:"Title", name:"title"},
{view:"text", label:"Year", name:"year"}
],
rules:{
title:webix.rules.isNotEmpty,
year:function(value){
return value>2000;
}
}
}-
validation rules are defined via form rules property
- rules keys --> elements names
- validation function must return true or false
- validation starts when form validate() method is called
var result = $$("myform").validate();
//true or falseInvalid form: how to tell the user?
{
view:"form",
on:{
onValidationError:function(){
webix.message({text:"Data is incorrect", type:"error"});
}
}
}-
Use form events to show alert messages:
- onValidationSuccess
- onValidationError
2. Define invalidMessage for contol
- is visible only after validation
Form with Data Component
var values = $$("myform").getValues();
//{ title:"Some", year:"1994"}var small_film_set = [
{ id:1, title:"The Shawshank Redemption", year:1994, votes:678790, rating:9.2, rank:1},
{ id:2, title:"The Godfather", year:1972, votes:511495, rating:9.2, rank:2}
];
webix.ui({
view:"datatable", id:"mydata", autoConfig:true,
data:small_film_set
});Form values:
Component data:
Why not add more?
$$("mydata").add(values);Useful Links
Webix Topics:
Task for practice: click here

Follow-up text: click here
1-2. Webix Basics. Interaction with Users.
By ihelga
1-2. Webix Basics. Interaction with Users.
How to handle events in Webix, use windows to interact with users, gather form data via forms.
- 802