diff --git a/src/OrchardCore.Modules/OrchardCore.Flows/Drivers/BagPartDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Flows/Drivers/BagPartDisplayDriver.cs index 53a8445bf3f..0ebdea481f5 100644 --- a/src/OrchardCore.Modules/OrchardCore.Flows/Drivers/BagPartDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Flows/Drivers/BagPartDisplayDriver.cs @@ -140,6 +140,10 @@ public override async Task UpdateAsync(BagPart part, UpdatePartE await _contentHandlers.InvokeAsync((handler, context) => handler.UpdatingAsync(context), updateContentContext, _logger); + var cloneContentContext = new CloneContentContext(existingContentItem, contentItem); + + await _contentHandlers.InvokeAsync((handler, context) => handler.CloningAsync(context), cloneContentContext, _logger); + contentItem.ContentItemId = model.ContentItems[i]; contentItem.Merge(existingContentItem); diff --git a/src/OrchardCore.Modules/OrchardCore.Flows/Handlers/BagPartHandler.cs b/src/OrchardCore.Modules/OrchardCore.Flows/Handlers/BagPartHandler.cs index ed5cd8b716e..3234830a905 100644 --- a/src/OrchardCore.Modules/OrchardCore.Flows/Handlers/BagPartHandler.cs +++ b/src/OrchardCore.Modules/OrchardCore.Flows/Handlers/BagPartHandler.cs @@ -1,4 +1,5 @@ using System.Text.Json.Nodes; +using OrchardCore.ContentManagement; using OrchardCore.ContentManagement.Handlers; using OrchardCore.ContentManagement.Routing; using OrchardCore.Flows.Models; @@ -7,6 +8,25 @@ namespace OrchardCore.Flows.Handlers; public class BagPartHandler : ContentPartHandler { + private readonly IContentItemIdGenerator _idGenerator; + + public BagPartHandler(IContentItemIdGenerator idGenerator) => _idGenerator = idGenerator; + + public override Task CloningAsync(CloneContentContext context, BagPart part) + { + if (context.CloneContentItem.TryGet(out var clonedBagPart)) + { + foreach (var contentItem in clonedBagPart.ContentItems) + { + contentItem.ContentItemId = _idGenerator.GenerateUniqueId(contentItem); + } + + clonedBagPart.Apply(); + } + + return Task.CompletedTask; + } + public override Task GetContentItemAspectAsync(ContentItemAspectContext context, BagPart part) { return context.ForAsync(aspect => diff --git a/src/OrchardCore.Modules/OrchardCore.Flows/Startup.cs b/src/OrchardCore.Modules/OrchardCore.Flows/Startup.cs index 67c0cd10eb0..5e258e9ada6 100644 --- a/src/OrchardCore.Modules/OrchardCore.Flows/Startup.cs +++ b/src/OrchardCore.Modules/OrchardCore.Flows/Startup.cs @@ -17,6 +17,8 @@ namespace OrchardCore.Flows; public sealed class Startup : StartupBase { + public override int Order => -150; + public override void ConfigureServices(IServiceCollection services) { services.Configure(o => diff --git a/src/OrchardCore.Modules/OrchardCore.Taxonomies/Handlers/TaxonomyPartHandler.cs b/src/OrchardCore.Modules/OrchardCore.Taxonomies/Handlers/TaxonomyPartHandler.cs index 182ef712f85..85638a06fa7 100644 --- a/src/OrchardCore.Modules/OrchardCore.Taxonomies/Handlers/TaxonomyPartHandler.cs +++ b/src/OrchardCore.Modules/OrchardCore.Taxonomies/Handlers/TaxonomyPartHandler.cs @@ -1,4 +1,5 @@ using System.Text.Json.Nodes; +using OrchardCore.ContentManagement; using OrchardCore.ContentManagement.Handlers; using OrchardCore.ContentManagement.Routing; using OrchardCore.Taxonomies.Models; @@ -7,6 +8,25 @@ namespace OrchardCore.Taxonomies.Handlers; public class TaxonomyPartHandler : ContentPartHandler { + private readonly IContentItemIdGenerator _idGenerator; + + public TaxonomyPartHandler(IContentItemIdGenerator idGenerator) => _idGenerator = idGenerator; + + public override Task CloningAsync(CloneContentContext context, TaxonomyPart part) + { + if (context.CloneContentItem.TryGet(out var clonedTaxonomyPart)) + { + foreach (var termContentItem in clonedTaxonomyPart.Terms) + { + termContentItem.ContentItemId = _idGenerator.GenerateUniqueId(termContentItem); + } + + clonedTaxonomyPart.Apply(); + } + + return Task.CompletedTask; + } + public override Task GetContentItemAspectAsync(ContentItemAspectContext context, TaxonomyPart part) { return context.ForAsync(aspect => diff --git a/src/OrchardCore.Modules/OrchardCore.Widgets/Handlers/WidgetsListPartHandler.cs b/src/OrchardCore.Modules/OrchardCore.Widgets/Handlers/WidgetsListPartHandler.cs new file mode 100644 index 00000000000..fd2ae327bc2 --- /dev/null +++ b/src/OrchardCore.Modules/OrchardCore.Widgets/Handlers/WidgetsListPartHandler.cs @@ -0,0 +1,30 @@ +using OrchardCore.ContentManagement; +using OrchardCore.ContentManagement.Handlers; +using OrchardCore.Widgets.Models; + +namespace OrchardCore.Widgets.Handlers; + +public class WidgetsListPartHandler : ContentPartHandler +{ + private readonly IContentItemIdGenerator _idGenerator; + + public WidgetsListPartHandler(IContentItemIdGenerator idGenerator) => _idGenerator = idGenerator; + + public override Task CloningAsync(CloneContentContext context, WidgetsListPart part) + { + if (context.CloneContentItem.TryGet(out var clonedWidgetsListPart)) + { + foreach (var zone in part.Widgets.Keys) + { + foreach (var widgetContentItem in part.Widgets[zone]) + { + widgetContentItem.ContentItemId = _idGenerator.GenerateUniqueId(widgetContentItem); + } + } + + clonedWidgetsListPart.Apply(); + } + + return Task.CompletedTask; + } +} diff --git a/src/OrchardCore.Modules/OrchardCore.Widgets/Startup.cs b/src/OrchardCore.Modules/OrchardCore.Widgets/Startup.cs index d28aa83c208..2a1fa5ee4a5 100644 --- a/src/OrchardCore.Modules/OrchardCore.Widgets/Startup.cs +++ b/src/OrchardCore.Modules/OrchardCore.Widgets/Startup.cs @@ -6,6 +6,7 @@ using OrchardCore.DisplayManagement; using OrchardCore.Modules; using OrchardCore.Widgets.Drivers; +using OrchardCore.Widgets.Handlers; using OrchardCore.Widgets.Models; using OrchardCore.Widgets.Services; using OrchardCore.Widgets.Settings; @@ -20,7 +21,8 @@ public override void ConfigureServices(IServiceCollection services) services.AddShapeTableProvider(); // Widgets List Part services.AddContentPart() - .UseDisplayDriver(); + .UseDisplayDriver() + .AddHandler(); services.AddScoped();