using System; using System.Collections.ObjectModel; using System.Linq; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Elfisa.Core; namespace Elfisa.Avalonia.ViewModels; public class NavItem { public string Title { get; } public string Icon { get; } public Func Factory { get; } public NavItem(string title, string icon, Func factory) { Title = title; Icon = icon; Factory = factory; } } public partial class ShellViewModel : ViewModelBase { private readonly Action _logout; public ObservableCollection NavItems { get; } [ObservableProperty] private NavItem? _selectedNav; [ObservableProperty] private ViewModelBase? _currentPage; public string UserName => Session.Current.Username ?? ""; public string RoleLabel => Session.Current.Role switch { "buyer" => "Покупатель", "supplier" => "Поставщик", "manager" => "Менеджер", "admin" => "Администратор", _ => Session.Current.Role ?? "" }; public ShellViewModel(Action logout) { _logout = logout; NavItems = new ObservableCollection { new("Прайс-лист", "🧾", () => new PriceListViewModel()), new("Заказы", "🛒", () => new OrdersViewModel()), new("Накладные", "📄", () => new InvoicesViewModel()), new("Отчёты", "📊", () => new ReportsViewModel()), new("Отправить", "📤", () => new SendOrderViewModel()), new("Отказы", "⛔", () => new PlaceholderPageViewModel("Отказы", "Отказные позиции по заказам. Нужен серверный эндпоинт: данные (RefuseItemsCount) сейчас есть только в локальной БД WinForms-клиента.")), new("Справочник", "📖", () => new DirectoryViewModel()), }; SelectedNav = NavItems.First(n => n.Title == "Отчёты"); } partial void OnSelectedNavChanged(NavItem? value) => CurrentPage = value?.Factory(); [RelayCommand] private void Logout() => _logout(); }