Scouting: Add No Show for Data Entry

Signed-off-by: Emily Markova <emily.markova@gmail.com>
Change-Id: Ic0e5b2cebd1d326c376bb140a90fdfa5d1f950de
diff --git a/scouting/db/db.go b/scouting/db/db.go
index a98d2b2..9df6097 100644
--- a/scouting/db/db.go
+++ b/scouting/db/db.go
@@ -85,6 +85,7 @@
 	AvgCycle                                    int64
 	RobotDied                                   bool
 	Park, OnStage, Harmony, TrapNote, Spotlight bool
+	NoShow                                      bool
 
 	// The username of the person who collected these statistics.
 	// "unknown" if submitted without logging in.
diff --git a/scouting/db/db_test.go b/scouting/db/db_test.go
index ffb9817..ed71880 100644
--- a/scouting/db/db_test.go
+++ b/scouting/db/db_test.go
@@ -147,9 +147,9 @@
 			CompType: "Regular", TeamNumber: "894",
 			MatchNumber: 3, SetNumber: 1, CompLevel: "quals", StartingQuadrant: 4,
 			SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
-			Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 1,
-			NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: false, AvgCycle: 0, OutOfField: 0,
-			Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "emma",
+			Speaker: 0, Amp: 5, SpeakerAmplified: 1,
+			NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: false, AvgCycle: 0,
+			Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "emma",
 		},
 		Stats2024{
 			CompType: "Regular", TeamNumber: "942",
@@ -157,7 +157,7 @@
 			SpeakerAuto: 2, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
 			Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 0,
 			NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: false, AvgCycle: 0,
-			Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "harry",
+			Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "harry",
 		},
 		Stats2024{
 			CompType: "Practice", TeamNumber: "942",
@@ -165,7 +165,7 @@
 			SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
 			Speaker: 2, Amp: 1, SpeakerAmplified: 3,
 			NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
-			Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "kaleb",
+			Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "kaleb",
 		},
 		Stats2024{
 			CompType: "Regular", TeamNumber: "432",
@@ -173,7 +173,7 @@
 			SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
 			Speaker: 2, Amp: 1, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 2,
 			NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
-			Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "henry",
+			Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "henry",
 		},
 		Stats2024{
 			CompType: "Regular", TeamNumber: "52A",
@@ -181,7 +181,7 @@
 			SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
 			Speaker: 0, Amp: 1, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 0,
 			NotesDropped: 2, Penalties: 0, TrapNote: true, Spotlight: false, AvgCycle: 0,
-			Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "jordan",
+			Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "jordan",
 		},
 		Stats2024{
 			CompType: "Regular", TeamNumber: "745",
@@ -189,7 +189,7 @@
 			SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
 			Speaker: 5, Amp: 0, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 0,
 			NotesDropped: 1, Penalties: 1, TrapNote: true, Spotlight: true, AvgCycle: 0,
-			Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "taylor",
+			Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "taylor",
 		},
 		Stats2024{
 			CompType: "Regular", TeamNumber: "934",
@@ -197,7 +197,7 @@
 			SpeakerAuto: 1, AmpAuto: 3, NotesDroppedAuto: 0, MobilityAuto: true,
 			Speaker: 0, Amp: 3, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 0,
 			NotesDropped: 0, Penalties: 3, TrapNote: true, Spotlight: false, AvgCycle: 0,
-			Park: false, OnStage: false, Harmony: true, RobotDied: false, CollectedBy: "katie",
+			Park: false, OnStage: false, Harmony: true, RobotDied: false, NoShow: true, CollectedBy: "katie",
 		},
 	}
 
@@ -244,7 +244,7 @@
 		SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
 		Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 1,
 		NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
-		Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "emma",
+		Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "emma",
 	}
 
 	// Attempt to insert the non-pre-scouted data and make sure it fails.
@@ -301,7 +301,7 @@
 			SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
 			Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 2, OutOfField: 0,
 			NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
-			Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "emma",
+			Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "emma",
 		},
 		Stats2024{
 			CompType: "Regular", TeamNumber: "978",
@@ -309,7 +309,7 @@
 			SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
 			Speaker: 1, Amp: 2, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 0,
 			NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
-			Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "emma",
+			Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "emma",
 		},
 		Stats2024{
 			CompType: "Regular", TeamNumber: "328A",
@@ -317,7 +317,7 @@
 			SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
 			Speaker: 0, Amp: 1, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 1,
 			NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
-			Park: false, OnStage: false, Harmony: true, RobotDied: true, CollectedBy: "emma",
+			Park: false, OnStage: false, Harmony: true, RobotDied: true, NoShow: false, CollectedBy: "emma",
 		},
 	}
 
@@ -736,7 +736,7 @@
 			SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
 			Speaker: 1, Amp: 3, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 3,
 			NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
-			Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "bailey",
+			Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "bailey",
 		},
 		Stats2024{
 			CompType: "Practice", TeamNumber: "645",
@@ -744,7 +744,7 @@
 			SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
 			Speaker: 1, Amp: 2, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 0,
 			NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
-			Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "kate",
+			Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "kate",
 		},
 		Stats2024{
 			CompType: "Regular", TeamNumber: "323",
@@ -752,7 +752,7 @@
 			SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
 			Speaker: 0, Amp: 0, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 2,
 			NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
-			Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "tyler",
+			Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "tyler",
 		},
 		Stats2024{
 			CompType: "Regular", TeamNumber: "542",
@@ -760,7 +760,7 @@
 			SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: false,
 			Speaker: 1, Amp: 2, SpeakerAmplified: 2, Shuttled: 2, OutOfField: 2,
 			NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
-			Park: false, OnStage: false, Harmony: true, RobotDied: false, CollectedBy: "max",
+			Park: false, OnStage: false, Harmony: true, RobotDied: false, NoShow: false, CollectedBy: "max",
 		},
 	}
 
@@ -771,7 +771,7 @@
 			SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
 			Speaker: 1, Amp: 3, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 3,
 			NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
-			Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "bailey",
+			Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "bailey",
 		},
 	}
 
@@ -1190,7 +1190,7 @@
 			SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
 			Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 0,
 			NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: false, AvgCycle: 0,
-			Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "emma",
+			Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "emma",
 		},
 		Stats2024{
 			CompType: "Regular", TeamNumber: "942",
@@ -1198,7 +1198,7 @@
 			SpeakerAuto: 2, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
 			Speaker: 0, Amp: 5, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 0,
 			NotesDropped: 0, Penalties: 2, TrapNote: true, Spotlight: false, AvgCycle: 0,
-			Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "harry",
+			Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "harry",
 		},
 		Stats2024{
 			CompType: "Practice", TeamNumber: "432",
@@ -1206,7 +1206,7 @@
 			SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 2, MobilityAuto: true,
 			Speaker: 2, Amp: 1, SpeakerAmplified: 3, Shuttled: 5, OutOfField: 1,
 			NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
-			Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "henry",
+			Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "henry",
 		},
 		Stats2024{
 			CompType: "Regular", TeamNumber: "52A",
@@ -1214,7 +1214,7 @@
 			SpeakerAuto: 1, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
 			Speaker: 0, Amp: 1, SpeakerAmplified: 2, Shuttled: 0, OutOfField: 0,
 			NotesDropped: 2, Penalties: 0, TrapNote: true, Spotlight: true, AvgCycle: 0,
-			Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "jordan",
+			Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "jordan",
 		},
 	}
 
diff --git a/scouting/webserver/requests/messages/request_2024_data_scouting_response.fbs b/scouting/webserver/requests/messages/request_2024_data_scouting_response.fbs
index 18416fb..c0ac039 100644
--- a/scouting/webserver/requests/messages/request_2024_data_scouting_response.fbs
+++ b/scouting/webserver/requests/messages/request_2024_data_scouting_response.fbs
@@ -29,6 +29,7 @@
   harmony: bool (id:17);
   spotlight: bool (id:22);
   robot_died: bool (id:23);
+  no_show: bool (id:27);
 
   pre_scouting:bool (id:20, deprecated);
   collected_by:string (id:21);
diff --git a/scouting/webserver/requests/messages/submit_2024_actions.fbs b/scouting/webserver/requests/messages/submit_2024_actions.fbs
index 8d43afb..fce9045 100644
--- a/scouting/webserver/requests/messages/submit_2024_actions.fbs
+++ b/scouting/webserver/requests/messages/submit_2024_actions.fbs
@@ -13,6 +13,8 @@
     kSHUTTLED,
 }
 
+table NoShowAction {}
+
 table MobilityAction {
     mobility:bool (id:0);
 }
@@ -55,6 +57,7 @@
 
 union ActionType {
     MobilityAction,
+    NoShowAction,
     StartMatchAction,
     EndAutoPhaseAction,
     PickupNoteAction,
diff --git a/scouting/webserver/requests/requests.go b/scouting/webserver/requests/requests.go
index 8761b7d..18d7ed5 100644
--- a/scouting/webserver/requests/requests.go
+++ b/scouting/webserver/requests/requests.go
@@ -457,7 +457,7 @@
 		MatchNumber: submit2024Actions.MatchNumber(), SetNumber: submit2024Actions.SetNumber(), CompLevel: string(submit2024Actions.CompLevel()),
 		StartingQuadrant: 0, SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
 		Speaker: 0, Amp: 0, SpeakerAmplified: 0, NotesDropped: 0, Shuttled: 0, OutOfField: 0, Penalties: 0,
-		TrapNote: false, Spotlight: false, AvgCycle: 0, Park: false, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "",
+		TrapNote: false, Spotlight: false, AvgCycle: 0, Park: false, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "",
 	}
 	// Loop over all actions.
 	for i := 0; i < submit2024Actions.ActionsListLength(); i++ {
@@ -490,6 +490,11 @@
 			robotDeathAction.Init(actionTable.Bytes, actionTable.Pos)
 			stat.RobotDied = true
 
+		} else if action_type == submit_2024_actions.ActionTypeNoShowAction {
+			var NoShowAction submit_2024_actions.NoShowAction
+			NoShowAction.Init(actionTable.Bytes, actionTable.Pos)
+			stat.NoShow = true
+
 		} else if action_type == submit_2024_actions.ActionTypePickupNoteAction {
 			var pick_up_action submit_2024_actions.PickupNoteAction
 			pick_up_action.Init(actionTable.Bytes, actionTable.Pos)
@@ -612,6 +617,7 @@
 			OnStage:          stat.OnStage,
 			Harmony:          stat.Harmony,
 			RobotDied:        stat.RobotDied,
+			NoShow:           stat.NoShow,
 			CollectedBy:      stat.CollectedBy,
 			CompType:         stat.CompType,
 		})
diff --git a/scouting/webserver/requests/requests_test.go b/scouting/webserver/requests/requests_test.go
index f8fb2ca..d0e17b8 100644
--- a/scouting/webserver/requests/requests_test.go
+++ b/scouting/webserver/requests/requests_test.go
@@ -137,7 +137,7 @@
 				SpeakerAuto: 2, AmpAuto: 4, NotesDroppedAuto: 1, MobilityAuto: true,
 				Speaker: 0, Amp: 1, SpeakerAmplified: 2, Shuttled: 1, OutOfField: 2,
 				NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 233,
-				Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "alex",
+				Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "alex",
 			},
 			{
 				CompType: "Regular", TeamNumber: "973",
@@ -145,7 +145,7 @@
 				SpeakerAuto: 0, AmpAuto: 2, NotesDroppedAuto: 0, MobilityAuto: false,
 				Speaker: 0, Amp: 4, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
 				NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 120,
-				Park: true, OnStage: false, Harmony: false, RobotDied: true, CollectedBy: "bob",
+				Park: true, OnStage: false, Harmony: false, RobotDied: true, NoShow: false, CollectedBy: "bob",
 			},
 		},
 	}
@@ -214,7 +214,15 @@
 				SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
 				Speaker: 4, Amp: 2, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
 				NotesDropped: 2, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
-				Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "alex",
+				Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "alex",
+			},
+			{
+				CompType: "Regular", TeamNumber: "132",
+				MatchNumber: 4, SetNumber: 2, CompLevel: "quals", StartingQuadrant: 0,
+				SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
+				Speaker: 0, Amp: 0, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 1,
+				NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
+				Park: false, OnStage: false, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "jeff",
 			},
 			{
 				CompType: "Regular", TeamNumber: "982",
@@ -222,7 +230,7 @@
 				SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
 				Speaker: 0, Amp: 2, SpeakerAmplified: 3, Shuttled: 1, OutOfField: 0,
 				NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
-				Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "george",
+				Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "george",
 			},
 		},
 	}
@@ -247,7 +255,15 @@
 				SpeakerAuto: 1, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
 				Speaker: 4, Amp: 2, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
 				NotesDropped: 2, Penalties: 2, TrapNote: true, Spotlight: true, AvgCycle: 0,
-				Park: true, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "alex",
+				Park: true, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "alex",
+			},
+			{
+				CompType: "Regular", TeamNumber: "132",
+				MatchNumber: 4, SetNumber: 2, CompLevel: "quals", StartingQuadrant: 0,
+				SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
+				Speaker: 0, Amp: 0, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 1,
+				NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
+				Park: false, OnStage: false, Harmony: false, RobotDied: false, NoShow: true, CollectedBy: "jeff",
 			},
 			{
 				CompType: "Regular", TeamNumber: "982",
@@ -255,7 +271,7 @@
 				SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
 				Speaker: 0, Amp: 2, SpeakerAmplified: 3, Shuttled: 1, OutOfField: 0,
 				NotesDropped: 1, Penalties: 0, TrapNote: false, Spotlight: true, AvgCycle: 0,
-				Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "george",
+				Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "george",
 			},
 		},
 	}
@@ -370,6 +386,13 @@
 			},
 			{
 				ActionTaken: &submit_2024_actions.ActionTypeT{
+					Type:  submit_2024_actions.ActionTypeNoShowAction,
+					Value: &submit_2024_actions.NoShowActionT{},
+				},
+				Timestamp: 200,
+			},
+			{
+				ActionTaken: &submit_2024_actions.ActionTypeT{
 					Type: submit_2024_actions.ActionTypePickupNoteAction,
 					Value: &submit_2024_actions.PickupNoteActionT{
 						Auto: true,
@@ -508,7 +531,7 @@
 		SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 0, MobilityAuto: true,
 		Speaker: 0, Amp: 0, SpeakerAmplified: 1, Shuttled: 1, OutOfField: 0,
 		NotesDropped: 1, Penalties: 5, TrapNote: false, Spotlight: false, AvgCycle: 950,
-		Park: false, OnStage: false, Harmony: true, RobotDied: true, CollectedBy: "",
+		Park: false, OnStage: false, Harmony: true, RobotDied: true, NoShow: true, CollectedBy: "",
 	}
 
 	if expected != response {
@@ -1105,7 +1128,7 @@
 			SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
 			Speaker: 1, Amp: 0, SpeakerAmplified: 0, Shuttled: 0, OutOfField: 0,
 			NotesDropped: 0, Penalties: 0, TrapNote: false, Spotlight: false, AvgCycle: 0,
-			Park: false, OnStage: false, Harmony: false, RobotDied: false, CollectedBy: "debug_cli",
+			Park: false, OnStage: false, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "debug_cli",
 		},
 	}
 
@@ -1127,7 +1150,7 @@
 				SpeakerAuto: 0, AmpAuto: 1, NotesDroppedAuto: 1, MobilityAuto: true,
 				Speaker: 0, Amp: 1, SpeakerAmplified: 1, Shuttled: 0, OutOfField: 2,
 				NotesDropped: 0, Penalties: 1, TrapNote: true, Spotlight: false, AvgCycle: 233,
-				Park: false, OnStage: false, Harmony: true, RobotDied: false, CollectedBy: "alek",
+				Park: false, OnStage: false, Harmony: true, RobotDied: false, NoShow: false, CollectedBy: "alek",
 			},
 			{
 				CompType: "Regular", TeamNumber: "244",
@@ -1135,7 +1158,7 @@
 				SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
 				Speaker: 0, Amp: 0, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
 				NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
-				Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "kacey",
+				Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "kacey",
 			},
 		},
 		actions: []db.Action{
@@ -1199,7 +1222,7 @@
 			SpeakerAuto: 0, AmpAuto: 0, NotesDroppedAuto: 0, MobilityAuto: false,
 			Speaker: 0, Amp: 0, SpeakerAmplified: 3, Shuttled: 0, OutOfField: 0,
 			NotesDropped: 0, Penalties: 1, TrapNote: false, Spotlight: false, AvgCycle: 120,
-			Park: false, OnStage: true, Harmony: false, RobotDied: false, CollectedBy: "kacey",
+			Park: false, OnStage: true, Harmony: false, RobotDied: false, NoShow: false, CollectedBy: "kacey",
 		},
 	}
 
diff --git a/scouting/www/entry/BUILD b/scouting/www/entry/BUILD
index 24da904..85af3ca 100644
--- a/scouting/www/entry/BUILD
+++ b/scouting/www/entry/BUILD
@@ -24,6 +24,7 @@
         # nice not to have a duplicate list here when they're already known in
         # the .fbs file.
         "ACTIONS": [
+            "NoShowAction",
             "EndMatchAction",
             "MobilityAction",
             "PenaltyAction",
diff --git a/scouting/www/entry/entry.component.ts b/scouting/www/entry/entry.component.ts
index 98c9311..ca5d0b8 100644
--- a/scouting/www/entry/entry.component.ts
+++ b/scouting/www/entry/entry.component.ts
@@ -13,6 +13,8 @@
 import {
   StartMatchAction,
   StartMatchActionT,
+  NoShowActionT,
+  NoShowAction,
   ScoreType,
   StageType,
   Submit2024Actions,
@@ -95,6 +97,7 @@
   readonly StageType = StageType;
   readonly ActionT = ActionT;
   readonly ActionType = ActionType;
+  readonly NoShowActionT = NoShowActionT;
   readonly StartMatchActionT = StartMatchActionT;
   readonly MobilityActionT = MobilityActionT;
   readonly PickupNoteActionT = PickupNoteActionT;
@@ -259,6 +262,10 @@
         case ActionType.EndAutoPhaseAction:
           this.autoPhase = true;
           this.section = 'Pickup';
+        case ActionType.NoShowAction:
+          this.autoPhase = true;
+          this.section = 'Init';
+          break;
         case ActionType.PickupNoteAction:
           this.section = 'Pickup';
           break;
diff --git a/scouting/www/entry/entry.ng.html b/scouting/www/entry/entry.ng.html
index 3a672e1..1b3a966 100644
--- a/scouting/www/entry/entry.ng.html
+++ b/scouting/www/entry/entry.ng.html
@@ -115,6 +115,12 @@
       <!-- Creates a responsive stack of full-width, "block buttons". -->
       <div class="d-grid gap-5">
         <button
+          class="btn btn-warning"
+          (click)="changeSectionTo('Review and Submit'); actionHelper.addNoShowAction({});"
+        >
+          No Show
+        </button>
+        <button
           class="btn btn-primary"
           [disabled]="!selectedValue"
           (click)="changeSectionTo('Pickup'); actionHelper.addStartMatchAction({position: selectedValue});"
@@ -476,6 +482,7 @@
               Mobility: {{(action.actionTaken | cast:
               MobilityActionT).mobility}}
             </span>
+            <span *ngSwitchCase="ActionType.NoShowAction">NoShow: true</span>
             <span *ngSwitchDefault>{{action.actionTakenType}}</span>
             <span *ngSwitchCase="ActionType.PenaltyAction">
               Penalties: {{(action.actionTaken | cast: