diff --git a/BinTree/src/main/java/BinTree.java b/BinTree/src/main/java/BinTree.java deleted file mode 100644 index 6fd51f6239851c0cc908652c0cd18b219ee2b011..0000000000000000000000000000000000000000 --- a/BinTree/src/main/java/BinTree.java +++ /dev/null @@ -1,24 +0,0 @@ - -public class BinTree { - - BinTreeNode root = null; - - public BinTree(BinTreeNode root) { - this.root = root; - } - - public void show(){ - root.show( 0 ); - } - - public BinTreeNode search(int T){ - return root.search( T ); - } - - public void insert(int T){ - root.insert( T ); - } - - public void delete(int T) {root.delete( T );} - -} diff --git a/BinTree/src/main/java/Main.java b/BinTree/src/main/java/Main.java deleted file mode 100644 index 54d4b79f77a86e44378e084e0cbb73ce2e27917d..0000000000000000000000000000000000000000 --- a/BinTree/src/main/java/Main.java +++ /dev/null @@ -1,34 +0,0 @@ - -public class Main { - public static void main(String[] args) { - - BinTreeNode root = new BinTreeNode(null, 15, null); - BinTree binTree = new BinTree( root ); - - - binTree.insert( 5 ); - binTree.insert( 6 ); - binTree.insert( 22 ); - binTree.insert( 16 ); - binTree.insert( 23 ); - binTree.insert( 2 ); - binTree.insert( 24 ); - binTree.insert( 28 ); - binTree.insert( 26 ); - binTree.insert( 27 ); - binTree.insert( 29 ); - binTree.insert( 25 ); - binTree.insert( 30 ); - - //System.out.println( binTree.search( 5 ).getNodeValue() ); - - - - binTree.show(); - - binTree.delete( 22 ); - - binTree.show(); - } - -} diff --git a/sth-backend/src/main/java/hdm/mi/sthbackend/model/Player.java b/sth-backend/src/main/java/hdm/mi/sthbackend/model/Player.java index ca124371f0686e555a38a8f95342f88c11dd070b..5044850dbe214ab08fd5f4d334664842e096353b 100644 --- a/sth-backend/src/main/java/hdm/mi/sthbackend/model/Player.java +++ b/sth-backend/src/main/java/hdm/mi/sthbackend/model/Player.java @@ -12,8 +12,10 @@ import java.util.UUID; @Document("Player") @AllArgsConstructor public class Player { + @Id private final UUID playerId; @Setter private String name; + } diff --git a/sth-backend/src/main/java/hdm/mi/sthbackend/model/Tournament.java b/sth-backend/src/main/java/hdm/mi/sthbackend/model/Tournament.java index 4012eb19f9db7dbe23ab8ec65ec630972f3b39d8..81d512624185d78c86cac1e65aeee280d8ed1582 100644 --- a/sth-backend/src/main/java/hdm/mi/sthbackend/model/Tournament.java +++ b/sth-backend/src/main/java/hdm/mi/sthbackend/model/Tournament.java @@ -22,4 +22,5 @@ public class Tournament implements ITournament{ private List<UUID> matches; private List<UUID> teams; + } diff --git a/sth-frontend/.env b/sth-frontend/.env new file mode 100644 index 0000000000000000000000000000000000000000..a97bd7733774a0d552408b194bada84ba0847ac6 --- /dev/null +++ b/sth-frontend/.env @@ -0,0 +1,2 @@ +# .env + diff --git a/sth-frontend/.env.developement b/sth-frontend/.env.developement new file mode 100644 index 0000000000000000000000000000000000000000..3533d50c62f1f8c09861795dea1e6cd8398ea56e --- /dev/null +++ b/sth-frontend/.env.developement @@ -0,0 +1 @@ +VITE_BASE_URL=http://localhost:8080 \ No newline at end of file diff --git a/sth-frontend/.env.production b/sth-frontend/.env.production new file mode 100644 index 0000000000000000000000000000000000000000..3533d50c62f1f8c09861795dea1e6cd8398ea56e --- /dev/null +++ b/sth-frontend/.env.production @@ -0,0 +1 @@ +VITE_BASE_URL=http://localhost:8080 \ No newline at end of file diff --git a/sth-frontend/package-lock.json b/sth-frontend/package-lock.json index b67f2562ea56e35e5bd0e55519ae382fdbc825ce..9afe47756c44a61ab7f633f417b44e21cb01ff31 100644 --- a/sth-frontend/package-lock.json +++ b/sth-frontend/package-lock.json @@ -15,6 +15,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.20.1", + "tailwind-merge": "^2.2.0", "web-vitals": "^2.1.4" }, "devDependencies": { @@ -331,9 +332,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", + "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -3916,6 +3917,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tailwind-merge": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.2.0.tgz", + "integrity": "sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==", + "dependencies": { + "@babel/runtime": "^7.23.5" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz", @@ -4458,9 +4471,9 @@ } }, "@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", + "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", "requires": { "regenerator-runtime": "^0.14.0" } @@ -6849,6 +6862,14 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "tailwind-merge": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.2.0.tgz", + "integrity": "sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==", + "requires": { + "@babel/runtime": "^7.23.5" + } + }, "tailwindcss": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.0.tgz", diff --git a/sth-frontend/package.json b/sth-frontend/package.json index ae412db2840a642d56867df9daf6068f41554698..2681dc3f8c9a60384d704c22b657cd6fa68750ce 100644 --- a/sth-frontend/package.json +++ b/sth-frontend/package.json @@ -10,6 +10,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.20.1", + "tailwind-merge": "^2.2.0", "web-vitals": "^2.1.4" }, "scripts": { diff --git a/sth-frontend/src/App.jsx b/sth-frontend/src/App.jsx index 44798e3def41b80c43e008ad69853579271fb8af..cd877e1cf671d69ec4559b8cf0d918cb366386b7 100644 --- a/sth-frontend/src/App.jsx +++ b/sth-frontend/src/App.jsx @@ -1,6 +1,7 @@ import Navbar from "./layouts/Navbar"; import {Outlet} from "react-router-dom"; import "./index.css" +import Button from "./components/Button"; function App() { return ( @@ -9,7 +10,7 @@ function App() { <div className={'p-6'}> <Outlet /> </div> - + <Button className={'bg-blue-500'}>Hello</Button> </> ); } diff --git a/sth-frontend/src/components/Button.jsx b/sth-frontend/src/components/Button.jsx new file mode 100644 index 0000000000000000000000000000000000000000..42ec094c97360120c88dc1fb53f115095b940d74 --- /dev/null +++ b/sth-frontend/src/components/Button.jsx @@ -0,0 +1,7 @@ +import {twMerge} from "tailwind-merge"; + +export default function Button({children, className, ...props}) { + return ( + <button {...props} className={twMerge('bg-red-400', className)}>{children}</button> + ) +} \ No newline at end of file diff --git a/sth-frontend/src/components/TournamentForm.jsx b/sth-frontend/src/components/TournamentForm.jsx index d66c5cc1b6a24d456d38cf3c455b05fb82bbd3f7..71962aa13563dfbbe010f64ce4fa5035236d9b74 100644 --- a/sth-frontend/src/components/TournamentForm.jsx +++ b/sth-frontend/src/components/TournamentForm.jsx @@ -1,18 +1,73 @@ +import {useRef, useState} from "react"; +import Button from "./Button"; +import {createTournament} from "../features/tournament/services"; -export default function TournamentForm(){ +export default function TournamentForm({setIsOpen}) { + + const [tournamentName, setTournamentName] = useState('') + const [teamName, setTeamName] = useState('') + const [teamNames, setTeamNames] = useState([]) + + + const handleOnChange = (event, set) => { + set(event.target.value); + + } + + const handleOnKeyDown = (event) => { + if (event.key === 'Enter') { + event.preventDefault() + setTeamNames([...teamNames, teamName]) + setTeamName(''); + } + } + const handleRemoveTeam = (index) => { + setTeamNames(teamNames.filter((teamName, i) => i !== index)) + } + + + const handleSubmit = async (event) => { + event.preventDefault() + const tournament = { + name: tournamentName, + teams: teamNames + } + try { + await createTournament(tournament) + setIsOpen(false); + setTournamentName('') + setTeamName('') + setTeamNames([]) + } catch (e) { + + } + + } return ( - <form className={'flex flex-col'}> - <label htmlFor='tName'>Tournament Name</label> - <input type='text' id='tName'/> - <label htmlFor='teamCount'>Player Count</label> - <input type='number' id='teamCount'/> - <label htmlFor='tournamentType'>Tournament Type</label> - <select id='tournamentType'> - <option value='bracketing'>Bracketing</option> - </select> - <input type='submit'/> - </form> + <div className={'w-[40vw]'}> + <button className={'absolute top-0 right-0 m-1'} + onClick={() => setIsOpen(false)}>⌠+ </button> + <form className={'flex flex-col'} onSubmit={handleSubmit}> + <label htmlFor='tournamentName'>Tournament Name</label> + <input type='text' id='tournamentName' value={tournamentName} + onChange={(event) => handleOnChange(event, setTournamentName)}/> + <label htmlFor='teamNames'>Team Name</label> + <input type='text' id='teamNames' value={teamName} + onChange={(event) => handleOnChange(event, setTeamName)} + onKeyDown={handleOnKeyDown}/> + <input className={'bg-green-700'} type='submit'/> + <ul> + {teamNames.map((teamName, index) => <li key={index}> + <div> + {teamName} + <Button onClick={() => handleRemoveTeam(index)}>Remove</Button> + </div> + </li>)} + </ul> + </form> + </div> ) -} \ No newline at end of file +} diff --git a/sth-frontend/src/features/tournament/components/BracketingRound.jsx b/sth-frontend/src/features/tournament/components/BracketingRound.jsx index b20d07cadd565f0074a5a9d2bd94be21d671cabc..ccac084577b284d3cedc9c74d79285cd480be367 100644 --- a/sth-frontend/src/features/tournament/components/BracketingRound.jsx +++ b/sth-frontend/src/features/tournament/components/BracketingRound.jsx @@ -4,8 +4,7 @@ export default function BracketingRound({matchesNum}) { const matches = []; for (let i = 0; i < matchesNum; i++) { - matches.push(<Match style={i + 1} key={i} />) - + matches.push(<Match style={i + 1} key={i}/>); } return( diff --git a/sth-frontend/src/features/tournament/services/index.js b/sth-frontend/src/features/tournament/services/index.js new file mode 100644 index 0000000000000000000000000000000000000000..3706bcd0216f974284d94425e2c8d1364c877e31 --- /dev/null +++ b/sth-frontend/src/features/tournament/services/index.js @@ -0,0 +1,2 @@ + +export { createTournament } from './tournamentService'; \ No newline at end of file diff --git a/sth-frontend/src/features/tournament/services/tournamentService.js b/sth-frontend/src/features/tournament/services/tournamentService.js new file mode 100644 index 0000000000000000000000000000000000000000..fd02f1168aed0fc127f5d6b2b45691ff3a771301 --- /dev/null +++ b/sth-frontend/src/features/tournament/services/tournamentService.js @@ -0,0 +1,28 @@ +async function createTournament(tournament) { + + const baseURL = import.meta.env.BASE_URL; + const url = `${baseURL}/api/v1/tournaments/`; + const options = { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + + }, + body: JSON.stringify(tournament), + mode: 'cors', + credentials: 'include' + }; + + try { + console.log('fetching'); + const response = await fetch(url, options); + + if (!response.ok) { + throw new HttpResponseError('Bad fetch', response); + } + } catch (error) { + throw error; + } +} + +export { createTournament }; diff --git a/sth-frontend/src/layouts/Navbar.jsx b/sth-frontend/src/layouts/Navbar.jsx index 71f7374ef12a4a440bbe2c002dca00983f8f809e..dc6654418a7a0e84533d3d74fc5181a5322834a4 100644 --- a/sth-frontend/src/layouts/Navbar.jsx +++ b/sth-frontend/src/layouts/Navbar.jsx @@ -6,16 +6,14 @@ import TournamentForm from "../components/TournamentForm"; export default function Navbar() { const [isOpen, setIsOpen] = useState(false) + if (true) { + + } return ( <nav className="flex items-center justify-end h-14 bg-gray-100 fixed w-full top-0 left-0 z-10 hover:shadow duration-100"> <Modal isOpen={isOpen} onClose={() => setIsOpen(false)}> - <div className={'w-[40vw]'}> - <button className={'absolute top-0 right-0 m-1'} - onClick={() => setIsOpen(false)}>⌠- </button> - <TournamentForm /> - </div> + <TournamentForm setIsOpen={setIsOpen}/> </Modal> <div className={'mr-12'}> <ul className="flex justify-evenly items-center w-full h-full text-gray-400"> @@ -32,5 +30,5 @@ export default function Navbar() { </ul> </div> </nav> - ) + ); } \ No newline at end of file diff --git a/sth-frontend/src/utils/errors/httpResponseError.js b/sth-frontend/src/utils/errors/httpResponseError.js new file mode 100644 index 0000000000000000000000000000000000000000..16ab9b11dc4836504b7c83f8b7a50b360db6a87a --- /dev/null +++ b/sth-frontend/src/utils/errors/httpResponseError.js @@ -0,0 +1,7 @@ + +class HttpResponseError extends Error { + constructor(message, response) { + super(message); + this.response = response; + } +} \ No newline at end of file