using DocumentFormat.OpenXml.Bibliography; using domain.Models; using domain.UseCase; using ReactiveUI; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Reactive.Linq; using System.Windows.Input; namespace Presence.Desktop.ViewModels { public class MainWindowViewModel : ViewModelBase { private readonly GroupUseCase _groupUseCase; private List groupPresentersDataSource = new List(); private ObservableCollection _groups; public ObservableCollection Groups => _groups; public GroupPresenter? SelectedGroupItem { get => _selectedGroupItem; set => this.RaiseAndSetIfChanged(ref _selectedGroupItem, value); } private GroupPresenter? _selectedGroupItem; public ObservableCollection Users { get => _users; } private ObservableCollection _users; // Список опций сортировки public List SortOptions { get; } = new List { "По фамилии", "По убыванию" }; private string _selectedSortOption; public string SelectedSortOption { get => _selectedSortOption; set => this.RaiseAndSetIfChanged(ref _selectedSortOption, value); } public ICommand RemoveAllStudentsCommand { get; } public ICommand AddStudentCommand { get; } public MainWindowViewModel(GroupUseCase groupUseCase) { _groupUseCase = groupUseCase; foreach (var item in _groupUseCase.GetAllGroupWithStident()) { GroupPresenter groupPresenter = new GroupPresenter { Id = item.Id, Name = item.Name, users = item.Users?.Select(user => new UserPresenter { Name = user.FIO, Guid = user.Guid, Group = new GroupPresenter { Id = item.Id, Name = item.Name } }).ToList() }; groupPresentersDataSource.Add(groupPresenter); } _groups = new ObservableCollection(groupPresentersDataSource); _users = new ObservableCollection(); this.WhenAnyValue(vm => vm.SelectedGroupItem) .Subscribe(vm => SetUsers()); // Обработчик изменения сортировки this.WhenAnyValue(vm => vm.SelectedSortOption) .Subscribe(_ => SortUsers()); RemoveAllStudentsCommand = ReactiveCommand.Create(RemoveAllStudents); AddStudentCommand = ReactiveCommand.Create(AddStudent); } private void SetUsers() { if (SelectedGroupItem?.users == null) return; Users.Clear(); foreach (var item in SelectedGroupItem.users) { Users.Add(item); } // Сортировка при изменении группы SortUsers(); } private void SortUsers() { if (SelectedGroupItem?.users == null) return; var sortedUsers = SelectedGroupItem.users.ToList(); switch (SelectedSortOption) { case "По фамилии": sortedUsers = sortedUsers.OrderBy(u => u.Name).ToList(); break; case "По убыванию": sortedUsers = sortedUsers.OrderByDescending(u => u.Name).ToList(); break; } Users.Clear(); foreach (var item in sortedUsers) { Users.Add(item); } } private void RemoveAllStudents() { if (SelectedGroupItem == null) return; // Удаляем всех студентов через UseCase _groupUseCase.RemoveAllStudentsFromGroup(SelectedGroupItem.Id); // Создаем новый список пользователей (пустой) SelectedGroupItem.users = new List(); // Перезаписываем users новым пустым списком SetUsers(); // Обновляем отображение } private void AddStudent() { if (SelectedGroupItem == null) return; var newStudent = new UserPresenter { Name = "Новый студент", Guid = Guid.NewGuid(), Group = SelectedGroupItem }; // Добавляем студента в базу данных через UseCase _groupUseCase.AddStudentToGroup(SelectedGroupItem.Id, new User { Guid = newStudent.Guid, FIO = newStudent.Name }); // Создаем новый список пользователей, добавляем нового студента и присваиваем его var updatedUsers = SelectedGroupItem.users?.ToList() ?? new List(); // Создаем новый список из существующих пользователей или пустой updatedUsers.Add(newStudent); // Добавляем нового студента SelectedGroupItem.users = updatedUsers; // Перезаписываем users новым списком с добавленным студентом SetUsers(); // Обновляем отображение } } }