From 96070fb6abb20c62ad32478bc73c9c7fbc92e644 Mon Sep 17 00:00:00 2001 From: Lee Kelleher Date: Wed, 3 Sep 2025 10:13:29 +0100 Subject: [PATCH] Tiptap RTE: Migration to auto-enable new capabilities (#20057) * Tiptap RTE: Migration to auto-enable new capabilities The server-side migration to compliment the client-side feature #20042 * Updated db creation script with latest RTE capabilities * Corrected class name typo "Capabilities" :facepalm: * Updated default RTE install with TextDirection and TextIndent capabilities --- .../Migrations/Install/DatabaseDataCreator.cs | 4 +- .../Migrations/Upgrade/UmbracoPlan.cs | 3 + .../V_16_3_0/AddRichTextEditorCapabilities.cs | 61 +++++++++++++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.Infrastructure/Migrations/Upgrade/V_16_3_0/AddRichTextEditorCapabilities.cs diff --git a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs index e99ce46587..5d56d29b7e 100644 --- a/src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs +++ b/src/Umbraco.Infrastructure/Migrations/Install/DatabaseDataCreator.cs @@ -205,7 +205,7 @@ internal sealed class DatabaseDataCreator { [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 @@ internal sealed class DatabaseDataCreator 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.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\"]]]}", }); } diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs index b26484b60e..0d7babbacf 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs @@ -123,5 +123,8 @@ public class UmbracoPlan : MigrationPlan // 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/AddRichTextEditorCapabilities.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_16_3_0/AddRichTextEditorCapabilities.cs new file mode 100644 index 0000000000..55219d0d9c --- /dev/null +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/V_16_3_0/AddRichTextEditorCapabilities.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 AddRichTextEditorCapabilities : AsyncMigrationBase +{ + private readonly IDataTypeService _dataTypeService; + + public AddRichTextEditorCapabilities(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); + } + } +}