[xwiki-devs] Handling default values and displaying them in form elements
Hi, devs, While handling https://jira.xwiki.org/browse/XWIKI-14157 (Display the default and inherited values in the Administration), I`m trying to come up with a solution that is applicable more generally and avoid having to manually patch just the problem at hand. We could think of this as a 2 piece problem: 1) getting or specifying the default value (or maybe it's more correct to say default display value?) 2) displaying a form field and handling the default value (view/edit modes) 1) would be much simpler if we only had to handle a flat level class and its objects, but, for XWikiPreferences, we also have the "space<space<wiki<xwiki.cfg" inheritance to consider. This inheritance is done through the use of various ConfigurationSource implementations that delegate one to another. The problem with ConfigurationSource is that, through its use of getPreference(preferenceName, defaultValue), we end up in proliferating default values throughout the code, each time we just want the value of that preference, resulting in a big mess and not knowing what is the default value for that preference and where it is set. I was thinking of adding some: * <T> T getPropertyDefault(String name) method which would allow a ConfigurationSource to handle by itself the retrieval of the default value for a property and a * <T> T getPropertyOrDefault(String name) convenience method for callers to fallback on the internally-determined default value, without caring what it actually is. As an example, this would be useful when calling $xwiki.getXWikiPreference(...) since we don`t have to specify the default value in the caller, but it will be retrieved by performing the fallbacks mechanism space<space<...<wiki<xwiki.cfg. Still for 1) but for ConfigurableClass sections that rely on a simple configuration class (or any other form that relies on properties defined by a class), one idea would be to add a "defaultValue" meta-property (with associated getter/setter in PropertyClass) in the class that allows specifying the default value of a property when defining it. This would allow a displayer to have the default value and properly display it, instead of weird "---" stuff we do now and all kinds of *fake* values, just so that the user can select them. (We may also need a "defaultPrettyValue" or "defaultDisplayValue", with associated getter/setter, for things like DBList). Reminder: We already have a "defaultValue" meta-property for BooleanClass, so it looks like we had the idea before, just did not take it all the way. So XWikiPreferences goes more into the "specifying the default value at display time" workflow, IMO (because we would have to provide the default value that is retrieved from a "special" mechanism, i.e. $xwiki.getXWikiPreference(...))... and we should use the "getting the default value" (from the class property's "defaultValue) as the default behavior, for simple objects of simple classes. Finally, for 2), I`m thinking that we might need a way to also pass the default value to a display() call, overwriting anything else, in order to support custom fields that get their defaults from external sources or other mechanisms that don`t involve the XClass and the "defaultValue" defined there (like XWikiPreferences does, for example, or other custom stuff). This also introduces the problem that not everybody might want a default value proposed in their form for a certain element, so we should also be able to specify, at display time, if the default value should be proposed or not. These optional additions to the display method ("defaultValue", "defaultDisplayValue", "showDefault", etc.), including the existing ones ("prefix", "wrappingSyntaxId", etc.) should probably be done with a new signature that also takes a map of parameters. The aim is to rely as much as possible on $doc.display(property, parameters) when creating forms in XWiki, while also encapsulating the default value to the location responsible for it, and not to the caller. WDYT? Thanks, Eduard
participants (1)
-
Eduard Moraru