Compare commits

..

3 Commits

Author SHA1 Message Date
Override-6 da30c5879b drone script update
2 years ago
Override-6 162df156f3 drone script update
2 years ago
Override-6 4c1d72657a updating drone
2 years ago

@ -1,27 +0,0 @@
module.exports = {
parserOptions: {
ecmaVersion: 2021,
sourceType: 'module'
},
env: {
browser: true,
},
plugins: [
'react',
'react-hooks'
],
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:react/jsx-runtime',
'plugin:react-hooks/recommended'
],
rules: {
'react/no-unescaped-entities': 0
},
settings: {
react: {
version: 'detect'
}
}
};

27
.gitignore vendored

@ -1,25 +1,12 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. .DS_Store
# dependencies
/node_modules
/.pnp
.pnp.js
# testing # Generated by package manager
/coverage node_modules/
# production # Generated by Cordova
/build /plugins/
/platforms/
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.idea .idea

@ -5,18 +5,5 @@
* Les administrateurs (coachs) d'une equipe peuvent diffuser leurs tactiques à leurs élèves. * Les administrateurs (coachs) d'une equipe peuvent diffuser leurs tactiques à leurs élèves.
* Les élèves peuvent aussi proposer leurs propres tactiques que les coachs peuvent à leurs tour approuver. * Les élèves peuvent aussi proposer leurs propres tactiques que les coachs peuvent à leurs tour approuver.
## Construire l'application
Ce projet utilise NPM comme gestionnaire de paquets, mais vous pouvez remplacer NPM par Yarn ou PNPM.
Une fois le dépôt cloné :
```bash
npm install # Installe les dépendances
npm run build # Construit l'application
npm run dev # Démarre le serveur de développement
npm run test # Lance les tests
```
## Contribuer ## Contribuer
Dans le code ou dans la documentation, merci d'ecrire en anglais si possible Dans le code ou dans la documentation, merci d'ecrire en anglais si possible

@ -0,0 +1,15 @@
<?xml version='1.0' encoding='utf-8'?>
<widget id="org.tbasket.app" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>TactiqueBasketApplication</name>
<description>Sample Apache Cordova App</description>
<author email="dev@cordova.apache.org" href="https://cordova.apache.org">
Apache Cordova Team
</author>
<content src="index.html" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<platform name="android">
<preference name="Scheme" value="http" />
</platform>
</widget>

@ -1,3 +1,42 @@
kind: pipeline
type: docker
name: Android
steps:
- name: Deliver
image: override6/tbasket-frontend:latest
workspace:
path: /src/android
environment:
SSH_PRIVATE_KEY:
from_secret: SSH_PRIVATE
SSH_PUBLIC_KEY:
from_secret: SSH_PUBLIC
commands:
- bash drone/deliver.sh android
- bash drone/android-sign.sh
---
kind: pipeline
type: docker
name: Electron
steps:
- name: Deliver
image: override6/tbasket-frontend:latest
workspace:
path: /src/electron
environment:
SSH_PRIVATE_KEY:
from_secret: SSH_PRIVATE
SSH_PUBLIC_KEY:
from_secret: SSH_PUBLIC
commands:
- bash drone/deliver.sh electron
---
kind: pipeline kind: pipeline
type: docker type: docker
name: Apache name: Apache

@ -33,12 +33,7 @@ case "$TYPE" in
;; ;;
"browser") "browser")
OUT_DIR="platforms/browser/www/" OUT_DIR="platforms/browser/www/"
mkdir -p "$OUT_DIR" SERV_DIR="/server/apache/TBasket/"
npm install && npm run build -- --outDir "$OUT_DIR"
if [ "$DRONE_BRANCH" = "production" ]; then
SERV_DIR="public_html/basket"
else SERV_DIR="/server/apache/TBasket/"
fi
;; ;;
"electron") "electron")
OUT_DIR="platforms/electron/build" OUT_DIR="platforms/electron/build"
@ -48,8 +43,16 @@ case "$TYPE" in
;; ;;
esac esac
#install cordova
cordova platform add "$TYPE" || exit 1
cordova build "$TYPE" $OPTIONS || exit 1
echo "delivering outputs on server" echo "delivering outputs on server"
echo "making delivery onto '$USER@$IP:$SERV_DIR'" echo "making delivery onto '$USER@$IP:$SERV_DIR'"
rsync -avz -I \ rsync -avz -I \
--rsync-path="mkdir -p \"$SERV_DIR\" && rsync" \ --rsync-path="mkdir -p \"$SERV_DIR\" && rsync" \

@ -1,12 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Tactique basket</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<script type="module" src="/src/index.js"></script>
</body>
</html>

10694
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -1,32 +1,28 @@
{ {
"name": "tbasket", "name": "org.tbasket.app",
"version": "0.1.0", "displayName": "TactiqueBasketApplication",
"private": true, "version": "1.0.0",
"dependencies": { "description": "A sample Apache Cordova application that responds to the deviceready event.",
"@fortawesome/fontawesome-svg-core": "^6.3.0", "main": "index.js",
"@fortawesome/free-solid-svg-icons": "^6.3.0",
"@fortawesome/react-fontawesome": "^0.2.0",
"ionicons": "^6.1.3",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.8.2",
"web-vitals": "^3.1.1"
},
"scripts": { "scripts": {
"build": "vite build", "test": "echo \"Error: no test specified\" && exit 1"
"test": "vitest",
"dev": "vite",
"lint": "eslint src/**/*.{js,jsx}"
}, },
"keywords": [
"ecosystem:cordova"
],
"author": "Apache Cordova Team",
"license": "Apache-2.0",
"devDependencies": { "devDependencies": {
"@testing-library/jest-dom": "^5.16.5", "cordova-android": "^11.0.0",
"@testing-library/react": "^14.0.0", "cordova-browser": "^6.0.0",
"@vitejs/plugin-react": "^3.1.0", "cordova-electron": "^3.1.0"
"eslint": "^8.35.0", },
"eslint-plugin-react": "^7.32.2", "cordova": {
"eslint-plugin-react-hooks": "^4.6.0", "platforms": [
"jsdom": "^21.1.0", "electron",
"vite": "^4.1.4", "browser",
"vitest": "^0.29.2" "android"
],
"plugins": {}
} }
} }

@ -1,47 +0,0 @@
const path = require('path');
const { app, BrowserWindow } = require('electron');
const isDev = require('electron-is-dev');
function createWindow() {
// Create the browser window.
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
},
});
// and load the index.html of the app.
// win.loadFile("index.html");
win.loadURL(
isDev
? 'http://localhost:3000'
: `file://${path.join(__dirname, '../build/index.html')}`
);
// Open the DevTools.
if (isDev) {
win.webContents.openDevTools({ mode: 'detach' });
}
}
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.whenReady().then(createWindow);
// Quit when all windows are closed, except on macOS. There, it's common
// for applications and their menu bar to stay active until the user quits
// explicitly with Cmd + Q.
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 568 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

@ -1,93 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Accueil</title>
<link rel="stylesheet" type="text/css" href="../src/css/main.css">
</head>
<body>
<header>
<div class="header-left">
<img src="img/logo2.png" alt="logo">
</div>
<div class="header-center">
<h2>Hello Prénom Nom !</h2>
</div>
<div class="header-right">
<!-- <button>
<img src="deconnection.png" alt="Déconnection">
<span>Déconnection</span>
</button>-->
<button class="submit-button">Déconnexion</button>
</div>
</header>
<main>
<div id="teams-section">
<div id="team-list-h">
<h2>Mes équipes</h2>
</div>
<div id="teams-list">
<!-- afficher la liste des équipes -->
<div class="team-item">
<img src="/img/logo2.png">
<p class="team-name">Equipe 1</p>
</div>
<div class="team-item">
<img src="img/logo2.png">
<p class="team-name">Equipe 2</p>
</div>
<div class="team-item">
<img src="img/logo2.png">
<p class="team-name">Equipe 3</p>
</div>
<div class="team-item">
<img src="img/logo2.png">
<p class="team-name">Equipe 3</p>
</div>
<div class="team-item">
<img src="img/logo2.png">
<p class="team-name">Equipe 3</p>
</div>
<div class="team-item">
<img src="img/logo2.png">
<p class="team-name">Equipe 3</p>
</div>
</div>
</div>
<div id="schema-section">
<div id="schema-list-h">
<h2>Mes Schémas</h2>
</div>
<div id="schema-list">
<!-- afficher la liste des équipes -->
<div class="schema-item">
<img src="img/schema.png">
<p class="schema-name">Schémas 1</p>
</div>
<div class="schema-item">
<img src="img/schema.png">
<p class="schema-name">Schémas 2</p>
</div>
<div class="schema-item">
<img src="img/schema.png">
<p class="schema-name">Schémas 3</p>
</div>
<div class="schema-item">
<img src="img/schema.png">
<p class="schema-name">Schémas 3</p>
</div>
<div class="schema-item">
<img src="img/schema.png">
<p class="schema-name">Schémas 3</p>
</div>
<div class="schema-item">
<img src="img/schema.png">
<p class="schema-name">Schémas 3</p>
</div>
</div>
</div>
</main>
</body>
</html>

@ -1,25 +0,0 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

@ -1,3 +0,0 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:

@ -1,38 +0,0 @@
.App {
text-align: center;
}
.App-logo {
height: 40vmin;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 5s linear;
}
}
.App-header {
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App-link {
color: #61dafb;
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}

@ -1,22 +0,0 @@
import Register from './components/register/Register';
import Login from "./components/login/Login";
import {MainPage} from "./components/main/Main";
import {BrowserRouter, Routes, Route} from "react-router-dom";
function App() {
return (
<div className="App">
<BrowserRouter>
<Routes>
<Route path="/" element={<MainPage />} />
<Route path="/register" element={<Register />} />
<Route path="/login" element={<Login />} />
<Route path="/main" element={<MainPage/>} />
<Route path="/main/:id" element={<MainPage/>} />
<Route path="/*" element={<MainPage />} />
</Routes>
</BrowserRouter>
</div>
);
}
export default App;

@ -1,51 +0,0 @@
import '../../css/login.css'
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
export default function Login() {
return (
<>
<div className={"body"}>
<div className="container">
<form action="/login" method="POST">
<h3>Se connecter :</h3>
<div className="Input">
<span>Identifiant (eMail)</span>
<div className="box">
<div className="icon">
<FontAwesomeIcon icon="envelope" />
</div>
<input type="input" className="form__field" placeholder="email" name="email" id='email'
required/>
</div>
</div>
<div className="Input">
<span>Mot de passe</span>
<div className="box">
<div className="icon">
<FontAwesomeIcon icon="lock" />
</div>
<input type="password" className="form__field" placeholder="mot de passe" name="password"
id="password" required/>
</div>
</div>
<label>
<input type="checkbox" value="se souvenir de moi" id={"remember me"} name={"remember me"}/>
se souvenir de moi
</label>
<div className="Input">
<div className="box">
<input type="submit" value="Se connecter"/>
</div>
</div>
<div className={"Href"}>
<a href="/login">J'ai oublier mon mot de passe</a>
<a href="/register">Je n'ai pas encore de compte</a>
</div>
</form>
</div>
</div>
</>
)
}

@ -1,75 +0,0 @@
import '../../css/main.css'
export function MainPage() {
return (<>
<header>
<div className="header-left">
<img src="/img/logo2.png" alt="" />
</div>
<div className="header-center">
<h2>Bienvenue, Prénom Nom</h2>
</div>
<div className="header-right">
<button className="submit-button">Déconnexion</button>
</div>
</header>
<div id="teams-section">
<div id="team-list-h">
<h2>Mes équipes</h2>
</div>
<div id="teams-list">
{/*afficher la liste des équipes*/}
<div className="team-item">
<img src="/img/logo2.png" alt="" />
<p className="team-name">Equipe 1</p>
</div>
<div className="team-item">
<img src="/img/logo2.png" alt="" />
<p className="team-name">Equipe 2</p>
</div>
<div className="team-item">
<img src="/img/logo2.png" alt="" />
<p className="team-name">Equipe 3</p>
</div>
<div className="team-item">
<img src="/img/logo2.png" alt="" />
<p className="team-name">Equipe 3</p>
</div>
<div className="team-item">
<img src="/img/logo2.png" alt="" />
<p className="team-name">Equipe 3</p>
</div>
<div className="team-item">
<img src="/img/logo2.png" alt="" />
<p className="team-name">Equipe 3</p>
</div>
</div>
</div>
<div id="schemas-section">
<div id="schemas-list-h">
<h2>Mes Schémas</h2>
</div>
<div id="schemas-list">
{/*afficher la liste des Schémas*/}
<div className="schemas-item">
<img src="/img/Visualiseur.png" alt="" />
<p className="schemas-name">Schéma 1</p>
</div>
<div className="schemas-item">
<img src="/img/Visualiseur.png" alt="" />
<p className="schemas-name">Schéma 2</p>
</div>
<div className="schemas-item">
<img src="/img/Visualiseur.png" alt="" />
<p className="schemas-name">Schéma 3</p>
</div>
<div className="schemas-item">
<img src="/img/Visualiseur.png" alt="" />
<p className="schemas-name">Schéma 3</p>
</div>
</div>
</div>
</>
)
}

@ -1,80 +0,0 @@
import '../../css/login.css'
import { library } from '@fortawesome/fontawesome-svg-core';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faLock, faEnvelope, faUser } from '@fortawesome/free-solid-svg-icons';
library.add(faLock);
library.add(faEnvelope);
library.add(faUser);
export default function Register() {
return (
<>
<div className={"body"}>
<div className="container">
<form action="/signup" method="POST">
<h3>S'inscrire :</h3>
<div className="Input">
<span>Adresse e-mail</span>
<div className="box">
<div className="icon">
<FontAwesomeIcon icon="envelope" />
</div>
<input type="input" className="form__field" placeholder="email" name="email" id='email'
required/>
</div>
</div>
<div className="Input">
<span>Nom</span>
<div className="box">
<div className="icon">
<FontAwesomeIcon icon="user" />
</div>
<input type="input" placeholder="nom" name="name" id='name' required/>
</div>
</div>
<div className="Input">
<span>Prénom</span>
<div className="box">
<div className="icon">
<FontAwesomeIcon icon="user" />
</div>
<input type="input" placeholder="Prénom" name="forename" id='forename' required/>
</div>
</div>
<div className="Input">
<span>Mot de passe</span>
<div className="box">
<div className="icon">
<FontAwesomeIcon icon="lock" />
</div>
<input type="password" className="form__field" placeholder="mot de passe" name="password"
id="password"
required/>
</div>
</div>
<div className="Input">
<span>Confirmer le mot de passe</span>
<div className="box">
<div className="icon">
<FontAwesomeIcon icon="lock" />
</div>
<input type="password" className="form__field" placeholder="mot de passe" name="cpassword"
id="cpassword" required/>
</div>
</div>
<div className="Input">
<div className="box">
<input type="submit" value="S'inscrire"/>
</div>
</div>
<a href="/login">J'ai déjà un compte</a>
</form>
</div>
</div>
</>
)
}

@ -1,126 +0,0 @@
@import url('https://fonts.googleapis.com/css2?family=Alegreya+Sans:ital,wght@0,100;0,300;0,400;0,500;0,700;0,800;0,900;1,100;1,300;1,400;1,500;1,700;1,800;1,900&display=swap');
*{
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Alegreya',sans-serif;
}
a{
text-decoration: none;
}
.body{
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background-image: url("/img/background-login.jpg");
-webkit-backdrop-filter: blur(15px); /* assure la compatibilité avec safari */
backdrop-filter: blur(35px);
background-color: rgba(182, 182, 182, 0.2);
}
.container{
position: relative;
width: 400px;
min-height: 550px;
justify-content: center;
align-items: center;
background: #F2561D;
box-shadow: 25px 25px 75px rgba(0,0,0,0.25), 10px 10px 70px rgba(0,0,0,0.5);
border-radius: 30px;
padding: 50px;
}
form{
position: relative;
width: 100%;
}
.container h3{
color: #0D0D0D;
font-weight: 600;
font-size: 2em;
width: 100%;
text-align: center;
margin-bottom: 30px;
letter-spacing: 1px;
}
container a:link{
color: #0D0D0D;
}
container a:visited{
color: #0D0D0D;
}
container a:hover{
color: #0D0D0D;
}
.Input{
position: relative;
width: 100%;
margin-bottom: 20px;
}
.Input span{
display: inline-block;
color: #0D0D0D;
margin-bottom: 10px;
letter-spacing: 1px;
font-size: 1.25em;
border-left: 4px solid #FF8444;
padding-left: 4px;
line-height: 1em;
}
.Input .box{
display: flex;
}
.Input .box .icon{
position: relative;
min-width: 40px;
height: 40px;
display: flex;
justify-content: center;
align-items: center;
border-radius: 50%;
margin-right: 10px;
color: #0D0D0D;
font-size: 1.15em;
box-shadow: 5px 5px 7px rgba(0,0,0,0.25);
}
.Input .box input{
position: relative;
width: 100%;
border: none;
outline: none;
padding: 10px 20px;
border-radius: 30px;
font-size: 0.85em;
box-shadow: 5px 5px 7px rgba(0,0,0,0.25);
}
.Input .box input[type="submit"]{
background-color: #0D0D0D;
box-shadow: 5px 5px 7px rgba(0,0,0,0.25);
color: #FF8444;
cursor:pointer;
letter-spacing: 2px;
font-weight: 600;
margin-top: 10px;
}
label{
color: #0D0D0D;
letter-spacing: 1px;
font-size: 0.95em;
display: flex;
align-items: center;
}
label input{
margin-right: 5px;
}
a:nth-of-type(1) {
display: block;
}

@ -1,159 +0,0 @@
header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 20px 0 20px;
background-color: #FF8444;
height: 160px;
}
body{
margin: 0;
padding: 0;
font-family: sans-serif;
background: #34495e;
}
.header-left {
display: flex;
align-items: center;
}
.header-left img {
width: 120px;
height: 120px;
}
.header-center h2 {
font-size: 30px;
margin: 0;
}
.submit-button {
background-color: #34495e;
color: white;
padding: 18px 30px;
border: none;
border-radius: 6px;
cursor: pointer;
float: right;
font-size: 24px;
box-shadow: 4px 4px #1B1B1B;
}
#teams-section {
display: flex;
flex-direction: column;
padding: 60px;
background-color: #f2f2f2;
border-radius: 10px 10px 10px 10px;
box-shadow: 5px 5px #1B1B1B;
margin: 10px;
}
#teams-section h2 {
text-align: center;
font-size: 24px;
margin-top: 0;
margin-bottom: 5px;
}
#teams-list {
display: flex;
flex-direction: row;
flex-wrap: wrap;
overflow: hidden;
justify-content: center;
}
.team-item {
padding: 15px 15px 5px;
display: flex;
flex-direction: column;
align-items: center;
height: 100%;
min-width: 150px;
margin: 10px;
background-color: #ccc;
border-radius: 15px;
overflow: hidden;
box-shadow: 3px 3px #585858;
}
.team-item .team-name {
margin-bottom: 3px;
}
.team-name {
font-size: 18px;
margin-top: 10px;
}
.team-item img {
border-radius: 15px;
width: 100%;
height: auto;
max-width: 150px;
max-height: 150px;
box-shadow: 2px 2px #A7A7A7;
}
#schemas-section {
display: flex;
flex-direction: column;
padding: 60px;
background-color: #f2f2f2;
border-radius: 10px 10px 10px 10px;
box-shadow: 5px 5px #1B1B1B;
margin: 10px;
}
#schemas-section h2 {
text-align: center;
font-size: 24px;
margin-top: 0;
margin-bottom: 5px;
}
#schemas-list {
display: flex;
flex-direction: row;
flex-wrap: wrap;
overflow: hidden;
justify-content: center;
}
.schemas-item {
padding: 15px 15px 5px;
display: flex;
flex-direction: column;
align-items: center;
height: 100%;
min-width: 150px;
margin: 10px;
background-color: #ccc;
border-radius: 15px;
overflow: hidden;
box-shadow: 3px 3px #585858;
}
.schemas-item .schemas-name {
margin-bottom: 3px;
}
.schemas-name {
font-size: 18px;
margin-top: 10px;
}
.schemas-item img {
border-radius: 15px;
width: 100%;
height: auto;
max-width: 150px;
max-height: 150px;
box-shadow: 2px 2px #A7A7A7;
}

@ -1,13 +0,0 @@
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
monospace;
}

@ -1,17 +0,0 @@
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg>

Before

Width:  |  Height:  |  Size: 2.6 KiB

@ -1,13 +0,0 @@
const reportWebVitals = onPerfEntry => {
if (onPerfEntry && onPerfEntry instanceof Function) {
import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
getCLS(onPerfEntry);
getFID(onPerfEntry);
getFCP(onPerfEntry);
getLCP(onPerfEntry);
getTTFB(onPerfEntry);
});
}
};
export default reportWebVitals;

@ -1,5 +0,0 @@
// jest-dom adds custom jest matchers for asserting on DOM nodes.
// allows you to do things like:
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom';

@ -1,12 +0,0 @@
import { render } from '@testing-library/react';
import { describe, test, expect } from 'vitest';
const App = () => <div>learn react</div>
describe('Application', function () {
test('renders learn react link', () => {
const { getByText } = render(<App />);
const linkElement = getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
});
});

@ -1 +0,0 @@
import '@testing-library/jest-dom'

@ -1,36 +0,0 @@
import react from '@vitejs/plugin-react';
import { defineConfig } from 'vitest/config';
import fs from 'fs/promises';
// https://vitejs.dev/config/
export default defineConfig({
esbuild: {
loader: "jsx",
include: /(src|test)\/.*\.jsx?$/,
exclude: [],
},
build: {
target: 'es2021',
},
test: {
globals: true,
environment: 'jsdom',
setupFiles: './test/setupTests.js'
},
plugins: [react()],
optimizeDeps: {
esbuildOptions: {
plugins: [
{
name: 'load-js-files-as-jsx',
setup(build) {
build.onLoad({ filter: /(src|test)\/.*\.js$/ }, async (args) => ({
loader: 'jsx',
contents: await fs.readFile(args.path, 'utf8'),
}));
},
},
],
},
},
});

@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="../js/counter.js" type="module"></script>
<title>Counter</title>
</head>
<body>
<div id="page">
<label>Compteur : </label>
<label id="counter">{0}</label>
<button id="increment" onclick="makeIncrement()">Incrémenter</button>
<button id="reload" onclick="window.location.reload()">recharger la page</button>
</div>
<script src="/cordova.js"></script>
</body>
</html>

@ -39,7 +39,7 @@ body {
/* Portrait layout (default) */ /* Portrait layout (default) */
.app { .app {
background:url(/img/logo.png) no-repeat center top; /* 170px x 200px */ background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */
position:absolute; /* position in the center of the screen */ position:absolute; /* position in the center of the screen */
left:50%; left:50%;
top:50%; top:50%;

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="index.js"></script>
<title>hello</title>
</head>
<body onload="">
<div id="page">
<button onclick="window.location.href = 'counter/index.html'">aller au compteur</button>
</div>
<script src="/cordova.js"></script>
</body>
</html>

@ -0,0 +1 @@
export const ADDRESS = "92.132.64.175:950"

@ -0,0 +1,27 @@
import {ADDRESS} from "./constants.js";
let counter = 0;
window.onload = () => initCounter();
window.makeIncrement = () => makeIncrement();
function updateText() {
document.getElementById("counter").innerHTML = counter
}
async function makeIncrement() {
fetch(`http://${ADDRESS}/counter`, {method: 'POST'})
.then(response => { //TODO verify if it's not an error
counter++
updateText()
})
}
function initCounter() {
fetch(`http://${ADDRESS}/counter`, {method: 'GET'})
.then(response => response.json())
.then(json => {
counter = json.value
updateText()
})
}

@ -0,0 +1,29 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// Wait for the deviceready event before using any of Cordova's device APIs.
// See https://cordova.apache.org/docs/en/latest/cordova/events/events.html#deviceready
document.addEventListener('deviceready', onDeviceReady, false);
function onDeviceReady() {
// Cordova is now initialized. Have fun!
console.log('Running cordova-' + cordova.platformId + '@' + cordova.version);
document.getElementById('deviceready').classList.add('ready');
}