diff --git a/.idea/.idea.BathHouseManagmet/.idea/avalonia.xml b/.idea/.idea.BathHouseManagmet/.idea/avalonia.xml index 73df4c5..efb2082 100644 --- a/.idea/.idea.BathHouseManagmet/.idea/avalonia.xml +++ b/.idea/.idea.BathHouseManagmet/.idea/avalonia.xml @@ -5,6 +5,9 @@ + + + diff --git a/Appsettings.json b/Appsettings.json deleted file mode 100644 index c89e8b1..0000000 --- a/Appsettings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DatabaseConnection": { - "ConnectionString" : "server=localhost;user=root;password=root;database=bathhouse" - } -} \ No newline at end of file diff --git a/BathHouseManagmet.csproj b/BathHouseManagmet.csproj index 6e455e5..c5b3256 100644 --- a/BathHouseManagmet.csproj +++ b/BathHouseManagmet.csproj @@ -23,16 +23,11 @@ All + - - - Always - - - MainWindow.axaml diff --git a/Models/Database/BaseRepository.cs b/Models/Database/BaseRepository.cs index 4b3b7d1..e5b231e 100644 --- a/Models/Database/BaseRepository.cs +++ b/Models/Database/BaseRepository.cs @@ -7,7 +7,7 @@ namespace BathHouseManagmet.Models.Database; public abstract class BaseRepository : IDisposable, IRepository where T : class { - public abstract List GetPage(int pageNumber, int pageSize); + public abstract List GetPage(int? pageNumber, int? pageSize); public abstract bool Add(T entity); public abstract bool Update(T entity); public abstract bool Delete(T entity); diff --git a/Models/Database/ClientRepository.cs b/Models/Database/ClientRepository.cs index 4078735..ca689f7 100644 --- a/Models/Database/ClientRepository.cs +++ b/Models/Database/ClientRepository.cs @@ -14,10 +14,16 @@ public class ClientRepository : BaseRepository, IDisposable OpenConnection(); } - public override List GetPage(int pageNumber, int pageSize) + public override List GetPage(int? pageNumber = null, int? pageSize = null) { List result = new(); - string sql = "select * from `client` limit @limit offset @offset"; + string sql = "select * from `client`"; + + if (pageNumber.HasValue && pageSize.HasValue) + { + sql += "limit @limit offset @offset"; + } + try { using var command = new MySqlCommand(sql, connection); diff --git a/Models/Database/DiscountRepository.cs b/Models/Database/DiscountRepository.cs index 914e1d7..24ff897 100644 --- a/Models/Database/DiscountRepository.cs +++ b/Models/Database/DiscountRepository.cs @@ -15,10 +15,16 @@ public class DiscountRepository : BaseRepository, IDisposable OpenConnection(); } - public override List GetPage(int pageNumber, int pageSize) + public override List GetPage(int? pageNumber = null, int? pageSize = null) { List result = new(); - string sql = "select * from `discount` limit @limit offset @offset"; + string sql = "select * from `discount`"; + + if (pageNumber.HasValue && pageSize.HasValue) + { + sql += "limit @limit offset @offset"; + } + try { using var command = new MySqlCommand(sql, connection); diff --git a/Models/Database/EmployeeRepository.cs b/Models/Database/EmployeeRepository.cs index 3aabb30..da40ff1 100644 --- a/Models/Database/EmployeeRepository.cs +++ b/Models/Database/EmployeeRepository.cs @@ -14,10 +14,16 @@ public class EmployeeRepository : BaseRepository, IDisposable OpenConnection(); } - public override List GetPage(int pageNumber, int pageSize) + public override List GetPage(int? pageNumber = null, int? pageSize = null) { List result = new(); - string sql = "select e.id as eid, e.position_id as pid, e.name as ename, e.surname as esurname, p.name as pname from employee e join position p on e.position_id = p.id limit @limit offset @offset"; + string sql = "select e.id as eid, e.position_id as pid, e.name as ename, e.surname as esurname, p.name as pname from employee e join position p on e.position_id = p.id"; + + if (pageNumber.HasValue && pageSize.HasValue) + { + sql += "limit @limit offset @offset"; + } + try { using var command = new MySqlCommand(sql, connection); diff --git a/Models/Database/OrderRepository.cs b/Models/Database/OrderRepository.cs index e2b532c..04d0e30 100644 --- a/Models/Database/OrderRepository.cs +++ b/Models/Database/OrderRepository.cs @@ -15,11 +15,17 @@ public class OrderRepository : BaseRepository, IDisposable OpenConnection(); } - public override List GetPage(int pageNumber, int pageSize) + public override List GetPage(int? pageNumber = null, int? pageSize = null) { List result = new(); string sql = - "select o.id as oid, o.client_id as ocid, o.employee_id as eid, o.discount_id as did, o.service_id as sid, o.zone_id as zid, c.name as cname, c.surname as csurname, o.order_time as otime, e.name as ename, e.surname as esurname, d.name as dname, s.name as sname, z.name as zname from `order` o join client c on o.client_id = c.id join employee e on o.employee_id = e.id join discount d on o.discount_id = d.id join service s on o.service_id = s.id join zone z on o.zone_id = z.id limit @limit offset @offset"; + "select o.id as oid, o.client_id as ocid, o.employee_id as eid, o.discount_id as did, o.service_id as sid, o.zone_id as zid, c.name as cname, c.surname as csurname, o.order_time as otime, e.name as ename, e.surname as esurname, d.name as dname, s.name as sname, z.name as zname from `order` o join client c on o.client_id = c.id join employee e on o.employee_id = e.id join discount d on o.discount_id = d.id join service s on o.service_id = s.id join zone z on o.zone_id = z.id"; + + if (pageNumber.HasValue && pageSize.HasValue) + { + sql += "limit @limit offset @offset"; + } + try { using var command = new MySqlCommand(sql, connection); diff --git a/Models/Database/PositionRepository.cs b/Models/Database/PositionRepository.cs index e0cb6c3..1fab13a 100644 --- a/Models/Database/PositionRepository.cs +++ b/Models/Database/PositionRepository.cs @@ -14,10 +14,16 @@ public class PositionRepository : BaseRepository, IDisposable OpenConnection(); } - public override List GetPage(int pageNumber, int pageSize) + public override List GetPage(int? pageNumber = null, int? pageSize = null) { List result = new(); - string sql = "select * from `position` limit @limit offset @offset"; + string sql = "select * from `position`"; + + if (pageNumber.HasValue && pageSize.HasValue) + { + sql += "limit @limit offset @offset"; + } + try { using var command = new MySqlCommand(sql, connection); diff --git a/Models/Database/ServiceRepository.cs b/Models/Database/ServiceRepository.cs index 31128ae..c89e41b 100644 --- a/Models/Database/ServiceRepository.cs +++ b/Models/Database/ServiceRepository.cs @@ -14,10 +14,16 @@ public class ServiceRepository : BaseRepository, IDisposable OpenConnection(); } - public override List GetPage(int pageNumber, int pageSize) + public override List GetPage(int? pageNumber = null, int? pageSize = null) { List result = new(); - string sql = "select * from `service` limit @limit offset @offset"; + string sql = "select * from `service`"; + + if (pageNumber.HasValue && pageSize.HasValue) + { + sql += "limit @limit offset @offset"; + } + try { using var command = new MySqlCommand(sql, connection); diff --git a/Models/Database/ZoneRepository.cs b/Models/Database/ZoneRepository.cs index 5fb5655..486cd95 100644 --- a/Models/Database/ZoneRepository.cs +++ b/Models/Database/ZoneRepository.cs @@ -14,10 +14,16 @@ public class ZoneRepository : BaseRepository, IDisposable OpenConnection(); } - public override List GetPage(int pageNumber, int pageSize) + public override List GetPage(int? pageNumber = null, int? pageSize = null) { List result = new(); - string sql = "select * from zone limit @limit offset @offset"; + string sql = "select * from `zone`"; + + if (pageNumber.HasValue && pageSize.HasValue) + { + sql += "limit @limit offset @offset"; + } + try { using var command = new MySqlCommand(sql, connection); diff --git a/Models/Interfaces/IRepository.cs b/Models/Interfaces/IRepository.cs index a5ddd3d..ccfa80a 100644 --- a/Models/Interfaces/IRepository.cs +++ b/Models/Interfaces/IRepository.cs @@ -4,7 +4,7 @@ namespace BathHouseManagmet.Models.Interfaces; public interface IRepository where T : class { - List GetPage(int pageNumber, int pageSize); + List GetPage(int? pageNumber, int? pageSize); bool Add(T entity); bool Update(T entity); bool Delete(T entity); diff --git a/Program.cs b/Program.cs index ed08373..92ff755 100644 --- a/Program.cs +++ b/Program.cs @@ -1,8 +1,10 @@ using Avalonia; using System; using BathHouseManagmet.Database; +using BathHouseManagmet.Models; using BathHouseManagmet.ViewModels; using BathHouseManagmet.Views; +using BathHouseManagmet.Views.AddWindows; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -36,6 +38,14 @@ sealed class Program s.AddTransient(); s.AddTransient(); s.AddTransient(); + s.AddTransient(); + s.AddTransient(); + s.AddTransient(); + s.AddTransient(); + s.AddTransient(); + s.AddTransient(); + + s.AddTransient(); s.AddTransient(); s.AddTransient(); diff --git a/ViewModels/UserControlViewModels/ClientViewModel.cs b/ViewModels/UserControlViewModels/ClientViewModel.cs index 33ad48d..958ddfe 100644 --- a/ViewModels/UserControlViewModels/ClientViewModel.cs +++ b/ViewModels/UserControlViewModels/ClientViewModel.cs @@ -1,23 +1,83 @@ using System; using System.Collections.Generic; +using System.Linq; using BathHouseManagmet.Database; using BathHouseManagmet.Models; using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; namespace BathHouseManagmet.ViewModels; public partial class ClientViewModel : ViewModelBase { private readonly IServiceProvider _serviceProvider; - private readonly ClientRepository _repository; [ObservableProperty] List _clients; + [ObservableProperty] int _currentPageSize; + [ObservableProperty] List _pageSizes; + [ObservableProperty] string _pageInfo; - public ClientViewModel(IServiceProvider serviceProvider, ClientRepository repository) + private int currentPage = 0; + private int totalPages; + + public ClientViewModel(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; - _repository = repository; - Clients = _repository.GetPage(1, 1); + using (var rep = serviceProvider.GetRequiredService()) + Clients = new List(rep.GetPage()); + + PageSizes = new List([5,10,15]); + CurrentPageSize = PageSizes.First(); + } + + partial void OnCurrentPageSizeChanged(int value) + { + CalculatePage(); + } + + void CalculatePage() + { + using var db = new DiscountRepository(); + var rowsCount = db.GetRowsCount(); + totalPages = (int)Math.Ceiling(((double)rowsCount / CurrentPageSize)); + ShowFirstPage(); + } + + void ShowPage(int pageIndex) + { + currentPage = pageIndex; + using var db = new ClientRepository(); + Clients.Clear(); + var rows = db.GetPage(pageIndex, CurrentPageSize); + rows.ForEach(c => Clients.Add(c)); + PageInfo = $"Страница {currentPage + 1} из {totalPages}"; + } + + [RelayCommand] + private void ShowFirstPage() + { + ShowPage(0); + } + + [RelayCommand] + private void ShowLastPage() + { + ShowPage(totalPages - 1); + } + + [RelayCommand] + private void ShowNextPage() + { + if (currentPage < totalPages - 1) + ShowPage(currentPage + 1); + } + + [RelayCommand] + private void ShowPreviousPage() + { + if (currentPage > 0) + ShowPage(currentPage - 1); } } \ No newline at end of file diff --git a/ViewModels/UserControlViewModels/DiscountViewModel.cs b/ViewModels/UserControlViewModels/DiscountViewModel.cs index dd24c4e..a7d6f55 100644 --- a/ViewModels/UserControlViewModels/DiscountViewModel.cs +++ b/ViewModels/UserControlViewModels/DiscountViewModel.cs @@ -1,23 +1,84 @@ using System; using System.Collections.Generic; +using System.Data; +using System.Linq; using BathHouseManagmet.Database; using BathHouseManagmet.Models; using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; namespace BathHouseManagmet.ViewModels; public partial class DiscountViewModel : ViewModelBase { private readonly IServiceProvider _serviceProvider; - private readonly DiscountRepository _repository; - - [ObservableProperty] List discounts; - public DiscountViewModel(IServiceProvider serviceProvider, DiscountRepository repository) + [ObservableProperty] List _discounts; + [ObservableProperty] int _currentPageSize; + [ObservableProperty] List _pageSizes; + [ObservableProperty] string _pageInfo; + + private int totalPages; + private int currentPage = 0; + + public DiscountViewModel(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; - _repository = repository; - Discounts = _repository.GetPage(1, 1); + using (var rep = serviceProvider.GetRequiredService()) + Discounts = new List(rep.GetPage()); + + PageSizes = new List([5, 10, 15]); + CurrentPageSize = PageSizes.First(); + } + + partial void OnCurrentPageSizeChanged(int value) + { + CalculatePage(); + } + + void CalculatePage() + { + using var db = new DiscountRepository(); + var rowsCount = db.GetRowsCount(); + totalPages = (int)Math.Ceiling(((double)rowsCount / CurrentPageSize)); + ShowFirstPage(); + } + + void ShowPage(int pageIndex) + { + currentPage = pageIndex; + using var db = new DiscountRepository(); + Discounts.Clear(); + var rows = db.GetPage(pageIndex, CurrentPageSize); + rows.ForEach(d => Discounts.Add(d)); + PageInfo = $"Страница {currentPage + 1} из {totalPages}"; + } + + [RelayCommand] + private void ShowFirstPage() + { + ShowPage(0); + } + + [RelayCommand] + private void ShowLastPage() + { + ShowPage(totalPages - 1); + } + + [RelayCommand] + private void ShowNextPage() + { + if (currentPage < totalPages - 1) + ShowPage(currentPage + 1); + } + + [RelayCommand] + private void ShowPreviousPage() + { + if (currentPage > 0) + ShowPage(currentPage - 1); } } \ No newline at end of file diff --git a/ViewModels/UserControlViewModels/EmployeeViewModel.cs b/ViewModels/UserControlViewModels/EmployeeViewModel.cs index 6bd4fe5..2c2a723 100644 --- a/ViewModels/UserControlViewModels/EmployeeViewModel.cs +++ b/ViewModels/UserControlViewModels/EmployeeViewModel.cs @@ -1,23 +1,93 @@ using System; using System.Collections.Generic; +using System.Linq; using BathHouseManagmet.Database; using BathHouseManagmet.Models; using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; namespace BathHouseManagmet.ViewModels; public partial class EmployeeViewModel : ViewModelBase { private readonly IServiceProvider _serviceProvider; - private readonly EmployeeRepository _repository; - [ObservableProperty] List employees; + [ObservableProperty] List _employees; + [ObservableProperty] List _positions; + [ObservableProperty] int _currentPageSize; + [ObservableProperty] List _pageSizes; + [ObservableProperty] string _pageInfo; - public EmployeeViewModel(IServiceProvider serviceProvider, EmployeeRepository repository) + private int totalPages; + private int currentPage = 0; + + public EmployeeViewModel(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; - _repository = repository; + + using (var rep = serviceProvider.GetRequiredService()) + Employees = new List(rep.GetPage()); + using (var rep = serviceProvider.GetRequiredService()) + Positions = new List(rep.GetPage()); + + PageSizes = new List([5, 10, 15]); + CurrentPageSize = PageSizes.First(); + } + + partial void OnCurrentPageSizeChanged(int value) + { + CalculatePage(); + } - Employees = _repository.GetPage(1, 1); + void CalculatePage() + { + using var db = new DiscountRepository(); + var rowsCount = db.GetRowsCount(); + totalPages = (int)Math.Ceiling(((double)rowsCount / CurrentPageSize)); + ShowFirstPage(); + } + + void ShowPage(int pageIndex) + { + currentPage = pageIndex; + using var db = new EmployeeRepository(); + Employees.Clear(); + var rows = db.GetPage(pageIndex, CurrentPageSize); + rows.ForEach(e => Employees.Add(e)); + PageInfo = $"Страница {currentPage + 1} из {totalPages}"; + } + + [RelayCommand] + private void ShowFirstPage() + { + ShowPage(0); + } + + [RelayCommand] + private void ShowLastPage() + { + ShowPage(totalPages - 1); + } + + [RelayCommand] + private void ShowNextPage() + { + if (currentPage < totalPages - 1) + ShowPage(currentPage + 1); + } + + [RelayCommand] + private void ShowPreviousPage() + { + if (currentPage > 0) + ShowPage(currentPage - 1); + } + + + [RelayCommand] + public void AddWindow() + { + } } \ No newline at end of file diff --git a/ViewModels/UserControlViewModels/OrderViewModel.cs b/ViewModels/UserControlViewModels/OrderViewModel.cs index ae14c1f..c12a49d 100644 --- a/ViewModels/UserControlViewModels/OrderViewModel.cs +++ b/ViewModels/UserControlViewModels/OrderViewModel.cs @@ -5,13 +5,13 @@ using BathHouseManagmet.Database; using BathHouseManagmet.Models; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; namespace BathHouseManagmet.ViewModels; public partial class OrderViewModel : ViewModelBase { private readonly IServiceProvider _serviceProvider; - private readonly OrderRepository _repository; [ObservableProperty] private int _currentPageSize; [ObservableProperty] private List _pageSizes; @@ -20,18 +20,36 @@ public partial class OrderViewModel : ViewModelBase private int totalPages; [ObservableProperty] List orders; + [ObservableProperty] List employees; + [ObservableProperty] List positions; + [ObservableProperty] List clients; + [ObservableProperty] List zones; + [ObservableProperty] List services; + [ObservableProperty] List discounts; - public OrderViewModel(IServiceProvider serviceProvider, OrderRepository repository) + public OrderViewModel(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; - _repository = repository; - Orders = _repository.GetPage(1, 1); + using (var rep = serviceProvider.GetRequiredService()) + Orders = new List(rep.GetPage()); + using (var rep = serviceProvider.GetRequiredService()) + Employees = new List(rep.GetPage()); + using (var rep = serviceProvider.GetRequiredService()) + Zones = new List(rep.GetPage()); + using (var rep = serviceProvider.GetRequiredService()) + Services = new List(rep.GetPage()); + using (var rep = serviceProvider.GetRequiredService()) + Clients = new List(rep.GetPage()); + using (var rep = serviceProvider.GetRequiredService()) + Positions = new List(rep.GetPage()); + using (var rep = serviceProvider.GetRequiredService()) + Discounts = new List(rep.GetPage()); PageSizes = new List([5,10,20]); - //CurrentPageSize = PageSizes.First(); + CurrentPageSize = PageSizes.First(); } -/* + partial void OnCurrentPageSizeChanged(int value) { CalculatePages(); @@ -80,5 +98,4 @@ public partial class OrderViewModel : ViewModelBase if (currentPage > 0) ShowPage(currentPage - 1); } - */ } \ No newline at end of file diff --git a/ViewModels/UserControlViewModels/PositionViewModel.cs b/ViewModels/UserControlViewModels/PositionViewModel.cs index 2a5cbbd..8f08a1e 100644 --- a/ViewModels/UserControlViewModels/PositionViewModel.cs +++ b/ViewModels/UserControlViewModels/PositionViewModel.cs @@ -1,23 +1,86 @@ using System; using System.Collections.Generic; +using System.Linq; using BathHouseManagmet.Database; using BathHouseManagmet.Models; using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; namespace BathHouseManagmet.ViewModels; public partial class PositionViewModel : ViewModelBase { private readonly IServiceProvider _serviceProvider; - private readonly PositionRepository _repository; - [ObservableProperty] List positions; + [ObservableProperty] List _positions; + [ObservableProperty] int _currentPageSize; + [ObservableProperty] List _pageSizes; + [ObservableProperty] string pageInfo; - public PositionViewModel(IServiceProvider serviceProvider, PositionRepository repository) + private int currentPage = 0; + private int totalPages; + + public PositionViewModel(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; - _repository = repository; - Positions = _repository.GetPage(1, 1); + using (var rep = serviceProvider.GetRequiredService()) + Positions = new List(rep.GetPage()); + + PageSizes = new List([5, 10, 15]); + CurrentPageSize = PageSizes.First(); + } + + partial void OnCurrentPageSizeChanged(int value) + { + CalculatePage(); + } + + void CalculatePage() + { + using var db = new DiscountRepository(); + var rowsCount = db.GetRowsCount(); + totalPages = (int)Math.Ceiling(((double)rowsCount / CurrentPageSize)); + ShowFirstPage(); + } + + void ShowPage(int pageIndex) + { + currentPage = pageIndex; + using var db = new PositionRepository(); + Positions.Clear(); + using (var rep = _serviceProvider.GetRequiredService()) + { + var rows = db.GetPage(pageIndex, CurrentPageSize); + rows.ForEach(p => Positions.Add(p)); + } + PageInfo = $"Страница {currentPage + 1} из {totalPages}"; + } + + [RelayCommand] + private void ShowFirstPage() + { + ShowPage(0); + } + + [RelayCommand] + private void ShowLastPage() + { + ShowPage(totalPages - 1); + } + + [RelayCommand] + private void ShowNextPage() + { + if (currentPage < totalPages - 1) + ShowPage(currentPage + 1); + } + + [RelayCommand] + private void ShowPreviousPage() + { + if (currentPage > 0) + ShowPage(currentPage - 1); } } \ No newline at end of file diff --git a/ViewModels/UserControlViewModels/ServiceViewModel.cs b/ViewModels/UserControlViewModels/ServiceViewModel.cs index cc1bb5d..4cc5c91 100644 --- a/ViewModels/UserControlViewModels/ServiceViewModel.cs +++ b/ViewModels/UserControlViewModels/ServiceViewModel.cs @@ -1,23 +1,83 @@ using System; using System.Collections.Generic; +using System.Linq; using BathHouseManagmet.Database; using BathHouseManagmet.Models; using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; namespace BathHouseManagmet.ViewModels; public partial class ServiceViewModel : ViewModelBase { private readonly IServiceProvider _serviceProvider; - private readonly ServiceRepository _repository; [ObservableProperty] List services; + [ObservableProperty] int _currentPageSize; + [ObservableProperty] List _pageSizes; + [ObservableProperty] string _pageInfo; - public ServiceViewModel(IServiceProvider serviceProvider, ServiceRepository repository) + private int totalPages; + private int currentPage = 0; + + public ServiceViewModel(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; - _repository = repository; - Services = _repository.GetPage(1, 1); + using (var rep = serviceProvider.GetRequiredService()) + Services = new List(rep.GetPage()); + + PageSizes = new List([5, 10, 15]); + CurrentPageSize = PageSizes.First(); + } + + partial void OnCurrentPageSizeChanged(int value) + { + CalculatePage(); + } + + void CalculatePage() + { + using var db = new DiscountRepository(); + var rowsCount = db.GetRowsCount(); + totalPages = (int)Math.Ceiling(((double)rowsCount / CurrentPageSize)); + ShowFirstPage(); + } + + void ShowPage(int pageIndex) + { + currentPage = pageIndex; + using var db = new ServiceRepository(); + Services.Clear(); + var rows = db.GetPage(pageIndex, CurrentPageSize); + rows.ForEach(s => services.Add(s)); + PageInfo = $"Страница {currentPage + 1} из {totalPages}"; + } + + [RelayCommand] + private void ShowFirstPage() + { + ShowPage(0); + } + + [RelayCommand] + private void ShowLastPage() + { + ShowPage(totalPages - 1); + } + + [RelayCommand] + private void ShowNextPage() + { + if (currentPage < totalPages - 1) + ShowPage(currentPage + 1); + } + + [RelayCommand] + private void ShowPreviousPage() + { + if (currentPage > 0) + ShowPage(currentPage - 1); } } \ No newline at end of file diff --git a/ViewModels/UserControlViewModels/ZoneViewModel.cs b/ViewModels/UserControlViewModels/ZoneViewModel.cs index 7e14f49..16b850e 100644 --- a/ViewModels/UserControlViewModels/ZoneViewModel.cs +++ b/ViewModels/UserControlViewModels/ZoneViewModel.cs @@ -1,23 +1,83 @@ using System; using System.Collections.Generic; +using System.Linq; using BathHouseManagmet.Database; using BathHouseManagmet.Models; using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; namespace BathHouseManagmet.ViewModels; public partial class ZoneViewModel : ViewModelBase { private readonly IServiceProvider _serviceProvider; - private readonly ZoneRepository _repository; [ObservableProperty] private List zones; + [ObservableProperty] int _currentPageSize; + [ObservableProperty] List _pageSizes; + [ObservableProperty] string _pageInfo; + + private int totalPages; + private int currentPage = 0; - public ZoneViewModel(IServiceProvider serviceProvider, ZoneRepository repository) + public ZoneViewModel(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; - _repository = repository; - Zones = _repository.GetPage(1, 1); + using (var rep = serviceProvider.GetRequiredService()) + Zones = new List(rep.GetPage()); + + PageSizes = new List([5, 10, 15]); + CurrentPageSize = PageSizes.First(); + } + + partial void OnCurrentPageSizeChanged(int value) + { + CalculatePage(); + } + + void CalculatePage() + { + using var db = new DiscountRepository(); + var rowsCount = db.GetRowsCount(); + totalPages = (int)Math.Ceiling(((double)rowsCount / CurrentPageSize)); + ShowFirstPage(); + } + + void ShowPage(int pageIndex) + { + currentPage = pageIndex; + using var db = new ZoneRepository(); + Zones.Clear(); + var rows = db.GetPage(pageIndex, CurrentPageSize); + rows.ForEach(z => Zones.Add(z)); + PageInfo = $"Страница {currentPage + 1} из {totalPages}"; + } + + [RelayCommand] + private void ShowFirstPage() + { + ShowPage(0); + } + + [RelayCommand] + private void ShowLastPage() + { + ShowPage(totalPages - 1); + } + + [RelayCommand] + private void ShowNextPage() + { + if (currentPage < totalPages - 1) + ShowPage(currentPage + 1); + } + + [RelayCommand] + private void ShowPreviousPage() + { + if (currentPage > 0) + ShowPage(currentPage - 1); } } \ No newline at end of file diff --git a/ViewModels/WindowViewModels/Adds/AddEmployeeWindowViewModel.cs b/ViewModels/WindowViewModels/Adds/AddEmployeeWindowViewModel.cs new file mode 100644 index 0000000..97a39fa --- /dev/null +++ b/ViewModels/WindowViewModels/Adds/AddEmployeeWindowViewModel.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using BathHouseManagmet.Database; +using BathHouseManagmet.Models; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; + +namespace BathHouseManagmet.ViewModels; + +public partial class AddEmployeeWindowViewModel : ViewModelBase +{ + private readonly IServiceProvider _serviceProvider; + + [ObservableProperty] private string _employeeName; + [ObservableProperty] private string _employeeSurname; + [ObservableProperty] private Position _employeePosition; + + [ObservableProperty] private List _employees; + [ObservableProperty] private List _positions; + [ObservableProperty] private Position _selectedPosition; + + public AddEmployeeWindowViewModel(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + + using (var rep = serviceProvider.GetRequiredService()) + Employees = new List(rep.GetPage()); + } + + [RelayCommand] + public void AddEmployee() + { + var emp = new Employee() + { + Name = EmployeeName, + Surname = EmployeeSurname, + Position = EmployeePosition + }; + + using (var rep = _serviceProvider.GetRequiredService()) + rep.Add(emp); + CloseWindow(); + } + + /* Прикольная штука, пользоваться можно. Но как мать его работать с MessageBox?? + private bool Validate() + { + if (string.IsNullOrWhiteSpace(_employeeName) || string.IsNullOrWhiteSpace(_employeeSurname)) + return false; + return true; + } + */ + + [RelayCommand] + public void CloseWindow() + { + close(); + } + + private Action close; + public void SetClose(Action close) + { + this.close = close; + } +} \ No newline at end of file diff --git a/ViewModels/WindowViewModels/Adds/AddPositionWindowViewModel.cs b/ViewModels/WindowViewModels/Adds/AddPositionWindowViewModel.cs new file mode 100644 index 0000000..20a6498 --- /dev/null +++ b/ViewModels/WindowViewModels/Adds/AddPositionWindowViewModel.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using BathHouseManagmet.Database; +using BathHouseManagmet.Models; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; + +namespace BathHouseManagmet.ViewModels; + +public partial class AddPositionWindowViewModel : ViewModelBase +{ + private readonly IServiceProvider _serviceProvider; + + [ObservableProperty] private string _positionName; + [ObservableProperty] private List _positions; + + public AddPositionWindowViewModel(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + + using (var rep = serviceProvider.GetRequiredService()) + Positions = new List(rep.GetPage()); + } + + [RelayCommand] + public void AddPosition() + { + var pos = new Position() + { + Name = PositionName + }; + + using (var rep = _serviceProvider.GetRequiredService()) + rep.Add(pos); + CloseWindow(); + } + + [RelayCommand] + public void CloseWindow() + { + close(); + } + + private Action close; + public void SetClose(Action close) + { + this.close = close; + } +} \ No newline at end of file diff --git a/ViewModels/WindowViewModels/Adds/AddZoneWindowViewModel.cs b/ViewModels/WindowViewModels/Adds/AddZoneWindowViewModel.cs new file mode 100644 index 0000000..9edfc82 --- /dev/null +++ b/ViewModels/WindowViewModels/Adds/AddZoneWindowViewModel.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using BathHouseManagmet.Database; +using BathHouseManagmet.Models; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; + +namespace BathHouseManagmet.ViewModels; + +public partial class AddZoneWindowViewModel : ViewModelBase +{ + private readonly IServiceProvider _serviceProvider; + [ObservableProperty] List _zones; + [ObservableProperty] string _zoneName; + + public AddZoneWindowViewModel(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + [RelayCommand] + public void AddZone() + { + var zone = new Zone + { + Name = ZoneName + }; + + using (var rep = _serviceProvider.GetRequiredService()) + rep.Add(zone); + CloseWindow(); + } + + [RelayCommand] + public void CloseWindow() + { + close(); + } + + private Action close; + public void SetClose(Action close) + { + this.close = close; + } +} \ No newline at end of file diff --git a/ViewModels/WindowViewModels/MainWindowViewModel.cs b/ViewModels/WindowViewModels/MainWindowViewModel.cs index 501ef36..7e93d0b 100644 --- a/ViewModels/WindowViewModels/MainWindowViewModel.cs +++ b/ViewModels/WindowViewModels/MainWindowViewModel.cs @@ -2,7 +2,10 @@ using System.Collections.Generic; using BathHouseManagmet.Database; using BathHouseManagmet.Models; +using BathHouseManagmet.Views; +using BathHouseManagmet.Views.AddWindows; using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; using Microsoft.Extensions.DependencyInjection; namespace BathHouseManagmet.ViewModels; @@ -29,4 +32,34 @@ public partial class MainWindowViewModel : ViewModelBase DiscountViewModel = _serviceProvider.GetRequiredService(); PositionViewModel = _serviceProvider.GetRequiredService(); } + + [RelayCommand] + public void AddEmployee() + { + var vm = ActivatorUtilities.CreateInstance(_serviceProvider); + var win = _serviceProvider.GetService(); + win.DataContext = vm; + win.Show(); + vm.SetClose(win.Close); + } + + [RelayCommand] + public void AddPosition() + { + var vm = ActivatorUtilities.CreateInstance(_serviceProvider); + var win = _serviceProvider.GetService(); + win.DataContext = vm; + win.Show(); + vm.SetClose(win.Close); + } + + [RelayCommand] + public void AddZone() + { + var vm = ActivatorUtilities.CreateInstance(_serviceProvider); + var win = _serviceProvider.GetService(); + win.DataContext = vm; + win.Show(); + vm.SetClose(win.Close); + } } \ No newline at end of file diff --git a/ViewModels/ViewModelBase.cs b/ViewModels/WindowViewModels/ViewModelBase.cs similarity index 96% rename from ViewModels/ViewModelBase.cs rename to ViewModels/WindowViewModels/ViewModelBase.cs index 1dfa296..ac57155 100644 --- a/ViewModels/ViewModelBase.cs +++ b/ViewModels/WindowViewModels/ViewModelBase.cs @@ -4,4 +4,5 @@ namespace BathHouseManagmet.ViewModels; public abstract class ViewModelBase : ObservableObject { + } \ No newline at end of file diff --git a/Views/AddWindows/AddEmployeeWindow.axaml b/Views/AddWindows/AddEmployeeWindow.axaml new file mode 100644 index 0000000..a8c854f --- /dev/null +++ b/Views/AddWindows/AddEmployeeWindow.axaml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + +