Skip to content

Commit 42267bf

Browse files
authored
Assign menu children correctly from MenuPartDisplayDriver (#15766)
1 parent b44b913 commit 42267bf

File tree

1 file changed

+39
-17
lines changed

1 file changed

+39
-17
lines changed

src/OrchardCore.Modules/OrchardCore.Menu/Drivers/MenuPartDisplayDriver.cs

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,32 @@ namespace OrchardCore.Menu.Drivers
2020
public class MenuPartDisplayDriver : ContentPartDisplayDriver<MenuPart>
2121
{
2222
private readonly IContentDefinitionManager _contentDefinitionManager;
23-
protected readonly IHtmlLocalizer H;
2423
private readonly INotifier _notifier;
2524
private readonly ILogger _logger;
2625

26+
protected readonly IHtmlLocalizer H;
27+
2728
public MenuPartDisplayDriver(
2829
IContentDefinitionManager contentDefinitionManager,
29-
IHtmlLocalizer<MenuPartDisplayDriver> htmlLocalizer,
3030
INotifier notifier,
31-
ILogger<MenuPartDisplayDriver> logger
31+
ILogger<MenuPartDisplayDriver> logger,
32+
IHtmlLocalizer<MenuPartDisplayDriver> htmlLocalizer
3233
)
3334
{
3435
_contentDefinitionManager = contentDefinitionManager;
35-
H = htmlLocalizer;
3636
_notifier = notifier;
3737
_logger = logger;
38+
H = htmlLocalizer;
3839
}
3940

4041
public override IDisplayResult Edit(MenuPart part)
4142
{
4243
return Initialize<MenuPartEditViewModel>("MenuPart_Edit", async model =>
4344
{
44-
var menuItemContentTypes = (await _contentDefinitionManager.ListTypeDefinitionsAsync()).Where(t => t.StereotypeEquals("MenuItem"));
45+
var menuItemContentTypes = (await _contentDefinitionManager.ListTypeDefinitionsAsync())
46+
.Where(t => t.StereotypeEquals("MenuItem"))
47+
.ToArray();
48+
4549
var notify = false;
4650

4751
foreach (var menuItem in part.ContentItem.As<MenuItemsListPart>().MenuItems)
@@ -68,20 +72,27 @@ public override async Task<IDisplayResult> UpdateAsync(MenuPart part, IUpdateMod
6872
{
6973
var model = new MenuPartEditViewModel();
7074

71-
if (await updater.TryUpdateModelAsync(model, Prefix, t => t.Hierarchy) && !string.IsNullOrWhiteSpace(model.Hierarchy))
75+
if (await updater.TryUpdateModelAsync(model, Prefix, t => t.Hierarchy) &&
76+
!string.IsNullOrWhiteSpace(model.Hierarchy))
7277
{
73-
var originalMenuItems = part.ContentItem.As<MenuItemsListPart>();
74-
75-
var newHierarchy = JArray.Parse(model.Hierarchy);
76-
7778
var menuItems = new JsonArray();
7879

79-
foreach (var item in newHierarchy)
80+
var originalMenuItems = part.ContentItem.As<MenuItemsListPart>();
81+
82+
if (originalMenuItems is not null)
8083
{
81-
menuItems.Add(ProcessItem(originalMenuItems, item as JsonObject));
84+
var newHierarchy = JArray.Parse(model.Hierarchy);
85+
86+
foreach (var item in newHierarchy)
87+
{
88+
menuItems.Add(ProcessItem(originalMenuItems, item as JsonObject));
89+
}
8290
}
8391

84-
part.ContentItem.Content["MenuItemsListPart"] = new JsonObject { ["MenuItems"] = menuItems };
92+
part.ContentItem.Content[nameof(MenuItemsListPart)] = new JsonObject
93+
{
94+
[nameof(MenuItemsListPart.MenuItems)] = menuItems,
95+
};
8596
}
8697

8798
return Edit(part);
@@ -101,27 +112,38 @@ private static JsonObject GetMenuItemAt(MenuItemsListPart menuItems, int[] index
101112
}
102113

103114
var newObj = JObject.FromObject(menuItem, JOptions.Default);
104-
if (newObj["MenuItemsListPart"] != null)
115+
116+
if (newObj[nameof(MenuItemsListPart)] != null)
105117
{
106-
newObj["MenuItemsListPart"] = new JsonObject { ["MenuItems"] = new JsonArray() };
118+
newObj[nameof(MenuItemsListPart)] = new JsonObject
119+
{
120+
[nameof(MenuItemsListPart.MenuItems)] = new JsonArray()
121+
};
107122
}
108123

109124
return newObj;
110125
}
111126

112127
private static JsonObject ProcessItem(MenuItemsListPart originalItems, JsonObject item)
113128
{
114-
var contentItem = GetMenuItemAt(originalItems, item["index"].ToString().Split('-').Select(x => Convert.ToInt32(x)).ToArray());
129+
var indexes = item["index"]?.ToString().Split('-').Select(x => Convert.ToInt32(x)).ToArray() ?? [];
130+
131+
var contentItem = GetMenuItemAt(originalItems, indexes);
115132

116133
var children = item["children"] as JsonArray;
117134

118135
if (children is not null)
119136
{
120137
var menuItems = new JsonArray();
138+
121139
for (var i = 0; i < children.Count; i++)
122140
{
123141
menuItems.Add(ProcessItem(originalItems, children[i] as JsonObject));
124-
contentItem["MenuItemsListPart"] = new JsonObject { ["MenuItems"] = menuItems };
142+
}
143+
144+
contentItem[nameof(MenuItemsListPart)] = new JsonObject
145+
{
146+
[nameof(MenuItemsListPart.MenuItems)] = menuItems,
125147
};
126148
}
127149

0 commit comments

Comments
 (0)