{"version":3,"sources":["lib/court_alloc.ts","components/GameForm/index.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["Game","players","rounds","courts","PPC","playerBoard","roundBoard","random","min","max","Math","floor","this","Array","fill","map","element","index","id","played","games","a","b","round","courtBoard","slice","playerPool","from","sort","SortPlayerbyGames","length","player","randWeightedDistribution","court","courtWeight","filter","compPlayer","includes","multiplier","reduce","acc","cur","prev","RWdist","courtRand","courtNum","push","splice","otherPlayers","forEach","item","val","AssignCourts","useStyles","makeStyles","theme","createStyles","container","margin","position","top","left","bottom","right","paper","marginTop","spacing","display","flexDirection","alignItems","padding","avatar","backgroundColor","palette","secondary","main","form","width","submit","initOptions","invalid","GameForm","props","classes","React","useState","gameOptions","setGameOptions","handleChange","event","target","name","value","Container","component","maxWidth","style","className","CssBaseline","Paper","elevation","Avatar","Typography","variant","noValidate","Grid","xs","sm","TextField","fullWidth","autoFocus","required","type","label","onChange","Button","color","onClick","gameInit","disabled","gameForm","tableContainer","height","loader","zIndex","App","game","field","headerName","columns","setColumns","rows","setRows","initalised","setInitalised","Fade","in","parseInt","Calculate","disableColumnMenu","toString","hideSortIcons","SortPlayerbyId","autoHeight","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById","console","log"],"mappings":"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","file":"static/js/main.99d4f5d8.chunk.js","sourcesContent":["interface Player {\n id: number\n played: number[]\n courts: number[]\n games: number\n}\ninterface GameOptions {\n players: number\n rounds: number\n courts: number\n PPC: number\n}\nexport class Game {\n readonly playerBoard: Player[]\n readonly roundBoard: Player[][][]\n readonly players: number\n readonly rounds: number\n readonly courts: number\n readonly PPC: number\n\n constructor({ players, rounds, courts, PPC }: GameOptions) {\n this.rounds = rounds\n this.courts = courts\n this.PPC = PPC\n this.players = players\n this.playerBoard = new Array(this.players)\n .fill(null)\n .map((element, index) => {\n let newPlayer: Player = {\n id: index,\n played: [],\n courts: new Array(this.rounds).fill(null),\n games: 0,\n }\n return newPlayer\n })\n this.roundBoard = Array(this.rounds)\n .fill(null)\n .map(() =>\n Array(this.courts)\n .fill(null)\n .map(() => Array(0))\n )\n }\n private random = (min: number, max: number) =>\n Math.floor(Math.random() * (max - min)) + min\n\n SortPlayerbyGames(a: Player, b: Player): number {\n if (a.games < b.games) return -1\n if (a.games > b.games) return 1\n return 0\n }\n SortPlayerbyId(a: Player, b: Player): number {\n if (a.id < b.id) return -1\n if (a.id > b.id) return 1\n return 0\n }\n\n AssignCourts(round: number) {\n let courtBoard = this.roundBoard[round].slice(\n 0,\n Math.floor(this.players / this.PPC)\n )\n let playerPool = Array.from(this.playerBoard.sort(this.SortPlayerbyGames))\n\n while (\n courtBoard.reduce((prev, cur) => {\n if (cur.length < prev) return cur.length\n return prev\n }, this.courts) < this.courts\n ) {\n if (playerPool.length <= 0) break\n let player = playerPool[0]\n let randWeightedDistribution = courtBoard.map(court => {\n let courtWeight = this.PPC - court.length\n if (courtWeight != 0) {\n return (\n courtWeight /\n (court.filter(compPlayer => player.played.includes(compPlayer.id))\n .length || 1 * 2)\n )\n }\n return courtWeight\n })\n\n let multiplier =\n 1000 / randWeightedDistribution.reduce((acc, cur) => cur + acc)\n let prev = 0\n randWeightedDistribution = randWeightedDistribution.map(RWdist => {\n prev += RWdist * multiplier\n return prev\n })\n let courtRand = this.random(1, 1000)\n let court: Player[]\n let courtNum: number\n for (courtNum = 0; courtNum < this.courts; courtNum++) {\n if (courtRand <= randWeightedDistribution[courtNum]) {\n break\n }\n }\n court = courtBoard[courtNum]\n court.push(player)\n player.courts[round] = courtNum\n player.games++\n player.played.push()\n playerPool.splice(0, 1)\n }\n courtBoard.map(court => {\n let otherPlayers = court.map(player => player.id)\n court.forEach(player => {\n player.played.push(...otherPlayers.filter(item => item != player.id))\n })\n })\n }\n Calculate() {\n this.roundBoard.map((val, index) => {\n this.AssignCourts(index)\n })\n }\n}\n","import React from \"react\"\nimport Avatar from \"@material-ui/core/Avatar\"\nimport Button from \"@material-ui/core/Button\"\nimport CssBaseline from \"@material-ui/core/CssBaseline\"\nimport TextField from \"@material-ui/core/TextField\"\nimport Paper from \"@material-ui/core/Paper\"\nimport Grid from \"@material-ui/core/Grid\"\nimport Typography from \"@material-ui/core/Typography\"\nimport Container from \"@material-ui/core/Container\"\nimport { createStyles, makeStyles, Theme } from \"@material-ui/core/styles\"\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n container: {\n margin: \"auto\",\n position: \"absolute\",\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n },\n paper: {\n marginTop: theme.spacing(3),\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n padding: theme.spacing(3),\n },\n avatar: {\n margin: theme.spacing(1),\n backgroundColor: theme.palette.secondary.main,\n },\n form: {\n width: \"100%\", // Fix IE 11 issue.\n marginTop: theme.spacing(3),\n },\n submit: {\n margin: theme.spacing(3, 0, 2),\n },\n })\n)\n\ninterface Props {\n gameInit: CallableFunction\n style?: any\n}\ninterface GameOptions {\n invalid(): boolean\n players: string\n rounds: string\n courts: string\n PPC: string\n}\nconst initOptions: GameOptions = {\n invalid() {\n if (\n this.players.length == 0 ||\n this.rounds.length == 0 ||\n this.courts.length == 0 ||\n this.PPC.length == 0\n )\n return true\n return false\n },\n players: \"\",\n rounds: \"\",\n courts: \"\",\n PPC: \"\",\n}\n\nfunction GameForm(props: Props) {\n const classes = useStyles()\n const [gameOptions, setGameOptions] = React.useState(initOptions)\n const handleChange = (event: React.ChangeEvent) => {\n setGameOptions({ ...gameOptions, [event.target.name]: event.target.value })\n }\n return (\n \n \n \n \n \n Set up\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n props.gameInit(gameOptions)}\n className={classes.submit}\n disabled={gameOptions.invalid()}\n >\n Calculate\n \n \n
\n \n )\n}\n\nexport default GameForm\n","import { Game } from \"./lib/court_alloc\"\nimport React from \"react\"\nimport GameForm from \"./components/GameForm/\"\nimport { CssBaseline, Fade } from \"@material-ui/core\"\nimport { makeStyles } from \"@material-ui/core/styles\"\nimport {\n DataGrid,\n GridColDef,\n GridRowsProp,\n GridValueGetterParams,\n} from \"@material-ui/data-grid\"\nimport Container from \"@material-ui/core/Container\"\n\nimport \"./App.css\"\nconst useStyles = makeStyles({\n gameForm: {\n // color: \"white\",\n },\n tableContainer: {\n height: \"100%\",\n },\n loader: {\n position: \"absolute\",\n left: \"50%\",\n top: \"35%\",\n display: \"none\",\n zIndex: 1000,\n height: \"31px\",\n width: \"31px\",\n },\n})\ninterface GameOptions {\n players: number\n rounds: number\n courts: number\n PPC: number\n}\n\nfunction App() {\n //@ts-ignore\n let game: Game\n let gameOptions: GameOptions\n let [columns, setColumns] = React.useState([\n {\n field: \"id\",\n headerName: \"Id\",\n type: \"number\",\n width: 150,\n },\n ])\n let [rows, setRows] = React.useState([{ id: 0 }])\n const classes = useStyles()\n const [initalised, setInitalised] = React.useState(false)\n // const [gameBoard, setGameBoard] = React.useState({})\n\n function StartGame({ players, rounds, courts, PPC }: any) {\n gameOptions = {\n players: parseInt(players),\n rounds: parseInt(rounds),\n courts: parseInt(courts),\n PPC: parseInt(PPC),\n }\n game = new Game(gameOptions)\n game.Calculate()\n setColumns([\n {\n field: \"id\",\n headerName: \"Id\",\n type: \"number\",\n width: 90,\n },\n {\n field: \"games\",\n headerName: \"Games\",\n type: \"number\",\n disableColumnMenu: true,\n width: 120,\n },\n ...game.roundBoard.map((round, index) => {\n return {\n field: \"round\" + index.toString(),\n headerName: \"Court \" + (index + 1).toString(),\n hideSortIcons: true,\n disableColumnMenu: true,\n type: \"number\",\n }\n }),\n ])\n setRows([\n ...game.playerBoard.sort(game.SortPlayerbyId).map(player => {\n return {\n id: player.id + 1,\n games: player.games,\n ...player.courts.reduce((acc, court, index) => {\n return { [\"round\" + index.toString()]: court, ...acc }\n }, {}),\n }\n }),\n ])\n setInitalised(true)\n }\n\n return (\n
\n \n \n \n \n\n \n \n \n \n \n
\n )\n}\n\nexport default App\n","import { ReportHandler } from \"web-vitals\"\n\nconst reportWebVitals = (onPerfEntry: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import(\"web-vitals\").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry)\n getFID(onPerfEntry)\n getFCP(onPerfEntry)\n getLCP(onPerfEntry)\n getTTFB(onPerfEntry)\n })\n }\n}\n\nexport default reportWebVitals\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport \"./index.css\"\nimport App from \"./App\"\nimport reportWebVitals from \"./reportWebVitals\"\n\nReactDOM.render(\n \n \n ,\n document.getElementById(\"root\")\n)\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals(console.log)\n"],"sourceRoot":""}