You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
383 lines
13 KiB
383 lines
13 KiB
using Model;
|
|
using PersonalMVVMToolkit;
|
|
using System.Collections.ObjectModel;
|
|
using System.Linq;
|
|
using System.Windows.Input;
|
|
|
|
namespace ViewModels
|
|
{
|
|
public class ManagerVM : BaseViewModel<Manager>
|
|
{
|
|
|
|
#region Fields
|
|
|
|
private readonly ObservableCollection<BookVM> books = new ObservableCollection<BookVM>();
|
|
private readonly ObservableCollection<AuthorVM> authors = new ObservableCollection<AuthorVM>();
|
|
private readonly ObservableCollection<PublishDateVM> publishDates = new ObservableCollection<PublishDateVM>();
|
|
private readonly ObservableCollection<RatingsVM> ratings = new ObservableCollection<RatingsVM>();
|
|
private readonly ObservableCollection<BookVM> toBeReadBooks = new ObservableCollection<BookVM>();
|
|
private readonly ObservableCollection<LoanVM> currentLoans = new ObservableCollection<LoanVM>();
|
|
private readonly ObservableCollection<LoanVM> pastLoans = new ObservableCollection<LoanVM>();
|
|
private readonly ObservableCollection<BorrowingVM> pastBorrowings = new ObservableCollection<BorrowingVM>();
|
|
private readonly ObservableCollection<BorrowingVM> currentBorrowings = new ObservableCollection<BorrowingVM>();
|
|
private int index;
|
|
private long nbBooks;
|
|
|
|
#endregion
|
|
|
|
#region Properties
|
|
|
|
public ObservableCollection<BookVM> AllBooks
|
|
{
|
|
get => books;
|
|
}
|
|
|
|
public ObservableCollection<AuthorVM> AllAuthors
|
|
{
|
|
get => authors;
|
|
}
|
|
|
|
public ObservableCollection<PublishDateVM> AllPublishDates
|
|
{
|
|
get => publishDates;
|
|
}
|
|
|
|
public ObservableCollection<RatingsVM> AllRatings
|
|
{
|
|
get => ratings;
|
|
}
|
|
|
|
public ObservableCollection<BookVM> ToBeReadBooks
|
|
{
|
|
get => toBeReadBooks;
|
|
}
|
|
|
|
public ObservableCollection<LoanVM> AllCurrentLoans
|
|
{
|
|
get => currentLoans;
|
|
}
|
|
|
|
public ObservableCollection<LoanVM> AllPastLoans
|
|
{
|
|
get => pastLoans;
|
|
}
|
|
|
|
public ObservableCollection<BorrowingVM> AllCurrentBorrowings
|
|
{
|
|
get => currentBorrowings;
|
|
}
|
|
|
|
public ObservableCollection<BorrowingVM> AllPastBorrowings
|
|
{
|
|
get => pastBorrowings;
|
|
}
|
|
|
|
public AuthorVM SelectedAuthor { get; private set; }
|
|
|
|
public PublishDateVM SelectedDate { get; private set; }
|
|
|
|
public RatingsVM SelectedRating { get; private set; }
|
|
|
|
public string SearchTitle { get; private set; }
|
|
|
|
public int Index
|
|
{
|
|
get => index;
|
|
set => SetProperty(ref index, value);
|
|
}
|
|
|
|
public int Count { get; set; } = 5;
|
|
|
|
public long NbBooks
|
|
{
|
|
get => nbBooks;
|
|
set
|
|
{
|
|
SetProperty(ref nbBooks, value);
|
|
OnPropertyChanged(nameof(NbPages));
|
|
}
|
|
}
|
|
public int NbPages => (int)(NbBooks / Count);
|
|
|
|
public ICommand PreviousCommand { get; private set; }
|
|
|
|
public ICommand NextCommand { get; private set; }
|
|
|
|
public ICommand GetBooksByTitleCommand { get; private set; }
|
|
|
|
public ICommand GetBooksFromCollectionCommand { get; private set; }
|
|
|
|
public ICommand GetBooksByAuthorCommand { get; private set; }
|
|
|
|
public ICommand GetAllAuthorsCommand { get; private set; }
|
|
|
|
public ICommand GetBooksByDateCommand { get; private set; }
|
|
|
|
public ICommand GetAllPublishDatesCommand { get; private set; }
|
|
|
|
public ICommand GetAllRatingsCommand { get; private set; }
|
|
|
|
public ICommand GetToBeReadBooksCommand { get; private set; }
|
|
|
|
public ICommand GetCurrentLoansCommand { get; private set; }
|
|
|
|
public ICommand GetPastLoansCommand { get; private set; }
|
|
|
|
public ICommand GetCurrentBorrowingsCommand { get; private set; }
|
|
|
|
public ICommand GetPastBorrowingsCommand { get; private set; }
|
|
|
|
public ICommand GetBooksByRatingCommand { get; private set; }
|
|
|
|
#endregion
|
|
|
|
#region Constructor
|
|
|
|
public ManagerVM(Manager model) : base(model)
|
|
{
|
|
PreviousCommand = new RelayCommand(() => Previous());
|
|
NextCommand = new RelayCommand(() => Next());
|
|
GetBooksFromCollectionCommand = new RelayCommand(() => GetBooksFromCollection());
|
|
GetBooksByAuthorCommand = new RelayCommand(() => GetBooksByAuthor());
|
|
GetAllAuthorsCommand = new RelayCommand(() => GetAllAuthors());
|
|
GetBooksByDateCommand = new RelayCommand(() => GetBooksByDate());
|
|
GetAllPublishDatesCommand = new RelayCommand(() => GetAllPublishDates());
|
|
GetBooksByRatingCommand = new RelayCommand(() => GetBooksByRating());
|
|
GetAllRatingsCommand = new RelayCommand(() => GetAllRatings());
|
|
GetToBeReadBooksCommand = new RelayCommand(() => GetToBeReadBooks());
|
|
GetCurrentLoansCommand = new RelayCommand(() => GetCurrentLoans());
|
|
GetPastLoansCommand = new RelayCommand(() => GetPastLoans());
|
|
GetCurrentBorrowingsCommand = new RelayCommand(() => GetCurrentBorrowings());
|
|
GetPastBorrowingsCommand = new RelayCommand(() => GetPastBorrowings());
|
|
//GetBooksByTitleCommand = new RelayCommand(() => AllBooks = model.GetBooksByTitle(SearchTitle, Index, Count).Result.books.Select(book => new BookVM(book)));
|
|
}
|
|
|
|
//public ManagerVM(ILibraryManager libMgr, IUserLibraryManager userLibMgr) : this (new Manager(libMgr, userLibMgr)) { }
|
|
|
|
#endregion
|
|
|
|
#region Methods
|
|
|
|
private async Task Previous()
|
|
{
|
|
if (Index > 0)
|
|
{
|
|
Index--;
|
|
await GetBooksFromCollection();
|
|
}
|
|
}
|
|
|
|
private async Task Next()
|
|
{
|
|
if (Index < NbPages)
|
|
{
|
|
Index++;
|
|
await GetBooksFromCollection();
|
|
}
|
|
}
|
|
|
|
private async Task GetBooksFromCollection()
|
|
{
|
|
var result = await Model.GetBooksFromCollection(Index, Count);
|
|
NbBooks = result.count;
|
|
IEnumerable<Book> someBooks = result.books;
|
|
someBooks = someBooks.OrderBy(b => b.Status);
|
|
books.Clear();
|
|
foreach (var b in someBooks.Select(b => new BookVM(b)))
|
|
{
|
|
books.Add(b);
|
|
}
|
|
OnPropertyChanged(nameof(AllBooks));
|
|
}
|
|
|
|
private async Task GetBooksByAuthor()
|
|
{
|
|
var result = await Model.GetBooksByAuthor(SelectedAuthor.Name, Index, Count);
|
|
NbBooks = result.count;
|
|
IEnumerable<Book> someBooks = result.books;
|
|
books.Clear();
|
|
foreach (var b in someBooks.Select(b => new BookVM(b)))
|
|
{
|
|
books.Add(b);
|
|
}
|
|
OnPropertyChanged(nameof(AllBooks));
|
|
}
|
|
|
|
private async Task GetAllAuthors()
|
|
{
|
|
var result = await Model.GetBooksFromCollection(0, 20);
|
|
IEnumerable<Book> someBooks = result.books;
|
|
books.Clear();
|
|
authors.Clear();
|
|
foreach (var b in someBooks.Select(b => new BookVM(b)))
|
|
{
|
|
foreach (var a in b.Authors)
|
|
{
|
|
authors.Add(a);
|
|
a.NbBooksWritten++;
|
|
}
|
|
}
|
|
OnPropertyChanged(nameof(AllAuthors));
|
|
}
|
|
|
|
private async Task GetBooksByDate()
|
|
{
|
|
var result = await Model.GetBooksFromCollection(Index, Count);
|
|
NbBooks = result.count;
|
|
IEnumerable<Book> someBooks = result.books;
|
|
books.Clear();
|
|
foreach (var b in someBooks.Select(b => new BookVM(b)))
|
|
{
|
|
if (b.PublishDate == SelectedDate.PublishDate)
|
|
{
|
|
books.Add(b);
|
|
}
|
|
}
|
|
OnPropertyChanged(nameof(AllBooks));
|
|
}
|
|
|
|
private async Task GetAllPublishDates()
|
|
{
|
|
var result = await Model.GetBooksFromCollection(0, 20);
|
|
IEnumerable<Book> someBooks = result.books;
|
|
books.Clear();
|
|
publishDates.Clear();
|
|
foreach (var b in someBooks.Select(b => new BookVM(b)))
|
|
{
|
|
var date = new PublishDateVM { PublishDate = b.PublishDate };
|
|
date.NbBooksWritten++;
|
|
publishDates.Add(date);
|
|
foreach (var p in publishDates)
|
|
{
|
|
if (date.PublishDate.Year == p.PublishDate.Year && !date.Equals(p))
|
|
{
|
|
p.NbBooksWritten++;
|
|
publishDates.Remove(date);
|
|
}
|
|
}
|
|
}
|
|
OnPropertyChanged(nameof(AllPublishDates));
|
|
}
|
|
|
|
private async Task GetBooksByRating()
|
|
{
|
|
var result = await Model.GetBooksFromCollection(Index, Count);
|
|
NbBooks = result.count;
|
|
IEnumerable<Book> someBooks = result.books;
|
|
books.Clear();
|
|
var filteredBooks = someBooks.Where(b => b.UserRating.HasValue && Math.Floor(b.UserRating.Value) == SelectedRating.Average);
|
|
foreach (var book in filteredBooks)
|
|
{
|
|
books.Add(new BookVM(book));
|
|
}
|
|
OnPropertyChanged(nameof(AllBooks));
|
|
}
|
|
|
|
private async Task GetAllRatings()
|
|
{
|
|
var result = await Model.GetBooksFromCollection(0, 20);
|
|
IEnumerable<Book> someBooks = result.books;
|
|
books.Clear();
|
|
ratings.Clear();
|
|
|
|
Dictionary<string, List<BookVM>> groupedBooks = new Dictionary<string, List<BookVM>>();
|
|
|
|
foreach (var b in someBooks.Select(b => new BookVM(b)))
|
|
{
|
|
var rating = new RatingsVM { Average = b.UserRating };
|
|
if (rating.Average != null)
|
|
{
|
|
string noteKey = Math.Floor(rating.Average.Value).ToString("0");
|
|
|
|
if (!groupedBooks.ContainsKey(noteKey))
|
|
{
|
|
groupedBooks[noteKey] = new List<BookVM>();
|
|
}
|
|
|
|
groupedBooks[noteKey].Add(b);
|
|
}
|
|
}
|
|
|
|
foreach (var entry in groupedBooks)
|
|
{
|
|
var noteKey = entry.Key;
|
|
var booksWithSameRating = entry.Value;
|
|
|
|
var rating = new RatingsVM
|
|
{
|
|
Average = float.Parse(noteKey),
|
|
NbBooksWritten = booksWithSameRating.Count
|
|
};
|
|
|
|
ratings.Add(rating);
|
|
}
|
|
|
|
OnPropertyChanged(nameof(AllRatings));
|
|
}
|
|
|
|
private async Task GetToBeReadBooks()
|
|
{
|
|
var result = await Model.GetBooksFromCollection(0, 20);
|
|
IEnumerable<Book> someBooks = result.books;
|
|
books.Clear();
|
|
toBeReadBooks.Clear();
|
|
foreach (var b in someBooks.Select(b => new BookVM(b)))
|
|
{
|
|
if (b.Status == Status.ToBeRead)
|
|
{
|
|
toBeReadBooks.Add(b);
|
|
}
|
|
}
|
|
}
|
|
|
|
private async Task GetCurrentLoans()
|
|
{
|
|
var result = await Model.GetCurrentLoans(0, 20);
|
|
IEnumerable<Loan> someLoans = result.loans;
|
|
currentLoans.Clear();
|
|
foreach (var l in someLoans.Select(l => new LoanVM(l)))
|
|
{
|
|
currentLoans.Add(l);
|
|
}
|
|
OnPropertyChanged(nameof(AllCurrentLoans));
|
|
}
|
|
|
|
private async Task GetPastLoans()
|
|
{
|
|
var result = await Model.GetPastLoans(0, 20);
|
|
IEnumerable<Loan> someLoans = result.loans;
|
|
pastLoans.Clear();
|
|
foreach (var l in someLoans.Select(l => new LoanVM(l)))
|
|
{
|
|
pastLoans.Add(l);
|
|
}
|
|
OnPropertyChanged(nameof(AllPastLoans));
|
|
}
|
|
|
|
private async Task GetCurrentBorrowings()
|
|
{
|
|
var result = await Model.GetCurrentBorrowings(0, 20);
|
|
IEnumerable<Borrowing> someBorrowings = result.borrowings;
|
|
currentBorrowings.Clear();
|
|
foreach (var b in someBorrowings.Select(b => new BorrowingVM(b)))
|
|
{
|
|
currentBorrowings.Add(b);
|
|
}
|
|
OnPropertyChanged(nameof(AllCurrentBorrowings));
|
|
}
|
|
|
|
private async Task GetPastBorrowings()
|
|
{
|
|
var result = await Model.GetPastBorrowings(0, 20);
|
|
IEnumerable<Borrowing> someBorrowings = result.borrowings;
|
|
pastBorrowings.Clear();
|
|
foreach (var b in someBorrowings.Select(b => new BorrowingVM(b)))
|
|
{
|
|
pastBorrowings.Add(b);
|
|
}
|
|
OnPropertyChanged(nameof(AllPastBorrowings));
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |