diff --git a/DaSaSo.EntityFramework/DaSaSoDbContextFactory.cs b/DaSaSo.EntityFramework/DaSaSoDbContextFactory.cs index 8a4a60f..b88648f 100644 --- a/DaSaSo.EntityFramework/DaSaSoDbContextFactory.cs +++ b/DaSaSo.EntityFramework/DaSaSoDbContextFactory.cs @@ -8,13 +8,21 @@ using System.Threading.Tasks; namespace DaSaSo.EntityFramework { - public class DaSaSoDbContextFactory : IDesignTimeDbContextFactory + public class DaSaSoDbContextFactory { - public DaSaSoDbContext CreateDbContext(string[]? args = null) + private readonly string _connectionString; + + public DaSaSoDbContextFactory(string connectionString) + { + _connectionString = connectionString; + } + + public DaSaSoDbContext CreateDbContext() { var options = new DbContextOptionsBuilder(); - options.UseNpgsql("Host = localhost; Database = dasaso; Username = kansan; Password = kansan"); - return new DaSaSoDbContext(options.Options); + options.UseNpgsql(_connectionString); + DaSaSoDbContext result = new DaSaSoDbContext(options.Options); + return result; } } } diff --git a/DaSaSo.EntityFramework/Services/ProjectDataService.cs b/DaSaSo.EntityFramework/Services/ProjectDataService.cs new file mode 100644 index 0000000..ffaaa1c --- /dev/null +++ b/DaSaSo.EntityFramework/Services/ProjectDataService.cs @@ -0,0 +1,60 @@ +using DaSaSo.Domain.Model; +using DaSaSo.Domain.Services; +using DaSaSo.EntityFramework.Services.Common; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DaSaSo.EntityFramework.Services +{ + public class ProjectDataService : IDataService + { + private readonly DaSaSoDbContextFactory _contextFactory; + private readonly NonQueryDataService _nonQueryDataService; + + public ProjectDataService(DaSaSoDbContextFactory contextFactory) + { + _contextFactory = contextFactory; + _nonQueryDataService = new NonQueryDataService(contextFactory); + } + + public async Task Create(Project entity) + { + return await _nonQueryDataService.Create(entity); + } + + public async Task Delete(int id) + { + return await _nonQueryDataService.Delete(id); + } + + public Task Get(int id) + { + throw new NotImplementedException(); + } + + public async Task> GetAllByClient(Client client) + { + // Get Clientid + int id = client.Id; + using (DaSaSoDbContext context = _contextFactory.CreateDbContext()) + { + IEnumerable entities = await context.Projects.Where(x => x.Client.Id == id).ToListAsync(); + return entities; + } + } + + public Task> GetAll() + { + throw new NotImplementedException(); + } + + public async Task Update(int id, Project entity) + { + return await _nonQueryDataService.Update(id, entity); + } + } +} diff --git a/DaSaSo.ViewModel/Commands/AsyncCommandBase.cs b/DaSaSo.ViewModel/Commands/AsyncCommandBase.cs new file mode 100644 index 0000000..9345649 --- /dev/null +++ b/DaSaSo.ViewModel/Commands/AsyncCommandBase.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Input; + +namespace DaSaSo.ViewModel.Commands +{ + public abstract class AsyncCommandBase : ICommand + { + bool _isExecuting = false; + public event EventHandler? CanExecuteChanged; + + public bool IsExecuting + { + get => _isExecuting; + set + { + _isExecuting = value; + CanExecuteChanged?.Invoke(this, new EventArgs()); + } + } + + + public bool CanExecute(object? parameter) + { + return !IsExecuting; + } + + public async void Execute(object? parameter) + { + IsExecuting = true; + await ExecuteAsync(parameter); + IsExecuting = false; + } + + public abstract Task ExecuteAsync(object? parameter); + } +} diff --git a/DaSaSo.ViewModel/Commands/EditClientCommand.cs b/DaSaSo.ViewModel/Commands/EditClientCommand.cs index bb64794..eb2b822 100644 --- a/DaSaSo.ViewModel/Commands/EditClientCommand.cs +++ b/DaSaSo.ViewModel/Commands/EditClientCommand.cs @@ -11,16 +11,14 @@ using System.Windows.Input; namespace DaSaSo.ViewModel.Commands { - public class EditClientCommand : ICommand + public class EditClientCommand : AsyncCommandBase { private readonly IDataService dataservice; private readonly IActualProject actualProject; private readonly IRenavigator renavigator; private readonly ClientListViewModel clientListViewModel; - public event EventHandler? CanExecuteChanged; - - + public EditClientCommand(IDataService dataservice, IActualProject actualProject,IRenavigator renavigator, ClientListViewModel clientListViewModel) { @@ -30,12 +28,8 @@ namespace DaSaSo.ViewModel.Commands this.clientListViewModel = clientListViewModel; } - public bool CanExecute(object? parameter) - { - return true; - } - - public void Execute(object? parameter) + + public override async Task ExecuteAsync(object? parameter) { actualProject.SetClient(clientListViewModel.SelectedClient); renavigator.Renavigate(new ClientEditViewModel(dataservice,actualProject,renavigator)); diff --git a/DaSaSo.ViewModel/Commands/SelectClientCommand.cs b/DaSaSo.ViewModel/Commands/SelectClientCommand.cs index ac0a6e1..3ed1096 100644 --- a/DaSaSo.ViewModel/Commands/SelectClientCommand.cs +++ b/DaSaSo.ViewModel/Commands/SelectClientCommand.cs @@ -8,9 +8,9 @@ using System.Windows.Input; namespace DaSaSo.ViewModel.Commands { - public class SelectClientCommand : ICommand + public class SelectClientCommand : AsyncCommandBase { - public event EventHandler? CanExecuteChanged; + private readonly IActualProject _actualProject; private readonly ClientListViewModel _clientListViewModel; public SelectClientCommand(IActualProject actualProject, ClientListViewModel clientListViewModel) @@ -19,15 +19,11 @@ namespace DaSaSo.ViewModel.Commands _clientListViewModel = clientListViewModel; } - public bool CanExecute(object? parameter) - { - return true; - } - - public void Execute(object? parameter) + public override async Task ExecuteAsync(object? parameter) { var s = _clientListViewModel.SelectedClient; _actualProject.SetClient(s); } + } } diff --git a/DaSaSo.ViewModel/Commands/UpdateCurrentViewModelCommand.cs b/DaSaSo.ViewModel/Commands/UpdateCurrentViewModelCommand.cs index 5c55c34..e189ab5 100644 --- a/DaSaSo.ViewModel/Commands/UpdateCurrentViewModelCommand.cs +++ b/DaSaSo.ViewModel/Commands/UpdateCurrentViewModelCommand.cs @@ -4,9 +4,8 @@ using System.Windows.Input; namespace DaSaSo.ViewModel.Commands { - class UpdateCurrentViewModelCommand : ICommand + class UpdateCurrentViewModelCommand : AsyncCommandBase { - public event EventHandler? CanExecuteChanged; private INavigator _navigator; private readonly IViewModelAbstractFactory _viewModelFactory; @@ -16,12 +15,9 @@ namespace DaSaSo.ViewModel.Commands _viewModelFactory = viewModelFactory; } - public bool CanExecute(object? parameter) - { - return true; - } + - public void Execute(object? parameter) + public override async Task ExecuteAsync(object? parameter) { if(parameter is EViewType) { diff --git a/DaSaSo.ViewModel/Factories/ViewModelAbstractFactory.cs b/DaSaSo.ViewModel/Factories/ViewModelAbstractFactory.cs index 666d6d2..f4945c2 100644 --- a/DaSaSo.ViewModel/Factories/ViewModelAbstractFactory.cs +++ b/DaSaSo.ViewModel/Factories/ViewModelAbstractFactory.cs @@ -20,15 +20,15 @@ namespace DaSaSo.ViewModel.Factories public ViewModelAbstractFactory( CreateViewModel createHomeViewModel, - CreateViewModel createClientListViewModel/*, + CreateViewModel createClientListViewModel, CreateViewModel createClientEditViewModel, - CreateViewModel createProjektListViewModel*/ + CreateViewModel createProjektListViewModel ) { _createHomeViewModel = createHomeViewModel; _createClientListViewModel = createClientListViewModel; - /*_createClientEditViewModel = createClientEditViewModel; - _createProjektListViewModel = createProjektListViewModel;*/ + _createClientEditViewModel = createClientEditViewModel; + _createProjektListViewModel = createProjektListViewModel; } public BaseViewModel CreateViewModel(EViewType viewType) @@ -50,7 +50,7 @@ namespace DaSaSo.ViewModel.Factories break; */ default: - throw new ArgumentException("The Viewtype dos not have a ViewModel.", "viewType"); + throw new ArgumentException("The Viewtype does not have a ViewModel.", "viewType"); } } } diff --git a/DaSaSo.ViewModel/ProjectListViewModel.cs b/DaSaSo.ViewModel/ProjectListViewModel.cs index e3205dc..39ac930 100644 --- a/DaSaSo.ViewModel/ProjectListViewModel.cs +++ b/DaSaSo.ViewModel/ProjectListViewModel.cs @@ -1,9 +1,11 @@ using DaSaSo.Domain.Model; +using DaSaSo.Domain.Services; using DaSaSo.EntityFramework.Services; using DaSaSo.ViewModel.Interface; using System; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -12,25 +14,27 @@ namespace DaSaSo.ViewModel { public class ProjectListViewModel : BaseViewModel { - private GenericDataService genericDataService; + private ProjectDataService genericDataService; private IActualProject actualProject; private IRenavigator renavigator; public ObservableCollection Projekte { get; } - public ProjectListViewModel(GenericDataService genericDataService, IActualProject actualProject, IRenavigator renavigator) + public ProjectListViewModel(IDataService genericDataService, IActualProject actualProject, IRenavigator renavigator) { Projekte = new ObservableCollection(); - this.genericDataService = genericDataService; + + this.genericDataService = (genericDataService as ProjectDataService); this.actualProject = actualProject; this.renavigator = renavigator; + LoadProjecte(); } public async void LoadProjecte() { - - var projekte = await genericDataService.GetAll(); + + var projekte = await genericDataService.GetAllByClient(actualProject.AktuellClient); // InitCollection(Projekte, projekte); diff --git a/DaSaSo.ViewModel/Window/MainWindowViewModel.cs b/DaSaSo.ViewModel/Window/MainWindowViewModel.cs index ed28e8d..2f96427 100644 --- a/DaSaSo.ViewModel/Window/MainWindowViewModel.cs +++ b/DaSaSo.ViewModel/Window/MainWindowViewModel.cs @@ -23,6 +23,9 @@ namespace DaSaSo.ViewModel private string _clientname = ""; private string _projektname = ""; private string _buildingsitename = ""; + public bool CanSelectProject { get => _actualProject.AktuellClient != null; } + public bool CanSelectBuildingSite { get => _actualProject.AktuellProjekt != null; } + public bool CanSelectSewerObjects { get => _actualProject.AktuellBaustelle != null; } public INavigator Navigator { get; set; } public ICommand UpdateCurrentViewModelCommand { get; } @@ -80,16 +83,19 @@ namespace DaSaSo.ViewModel private void _actualProject_BuildingSiteChanged(object? sender, EventArgs e) { Buildingsitename = _actualProject.AktuellBaustelle.BuildingSiteNumber; + OnPropertyChanged(nameof(CanSelectSewerObjects)); } private void _actualProject_ProjectChanged(object? sender, EventArgs e) { Projektname = _actualProject.AktuellProjekt.Name; + OnPropertyChanged(nameof(CanSelectBuildingSite)); } private void _actualProject_ClientChanged(object? sender, EventArgs e) { ClientName = _actualProject.AktuellClient.Firstname; + OnPropertyChanged(nameof(CanSelectProject)); } } } diff --git a/DaSaSo.Wpf/App.xaml.cs b/DaSaSo.Wpf/App.xaml.cs index b581695..8aead5a 100644 --- a/DaSaSo.Wpf/App.xaml.cs +++ b/DaSaSo.Wpf/App.xaml.cs @@ -7,7 +7,9 @@ using DaSaSo.ViewModel.Factories; using DaSaSo.ViewModel.Interface; using DaSaSo.ViewModel.State.ActualState; using DaSaSo.ViewModel.State.Navigation; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using System; using System.Windows; @@ -18,17 +20,92 @@ namespace DaSaSo.Wpf /// public partial class App : Application { + private readonly IHost _host; + public App() + { + _host = CreateHostBuilder().Build(); + } + + public static IHostBuilder CreateHostBuilder(string[]? args = null) + { + return Host.CreateDefaultBuilder(args) + .ConfigureAppConfiguration(c=> + { + c.AddJsonFile("appsettings.json"); + c.AddEnvironmentVariables(); + }) + .ConfigureServices((context, services) => + { + + string connectionString = context.Configuration.GetConnectionString("default"); + + services.AddSingleton(new DaSaSoDbContextFactory(connectionString)); + services.AddSingleton, ClientDataService>(); + services.AddSingleton, ProjectDataService>(); + services.AddSingleton(); + + + + services.AddSingleton(); + services.AddSingleton>(services => + { + return () => new ClientEditViewModel( + services.GetRequiredService>(), + services.GetRequiredService(), + new ViewModelDelegateRenavigator( + services.GetRequiredService() + )); + }); + services.AddSingleton>(services => + { + return () => new HomeViewModel(); + }); + services.AddSingleton>(services => + { + return () => new ClientListViewModel( + services.GetRequiredService>(), + services.GetRequiredService(), + new ViewModelDelegateRenavigator( + services.GetRequiredService() + )); + }); + + services.AddSingleton>(services => + { + return () => new ProjectListViewModel( + services.GetRequiredService>(), + services.GetRequiredService(), + new ViewModelDelegateRenavigator( + services.GetRequiredService())); + }); + + //services.AddSingleton(); + services.AddScoped(); + services.AddScoped(); + + services.AddScoped(); + }); + } protected override void OnStartup(StartupEventArgs e) { Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException; AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; - IServiceProvider serviceProvider = CreateServiceProvider(); + + + _host.Start(); - MainWindow? window = new MainWindow() { DataContext = serviceProvider.GetRequiredService() }; + MainWindow? window = new MainWindow() { DataContext = _host.Services.GetRequiredService() }; window.Show(); base.OnStartup(e); } + protected override async void OnExit(ExitEventArgs e) + { + _host.StopAsync(); + _host.Dispose(); + base.OnExit(e); + } + private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { try @@ -48,49 +125,5 @@ namespace DaSaSo.Wpf throw new NotImplementedException(); } - private IServiceProvider CreateServiceProvider() - { - IServiceCollection services = new ServiceCollection(); - - services.AddSingleton(); - services.AddSingleton, ClientDataService>(); - services.AddSingleton(); - - - - services.AddSingleton(); - services.AddSingleton>(services => - { - return () => new ClientEditViewModel( - services.GetRequiredService>(), - services.GetRequiredService(), - new ViewModelDelegateRenavigator( - services.GetRequiredService() - )); - }); - services.AddSingleton>(services => - { - return () => new HomeViewModel(); - }); - services.AddSingleton>(services => - { - return () => new ClientListViewModel( - services.GetRequiredService>(), - services.GetRequiredService(), - new ViewModelDelegateRenavigator( - services.GetRequiredService() - )); - }); - - - //services.AddSingleton(); - services.AddScoped(); - services.AddScoped(); - - services.AddScoped(); - - - return services.BuildServiceProvider(); - } } } diff --git a/DaSaSo.Wpf/Controls/NavigationBar.xaml b/DaSaSo.Wpf/Controls/NavigationBar.xaml index fa79b02..661e152 100644 --- a/DaSaSo.Wpf/Controls/NavigationBar.xaml +++ b/DaSaSo.Wpf/Controls/NavigationBar.xaml @@ -4,7 +4,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:DaSaSo.Wpf.Controls" - xmlns:nav="clr-namespace:DaSaSo.ViewModel.Enums;assembly=DaSaSo.ViewModel" + xmlns:nav="clr-namespace:DaSaSo.ViewModel.Enums;assembly=DaSaSo.ViewModel" xmlns:viewmodel="clr-namespace:DaSaSo.ViewModel;assembly=DaSaSo.ViewModel" d:DataContext="{d:DesignInstance Type=viewmodel:MainWindowViewModel}" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> @@ -14,9 +14,9 @@ - - - - + + + + diff --git a/DaSaSo.Wpf/DaSaSo.Wpf.csproj b/DaSaSo.Wpf/DaSaSo.Wpf.csproj index 54a9009..5215f87 100644 --- a/DaSaSo.Wpf/DaSaSo.Wpf.csproj +++ b/DaSaSo.Wpf/DaSaSo.Wpf.csproj @@ -7,9 +7,19 @@ true + + + + + + + PreserveNewest + + + diff --git a/DaSaSo.Wpf/appsettings.json b/DaSaSo.Wpf/appsettings.json new file mode 100644 index 0000000..d94c1eb --- /dev/null +++ b/DaSaSo.Wpf/appsettings.json @@ -0,0 +1,5 @@ +{ + "ConnectionStrings": { + "default": "Host = localhoste; Database = dasaso; Username = kansan; Password = kansan" + } +} \ No newline at end of file