presence/Presence.Desktop/ViewModels/MainWindowViewModel.cs
2024-12-04 21:00:36 +03:00

154 lines
5.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 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<GroupPresenter> groupPresentersDataSource = new List<GroupPresenter>();
private ObservableCollection<GroupPresenter> _groups;
public ObservableCollection<GroupPresenter> Groups => _groups;
public GroupPresenter? SelectedGroupItem
{
get => _selectedGroupItem;
set => this.RaiseAndSetIfChanged(ref _selectedGroupItem, value);
}
private GroupPresenter? _selectedGroupItem;
public ObservableCollection<UserPresenter> Users { get => _users; }
private ObservableCollection<UserPresenter> _users;
// Список опций сортировки
public List<string> SortOptions { get; } = new List<string> { "По фамилии", "По убыванию" };
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<GroupPresenter>(groupPresentersDataSource);
_users = new ObservableCollection<UserPresenter>();
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<UserPresenter>(); // Перезаписываем 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<UserPresenter>(); // Создаем новый список из существующих пользователей или пустой
updatedUsers.Add(newStudent); // Добавляем нового студента
SelectedGroupItem.users = updatedUsers; // Перезаписываем users новым списком с добавленным студентом
SetUsers(); // Обновляем отображение
}
}
}