presence/Presence.Desktop/ViewModels/GroupViewModel.cs
2024-12-04 22:33:12 +03:00

93 lines
3.1 KiB
C#

using Demo.Domain.UseCase;
using DynamicData;
using DynamicData.Binding;
using Presence.Desktop.Models;
using ReactiveUI;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reactive;
using System.Reactive.Linq;
using Tmds.DBus.Protocol;
namespace Presence.Desktop.ViewModels
{
public class GroupViewModel : ViewModelBase, IRoutableViewModel
{
private readonly List<GroupPresenter> _groupPresentersDataSource = new List<GroupPresenter>();
private ObservableCollection<GroupPresenter> _groups;
public ObservableCollection<GroupPresenter> Groups => _groups;
private GroupPresenter? _selectedGroupItem;
public ReactiveCommand<Unit, Unit> ButtonRemoveUsersByGroup {get; }
// public ReactiveCommand<Unit, Unit> ButtonAddUser { get; }
public GroupPresenter? SelectedGroupItem
{
get => _selectedGroupItem;
set => this.RaiseAndSetIfChanged(ref _selectedGroupItem, value);
}
public ObservableCollection<UserPresenter> Users { get => _users;}
public ObservableCollection<UserPresenter> _users;
public GroupViewModel(IGroupUseCase groupUseCase, IUserUseCase userUseCase)
{
foreach (var item in groupUseCase.GetAllGroupsWithUsers())
{
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(_ => SetUsers());
ButtonRemoveUsersByGroup = ReactiveCommand.Create(() => RemoveUsersByGroup(groupUseCase));
}
private void SetUsers()
{
if(SelectedGroupItem == null) return;
if (SelectedGroupItem.users == null) return;
Users.Clear();
foreach (var item in SelectedGroupItem.users)
{
Users.Add(item);
}
}
private void RemoveUsersByGroup(IGroupUseCase groupUseCase)
{
if (_selectedGroupItem != null){
groupUseCase.RemoveUsersByGroup(_selectedGroupItem.Id);
}
var usersToRemove = Users.Where(user => user.Group.Id == _selectedGroupItem.Id).ToList();
foreach (var user in usersToRemove)
{
Users.Remove(user);
}
}
public string? UrlPathSegment { get; }
public IScreen HostScreen { get; }
}
}