diff --git a/src/OrchardCore.Modules/OrchardCore.Taxonomies/Drivers/TaxonomyFieldDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Taxonomies/Drivers/TaxonomyFieldDisplayDriver.cs index 85607a7933a..ac0529c2b10 100644 --- a/src/OrchardCore.Modules/OrchardCore.Taxonomies/Drivers/TaxonomyFieldDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Taxonomies/Drivers/TaxonomyFieldDisplayDriver.cs @@ -46,7 +46,17 @@ public override IDisplayResult Edit(TaxonomyField field, BuildFieldEditorContext if (model.Taxonomy != null) { var termEntries = new List(); - TaxonomyFieldDriverHelper.PopulateTermEntries(termEntries, field, model.Taxonomy.As().Terms, 0); + + var terms = model.Taxonomy.As().Terms; + + // Maintain the listed order in the field, then concatenate the remaining content items. + var sortedTerms = terms + .Where(x => field.TermContentItemIds.Contains(x.ContentItemId)) + .OrderBy(x => Array.IndexOf(field.TermContentItemIds, x.ContentItemId)) + .Concat(terms.Where(x => !field.TermContentItemIds.Contains(x.ContentItemId))) + .ToArray(); + + TaxonomyFieldDriverHelper.PopulateTermEntries(termEntries, field, sortedTerms, 0); model.TermEntries = termEntries; model.UniqueValue = termEntries.FirstOrDefault(x => x.Selected)?.ContentItemId; diff --git a/src/OrchardCore.Modules/OrchardCore.Taxonomies/Drivers/TaxonomyFieldDriverHelper.cs b/src/OrchardCore.Modules/OrchardCore.Taxonomies/Drivers/TaxonomyFieldDriverHelper.cs index 1e76285b64a..9009ee6f773 100644 --- a/src/OrchardCore.Modules/OrchardCore.Taxonomies/Drivers/TaxonomyFieldDriverHelper.cs +++ b/src/OrchardCore.Modules/OrchardCore.Taxonomies/Drivers/TaxonomyFieldDriverHelper.cs @@ -13,34 +13,29 @@ public static class TaxonomyFieldDriverHelper /// public static void PopulateTermEntries(List termEntries, TaxonomyField field, IEnumerable contentItems, int level) { - foreach (var selectedTermContentItemId in field.TermContentItemIds) + foreach (var contentItem in contentItems) { - if (contentItems.Any(x => x.ContentItemId == selectedTermContentItemId)) - { - var contentItem = contentItems.First(x => x.ContentItemId == selectedTermContentItemId); - - var children = Array.Empty(); + var children = Array.Empty(); - if (((JsonObject)contentItem.Content)["Terms"] is JsonArray termsArray) - { - children = termsArray.ToObject(); - } + if (((JsonObject)contentItem.Content)["Terms"] is JsonArray termsArray) + { + children = termsArray.ToObject(); + } - var termEntry = new TermEntry - { - Term = contentItem, - ContentItemId = contentItem.ContentItemId, - Selected = field.TermContentItemIds.Contains(contentItem.ContentItemId), - Level = level, - IsLeaf = children.Length == 0 - }; + var termEntry = new TermEntry + { + Term = contentItem, + ContentItemId = contentItem.ContentItemId, + Selected = field.TermContentItemIds.Contains(contentItem.ContentItemId), + Level = level, + IsLeaf = children.Length == 0 + }; - termEntries.Add(termEntry); + termEntries.Add(termEntry); - if (children.Length > 0) - { - PopulateTermEntries(termEntries, field, children, level + 1); - } + if (children.Length > 0) + { + PopulateTermEntries(termEntries, field, children, level + 1); } } } diff --git a/src/OrchardCore.Modules/OrchardCore.Taxonomies/Drivers/TaxonomyFieldTagsDisplayDriver.cs b/src/OrchardCore.Modules/OrchardCore.Taxonomies/Drivers/TaxonomyFieldTagsDisplayDriver.cs index 1d77805516f..cb50654372e 100644 --- a/src/OrchardCore.Modules/OrchardCore.Taxonomies/Drivers/TaxonomyFieldTagsDisplayDriver.cs +++ b/src/OrchardCore.Modules/OrchardCore.Taxonomies/Drivers/TaxonomyFieldTagsDisplayDriver.cs @@ -48,7 +48,17 @@ public override IDisplayResult Edit(TaxonomyField field, BuildFieldEditorContext if (model.Taxonomy != null) { var termEntries = new List(); - TaxonomyFieldDriverHelper.PopulateTermEntries(termEntries, field, model.Taxonomy.As().Terms, 0); + + var terms = model.Taxonomy.As().Terms; + + // Maintain the listed order in the field, then concatenate the remaining content items. + var sortedTerms = terms + .Where(x => field.TermContentItemIds.Contains(x.ContentItemId)) + .OrderBy(x => Array.IndexOf(field.TermContentItemIds, x.ContentItemId)) + .Concat(terms.Where(x => !field.TermContentItemIds.Contains(x.ContentItemId))) + .ToArray(); + + TaxonomyFieldDriverHelper.PopulateTermEntries(termEntries, field, sortedTerms, 0); var tagTermEntries = termEntries.Select(te => new TagTermEntry { ContentItemId = te.ContentItemId,