From 3ea3a76ea9355f9839aa9c08ad4e9e11639e4d43 Mon Sep 17 00:00:00 2001 From: Mike Alhayek Date: Wed, 7 Aug 2024 11:42:12 -0700 Subject: [PATCH] Fix Taxonomy Term Removal Fix #16537 --- .../Controllers/AdminController.cs | 45 ++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Taxonomies/Controllers/AdminController.cs b/src/OrchardCore.Modules/OrchardCore.Taxonomies/Controllers/AdminController.cs index feb5cda7f2c..c05eb7f6b5b 100644 --- a/src/OrchardCore.Modules/OrchardCore.Taxonomies/Controllers/AdminController.cs +++ b/src/OrchardCore.Modules/OrchardCore.Taxonomies/Controllers/AdminController.cs @@ -311,18 +311,18 @@ public async Task Delete(string taxonomyContentItemId, string tax } // Look for the target taxonomy item in the hierarchy. - var taxonomyItem = FindTaxonomyItem((JsonObject)taxonomy.As().Content, taxonomyItemId); + var content = (JsonObject)taxonomy.As().Content; - // Couldn't find targeted taxonomy item. - if (taxonomyItem == null) + RemoveTaxonomyItem(content, taxonomyItemId); + + var updatedPart = content.ToObject(); + + if (updatedPart == null) { return NotFound(); } - taxonomy.Alter(part => - { - part.Terms = part.Terms.Where(x => x.ContentItemId != taxonomyItemId).ToList(); - }); + taxonomy.Apply(updatedPart); await _session.SaveAsync(taxonomy); @@ -357,5 +357,36 @@ private static JsonObject FindTaxonomyItem(JsonObject contentItem, string taxono return null; } + + private static bool RemoveTaxonomyItem(JsonObject contentItem, string taxonomyItemToRemove) + { + if (contentItem == null) + { + return false; + } + + if (contentItem["ContentItemId"]?.Value() == taxonomyItemToRemove) + { + return true; + } + + if (!contentItem.TryGetPropertyValue("Terms", out var terms) || terms is not JsonArray taxonomyItems) + { + return false; + } + + for (var i = taxonomyItems.Count - 1; i >= 0; i--) + { + var taxonomyItem = taxonomyItems[i] as JsonObject; + if (RemoveTaxonomyItem(taxonomyItem, taxonomyItemToRemove)) + { + taxonomyItems.RemoveAt(i); + + return false; + } + } + + return false; + } } }