diff --git a/src/JiraTimeBot.Core/Configuration/ISettingsManager.cs b/src/JiraTimeBot.Core/Configuration/ISettingsManager.cs index f896421..a4d1123 100644 --- a/src/JiraTimeBot.Core/Configuration/ISettingsManager.cs +++ b/src/JiraTimeBot.Core/Configuration/ISettingsManager.cs @@ -8,5 +8,6 @@ namespace JiraTimeBot.Core.Configuration Settings LoadAndCheck(Action settingsSource, Action errorMessageReporter); void Save(Settings settings); + bool SettingsIsValid(Settings settings, out string message); } } \ No newline at end of file diff --git a/src/JiraTimeBot.Core/Configuration/SettingsManager.cs b/src/JiraTimeBot.Core/Configuration/SettingsManager.cs index 2bb3b6b..f97acbc 100644 --- a/src/JiraTimeBot.Core/Configuration/SettingsManager.cs +++ b/src/JiraTimeBot.Core/Configuration/SettingsManager.cs @@ -79,7 +79,7 @@ namespace JiraTimeBot.Core.Configuration var settingsString = JsonConvert.SerializeObject(settings); File.WriteAllText(settingsPath, settingsString); } - private static bool SettingsIsValid(Settings settings, out string message) + public bool SettingsIsValid(Settings settings, out string message) { if (settings == null) { diff --git a/src/JiraTimeBot.Ui/App.xaml.cs b/src/JiraTimeBot.Ui/App.xaml.cs index 79ed404..28afc52 100644 --- a/src/JiraTimeBot.Ui/App.xaml.cs +++ b/src/JiraTimeBot.Ui/App.xaml.cs @@ -3,6 +3,10 @@ using JiraTimeBot.UI.Tray; using System; using System.Threading; using System.Windows; +using System.Windows.Navigation; +using JiraTimeBot.Core.Configuration; +using JiraTimeBot.Ui.ViewModels; + namespace JiraTimeBot.Ui { @@ -34,13 +38,45 @@ namespace JiraTimeBot.Ui protected override void OnStartup(StartupEventArgs e) { - var mainWindow = _container.Resolve(); - var nav = _container.Resolve(); + var settingsManager = _container.Resolve(); + var settings = settingsManager.Load(); + var scope = _container.BeginLifetimeScope("Started", + builder => + { + if (settings != null) + { + builder.RegisterInstance(settings); + } + else + { + builder.RegisterInstance(new Settings()); + } + }); + + var appViewModel = scope.Resolve(); + var mainWindow = scope.Resolve(); + if (settings == null) + { + var settingsViewModel = scope.Resolve(); + appViewModel.CurrentViewModel = settingsViewModel; + } + else + { + var mainViewModel = scope.Resolve(); + appViewModel.CurrentViewModel = mainViewModel; + } + - nav.NavigateToSettings(); + mainWindow.ShowActivated = true; mainWindow.Show(); base.OnStartup(e); } + + /// + protected override void OnLoadCompleted(NavigationEventArgs e) + { + base.OnLoadCompleted(e); + } } } diff --git a/src/JiraTimeBot.Ui/ApplicationNavigator.cs b/src/JiraTimeBot.Ui/ApplicationNavigator.cs index b350eee..9a8a673 100644 --- a/src/JiraTimeBot.Ui/ApplicationNavigator.cs +++ b/src/JiraTimeBot.Ui/ApplicationNavigator.cs @@ -1,11 +1,12 @@ -using JiraTimeBot.Ui.ViewModels; +using System; +using JiraTimeBot.Ui.ViewModels; namespace JiraTimeBot.Ui { public interface IRegisteredViewModels { - SettingsViewModel Settings { get; set; } - MainPageViewModel MainPage { get; set; } + Func Settings { get; set; } + Func MainPage { get; set; } } public class ApplicationNavigator : IApplicationNavigator @@ -22,12 +23,12 @@ namespace JiraTimeBot.Ui public void NavigateToMain() { - _applicationViewModel.CurrentViewModel = _viewModels.MainPage; + _applicationViewModel.CurrentViewModel = _viewModels.MainPage(); } public void NavigateToSettings() { - _applicationViewModel.CurrentViewModel = _viewModels.Settings; + _applicationViewModel.CurrentViewModel = _viewModels.Settings(); } } } \ No newline at end of file diff --git a/src/JiraTimeBot.Ui/Bootstrapper.cs b/src/JiraTimeBot.Ui/Bootstrapper.cs index 8ec15a3..89b7354 100644 --- a/src/JiraTimeBot.Ui/Bootstrapper.cs +++ b/src/JiraTimeBot.Ui/Bootstrapper.cs @@ -1,5 +1,6 @@ using Autofac; using Autofac.Extras.AggregateService; +using JiraTimeBot.Core.Configuration; using JiraTimeBot.Ui.Models; using JiraTimeBot.Ui.ViewModels; @@ -16,24 +17,29 @@ namespace JiraTimeBot.Ui var result = new MainWindow(); result.DataContext = c.Resolve(); return result; - }).SingleInstance(); + }).InstancePerLifetimeScope(); - builder.RegisterType().SingleInstance(); - builder.RegisterType().SingleInstance(); - builder.RegisterType().SingleInstance(); + builder.RegisterType().As(); + builder.RegisterType().InstancePerLifetimeScope(); + builder.RegisterType().InstancePerLifetimeScope(); + builder.RegisterType().InstancePerLifetimeScope(); - builder.RegisterType().SingleInstance(); - builder.RegisterType().SingleInstance(); - builder.RegisterType().SingleInstance(); + builder.RegisterType().InstancePerLifetimeScope(); + builder.RegisterType().InstancePerLifetimeScope(); + builder.RegisterType() + .InstancePerLifetimeScope(); - builder.RegisterType().SingleInstance(); - builder.RegisterType().SingleInstance(); + builder.RegisterType().InstancePerLifetimeScope(); + builder.RegisterType() + .AsSelf() + .As() + .InstancePerLifetimeScope(); builder.RegisterAggregateService(); builder.RegisterType() .As() - .SingleInstance(); + .InstancePerLifetimeScope(); var container = builder.Build(); diff --git a/src/JiraTimeBot.Ui/JiraTimeBot.Ui.csproj b/src/JiraTimeBot.Ui/JiraTimeBot.Ui.csproj index 1f96a78..72ed7d8 100644 --- a/src/JiraTimeBot.Ui/JiraTimeBot.Ui.csproj +++ b/src/JiraTimeBot.Ui/JiraTimeBot.Ui.csproj @@ -190,6 +190,10 @@ + + {35D8A11F-05F8-408D-A37D-0EECD96FA67A} + JiraTimeBot.Core + {f3b89316-c38c-4ce6-9d88-0b1373cfba1a} JiraTimeBot diff --git a/src/JiraTimeBot.Ui/Models/ApplicationModel.cs b/src/JiraTimeBot.Ui/Models/ApplicationModel.cs index dc77b1f..2d8a433 100644 --- a/src/JiraTimeBot.Ui/Models/ApplicationModel.cs +++ b/src/JiraTimeBot.Ui/Models/ApplicationModel.cs @@ -2,6 +2,9 @@ { public class ApplicationModel : IModel { - + /// + public ApplicationModel() + { + } } } \ No newline at end of file diff --git a/src/JiraTimeBot.Ui/Models/SettingsModel.cs b/src/JiraTimeBot.Ui/Models/SettingsModel.cs index dccec84..cecad41 100644 --- a/src/JiraTimeBot.Ui/Models/SettingsModel.cs +++ b/src/JiraTimeBot.Ui/Models/SettingsModel.cs @@ -1,7 +1,91 @@ -namespace JiraTimeBot.Ui.Models +using System; +using JiraTimeBot.Core.Configuration; + +namespace JiraTimeBot.Ui.Models { + //Proxy model of settings public class SettingsModel : IModel { - + private readonly Settings _settings; + + /// + public SettingsModel(Settings settings) + { + _settings = settings; + } + + public Settings Settings => _settings; + + public string JiraUrl + { + get => _settings.JiraUrl; + set => _settings.JiraUrl = value; + } + + public int MinuterPerWorkDay + { + get => _settings.MinuterPerWorkDay; + set => _settings.MinuterPerWorkDay = value; + } + + public TimeSpan ActivationTime + { + get => _settings.ActivationTime; + set => _settings.ActivationTime = value; + } + + public bool AddCommentsToWorklog + { + get => _settings.AddCommentsToWorklog; + set => _settings.AddCommentsToWorklog = value; + } + + public string JiraPassword + { + get => _settings.JiraPassword; + set => _settings.JiraPassword = value; + } + + public string JiraQuery + { + get => _settings.JiraPassword; + set => _settings.JiraQuery = value; + } + + public string JiraUserName + { + get => _settings.JiraUserName; + set => _settings.JiraUserName = value; + } + + public string MercurialAuthorEmail + { + get => _settings.MercurialAuthorEmail; + set => _settings.MercurialAuthorEmail = value; + } + + public string RepositoryPath + { + get => _settings.RepositoryPath; + set => _settings.RepositoryPath = value; + } + + public int RoundToMinutes + { + get => _settings.RoundToMinutes; + set => _settings.RoundToMinutes = value; + } + + public string TimeControlTask + { + get => _settings.TimeControlTask; + set => _settings.TimeControlTask = value; + } + + public WorkType WorkType + { + get => _settings.WorkType; + set => _settings.WorkType = value; + } } } \ No newline at end of file diff --git a/src/JiraTimeBot.Ui/ViewModels/MainPageViewModel.cs b/src/JiraTimeBot.Ui/ViewModels/MainPageViewModel.cs index 8377e6f..48580de 100644 --- a/src/JiraTimeBot.Ui/ViewModels/MainPageViewModel.cs +++ b/src/JiraTimeBot.Ui/ViewModels/MainPageViewModel.cs @@ -6,19 +6,53 @@ namespace JiraTimeBot.Ui.ViewModels { public class MainPageViewModel : ViewModelBase { - private readonly Func _navigator; + private readonly IApplicationNavigator _navigator; + private DateTime _selectedDate; - public MainPageViewModel(MainModel model, Func navigator) : base(model) + public MainPageViewModel(MainModel model, IApplicationNavigator navigator) : base(model) { _navigator = navigator; + SelectedDate = DateTime.Today; OpenSettingsCommand = new RelayCommand(NavigateToSettings); + SetTimeCommand = new RelayCommand(SetTime); + ShowMeetingInfoCommand = new RelayCommand(ShowMeeting); + CancelCommand = new RelayCommand(Cancel); + } + + private void Cancel() + { + } + + private void ShowMeeting() + { + } + + private void SetTime() + { + } public RelayCommand OpenSettingsCommand { get; set; } + public DateTime SelectedDate + { + get => _selectedDate; + set + { + _selectedDate = value; + OnPropertyChanged(); + } + } + + public RelayCommand SetTimeCommand { get; set; } + + public RelayCommand ShowMeetingInfoCommand { get; set; } + + public RelayCommand CancelCommand { get; set; } + private void NavigateToSettings() { - _navigator().NavigateToSettings(); + _navigator.NavigateToSettings(); } } } \ No newline at end of file diff --git a/src/JiraTimeBot.Ui/ViewModels/SettingsViewModel.cs b/src/JiraTimeBot.Ui/ViewModels/SettingsViewModel.cs index e239fdf..b136794 100644 --- a/src/JiraTimeBot.Ui/ViewModels/SettingsViewModel.cs +++ b/src/JiraTimeBot.Ui/ViewModels/SettingsViewModel.cs @@ -1,25 +1,75 @@ using Aeroclub.CL.ASIA.Application.UI.Wpf.Commands; using JiraTimeBot.Ui.Models; using System; +using System.Collections.ObjectModel; +using System.Linq; +using JiraTimeBot.Core.Configuration; namespace JiraTimeBot.Ui.ViewModels { public class SettingsViewModel : ViewModelBase { - private readonly Func _navigator; + private readonly ISettingsManager _settingsManager; + private readonly IHavePassword _passwordAccessor; + private readonly IApplicationNavigator _navigator; - public SettingsViewModel(SettingsModel model, Func navigator) : base(model) + public SettingsViewModel(SettingsModel model, + ISettingsManager settingsManager, + IHavePassword passwordAccessor, + IApplicationNavigator navigator) : base(model) { + _settingsManager = settingsManager; + _passwordAccessor = passwordAccessor; _navigator = navigator; SaveSettingsCommand = new RelayCommand(SaveSettings); + var workModes = Enum.GetValues(typeof(WorkType)); + WorkModes = new ObservableCollection(workModes.OfType()); } public RelayCommand SaveSettingsCommand { get; set; } + public ObservableCollection WorkModes { get; set; } + + public WorkType CurrentWorkType + { + get => Model.WorkType; + set + { + Model.WorkType = value; + OnPropertyChanged(); + } + } + + public string RepositoryPath + { + get => Model.RepositoryPath; + set + { + Model.RepositoryPath = value; + OnPropertyChanged(); + } + } + + public string JiraLogin + { + get => Model.JiraUserName; + set + { + Model.JiraUserName = value; + OnPropertyChanged(); + } + } + private void SaveSettings() { - //TODO: SaveSettingsHere - _navigator().NavigateToMain(); + if(!_settingsManager.SettingsIsValid(Model.Settings, out string msg)) + { + return; + } + + Model.JiraPassword = _passwordAccessor.GetPassword(); + _settingsManager.Save(Model.Settings); + _navigator.NavigateToMain(); } } } \ No newline at end of file diff --git a/src/JiraTimeBot.Ui/Views/MainPage.xaml b/src/JiraTimeBot.Ui/Views/MainPage.xaml index 983a2fd..10f1675 100644 --- a/src/JiraTimeBot.Ui/Views/MainPage.xaml +++ b/src/JiraTimeBot.Ui/Views/MainPage.xaml @@ -5,6 +5,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:JiraTimeBot.Ui" xmlns:viewModels="clr-namespace:JiraTimeBot.Ui.ViewModels" + xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" mc:Ignorable="d" d:DataContext="{d:DesignInstance viewModels:MainPageViewModel}" > @@ -24,16 +25,20 @@ Тестовый прогон -