In an HTML-form-based user interface (UI), we have a correspondence between the different
kinds of properties defined in the model classes of an app and the form controls used for the
input and output of their values. We have to distinguish between various kinds of model class
attributes, which are
typically mapped to various types of HTML input
fields, and reference properties, which are
typically mapped to HTML select
controls (selection lists). Representing reference properties in the UI
with select
controls, instead of input
fields, prevents the user from
entering invalid ID references, so it takes care of referential
integrity.
In general, a single-valued reference
property can always be represented by a single-select
control in the UI, no matter how many objects populate the reference property's range, from
which one specific choice is to be made. If the cardinality of the reference property's range
is sufficiently small (say, not greater than 7), then we can also use a radio button group instead of a selection list.
A multi-valued reference
property can be represented by a multiple-select
control
in the UI. However, this control is not really usable as soon as there are many (say, more
than 20) different options to choose from because the way it renders the choice is visually
too scattered. In the special case of having only a few (say, no more than 7) options, we can
also use a checkbox group instead of a multiple-selection list. But for the general case
of having in the UI an association list containing all
associated objects choosen from the reference property's range class, we need to develop a
special UI widget that allows to add (and remove) objects to (and from) a list of associated
objects.
Such a multi-select widget consists of
a HTML list element containing the associated objects, where each list item contains a push button for removing the object from the association list;
a single-select
control that, in combination with a push button, allows to
add a new associated object from the range of the multi-valued reference property.