enhancement
major
minor
major
minor
major
#29438
React view layer displays date attributes in a hard-wired format instead of the annotated one
Problem
A tl.core:DateTime attribute was displayed and edited as a plain date in the React view layer: the time was not shown, and editing truncated it.
FieldControlService.primitiveFallback switched on the primitive's TLPrimitive.getKind(), and both tl.core:Date and tl.core:DateTime have kind DATE, so both were handed to the DatePickerControlProvider, whose ReactDatePickerControl was a pure date control: the view-mode display formatted with HTMLFormatter.getInstance().getDateFormat(), and the edit control was an <input type="date"> exchanging an ISO yyyy-MM-dd string, so storing a value through the field truncated it to midnight. Table cells inherited the same behaviour.
Fixed by #29448
DatePickerControlProvider.kind() now reads the ConfigType annotation (DATE_TIME on tl.core:DateTime, TIME on tl.core:Time), ReactDatePickerControl.Kind.DATE_TIME renders an <input type="datetime-local"> exchanging yyyy-MM-dd'T'HH:mm[:ss], the view mode shows the user's date-time format, and table columns use the same kind for filter bounds and default widths.
Remaining defect
A <format> annotation on the attribute did not reach the control:
{{{#!xml <property name="expires" type="tl.core:DateTime">
<annotations>
<format>
<date-time date-style="short" time-style="short"/>
</format>
</annotations>
</property> }}}
ReactDatePickerControl.formatLocalized always used the default format of the kind (HTMLFormatter.getDateTimeFormat() etc.), so the attribute above was still displayed in the medium date-time format, and the filter bounds of a table column over it were parsed with the default formats only. Numbers already honour their <format> annotation (#29531, through DisplayAnnotations); dates did not, although DisplayAnnotations.getConfiguredFormat() resolves a date format annotation just the same.
Lösung
The view layer resolves the date format of an attribute the same way it resolves the number format (FieldControlService.dateFormat()): the <format> annotation at the attribute, the one at its type where the attribute has none, and the user's default format of the kind (date, time of day, date with time) where neither says anything. The format travels through FieldSpec.getDateFormat() into ReactDatePickerControl, which writes the view-mode display with it. One format serves every place the value appears: the read-only form field, the table cell, the text the cell is searched by, and the bounds of that column's filter, which are accepted in the annotated format first and in the kind's default formats as well (FieldControlService.dateInputFormats()). A format declaration that cannot be resolved, or that resolves to a format writing no dates, is logged and the default is used, so a misconfigured attribute still shows its value.
The attribute-then-type lookup is the one the layer already applies to the config-type and boolean-display annotations, now shared as FieldControlService.annotation(). As tl.core:DateTime itself carries <format><format-ref format-id="medium-date-time"/></format>, a DateTime attribute without an annotation of its own is displayed as medium date with short time (17.09.2026, 10:23) in the React UI, no longer with seconds.
PatternBasedFormatDefinition.Config gained the PATTERN property-name constant.
The React demo (demo.react:Demo#dateTimeShort, annotated short/short) shows the difference next to the plain dateTime attribute in the attributes table and forms.
The native browser inputs used in edit mode are unaffected; that they follow the browser's rather than the user's locale is #29595.