using Avalonia.Media; using Cowain.Base.Attributes; using Cowain.Base.Models.Menu; using Cowain.Base.ViewModels; using Ke.Bee.Localization.Localizer.Abstractions; using System; using System.Collections.ObjectModel; namespace Cowain.Base.Helpers; [Singleton] public class PageViewMenuHelper { /// /// 菜单数据 /// private readonly List _menuItems; private readonly ILocalizer _l; public PageViewMenuHelper(MenuConfigurationContext menuContext, ILocalizer localizer) { _menuItems = menuContext.Menus; _l = localizer; } /// /// MenuItem 到 MenuItemViewModel 的转换器 /// public Func MenuItemToViewModel => x => new MenuItemViewModel(_l[x.LocaleKey]) { Key = x.Key, IsActive = x.IsActive == true, Icon = string.IsNullOrWhiteSpace(x.Icon) ? null : StreamGeometry.Parse(x.Icon), CommandParameter = x.CommandParameter, PageActions = x.PageActions, Items = x.Items.Select(MenuItemToViewModel).ToList(), }; /// /// 返回组菜单列表 /// public IEnumerable GetGroupMenus(string group) { return _menuItems.Where(x => x.Group == group).Select(MenuItemToViewModel); } /// /// 清除所有菜单的Active状态 /// public void ClearMenuActives(IEnumerable? menus) { if (menus is null) { return; } foreach (var menu in menus) { menu.IsActive = false; if (menu.Items != null && menu.Items.Any()) { ClearMenuActives(menu.Items); } } } /// /// 根据菜单keys列表,设置Active状态 /// public void SetMenuActiveByKeys(IEnumerable? menus, List? menuKeys) { if (menuKeys is null) { return; } if (menus is null) { return; } foreach (var menu in menus) { if (menuKeys.Contains(menu.Key)) { menu.IsActive = true; } if (menu.Items != null && menu.Items.Any()) { SetMenuActiveByKeys(menu.Items, menuKeys); } } } /// /// 返回所有激活的菜单 /// public IEnumerable? GetActiveMenus(IEnumerable? menus) { if (menus is null) { return null; } //递归返回所有选中的菜单 return menus.Where(menu => menu.IsActive) .Select(menu => new UserRoleMenuViewModel { Id = 0, // 这里可以根据需要设置实际的 Id RoleId = 0, // 这里可以根据需要设置实际的 RoleId MenuKey = menu.Key, MenuName = menu.Text, MenuActions = new ObservableCollection(menu.PageActions ?? Array.Empty()) }) .Concat(menus.SelectMany(menu => GetActiveMenus(menu.Items) ?? Enumerable.Empty())); } /// /// 根据菜单的key,获取菜单页面权限 /// /// public List? GetMenuActionsByKey(string? key) { if (string.IsNullOrEmpty(key)) { return null; } var menuItem = FindMenuItem(_menuItems, key); return menuItem?.PageActions?.ToList(); } public string? GetMenuName(string? menuKey) { if (string.IsNullOrWhiteSpace(menuKey)) { return null; } var menuItem = FindMenuItem(_menuItems, menuKey); return menuItem != null ? _l[menuItem.LocaleKey] : null; } /// /// 在菜单集合中查找指定Key的菜单项 /// /// 菜单集合 /// 菜单项的Key /// 找到的菜单项 public MenuItem? FindMenuItem(IEnumerable? menus, string? key) { if (menus == null || key == null) { return null; } foreach (var menu in menus) { if (menu.Key == key) { return menu; } var found = FindMenuItem(menu.Items, key); if (found != null) { return found; } } return null; } }