From 04292b2760271bc98e1d87221a9f172e987d2ca6 Mon Sep 17 00:00:00 2001 From: kjac Date: Thu, 9 Oct 2025 11:09:02 +0200 Subject: [PATCH] Remove all editormodel articles, redirects etc. for 15+ --- 15/umbraco-cms/SUMMARY.md | 2 - .../reference/notifications/README.md | 8 - .../editormodel-notifications/README.md | 168 ------------------ .../customizing-the-links-box.md | 39 ---- .../images/properties-info-app-v14.png | Bin 20632 -> 0 bytes .../images/properties-info-app.png | Bin 9248 -> 0 bytes .../reference/notifications/README.md | 8 - 17/umbraco-cms/.gitbook.yaml | 1 - 17/umbraco-cms/SUMMARY.md | 1 - .../reference/notifications/README.md | 8 - .../editormodel-notifications/README.md | 168 ------------------ .../images/properties-info-app-v14.png | Bin 20632 -> 0 bytes .../images/properties-info-app.png | Bin 9248 -> 0 bytes 13 files changed, 403 deletions(-) delete mode 100644 15/umbraco-cms/reference/notifications/editormodel-notifications/README.md delete mode 100644 15/umbraco-cms/reference/notifications/editormodel-notifications/customizing-the-links-box.md delete mode 100644 15/umbraco-cms/reference/notifications/editormodel-notifications/images/properties-info-app-v14.png delete mode 100644 15/umbraco-cms/reference/notifications/editormodel-notifications/images/properties-info-app.png delete mode 100644 17/umbraco-cms/reference/notifications/editormodel-notifications/README.md delete mode 100644 17/umbraco-cms/reference/notifications/editormodel-notifications/images/properties-info-app-v14.png delete mode 100644 17/umbraco-cms/reference/notifications/editormodel-notifications/images/properties-info-app.png diff --git a/15/umbraco-cms/SUMMARY.md b/15/umbraco-cms/SUMMARY.md index 870a264f122..8081e852625 100644 --- a/15/umbraco-cms/SUMMARY.md +++ b/15/umbraco-cms/SUMMARY.md @@ -371,8 +371,6 @@ * [UserService Notifications Example](reference/notifications/userservice-notifications.md) * [Sending Allowed Children Notification](reference/notifications/sendingallowedchildrennotifications.md) * [Umbraco Application Lifetime Notifications](reference/notifications/umbracoapplicationlifetime-notifications.md) - * [EditorModel Notifications](reference/notifications/editormodel-notifications/README.md) - * [Customizing the "Links" box](reference/notifications/editormodel-notifications/customizing-the-links-box.md) * [Hot vs. cold restarts](reference/notifications/hot-vs-cold-restarts.md) * [Inversion of Control / Dependency injection](reference/using-ioc.md) * [Management](reference/management/README.md) diff --git a/15/umbraco-cms/reference/notifications/README.md b/15/umbraco-cms/reference/notifications/README.md index 79ba4613979..8dd4ad60a0e 100644 --- a/15/umbraco-cms/reference/notifications/README.md +++ b/15/umbraco-cms/reference/notifications/README.md @@ -263,14 +263,6 @@ Below you can find a list of the most common UmbracoApplicationLifetime object n Learn more about these under [Tree Change Notifications](https://apidocs.umbraco.com/v15/csharp/api/Umbraco.Cms.Core.Notifications.TreeChangeNotification-1.html) in the CMS API Docs. -### Editor Model Notifications - -See [EditorModel Notifications](editormodel-notifications/) for a list of the EditorModel events. - -{% hint style="info" %} -Useful for manipulating the model before it is sent to an editor in the backoffice. It could be used to set a default value of a property on a new document. -{% endhint %} - ## Creating and publishing your own custom notifications Umbraco uses notifications to allow people to hook into different workflow processes. This notification pattern is extensible, allowing you to create and publish custom notifications, and other people to observe and hook into your custom processes. This approach can be useful when creating Umbraco packages. For more information on how you create and publish your own notifications, see the [creating and publishing notifications](creating-and-publishing-notifications.md) article. diff --git a/15/umbraco-cms/reference/notifications/editormodel-notifications/README.md b/15/umbraco-cms/reference/notifications/editormodel-notifications/README.md deleted file mode 100644 index 23dc06c26aa..00000000000 --- a/15/umbraco-cms/reference/notifications/editormodel-notifications/README.md +++ /dev/null @@ -1,168 +0,0 @@ -# EditorModel Notifications - -{% hint style="warning" %} -This page is a work in progress and may undergo further revisions, updates, or amendments. The information contained herein is subject to change without notice. - -EditorModel notifications are no longer handled on the server-side, but on the client-side. As the documentation effort progresses, the samples on this page will be updated accordingly. -{% endhint %} - -EditorModel notifications enable you to manipulate the model used by the backoffice before it is loaded into an editor. For example the `SendingContentNotification` is published right before a content item is loaded into the backoffice for editing. It is therefore the perfect notification to use to set a default value for a particular property, or perhaps to hide a property/tab/Content App from a certain editor. - -## Usage - -Example usage of the `SendingContentNotification` - e.g. set the default PublishDate for a new NewsArticle to be today's Date: - -{% code overflow="wrap" lineNumbers="true" fullWidth="false" %} -```csharp -using System; -using System.Linq; -using Umbraco.Cms.Core.Events; -using Umbraco.Cms.Core.Models.ContentEditing; -using Umbraco.Cms.Core.Notifications; -using Umbraco.Extensions; - -namespace Umbraco.Docs.Samples.Web.Notifications; - -public class EditorSendingContentNotificationHandler : INotificationHandler -{ - public void Handle(SendingContentNotification notification) - { - if (notification.Content.ContentTypeAlias.Equals("blogpost")) - { - // Access the property you want to pre-populate - // each content item can have 'variations' - each variation is represented by the `ContentVariantDisplay` class. - // if your site uses variants, then you need to decide whether to set the default value for all variants or a specific variant - // eg. set by variant name: - // var variant = notification.Content.Variants.FirstOrDefault(f => f.Name == "specificVariantName"); - // OR loop through all the variants: - foreach (var variant in notification.Content.Variants) - { - // Check if variant is a 'new variant' - // we only want to set the default value when the content item is first created - if (variant.State == ContentSavedState.NotCreated) - { - // each variant has an IEnumerable of 'Tabs' (property groupings) - // and each of these contain an IEnumerable of `ContentPropertyDisplay` properties - // find the first property with alias 'publishDate' - var pubDateProperty = variant.Tabs.SelectMany(f => f.Properties) - .FirstOrDefault(f => f.Alias.InvariantEquals("publishDate")); - if (pubDateProperty is not null) - { - // set default value of the publish date property if it exists - pubDateProperty.Value = DateTime.UtcNow; - } - } - } - } - } -} -``` -{% endcode %} - -Another example could be to set the default Member Group for a specific Member Type using `SendingMemberNotification`: - -```csharp -using System.Collections.Generic; -using System.Linq; -using Umbraco.Cms.Core; -using Umbraco.Cms.Core.Events; -using Umbraco.Cms.Core.Notifications; -using Umbraco.Cms.Core.Services; - -namespace Umbraco.Docs.Samples.Web.Notifications; - -public class EditorSendingMemberNotificationHandler : INotificationHandler -{ - private readonly IMemberGroupService _memberGroupService; - - public EditorSendingMemberNotificationHandler(IMemberGroupService memberGroupService) - { - _memberGroupService = memberGroupService; - } - - public void Handle(SendingMemberNotification notification) - { - var isNew = !int.TryParse(notification.Member.Id?.ToString(), out int id) || id == 0; - - // We only want to set the default member group when the member is initially created, eg doesn't have an Id yet - if (isNew is false) - { - return; - } - - // Set a default value member group for the member type `Member` - if (notification.Member.ContentTypeAlias.Equals("Member")) - { - var memberGroup = _memberGroupService.GetByName("Customer"); - if (memberGroup is null) - { - return; - } - - // Find member group property on member model - var property = notification.Member.MembershipProperties.FirstOrDefault(x => - x.Alias.Equals($"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}membergroup")); - - if (property is not null) - { - // Assign a default value for member group property - property.Value = new Dictionary - { - {memberGroup.Name, true} - }; - } - } - } -} -``` - -## Notifications - -| Notification | Members | Description | -| ---------------------------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| SendingContentNotification |
  • ContentItemDisplay Content
  • IUmbracoContext UmbracoContext
|

Published right before the editor model is sent for editing in the content section.
NOTE: Content is a Umbraco.Cms.Core.Models.ContentEditing.ContentItemDisplay type which contains the tabs and properties of the elements about to be loaded for editing.

| -| SendingMediaNotification |
  • MediaItemDisplay Media
  • IUmbracoContext UmbracoContext
|

Published right before the editor model is sent for editing in the media section
NOTE: Media is a Umbraco.Cms.Core.Models.ContentEditing.MediaItemDisplay type which in turn contains the tabs and properties of the elements about to be loaded for editing.

| -| SendingMemberNotification |
  • MemberDisplay Member
  • IUmbracoContext UmbracoContext
|

Published right before the editor model is sent for editing in the member section.
NOTE: Member is a Umbraco.Cms.Core.Models.ContentEditing.MemberDisplay type which in turn contains the tabs and properties of the elements about to be loaded for editing.

| -| SendingUserNotification |
  • UserDisplay User
  • IUmbracoContext UmbracoContext
|

Published right before the editor model is sent for editing in the user section.
NOTE: User is a Umbraco.Cms.Core.Models.ContentEditing.UserDisplay type which in turn contains the tabs and properties of the elements about to be loaded for editing.

| -| SendingDashboardsNotification |
  • IEnumerable<Tab<IDashboardSlim>> Dashboards
  • IUmbracoContext UmbracoContext
|

Published right before the a dashboard is retrieved in a section.
NOTE: Dashboards is a collection of IDashboardSlim, each object gives you access to Label, Alias, Properties, whether it's expanded, and whether it IsActive.

| -| SendingAllowedChildrenNotification |
  • IEnumerable<ContentTypeBasic> Children
  • IUmbracoContext UmbracoContext
|

Published right before the allowed children of the selected Content Type are sent back during content creation in the Content Section.
NOTE: Children is a collection of ContentTypeBasic, each object gives you access to Alias, Description, Thumbnail and more. You can remove or add new children to the list in the notification.

| - -### Display models - -#### ContentItemDisplay - -A model representing a content item to be displayed in the backoffice - -* TemplateAlias -* Urls -* AllowPreview - Determines whether previewing is allowed for this node, By default this is true but by using notifications developers can toggle this off for certain documents if there is nothing to preview -* AllowedActions - The allowed 'actions' based on the user's permissions - Create, Update, Publish, Send to publish -* IsBlueprint -* Tabs - Defines the tabs containing display properties -* Properties - properties based on the properties in the tabs collection -* And more... - -#### MediaItemDisplay - -A model representing a media item to be displayed in the backoffice - -* Alias -* Tabs - Defines the tabs containing display properties -* Properties - properties based on the properties in the tabs collection -* And more... - -#### MemberDisplay - -A model representing a member to be displayed in the backoffice - -* Username -* Email -* Tabs - Defines the tabs containing display properties -* Properties - properties based on the properties in the tabs collection -* And more... - -## Samples - -The EditorModel notifications gives you a lot of options to customize the backoffice experience. You can find inspiration from the various samples provided below: - -* [Customizing the "Links" box](customizing-the-links-box.md) diff --git a/15/umbraco-cms/reference/notifications/editormodel-notifications/customizing-the-links-box.md b/15/umbraco-cms/reference/notifications/editormodel-notifications/customizing-the-links-box.md deleted file mode 100644 index 359db99af67..00000000000 --- a/15/umbraco-cms/reference/notifications/editormodel-notifications/customizing-the-links-box.md +++ /dev/null @@ -1,39 +0,0 @@ -# Customizing the "Links" box - -For a content item, Umbraco will show a **Links** box within the **Info** content app. By default, this box will show one or more links to content item. - -![Links Box](images/properties-info-app-v14.png) - -With the `SendingContentNotification` event, we can manipulate the links in the `Urls` property. This could be by replacing it with custom links although a URL provider would be more suitable: - -```csharp -public void Handle(SendingContentNotification notification) -{ - notification.Content.Urls = new[] - { - new UrlInfo($"/products/?id={notification.Content.Id}", true, null) - }; -} -``` - -If the content item has multiple cultures, we can specify the link culture like this: - -```csharp -public void Handle(SendingContentNotification notification) -{ - notification.Content.Urls = new[] - { - new UrlInfo($"https://mysite.com/products/?id={notification.Content.Id}", true, "en-US"), - new UrlInfo($"https://mysite.dk/produkter/?id={notification.Content.Id}", true, "da-DK") - }; -} -``` - -or remove the box entirely by providing an empty list of links: - -```csharp -public void Handle(SendingContentNotification notification) -{ - notification.Content.Urls = null; -} -``` diff --git a/15/umbraco-cms/reference/notifications/editormodel-notifications/images/properties-info-app-v14.png b/15/umbraco-cms/reference/notifications/editormodel-notifications/images/properties-info-app-v14.png deleted file mode 100644 index e9525c9a3064367e8bc69813e2116ed52ed56933..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20632 zcmeFZcT`hb`z~tP!d5935D0B6Hb5y7dWndDf`If60s;X9q}PB7f`S22dQ0e?i1Zo- z2}(&GJ-GpwY|EtLs$UtEJfDR&J6z zXXncplL`wk>0GDCiΜ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 diff --git a/16/umbraco-cms/reference/notifications/README.md b/16/umbraco-cms/reference/notifications/README.md index b4eae548857..65479ff8d7a 100644 --- a/16/umbraco-cms/reference/notifications/README.md +++ b/16/umbraco-cms/reference/notifications/README.md @@ -263,14 +263,6 @@ Below you can find a list of the most common UmbracoApplicationLifetime object n Learn more about these under [Tree Change Notifications](https://apidocs.umbraco.com/v15/csharp/api/Umbraco.Cms.Core.Notifications.TreeChangeNotification-1.html) in the CMS API Docs. -### Editor Model Notifications - -See [EditorModel Notifications](editormodel-notifications/) for a list of the EditorModel events. - -{% hint style="info" %} -Useful for manipulating the model before it is sent to an editor in the backoffice. It could be used to set a default value of a property on a new document. -{% endhint %} - ## Creating and publishing your own custom notifications Umbraco uses notifications to allow people to hook into different workflow processes. This notification pattern is extensible, allowing you to create and publish custom notifications, and other people to observe and hook into your custom processes. This approach can be useful when creating Umbraco packages. For more information on how you create and publish your own notifications, see the [creating and publishing notifications](creating-and-publishing-notifications.md) article. diff --git a/17/umbraco-cms/.gitbook.yaml b/17/umbraco-cms/.gitbook.yaml index 15a796d982f..41d7d74474c 100644 --- a/17/umbraco-cms/.gitbook.yaml +++ b/17/umbraco-cms/.gitbook.yaml @@ -17,7 +17,6 @@ redirects: customizing/foundation/working-with-data/repositories: customizing/foundation/repositories.md customizing/foundation/working-with-data/states: customizing/foundation/states.md customizing/foundation/working-with-data/store: customizing/foundation/README.md - reference/notifications/editormodel-notifications/customizing-the-links-box: reference/notifications/editormodel-notifications/README.md fundamentals/backoffice/property-editors/built-in-umbraco-property-editors/rich-text-editor/blocks: fundamentals/backoffice/property-editors/built-in-umbraco-property-editors/rich-text-editor/README.md tutorials/creating-a-custom-dashboard: tutorials/creating-a-custom-dashboard/README.md extending/property-editors/declaring-your-property-editor: tutorials/creating-a-property-editor/README.md diff --git a/17/umbraco-cms/SUMMARY.md b/17/umbraco-cms/SUMMARY.md index 559e4a7b771..cde206ffa87 100644 --- a/17/umbraco-cms/SUMMARY.md +++ b/17/umbraco-cms/SUMMARY.md @@ -377,7 +377,6 @@ * [MediaService Notifications Example](reference/notifications/mediaservice-notifications.md) * [MemberService Notifications Example](reference/notifications/memberservice-notifications.md) * [Umbraco Application Lifetime Notifications](reference/notifications/umbracoapplicationlifetime-notifications.md) - * [EditorModel Notifications](reference/notifications/editormodel-notifications/README.md) * [Hot vs. cold restarts](reference/notifications/hot-vs-cold-restarts.md) * [Inversion of Control / Dependency injection](reference/using-ioc.md) * [Management](reference/management/README.md) diff --git a/17/umbraco-cms/reference/notifications/README.md b/17/umbraco-cms/reference/notifications/README.md index b4eae548857..65479ff8d7a 100644 --- a/17/umbraco-cms/reference/notifications/README.md +++ b/17/umbraco-cms/reference/notifications/README.md @@ -263,14 +263,6 @@ Below you can find a list of the most common UmbracoApplicationLifetime object n Learn more about these under [Tree Change Notifications](https://apidocs.umbraco.com/v15/csharp/api/Umbraco.Cms.Core.Notifications.TreeChangeNotification-1.html) in the CMS API Docs. -### Editor Model Notifications - -See [EditorModel Notifications](editormodel-notifications/) for a list of the EditorModel events. - -{% hint style="info" %} -Useful for manipulating the model before it is sent to an editor in the backoffice. It could be used to set a default value of a property on a new document. -{% endhint %} - ## Creating and publishing your own custom notifications Umbraco uses notifications to allow people to hook into different workflow processes. This notification pattern is extensible, allowing you to create and publish custom notifications, and other people to observe and hook into your custom processes. This approach can be useful when creating Umbraco packages. For more information on how you create and publish your own notifications, see the [creating and publishing notifications](creating-and-publishing-notifications.md) article. diff --git a/17/umbraco-cms/reference/notifications/editormodel-notifications/README.md b/17/umbraco-cms/reference/notifications/editormodel-notifications/README.md deleted file mode 100644 index 17023188509..00000000000 --- a/17/umbraco-cms/reference/notifications/editormodel-notifications/README.md +++ /dev/null @@ -1,168 +0,0 @@ -# EditorModel Notifications - -{% hint style="warning" %} -This page is a work in progress and may undergo further revisions, updates, or amendments. The information contained herein is subject to change without notice. - -EditorModel notifications are no longer handled on the server-side, but on the client-side. As the documentation effort progresses, the samples on this page will be updated accordingly. -{% endhint %} - -EditorModel notifications enable you to manipulate the model used by the backoffice before it is loaded into an editor. For example the `SendingContentNotification` is published right before a content item is loaded into the backoffice for editing. It is therefore the perfect notification to use to set a default value for a particular property, or perhaps to hide a property/tab/Content App from a certain editor. - -## Usage - -Example usage of the `SendingContentNotification` - e.g. set the default PublishDate for a new NewsArticle to be today's Date: - -{% code overflow="wrap" lineNumbers="true" fullWidth="false" %} -```csharp -using System; -using System.Linq; -using Umbraco.Cms.Core.Events; -using Umbraco.Cms.Core.Models.ContentEditing; -using Umbraco.Cms.Core.Notifications; -using Umbraco.Extensions; - -namespace Umbraco.Docs.Samples.Web.Notifications; - -public class EditorSendingContentNotificationHandler : INotificationHandler -{ - public void Handle(SendingContentNotification notification) - { - if (notification.Content.ContentTypeAlias.Equals("blogpost")) - { - // Access the property you want to pre-populate - // each content item can have 'variations' - each variation is represented by the `ContentVariantDisplay` class. - // if your site uses variants, then you need to decide whether to set the default value for all variants or a specific variant - // eg. set by variant name: - // var variant = notification.Content.Variants.FirstOrDefault(f => f.Name == "specificVariantName"); - // OR loop through all the variants: - foreach (var variant in notification.Content.Variants) - { - // Check if variant is a 'new variant' - // we only want to set the default value when the content item is first created - if (variant.State == ContentSavedState.NotCreated) - { - // each variant has an IEnumerable of 'Tabs' (property groupings) - // and each of these contain an IEnumerable of `ContentPropertyDisplay` properties - // find the first property with alias 'publishDate' - var pubDateProperty = variant.Tabs.SelectMany(f => f.Properties) - .FirstOrDefault(f => f.Alias.InvariantEquals("publishDate")); - if (pubDateProperty is not null) - { - // set default value of the publish date property if it exists - pubDateProperty.Value = DateTime.UtcNow; - } - } - } - } - } -} -``` -{% endcode %} - -Another example could be to set the default Member Group for a specific Member Type using `SendingMemberNotification`: - -```csharp -using System.Collections.Generic; -using System.Linq; -using Umbraco.Cms.Core; -using Umbraco.Cms.Core.Events; -using Umbraco.Cms.Core.Notifications; -using Umbraco.Cms.Core.Services; - -namespace Umbraco.Docs.Samples.Web.Notifications; - -public class EditorSendingMemberNotificationHandler : INotificationHandler -{ - private readonly IMemberGroupService _memberGroupService; - - public EditorSendingMemberNotificationHandler(IMemberGroupService memberGroupService) - { - _memberGroupService = memberGroupService; - } - - public void Handle(SendingMemberNotification notification) - { - var isNew = !int.TryParse(notification.Member.Id?.ToString(), out int id) || id == 0; - - // We only want to set the default member group when the member is initially created, eg doesn't have an Id yet - if (isNew is false) - { - return; - } - - // Set a default value member group for the member type `Member` - if (notification.Member.ContentTypeAlias.Equals("Member")) - { - var memberGroup = _memberGroupService.GetByName("Customer"); - if (memberGroup is null) - { - return; - } - - // Find member group property on member model - var property = notification.Member.MembershipProperties.FirstOrDefault(x => - x.Alias.Equals($"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}membergroup")); - - if (property is not null) - { - // Assign a default value for member group property - property.Value = new Dictionary - { - {memberGroup.Name, true} - }; - } - } - } -} -``` - -## Notifications - -| Notification | Members | Description | -| ---------------------------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| SendingContentNotification |
  • ContentItemDisplay Content
  • IUmbracoContext UmbracoContext
|

Published right before the editor model is sent for editing in the content section.
NOTE: Content is a Umbraco.Cms.Core.Models.ContentEditing.ContentItemDisplay type which contains the tabs and properties of the elements about to be loaded for editing.

| -| SendingMediaNotification |
  • MediaItemDisplay Media
  • IUmbracoContext UmbracoContext
|

Published right before the editor model is sent for editing in the media section
NOTE: Media is a Umbraco.Cms.Core.Models.ContentEditing.MediaItemDisplay type which in turn contains the tabs and properties of the elements about to be loaded for editing.

| -| SendingMemberNotification |
  • MemberDisplay Member
  • IUmbracoContext UmbracoContext
|

Published right before the editor model is sent for editing in the member section.
NOTE: Member is a Umbraco.Cms.Core.Models.ContentEditing.MemberDisplay type which in turn contains the tabs and properties of the elements about to be loaded for editing.

| -| SendingUserNotification |
  • UserDisplay User
  • IUmbracoContext UmbracoContext
|

Published right before the editor model is sent for editing in the user section.
NOTE: User is a Umbraco.Cms.Core.Models.ContentEditing.UserDisplay type which in turn contains the tabs and properties of the elements about to be loaded for editing.

| -| SendingDashboardsNotification |
  • IEnumerable<Tab<IDashboardSlim>> Dashboards
  • IUmbracoContext UmbracoContext
|

Published right before the a dashboard is retrieved in a section.
NOTE: Dashboards is a collection of IDashboardSlim, each object gives you access to Label, Alias, Properties, whether it's expanded, and whether it IsActive.

| -| SendingAllowedChildrenNotification |
  • IEnumerable<ContentTypeBasic> Children
  • IUmbracoContext UmbracoContext
|

Published right before the allowed children of the selected Content Type are sent back during content creation in the Content Section.
NOTE: Children is a collection of ContentTypeBasic, each object gives you access to Alias, Description, Thumbnail and more. You can remove or add new children to the list in the notification.

| - -### Display models - -#### ContentItemDisplay - -A model representing a content item to be displayed in the backoffice - -* TemplateAlias -* Urls -* AllowPreview - Determines whether previewing is allowed for this node, By default this is true but by using notifications developers can toggle this off for certain documents if there is nothing to preview -* AllowedActions - The allowed 'actions' based on the user's permissions - Create, Update, Publish, Send to publish -* IsBlueprint -* Tabs - Defines the tabs containing display properties -* Properties - properties based on the properties in the tabs collection -* And more... - -#### MediaItemDisplay - -A model representing a media item to be displayed in the backoffice - -* Alias -* Tabs - Defines the tabs containing display properties -* Properties - properties based on the properties in the tabs collection -* And more... - -#### MemberDisplay - -A model representing a member to be displayed in the backoffice - -* Username -* Email -* Tabs - Defines the tabs containing display properties -* Properties - properties based on the properties in the tabs collection -* And more... - -## Samples - -The EditorModel notifications gives you a lot of options to customize the backoffice experience. You can find inspiration from the various samples provided below: - -* [Customizing the "Links" box](broken-reference) diff --git a/17/umbraco-cms/reference/notifications/editormodel-notifications/images/properties-info-app-v14.png b/17/umbraco-cms/reference/notifications/editormodel-notifications/images/properties-info-app-v14.png deleted file mode 100644 index e9525c9a3064367e8bc69813e2116ed52ed56933..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20632 zcmeFZcT`hb`z~tP!d5935D0B6Hb5y7dWndDf`If60s;X9q}PB7f`S22dQ0e?i1Zo- z2}(&GJ-GpwY|EtLs$UtEJfDR&J6z zXXncplL`wk>0GDCiΜ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