diff --git a/Core/Calculation/EventAssignment.cs b/Core/Calculation/EventAssignment.cs index fb24012..ba6bc68 100644 --- a/Core/Calculation/EventAssignment.cs +++ b/Core/Calculation/EventAssignment.cs @@ -311,8 +311,8 @@ namespace Core.Calculation //var teamsCount = (int)Math.Ceiling(teamDivs); var teamCount = (int)Math.Round(teamDivs); - if (teamCount > evt.MaxTeamCountState) - teamCount = evt.MaxTeamCountState; + if (teamCount > evt.ChapterEligibilityCountState) + teamCount = evt.ChapterEligibilityCountState; // limit to one team for group events if (_parameters.LimitTeamsToOne diff --git a/Core/Entities/EventDefinition.cs b/Core/Entities/EventDefinition.cs index 01ff23e..1a91735 100644 --- a/Core/Entities/EventDefinition.cs +++ b/Core/Entities/EventDefinition.cs @@ -9,8 +9,7 @@ public class EventDefinition [Required] [StringLength(100, MinimumLength = 2)] [Display(Name = "Event Name")] - - public string Name { get; set; } + public string Name { get; set; } [Required] [StringLength(40, MinimumLength = 2)] @@ -31,45 +30,53 @@ public class EventDefinition ? MinTeamSize.ToString() : $"{MinTeamSize.ToString()}-{MaxTeamSize.ToString()}"; + [StringLength(100, MinimumLength = 3)] public string? SemifinalistActivity { get; set; } public bool InterviewOrPresentation => SemifinalistActivity != null && (SemifinalistActivity.Contains("Interview") || SemifinalistActivity.Contains("Presentation")); - public bool OnSiteActivity - => SemifinalistActivity != null - && (SemifinalistActivity.Contains("Challenge") - || SemifinalistActivity.Contains("Race") - || SemifinalistActivity.Contains("Speech") - || SemifinalistActivity.Contains("Test") - || SemifinalistActivity.Contains("Flight") - || Name.Contains("Leadership") - || Name.Contains("Forensic") - || Name.Contains("Flight") - || Name.Contains("Coding") - || SemifinalistActivity.Contains("Debate") - || SemifinalistActivity.Contains("Photography") - || SemifinalistActivity.Contains("Build") - || Name.Contains("Chapter") - || Name.Contains("Podcast")); + public bool OnSiteActivity { get; set; } + //=> SemifinalistActivity != null + // && (SemifinalistActivity.Contains("Challenge") + // || SemifinalistActivity.Contains("Race") + // || SemifinalistActivity.Contains("Speech") + // || SemifinalistActivity.Contains("Test") + // || SemifinalistActivity.Contains("Flight") + // || Name.Contains("Leadership") + // || Name.Contains("Forensic") + // || Name.Contains("Flight") + // || Name.Contains("Coding") + // || SemifinalistActivity.Contains("Debate") + // || SemifinalistActivity.Contains("Photography") + // || SemifinalistActivity.Contains("Build") + // || Name.Contains("Chapter") + // || Name.Contains("Podcast")); + [StringLength(1024, MinimumLength = 3)] public string? Notes { get; set; } + [Range(0, 3)] + public int ChapterEligibilityCountRegionals { get; set; } + [Range(1, 3)] - public int MaxTeamCountState { get; set; } - public bool RegionalEvent { get; set; } + public int ChapterEligibilityCountState { get; set; } - public bool RegionalPresubmit { get; set; } - public bool StatePresubmission { get; set; } - public bool StatePretesting { get; set; } - public bool StatePreliminaryRound { get; set; } + public bool RegionalEvent => ChapterEligibilityCountRegionals > 0; - public string? Documentation { get; set; } + public bool Presubmission { get; set; } + + + [StringLength(64)] + public string? Documentation { get; set; } [Required] - public string Eligibility { get; set; } + [StringLength(256)] + public string Eligibility { get; set; } + [StringLength(4096)] public string? Theme { get; set; } - public string? Description { get; set; } + [StringLength(1024)] + public string? Description { get; set; } public int? LevelOfEffort { get; set; } public override string ToString() @@ -80,16 +87,4 @@ public class EventDefinition public static readonly EventDefinition GeneralSchedule = new(){Name = "General Schedule"}; public static readonly EventDefinition VotingDelegates = new(){Name = "Voting Delegates"}; - - public string EventAttributes () - { - var st = new List(); - - if (EventFormat is EventFormat.Individual) - st.Add( "Ind."); - if (RegionalEvent) - st.Add( "Reg."); - - return string.Join(", ", st); - } } \ No newline at end of file diff --git a/Core/Parsers/EventDefinitionParser.cs b/Core/Parsers/EventDefinitionParser.cs index a26e576..5c22992 100644 --- a/Core/Parsers/EventDefinitionParser.cs +++ b/Core/Parsers/EventDefinitionParser.cs @@ -56,17 +56,17 @@ public class EventDefinitionParser : CsvParserBase Name = name.Trim(), ShortName = shortName.Trim(), EventFormat = format, - MaxTeamCountState = stateTeams, + ChapterEligibilityCountState = stateTeams, MinTeamSize = min, MaxTeamSize = max, SemifinalistActivity = semifinalistActivity, - RegionalEvent = !string.IsNullOrEmpty(regionalCount), - RegionalPresubmit = regionalPresubmit.Trim() == "TRUE", + //RegionalEvent = !string.IsNullOrEmpty(regionalCount), + //RegionalPresubmit = regionalPresubmit.Trim() == "TRUE", Notes = regionalNotes, Documentation= documentation, - StatePresubmission = statePresubmission.Trim() == "TRUE", - StatePretesting = statePretesting.Trim() == "TRUE", - StatePreliminaryRound = statePreliminary.Trim() == "TRUE", + Presubmission = statePresubmission.Trim() == "TRUE", + //StatePretesting = statePretesting.Trim() == "TRUE", + //StatePreliminaryRound = statePreliminary.Trim() == "TRUE", Eligibility = eligibility, Theme = theme, Description = description, diff --git a/Data/Migrations/20250825173042_InitialCreate.cs b/Data/Migrations/20250825173042_InitialCreate.cs index 862c99f..6f20f30 100644 --- a/Data/Migrations/20250825173042_InitialCreate.cs +++ b/Data/Migrations/20250825173042_InitialCreate.cs @@ -54,7 +54,7 @@ namespace Data.Migrations }); migrationBuilder.CreateTable( - name: "TimeSlots", + name: "Teams", columns: table => new { Id = table.Column(type: "INTEGER", nullable: false) @@ -91,7 +91,7 @@ namespace Data.Migrations table.ForeignKey( name: "FK_StudentTeam_Teams_TeamsId", column: x => x.TeamsId, - principalTable: "TimeSlots", + principalTable: "Teams", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); @@ -108,7 +108,7 @@ namespace Data.Migrations migrationBuilder.CreateIndex( name: "IX_Teams_CaptainId", - table: "TimeSlots", + table: "Teams", column: "CaptainId"); } @@ -122,7 +122,7 @@ namespace Data.Migrations name: "StudentTeam"); migrationBuilder.DropTable( - name: "TimeSlots"); + name: "Teams"); migrationBuilder.DropTable( name: "Students"); diff --git a/Data/Migrations/20250827183503_StudentCleanup.cs b/Data/Migrations/20250827183503_StudentCleanup.cs index a112a89..f30f9e9 100644 --- a/Data/Migrations/20250827183503_StudentCleanup.cs +++ b/Data/Migrations/20250827183503_StudentCleanup.cs @@ -12,7 +12,7 @@ namespace Data.Migrations { migrationBuilder.RenameColumn( name: "TeamNumber", - table: "TimeSlots", + table: "Teams", newName: "TeamId"); migrationBuilder.RenameColumn( @@ -36,7 +36,7 @@ namespace Data.Migrations { migrationBuilder.RenameColumn( name: "TeamId", - table: "TimeSlots", + table: "Teams", newName: "TeamNumber"); migrationBuilder.RenameColumn( diff --git a/Data/Migrations/20250903121202_StudentAddEmailPhone.cs b/Data/Migrations/20250903121202_StudentAddEmailPhone.cs index 400b8fd..b354b2d 100644 --- a/Data/Migrations/20250903121202_StudentAddEmailPhone.cs +++ b/Data/Migrations/20250903121202_StudentAddEmailPhone.cs @@ -12,14 +12,14 @@ namespace Data.Migrations { migrationBuilder.AddColumn( name: "EventId", - table: "TimeSlots", + table: "Teams", type: "INTEGER", nullable: false, defaultValue: 0); migrationBuilder.AddColumn( name: "Name", - table: "TimeSlots", + table: "Teams", type: "TEXT", nullable: false, defaultValue: ""); @@ -47,12 +47,12 @@ namespace Data.Migrations migrationBuilder.CreateIndex( name: "IX_Teams_EventId", - table: "TimeSlots", + table: "Teams", column: "EventId"); migrationBuilder.AddForeignKey( name: "FK_Teams_Events_EventId", - table: "TimeSlots", + table: "Teams", column: "EventId", principalTable: "Events", principalColumn: "Id", @@ -64,19 +64,19 @@ namespace Data.Migrations { migrationBuilder.DropForeignKey( name: "FK_Teams_Events_EventId", - table: "TimeSlots"); + table: "Teams"); migrationBuilder.DropIndex( name: "IX_Teams_EventId", - table: "TimeSlots"); + table: "Teams"); migrationBuilder.DropColumn( name: "EventId", - table: "TimeSlots"); + table: "Teams"); migrationBuilder.DropColumn( name: "Name", - table: "TimeSlots"); + table: "Teams"); migrationBuilder.DropColumn( name: "Email", diff --git a/Data/Migrations/20250915175030_AddTeamNumber.cs b/Data/Migrations/20250915175030_AddTeamNumber.cs index 8aa8ebc..3fa3f49 100644 --- a/Data/Migrations/20250915175030_AddTeamNumber.cs +++ b/Data/Migrations/20250915175030_AddTeamNumber.cs @@ -12,11 +12,11 @@ namespace Data.Migrations { migrationBuilder.DropColumn( name: "Name", - table: "TimeSlots"); + table: "Teams"); migrationBuilder.AddColumn( name: "Number", - table: "TimeSlots", + table: "Teams", type: "INTEGER", nullable: false, defaultValue: 0); @@ -27,11 +27,11 @@ namespace Data.Migrations { migrationBuilder.DropColumn( name: "Number", - table: "TimeSlots"); + table: "Teams"); migrationBuilder.AddColumn( name: "Name", - table: "TimeSlots", + table: "Teams", type: "TEXT", nullable: false, defaultValue: ""); diff --git a/Data/Migrations/20250917165027_NullableTeamNumber.cs b/Data/Migrations/20250917165027_NullableTeamNumber.cs index ba40250..fa6189d 100644 --- a/Data/Migrations/20250917165027_NullableTeamNumber.cs +++ b/Data/Migrations/20250917165027_NullableTeamNumber.cs @@ -12,7 +12,7 @@ namespace Data.Migrations { migrationBuilder.AlterColumn( name: "Number", - table: "TimeSlots", + table: "Teams", type: "INTEGER", nullable: true, oldClrType: typeof(int), @@ -24,7 +24,7 @@ namespace Data.Migrations { migrationBuilder.AlterColumn( name: "Number", - table: "TimeSlots", + table: "Teams", type: "INTEGER", nullable: false, defaultValue: 0, diff --git a/Data/Migrations/20250926142634_EventDefinition_Update.Designer.cs b/Data/Migrations/20250926142634_EventDefinition_Update.Designer.cs new file mode 100644 index 0000000..06b18cd --- /dev/null +++ b/Data/Migrations/20250926142634_EventDefinition_Update.Designer.cs @@ -0,0 +1,257 @@ +// +using Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Data.Migrations +{ + [DbContext(typeof(AppDbContext))] + [Migration("20250926142634_EventDefinition_Update")] + partial class EventDefinition_Update + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "9.0.8"); + + modelBuilder.Entity("Core.Entities.EventDefinition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("ChapterEligibilityCountRegionals") + .HasColumnType("INTEGER"); + + b.Property("ChapterEligibilityCountState") + .HasColumnType("INTEGER"); + + b.Property("Description") + .HasMaxLength(1024) + .HasColumnType("TEXT"); + + b.Property("Documentation") + .HasMaxLength(64) + .HasColumnType("TEXT"); + + b.Property("Eligibility") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("TEXT"); + + b.Property("EventFormat") + .HasColumnType("INTEGER"); + + b.Property("LevelOfEffort") + .HasColumnType("INTEGER"); + + b.Property("MaxTeamSize") + .HasColumnType("INTEGER"); + + b.Property("MinTeamSize") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Notes") + .HasMaxLength(1024) + .HasColumnType("TEXT"); + + b.Property("OnSiteActivity") + .HasColumnType("INTEGER"); + + b.Property("Presubmission") + .HasColumnType("INTEGER"); + + b.Property("SemifinalistActivity") + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.Property("ShortName") + .IsRequired() + .HasMaxLength(40) + .HasColumnType("TEXT"); + + b.Property("Theme") + .HasMaxLength(4096) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("Name"); + + b.ToTable("Events"); + }); + + modelBuilder.Entity("Core.Entities.Student", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Email") + .HasColumnType("TEXT"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("Grade") + .HasColumnType("INTEGER"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("TEXT"); + + b.Property("NationalId") + .HasColumnType("TEXT"); + + b.Property("OfficerRole") + .HasColumnType("INTEGER"); + + b.Property("PhoneNumber") + .HasColumnType("TEXT"); + + b.Property("RegionalId") + .HasColumnType("TEXT"); + + b.Property("StateId") + .HasColumnType("TEXT"); + + b.Property("TsaYear") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("Students"); + }); + + modelBuilder.Entity("Core.Entities.StudentEventRanking", b => + { + b.Property("EventDefinitionId") + .HasColumnType("INTEGER"); + + b.Property("StudentId") + .HasColumnType("INTEGER"); + + b.Property("Rank") + .HasColumnType("INTEGER"); + + b.HasKey("EventDefinitionId", "StudentId"); + + b.HasIndex("StudentId"); + + b.ToTable("StudentEventRanking"); + }); + + modelBuilder.Entity("Core.Entities.Team", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CaptainId") + .HasColumnType("INTEGER"); + + b.Property("EventId") + .HasColumnType("INTEGER"); + + b.Property("Number") + .HasColumnType("INTEGER"); + + b.Property("TeamId") + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("CaptainId"); + + b.HasIndex("EventId"); + + b.ToTable("Teams"); + }); + + modelBuilder.Entity("StudentTeam", b => + { + b.Property("StudentsId") + .HasColumnType("INTEGER"); + + b.Property("TeamsId") + .HasColumnType("INTEGER"); + + b.HasKey("StudentsId", "TeamsId"); + + b.HasIndex("TeamsId"); + + b.ToTable("StudentTeam"); + }); + + modelBuilder.Entity("Core.Entities.StudentEventRanking", b => + { + b.HasOne("Core.Entities.EventDefinition", "EventDefinition") + .WithMany() + .HasForeignKey("EventDefinitionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Core.Entities.Student", "Student") + .WithMany("EventRankings") + .HasForeignKey("StudentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EventDefinition"); + + b.Navigation("Student"); + }); + + modelBuilder.Entity("Core.Entities.Team", b => + { + b.HasOne("Core.Entities.Student", "Captain") + .WithMany() + .HasForeignKey("CaptainId"); + + b.HasOne("Core.Entities.EventDefinition", "Event") + .WithMany() + .HasForeignKey("EventId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Captain"); + + b.Navigation("Event"); + }); + + modelBuilder.Entity("StudentTeam", b => + { + b.HasOne("Core.Entities.Student", null) + .WithMany() + .HasForeignKey("StudentsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Core.Entities.Team", null) + .WithMany() + .HasForeignKey("TeamsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Core.Entities.Student", b => + { + b.Navigation("EventRankings"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Data/Migrations/20250926142634_EventDefinition_Update.cs b/Data/Migrations/20250926142634_EventDefinition_Update.cs new file mode 100644 index 0000000..92740b8 --- /dev/null +++ b/Data/Migrations/20250926142634_EventDefinition_Update.cs @@ -0,0 +1,100 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Data.Migrations +{ + /// + public partial class EventDefinition_Update : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "MaxTeamCountState", + table: "Events"); + + migrationBuilder.DropColumn( + name: "RegionalEvent", + table: "Events"); + + migrationBuilder.RenameColumn( + name: "StatePretesting", + table: "Events", + newName: "Presubmission"); + + migrationBuilder.RenameColumn( + name: "StatePresubmission", + table: "Events", + newName: "OnSiteActivity"); + + migrationBuilder.RenameColumn( + name: "StatePreliminaryRound", + table: "Events", + newName: "ChapterEligibilityCountState"); + + migrationBuilder.RenameColumn( + name: "RegionalPresubmit", + table: "Events", + newName: "ChapterEligibilityCountRegionals"); + + migrationBuilder.AlterColumn( + name: "ShortName", + table: "Events", + type: "TEXT", + maxLength: 40, + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "TEXT", + oldNullable: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameColumn( + name: "Presubmission", + table: "Events", + newName: "StatePretesting"); + + migrationBuilder.RenameColumn( + name: "OnSiteActivity", + table: "Events", + newName: "StatePresubmission"); + + migrationBuilder.RenameColumn( + name: "ChapterEligibilityCountState", + table: "Events", + newName: "StatePreliminaryRound"); + + migrationBuilder.RenameColumn( + name: "ChapterEligibilityCountRegionals", + table: "Events", + newName: "RegionalPresubmit"); + + migrationBuilder.AlterColumn( + name: "ShortName", + table: "Events", + type: "TEXT", + nullable: true, + oldClrType: typeof(string), + oldType: "TEXT", + oldMaxLength: 40); + + migrationBuilder.AddColumn( + name: "MaxTeamCountState", + table: "Events", + type: "INTEGER", + nullable: false, + defaultValue: 0); + + migrationBuilder.AddColumn( + name: "RegionalEvent", + table: "Events", + type: "INTEGER", + nullable: false, + defaultValue: false); + } + } +} diff --git a/Data/Migrations/AppDbContextModelSnapshot.cs b/Data/Migrations/AppDbContextModelSnapshot.cs index f303890..c188c0c 100644 --- a/Data/Migrations/AppDbContextModelSnapshot.cs +++ b/Data/Migrations/AppDbContextModelSnapshot.cs @@ -22,14 +22,23 @@ namespace Data.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); + b.Property("ChapterEligibilityCountRegionals") + .HasColumnType("INTEGER"); + + b.Property("ChapterEligibilityCountState") + .HasColumnType("INTEGER"); + b.Property("Description") + .HasMaxLength(1024) .HasColumnType("TEXT"); b.Property("Documentation") + .HasMaxLength(64) .HasColumnType("TEXT"); b.Property("Eligibility") .IsRequired() + .HasMaxLength(256) .HasColumnType("TEXT"); b.Property("EventFormat") @@ -38,9 +47,6 @@ namespace Data.Migrations b.Property("LevelOfEffort") .HasColumnType("INTEGER"); - b.Property("MaxTeamCountState") - .HasColumnType("INTEGER"); - b.Property("MaxTeamSize") .HasColumnType("INTEGER"); @@ -53,30 +59,26 @@ namespace Data.Migrations .HasColumnType("TEXT"); b.Property("Notes") + .HasMaxLength(1024) .HasColumnType("TEXT"); - b.Property("RegionalEvent") + b.Property("OnSiteActivity") .HasColumnType("INTEGER"); - b.Property("RegionalPresubmit") + b.Property("Presubmission") .HasColumnType("INTEGER"); b.Property("SemifinalistActivity") + .HasMaxLength(100) .HasColumnType("TEXT"); b.Property("ShortName") + .IsRequired() + .HasMaxLength(40) .HasColumnType("TEXT"); - b.Property("StatePreliminaryRound") - .HasColumnType("INTEGER"); - - b.Property("StatePresubmission") - .HasColumnType("INTEGER"); - - b.Property("StatePretesting") - .HasColumnType("INTEGER"); - b.Property("Theme") + .HasMaxLength(4096) .HasColumnType("TEXT"); b.HasKey("Id"); @@ -173,7 +175,7 @@ namespace Data.Migrations b.HasIndex("EventId"); - b.ToTable("TimeSlots"); + b.ToTable("Teams"); }); modelBuilder.Entity("StudentTeam", b => diff --git a/DataBackup/ChapterOrganizer.db b/DataBackup/ChapterOrganizer.db index ab25e68..5e640cc 100644 Binary files a/DataBackup/ChapterOrganizer.db and b/DataBackup/ChapterOrganizer.db differ diff --git a/Tests/Parsers/EventDefinitionParser_Tests.cs b/Tests/Parsers/EventDefinitionParser_Tests.cs index b3ac8d1..b44f95e 100644 --- a/Tests/Parsers/EventDefinitionParser_Tests.cs +++ b/Tests/Parsers/EventDefinitionParser_Tests.cs @@ -11,7 +11,7 @@ public class EventDefinitionParser_Tests Console.WriteLine($"Event, Type, Int/Pres, Team Size, Team Count, Regional"); foreach (var @event in events) { - Console.WriteLine($"{@event.ShortName}, {@event.EventFormat}, {@event.Eligibility}, {@event.Description}, {@event.InterviewOrPresentation}, {@event.TeamSize}, {@event.MaxTeamCountState}, {@event.InterviewOrPresentation}, {@event.RegionalEvent}"); + Console.WriteLine($"{@event.ShortName}, {@event.EventFormat}, {@event.Eligibility}, {@event.Description}, {@event.InterviewOrPresentation}, {@event.TeamSize}, {@event.ChapterEligibilityCountState}, {@event.InterviewOrPresentation}, {@event.RegionalEvent}"); } foreach (var @event in events) diff --git a/Tests/Parsers/TeamParser_Tests.cs b/Tests/Parsers/TeamParser_Tests.cs index a71ec30..cdda555 100644 --- a/Tests/Parsers/TeamParser_Tests.cs +++ b/Tests/Parsers/TeamParser_Tests.cs @@ -29,7 +29,7 @@ public class TeamParser_Tests foreach (var team in teams.Where(t => t.Event.RegionalEvent)) { - Console.WriteLine($"{team.Event.Name} {team.Event.RegionalPresubmit} team.RegionalTimeSlot"); + Console.WriteLine($"{team.Event.Name} {team.Event.RegionalEvent} team.RegionalTimeSlot"); var join = string.Join(", ", team.Students.OrderByDescending(s => team.Captain == s).ThenByDescending(s => s.Grade + s.TsaYear).Select(s => $"{s.FirstNameLastName}{(team.Captain == s ? " *" + "(Cpt.)" : "")}")); Console.WriteLine($"\t{join}"); diff --git a/WebApp/Components/Pages/EventDefinitionPages/Create.razor b/WebApp/Components/Pages/EventDefinitionPages/Create.razor index 992ef45..0c33741 100644 --- a/WebApp/Components/Pages/EventDefinitionPages/Create.razor +++ b/WebApp/Components/Pages/EventDefinitionPages/Create.razor @@ -27,21 +27,20 @@ } - + - + + - - + + + - - - - - + + diff --git a/WebApp/Components/Pages/EventDefinitionPages/Delete.razor b/WebApp/Components/Pages/EventDefinitionPages/Delete.razor deleted file mode 100644 index d0936be..0000000 --- a/WebApp/Components/Pages/EventDefinitionPages/Delete.razor +++ /dev/null @@ -1,120 +0,0 @@ -@page "/events/delete" -@using Microsoft.EntityFrameworkCore -@inject AppDbContext context -@inject NavigationManager NavigationManager - -Delete - -

Delete

- -

Are you sure you want to delete this?

-
-

EventDefinition

-
- @if (eventdefinition is null) - { -

Loading...

- } - else { -
-
Name
-
@eventdefinition.Name
-
-
-
Short Name
-
@eventdefinition.ShortName
-
-
-
Event Format
-
@eventdefinition.EventFormat
-
-
-
Min Team Size
-
@eventdefinition.MinTeamSize
-
-
-
Max Team Size
-
@eventdefinition.MaxTeamSize
-
-
-
SemifinalistActivity
-
@eventdefinition.SemifinalistActivity
-
-
-
Notes
-
@eventdefinition.Notes
-
-
-
MaxTeamCountState
-
@eventdefinition.MaxTeamCountState
-
-
-
RegionalEvent
-
@eventdefinition.RegionalEvent
-
-
-
RegionalPresubmit
-
@eventdefinition.RegionalPresubmit
-
-
-
StatePresubmission
-
@eventdefinition.StatePresubmission
-
-
-
StatePretesting
-
@eventdefinition.StatePretesting
-
-
-
StatePreliminaryRound
-
@eventdefinition.StatePreliminaryRound
-
-
-
Documentation
-
@eventdefinition.Documentation
-
-
-
Eligibility
-
@eventdefinition.Eligibility
-
-
-
Theme
-
@eventdefinition.Theme
-
-
-
Description
-
@eventdefinition.Description
-
-
-
LevelOfEffort
-
@eventdefinition.LevelOfEffort
-
- - | - Back to List - - } -
- -@code { - private EventDefinition? eventdefinition; - - [SupplyParameterFromQuery] - private int Id { get; set; } - - protected override async Task OnInitializedAsync() - { - eventdefinition = await context.Events.FirstOrDefaultAsync(m => m.Id == Id); - - if (eventdefinition is null) - { - NavigationManager.NavigateTo("notfound"); - } - } - - private async Task DeleteEventDefinition() - { - context.Events.Remove(eventdefinition!); - await context.SaveChangesAsync(); - NavigationManager.NavigateTo("/events"); - } -} diff --git a/WebApp/Components/Pages/EventDefinitionPages/Details.razor b/WebApp/Components/Pages/EventDefinitionPages/Details.razor index ce62a3c..fab61e5 100644 --- a/WebApp/Components/Pages/EventDefinitionPages/Details.razor +++ b/WebApp/Components/Pages/EventDefinitionPages/Details.razor @@ -30,18 +30,18 @@
@eventdefinition.SemifinalistActivity
Notes
@eventdefinition.Notes
-
MaxTeamCountState
-
@eventdefinition.MaxTeamCountState
+
ChapterEligibilityCountState
+
@eventdefinition.ChapterEligibilityCountState
RegionalEvent
@eventdefinition.RegionalEvent
RegionalPresubmit
-
@eventdefinition.RegionalPresubmit
-
StatePresubmission
-
@eventdefinition.StatePresubmission
+ @*
@eventdefinition.RegionalPresubmit
*@ +
Presubmission
+
@eventdefinition.Presubmission
StatePretesting
-
@eventdefinition.StatePretesting
+ @*
@eventdefinition.StatePretesting
*@
StatePreliminaryRound
-
@eventdefinition.StatePreliminaryRound
+ @*
@eventdefinition.StatePreliminaryRound
*@
Documentation
@eventdefinition.Documentation
Eligibility
diff --git a/WebApp/Components/Pages/EventDefinitionPages/Edit.razor b/WebApp/Components/Pages/EventDefinitionPages/Edit.razor index 23f4f2f..eb9278f 100644 --- a/WebApp/Components/Pages/EventDefinitionPages/Edit.razor +++ b/WebApp/Components/Pages/EventDefinitionPages/Edit.razor @@ -1,132 +1,54 @@ @page "/events/edit" @using Microsoft.EntityFrameworkCore -@using Core.Entities -@using Data @inject AppDbContext context @inject NavigationManager NavigationManager -Edit +Edit Event - TSA Chapter Organizer -

Edit

+Edit +Event + -

EventDefinition

-
-@if (EventDefinition is null) -{ -

Loading...

-} -else -{ -
-
- - - - -
- - - -
-
- - - -
-
- - - @foreach (var format in Enum.GetValues(typeof(EventFormat))) - { - - } - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
- -
-
-
-} - + + + + + + + + + + + @* Team + Individual *@ + @foreach (EventFormat format in Enum.GetValues(typeof(EventFormat))) + { + @(format.ToString()) + } + + + + + + + + + + + + + + + + + + + + Back + Save + + @code { [SupplyParameterFromQuery] @@ -147,13 +69,13 @@ else // To protect from overposting attacks, enable the specific properties you want to bind to. // For more information, see https://learn.microsoft.com/aspnet/core/blazor/forms/#mitigate-overposting-attacks. - private async Task UpdateEventDefinition() + private void OnValidSubmit() { context.Attach(EventDefinition!).State = EntityState.Modified; try { - await context.SaveChangesAsync(); + context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { diff --git a/WebApp/Components/Pages/EventDefinitionPages/Index.razor b/WebApp/Components/Pages/EventDefinitionPages/Index.razor index 01af8b4..893bdef 100644 --- a/WebApp/Components/Pages/EventDefinitionPages/Index.razor +++ b/WebApp/Components/Pages/EventDefinitionPages/Index.razor @@ -1,5 +1,6 @@ @page "/events" @using Microsoft.EntityFrameworkCore +@using WebApp.Models @inject AppDbContext Context Events - TSA Chapter Organizer @@ -13,18 +14,27 @@ - - + + [@context.Item.MinTeamSize - @context.Item.MaxTeamSize] + - + + - @context.Item.MaxTeamCountState + @if (context.Item.RegionalEvent) { @AppIcons.RegionalEvent } + + + @if (context.Item.Presubmission) { @AppIcons.PresubmissionEvent } + + + + @@ -54,7 +64,7 @@ private async Task> ServerReload(GridState state) { - var query = Context.Events.Where(state.FilterDefinitions).OrderBy(state.SortDefinitions); + var query = Context.Events.OrderBy(e => e.Name).Where(state.FilterDefinitions).OrderBy(state.SortDefinitions); var totalItems = await query.CountAsync(); var pagedData = await query.Skip(state.Page * state.PageSize).Take(state.PageSize).ToArrayAsync(); diff --git a/WebApp/Components/Pages/StudentPages/Index.razor b/WebApp/Components/Pages/StudentPages/Index.razor index 3752f42..4dfdf4a 100644 --- a/WebApp/Components/Pages/StudentPages/Index.razor +++ b/WebApp/Components/Pages/StudentPages/Index.razor @@ -2,6 +2,7 @@ @using Microsoft.EntityFrameworkCore @using WebApp.Models @inject AppDbContext Context +@inject IDialogService DialogService Students - TSA Chapter Organizer @@ -32,13 +33,16 @@ - Details + - Edit + - Delete + @@ -69,4 +73,29 @@ Items = pagedData }; } + + private async Task DeleteElement(object obj) + { + //_isRowBlocked = true; + + if (obj is Student student) + { + var result = await DialogService + .ShowMessageBox("Delete student", + (MarkupString)$"Are you sure want to delete {student.Name}?", + yesText:"Yes", + noText:"Cancel"); + + if (result == true) + { + Context.Students.Remove(student!); + await Context.SaveChangesAsync(); + //Snackbar.Add($"Delete event: Delete of Element {element.Name}", Severity.Info); + } + } + + //_isRowBlocked = false; + StateHasChanged(); + _dataGrid.ReloadServerData(); + } } diff --git a/WebApp/Components/Pages/TeamPages/Printout.razor b/WebApp/Components/Pages/TeamPages/Printout.razor index 6b3f39a..d7b23b4 100644 --- a/WebApp/Components/Pages/TeamPages/Printout.razor +++ b/WebApp/Components/Pages/TeamPages/Printout.razor @@ -76,9 +76,9 @@ else } } else if (context.Event.EventFormat == EventFormat.Individual - && context.Students.Count > context.Event.MaxTeamCountState) + && context.Students.Count > context.Event.ChapterEligibilityCountState) { - Max Team Count State: @context.Event.MaxTeamCountState + Max Team Count State: @context.Event.ChapterEligibilityCountState } diff --git a/WebApp/Models/AppIcons.cs b/WebApp/Models/AppIcons.cs index 9a0ffe9..91740dc 100644 --- a/WebApp/Models/AppIcons.cs +++ b/WebApp/Models/AppIcons.cs @@ -25,6 +25,8 @@ namespace WebApp.Models public static string OnSiteActivity = "ⓐ"; public static string RegionalEvent = "ⓡ"; public static string IndividualEvent = "ⓘ"; + public static string PresubmissionEvent = "🕑"; + public static string PresentationEvent = "ⓟ"; public static string QuestionMark = "❔"; public static string EventEffort(EventDefinition eventDefinition) @@ -38,8 +40,12 @@ namespace WebApp.Models if (eventDefinition.EventFormat == EventFormat.Individual) v.Add(IndividualEvent); + if (eventDefinition.InterviewOrPresentation) + v.Add(PresentationEvent); if (eventDefinition.OnSiteActivity) v.Add(OnSiteActivity); + if (eventDefinition.Presubmission) + v.Add(PresubmissionEvent); if (eventDefinition.RegionalEvent) v.Add(RegionalEvent);