diff --git a/15/umbraco-cms/README.md b/15/umbraco-cms/README.md
index 3328954f0c4..fd4ff287dc0 100644
--- a/15/umbraco-cms/README.md
+++ b/15/umbraco-cms/README.md
@@ -17,3 +17,15 @@ Umbraco CMS is a flexible and editor-friendly Content Management System (CMS) th
Learn more about Umbraco CMS and get an overview of the top features on [Umbraco.com](https://umbraco.com/products/umbraco-cms/).
+
+## New articles for Umbraco 15
+
+* [Tutorial: Extending the Help Menu](tutorials/extending-the-help-menu.md)
+
+***
+
+## Umbraco Training
+
+Umbraco HQ offers a full-day training course covering the basic concepts and features needed for building an Umbraco CMS website. The course targets frontend and backend developers, designers, and technical users who want to build a website from scratch in Umbraco,
+
+[Explore the Fundamentals Training Course](https://umbraco.com/training/course-details/fundamentals-details/) to learn more about the topics covered and how it can enhance your Umbraco development skills.
\ No newline at end of file
diff --git a/15/umbraco-cms/SUMMARY.md b/15/umbraco-cms/SUMMARY.md
index 61914722ced..6140c620e16 100644
--- a/15/umbraco-cms/SUMMARY.md
+++ b/15/umbraco-cms/SUMMARY.md
@@ -101,3 +101,4 @@
* [Custom value conversion for rendering](tutorials/creating-a-property-editor/custom-value-conversion-for-rendering.md)
* [Adding server-side validation](tutorials/creating-a-property-editor/adding-server-side-validation.md)
* [Default Property Editor Schema aliases](tutorials/creating-a-property-editor/default-property-editor-schema-aliases.md)
+* [Extending the Help Menu](tutorials/extending-the-help-menu.md)
diff --git a/15/umbraco-cms/customizing/extend-and-customize-editing-experience.md b/15/umbraco-cms/customizing/extend-and-customize-editing-experience.md
index b1af838d275..cfda9be7aee 100644
--- a/15/umbraco-cms/customizing/extend-and-customize-editing-experience.md
+++ b/15/umbraco-cms/customizing/extend-and-customize-editing-experience.md
@@ -18,3 +18,10 @@ In this section, you will find all the resources you need to build an intuitive
+***
+
+## Umbraco Training
+
+Umbraco HQ offers a training course covering extending and customizing the Umbraco Backoffice to enhance the editing experience. The course targets frontend and backend developers familiar with Umbraco who want to extend the UI for editors.
+
+[Explore the Extending the Backoffice Training Course](https://umbraco.com/training/course-details/extending-the-backoffice-details/) to learn more about the topics covered and how it can enhance your Umbraco development skills.
\ No newline at end of file
diff --git a/15/umbraco-cms/customizing/extending-overview/extension-types/entry-point.md b/15/umbraco-cms/customizing/extending-overview/extension-types/backoffice-entry-point.md
similarity index 98%
rename from 15/umbraco-cms/customizing/extending-overview/extension-types/entry-point.md
rename to 15/umbraco-cms/customizing/extending-overview/extension-types/backoffice-entry-point.md
index e02abff4c6a..de15fabe51a 100644
--- a/15/umbraco-cms/customizing/extending-overview/extension-types/entry-point.md
+++ b/15/umbraco-cms/customizing/extending-overview/extension-types/backoffice-entry-point.md
@@ -1,4 +1,4 @@
-# Entry Point
+# Backoffice Entry Point
{% 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.
diff --git a/15/umbraco-cms/customizing/extending-overview/extension-types/condition.md b/15/umbraco-cms/customizing/extending-overview/extension-types/condition.md
index 983e7dd2314..a2147a5ea93 100644
--- a/15/umbraco-cms/customizing/extending-overview/extension-types/condition.md
+++ b/15/umbraco-cms/customizing/extending-overview/extension-types/condition.md
@@ -46,41 +46,93 @@ The following conditions are available out of the box, for all extension types t
You can make your own conditions by creating a class that implements the `UmbExtensionCondition` interface.
```typescript
-import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
import {
- ManifestCondition,
- UmbConditionConfigBase,
- UmbConditionControllerArguments,
- UmbExtensionCondition,
+ ManifestCondition,
+ UmbConditionConfigBase,
+ UmbConditionControllerArguments,
+ UmbExtensionCondition
} from '@umbraco-cms/backoffice/extension-api';
-import { UMB_SECTION_CONTEXT } from '@umbraco-cms/backoffice/section';
+import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry';
+import { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
-type MyConditionConfig = UmbConditionConfigBase & {
- match: string;
+export type MyConditionConfig = UmbConditionConfigBase & {
+ match: string;
};
-export class MyExtensionCondition extends UmbControllerBase implements UmbExtensionCondition {
- config: MyConditionConfig;
- permitted = false;
-
- constructor(args: UmbConditionControllerArguments) {
- super(args.host);
- // This condition aproves after 10 seconds
- setTimeout(() => {
- this.permitted = strue;
- args.onChange();
- }, 10000);
- }
+export class MyExtensionCondition extends UmbConditionBase implements UmbExtensionCondition {
+ constructor(host: UmbControllerHost, args: UmbConditionControllerArguments) {
+ super(host, args);
+
+ // enable extension after 10 seconds
+ setTimeout(() => {
+ this.permitted = true;
+ args.onChange();
+ }, 10000);
+ }
}
```
-This has to be registered in the extension registry, like this:
+This has to be registered in the extension registry like shown below:
```typescript
export const manifest: ManifestCondition = {
type: 'condition',
name: 'My Condition',
- alias: 'My.Condition.TenSecondDelay',
+ alias: 'My.Condition.CustomName',
api: MyExtensionCondition,
};
```
+
+Finally, you can make use of the condition in your configuration. See an example of this below:
+
+```typescript
+{
+ type: 'workspaceAction',
+ name: 'example-workspace-action',
+ alias: 'My.Example.WorkspaceAction',
+ elementName: 'my-workspace-action-element',
+ conditions: [
+ {
+ alias: 'Umb.Condition.SectionAlias',
+ match: 'My.Example.Workspace'
+ },
+ {
+ alias: 'My.Condition.CustomName'
+ }
+ ]
+}
+```
+
+As can be seen in the code above, we never make use of `match`. We can do this by replacing the timeout with some other check.
+
+```typescript
+// ...
+
+export class MyExtensionCondition extends UmbConditionBase implements UmbExtensionCondition {
+ constructor(host: UmbControllerHost, args: UmbConditionControllerArguments) {
+ super(host, args);
+
+ if (args.config.match === 'Yes') {
+ this.permitted = true;
+ args.onChange();
+ }
+ }
+}
+
+// ...
+```
+
+With all that in place, the configuration can look like shown below:
+
+```typescript
+{
+ // ...
+ conditions: [
+ // ...
+ {
+ alias: 'My.Condition.CustomName',
+ match: 'Yes'
+ } as MyConditionConfig
+ ]
+}
+```
diff --git a/15/umbraco-cms/customizing/section-trees/sections/README.md b/15/umbraco-cms/customizing/section-trees/sections/README.md
index d61fa833a20..cdc564956bf 100644
--- a/15/umbraco-cms/customizing/section-trees/sections/README.md
+++ b/15/umbraco-cms/customizing/section-trees/sections/README.md
@@ -20,7 +20,7 @@ You can create your own sections to extend Umbraco with room for more features.
### **Manifests**
-When creating a new section it's recommended to use a [Entry Point](../../../extending/backoffice-setup/extension-registry/entry-point.md)-extension in your [Umbraco Package Manifest](../../package-manifest.md). This is to get better control over all the additional extensions required for the new section.
+When creating a new section it's recommended to use a [Entry Point](../../../customizing/extending-overview/extension-types/backoffice-entry-point.md)-extension in your [Umbraco Package Manifest](../../package-manifest.md). This is to get better control over all the additional extensions required for the new section.
Create a section by defining a manifest for it:
diff --git a/15/umbraco-cms/extending/database.md b/15/umbraco-cms/extending/database.md
index 5697f487135..66d5d557461 100644
--- a/15/umbraco-cms/extending/database.md
+++ b/15/umbraco-cms/extending/database.md
@@ -4,7 +4,7 @@ description: A guide to creating a custom Database table in Umbraco
# Creating a Custom Database Table
-It is possible to add custom database tables to your site to store additional data that should not be stored as normal content nodes.
+Umbraco ships with [NPoco](https://github.com/schotime/NPoco), which enables mapping the results of database queries to Common Language Runtime (CLR) objects. NPoco allows custom database tables to be added to your site to store additional data that should not be stored as normal content nodes.
The end result looks like this:
diff --git a/15/umbraco-cms/extending/health-check/guides/stricttransportsecurityheader.md b/15/umbraco-cms/extending/health-check/guides/stricttransportsecurityheader.md
index 77c34c42e63..72cea315e11 100644
--- a/15/umbraco-cms/extending/health-check/guides/stricttransportsecurityheader.md
+++ b/15/umbraco-cms/extending/health-check/guides/stricttransportsecurityheader.md
@@ -35,4 +35,6 @@ else
This example only enables HSTS if the app is not running in development mode. `UseHsts` isn't recommended in development because the HSTS settings are highly cacheable by browsers.
-Full details of `UseHsts`, and additional configuration, can be found in the [ASP.NET Core documentation](https://learn.microsoft.com/en-us/aspnet/core/security/enforcing-ssl?view=aspnetcore-5.0\&tabs=visual-studio#http-strict-transport-security-protocol-hsts-1).
+It is possible to configure a timespan for the HSTS, preferably six months. This can be done by adding a new builder to the `Program.cs` file. Learn more in the [official Microsoft Documentation](https://learn.microsoft.com/en-us/aspnet/core/security/enforcing-ssl?view=aspnetcore-8.0&tabs=visual-studio%2Clinux-ubuntu#http-strict-transport-security-protocol-hsts).
+
+Full details of `UseHsts`, and additional configuration, can be found in the [ASP.NET Core documentation](https://learn.microsoft.com/en-us/aspnet/core/security/enforcing-ssl?view=aspnetcore-8.0&tabs=visual-studio%2Clinux-ubuntu#http-strict-transport-security-protocol-hsts).
diff --git a/15/umbraco-cms/fundamentals/backoffice/property-editors/built-in-umbraco-property-editors/rich-text-editor/rte-plugins.md b/15/umbraco-cms/fundamentals/backoffice/property-editors/built-in-umbraco-property-editors/rich-text-editor/rte-plugins.md
index eb7a9818a51..e0c8c79ba94 100644
--- a/15/umbraco-cms/fundamentals/backoffice/property-editors/built-in-umbraco-property-editors/rich-text-editor/rte-plugins.md
+++ b/15/umbraco-cms/fundamentals/backoffice/property-editors/built-in-umbraco-property-editors/rich-text-editor/rte-plugins.md
@@ -107,7 +107,7 @@ The `UmbTinyMcePluginBase` class is a class provided by Umbraco that you can use
{% code title="App_Plugins/MyTinyMCEPlugin/plugin.js" lineNumbers="true" %}
```js
-import { UmbTinyMcePluginBase } from '@umbraco-cms/backoffice/tinymce';
+import { UmbTinyMcePluginBase } from '@umbraco-cms/backoffice/tiny-mce';
export default class UmbTinyMceMediaPickerPlugin extends UmbTinyMcePluginBase {
/**
diff --git a/15/umbraco-cms/reference/notifications/editormodel-notifications/README.md b/15/umbraco-cms/reference/notifications/editormodel-notifications/README.md
index cc92fbb8428..23dc06c26aa 100644
--- a/15/umbraco-cms/reference/notifications/editormodel-notifications/README.md
+++ b/15/umbraco-cms/reference/notifications/editormodel-notifications/README.md
@@ -12,6 +12,7 @@ EditorModel notifications enable you to manipulate the model used by the backoff
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;
@@ -56,6 +57,7 @@ public class EditorSendingContentNotificationHandler : INotificationHandler