Value Summary
A guide to creating a custom Value Summary in Umbraco. Use it to render a compact value presentation.
The valueSummary extension controls how a value appears in a compact space like a table column. The purpose is to surface the most meaningful parts of the value so users can scan and compare at a glance.
With a Value Summary, you control how values are presented. You can show a date in the user's locale, a status code as a colored badge, or a stored reference resolved to a name. Without a registered summary, raw values appear as plain text.
Creating a Value Summary
The basic Value Summary consists of a manifest, an element, and a Value Type. The Value Type is what tells the renderer which summary to use for a given piece of data:
export type MyStatusValue = 'active' | 'inactive' | 'pending';
export const MY_STATUS_VALUE_TYPE = 'My.ValueType.Status' as const;
declare global {
interface UmbValueTypeMap {
[MY_STATUS_VALUE_TYPE]: MyStatusValue;
}
}Then register a valueSummary manifest. The forValueType property links the manifest to your value type — the renderer looks up summaries by Value Type:
{
type: 'valueSummary',
kind: 'default',
alias: 'My.ValueSummary.Status',
name: 'My Status Value Summary',
forValueType: MY_STATUS_VALUE_TYPE,
element: () => import('./status-value-summary.element.js'),
}The element is responsible for rendering the value. Extend UmbValueSummaryElementBase and override render(). The current value is available as this._value:
A value type can represent any data structure, including complex objects. If your data has a shape, define it accordingly and access its properties directly in render(). A color value with a hex code and a label, for example, lets you render a swatch alongside the name. In this example, the representation comes from information already in the stored value — no server call is needed:
Resolving server-side values
Sometimes the stored value is not meaningful on its own. You might store a key or unique identifier, but want to display a name. In those cases, you need to fetch additional data from the server before you can render the summary. A resolver handles this lookup.
Add a valueResolver property to the manifest pointing to the resolver module:
The resolver module must export the resolver class under the name valueResolver. The extension system looks for this specific export name when loading the module. Because a table can show many rows at once, the resolver receives all values for the entire column in a single batch call. The resolver returns a data array in the same order and length as the input. This is how each resolved result maps back to the correct row. If a value cannot be resolved, include a placeholder at that position to keep the arrays aligned.
If a resolved value can change while the Value Summary is open, return an asObservable function alongside data. For example, a linked entity could be renamed elsewhere in the backoffice. The collection subscribes to the observable and updates displayed values without a full reload.
Many repositories already return an asObservable alongside the data. Pass it through from your fetch call:
The resolved result should still be compact. If you are resolving a reference, show a name or label — not a full entity representation.
Value Summary can be used with Property Editors to display property values in a Document Collection:
Value Summary can also be used in a Table Collection View:
Last updated
Was this helpful?