SlideShare uma empresa Scribd logo
1 de 44
Baixar para ler offline
Martin Wittemann
martin.wittemann@1und1.de




             Form Management
                            in qooxdoo 0.8.3
qooxdoo <= 0.8.2

! Complete set of widgets
!
" Uniform API (interfaces) for the widgets
!
" Validation
!
" Resetting support
!
" Form rendering
!
" Serialization
!
" Data binding for the form
!
qooxdoo > 0.8.2

! Complete set of widgets
!
! Uniform API (interfaces) for the widgets
!
! Validation
!
! Resetting support
!
! Form rendering
!
! Serialization
!
! Data binding for the form
!
Uniform API
• New Interfaces for ...
  • Widgets with invalid states
  • Executable widgets
  • Range handling widgets
  • Widgets containing a value
  • Widgets representing some kind of
    data
Value Interfaces
           <<interface>>                               <<interface>>
          INumberForm                                  IStringForm
changeValue : Data                          changeValue : Data

setValue(value : number) : void             setValue(value : string) : void
getValue() : number                         getValue() : string
resetValue() : void                         resetValue() : void


           <<interface>>                               <<interface>>
            IDateForm                                   IColorForm
changeValue : Data                          changeValue : Data

setValue(value : Date) : void               setValue(value : Color) : void
getValue() : Date                           getValue() : Color
resetValue() : void                         resetValue() : void


                                 <<interface>>
                                IBooleanForm
                      changeValue : Data

                      setValue(value : boolean) : void
                      getValue() : boolean
                      resetValue() : void
Why?
var   label = new qx.ui.basic.Label();
var   textField = new qx.ui.form.TextField();
var   dateField = new qx.ui.form.DateField();
var   checkBox = new qx.ui.form.CheckBox();

label.setContent("a");
textField.setValue("a");
dateField.setDate(new Date());
checkBox.setValue("a"); //string representation
checkBox.setChecked(true);


var spinner = new qx.ui.form.Spinner();
var slider = new qx.ui.form.Slider();

spinner.setMin(10);
slider.setMinimum(10);
Better...
var   label = new qx.ui.basic.Label();
var   textField = new qx.ui.form.TextField();
var   dateField = new qx.ui.form.DateField();
var   checkBox = new qx.ui.form.CheckBox();

label.setValue("a");
textField.setValue("a");
dateField.setValue(new Date());
checkBox.setValue(true);



var spinner = new qx.ui.form.Spinner();
var slider = new qx.ui.form.Slider();

spinner.setMinimum(10);
slider.setMinimum(10);
But I liked the old value
• Often used for storing representing data
• Was too strict because only Strings were
  allowed
But I liked the old value
 • Often used for storing representing data
 • Was too strict because only Strings were
      allowed

                        <<Interface>>
                            IModel
           changeModel : Data
           setModel(value : var) : void
           getModel() : var
           resetModel() : void



ListItem                                        CheckBox
                Abstract
                                  RadioButton
                TreeItem
But I liked the old value
• Often used for storing representing data
• Was too strict because only Strings were
  allowed




                                                            <<Interface>>
                                                                IModel
                                               changeModel : Data
                                               setModel(value : var) : void
                                               getModel() : var
                                               resetModel() : void



                                    ListItem                                        CheckBox
                                                    Abstract
                                                                      RadioButton
                                                    TreeItem
But I liked the old value
      • Often used for storing representing data
      • Was too strict because only Strings were
             allowed
                           <<Interface>>
                         IModelSelection
                setModelSelection(value : var) : void
                getModelSelection() : var




RadioGroup                                                 Tree                           <<Interface>>

              RadioButton                                                                     IModel
                                                                             changeModel : Data
                                               SelectBox                     setModel(value : var) : void
                Group                                                        getModel() : var
                                  List                                       resetModel() : void



                                                                  ListItem                                        CheckBox
                                                                                  Abstract
                                                                                                    RadioButton
                                                                                  TreeItem
Visualize Invalid
Visualize Invalid
Validation

• Validation Manager
 • Synchronous validation
 • Asynchronous validation
 • Validation of items in the form
   context

 • Predefined validators
Sync
Sync
var manager = new qx.ui.form.validation.Manager();
var textField = new qx.ui.form.TextField();
var checkBox = new qx.ui.form.CheckBox();

textField.setRequired(true);
manager.add(textField);
Sync
var manager = new qx.ui.form.validation.Manager();
var textField = new qx.ui.form.TextField();
var checkBox = new qx.ui.form.CheckBox();

manager.add(textField, qx.util.Validate.email());
textField.setRequired(true);
manager.add(textField);
Sync
var manager = new qx.ui.form.validation.Manager();
var textField = new qx.ui.form.TextField();
var checkBox = new qx.ui.form.CheckBox();

manager.add(textField, qx.util.Validate.email());
textField.setRequired(true);
                       function(value) {
manager.add(textField); 3;
  return value.length >=
});
Sync
var manager = new qx.ui.form.validation.Manager();
var textField = new qx.ui.form.TextField();
var checkBox = new qx.ui.form.CheckBox();

manager.setValidator(function(items) { {
manager.add(textField, qx.util.Validate.email());
textField.setRequired(true);
                       function(value)
manager.add(textField); 3;{
  if (checkBox.getValue())
  return value.length >=
}); var value = textField.getValue();
    if (!value || value.length == 0) {
      textField.setValid(false);
      return false;
    }
  }
  textField.setValid(true);
  return true;
});
Async
var manager = new qx.ui.form.validation.Manager();
var textField = new qx.ui.form.TextField();
var checkBox = new qx.ui.form.CheckBox();

manager.add(textField,
   new qx.ui.form.validation.AsyncValidator(
     function(validator, value) {
       // here comes the async call
       window.setTimeout(function() {
         // callback for the async validation
         validator.setValid(false);
       }, 1000);
     }
   )
);
Async
var manager = new qx.ui.form.validation.Manager();
var textField = new qx.ui.form.TextField();
var checkBox = new qx.ui.form.CheckBox();

manager.add(textField,
   new qx.ui.form.validation.AsyncValidator(
     function(validator, value) {
       // here comes the async call
       window.setTimeout(function() {
         // callback for the async validation
         validator.setValid(false);
       }, 1000);
     }
   )
);
Resetting

• Resetting of all form items at once
• Support for form items using
  selections (List, SelectBox, ...)
Resetting

• Resetting of all form items at once
• Support for form items using
  selections (List, SelectBox, ...)

                  qx.ui.form.Resetter
          add(item : qx.ui.form.IForm) : void
          redefine() : void
          reset() : void
Rendering

• Form
 • Uses a renderer interface
 • Different default renderer available
 • Combines rendering, validation and
   resetting

 • Handles form items and buttons
Sample
var form = new qx.ui.form.Form();

var name = new qx.ui.form.TextField();
name.setRequired(true);
form.add(name, "Name");

form.add(new qx.ui.form.TextField(), "Email",
qx.util.Validate.email());

var savebutton = new qx.ui.form.Button("Save");
savebutton.addListener("execute", function() {
  if (form.validate()) {
    alert("You can save now...");
  }
});
form.addButton(savebutton);

var resetbutton = new qx.ui.form.Button("Reset");
resetbutton.addListener("execute", function() {
  form.reset();
});
form.addButton(resetbutton);
Sample
var form = new qx.ui.form.Form();

var name = new qx.ui.form.TextField();
name.setRequired(true);
form.add(name, "Name");

form.add(new qx.ui.form.TextField(), "Email",
qx.util.Validate.email());

var savebutton = new qx.ui.form.Button("Save");
savebutton.addListener("execute", function() {
  if (form.validate()) {
    alert("You can save now...");
  }
});
form.addButton(savebutton);

var resetbutton = new qx.ui.form.Button("Reset");
resetbutton.addListener("execute", function() {
  form.reset();
});
form.addButton(resetbutton);
Sample
var form = new qx.ui.form.Form();

var name = new qx.ui.form.TextField();
name.setRequired(true);
form.add(name, "Name");

form.add(new qx.ui.form.TextField(), "Email",
qx.util.Validate.email());

var savebutton = new qx.ui.form.Button("Save");
savebutton.addListener("execute", function() {
  if (form.validate()) {
    alert("You can save now...");
  }
});
form.addButton(savebutton);

var resetbutton = new qx.ui.form.Button("Reset");
resetbutton.addListener("execute", function() {
  form.reset();
});
form.addButton(resetbutton);
Sample
var form = new qx.ui.form.Form();

var name = new qx.ui.form.TextField();
name.setRequired(true);
form.add(name, "Name");

form.add(new qx.ui.form.TextField(), "Email",
qx.util.Validate.email());

var savebutton = new qx.ui.form.Button("Save");
savebutton.addListener("execute", function() {
  if (form.validate()) {
    alert("You can save now...");
  }
});
form.addButton(savebutton);

var resetbutton = new qx.ui.form.Button("Reset");
resetbutton.addListener("execute", function() {
  form.reset();
});
form.addButton(resetbutton);
Renderer
this.getRoot().add(
   form.createView(),
   {left: 10, top: 10}
);
Renderer
this.getRoot().add(
   form.createView(),
   {left: 10, top: 10}
);




        Single
Renderer
this.getRoot().add(
   form.createView(),
   form.createView(qx.ui.form.renderer.SinglePlaceholder),
   {left: 10, top: 10}
);




        Single                       SinglePlaceholder
Renderer
this.getRoot().add(
   form.createView(),
   form.createView(qx.ui.form.renderer.Double),
   form.createView(qx.ui.form.renderer.SinglePlaceholder),
   {left: 10, top: 10}
);




        Single                       SinglePlaceholder




                         Double
Serialization

• Change of the serialization
  perspective
• Serialization of a model and not of a
  view
" Moved into the data binding layer
Data Binding


• Special controller for the form
  • Connecting a model with the form
  • Creating a model
Sample
var form = new qx.ui.form.Form();

form.add(new qx.ui.form.TextField(), "Salutation");
form.add(new qx.ui.form.TextField(), "First Name");
form.add(new qx.ui.form.TextField(), "Last Name",
null, "last");
this.getRoot().add(form.createView(), {left: 10,
top: 10});

var controller = new qx.data.controller.Form(null,
form);
var model = controller.createModel();

model.setSalutation("Mr.");
model.setFirstName("Martin");
model.setLast("Wittemann");
Sample
var form = new qx.ui.form.Form();

form.add(new qx.ui.form.TextField(), "Salutation");
form.add(new qx.ui.form.TextField(), "First Name");
form.add(new qx.ui.form.TextField(), "Last Name",
null, "last");
this.getRoot().add(form.createView(), {left: 10,
top: 10});

var controller = new qx.data.controller.Form(null,
form);
var model = controller.createModel();

model.setSalutation("Mr.");
model.setFirstName("Martin");
model.setLast("Wittemann");
Sample
var form = new qx.ui.form.Form();

form.add(new qx.ui.form.TextField(), "Salutation");
form.add(new qx.ui.form.TextField(), "First Name");
form.add(new qx.ui.form.TextField(), "Last Name",
null, "last");
this.getRoot().add(form.createView(), {left: 10,
top: 10});

var controller = new qx.data.controller.Form(null,
form);
var model = controller.createModel();

model.setSalutation("Mr.");
model.setFirstName("Martin");
model.setLast("Wittemann");
Sample
var form = new qx.ui.form.Form();

form.add(new qx.ui.form.TextField(), "Salutation");
form.add(new qx.ui.form.TextField(), "First Name");
form.add(new qx.ui.form.TextField(), "Last Name",
null, "last");
this.getRoot().add(form.createView(), {left: 10,
top: 10});

var controller = new qx.data.controller.Form(null,
form);
var model = controller.createModel();

model.setSalutation("Mr.");
model.setFirstName("Martin");
model.setLast("Wittemann");
Sample
var form = new qx.ui.form.Form();

form.add(new qx.ui.form.TextField(), "Salutation");
form.add(new qx.ui.form.TextField(), "First Name");
form.add(new qx.ui.form.TextField(), "Last Name",
null, "last");
this.getRoot().add(form.createView(), {left: 10,
top: 10});

var controller = new qx.data.controller.Form(null,
form);
var model = controller.createModel();

model.setSalutation("Mr.");
model.setFirstName("Martin");
model.setLast("Wittemann");
Sample
var form = new qx.ui.form.Form();

form.add(new qx.ui.form.TextField(), "Salutation");
form.add(new qx.ui.form.TextField(), "First Name");
form.add(new qx.ui.form.TextField(), "Last Name",
null, "last");
this.getRoot().add(form.createView(), {left: 10,
top: 10});

var controller = new qx.data.controller.Form(null,
form);
var model = controller.createModel();

model.setSalutation("Mr.");
model.setFirstName("Martin");
model.setLast("Wittemann");
Sample
var form = new qx.ui.form.Form();

form.add(new qx.ui.form.TextField(), "Salutation");
form.add(new qx.ui.form.TextField(), "First Name");
form.add(new qx.ui.form.TextField(), "Last Name",
null, "last");
this.getRoot().add(form.createView(), {left: 10,
top: 10});

var controller = new qx.data.controller.Form(null,
form);
var model = controller.createModel();

model.setSalutation("Mr.");
model.setFirstName("Martin");
model.setLast("Wittemann");
Model


• qooxdoo class with three properties
  • salutation
  • firstName
  • last
Serialization
     • to URI parameter
qx.util.Serializer.toUriParameter(model);

Salutation=Mr.&FirstName=Martin&last=Wittemann


• to JSON
qx.util.Serializer.toJSON(model);

{
    "Salutation":"Mr.",
    "FirstName": "Martin",
    "last": "Wittemann"
}
More...

• Wiki Documentation
 • Complete list of all changed widgets
 • Complete list of all interfaces
 • Further details on the new parts
 http://qooxdoo.org/documentation/
 0.8/ui_form_handling2#interfaces

Mais conteúdo relacionado

Mais procurados

Functional programming techniques in real-world microservices
Functional programming techniques in real-world microservicesFunctional programming techniques in real-world microservices
Functional programming techniques in real-world microservicesAndrás Papp
 
Wicket KT part 2
Wicket KT part 2Wicket KT part 2
Wicket KT part 2stuq
 
Postgres rules
Postgres rulesPostgres rules
Postgres rulesgisborne
 
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...Ontico
 
Unit Testing at Scale
Unit Testing at ScaleUnit Testing at Scale
Unit Testing at ScaleJan Wloka
 
rails-migrations_1
rails-migrations_1rails-migrations_1
rails-migrations_1brecke
 
11. session 11 functions and objects
11. session 11   functions and objects11. session 11   functions and objects
11. session 11 functions and objectsPhúc Đỗ
 
The Ring programming language version 1.2 book - Part 23 of 84
The Ring programming language version 1.2 book - Part 23 of 84The Ring programming language version 1.2 book - Part 23 of 84
The Ring programming language version 1.2 book - Part 23 of 84Mahmoud Samir Fayed
 
jQuery Rescue Adventure
jQuery Rescue AdventurejQuery Rescue Adventure
jQuery Rescue AdventureAllegient
 
jQuery1.2.cheatsheet.v1.0
jQuery1.2.cheatsheet.v1.0jQuery1.2.cheatsheet.v1.0
jQuery1.2.cheatsheet.v1.0guest644d1d
 

Mais procurados (15)

Functional programming techniques in real-world microservices
Functional programming techniques in real-world microservicesFunctional programming techniques in real-world microservices
Functional programming techniques in real-world microservices
 
Wicket KT part 2
Wicket KT part 2Wicket KT part 2
Wicket KT part 2
 
Postgres rules
Postgres rulesPostgres rules
Postgres rules
 
Scala in practice
Scala in practiceScala in practice
Scala in practice
 
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
 
Unit Testing at Scale
Unit Testing at ScaleUnit Testing at Scale
Unit Testing at Scale
 
rails-migrations_1
rails-migrations_1rails-migrations_1
rails-migrations_1
 
Developer Testing Tools Roundup
Developer Testing Tools RoundupDeveloper Testing Tools Roundup
Developer Testing Tools Roundup
 
jQuery
jQueryjQuery
jQuery
 
11. session 11 functions and objects
11. session 11   functions and objects11. session 11   functions and objects
11. session 11 functions and objects
 
Spine JS
Spine JSSpine JS
Spine JS
 
Scala in Places API
Scala in Places APIScala in Places API
Scala in Places API
 
The Ring programming language version 1.2 book - Part 23 of 84
The Ring programming language version 1.2 book - Part 23 of 84The Ring programming language version 1.2 book - Part 23 of 84
The Ring programming language version 1.2 book - Part 23 of 84
 
jQuery Rescue Adventure
jQuery Rescue AdventurejQuery Rescue Adventure
jQuery Rescue Adventure
 
jQuery1.2.cheatsheet.v1.0
jQuery1.2.cheatsheet.v1.0jQuery1.2.cheatsheet.v1.0
jQuery1.2.cheatsheet.v1.0
 

Destaque

EstablishUS Overview Presentation
EstablishUS Overview PresentationEstablishUS Overview Presentation
EstablishUS Overview Presentationmdskelton
 
qooxdoo at VKSI-RIA-Comparison
qooxdoo at VKSI-RIA-Comparisonqooxdoo at VKSI-RIA-Comparison
qooxdoo at VKSI-RIA-ComparisonMartin Wittemann
 
History of Ska Presentation
History of Ska PresentationHistory of Ska Presentation
History of Ska Presentationguestff60a
 
Skinheads presentation in powerpoint
Skinheads presentation in powerpointSkinheads presentation in powerpoint
Skinheads presentation in powerpointpatricia295
 

Destaque (8)

EstablishUS Overview Presentation
EstablishUS Overview PresentationEstablishUS Overview Presentation
EstablishUS Overview Presentation
 
qooxdoo at VKSI-RIA-Comparison
qooxdoo at VKSI-RIA-Comparisonqooxdoo at VKSI-RIA-Comparison
qooxdoo at VKSI-RIA-Comparison
 
qooxdoo Decorators
qooxdoo Decoratorsqooxdoo Decorators
qooxdoo Decorators
 
Zebulon Solutions
Zebulon SolutionsZebulon Solutions
Zebulon Solutions
 
History of Ska Presentation
History of Ska PresentationHistory of Ska Presentation
History of Ska Presentation
 
PresentacióN2
PresentacióN2PresentacióN2
PresentacióN2
 
Skinheads presentation in powerpoint
Skinheads presentation in powerpointSkinheads presentation in powerpoint
Skinheads presentation in powerpoint
 
Skinheads
SkinheadsSkinheads
Skinheads
 

Semelhante a qooxdoo Form Management

Cocoa heads testing and viewcontrollers
Cocoa heads testing and viewcontrollersCocoa heads testing and viewcontrollers
Cocoa heads testing and viewcontrollersStijn Willems
 
Scala in practice
Scala in practiceScala in practice
Scala in practicepatforna
 
Viastudy ef core_cheat_sheet
Viastudy ef core_cheat_sheetViastudy ef core_cheat_sheet
Viastudy ef core_cheat_sheetimdurgesh
 
Bindings: the zen of montage
Bindings: the zen of montageBindings: the zen of montage
Bindings: the zen of montageKris Kowal
 
The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196Mahmoud Samir Fayed
 
Practical Model View Programming (Roadshow Version)
Practical Model View Programming (Roadshow Version)Practical Model View Programming (Roadshow Version)
Practical Model View Programming (Roadshow Version)Marius Bugge Monsen
 
Entity Framework: Code First and Magic Unicorns
Entity Framework: Code First and Magic UnicornsEntity Framework: Code First and Magic Unicorns
Entity Framework: Code First and Magic UnicornsRichie Rump
 
Build Widgets
Build WidgetsBuild Widgets
Build Widgetsscottw
 
.NET Database Toolkit
.NET Database Toolkit.NET Database Toolkit
.NET Database Toolkitwlscaudill
 
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...dotNet Miami
 
GWT.create 2013: Introduction to GXT
GWT.create 2013: Introduction to GXTGWT.create 2013: Introduction to GXT
GWT.create 2013: Introduction to GXTniloc132
 
Local storage in Web apps
Local storage in Web appsLocal storage in Web apps
Local storage in Web appsIvano Malavolta
 
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."sjabs
 
Java Core | JavaFX 2.0: Great User Interfaces in Java | Simon Ritter
Java Core | JavaFX 2.0: Great User Interfaces in Java | Simon RitterJava Core | JavaFX 2.0: Great User Interfaces in Java | Simon Ritter
Java Core | JavaFX 2.0: Great User Interfaces in Java | Simon RitterJAX London
 
Understanding backbonejs
Understanding backbonejsUnderstanding backbonejs
Understanding backbonejsNick Lee
 

Semelhante a qooxdoo Form Management (20)

Cocoa heads testing and viewcontrollers
Cocoa heads testing and viewcontrollersCocoa heads testing and viewcontrollers
Cocoa heads testing and viewcontrollers
 
Developing a new Epsilon EMC driver
Developing a new Epsilon EMC driverDeveloping a new Epsilon EMC driver
Developing a new Epsilon EMC driver
 
Requery overview
Requery overviewRequery overview
Requery overview
 
Linq
LinqLinq
Linq
 
Scala in practice
Scala in practiceScala in practice
Scala in practice
 
IN4308 Lecture 3
IN4308 Lecture 3IN4308 Lecture 3
IN4308 Lecture 3
 
Viastudy ef core_cheat_sheet
Viastudy ef core_cheat_sheetViastudy ef core_cheat_sheet
Viastudy ef core_cheat_sheet
 
Bindings: the zen of montage
Bindings: the zen of montageBindings: the zen of montage
Bindings: the zen of montage
 
The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196The Ring programming language version 1.7 book - Part 48 of 196
The Ring programming language version 1.7 book - Part 48 of 196
 
Practical Model View Programming (Roadshow Version)
Practical Model View Programming (Roadshow Version)Practical Model View Programming (Roadshow Version)
Practical Model View Programming (Roadshow Version)
 
Jsr 303
Jsr 303Jsr 303
Jsr 303
 
Entity Framework: Code First and Magic Unicorns
Entity Framework: Code First and Magic UnicornsEntity Framework: Code First and Magic Unicorns
Entity Framework: Code First and Magic Unicorns
 
Build Widgets
Build WidgetsBuild Widgets
Build Widgets
 
.NET Database Toolkit
.NET Database Toolkit.NET Database Toolkit
.NET Database Toolkit
 
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
dotNet Miami - June 21, 2012: Richie Rump: Entity Framework: Code First and M...
 
GWT.create 2013: Introduction to GXT
GWT.create 2013: Introduction to GXTGWT.create 2013: Introduction to GXT
GWT.create 2013: Introduction to GXT
 
Local storage in Web apps
Local storage in Web appsLocal storage in Web apps
Local storage in Web apps
 
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
Kamil Chmielewski, Jacek Juraszek - "Hadoop. W poszukiwaniu złotego młotka."
 
Java Core | JavaFX 2.0: Great User Interfaces in Java | Simon Ritter
Java Core | JavaFX 2.0: Great User Interfaces in Java | Simon RitterJava Core | JavaFX 2.0: Great User Interfaces in Java | Simon Ritter
Java Core | JavaFX 2.0: Great User Interfaces in Java | Simon Ritter
 
Understanding backbonejs
Understanding backbonejsUnderstanding backbonejs
Understanding backbonejs
 

Mais de Martin Wittemann

Mais de Martin Wittemann (6)

10 Jahre Webentwicklung - am Beispiel des Frameworks qooxdoo
10 Jahre Webentwicklung - am Beispiel des Frameworks qooxdoo10 Jahre Webentwicklung - am Beispiel des Frameworks qooxdoo
10 Jahre Webentwicklung - am Beispiel des Frameworks qooxdoo
 
Pointer events
Pointer eventsPointer events
Pointer events
 
qooxdoo 3.5
qooxdoo 3.5qooxdoo 3.5
qooxdoo 3.5
 
Cross-Platform Mobile Apps
Cross-Platform Mobile AppsCross-Platform Mobile Apps
Cross-Platform Mobile Apps
 
Qooxdoo at B::IT
Qooxdoo at B::ITQooxdoo at B::IT
Qooxdoo at B::IT
 
Data Binding in qooxdoo
Data Binding in qooxdooData Binding in qooxdoo
Data Binding in qooxdoo
 

Último

Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...panagenda
 
ERP Contender Series: Acumatica vs. Sage Intacct
ERP Contender Series: Acumatica vs. Sage IntacctERP Contender Series: Acumatica vs. Sage Intacct
ERP Contender Series: Acumatica vs. Sage IntacctBrainSell Technologies
 
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...ScyllaDB
 
Design and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data ScienceDesign and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data SciencePaolo Missier
 
How to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cfHow to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cfdanishmna97
 
Portal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russePortal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russe中 央社
 
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptxHarnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptxFIDO Alliance
 
Top 10 CodeIgniter Development Companies
Top 10 CodeIgniter Development CompaniesTop 10 CodeIgniter Development Companies
Top 10 CodeIgniter Development CompaniesTopCSSGallery
 
Vector Search @ sw2con for slideshare.pptx
Vector Search @ sw2con for slideshare.pptxVector Search @ sw2con for slideshare.pptx
Vector Search @ sw2con for slideshare.pptxjbellis
 
Human Expert Website Manual WCAG 2.0 2.1 2.2 Audit - Digital Accessibility Au...
Human Expert Website Manual WCAG 2.0 2.1 2.2 Audit - Digital Accessibility Au...Human Expert Website Manual WCAG 2.0 2.1 2.2 Audit - Digital Accessibility Au...
Human Expert Website Manual WCAG 2.0 2.1 2.2 Audit - Digital Accessibility Au...Skynet Technologies
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontologyjohnbeverley2021
 
الأمن السيبراني - ما لا يسع للمستخدم جهله
الأمن السيبراني - ما لا يسع للمستخدم جهلهالأمن السيبراني - ما لا يسع للمستخدم جهله
الأمن السيبراني - ما لا يسع للمستخدم جهلهMohamed Sweelam
 
How to Check GPS Location with a Live Tracker in Pakistan
How to Check GPS Location with a Live Tracker in PakistanHow to Check GPS Location with a Live Tracker in Pakistan
How to Check GPS Location with a Live Tracker in Pakistandanishmna97
 
CORS (Kitworks Team Study 양다윗 발표자료 240510)
CORS (Kitworks Team Study 양다윗 발표자료 240510)CORS (Kitworks Team Study 양다윗 발표자료 240510)
CORS (Kitworks Team Study 양다윗 발표자료 240510)Wonjun Hwang
 
Microsoft CSP Briefing Pre-Engagement - Questionnaire
Microsoft CSP Briefing Pre-Engagement - QuestionnaireMicrosoft CSP Briefing Pre-Engagement - Questionnaire
Microsoft CSP Briefing Pre-Engagement - QuestionnaireExakis Nelite
 
Intro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptxIntro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptxFIDO Alliance
 
Design Guidelines for Passkeys 2024.pptx
Design Guidelines for Passkeys 2024.pptxDesign Guidelines for Passkeys 2024.pptx
Design Guidelines for Passkeys 2024.pptxFIDO Alliance
 
WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024Lorenzo Miniero
 
Generative AI Use Cases and Applications.pdf
Generative AI Use Cases and Applications.pdfGenerative AI Use Cases and Applications.pdf
Generative AI Use Cases and Applications.pdfalexjohnson7307
 

Último (20)

Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
 
Overview of Hyperledger Foundation
Overview of Hyperledger FoundationOverview of Hyperledger Foundation
Overview of Hyperledger Foundation
 
ERP Contender Series: Acumatica vs. Sage Intacct
ERP Contender Series: Acumatica vs. Sage IntacctERP Contender Series: Acumatica vs. Sage Intacct
ERP Contender Series: Acumatica vs. Sage Intacct
 
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...
Event-Driven Architecture Masterclass: Engineering a Robust, High-performance...
 
Design and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data ScienceDesign and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data Science
 
How to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cfHow to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cf
 
Portal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russePortal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russe
 
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptxHarnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
 
Top 10 CodeIgniter Development Companies
Top 10 CodeIgniter Development CompaniesTop 10 CodeIgniter Development Companies
Top 10 CodeIgniter Development Companies
 
Vector Search @ sw2con for slideshare.pptx
Vector Search @ sw2con for slideshare.pptxVector Search @ sw2con for slideshare.pptx
Vector Search @ sw2con for slideshare.pptx
 
Human Expert Website Manual WCAG 2.0 2.1 2.2 Audit - Digital Accessibility Au...
Human Expert Website Manual WCAG 2.0 2.1 2.2 Audit - Digital Accessibility Au...Human Expert Website Manual WCAG 2.0 2.1 2.2 Audit - Digital Accessibility Au...
Human Expert Website Manual WCAG 2.0 2.1 2.2 Audit - Digital Accessibility Au...
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
الأمن السيبراني - ما لا يسع للمستخدم جهله
الأمن السيبراني - ما لا يسع للمستخدم جهلهالأمن السيبراني - ما لا يسع للمستخدم جهله
الأمن السيبراني - ما لا يسع للمستخدم جهله
 
How to Check GPS Location with a Live Tracker in Pakistan
How to Check GPS Location with a Live Tracker in PakistanHow to Check GPS Location with a Live Tracker in Pakistan
How to Check GPS Location with a Live Tracker in Pakistan
 
CORS (Kitworks Team Study 양다윗 발표자료 240510)
CORS (Kitworks Team Study 양다윗 발표자료 240510)CORS (Kitworks Team Study 양다윗 발표자료 240510)
CORS (Kitworks Team Study 양다윗 발표자료 240510)
 
Microsoft CSP Briefing Pre-Engagement - Questionnaire
Microsoft CSP Briefing Pre-Engagement - QuestionnaireMicrosoft CSP Briefing Pre-Engagement - Questionnaire
Microsoft CSP Briefing Pre-Engagement - Questionnaire
 
Intro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptxIntro to Passkeys and the State of Passwordless.pptx
Intro to Passkeys and the State of Passwordless.pptx
 
Design Guidelines for Passkeys 2024.pptx
Design Guidelines for Passkeys 2024.pptxDesign Guidelines for Passkeys 2024.pptx
Design Guidelines for Passkeys 2024.pptx
 
WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024
 
Generative AI Use Cases and Applications.pdf
Generative AI Use Cases and Applications.pdfGenerative AI Use Cases and Applications.pdf
Generative AI Use Cases and Applications.pdf
 

qooxdoo Form Management

  • 1. Martin Wittemann martin.wittemann@1und1.de Form Management in qooxdoo 0.8.3
  • 2. qooxdoo <= 0.8.2 ! Complete set of widgets ! " Uniform API (interfaces) for the widgets ! " Validation ! " Resetting support ! " Form rendering ! " Serialization ! " Data binding for the form !
  • 3. qooxdoo > 0.8.2 ! Complete set of widgets ! ! Uniform API (interfaces) for the widgets ! ! Validation ! ! Resetting support ! ! Form rendering ! ! Serialization ! ! Data binding for the form !
  • 4. Uniform API • New Interfaces for ... • Widgets with invalid states • Executable widgets • Range handling widgets • Widgets containing a value • Widgets representing some kind of data
  • 5. Value Interfaces <<interface>> <<interface>> INumberForm IStringForm changeValue : Data changeValue : Data setValue(value : number) : void setValue(value : string) : void getValue() : number getValue() : string resetValue() : void resetValue() : void <<interface>> <<interface>> IDateForm IColorForm changeValue : Data changeValue : Data setValue(value : Date) : void setValue(value : Color) : void getValue() : Date getValue() : Color resetValue() : void resetValue() : void <<interface>> IBooleanForm changeValue : Data setValue(value : boolean) : void getValue() : boolean resetValue() : void
  • 6. Why? var label = new qx.ui.basic.Label(); var textField = new qx.ui.form.TextField(); var dateField = new qx.ui.form.DateField(); var checkBox = new qx.ui.form.CheckBox(); label.setContent("a"); textField.setValue("a"); dateField.setDate(new Date()); checkBox.setValue("a"); //string representation checkBox.setChecked(true); var spinner = new qx.ui.form.Spinner(); var slider = new qx.ui.form.Slider(); spinner.setMin(10); slider.setMinimum(10);
  • 7. Better... var label = new qx.ui.basic.Label(); var textField = new qx.ui.form.TextField(); var dateField = new qx.ui.form.DateField(); var checkBox = new qx.ui.form.CheckBox(); label.setValue("a"); textField.setValue("a"); dateField.setValue(new Date()); checkBox.setValue(true); var spinner = new qx.ui.form.Spinner(); var slider = new qx.ui.form.Slider(); spinner.setMinimum(10); slider.setMinimum(10);
  • 8. But I liked the old value • Often used for storing representing data • Was too strict because only Strings were allowed
  • 9. But I liked the old value • Often used for storing representing data • Was too strict because only Strings were allowed <<Interface>> IModel changeModel : Data setModel(value : var) : void getModel() : var resetModel() : void ListItem CheckBox Abstract RadioButton TreeItem
  • 10. But I liked the old value • Often used for storing representing data • Was too strict because only Strings were allowed <<Interface>> IModel changeModel : Data setModel(value : var) : void getModel() : var resetModel() : void ListItem CheckBox Abstract RadioButton TreeItem
  • 11. But I liked the old value • Often used for storing representing data • Was too strict because only Strings were allowed <<Interface>> IModelSelection setModelSelection(value : var) : void getModelSelection() : var RadioGroup Tree <<Interface>> RadioButton IModel changeModel : Data SelectBox setModel(value : var) : void Group getModel() : var List resetModel() : void ListItem CheckBox Abstract RadioButton TreeItem
  • 14. Validation • Validation Manager • Synchronous validation • Asynchronous validation • Validation of items in the form context • Predefined validators
  • 15. Sync
  • 16. Sync var manager = new qx.ui.form.validation.Manager(); var textField = new qx.ui.form.TextField(); var checkBox = new qx.ui.form.CheckBox(); textField.setRequired(true); manager.add(textField);
  • 17. Sync var manager = new qx.ui.form.validation.Manager(); var textField = new qx.ui.form.TextField(); var checkBox = new qx.ui.form.CheckBox(); manager.add(textField, qx.util.Validate.email()); textField.setRequired(true); manager.add(textField);
  • 18. Sync var manager = new qx.ui.form.validation.Manager(); var textField = new qx.ui.form.TextField(); var checkBox = new qx.ui.form.CheckBox(); manager.add(textField, qx.util.Validate.email()); textField.setRequired(true); function(value) { manager.add(textField); 3; return value.length >= });
  • 19. Sync var manager = new qx.ui.form.validation.Manager(); var textField = new qx.ui.form.TextField(); var checkBox = new qx.ui.form.CheckBox(); manager.setValidator(function(items) { { manager.add(textField, qx.util.Validate.email()); textField.setRequired(true); function(value) manager.add(textField); 3;{ if (checkBox.getValue()) return value.length >= }); var value = textField.getValue(); if (!value || value.length == 0) { textField.setValid(false); return false; } } textField.setValid(true); return true; });
  • 20. Async var manager = new qx.ui.form.validation.Manager(); var textField = new qx.ui.form.TextField(); var checkBox = new qx.ui.form.CheckBox(); manager.add(textField, new qx.ui.form.validation.AsyncValidator( function(validator, value) { // here comes the async call window.setTimeout(function() { // callback for the async validation validator.setValid(false); }, 1000); } ) );
  • 21. Async var manager = new qx.ui.form.validation.Manager(); var textField = new qx.ui.form.TextField(); var checkBox = new qx.ui.form.CheckBox(); manager.add(textField, new qx.ui.form.validation.AsyncValidator( function(validator, value) { // here comes the async call window.setTimeout(function() { // callback for the async validation validator.setValid(false); }, 1000); } ) );
  • 22. Resetting • Resetting of all form items at once • Support for form items using selections (List, SelectBox, ...)
  • 23. Resetting • Resetting of all form items at once • Support for form items using selections (List, SelectBox, ...) qx.ui.form.Resetter add(item : qx.ui.form.IForm) : void redefine() : void reset() : void
  • 24. Rendering • Form • Uses a renderer interface • Different default renderer available • Combines rendering, validation and resetting • Handles form items and buttons
  • 25. Sample var form = new qx.ui.form.Form(); var name = new qx.ui.form.TextField(); name.setRequired(true); form.add(name, "Name"); form.add(new qx.ui.form.TextField(), "Email", qx.util.Validate.email()); var savebutton = new qx.ui.form.Button("Save"); savebutton.addListener("execute", function() { if (form.validate()) { alert("You can save now..."); } }); form.addButton(savebutton); var resetbutton = new qx.ui.form.Button("Reset"); resetbutton.addListener("execute", function() { form.reset(); }); form.addButton(resetbutton);
  • 26. Sample var form = new qx.ui.form.Form(); var name = new qx.ui.form.TextField(); name.setRequired(true); form.add(name, "Name"); form.add(new qx.ui.form.TextField(), "Email", qx.util.Validate.email()); var savebutton = new qx.ui.form.Button("Save"); savebutton.addListener("execute", function() { if (form.validate()) { alert("You can save now..."); } }); form.addButton(savebutton); var resetbutton = new qx.ui.form.Button("Reset"); resetbutton.addListener("execute", function() { form.reset(); }); form.addButton(resetbutton);
  • 27. Sample var form = new qx.ui.form.Form(); var name = new qx.ui.form.TextField(); name.setRequired(true); form.add(name, "Name"); form.add(new qx.ui.form.TextField(), "Email", qx.util.Validate.email()); var savebutton = new qx.ui.form.Button("Save"); savebutton.addListener("execute", function() { if (form.validate()) { alert("You can save now..."); } }); form.addButton(savebutton); var resetbutton = new qx.ui.form.Button("Reset"); resetbutton.addListener("execute", function() { form.reset(); }); form.addButton(resetbutton);
  • 28. Sample var form = new qx.ui.form.Form(); var name = new qx.ui.form.TextField(); name.setRequired(true); form.add(name, "Name"); form.add(new qx.ui.form.TextField(), "Email", qx.util.Validate.email()); var savebutton = new qx.ui.form.Button("Save"); savebutton.addListener("execute", function() { if (form.validate()) { alert("You can save now..."); } }); form.addButton(savebutton); var resetbutton = new qx.ui.form.Button("Reset"); resetbutton.addListener("execute", function() { form.reset(); }); form.addButton(resetbutton);
  • 29. Renderer this.getRoot().add( form.createView(), {left: 10, top: 10} );
  • 30. Renderer this.getRoot().add( form.createView(), {left: 10, top: 10} ); Single
  • 31. Renderer this.getRoot().add( form.createView(), form.createView(qx.ui.form.renderer.SinglePlaceholder), {left: 10, top: 10} ); Single SinglePlaceholder
  • 32. Renderer this.getRoot().add( form.createView(), form.createView(qx.ui.form.renderer.Double), form.createView(qx.ui.form.renderer.SinglePlaceholder), {left: 10, top: 10} ); Single SinglePlaceholder Double
  • 33. Serialization • Change of the serialization perspective • Serialization of a model and not of a view " Moved into the data binding layer
  • 34. Data Binding • Special controller for the form • Connecting a model with the form • Creating a model
  • 35. Sample var form = new qx.ui.form.Form(); form.add(new qx.ui.form.TextField(), "Salutation"); form.add(new qx.ui.form.TextField(), "First Name"); form.add(new qx.ui.form.TextField(), "Last Name", null, "last"); this.getRoot().add(form.createView(), {left: 10, top: 10}); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); model.setSalutation("Mr."); model.setFirstName("Martin"); model.setLast("Wittemann");
  • 36. Sample var form = new qx.ui.form.Form(); form.add(new qx.ui.form.TextField(), "Salutation"); form.add(new qx.ui.form.TextField(), "First Name"); form.add(new qx.ui.form.TextField(), "Last Name", null, "last"); this.getRoot().add(form.createView(), {left: 10, top: 10}); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); model.setSalutation("Mr."); model.setFirstName("Martin"); model.setLast("Wittemann");
  • 37. Sample var form = new qx.ui.form.Form(); form.add(new qx.ui.form.TextField(), "Salutation"); form.add(new qx.ui.form.TextField(), "First Name"); form.add(new qx.ui.form.TextField(), "Last Name", null, "last"); this.getRoot().add(form.createView(), {left: 10, top: 10}); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); model.setSalutation("Mr."); model.setFirstName("Martin"); model.setLast("Wittemann");
  • 38. Sample var form = new qx.ui.form.Form(); form.add(new qx.ui.form.TextField(), "Salutation"); form.add(new qx.ui.form.TextField(), "First Name"); form.add(new qx.ui.form.TextField(), "Last Name", null, "last"); this.getRoot().add(form.createView(), {left: 10, top: 10}); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); model.setSalutation("Mr."); model.setFirstName("Martin"); model.setLast("Wittemann");
  • 39. Sample var form = new qx.ui.form.Form(); form.add(new qx.ui.form.TextField(), "Salutation"); form.add(new qx.ui.form.TextField(), "First Name"); form.add(new qx.ui.form.TextField(), "Last Name", null, "last"); this.getRoot().add(form.createView(), {left: 10, top: 10}); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); model.setSalutation("Mr."); model.setFirstName("Martin"); model.setLast("Wittemann");
  • 40. Sample var form = new qx.ui.form.Form(); form.add(new qx.ui.form.TextField(), "Salutation"); form.add(new qx.ui.form.TextField(), "First Name"); form.add(new qx.ui.form.TextField(), "Last Name", null, "last"); this.getRoot().add(form.createView(), {left: 10, top: 10}); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); model.setSalutation("Mr."); model.setFirstName("Martin"); model.setLast("Wittemann");
  • 41. Sample var form = new qx.ui.form.Form(); form.add(new qx.ui.form.TextField(), "Salutation"); form.add(new qx.ui.form.TextField(), "First Name"); form.add(new qx.ui.form.TextField(), "Last Name", null, "last"); this.getRoot().add(form.createView(), {left: 10, top: 10}); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); model.setSalutation("Mr."); model.setFirstName("Martin"); model.setLast("Wittemann");
  • 42. Model • qooxdoo class with three properties • salutation • firstName • last
  • 43. Serialization • to URI parameter qx.util.Serializer.toUriParameter(model); Salutation=Mr.&FirstName=Martin&last=Wittemann • to JSON qx.util.Serializer.toJSON(model); { "Salutation":"Mr.", "FirstName": "Martin", "last": "Wittemann" }
  • 44. More... • Wiki Documentation • Complete list of all changed widgets • Complete list of all interfaces • Further details on the new parts http://qooxdoo.org/documentation/ 0.8/ui_form_handling2#interfaces