Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Info
This concept captures several related improvements to the Magnolia forms/dialogs. They address various sides and pain points with the current UI framework, in order to gain flexibility, sanitize our own customizations and expose more easily the key benefits of Vaadin (ease and speed of such developments).

...

  • Exposing hooks on form-level
    • currently only possible on field-level via FieldFactories
    • fields & factories are only aware about themselves, in isolation. They're not aware about other fields and this is harder to do than it should.
  • Use more of Vaadin out of the box
    • less customizations
    • get rid of legacy Vaadin 6.x or client-side code
  • Open up APIs to offer more possibilities (data-binding, or dynamic/ cross-field behaviors)
  • Reduce technical debt

3. Key Concepts

Note

Key concepts highlight the main direction. Details and realization are work-in-progress, and are being revised regularly.

A new Form “component”

  • Focus on The Big Role
  • Create a Vaadin form that can be bound to Magnolia content
  • Most often produce fields from config / definitions
  • Most often bound to JCR items, and saving the session

Separation of concerns

  1. Field creation
    • Responsible for producing raw fields with UI presets, unbound
    • New FieldFactory: Creating Field from FieldDefinition => clear and simple
  2. Data-binding
    • New binding ways, using FieldGroup (later V8 Binder) instead of set/get datasource in Factory
    • Responsible for binding, default-values, transforming, converter, validation setup
    • Item variation (i18n, p13n) through re-binding? 
  3. Layout
    • Responsible for laying out fields in order
    • Plain Vaadin form with tabsheets, no need to customize, code is more clear and easy to maintain
  • ~ Action(s)
    • Form actions vs. Dialog actions (surrounding UI context)

Break free from MVP

In our experience, the (M)VP pattern is generally regarded as an obstacle. Creating custom forms, apps can be delicate at times, and almost all the time involves hefty boilerplate.
—Even on our side, dealing with evolution of short-lived APIs in a framework code base is a challenging exercise.

This Vaadin blog post Is MVP a Best Practice highlights common caveats of the pattern. This somewhat prevents Magnolia developers from leveraging Vaadin to its full extent. 

  • The split between view and presenter is rather artificial; in practice, coupling remains high.
  • Presenter is typically not Vaadin-free: it hosts Vaadin data APIs, while View has Vaadin ui APIs
  • Every single Vaadin binding or interaction required additional View +/- Listener API
  • Unit-tests became slightly too atomic, with little value
  • No UI-tests below full-fledged integration

Instead, we embrace a more domain-driven, component approach.

  • Form is a magnolia View itself
    • at this stage, Form may not even need an interface
  • Remove artificial-rigid-public intercom between presenters & views
  • No specific FormView interface + FormViewImpl

The Form componentImage Added

The Form component

Flexibility

  • Primarily through delegation to functional interfaces
  • Ideally also through decoration (TBD)
  • Alternatively through extension (config typically mandates implClass)
  • Less through custom field-factories
  • Less through complex fields

Configuration

  • Support current common cases ootb, without config changes
  • Gained flexibility is not necessarily exposed through config at first
  • Rather whoever opens the form/dialog is responsible for its setup
    • e.g. OpenEditDialogAction
    • entails providing sugar / builders with good defaults
  • Introduce simplified + more advanced config gradually
    • e.g. fields on root level / less nesting, layout config
  • No intent to expose config on technical terms
    • e.g. no defs for bindings, delegates, generics, all sorts of highly technical classes
  • No intent for declarative config of interaction logic between fields


4. PoC phase

The PoC phase was conducted in September–October 2016. Refer to child-page Dynamic forms - PoC phase for details and outcome.

...

5. Productization phase

Based on the PoC results, we first collected the following tasks, in order to bring new forms on par with the current Magnolia forms.

...

  • Can only be done once the basic stones are in place
  • Prove form-level agility (binding upon field(s) constructed)

F12. [TOFILE] Proof-test new APIs against Vaadin 8

  • Ideally, only the data-binding "part" should be affected, not field creation nor layouting

TODO:

  •  File in JIRA / MGNLUI
  •  Estimate
  •  Flesh out, break out into even smaller tasks
  •  Add relative task dependencies
  •  Set deadline for stabilization

Then reevaluate progress after 2–3w.

Unprocessed ideas

  • (lightbulb) binding strategies: default, transformerDelegate...
  • (lightbulb) expose layouting (default from fieldDef + tabs, declarative, or other new mechanism?, responsive forms?)
  • (lightbulb) save actions bundled in Form itself by default, can be delegated to configured action(s)
    • does validate ootb
  • (lightbulb) extensibility: generate wrapper implementations for component interfaces

Related wishful improvements

—i.e. keep out as long as we can / later scope:

  • Valo-based theme switch
  • Generate concrete FieldDefinitions (& builders) from our interfaces
  • Plain Java Decorators (add/remove field by user-based form decorator)
    • supplanting blossom
  • Documentation generation (via pegdown)