The setClicked(IClickBase) method has been replaced by two separate methods:
This change allows for easier use of lambda's as the type for the method is now well-defined. So instead of having to write
d.setClicked((IClicked<Div>) b -> setCurrentTab(ti)); |
you can now invoke the lambda without a cast:
d.setClicked(b -> setCurrentTab(ti)); |
This change will some existing code as all calls to setClicked that passed a IClicked2 instance now need to use setClicked2.
This interface was the main interface to render generic content inside some NodeContainer. Its definition was this:
public interface INodeContentRenderer<T> { void renderNodeContent(@Nonnull NodeBase component, @Nonnull NodeContainer node, @Nullable T object, @Nullable Object parameters) throws Exception; } |
This interface was abused all over the place and makes it very unclear what parameters are actually passed into renderers, as the parameters component and parameters were often used in non-obvious ways. It also opened the doors for wide abuse, because renderers could abuse the values in component to actually "fix" the components rendering. This of course makes it impossible to maintain those components.
In addition the "object" parameter needed to be @Nullable because a lot of usages of this interface sometimes do pass a null value. But this makes it hard for the zillion places where this value is never null: it forces a check to be needed inside the implementation always.
The interface was replaced by the following:
public interface IRenderInto<T> { void render(@Nonnull NodeContainer node, @Nonnull T object) throws Exception; default void renderOpt(@Nonnull NodeContainer node, @Nullable T object) throws Exception { if(null != object) render(node, object); } } |
The implementer usually implements the render() method only. When there is a need to also handle nulls in a special way then the renderOpt() method needs to be overridden too.
This interface is used at most places where INodeContentRenderer was used. At places where indeed more than these two parameters are needed new interfaces will have been introduced which better describe the parameters and their expected use. Also see the notes about the content renderers for the LookupInput control.
For those not eager to replace all occurrences of INodeContentRenderer: you might be able to define it again in your own code, making it extend IRenderInto, and make the render() method call the old method inside INodeContentRenderer, something like:
public interface INodeContentRenderer<T> extends IRenderInto<T> { void renderNodeContent(@Nonnull NodeBase component, @Nonnull NodeContainer node, @Nullable T object, @Nullable Object parameters) throws Exception; default void render(@Nonnull NodeContainer node, @Nonnull T object) throws Exception { renderNodeContent(node, node, object, null); } } |
When binding was used to connect properties to controls it required that the property bound to was public. But in many cases the binding and the properties are part of one (set of) classes, with no need to have those properties propagated to the outside world.
DomUI now detects private properties in its metamodel, and allows getting/setting the value of these properties through the metamodel. Some restrictions apply, however:
DomUI uses the "etclogger" SLF4J backend by default. The code to initialize this was quite old, and had a lot of nasty things related to the config file's location. The initialization part has been rewritten to have less oddities surrounding the config file, so that no directories are created at wrong places.
The new default config file will be in WEB-INF if it is not expressly specified with a full path.
The default name of the config file is now etclogger.config.xml
The animation methods slideUp(), slideDown(), fadeIn() and fadeOut() have been removed from the Div tag. They should be replaced by calling Animations.xxxx with the node to animate.
Todo:
The new Tree2 component is a rewrite of the now deprecated Tree component. It uses mostly the same interface but is rewritten with cleaner code and renders without using tables.
This component moved to legacy.
The test IDs for the buttons on the LookupInput have changed, so that it is easy to click one of the buttons of a specific lookup. With a LookupInput with testID = "one" the buttons would be called:
The generated html code for the control has been changed so that style fixes could be applied. This breaks the existing legacy stylesheets. For fixes look at _lookupInput.scss.
The value renderers used by this component have changed. In 1.0 the value renderers were not just responsible for rendering a value: they also placed the control's buttons and did a lot for the layout for the control. This was a bad plan, because it tightly couples those renderers to the control and anyone overridding those also need to know how the control renders. This made it impossible to change the rendering of the control.
The new renderers are solely responsible for rendering the value in some reasonable way. All of the main layout of the control is done by the control itself. Consequently these renderers no longer need all the extra "hidden" parameters passed to INodeContentRenderer, and they now implement IRenderInto.
The following things have changed regarding themes, styles and look-and-feel.
You can use FontAwesome icons in most places where you would usually add an image resource.
The main theme is now a scss theme. Support for scss style sheets is natively included in DomUI: there is no need to translate scss to css, it is done by DomUI's embedded sass part.
The DataPager's look has been fixed so that it properly shows the overflow indicator, and that it uses CSS only for its presentation: