Files
WCS/Cowain.Base/Helpers/PageViewMenuHelper.cs
2026-03-02 09:08:20 +08:00

172 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
{
/// <summary>
/// 菜单数据
/// </summary>
private readonly List<MenuItem> _menuItems;
private readonly ILocalizer _l;
public PageViewMenuHelper(MenuConfigurationContext menuContext, ILocalizer localizer)
{
_menuItems = menuContext.Menus;
_l = localizer;
}
/// <summary>
/// MenuItem 到 MenuItemViewModel 的转换器
/// </summary>
public Func<MenuItem, MenuItemViewModel> 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(),
};
/// <summary>
/// 返回组菜单列表
/// </summary>
public IEnumerable<MenuItemViewModel> GetGroupMenus(string group)
{
return _menuItems.Where(x => x.Group == group).Select(MenuItemToViewModel);
}
/// <summary>
/// 清除所有菜单的Active状态
/// </summary>
public void ClearMenuActives(IEnumerable<MenuItemViewModel>? menus)
{
if (menus is null)
{
return;
}
foreach (var menu in menus)
{
menu.IsActive = false;
if (menu.Items != null && menu.Items.Any())
{
ClearMenuActives(menu.Items);
}
}
}
/// <summary>
/// 根据菜单keys列表设置Active状态
/// </summary>
public void SetMenuActiveByKeys(IEnumerable<MenuItemViewModel>? menus, List<string>? 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);
}
}
}
/// <summary>
/// 返回所有激活的菜单
/// </summary>
public IEnumerable<UserRoleMenuViewModel>? GetActiveMenus(IEnumerable<MenuItemViewModel>? 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<string>(menu.PageActions ?? Array.Empty<string>())
})
.Concat(menus.SelectMany(menu => GetActiveMenus(menu.Items) ?? Enumerable.Empty<UserRoleMenuViewModel>()));
}
/// <summary>
/// 根据菜单的key获取菜单页面权限
/// </summary>
/// <returns></returns>
public List<string>? 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;
}
/// <summary>
/// 在菜单集合中查找指定Key的菜单项
/// </summary>
/// <param name="menus">菜单集合</param>
/// <param name="key">菜单项的Key</param>
/// <returns>找到的菜单项</returns>
public MenuItem? FindMenuItem(IEnumerable<MenuItem>? 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;
}
}