Skip to content

Commit

Permalink
Merge pull request #42 from Drogecode/#25-group-default-rooster
Browse files Browse the repository at this point in the history
#25 group default rooster
  • Loading branch information
TDroogers authored Sep 17, 2023
2 parents e825dc5 + e09f517 commit 281a590
Show file tree
Hide file tree
Showing 29 changed files with 2,535 additions and 66 deletions.
16 changes: 8 additions & 8 deletions src/Client/Drogecode.Knrm.Oefenrooster.Client.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,21 @@
<ItemGroup>
<PackageReference Include="Blazored.LocalStorage" Version="4.4.0" />
<PackageReference Include="Blazored.SessionStorage" Version="2.4.0" />
<PackageReference Include="CodeBeam.MudBlazor.Extensions" Version="6.5.9" />
<PackageReference Include="CodeBeam.MudBlazor.Extensions" Version="6.5.10" />
<PackageReference Include="Heron.MudCalendar" Version="1.0.10" />
<PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="7.0.10" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="7.0.10" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="7.0.10" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="7.0.10" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="7.0.10" />
<PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="7.0.11" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="7.0.11" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" Version="7.0.11" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="7.0.11" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="7.0.11" />
<PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="7.0.10" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="7.0.11" />
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="7.0.0" />
<PackageReference Include="Microsoft.TypeScript.MSBuild" Version="5.2.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="MudBlazor" Version="6.9.0" />
<PackageReference Include="MudBlazor" Version="6.10.0" />
</ItemGroup>

<ItemGroup>
Expand Down
15 changes: 15 additions & 0 deletions src/Client/Pages/Configuration/Global.razor
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,21 @@ else if (_specialDatesUpdated == false)

@if (_users != null && _functions != null)
{

<MudPaper>
<MudList Clickable="false">
<MudText>vijf meest recente logins maximaal 7 dagen geleden</MudText>
@foreach (var user in _users.Where(x => x.LastLogin >= DateTime.Today.AddDays(-7)).OrderByDescending(x => x.LastLogin).Take(5))
{
<MudListItem>
<div class="flex space-x-4">
<div>@user.Name</div>
<DateToString ShowDate="true" ShowTime="true" DateTimeUtc="user.LastLogin" />
</div>
</MudListItem>
}
</MudList>
</MudPaper>
<MudPaper>
<MudList Clickable="false">
@foreach (var function in _functions.OrderBy(x => x.Order))
Expand Down
4 changes: 2 additions & 2 deletions src/Client/Pages/User/Components/DefaultDialog.razor
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
<MudSelectItem T="Availabilty?" Value="Availabilty.NotAvailable">@LApp["NotAvailable"]</MudSelectItem>
<MudSelectItem T="Availabilty?" Value="Availabilty.Maybe">@LApp["Maybe"]</MudSelectItem>
</MudSelect>
<MudDatePicker Label="@L["ValidFrom"]" @bind-Date="DefaultUserSchedule.ValidFromUser" Placeholder="Select Date" Disabled="@(DefaultUserSchedule.ValidFromUser?.InPast() ?? false)" />
<MudDatePicker Label="@L["ValidUntil"]" @bind-Date="DefaultUserSchedule.ValidUntilUser" Placeholder="Select Date" Disabled="@(DefaultUserSchedule.ValidUntilUser?.InPast() ?? false)" />
<MudDatePicker Label="@LApp["ValidFrom"]" @bind-Date="DefaultUserSchedule.ValidFromUser" Placeholder="Select Date" Disabled="@(DefaultUserSchedule.ValidFromUser?.InPast() ?? false)" />
<MudDatePicker Label="@LApp["ValidUntil"]" @bind-Date="DefaultUserSchedule.ValidUntilUser" Placeholder="Select Date" Disabled="@(DefaultUserSchedule.ValidUntilUser?.InPast() ?? false)" />
</MudForm>
}
</DialogContent>
Expand Down
4 changes: 2 additions & 2 deletions src/Client/Pages/User/Components/DefaultDialog.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace Drogecode.Knrm.Oefenrooster.Client.Pages.User.Components;

public sealed partial class DefaultDialog : IDisposable
{
[Inject] private IStringLocalizer<DefaultDialog> L { get; set; } = default!;
//[Inject] private IStringLocalizer<DefaultDialog> L { get; set; } = default!;
[Inject] private IStringLocalizer<App> LApp { get; set; } = default!;
[Inject] private DefaultScheduleRepository _defaultScheduleRepository { get; set; } = default!;
[CascadingParameter] MudDialogInstance MudDialog { get; set; } = default!;
Expand All @@ -24,7 +24,7 @@ public sealed partial class DefaultDialog : IDisposable
private DefaultUserSchedule? _originalDefaultUserSchedule = null;
private bool _success;
private string[] _errors = Array.Empty<string>();
void Cancel() => MudDialog.Cancel();
private void Cancel() => MudDialog.Cancel();
protected override async Task OnParametersSetAsync()
{
if (IsNew == true)
Expand Down
18 changes: 18 additions & 0 deletions src/Client/Pages/User/Components/GroupDialog.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
@using Drogecode.Knrm.Oefenrooster.Shared.Enums;
<MudDialog>
<DialogContent>
@if (DefaultGroup is not null)
{
<MudAlert Severity="Severity.Warning">@L["Warning changing period is not possible yet"]</MudAlert>
<MudForm @ref="_form" @bind-IsValid="@_success" @bind-Errors="@_errors">
<MudTextField T="string" Label="@L["Name"]" @bind-Value="DefaultGroup.Name" Placeholder="Give a name"></MudTextField>
<MudDatePicker Label="@LApp["ValidFrom"]" @bind-Date="DefaultGroup.ValidFrom" Placeholder="Select Date" Required Disabled="@(DefaultGroup.ValidFrom?.InPast() ?? false)" />
<MudDatePicker Label="@LApp["ValidUntil"]" @bind-Date="DefaultGroup.ValidUntil" Placeholder="Select Date" Required Disabled="@(DefaultGroup.ValidUntil?.InPast() ?? false)" />
</MudForm>
}
</DialogContent>
<DialogActions>
<MudButton OnClick="Cancel">@LApp["Cancel"]</MudButton>
<MudButton Color="Color.Primary" OnClick="Submit">@LApp["Submit"]</MudButton>
</DialogActions>
</MudDialog>
58 changes: 58 additions & 0 deletions src/Client/Pages/User/Components/GroupDialog.razor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
using Drogecode.Knrm.Oefenrooster.Client.Models;
using Drogecode.Knrm.Oefenrooster.Client.Repositories;
using Drogecode.Knrm.Oefenrooster.Shared.Models.DefaultSchedule;
using Microsoft.Extensions.Localization;
using System.Diagnostics.CodeAnalysis;

namespace Drogecode.Knrm.Oefenrooster.Client.Pages.User.Components;

public sealed partial class GroupDialog : IDisposable
{
[Inject] private IStringLocalizer<GroupDialog> L { get; set; } = default!;
[Inject] private IStringLocalizer<App> LApp { get; set; } = default!;
[Inject] private DefaultScheduleRepository _defaultScheduleRepository { get; set; } = default!;

[CascadingParameter] MudDialogInstance MudDialog { get; set; } = default!;
[Parameter] public DefaultGroup? DefaultGroup { get; set; }
[Parameter] public RefreshModel? Refresh { get; set; }
[Parameter] public bool? IsNew { get; set; }

[AllowNull] private MudForm _form;
private CancellationTokenSource _cls = new();
private bool _success;
private string[] _errors = Array.Empty<string>();
void Cancel() => MudDialog.Cancel();
protected override async Task OnParametersSetAsync()
{
if (IsNew == true || DefaultGroup is null)
{
DefaultGroup = new DefaultGroup();
}
if (DefaultGroup.ValidFrom == DateTime.MaxValue)
DefaultGroup.ValidFrom = null;
if (DefaultGroup.ValidFrom == DateTime.MaxValue)
DefaultGroup.ValidFrom = null;
}
private async Task Submit()
{
await _form.Validate();
if (DefaultGroup is null)
throw new ArgumentNullException("DefaultGroup");
var body = new DefaultGroup
{
Name = DefaultGroup.Name,
ValidFrom = DefaultGroup.ValidFrom!.Value.ToUniversalTime(),
ValidUntil = DefaultGroup.ValidUntil!.Value.ToUniversalTime(),
IsDefault = false
};
var result = await _defaultScheduleRepository.PutGroup(body, _cls.Token);
if (Refresh is not null)
await Refresh.CallRequestRefreshAsync();
MudDialog.Close(DialogResult.Ok(true));
}

public void Dispose()
{
_cls.Cancel();
}
}
9 changes: 5 additions & 4 deletions src/Client/Pages/User/Defaults.razor
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@

@if (_defaultGroups is not null)
{
<MudButton StartIcon="@Icons.Material.Filled.Add" OnClick="()=>{OpenGroupDialog(null, true);}">@L["Add new group"]</MudButton>
if (_defaultGroups.Count > 1)
{
<MudExpansionPanels>
@foreach (var group in _defaultGroups)
@foreach (var group in _defaultGroups.OrderByDescending(x => x.IsDefault).ThenBy(x => x.ValidFrom))
{
string groupName = GetGroupName(group);
<MudExpansionPanel Text='@($"{groupName} {group.ValidFrom} {LApp["till"]} {group.ValidUntil}")'>
string groupTitle = GetGroupTitle(group);
<MudExpansionPanel Text="@groupTitle" IsInitiallyExpanded="@group.IsDefault">
<DefaultPanel Group="@group" />
</MudExpansionPanel>
}
Expand All @@ -25,7 +26,7 @@
}
else
{
@L["No groups found :("]
@L["No groups found"]
}
}
else
Expand Down
22 changes: 19 additions & 3 deletions src/Client/Pages/User/Defaults.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public sealed partial class Defaults : IDisposable
{
[Inject] private IStringLocalizer<Defaults> L { get; set; } = default!;
[Inject] private IStringLocalizer<App> LApp { get; set; } = default!;
[Inject] private IDialogService _dialogProvider { get; set; } = default!;
[Inject] private DefaultScheduleRepository _defaultScheduleRepository { get; set; } = default!;
private RefreshModel _refreshModel = new();
private CancellationTokenSource _cls = new();
Expand All @@ -27,14 +28,29 @@ protected override async Task OnParametersSetAsync()
_refreshModel.RefreshRequestedAsync += RefreshMeAsync;
}

private string GetGroupName(DefaultGroup group)
private string GetGroupTitle(DefaultGroup group)
{
var groupName = group.Name;
if (group.IsDefault && string.IsNullOrEmpty(group.Name))
{
return L["Default group name"];
groupName = L["Default group name"];
}
return group.Name;
if (group.IsDefault)
return groupName;
return $"{groupName} {group.ValidFrom!.Value.ToLocalTime().ToShortDateString()} {LApp["till"]} {group.ValidUntil!.Value.ToLocalTime().ToShortDateString()}";
}

private void OpenGroupDialog(DefaultGroup? group, bool isNew)
{
var parameters = new DialogParameters<GroupDialog> {
{ x=>x.DefaultGroup, group},
{ x=> x.IsNew, isNew},
{ x=> x.Refresh, _refreshModel },
};
DialogOptions options = new DialogOptions() { MaxWidth = MaxWidth.Medium, FullWidth = true };
_dialogProvider.Show<GroupDialog>(L["Add group"], parameters, options);
}

private async Task RefreshMeAsync()
{
_defaultGroups = (await _defaultScheduleRepository.GetAllGroups(_cls.Token))?.OrderBy(x => x.ValidFrom).ToList();
Expand Down
6 changes: 6 additions & 0 deletions src/Client/Repositories/DefaultScheduleRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,10 @@ public DefaultScheduleRepository(IDefaultScheduleClient defaultScheduleClient, I
var result = await _defaultScheduleClient.PatchDefaultScheduleForUserAsync(body, clt);
return result.Patched;
}

public async Task<PutGroupResponse> PutGroup(DefaultGroup body, CancellationToken clt)
{
var result = await _defaultScheduleClient.PutGroupAsync(body, clt);
return result;
}
}
6 changes: 6 additions & 0 deletions src/Client/Resources/App.en-US.resx
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,12 @@
<data name="Tuesday" xml:space="preserve">
<value>Tuesday</value>
</data>
<data name="ValidFrom" xml:space="preserve">
<value>Valid from</value>
</data>
<data name="ValidUntil" xml:space="preserve">
<value>Valid until</value>
</data>
<data name="Wednesday" xml:space="preserve">
<value>Wednesday</value>
</data>
Expand Down
6 changes: 6 additions & 0 deletions src/Client/Resources/App.nl-NL.resx
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,12 @@
<data name="Tuesday" xml:space="preserve">
<value>Dinsdag</value>
</data>
<data name="ValidFrom" xml:space="preserve">
<value>Geldig vanaf</value>
</data>
<data name="ValidUntil" xml:space="preserve">
<value>Geldig tot en met</value>
</data>
<data name="Wednesday" xml:space="preserve">
<value>Woensdag</value>
</data>
Expand Down
126 changes: 126 additions & 0 deletions src/Client/Resources/Pages/User/Components/GroupDialog.en-US.resx
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Name" xml:space="preserve">
<value>Name</value>
</data>
<data name="Warning changing period is not possible yet" xml:space="preserve">
<value>Warning changing period is not possible (yet)!!</value>
</data>
</root>
Loading

0 comments on commit 281a590

Please sign in to comment.