Skip to content

Commit bbd83e5

Browse files
committed
feat: add users mid-session
1 parent b5fafd7 commit bbd83e5

3 files changed

Lines changed: 58 additions & 27 deletions

File tree

internal/selectionSessions.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,24 @@ func getAttendingMembers() ([]OIDCUser, int) {
7575
return ret, eboard
7676
}
7777

78+
func getUnassignedAttendees() []OIDCUser {
79+
var unassignedMembers []SessionAttendance
80+
db.Where("member NOT IN (SELECT member from memberships)").Find(&unassignedMembers)
81+
ret := make([]OIDCUser, len(unassignedMembers))
82+
for i, member := range unassignedMembers {
83+
ret[i] = *oidcClient.GetUserInfo(member.Member)
84+
if ret[i].IsEboard() {
85+
}
86+
}
87+
return ret
88+
}
89+
90+
func tryAddingUnassignedMember(team *Team) {
91+
if unass := getUnassignedAttendees(); len(unass) > 0 {
92+
team.addMemberToTeam(unass[0])
93+
}
94+
}
95+
7896
func clearSession() bool {
7997
if IsSelectionsActive() {
8098
log.Println("Selections State was requested to cleared but selections is active. This will not continue.")
@@ -109,7 +127,12 @@ func HandleSessionManagementPage(c *gin.Context) {
109127
}
110128
attendees, eboard := getAttendingMembers()
111129
teams := getAllTeams()
112-
c.HTML(http.StatusOK, "sessionManagement.tmpl", templateHeaders(c, map[string]any{"Attendance": attendees, "EBoard": eboard, "Teams": teams}))
130+
c.HTML(http.StatusOK, "sessionManagement.tmpl", templateHeaders(c, map[string]any{
131+
"Attendance": attendees,
132+
"EBoard": eboard,
133+
"Teams": teams,
134+
"Unassigned": getUnassignedAttendees(),
135+
}))
113136
}
114137

115138
// POST functions

internal/teams.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,9 @@ func HandleTeamApplicationAssignment(c *gin.Context) {
174174
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
175175
return
176176
}
177-
getTeamByID(id).setTeamApplication(appId)
177+
team := getTeamByID(id)
178+
tryAddingUnassignedMember(team)
179+
team.setTeamApplication(appId)
178180
app := getApplication(appId)
179181
app.Assigned = true
180182
db.Save(&app)

templates/sessionManagement.tmpl

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,17 @@
66
STOP{{ else }}>START{{ end }} SESSION
77
</button>
88
</form>
9-
{{ if not .SessionState }}
10-
<div class="p-2 mt-4">
11-
<h3>Add Members to this Selections Session</h3>
12-
<form method="post" action="/session/addMembers" onsubmit="formSubmit(event)">
13-
<div class="mb-3">
14-
<label for="membersSelect" class="control-label">Members</label>
15-
<input type="text" name="membersSelect" id="membersSelect" class="form-control"
16-
data-module="memberSelect">
17-
</div>
18-
<button class="btn btn-primary" type="submit">Add Members</button>
19-
</form>
20-
</div>
21-
{{ end }}
9+
<div class="p-2 mt-4">
10+
<h3>Add Members to this Selections Session</h3>
11+
<form method="post" action="/session/addMembers" onsubmit="formSubmit(event)">
12+
<div class="mb-3">
13+
<label for="membersSelect" class="control-label">Members</label>
14+
<input type="text" name="membersSelect" id="membersSelect" class="form-control"
15+
data-module="memberSelect">
16+
</div>
17+
<button class="btn btn-primary" type="submit">Add Members</button>
18+
</form>
19+
</div>
2220
{{ if .Attendance }}
2321
<div class="p-2 mt-4">
2422
<h3>Members currently selected:</h3>
@@ -43,6 +41,14 @@
4341
</div>
4442
<button class="btn btn-primary" type="submit">Create Teams</button>
4543
</form>
44+
{{ else }}
45+
<h4 class="mt-4 mb-1">Members In Queue</h4>
46+
<p class="my-1">These members will be added one-by-one to teams as they receive new applications.</p>
47+
{{ range .Unassigned }}
48+
<span class="badge align-items-center p-2 text-body bg-primary-subtle border border-primary-subtle">
49+
{{.FullName}} ({{.Username}})
50+
</span>
51+
{{ end }}
4652
{{ end }}
4753
</div>
4854
{{ end }}
@@ -105,30 +111,30 @@
105111
<script>
106112
function removeMember(username) {
107113
let request = new XMLHttpRequest();
108-
request.open('POST', 'removeMember', true);
109-
request.onload = function () { // request successful
114+
request.open("POST", "removeMember", true);
115+
request.onload = function() { // request successful
110116
// we can use server response to our request now
111117
if (200 <= request.status && request.status <= 210) {
112-
location.reload()
118+
location.reload();
113119
} else {
114-
console.log(request.responseText)
120+
console.log(request.responseText);
115121
}
116122
};
117123

118-
request.send(JSON.stringify({'member': username}));
124+
request.send(JSON.stringify({ "member": username }));
119125
}
120126

121127
let confirmed = false;
122128

123129
function submitSessionChange() {
124-
let form = document.getElementById('stateForm')
130+
let form = document.getElementById("stateForm");
125131
let request = new XMLHttpRequest();
126132
request.open(form.method, form.action, true);
127-
request.onload = function () { // request successful
133+
request.onload = function() { // request successful
128134
// we can use server response to our request now
129-
console.log(request.response)
135+
console.log(request.response);
130136
if (200 <= request.status && request.status <= 210) {
131-
location.reload()
137+
location.reload();
132138
} else {
133139
console.log(request.responseText);
134140
}
@@ -138,11 +144,11 @@
138144
}
139145

140146
function dummyFunc(event) {
141-
console.log("hi")
147+
console.log("hi");
142148
if ({{ not .SessionState }}) {
143-
formSubmit(event)
149+
formSubmit(event);
144150
} else {
145-
event.preventDefault()
151+
event.preventDefault();
146152
}
147153
}
148154
</script>

0 commit comments

Comments
 (0)