Skip to content

Commit a5aedcb

Browse files
authored
Merge pull request #117 from UTDallasEPICS/feature/strike-system
Feature/strike system
2 parents 7a0cd81 + 50421d5 commit a5aedcb

12 files changed

Lines changed: 186 additions & 69 deletions

File tree

app/Admin/Manage-Teams/EditUser.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@ export default function EditUser({ userData, setEditId, mutateTeams }) {
2121
const teamId = userData["id"];
2222
const tableNumber = Number(document.getElementById("tablenumber").value);
2323
const tokenNumber = Number(document.getElementById("tokennumber").value);
24+
const strikeNumber = Number(document.getElementById("strikenumber".value));
2425
const teamData = {
2526
teamId: teamId,
2627
tableNumber: tableNumber,
2728
tokens: tokenNumber,
2829
newMembers: teamMembersValues.filter(Boolean),
2930
removeMembers: removedMembers,
31+
strikeCount: strikeNumber,
3032
};
3133
// Send request to update team data
3234
const res = await fetch("/api/admin/teams", {
@@ -94,8 +96,14 @@ export default function EditUser({ userData, setEditId, mutateTeams }) {
9496
+
9597
</button>
9698

97-
<p>Token</p>
99+
<p>Tokens</p>
98100
<input type="text" id="tokennumber" defaultValue={userData["tokens"]} />
101+
<p>Strikes</p>
102+
<input
103+
type="text"
104+
id="strikenumber"
105+
defaultValue={userData["strikeCount"]}
106+
/>
99107
<button onClick={editUserEvent}>Submit</button>
100108
<button
101109
onClick={() => {

app/Admin/Manage-Teams/manageTeams.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ hr {
5252

5353
.column-grid-2 {
5454
display: grid;
55-
grid-template-columns: 0.8fr 0.8fr 4fr 0.8fr 0.5fr;
55+
grid-template-columns: 0.8fr 0.8fr 4fr 1fr 1fr 1fr;
5656
row-gap: 0;
5757
}
5858

app/Admin/Manage-Teams/page.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ export default function ManageTeams() {
191191
<div className="cell">Table Number</div>
192192
<div className="cell">Team Members</div>
193193
<div className="cell">Tokens</div>
194+
<div className="cell">Strikes</div>
194195
<div className="cell">Options</div>
195196
</div>
196197
{/* {editUserHtml(currentEditingId)} */}
@@ -221,6 +222,7 @@ export default function ManageTeams() {
221222
</div>
222223

223224
<div className="cell-2">{item.tokens}</div>
225+
<div className="cell-2">{item.strikeCount}</div>
224226
<div className="cell-2">
225227
<button
226228
onClick={() => {

app/Borrow-Tool/page.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export default function BorrowTool() {
4141
const [toolId, setToolId] = useState(-1);
4242
const [currentTool, setToolName] = useState("Select Tool");
4343
const [currentToolLimit, setToolLimit] = useState(0);
44+
const [numStrikes, setNumStrikes] = useState(0);
4445
const [notes, setNotes] = useState("");
4546
const [dueDate, setDueDate] = useState(new Date());
4647
const [teamNumberSearch, setTeamNumberSearch] = useState("");
@@ -104,6 +105,15 @@ export default function BorrowTool() {
104105
};
105106

106107
const submitLogEvent = async () => {
108+
if (numStrikes >= 3) {
109+
if (
110+
!window.confirm(
111+
`This team has ${numStrikes} strikes. Are you sure you want to let them check out this tool?`
112+
)
113+
) {
114+
return;
115+
}
116+
}
107117
// Set to current date at 11:59 PM
108118
const theDate = new Date(dueDate.setHours(23, 59));
109119
// Create log entry data
@@ -129,6 +139,7 @@ export default function BorrowTool() {
129139
// setTeamMembers([]);
130140
setToolId(0);
131141
setToolLimit(currentToolLimit - 1);
142+
setNumStrikes(0);
132143
mutate();
133144
// document.getElementById("team-number-input").setAttribute("value", "");
134145

@@ -148,6 +159,7 @@ export default function BorrowTool() {
148159
setValidTeam(true);
149160
setTeamMembers(currentTeams[0].teamMembers);
150161
setToolLimit(currentTeams[0].tokens - currentTeams[0].tokensUsed);
162+
setNumStrikes(currentTeams[0].strikeCount);
151163
setTeamMember("Select Team Member");
152164
setMemberId(-1);
153165
setTeamId(currentTeams[0].id);
@@ -215,6 +227,8 @@ export default function BorrowTool() {
215227
/> */}
216228
<label>Tool Checkouts Remaining</label>
217229
<input type="text" value={currentToolLimit} readOnly={true} />
230+
<label>Team Strikes</label>
231+
<input type="text" value={numStrikes} readOnly={true} />
218232
<label>Team Member</label>
219233
<div className="dropdown">
220234
<button

app/Components/Dashboard.css

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
.dashboard {
22
color: #154734;
3+
margin-bottom: 1em;
34
}
45

56
.grid {
@@ -12,7 +13,7 @@
1213

1314
.column-grid {
1415
display: grid;
15-
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr; /*1fr;*/
16+
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1.5fr; /*1fr;*/
1617
}
1718

1819
.cell {
@@ -29,7 +30,7 @@
2930

3031
.column-grid-header {
3132
display: grid;
32-
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr; /* 1fr;*/
33+
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1.5fr; /* 1fr;*/
3334
background-color: #154734;
3435
color: white;
3536
}

app/Components/Dashboard.js

Lines changed: 71 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { writeFile, utils } from "xlsx";
77
// import UpdateCheckout from "@/Components/UpdateCheckout";
88
import { useState } from "react";
99
import DatePicker from "react-date-picker";
10+
import { useUser } from "@auth0/nextjs-auth0";
1011

1112
const fetcher = (...args) => fetch(...args).then((res) => res.json());
1213

@@ -22,6 +23,20 @@ export default function Dashboard() {
2223

2324
const [currentEditId, setCurrentEditId] = useState(0);
2425
const [currentDueDate, setCurrentDueDate] = useState(new Date());
26+
const [currentStrikeID, setCurrentStrikeId] = useState(0);
27+
28+
const handleCancelOrStrike = (id) => {
29+
if (currentStrikeID != 0) {
30+
setCurrentStrikeId(0);
31+
return;
32+
}
33+
if (currentEditId != 0) {
34+
setCurrentEditId(0);
35+
return;
36+
}
37+
38+
setCurrentStrikeId(id);
39+
};
2540

2641
const handleDateUpdate = async (logId, theDueDate) => {
2742
const reqData = {
@@ -38,19 +53,32 @@ export default function Dashboard() {
3853
mutate();
3954
};
4055

41-
const editCheckoutEvent = (id, dueDate) => {
56+
const editCheckoutEvent = (id, dueDate, teamId) => {
4257
// console.log(id);
4358
if (currentEditId != 0 && id == currentEditId) {
4459
// const basicDueDate = new Date(currentDueDate);
4560
const theDueDate = new Date(currentDueDate.setHours(23, 59));
4661
// console.log(theDueDate);
4762
handleDateUpdate(id, theDueDate);
4863
setCurrentEditId(0);
49-
} else {
50-
// console.log(dueDate);
51-
setCurrentDueDate(new Date(dueDate));
52-
setCurrentEditId(id);
64+
return;
5365
}
66+
67+
if (currentStrikeID != 0 && id == currentStrikeID) {
68+
addStrike(teamId);
69+
setCurrentStrikeId(0);
70+
return;
71+
}
72+
// console.log(dueDate);
73+
setCurrentDueDate(new Date(dueDate));
74+
setCurrentEditId(id);
75+
};
76+
77+
const addStrike = async (teamId) => {
78+
const apiString = "/api/teams/strikes/add/" + String(teamId);
79+
const res = await fetch(apiString);
80+
console.log(await res.json());
81+
mutate();
5482
};
5583

5684
const logCleanup = (logIn) => {
@@ -163,26 +191,45 @@ export default function Dashboard() {
163191
<p>{item.notes}</p>
164192
</div>
165193
<div className="cell">
166-
<p>
167-
<button
168-
onClick={() => {
169-
// console.log(item);
170-
editCheckoutEvent(item.id, item.dateDue);
171-
}}
172-
>
173-
{item.id === currentEditId ? "Submit" : "Edit"}
174-
</button>
175-
{item.id === currentEditId ? (
176-
<button
177-
style={{ marginTop: "1em" }}
178-
onClick={() => setCurrentEditId(0)}
194+
{/* <p> */}
195+
<div>
196+
<div className="column-grid">
197+
<div className="cell" style={{ borderStyle: "none" }}>
198+
<button
199+
onClick={() => {
200+
// console.log(item);
201+
// console.log(user);
202+
editCheckoutEvent(
203+
item.id,
204+
item.dateDue,
205+
item.teamId
206+
);
207+
}}
208+
>
209+
{item.id === currentEditId ||
210+
item.id == currentStrikeID
211+
? "Submit"
212+
: "Edit"}
213+
</button>
214+
</div>
215+
<div
216+
className="cell"
217+
style={{ borderStyle: "none", padding: "0" }}
179218
>
180-
Cancel
181-
</button>
182-
) : (
183-
""
184-
)}
185-
</p>
219+
{new Date(item.dateDue) < loadTime ||
220+
item.id === currentEditId ||
221+
item.id == currentStrikeID ? (
222+
<button onClick={() => handleCancelOrStrike(item.id)}>
223+
{item.id === currentEditId ||
224+
item.id == currentStrikeID
225+
? "Cancel"
226+
: "Strike"}
227+
</button>
228+
) : null}
229+
</div>
230+
</div>
231+
</div>
232+
{/* </p> */}
186233
</div>
187234
</div>
188235
))}

app/api/admin/teams/route.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export async function PATCH(request) {
5050
data: {
5151
tableNumber: team.tableNumber,
5252
tokens: team.tokens,
53+
strikeCount: team.strikeCount,
5354
},
5455
});
5556

@@ -116,6 +117,7 @@ export async function POST(request) {
116117
teamNumber: team.teamNumber,
117118
tableNumber: team.tableNumber,
118119
tokens: team.tokens,
120+
notes: "",
119121
},
120122
});
121123

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import prisma from "@/app/lib/prisma";
2+
import { NextResponse } from "next/server";
3+
4+
export const dynamic = "force-dynamic";
5+
export const revalidate = 0;
6+
7+
export async function GET(request, props) {
8+
const params = await props.params;
9+
const id = params.id;
10+
console.log(id);
11+
const res = await prisma.team.update({
12+
where: {
13+
id: parseInt(id),
14+
},
15+
data: {
16+
strikeCount: { increment: 1 },
17+
},
18+
});
19+
return NextResponse.json(res);
20+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import prisma from "@/app/lib/prisma";
2+
import { NextResponse } from "next/server";
3+
4+
export const dynamic = "force-dynamic";
5+
export const revalidate = 0;
6+
7+
export async function POST(request) {
8+
const { update } = await request.json();
9+
// console.log(update);
10+
const res = await prisma.log.update({
11+
where: {
12+
id: parseInt(update.id),
13+
},
14+
data: {
15+
strikeCount: update.strikeCount,
16+
},
17+
});
18+
return NextResponse.json(res);
19+
}

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
},
1616
"dependencies": {
1717
"@auth0/nextjs-auth0": "~4.7.0",
18-
"@prisma/client": "^6.11.0",
18+
"@prisma/client": "^6.11.1",
1919
"dotenv-cli": "^8.0.0",
2020
"eslint": "^9.30.1",
2121
"eslint-config-next": "~15.3.4",
@@ -27,6 +27,6 @@
2727
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz"
2828
},
2929
"devDependencies": {
30-
"prisma": "^6.11.0"
30+
"prisma": "^6.11.1"
3131
}
3232
}

0 commit comments

Comments
 (0)