diff --git a/Lieb/Data/DbInitializer.cs b/Lieb/Data/DbInitializer.cs index e8b974d..174ae47 100644 --- a/Lieb/Data/DbInitializer.cs +++ b/Lieb/Data/DbInitializer.cs @@ -38,7 +38,7 @@ namespace Lieb.Data var users = new LiebUser[] { - new LiebUser{DiscordUserId=194863625477816321, Name="Sarah", Birthday=DateTime.Parse("1992-01-15"), GuildWars2Accounts = new List(){ linaith} }, + new LiebUser{DiscordUserId=194863625477816321, Name="Sarah", Birthday=DateTime.Parse("1992-01-15"), GuildWars2Accounts = new List(){ linaith, sarah} }, new LiebUser{DiscordUserId=1, Name="Lisa", GuildWars2Accounts = new List(){ hierpiepts}}, new LiebUser{DiscordUserId=2, Name="Simon", GuildWars2Accounts = new List(){ bloodseeker}} }; @@ -89,9 +89,10 @@ namespace Lieb.Data Description = "This is a test raid\nwith multiple lines?", Guild = "LIEB", Organizer = "Sarah", - RaidDuration = 2, RaidType = RaidType.RandomClasses, + Date = DateTime.Now.Date, StartTime = DateTime.Now, + EndTime = DateTime.Now.AddHours(2), VoiceChat = "ts.lieb.games", Roles = new [] { ele, scourge} }; diff --git a/Lieb/Data/RaidService.cs b/Lieb/Data/RaidService.cs index 6623ba8..eb239d5 100644 --- a/Lieb/Data/RaidService.cs +++ b/Lieb/Data/RaidService.cs @@ -44,16 +44,98 @@ namespace Lieb.Data .FirstOrDefault(r => r.RaidId == raidId); } - public async Task CreateRaid(Raid raid) + public async Task AddOrEditRaid(Raid raid) { - if (raid == null) + if (raid != null) { using var context = _contextFactory.CreateDbContext(); - context.Raids.Add(raid); - await context.SaveChangesAsync(); + if (raid.RaidId == 0) + { + context.Raids.Add(raid); + await context.SaveChangesAsync(); + } + else + { + Raid raidToChange = await context.Raids + .Include(r => r.Roles) + .Include(r => r.SignUpHistory) + .Include(r => r.Reminders) + .Include(r => r.SignUps) + .FirstOrDefaultAsync(r => r.RaidId == raid.RaidId); + raidToChange.Title = raid.Title; + raidToChange.Description = raid.Description; + raidToChange.Date = raid.Date; + raidToChange.StartTime = raid.StartTime; + raidToChange.EndTime = raid.EndTime; + raidToChange.Organizer = raid.Organizer; + raidToChange.Guild = raid.Guild; + raidToChange.VoiceChat = raid.VoiceChat; + raidToChange.RaidType = raid.RaidType; + raidToChange.Frequency = raid.Frequency; + raidToChange.DiscordMessageId = raid.DiscordMessageId; + raidToChange.DiscordChannelId = raid.DiscordChannelId; + raidToChange.DiscordGuildId = raid.DiscordGuildId; + + foreach(PlannedRaidRole role in raidToChange.Roles) + { + PlannedRaidRole? newRole = raid.Roles.FirstOrDefault(r => r.PlannedRaidRoleId == role.PlannedRaidRoleId); + if(newRole != null) + { + role.Spots = newRole.Spots; + role.Name = newRole.Name; + role.Description = newRole.Description; + } + else + { + raidToChange.Roles.Remove(role); + context.PlannedRaidRoles.Remove(role); + } + } + foreach (PlannedRaidRole role in raid.Roles.Where(r => r.PlannedRaidRoleId == 0)) + { + raidToChange.Roles.Add(role); + } + + foreach (RaidReminder reminder in raidToChange.Reminders) + { + RaidReminder? newReminder = raid.Reminders.FirstOrDefault(r => r.RaidReminderId == reminder.RaidReminderId); + if (newReminder != null) + { + reminder.Type = newReminder.Type; + reminder.Message = newReminder.Message; + reminder.HoursBeforeRaid = newReminder.HoursBeforeRaid; + reminder.ChannelId = newReminder.ChannelId; + reminder.Sent = newReminder.Sent; + } + else + { + raidToChange.Reminders.Remove(reminder); + context.RaidReminders.Remove(reminder); + } + } + foreach (PlannedRaidRole role in raid.Roles.Where(r => r.PlannedRaidRoleId == 0)) + { + raidToChange.Roles.Add(role); + } + + await context.SaveChangesAsync(); + } } } + public async Task DeleteRaid(int raidId) + { + using var context = _contextFactory.CreateDbContext(); + Raid raid = GetRaid(raidId); + context.RaidSignUps.RemoveRange(raid.SignUps); + context.PlannedRaidRoles.RemoveRange(raid.Roles); + context.SignUpHistories.RemoveRange(raid.SignUpHistory); + context.RaidReminders.RemoveRange(raid.Reminders); + await context.SaveChangesAsync(); + context.Raids.Remove(raid); + await context.SaveChangesAsync(); + } + public async Task SignUp(int raidId, int liebUserId, int guildWars2AccountId, int plannedRoleId, SignUpType signUpType) { if (!IsSignUpAllowed(liebUserId, plannedRoleId, signUpType)) diff --git a/Lieb/Models/GuildWars2/Raid/Raid.cs b/Lieb/Models/GuildWars2/Raid/Raid.cs index d833a73..e68d848 100644 --- a/Lieb/Models/GuildWars2/Raid/Raid.cs +++ b/Lieb/Models/GuildWars2/Raid/Raid.cs @@ -1,35 +1,48 @@ -namespace Lieb.Models.GuildWars2.Raid +using System.ComponentModel.DataAnnotations; + +namespace Lieb.Models.GuildWars2.Raid { public enum RaidType { - Planned = 1, - RandomWithBoons = 2, - RandomClasses = 3, - RandomEliteSpecialization = 4, + Planned = 0, + RandomWithBoons = 1, + RandomClasses = 2, + RandomEliteSpecialization = 3, } public class Raid { public int RaidId { get; private set; } + [Required] public string Title { get; set; } = String.Empty; + [Required] public string Description { get; set; } = String.Empty; - public DateTime StartTime { get; set; } + [Required] + public DateTime Date { get; set; } = DateTime.Now; - public double RaidDuration { get; set; } + [Required] + public DateTimeOffset StartTime { get; set; } + [Required] + public DateTimeOffset EndTime { get; set; } + + [Required] public string Organizer { get; set; } = String.Empty; + [Required] public string Guild { get; set; } = String.Empty; + [Required] public string VoiceChat { get; set; } = String.Empty; - public int Frequency { get; set; } - + [Required] public RaidType RaidType { get; set; } + public int Frequency { get; set; } + //role name, number of spots public ICollection Roles { get; set; } = new HashSet(); diff --git a/Lieb/Pages/Raids/RaidDetails.razor b/Lieb/Pages/Raids/RaidDetails.razor index cbbfae8..3dd96b7 100644 --- a/Lieb/Pages/Raids/RaidDetails.razor +++ b/Lieb/Pages/Raids/RaidDetails.razor @@ -13,11 +13,11 @@
Date
-

@Raid.StartTime.ToLongDateString()

+

@Raid.Date.ToLongDateString()

Time
-

from: @Raid.StartTime.ToShortTimeString() to: @Raid.StartTime.AddHours(@Raid.RaidDuration).ToShortTimeString()

+

from: @Raid.StartTime.LocalDateTime.ToShortTimeString() to: @Raid.EndTime.LocalDateTime.ToShortTimeString()

@@ -109,24 +109,42 @@ } - @foreach (var role in Raid.Roles) - { - Models.GuildWars2.Raid.RaidSignUp[] signUps = Raid.SignUps.Where(s => s.PlannedRaidRoleId == role.PlannedRaidRoleId).ToArray(); - int usedSpots = signUps.Where(s => s.SignUpType == SignUpType.SignedUp).Count(); - -
@role.Name: @role.Description (@usedSpots /@role.Spots)
- @foreach (var signUp in signUps) - { - if(signUp.SignUpType != SignUpType.SignedOff) - { - string signUpStatus = string.Empty; - if (signUp.SignUpType != SignUpType.SignedUp) signUpStatus = $" - {signUp.SignUpType}"; -
@signUp.LiebUser.Name (@signUp.GuildWars2Account.AccountName) @signUpStatus
- } - } - } +
+ + + @foreach (var role in Raid.Roles) + { + Models.GuildWars2.Raid.RaidSignUp[] signUps = Raid.SignUps.Where(s => s.PlannedRaidRoleId == role.PlannedRaidRoleId).ToArray(); + int usedSpots = signUps.Where(s => s.SignUpType == SignUpType.SignedUp).Count(); + + + + + @foreach (var signUp in signUps) + { + if(signUp.SignUpType != SignUpType.SignedOff) + { + string signUpStatus = string.Empty; + if (signUp.SignUpType != SignUpType.SignedUp) signUpStatus = $" - {signUp.SignUpType}"; + + + + } + } + } + +
@role.Name: @role.Description (@usedSpots /@role.Spots)
@signUp.LiebUser.Name (@signUp.GuildWars2Account.AccountName) @signUpStatus
+
+ + + @code { diff --git a/Lieb/Pages/Raids/RaidDetails.razor.css b/Lieb/Pages/Raids/RaidDetails.razor.css index 37e2da0..18a75a6 100644 --- a/Lieb/Pages/Raids/RaidDetails.razor.css +++ b/Lieb/Pages/Raids/RaidDetails.razor.css @@ -2,7 +2,8 @@ background-color: rgb(38 38 38); border-radius: 25px; padding: 25px; - width: fit-content; + width: 700px; + /*width: fit-content;*/ color: lightgray; } @@ -21,7 +22,7 @@ h5 { .details { float: left; display: inline; - width: 33%; + width: 150px; padding-top: 15px; } diff --git a/Lieb/Pages/Raids/RaidEdit.razor b/Lieb/Pages/Raids/RaidEdit.razor new file mode 100644 index 0000000..a1896db --- /dev/null +++ b/Lieb/Pages/Raids/RaidEdit.razor @@ -0,0 +1,175 @@ +@page "/raidedit" +@page "/raidedit/{raidId}" +@using Lieb.Data +@using Lieb.Models.GuildWars2.Raid +@using System.ComponentModel.DataAnnotations +@inject RaidService RaidService +@inject NavigationManager NavigationManager +@inject IJSRuntime JsRuntime + + +

CreateRaid

+ + + + + + @{ + bool _isEdit = _raid.RaidId != 0; + } +

+ +

+

+ +

+

+ +

+ +

+ +

+ +

+ +

+

+ +

+ +

+ +

+

+ +

+

+ +

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

+ + + + + + + + + @foreach( PlannedRaidRole role in _raid.Roles) + { + bool disableEdit = _raid.SignUps.Where(s => s.PlannedRaidRoleId == role.PlannedRaidRoleId).Any(); + + + + + @if(!disableEdit) + { + + } + + } +
SpotsRole nameDescription
+

+ } + + + +
+
+ +
+ +@code { + + [Parameter] + public string raidId { get; set; } + + public Raid _raid; + + + protected override async Task OnInitializedAsync() + { + if(!string.IsNullOrEmpty(raidId) && int.TryParse(raidId, out int parsedId)) + { + _raid = RaidService.GetRaid(parsedId); + } + else + { + _raid = new Raid(); + } + } + + async Task AddRoleClicked() + { + _raid.Roles.Add(new PlannedRaidRole()); + } + + + async Task DeleteRoleClicked(PlannedRaidRole role) + { + _raid.Roles.Remove(role); + } + + async Task DeleteRaidClicked() + { + bool confirmed = await JsRuntime.InvokeAsync("confirm", "Are you sure?"); + if (confirmed) + { + await RaidService.DeleteRaid(_raid.RaidId); + NavigationManager.NavigateTo("raidoverview"); + } + } + + private async Task HandleValidSubmit() + { + if(_raid.RaidType != RaidType.Planned && _raid.Roles.Count == 0) + { + _raid.Roles.Add(new PlannedRaidRole() + { + Spots = 10, + Name = "Random", + Description = _raid.RaidType.ToString() + }); + } + + await RaidService.AddOrEditRaid(_raid); + } +} \ No newline at end of file diff --git a/Lieb/Pages/Raids/RaidOverview.razor b/Lieb/Pages/Raids/RaidOverview.razor index 5b080a2..3aa48c5 100644 --- a/Lieb/Pages/Raids/RaidOverview.razor +++ b/Lieb/Pages/Raids/RaidOverview.razor @@ -5,14 +5,25 @@

RaidOverview

+ + + + + + @foreach (var raid in raids) { -

wupwup

+
} - @code { +@code +{ private List raids; protected override async Task OnInitializedAsync() diff --git a/Lieb/Program.cs b/Lieb/Program.cs index f321bcd..a9e6e94 100644 --- a/Lieb/Program.cs +++ b/Lieb/Program.cs @@ -8,10 +8,13 @@ var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorPages(); -//builder.Services.AddDbContext(options => -// options.UseSqlServer(builder.Configuration.GetConnectionString("LiebContext")), ServiceLifetime.Transient); +#if DEBUG +builder.Services.AddDbContextFactory(opt => + opt.UseSqlServer(builder.Configuration.GetConnectionString("LiebContext")).EnableSensitiveDataLogging(), ServiceLifetime.Transient); +#else builder.Services.AddDbContextFactory(opt => opt.UseSqlServer(builder.Configuration.GetConnectionString("LiebContext")), ServiceLifetime.Transient); +#endif builder.Services.AddDatabaseDeveloperPageExceptionFilter(); diff --git a/Lieb/Shared/MainLayout.razor b/Lieb/Shared/MainLayout.razor index e7728b0..efaa7b1 100644 --- a/Lieb/Shared/MainLayout.razor +++ b/Lieb/Shared/MainLayout.razor @@ -23,13 +23,6 @@ - -

You can only see this if you are loged in

-
- -

You can only see this if you satisfy the "Admin" policy.

-
-
@Body