diff --git a/source/EduCATS.iOS/packages.lock.json b/source/EduCATS.iOS/packages.lock.json index 784c10ce..6242fe76 100644 --- a/source/EduCATS.iOS/packages.lock.json +++ b/source/EduCATS.iOS/packages.lock.json @@ -291,6 +291,18 @@ "contentHash": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==" } }, + "Xamarin.iOS,Version=v1.0/win-arm64": { + "SkiaSharp": { + "type": "Transitive", + "resolved": "2.80.2", + "contentHash": "D25rzdCwh+3L+XyXqpNa+H/yiLJbE3/R3K/XexwHyQjGdzZvSufFW3oqf3En7hhqSIsxsJ8f5NEZ0J5W5wlGBg==" + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "WG3r7EyjUe9CMPFSs6bty5doUqT+q9pbI80hlNzo2SkPkZ4VTuZkGWjpp77JB8+uaL4DFPRdBsAY+DX3dBK92A==" + } + }, "Xamarin.iOS,Version=v1.0/win-x64": { "SkiaSharp": { "type": "Transitive", diff --git a/source/EduCATS/Controls/RoundedListView/RoundedListView.cs b/source/EduCATS/Controls/RoundedListView/RoundedListView.cs index e3c393c2..e87b00b8 100644 --- a/source/EduCATS/Controls/RoundedListView/RoundedListView.cs +++ b/source/EduCATS/Controls/RoundedListView/RoundedListView.cs @@ -3,6 +3,7 @@ using System.Runtime.CompilerServices; using EduCATS.Controls.RoundedListView.Selectors; using EduCATS.Helpers.Forms.Styles; +using EduCATS.Pages.Today.Base.Views.ViewCells; using EduCATS.Themes; using Nyxbull.Plugins.CrossLocalization; using Xamarin.Forms; @@ -55,7 +56,8 @@ public class RoundedListView : ListView double footerBottomPadding = 0, Func func = null) { - HasUnevenRows = true; + if (type == typeof(SubjectPageViewCell) || type == typeof(CalendarSubjectsViewCell)) HasUnevenRows = false; + else HasUnevenRows = true; ItemTemplate = func == null ? new RoundedListTemplateSelector(type, checkbox) : new RoundedListTemplateSelector(func, checkbox); @@ -142,6 +144,7 @@ Grid createFooterCap(double bottomPadding) }; var frame = new Frame { + Padding = new Thickness(0, 0, 0, bottomPadding), HasShadow = false, CornerRadius = (float)_capHeight, BackgroundColor = Color.FromHex(Theme.Current.RoundedListViewBackgroundColor) diff --git a/source/EduCATS/Pages/SaveLabsAndPracticeMarks/Views/SaveSingleStudentMarkPageView.cs b/source/EduCATS/Pages/SaveLabsAndPracticeMarks/Views/SaveSingleStudentMarkPageView.cs index 49ca2e8b..a50a3ac2 100644 --- a/source/EduCATS/Pages/SaveLabsAndPracticeMarks/Views/SaveSingleStudentMarkPageView.cs +++ b/source/EduCATS/Pages/SaveLabsAndPracticeMarks/Views/SaveSingleStudentMarkPageView.cs @@ -20,6 +20,7 @@ public class SaveSingleStudentMarkPageView : ContentPage const double _heightRequest = 40; static Thickness _padding = new Thickness(10, 1); + static Thickness _margin = new Thickness(0, 10); public List Marks = new List { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; public List NameOfLabOrPractice = new List(); public string _title { get; set; } @@ -56,10 +57,11 @@ public SaveSingleStudentMarkPageView(string title, string name, LabsVisitingList var inicials = new Label { VerticalOptions = LayoutOptions.CenterAndExpand, + Margin = _margin, HorizontalOptions = LayoutOptions.CenterAndExpand, TextColor = Color.FromHex(Theme.Current.StatisticsDetailsTitleColor), Style = AppStyles.GetLabelStyle(), - Font = Font.SystemFontOfSize(NamedSize.Large).WithSize(20).WithAttributes(FontAttributes.Bold), + Font = Font.SystemFontOfSize(NamedSize.Large).WithSize(20).WithAttributes(FontAttributes.None), Text = name, }; @@ -142,6 +144,20 @@ public SaveSingleStudentMarkPageView(string title, string name, LabsVisitingList commentEntry.SetBinding(Entry.TextProperty, "Comment"); + nameOfPrOrLb.PropertyChanged += delegate { + if (nameOfPrOrLb.SelectedItem is not null) + if (marks.Students.First(student => student.FullName == name).LabsMarks.First(labmarks => labmarks.LabId == prOrLabStat.Labs.First(lab => lab.ShortName == nameOfPrOrLb.SelectedItem as string).LabId).Mark != string.Empty) + { + markPicker.SelectedIndex = Convert.ToInt32(marks.Students.First(student => student.FullName == name).LabsMarks.First(labmarks => labmarks.LabId == prOrLabStat.Labs.First(lab => lab.ShortName == nameOfPrOrLb.SelectedItem as string).LabId).Mark) - 1; + commentEntry.Text = marks.Students.First(student => student.FullName == name).LabsMarks.First(labmarks => labmarks.LabId == prOrLabStat.Labs.First(lab => lab.ShortName == nameOfPrOrLb.SelectedItem as string).LabId).Comment; + } + else + { + markPicker.SelectedItem = null; + commentEntry.Text = string.Empty; + } + }; + var gridLayout = new Grid { BackgroundColor = Color.FromHex(Theme.Current.BaseBlockColor), diff --git a/source/EduCATS/Pages/SaveMarks/SavePractSingle.cs b/source/EduCATS/Pages/SaveMarks/SavePractSingle.cs index 2e034541..72b258d5 100644 --- a/source/EduCATS/Pages/SaveMarks/SavePractSingle.cs +++ b/source/EduCATS/Pages/SaveMarks/SavePractSingle.cs @@ -7,7 +7,7 @@ namespace EduCATS.Pages.SaveMarks { public class SavePractSingle { - [JsonProperty("comment")] + [JsonProperty("Comment")] public string Comment { get; set; } public string date { get; set; } public int id { get; set; } diff --git a/source/EduCATS/Pages/Statistics/Base/ViewModels/StatsPageViewModel.cs b/source/EduCATS/Pages/Statistics/Base/ViewModels/StatsPageViewModel.cs index a3c78568..0fab16ba 100644 --- a/source/EduCATS/Pages/Statistics/Base/ViewModels/StatsPageViewModel.cs +++ b/source/EduCATS/Pages/Statistics/Base/ViewModels/StatsPageViewModel.cs @@ -14,6 +14,7 @@ using EduCATS.Networking.Models.SaveMarks.LabSchedule; using EduCATS.Networking.Models.SaveMarks.Practicals; using EduCATS.Pages.Pickers; +using EduCATS.Pages.SaveMarks; using EduCATS.Pages.Statistics.Base.Models; using EduCATS.Pages.Statistics.Enums; using Nyxbull.Plugins.CrossLocalization; @@ -358,7 +359,8 @@ protected virtual async Task getAndSetStatistics() { try { - if (CurrentSubject != null) + if (CurrentSubject != null) + { if (_isStudent) { var studentsStatistics = await getStatistics(); @@ -373,19 +375,67 @@ protected virtual async Task getAndSetStatistics() s => s.StudentId == PlatformServices.Preferences.UserId); currentPractStudentStatistics = studentsPractStatistics.Students.SingleOrDefault( s => s.StudentId == PlatformServices.Preferences.UserId); - setChartData(currentStudentStatistics, currentTestStudentStatistics, currentPractStudentStatistics); + setChartData(currentStudentStatistics, studentTestStatistics, studentsPractStatistics); _studentsTest = studentTestStatistics; } else { - var labsTest = new LaboratoryWorksModel(); var currentStudentStatistics = new StatsStudentModel(); studentsStatistics = await getStatistics(); currentStudentStatistics = studentsStatistics.SingleOrDefault( s => s.StudentId == PlatformServices.Preferences.UserId); - setChartData(currentStudentStatistics, labsTest, currentPractStudentStatistics); + setChartData(currentStudentStatistics, new LabsVisitingList(), studentsPractStatistics); _students = studentsStatistics; } + } + else + { + var studentsStatistics = await getStatistics(); + + var groupsModel = new GroupsViewModel(new PlatformServices(), CurrentSubject.Id); + + await groupsModel.SetupGroups(); + + var currentStudentStatistics = new StatsStudentModel(); + + List averages = new(); + averages.Add(0); + averages.Add(0); + averages.Add(0); + + List avForGroup; + + int countOfGroups = 0; + + foreach (var group in (groupsModel.CurrentGroups)) + { + countOfGroups++; + var studentsPractStatistics = await DataAccess.GetTestPracticialStatistics(CurrentSubject.Id, group.GroupId); + + if (Servers.Current == Servers.EduCatsAddress) + { + var studentTestStatistics = await DataAccess.GetTestStatistics(CurrentSubject.Id, group.GroupId); + avForGroup = calculateChartData(currentStudentStatistics, studentTestStatistics, studentsPractStatistics, new(), new()); + averages[0] += avForGroup[0]; + averages[1] += avForGroup[1]; + averages[2] += avForGroup[2]; + } + else + { + studentsStatistics = await getStatistics(); + avForGroup = calculateChartData(currentStudentStatistics, new LabsVisitingList(), studentsPractStatistics, new(), new()); + averages[0] += avForGroup[0]; + averages[1] += avForGroup[1]; + averages[2] += avForGroup[2]; + } + } + + averages[0] /= countOfGroups; + averages[1] /= countOfGroups; + averages[2] /= countOfGroups; + + setChartData(currentStudentStatistics, new LabsVisitingList(), null, averages); + } } } catch (Exception ex) @@ -408,72 +458,141 @@ void executeExpandCommand() } } - void setChartData(StatsStudentModel stats, LaboratoryWorksModel currentPractStudentStatistics, LaboratoryWorksModel worksModel) + void setChartData(StatsStudentModel stats, LabsVisitingList studentsPractStatistics, LabsVisitingList studentTestStatistics, List averages = null) { - try { - double avgLabs = 0; - double avgTests = 0; - double avgPract = 0; + try { double rating = 0; if (stats == null) { stats = new StatsStudentModel(); - } + } - if (Servers.Current == Servers.EduCatsAddress) - { - avgPract = calculateAvgPractMarks(worksModel.PracticalsMarks); - AveragePract = avgPract.ToString(_doubleStringFormat, CultureInfo.InvariantCulture); - avgLabs = calculateAvgLabsMarkTest(currentPractStudentStatistics.LabsMarks); - AverageLabs = avgLabs.ToString(_doubleStringFormat, CultureInfo.InvariantCulture); + LaboratoryWorksModel currentPractStudentStatistics = null, worksModel = null; + + if (_isStudent) + { + averages = calculateChartData(stats, studentsPractStatistics, studentTestStatistics, currentPractStudentStatistics, worksModel); + } - if (currentPractStudentStatistics.TestMark != null) - avgTests = double.Parse(currentPractStudentStatistics.TestMark, CultureInfo.InvariantCulture); + AveragePract = averages[2].ToString(_doubleStringFormat, CultureInfo.InvariantCulture); + AverageLabs = averages[0].ToString(_doubleStringFormat, CultureInfo.InvariantCulture); + AverageTests = averages[1].ToString(_doubleStringFormat, CultureInfo.InvariantCulture); - AverageTests = avgTests.ToString(_doubleStringFormat, CultureInfo.InvariantCulture); + if (Servers.Current == Servers.EduCatsAddress) + { - if (worksModel.PracticalsMarks.Count == 0) + if (worksModel is not null && worksModel.PracticalsMarks.Count == 0 || worksModel is null && averages[2] == 0) { - rating = (avgLabs + avgTests) / 2; + rating = (averages[0] + averages[1]) / 2; Rating = rating.ToString(_doubleStringFormat, CultureInfo.InvariantCulture); ChartEntries = new List { - avgLabs, avgTests, rating, avgPract + averages[0], averages[1], rating, averages[2] }; - setNotEnoughDetails(avgLabs == 0 && avgTests == 0 && rating == 0); + setNotEnoughDetails(averages[0] == 0 && averages[1] == 0 && rating == 0); } else { - rating = (avgLabs + avgTests + avgPract) / 3; + rating = (averages[0] + averages[1] + averages[2]) / 3; Rating = rating.ToString(_doubleStringFormat, CultureInfo.InvariantCulture); ChartEntries = new List { - avgLabs, avgTests, rating, avgPract + averages[0], averages[1], rating, averages[2] }; - setNotEnoughDetails(avgLabs == 0 && avgTests == 0 && avgPract == 0 && rating == 0); + setNotEnoughDetails(averages[0] == 0 && averages[1] == 0 && averages[2] == 0 && rating == 0); } } else { - avgLabs = calculateAvgLabsMark(stats.MarkList); - AverageLabs = avgLabs.ToString(_doubleStringFormat, CultureInfo.InvariantCulture); - - if (stats.AverageTestMark != null) - avgTests = double.Parse(stats.AverageTestMark, CultureInfo.InvariantCulture); - - AverageTests = avgTests.ToString(_doubleStringFormat, CultureInfo.InvariantCulture); - - rating = (avgLabs + avgTests) / 2; + rating = (averages[0] + averages[1]) / 2; Rating = rating.ToString(_doubleStringFormat, CultureInfo.InvariantCulture); ChartEntries = new List { - avgLabs, avgTests, rating + averages[0], averages[1], rating }; - setNotEnoughDetails(avgLabs == 0 && avgTests == 0 && rating == 0); + setNotEnoughDetails(averages[0] == 0 && averages[1] == 0 && rating == 0); } + } catch (Exception ex) { AppLogs.Log(ex); } } + List calculateChartData(StatsStudentModel stats, LabsVisitingList studentsPractStatistics, LabsVisitingList studentTestStatistics, LaboratoryWorksModel currentPractStudentStatistics, LaboratoryWorksModel worksModel) + { + double avgLabs = 0; + double avgTests = 0; + double avgPract = 0; + + List averages = new(); + + if (_isStudent) + { + currentPractStudentStatistics = studentsPractStatistics.Students.SingleOrDefault( + s => s.StudentId == PlatformServices.Preferences.UserId); + worksModel = studentTestStatistics.Students.SingleOrDefault( + s => s.StudentId == PlatformServices.Preferences.UserId); + + if (Servers.Current == Servers.EduCatsAddress) + { + avgPract = calculateAvgPractMarks(worksModel.PracticalsMarks); + + avgLabs = calculateAvgLabsMarkTest(currentPractStudentStatistics.LabsMarks); + + if (currentPractStudentStatistics.TestMark != null) + avgTests = double.Parse(currentPractStudentStatistics.TestMark, CultureInfo.InvariantCulture); + } + else + { + avgLabs = calculateAvgLabsMark(stats.MarkList); + + if (stats.AverageTestMark != null) + avgTests = double.Parse(stats.AverageTestMark, CultureInfo.InvariantCulture); + } + } + else + { + if (Servers.Current == Servers.EduCatsAddress) + { + int countOfPractStudents = 0; + foreach (var student in studentTestStatistics.Students) + { + avgPract += calculateAvgPractMarks(student.PracticalsMarks); + countOfPractStudents++; + } + + avgPract /= countOfPractStudents; + + + + int countOfStudents = 0; + foreach (var student in studentsPractStatistics.Students) + { + avgLabs += calculateAvgLabsMarkTest(student.LabsMarks); + countOfStudents++; + + if (student.TestMark != null) + avgTests += double.Parse(student.TestMark, CultureInfo.InvariantCulture); + } + + avgLabs /= countOfStudents; + + avgTests /= countOfStudents; + } + else + { + avgLabs = calculateAvgLabsMark(stats.MarkList); + + if (stats.AverageTestMark != null) + avgTests = double.Parse(stats.AverageTestMark, CultureInfo.InvariantCulture); + } + } + + averages.Add(avgLabs); + averages.Add(avgTests); + averages.Add(avgPract); + + return averages; + } + double calculateAvgPractMarks(List practicalsMarks) { if (practicalsMarks == null) diff --git a/source/EduCATS/Pages/Statistics/Base/Views/StatsPageView.cs b/source/EduCATS/Pages/Statistics/Base/Views/StatsPageView.cs index d60c967d..0aa8cfc9 100644 --- a/source/EduCATS/Pages/Statistics/Base/Views/StatsPageView.cs +++ b/source/EduCATS/Pages/Statistics/Base/Views/StatsPageView.cs @@ -51,7 +51,7 @@ RoundedListView createRoundedList(View header) IsPullToRefreshEnabled = true }; - roundedListView.ItemTapped += (sender, e) => ((ListView)sender).SelectedItem = null; + //roundedListView.ItemTapped += (sender, e) => ((ListView)sender).SelectedItem = null; roundedListView.SetBinding(ListView.IsRefreshingProperty, "IsLoading"); roundedListView.SetBinding(ListView.RefreshCommandProperty, "RefreshCommand"); roundedListView.SetBinding(ListView.SelectedItemProperty, "SelectedItem"); @@ -63,7 +63,7 @@ StackLayout createHeaderView() { var subjectsView = new SubjectsPickerView(); var radarChartView = createFrameWithChartView(); - radarChartView.SetBinding(IsVisibleProperty, "IsStudent"); + //radarChartView.SetBinding(IsVisibleProperty, "IsStudent"); return new StackLayout { Padding = _headerPadding, diff --git a/source/EduCATS/Pages/Today/Base/ViewModels/TodayPageViewModel.cs b/source/EduCATS/Pages/Today/Base/ViewModels/TodayPageViewModel.cs index 283e9c2b..819a6cee 100644 --- a/source/EduCATS/Pages/Today/Base/ViewModels/TodayPageViewModel.cs +++ b/source/EduCATS/Pages/Today/Base/ViewModels/TodayPageViewModel.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; +using EduCATS.Controls.RoundedListView; using EduCATS.Data; using EduCATS.Data.Models; using EduCATS.Data.Models.Calendar; @@ -12,6 +13,7 @@ using EduCATS.Helpers.Forms; using EduCATS.Helpers.Logs; using EduCATS.Pages.Today.Base.Models; +using EduCATS.Pages.Today.Base.Views; using EduCATS.Themes; using Nyxbull.Plugins.CrossLocalization; using Xamarin.Forms; @@ -23,13 +25,15 @@ public class TodayPageViewModel : ViewModel readonly IPlatformServices _services; readonly double _subjectHeight; - readonly double _subjectsHeaderHeight; + readonly double _subjectsFooterHeight; + readonly double _subjectsHeaderHeight = 71; const int _minimumCalendarPosition = 0; const int _maximumCalendarPosition = 2; const double _subjectsHeightToAdd = 55; const double _emptySubjectsHeight = 110; + // bool _isCreation = true; bool _isManualSelectedCalendarDay; DateTime _manualSelectedCalendarDay; List _calendarSubjectsBackup; @@ -37,7 +41,7 @@ public class TodayPageViewModel : ViewModel public TodayPageViewModel(double subjectHeight, double subjectsHeaderHeight, IPlatformServices services) { _subjectHeight = subjectHeight; - _subjectsHeaderHeight = subjectsHeaderHeight; + _subjectsFooterHeight = subjectsHeaderHeight; _services = services; initSetup(); @@ -179,6 +183,7 @@ void update() IsNewsRefreshing = true; await getAndSetCalendarNotes(); await getAndSetNews(); + //_isCreation = false; IsNewsRefreshing = false; } catch (Exception ex) { AppLogs.Log(ex); @@ -505,8 +510,8 @@ void setupNewsSubjectsHeight() } CalendarSubjectsHeight = - (_subjectHeight * NewsSubjectList.Count * 2) + - (_subjectsHeaderHeight) + _subjectsHeightToAdd; + (_subjectHeight * (NewsSubjectList.Count) /** 2*/) + + _subjectsHeaderHeight + _subjectsFooterHeight + _subjectsHeightToAdd; } catch (Exception ex) { diff --git a/source/EduCATS/Pages/Today/Base/Views/TodayPageView.cs b/source/EduCATS/Pages/Today/Base/Views/TodayPageView.cs index 33a56cb8..1afc9a8c 100644 --- a/source/EduCATS/Pages/Today/Base/Views/TodayPageView.cs +++ b/source/EduCATS/Pages/Today/Base/Views/TodayPageView.cs @@ -20,11 +20,11 @@ public class TodayPageView : ContentPage const double _calendarDaysOfWeekCollectionHeight = 50; const string _calendarCollectionDataBinding = "."; - double _subjectRowHeight = 50; + double _subjectRowHeight = 80; double _subjectDetailedRowHeight = 80; static Thickness _newsLabelMagin = new Thickness(10); - static Thickness _subjectsMargin = new Thickness(10, 5); + static Thickness _subjectsMargin = new Thickness(10, 5, 10, 0); static Thickness _margin = new Thickness(0, 0, 0, 1); static Thickness _listMargin = new Thickness(0, 1, 0, 0); static Thickness _subjectsLabelMargin = new Thickness(0, 10, 10, 10); @@ -147,6 +147,7 @@ ListView createNewsList() newsListView.SetBinding(ItemsView.ItemsSourceProperty, "NewsList"); newsListView.SetBinding(ListView.SelectedItemProperty, "SelectedNewsItem"); newsListView.ItemSelected += (sender, e) => { ((ListView)sender).SelectedItem = null; }; + return newsListView; } @@ -189,6 +190,8 @@ ListView createSubjectsList() subjectsListView.SetBinding(ItemsView.ItemsSourceProperty, "CalendarSubjects"); } + + subjectsListView.SetBinding(HeightRequestProperty, "CalendarSubjectsHeight"); return subjectsListView; }