From c5e072e5be88cb9d79b53cf61b23e13e8db5fcd7 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 2 Sep 2025 19:37:19 +0100 Subject: [PATCH 1/4] Tiptap RTE: Migration to auto-enable new capabilities The server-side migration to compliment the client-side feature #20042 --- .../Migrations/Upgrade/UmbracoPlan.cs | 3 + .../V_16_3_0/AddRichTextEditorCapabilies.cs | 61 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/Umbraco.Infrastructure/Migrations/Upgrade/V_16_3_0/AddRichTextEditorCapabilies.cs diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs index b26484b60e32..9c403eeb5c27 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs @@ -123,5 +123,8 @@ protected virtual void DefinePlan() // To 16.2.0 To("{741C22CF-5FB8-4343-BF79-B97A58C2CCBA}"); To("{BE11D4D3-3A1F-4598-90D4-B548BD188C48}"); + + // To 16.3.0 + To("{A917FCBC-C378-4A08-A36C-220C581A6581}"); } } diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_16_3_0/AddRichTextEditorCapabilies.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_16_3_0/AddRichTextEditorCapabilies.cs new file mode 100644 index 000000000000..78469164aca7 --- /dev/null +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_16_3_0/AddRichTextEditorCapabilies.cs @@ -0,0 +1,61 @@ +using Umbraco.Cms.Core; +using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Core.Services; + +namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_16_3_0; + +[Obsolete("Remove in Umbraco 18.")] +public class AddRichTextEditorCapabilies : AsyncMigrationBase +{ + private readonly IDataTypeService _dataTypeService; + + public AddRichTextEditorCapabilies(IMigrationContext context, IDataTypeService dataTypeService) + : base(context) + { + _dataTypeService = dataTypeService; + } + + protected override async Task MigrateAsync() + { + IEnumerable dataTypes = await _dataTypeService.GetByEditorUiAlias("Umb.PropertyEditorUi.Tiptap"); + + foreach (IDataType dataType in dataTypes) + { + HashSet extensions = new(); + + if (dataType.ConfigurationData.TryGetValue("extensions", out var tmp) && tmp is List existing) + { + extensions.UnionWith(existing); + } + + string[] newExtensions = + [ + "Umb.Tiptap.RichTextEssentials", + "Umb.Tiptap.Anchor", + "Umb.Tiptap.Block", + "Umb.Tiptap.Blockquote", + "Umb.Tiptap.Bold", + "Umb.Tiptap.BulletList", + "Umb.Tiptap.CodeBlock", + "Umb.Tiptap.Heading", + "Umb.Tiptap.HorizontalRule", + "Umb.Tiptap.HtmlAttributeClass", + "Umb.Tiptap.HtmlAttributeDataset", + "Umb.Tiptap.HtmlAttributeId", + "Umb.Tiptap.HtmlAttributeStyle", + "Umb.Tiptap.HtmlTagDiv", + "Umb.Tiptap.HtmlTagSpan", + "Umb.Tiptap.Italic", + "Umb.Tiptap.OrderedList", + "Umb.Tiptap.Strike", + "Umb.Tiptap.TrailingNode", + ]; + + extensions.UnionWith(newExtensions); + + dataType.ConfigurationData["extensions"] = extensions.ToArray(); + + _ = await _dataTypeService.UpdateAsync(dataType, Constants.Security.SuperUserKey); + } + } +} From 100b154ffea39b380aae5c5384606c9e614bebb8 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 2 Sep 2025 19:44:40 +0100 Subject: [PATCH 2/4] Updated db creation script with latest RTE capabilities --- .../Migrations/Install/DatabaseDataCreator.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs index e99ce4658731..6159f098fefc 100644 --- a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs +++ b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs @@ -205,7 +205,7 @@ private void CreateUserGroup2PermissionData() { [Constants.Security.AdminGroupKey] = [ActionNew.ActionLetter, ActionUpdate.ActionLetter, ActionDelete.ActionLetter, ActionMove.ActionLetter, ActionCopy.ActionLetter, ActionSort.ActionLetter, ActionRollback.ActionLetter, ActionProtect.ActionLetter, ActionAssignDomain.ActionLetter, ActionPublish.ActionLetter, ActionRights.ActionLetter, ActionUnpublish.ActionLetter, ActionBrowse.ActionLetter, ActionCreateBlueprintFromContent.ActionLetter, ActionNotify.ActionLetter, ":", "5", "7", "T", ActionDocumentPropertyRead.ActionLetter, ActionDocumentPropertyWrite.ActionLetter], [Constants.Security.EditorGroupKey] = [ActionNew.ActionLetter, ActionUpdate.ActionLetter, ActionDelete.ActionLetter, ActionMove.ActionLetter, ActionCopy.ActionLetter, ActionSort.ActionLetter, ActionRollback.ActionLetter, ActionProtect.ActionLetter, ActionPublish.ActionLetter, ActionUnpublish.ActionLetter, ActionBrowse.ActionLetter, ActionCreateBlueprintFromContent.ActionLetter, ActionNotify.ActionLetter, ":", "5", "T", ActionDocumentPropertyRead.ActionLetter, ActionDocumentPropertyWrite.ActionLetter], - [Constants.Security.WriterGroupKey] = [ActionNew.ActionLetter, ActionUpdate.ActionLetter, ActionBrowse.ActionLetter, ActionNotify.ActionLetter, ":" , ActionDocumentPropertyRead.ActionLetter, ActionDocumentPropertyWrite.ActionLetter], + [Constants.Security.WriterGroupKey] = [ActionNew.ActionLetter, ActionUpdate.ActionLetter, ActionBrowse.ActionLetter, ActionNotify.ActionLetter, ":", ActionDocumentPropertyRead.ActionLetter, ActionDocumentPropertyWrite.ActionLetter], [Constants.Security.TranslatorGroupKey] = [ActionUpdate.ActionLetter, ActionBrowse.ActionLetter, ActionDocumentPropertyRead.ActionLetter, ActionDocumentPropertyWrite.ActionLetter], }; @@ -1943,7 +1943,7 @@ string GridCollectionView(string collectionViewType) => EditorAlias = Constants.PropertyEditors.Aliases.RichText, EditorUiAlias = "Umb.PropertyEditorUi.Tiptap", DbType = "Ntext", - Configuration = "{\"extensions\": [\"Umb.Tiptap.Embed\", \"Umb.Tiptap.Link\", \"Umb.Tiptap.Figure\", \"Umb.Tiptap.Image\", \"Umb.Tiptap.Subscript\", \"Umb.Tiptap.Superscript\", \"Umb.Tiptap.Table\", \"Umb.Tiptap.Underline\", \"Umb.Tiptap.TextAlign\", \"Umb.Tiptap.MediaUpload\"], \"maxImageSize\": 500, \"overlaySize\": \"medium\", \"toolbar\": [[[\"Umb.Tiptap.Toolbar.SourceEditor\"], [\"Umb.Tiptap.Toolbar.Bold\", \"Umb.Tiptap.Toolbar.Italic\", \"Umb.Tiptap.Toolbar.Underline\"], [\"Umb.Tiptap.Toolbar.TextAlignLeft\", \"Umb.Tiptap.Toolbar.TextAlignCenter\", \"Umb.Tiptap.Toolbar.TextAlignRight\"], [\"Umb.Tiptap.Toolbar.BulletList\", \"Umb.Tiptap.Toolbar.OrderedList\"], [\"Umb.Tiptap.Toolbar.Blockquote\", \"Umb.Tiptap.Toolbar.HorizontalRule\"], [\"Umb.Tiptap.Toolbar.Link\", \"Umb.Tiptap.Toolbar.Unlink\"], [\"Umb.Tiptap.Toolbar.MediaPicker\", \"Umb.Tiptap.Toolbar.EmbeddedMedia\"]]]}", + Configuration = "{\"extensions\": [\"Umb.Tiptap.RichTextEssentials\", \"Umb.Tiptap.Anchor\", \"Umb.Tiptap.Block\", \"Umb.Tiptap.Blockquote\", \"Umb.Tiptap.Bold\", \"Umb.Tiptap.BulletList\", \"Umb.Tiptap.CodeBlock\", \"Umb.Tiptap.Embed\", \"Umb.Tiptap.Figure\", \"Umb.Tiptap.Heading\", \"Umb.Tiptap.HorizontalRule\", \"Umb.Tiptap.HtmlAttributeClass\", \"Umb.Tiptap.HtmlAttributeDataset\", \"Umb.Tiptap.HtmlAttributeId\", \"Umb.Tiptap.HtmlAttributeStyle\", \"Umb.Tiptap.HtmlTagDiv\", \"Umb.Tiptap.HtmlTagSpan\", \"Umb.Tiptap.Image\", \"Umb.Tiptap.Italic\", \"Umb.Tiptap.Link\", \"Umb.Tiptap.MediaUpload\", \"Umb.Tiptap.OrderedList\", \"Umb.Tiptap.Strike\", \"Umb.Tiptap.Subscript\", \"Umb.Tiptap.Superscript\", \"Umb.Tiptap.Table\", \"Umb.Tiptap.TextAlign\", \"Umb.Tiptap.TrailingNode\", \"Umb.Tiptap.Underline\"], \"maxImageSize\": 500, \"overlaySize\": \"medium\", \"toolbar\": [[[\"Umb.Tiptap.Toolbar.SourceEditor\"], [\"Umb.Tiptap.Toolbar.Bold\", \"Umb.Tiptap.Toolbar.Italic\", \"Umb.Tiptap.Toolbar.Underline\"], [\"Umb.Tiptap.Toolbar.TextAlignLeft\", \"Umb.Tiptap.Toolbar.TextAlignCenter\", \"Umb.Tiptap.Toolbar.TextAlignRight\"], [\"Umb.Tiptap.Toolbar.BulletList\", \"Umb.Tiptap.Toolbar.OrderedList\"], [\"Umb.Tiptap.Toolbar.Blockquote\", \"Umb.Tiptap.Toolbar.HorizontalRule\"], [\"Umb.Tiptap.Toolbar.Link\", \"Umb.Tiptap.Toolbar.Unlink\"], [\"Umb.Tiptap.Toolbar.MediaPicker\", \"Umb.Tiptap.Toolbar.EmbeddedMedia\"]]]}", }); } From f58821925747b736188054782b6d19db88a65ac6 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 2 Sep 2025 19:53:07 +0100 Subject: [PATCH 3/4] Corrected class name typo "Capabilities" :facepalm: --- src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs | 2 +- ...xtEditorCapabilies.cs => AddRichTextEditorCapabilities.cs} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/Umbraco.Infrastructure/Migrations/Upgrade/V_16_3_0/{AddRichTextEditorCapabilies.cs => AddRichTextEditorCapabilities.cs} (92%) diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs index 9c403eeb5c27..0d7babbacf68 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs @@ -125,6 +125,6 @@ protected virtual void DefinePlan() To("{BE11D4D3-3A1F-4598-90D4-B548BD188C48}"); // To 16.3.0 - To("{A917FCBC-C378-4A08-A36C-220C581A6581}"); + To("{A917FCBC-C378-4A08-A36C-220C581A6581}"); } } diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_16_3_0/AddRichTextEditorCapabilies.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_16_3_0/AddRichTextEditorCapabilities.cs similarity index 92% rename from src/Umbraco.Infrastructure/Migrations/Upgrade/V_16_3_0/AddRichTextEditorCapabilies.cs rename to src/Umbraco.Infrastructure/Migrations/Upgrade/V_16_3_0/AddRichTextEditorCapabilities.cs index 78469164aca7..55219d0d9ce8 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/V_16_3_0/AddRichTextEditorCapabilies.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_16_3_0/AddRichTextEditorCapabilities.cs @@ -5,11 +5,11 @@ namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_16_3_0; [Obsolete("Remove in Umbraco 18.")] -public class AddRichTextEditorCapabilies : AsyncMigrationBase +public class AddRichTextEditorCapabilities : AsyncMigrationBase { private readonly IDataTypeService _dataTypeService; - public AddRichTextEditorCapabilies(IMigrationContext context, IDataTypeService dataTypeService) + public AddRichTextEditorCapabilities(IMigrationContext context, IDataTypeService dataTypeService) : base(context) { _dataTypeService = dataTypeService; From 2cac8aa1b08ac65514b89618aba57fcb8ebffa8c Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 3 Sep 2025 09:03:56 +0100 Subject: [PATCH 4/4] Updated default RTE install with TextDirection and TextIndent capabilities --- .../Migrations/Install/DatabaseDataCreator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs index 6159f098fefc..5d56d29b7e6e 100644 --- a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs +++ b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs @@ -1943,7 +1943,7 @@ string GridCollectionView(string collectionViewType) => EditorAlias = Constants.PropertyEditors.Aliases.RichText, EditorUiAlias = "Umb.PropertyEditorUi.Tiptap", DbType = "Ntext", - Configuration = "{\"extensions\": [\"Umb.Tiptap.RichTextEssentials\", \"Umb.Tiptap.Anchor\", \"Umb.Tiptap.Block\", \"Umb.Tiptap.Blockquote\", \"Umb.Tiptap.Bold\", \"Umb.Tiptap.BulletList\", \"Umb.Tiptap.CodeBlock\", \"Umb.Tiptap.Embed\", \"Umb.Tiptap.Figure\", \"Umb.Tiptap.Heading\", \"Umb.Tiptap.HorizontalRule\", \"Umb.Tiptap.HtmlAttributeClass\", \"Umb.Tiptap.HtmlAttributeDataset\", \"Umb.Tiptap.HtmlAttributeId\", \"Umb.Tiptap.HtmlAttributeStyle\", \"Umb.Tiptap.HtmlTagDiv\", \"Umb.Tiptap.HtmlTagSpan\", \"Umb.Tiptap.Image\", \"Umb.Tiptap.Italic\", \"Umb.Tiptap.Link\", \"Umb.Tiptap.MediaUpload\", \"Umb.Tiptap.OrderedList\", \"Umb.Tiptap.Strike\", \"Umb.Tiptap.Subscript\", \"Umb.Tiptap.Superscript\", \"Umb.Tiptap.Table\", \"Umb.Tiptap.TextAlign\", \"Umb.Tiptap.TrailingNode\", \"Umb.Tiptap.Underline\"], \"maxImageSize\": 500, \"overlaySize\": \"medium\", \"toolbar\": [[[\"Umb.Tiptap.Toolbar.SourceEditor\"], [\"Umb.Tiptap.Toolbar.Bold\", \"Umb.Tiptap.Toolbar.Italic\", \"Umb.Tiptap.Toolbar.Underline\"], [\"Umb.Tiptap.Toolbar.TextAlignLeft\", \"Umb.Tiptap.Toolbar.TextAlignCenter\", \"Umb.Tiptap.Toolbar.TextAlignRight\"], [\"Umb.Tiptap.Toolbar.BulletList\", \"Umb.Tiptap.Toolbar.OrderedList\"], [\"Umb.Tiptap.Toolbar.Blockquote\", \"Umb.Tiptap.Toolbar.HorizontalRule\"], [\"Umb.Tiptap.Toolbar.Link\", \"Umb.Tiptap.Toolbar.Unlink\"], [\"Umb.Tiptap.Toolbar.MediaPicker\", \"Umb.Tiptap.Toolbar.EmbeddedMedia\"]]]}", + Configuration = "{\"extensions\": [\"Umb.Tiptap.RichTextEssentials\", \"Umb.Tiptap.Anchor\", \"Umb.Tiptap.Block\", \"Umb.Tiptap.Blockquote\", \"Umb.Tiptap.Bold\", \"Umb.Tiptap.BulletList\", \"Umb.Tiptap.CodeBlock\", \"Umb.Tiptap.Embed\", \"Umb.Tiptap.Figure\", \"Umb.Tiptap.Heading\", \"Umb.Tiptap.HorizontalRule\", \"Umb.Tiptap.HtmlAttributeClass\", \"Umb.Tiptap.HtmlAttributeDataset\", \"Umb.Tiptap.HtmlAttributeId\", \"Umb.Tiptap.HtmlAttributeStyle\", \"Umb.Tiptap.HtmlTagDiv\", \"Umb.Tiptap.HtmlTagSpan\", \"Umb.Tiptap.Image\", \"Umb.Tiptap.Italic\", \"Umb.Tiptap.Link\", \"Umb.Tiptap.MediaUpload\", \"Umb.Tiptap.OrderedList\", \"Umb.Tiptap.Strike\", \"Umb.Tiptap.Subscript\", \"Umb.Tiptap.Superscript\", \"Umb.Tiptap.Table\", \"Umb.Tiptap.TextAlign\", \"Umb.Tiptap.TextDirection\", \"Umb.Tiptap.TextIndent\", \"Umb.Tiptap.TrailingNode\", \"Umb.Tiptap.Underline\"], \"maxImageSize\": 500, \"overlaySize\": \"medium\", \"toolbar\": [[[\"Umb.Tiptap.Toolbar.SourceEditor\"], [\"Umb.Tiptap.Toolbar.Bold\", \"Umb.Tiptap.Toolbar.Italic\", \"Umb.Tiptap.Toolbar.Underline\"], [\"Umb.Tiptap.Toolbar.TextAlignLeft\", \"Umb.Tiptap.Toolbar.TextAlignCenter\", \"Umb.Tiptap.Toolbar.TextAlignRight\"], [\"Umb.Tiptap.Toolbar.BulletList\", \"Umb.Tiptap.Toolbar.OrderedList\"], [\"Umb.Tiptap.Toolbar.Blockquote\", \"Umb.Tiptap.Toolbar.HorizontalRule\"], [\"Umb.Tiptap.Toolbar.Link\", \"Umb.Tiptap.Toolbar.Unlink\"], [\"Umb.Tiptap.Toolbar.MediaPicker\", \"Umb.Tiptap.Toolbar.EmbeddedMedia\"]]]}", }); }