Reclassify referee and scoring displays as 'panels'.

This commit is contained in:
Patrick Fairbank
2018-09-03 16:07:26 -07:00
parent 5942321522
commit 33c3f04fdb
12 changed files with 82 additions and 77 deletions

View File

@@ -109,7 +109,7 @@ $(function() {
$("[data-toggle=tooltip]").tooltip({"placement": "top"});
// Set up the websocket back to the server.
websocket = new CheesyWebsocket("/displays/referee/websocket", {
websocket = new CheesyWebsocket("/panels/referee/websocket", {
matchLoad: function(event) { handleMatchLoad(event.data) }
});

View File

@@ -65,7 +65,7 @@ $(function() {
alliance = window.location.href.split("/").slice(-1)[0];
// Set up the websocket back to the server.
websocket = new CheesyWebsocket("/displays/scoring/" + alliance + "/websocket", {
websocket = new CheesyWebsocket("/panels/scoring/" + alliance + "/websocket", {
matchTime: function(event) { handleMatchTime(event.data); },
realtimeScore: function(event) { handleRealtimeScore(event.data); }
});

View File

@@ -55,6 +55,14 @@
<li><a href="/alliance_selection">Alliance Selection</a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Panel</a>
<ul class="dropdown-menu">
<li><a href="/panels/referee">Referee</a></li>
<li><a href="/panels/scoring/red">Scoring &ndash; Red</a></li>
<li><a href="/panels/scoring/blue">Scoring &ndash; Blue</a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Report</a>
<ul class="dropdown-menu">
@@ -84,9 +92,6 @@
<li><a href="/displays/audience">Audience</a></li>
<li><a href="/displays/fta">Field Monitor</a></li>
<li><a href="/displays/pit">Pit</a></li>
<li><a href="/displays/referee">Referee</a></li>
<li><a href="/displays/scoring/red">Scoring &ndash; Red</a></li>
<li><a href="/displays/scoring/blue">Scoring &ndash; Blue</a></li>
</ul>
</li>
</ul>

View File

@@ -7,7 +7,7 @@
<!DOCTYPE html>
<html>
<head>
<title>Referee Display - {{.EventSettings.Name}} - Cheesy Arena</title>
<title>Referee Panel - {{.EventSettings.Name}} - Cheesy Arena</title>
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="format-detection" content="telephone=no">
@@ -17,7 +17,7 @@
<link href="/static/css/lib/bootstrap-colorpicker.min.css" rel="stylesheet">
<link href="/static/css/lib/bootstrap-datetimepicker.min.css" rel="stylesheet">
<link href="/static/css/cheesy-arena.css" rel="stylesheet">
<link href="/static/css/referee_display.css" rel="stylesheet">
<link href="/static/css/referee_panel.css" rel="stylesheet">
</head>
<body>
{{if .EntryEnabled}}
@@ -97,7 +97,7 @@
<script src="/static/js/lib/jquery.websocket-0.0.1.js"></script>
<script src="/static/js/lib/bootstrap.min.js"></script>
<script src="/static/js/cheesy-websocket.js"></script>
<script src="/static/js/referee_display.js"></script>
<script src="/static/js/referee_panel.js"></script>
</body>
</html>
{{define "foul"}}

View File

@@ -80,5 +80,5 @@
var alliance = "{{.Alliance}}";
</script>
<script src="/static/js/match_timing.js"></script>
<script src="/static/js/scoring_display.js"></script>
<script src="/static/js/scoring_panel.js"></script>
{{end}}

View File

@@ -10,7 +10,7 @@ import (
"testing"
)
func TestSetupAllianceSelection(t *testing.T) {
func TestAllianceSelection(t *testing.T) {
web := setupTestWeb(t)
cachedAlliances = [][]model.AllianceTeam{}
@@ -92,7 +92,7 @@ func TestSetupAllianceSelection(t *testing.T) {
assert.False(t, team.YellowCard)
}
func TestSetupAllianceSelectionErrors(t *testing.T) {
func TestAllianceSelectionErrors(t *testing.T) {
web := setupTestWeb(t)
cachedAlliances = [][]model.AllianceTeam{}
@@ -156,7 +156,7 @@ func TestSetupAllianceSelectionErrors(t *testing.T) {
assert.Contains(t, recorder.Body.String(), "already been finalized")
}
func TestSetupAllianceSelectionAutofocus(t *testing.T) {
func TestAllianceSelectionAutofocus(t *testing.T) {
web := setupTestWeb(t)
cachedAlliances = [][]model.AllianceTeam{}
@@ -248,7 +248,7 @@ func TestSetupAllianceSelectionAutofocus(t *testing.T) {
assert.Equal(t, -1, j)
}
func TestSetupAllianceSelectionPublish(t *testing.T) {
func TestAllianceSelectionPublish(t *testing.T) {
web := setupTestWeb(t)
web.arena.TbaClient.BaseUrl = "fakeurl"

View File

@@ -19,12 +19,12 @@ import (
)
// Renders the referee interface for assigning fouls.
func (web *Web) refereeDisplayHandler(w http.ResponseWriter, r *http.Request) {
func (web *Web) refereePanelHandler(w http.ResponseWriter, r *http.Request) {
if !web.userIsAdmin(w, r) {
return
}
template, err := web.parseFiles("templates/referee_display.html")
template, err := web.parseFiles("templates/referee_panel.html")
if err != nil {
handleWebErr(w, err)
return
@@ -76,7 +76,7 @@ func (web *Web) refereeDisplayHandler(w http.ResponseWriter, r *http.Request) {
web.arena.RedRealtimeScore.CurrentScore.Fouls, web.arena.BlueRealtimeScore.CurrentScore.Fouls,
web.arena.RedRealtimeScore.Cards, web.arena.BlueRealtimeScore.Cards, game.Rules,
!(web.arena.RedRealtimeScore.FoulsCommitted && web.arena.BlueRealtimeScore.FoulsCommitted)}
err = template.ExecuteTemplate(w, "referee_display.html", data)
err = template.ExecuteTemplate(w, "referee_panel.html", data)
if err != nil {
handleWebErr(w, err)
return
@@ -84,7 +84,7 @@ func (web *Web) refereeDisplayHandler(w http.ResponseWriter, r *http.Request) {
}
// The websocket endpoint for the refereee interface client to send control commands and receive status updates.
func (web *Web) refereeDisplayWebsocketHandler(w http.ResponseWriter, r *http.Request) {
func (web *Web) refereePanelWebsocketHandler(w http.ResponseWriter, r *http.Request) {
// TODO(patrick): Enable authentication once Safari (for iPad) supports it over Websocket.
ws, err := websocket.NewWebsocket(w, r)

View File

@@ -12,20 +12,20 @@ import (
"time"
)
func TestRefereeDisplay(t *testing.T) {
func TestRefereePanel(t *testing.T) {
web := setupTestWeb(t)
recorder := web.getHttpResponse("/displays/referee")
recorder := web.getHttpResponse("/panels/referee")
assert.Equal(t, 200, recorder.Code)
assert.Contains(t, recorder.Body.String(), "Referee Display - Untitled Event - Cheesy Arena")
assert.Contains(t, recorder.Body.String(), "Referee Panel - Untitled Event - Cheesy Arena")
}
func TestRefereeDisplayWebsocket(t *testing.T) {
func TestRefereePanelWebsocket(t *testing.T) {
web := setupTestWeb(t)
server, wsUrl := web.startTestServer()
defer server.Close()
conn, _, err := gorillawebsocket.DefaultDialer.Dial(wsUrl+"/displays/referee/websocket", nil)
conn, _, err := gorillawebsocket.DefaultDialer.Dial(wsUrl+"/panels/referee/websocket", nil)
assert.Nil(t, err)
defer conn.Close()
ws := websocket.NewTestWebsocket(conn)

View File

@@ -17,7 +17,7 @@ import (
)
// Renders the scoring interface which enables input of scores in real-time.
func (web *Web) scoringDisplayHandler(w http.ResponseWriter, r *http.Request) {
func (web *Web) scoringPanelHandler(w http.ResponseWriter, r *http.Request) {
if !web.userIsAdmin(w, r) {
return
}
@@ -29,7 +29,7 @@ func (web *Web) scoringDisplayHandler(w http.ResponseWriter, r *http.Request) {
return
}
template, err := web.parseFiles("templates/scoring_display.html", "templates/base.html")
template, err := web.parseFiles("templates/scoring_panel.html", "templates/base.html")
if err != nil {
handleWebErr(w, err)
return
@@ -46,7 +46,7 @@ func (web *Web) scoringDisplayHandler(w http.ResponseWriter, r *http.Request) {
}
// The websocket endpoint for the scoring interface client to send control commands and receive status updates.
func (web *Web) scoringDisplayWebsocketHandler(w http.ResponseWriter, r *http.Request) {
func (web *Web) scoringPanelWebsocketHandler(w http.ResponseWriter, r *http.Request) {
if !web.userIsAdmin(w, r) {
return
}

View File

@@ -12,31 +12,31 @@ import (
"time"
)
func TestScoringDisplay(t *testing.T) {
func TestScoringPanel(t *testing.T) {
web := setupTestWeb(t)
recorder := web.getHttpResponse("/displays/scoring/invalidalliance")
recorder := web.getHttpResponse("/panels/scoring/invalidalliance")
assert.Equal(t, 500, recorder.Code)
assert.Contains(t, recorder.Body.String(), "Invalid alliance")
recorder = web.getHttpResponse("/displays/scoring/red")
recorder = web.getHttpResponse("/panels/scoring/red")
assert.Equal(t, 200, recorder.Code)
recorder = web.getHttpResponse("/displays/scoring/blue")
recorder = web.getHttpResponse("/panels/scoring/blue")
assert.Equal(t, 200, recorder.Code)
assert.Contains(t, recorder.Body.String(), "Scoring - Untitled Event - Cheesy Arena")
}
func TestScoringDisplayWebsocket(t *testing.T) {
func TestScoringPanelWebsocket(t *testing.T) {
web := setupTestWeb(t)
server, wsUrl := web.startTestServer()
defer server.Close()
_, _, err := gorillawebsocket.DefaultDialer.Dial(wsUrl+"/displays/scoring/blorpy/websocket", nil)
_, _, err := gorillawebsocket.DefaultDialer.Dial(wsUrl+"/panels/scoring/blorpy/websocket", nil)
assert.NotNil(t, err)
redConn, _, err := gorillawebsocket.DefaultDialer.Dial(wsUrl+"/displays/scoring/red/websocket", nil)
redConn, _, err := gorillawebsocket.DefaultDialer.Dial(wsUrl+"/panels/scoring/red/websocket", nil)
assert.Nil(t, err)
defer redConn.Close()
redWs := websocket.NewTestWebsocket(redConn)
blueConn, _, err := gorillawebsocket.DefaultDialer.Dial(wsUrl+"/displays/scoring/blue/websocket", nil)
blueConn, _, err := gorillawebsocket.DefaultDialer.Dial(wsUrl+"/panels/scoring/blue/websocket", nil)
assert.Nil(t, err)
defer blueConn.Close()
blueWs := websocket.NewTestWebsocket(blueConn)

View File

@@ -125,42 +125,27 @@ func (web *Web) checkReaderPassword(user, password string) bool {
// Sets up the mapping between URLs and handlers.
func (web *Web) newHandler() http.Handler {
router := mux.NewRouter()
router.HandleFunc("/", web.indexHandler).Methods("GET")
router.HandleFunc("/alliance_selection", web.allianceSelectionGetHandler).Methods("GET")
router.HandleFunc("/alliance_selection", web.allianceSelectionPostHandler).Methods("POST")
router.HandleFunc("/alliance_selection/start", web.allianceSelectionStartHandler).Methods("POST")
router.HandleFunc("/alliance_selection/reset", web.allianceSelectionResetHandler).Methods("POST")
router.HandleFunc("/alliance_selection/finalize", web.allianceSelectionFinalizeHandler).Methods("POST")
router.HandleFunc("/alliance_selection/publish", web.allianceSelectionPublishHandler).Methods("POST")
router.HandleFunc("/setup/settings", web.settingsGetHandler).Methods("GET")
router.HandleFunc("/setup/settings", web.settingsPostHandler).Methods("POST")
router.HandleFunc("/setup/db/save", web.saveDbHandler).Methods("GET")
router.HandleFunc("/setup/db/restore", web.restoreDbHandler).Methods("POST")
router.HandleFunc("/setup/db/clear", web.clearDbHandler).Methods("POST")
router.HandleFunc("/setup/teams", web.teamsGetHandler).Methods("GET")
router.HandleFunc("/setup/teams", web.teamsPostHandler).Methods("POST")
router.HandleFunc("/setup/teams/clear", web.teamsClearHandler).Methods("POST")
router.HandleFunc("/setup/teams/{id}/edit", web.teamEditGetHandler).Methods("GET")
router.HandleFunc("/setup/teams/{id}/edit", web.teamEditPostHandler).Methods("POST")
router.HandleFunc("/setup/teams/{id}/delete", web.teamDeletePostHandler).Methods("POST")
router.HandleFunc("/setup/teams/publish", web.teamsPublishHandler).Methods("POST")
router.HandleFunc("/setup/teams/generate_wpa_keys", web.teamsGenerateWpaKeysHandler).Methods("GET")
router.HandleFunc("/setup/schedule", web.scheduleGetHandler).Methods("GET")
router.HandleFunc("/setup/schedule/generate", web.scheduleGeneratePostHandler).Methods("POST")
router.HandleFunc("/setup/schedule/republish", web.scheduleRepublishPostHandler).Methods("POST")
router.HandleFunc("/setup/schedule/save", web.scheduleSavePostHandler).Methods("POST")
router.HandleFunc("/setup/displays", web.displaysGetHandler).Methods("GET")
router.HandleFunc("/setup/displays", web.displaysPostHandler).Methods("POST")
router.HandleFunc("/setup/displays/reload", web.displaysReloadHandler).Methods("GET")
router.HandleFunc("/setup/led_plc", web.ledPlcGetHandler).Methods("GET")
router.HandleFunc("/setup/led_plc/websocket", web.ledPlcWebsocketHandler).Methods("GET")
router.HandleFunc("/setup/lower_thirds", web.lowerThirdsGetHandler).Methods("GET")
router.HandleFunc("/setup/lower_thirds/websocket", web.lowerThirdsWebsocketHandler).Methods("GET")
router.HandleFunc("/setup/sponsor_slides", web.sponsorSlidesGetHandler).Methods("GET")
router.HandleFunc("/setup/sponsor_slides", web.sponsorSlidesPostHandler).Methods("POST")
router.HandleFunc("/alliance_selection/reset", web.allianceSelectionResetHandler).Methods("POST")
router.HandleFunc("/alliance_selection/start", web.allianceSelectionStartHandler).Methods("POST")
router.HandleFunc("/api/alliances", web.alliancesApiHandler).Methods("GET")
router.HandleFunc("/api/matches/{type}", web.matchesApiHandler).Methods("GET")
router.HandleFunc("/api/rankings", web.rankingsApiHandler).Methods("GET")
router.HandleFunc("/api/sponsor_slides", web.sponsorSlidesApiHandler).Methods("GET")
router.HandleFunc("/api/alliances", web.alliancesApiHandler).Methods("GET")
router.HandleFunc("/displays/alliance_station", web.allianceStationDisplayHandler).Methods("GET")
router.HandleFunc("/displays/alliance_station/websocket", web.allianceStationDisplayWebsocketHandler).Methods("GET")
router.HandleFunc("/displays/announcer", web.announcerDisplayHandler).Methods("GET")
router.HandleFunc("/displays/announcer/websocket", web.announcerDisplayWebsocketHandler).Methods("GET")
router.HandleFunc("/displays/audience", web.audienceDisplayHandler).Methods("GET")
router.HandleFunc("/displays/audience/websocket", web.audienceDisplayWebsocketHandler).Methods("GET")
router.HandleFunc("/displays/fta", web.ftaDisplayHandler).Methods("GET")
router.HandleFunc("/displays/fta/websocket", web.ftaDisplayWebsocketHandler).Methods("GET")
router.HandleFunc("/displays/pit", web.pitDisplayHandler).Methods("GET")
router.HandleFunc("/displays/pit/websocket", web.pitDisplayWebsocketHandler).Methods("GET")
router.HandleFunc("/match_play", web.matchPlayHandler).Methods("GET")
router.HandleFunc("/match_play/{matchId}/load", web.matchPlayLoadHandler).Methods("GET")
router.HandleFunc("/match_play/{matchId}/show_result", web.matchPlayShowResultHandler).Methods("GET")
@@ -168,6 +153,10 @@ func (web *Web) newHandler() http.Handler {
router.HandleFunc("/match_review", web.matchReviewHandler).Methods("GET")
router.HandleFunc("/match_review/{matchId}/edit", web.matchReviewEditGetHandler).Methods("GET")
router.HandleFunc("/match_review/{matchId}/edit", web.matchReviewEditPostHandler).Methods("POST")
router.HandleFunc("/panels/scoring/{alliance}", web.scoringPanelHandler).Methods("GET")
router.HandleFunc("/panels/scoring/{alliance}/websocket", web.scoringPanelWebsocketHandler).Methods("GET")
router.HandleFunc("/panels/referee", web.refereePanelHandler).Methods("GET")
router.HandleFunc("/panels/referee/websocket", web.refereePanelWebsocketHandler).Methods("GET")
router.HandleFunc("/reports/csv/rankings", web.rankingsCsvReportHandler).Methods("GET")
router.HandleFunc("/reports/pdf/rankings", web.rankingsPdfReportHandler).Methods("GET")
router.HandleFunc("/reports/csv/schedule/{type}", web.scheduleCsvReportHandler).Methods("GET")
@@ -175,21 +164,32 @@ func (web *Web) newHandler() http.Handler {
router.HandleFunc("/reports/csv/teams", web.teamsCsvReportHandler).Methods("GET")
router.HandleFunc("/reports/pdf/teams", web.teamsPdfReportHandler).Methods("GET")
router.HandleFunc("/reports/csv/wpa_keys", web.wpaKeysCsvReportHandler).Methods("GET")
router.HandleFunc("/displays/audience", web.audienceDisplayHandler).Methods("GET")
router.HandleFunc("/displays/audience/websocket", web.audienceDisplayWebsocketHandler).Methods("GET")
router.HandleFunc("/displays/pit", web.pitDisplayHandler).Methods("GET")
router.HandleFunc("/displays/pit/websocket", web.pitDisplayWebsocketHandler).Methods("GET")
router.HandleFunc("/displays/announcer", web.announcerDisplayHandler).Methods("GET")
router.HandleFunc("/displays/announcer/websocket", web.announcerDisplayWebsocketHandler).Methods("GET")
router.HandleFunc("/displays/scoring/{alliance}", web.scoringDisplayHandler).Methods("GET")
router.HandleFunc("/displays/scoring/{alliance}/websocket", web.scoringDisplayWebsocketHandler).Methods("GET")
router.HandleFunc("/displays/referee", web.refereeDisplayHandler).Methods("GET")
router.HandleFunc("/displays/referee/websocket", web.refereeDisplayWebsocketHandler).Methods("GET")
router.HandleFunc("/displays/alliance_station", web.allianceStationDisplayHandler).Methods("GET")
router.HandleFunc("/displays/alliance_station/websocket", web.allianceStationDisplayWebsocketHandler).Methods("GET")
router.HandleFunc("/displays/fta", web.ftaDisplayHandler).Methods("GET")
router.HandleFunc("/displays/fta/websocket", web.ftaDisplayWebsocketHandler).Methods("GET")
router.HandleFunc("/", web.indexHandler).Methods("GET")
router.HandleFunc("/setup/db/clear", web.clearDbHandler).Methods("POST")
router.HandleFunc("/setup/db/restore", web.restoreDbHandler).Methods("POST")
router.HandleFunc("/setup/db/save", web.saveDbHandler).Methods("GET")
router.HandleFunc("/setup/displays", web.displaysGetHandler).Methods("GET")
router.HandleFunc("/setup/displays", web.displaysPostHandler).Methods("POST")
router.HandleFunc("/setup/displays/reload", web.displaysReloadHandler).Methods("GET")
router.HandleFunc("/setup/led_plc", web.ledPlcGetHandler).Methods("GET")
router.HandleFunc("/setup/led_plc/websocket", web.ledPlcWebsocketHandler).Methods("GET")
router.HandleFunc("/setup/lower_thirds", web.lowerThirdsGetHandler).Methods("GET")
router.HandleFunc("/setup/lower_thirds/websocket", web.lowerThirdsWebsocketHandler).Methods("GET")
router.HandleFunc("/setup/schedule", web.scheduleGetHandler).Methods("GET")
router.HandleFunc("/setup/schedule/generate", web.scheduleGeneratePostHandler).Methods("POST")
router.HandleFunc("/setup/schedule/republish", web.scheduleRepublishPostHandler).Methods("POST")
router.HandleFunc("/setup/schedule/save", web.scheduleSavePostHandler).Methods("POST")
router.HandleFunc("/setup/settings", web.settingsGetHandler).Methods("GET")
router.HandleFunc("/setup/settings", web.settingsPostHandler).Methods("POST")
router.HandleFunc("/setup/sponsor_slides", web.sponsorSlidesGetHandler).Methods("GET")
router.HandleFunc("/setup/sponsor_slides", web.sponsorSlidesPostHandler).Methods("POST")
router.HandleFunc("/setup/teams", web.teamsGetHandler).Methods("GET")
router.HandleFunc("/setup/teams", web.teamsPostHandler).Methods("POST")
router.HandleFunc("/setup/teams/{id}/delete", web.teamDeletePostHandler).Methods("POST")
router.HandleFunc("/setup/teams/{id}/edit", web.teamEditGetHandler).Methods("GET")
router.HandleFunc("/setup/teams/{id}/edit", web.teamEditPostHandler).Methods("POST")
router.HandleFunc("/setup/teams/clear", web.teamsClearHandler).Methods("POST")
router.HandleFunc("/setup/teams/generate_wpa_keys", web.teamsGenerateWpaKeysHandler).Methods("GET")
router.HandleFunc("/setup/teams/publish", web.teamsPublishHandler).Methods("POST")
return router
}