diff --git a/.idea/.idea.presence/.idea/.gitignore b/.idea/.idea.presence/.idea/.gitignore new file mode 100644 index 0000000..0a0f6f6 --- /dev/null +++ b/.idea/.idea.presence/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/modules.xml +/contentModel.xml +/.idea.presence.iml +/projectSettingsUpdater.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.presence/.idea/avalonia.xml b/.idea/.idea.presence/.idea/avalonia.xml new file mode 100644 index 0000000..09200b8 --- /dev/null +++ b/.idea/.idea.presence/.idea/avalonia.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/.idea.presence/.idea/encodings.xml b/.idea/.idea.presence/.idea/encodings.xml new file mode 100644 index 0000000..df87cf9 --- /dev/null +++ b/.idea/.idea.presence/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.presence/.idea/indexLayout.xml b/.idea/.idea.presence/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.presence/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.presence/.idea/vcs.xml b/.idea/.idea.presence/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/.idea.presence/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Presence.Desktop/DI/ServiceColletionExtensions.cs b/Presence.Desktop/DI/ServiceColletionExtensions.cs index 195bfff..481aa11 100644 --- a/Presence.Desktop/DI/ServiceColletionExtensions.cs +++ b/Presence.Desktop/DI/ServiceColletionExtensions.cs @@ -21,8 +21,10 @@ using System.Threading.Tasks; .AddDbContext() .AddSingleton() .AddSingleton() + .AddTransient() .AddTransient() .AddTransient() + .AddTransient() .AddTransient(); } } diff --git a/Presence.Desktop/Models/PresencePresenter.cs b/Presence.Desktop/Models/PresencePresenter.cs index 9a3b930..e295cda 100644 --- a/Presence.Desktop/Models/PresencePresenter.cs +++ b/Presence.Desktop/Models/PresencePresenter.cs @@ -10,10 +10,13 @@ using System.Threading.Tasks; { public class PresencePresenter { - public int UserGuid { get; set; } + public Guid UserGuid { get; set; } public bool IsAttedance {get; set; } public DateOnly Date {get; set; } public int LessonNumber {get; set; } public UserPresenter? user { get; set; } + +//для будущего решения + public string AttendanceStatus { get; set; } } } \ No newline at end of file diff --git a/Presence.Desktop/ViewModels/PresenceViewModel.cs b/Presence.Desktop/ViewModels/PresenceViewModel.cs index 43d9d41..3df1888 100644 --- a/Presence.Desktop/ViewModels/PresenceViewModel.cs +++ b/Presence.Desktop/ViewModels/PresenceViewModel.cs @@ -1,24 +1,152 @@ +// using System.Reactive; +// using ReactiveUI; + +// namespace Presence.Desktop.ViewModels; + +// public class PresenceViewModel: ViewModelBase, IRoutableViewModel +// { +// public string? UrlPathSegment { get; } +// public IScreen HostScreen { get; } + +// public ReactiveCommand GoBackCommand { get; } + +// public PresenceViewModel(IScreen hostScreen) +// { +// HostScreen = hostScreen; + +// GoBackCommand = ReactiveCommand.Create(() => +// { +// HostScreen.Router.Navigate.Execute(new StartViewModel(HostScreen)); +// }); +// } +// } + +using System; using System.Reactive; using ReactiveUI; +using Demo.Domain.Models; +using Demo.Domain.UseCase; +using System.Collections.ObjectModel; +using Presence.Desktop.Models; -namespace Presence.Desktop.ViewModels; - -public class PresenceViewModel: ViewModelBase, IRoutableViewModel +namespace Presence.Desktop.ViewModels { - public string? UrlPathSegment { get; } - public IScreen HostScreen { get; } - - public ReactiveCommand GoBackCommand { get; } - - public PresenceViewModel(IScreen hostScreen) + public class PresenceViewModel : ViewModelBase, IRoutableViewModel { - HostScreen = hostScreen; + public string? UrlPathSegment { get; } + public IScreen HostScreen { get; } - GoBackCommand = ReactiveCommand.Create(() => + public ReactiveCommand GoBackCommand { get; } + public ReactiveCommand FilterAttendanceCommand { get; } + + public ObservableCollection AttendanceRecords { get; set; } = new(); + public ObservableCollection Groups { get; set; } = new(); + public ObservableCollection AttendanceTypes { get; set; } = new() { - HostScreen.Router.Navigate.Execute(new StartViewModel(HostScreen)); - }); - } -} + "Присутствовал", + "Отсутствовал", + }; - \ No newline at end of file + private Group? _selectedGroup; + public Group? SelectedGroup + { + get => _selectedGroup; + set + { + this.RaiseAndSetIfChanged(ref _selectedGroup, value); + FilterAttendanceRecords(); + } + } + + private DateTime? _selectedDate; + public DateTime? SelectedDate + { + get => _selectedDate; + set + { + this.RaiseAndSetIfChanged(ref _selectedDate, value); + FilterAttendanceRecords(); + } + } + + private readonly IGroupUseCase _groupUseCase; + private readonly IPresenceUseCase _presenceUseCase; + + public PresenceViewModel(IScreen hostScreen, IGroupUseCase groupUseCase, IPresenceUseCase presenceUseCase) + { + HostScreen = hostScreen; + _groupUseCase = groupUseCase; + _presenceUseCase = presenceUseCase; + + GoBackCommand = ReactiveCommand.Create(() => + { + HostScreen.Router.Navigate.Execute(new StartViewModel(HostScreen)); + }); + + FilterAttendanceCommand = ReactiveCommand.Create(FilterAttendanceRecords); + + LoadGroups(); + } + + private void LoadGroups() + { + Groups.Clear(); + var groups = _groupUseCase.GetAllGroups(); + foreach (var group in groups) + { + Groups.Add(group); + } + } + + private void FilterAttendanceRecords() + { + if (SelectedGroup == null || SelectedDate == null) + { + AttendanceRecords.Clear(); + return; + } + + var dateOnly = DateOnly.FromDateTime(SelectedDate.Value); + + var records = _presenceUseCase.GetPresenceByGroupByTime( + SelectedGroup.ID, + dateOnly); + + AttendanceRecords.Clear(); + foreach (var record in records) + { + // Преобразуем значение IsAttedance в строку прямо здесь + var attendanceStatus = record.IsAttedance ? "Был на уроке" : "Не был на уроке"; + + AttendanceRecords.Add(new PresencePresenter + { + UserGuid = record.User.Guid, + IsAttedance = record.IsAttedance, // оставляем bool в модели + Date = record.Date, + LessonNumber = record.LessonNumber, + user = new UserPresenter + { + Name = record.User.FIO, + Guid = record.User.Guid + }, + AttendanceStatus = attendanceStatus // добавляем строковое представление + }); + } + } + + // Новый метод для обработки изменения типа посещаемости + public void OnAttendanceTypeChanged(PresencePresenter presence, string newType) + { + presence.IsAttedance = newType == "Присутствовал"; + + if (_presenceUseCase.UpdateAttendance(presence.LessonNumber, presence.Date, presence.UserGuid, presence.IsAttedance)) + { + Console.WriteLine($"Изменен тип посещаемости для {presence.user.Name}: {newType}"); + } + else + { + Console.WriteLine($"Не удалось обновить тип посещаемости для {presence.user.Name}"); + } + } + } +} \ No newline at end of file diff --git a/Presence.Desktop/ViewModels/StartViewModel.cs b/Presence.Desktop/ViewModels/StartViewModel.cs index 59acc9b..fff4d35 100644 --- a/Presence.Desktop/ViewModels/StartViewModel.cs +++ b/Presence.Desktop/ViewModels/StartViewModel.cs @@ -30,7 +30,12 @@ namespace Presence.Desktop.ViewModels OpenPresenceCommand = ReactiveCommand.Create(() => { - HostScreen.Router.Navigate.Execute(new PresenceViewModel(HostScreen)); + // HostScreen.Router.Navigate.Execute(new PresenceViewModel(HostScreen)); + HostScreen.Router.Navigate.Execute(new PresenceViewModel( + HostScreen, + App.ServiceProvider.GetRequiredService(), + App.ServiceProvider.GetRequiredService() + )); }); GoBackCommand = ReactiveCommand.Create(() => diff --git a/Presence.Desktop/Views/PresenceView.axaml b/Presence.Desktop/Views/PresenceView.axaml index 78c3215..7cf5fb9 100644 --- a/Presence.Desktop/Views/PresenceView.axaml +++ b/Presence.Desktop/Views/PresenceView.axaml @@ -1,4 +1,4 @@ - + --> + + + +