arrow-left

Only this pageAll pages
gitbookPowered by GitBook
1 of 66

13.latest (LTS)

Loading...

Loading...

Loading...

Loading...

Installation

Loading...

Loading...

Upgrading

Loading...

Loading...

Loading...

Getting Started

Loading...

Loading...

Loading...

How-to Guides

Loading...

Areas

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Collections

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Searching

Loading...

Loading...

Filtering

Loading...

Loading...

Loading...

Loading...

Loading...

Actions

Loading...

Loading...

Loading...

Loading...

Cards

Loading...

Loading...

Loading...

Property Editors

Loading...

Loading...

Advanced

Loading...

Loading...

Loading...

Loading...

Loading...

Miscellaneous

Loading...

Loading...

Known Issues

Known issues in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Umbraco UI Builder tries its best to mimic the content pipeline as closely as possible whilst sticking to public and supported APIs. This is so that the Data Type suite can be used fully for editing properties. There are some features in the Umbraco Core that are locked away in internal methods. This means that some features may not be fully supported. Below is a list of known issues to date.

hashtag
Property Editors

hashtag
Tags

Whilst we have support for persisting the tag's value, we don't currently have the ability to write these tags to the cmsTags DB table. This is all handled via a tagsRepository which is internal so we currently can't save to it as core does.

hashtag
Multi-Node Tree Picker

When using a Multi-Node Tree Picker with an XPath filter, only filters starting with the $root placeholder will be valid. This is because all other placeholders expect the property editor to be placed on a content node, with that node being used as context.

hashtag
RTE Macros

Macros in Rich Text Editors don't appear to work properly due to the preview mechanism. They save and run on the front end, but you'll get an error notification in the backoffice as it tries to render a preview.

hashtag
Block Editors

The Block Editors (Block List/Block Grid) are not supported due to an undefined error with umbVariantContent in the $scope chain.

Umbraco UI Builder Documentation

Documentation for Umbraco UI Builder, the backoffice UI builder for Umbraco.

Umbraco UI Builder is the Umbraco v10+ backoffice UI builder for custom data structures configured via a fluent API.

Example Umbraco UI Builder UI

If you have a custom data store that you want to content manage from within Umbraco, then you can use Umbraco UI Builder. With some lines of code, you can configure a custom administration UI, and reuse many core components with a consistent look and feel.

With Umbraco UI Builder, custom backoffice integrations can now take a matter of minutes, rather than days.

hashtag
Using the Documentation

This documentation is aimed at developers who have at least a basic understanding of Umbraco, as well as C#/MVC principles.

If you are new to Umbraco UI Builder, it is recommended that you start by taking a look at the section. This provides details on the system requirements and how to install Umbraco UI Builder.

Once you have Umbraco UI Builder installed and are wondering "What next?" then you'll want to take a look at the section. This provides a quick-start example of how to configure Umbraco UI Builder.

Use the main menu to dive deeper into Umbraco UI Builder and get to know all of its features in detail. You can then jump to the specific topic you are interested in to find out more.

Finally, for all other resources/useful information you can head over to the section.

hashtag
Getting Help

If you require assistance you can use our support channels to seek assistance.

Getting Started
Guides
Miscellaneous

Legacy Documentation

This documentation platform covers only major versions of Umbraco UI Builder. If you are using an unsupported version, you need to go elsewhere.

Umbraco 10 and above Documentation

Release Notes

Get an overview of the things changed and fixed in each version of Umbraco UI Builder.

In this section, we have summarized the changes to Umbraco UI Builder released in each version. Each version is presented with a link to the showing a list of issues resolved in the release. We also link to the individual issues themselves from the detail.

If there are any breaking changes or other issues to be aware of when upgrading they are also noted here.

circle-info

If you are upgrading to a new major version, check the breaking changes in the article.

Overview

Configuring collection in Umbraco UI Builder, the backoffice UI builder for Umbraco.

A collection is the cornerstone Umbraco UI Builder config and it represents a collection of entities for a given data model. From this config object, you can configure everything about how this collection integrates into the UI. You can also configure how it should display in a list view as well as how it should be edited.

Get started by reviewing the basics of collection configuration.

Overview

Configuring actions in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Actions provide an API to perform custom tasks against a collection and its entities from multiple locations in the UI. Examples: menu actions, bulk actions, or individual table row actions.

Get started with actions by learning about the basics.

The Basicschevron-right
A collection list view
The Basicschevron-right
Bulk Actions UI
hashtag
Release History

This section contains the release notes for Umbraco UI Builder 13 including all changes for this version.

hashtag
13.2.4arrow-up-right (April 30th 2025)

  • Added localization for tree headers and list views empty state message #115arrow-up-right

hashtag
13.2.3arrow-up-right (April 4th 2025)

  • Removed global registration of UDI converters #144arrow-up-right and introduced new Entity Identifier Converters.

hashtag
13.2.2arrow-up-right (March 21st 2025)

  • Fixed an issue for bulk actions that disabled the actions row on cancel #130arrow-up-right

  • Extended UdiConverter with options to convert to GUID #108arrow-up-right

hashtag
13.2.1arrow-up-right (March 17th 2025)

  • Added the ActivatorUtilitiesConstructor attribute to the ImportActionEntity constructor.

hashtag
13.2.0 (March 4th 2025)

  • Updated licensing engine.

  • Fixed issue with import entity action for Umbraco Cloud websites #92arrow-up-right

hashtag
13.1.7arrow-up-right (January 22nd 2025)

  • Added updates to the licensing engine.

hashtag
13.1.6arrow-up-right (December 16th 2024)

  • Added previously validated license resolver, to validate a license if a validation process was already executed successfully in the past 7 days.

  • Fixed an issue caused by where clauses for filter expression and deleted property.

  • Allow entity properties to be searched based on pattern: StartsWith | Contains

  • Switch entity create/edit header to label view for read-only collections

hashtag
13.1.5 (June 17th 2024)

  • Fixed an issue that did not allow a readonly field to be added multiple times to an editor #105arrow-up-right

hashtag
13.1.4arrow-up-right (May 13th 2024)

  • Added support for using properties of nested objects as searchable #97arrow-up-right

You can read more about this in the searchable properties article.

hashtag
13.1.3 (May 8th 2024)

  • Fixed an issue with the UdiConverter affecting child collections #99arrow-up-right

hashtag
13.1.2 (April 23rd 2024)

  • Fixed an issue with nested objects in collection entities #97arrow-up-right

  • Fixed an issue with the UdiConverter causing website configuration binding to return incorrect values #96arrow-up-right

hashtag
13.1.1 (March 18th 2024)

  • Fixed an issue where the database is getting disposed in a UIBuilder repository, causing an error when Forms tries to save the form submission after the workflow is complete Umbraco.Forms.Issues#1179arrow-up-right.

  • Allow renaming the heading of the implicit Name column by calling the SetNameProperty method overload.

You can read more about this in the basics article.

  • Use CsvHelper library with the built in ExportEntityAction.

  • Update CsvHelper version dependency.

hashtag
13.1.0arrow-up-right (March 6th 2024)

  • All updates listed under 13.1.0-rc1 and 13.1.0-rc2.

hashtag
13.1.0-rc2arrow-up-right (February 26th 2024)

  • Upgrade from 13.0.3 to 13.1.0-rc1 breaks existing custom repository. #91arrow-up-right

While working with a custom repository, the entity ID type converter defaulted to the newly registered UdiConverter instead of Int32Converter. With the current update, the required converter will be picked in a different order.

hashtag
13.1.0-rc1arrow-up-right (February 20th 2024)

Umbraco UI Builder 13.1 is the first release since launch adding new features. We've focussed on improving the experience when working with related collections, addressing some additional use cases that widen the scope of the product. This includes the possibility to retrieve child collections entities or use an Umbraco entity as foreign key.

  • Related Collections

This feature provides support for managing many-to-many relationships by configuring main, related and junction entities.

You can read more about this in the related collections article.

  • Retrieve Child Collections

This feature addresses a one-to-many relationship context. Having a parent collection with child sub-collections, one might need to retrieve the child collections only, without fetching the details of the parent.

You can read more about this in the retrieve child collections article.

  • Implementation of a UdiConverter

This update addresses the configuration of collections that use as foreign key a reference to an Umbraco entity. If the FK type is Integer, the persisted value defaults to 0. This is because the UDI value of the entity cannot be converted from String to Int. Based on the UDI value, we are retrieving and persisting the Id of the Umbraco entity.

A use case can be found in the GitHub issue #86arrow-up-right.

hashtag
13.0.3arrow-up-right (February 20th 2024)

  • Dependency version update for Umbraco.Licenses

hashtag
13.0.2arrow-up-right (January 26th 2024)

  • Doesn't work after upgrading to 13.0.3 #88arrow-up-right

  • Dependency issue when installing UIBuilder alongside Umbraco Commerce in a v13 Umbraco website #82arrow-up-right

  • Dependency issue when installing UIBuilder alongside uSync in a v13 Umbraco website #85arrow-up-right

  • Fields in Sidebar are not included when creating item

hashtag
13.0.1 (January 11th 2024)

  • Fix built-in export/import actions errors #84arrow-up-right

  • Update list view editorState to support integration with Contentment Data Types #83arrow-up-right

hashtag
13.0.0 (December 13th 2023)

  • Upgraded to run again Umbraco v13 and .NET 8

  • Upgraded all 3rd party dependencies

  • Nullable references

hashtag
Legacy release notes

You can find the release notes for Konstrukt in the Change log file on GitHubarrow-up-right.

UI Builder issue trackerarrow-up-right
Version Specific Upgrade Notes

Summary Dashboards

Configuring a summary dashboard in Umbraco UI Builder, the backoffice UI builder for Umbraco.

A summary dashboard is automatically displayed at the root of a defined Umbraco UI Builder section. It displays summaries of collections found within it that are told to display on the dashboard. It also provides quick links to jump to that collections list view. It can also add quickly a new entry to that collection (if the collection isn't read-only).

Summary Dashboard

hashtag
Showing a collection on a summary dashboard

Showing a collection in the summary dashboard is controlled via the collection configuration.

hashtag
ShowOnSummaryDashboard() : CollectionConfigBuilder<TEntityType>

Sets the collection to display on the summary dashboard.

circle-exclamation

Only section root level collections can be shown on the summary dashboard.

Overview

Getting Started with Umbraco UI Builder, the backoffice UI builder for Umbraco.

This section will guide you through the key steps necessary to get you started with Umbraco UI Builder.

It is assumed that you have an Umbraco 10+ website configured, and ready to install Umbraco UI Builder.

circle-info

Find detailed instructions on how to install the latest version of Umbraco in the Umbraco CMS documentationarrow-up-right.

hashtag
System Requirements

At this time, the minimum requirements for using Umbraco UI Builder are as follows:

  • Umbraco CMS version 10.0/12.0+

  • SQL Server Database (SQLite is fine for testing, but not recommended for live deployments)

hashtag
Versioning

This is an add-on product to Umbraco CMS. Umbraco UI Builder follows the .

Overview

Configuring cards in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Cards provide an API to display basic summary information in a card-based format and are useful for displaying key metrics about a collection.

Cards

Cards can be defined in one of two ways:

Count Cardschevron-rightCustom Cardschevron-right

Licensing

Umbraco UI Builder is a commercial product. You can run an Umbraco UI Builder unrestricted locally without the need a license. Running Umbraco UI Builder on a public domain will display a warning banner in the backoffice and will limit usage to a single editable collection. To remove these restrictions, you'll need to have a valid license.

hashtag
How does it work?

Licenses are sold per backoffice domain and will also work on all subdomains. If you have alternative staging/qa environment domains, additional domains can be added to the license on request.

Upgrading Umbraco UI Builder

This article shows how to manually upgrade Umbraco UI Builder to run the latest version. When upgrading Umbraco UI Builder, be sure to also consult the notes to learn about potential breaking changes and common pitfalls.

circle-exclamation

Before upgrading, it is always advisable to take a complete backup of your site and database.

User Interface

Key User Interface Concepts used by Umbraco UI Builder, the backoffice UI builder for Umbraco.

Before you get to know Umbraco UI Builder, you need to become familiar with the Umbraco UI and a few of its concepts. This is because Umbraco UI Builder reuses these same concepts for constructing its UI.

1. Section A distinct area of the Umbraco backoffice.2. Tree A hierarchical structure to help organize a section. 3. Dashboard An intro screen for a section, usually with useful links for that section.

4. List View A list-based view of items in a tree node.

Entity Identifier Converters

Using Umbraco entities as reference with an UI Builder collection

Umbraco stores identifiers in UDI format for most Umbraco object types.

You can read more about them in the section of the documentation.

If you want to reference an Umbraco object in your model and retrieve its Integer or Guid value, you must convert the UDI value.

Use one of UI Builder's converters - EntityIdentifierToIntTypeConverter or EntityIdentifierToGuidTypeConverter

Child Collections

Configuring child collections in Umbraco UI Builder, the backoffice UI builder for Umbraco.

A child collection is a container for a given data model that is tied to a parent collection data model. It shares all of the config builder API except child collections cannot contain further child collections.

circle-info

Child Collections UI: By default, child collections will be presented in the UI as context apps in the parent models editor view. If you have multiple child collections that make the context apps area overpopulated, you can use the . By using this you can group child collections under a single context app with the inner child collections then being presented in tabs.

Overview

Choosing an area to connect Umbraco UI Builder, the backoffice UI builder for Umbraco.

There are different areas of the Umbraco UI that Umbraco UI Builder can be injected into. Before you get to managing your actual content you need to choose which area makes the most sense to present that data in. Then you can review how to go about configuring that particular type of area.

Choose an area type from the list below to find out more.

Overview

Configuring searching in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Beyond listing collection entities, if you need to be able to locate specific entities within a collection then Umbraco UI Builder provides a search API.

Get started by reviewing how to define searchable properties.

Configuration

Configuring Umbraco UI Builder, the backoffice UI builder for Umbraco.

Umbraco UI Builder can be configured directly via the AddUIBuilder extension method on IUmbracoBuilder.

hashtag
AddUIBuilder

To configure Umbraco UI Builder via the AddUIBuilder

circle-info

The licenses are not bound to a specific product version. They will work for all versions of the related product.

Let's say that you have a license configured for your domain, mysite.com, and you've requested two development domains, devdomain.com and devdomain2.com.

The license will cover the following domains:

  • localhost

  • *.local

  • *.mysite.com

  • www.mysite.com

  • devdomain.com

  • www.devdomain.com

  • devdomain2.com

  • www.devdomain2.com

circle-info

You can have only 1 license per Umbraco installation.

hashtag
What does a license cover?

There are a few differences as to what the licenses cover:

  • A single license covers the installation of Umbraco UI Builder in 1 production backoffice domain, as well as in any requested development domains.

  • The production domain includes all subdomains (e.g. *.mysite.com).

  • The development domains work with or without the www subdomain.

  • The license allows for an unlimited number of editable collections.

  • The license also includes localhost and *.local as a valid domain.

circle-info

If you have multiple backoffice domains pointing at the same installation, you can purchase and add additional domains to your license.

This is an add-on domain for existing licenses. Refunds will not be given for this product.

hashtag
Purchasing your license

You can look at the pricing, features, and purchase a license on the Umbraco UI Builderarrow-up-right page. On this page, you can fill out the form with your project details and requirements. A member of the Sales team will manage this process. In the process, you will need to provide all domains you wish to have covered by the license such as primary and staging/QA domains. You should then receive a license code to be installed in your solution.

hashtag
Add additional domains

If you require to add additional domains to the license, reach out to the sales teamarrow-up-right. They will manage your request and take care of the process.

hashtag
Configuring your license

Once you've purchased your license with the correct domains, you are ready to configure the license key on your Umbraco installation.

The license key should be added to your configuration using product ID: Umbraco.UIBuilder.

For detailed instructions on how to install and configure your license, including version-specific examples and additional configuration options, see the Configure Licensesarrow-up-right article.

#116arrow-up-right
#111arrow-up-right
#82arrow-up-right
versioning strategy laid out for Umbraco CMSarrow-up-right
Sectionschevron-right
Dashboardschevron-right
Context Appschevron-right
Searchable Propertieschevron-right
Search

Overview

Property Editors available with Umbraco UI Builder, the backoffice UI builder for Umbraco.

As well as the API for managing your custom data source, Umbraco UI Builder also comes with some property editors. Those property editors help you work with your data inside Umbraco content nodes.

The property editors available are:

Entity Pickerchevron-right

Inbuilt Actions

A list of inbuilt actions that come with Umbraco UI Builder, the backoffice UI builder for Umbraco.

Umbraco UI Builder comes with some inbuilt actions that are available for you to use straight away.

hashtag
ExportEntityAction

Namespace Umbraco.UIBuilder.Infrastructure.Configuration.Actions

Provides a Comma-Separated Values (CSV) export functionality converting all properties to column headings and rendering each entity property values on each row.

hashtag
ImportEntityAction

Namespace Umbraco.UIBuilder.Infrastructure.Configuration.Actions

Provides a Comma-Separated Values (CSV) import functionality matching column headings with entity properties and mapping row values to an entity.

Conventions

Conventions used by Umbraco UI Builder, the backoffice UI builder for Umbraco.

hashtag
Fluent Conventions

Most configuration methods in Umbraco UI Builder aim to be fluent. This means that they return a relevant config instance allowing to chain multiple methods calls together in one. For those who prefer to be a bit more verbose, many methods also accept an optional lambda expression. This allows you to pass in a delegate to perform the inner configuration of the element being defined.

// Chaining example
config.AddSection("Repositories").Tree().AddCollection<People>(p => p.Id, "Person", "People");

// Delegate example
config.AddSection("Repositories", sectionConfig => {
    sectionConfig.Tree(treeConfig => {
        treeConfig.AddCollection<People>(p => p.Id, "Person", "People");
    });
});

hashtag
Naming Conventions

Throughout the API, where a method name starts with Add then multiple configurations can be declared. Whereas if a method name starts with Set then only one instance of the configuration can be declared within the current configuration context.

hashtag
Get the latest version of Umbraco UI Builder

To upgrade to the latest version of Umbraco UI Builder you can use:

  • NuGet

  • Visual Studio

hashtag
NuGet

  • NuGet installs the latest version of the package when you use the dotnet add package Umbraco.UIBuilder command unless you specify a package version: dotnet add package Umbraco.UIBuilder --version <VERSION>

  • After you have added a package reference to your project by executing the dotnet add package Umbraco.UIBuilder command in the directory that contains your project file, run dotnet restore to install the package.

hashtag
Visual Studio

  1. Go to Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution... in Visual Studio, to upgrade Umbraco UI Builder:

  2. Select Umbraco.UIBuilder.

  3. Select the latest version from the Version drop-down and click Install.

  4. When the command completes, open the .csproj file to make sure the package reference is updated:

If you are using one or more of the below sub-packages, they also need to be upgraded as well:

Sub-package
Description

Umbraco.UIBuilder.Core

Core UI Builder functionality that doesn't require any infrastructure-specific dependencies

Umbraco.UIBuilder.Infrastructure

Infrastructure-specific project containing implementations of core UI Builder functionality

Umbraco.UIBuilder.Web

The core UI Builder logic that requires a web context

Umbraco.UIBuilder.Web.StaticAssets

The static assets for the UI Builder presentation layer

Umbraco.UIBuilder.Startup

The main logic for registering UI Builder with Umbraco

Umbraco.UIBuilder

The main UI Builder package

version specific upgrade
. Add it as a
[TypeConverterAttribute]
to your model's foreign key property.

An entity that references an Umbraco object would look like this:

You can also create a custom type converter. UI Builder will handle data persistence automatically.

UDI Identifiersarrow-up-right
    [TableName(TableName)]
    [PrimaryKey("Id")]
    public class MemberReview
    {
        public const string TableName = "MemberReview";

        [PrimaryKeyColumn]
        public int Id { get; set; }

        public string Title { get; set; }

        public string Content { get; set; }

        [TypeConverter(typeof(EntityIdentifierToIntTypeConverter))]
        public int MemberId { get; set; }
    }
hashtag
Defining a child collection

You define a child collection by calling one of the AddChildCollection methods on a given collection config builder instance.

hashtag
AddChildCollection<TChildEntityType>(Lambda idFieldExpression, Lambda fkFieldExpression, string nameSingular, string namePlural, string description, Lambda childCollectionConfig = null) : ChildCollectionConfigBuilder<TEntityType>

Adds a child collection to the current collection with the given names and description and default icons. A property accessor expression is required for both the entity ID field and FK (Foreign Key) field of the entity.

hashtag
AddChildCollection<TChildEntityType>(Lambda idFieldExpression, Lambda fkFieldExpression, string nameSingular, string namePlural, string description, string iconSingular, string iconPlural, Lambda childCollectionConfig = null) : ChildCollectionConfigBuilder<TEntityType>

Adds a child collection to the current collection with the given names, description and icons. A property accessor expression is required for both the entity ID field and FK (Foreign Key) field of the entity.

hashtag
Configuring a child collection

Child collections share the same API as the Collection config builder API, except child collections cannot contain further child collections. For more information check the core collections documentation.

Collections
Child Collection Groups API
Child Collections
extension method, you can look at the
Program.cs
file at the root of your web project. From within this file, before the call to
AddComposers()
you can add the
AddUIBuilder
configuration.

Alternatively, if your project is upgraded from earlier versions, you can add the configuration to the Startup.cs file.

The AddUIBuilder extension method accepts a single parameter, a delegate function with one of the Umbraco UI Builder configuration builder arguments. With this, you can call the relevant fluent APIs to define your solution.

builder.CreateUmbracoBuilder()
    .AddBackOffice()
    .AddWebsite()
    .AddUIBuilder(cfg => {
                // Apply your configuration here
    })
    .AddDeliveryApi()
    .AddComposers()
    .Build();
// Example
collectionConfig.ShowOnSummaryDashboard();
<ItemGroup>
  <PackageReference Include="Umbraco.UIBuilder" Version="xx.x.x" />
</ItemGroup>
// Example
collectionConfig.AddChildCollection<Child>(c => c.Id, c => c.ParentId, "Child", "Children", "A collection of children", childCollectionConfig => {
    ...
});
// Example
collectionConfig.AddChildCollection<Child>(c => c.Id, c => c.ParentId, "Child", "Children", "A collection of children", "icon-umb-users", "icon-umb-users", childCollectionConfig => {
    ...
});
5. Editor The main content editing area is made up of tabs, fieldsets, and fields.
Context Apps and Tabs

6. Context Apps A contextual section of a given editor UI.7. Tabs A tabbed container of content.

Menu Item

8. Menu Item A context menu item + action.

Bulk Action

9. Bulk Action An action to perform on multiple list view items at once.

Sections, Trees, and Dashboards
List View
Editor

Repositories

Configuring repositories in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Repositories are used by Umbraco UI Builder to access the entity data stores. By default, collections will use a generic built-in NPoco repository. However, you can define your own repository implementation should you wish to store your entities via an alternative strategy.

hashtag
Defining a repository

To define a repository create a class that inherits from the base class Repository<TEntity, TId> and implements all of its abstract methods.

Note: For all Impl methods there are public alternatives without the Impl suffix. However, there are separate implementation methods in order to ensure all repositories fire the relevant Umbraco UI Builder events. This is whether triggered via the Umbraco UI Builder's UI or not.

hashtag
Changing the repository implementation of a collection

hashtag
SetRepositoryType<TRepositoryType>() : CollectionConfigBuilder<TEntityType>

Sets the repository type to the given type for the current collection.

hashtag
SetRepositoryType(Type repositoryType) : CollectionConfigBuilder<TEntityType>

Sets the repository type to the given type for the current collection.

hashtag
Accessing a repository in code

To help with accessing a repository (default or custom) Umbraco UI Builder has an IRepositoryFactory you can inject into your code base. This includes a couple of factory methods to create the repository instances for you. Repositories should only be created via the repository factory as there are some injected dependencies that can only be resolved by Umbraco UI Builder.

hashtag
IRepositoryFactory.GetRepository<TEntity, TId>() : Repository<TEntity, TId>

Creates a repository for the given entity type. Umbraco UI Builder will search the configuration for the first section/collection with a configuration for the given entity type. Then it will use that as a repository configuration.

hashtag
IRepositoryFactory.GetRepository<TEntity, TId>(string collectionAlias) : Repository<TEntity, TId>

Creates a repository for the given entity type from the collection with the given alias.

Data Views Builders

Configuring data views builders in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Data views builders allow you to create a collection data views list dynamically at run time. By default, Umbraco UI Builder will use the hard-coded data views defined in your Umbraco UI Builder config. However, if you need to build your data views list dynamically, then this is when you'd use a data views builder.

When Umbraco UI Builder resolves a data views builder it will attempt to do so from the global DI container. This means you can inject any dependencies that you require for your builder. If there is no type defined in the DI container, Umbraco UI Builder will fall-back to manually instantiating a new instance of value mapper.

hashtag
Defining a data views builder

To define a data views builder you can create a class that inherits from the base class DataViewsBuilder<TEntityType> and implements the abstract methods.

The required methods are:

  • GetDataViews: Returns the list of data views to choose from.

  • GetDataViewWhereClause: Returns the boolean where clause expression for the given data views alias.

hashtag
Setting the data views builder of a collection

Setting a data views builder is controlled via the configuration.

hashtag
SetDataViewsBuilder<TDataViewsBuilder>() : CollectionConfigBuilder<TEntityType>

Sets the collections data views builder which allows you to define the data views dynamically at run time.

hashtag
SetDataViewsBuilder(Type dataViewsBuilderType) : CollectionConfigBuilder<TEntityType>

Sets the collections data views builder which allows you to define the data views dynamically at run time.

hashtag
SetDataViewsBuilder(DataViewsBuilder<TEntityType> dataViewsBuilder) : CollectionConfigBuilder<TEntityType>

Sets the collections data views builder which allows you to define the data views dynamically at run time.

Searchable Properties

Configuring searchable properties in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Searchable properties allow you to define any String based properties on a model. They will be searchable via Umbraco UI Builder's list view and entity picker search controls.

You can also use any String based property of nested objects of a model, as long as the parent object is not null.

Search

hashtag
Defining searchable properties

hashtag
AddSearchableProperty(Lambda searchablePropertyExpression) : CollectionConfigBuilder<TEntityType>

Adds the given property to the searchable properties collection.

hashtag
Search Expression Pattern

Up to version 13.1.6, the search was performed using the StartsWith method call. From 13.1.6 and up, search operations can be performed using the Contains method call.

Installing Umbraco UI Builder

Installing Umbraco UI Builder, the backoffice UI builder for Umbraco.

Umbraco UI Builder is installed via the NuGet package manager by issuing the following command in your web project.

dotnet add package Umbraco.UIBuilder

If you wish to install Umbraco UI Builder into a class library without the UI elements, you can add a reference to the Umbraco.UIBuilder.Startup package instead.

dotnet add package Umbraco.UIBuilder.Startup

Alternatively, you can also find and install the NuGet package via the NuGet Package Manager graphical user interface (GUI) in Visual Studio.

hashtag
Installing a License

See the for details on how to install a license.

Encrypted Properties

Configuring encrypted properties in Umbraco UI Builder, the backoffice UI builder for Umbraco.

If needed to collect sensitive information in a collection but don't want to persist in a plain text format to the data storage mechanism. Umbraco UI Builder can help with this by allowing you to define properties as encrypted. After which any time the value is persisted or retrieved from persistence, Umbraco UI Builder will automatically encrypt and decrypt the value.

circle-info

Umbraco UI Builder uses the IDataProtectionProvider instance registered in the DI container to perform its encryption/decryption. If you need to change the encryption algorithm, you should replace the IDataProtectionProvider instance in the DI container.

hashtag
Defining encrypted properties

hashtag
AddEncryptedProperty(Lambda encryptedPropertyExpression) : CollectionConfigBuilder<TEntityType>

Adds the given property to the encrypted properties collection. Property must be of type String. When set, the property will be encrypted/decrypted on write/read respectively.

Field Views

Configuring field views in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Field Views allow you to customize the markup used by a field when displayed in a list view. Field Views are implemented as .NET Core View Components that are passed a single FieldViewsContext argument with information about the entity/field being rendered.

hashtag
Defining a field view

You can define a field view in one of two ways.

Value Mappers

Configuring value mappers in Umbraco UI Builder, the backoffice UI builder for Umbraco.

A value mapper is an Umbraco UI Builder helper class that sits between the editor UI and the database. It also lets you tweak the stored value of a field. By default Umbraco UI Builder will save a datatype value as it would be stored in Umbraco. Value mappers let you change this.

When Umbraco UI Builder resolves a value mapper it will attempt to do so from the global DI container. This means you can inject any dependencies that you require for your mapper. If there is no type defined in the DI container, Umbraco UI Builder will fall-back to manually instantiating a new instance of value mapper.

hashtag
Defining a value mapper

Retrieve Child Collections

Configuring **one-to-many** relationships in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Retrieving child collections in one-to-many relationships with UI Builder, can be achieved with the support of child repositories. One-to-many relations are where one parent entity of a collection is associated with multiple entities from another.

hashtag
Models Representation

The models would look like this:

Child Collection Groups

Configuring child collection groups in Umbraco UI Builder, the backoffice UI builder for Umbraco.

A child collection group is a container for other child collections. Its purpose is mainly to provide a logical grouping of multiple child collections to help with organization and an improved user experience.

hashtag
Defining a child collection group

You can define a child collection group by calling one of the AddChildCollectionGroup

Data Views

Configuring data views in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Data views allow you to define multiple, pre-filtered views of the same data source. This can be useful when entities exist in different states and you want a way to toggle between them.

hashtag
Defining data views

Data views are defined via the configuration.

Global Filters

Configuring a global filter in Umbraco UI Builder, the backoffice UI builder for Umbraco.

If you want to work with a subset of data within a given collection then this is where the global filters come in handy. These allow you to define a filter to apply to all queries for a given collection.

hashtag
Applying a global filter

Applying a global filter is controlled via the configuration.

Version Specific Upgrade Notes

Version specific documentation for upgrading to new major versions of Umbraco UI Builder.

This page covers specific upgrade documentation for when migrating to major 13 of Umbraco UI Builder.

circle-info

If you are upgrading to a new minor or patch version, you can find information about the breaking changes in the article.

// Example
public class PersonRepository : Repository<Person, int> {

    public PersonRepository(RepositoryContext context)
        : base(context)
    { }

    protected override int GetIdImpl(Person entity) {
        return entity.Id;
    }

    protected override Person GetImpl(int id) {
        ...
    }

    protected override Person SaveImpl(Person entity) {
        ...
    }

    protected override void DeleteImpl(int id) {
        ...
    }

    protected override IEnumerable<Person> GetAllImpl(Expression<Func<Person, bool>> whereClause, Expression<Func<Person, object>> orderBy, SortDirection orderByDirection) {
        ...
    }

    protected override PagedResult<Person> GetPagedImpl(int pageNumber, int pageSize, Expression<Func<Person, bool>> whereClause, Expression<Func<Person, object>> orderBy, SortDirection orderByDirection) {
        ...
    }

    protected override long GetCountImpl(Expression<Func<Person, bool>> whereClause) {
        ...
    }

    protected override IEnumerable<TJunctionEntity> GetRelationsByParentIdImpl<TJunctionEntity>(int parentId, string relationAlias)
    {
        ...
    }

    protected override TJunctionEntity SaveRelationImpl<TJunctionEntity>(TJunctionEntity entity)
    {
        ...
    }
}
Licensing page
hashtag
Version Specific Upgrade Notes History

Version 13 contains a number of breaking changes from the previous, Konstrukt product.

See the Migrate from Konstrukt to Umbraco UI Builder guide for full details.

hashtag
Legacy version specific upgrade notes

You can find the version specific upgrade notes for versions out of support in the Legacy documentation on GitHubarrow-up-right.

Release Notes
collections
// Example
collectionConfig.AddEncryptedProperty(p => p.Secret);
hashtag
1. A basic view file for the built in FieldView view component

The simplest way to define a field view for non-complex fields is to place a view file in the /Views/Shared/Components/FieldView folder with the following markup.

When registering a basic file view you can pass the name of the view file (excluding the .cshtml file extension) to the relevant API method.

hashtag
2. A complete custom view component

To define a more complex field view you can create your own view component class (which can use dependency injection for any required dependencies). This can be done by using the following signature:

circle-info

It's important to know that the FieldViewContext parameter to the InvokeAsync method MUST be named context.

For the view element of your component, based on the example above, you would place a file Default.cshtml into the /Views/Shared/Components/MyComplexFieldView folder with the following markup:

hashtag
The field view context

Field view components are passed a FieldViewContext object with the following information:

hashtag
Setting the field view of a list view field

A field view is assigned to a list view field as part of the list view configuration. For more information you can check the List View Documentation.

To define a mapper create a class that inherits from the base class ValueMapper and implements the methods EditorToModel and ModelToEditor.

hashtag
Setting a field value mapper

Value mappers are defined as part of a collection editor field configuration.

hashtag
SetValueMapper<TMapperType>() : EditorFieldConfigBuilder<TEntityType, TValueType>

Set the value mapper for the current field.

hashtag
SetValueMapper(Type mapperType) : EditorFieldConfigBuilder<TEntityType, TValueType>

Set the value mapper for the current field.

hashtag
SetValueMapper(Mapper mapper) : EditorFieldConfigBuilder<TEntityType, TValueType>

Set the value mapper for the current field.

hashtag
Child Repositories

You can create child repository instances via the IRepositoryFactory and use them to retrieve information from the child collection.

[TableName("Students")]
[PrimaryKey("Id")]
public class Student
{
    [PrimaryKeyColumn]
    public int Id { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string Email { get; set; }
}
[TableName("StudentProjects")]
[PrimaryKey("Id")]
public class StudentProject
{
    [PrimaryKeyColumn]
    public int Id { get; set; }

    public string Name { get; set; }

    public int StudentId { get; set; }
}
methods on a given collection config builder instance.

hashtag
AddChildCollectionGroup(string name, Lambda childCollectionGroupConfig = null) : ChildCollectionGroupConfigBuilder

Adds a child collection group to the current collection with the given name and default icon.

hashtag
AddChildCollectionGroup(string name, string icon, Lambda childCollectionGroupConfig = null) : ChildCollectionGroupConfigBuilder

Adds a child collection group to the current collection with the given name and icon.

Child Collection Groups
hashtag
AddDataView(string name, Lambda whereClauseExpression) : CollectionConfigBuilder<TEntityType>

Adds a data view with the given name and where clause filter expression. Expression must be a boolean expression.

hashtag
AddDataView(string group, string name, Lambda whereClauseExpression) : CollectionConfigBuilder<TEntityType>

Adds a data view with the given group, name and where clause filter expression. Expression must be a boolean expression.

collections
Data Views
hashtag
SetFilter(Lambda whereClauseExpression) : CollectionConfigBuilder<TEntityType>

Sets the filter where clause expression. Expression must be a boolean expression.

collections
// Example
collectionConfig.SetFilter(p => p.Current);
// Example
collectionConfig.SetRepositoryType<PersonRepositoryType>();
// Example
collectionConfig.SetRepositoryType(typeof(PersonRepositoryType));
// Example
public class MyController : Controller
{
    private readonly Repository<Person, int> _repo;

    public MyController(IRepositoryFactory repoFactory) 
    {
        _repo = repoFactory.GetRepository<Person, int>();
    }
}
// Example
public class MyController : Controller
{
    private readonly Repository<Person, int> _repo;

    public MyController(IRepositoryFactory repoFactory) 
    {
        _repo = repoFactory.GetRepository<Person, int>("person");
    }
}
// Example
public class PersonDataViewsBuilder : DataViewsBuilder<Person>
{
    public override IEnumerable<DataViewSummary> GetDataViews()
    {
        // Generate and return a list of data views
    }

    public override Expression<Func<Person, bool>> GetDataViewWhereClause(string dataViewAlias)
    {
        // Return a where clause expression for the supplied data view alias
    }
}
// Example
collectionConfig.SetDataViewsBuilder<PersonDataViewsBuilder>();
// Example
collectionConfig.SetDataViewsBuilder(typeof(PersonDataViewsBuilder));
// Example
collectionConfig.SetDataViewsBuilder(new PersonDataViewsBuilder());
// Example
collectionConfig.AddSearchableProperty(p => p.FirstName);
collectionConfig.AddSearchableProperty(p => p.Address.Street);
// Example
collectionConfig.AddSearchableProperty(p => p.FirstName); // will search for keywords that start with.
collectionConfig.AddSearchableProperty(p => p.FirstName, SearchExpressionPattern.Contains); // will search for keywords that are contained.
@model Umbraco.UIBuilder.Web.Models.FieldViewContext
<!-- Insert your markup here -->
// Example
public class MyComplexFieldViewViewComponent : ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync(FieldViewContext context)
    {
        // Do your custom logic here

        return View("Default", model);
    }
}
@model Namespace.Of.Model.Returned.By.Custom.ViewComponent
<!-- Insert your markup here -->
public class FieldViewContext
{
    public string ViewName { get; set; }
    public object Entity { get; set; }
    public string PropertyName { get; set; }
    public object PropertyValue { get; set; }
}
// Example
public class MyValueMapper : ValueMapper
{
    public override object EditorToModel(object input)
    {
        // Tweak the input and return mapped object
        ...
    }

    public override object ModelToEditor(object input)
    {
        // Tweak the input and return mapped object
        ...
    }    
}
// Example
fieldConfig.SetValueMapper<MyValueMapper>();
// Example
fieldConfig.SetValueMapper(typeof(MyValueMapper));
// Example
fieldConfig.SetValueMapper(new MyValueMapper());
public class StudentProjectController : Controller
{
    private readonly IRepositoryFactory _repositoryFactory;

    public StudentProjectController(IRepositoryFactory repositoryFactory)
    {
        _repositoryFactory = repositoryFactory;
    }

    public IActionResult Index(int projectId)
    {
        var childRepository = _repositoryFactory.GetChildRepository<int, StudentProject, int>(projectId);

        var list = childRepository.GetAll();

        var count = childRepository.GetCount();

        var listPaged = childRepository.GetPaged();

        return View(list);
    }
}
// Example
collectionConfig.AddChildCollectionGroup("Family", childCollectionGroupConfig => {
    ...
});
// Example
collectionConfig.AddChildCollectionGroup("Family", "icon-users", childCollectionGroupConfig => {
    ...
});
// Example
collectionConfig.AddDataView("Active", p => p.IsActive);
// Example
collectionConfig.AddDataView("Status", "Active", p => p.IsActive);

Dashboards

Configuring dashboards in Umbraco UI Builder, the backoffice UI builder for Umbraco.

A dashboard is a view that is displayed at the root of a section and contains welcome information. It also includes useful tools relevant to the given section. When there are multiple dashboards to display in a section these are presented in a tabbed layout to allow you to switch between the dashboards.

Dashboards

hashtag
Defining a dashboard

You can define a dashboard by calling one of the AddDashboard methods on either a or a instance.

hashtag
AddDashboard(string name, Lambda dashboardConfig = null) : DashboardConfigBuilder

Adds a dashboard with the given name.

hashtag
AddDashboardBefore(string beforeAlias, string name, Lambda dashboardConfig = null) : DashboardConfigBuilder

Adds a dashboard with the given name before the dashboard with the given alias.

hashtag
AddDashboardAfter(string afterAlias, string name, Lambda dashboardConfig = null) : DashboardConfigBuilder

Adds a dashboard with the given name after the dashboard with the given alias.

hashtag
Changing a dashboard alias

hashtag
SetAlias(string alias) : DashboardConfigBuilder

Sets the alias of the dashboard.

Optional: When adding a new dashboard, an alias is automatically generated from the supplied name for you. However, if you need a specific alias you can use the SetAlias method to override this.

hashtag
Changing when a dashboard should display

Changing when a dashboard is displayed is controlled via an inner config. Options on the inner config are ShowForUserGroup and HideForUserGroup to control the visibility of the dashboard for given user groups. You can call these config methods multiple times to add multiple role configurations.

By default, will pre-filter dashboards to display only on the section it is defined in. This will be combined with the SetVisibility config to decide when to display the dashboard.

hashtag
SetVisibility(Lambda visibilityConfig) : DashboardConfigBuilder

Sets the dashboard visibility config.

hashtag
Setting the collection of a dashboard

Dashboards are only able to display a single collection. If you need to display multiple collections, then you need to configure multiple dashboards.

hashtag
SetCollection<TEntityType>(Lambda idFieldExpression, string nameSingular, string namePlural, string description, Lambda collectionConfig = null) : ContextAppConfigBuilder

Sets the collection of the current dashboard with the given names, descriptions, and default icons. An ID property accessor expression is required so that Umbraco UI Builder knows which property is the ID property. For more information check the .

hashtag
SetCollection<TEntityType>(Lambda idFieldExpression, Lambda fkFieldExpression, string nameSingular, string namePlural, string description, string iconSingular, string iconPlural, Lambda collectionConfig = null) : ContextAppConfigBuilder

Sets the collection of the current dashboard with the given names, description and icons. An ID property accessor expression is required so that Umbraco UI Builder knows which property is the ID property. For more information check the .

Related Collections

Configuring **many-to-many** relationships in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Related collections add support for editing many-to-many relationships with UI Builder. These are found when multiple entities from one collection are associated with multiple entities from another. They are modeled in a database via two tables related to a junction table.

A classic example is with Students and Courses. Each course has many students, and each student takes many courses.

Child Collection
Parent Collection
Entity Picker

hashtag
Collections Representation

A representation of your collections would look like this:

And the entities would be represented using the following Models:

hashtag
Defining a related collection

You can get started with related collection through a two step process:

  1. Add collection definition

  2. Add related collection entity picker and definition

hashtag
Collection definition

Define a related collection by calling the AddRelatedCollection method on a given collection config builder instance.

hashtag
AddRelatedCollection<TEntityType, TRelatedEntityType, TJunctionEntityType>(Expression<Func<TRelatedEntityType, object>> idPropertyExpression, string nameSingular, string namePlural, Action<RelationConfigBuilder<TBuilder, TEntity, TRelatedEntityType, TJunctionEntityType>> relationConfig)

Adds a related collection to the current collection with the given names, descriptions, and default icons. A property accessor expression is required for the entity ID field of the entity. The relation configuration will define the junction entity by specifying the references to parent and child entities.

hashtag
Configuring a related collection entity picker

Define the child collection entity picker by calling the AddRelatedCollectionPickerField method on the parent collection fieldset config.

hashtag
AddRelatedCollectionPickerField<TValueType>(string alias, string dataTypeName, string label)

Adds an entity picker with the specified Data Type name to the editor of the parent collection.

circle-info

Relation Config Alias: The relation config alias must correspond to the related collection picker field alias! (e.g. studentsCourses)

hashtag
Defining repository methods

hashtag
IEnumerable GetRelationsByParentIdImpl(int parentId, string relationAlias)

Retrieves the related collections based on the ID of the parent entity.

hashtag
StudentCourse SaveRelationImpl(StudentCourse entity)

Adds a new related collection to the current parent entity.

List Views

Configuring the list view of a collection in Umbraco UI Builder, the backoffice UI builder for Umbraco.

A list view is a list-based view of a collection entity providing features: pagination for large collections, custom data views, searching, and bulk actions.

A collection list view

hashtag
Configuring a list view

The list view configuration is a sub-configuration of a Collection config builder instance and is accessed via its ListView method.

hashtag
ListView(Lambda listViewConfig = null) : ListViewConfigBuilder<TEntityType>

Accesses the list view config of the given collection.

hashtag
Adding a field to the list view

hashtag
AddField(Lambda propertyExpression, Lambda fieldConfig = null) : ListViewFieldConfigBuilder<TEntityType, TValueType>

Adds the given property to the list view.

hashtag
Changing the heading of a field

hashtag
SetHeading(string heading) : ListViewFieldConfigBuilder<TEntityType, TValueType>

Sets the heading for the list view field.

hashtag
Formatting the value of a field

hashtag
SetFormat(Lambda formatExpression) : ListViewFieldConfigBuilder<TEntityType, TValueType>

Sets the format expression for the list view field.

hashtag
Setting the view of a field

With field views, you can customize the markup the list view's field so you can show richer visualizations of the field's content. For more information you can check the .

hashtag
SetView(string viewComponentName) : ListViewFieldConfigBuilder<TEntityType, TValueType>

Sets the view component for the list view field.

hashtag
SetView<TView>() : ListViewFieldConfigBuilder<TEntityType, TValueType>

Sets the view component for the list view field.

hashtag
Setting the visibility of a field

hashtag
SetVisibility(Predicate<ListViewFieldVisibilityContext> visibilityExpression) : ListViewFieldConfigBuilder<TEntityType, TValueType>

Sets the runtime visibility of the list view field.

hashtag
Changing the page size

hashtag
SetPageSize(int pageSize) : ListViewConfigBuilder<TEntityType>

Sets the number of items to display per page for the given list view.

Entity Picker

Using the entity picker property editor with Umbraco UI Builder, the backoffice UI builder for Umbraco.

The Entity Picker property editor is an Umbraco property editor that lets you select one or more entities from an Umbraco UI Builder collection.

hashtag
Configuring an entity picker

To configure an entity picker you need to create a Data Type in the Umbraco backoffice. From the property editor dropdown choose 'Umbraco UI Builder Entity Picker'.

Data Type config

From there choose 'Section' and 'Collection' you wish to pick entities from. You can also choose an optional list view 'Data View' if there are any configured.

You can also set a minimum and maximum number of items to be able to pick if required.

With an entity picker Data Type defined, finish off the configuration by adding it to the desired Document Type definition.

hashtag
Using an entity picker

Using the entity picker should be pretty familiar as it aims to mimic the content picker as closely as possible.

To pick an entity click the 'Add' link to launch the picker dialog. The dialog should present a paginated list of entities to pick from. If any searchable fields were configured for the entity type, you can perform a search by typing a search term in the search input field.

To pick your items click on the entity names and then click 'Select' in the bottom right-hand corner.

The picker should display a summary of the selected entities which can be sorted by dragging the selected entities into the desired order.

To save the value either save or save and publish the current document.

hashtag
Getting the value of an entity picker

The entity picker property editor comes with a built-in . This means that whenever you retrieve the property value from Umbraco it will return the actual selected entities, even converting them to the relevant type.

Custom Cards

Configuring custom cards in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Custom cards allow you to perform more complex metric calculations and are defined via a class implementing the Card base class.

When Umbraco UI Builder resolves a card it will attempt to do so from the global DI container. This means you can inject any dependencies that you require for your card to calculate its value. If there is no type defined in the DI container, Umbraco UI Builder will fall-back to manually instantiating a new instance of value mapper.

hashtag
Defining a custom card

To define a card you create a class that inherits from the base class Card and configure it within the constructor like so.

The required configuration options are:

  • Name: The name of the card.

  • Alias: A unique alias for the card.

  • GetValue(object parentId = null): A method to get the cards value.

Additional optional configuration options are:

  • Icon: An icon to display in the card.

  • Color: The color of the card.

  • Suffix: A suffix to display after the card value.

hashtag
Adding a custom card to a collection

hashtag
AddCard() : CollectionConfigBuilder<TEntityType>

Adds a card of the given type to the collection.

hashtag
AddCard(Type cardType) : CollectionConfigBuilder<TEntityType>

Adds a card of the given type to the collection.

Count Cards

Configuring count cards in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Count cards allow you to define cards directly against the collection configuration, providing a basic where clause to use in a count SQL statement. These work perfectly for basic data visualizations based on counts of entities in a collection.

If you need to do more than a basic count, you'll want to take a look at the custom cards documentation.

hashtag
Adding a count card to a collection

Cards allow you to display basic summaries of key information that may be useful to the editor.

hashtag
AddCard(string name, Lambda whereClauseExpression, Lambda cardConfig = null) : CardConfigBuilder

Adds a card with the given name and where clause filter expression. Expression must be a boolean expression.

hashtag
AddCard(string name, string icon, Lambda whereClauseExpression, Lambda cardConfig = null) : CardConfigBuilder

Adds a card with the given name + icon and where clause filter expression. Expression must be a boolean expression.

hashtag
Change the color of a count card

hashtag
SetColor(string color) : CardConfigBuilder

Sets the color of the card.

hashtag
Add a suffix to a count value

hashtag
SetSuffix(string suffix) : CardConfigBuilder

Sets the suffix of the card value.

hashtag
Formatting the value of a count

hashtag
SetFormat(Lambda formatExpression) : CardConfigBuilder

Sets the format expression for the card.

The Basics

Configuring actions in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Actions are a powerful way of adding custom functionality to Umbraco UI Builder without needing to create custom UI elements. By providing an action to run, Umbraco UI Builder can automatically trigger actions from a number of UI locations.

hashtag
Defining an action

To define an action create a class that inherits from the base class Action<> and configure it like below:

Migrate from Konstrukt to Umbraco UI Builder

Learn how to migrate a Konstrukt solution to Umbraco UI Builder.

This guide provides a step-by-step approach to migrating a default Konstrukt solution to Umbraco UI Builder.

hashtag
Key changes

Before outlining the exact steps, there are a few key changes to be aware of.

These changes will dictate the steps to take in the process of migrating to Umbraco UI Builder.

Action Visibility

Controlling the visibility of actions in Umbraco UI Builder, the backoffice UI builder for Umbraco.

By default actions are not visible in the UI and you must expressly define when and where an action should display. This can be achieved in two ways, either on the action definition itself or at the point of registration on the collections config.

hashtag
Controlling the default action visibility

To define the default visibility of an action at the action level you can do this by overriding the IsVisible method of the Action<>

Filterable Properties

Configuring filterable properties in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Umbraco UI Builder can dynamically build a filter dialog choosing appropriate editor views for you based on a basic property configuration. Properties of a number or date types will become range pickers and enums. Properties with options defined will become select/checkbox lists and all other properties will become text input filters.

hashtag
Defining filterable properties

Defining filterable properties is controlled via the configuration.

Overview

Configuring filtering in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Beyond there might be times when you need to be able to create specific views of a collection's data. To help with this Umbraco UI Builder has different filtering mechanisms available.

Choose a filtering method from the list below to find out more.

searching
Global Filterschevron-right
Data Viewschevron-right
Filterable Propertieschevron-right
Filterable Properties
SectionConfigBuilder
WithSectionConfigBuilder
Collections documentation
Collections documentation
Related Collections Diagram
Field Views Documentation
value converterarrow-up-right
Document Type config
Entity picker dialog
Entity picker values
The required configuration options are:
  • Name: The name of the action.

  • Alias: A unique alias for the action.

  • Icon: An icon to display next to the name in the action button.

  • Execute: The method to run against a given list of entities.

Additional optional configuration options are:

  • ConfirmAction: Set whether a confirm dialog should display before performing this action.

The generic argument is a return type for the action. See Controlling the action result below.

circle-info

You can use dependency injection to inject any services you require to perform your specific task. When injecting dependencies, it's always recommended that you inject Lazy<YourService> implementations of the required services to ensure they are only resolved when needed.

hashtag
Controlling the action result

Actions by default will return a ActionResult but you can return other types of result by swapping the Action<> generic argument.

  • ActionResult - Standard result with a boolean Success value.

  • FileActionResult - Returns a file stream / bytes and triggers a download dialog.

hashtag
Capturing settings for an action

Sometimes you may need to collect further user input before you can perform an action. To achieve this you can use the Action<> base class that accepts an additional TSetting generic argument.

By implementing this base class you are required to implement an additional Configure method which accepts a SettingsConfigBuilder<> parameter. You should use this parameter calling the builders fluent API to define the settings dialog UI and how it maps to the settings type. With the settings config builder you are able to create fieldsets and fields with the same fluent API as defined in the Collection Editors section.

In addition to this Configure method, the Execute method will now accept an additional settings parameter of the settings type. This will be pre-populated by Umbraco UI Builder with the value entered by the user, allowing you to alter your actions behavior accordingly.

hashtag
Adding an action to a collection

Actions are added via the Collections configuration.

hashtag
AddAction<TMenuActionType>() : CollectionConfigBuilder<TEntityType>

Adds an action of the given type to the collection.

hashtag
AddAction(Type actionType) : CollectionConfigBuilder<TEntityType>

Adds an action of the given type to the collection.

hashtag
AddAction(IAction action) : CollectionConfigBuilder<TEntityType>

Adds the given action to the collection.

hashtag
Project, Package, and Namespace changes
Konstrukt
Umbraco UI Builder

Konstrukt.Core

Umbraco.UIBuilder.Core

Konstrukt.Infrastructure

Umbraco.UIBuilder.Infrastructure

Konstrukt.Web

Umbraco.UIBuilder.Web

Konstrukt.Web.UI

Umbraco.UIBuilder.Web.StaticAssets

Konstrukt.Startup

Umbraco.UIBuilder.Startup

Konstrukt

Umbraco.UIBuilder

chevron-rightC# Class changeshashtag
  • Namespace changes as documented above.

  • Most classes prefixed with the Konstrukt keyword have had this prefix removed.

    • Examples: IKonstruktRepository is now IRepository

    • Exclusions: The root level KonstruktConfig and KonstruktConfigBuilder have a UIBuilder prefix instead, and the AddKonstrukt extension for IUmbracoBuilder has been replaced by AddUIBuilder

chevron-rightJavaScript changeshashtag
  • All Konstrukt controllers have changed namespace to Umbraco.UIBuilder.

  • All Konstrukt prefixed directives, services, and resources are now prefixed with uibuilder.

chevron-rightUI Changeshashtag
  • All static UI assets are served via a Razor Compiled Library (RCL) and are no longer found in the App_Plugins folder.

  • The folder with App_Plugins has been renamed from Konstrukt to UmbracoUIBuilder.

hashtag
Step 1: Replace dependencies

In this first step, we will be replacing all existing Konstrukt dependencies with Umbraco UI Builder dependencies.

  1. Remove any installed Konstrukt packages:

  1. Delete the Konstrukt App_Plugins folder:

  1. Install Umbraco.UIBuilder:

  1. Compile your project against .NET 7.0.

hashtag
Step 2: Update namespaces and entity names

Based on the Key Changesarrow-up-right outlined above update all Konstrukt references to the new Umbraco UI Builder alternatives. Ensure you update any Views/Partials that also reference these.

hashtag
Step 3: Update your configuration

If all your configuration is in a single statement, it would be a case of swapping AddKonstrukt to AddUIBuilder. If you broke your configuration into multiple steps, or are using Action or Card classes, you will need to update the config builder/base classes. Those classes need to be updated to their UI Builder alternative names as detailed in Key Changesarrow-up-right.

hashtag
Step 4: Finalizing the migration

  1. Delete any obj/bin folders in your projects to ensure a clean build.

  2. Recompile all projects and ensure all dependencies are restored correctly

  3. Delete the existing Konstrukt license files in the umbraco\Licenses folder.

  4. Add your new Umbraco.UIBuilder license key to the appSettings.json file:

  1. Run the project.

hashtag
AddFilterableProperty(Lambda filterablePropertyExpression, Lambda filterConfig = null) : CollectionConfigBuilder<TEntityType>

Adds the given property to the filterable properties collection.

hashtag
Changing the label of a filterable property

hashtag
SetLabel(string label) : FilterablePropertyConfigBuilder<TEntityType, TValueType>

hashtag
Adding a description to a filterable property

hashtag
SetDescription(string description) : FilterablePropertyConfigBuilder<TEntityType, TValueType>

hashtag
Defining basic options for a filterable property

hashtag
SetOptions(IDictionary<TValueType, string> options) : FilterablePropertyConfigBuilder<TEntityType, TValueType>

hashtag
Defining options with custom compare clauses for a filterable property

hashtag
AddOption(object key, string label, Lambda compareExpression) : FilterablePropertyConfigBuilder<TEntityType, TValueType>

hashtag
Configuring the mode of a filterable property

For filterable properties with options you can configure whether the options should be multiple or single choice.

hashtag
SetMode(FilterMode mode) : FilterablePropertyConfigBuilder<TEntityType, TValueType>

collections
Filterable Properties
// Example
sectionConfig.AddDashboard("Team", dashboardConfig => {
    ...
});
// Example
sectionConfig.AddDashboardBefore("contentIntro", "Team", dashboardConfig => {
    ...
});
// Example
sectionConfig.AddDashboardAfter("contentIntro", "Team", dashboardConfig => {
    ...
});
// Example
dashboardConfig.SetAlias("team");
// Example
dashboardConfig.SetVisibility(visibilityConfig => visibilityConfig
    .ShowForUserGroup("admin")
    .HideForUserGroup("translator")
);
// Example
dashboardConfig.SetCollection<Comment>(p => p.Id, p=> "Team Member", "Team Members", "A collection of team members", collectionConfig => {
    ...
});
// Example
dashboardConfig.SetCollection<Comment>(p => p.Id, "Team Member", "Team Members", "A collection of team members", "icon-umm-user", "icon-umb-user", collectionConfig => {
    ...
});
[TableName("Students")]
[PrimaryKey("Id")]
public class Student
{
    [PrimaryKeyColumn]
    public int Id { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string Email { get; set; }
}
[TableName("Courses")]
[PrimaryKey("Id")]
public class Course
{
    [PrimaryKeyColumn]
    public int Id { get; set; }

    public string Title { get; set; }

    public string Description { get; set; }
}
[TableName("StudentsCourses")]
[PrimaryKey(new[] { "StudentId", "CourseId" })]
public class StudentCourse
{
    [PrimaryKeyColumn]
    public int StudentId { get; set; }

    [PrimaryKeyColumn]
    public int CourseId { get; set; }
}
collectionConfig.AddRelatedCollection<Student, Course, StudentCourse>(x => x.Id, "Student Course", "Students Courses", relationConfig =>
{
    relationConfig
        .SetAlias("studentsCourses")
        .SetJunction<StudentCourse>(x => x.StudentId, y => y.CourseId);
});
collectionConfig.Editor(editorConfig =>
{
    editorConfig.AddTab("General", tabConfig =>
        tabConfig.AddFieldset("General", fieldsetConfig =>
        {
            fieldsetConfig.AddField(x => x.FirstName).MakeRequired();
            fieldsetConfig.AddField(x => x.LastName).MakeRequired();
            fieldsetConfig.AddField(x => x.Email).MakeRequired();

            fieldsetConfig.AddRelatedCollectionPickerField<Course>("studentsCourses", "Courses Related Picker", "Courses");
        }));
});
{
    var db = _scopeProvider.CreateScope().Database;
    var sql = db.SqlContext.Sql()
            .Select(new[] { "StudentId", "CourseId" } )
            .From("StudentsCourses")
            .Where($"studentId = @0", parentId);

    var result = db.Fetch<StudentCourse>(sql);

    return result;
}
{
    var db = _scopeProvider.CreateScope().Database;

    var type = entity.GetType();
    var studentId = type.GetProperty("StudentId").GetValue(entity);
    var courseId = type.GetProperty("CourseId").GetValue(entity);

    // delete relation if exists
    db.Execute("DELETE FROM StudentsCourses WHERE StudentId = @0 AND CourseId = @1",
        studentId,
        courseId);

    db.Execute("INSERT INTO StudentsCourses (StudentId, CourseId) VALUES (@0, @1)",
        studentId,
        courseId);

    return entity;
}
// Example
collectionConfig.ListView(listViewConfig => {
    ...
});
// Example
listViewConfig.AddField(p => p.FirstName, fieldConfig => {
    ...
});
// Example
fieldConfig.SetHeading("First Name");
// Example
fieldConfig.SetFormat((v, p) => $"{v} years old");
// Example
fieldConfig.SetView("ImageFieldView");
// Example
fieldConfig.SetView<ImageFieldView>();
// Example
fieldConfig.SetVisibility(ctx => ctx.UserGroups.Any(x => x.Alias == "editor"));
// Example
listViewConfig.SetPageSize(20);
// Example
foreach(var p in Model.People){
    ...
}
// Example
public class AvgPersonAgeCard : Card
{
    public override string Alias => "avgPersonAge";
    public override string Name => "Average Age";
    public override string Icon => "icon-calendar";
    public override string Color => "green";
    public override string Suffix => "yrs";
        
    public override object GetValue(object parentId = null)
    {
        // Perform value calculation logic
    }
}
// Example
collectionConfig.AddCard<AvgPersonAgeCard>();
// Example
collectionConfig.AddCard(typeof(AvgPersonAgeCard));
// Example
collectionConfig.AddCard("Older than 30", p => p.Age > 30, cardConfig => {
    ...
});
// Example
collectionConfig.AddCard("Older than 30", "icon-umb-users", p => p.Age > 30, cardConfig => {
    ...
});
// Example
cardConfig.SetColor("blue");
// Example
cardConfig.SetSuffix("years");
// Example
cardConfig.SetFormat((v) => $"{v}%");
// Example
public class MyAction : Action<ActionResult>
{
    public override string Icon => "icon-settings";
    public override string Alias => "myaction";
    public override string Name => "My Action";
    public override bool ConfirmAction => true;

    public override ActionResult Execute(string collectionAlias, object[] entityIds)
    {
        // Perform operation here...
    }
}
// Example
public class MyAction : Action<MyActionSettings, ActionResult>
{
    public override string Icon => "icon-settings";
    public override string Alias => "myaction";
    public override string Name => "My Action";
    public override bool ConfirmAction => true;

    public override void Configure(SettingsConfigBuilder<MyActionSettings> settingsConfig)
    {
        settingsConfig.AddFieldset("General", fieldsetConfig => fieldsetConfig
            .AddField(s => s.RecipientName).SetLabel("Recipient Name")
            .AddField(s => s.RecipientEmail).SetLabel("Recipient Email"));
    }

    public override ActionResult Execute(string collectionAlias, object[] entityIds, MyActionSettings settings)
    {
        // Perform operation here...
    }
}

public class MyActionSettings
{
    public string RecipientName { get; set; }
    public string RecipientEmail { get; set; }
}
// Example
collectionConfig.AddAction<ExportMenuAction>();
// Example
collectionConfig.AddAction(actionType);
// Example
collectionConfig.AddAction(action);
dotnet remove package Konstrukt
rmdir App_Plugins\Konstrukt
dotnet add package Umbraco.UIBuilder
builder.CreateUmbracoBuilder()
    .AddBackOffice()
    .AddWebsite()
    .AddDeliveryApi()
    .AddComposers()
    .AddUIBuilder(cfg => {
        // The rest of your configuration
    })
    .Build();
"Umbraco": {
  "Licenses": {
    "Umbraco.UIBuilder": "YOUR_LICENSE_KEY"
  }
}
// Example
collectionConfig.AddFilterableProperty(p => p.FirstName, filterConfig => filterConfig 
    // ...
);
// Example
filterConfig.SetLabel("First Name");
// Example
filterConfig.SetDescription("The first name of the person");
// Example
filterConfig.SetOptions(new Dictionary<string, string> {
    { "Option1", "Option One" },
    { "Option2", "Option Two" }
});
// Example
filterConfig.AddOption("Option1", "Option One", (val) => val != "Option Two");
// Example
filterConfig.SetMode(FilterMode.MultipleChoice);
base class.

The IsVisible method is passed a ActionVisibilityContext which you should use to decide whether the action should display, returning true if it should, or false if it should not. For more information check the Action visibility context.

hashtag
Overriding an actions visibility

Overriding an actions visibility is controlled via the collections configuration.

hashtag
AddAction<TMenuActionType>(Lambda actionConfig = null) : CollectionConfigBuilder<TEntityType>

Adds an action of the given type to the collection with the given visibility.

hashtag
AddAction(Type actionType, Lambda actionConfig = null) : CollectionConfigBuilder<TEntityType>

Adds an action of the given type to the collection with the given visibility.

hashtag
AddAction(IAction action, Lambda actionConfig = null) : CollectionConfigBuilder<TEntityType>

Adds the given action to the collection with the given visibility.

hashtag
Action visibility context

When controlling the visibility of an action you will be given a ActionVisibilityContext object from which you can decide whether to show the action or not. The visibility context contains two key pieces of information on which you can base this decision.

hashtag
ActionType

The action type property is an enum property that define which area of the UI it is that wishes to access this action. Enabling an action to display for a given action type will determine where an action is displayed.

hashtag
ContainerMenu

The ContainerMenu action type determines that the action will be displayed in both the tree of the collection and its list view actions menu.

Container Menu

hashtag
EntityMenu

The EntityMenu action type determines that the action will be displayed in the actions menu of a collection editor UI.

Entity Menu

hashtag
Bulk

The Bulk action type determines that the action will be displayed in the collection list view bulk actions menu.

Bulk Actions

hashtag
Row

The Row action type determines that the action will be displayed in the collection list view action row menu.

Row Actions

hashtag
Save

The Save action type determines that the action will be displayed as a sub button in an entity editors save button. All Save action types trigger a save before the action is executed and so to convey this, all Save action type button labels are prefixed Save & [Action Name]

Save Actions

hashtag
UserGroups

The user groups collection contains a list of Umbraco IReadOnlyUserGroup objects for the current logged-in backoffice user. This allows you to control the visibility of actions for given user group members.

Umbraco Aliases

A list of useful Umbraco aliases for use with Umbraco UI Builder, the backoffice UI builder for Umbraco.

In a number of places in the Umbraco UI Builder API, you are required to know the aliases of other elements. For example, when you are adding sections, context apps, or dashboards before/after other instances. This is basic enough when it's referencing aliases of things defined in the Umbraco UI Builder config. However, for existing Umbraco instances it can be hard to find them so below is documented a number of known aliases for different elements.

hashtag
Dashboard aliases

hashtag
Content

Name
Alias

hashtag
Media

Name
Alias

hashtag
Settings

Name
Alias

hashtag
Members

Name
Alias

hashtag
Content App aliases

hashtag
Content

Name
Alias

hashtag
Media

Name
Alias

hashtag
Members

Name
Alias

hashtag
ContentTypes

Name
Alias

hashtag
Section aliases

Name
Alias

hashtag
Tree aliases

Name
Alias

Sections

Configuring sections in Umbraco UI Builder, the backoffice UI builder for Umbraco.

A section is a distinct area of the Umbraco backoffice, such as content, media, etc. The section is accessed via a link in the main menu at the top of the Umbraco interface. Umbraco UI Builder allows you to define multiple sections in order to organise the management of your models into logical sections.

hashtag
Defining a section

You can define a section by calling one of the AddSection

Virtual Sub Trees

Configuring virtual sub trees in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Virtual subtrees are a powerful feature that allows you to inject an Umbraco UI Builder tree structure into another Umbraco tree at a desired location. Thus acting as child nodes to the node chosen as the injection point. With virtual subtrees it allows you to extend built in or even 3rd party package trees with additional features. An example could be developing a "loyalty point" program for your e-commerce site and injecting the related database tables into a Vendr store tree. This allows the management of the program in its most logical location.

hashtag
Defining virtual SubTrees

Creating your first integration

Creating your first integration with Umbraco UI Builder, the backoffice UI builder for Umbraco.

In this guide, you can find the necessary steps needed for a basic implementation using Umbraco UI Builder to manage a single custom database table.

hashtag
Set up the database

Out of the box, Umbraco UI Builder works using PetaPoco as the persistence layer as this is what ships with Umbraco. If you prefer, it is possible to use a custom . However, for getting started, it is expected that you are using this default strategy.

Events

Configuring event handlers in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Umbraco UI Builder fires a number of notification events during regular operation to allow for extending of the default behaviour.

hashtag
Registering event handlers

Umbraco UI Builder uses the same and so uses the same registration process. First you will need to define a notification event handler for the event you wish to handle like below:

Then register your event handler in the

Folders

Configuring folders to organise trees in Umbraco UI Builder, the backoffice UI builder for Umbraco.

A folder can appear in either a tree or as a sub folder to other folders. Folders can contain either other (sub)folders or .

hashtag
Defining a folder

You can define a folder by calling one of the AddFolder methods on a given

// Example
public class MyAction : Action<ActionResult>
{
    ...
    public override bool IsVisible(ActionVisibilityContext ctx)
    {
        return ctx.ActionType == ActionType.Bulk 
            || ctx.ActionType == ActionType.Row;
    }
    ...
}
// Example
collectionConfig.AddAction<ExportMenuAction>(actionConfig => actionConfig
    .SetVisibility(x => x.ActionType == ActionType.Bulk 
        || x.ActionType == ActionType.Row)
);
// Example
collectionConfig.AddAction(typeof(ExportMenuAction), actionConfig => actionConfig
    .SetVisibility(x => x.ActionType == ActionType.Bulk 
        || x.ActionType == ActionType.Row)
);
// Example
collectionConfig.AddAction(action, actionConfig => actionConfig
    .SetVisibility(x => x.ActionType == ActionType.Bulk 
        || x.ActionType == ActionType.Row)
);

Forms

forms

Translation

translation

Getting Started

contentIntro

Redirect URL Management

contentRedirectManager

Content

mediaFolderBrowser

Welcome

settingsWelcome

Examine Management

settingsExamine

Published Status

settingsPublishedStatus

Models Builder

settingsModelsBuilder

Health Check

settingsHealthCheck

Getting Started

memberIntro

Content

umbContent

Info

umbInfo

Content

umbContent

Info

umbInfo

Content

umbContent

Info

umbInfo

Design

design

List View

listView

Permissions

permissions

Templates

templates

Content

content

Media

media

Settings

settings

Packages

packages

Users

users

Members

member

Content

content

Media

media

Members

member

Member Groups

memberGroups

methods on the root level
UIBuilderConfigBuilder
instance.

hashtag
AddSection(string name, Lambda sectionConfig = null) : SectionConfigBuilder

Adds a section to the Umbraco menu with the given name.

hashtag
AddSectionBefore(string beforeAlias, string name, Lambda sectionConfig = null) : SectionConfigBuilder

Adds a section to the Umbraco menu with the given name before the section with the given alias.

hashtag
AddSectionAfter(string afterAlias, string name, Lambda sectionConfig = null) : SectionConfigBuilder

Adds a section to the Umbraco menu with the given name after the section with the given alias.

hashtag
Changing a section alias

hashtag
SetAlias(string alias) : SectionConfigBuilder

Sets the alias of the section.

Optional: When adding a new section, an alias is automatically generated from the supplied name for you. However, if you need a specific alias you can use the SetAlias method to override this.

hashtag
Configuring the section tree

hashtag
Tree(Lambda treeConfig = null) : TreeConfigBuilder

Accesses the tree config of the current section. For more information check the Trees documentation.

hashtag
Adding a dashboard to the section

hashtag
AddDashboard(string name, Lambda dashboardConfig = null) : DashboardConfigBuilder

Adds a dashboard with the given name. For more information check the Dashboards documentation.

hashtag
AddDashboardBefore(string beforeAlias, string name, Lambda dashboardConfig = null) : DashboardConfigBuilder

Adds a dashboard with the given name before the dashboard with the given alias. For more information check the Dashboards documentation.

hashtag
AddDashboardAfter(string afterAlias, string name, Lambda dashboardConfig = null) : DashboardConfigBuilder

Adds a dashboard with the given name after the dashboard with the given alias. For more information check the Dashboards documentation.

hashtag
Extending an existing section

You can extend existing sections by adding Umbraco UI Builder trees and dashboards, context apps, and virtual subtrees. This can be done by calling the WithSection method on the root level UIBuilderConfigBuilder instance.

hashtag
WithSection(string alias, Lambda sectionConfig = null) : WithSectionConfigBuilder

Starts a sub-configuration for the existing Umbraco section with the given alias.

hashtag
Adding a tree to an existing section

hashtag
AddTree(string name, string icon, Lambda treeConfig = null) : TreeConfigBuilder

Adds a tree to the current section. For more information check the Trees documentation.

hashtag
AddTree(string groupName, string name, string icon, Lambda treeConfig = null) : TreeConfigBuilder

Adds a tree to the current section in a group with the given name. For more information check the Trees documentation.

hashtag
AddTreeBefore(string treeAlias, string name, string icon, Lambda treeConfig = null) : TreeConfigBuilder

Adds a tree to the current section before the tree with the given alias. For more information check the Trees documentation.

hashtag
AddTreeAfter(string treeAlias, string name, string icon, Lambda treeConfig = null) : TreeConfigBuilder

Adds a tree to the current section after the tree with the given alias. For more information check the Trees documentation.

hashtag
Adding a dashboard to an existing section

hashtag
AddDashboard (string name, Lambda dashboardConfig = null) : DashboardConfigBuilder

Adds a dashboard with the given name. For more information check the Dashboards documentation.

hashtag
AddDashboardBefore (string beforeAlias, string name, Lambda dashboardConfig = null) : DashboardConfigBuilder

Adds a dashboard with the given name before the dashboard with the given alias. For more information check the Dashboards documentation.

hashtag
AddDashboardAfter (string afterAlias, string name, Lambda dashboardConfig = null) : DashboardConfigBuilder

Adds a dashboard with the given name after the dashboard with the given alias. For more information check the Dashboards documentation.

Sections
You define a virtual subtree by calling one of the AddVirtualSubTree methods of a WithTreeConfigBuilder instance.

hashtag
AddVirtualSubTree(string sectionAlias, string treeAlias, Lambda visibilityExpression, Lambda virtualSubTreeConfig = null) : VirtualSubTreeConfigBuilder

Adds a virtual subtree to the current tree with its visibility controlled via the visibility expression.

hashtag
AddVirtualSubTreeBefore(string sectionAlias, string treeAlias, Lambda visibilityExpression, Lambda matchExpression, Lambda virtualSubTreeConfig = null) : VirtualSubTreeConfigBuilder

Adds a virtual subtree to the current tree, before the tree node matches the match expression, with its visibility controlled via the visibility expression.

hashtag
AddVirtualSubTreeAfter(string sectionAlias, string treeAlias, Lambda visibilityExpression, Lambda matchExpression, Lambda virtualSubTreeConfig = null) : VirtualSubTreeConfigBuilder

Adds a virtual subtree to the current tree, after the tree node matches the match expression, with its visibility controlled via the visibility expression.

hashtag
Controlling where to inject the Virtual SubTrees

Controlling where a virtual subtree is injected is done via the visibility expression passed to one of the AddVirtualSubTree methods on the root UIBuilderConfigBuilder instance. Without a visibility expression, Umbraco UI Builder would inject the virtual subtree under every node in the given tree. This expression can be used to identify the exact location where our tree should go.

To help with this, the visibility expression is passed a single VirtualSubTreeFilterContext argument with relevant contextual information. This information is about the current node being rendered, alongside a list of the current user's user groups for permission-based visibility control. It also includes access to an IServiceProvider in case you need to resolve a service to determine the correct node to inject below.

Below you can find an example of a more complex filter expression where injection is based on the Document Type of a content node:

hashtag
Controlling the position of the injected Virtual SubTrees

The position of a virtual subtree within the child nodes of the injection node is controlled by using one of the AddVirtualSubTreeBefore or AddVirtualSubTreeAfter methods. These methods need to be on the root level UIBuilderConfigBuilder instance and pass a match expression used to identify the tree node to insert before/after. This expression is passed a single TreeNode argument to determine the position. It also requires a boolean return value to indicate the relevant location has been found.

Below you can find an example of positioning a subtree after a node with the alias "settings":

hashtag
Configuring a Virtual SubTrees

Virtual subtrees share the same API as the Tree config builder API including support for folders and collections. There is an exception when adding collections to a subtree where you will have an additional foreign key expression parameter to define. The foreign key expression links the entities of the collection to the parent node of the subtree. For more information check the Core Trees Documentation.

hashtag
Injecting Virtual SubTrees into 3rd party trees

Out of the box, Umbraco UI Builder supports injecting subtrees into the core content, media, members, and member group trees. It also includes 3rd party support for Umbraco Commercearrow-up-right settings and commerce trees. In order to support additional trees to inject into, you must implement an ITreeHelper which is used to extract the required information. The tree helper consists of a tree alias for which the tree helper is. It includes methods to correctly identify the full parent path, a unique ID for a given node ID, and to resolve the actual entity ID. The entity ID should be used for the foreign key collection values.

Once you have defined a tree helper, you can register the DI container in your startup class.

Once registered any virtual subtrees registered against the given helpers tree alias will then use your tree helper to locate the required information.

Example virtual sub tree injected into a Vendr store tree
Program.cs
file like below:

hashtag
Repository events

hashtag
EntitySavingNotification

Raised when the repository Save method is called and before the entity has been persisted. The notification contains an Entity property with Before and After inner properties. These properties provide access to a copy of the currently persisted entity (or null if a new entity) and the updated entity that´s saved. Changes can be made to the After entity and they will be persisted as part of the save operation. If the Cancel property of the notification is set to true then the save operation will be canceled and no changes will be saved.

hashtag
EntitySavedNotification

Raised when the repository Save method is called and after the entity has been persisted. The notification contains an Entity property with Before and After inner properties. These properties provide access to a copy of the previously persisted entity (or null if a new entity) and the updated entity that´s saved.

hashtag
EntityDeletingNotification

Raised when the repository Delete method is called and before the entity is deleted. The notification contains an Entity property providing access to a copy of the entity about to be deleted. If the Cancel property of notification is set to true then the delete operation will be cancelled and entity won't be deleted.

hashtag
EntityDeletedNotification

Raised when the repository Delete method is called and after the entity has been deleted. The notification contains an Entity property providing access to a copy of the entity that´s deleted.

hashtag
SqlQueryBuildingNotification

Raised when the repository is preparing a SQL query. The notification contains the collection alias + type, the NPoco Sql<ISqlContext> object, and the where clause/order by clauses. These will be used to generate the SQL query.

hashtag
SqlQueryBuiltNotification

Raised when the repository has repaired a SQL query. The notification contains the collection alias + type, the NPoco Sql<ISqlContext> object and the where clause/order by clauses that was used to generate the SQL query.

Notification Mechanism built into Umbraco v9+arrow-up-right
or parent
Folder
config builder instance.

hashtag
AddFolder(string name, Lambda folderConfig = null) : FolderConfigBuilder

Adds a folder to the current tree with the given name and a default folder icon.

hashtag
AddFolder(string name, string icon, Lambda folderConfig = null) : FolderConfigBuilder

Adds a folder to the current tree with the given name + icon.

hashtag
Changing a folder alias

hashtag
SetAlias(string alias) : FolderConfigBuilder

Sets the alias of the folder.

Optional: When creating a new folder, an alias is automatically generated from the supplied name for you. However, if you need a specific alias you can use the SetAlias method to override this.

hashtag
Changing a folder icon color

hashtag
SetIconColor(string color) : FolderConfigBuilder

Sets the folder icon color to the given color. The options that are possible are black, green, yellow, orange, blue or red.

hashtag
Adding a sub folder to a folder

hashtag
AddFolder (string name, Lambda folderConfig = null) : FolderConfigBuilder

Adds a sub folder to the current folder with the given name and a default folder icon.

hashtag
AddFolder (string name, string icon, Lambda folderConfig = null) : FolderConfigBuilder

Adds a sub folder to the current folder with the given name + icon.

hashtag
Adding a collection to a folder

hashtag
AddCollection<TEntityType>(Lambda idFieldExpression, string nameSingular, string namePlural, string description, Lambda collectionConfig = null) : CollectionConfigBuilder<TEntityType>

Adds a collection to the current folder with the given names, descriptions, and default icons. An ID property accessor expression is required so that Umbraco UI Builder knows which property is the ID property. For more information check the Collections documentation.

hashtag
AddCollection<TEntityType>(Lambda idFieldExpression, string nameSingular, string namePlural, string description, string iconSingular, string iconPlural, Lambda collectionConfig = null) : CollectionConfigBuilder<TEntityType>

Adds a collection to the current folder with the given names, description and icons. An ID property accessor expression is required so that Umbraco UI Builder knows which property is the ID property. For more information check the Collections documentation.

collections
Tree
Tree with Settings folder
// Example
config.AddSection("Repositories", sectionConfig => {
    ...
});
// Example
config.AddSectionBefore("settings", "Repositories", sectionConfig => {
    ...
});
// Example
config.AddSectionAfter("media", "Repositories", sectionConfig => {
    ...
});
// Example
sectionConfig.SetAlias("repositories");
// Example
sectionConfig.Tree(treeConfig => {
    ...
});
// Example
sectionConfig.AddDashboard("Team", dashboardConfig => {
    ...
});
// Example
sectionConfig.AddDashboardBefore("contentIntro", "Team", dashboardConfig => {
    ...
});
// Example
sectionConfig.AddDashboardAfter("contentIntro", "Team", dashboardConfig => {
    ...
});
// Example
config.WithSection("member", withSectionConfig => {
    ...
});
// Example
withSectionConfig.AddTree("My Tree", "icon-folder", treeConfig => {
    ...
});
// Example
withSectionConfig.AddTree("My Group", "My Tree", "icon-folder", treeConfig => {
    ...
});
// Example
withSectionConfig.AddTreeBefore("member", "My Tree", "icon-folder", treeConfig => {
    ...
});
// Example
withSectionConfig.AddTreeAfter("member", "My Tree", "icon-folder", treeConfig => {
    ...
});
// Example
withSectionConfig.AddDashboard("Team", dashboardConfig => {
    ...
});
// Example
withSectionConfig.AddDashboardBefore("contentIntro", "Team", dashboardConfig => {
    ...
});
// Example
withSectionConfig.AddDashboardAfter("contentIntro", "Team", dashboardConfig => {
    ...
});
// Example
withTreeConfig.AddVirtualSubTree(ctx => ctx.Source.Id == 1056, contextAppConfig => {
    ...
});
// Example
withTreeConfig.AddVirtualSubTreeBefore(ctx => ctx.Source.Id == 1056, treeNode => treeNode.Name == "Settings", contextAppConfig => {
    ...
});
// Example
withTreeConfig.AddVirtualSubTreeAfter(ctx => ctx.Source.Id == 1056, treeNode => treeNode.Name == "Settings", contextAppConfig => {
    ...
});
public class VirtualSubTreeFilterContext
{
    public NodeContext Source { get; }
    public IEnumerable<IReadOnlyUserGroup> UserGroups { get; }
    public IServiceProvider ServiceProvider { get; }
}

public class NodeContext
{
    public string Id { get; }
    public string TreeAlias { get; }
    public string SectionAlias { get; }
    public FormCollection QueryString { get; }
}
withTreeConfig.AddVirtualSubTree(ctx => 
    {
        using var umbracoContextRef = ctx.ServiceProvider.GetRequiredService<IUmbracoContextFactory>().EnsureUmbracoContext();
        
        if (!int.TryParse(ctx.Source.Id, out int id)) 
            return false;

        return (umbracoContextRef.UmbracoContext.Content.GetById(id)?.ContentType.Alias ?? "") == "textPage";
    }, 
    virtualNodeConfig => virtualNodeConfig
        ...
);
public class TreeNode
{
    public object Id { get; }
    public object ParentId { get; }
    public string Alias { get; }
    public string Name { get; }
    public string NodeType { get; }
    public string Path { get; }
    public string RoutePath { get; }
    public IDictionary<string, object> AdditionalData { get; }
    ...
}
treeNode => treeNode.alias == "settings"
public interface ITreeHelper
{
    string TreeAlias { get; }
    string GetUniqueId(string nodeId, FormCollection queryString);
    object GetEntityId(string uniqueId);
    string GetPath(string uniqueId);
}
builder.Services.AddSingleton<ITreeHelper, MyCustomTreeHelper>();
public class MyEntitySavingEventHandler :  INotificationHandler<EntitySavingNotification> {

    public void Handle(ContentPublishedNotification notification)
    {
        // Handle the event here
    }

}
builder.CreateUmbracoBuilder()
    .AddBackOffice()
    .AddWebsite()
    .AddDeliveryApi()
    .AddComposers()
    .AddNotificationHandler<EntitySavingNotification, MyEntitySavingEventHandler>()
    .Build();
// Example
public class MyEntitySavingEventHandler :  INotificationHandler<EntitySavingNotification> {

    public void Handle(EntitySavingNotification notification)
    {
        var person = notification.Entity.After as Person;
        if (person != null){
            ...
        }
    }

}
// Example
public class MyEntitySavedEventHandler :  INotificationHandler<EntitySavedNotification> {

    public void Handle(EntitySavedNotification notification)
    {
        var person = notification.Entity.After as Person;
        if (person != null){
            ...
        }
    }

}
// Example
public class MyEntityDeletingEventHandler :  INotificationHandler<EntityDeletingNotification> {

    public void Handle(EntityDeletingNotification notification)
    {
        var person = notification.Entity.After as Person;
        if (person != null){
            ...
        }
    }

}
// Example
public class MyEntityDeletedEventHandler :  INotificationHandler<EntityDeletedNotification> {

    public void Handle(EntityDeletedNotification notification)
    {
        var person = notification.Entity.After as Person;
        if (person != null){
            ...
        }
    }

}
// Example
public class MySqlQueryBuildingEventHandler :  INotificationHandler<SqlQueryBuildingNotification> {

    public void Handle(SqlQueryBuildingNotification notification)
    {
        notification.Sql = notification.Sql.Append("WHERE MyId = @0", 1);
    }

}
// Example
public class MySqlQueryBuiltEventHandler :  INotificationHandler<SqlQueryBuiltNotification> {

    public void Handle(SqlQueryBuiltNotification notification)
    {
        notification.Sql = notification.Sql.Append("WHERE MyId = @0", 1);
    }

}
// Example
treeConfig.AddFolder("Settings", folderConfig => {
    ...
});
// Example
treeConfig.AddFolder("Settings", "icon-settings", folderConfig => {
    ...
});
// Example
folderConfig.SetAlias("settings");
// Example
folderConfig.SetIconColor("blue");
// Example
folderConfig.AddFolder("Categories", subFolderConfig => {
    ...
});
// Example
folderConfig.AddFolder("Categories", "icon-tags", subFolderConfig => {
    ...
});
// Example
folderConfig.AddCollection<Person>(p => p.Id, "Person", "People", "A collection of people", collectionConfig => {
    ...
});
// Example
folderConfig.AddCollection<Person>(p => p.Id, "Person", "People", "A collection of people", "icon-umb-users", "icon-umb-users", collectionConfig => {
    ...
});
Start by setting up a database table for your model (you might want to populate it with some dummy data as well while learning). We’ll use the following as an example:

hashtag
Set up your model

With the database table setup, we then need to create the associated Poco model in our project.

hashtag
Configure Umbraco UI Builder

With the database and model setup, we can now start to configure Umbraco UI Builder itself. The entry point for the Umbraco UI Builder configuration is via the AddUIBuilder extension method. On this method, we call on the IUmbracoBuilder instance within the Program.cs class.

For our example, we will use the following configuration:

hashtag
Access your UI

With your configuration defined and your project compiled, there is one last step to perform before you can access your UI. And that is to give your backoffice user account permission to access the newly defined section. To do this you'll need to login to the backoffice, head to the user's section, and update the user group. There you will need to make sure that your user belongs to the allowed access.

User group permissions

With the permissions set, you can refresh your browser and you should now see your new section available in the site navigation.

People list view
People editor

hashtag
Summary

As you can see, with little code you can start to create powerful interfaces for your custom data structures.

Repository

Context Apps

Configuring context apps in Umbraco UI Builder, the backoffice UI builder for Umbraco.

Context Apps in Umbraco UI Builder are analogous to Content Apps in Umbraco. They allow you to provide contextual apps that appear in the editor UI of content. From Umbraco UI Builder's perspective, defining context apps allows you to expose collections as content apps. This is where a collection has a relation to the content in question. An example could be something like blog post comments which are linked to individual blog posts. Exposing these as a content app allows them to be managed in context next to the blog post they are linked to.

Context App

hashtag
Defining a context app

You can define a context app by calling one of the AddContextApp methods on a instance.

hashtag
AddContextApp(string name, Lambda contextAppConfig = null) : ContextAppConfigBuilder

Adds a context app with the given name and default icon.

hashtag
AddContextApp(string name, string icon, Lambda contextAppConfig = null) : ContextAppConfigBuilder

Adds a context app to the Umbraco menu with the given name and icon.

hashtag
AddContextAppBefore(string beforeAlias, string name, Lambda contextAppConfig = null) : ContextAppConfigBuilder

Adds a context app with the given name and default icon before the context app with the given alias.

hashtag
AddContextAppBefore(string beforeAlias, string name, string icon, Lambda contextAppConfig = null) : ContextAppConfigBuilder

Adds a context app to the Umbraco menu with the given name and icon before the context app with the given alias.

hashtag
AddContextAppAfter(string afterAlias, string name, Lambda contextAppConfig = null) : ContextAppConfigBuilder

Adds a context app with the given name and default icon after the context app with the given alias.

hashtag
AddContextAppAfter(string afterAlias, string name, string icon, Lambda contextAppConfig = null) : ContextAppConfigBuilder

Adds a context app to the Umbraco menu with the given name and icon after the context app with the given alias.

hashtag
Changing a context app alias

hashtag
SetAlias(string alias) : ContextAppConfigBuilder

Sets the alias of the context app.

Optional: When adding a new context app, an alias is automatically generated from the supplied name for you. However, you can use the SetAlias method to override this if you need a specific alias.

hashtag
Changing a context app icon color

hashtag
SetIconColor(string color) : ContextAppConfigBuilder

Sets the context app icon color to the given color. Possible options are black, green, yellow, orange, blue or red.

hashtag
Changing when a context app should display

Changing when a context app is displayed, is controlled by a delegate method which is passed a ContextAppVisibilityContext instance. This method contains a Source property which holds a reference to the source object that the content app is being displayed on (i.e., an IContent instance). It also holds a reference to a UserGroups collection of the currently logged-in user's user groups. You can use any value from those to return a boolean result which sets whether to display the context app or not.

By default, Umbraco UI Builder will pre-filter context apps to only display on the tree it is defined in. This will be combined with the SetVisibility config to decide when to display the context app.

hashtag
SetVisibility(Func<ContextAppVisibilityContext, bool> visibilityExpression) : ContextAppConfigBuilder

Sets the context app visibility delegate.

hashtag
Adding a collection to a context app

Context apps can consist of one or more collections. If a context app contains multiple collections, the collection list views will be displayed in tabs within the context app.

hashtag
AddCollection<TEntityType>(Lambda idFieldExpression, Lambda fkFieldExpression, string nameSingular, string namePlural, string description, Lambda collectionConfig = null) : ContextAppConfigBuilder

Adds a collection to the current content app with the given names, descriptions and default icons. An ID property accessor expression is required so that Umbraco UI Builder knows which property is the ID property. A foreign key property accessor is also required so that the Umbraco UI Builder knows which property holds the Umbraco nodes UDI value. You can read more about this in the .

hashtag
AddCollection<TEntityType>(Lambda idFieldExpression, Lambda fkFieldExpression, string nameSingular, string namePlural, string description, string iconSingular, string iconPlural, Lambda collectionConfig = null) : ContextAppConfigBuilder

Adds a collection to the current context app with the given names, description and icons. An ID property accessor expression is required so that Umbraco UI Builder knows which property is the ID property. A foreign key property accessor is also required so that Umbraco UI Builder knows which property holds the Umbraco nodes UDI value. You can read more about this in the .

The Basics

The basics of a collection configuration in Umbraco UI Builder, the backoffice UI builder for Umbraco.

There is a lot that can be configured from the collection config, but what follows are the core basics. You can find more configuration options about specific topics from the other configuration sections in the main menu.

hashtag
Defining a collection

You can define a collection by calling one of the AddCollection methods on a given or parent config builder instance.

Editors

Configuring the editor of a collection in Umbraco UI Builder, the backoffice UI builder for Umbraco.

An editor is the user interface used to edit an entity and is made up of tabs and property editors.

hashtag
Configuring an editor

The editor configuration is a sub-configuration of a config builder instance and is accessed via its Editor method.

CREATE TABLE [Person] (
    [Id] int IDENTITY (1,1) NOT NULL,
    [Name] nvarchar(255) NOT NULL,
    [JobTitle] nvarchar(255) NOT NULL,
    [Email] nvarchar(255) NOT NULL,
    [Telephone] nvarchar(255) NOT NULL,
    [Age] int NOT NULL,
    [Avatar] nvarchar(255) NOT NULL
);
[TableName("Person")]
[PrimaryKey("Id")]
public class Person
{
    [PrimaryKeyColumn]
    public int Id { get; set; }
    public string Name { get; set; }
    public string JobTitle { get; set; }
    public string Email { get; set; }
    public string Telephone { get; set; }
    public int Age { get; set; }
    public string Avatar { get; set; }
}
builder.CreateUmbracoBuilder()
    .AddBackOffice()
    .AddWebsite()
    .AddDeliveryApi()
    .AddComposers()
    .AddUIBuilder(cfg => {
        // Apply your configuration here
    })
    .Build();
...
.AddUIBuilder(cfg => {

    cfg.AddSectionAfter("media", "Repositories", sectionConfig => sectionConfig
        .Tree(treeConfig => treeConfig
            .AddCollection<Person>(x => x.Id, "Person", "People", "A person entity", "icon-umb-users", "icon-umb-users", collectionConfig => collectionConfig
                .SetNameProperty(p => p.Name)
                .ListView(listViewConfig => listViewConfig
                    .AddField(p => p.JobTitle).SetHeading("Job Title")
                    .AddField(p => p.Email)
                )
                .Editor(editorConfig => editorConfig
                    .AddTab("General", tabConfig => tabConfig
                        .AddFieldset("General", fieldsetConfig => fieldsetConfig
                            .AddField(p => p.JobTitle).MakeRequired()
                            .AddField(p => p.Age)
                            .AddField(p => p.Email).SetValidationRegex("[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+")
                            .AddField(p => p.Telephone).SetDescription("inc area code")
                        )
                        .AddFieldset("Media", fieldsetConfig => fieldsetConfig
                            .AddField(p => p.Avatar).SetDataType("Upload File")
                        )
                    )
                )
            )
        )
    );

})
...
WithTreeConfigBuilder
Collections documentation
Collections documentation
hashtag
AddCollection<TEntityType>(Lambda idFieldExpression, string nameSingular, string namePlural, string description, Lambda collectionConfig = null) : CollectionConfigBuilder<TEntityType>

Adds a collection to the given container with the given names and description and default icons. An ID property accessor expression is required so that Umbraco UI Builder knows which property is the ID property.

hashtag
AddCollection<TEntityType>(Lambda idFieldExpression, string nameSingular, string namePlural, string description, string iconSingular, string iconPlural, Lambda collectionConfig = null) : CollectionConfigBuilder<TEntityType>

Adds a collection to the given container with the given names, description and icons. An ID property accessor expression is required so that Umbraco UI Builder knows which property is the ID property.

hashtag
Changing a collection alias

hashtag
SetAlias(string alias) : CollectionConfigBuilder<TEntityType>

Sets the alias of the collection.

Optional: When creating a new collection, an alias is automatically generated from the supplied name for you. However, if you need a specific alias you can use the SetAlias method to override this.

hashtag
Changing a collection icon color

hashtag
SetIconColor(string color) : CollectionConfigBuilder<TEntityType>

Sets the collection icon color to the given color. Possible options are black, green, yellow, orange, blue or red.

hashtag
Defining an entity name

Within Umbraco, it is expected that an entity has a name property. So we need to let Umbraco UI Builder know which property to use for the name. If the entity doesn't have a name property, then it needs to know how to construct a name from an entity's other properties. We do this by using either the SetNameProperty or SetNameFormat methods on a Collection config builder instance.

hashtag
SetNameProperty(Lambda namePropertyExpression) : CollectionConfigBuilder<TEntityType>

Sets which property of your entity to use as the name property. Property must be of type string. By defining a property as the name property, its value will be used as the label for the entity in trees and list views. It will also be editable in the header region of the editor interface. The property will also automatically be added to the searchable properties collection and be used for the default sort property.

hashtag
SetNameProperty(Lambda namePropertyExpression, string heading) : CollectionConfigBuilder<TEntityType>

Sets which property of your entity to use as the name property and what custom heading should the list view column heading be. Property must be of type string. By defining a property as the name property, its value will be used as the label for the entity in trees and list views. It will also be editable in the header region of the editor interface. The property will also automatically be added to the searchable properties collection and be used for the default sort property.

hashtag
SetNameFormat(Lambda nameFormatExpression) : CollectionConfigBuilder<TEntityType>

Sets a format expression to use to dynamically create a label for the entity in things like trees and list views. By providing a name format it is assumed there is no single name property available on the entity. And as such none of the default behaviors described for the SetNameProperty method will apply.

hashtag
Defining a default sort order

hashtag
SetSortProperty(Lambda sortPropertyExpression) : CollectionConfigBuilder<TEntityType>

Sets which property of our entity to sort against, defaulting to ascending sort direction.

hashtag
SetSortProperty(Lambda sortPropertyExpression, SortDirection sortDirection) : CollectionConfigBuilder<TEntityType>

Sets which property of our entity to sort against in the provided sort direction.

hashtag
Defining time stamp properties

hashtag
SetDateCreatedProperty(Lambda dateCreatedProperty) : CollectionConfigBuilder<TEntityType>

Sets which property of our entity to use as the date created property. Property must be of type DateTime. When set and a new entity is saved via the repository, then the given field will be populated with the current date and time.

hashtag
SetDateModifiedProperty(Lambda dateCreatedProperty) : CollectionConfigBuilder<TEntityType>

Sets which property of our entity to use as the date modified property. Property must be of type DateTime. When set and an entity is saved via the repository, then the given field will be populated with the current date and time.

hashtag
Configuring soft deletes

By default, in Umbraco UI Builder any entity that is deleted via the Umbraco UI Builder repository is definitively removed from the system. The SetDeletedProperty method can be used if needed to keep the records in the data repository despite having them marked as deleted. This is so they do not show the the UI.

hashtag
SetDeletedProperty(Lambda deletedPropertyExpression) : CollectionConfigBuilder<TEntityType>

Sets which property of our entity to use as the deleted property flag. Property must be of type boolean or int. When a deleted property is set, any delete actions will set the deleted flag instead of deleting the entity. For boolean based properties, deleted entities will have a value of True when deleted. For int based properties, deleted entities will have a UTC Unix timestamp value of the date the entity was deleted. In addition, any fetch actions will also pre-filter out any deleted entities.

hashtag
Disabling create, update or delete features

hashtag
DisableCreate() : CollectionConfigBuilder<TEntityType>

Disables the option to create entities on the current collection. An entity could be created via code and only then editing is allowed in the UI for example.

hashtag
DisableCreate(Predicate<CollectionPermissionContext> disableExpression) : CollectionConfigBuilder<TEntityType>

Disables the option to create entities on the current collection if the given runtime predicate is true. An entity could be created via code and only then editing is allowed in the UI.

hashtag
DisableUpdate() : CollectionConfigBuilder<TEntityType>

Disables the option to update entities on the current collection. An entity can be created, but further editing is not allowed.

hashtag
DisableUpdate(Predicate<CollectionPermissionContext> disableExpression) : CollectionConfigBuilder<TEntityType>

Disables the option to update entities on the current collection if the given runtime predicate is true. An entity can be created, but further editing is not allowed.

hashtag
DisableDelete() : CollectionConfigBuilder<TEntityType>

Disables the option to delete entities on the current collection. Useful if the data needs to be retained and visible. See also configuring soft deletes.

hashtag
DisableDelete(Predicate<CollectionPermissionContext> disableExpression) : CollectionConfigBuilder<TEntityType>

Disables the option to delete entities on the current collection if the given runtime predicate is true. Useful if the data needs to be retained and visible. See also configuring soft deletes.

hashtag
MakeReadOnly() : CollectionConfigBuilder<TEntityType>

Sets the collection as read-only and disables any Create, Read, Update, and Delete (CRUD) operations from being performed on the collection via the UI.

hashtag
MakeReadOnly(Predicate<CollectionPermissionContext> disableExpression) : CollectionConfigBuilder<TEntityType>

Sets the collection as read-only if the given runtime predicate is true. It also disables any Create, Read, Update, and Delete (CRUD) operations from being performed on the collection via the UI.

hashtag
Set the visibility of the collection

hashtag
SetVisibility(Predicate<CollectionVisibilityContext> visibilityExpression) : CollectionConfigBuilder<TEntityType>

Sets the runtime visibility of the collection.

hashtag
Changing a collection connection string

By default, Umbraco UI Builder will use the Umbraco connection string for its database connection. However, you can change this by calling the SetConnectionString method on a Collection config builder instance.

hashtag
SetConnectionString(string connectionStringName) : CollectionConfigBuilder<TEntityType>

Sets the connection string name for the given collection repository.

Tree
Folder

hashtag
Editor(Lambda editorConfig = null) : EditorConfig<TEntityType>

Accesses the editor config of the given collection.

hashtag
Adding a tab to an editor

hashtag
AddTab(string name, Lambda tabConfig = null) : EditorTabConfigBuilder<TEntityType>

Adds a tab to the editor.

hashtag
Configuring a sidebar to a tab

A slidebar is a smaller area that is displayed to the right of the main editor. The sidebar can also contain fieldsets and fields in the same way tabs can. However, it is a much more limited display area so you'll need to choose your field types carefully. The sidebar is a great location to display entity metadata.

hashtag
Sidebar(Lambda sidebarConfig = null) : EditorTabSidebarConfigBuilder<TEntityType>

Configures the sidebar for the tab.

hashtag
Setting the visibility of a tab

hashtag
SetVisibility(Predicate<EditorTabVisibilityContext> visibilityExpression) : EditorTabConfigBuilder<TEntityType>

Sets the runtime visibility of the tab.

hashtag
Adding a fieldset to a tab

hashtag
AddFieldset(string name, Lambda fieldsetConfig = null) : EditorFieldsetConfigBuilder<TEntityType>

Adds the given fieldset to the tab.

hashtag
Setting the visibility of a fieldset

hashtag
SetVisibility(Predicate<EditorFieldsetVisibilityContext> visibilityExpression) : EditorFieldsetConfigBuilder<TEntityType>

Sets the runtime visibility of the fieldset.

hashtag
Adding a field to a fieldset

hashtag
AddField(Lambda propertyExpression, Lambda propertyConfig = null) : EditorFieldConfigBuilder<TEntityType, TValueType>

Adds the given property to the editor.

hashtag
Changing the label of a field

By default, Umbraco UI Builder will build the label from the property name, including splitting camel case names into sentence cases. However, you can set an explicit label if preferred.

hashtag
SetLabel(string label) : EditorFieldConfigBuilder<TEntityType, TValueType>

Sets the label for the editor field.

hashtag
Hiding the label of a field

Sometimes you may have a field editor that would work better in full width. You can achieve this by explicitly hiding the field label.

hashtag
HideLabel() : EditorFieldConfigBuilder<TEntityType, TValueType>

Hides the label for the editor field.

hashtag
Adding a description to a field

hashtag
SetDescription(string description) : EditorFieldConfigBuilder<TEntityType, TValueType>

Sets the description for the editor field.

hashtag
Changing the Data Type of a field

By default, Umbraco UI Builder will automatically choose a relevant Data Type for basic field types. However, if you wish to use an alternative Data Type then you can override this.

hashtag
SetDataType(string dataTypeName) : EditorFieldConfigBuilder<TEntityType, TValueType>

Set the Data Type of the current field to the Umbraco Data Type with the given name.

hashtag
SetDataType(int dataTypeId) : EditorFieldConfigBuilder<TEntityType, TValueType>

Set the Data Type of the current field to the Umbraco Data Type with the given id.

hashtag
Setting the default value of a field

hashtag
SetDefaultValue(TValueType defaultValue) : EditorFieldConfigBuilder<TEntityType, TValueType>

Sets the default value to a known constant.

hashtag
SetDefaultValue(Func defaultValueFunc) : EditorFieldConfigBuilder<TEntityType, TValueType>

Sets the default value via a function that gets evaluated at time of entity creation.

hashtag
Making a field required

hashtag
MakeRequired() : EditorFieldConfigBuilder<TEntityType, TValueType>

Makes the given field required.

hashtag
Validating a field

hashtag
SetValidationRegex(string regex) : EditorFieldConfigBuilder<TEntityType, TValueType>

Defines the regular expression to use when validating the field.

hashtag
Making a field read-only

hashtag
MakeReadOnly() : EditorFieldConfigBuilder<TEntityType, TValueType>

Makes the current field read-only disabling editing in the UI.

hashtag
MakeReadOnly(Func<TValueType, string> format) : EditorFieldConfigBuilder<TEntityType, TValueType>

Makes the current field read-only disabling editing in the UI. Provides a custom formatting expression to use when rendering the value as a string.

hashtag
MakeReadOnly(object dataTypeNameOrId) : EditorFieldConfigBuilder<TEntityType, TValueType>

Makes the current field read-only disabling editing in the UI. Provides the name or id of a datatype to use when in read-only mode.

hashtag
MakeReadOnly(Predicate<EditorFieldReadOnlyContext> readOnlyExp) : EditorFieldConfigBuilder<TEntityType, TValueType>

Makes the current field read-only disabling editing in the UI if the given runtime predicate is true.

hashtag
MakeReadOnly(Predicate<EditorFieldReadOnlyContext> readOnlyExp, Func<TValueType, string> format) : EditorFieldConfigBuilder<TEntityType, TValueType>

Makes the current field read-only disabling editing in the UI if the given runtime predicate is true. Provides a custom formatting expression to use when rendering the value as a string.

hashtag
MakeReadOnly(Predicate<EditorFieldReadOnlyContext> readOnlyExp, object dataTypeNameOrId) : EditorFieldConfigBuilder<TEntityType, TValueType>

Makes the current field read-only disabling editing in the UI if the given runtime predicate is true. Provides the name or id of a datatype to use when in read-only mode.

hashtag
Setting the visibility of a field

hashtag
SetVisibility(Predicate<EditorFieldVisibilityContext> visibilityExpression) : EditorFieldConfigBuilder<TEntityType, TValueType>

Sets the runtime visibility of the field.

Collection
A collection editor
// Example
withTreeConfig.AddContextApp("Comments", contextAppConfig => {
    ...
});
// Example
withTreeConfig.AddContextApp("Comments", "icon-chat", contextAppConfig => {
    ...
});
// Example
withTreeConfig.AddContextAppBefore("umbContent", "Comments", contextAppConfig => {
    ...
});
// Example
withTreeConfig.AddContextAppBefore("umbContent", "Comments", "icon-chat", contextAppConfig => {
    ...
});
// Example
withTreeConfig.AddContextAppAfter("umbContent", "Comments", contextAppConfig => {
    ...
});
// Example
withTreeConfig.AddContextAppAfter("umbContent", "Comments", "icon-chat", contextAppConfig => {
    ...
});
// Example
contextAppConfig.SetAlias("comments");
// Example
contextAppConfig.SetIconColor("blue");
// Example
contextAppConfig.SetVisibility(appCtx => appCtx.Source is IContent content && content.ContentType.Alias == "blogPost");
// Example
contextAppConfig.AddCollection<Comment>(p => p.Id, p=> "Comment", "Comments", "A collection of comments", collectionConfig => {
    ...
});
// Example
contextAppConfig.AddCollection<Comment>(p => p.Id, "Comment", "Comments", "A collection of comments", "icon-chat", "icon-chat", collectionConfig => {
    ...
});
// Example
folderConfig.AddCollection<Person>(p => p.Id, "Person", "People", "A collection of people", collectionConfig => {
    ...
});
// Example
folderConfig.AddCollection<Person>(p => p.Id, "Person", "People", "A collection of people", "icon-umb-users", "icon-umb-users", collectionConfig => {
    ...
});
// Example
collectionConfig.SetAlias("person");
// Example
collectionConfig.SetIconColor("blue");
// Example
collectionConfig.SetNameProperty(p => p.Name);
// Example
collectionConfig.SetNameProperty(p => p.Name, "Person Name");
// Example
collectionConfig.SetNameFormat(p => $"{p.FirstName} {p.LastName}");
// Example
collectionConfig.SetSortProperty(p => p.FirstName);
// Example
collectionConfig.SetSortProperty(p => p.FirstName, SortDirection.Descending);
// Example
collectionConfig.SetDateCreatedProperty(p => p.DateCreated);
// Example
collectionConfig.SetDateModifiedProperty(p => p.DateModified);
// Example
collectionConfig.SetDeletedProperty(p => p.Deleted);
// Example
collectionConfig.DisableCreate();
// Example
collectionConfig.DisableCreate(ctx => ctx.UserGroups.Any(x => x.Alias == "editor"));
// Example
collectionConfig.DisableUpdate();
// Example
collectionConfig.DisableUpdate(ctx => ctx.UserGroups.Any(x => x.Alias == "editor"));
// Example
collectionConfig.DisableDelete();
// Example
collectionConfig.DisableDelete(ctx => ctx.UserGroups.Any(x => x.Alias == "editor"));
// Example
collectionConfig.MakeReadOnly();
// Example
collectionConfig.MakeReadOnly(ctx => ctx.UserGroups.Any(x => x.Alias == "editor"));
// Example
collectionConfig.SetVisibility(ctx => ctx.UserRoles.Any(x => x.Alias == "editor"));
// Example
collectionConfig.SetConnectionString("myConnectionStringName");
// Example
collectionConfig.Editor(editorConfig => {
    ...
});
// Example
editorConfig.AddTab("General", tabConfig => {
    ...
});
// Example
tabConfig.Sidebar(sidebarConfig => {
    ...
});
// Example
tabConfig.SetVisibility(ctx => ctx.EditorMode == EditorMode.Create);
// Example
tabConfig.AddFieldset("Contact", fieldsetConfig => {
    ...
});
// Example
fieldsetConfig.SetVisibility(ctx => ctx.EditorMode == EditorMode.Create);
// Example
fieldsetConfig.AddField(p => p.FirstName, fieldConfig => {
    ...
});
// Example
fieldConfig.SetLabel("First Name");
// Example
fieldConfig.HideLabel();
// Example
fieldConfig.SetDescription("Enter your age in years");
// Example
fieldConfig.SetDataType("Richtext Editor");
// Example
fieldConfig.SetDataType(-88);
// Example
fieldConfig.SetDefaultValue(10);
// Example
fieldConfig.SetDefaultValue(() => DateTime.Now);
// Example
fieldConfig.MakeRequired();
// Example
fieldConfig.SetValidationRegex("[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}");
// Example
fieldConfig.MakeReadOnly();
// Example
fieldConfig.MakeReadOnly(distanceProp => $"{distanceProp:## 'km'}");
// Example
fieldConfig.MakeReadOnly("myReadOnlyEditor");
// Example
fieldConfig.MakeReadOnly(ctx => ctx.EditorMode == EditorMode.Create);
// Example
fieldConfig.MakeReadOnly(ctx => ctx.EditorMode == EditorMode.Create, distanceProp => $"{distanceProp:## 'km'}");
// Example
fieldConfig.MakeReadOnly(ctx => ctx.EditorMode == EditorMode.Create, "myReadOnlyEditor");
// Example
fieldConfig.SetVisibility(ctx => ctx.EditorMode == EditorMode.Create);

Trees

Configuring trees in Umbraco UI Builder, the backoffice UI builder for Umbraco.

A tree is a hierarchical structure that helps organize a section into logical sub-sections. A tree is accessed in the main side panel of the Umbraco interface. In Umbraco UI Builder, a section may only have a single tree definition. However, you can use folder nodes to help organize the tree structure as you need it.

hashtag
Configuring a Umbraco UI Builder section tree

The tree configuration for Umbraco UI Builder sections is a sub-configuration of a

config builder instance and is accessed via its
Tree
method.

hashtag
Tree(Lambda treeConfig = null) : TreeConfigBuilder

Accesses the tree config of the given section.

hashtag
Adding a tree to an existing section

The tree configuration for existing sections is a sub-configuration of a WithSection config builder instance and is accessed via one of its AddTree methods.

hashtag
AddTree(string name, string icon, Lambda treeConfig = null) : TreeConfigBuilder

Adds a tree to the current section.

hashtag
AddTree(string groupName, string name, string icon, Lambda treeConfig = null) : TreeConfigBuilder

Adds a tree to the current section in a group with the given name.

hashtag
AddTreeBefore(string treeAlias, string name, string icon, Lambda treeConfig = null) : TreeConfigBuilder

Adds a tree to the current section before the tree with the given alias.

hashtag
AddTreeAfter(string treeAlias, string name, string icon, Lambda treeConfig = null) : TreeConfigBuilder

Adds a tree to the current section after the tree with the given alias.

hashtag
Changing the tree icon color

hashtag
SetIconColor(string color) : TreeConfigBuilder

Sets the trees icon color to the given color. The options that are possible are black, green, yellow, orange, blue or red.

circle-exclamation

Only trees added to existing sections have an icon. Trees added to Umbraco UI Builder sections don't show a tree icon instead they go straight into displaying the tree contents.

hashtag
Adding a group to a tree

hashtag
AddGroup(string name, Lambda groupConfig = null) : GroupConfigBuilder

Adds a group to the current tree with the given name.

circle-exclamation

Only Umbraco UI Builder section trees can configure groups, where trees added to existing sections cannot.

hashtag
Adding a folder to a tree/group

hashtag
AddFolder(string name, Lambda folderConfig = null) : FolderConfigBuilder

Adds a folder to the current tree/group with the given name and a default folder icon. For more information check the Folders documentation.

hashtag
AddFolder(string name, string icon, Lambda folderConfig = null) : FolderConfigBuilder

Adds a folder to the current tree/group with the given name + icon. For more information check the Folders documentation.

hashtag
Adding a collection to a tree/group

hashtag
AddCollection<TEntityType>(Lambda idFieldExpression, string nameSingular, string namePlural, string description, Lambda collectionConfig = null) : CollectionConfigBuilder<TEntityType>

Adds a collection to the current tree/group with the given names, descriptions, and default icons. An ID property accessor expression is required so that Umbraco UI Builder knows which property is the ID property. For more information check the Collections documentation.

hashtag
AddCollection<TEntityType>(Lambda idFieldExpression, string nameSingular, string namePlural, string description, string iconSingular, string iconPlural, Lambda collectionConfig = null) : CollectionConfigBuilder<TEntityType>

Adds a collection to the current tree/group with the given names, description and icons. An ID property accessor expression is required so that Umbraco UI Builder knows which property is the ID property. For more information check the Collections documentation.

hashtag
Extending an existing tree

You can extend existing trees adding Umbraco UI Builder context apps and virtual sub trees by calling the WithTree method of a WithSectionConfigBuilder instance.

hashtag
WithTree(string alias, Lambda treeConfig = null) : WithTreeConfigBuilder

Starts a sub-configuration for the existing Umbraco tree with the given alias.

hashtag
Adding a context app to an existing tree

hashtag
AddContextApp(string name, Lambda contextAppConfig = null) : ContextAppConfigBuilder

Adds a context app with the given name and default icon. For more information check the Context App documentation.

hashtag
AddContextApp(string name, string icon, Lambda contextAppConfig = null) : ContextAppConfigBuilder

Adds a context app to the Umbraco menu with the given name and icon. For more information check the Context App documentation.

hashtag
AddContextAppBefore(string beforeAlias, string name, Lambda contextAppConfig = null) : ContextAppConfigBuilder

Adds a context app with the given name and default icon before the context app with the given alias. For more information check the Context App documentation.

hashtag
AddContextAppBefore(string beforeAlias, string name, string icon, Lambda contextAppConfig = null) : ContextAppConfigBuilder

Adds a context app to the Umbraco menu with the given name and icon before the context app with the given alias. For more information check the Context App documentation.

hashtag
AddContextAppAfter(string afterAlias, string name, Lambda contextAppConfig = null) : ContextAppConfigBuilder

Adds a context app with the given name and default icon after the context app with the given alias. For more information check the Context App documentation.

hashtag
AddContextAppAfter(string afterAlias, string name, string icon, Lambda contextAppConfig = null) : ContextAppConfigBuilder

Adds a context app to the Umbraco menu with the given name and icon after the context app with the given alias. For more information check the Context App documentation.

Section
Tree
// Example
sectionConfig.Tree(treeConfig => {
    ...
});
// Example
withSectionConfig.AddTree("My Tree", "icon-folder", treeConfig => {
    ...
});
// Example
withSectionConfig.AddTree("My Group", "My Tree", "icon-folder", treeConfig => {
    ...
});
// Example
withSectionConfig.AddTreeBefore("member", "My Tree", "icon-folder", treeConfig => {
    ...
});
// Example
withSectionConfig.AddTreeAfter("member", "My Tree", "icon-folder", treeConfig => {
    ...
});
// Example
collectionConfig.SetIconColor("blue");
// Example
treeConfig.AddGroup("Settings", groupConfig => {
    ...
});
// Example
treeConfig.AddFolder("Settings", folderConfig => {
    ...
});
// Example
treeConfig.AddFolder("Settings", "icon-settings", folderConfig => {
    ...
});
// Example
treeConfig.AddCollection<Person>(p => p.Id, "Person", "People", "A collection of people", collectionConfig => {
    ...
});
// Example
treeConfig.AddCollection<Person>(p => p.Id, "Person", "People", "A collection of people", "icon-umb-users", "icon-umb-users", collectionConfig => {
    ...
});
// Example
sectionConfig.WithTree("content", withTreeConfig => {
    ...
});
// Example
withTreeConfig.AddContextApp("Comments", contextAppConfig => {
    ...
});
// Example
withTreeConfig.AddContextApp("Comments", "icon-chat", contextAppConfig => {
    ...
});
// Example
withTreeConfig.AddContextAppBefore("umbContent", "Comments", contextAppConfig => {
    ...
});
// Example
withTreeConfig.AddContextAppBefore("umbContent", "Comments", "icon-chat", contextAppConfig => {
    ...
});
// Example
withTreeConfig.AddContextAppAfter("umbContent", "Comments", contextAppConfig => {
    ...
});
// Example
withTreeConfig.AddContextAppAfter("umbContent", "Comments", "icon-chat", contextAppConfig => {
    ...
});