From dd79b0e33313c0ef7ebfeb0e792f9f806719ec6d Mon Sep 17 00:00:00 2001 From: "t.ruspekhofer" Date: Sun, 13 Mar 2022 14:57:48 +0100 Subject: [PATCH] Added RaidTemplate sites --- Lieb/Data/RaidTemplateService.cs | 66 ++++- Lieb/Data/TimerService.cs | 2 +- Lieb/Pages/Raids/RaidEdit.razor | 31 +++ Lieb/Pages/Raids/RaidTemplateDetails.razor | 78 ++++++ .../Pages/Raids/RaidTemplateDetails.razor.css | 32 +++ Lieb/Pages/Raids/RaidTemplateEdit.razor | 254 ++++++++++++++++++ Lieb/Pages/Raids/RaidTemplateOverview.razor | 38 +++ 7 files changed, 499 insertions(+), 2 deletions(-) create mode 100644 Lieb/Pages/Raids/RaidTemplateDetails.razor create mode 100644 Lieb/Pages/Raids/RaidTemplateDetails.razor.css create mode 100644 Lieb/Pages/Raids/RaidTemplateEdit.razor create mode 100644 Lieb/Pages/Raids/RaidTemplateOverview.razor diff --git a/Lieb/Data/RaidTemplateService.cs b/Lieb/Data/RaidTemplateService.cs index b140c93..dec7523 100644 --- a/Lieb/Data/RaidTemplateService.cs +++ b/Lieb/Data/RaidTemplateService.cs @@ -22,7 +22,71 @@ namespace Lieb.Data .ToList(); } - public async Task CreateNewRaid(int raidTempalteId) + public RaidTemplate GetTemplate(int raidTemplateId) + { + using var context = _contextFactory.CreateDbContext(); + return context.RaidTemplates + .Include(r => r.Roles) + .Include(r => r.Reminders) + .FirstOrDefault(t => t.RaidTemplateId == raidTemplateId); + } + + public async Task AddOrEditTemplate(RaidTemplate template) + { + if (template != null) + { + using var context = _contextFactory.CreateDbContext(); + if (template.RaidTemplateId == 0) + { + context.RaidTemplates.Add(template); + await context.SaveChangesAsync(); + } + else + { + RaidTemplate raidToChange = await context.RaidTemplates + .Include(r => r.Roles) + .Include(r => r.Reminders) + .FirstOrDefaultAsync(r => r.RaidTemplateId == template.RaidTemplateId); + raidToChange.Title = template.Title; + raidToChange.Description = template.Description; + raidToChange.Organizer = template.Organizer; + raidToChange.Guild = template.Guild; + raidToChange.VoiceChat = template.VoiceChat; + raidToChange.RaidType = template.RaidType; + raidToChange.RequiredRole = template.RequiredRole; + raidToChange.DiscordChannelId = template.DiscordChannelId; + raidToChange.DiscordGuildId = template.DiscordGuildId; + raidToChange.StartTime = template.StartTime; + raidToChange.EndTime = template.EndTime; + raidToChange.FreeForAllTime = template.FreeForAllTime; + raidToChange.TimeZone = template.TimeZone; + raidToChange.Frequency = template.Frequency; + raidToChange.CreateDaysBefore = template.CreateDaysBefore; + + context.PlannedRaidRoles.RemoveRange(raidToChange.Roles); + context.RaidReminders.RemoveRange(raidToChange.Reminders); + raidToChange.Roles.Clear(); + raidToChange.Reminders.Clear(); + raidToChange.Roles = template.Roles; + raidToChange.Reminders = template.Reminders; + + await context.SaveChangesAsync(); + } + } + } + + public async Task DeleteTemplate(int raidTemplateId) + { + using var context = _contextFactory.CreateDbContext(); + RaidTemplate template = GetTemplate(raidTemplateId); + context.PlannedRaidRoles.RemoveRange(template.Roles); + context.RaidReminders.RemoveRange(template.Reminders); + await context.SaveChangesAsync(); + context.RaidTemplates.Remove(template); + await context.SaveChangesAsync(); + } + + public async Task CreateRaidFromTemplate(int raidTempalteId) { using var context = _contextFactory.CreateDbContext(); RaidTemplate? template = await context.RaidTemplates diff --git a/Lieb/Data/TimerService.cs b/Lieb/Data/TimerService.cs index 77d8eba..7010701 100644 --- a/Lieb/Data/TimerService.cs +++ b/Lieb/Data/TimerService.cs @@ -34,7 +34,7 @@ namespace Lieb.Data DateTime UTCStartTime = TimeZoneInfo.ConvertTimeToUtc(template.StartTime, timeZone); if(UTCStartTime.AddDays(-template.CreateDaysBefore).AddHours(1) < DateTime.UtcNow) { - raidTemplateService.CreateNewRaid(template.RaidTemplateId).Wait(); + raidTemplateService.CreateRaidFromTemplate(template.RaidTemplateId).Wait(); } } diff --git a/Lieb/Pages/Raids/RaidEdit.razor b/Lieb/Pages/Raids/RaidEdit.razor index 1ee6eef..2bdc9ca 100644 --- a/Lieb/Pages/Raids/RaidEdit.razor +++ b/Lieb/Pages/Raids/RaidEdit.razor @@ -1,9 +1,11 @@ @page "/raidedit" @page "/raidedit/{raidId}" @using Lieb.Data +@using Lieb.Models @using Lieb.Models.GuildWars2.Raid @using System.ComponentModel.DataAnnotations @inject RaidService RaidService +@inject UserService UserService @inject TimeZoneService TimeZoneService @inject NavigationManager NavigationManager @inject IJSRuntime JsRuntime @@ -60,6 +62,34 @@

+ +

+ +

+

+ +

+

+ +

+

@_template.Title
+ +
@_template.Description
+ +
+
+
Date
+

@_template.StartTime.ToLongDateString()

+
+
+
Time
+

from: @_template.StartTime.ToShortTimeString() to: @_template.EndTime.ToShortTimeString()

+
+
+
TimeZone
+

@_template.TimeZone

+
+
+ +
+
+
Organizer
+

@_template.Organizer

+
+
+
Guild
+

@_template.Guild

+
+
+
Voice chat
+

@_template.VoiceChat

+
+
+ + +
+ + + @foreach (var role in _template.Roles) + { + + + + } + +
@role.Name: @role.Description (@role.Spots)
+
+ + + + + + + +@code { + [Parameter] + public RaidTemplate _template { get; set; } + + protected override async Task OnParametersSetAsync() + { + } +} diff --git a/Lieb/Pages/Raids/RaidTemplateDetails.razor.css b/Lieb/Pages/Raids/RaidTemplateDetails.razor.css new file mode 100644 index 0000000..715cf48 --- /dev/null +++ b/Lieb/Pages/Raids/RaidTemplateDetails.razor.css @@ -0,0 +1,32 @@ +body { + background-color: rgb(38 38 38); + border-radius: 25px; + padding: 25px; + width: 700px; + /*width: fit-content;*/ + color: lightgray; +} + +h5 { + color: lightgrey; +} + +.times { + float: left; + display: inline; + width: 33%; + padding-top: 15px; +} + + +.details { + float: left; + display: inline; + width: 150px; + padding-top: 15px; +} + +table { + column-width: auto; + color: lightgray; +} \ No newline at end of file diff --git a/Lieb/Pages/Raids/RaidTemplateEdit.razor b/Lieb/Pages/Raids/RaidTemplateEdit.razor new file mode 100644 index 0000000..15858f4 --- /dev/null +++ b/Lieb/Pages/Raids/RaidTemplateEdit.razor @@ -0,0 +1,254 @@ +@page "/raidtemplateedit" +@page "/raidtemplateedit/{raidId}" +@using Lieb.Data +@using Lieb.Models +@using Lieb.Models.GuildWars2.Raid +@using System.ComponentModel.DataAnnotations +@inject RaidTemplateService RaidTemplateService +@inject UserService UserService +@inject TimeZoneService TimeZoneService +@inject NavigationManager NavigationManager +@inject IJSRuntime JsRuntime + + +

CreateRaid

+ + + + + @{ + bool _isEdit = _template.RaidTemplateId != 0; + } +

+ +

+

+ +

+

+ +

+ +

+ +

+ +

+ +

+

+ +

+

+ +

+ + +

+ +

+

+ +

+ +

+ +

+

+ +

+ +

+ +

+

+ +

+ + @if(_template.RaidType == RaidType.Planned) + { +

+ + + + + + + + + @foreach( PlannedRaidRole role in _template.Roles) + { + + + + + + + } +
SpotsRole nameDescription
+

+ } + + + + + +
+
+ +
+ +@code { + + [Parameter] + public string raidId { get; set; } + + public RaidTemplate _template; + + private string _errorMessage = string.Empty; + + private DateTimeOffset _raidDate = DateTime.Now.Date; + private DateTimeOffset _startTime; + private DateTimeOffset _endTime; + private DateTimeOffset _freeForAllDate = DateTime.Now.Date; + private DateTimeOffset _freeForAllTime; + private string _userTimeZone = string.Empty; + + + + protected override async Task OnInitializedAsync() + { + if(!string.IsNullOrEmpty(raidId) && int.TryParse(raidId, out int parsedId)) + { + _template = RaidTemplateService.GetTemplate(parsedId); + _startTime = _template.StartTime; + _endTime = _template.EndTime; + _raidDate = _startTime.Date; + _freeForAllTime = _template.FreeForAllTime; + _freeForAllDate = _freeForAllTime.Date; + } + else + { + _template = new RaidTemplate(); + } + _userTimeZone = await TimeZoneService.GetUserTimeZone(); + } + + async Task AddRoleClicked() + { + _template.Roles.Add(new PlannedRaidRole()); + } + + + async Task DeleteRoleClicked(PlannedRaidRole role) + { + _template.Roles.Remove(role); + } + + async Task DeleteRaidClicked() + { + bool confirmed = await JsRuntime.InvokeAsync("confirm", "Are you sure you want to delete the raid?"); + if (confirmed) + { + await RaidTemplateService.DeleteTemplate(_template.RaidTemplateId); + NavigationManager.NavigateTo("raidoverview"); + } + } + + private async Task HandleValidSubmit() + { + if(_template.RaidType != RaidType.Planned) + { + _template.Roles.Clear(); + _template.Roles.Add(new PlannedRaidRole() + { + Spots = 10, + Name = "Random", + Description = _template.RaidType.ToString() + }); + } + + if(_template.Roles.Count == 0) + { + _errorMessage = "Roles are needed for a raid."; + return; + } + + _template.TimeZone = await TimeZoneService.GetUserTimeZone(); + + _template.StartTime =_raidDate.Date + _startTime.TimeOfDay; + if(_startTime.TimeOfDay > _endTime.TimeOfDay) + { + _template.EndTime = _raidDate.Date + _endTime.TimeOfDay; + } + else + { + _template.EndTime = _raidDate.Date.AddDays(1) + _endTime.TimeOfDay; + } + _template.FreeForAllTime = _freeForAllDate.Date + _freeForAllTime.TimeOfDay; + + await RaidTemplateService.AddOrEditTemplate(_template); + NavigationManager.NavigateTo("raidoverview"); + } +} \ No newline at end of file diff --git a/Lieb/Pages/Raids/RaidTemplateOverview.razor b/Lieb/Pages/Raids/RaidTemplateOverview.razor new file mode 100644 index 0000000..d8795d6 --- /dev/null +++ b/Lieb/Pages/Raids/RaidTemplateOverview.razor @@ -0,0 +1,38 @@ +@page "/raidtemplateoverview" +@using Lieb.Data +@using System.Security.Claims +@using Lieb.Models +@using Lieb.Models.GuildWars2.Raid +@inject RaidService RaidService +@inject UserService UserService +@inject AuthenticationStateProvider AuthenticationStateProvider + + +

RaidTemplateOverview

+ + + + + + +@foreach (var raid in _raids.OrderBy(r => r.StartTimeUTC)) +{ +
+ +} + + + +@code +{ + private List _raids; + + protected override async Task OnInitializedAsync() + { + _raids = RaidService.GetRaids(); + } +}