diff --git a/couchdb/data/shards/00000000-7fffffff/denver_fr.1648095983.couch b/couchdb/data/shards/00000000-7fffffff/denver_fr.1648095983.couch index 5243623..6e46507 100644 Binary files a/couchdb/data/shards/00000000-7fffffff/denver_fr.1648095983.couch and b/couchdb/data/shards/00000000-7fffffff/denver_fr.1648095983.couch differ diff --git a/couchdb/data/shards/00000000-7fffffff/denver_practice.1648095935.couch b/couchdb/data/shards/00000000-7fffffff/denver_practice.1648095935.couch index b932b2d..15b5482 100644 Binary files a/couchdb/data/shards/00000000-7fffffff/denver_practice.1648095935.couch and b/couchdb/data/shards/00000000-7fffffff/denver_practice.1648095935.couch differ diff --git a/couchdb/data/shards/00000000-7fffffff/testdata.1643440069.couch b/couchdb/data/shards/00000000-7fffffff/testdata.1643440069.couch index c7238f2..23a0ed4 100644 Binary files a/couchdb/data/shards/00000000-7fffffff/testdata.1643440069.couch and b/couchdb/data/shards/00000000-7fffffff/testdata.1643440069.couch differ diff --git a/couchdb/data/shards/80000000-ffffffff/denver_fr.1648095983.couch b/couchdb/data/shards/80000000-ffffffff/denver_fr.1648095983.couch index 0a16adf..7e482ac 100644 Binary files a/couchdb/data/shards/80000000-ffffffff/denver_fr.1648095983.couch and b/couchdb/data/shards/80000000-ffffffff/denver_fr.1648095983.couch differ diff --git a/couchdb/data/shards/80000000-ffffffff/denver_practice.1648095935.couch b/couchdb/data/shards/80000000-ffffffff/denver_practice.1648095935.couch index 381af33..2252b43 100644 Binary files a/couchdb/data/shards/80000000-ffffffff/denver_practice.1648095935.couch and b/couchdb/data/shards/80000000-ffffffff/denver_practice.1648095935.couch differ diff --git a/couchdb/data/shards/80000000-ffffffff/testdata.1643440069.couch b/couchdb/data/shards/80000000-ffffffff/testdata.1643440069.couch index 2b62d57..da3daa1 100644 Binary files a/couchdb/data/shards/80000000-ffffffff/testdata.1643440069.couch and b/couchdb/data/shards/80000000-ffffffff/testdata.1643440069.couch differ diff --git a/docker-compose.couch.yml b/docker-compose.couch.yml new file mode 100644 index 0000000..82a3786 --- /dev/null +++ b/docker-compose.couch.yml @@ -0,0 +1,32 @@ +version: "3" + +services: + couchdb: + container_name: "scouting-couchdb" + restart: unless-stopped + env_file: + - .env + build: + context: ./couchdb + dockerfile: ./Dockerfile + expose: + - 5984 + ports: + - "5984:5984" + environment: + - COUCHDB_HOST=couchdb + - COUCHDB_PORT=5984 + - COUCHDB_USER=${COUCHDB_USER} + - COUCHDB_PASSWORD=${COUCHDB_PASSWORD} + volumes: + - ./couchdb/db.local.ini:/opt/couchdb/etc/local.ini + - ./couchdb/data:/opt/couchdb/data + # couch-ssl-proxy: + # image: fsouza/docker-ssl-proxy + # ports: + # - "5985:5985" + # environment: + # - DOMAIN=10.43.88.1 + # - TARGET_PORT=5984 + # - TARGET_HOST=scouting-couchdb + # - SSL_PORT:5985 \ No newline at end of file diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index f933946..075e17c 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -26,33 +26,4 @@ services: # - DOMAIN=10.43.88.1 # - TARGET_PORT=8080 # - TARGET_HOST=scouting-webserver-prod - # - SSL_PORT:443 - couchdb: - container_name: "scouting-couchdb" - restart: unless-stopped - env_file: - - .env - build: - context: ./couchdb - dockerfile: ./Dockerfile - expose: - - 5984 - ports: - - "5984:5984" - environment: - - COUCHDB_HOST=couchdb - - COUCHDB_PORT=5984 - - COUCHDB_USER=${COUCHDB_USER} - - COUCHDB_PASSWORD=${COUCHDB_PASSWORD} - volumes: - - ./couchdb/db.local.ini:/opt/couchdb/etc/local.ini - - ./couchdb/data:/opt/couchdb/data - # couch-ssl-proxy: - # image: fsouza/docker-ssl-proxy - # ports: - # - "5985:5985" - # environment: - # - DOMAIN=10.43.88.1 - # - TARGET_PORT=5984 - # - TARGET_HOST=scouting-couchdb - # - SSL_PORT:5985 + # - SSL_PORT:443 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index b602cf1..fe880cc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,24 +14,4 @@ services: ports: - "3000:3000" environment: - - CHOKIDAR_USEPOLLING=true - couchdb: - container_name: "scouting-couchdb" - restart: unless-stopped - env_file: - - .env - build: - context: ./couchdb - dockerfile: ./Dockerfile - expose: - - 5984 - ports: - - "5984:5984" - environment: - - COUCHDB_HOST=couchdb - - COUCHDB_PORT=5984 - - COUCHDB_USER=${COUCHDB_USER} - - COUCHDB_PASSWORD=${COUCHDB_PASSWORD} - volumes: - - ./couchdb/db.local.ini:/opt/couchdb/etc/local.ini - - ./couchdb/data:/opt/couchdb/data \ No newline at end of file + - CHOKIDAR_USEPOLLING=true \ No newline at end of file diff --git a/start_couch.sh b/start_couch.sh new file mode 100644 index 0000000..db252b0 --- /dev/null +++ b/start_couch.sh @@ -0,0 +1 @@ +docker-compose -f docker-compose.couch.yml up -d --build \ No newline at end of file diff --git a/webserver/src/App.jsx b/webserver/src/App.jsx index 623a9c5..80e6d64 100644 --- a/webserver/src/App.jsx +++ b/webserver/src/App.jsx @@ -12,6 +12,7 @@ import WelcomePage from "./Pages/WelcomePage"; import InputPage from "./Pages/InputPage"; import { createTheme, ThemeProvider } from "@mui/material"; import { ProcessedDataBucketProvider } from "./ProcessedDataBucketContext"; +import NotesPage from "./Pages/NotesPage"; function App() { const darkTheme = createTheme({ @@ -43,6 +44,7 @@ function App() { } /> } /> } /> + } /> } /> } /> diff --git a/webserver/src/DbContext.jsx b/webserver/src/DbContext.jsx index 2cea59e..b7beb1a 100644 --- a/webserver/src/DbContext.jsx +++ b/webserver/src/DbContext.jsx @@ -1,5 +1,5 @@ import PouchDB from "pouchdb"; -import React, { useContext, useEffect, useState } from "react"; +import React, { useContext, useEffect, useState, useCallback } from "react"; import { useProcessedDataBucket } from "./ProcessedDataBucketContext"; import { getProcessedDataBucket, updateProcessedDataBucket } from "./ProcessedDataBucket"; @@ -36,6 +36,33 @@ export function DbProvider({ children }) { .on("change", (change) => { updateProcessedDataBucket(localdb, setProcessedDataBucket); }); + // useEffect(()=>{ + // updateProcessedDataBucket(localdb, setProcessedDataBucket); + // }, [setProcessedDataBucket]); + // localdb.replicate.to(remotedb, { + // retry: true, + // }); + + // const [localNotesdb, setLocalNotesdb] = useState(new PouchDB("denver_notes")); + // const [remoteNotesdb, setRemoteNotesdb] = useState( + // new PouchDB("http://" + window.location.hostname + ":5984/denver_notes", { + // skip_setup: true, + // auth: { + // username: "scouting", + // password: "Ridgebotics", + // }, + // }) + // ); + // localNotesdb.replicate + // .from(remoteNotesdb, { + // live: true, + // retry: true, + // }) + // .on("change", (change) => { + // // updateProcessedDataBucket(localdb, setProcessedDataBucket); + // }); + + // updateProcessedDataBucket(localdb, setProcessedDataBucket); // useEffect(() => { // setDatabaseName("denver_fr", setLocaldb, setRemotedb, setProcessedDataBucket); @@ -98,6 +125,10 @@ export function setDatabaseName(name, setLocaldb, setRemotedb, setProcessedDataB updateProcessedDataBucket(localdb, setProcessedDataBucket); }); updateProcessedDataBucket(localdb, setProcessedDataBucket); + localdb.replicate.to(remotedb, { + live: true, + retry: true, + }); setLocaldb(localdb); setRemotedb(remotedb); } diff --git a/webserver/src/Pages/InputPage.jsx b/webserver/src/Pages/InputPage.jsx index d90f429..13e1775 100644 --- a/webserver/src/Pages/InputPage.jsx +++ b/webserver/src/Pages/InputPage.jsx @@ -33,6 +33,7 @@ const InputPage = () => { .put({ // _id: new Date().toISOString(), _id: "match_" + values.match_number + "_team_" + values.team_number, + type: "match", ...values, }) .then((result) => { @@ -40,7 +41,7 @@ const InputPage = () => { console.log(result); console.log(localdb); localdb.replicate.to(remotedb, { - live: true, + retry: true, }); }) .catch((err) => { @@ -48,7 +49,7 @@ const InputPage = () => { alert(err); }); // alert(JSON.stringify(values, null, 2)); - // resetForm(); //Hah tobad + resetForm(); //Hah tobad setSubmitting(false); // }, 400); updateProcessedDataBucket(localdb, setProcessedDataBucket); @@ -76,7 +77,7 @@ const InputPage = () => { lower_hub_auto: "0", upper_hub_teleop: "0", lower_hub_teleop: "0", - climb_level: "", + climb_level: "0", alliance: "", defence: "0", disabled: false, @@ -148,12 +149,12 @@ const InputPage = () => { -

What they _______

+ {/*

What they _______

- +
*/} diff --git a/webserver/src/Pages/NotesPage.css b/webserver/src/Pages/NotesPage.css new file mode 100644 index 0000000..cd3ccbe --- /dev/null +++ b/webserver/src/Pages/NotesPage.css @@ -0,0 +1,13 @@ +.maxwidth { + display: block; + margin-left: auto; + margin-right: auto; + width: 100%; + text-align: center; + margin: auto; + max-width: fit-content; + /* max-width: 100% */ +} +.smallfeild { + max-width: 25%; +} diff --git a/webserver/src/Pages/NotesPage.jsx b/webserver/src/Pages/NotesPage.jsx new file mode 100644 index 0000000..07624c4 --- /dev/null +++ b/webserver/src/Pages/NotesPage.jsx @@ -0,0 +1,101 @@ +import React, { useCallback } from "react"; +import { useLocalDb, useRemoteDb } from "../DbContext"; +import "./NotesPage.css"; +import { Formik, FastField, Form, useFormikContext } from "formik"; +import { TextField, Button, Grid, FormRow, Divider, Checkbox, Radio, FormControlLabel, FormControl, FormLabel, RadioGroup, IconButton, NotesAdornment, Box } from "@mui/material"; +import { useProcessedDataBucket } from "../ProcessedDataBucketContext"; +import { getProcessedDataBucket, updateProcessedDataBucket } from "../ProcessedDataBucket"; +import NotesList from "../components/NotesList"; + +const NotesPage = () => { + let { localdb, setLocaldb } = useLocalDb(); + let { remotedb, setRemotedb } = useRemoteDb(); + const { processedDataBucket, setProcessedDataBucket } = useProcessedDataBucket(); + + let panel_sx = { + display: "flex", + flexDirection: "column", + alignItems: { xs: "center", sm: "center" }, + justifyContent: { xs: "flex-start", sm: "center" }, + bgcolor: "background.paper", + p: 2, + m: 1, + gap: 2, + maxWidth: "fit-content", + borderRadius: "10px", + boxShadow: 7, + }; + + + const onSubmit = useCallback( + (values, { setSubmitting, resetForm }) => { + // setTimeout(() => { + localdb + .put({ + // _id: new Date().toISOString(), + _id: "notes_team_" + values.team_number + (new Date().toISOString()), + type: "notes", + ...values, + }) + .then((result) => { + alert("Notes Saved Successfully!"); + console.log(result); + console.log(localdb); + localdb.replicate.to(remotedb, { + retry: true, + }); + }) + .catch((err) => { + console.log("Failed To Save Notes!"); + alert(err); + }); + // alert(JSON.stringify(values, null, 2)); + resetForm(); //Hah tobad + setSubmitting(false); + // }, 400); + updateProcessedDataBucket(localdb, setProcessedDataBucket); + }, + [localdb, remotedb, setProcessedDataBucket, updateProcessedDataBucket] + ); + + return ( +
+
+ + {({ values, setValues, errors, touched, handleChange, handleBlur, handleSubmit, isSubmitting }) => ( +
+ + {/* */} + {/* */} + + + + + + + + {/* { + processedDataBucket[] .map((item, index)=>{ + return

{item}

+ }) + } */} +
+
+
+ + )} + +
+ ); +}; + +export default NotesPage; diff --git a/webserver/src/Pages/WelcomePage.jsx b/webserver/src/Pages/WelcomePage.jsx index ef0228c..8ec634c 100644 --- a/webserver/src/Pages/WelcomePage.jsx +++ b/webserver/src/Pages/WelcomePage.jsx @@ -2,7 +2,7 @@ import React from "react"; import "./WelcomePage.css"; import "../App.css"; import DbChooser from "../components/DbChooser"; -import { Box } from "@mui/material"; +import { Box, Button } from "@mui/material"; const WelcomePage = () => { return ( diff --git a/webserver/src/ProcessedDataBucket.jsx b/webserver/src/ProcessedDataBucket.jsx index 73eec40..8942982 100644 --- a/webserver/src/ProcessedDataBucket.jsx +++ b/webserver/src/ProcessedDataBucket.jsx @@ -16,6 +16,7 @@ export function updateProcessedDataBucket(db, setProcessedDataBucket) { teamData[doc.team_number] = { team_number: doc.team_number, matches_played: 0, + notes: [], data_sets: { upper_hub_auto: [], lower_hub_auto: [], @@ -40,8 +41,11 @@ export function updateProcessedDataBucket(db, setProcessedDataBucket) { }; } - //add this game's data to the respective team data: let thisTeamData = teamData[doc.team_number]; + if (doc.type === "match") + { + console.log("MATCH: " + doc._id) + //add this game's data to the respective team data: thisTeamData.matches_played++; let auto_points = (parseInt(doc.taxi_auto) ? 2 : 0) + parseInt(doc.upper_hub_auto) * 4 + parseInt(doc.lower_hub_auto) * 2; @@ -76,6 +80,10 @@ export function updateProcessedDataBucket(db, setProcessedDataBucket) { thisTeamData.average_teleop_hub_points = thisTeamData.data_sets.teleop_hub_points.reduce(sum, 0) / thisTeamData.matches_played; thisTeamData.average_climb_points = thisTeamData.data_sets.climb_points.reduce(sum, 0) / thisTeamData.matches_played; thisTeamData.average_total_match_points = thisTeamData.data_sets.total_match_points.reduce(sum, 0) / thisTeamData.matches_played; + } else if (doc.type === "notes") { + console.log("NOTES: " + doc._id) + thisTeamData.notes.push(doc.notes); + } }); setProcessedDataBucket({ teamData: teamData, matchData: matchData }); }) diff --git a/webserver/src/components/DbChooser.jsx b/webserver/src/components/DbChooser.jsx index e62b316..ecbe8a0 100644 --- a/webserver/src/components/DbChooser.jsx +++ b/webserver/src/components/DbChooser.jsx @@ -1,5 +1,5 @@ import React, { useCallback } from "react"; -import { Box, InputLabel, MenuItem, FormControl, Select } from "@mui/material"; +import { Box, InputLabel, MenuItem, FormControl, Select, Button } from "@mui/material"; import { setDatabaseName, useLocalDb, useRemoteDb } from "../DbContext"; import { useProcessedDataBucket } from "../ProcessedDataBucketContext"; @@ -9,6 +9,13 @@ const DbChooser = (props) => { const { processedDataBucket, setProcessedDataBucket } = useProcessedDataBucket(); const [dbname, setDbName] = React.useState(localdb.name); + + const sync = useCallback(()=>{ + localdb.sync(remotedb, { + // live:true, + retry:true + }); + }, [localdb, remotedb]); const handleChange = useCallback((event) => { console.log(event.target.value); @@ -29,6 +36,9 @@ const DbChooser = (props) => { Test Data +
); diff --git a/webserver/src/components/Navigation/PagesList.js b/webserver/src/components/Navigation/PagesList.js index bd6ea7e..83de8de 100644 --- a/webserver/src/components/Navigation/PagesList.js +++ b/webserver/src/components/Navigation/PagesList.js @@ -6,6 +6,7 @@ const PagesList = props => {
  • Dashboard
  • Input
  • +
  • Notes
) } diff --git a/webserver/src/components/Navigation/Toolbar/Toolbar.js b/webserver/src/components/Navigation/Toolbar/Toolbar.js index 8d11066..95e74c1 100644 --- a/webserver/src/components/Navigation/Toolbar/Toolbar.js +++ b/webserver/src/components/Navigation/Toolbar/Toolbar.js @@ -10,7 +10,7 @@ const Toolbar = props => {