From 2c32ab8320ae8bfc302bba810717a27cb2997c75 Mon Sep 17 00:00:00 2001 From: Ryan Bauroth <25bauroth@da.org> Date: Thu, 15 Feb 2024 14:27:24 -0500 Subject: [PATCH 01/11] added multiscouting overlap check under teams page --- pages/teams.vue | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/pages/teams.vue b/pages/teams.vue index 049b1d8..2aa9fa8 100644 --- a/pages/teams.vue +++ b/pages/teams.vue @@ -53,13 +53,32 @@ let teamOrgMatches = new Map>() for(let i = 0; i < match.length; i++){ let currentMatch = (await match[i]) - if (!teamOrgMatches.has(currentMatch.teamNumber)) - teamOrgMatches.set(currentMatch.teamNumber, [currentMatch]) + let team = typeof currentMatch.teamNumber == "string" ? parseInt(currentMatch.teamNumber): currentMatch.teamNumber + if (!teamOrgMatches.has(team)) + teamOrgMatches.set(team, [currentMatch]) else - teamOrgMatches.get(currentMatch.teamNumber)!.push(currentMatch) + teamOrgMatches.get(team)!.push(currentMatch) } -let teamsData= ref>([]) + +/* +If there are two overlapping matches uses data from only one of them (very basic system needs improvement) + */ +for(let team of teamOrgMatches){ + let matches = teamOrgMatches.get(team[0]) + let matchNumbers: number[] = [] + if(matches) { + for (let i = 0; i < matches.length; i++) { + let currMatch = matches[i].matchNumber + if(matchNumbers.includes(currMatch)) { + teamOrgMatches.set(team[0], team[1].splice(i, 1)) + } + else matchNumbers.push(currMatch) + } + } +} + +let teamsData = ref>([]) function tableSetup() { teamsData.value.length = 0 From be5e04b1c29ad2480607851c61d1eec2336bac04 Mon Sep 17 00:00:00 2001 From: Ryan Bauroth <25bauroth@da.org> Date: Thu, 15 Feb 2024 16:14:49 -0500 Subject: [PATCH 02/11] added matches filter and eventOptions.ts --- pages/teams.vue | 72 ++++++++++++++++++++++++++++--------------- utils/eventOptions.ts | 2 +- 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/pages/teams.vue b/pages/teams.vue index 2aa9fa8..fc85da2 100644 --- a/pages/teams.vue +++ b/pages/teams.vue @@ -60,7 +60,6 @@ for(let i = 0; i < match.length; i++){ teamOrgMatches.get(team)!.push(currentMatch) } - /* If there are two overlapping matches uses data from only one of them (very basic system needs improvement) */ @@ -80,26 +79,50 @@ for(let team of teamOrgMatches){ let teamsData = ref>([]) -function tableSetup() { +async function tableSetup() { teamsData.value.length = 0 + + /* + Creates two arrays that are filters applied on all data for team numbers and events (includes match number filter) + */ + let allowedEvents = [] + let allowedTeams = [] + for (let filter of selectedFilters.value) { + if (filter.content.startsWith("event:")) { + allowedEvents.push(filter.content.split(":")[1].trim()) + } + if (filter.content.startsWith("team:")) { + allowedTeams.push(filter.content.split(":")[1].trim()) + } + if (filter.content.startsWith("match")) { + let tbaMatchData = await getEventMatches(currentEvent) + let userInput = parseInt(filter.content.split(':')[1].trim()) + for(let match of tbaMatchData){ + if(match.comp_level == "qm" && match.match_number == userInput){ + for(let team of match.alliances.blue.team_keys){ + let cleanedTeam = team.replace("frc", "") + if(!allowedTeams.includes(cleanedTeam)) { + allowedTeams.push(cleanedTeam) + } + } + for(let team of match.alliances.red.team_keys){ + let cleanedTeam = team.replace("frc", "") + if(!allowedTeams.includes(cleanedTeam)) { + allowedTeams.push(cleanedTeam) + } + } + } + } + } + } tableLoop: for (let [key, value] of teamOrgMatches) { /* Data is an array of all matches, associated with a team (key), for the event filters selected */ let data: any = [] - let allowedEvents = [] - let allowedTeams = [] - for(let filter of selectedFilters.value){ - if(filter.content.startsWith("event:")){ - allowedEvents.push(filter.content.split(":")[1].trim()) - } - if(filter.content.startsWith("team:")){ - allowedTeams.push(filter.content.split(":")[1].trim()) - } - } - if(allowedTeams.includes(key.toString()) || allowedTeams.length == 0){ - for(let match of value){ - if(allowedEvents.includes(match.event)){ + if (allowedTeams.includes(key.toString()) || allowedTeams.length == 0) { + for (let match of value) { + if (allowedEvents.includes(match.event)) { data.push(match) } } @@ -109,34 +132,33 @@ function tableSetup() { */ for (let filter of selectedFilters.value) { - if(filter.id == 0){ + if (filter.id == 0) { let hasClimb = false - for(let match of data){ - if(match.endgame.endgame.includes("Onstage") || match.endgame.endgame.includes("Attempted Onstage")){ + for (let match of data) { + if (match.endgame.endgame.includes("Onstage") || match.endgame.endgame.includes("Attempted Onstage")) { hasClimb = true break } } - if(!hasClimb){ + if (!hasClimb) { continue tableLoop } } - if(filter.id == 1){ + if (filter.id == 1) { let hasAuto = false - for(let match of data){ - if(match.auto.amp > 0 || match.auto.speaker > 0 || match.auto.mobility == true){ + for (let match of data) { + if (match.auto.amp > 0 || match.auto.speaker > 0 || match.auto.mobility == true) { hasAuto = true break } } - if(!hasAuto){ + if (!hasAuto) { continue tableLoop } } - } - if(data.length > 0) { + if (data.length > 0) { let arr = { team: key, amp: getAverageAmpCycles(data).toFixed(2), diff --git a/utils/eventOptions.ts b/utils/eventOptions.ts index 02ee321..11b3583 100644 --- a/utils/eventOptions.ts +++ b/utils/eventOptions.ts @@ -1 +1 @@ -export const eventOptions = ['2024test', '2024trial'] \ No newline at end of file +export const eventOptions = ['2024test', '2024trial', '2023ncash'] \ No newline at end of file From 6d749a32e08400c6e1fbd0fdcae0e41d8eb23e56 Mon Sep 17 00:00:00 2001 From: Ryan Bauroth <25bauroth@da.org> Date: Thu, 15 Feb 2024 16:15:05 -0500 Subject: [PATCH 03/11] tba.ts added --- utils/tba.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 utils/tba.ts diff --git a/utils/tba.ts b/utils/tba.ts new file mode 100644 index 0000000..414cf11 --- /dev/null +++ b/utils/tba.ts @@ -0,0 +1,18 @@ +//const TBA_KEY = process.env.TBA_KEY +//this is alr leaked so i dont feel bad :shrug: +const TBA_KEY = 'JBP0wpGwe79xWOVzDXWFKxgmFhZEmrIgVluq3PZf4z9OVcvROKTjnTrRu7D9rsUz' + +export async function getEventMatches(event: string) { + if (TBA_KEY != undefined) { + let urlNoNum: string = "https://www.thebluealliance.com/api/v3/"; + let urlFinal: string = urlNoNum + "event/" + event + "/matches"; + let grab: any; + grab = await fetch(urlFinal, { + method: 'GET', + headers: { + 'X-TBA-Auth-Key': TBA_KEY + } + }); + return await grab.json(); + } +} \ No newline at end of file From 0322edd80581b1afdd9ccd5462d451e8ec9e413b Mon Sep 17 00:00:00 2001 From: Ryan Bauroth <25bauroth@da.org> Date: Thu, 15 Feb 2024 17:19:00 -0500 Subject: [PATCH 04/11] updated multiscouting, fixed some scout page issues, added scoreMatch.ts --- pages/scout.vue | 4 ++-- pages/teams.vue | 2 +- utils/databases.ts | 10 +++++----- utils/scoreMatch.ts | 9 +++++++++ 4 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 utils/scoreMatch.ts diff --git a/pages/scout.vue b/pages/scout.vue index cee3826..7217c97 100644 --- a/pages/scout.vue +++ b/pages/scout.vue @@ -49,9 +49,9 @@ let impData = { let data = ref({ + event: "", teamNumber: null, matchNumber: null, - event: "", auto: { speakerNA: 0, amp: 0, @@ -94,7 +94,7 @@ function isValidNum() { } async function submit() { - data.value.event = selectedEvent.value || "" + data.value.event = selectedEvent || "" let newDoc = db.post(data.value) await navigateTo("/matches") } diff --git a/pages/teams.vue b/pages/teams.vue index fc85da2..55f9719 100644 --- a/pages/teams.vue +++ b/pages/teams.vue @@ -70,7 +70,7 @@ for(let team of teamOrgMatches){ for (let i = 0; i < matches.length; i++) { let currMatch = matches[i].matchNumber if(matchNumbers.includes(currMatch)) { - teamOrgMatches.set(team[0], team[1].splice(i, 1)) + teamOrgMatches.set(team[0], team[1].splice(team[1].indexOf(currMatch), 1)) } else matchNumbers.push(currMatch) } diff --git a/utils/databases.ts b/utils/databases.ts index 9e2d528..fea5978 100644 --- a/utils/databases.ts +++ b/utils/databases.ts @@ -17,17 +17,17 @@ class LocalRemoteDatabaseSyncHolder { PouchDB.sync(this.local, this.remote, {live: true, retry: true,}) } - static databases: { attachments: LocalRemoteDatabaseSyncHolder<{ event: any; name: string; teamNumber: number; fileSize: string; author : string | undefined; tags: string[] ; extraNotes: string }>; scoutingData: LocalRemoteDatabaseSyncHolder<{ event: any; teamNumber: number; matchNumber: number }>; basic: LocalRemoteDatabaseSyncHolder<{}> } = { - "attachments": new LocalRemoteDatabaseSyncHolder<{ event: any; name: string; teamNumber: number; fileSize: string; author : string | undefined; tags: string[] ; extraNotes: string }>("attachment-db"), - "scoutingData": new LocalRemoteDatabaseSyncHolder<{ event: any; teamNumber: number; matchNumber: number }>("scouting-data"), + static databases: { attachments: LocalRemoteDatabaseSyncHolder<{ event: string; name: string; teamNumber: number; fileSize: string; author : string | undefined; tags: string[] ; extraNotes: string }>; scoutingData: LocalRemoteDatabaseSyncHolder<{ event: string; teamNumber: number; matchNumber: number }>; basic: LocalRemoteDatabaseSyncHolder<{}> } = { + "attachments": new LocalRemoteDatabaseSyncHolder<{ event: string; name: string; teamNumber: number; fileSize: string; author : string | undefined; tags: string[] ; extraNotes: string }>("attachment-db"), + "scoutingData": new LocalRemoteDatabaseSyncHolder<{ event: string; teamNumber: number; matchNumber: number }>("scouting-data"), "basic": new LocalRemoteDatabaseSyncHolder<{}>("basic") }; - static locals: { attachments: PouchDB.Database<{ event: any; name: string; teamNumber: number; fileSize: string; author : string | undefined; tags: string[] ; extraNotes: string }>; scoutingData: PouchDB.Database<{ event: any; teamNumber: number; matchNumber: number}>; basic: PouchDB.Database<{}> } = { + static locals: { attachments: PouchDB.Database<{ event: string; name: string; teamNumber: number; fileSize: string; author : string | undefined; tags: string[] ; extraNotes: string }>; scoutingData: PouchDB.Database<{ event: string; teamNumber: number; matchNumber: number}>; basic: PouchDB.Database<{}> } = { "attachments": this.databases.attachments.local, "scoutingData": this.databases.scoutingData.local, "basic": this.databases.basic.local, }; - static remotes: { attachments: PouchDB.Database<{ event: any; name: string; teamNumber: number; fileSize: string; author : string | undefined; tags: string[] ; extraNotes: string }>; scoutingData: PouchDB.Database<{ event: any; teamNumber: number; matchNumber: number}>; basic: PouchDB.Database<{}> } = { + static remotes: { attachments: PouchDB.Database<{ event: string; name: string; teamNumber: number; fileSize: string; author : string | undefined; tags: string[] ; extraNotes: string }>; scoutingData: PouchDB.Database<{ event: string; teamNumber: number; matchNumber: number}>; basic: PouchDB.Database<{}> } = { "attachments": this.databases.attachments.remote, "scoutingData": this.databases.scoutingData.remote, "basic": this.databases.basic.remote, diff --git a/utils/scoreMatch.ts b/utils/scoreMatch.ts new file mode 100644 index 0000000..e386af8 --- /dev/null +++ b/utils/scoreMatch.ts @@ -0,0 +1,9 @@ +export function scoreMatch(match: any){ + let autoScores = match.auto.speakerNA * 5 + match.auto.amp * 2 + match.auto.mobility * 2 + let teleopScores = match.teleop.speakerNA * 2 + match.teleop.speakerA * 5 + match.teleop.amp + let endgameScores = match.endgame.trap * 5 + if(match.endgame.endgame.includes("Parked")) endgameScores += 1 + if(match.endgame.endgame.includes("Onstage")) endgameScores += 3 + if(match.endgame.endgame.includes("Harmony")) endgameScores += 2 + return autoScores + teleopScores + endgameScores +} \ No newline at end of file From f0eb39cd4dfecfb3493ce752356bed7657d8f391 Mon Sep 17 00:00:00 2001 From: Ryan Bauroth <25bauroth@da.org> Date: Thu, 15 Feb 2024 17:22:37 -0500 Subject: [PATCH 05/11] fixed a bug on the match page --- pages/matches.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/matches.vue b/pages/matches.vue index e3fb99a..e986dac 100644 --- a/pages/matches.vue +++ b/pages/matches.vue @@ -15,7 +15,7 @@ let matc = matche.map(async (doc) => { }) let matches = await Promise.all(matc) for (let i=matches.length-1; i>=0; i--) { - if(matches[i].matchNumber === -1 || matches[i].matchNumber === null || (matches[i].event != currentEvent.value)) matches.splice(i, 1) + if(matches[i].matchNumber === -1 || matches[i].matchNumber === null || (matches[i].event != currentEvent)) matches.splice(i, 1) } const headers = [ From 9db3ae479669ce4175b5491b4a60c2b976afe3a0 Mon Sep 17 00:00:00 2001 From: Ryan Bauroth <25bauroth@da.org> Date: Fri, 16 Feb 2024 13:46:35 -0500 Subject: [PATCH 06/11] added some security to TBA --- nuxt.config.ts | 5 +++- pages/teams.vue | 30 +++++++++++++---------- server/api/eventMatches/[event].ts | 39 ++++++++++++++++++++++++++++++ utils/tba.ts | 18 -------------- 4 files changed, 60 insertions(+), 32 deletions(-) create mode 100644 server/api/eventMatches/[event].ts delete mode 100644 utils/tba.ts diff --git a/nuxt.config.ts b/nuxt.config.ts index 757e30e..8a049bf 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -62,5 +62,8 @@ export default defineNuxtConfig({ }, }, }, - logLevel: "verbose" + logLevel: "verbose", + runtimeConfig:{ + TBA_Key: process.env.TBA_KEY, + } }) diff --git a/pages/teams.vue b/pages/teams.vue index 55f9719..9a9ab67 100644 --- a/pages/teams.vue +++ b/pages/teams.vue @@ -17,6 +17,7 @@ let options = { const events = eventOptions const currentEvent = localStorage.getItem('currentEvent') || eventOptions[0] +const fetch = useFetch>("/api/eventMatches/" + currentEvent) let customOptions = ['Has Climb', 'Has Auto'] for(let event of events){ @@ -95,20 +96,23 @@ async function tableSetup() { allowedTeams.push(filter.content.split(":")[1].trim()) } if (filter.content.startsWith("match")) { - let tbaMatchData = await getEventMatches(currentEvent) - let userInput = parseInt(filter.content.split(':')[1].trim()) - for(let match of tbaMatchData){ - if(match.comp_level == "qm" && match.match_number == userInput){ - for(let team of match.alliances.blue.team_keys){ - let cleanedTeam = team.replace("frc", "") - if(!allowedTeams.includes(cleanedTeam)) { - allowedTeams.push(cleanedTeam) + //TODO figure out async stuff + let tbaMatchData = fetch.data.value + if(tbaMatchData != null){ + let userInput = parseInt(filter.content.split(':')[1].trim()) + for(let match of tbaMatchData){ + if(match.comp_level == "qm" && match.match_number == userInput){ + for(let team of match.alliances.blue.team_keys){ + let cleanedTeam = team.replace("frc", "") + if(!allowedTeams.includes(cleanedTeam)) { + allowedTeams.push(cleanedTeam) + } } - } - for(let team of match.alliances.red.team_keys){ - let cleanedTeam = team.replace("frc", "") - if(!allowedTeams.includes(cleanedTeam)) { - allowedTeams.push(cleanedTeam) + for(let team of match.alliances.red.team_keys){ + let cleanedTeam = team.replace("frc", "") + if(!allowedTeams.includes(cleanedTeam)) { + allowedTeams.push(cleanedTeam) + } } } } diff --git a/server/api/eventMatches/[event].ts b/server/api/eventMatches/[event].ts new file mode 100644 index 0000000..b79c64a --- /dev/null +++ b/server/api/eventMatches/[event].ts @@ -0,0 +1,39 @@ +//const TBA_KEY = process.env.TBA_KEY +//this is alr leaked so i dont feel bad :shrug: +const TBA_KEY = 'JBP0wpGwe79xWOVzDXWFKxgmFhZEmrIgVluq3PZf4z9OVcvROKTjnTrRu7D9rsUz' + +/*export async function getEventMatches(event: string) { + console.log(useRuntimeConfig().TBA_Key) + if (TBA_KEY != undefined) { + let urlNoNum: string = "https://www.thebluealliance.com/api/v3/"; + let urlFinal: string = urlNoNum + "event/" + event + "/matches"; + let grab: any; + grab = await fetch(urlFinal, { + method: 'GET', + headers: { + 'X-TBA-Auth-Key': TBA_KEY + } + }); + return await grab.json(); + } +}*/ + +export default defineEventHandler(async (event) => { + const eventKey = getRouterParam(event, 'event') + let config = useRuntimeConfig() + if (config.TBA_Key != undefined) { + let urlNoNum: string = "https://www.thebluealliance.com/api/v3/"; + let urlFinal: string = urlNoNum + "event/" + eventKey + "/matches"; + let grab: any; + grab = await fetch(urlFinal, { + method: 'GET', + headers: { + 'X-TBA-Auth-Key': TBA_KEY + } + }); + return await grab.json(); + } + else{ + throw new Error("Server side error"); + } +}) \ No newline at end of file diff --git a/utils/tba.ts b/utils/tba.ts deleted file mode 100644 index 414cf11..0000000 --- a/utils/tba.ts +++ /dev/null @@ -1,18 +0,0 @@ -//const TBA_KEY = process.env.TBA_KEY -//this is alr leaked so i dont feel bad :shrug: -const TBA_KEY = 'JBP0wpGwe79xWOVzDXWFKxgmFhZEmrIgVluq3PZf4z9OVcvROKTjnTrRu7D9rsUz' - -export async function getEventMatches(event: string) { - if (TBA_KEY != undefined) { - let urlNoNum: string = "https://www.thebluealliance.com/api/v3/"; - let urlFinal: string = urlNoNum + "event/" + event + "/matches"; - let grab: any; - grab = await fetch(urlFinal, { - method: 'GET', - headers: { - 'X-TBA-Auth-Key': TBA_KEY - } - }); - return await grab.json(); - } -} \ No newline at end of file From 120aad4742f378410a86e8c9478147577108fc13 Mon Sep 17 00:00:00 2001 From: Ryan Bauroth <25bauroth@da.org> Date: Fri, 16 Feb 2024 13:48:05 -0500 Subject: [PATCH 07/11] removed coach role --- pages/users.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/users.vue b/pages/users.vue index f152f52..fd67f59 100644 --- a/pages/users.vue +++ b/pages/users.vue @@ -7,7 +7,7 @@ let username = ref("") let roles = ref([[""]]) - const roleOptions = ["Admin", "Coach", "Scout"] + const roleOptions = ["Coach", "Scout"] let prevRoles: string[][] = [[]] let resetRoles = false From db6db8cdd65970ef386a3ca1d25e9e9f0b268390 Mon Sep 17 00:00:00 2001 From: Ryan Bauroth <25bauroth@da.org> Date: Fri, 16 Feb 2024 14:22:22 -0500 Subject: [PATCH 08/11] added alliance colors and sorting to teams filters. also fixed a bug with trap incremental button that allowed it to go over 3 --- pages/scout.vue | 2 +- pages/teams.vue | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/pages/scout.vue b/pages/scout.vue index 7217c97..46f78f3 100644 --- a/pages/scout.vue +++ b/pages/scout.vue @@ -173,7 +173,7 @@ async function submit() {

Trap

- +

diff --git a/pages/teams.vue b/pages/teams.vue index 9a9ab67..7fea027 100644 --- a/pages/teams.vue +++ b/pages/teams.vue @@ -88,6 +88,8 @@ async function tableSetup() { */ let allowedEvents = [] let allowedTeams = [] + let blueAlliance = [] + let redAlliance = [] for (let filter of selectedFilters.value) { if (filter.content.startsWith("event:")) { allowedEvents.push(filter.content.split(":")[1].trim()) @@ -106,12 +108,14 @@ async function tableSetup() { let cleanedTeam = team.replace("frc", "") if(!allowedTeams.includes(cleanedTeam)) { allowedTeams.push(cleanedTeam) + blueAlliance.push(cleanedTeam) } } for(let team of match.alliances.red.team_keys){ let cleanedTeam = team.replace("frc", "") if(!allowedTeams.includes(cleanedTeam)) { allowedTeams.push(cleanedTeam) + redAlliance.push(cleanedTeam) } } } @@ -124,6 +128,9 @@ async function tableSetup() { Data is an array of all matches, associated with a team (key), for the event filters selected */ let data: any = [] + //if sorted by match apply alliance colors + let alliance = blueAlliance.includes(key.toString()) ? "bg-blue-100": redAlliance.includes(key.toString()) ? "bg-red-100": "" + if (allowedTeams.includes(key.toString()) || allowedTeams.length == 0) { for (let match of value) { if (allowedEvents.includes(match.event)) { @@ -169,11 +176,22 @@ async function tableSetup() { speaker: getAverageSpeakerCycles(data).toFixed(2), mobility: averageAuto(data).toFixed(2), sentiment: analyzeNotes(data).toFixed(2), - endgame: compileEndgames(data) + endgame: compileEndgames(data), + class: alliance } teamsData.value.push(arr) } } + + //Defaults to the alliance colors being together if match filter is selected + if(redAlliance.length > 0 || blueAlliance.length > 0){ + let sortedData = [] + for(let team of teamsData.value){ + if(team.class == "bg-blue-100") sortedData.unshift(team) + else sortedData.push(team) + } + teamsData.value = sortedData + } } function analyzeNotes(teamArrays: Array){ From b09c63f30c20fe7ce302f28981ab5fc749352f1a Mon Sep 17 00:00:00 2001 From: Ryan Bauroth <25bauroth@da.org> Date: Fri, 16 Feb 2024 14:31:39 -0500 Subject: [PATCH 09/11] fixed a bug with events that restricted match selections (ie typing in match 2 with an event: 2023ncash didn't work) --- pages/teams.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/teams.vue b/pages/teams.vue index 7fea027..5d27b1b 100644 --- a/pages/teams.vue +++ b/pages/teams.vue @@ -15,7 +15,7 @@ let options = { } } -const events = eventOptions +const events = eventOptions.map((event) => event.replace(/[0-9]/g, '')) const currentEvent = localStorage.getItem('currentEvent') || eventOptions[0] const fetch = useFetch>("/api/eventMatches/" + currentEvent) @@ -23,7 +23,7 @@ let customOptions = ['Has Climb', 'Has Auto'] for(let event of events){ customOptions.push('event: ' + event) } -let currentEventID = customOptions.indexOf('event: ' + currentEvent) +let currentEventID = customOptions.indexOf('event: ' + currentEvent.replace(/[0-9]/g, '')) const filterOptions = ref( Array(customOptions.length) .fill({ id: 0, content: "", custom: false}) @@ -31,7 +31,7 @@ const filterOptions = ref( (_, index) => ({ id: index, content: customOptions[index], custom: false}) ) ) -const currentEventFilter = { id: currentEventID, content: 'event: ' + currentEvent, custom: false } +const currentEventFilter = { id: currentEventID, content: 'event: ' + currentEvent.replace(/[0-9]/g, ''), custom: false } const selectedFilters = ref>([currentEventFilter]) watch(selectedFilters, () => { tableSetup() @@ -133,7 +133,7 @@ async function tableSetup() { if (allowedTeams.includes(key.toString()) || allowedTeams.length == 0) { for (let match of value) { - if (allowedEvents.includes(match.event)) { + if (allowedEvents.includes(match.event.replace(/[0-9]/g, ''))) { data.push(match) } } From ae9cac0a07ffae4bd31fe229c967a13cbc807b1b Mon Sep 17 00:00:00 2001 From: Ryan Bauroth <25bauroth@da.org> Date: Fri, 16 Feb 2024 15:14:33 -0500 Subject: [PATCH 10/11] fixed configs for color and stuff. also added dark mode switcher --- app.config.ts | 23 ++++++++++++++++- components/OuterComponents.vue | 21 +++++++++++++++ nuxt.config.ts | 47 +++++++++++++++++++--------------- 3 files changed, 69 insertions(+), 22 deletions(-) diff --git a/app.config.ts b/app.config.ts index 4a67daf..c6c4721 100644 --- a/app.config.ts +++ b/app.config.ts @@ -1 +1,22 @@ -export default defineAppConfig({}) \ No newline at end of file +export default defineAppConfig({ + ui: { + primary: 'coral', + gray: 'cool' + }, + buildModules: ['@nuxtjs/pwa'], + pwa: { + manifest: { + name: 'Fire hydrant surveyor', + short_name: 'Hydrant Surveyor', + lang: 'en', + display: 'standalone', + }, + workbox: { + enabled: true + } + }, + notifications: { + // Show toasts at the top right of the screen + position: 'top-0 right-0' + } +}) \ No newline at end of file diff --git a/components/OuterComponents.vue b/components/OuterComponents.vue index 332406c..318f385 100644 --- a/components/OuterComponents.vue +++ b/components/OuterComponents.vue @@ -12,6 +12,17 @@ import {eventOptions} from "~/utils/eventOptions"; const usersDB = new PouchDB(`${couchDBBaseURL}/_users`, {skip_setup: true}); const session = await usersDB.getSession() +const colorMode = useColorMode() +const isDark = computed({ + get () { + return colorMode.value === 'dark' + }, + set () { + colorMode.preference = colorMode.value === 'dark' ? 'light' : 'dark' + } +}) + + let {width, height} = useWindowSize() let route = useRoute() @@ -67,6 +78,16 @@ if (session.userCtx.roles?.indexOf("_admin") != -1) { +
+ + + diff --git a/nuxt.config.ts b/nuxt.config.ts index 8a049bf..1f26229 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -29,32 +29,11 @@ export default defineNuxtConfig({ }) } ], - buildModules: ['@nuxtjs/pwa'], - pwa: { - manifest: { - name: 'Fire hydrant surveyor', - short_name: 'Hydrant Surveyor', - lang: 'en', - display: 'standalone', - }, - workbox: { - enabled: true - } - }, plugins: [ '~/plugins/vuetify.ts' ], devtools: { enabled: true }, ssr: false, - ui: { - global: true, - primary: "rose", - gray: "cool", - notifications: { - // Show toasts at the top right of the screen - position: 'top-0 right-0' - } - }, vite: { vue: { template: { @@ -65,5 +44,31 @@ export default defineNuxtConfig({ logLevel: "verbose", runtimeConfig:{ TBA_Key: process.env.TBA_KEY, + }, + colorMode: { + preference: 'light' //eventually we will add color mode preference + }, + tailwindcss:{ + config:{ + theme: { + extend: { + colors: { + coral: { + '50': '#fef3f2', + '100': '#fee4e2', + '200': '#fececa', + '300': '#fcaca5', + '400': '#f88379', + '500': '#ee5245', + '600': '#db3527', + '700': '#b9281c', + '800': '#99251b', + '900': '#7f251d', + '950': '#450f0a', + } + } + } + } + } } }) From 9e27c5dd3bae2c5ed7afb673265167a2fbe63fc5 Mon Sep 17 00:00:00 2001 From: Ryan Bauroth <25bauroth@da.org> Date: Fri, 16 Feb 2024 15:38:12 -0500 Subject: [PATCH 11/11] fixed bug got rid of tba key leak --- components/FilterMultiSelect.vue | 7 +++---- server/api/eventMatches/[event].ts | 22 +--------------------- 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/components/FilterMultiSelect.vue b/components/FilterMultiSelect.vue index be9b757..fa51af1 100644 --- a/components/FilterMultiSelect.vue +++ b/components/FilterMultiSelect.vue @@ -32,16 +32,15 @@ const value = computed({ } } for(let selectedOption of value){ - if(!props.options.includes(selectedOption)){ + if(!props.options.includes(selectedOption)) { let optionExists = false - for(let option in props.options){ - if(props.options[2].id == selectedOption.id){ + for (let option of props.options) { + if (option.id == selectedOption.id) { optionExists = true } } if(!optionExists){ props.options.push(selectedOption) - } } } diff --git a/server/api/eventMatches/[event].ts b/server/api/eventMatches/[event].ts index b79c64a..b0c44e5 100644 --- a/server/api/eventMatches/[event].ts +++ b/server/api/eventMatches/[event].ts @@ -1,23 +1,3 @@ -//const TBA_KEY = process.env.TBA_KEY -//this is alr leaked so i dont feel bad :shrug: -const TBA_KEY = 'JBP0wpGwe79xWOVzDXWFKxgmFhZEmrIgVluq3PZf4z9OVcvROKTjnTrRu7D9rsUz' - -/*export async function getEventMatches(event: string) { - console.log(useRuntimeConfig().TBA_Key) - if (TBA_KEY != undefined) { - let urlNoNum: string = "https://www.thebluealliance.com/api/v3/"; - let urlFinal: string = urlNoNum + "event/" + event + "/matches"; - let grab: any; - grab = await fetch(urlFinal, { - method: 'GET', - headers: { - 'X-TBA-Auth-Key': TBA_KEY - } - }); - return await grab.json(); - } -}*/ - export default defineEventHandler(async (event) => { const eventKey = getRouterParam(event, 'event') let config = useRuntimeConfig() @@ -28,7 +8,7 @@ export default defineEventHandler(async (event) => { grab = await fetch(urlFinal, { method: 'GET', headers: { - 'X-TBA-Auth-Key': TBA_KEY + 'X-TBA-Auth-Key': config.TBA_Key } }); return await grab.json();