I am happy to report that our first full featured (integrated workflow, cool typeAheads, fantastic validation, dynamic tables and many more features) is fully productive!
Thanks to all readers and commenters on my blog and all other bloggers out-there giving me help and insight into the deeper workings of the xPages.
Summarized main difficulties:
- getting the validation to work the way we required (ie. without needing ExtensionLibrary tabbed tables, all fields should be validated, even if currently invisible and the validation should be customizable by the customer himself)
- Solution was: not using validators at all, simply prevent the save with a condition on the action group in the save buttons, the condition is a “result” from our custom validator which sets JSF messages where appropriate
- customized typeAheads (see this blog)
- workflow integration (we can continue to use the LN client based code, which is important as the interface is now working on both “clients”, notes and web)
- certain parts of the form stored in different documents (see this blog)
- dynamic tables which lets the user add new rows to tables of data
- simple yet full featured and customizable views, using the DynamicViewPanel with different filter options per selected view, customizable (via styles) view columns
- fancy field help (see this blog)
- CustomControls!!! change in one place an all occurrences are updated! Subforms in the old LN days were no match at all!!!
- typeAheads
- error messages from server: an HTML 500 error is of no use, sometimes I needed to dissect the whole app again to find where the problem was
- OneUI: it’s a pain in the ass, but we did it, to figure out how to properly change certain GUI elements look and feel (such as typeAheads)
- don’t use JavaScript (or only to call backend Java code) !!!! debugging JavaScript is a pain in the ass where as debugging Java is so straight forward (see this blog) and the speed of the code execution is SOOOOOOOOOOOOOOOOOOOOO freaking fast!!!
- use where ever possible “static” methods so you don’t need to instantiate the class, eg. our StandardUtil class has ONLY static methods such as: getKeywordValues, searchUser (for typeAhead), getSortedDocumentCollection, getEmptyDocumentCollection, hasAccess, hasRole etc.