diff --git a/api/index.js b/api/index.js index ed1a08a9d0d2cbbff281481e30d9634979ae5b5e..868c1be5ba33537ffb040ad4538855131b7dd309 100644 --- a/api/index.js +++ b/api/index.js @@ -31,7 +31,7 @@ app.get('/editions', (req, res) => { }); }); app.get('/teams', (req, res) => { - const query = 'SELECT team.id_team, team.name ' + + const query = 'SELECT team.id_team, team.name, tag_team_edition.id_tag ' + 'FROM `tag_team_edition` ' + 'LEFT JOIN team ON tag_team_edition.id_team = team.id_team ' + 'WHERE year = ?'; @@ -49,7 +49,8 @@ app.get('/entry', (req, res) => { 'LEFT JOIN tag ON entry.id_tag = tag.id_tag ' + 'LEFT JOIN tag_team_edition ON tag.id_tag = tag_team_edition.id_tag ' + 'LEFT JOIN team ON tag_team_edition.id_team = team.id_team ' + - 'WHERE tag_team_edition.year = ?'; + 'WHERE tag_team_edition.year = ? ' + + 'ORDER BY entry.time_stamp ASC'; const year = req.query.year; exports.db.query(query, [year], (err, result) => { if (err) { diff --git a/api/index.ts b/api/index.ts index fa60867067b2bdd0c1d0596f6cdb55b49c6d6d5a..e3c75300ceb16c8d2675913f3e2c076af462f6b8 100644 --- a/api/index.ts +++ b/api/index.ts @@ -34,7 +34,7 @@ app.get('/editions', (req: Request, res: Response) => { }); app.get('/teams', (req: Request, res: Response) => { - const query = 'SELECT team.id_team, team.name ' + + const query = 'SELECT team.id_team, team.name, tag_team_edition.id_tag ' + 'FROM `tag_team_edition` ' + 'LEFT JOIN team ON tag_team_edition.id_team = team.id_team ' + 'WHERE year = ?'; @@ -58,7 +58,8 @@ app.get('/entry', (req: Request, res: Response) => { 'LEFT JOIN tag ON entry.id_tag = tag.id_tag ' + 'LEFT JOIN tag_team_edition ON tag.id_tag = tag_team_edition.id_tag ' + 'LEFT JOIN team ON tag_team_edition.id_team = team.id_team ' + - 'WHERE tag_team_edition.year = ?'; + 'WHERE tag_team_edition.year = ? ' + + 'ORDER BY entry.time_stamp ASC'; const year = req.query.year diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 65fc216c8eddae1a7ad36604ebd5cddf298ea190..0c9b2366ca54d86edf05e7a6c1789acaefdb4d33 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -7,6 +7,9 @@ "": { "name": "frontend", "version": "0.0.0", + "dependencies": { + "svelte-navigator": "^3.2.2" + }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^1.1.0", "svelte": "^3.52.0", @@ -89,6 +92,11 @@ } } }, + "node_modules/dedent-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", + "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==" + }, "node_modules/deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -508,6 +516,14 @@ "node": ">=6" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/magic-string": { "version": "0.26.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", @@ -538,6 +554,24 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -637,7 +671,6 @@ "version": "3.53.1", "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.53.1.tgz", "integrity": "sha512-Q4/hHkktZogGhN5iqxqSi9sjEVoe/NbIxX4hXEHoasTxj+TxEQVAq66LnDMdAZxjmsodkoI5F3slqsS68U7FNw==", - "dev": true, "engines": { "node": ">= 8" } @@ -654,6 +687,49 @@ "svelte": ">=3.19.0" } }, + "node_modules/svelte-navigator": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/svelte-navigator/-/svelte-navigator-3.2.2.tgz", + "integrity": "sha512-Xio4ohLUG1nQJ+ENNbLphXXu9L189fnI1WGg+2Q3CIMPe8Jm2ipytKQthdBs8t0mN7p3Eb03SE9hq0xZAqwQNQ==", + "hasInstallScript": true, + "dependencies": { + "svelte2tsx": "^0.1.151" + }, + "peerDependencies": { + "svelte": "3.x" + } + }, + "node_modules/svelte2tsx": { + "version": "0.1.193", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.1.193.tgz", + "integrity": "sha512-vzy4YQNYDnoqp2iZPnJy7kpPAY6y121L0HKrSBjU/IWW7DQ6T7RMJed2VVHFmVYm0zAGYMDl9urPc6R4DDUyhg==", + "dependencies": { + "dedent-js": "^1.0.1", + "pascal-case": "^3.1.1" + }, + "peerDependencies": { + "svelte": "^3.24", + "typescript": "^4.1.2" + } + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/typescript": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/vite": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.4.tgz", @@ -756,6 +832,11 @@ "ms": "2.1.2" } }, + "dedent-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", + "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==" + }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -969,6 +1050,14 @@ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } + }, "magic-string": { "version": "0.26.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", @@ -990,6 +1079,24 @@ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", "dev": true }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -1054,8 +1161,7 @@ "svelte": { "version": "3.53.1", "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.53.1.tgz", - "integrity": "sha512-Q4/hHkktZogGhN5iqxqSi9sjEVoe/NbIxX4hXEHoasTxj+TxEQVAq66LnDMdAZxjmsodkoI5F3slqsS68U7FNw==", - "dev": true + "integrity": "sha512-Q4/hHkktZogGhN5iqxqSi9sjEVoe/NbIxX4hXEHoasTxj+TxEQVAq66LnDMdAZxjmsodkoI5F3slqsS68U7FNw==" }, "svelte-hmr": { "version": "0.15.1", @@ -1064,6 +1170,34 @@ "dev": true, "requires": {} }, + "svelte-navigator": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/svelte-navigator/-/svelte-navigator-3.2.2.tgz", + "integrity": "sha512-Xio4ohLUG1nQJ+ENNbLphXXu9L189fnI1WGg+2Q3CIMPe8Jm2ipytKQthdBs8t0mN7p3Eb03SE9hq0xZAqwQNQ==", + "requires": { + "svelte2tsx": "^0.1.151" + } + }, + "svelte2tsx": { + "version": "0.1.193", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.1.193.tgz", + "integrity": "sha512-vzy4YQNYDnoqp2iZPnJy7kpPAY6y121L0HKrSBjU/IWW7DQ6T7RMJed2VVHFmVYm0zAGYMDl9urPc6R4DDUyhg==", + "requires": { + "dedent-js": "^1.0.1", + "pascal-case": "^3.1.1" + } + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "typescript": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "peer": true + }, "vite": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.4.tgz", diff --git a/frontend/package.json b/frontend/package.json index 3d081fad9c9f03791927a97cb69dea24a49083c4..889bfd73d09b82e614aa08ed0cde8b621cd8ac49 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,5 +12,8 @@ "@sveltejs/vite-plugin-svelte": "^1.1.0", "svelte": "^3.52.0", "vite": "^3.2.3" + }, + "dependencies": { + "svelte-navigator": "^3.2.2" } -} \ No newline at end of file +} diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index 0abbc7200233933313f81185dcf7b4e3f7cd5c65..dc15c315e5a3d0a69b5a664a8777a42909861dfe 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -1,11 +1,52 @@ <script> - import Teams from "./lib/Teams.svelte"; + //https://svelte.dev/repl/c81d8f3dff584065a82b2d3ea7cd4aee?version=3.53.1 + import { Router, Link, Route } from "svelte-navigator"; + import Teams from "./lib/Teams.svelte"; + import Entry from "./lib/Entry.svelte"; </script> -<main> - <Teams /> -</main> +<Router> + <header> + <h1>Boldor</h1> + <Link to="/">Home</Link> + <Link to="teams">Équipes</Link> + <Link to="entry">Résultats</Link> + </header> -<style> + <main> + <Route path="/"> + <div + class="tenor-gif-embed" + data-postid="13756831" + data-share-method="host" + data-aspect-ratio="1.33495" + data-width="100%" + > + <a + href="https://tenor.com/view/row-boat-ods-official-duck-studios-gif-13756831" + >Row Boat GIF</a + >from <a href="https://tenor.com/search/row-gifs">Row GIFs</a> + </div> + <script + type="text/javascript" + async + src="https://tenor.com/embed.js" + ></script> + </Route> + + <Route path="teams"> + <Teams /> + </Route> + <Route path="entry"> + <Entry /> + </Route> + </main> +</Router> + +<style> + header { + height: 100px; + text-align: center; + } </style> diff --git a/frontend/src/lib/Entry.svelte b/frontend/src/lib/Entry.svelte new file mode 100644 index 0000000000000000000000000000000000000000..c1dec9a73b657e7ecc15088727feedbae25849f4 --- /dev/null +++ b/frontend/src/lib/Entry.svelte @@ -0,0 +1,77 @@ +<script> + const edition_url = "http://localhost:8000/editions"; + + let editions = []; + fetch(edition_url) + .then((response) => response.json()) + .then((editions_data) => { + editions = editions_data; + }) + + let entries = []; + function getEntries(year) { + let entries_url = "http://localhost:8000/entry?year="+year; + fetch(entries_url) + .then((response) => response.json()) + .then((entries_data) => { + entries = entries_data; + }) + } + + let year_selected = new Date().getFullYear(); + function selectYear(){ + getEntries(year_selected); + } + + function parseTimeStamp(time_stamp) { + return (time_stamp.split("T")[1]).split(".")[0] + } + + getEntries(year_selected) + </script> + + <div class="container"> + <h1>Ordre de passage {year_selected}</h1> + + <select name="" id="" bind:value={year_selected} on:change={selectYear}> + {#each editions as edition } + <option value="{edition.year}">{edition.year}</option> + {/each} + </select> + + <table> + <tr> + <th>Heure de passage</th> + <th>Tag RFID</th> + <th>Équipe</th> + <th>Actions</th> + </tr> + {#each entries as entry} + <tr> + <td>{parseTimeStamp(entry.time_stamp)}</td> + <td>{entry.id_tag}</td> + <td>{entry.name}</td> + <td>...</td> + </tr> + {/each} + </table> + </div> + + <style> + .container { + width: 80%; + margin: auto; + max-width: 1024px; + background-color: rgb(235, 235, 235); + padding: 15px; + } + + table, tr, td, th{ + border: 1px solid black; + } + + table { + border-collapse: collapse; + width: 100%; + } + </style> \ No newline at end of file diff --git a/frontend/src/lib/Teams.svelte b/frontend/src/lib/Teams.svelte index 1fc2a33bdd7ac1e3fbeb338f5d4bb646c17a7f19..dbf5a351af83d28f1aeee27d0068e6fabaa3fc5c 100644 --- a/frontend/src/lib/Teams.svelte +++ b/frontend/src/lib/Teams.svelte @@ -10,7 +10,7 @@ fetch(edition_url) let teams = []; function getTeams(year) { - let teams_url = "http://localhost:8000/entry?year="+year; + let teams_url = "http://localhost:8000/teams?year="+year; fetch(teams_url) .then((response) => response.json()) .then((teams_data) => { @@ -27,7 +27,7 @@ getTeams(year_selected) </script> <div class="container"> - <h1>Pad d'bol d'or</h1> + <h1>Liste des équipe pour l'années {year_selected}</h1> <select name="" id="" bind:value={year_selected} on:change={selectYear}> {#each editions as edition } @@ -39,11 +39,13 @@ getTeams(year_selected) <tr> <th>Tag RFID</th> <th>Team name</th> + <th>Action</th> </tr> {#each teams as team} <tr> <td>{team.id_tag}</td> <td>{team.name}</td> + <td>...</td> </tr> {/each} </table>