Skip to content

Commit fec4b1e

Browse files
committed
feat: dashboard
1 parent 708961e commit fec4b1e

File tree

7 files changed

+944
-358
lines changed

7 files changed

+944
-358
lines changed

grade-management-new/GradeManagement.Client/Network/NetworkManager.cs

Lines changed: 842 additions & 288 deletions
Large diffs are not rendered by default.

grade-management-new/GradeManagement.Client/Pages/Main.razor

Lines changed: 96 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
@inject CourseClient CourseClient
77
@inject ExerciseClient ExerciseClient
88
@inject AssignmentClient AssignmentClient
9+
@inject DashboardClient DashboardClient
910
<PageTitle>AHK Review UI</PageTitle>
1011

1112
<style>
@@ -29,35 +30,60 @@
2930
<LoadingComponent LongTask="@Loading" @ref="loadingRef">
3031

3132
<MudStack Row="true" Class="mt-6">
32-
<MudSelect T="Course" Label="Course" @bind-Value="_selectedCourse" @bind-Value:after="CourseChanged"
33+
<MudSelect T="string" Label="Course" @bind-Value="_selectedCourse" @bind-Value:after="CourseChanged"
3334
Dense="true" Variant="Variant.Outlined" AnchorOrigin="Origin.BottomCenter"
3435
TransformOrigin="Origin.TopCenter">
3536
@foreach (var course in _courses ?? [])
3637
{
37-
<MudSelectItem Value="@course">@course.Name</MudSelectItem>
38+
<MudSelectItem Value="@course">@course</MudSelectItem>
3839
}
3940
</MudSelect>
4041
<MudSpacer/>
41-
<MudSelect T="Exercise" Label="Exercise" @bind-Value="_selectedTask" @bind-Value:after="ExerciseChanged"
42+
<MudSelect T="string" Label="Exercise" @bind-Value="_selectedExercise" @bind-Value:after="ExerciseChanged"
4243
Dense="true" Variant="Variant.Outlined" AnchorOrigin="Origin.BottomCenter"
4344
TransformOrigin="Origin.TopCenter">
4445
@foreach (var task in _tasks ?? [])
4546
{
46-
<MudSelectItem Value="@task">@task.Name</MudSelectItem>
47+
<MudSelectItem Value="@task">@task</MudSelectItem>
4748
}
4849
</MudSelect>
4950
<MudSpacer/>
5051

5152
<MudIconButton Icon="@Icons.Material.Filled.Download" Color="Color.Inherit" Edge="Edge.End" Size="Size.Large"/>
5253
</MudStack>
53-
<MudDataGrid Items="@_assignmentsData" T="Assignment" Class="custom-grid">
54+
<MudDataGrid Items="@_filteredData" T="Dashboard" Class="custom-grid">
5455
<Columns>
55-
<PropertyColumn Property="x => x.Id" Title="Id"/>
56-
<PropertyColumn Property="x => x.GithubRepoName" Title="Repository name"/>
57-
@* <PropertyColumn Property="x => x.Student.NeptunCode" Title="Neptun"/> *@
58-
@* <PropertyColumn Property="x => JoinPullRequests(x)" Title="PRs"/> *@
56+
<PropertyColumn Property="x => x.GithubRepoUrl" Title="Repo URL"/>
57+
<PropertyColumn Property="x => x.StudentNeptun" Title="Neptun"/>
58+
<TemplateColumn Title="PRs">
59+
<CellTemplate>
60+
<MudTooltip Text="@PrTooltip(context.Item)">
61+
@JoinPullRequests(context.Item)
62+
</MudTooltip>
63+
</CellTemplate>
64+
</TemplateColumn>
5965
@* <PropertyColumn Property="x => JoinCiWorkflows(x)" Title="Workflows"/> *@
60-
@* <PropertyColumn Property="x => JoinScore(x)" Title="Pontok"/> *@
66+
<PropertyColumn Property="x => JoinScore(x)" Title="Score"/>
67+
<TemplateColumn Title="" T="Dashboard">
68+
<CellTemplate>
69+
@if (MergedEntry(context.Item))
70+
{
71+
<MudIcon Icon="@Icons.Material.Filled.Verified" Color="Color.Success"/>
72+
}
73+
else if (CheckedEntry(context.Item))
74+
{
75+
<MudIcon Icon="@Icons.Material.Filled.Check" Color="Color.Success"/>
76+
}
77+
else if (CiRunOnEntry(context.Item))
78+
{
79+
<MudIcon Icon="@Icons.Material.Filled.Warning" Color="Color.Warning"/>
80+
}
81+
else
82+
{
83+
<MudIcon Icon="@Icons.Material.Filled.Warning" Color="Color.Error"/>
84+
}
85+
</CellTemplate>
86+
</TemplateColumn>
6187
</Columns>
6288
<PagerContent>
6389
<MudDataGridPager T="Assignment"/>
@@ -70,57 +96,84 @@
7096

7197
#region Data Grid helpers
7298

73-
// private string JoinPullRequests(Assignment data)
74-
// {
75-
// //Kéne menteni a branch nevét is?
76-
// return string.Join(", ", data.PullRequests.Select(x => x.Url));
77-
// }
78-
//
79-
// private string JoinCiWorkflows(Assignment data)
80-
// {
81-
// var filtered = data.AssignmentEvents?.Where(IsCicdWorkflow) ?? [];
82-
// var assignmentEvents = filtered as AssignmentEvent[] ?? filtered.ToArray();
83-
// string run = assignmentEvents.Length == 1 ? "run" : "runs";
84-
// return $"{assignmentEvents.Length} {run}, last: {assignmentEvents.LastOrDefault()?.Description}";
85-
// }
86-
//
87-
// private bool IsCicdWorkflow(AssignmentEvent data)
88-
// {
89-
// return true;
90-
// }
91-
//
92-
// private string JoinScore(Assignment data)
93-
// {
94-
// return string.Join(".", data.Scores.Select(x => x.Value));
95-
// }
99+
private string JoinPullRequests(Dashboard data)
100+
{
101+
//Kéne menteni a branch nevét is?
102+
return data.PullRequests?.FirstOrDefault()?.Url ?? "";
103+
}
104+
105+
private string PrTooltip(Dashboard data)
106+
{
107+
return data.PullRequests?.FirstOrDefault()?.OpeningDate.ToString() ?? "";
108+
}
109+
110+
private string JoinScore(Dashboard data)
111+
{
112+
return string.Join(", ", data.PullRequests?.FirstOrDefault()?.Scores.Select(x => x.Value) ?? []);
113+
}
114+
115+
private bool MergedEntry(Dashboard data)
116+
{
117+
return data.PullRequests?.FirstOrDefault()?.Status == PullRequestStatus.Merged;
118+
}
119+
120+
private bool CheckedEntry(Dashboard data)
121+
{
122+
var scores = data.PullRequests?.FirstOrDefault()?.Scores;
123+
return scores?.Count > 0 && scores.All(x => x.IsApproved);
124+
}
125+
126+
private bool CiRunOnEntry(Dashboard data)
127+
{
128+
return data.PullRequests?.FirstOrDefault()?.Scores.Count > 0;
129+
}
96130

97131
#endregion
132+
98133
//Van e assignolt teacher?
99134
//Mikor pontoztak? Tooltip
100135
//PR status - closed szűrve
101136
private LoadingComponent loadingRef;
102137

103138
private Subject? _selectedSubject = null;
104-
private Course? _selectedCourse = null;
105-
private Exercise? _selectedTask = null;
106-
private IEnumerable<Course>? _courses = new List<Course>();
107-
private IEnumerable<Exercise>? _tasks = new List<Exercise>();
108-
private IEnumerable<Assignment> _assignmentsData = new List<Assignment>();
139+
private string? _selectedCourse = null;
140+
private string? _selectedExercise = null;
141+
private IEnumerable<string>? _courses = new List<string>();
142+
private IEnumerable<string>? _tasks = new List<string>();
143+
private ICollection<Dashboard> _dashboardData = new List<Dashboard>();
144+
private ICollection<Dashboard> _filteredData = new List<Dashboard>();
109145

110146

111147
private async Task Loading()
112148
{
113149
_selectedSubject = SubjectService.CurrentSubject;
114-
_courses = await SubjectClient.GetAllCoursesByIdAsync(_selectedSubject.Id);
150+
_dashboardData = await DashboardClient.GetDashboardAsync(_selectedSubject.Id);
151+
_filteredData = _dashboardData.ToList();
152+
_courses = _dashboardData?.Select(x => x.CourseName).Distinct();
153+
_tasks = _dashboardData?.Select(x => x.ExerciseName).Distinct();
154+
}
155+
156+
private void CourseChanged()
157+
{
158+
_filteredData = _dashboardData.Where(x => (_selectedCourse == null || x.CourseName == _selectedCourse) && (_selectedExercise == null || x.ExerciseName == _selectedExercise)).ToList();
159+
_courses = _dashboardData?.Select(x => x.CourseName).Distinct();
160+
_tasks = _dashboardData?.Select(x => x.ExerciseName).Distinct();
161+
}
162+
163+
private void ExerciseChanged()
164+
{
165+
_filteredData = _dashboardData.Where(x => (_selectedCourse == null || x.CourseName == _selectedCourse) && (_selectedExercise == null || x.ExerciseName == _selectedExercise)).ToList();
166+
_courses = _dashboardData?.Select(x => x.CourseName).Distinct();
167+
_tasks = _dashboardData?.Select(x => x.ExerciseName).Distinct();
115168
}
116169

117-
private async Task CourseChanged()
170+
private void OnSubjectChanged()
118171
{
119-
_tasks = await CourseClient.GetAllExercisesByIdAsync(_selectedCourse.Id);
172+
loadingRef.StartLoading();
120173
}
121174

122-
private async Task ExerciseChanged()
175+
protected override void OnInitialized()
123176
{
124-
_assignmentsData = await ExerciseClient.GetAssignmentsByIdAsync(_selectedTask.Id);
177+
SubjectService.OnChange += OnSubjectChanged;
125178
}
126179
}

grade-management-new/GradeManagement.Client/Pages/Students.razor

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@
5858
private async Task DeleteItem(Student2 item)
5959
{
6060
//await StudentClient.DeleteAsync(item.Id);
61-
SnackbarService.ShowError("Delete not implemented!");
61+
//TODO: ppthez modositva
62+
SnackbarService.ShowDeleteError();
6263
await loadingRef.StartLoading();
6364
}
6465

grade-management-new/GradeManagement.Client/Pages/Teachers.razor

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
@inject UserClient UserClient
1111

1212
<LoadingComponent @ref="loadingComponentRef" LongTask="@_loading">
13+
<MudText>Teachers</MudText>
1314
<MudDataGrid T="User" Items="_teachers" EditMode="DataGridEditMode.Form" ReadOnly="false" CommittedItemChanges="@CommittedItemChanges">
1415
<Columns>
1516
<PropertyColumn Property="x => x.Id" Title="Id" IsEditable="false"/>

grade-management-new/GradeManagement.Client/Program.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ public static async Task Main(string[] args)
7474
new AssignmentClient(sp.GetRequiredService<IHttpClientFactory>().CreateClient(ServerApi)));
7575
builder.Services.AddScoped<StudentClient>(sp =>
7676
new StudentClient(sp.GetRequiredService<IHttpClientFactory>().CreateClient(ServerApi)));
77+
builder.Services.AddScoped<DashboardClient>(sp =>
78+
new DashboardClient(sp.GetRequiredService<IHttpClientFactory>().CreateClient(ServerApi)));
7779

7880

7981
builder.Services.AddMudServices();

grade-management-new/GradeManagement.Server/GradeManagement.Server.csproj

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,41 +9,18 @@
99
<ItemGroup>
1010
<PackageReference Include="AutoMapper" Version="13.0.1" />
1111
<PackageReference Include="AutSoft.Linq" Version="0.10.0" />
12-
<<<<<<< HEAD
13-
<PackageReference Include="CsvHelper" Version="32.0.1" />
12+
<PackageReference Include="CsvHelper" Version="32.0.3" />
1413
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.0" />
1514
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="8.0.0" />
16-
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.3" />
17-
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.3" />
18-
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.3">
19-
<PrivateAssets>all</PrivateAssets>
20-
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
21-
</PackageReference>
22-
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.3" />
23-
<PackageReference Include="Microsoft.Identity.Web" Version="2.16.0" />
24-
<PackageReference Include="Microsoft.Identity.Web.UI" Version="2.16.0" />
25-
<PackageReference Include="NSwag.AspNetCore" Version="14.0.4" />
26-
=======
27-
<PackageReference Include="CsvHelper" Version="32.0.3" />
2815
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.5" />
2916
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.5" />
3017
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.5">
3118
<PrivateAssets>all</PrivateAssets>
3219
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
3320
</PackageReference>
3421
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.5" />
35-
<PackageReference Include="NSwag.AspNetCore" Version="14.0.7" />
36-
>>>>>>> refs/heads/dev-apilayer2
37-
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.0" />
38-
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="8.0.0" />
39-
<PackageReference Include="CsvHelper" Version="32.0.3" />
40-
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.5" />
41-
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.5" />
42-
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.5"/>
43-
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.3" />
4422
<PackageReference Include="Microsoft.Identity.Web" Version="2.16.0" />
4523
<PackageReference Include="Microsoft.Identity.Web.UI" Version="2.16.0" />
46-
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.5" />
4724
<PackageReference Include="NSwag.AspNetCore" Version="14.0.7" />
4825
</ItemGroup>
4926

grade-management-new/GradeManagement.Server/Program.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
using AutSoft.Common.Exceptions;
2-
using GradeManagement.Data.Data;
31
using GradeManagement.Bll;
42
using GradeManagement.Bll.Profiles;
53
using GradeManagement.Data;

0 commit comments

Comments
 (0)