This commit is contained in:
2025-10-02 15:29:26 -04:00
22 changed files with 553 additions and 353 deletions
+2 -2
View File
@@ -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
+30 -35
View File
@@ -9,7 +9,6 @@ public class EventDefinition
[Required]
[StringLength(100, MinimumLength = 2)]
[Display(Name = "Event Name")]
public string Name { get; set; }
[Required]
@@ -31,44 +30,52 @@ 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 bool Presubmission { get; set; }
[StringLength(64)]
public string? Documentation { get; set; }
[Required]
[StringLength(256)]
public string Eligibility { get; set; }
[StringLength(4096)]
public string? Theme { get; set; }
[StringLength(1024)]
public string? Description { get; set; }
public int? LevelOfEffort { get; set; }
@@ -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<string>();
if (EventFormat is EventFormat.Individual)
st.Add( "Ind.");
if (RegionalEvent)
st.Add( "Reg.");
return string.Join(", ", st);
}
}
+6 -6
View File
@@ -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,
@@ -54,7 +54,7 @@ namespace Data.Migrations
});
migrationBuilder.CreateTable(
name: "TimeSlots",
name: "Teams",
columns: table => new
{
Id = table.Column<int>(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");
@@ -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(
@@ -12,14 +12,14 @@ namespace Data.Migrations
{
migrationBuilder.AddColumn<int>(
name: "EventId",
table: "TimeSlots",
table: "Teams",
type: "INTEGER",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<string>(
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",
@@ -12,11 +12,11 @@ namespace Data.Migrations
{
migrationBuilder.DropColumn(
name: "Name",
table: "TimeSlots");
table: "Teams");
migrationBuilder.AddColumn<int>(
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<string>(
name: "Name",
table: "TimeSlots",
table: "Teams",
type: "TEXT",
nullable: false,
defaultValue: "");
@@ -12,7 +12,7 @@ namespace Data.Migrations
{
migrationBuilder.AlterColumn<int>(
name: "Number",
table: "TimeSlots",
table: "Teams",
type: "INTEGER",
nullable: true,
oldClrType: typeof(int),
@@ -24,7 +24,7 @@ namespace Data.Migrations
{
migrationBuilder.AlterColumn<int>(
name: "Number",
table: "TimeSlots",
table: "Teams",
type: "INTEGER",
nullable: false,
defaultValue: 0,
@@ -0,0 +1,257 @@
// <auto-generated />
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
{
/// <inheritdoc />
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<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int>("ChapterEligibilityCountRegionals")
.HasColumnType("INTEGER");
b.Property<int>("ChapterEligibilityCountState")
.HasColumnType("INTEGER");
b.Property<string>("Description")
.HasMaxLength(1024)
.HasColumnType("TEXT");
b.Property<string>("Documentation")
.HasMaxLength(64)
.HasColumnType("TEXT");
b.Property<string>("Eligibility")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("TEXT");
b.Property<int>("EventFormat")
.HasColumnType("INTEGER");
b.Property<int?>("LevelOfEffort")
.HasColumnType("INTEGER");
b.Property<int>("MaxTeamSize")
.HasColumnType("INTEGER");
b.Property<int>("MinTeamSize")
.HasColumnType("INTEGER");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("TEXT");
b.Property<string>("Notes")
.HasMaxLength(1024)
.HasColumnType("TEXT");
b.Property<bool>("OnSiteActivity")
.HasColumnType("INTEGER");
b.Property<bool>("Presubmission")
.HasColumnType("INTEGER");
b.Property<string>("SemifinalistActivity")
.HasMaxLength(100)
.HasColumnType("TEXT");
b.Property<string>("ShortName")
.IsRequired()
.HasMaxLength(40)
.HasColumnType("TEXT");
b.Property<string>("Theme")
.HasMaxLength(4096)
.HasColumnType("TEXT");
b.HasKey("Id");
b.HasIndex("Name");
b.ToTable("Events");
});
modelBuilder.Entity("Core.Entities.Student", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("Email")
.HasColumnType("TEXT");
b.Property<string>("FirstName")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("TEXT");
b.Property<int>("Grade")
.HasColumnType("INTEGER");
b.Property<string>("LastName")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("TEXT");
b.Property<string>("NationalId")
.HasColumnType("TEXT");
b.Property<int?>("OfficerRole")
.HasColumnType("INTEGER");
b.Property<string>("PhoneNumber")
.HasColumnType("TEXT");
b.Property<string>("RegionalId")
.HasColumnType("TEXT");
b.Property<string>("StateId")
.HasColumnType("TEXT");
b.Property<int>("TsaYear")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.ToTable("Students");
});
modelBuilder.Entity("Core.Entities.StudentEventRanking", b =>
{
b.Property<int>("EventDefinitionId")
.HasColumnType("INTEGER");
b.Property<int>("StudentId")
.HasColumnType("INTEGER");
b.Property<int>("Rank")
.HasColumnType("INTEGER");
b.HasKey("EventDefinitionId", "StudentId");
b.HasIndex("StudentId");
b.ToTable("StudentEventRanking");
});
modelBuilder.Entity("Core.Entities.Team", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int?>("CaptainId")
.HasColumnType("INTEGER");
b.Property<int>("EventId")
.HasColumnType("INTEGER");
b.Property<int?>("Number")
.HasColumnType("INTEGER");
b.Property<string>("TeamId")
.HasColumnType("TEXT");
b.HasKey("Id");
b.HasIndex("CaptainId");
b.HasIndex("EventId");
b.ToTable("Teams");
});
modelBuilder.Entity("StudentTeam", b =>
{
b.Property<int>("StudentsId")
.HasColumnType("INTEGER");
b.Property<int>("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
}
}
}
@@ -0,0 +1,100 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Data.Migrations
{
/// <inheritdoc />
public partial class EventDefinition_Update : Migration
{
/// <inheritdoc />
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<string>(
name: "ShortName",
table: "Events",
type: "TEXT",
maxLength: 40,
nullable: false,
defaultValue: "",
oldClrType: typeof(string),
oldType: "TEXT",
oldNullable: true);
}
/// <inheritdoc />
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<string>(
name: "ShortName",
table: "Events",
type: "TEXT",
nullable: true,
oldClrType: typeof(string),
oldType: "TEXT",
oldMaxLength: 40);
migrationBuilder.AddColumn<int>(
name: "MaxTeamCountState",
table: "Events",
type: "INTEGER",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<bool>(
name: "RegionalEvent",
table: "Events",
type: "INTEGER",
nullable: false,
defaultValue: false);
}
}
}
+17 -15
View File
@@ -22,14 +22,23 @@ namespace Data.Migrations
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int>("ChapterEligibilityCountRegionals")
.HasColumnType("INTEGER");
b.Property<int>("ChapterEligibilityCountState")
.HasColumnType("INTEGER");
b.Property<string>("Description")
.HasMaxLength(1024)
.HasColumnType("TEXT");
b.Property<string>("Documentation")
.HasMaxLength(64)
.HasColumnType("TEXT");
b.Property<string>("Eligibility")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("TEXT");
b.Property<int>("EventFormat")
@@ -38,9 +47,6 @@ namespace Data.Migrations
b.Property<int?>("LevelOfEffort")
.HasColumnType("INTEGER");
b.Property<int>("MaxTeamCountState")
.HasColumnType("INTEGER");
b.Property<int>("MaxTeamSize")
.HasColumnType("INTEGER");
@@ -53,30 +59,26 @@ namespace Data.Migrations
.HasColumnType("TEXT");
b.Property<string>("Notes")
.HasMaxLength(1024)
.HasColumnType("TEXT");
b.Property<bool>("RegionalEvent")
b.Property<bool>("OnSiteActivity")
.HasColumnType("INTEGER");
b.Property<bool>("RegionalPresubmit")
b.Property<bool>("Presubmission")
.HasColumnType("INTEGER");
b.Property<string>("SemifinalistActivity")
.HasMaxLength(100)
.HasColumnType("TEXT");
b.Property<string>("ShortName")
.IsRequired()
.HasMaxLength(40)
.HasColumnType("TEXT");
b.Property<bool>("StatePreliminaryRound")
.HasColumnType("INTEGER");
b.Property<bool>("StatePresubmission")
.HasColumnType("INTEGER");
b.Property<bool>("StatePretesting")
.HasColumnType("INTEGER");
b.Property<string>("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 =>
Binary file not shown.
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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}");
@@ -27,21 +27,20 @@
}
</MudRadioGroup>
<ValidationMessage For="() => EventDefinition.EventFormat" class="text-danger" />
<MudTextField T="string" Label="Theme" AutoGrow="true" @bind-Value="EventDefinition.Description" For="@(() => EventDefinition.Description)"></MudTextField>
<MudTextField T="string" Label="Theme" AutoGrow="true" @bind-Value="EventDefinition.Theme" For="@(() => EventDefinition.Theme)"></MudTextField>
<MudTextField T="string" Label="Documentation" @bind-Value="EventDefinition.Documentation" For="@(() => EventDefinition.Documentation)"></MudTextField>
<MudNumericField T="int?" Label="Level of Effort" @bind-Value="EventDefinition.LevelOfEffort" For="@(() => EventDefinition.LevelOfEffort)"></MudNumericField>
<MudDivider></MudDivider>
<MudTextField T="string" Label="Nationals Eligibility" @bind-Value="EventDefinition.Eligibility" For="@(() => EventDefinition.Eligibility)"></MudTextField>
<MudNumericField T="int" Label="Minimum Team Size" @bind-Value="EventDefinition.MinTeamSize" For="@(() => EventDefinition.MinTeamSize)"></MudNumericField>
<MudNumericField T="int" Label="Maxiumum Team Size" @bind-Value="EventDefinition.MaxTeamSize" For="@(() => EventDefinition.MaxTeamSize)"></MudNumericField>
<MudNumericField T="int" Label="Maxiumum Team Count at State" @bind-Value="EventDefinition.MaxTeamCountState" For="@(() => EventDefinition.MaxTeamCountState)"></MudNumericField>
<MudNumericField T="int" Label="Team Count at Regionals" @bind-Value="EventDefinition.ChapterEligibilityCountRegionals" For="@(() => EventDefinition.ChapterEligibilityCountRegionals)"></MudNumericField>
<MudNumericField T="int" Label="Team Count at State" @bind-Value="EventDefinition.ChapterEligibilityCountState" For="@(() => EventDefinition.ChapterEligibilityCountState)"></MudNumericField>
<MudDivider></MudDivider>
<MudTextField T="string" Label="Semifinalist Activity" @bind-Value="EventDefinition.SemifinalistActivity" For="@(() => EventDefinition.SemifinalistActivity)"></MudTextField>
<MudCheckBox T="bool" Label="Regional Event" @bind-Value="EventDefinition.RegionalEvent" For="@(() => EventDefinition.RegionalEvent)"></MudCheckBox>
<MudCheckBox T="bool" Label="Requires Presubmission" @bind-Value="EventDefinition.StatePresubmission" For="@(() => EventDefinition.StatePresubmission)"></MudCheckBox>
<MudCheckBox T="bool" Label="Preliminary Round" @bind-Value="EventDefinition.StatePreliminaryRound" For="@(() => EventDefinition.StatePreliminaryRound)"></MudCheckBox>
<MudTextField T="string" Label="Eligibility" @bind-Value="EventDefinition.Eligibility" For="@(() => EventDefinition.Eligibility)"></MudTextField>
<MudCheckBox T="bool" Label="On Site Activity" @bind-Value="EventDefinition.OnSiteActivity" For="@(() => EventDefinition.OnSiteActivity)"></MudCheckBox>
<MudCheckBox T="bool" Label="Requires Presubmission" @bind-Value="EventDefinition.Presubmission" For="@(() => EventDefinition.Presubmission)"></MudCheckBox>
</MudPaper>
</MudItem>
</MudGrid>
@@ -1,120 +0,0 @@
@page "/events/delete"
@using Microsoft.EntityFrameworkCore
@inject AppDbContext context
@inject NavigationManager NavigationManager
<PageTitle>Delete</PageTitle>
<h1>Delete</h1>
<p>Are you sure you want to delete this?</p>
<div>
<h2>EventDefinition</h2>
<hr />
@if (eventdefinition is null)
{
<p><em>Loading...</em></p>
}
else {
<dl class="row">
<dt class="col-sm-2">Name</dt>
<dd class="col-sm-10">@eventdefinition.Name</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">Short Name</dt>
<dd class="col-sm-10">@eventdefinition.ShortName</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">Event Format</dt>
<dd class="col-sm-10">@eventdefinition.EventFormat</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">Min Team Size</dt>
<dd class="col-sm-10">@eventdefinition.MinTeamSize</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">Max Team Size</dt>
<dd class="col-sm-10">@eventdefinition.MaxTeamSize</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">SemifinalistActivity</dt>
<dd class="col-sm-10">@eventdefinition.SemifinalistActivity</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">Notes</dt>
<dd class="col-sm-10">@eventdefinition.Notes</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">MaxTeamCountState</dt>
<dd class="col-sm-10">@eventdefinition.MaxTeamCountState</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">RegionalEvent</dt>
<dd class="col-sm-10">@eventdefinition.RegionalEvent</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">RegionalPresubmit</dt>
<dd class="col-sm-10">@eventdefinition.RegionalPresubmit</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">StatePresubmission</dt>
<dd class="col-sm-10">@eventdefinition.StatePresubmission</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">StatePretesting</dt>
<dd class="col-sm-10">@eventdefinition.StatePretesting</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">StatePreliminaryRound</dt>
<dd class="col-sm-10">@eventdefinition.StatePreliminaryRound</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">Documentation</dt>
<dd class="col-sm-10">@eventdefinition.Documentation</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">Eligibility</dt>
<dd class="col-sm-10">@eventdefinition.Eligibility</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">Theme</dt>
<dd class="col-sm-10">@eventdefinition.Theme</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">Description</dt>
<dd class="col-sm-10">@eventdefinition.Description</dd>
</dl>
<dl class="row">
<dt class="col-sm-2">LevelOfEffort</dt>
<dd class="col-sm-10">@eventdefinition.LevelOfEffort</dd>
</dl>
<EditForm method="post" Model="eventdefinition" OnValidSubmit="DeleteEventDefinition" FormName="delete" Enhance>
<button type="submit" class="btn btn-danger" disabled="@(eventdefinition is null)">Delete</button> |
<a href="/events">Back to List</a>
</EditForm>
}
</div>
@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");
}
}
@@ -30,18 +30,18 @@
<dd class="col-sm-10">@eventdefinition.SemifinalistActivity</dd>
<dt class="col-sm-2">Notes</dt>
<dd class="col-sm-10">@eventdefinition.Notes</dd>
<dt class="col-sm-2">MaxTeamCountState</dt>
<dd class="col-sm-10">@eventdefinition.MaxTeamCountState</dd>
<dt class="col-sm-2">ChapterEligibilityCountState</dt>
<dd class="col-sm-10">@eventdefinition.ChapterEligibilityCountState</dd>
<dt class="col-sm-2">RegionalEvent</dt>
<dd class="col-sm-10">@eventdefinition.RegionalEvent</dd>
<dt class="col-sm-2">RegionalPresubmit</dt>
<dd class="col-sm-10">@eventdefinition.RegionalPresubmit</dd>
<dt class="col-sm-2">StatePresubmission</dt>
<dd class="col-sm-10">@eventdefinition.StatePresubmission</dd>
@* <dd class="col-sm-10">@eventdefinition.RegionalPresubmit</dd> *@
<dt class="col-sm-2">Presubmission</dt>
<dd class="col-sm-10">@eventdefinition.Presubmission</dd>
<dt class="col-sm-2">StatePretesting</dt>
<dd class="col-sm-10">@eventdefinition.StatePretesting</dd>
@* <dd class="col-sm-10">@eventdefinition.StatePretesting</dd> *@
<dt class="col-sm-2">StatePreliminaryRound</dt>
<dd class="col-sm-10">@eventdefinition.StatePreliminaryRound</dd>
@* <dd class="col-sm-10">@eventdefinition.StatePreliminaryRound</dd> *@
<dt class="col-sm-2">Documentation</dt>
<dd class="col-sm-10">@eventdefinition.Documentation</dd>
<dt class="col-sm-2">Eligibility</dt>
@@ -1,132 +1,54 @@
@page "/events/edit"
@using Microsoft.EntityFrameworkCore
@using Core.Entities
@using Data
@inject AppDbContext context
@inject NavigationManager NavigationManager
<PageTitle>Edit</PageTitle>
<PageTitle>Edit Event - TSA Chapter Organizer</PageTitle>
<h1>Edit</h1>
<MudText Typo="Typo.h3">Edit</MudText>
<MudText Typo="Typo.h4">Event</MudText>
<MudDivider />
<h2>EventDefinition</h2>
<hr />
@if (EventDefinition is null)
{
<p><em>Loading...</em></p>
}
else
{
<div class="row">
<div class="col-md-4">
<EditForm method="post" Model="EventDefinition" OnValidSubmit="UpdateEventDefinition" FormName="edit" Enhance>
<EditForm Model="EventDefinition" OnValidSubmit="OnValidSubmit" Enhance>
<DataAnnotationsValidator />
<ValidationSummary role="alert"/>
<input type="hidden" name="EventDefinition.Id" value="@EventDefinition.Id" />
<div class="mb-3">
<label for="name" class="form-label">Name:</label>
<InputText id="name" @bind-Value="EventDefinition.Name" class="form-control" />
<ValidationMessage For="() => EventDefinition.Name" class="text-danger" />
</div>
<div class="mb-3">
<label for="shortname" class="form-label">ShortName:</label>
<InputText id="shortname" @bind-Value="EventDefinition.ShortName" class="form-control" />
<ValidationMessage For="() => EventDefinition.ShortName" class="text-danger" />
</div>
<div class="mb-3">
<label for="eventformat" class="form-label">EventFormat:</label>
<InputSelect @bind-Value="@EventDefinition.EventFormat">
@foreach (var format in Enum.GetValues(typeof(EventFormat)))
{
<option value="@format">@(@format.ToString())</option>
}
</InputSelect>
<ValidationMessage For="() => EventDefinition.EventFormat" class="text-danger" />
</div>
<div class="mb-3">
<label for="minteamsize" class="form-label">MinTeamSize:</label>
<InputNumber id="minteamsize" @bind-Value="EventDefinition.MinTeamSize" class="form-control" />
<ValidationMessage For="() => EventDefinition.MinTeamSize" class="text-danger" />
</div>
<div class="mb-3">
<label for="maxteamsize" class="form-label">MaxTeamSize:</label>
<InputNumber id="maxteamsize" @bind-Value="EventDefinition.MaxTeamSize" class="form-control" />
<ValidationMessage For="() => EventDefinition.MaxTeamSize" class="text-danger" />
</div>
<div class="mb-3">
<label for="semifinalistactivity" class="form-label">SemifinalistActivity:</label>
<InputText id="semifinalistactivity" @bind-Value="EventDefinition.SemifinalistActivity" class="form-control" />
<ValidationMessage For="() => EventDefinition.SemifinalistActivity" class="text-danger" />
</div>
<div class="mb-3">
<label for="notes" class="form-label">Notes:</label>
<InputText id="notes" @bind-Value="EventDefinition.Notes" class="form-control" />
<ValidationMessage For="() => EventDefinition.Notes" class="text-danger" />
</div>
<div class="mb-3">
<label for="maxteamcountstate" class="form-label">MaxTeamCountState:</label>
<InputNumber id="maxteamcountstate" @bind-Value="EventDefinition.MaxTeamCountState" class="form-control" />
<ValidationMessage For="() => EventDefinition.MaxTeamCountState" class="text-danger" />
</div>
<div class="mb-3">
<label for="regionalevent" class="form-label">RegionalEvent:</label>
<InputCheckbox id="regionalevent" @bind-Value="EventDefinition.RegionalEvent" class="form-check-input" />
<ValidationMessage For="() => EventDefinition.RegionalEvent" class="text-danger" />
</div>
<div class="mb-3">
<label for="regionalpresubmit" class="form-label">RegionalPresubmit:</label>
<InputCheckbox id="regionalpresubmit" @bind-Value="EventDefinition.RegionalPresubmit" class="form-check-input" />
<ValidationMessage For="() => EventDefinition.RegionalPresubmit" class="text-danger" />
</div>
<div class="mb-3">
<label for="statepresubmission" class="form-label">StatePresubmission:</label>
<InputCheckbox id="statepresubmission" @bind-Value="EventDefinition.StatePresubmission" class="form-check-input" />
<ValidationMessage For="() => EventDefinition.StatePresubmission" class="text-danger" />
</div>
<div class="mb-3">
<label for="statepretesting" class="form-label">StatePretesting:</label>
<InputCheckbox id="statepretesting" @bind-Value="EventDefinition.StatePretesting" class="form-check-input" />
<ValidationMessage For="() => EventDefinition.StatePretesting" class="text-danger" />
</div>
<div class="mb-3">
<label for="statepreliminaryround" class="form-label">StatePreliminaryRound:</label>
<InputCheckbox id="statepreliminaryround" @bind-Value="EventDefinition.StatePreliminaryRound" class="form-check-input" />
<ValidationMessage For="() => EventDefinition.StatePreliminaryRound" class="text-danger" />
</div>
<div class="mb-3">
<label for="documentation" class="form-label">Documentation:</label>
<InputText id="documentation" @bind-Value="EventDefinition.Documentation" class="form-control" />
<ValidationMessage For="() => EventDefinition.Documentation" class="text-danger" />
</div>
<div class="mb-3">
<label for="eligibility" class="form-label">Eligibility:</label>
<InputText id="eligibility" @bind-Value="EventDefinition.Eligibility" class="form-control" />
<ValidationMessage For="() => EventDefinition.Eligibility" class="text-danger" />
</div>
<div class="mb-3">
<label for="theme" class="form-label">Theme:</label>
<InputText id="theme" @bind-Value="EventDefinition.Theme" class="form-control" />
<ValidationMessage For="() => EventDefinition.Theme" class="text-danger" />
</div>
<div class="mb-3">
<label for="description" class="form-label">Description:</label>
<InputText id="description" @bind-Value="EventDefinition.Description" class="form-control" />
<ValidationMessage For="() => EventDefinition.Description" class="text-danger" />
</div>
<div class="mb-3">
<label for="levelofeffort" class="form-label">LevelOfEffort:</label>
<InputNumber id="levelofeffort" @bind-Value="EventDefinition.LevelOfEffort" class="form-control" />
<ValidationMessage For="() => EventDefinition.LevelOfEffort" class="text-danger" />
</div>
<button type="submit" class="btn btn-primary">Save</button>
</EditForm>
</div>
</div>
}
<MudGrid>
<MudItem xs="12" sm="7">
<MudPaper Class="pa-4">
<MudTextField T="string" Label="Event Name" @bind-Value="EventDefinition.Name" For="@(() => EventDefinition.Name)"></MudTextField>
<MudTextField T="string" Label="Short Name" @bind-Value="EventDefinition.ShortName" For="@(() => EventDefinition.ShortName)"></MudTextField>
<label for="@EventDefinition.EventFormat" class="form-label">Format:</label>
<MudRadioGroup T="EventFormat" @bind-Value="@EventDefinition.EventFormat">
@* <MudRadio T="EventFormat" Value="EventFormat.Team">Team</MudRadio>
<MudRadio T="EventFormat" Value="EventFormat.Individual">Individual</MudRadio> *@
@foreach (EventFormat format in Enum.GetValues(typeof(EventFormat)))
{
<MudRadio T="EventFormat" value="@format">@(format.ToString())</MudRadio>
}
</MudRadioGroup>
<ValidationMessage For="() => EventDefinition.EventFormat" class="text-danger" />
<MudTextField T="string" Label="Theme" AutoGrow="true" @bind-Value="EventDefinition.Description" For="@(() => EventDefinition.Description)"></MudTextField>
<MudTextField T="string" Label="Theme" AutoGrow="true" @bind-Value="EventDefinition.Theme" For="@(() => EventDefinition.Theme)"></MudTextField>
<MudTextField T="string" Label="Documentation" @bind-Value="EventDefinition.Documentation" For="@(() => EventDefinition.Documentation)"></MudTextField>
<MudNumericField T="int?" Label="Level of Effort" @bind-Value="EventDefinition.LevelOfEffort" For="@(() => EventDefinition.LevelOfEffort)"></MudNumericField>
<MudDivider></MudDivider>
<MudTextField T="string" Label="Nationals Eligibility" @bind-Value="EventDefinition.Eligibility" For="@(() => EventDefinition.Eligibility)"></MudTextField>
<MudNumericField T="int" Label="Minimum Team Size" @bind-Value="EventDefinition.MinTeamSize" For="@(() => EventDefinition.MinTeamSize)"></MudNumericField>
<MudNumericField T="int" Label="Maxiumum Team Size" @bind-Value="EventDefinition.MaxTeamSize" For="@(() => EventDefinition.MaxTeamSize)"></MudNumericField>
<MudNumericField T="int" Label="Team Count at Regionals" @bind-Value="EventDefinition.ChapterEligibilityCountRegionals" For="@(() => EventDefinition.ChapterEligibilityCountRegionals)"></MudNumericField>
<MudNumericField T="int" Label="Team Count at State" @bind-Value="EventDefinition.ChapterEligibilityCountState" For="@(() => EventDefinition.ChapterEligibilityCountState)"></MudNumericField>
<MudDivider></MudDivider>
<MudTextField T="string" Label="Semifinalist Activity" @bind-Value="EventDefinition.SemifinalistActivity" For="@(() => EventDefinition.SemifinalistActivity)"></MudTextField>
<MudCheckBox T="bool" Label="On Site Activity" @bind-Value="EventDefinition.OnSiteActivity" For="@(() => EventDefinition.OnSiteActivity)"></MudCheckBox>
<MudCheckBox T="bool" Label="Requires Presubmission" @bind-Value="EventDefinition.Presubmission" For="@(() => EventDefinition.Presubmission)"></MudCheckBox>
</MudPaper>
</MudItem>
</MudGrid>
<MudButton StartIcon="@Icons.Material.Filled.ArrowBack" Href="events">Back</MudButton>
<MudButton ButtonType="ButtonType.Submit" StartIcon="@Icons.Material.Filled.Save">Save</MudButton>
</EditForm>
<div>
<a href="/events">Back to List</a>
</div>
@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)
{
@@ -1,5 +1,6 @@
@page "/events"
@using Microsoft.EntityFrameworkCore
@using WebApp.Models
@inject AppDbContext Context
<PageTitle>Events - TSA Chapter Organizer</PageTitle>
@@ -13,18 +14,27 @@
<Columns>
<PropertyColumn Property="@(e => e.Name)" Title="Event Name" Sortable="true" />
<PropertyColumn Property="@(e => e.EventFormat)" Title="Event Format" />
<PropertyColumn Property="@(e => e.LevelOfEffort)" Title="Level of Effort" />
<PropertyColumn Property="@(e => e.Eligibility)" Title="Eligibility" />
<TemplateColumn Title="Team Size" CellStyle="white-space:nowrap">
<CellTemplate>
<MudTooltip Text="@context.Item.Eligibility">
[@context.Item.MinTeamSize&nbsp;-&nbsp;@context.Item.MaxTeamSize]
</MudTooltip>
</CellTemplate>
</TemplateColumn>
<TemplateColumn Title="TimeSlots State #">
<PropertyColumn Property="@(e => e.ChapterEligibilityCountState)" Title="State#" />
<TemplateColumn Title="Regionals" Sortable="true" SortBy="e => e.ChapterEligibilityCountRegionals">
<CellTemplate>
@context.Item.MaxTeamCountState
@if (context.Item.RegionalEvent) { @AppIcons.RegionalEvent }
</CellTemplate>
</TemplateColumn>
<TemplateColumn Title="Pre-submission" Sortable="true" SortBy="e => e.Presubmission">
<CellTemplate>
@if (context.Item.Presubmission) { @AppIcons.PresubmissionEvent }
</CellTemplate>
</TemplateColumn>
<PropertyColumn Property="@(e => e.LevelOfEffort)" Title="Level of Effort" />
<TemplateColumn>
<CellTemplate>
<MudStack Row>
@@ -54,7 +64,7 @@
private async Task<GridData<EventDefinition>> ServerReload(GridState<EventDefinition> 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();
@@ -2,6 +2,7 @@
@using Microsoft.EntityFrameworkCore
@using WebApp.Models
@inject AppDbContext Context
@inject IDialogService DialogService
<PageTitle>Students - TSA Chapter Organizer</PageTitle>
@@ -32,13 +33,16 @@
<MudStack Row>
<MudButtonGroup Size="Size.Small">
<MudTooltip Text="Details">
<MudIconButton Href="@($"/students/details?id={context.Item.Id}")" Icon="@Icons.Material.Filled.Description">Details</MudIconButton>
<MudIconButton Href="@($"/students/details?id={context.Item.Id}")" Icon="@Icons.Material.Filled.Description" />
</MudTooltip>
<MudTooltip Text="Edit">
<MudIconButton Href="@($"/students/edit?id={context.Item.Id}")" Icon="@Icons.Material.Filled.Edit">Edit</MudIconButton>
<MudIconButton Href="@($"/students/edit?id={context.Item.Id}")" Icon="@Icons.Material.Filled.Edit" />
</MudTooltip>
<MudTooltip Text="Delete">
<MudIconButton Href="@($"/students/delete?id={context.Item.Id}")" Icon="@Icons.Material.Filled.Delete" Color="@Color.Warning">Delete</MudIconButton>
<MudIconButton Icon="@Icons.Material.Outlined.Delete"
Color="Color.Error"
OnClick="() => DeleteElement(context.Item)" />
</MudTooltip>
</MudButtonGroup>
</MudStack>
@@ -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 <b>{student.Name}</b>?",
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();
}
}
@@ -76,9 +76,9 @@ else
}
}
else if (context.Event.EventFormat == EventFormat.Individual
&& context.Students.Count > context.Event.MaxTeamCountState)
&& context.Students.Count > context.Event.ChapterEligibilityCountState)
{
<span>Max Team Count State: @context.Event.MaxTeamCountState</span>
<span>Max Team Count State: @context.Event.ChapterEligibilityCountState</span>
}
</MudTd>
</RowTemplate>
+6
View File
@@ -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);