Click 2.2.0-RC1 is now available. Major new features include DataProviders for on-demand data loading and a Page interceptor facility for implementing cross cutting concerns such as security and transaction handling. There are also improved support for dynamic forms and stateful pages.

New features and improvements:

  • Added DataProvider support for Table, Select, PickList and CheckList providing on demand loading of data. With DataProviders, users won't have to be concerned about which page event (onInit or onRender) to set the data on the control [CLK-640].
  • Added PagingDataProvider interface to support large paginated result sets for Tables [CLK-640].
  • Added a MenuFactory for creating and loading Menus from configuration files. All the static Menu methods have been deprecated and will be removed in a future release.
  • Added an option for MenuFactory to not statically cache menus. This allows developers to cache menus in different scopes such as HttpSession. [CLK-405].
  • Added i18n support for Menus loaded from menu.xml. The menu DTD now includes a new name attribute. By specifying a name attribute in menu.xml, the Menu will attempt to load its label and title from resource bundles [CLK-591].
  • Added a Page Interceptor facility that provides an extension point for code which can listen to key page events and also interrupt normal page processing flow. [CLK-598].
  • Added improved dynamic Form support. Forms can now optionally bypass validation for JavaScript based submissions using the new JavaScript function "Click.submit(formName, validate)" [CLK-638].
  • Added improved dynamic Page and Form behaviour through new helper methods that can bind and validate Forms and Fields before the onProcess page event e.g. in the Page constructor or "onInit" event. The new methods are:
  • Added improved disabled behavior through the following changes:
    • Disabled fields are not processed or validated
    • Disabled field values are not copied to domain objects
    • Disabled fields are automatically enabled if the field has an incoming request parameter, indicating that the field was enabled on the client using JavaScript. Please note that this behavior does not apply to Checkbox or Radio fields. See the setDisabled() javadoc for details [CLK-646].
  • Added new method Container.replace for replacing an existing control with a new control. In previous releases, an exception would be raised if a page or container already contained a control with the same name as the newly added control. In 2.2.0 the replace method is automatically called when adding a control which name matches that of an existing control in the page or container. This behavior will likely only benefit stateful pages since stateless pages are recreated each request [CLK-666].
  • Added methods to Fields for styling their labels. See new methods Field.setLabelStyle(String) and Field.setLabelStyleClass(String). This issue was raised by Stefax [CLK-595].
  • Added methods to Fields for providing styling hints to their containing elements. See new methods Field.setParentStyleHint(String) and Field.setParentStyleClassHint(String). This issue was raised by Stefax [CLK-595].
  • Added trim property to Field for controlling if the Field request parameter is trimmed or not. See new method Field.setTrim(boolean). This issue was raised by Andrey Rybin [CLK-627].
  • Added new Context methods Context.hasRequestParameter(String) and Context.hasRequestAttribute(String).
  • Added support to Select for a default option that can be used to validate non selection against and allows the Select to only populate its optionList at rendering time, instead of during onProcess event. [CLK-641].
  • Improved default autobinding mode to bind both public fields and fields annotated with @Bindable. In previous versions the default autobinding mode only binded public Page fields [CLK-648].
  • Added mock support for user principals and roles. This issue was raised and fixed by Sven Pfeiffer [CLK-585].
  • Added localized Date format pattern support. This issue was raised by Andrey Rybin [CLK-610].
  • Added Polish resource bundle for DateField. This issue was raised and fixed by Rafal Rusin [CLK-624].
  • Migrated controls to import resources through Elements and the getHeadElements method [CLK-647].
  • Improved SpringClickServlet to re-inject transient beans after stateful page deserialization. This feature is only supported when the stateful page instance is created by Click, not Spring [CLK-667].
  • Replaced Page and Control getMessage methods with varargs equivalents [CLK-604].
  • Removed Click core's dependency on Velocity. This issue was raised by by Andrey Rybin [CLK-606].
  • Replaced multiple ClickUtils close methods with a single method accepting a Closeable. This issue was raised by Andrey Rybin [CLK-620].
  • Improved ClickServlet to use the response's OutputStream if the Writer cannot be retrieved [CLK-644].
  • Fixed issue where RadioGroup label referenced a non-existing ID. RadioGroup is now wrapped inside a span tag with the given ID. This issue was raised and fixed by Finn Bock [CLK-577].
  • Fixed DateField to set seconds back to zero. This issue was raised by Andrey Rybin [CLK-664].
  • The menu.dtd has been published to http://click.apache.org/dtds/menu-2.2.dtd. If you want your configuration to conform to the menu.dtd, include the following declaration in your menu.xml:
    
    
  • The new click-2.2.dtd has been published to http://click.apache.org/dtds/click-2.2.dtd. If you want your configuration to conform to the click.dtd, include the following declaration in your click.xml:
    
    

New examples:

  • Dynamic Form demonstrates how to dynamically add new Fields at runtime.
  • Dynamic FieldSet demonstrates how to dynamically add a FieldSet at runtime.
  • Dynamic Select demonstrates how to dynamically add fields based on a Select field value.
  • Disabled Demo demonstrates the behavior of disabled fields.

Enjoy.

- The Click team