| | 1 | | @namespace Syki.Front.Pages.Student |
| | 2 | |
|
| | 3 | | <MudContainer Class="my-4 px-0"> |
| | 4 | | <style>.mud-table-toolbar { height: auto }</style> |
| | 5 | | <MudDataGrid |
| | 6 | | T="StudentClassActivityOut" |
| | 7 | | Class="pa-4 mt-4" |
| | 8 | | Items="@GetActivities()" |
| | 9 | | Hover="true" |
| | 10 | | Dense="true" |
| | 11 | | Loading="@_loading" |
| | 12 | | SortMode="@SortMode.None" |
| | 13 | | RowsPerPage="100" |
| | 14 | | > |
| | 15 | | <ToolBarContent> |
| | 16 | | <MudGrid Class="align-center mb-1" Spacing="3"> |
| | 17 | | <MudItem xs="12" sm="3" md="3" lg="3"> |
| | 18 | | <MudStack Row="true" AlignItems="AlignItems.Center" Spacing="3" Style="width: 100%;"> |
| | 19 | | <MudToggleGroup T="ClassNoteType" SelectionMode="SelectionMode.MultiSelection" Values="@_notesFi |
| | 20 | | <MudToggleItem Value="@(ClassNoteType.N1)" UnselectedIcon="@Icons.Material.Filled.CheckBoxOu |
| | 21 | | <MudToggleItem Value="@(ClassNoteType.N2)" UnselectedIcon="@Icons.Material.Filled.CheckBoxOu |
| | 22 | | <MudToggleItem Value="@(ClassNoteType.N3)" UnselectedIcon="@Icons.Material.Filled.CheckBoxOu |
| | 23 | | </MudToggleGroup> |
| | 24 | | </MudStack> |
| | 25 | | </MudItem> |
| | 26 | | <MudItem xs="12" sm="9" md="9" lg="9" Class="d-flex justify-end"> |
| | 27 | | <MudStack Row> |
| 0 | 28 | | @if (_notesFilter.Contains(ClassNoteType.N1)) |
| | 29 | | { |
| | 30 | | <MudChip T="string" Class="px-3 ma-0" Size="Size.Medium" Label="true"> |
| 0 | 31 | | <b>N1: @_class.N1.Format()</b> |
| | 32 | | </MudChip> |
| | 33 | | } |
| 0 | 34 | | @if (_notesFilter.Contains(ClassNoteType.N2)) |
| | 35 | | { |
| | 36 | | <MudChip T="string" Class="px-3 ma-0" Size="Size.Medium" Label="true"> |
| 0 | 37 | | <b>N2: @_class.N2.Format()</b> |
| | 38 | | </MudChip> |
| | 39 | | } |
| 0 | 40 | | @if (_notesFilter.Contains(ClassNoteType.N3)) |
| | 41 | | { |
| | 42 | | <MudChip T="string" Class="px-3 ma-0" Size="Size.Medium" Label="true"> |
| 0 | 43 | | <b>N3: @_class.N3.Format()</b> |
| | 44 | | </MudChip> |
| | 45 | | } |
| | 46 | | </MudStack> |
| | 47 | | </MudItem> |
| | 48 | | </MudGrid> |
| | 49 | | </ToolBarContent> |
| | 50 | | <Columns> |
| | 51 | | <PropertyColumn Property="x => x.Title" Title="Título" /> |
| | 52 | | <PropertyColumn Property="x => x.Type.GetDescription()" Title="Tipo" /> |
| | 53 | | <PropertyColumn Property="x => x.Value.Format()" Title="Pontuação" /> |
| | 54 | | <PropertyColumn Property="x => x.GetWeight()" Title="Peso" /> |
| | 55 | | <PropertyColumn Property="x => x.GetNote()" Title="Nota" /> |
| | 56 | | <PropertyColumn Property="x => x.GetDueDate()" Title="Data de entrega" /> |
| | 57 | | <TemplateColumn Title="Status"> |
| | 58 | | <CellTemplate> |
| | 59 | | <MudChip T="string" Label="true" Class="px-4 ma-0" Size="Size.Small" Color="@context.Item.GetColor() |
| 0 | 60 | | <b>@context.Item.WorkStatus.GetDescription()</b> |
| | 61 | | </MudChip> |
| | 62 | | </CellTemplate> |
| | 63 | | </TemplateColumn> |
| | 64 | | <TemplateColumn> |
| | 65 | | <CellTemplate> |
| 0 | 66 | | <MudIconButton Size="@Size.Small" Icon="@Icons.Material.Filled.RemoveRedEye" OnClick="@(() => GoToDe |
| | 67 | | </CellTemplate> |
| | 68 | | </TemplateColumn> |
| | 69 | | </Columns> |
| | 70 | | <NoRecordsContent> |
| 0 | 71 | | @(GetNotFoundMessage()) |
| | 72 | | </NoRecordsContent> |
| | 73 | | <PagerContent> |
| | 74 | | </PagerContent> |
| | 75 | | </MudDataGrid> |
| | 76 | | </MudContainer> |
| | 77 | |
|
| | 78 | | <MudContainer Class="my-4 px-0"> |
| | 79 | | <MudPaper Class="px-4 pt-4"> |
| 0 | 80 | | <ApexCharts.ApexChart @ref="@_chart" TItem="StudentClassActivityOut" Options="@_options" Height="@_height"> |
| 0 | 81 | | <ApexCharts.ApexPointSeries |
| 0 | 82 | | Name="Pontuação" |
| 0 | 83 | | TItem="StudentClassActivityOut" |
| 0 | 84 | | Items="@GetActivities()" |
| 0 | 85 | | SeriesType="ApexCharts.SeriesType.Bar" |
| 0 | 86 | | XValue="@(a => a.Title)" |
| 0 | 87 | | YValue="@(e => e.Value)" |
| | 88 | | ShowDataLabels/> |
| | 89 | | <ApexCharts.ApexPointSeries |
| | 90 | | Name="Pontuação ponderada" |
| | 91 | | TItem="StudentClassActivityOut" |
| | 92 | | Items="@GetActivities()" |
| | 93 | | SeriesType="ApexCharts.SeriesType.Bar" |
| 0 | 94 | | XValue="@(a => a.PonderedValueMessage())" |
| 0 | 95 | | YValue="@(e => e.PonderedValue)" |
| | 96 | | ShowDataLabels/> |
| | 97 | | </ApexCharts.ApexChart> |
| | 98 | | </MudPaper> |
| | 99 | | </MudContainer> |
| | 100 | |
|
| | 101 | | @inject NavigationManager Nav |
| | 102 | | @inject GetStudentClassClient GetStudentClassClient |
| | 103 | | @inject GetStudentClassActivitiesClient GetStudentClassActivitiesClient |
| | 104 | |
|
| | 105 | | @code |
| | 106 | | { |
| | 107 | | [Parameter] |
| 0 | 108 | | public Guid ClassId { get; set; } |
| | 109 | |
|
| | 110 | | private int _height; |
| | 111 | | private bool _loading; |
| 0 | 112 | | private StudentClassOut _class = new(); |
| | 113 | |
|
| 0 | 114 | | private List<StudentClassActivityOut> _activities = []; |
| 0 | 115 | | private IEnumerable<ClassNoteType> _notesFilter = [ClassNoteType.N1, ClassNoteType.N2, ClassNoteType.N3]; |
| | 116 | |
|
| | 117 | | private ApexCharts.ApexChart<StudentClassActivityOut> _chart; |
| 0 | 118 | | private ApexCharts.ApexChartOptions<StudentClassActivityOut> _options = new() |
| 0 | 119 | | { |
| 0 | 120 | | Chart = new ApexCharts.Chart |
| 0 | 121 | | { |
| 0 | 122 | | Toolbar = new ApexCharts.Toolbar { Show = false }, |
| 0 | 123 | | }, |
| 0 | 124 | | PlotOptions = new ApexCharts.PlotOptions |
| 0 | 125 | | { |
| 0 | 126 | | Bar = new ApexCharts.PlotOptionsBar { Horizontal = true } |
| 0 | 127 | | }, |
| 0 | 128 | | Yaxis = [ new ApexCharts.YAxis { Max = 10 } ] |
| 0 | 129 | | }; |
| | 130 | |
|
| | 131 | | protected override async Task OnParametersSetAsync() |
| | 132 | | { |
| 0 | 133 | | _loading = true; |
| 0 | 134 | | _class = await GetStudentClassClient.Get(ClassId); |
| 0 | 135 | | var response = await GetStudentClassActivitiesClient.Get(ClassId); |
| 0 | 136 | | if (response.IsSuccess) |
| | 137 | | { |
| 0 | 138 | | _activities = response.Success; |
| | 139 | | } |
| 0 | 140 | | await RenderChart(); |
| 0 | 141 | | _loading = false; |
| 0 | 142 | | } |
| | 143 | |
|
| | 144 | | private async Task RenderChart() |
| | 145 | | { |
| 0 | 146 | | _height = 100 + GetActivities().Count() * 60; |
| 0 | 147 | | StateHasChanged(); |
| 0 | 148 | | await _chart.RenderAsync(); |
| 0 | 149 | | } |
| | 150 | |
|
| | 151 | | private IEnumerable<StudentClassActivityOut> GetActivities() |
| | 152 | | { |
| 0 | 153 | | return _activities.Where(x => _notesFilter.Contains(x.Note)).ToList(); |
| | 154 | | } |
| | 155 | |
|
| | 156 | | private void GoToDetails(StudentClassActivityOut activity) |
| | 157 | | { |
| 0 | 158 | | Nav.NavigateTo($"student/classes/{activity.ClassId}/activities/{activity.Id}"); |
| 0 | 159 | | } |
| | 160 | |
|
| | 161 | | private async Task HandleNotesFilterChange(IEnumerable<ClassNoteType> newValues) |
| | 162 | | { |
| 0 | 163 | | if (!newValues.Any()) |
| | 164 | | { |
| 0 | 165 | | _notesFilter = _notesFilter.ToList(); |
| 0 | 166 | | return; |
| | 167 | | } |
| | 168 | |
|
| 0 | 169 | | _notesFilter = newValues; |
| 0 | 170 | | await RenderChart(); |
| 0 | 171 | | } |
| | 172 | |
|
| | 173 | | private string GetNotFoundMessage() |
| | 174 | | { |
| 0 | 175 | | return _notesFilter.Count() == 3 ? "Não existem atividades ainda." : "Nenhuma atividade encontrada."; |
| | 176 | | } |
| | 177 | | } |