Compare commits
131
Commits
improvments
..
deno
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
95a8ed5ffa | ||
|
|
cd45813228 | ||
|
|
a31390d55a | ||
|
|
df26a3fe96 | ||
|
|
293b7727e2 | ||
|
|
ce4f47b79c | ||
|
|
e874c125ea | ||
|
|
ae180fc3c8 | ||
|
|
65c9da0a1d | ||
|
|
32d5666c4e | ||
|
|
f853ccd820 | ||
|
|
297aa5c3b0 | ||
|
|
da556a5d25 | ||
|
|
ac05980fad | ||
|
|
593ed01669 | ||
|
|
8393749900 | ||
|
|
12676278c1 | ||
|
|
016d629aed | ||
|
|
1ebf5dc2d0 | ||
|
|
ad5f3c0a67 | ||
|
|
89899d82b8 | ||
|
|
3c505d7d5e | ||
|
|
250fe56322 | ||
|
|
958ccaf246 | ||
|
|
c6cba8ef62 | ||
|
|
87d6b9667a | ||
|
|
19fa311496 | ||
|
|
e19a7c5c68 | ||
|
|
a1bec8a62b | ||
|
|
795d9d4099 | ||
|
|
cc1dd3d652 | ||
|
|
51eb6d1ebb | ||
|
|
cf2de58a77 | ||
|
|
05897534c8 | ||
|
|
c472aac40b | ||
|
|
257fc4e630 | ||
|
|
978d4dd6b1 | ||
|
|
e58239e6b9 | ||
|
|
f68b91602d | ||
|
|
bdb6b24da7 | ||
|
|
e42d42189c | ||
|
|
4aef8a9e84 | ||
|
|
e5916dcd21 | ||
|
|
cf23f25af7 | ||
|
|
9f8386af74 | ||
|
|
10950b4f50 | ||
|
|
29a7b9c078 | ||
|
|
6efd4b8afd | ||
|
|
1e18870715 | ||
|
|
a65de2a03a | ||
|
|
fb83d95e7e | ||
|
|
b5e1bf6cb0 | ||
|
|
375c2551fc | ||
|
|
0751d3e447 | ||
|
|
8897e9ac53 | ||
|
|
1f569b6f3d | ||
|
|
e18a393c9e | ||
|
|
7d21d5316b | ||
|
|
548d4c1def | ||
|
|
2f7dcdc5d0 | ||
|
|
80ddf2b010 | ||
|
|
9cabb7c2cd | ||
|
|
2916077329 | ||
|
|
7cfb302634 | ||
|
|
fb4b893e39 | ||
|
|
19b7afa7c5 | ||
|
|
71e1491683 | ||
|
|
093370d199 | ||
|
|
d293b8be06 | ||
|
|
161e828fe4 | ||
|
|
f84d375785 | ||
|
|
8074b3679e | ||
|
|
75ecc7c346 | ||
|
|
6c81a9aeb1 | ||
|
|
39cde030dd | ||
|
|
6da40dfb6e | ||
|
|
e93e54df8e | ||
|
|
63cbf51af8 | ||
|
|
b634723762 | ||
|
|
cee0e920c3 | ||
|
|
da7951b1cb | ||
|
|
516a9856c1 | ||
|
|
441b617eb1 | ||
|
|
e343cee701 | ||
|
|
fe69c01c10 | ||
|
|
e421930f8b | ||
|
|
17f3103144 | ||
|
|
3c81297272 | ||
|
|
25d2fdb781 | ||
|
|
42341dec3e | ||
|
|
fdfef069cb | ||
|
|
8066c990cc | ||
|
|
6118ae35ee | ||
|
|
223932df0a | ||
|
|
a10d01c8d7 | ||
|
|
f04c039e8c | ||
|
|
48377dbe9d | ||
|
|
8e4eb803d7 | ||
|
|
01bdcbe3b7 | ||
|
|
6b2a781378 | ||
|
|
e5bd620c88 | ||
|
|
3182c82dba | ||
|
|
26b09a0941 | ||
|
|
926c35466d | ||
|
|
9cec9e101a | ||
|
|
3d344de012 | ||
|
|
bb6638ae79 | ||
|
|
2f6b62afef | ||
|
|
6015d479fb | ||
|
|
9220f4d4a6 | ||
|
|
d8a655bd9b | ||
|
|
c577d12fc1 | ||
|
|
42a37856d2 | ||
|
|
d085eeb91b | ||
|
|
f3dcddcbc0 | ||
|
|
3dab44623a | ||
|
|
44eb09100c | ||
|
|
deaf5f0fbc | ||
|
|
9bf4830f7a | ||
|
|
7be88a2167 | ||
|
|
4ef7661371 | ||
|
|
8ad11a2a78 | ||
|
|
3d4995e228 | ||
|
|
a46e4a463e | ||
|
|
b9c6612fb1 | ||
|
|
4af9f56707 | ||
|
|
314a816fbd | ||
|
|
3caa916d47 | ||
|
|
fff837b103 | ||
|
|
f9893f3130 | ||
|
|
334c40dead |
No files matched your search
@@ -5,3 +5,4 @@ css/*
|
|||||||
/index.html
|
/index.html
|
||||||
/main-built.js
|
/main-built.js
|
||||||
/api
|
/api
|
||||||
|
result
|
||||||
+16
-25
@@ -1,28 +1,19 @@
|
|||||||
image: "node:4.4.3"
|
image: nixos/nix
|
||||||
|
|
||||||
before_script:
|
workflow:
|
||||||
# install ssh-agent
|
rules:
|
||||||
- 'which npm || ( apt-get update -y && apt-get install node -y )'
|
- if: $CI_COMMIT_BRANCH
|
||||||
|
|
||||||
pages:
|
pages:
|
||||||
stage: deploy
|
stage: deploy
|
||||||
cache:
|
script:
|
||||||
paths:
|
- mkdir -p "$HOME/.config/nix"
|
||||||
- node_modules/
|
- echo 'experimental-features = nix-command flakes' > "$HOME/.config/nix/nix.conf"
|
||||||
- lib/
|
- nix build
|
||||||
script:
|
- cp -r result/ public
|
||||||
- export SALT="salt_and_pepper"
|
artifacts:
|
||||||
- export KEY="qwerty"
|
paths:
|
||||||
- export PLAYER_LIST_LOCATION="//ballephenix.gitlab.io/private/players.spritz.js"
|
- public
|
||||||
- npm install
|
rules:
|
||||||
- node_modules/.bin/gulp prod
|
- if: $CI_COMMIT_BRANCH == "main"
|
||||||
- node_modules/.bin/r.js -o build.js
|
environment: production
|
||||||
- rm -rf node_modules .public public
|
|
||||||
- mkdir .public
|
|
||||||
- cp -r * .public
|
|
||||||
- mv .public public
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- public
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
-20
@@ -1,20 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "phenix-website",
|
|
||||||
"description": "Main web site of Balle Phénix.",
|
|
||||||
"main": "index.html",
|
|
||||||
"authors": [
|
|
||||||
"didier amyot <didier.amyot@gmail.com>"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"moduleType": [],
|
|
||||||
"homepage": "",
|
|
||||||
"private": true,
|
|
||||||
"ignore": [
|
|
||||||
"**/.*",
|
|
||||||
"node_modules",
|
|
||||||
"bower_components",
|
|
||||||
"lib",
|
|
||||||
"test",
|
|
||||||
"tests"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
({
|
|
||||||
baseUrl: "script",
|
|
||||||
paths: {
|
|
||||||
m: '../node_modules/mithril/mithril.min',
|
|
||||||
_: '../node_modules/lodash/lodash.min',
|
|
||||||
spritz: '../node_modules/spritzjs/dist/spritz',
|
|
||||||
requireLib: '../node_modules/requirejs/require'
|
|
||||||
},
|
|
||||||
include: 'main',
|
|
||||||
name: "../node_modules/almond/almond",
|
|
||||||
out: "main-built.js"
|
|
||||||
})
|
|
||||||
-190
@@ -1,190 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>Balle Phenix</title>
|
|
||||||
<link rel="stylesheet" href="css/style.css" />
|
|
||||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
|
|
||||||
<script src="lib/mithril/mithril.min.js"></script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<nav class="uk-navbar">
|
|
||||||
<div class="uk-navbar-content uk-navbar-center">
|
|
||||||
<ul class="uk-navbar-nav">
|
|
||||||
<li class="uk-parent">
|
|
||||||
<a href="https://www.facebook.com/LigueDeBalleLesPhenix">
|
|
||||||
<i class="fa fa-facebook-square"></i>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li class="uk-parent"><a href="/">Acceuil</a></li>
|
|
||||||
<li class="uk-active"><a href="">Calendrier</a></li>
|
|
||||||
<li class="uk-parent"><a>Règlements</a></li>
|
|
||||||
<li class="uk-parent"><a>Photos</a></li>
|
|
||||||
<li class="uk-parent"><a>Membre</a></li>
|
|
||||||
<li class="uk-parent"><a>Nous Joindre</a></li>
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div class="uk-grid">
|
|
||||||
<div class="uk-width-1-5"></div>
|
|
||||||
<div class="uk-width-3-5">
|
|
||||||
|
|
||||||
<div class="uk-grid">
|
|
||||||
<div class="uk-width-5-5">
|
|
||||||
<h2>Classement 2015</h2>
|
|
||||||
<table class="uk-table uk-table-hover uk-table-striped">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Équipes</th>
|
|
||||||
<th>PJ</th>
|
|
||||||
<th>V</th>
|
|
||||||
<th>D</th>
|
|
||||||
<th>N</th>
|
|
||||||
<th>PP</th>
|
|
||||||
<th>PC</th>
|
|
||||||
<th>DIF</th>
|
|
||||||
<th>PTS</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>Verts</td>
|
|
||||||
<td>14</td>
|
|
||||||
<td>11</td>
|
|
||||||
<td>3</td>
|
|
||||||
<td>0</td>
|
|
||||||
<td>161</td>
|
|
||||||
<td>108</td>
|
|
||||||
<td>+53</td>
|
|
||||||
<td>22</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Verts</td>
|
|
||||||
<td>14</td>
|
|
||||||
<td>11</td>
|
|
||||||
<td>3</td>
|
|
||||||
<td>0</td>
|
|
||||||
<td>161</td>
|
|
||||||
<td>108</td>
|
|
||||||
<td>+53</td>
|
|
||||||
<td>22</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Verts</td>
|
|
||||||
<td>14</td>
|
|
||||||
<td>11</td>
|
|
||||||
<td>3</td>
|
|
||||||
<td>0</td>
|
|
||||||
<td>161</td>
|
|
||||||
<td>108</td>
|
|
||||||
<td>+53</td>
|
|
||||||
<td>22</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Verts</td>
|
|
||||||
<td>14</td>
|
|
||||||
<td>11</td>
|
|
||||||
<td>3</td>
|
|
||||||
<td>0</td>
|
|
||||||
<td>161</td>
|
|
||||||
<td>108</td>
|
|
||||||
<td>+53</td>
|
|
||||||
<td>22</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<ul class="uk-subnav uk-subnav-line uk-flex-center">
|
|
||||||
<li>PJ : Parties joués </li><li> V : Victoire </li><li> D : Défaite </li><li> N : Nul </li><li> PP : Points pour </li><li> PC : Points contre </li><li> DIF : Diférenciel </li><li> PTS : Points </li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="uk-grid">
|
|
||||||
<div class="uk-width-3-5">
|
|
||||||
<h2>Calendrier 2015</h2>
|
|
||||||
<h3 style="text-align: left;">5 mai 2016</h3>
|
|
||||||
<table class="uk-table uk-table-hover uk-table-condensed uk-table-striped">
|
|
||||||
<tr>
|
|
||||||
<td>18h30</td>
|
|
||||||
<td><i class="fa fa-flag" style="color: purple;"></i> Mauve</td>
|
|
||||||
<td>8</td>
|
|
||||||
<td>vs</td>
|
|
||||||
<td><i class="fa fa-flag" style="color: red;"></i> Rouge</td>
|
|
||||||
<td>7</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>18h30</td>
|
|
||||||
<td><i class="fa fa-flag" style="color: yellow;"></i> Jaune</td>
|
|
||||||
<td>00</td>
|
|
||||||
<td>vs</td>
|
|
||||||
<td><i class="fa fa-flag" style="color: gray;"></i> Gris</td>
|
|
||||||
<td>00</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="uk-width-1-5"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<footer class="uk-grid ph-footer" style="padding: 80px;">
|
|
||||||
<div class="uk-container uk-container-center uk-text-center">
|
|
||||||
<div class="uk-panel">
|
|
||||||
Ligue de balle les Phénix … pour le plaisir de jouer!
|
|
||||||
</div>
|
|
||||||
<ul class="uk-subnav uk-subnav-line uk-flex-center">
|
|
||||||
<li><a href="mailto:info@ballephenix.com">info@ballephenix.com</a></li>
|
|
||||||
</ul>
|
|
||||||
<h1>
|
|
||||||
<a href="https://www.facebook.com/LigueDeBalleLesPhenix">
|
|
||||||
<i class="fa fa-facebook-square"></i>
|
|
||||||
</a>
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
[title]
|
|
||||||
innerMarkdown = """
|
|
||||||
## Parc Beaubien
|
|
||||||
"""
|
|
||||||
|
|
||||||
[meta]
|
|
||||||
innerMarkdown = """
|
|
||||||
Vendredi 19 aout 2016
|
|
||||||
"""
|
|
||||||
|
|
||||||
[body]
|
|
||||||
innerMarkdown = """
|
|
||||||
|
|
||||||
Bonjour à tous les phénixiens phénixiennes.
|
|
||||||
|
|
||||||
Dès la semaine prochaine, **nous nous relocaliserons au parc Beaubien**, dans
|
|
||||||
Rosemont. [Google map](http://bit.ly/2bPWCY8) vous aidera a trouver votre
|
|
||||||
chemin.
|
|
||||||
|
|
||||||
|
|
||||||
Votre comité de balle les phénix.
|
|
||||||
|
|
||||||
|
|
||||||
"""
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
[title]
|
|
||||||
innerMarkdown = """
|
|
||||||
## Inscription 2016!
|
|
||||||
"""
|
|
||||||
|
|
||||||
[meta]
|
|
||||||
innerMarkdown = """
|
|
||||||
Lundi 14 mars 2016
|
|
||||||
"""
|
|
||||||
|
|
||||||
[body]
|
|
||||||
innerMarkdown = """
|
|
||||||
|
|
||||||
Bonjour à tous les phénixiens phénixiennes.
|
|
||||||
|
|
||||||
Eh bien oui l'hiver tire à ça fin et il sera bientôt temps de sortir gants et
|
|
||||||
batons (en bon français mites et battes) pour jouer à notre sport préféré:
|
|
||||||
la balle-molle.
|
|
||||||
|
|
||||||
|
|
||||||
**L'inscription aura lieu le vendredi 18 mars 2016 de 19h30 à 21h30 à la [taverne
|
|
||||||
le normandie](http://bit.ly/1pmNWu8)**; situé au [1295 rue amherst,
|
|
||||||
Montréal](http://bit.ly/1QUC6Ou). Il s'agit de l'endroit ou nous avons fêté la
|
|
||||||
fin de la dernière saison.
|
|
||||||
|
|
||||||
|
|
||||||
Le prix de l'inscription est de 110$ incluant la location du chandail au coût de
|
|
||||||
10$. La valeur de la location du chandail vous sera rendu en fin de saison
|
|
||||||
lorsque vous le rendrez.
|
|
||||||
|
|
||||||
Pour ceux et celles qui ne pourront être présent à l'inscription, vous pouvez
|
|
||||||
vous inscrire par courrier. Imprimez, remplissez et envoyez le formulaire
|
|
||||||
avec le chèque.
|
|
||||||
|
|
||||||
|
|
||||||
Nous avons très hâte de vous y voir et de fêter avec vous!!!
|
|
||||||
|
|
||||||
|
|
||||||
Votre comité de balle les phénix.
|
|
||||||
|
|
||||||
[<i class="fa fa-paperclip"></i> Formulaire d'inscription](/files/inscription2016.pdf)
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
[smallBody]
|
|
||||||
innerMarkdown = """
|
|
||||||
Bonjour à tous les phénixiens phénixiennes.
|
|
||||||
|
|
||||||
Eh bien oui l'hiver tire à ça fin et il sera bientôt temps de sortir gants et
|
|
||||||
batons (en bon français mites et battes) pour jouer à notre sport préféré:
|
|
||||||
la balle-molle.
|
|
||||||
|
|
||||||
|
|
||||||
**L'inscription aura lieu le vendredi 18 mars 2016 de 19h30 à 21h30 à la [taverne
|
|
||||||
le normandie](http://bit.ly/1pmNWu8)**; situé au [1295 rue amherst,
|
|
||||||
Montréal](http://bit.ly/1QUC6Ou). Il s'agit de l'endroit ou nous avons fêté la
|
|
||||||
fin de la dernière saison.
|
|
||||||
|
|
||||||
**[lire la suite ...](#/nouvelles)**
|
|
||||||
|
|
||||||
"""
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
[title]
|
|
||||||
innerMarkdown = """
|
|
||||||
## Inscription 2017!
|
|
||||||
"""
|
|
||||||
|
|
||||||
[meta]
|
|
||||||
innerMarkdown = """
|
|
||||||
Samedi 18 mars 2017
|
|
||||||
"""
|
|
||||||
|
|
||||||
[body]
|
|
||||||
innerMarkdown = """
|
|
||||||
Bonjour à tous les phénixiens phénixiennes.
|
|
||||||
|
|
||||||
Bien que subtilement, l'hiver tire à sa fin et et la saison de la balle-molle
|
|
||||||
arrive a grand pas. Comble du bonheur, nous retrouvons notre parc, Walter-Stewart,
|
|
||||||
et gardons notre plage horaire, les jeudi soirs.
|
|
||||||
|
|
||||||
**L'inscription aura lieu le vendredi 24 mars 2017 de 18h30 à 21h30 à la [taverne
|
|
||||||
le normandie](http://bit.ly/1pmNWu8)**; situé au [1295 rue amherst,
|
|
||||||
Montréal](http://bit.ly/1QUC6Ou). Il s'agit de l'endroit ou nous avons fêté la
|
|
||||||
fin de la dernière saison.
|
|
||||||
|
|
||||||
Le prix de l'inscription est de **110$** incluant la location du chandail au coût de
|
|
||||||
10$. La valeur de la location du chandail vous sera rendue en fin de saison
|
|
||||||
lorsque vous le rendrez.
|
|
||||||
|
|
||||||
Pour ceux et celles qui ne pourront être présent à l'inscription, vous pouvez
|
|
||||||
vous inscrire par courrier. Imprimez, remplissez et envoyez le formulaire
|
|
||||||
avec le chèque.
|
|
||||||
|
|
||||||
Nous allons jouer une **partie hors concours le 4 mai** et la **saison
|
|
||||||
commencera le jeudi 11 mai**.
|
|
||||||
|
|
||||||
Nous avons très hâte de vous y voir et de fêter avec vous!!!
|
|
||||||
|
|
||||||
|
|
||||||
Votre comité de balle les phénix.
|
|
||||||
|
|
||||||
[<i class="fa fa-paperclip"></i> Formulaire d'inscription](/files/inscription2017.pdf)
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
[smallBody]
|
|
||||||
innerMarkdown = """
|
|
||||||
Bonjour à tous les phénixiens phénixiennes.
|
|
||||||
|
|
||||||
Bien que subtilement, l'hiver tire à sa fin et et la saison de la balle-molle
|
|
||||||
arrive a grand pas. Comble du bonheur, nous retrouvons notre parc, Walter-Stewart,
|
|
||||||
et gardons notre plage horaire, les jeudi soirs.
|
|
||||||
|
|
||||||
**L'inscription aura lieu le vendredi 24 mars 2017 de 18h30 à 21h30 à la [taverne
|
|
||||||
le normandie](http://bit.ly/1pmNWu8)**; situé au [1295 rue amherst,
|
|
||||||
Montréal](http://bit.ly/1QUC6Ou). Il s'agit de l'endroit ou nous avons fêté la
|
|
||||||
fin de la dernière saison.
|
|
||||||
|
|
||||||
|
|
||||||
**[lire la suite ...](#/nouvelles)**
|
|
||||||
|
|
||||||
"""
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
[title]
|
|
||||||
innerMarkdown="""
|
|
||||||
## Inscription 2016 et Dates!
|
|
||||||
"""
|
|
||||||
|
|
||||||
[meta]
|
|
||||||
innerMarkdown = """
|
|
||||||
Jeudi 31 mars 2016
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
[body]
|
|
||||||
innerMarkdown = """
|
|
||||||
Bonjour a tous,
|
|
||||||
|
|
||||||
Permièrement, il est encore temps de s'inscrire. Par ordre de l'Association de
|
|
||||||
Sport de Ball de Montréal, **l'inscription doit être fini le 15 avril**. Donc
|
|
||||||
imprimez et envovez votre inscription le plus vite possible!
|
|
||||||
|
|
||||||
Deuxièmement, nous avons des nouvelles sur les dates. La **saison commencera
|
|
||||||
le jeudi 12 mai**. Nous allons jouer une **partie hors concours le 5 mai**.
|
|
||||||
Comme aux saisons précédentes, nous jouerons les jeudi soir au parc
|
|
||||||
Walter-Stewart et y organiserons une pratique les dimanches matins.
|
|
||||||
|
|
||||||
Pour les nouveaux, les **évaluations se feront dans les alentours du 30 avril**.
|
|
||||||
Il s'agit d'une journee ou les capitaines vous observerons pour savoir votre
|
|
||||||
niveau dans l'optique de creer des équipes les plus égales que possible.
|
|
||||||
|
|
||||||
|
|
||||||
Votre commite ballephenix adoré!
|
|
||||||
|
|
||||||
[<i class="fa fa-paperclip"></i> Formulaire d'inscription](/files/inscription2016.pdf)
|
|
||||||
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[smallBody]
|
|
||||||
innerMarkdown = """
|
|
||||||
|
|
||||||
Bonjour a tous,
|
|
||||||
|
|
||||||
Permièrement, il est encore temps de s'inscrire. Par ordre de l'Association de
|
|
||||||
Sport de Ball de Montréal, **l'inscription doit être fini le 15 avril**. Donc
|
|
||||||
imprimez et envovez votre inscription le plus vite possible!
|
|
||||||
|
|
||||||
**[lire la suite ...](#/nouvelles)**
|
|
||||||
|
|
||||||
"""
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
[title]
|
|
||||||
innerMarkdown = """
|
|
||||||
## Saison 2017!
|
|
||||||
"""
|
|
||||||
|
|
||||||
[meta]
|
|
||||||
innerMarkdown = """
|
|
||||||
Samedi 6 mai 2017
|
|
||||||
"""
|
|
||||||
|
|
||||||
[body]
|
|
||||||
innerMarkdown = """
|
|
||||||
|
|
||||||
Bonjour a toutes et a tous!
|
|
||||||
|
|
||||||
Nous avons quelques problèmes avec le parc Walter-Stewart. La ville
|
|
||||||
re-tourbera bientôt le terrain et nous n'allons pouvoir l'utiliser avant la
|
|
||||||
semaine du 19 juin. D'ici la, nous allons etre hébergé au parc [Georges-Vernot](http://bit.ly/2qMdsdm)
|
|
||||||
dans St-Michel.
|
|
||||||
|
|
||||||
Avec tout ces délais, nous sommes obligé de commencer la saison un peu plus
|
|
||||||
tard que prévue. La saison commencera donc le **jeudi 18 mai 2017**. Il n'y
|
|
||||||
aura donc aucun match pré-saison.
|
|
||||||
|
|
||||||
Nous sommes toujours a la **recherche de capitaines**. La case "je veux devenir
|
|
||||||
capitaine" ne fut pas des plus populaire. Nous cherchons donc intensément
|
|
||||||
quatre capitaines au sang neuf pour diriger cinq équipes au sang chaud.
|
|
||||||
|
|
||||||
|
|
||||||
En résumé.
|
|
||||||
|
|
||||||
* La saison debute le **jeudi 18 mai 2017** au parc **[Georges-Vernot](http://bit.ly/2qMdsdm)**
|
|
||||||
* Nous retrouverons le parc [Walter-Stewart](http://bit.ly/2qDlnMW) la semaine du 19 juin
|
|
||||||
* Il nous manque 4 capitaines
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
[smallBody]
|
|
||||||
innerMarkdown = """
|
|
||||||
Bonjour a toutes et a tous!
|
|
||||||
|
|
||||||
Nous avons quelques problèmes avec le parc Walter-Stewart. La ville
|
|
||||||
re-tourbera bientôt le terrain et nous n'allons pouvoir l'utiliser avant la
|
|
||||||
semaine du 19 juin. D'ici la, nous allons etre hébergé au parc [Georges-Vernot](http://bit.ly/2qMdsdm)
|
|
||||||
dans St-Michel.
|
|
||||||
|
|
||||||
|
|
||||||
**[lire la suite ...](#/nouvelles)**
|
|
||||||
|
|
||||||
"""
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
[title]
|
|
||||||
innerMarkdown = """
|
|
||||||
## Début saison 2017 retardée
|
|
||||||
"""
|
|
||||||
|
|
||||||
[meta]
|
|
||||||
innerMarkdown = """
|
|
||||||
Samedi 23 avril 2017
|
|
||||||
"""
|
|
||||||
|
|
||||||
[body]
|
|
||||||
innerMarkdown = """
|
|
||||||
Suite à la situation au parc Walter-Stewart, nous n'avons toujours pas de date définie
|
|
||||||
pour le début de la saison. La situation devrait se régler incessamment. Nous vous
|
|
||||||
donnerons des nouvelles dès que nous en aurons.
|
|
||||||
|
|
||||||
Merci beaucoup,
|
|
||||||
|
|
||||||
Comité ballephenix!
|
|
||||||
"""
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
[title]
|
|
||||||
innerMarkdown = """
|
|
||||||
# Report de la saison 2016
|
|
||||||
"""
|
|
||||||
|
|
||||||
[meta]
|
|
||||||
innerMarkdown = """
|
|
||||||
Mercredi 11 mai 2016
|
|
||||||
"""
|
|
||||||
|
|
||||||
[body]
|
|
||||||
innerMarkdown = """
|
|
||||||
Le parc walter-stewart est présentement en réaménagement. Conséquemment, nous
|
|
||||||
devons reporter la saison jusqu'à la fin juin, date à laquelle le parc devrait
|
|
||||||
être prêt.
|
|
||||||
|
|
||||||
|
|
||||||
Plusieurs hypothèses sont envisagées pour ne pas perdre de matchs. Nous pensons
|
|
||||||
à jouer les mercredis et jeudis ou rallonger la saison durant le mois de
|
|
||||||
septembre. Malheuresement, nous ne pouvons prendre une désision officielle
|
|
||||||
avant de prendre connaissance de la date exacte de réouverture du parc.
|
|
||||||
|
|
||||||
Votre comité de balle les phénix.
|
|
||||||
"""
|
|
||||||
|
|
||||||
[smallBody]
|
|
||||||
innerMarkdown = """
|
|
||||||
Le parc walter-stewart est présentement en réaménagement. Conséquemment, nous
|
|
||||||
devons reporter la saison jusqu'à la fin juin, date à laquelle le parc devrait
|
|
||||||
être prêt.
|
|
||||||
|
|
||||||
**[lire la suite ...](#/nouvelles)**
|
|
||||||
"""
|
|
||||||
@@ -1,307 +0,0 @@
|
|||||||
---
|
|
||||||
-
|
|
||||||
email: fleet80@hickle.org
|
|
||||||
name: "Delle Emmerich"
|
|
||||||
score: 2
|
|
||||||
team: rouge
|
|
||||||
tel: 613-805-2793x858
|
|
||||||
-
|
|
||||||
email: qschamberger@yahoo.com
|
|
||||||
name: "Susie Quitzon MD"
|
|
||||||
score: 3
|
|
||||||
team: rouge
|
|
||||||
tel: 1-332-714-0777x97469
|
|
||||||
-
|
|
||||||
email: kianna90@yahoo.com
|
|
||||||
name: "Johnathan Leuschke"
|
|
||||||
score: 5
|
|
||||||
team: jaune
|
|
||||||
tel: 974-275-2040
|
|
||||||
-
|
|
||||||
email: susannah.grant@hotmail.com
|
|
||||||
name: "Dr. Wendell Sporer"
|
|
||||||
score: 3
|
|
||||||
team: rouge
|
|
||||||
tel: 04691879363
|
|
||||||
-
|
|
||||||
email: millicent46@adams.info
|
|
||||||
name: "Emile Powlowski II"
|
|
||||||
score: 1
|
|
||||||
team: bleu
|
|
||||||
tel: 1-449-950-7363x2633
|
|
||||||
-
|
|
||||||
email: cormier.codi@hotmail.com
|
|
||||||
name: "Gardner Willms"
|
|
||||||
score: 2
|
|
||||||
team: bleu
|
|
||||||
tel: 625-516-1325
|
|
||||||
-
|
|
||||||
email: kamryn.kovacek@gmail.com
|
|
||||||
name: "Aliya Vandervort"
|
|
||||||
score: 4
|
|
||||||
team: rouge
|
|
||||||
tel: "250.915.3706"
|
|
||||||
-
|
|
||||||
email: marian97@beahan.org
|
|
||||||
name: "Gaige Kautzer"
|
|
||||||
score: 2
|
|
||||||
team: gris
|
|
||||||
tel: "298.694.0319"
|
|
||||||
-
|
|
||||||
email: patsy.kerluke@satterfieldberge.com
|
|
||||||
name: "Orilla Brakus"
|
|
||||||
score: 5
|
|
||||||
team: rouge
|
|
||||||
tel: (506)015-3098x8355
|
|
||||||
-
|
|
||||||
email: alpha30@connelly.com
|
|
||||||
name: "Dr. Thurman O'Hara"
|
|
||||||
score: 5
|
|
||||||
team: bleu
|
|
||||||
tel: 07469452414
|
|
||||||
-
|
|
||||||
email: thompson.willene@gmail.com
|
|
||||||
name: "Rachael Medhurst DDS"
|
|
||||||
score: 2
|
|
||||||
team: rouge
|
|
||||||
tel: 1-602-031-0376
|
|
||||||
-
|
|
||||||
email: inader@kunze.info
|
|
||||||
name: "Mr. Ingram Thompson"
|
|
||||||
score: 2
|
|
||||||
team: rouge
|
|
||||||
tel: (109)873-9483x211
|
|
||||||
-
|
|
||||||
email: desiree.harris@gmail.com
|
|
||||||
name: "Dr. Saul Streich Jr."
|
|
||||||
score: 5
|
|
||||||
team: gris
|
|
||||||
tel: 1-249-486-6759x84328
|
|
||||||
-
|
|
||||||
email: samir83@hills.com
|
|
||||||
name: "Kimberley Kihn"
|
|
||||||
score: 5
|
|
||||||
team: jaune
|
|
||||||
tel: 304.586.6687x3262
|
|
||||||
-
|
|
||||||
email: egrady@emmerichpadberg.com
|
|
||||||
name: "Arra Boyer"
|
|
||||||
score: 3
|
|
||||||
team: gris
|
|
||||||
tel: "485.730.8331"
|
|
||||||
-
|
|
||||||
email: bgoodwin@gmail.com
|
|
||||||
name: "Miss Kaylan Robel DVM"
|
|
||||||
score: 4
|
|
||||||
team: gris
|
|
||||||
tel: "321.945.7155"
|
|
||||||
-
|
|
||||||
email: angelic86@homenick.com
|
|
||||||
name: "Kyson Ruecker"
|
|
||||||
score: 4
|
|
||||||
team: bleu
|
|
||||||
tel: 1-017-690-5278
|
|
||||||
-
|
|
||||||
email: val.sawayn@gmail.com
|
|
||||||
name: "Shaun Goodwin"
|
|
||||||
score: 3
|
|
||||||
team: jaune
|
|
||||||
tel: (271)085-2639x251
|
|
||||||
-
|
|
||||||
email: kya.wunsch@gmail.com
|
|
||||||
name: "Mr. Denzell Casper"
|
|
||||||
score: 2
|
|
||||||
team: bleu
|
|
||||||
tel: 948-754-1786x17035
|
|
||||||
-
|
|
||||||
email: delmus18@stoltenberg.org
|
|
||||||
name: "Bluford Marvin Jr."
|
|
||||||
score: 2
|
|
||||||
team: jaune
|
|
||||||
tel: (268)984-3065x3634
|
|
||||||
-
|
|
||||||
email: kihn.zackery@gmail.com
|
|
||||||
name: "Lucio Kub"
|
|
||||||
score: 2
|
|
||||||
team: jaune
|
|
||||||
tel: 185-942-2355x8756
|
|
||||||
-
|
|
||||||
email: jade24@aufderharkuhic.com
|
|
||||||
name: "Mr. Justice Pollich DVM"
|
|
||||||
score: 1
|
|
||||||
team: bleu
|
|
||||||
tel: 1-918-319-1713
|
|
||||||
-
|
|
||||||
email: vgoyette@hotmail.com
|
|
||||||
name: "Bose Ankunding"
|
|
||||||
score: 4
|
|
||||||
team: gris
|
|
||||||
tel: "265.582.6145"
|
|
||||||
-
|
|
||||||
email: raltenwerth@lueilwitz.com
|
|
||||||
name: "Harlen Harber"
|
|
||||||
score: 1
|
|
||||||
team: jaune
|
|
||||||
tel: (081)424-2803
|
|
||||||
-
|
|
||||||
email: thiel.bode@reynolds.info
|
|
||||||
name: "Linnie Abshire"
|
|
||||||
score: 1
|
|
||||||
team: rouge
|
|
||||||
tel: 1-809-325-8148x5271
|
|
||||||
-
|
|
||||||
email: istracke@lueilwitz.com
|
|
||||||
name: "Mr. Juwan Zemlak"
|
|
||||||
score: 5
|
|
||||||
team: jaune
|
|
||||||
tel: 982.535.6849x5299
|
|
||||||
-
|
|
||||||
email: boysie44@hartmanngraham.com
|
|
||||||
name: "Mr. Tahj Bernhard"
|
|
||||||
score: 1
|
|
||||||
team: rouge
|
|
||||||
tel: +57(9)5038029147
|
|
||||||
-
|
|
||||||
email: harm91@dare.net
|
|
||||||
name: "Dr. Lyle Lakin PhD"
|
|
||||||
score: 4
|
|
||||||
team: bleu
|
|
||||||
tel: 079-078-9724
|
|
||||||
-
|
|
||||||
email: prosacco.dolphus@dickens.com
|
|
||||||
name: "Bertram Schuster"
|
|
||||||
score: 4
|
|
||||||
team: gris
|
|
||||||
tel: (917)409-8168x00826
|
|
||||||
-
|
|
||||||
email: elian04@stroman.com
|
|
||||||
name: "Viviana Howell"
|
|
||||||
score: 5
|
|
||||||
team: rouge
|
|
||||||
tel: 1-414-103-3954x02444
|
|
||||||
-
|
|
||||||
email: hakim08@hotmail.com
|
|
||||||
name: "Marques Goodwin"
|
|
||||||
score: 1
|
|
||||||
team: rouge
|
|
||||||
tel: (649)195-3556x81548
|
|
||||||
-
|
|
||||||
email: nigel.kilback@gmail.com
|
|
||||||
name: "Rayfield Lubowitz"
|
|
||||||
score: 2
|
|
||||||
team: bleu
|
|
||||||
tel: (231)457-7181
|
|
||||||
-
|
|
||||||
email: rogahn.tollie@lehnerwillms.com
|
|
||||||
name: "Miss Luz Altenwerth"
|
|
||||||
score: 3
|
|
||||||
team: gris
|
|
||||||
tel: 00248382520
|
|
||||||
-
|
|
||||||
email: reilly.velia@hansenhegmann.com
|
|
||||||
name: "Lilly Brekke"
|
|
||||||
score: 1
|
|
||||||
team: rouge
|
|
||||||
tel: 006.284.1261x54374
|
|
||||||
-
|
|
||||||
email: batz.dessa@rippin.org
|
|
||||||
name: "Jay Aufderhar"
|
|
||||||
score: 3
|
|
||||||
team: rouge
|
|
||||||
tel: 960-144-7624x406
|
|
||||||
-
|
|
||||||
email: garth.barton@kerluke.com
|
|
||||||
name: "Ms. Contina Pfeffer DDS"
|
|
||||||
score: 5
|
|
||||||
team: jaune
|
|
||||||
tel: (352)043-9218x9064
|
|
||||||
-
|
|
||||||
email: mmcglynn@gusikowski.com
|
|
||||||
name: "Robyn Lakin"
|
|
||||||
score: 1
|
|
||||||
team: bleu
|
|
||||||
tel: 667-492-9674x3911
|
|
||||||
-
|
|
||||||
email: breinger@yahoo.com
|
|
||||||
name: "Latonia Kuhlman"
|
|
||||||
score: 2
|
|
||||||
team: bleu
|
|
||||||
tel: 404.860.5529x107
|
|
||||||
-
|
|
||||||
email: jamarion.sipes@gmail.com
|
|
||||||
name: "Dr. Camryn Goyette"
|
|
||||||
score: 4
|
|
||||||
team: bleu
|
|
||||||
tel: 648-481-0991x380
|
|
||||||
-
|
|
||||||
email: consuelo37@gmail.com
|
|
||||||
name: "Khloe Altenwerth"
|
|
||||||
score: 4
|
|
||||||
team: gris
|
|
||||||
tel: 1-480-994-8256x873
|
|
||||||
-
|
|
||||||
email: icie.kohler@murphyrohan.com
|
|
||||||
name: "Pearl Dicki"
|
|
||||||
score: 1
|
|
||||||
team: rouge
|
|
||||||
tel: +04(3)0376370559
|
|
||||||
-
|
|
||||||
email: miya43@yahoo.com
|
|
||||||
name: "Christoper Botsford"
|
|
||||||
score: 2
|
|
||||||
team: gris
|
|
||||||
tel: (731)031-5128x77337
|
|
||||||
-
|
|
||||||
email: xschmidt@yahoo.com
|
|
||||||
name: "Lauren Bins"
|
|
||||||
score: 1
|
|
||||||
team: gris
|
|
||||||
tel: (503)215-2332x77244
|
|
||||||
-
|
|
||||||
email: rempel.earley@waelchi.net
|
|
||||||
name: "Sigmund Stroman"
|
|
||||||
score: 4
|
|
||||||
team: rouge
|
|
||||||
tel: (719)103-8927x0887
|
|
||||||
-
|
|
||||||
email: gustav.graham@kihn.com
|
|
||||||
name: "Brook Nolan"
|
|
||||||
score: 2
|
|
||||||
team: gris
|
|
||||||
tel: "642.931.3403"
|
|
||||||
-
|
|
||||||
email: hettinger.emit@cartwright.com
|
|
||||||
name: "Mr. Gaston Bartell"
|
|
||||||
score: 5
|
|
||||||
team: jaune
|
|
||||||
tel: "00536147705"
|
|
||||||
-
|
|
||||||
email: tlittle@marquardtfunk.info
|
|
||||||
name: "Ansel Schimmel"
|
|
||||||
score: 3
|
|
||||||
team: bleu
|
|
||||||
tel: (432)161-1237
|
|
||||||
-
|
|
||||||
email: blangosh@hotmail.com
|
|
||||||
name: "Kiefer Funk"
|
|
||||||
score: 3
|
|
||||||
team: rouge
|
|
||||||
tel: 224-921-0391x3813
|
|
||||||
-
|
|
||||||
email: brossard@chat.miaou
|
|
||||||
name: "brossard"
|
|
||||||
score: 3
|
|
||||||
team: vert
|
|
||||||
tel: (432)161-1237
|
|
||||||
-
|
|
||||||
email: hobo@chat.miaou
|
|
||||||
name: "hobo"
|
|
||||||
score: 1
|
|
||||||
team: vert
|
|
||||||
tel: (432)161-1237
|
|
||||||
-
|
|
||||||
email: western@chat.miaou
|
|
||||||
name: "western"
|
|
||||||
score: 2
|
|
||||||
team: vert
|
|
||||||
tel: (432)161-1237
|
|
||||||
@@ -1,421 +0,0 @@
|
|||||||
---
|
|
||||||
|
|
||||||
# generated by https://scheduler.leaguelobster.com/edit/236693/new-league/new-season/#
|
|
||||||
-
|
|
||||||
date: 2017/5/18 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: jaune # t6
|
|
||||||
away: bleu # t5
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/5/18 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: orange # t3
|
|
||||||
away: gris # t1
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/5/18 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: vert # t2
|
|
||||||
away: rouge # t4
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
# WEEK 2
|
|
||||||
-
|
|
||||||
date: 2017/5/25 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: gris # t1
|
|
||||||
away: bleu # t5
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/5/25 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: rouge # t4
|
|
||||||
away: jaune # t6
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/5/25 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: vert # t2
|
|
||||||
away: orange # t3
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
# WEEK 3
|
|
||||||
-
|
|
||||||
date: 2017/6/1 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: jaune # t6
|
|
||||||
away: gris # t1
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/1 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: bleu # t5
|
|
||||||
away: vert # t2
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/1 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: orange # t3
|
|
||||||
away: rouge # t4
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
# WEEK 4
|
|
||||||
-
|
|
||||||
date: 2017/6/8 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: vert # t2
|
|
||||||
away: gris # t1
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/8 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: rouge # t4
|
|
||||||
away: bleu # t5
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/8 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: orange # t3
|
|
||||||
away: jaune # t6
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
# WEEK 5
|
|
||||||
-
|
|
||||||
date: 2017/6/15 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: jaune # t6
|
|
||||||
away: vert # t2
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/15 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: gris # t1
|
|
||||||
away: rouge # t4
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/15 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: bleu # t5
|
|
||||||
away: orange # t3
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
# WEEK 6
|
|
||||||
-
|
|
||||||
date: 2017/6/22 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: bleu # t5
|
|
||||||
away: jaune # t6
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/22 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: orange # t3
|
|
||||||
away: gris # t1
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/22 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: rouge # t4
|
|
||||||
away: vert # t2
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
# WEEK 7
|
|
||||||
-
|
|
||||||
date: 2017/6/29 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: jaune # t6
|
|
||||||
away: rouge # t4
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/29 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: gris # t1
|
|
||||||
away: bleu # t5
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/29 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: vert # t2
|
|
||||||
away: orange # t3
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
# WEEK 8
|
|
||||||
-
|
|
||||||
date: 2017/7/6 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: bleu # t5
|
|
||||||
away: vert # t2
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/6 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: gris # t1
|
|
||||||
away: jaune # t6
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/6 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: orange # t3
|
|
||||||
away: rouge # t4
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
# WEEK 9
|
|
||||||
-
|
|
||||||
date: 2017/7/13 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: jaune # t6
|
|
||||||
away: orange # t3
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/13 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: rouge # t4
|
|
||||||
away: bleu # t5
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/13 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: vert # t2
|
|
||||||
away: gris # t1
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
# WEEK 10
|
|
||||||
-
|
|
||||||
date: 2017/7/20 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: gris # t1
|
|
||||||
away: rouge # t4
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/20 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: bleu # t5
|
|
||||||
away: orange # t3
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/20 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: vert # t2
|
|
||||||
away: jaune # t6
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
# WEEK 11
|
|
||||||
-
|
|
||||||
date: 2017/7/27 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: rouge # t4
|
|
||||||
away: vert # t2
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/27 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: jaune # t6
|
|
||||||
away: bleu # t5
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/27 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: orange # t3
|
|
||||||
away: gris # t1
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
# WEEK 12
|
|
||||||
-
|
|
||||||
date: 2017/8/3 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: gris # t1
|
|
||||||
away: bleu # t5
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/3 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: rouge # t4
|
|
||||||
away: jaune # t6
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/3 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: vert # t2
|
|
||||||
away: orange # t3
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
# WEEK 13
|
|
||||||
-
|
|
||||||
date: 2017/8/10 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: jaune # t6
|
|
||||||
away: gris # t1
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/10 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: bleu # t5
|
|
||||||
away: vert # t2
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/10 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: orange # t3
|
|
||||||
away: rouge # t4
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
# WEEK 14
|
|
||||||
-
|
|
||||||
date: 2017/8/17 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: rouge # t4
|
|
||||||
away: bleu # t5
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/17 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: vert # t2
|
|
||||||
away: gris # t1
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/17 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: orange # t3
|
|
||||||
away: jaune # t6
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
# WEEK 15
|
|
||||||
-
|
|
||||||
date: 2017/8/24 # year/month/day
|
|
||||||
time: "18:30"
|
|
||||||
home: gris # t1
|
|
||||||
away: rouge # t4
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/24 # year/month/day
|
|
||||||
time: "20:00"
|
|
||||||
home: bleu # t5
|
|
||||||
away: orange # t3
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/24 # year/month/day
|
|
||||||
time: "21:30"
|
|
||||||
home: jaune # t6
|
|
||||||
away: vert # t2
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
@@ -1,281 +0,0 @@
|
|||||||
---
|
|
||||||
-
|
|
||||||
date: 2017/5/04 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: jaune
|
|
||||||
home: rouge
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/5/04 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: gris
|
|
||||||
home: bleu
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/5/11 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: rouge
|
|
||||||
home: gris
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/5/11 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: bleu
|
|
||||||
home: jaune
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/5/18 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: gris
|
|
||||||
home: jaune
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/5/18 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: rouge
|
|
||||||
home: bleu
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/5/25 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: bleu
|
|
||||||
home: gris
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/5/25 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: rouge
|
|
||||||
home: jaune
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/1 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: jaune
|
|
||||||
home: bleu
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/1 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: gris
|
|
||||||
home: rouge
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/8 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: bleu
|
|
||||||
home: rouge
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/8 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: jaune
|
|
||||||
home: gris
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
rain: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/15 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: jaune
|
|
||||||
home: rouge
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/15 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: gris
|
|
||||||
home: bleu
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/22 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: rouge
|
|
||||||
home: gris
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/22 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: bleu
|
|
||||||
home: jaune
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/29 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: gris
|
|
||||||
home: jaune
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/6/29 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: rouge
|
|
||||||
home: bleu
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/6 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: bleu
|
|
||||||
home: gris
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/6 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: rouge
|
|
||||||
home: jaune
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/13 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: jaune
|
|
||||||
home: bleu
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/13 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: gris
|
|
||||||
home: rouge
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/20 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: bleu
|
|
||||||
home: rouge
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/20 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: jaune
|
|
||||||
home: gris
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/27 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: jaune
|
|
||||||
home: rouge
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/7/27 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: gris
|
|
||||||
home: bleu
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/3 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: rouge
|
|
||||||
home: gris
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/3 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: bleu
|
|
||||||
home: jaune
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/10 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: jaune
|
|
||||||
home: rouge
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/10 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: gris
|
|
||||||
home: bleu
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
-
|
|
||||||
date: 2017/8/17 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: gris
|
|
||||||
home: jaune
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/17 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: rouge
|
|
||||||
home: bleu
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/25 # year/month/day
|
|
||||||
time: "18:45"
|
|
||||||
away: bleu
|
|
||||||
home: rouge
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
temporary: false
|
|
||||||
|
|
||||||
-
|
|
||||||
date: 2017/8/25 # year/month/day
|
|
||||||
time: "20:20"
|
|
||||||
away: jaune
|
|
||||||
home: gris
|
|
||||||
home_points: ~
|
|
||||||
away_points: ~
|
|
||||||
temporary: false
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"deploy": {
|
||||||
|
"project": "7a93d03e-eabe-4db1-b78e-5f1bbcb460b0",
|
||||||
|
"exclude": [
|
||||||
|
"**/node_modules"
|
||||||
|
],
|
||||||
|
"include": [],
|
||||||
|
"entrypoint": "server.ts"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,280 @@
|
|||||||
|
{
|
||||||
|
"version": "3",
|
||||||
|
"packages": {
|
||||||
|
"specifiers": {
|
||||||
|
"jsr:@oak/commons@0.11": "jsr:@oak/commons@0.11.0",
|
||||||
|
"jsr:@oak/oak": "jsr:@oak/oak@16.1.0",
|
||||||
|
"jsr:@std/assert@0.223": "jsr:@std/assert@0.223.0",
|
||||||
|
"jsr:@std/assert@0.226": "jsr:@std/assert@0.226.0",
|
||||||
|
"jsr:@std/assert@^0.223.0": "jsr:@std/assert@0.223.0",
|
||||||
|
"jsr:@std/assert@^0.224.0": "jsr:@std/assert@0.224.0",
|
||||||
|
"jsr:@std/bytes@0.223": "jsr:@std/bytes@0.223.0",
|
||||||
|
"jsr:@std/bytes@0.224": "jsr:@std/bytes@0.224.0",
|
||||||
|
"jsr:@std/bytes@^0.223.0": "jsr:@std/bytes@0.223.0",
|
||||||
|
"jsr:@std/crypto@0.223": "jsr:@std/crypto@0.223.0",
|
||||||
|
"jsr:@std/crypto@0.224": "jsr:@std/crypto@0.224.0",
|
||||||
|
"jsr:@std/encoding@1.0.0-rc.2": "jsr:@std/encoding@1.0.0-rc.2",
|
||||||
|
"jsr:@std/encoding@^0.223.0": "jsr:@std/encoding@0.223.0",
|
||||||
|
"jsr:@std/http@0.223": "jsr:@std/http@0.223.0",
|
||||||
|
"jsr:@std/http@0.224": "jsr:@std/http@0.224.5",
|
||||||
|
"jsr:@std/io@0.223": "jsr:@std/io@0.223.0",
|
||||||
|
"jsr:@std/media-types@0.223": "jsr:@std/media-types@0.223.0",
|
||||||
|
"jsr:@std/media-types@0.224": "jsr:@std/media-types@0.224.1",
|
||||||
|
"jsr:@std/path@0.223": "jsr:@std/path@0.223.0",
|
||||||
|
"npm:path-to-regexp@6.2.1": "npm:path-to-regexp@6.2.1"
|
||||||
|
},
|
||||||
|
"jsr": {
|
||||||
|
"@oak/commons@0.11.0": {
|
||||||
|
"integrity": "07702bfe5c07cd8144c422022994da1f9fea466b185824f4be63a2b1b1a65125",
|
||||||
|
"dependencies": [
|
||||||
|
"jsr:@std/assert@0.226",
|
||||||
|
"jsr:@std/bytes@0.224",
|
||||||
|
"jsr:@std/crypto@0.224",
|
||||||
|
"jsr:@std/http@0.224",
|
||||||
|
"jsr:@std/media-types@0.224"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@oak/oak@16.1.0": {
|
||||||
|
"integrity": "ab21506555fffeb08dc8f45ff5d28607e8087949ff58bd2964b27df65994480b",
|
||||||
|
"dependencies": [
|
||||||
|
"jsr:@oak/commons@0.11",
|
||||||
|
"jsr:@std/assert@0.223",
|
||||||
|
"jsr:@std/bytes@0.223",
|
||||||
|
"jsr:@std/crypto@0.223",
|
||||||
|
"jsr:@std/http@0.223",
|
||||||
|
"jsr:@std/io@0.223",
|
||||||
|
"jsr:@std/media-types@0.223",
|
||||||
|
"jsr:@std/path@0.223",
|
||||||
|
"npm:path-to-regexp@6.2.1"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@std/assert@0.223.0": {
|
||||||
|
"integrity": "eb8d6d879d76e1cc431205bd346ed4d88dc051c6366365b1af47034b0670be24"
|
||||||
|
},
|
||||||
|
"@std/assert@0.224.0": {
|
||||||
|
"integrity": "8643233ec7aec38a940a8264a6e3eed9bfa44e7a71cc6b3c8874213ff401967f"
|
||||||
|
},
|
||||||
|
"@std/assert@0.226.0": {
|
||||||
|
"integrity": "0dfb5f7c7723c18cec118e080fec76ce15b4c31154b15ad2bd74822603ef75b3"
|
||||||
|
},
|
||||||
|
"@std/bytes@0.223.0": {
|
||||||
|
"integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8"
|
||||||
|
},
|
||||||
|
"@std/bytes@0.224.0": {
|
||||||
|
"integrity": "a2250e1d0eb7d1c5a426f21267ab9bdeac2447fa87a3d0d1a467d3f7a6058e49"
|
||||||
|
},
|
||||||
|
"@std/crypto@0.223.0": {
|
||||||
|
"integrity": "1aa9555ff56b09e197ad988ea200f84bc6781fd4fd83f3a156ee44449af93000",
|
||||||
|
"dependencies": [
|
||||||
|
"jsr:@std/assert@^0.223.0",
|
||||||
|
"jsr:@std/encoding@^0.223.0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@std/crypto@0.224.0": {
|
||||||
|
"integrity": "154ef3ff08ef535562ef1a718718c5b2c5fc3808f0f9100daad69e829bfcdf2d",
|
||||||
|
"dependencies": [
|
||||||
|
"jsr:@std/assert@^0.224.0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@std/encoding@0.223.0": {
|
||||||
|
"integrity": "2b5615a75e00337ce113f34cf2f9b8c18182c751a8dcc8b1a2c2fc0e117bef00"
|
||||||
|
},
|
||||||
|
"@std/encoding@1.0.0-rc.2": {
|
||||||
|
"integrity": "160d7674a20ebfbccdf610b3801fee91cf6e42d1c106dd46bbaf46e395cd35ef"
|
||||||
|
},
|
||||||
|
"@std/http@0.223.0": {
|
||||||
|
"integrity": "15ab8a0c5a7e9d5be017a15b01600f20f66602ceec48b378939fa24fcec522aa",
|
||||||
|
"dependencies": [
|
||||||
|
"jsr:@std/assert@^0.223.0",
|
||||||
|
"jsr:@std/encoding@^0.223.0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@std/http@0.224.5": {
|
||||||
|
"integrity": "b03b5d1529f6c423badfb82f6640f9f2557b4034cd7c30655ba5bb447ff750a4",
|
||||||
|
"dependencies": [
|
||||||
|
"jsr:@std/encoding@1.0.0-rc.2"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@std/io@0.223.0": {
|
||||||
|
"integrity": "2d8c3c2ab3a515619b90da2c6ff5ea7b75a94383259ef4d02116b228393f84f1",
|
||||||
|
"dependencies": [
|
||||||
|
"jsr:@std/bytes@^0.223.0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"@std/media-types@0.223.0": {
|
||||||
|
"integrity": "84684680c2eb6bc6d9369c6d6f26a49decaf2c7603ff531862dda575d9d6776e"
|
||||||
|
},
|
||||||
|
"@std/media-types@0.224.1": {
|
||||||
|
"integrity": "9e69a5daed37c5b5c6d3ce4731dc191f80e67f79bed392b0957d1d03b87f11e1"
|
||||||
|
},
|
||||||
|
"@std/path@0.223.0": {
|
||||||
|
"integrity": "593963402d7e6597f5a6e620931661053572c982fc014000459edc1f93cc3989",
|
||||||
|
"dependencies": [
|
||||||
|
"jsr:@std/assert@^0.223.0"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"path-to-regexp@6.2.1": {
|
||||||
|
"integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==",
|
||||||
|
"dependencies": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"remote": {
|
||||||
|
"https://deno.land/std@0.205.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee",
|
||||||
|
"https://deno.land/std@0.205.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56",
|
||||||
|
"https://deno.land/std@0.205.0/html/entities.ts": "43f208131bb847e6e222c9dd50322066491da93ed945a93d778923ef7e975398",
|
||||||
|
"https://deno.land/std@0.205.0/html/mod.ts": "3f8c71781e32037ab63bd417759d15d31fb9606c6615c85dcabcc515986494ba",
|
||||||
|
"https://deno.land/std@0.205.0/path/_common/assert_path.ts": "061e4d093d4ba5aebceb2c4da3318bfe3289e868570e9d3a8e327d91c2958946",
|
||||||
|
"https://deno.land/std@0.205.0/path/_common/basename.ts": "0d978ff818f339cd3b1d09dc914881f4d15617432ae519c1b8fdc09ff8d3789a",
|
||||||
|
"https://deno.land/std@0.205.0/path/_common/common.ts": "9e4233b2eeb50f8b2ae10ecc2108f58583aea6fd3e8907827020282dc2b76143",
|
||||||
|
"https://deno.land/std@0.205.0/path/_common/constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0",
|
||||||
|
"https://deno.land/std@0.205.0/path/_common/dirname.ts": "2ba7fb4cc9fafb0f38028f434179579ce61d4d9e51296fad22b701c3d3cd7397",
|
||||||
|
"https://deno.land/std@0.205.0/path/_common/format.ts": "11aa62e316dfbf22c126917f5e03ea5fe2ee707386555a8f513d27ad5756cf96",
|
||||||
|
"https://deno.land/std@0.205.0/path/_common/from_file_url.ts": "ef1bf3197d2efbf0297a2bdbf3a61d804b18f2bcce45548ae112313ec5be3c22",
|
||||||
|
"https://deno.land/std@0.205.0/path/_common/glob_to_reg_exp.ts": "5c3c2b79fc2294ec803d102bd9855c451c150021f452046312819fbb6d4dc156",
|
||||||
|
"https://deno.land/std@0.205.0/path/_common/is_glob.ts": "567dce5c6656bdedfc6b3ee6c0833e1e4db2b8dff6e62148e94a917f289c06ad",
|
||||||
|
"https://deno.land/std@0.205.0/path/_common/normalize.ts": "2ba7fb4cc9fafb0f38028f434179579ce61d4d9e51296fad22b701c3d3cd7397",
|
||||||
|
"https://deno.land/std@0.205.0/path/_common/normalize_string.ts": "88c472f28ae49525f9fe82de8c8816d93442d46a30d6bb5063b07ff8a89ff589",
|
||||||
|
"https://deno.land/std@0.205.0/path/_common/relative.ts": "1af19d787a2a84b8c534cc487424fe101f614982ae4851382c978ab2216186b4",
|
||||||
|
"https://deno.land/std@0.205.0/path/_common/strip_trailing_separators.ts": "7ffc7c287e97bdeeee31b155828686967f222cd73f9e5780bfe7dfb1b58c6c65",
|
||||||
|
"https://deno.land/std@0.205.0/path/_common/to_file_url.ts": "a8cdd1633bc9175b7eebd3613266d7c0b6ae0fb0cff24120b6092ac31662f9ae",
|
||||||
|
"https://deno.land/std@0.205.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b",
|
||||||
|
"https://deno.land/std@0.205.0/path/_os.ts": "30b0c2875f360c9296dbe6b7f2d528f0f9c741cecad2e97f803f5219e91b40a2",
|
||||||
|
"https://deno.land/std@0.205.0/path/basename.ts": "04bb5ef3e86bba8a35603b8f3b69537112cdd19ce64b77f2522006da2977a5f3",
|
||||||
|
"https://deno.land/std@0.205.0/path/common.ts": "f4d061c7d0b95a65c2a1a52439edec393e906b40f1caf4604c389fae7caa80f5",
|
||||||
|
"https://deno.land/std@0.205.0/path/dirname.ts": "88a0a71c21debafc4da7a4cd44fd32e899462df458fbca152390887d41c40361",
|
||||||
|
"https://deno.land/std@0.205.0/path/extname.ts": "2da4e2490f3b48b7121d19fb4c91681a5e11bd6bd99df4f6f47d7a71bb6ecdf2",
|
||||||
|
"https://deno.land/std@0.205.0/path/format.ts": "3457530cc85d1b4bab175f9ae73998b34fd456c830d01883169af0681b8894fb",
|
||||||
|
"https://deno.land/std@0.205.0/path/from_file_url.ts": "e7fa233ea1dff9641e8d566153a24d95010110185a6f418dd2e32320926043f8",
|
||||||
|
"https://deno.land/std@0.205.0/path/glob.ts": "9c77cf47db1d786e2ebf66670824d03fd84ecc7c807cac24441eb9d5cb6a2986",
|
||||||
|
"https://deno.land/std@0.205.0/path/is_absolute.ts": "67232b41b860571c5b7537f4954c88d86ae2ba45e883ee37d3dec27b74909d13",
|
||||||
|
"https://deno.land/std@0.205.0/path/join.ts": "98d3d76c819af4a11a81d5ba2dbb319f1ce9d63fc2b615597d4bcfddd4a89a09",
|
||||||
|
"https://deno.land/std@0.205.0/path/mod.ts": "2d62a0a8b78a60e8e6f485d881bac6b61d58573b11cf585fb7c8fc50d9b20d80",
|
||||||
|
"https://deno.land/std@0.205.0/path/normalize.ts": "aa95be9a92c7bd4f9dc0ba51e942a1973e2b93d266cd74f5ca751c136d520b66",
|
||||||
|
"https://deno.land/std@0.205.0/path/parse.ts": "d87ff0deef3fb495bc0d862278ff96da5a06acf0625ca27769fc52ac0d3d6ece",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/_util.ts": "ecf49560fedd7dd376c6156cc5565cad97c1abe9824f4417adebc7acc36c93e5",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/basename.ts": "a630aeb8fd8e27356b1823b9dedd505e30085015407caa3396332752f6b8406a",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/common.ts": "e781d395dc76f6282e3f7dd8de13194abb8b04a82d109593141abc6e95755c8b",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/dirname.ts": "f48c9c42cc670803b505478b7ef162c7cfa9d8e751b59d278b2ec59470531472",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/extname.ts": "ee7f6571a9c0a37f9218fbf510c440d1685a7c13082c348d701396cc795e0be0",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/format.ts": "b94876f77e61bfe1f147d5ccb46a920636cd3cef8be43df330f0052b03875968",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/from_file_url.ts": "b97287a83e6407ac27bdf3ab621db3fccbf1c27df0a1b1f20e1e1b5acf38a379",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/glob.ts": "86c3f06d1c98303613c74650961c3e24bdb871cde2a97c3ae7f0f6d4abbef445",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/is_absolute.ts": "159900a3422d11069d48395568217eb7fc105ceda2683d03d9b7c0f0769e01b8",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/join.ts": "0c0d84bdc344876930126640011ec1b888e6facf74153ffad9ef26813aa2a076",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/mod.ts": "6bfa8a42d85345b12dbe8571028ca2c62d460b6ef968125e498602b43b6cf6b6",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/normalize.ts": "11de90a94ab7148cc46e5a288f7d732aade1d616bc8c862f5560fa18ff987b4b",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/parse.ts": "199208f373dd93a792e9c585352bfc73a6293411bed6da6d3bc4f4ef90b04c8e",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/relative.ts": "e2f230608b0f083e6deaa06e063943e5accb3320c28aef8d87528fbb7fe6504c",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/resolve.ts": "51579d83159d5c719518c9ae50812a63959bbcb7561d79acbdb2c3682236e285",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/separator.ts": "0b6573b5f3269a3164d8edc9cefc33a02dd51003731c561008c8bb60220ebac1",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/to_file_url.ts": "08d43ea839ee75e9b8b1538376cfe95911070a655cd312bc9a00f88ef14967b6",
|
||||||
|
"https://deno.land/std@0.205.0/path/posix/to_namespaced_path.ts": "c9228a0e74fd37e76622cd7b142b8416663a9b87db643302fa0926b5a5c83bdc",
|
||||||
|
"https://deno.land/std@0.205.0/path/relative.ts": "23d45ede8b7ac464a8299663a43488aad6b561414e7cbbe4790775590db6349c",
|
||||||
|
"https://deno.land/std@0.205.0/path/resolve.ts": "5b184efc87155a0af9fa305ff68a109e28de9aee81fc3e77cd01380f19daf867",
|
||||||
|
"https://deno.land/std@0.205.0/path/separator.ts": "40a3e9a4ad10bef23bc2cd6c610291b6c502a06237c2c4cd034a15ca78dedc1f",
|
||||||
|
"https://deno.land/std@0.205.0/path/to_file_url.ts": "edaafa089e0bce386e1b2d47afe7c72e379ff93b28a5829a5885e4b6c626d864",
|
||||||
|
"https://deno.land/std@0.205.0/path/to_namespaced_path.ts": "cf8734848aac3c7527d1689d2adf82132b1618eff3cc523a775068847416b22a",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/_util.ts": "f32b9444554c8863b9b4814025c700492a2b57ff2369d015360970a1b1099d54",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/basename.ts": "8a9dbf7353d50afbc5b221af36c02a72c2d1b2b5b9f7c65bf6a5a2a0baf88ad3",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/common.ts": "e781d395dc76f6282e3f7dd8de13194abb8b04a82d109593141abc6e95755c8b",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/dirname.ts": "5c2aa541384bf0bd9aca821275d2a8690e8238fa846198ef5c7515ce31a01a94",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/extname.ts": "07f4fa1b40d06a827446b3e3bcc8d619c5546b079b8ed0c77040bbef716c7614",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/format.ts": "343019130d78f172a5c49fdc7e64686a7faf41553268961e7b6c92a6d6548edf",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/from_file_url.ts": "d53335c12b0725893d768be3ac6bf0112cc5b639d2deb0171b35988493b46199",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/glob.ts": "0286fb89ecd21db5cbf3b6c79e2b87c889b03f1311e66fb769e6b905d4142332",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/is_absolute.ts": "245b56b5f355ede8664bd7f080c910a97e2169972d23075554ae14d73722c53c",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/join.ts": "e6600bf88edeeef4e2276e155b8de1d5dec0435fd526ba2dc4d37986b2882f16",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/mod.ts": "c3d1a36fbf9f6db1320bcb4fbda8de011d25461be3497105e15cbea1e3726198",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/normalize.ts": "9deebbf40c81ef540b7b945d4ccd7a6a2c5a5992f791e6d3377043031e164e69",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/parse.ts": "120faf778fe1f22056f33ded069b68e12447668fcfa19540c0129561428d3ae5",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/relative.ts": "026855cd2c36c8f28f1df3c6fbd8f2449a2aa21f48797a74700c5d872b86d649",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/resolve.ts": "5ff441ab18a2346abadf778121128ee71bda4d0898513d4639a6ca04edca366b",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/separator.ts": "ae21f27015f10510ed1ac4a0ba9c4c9c967cbdd9d9e776a3e4967553c397bd5d",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/to_file_url.ts": "8e9ea9e1ff364aa06fa72999204229952d0a279dbb876b7b838b2b2fea55cce3",
|
||||||
|
"https://deno.land/std@0.205.0/path/windows/to_namespaced_path.ts": "e0f4d4a5e77f28a5708c1a33ff24360f35637ba6d8f103d19661255ef7bfd50d",
|
||||||
|
"https://deno.land/std@0.224.0/assert/_constants.ts": "a271e8ef5a573f1df8e822a6eb9d09df064ad66a4390f21b3e31f820a38e0975",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert.ts": "09d30564c09de846855b7b071e62b5974b001bb72a4b797958fe0660e7849834",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_almost_equals.ts": "9e416114322012c9a21fa68e187637ce2d7df25bcbdbfd957cd639e65d3cf293",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_array_includes.ts": "14c5094471bc8e4a7895fc6aa5a184300d8a1879606574cb1cd715ef36a4a3c7",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_equals.ts": "3bbca947d85b9d374a108687b1a8ba3785a7850436b5a8930d81f34a32cb8c74",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_exists.ts": "43420cf7f956748ae6ed1230646567b3593cb7a36c5a5327269279c870c5ddfd",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_false.ts": "3e9be8e33275db00d952e9acb0cd29481a44fa0a4af6d37239ff58d79e8edeff",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_greater.ts": "5e57b201fd51b64ced36c828e3dfd773412c1a6120c1a5a99066c9b261974e46",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_greater_or_equal.ts": "9870030f997a08361b6f63400273c2fb1856f5db86c0c3852aab2a002e425c5b",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_instance_of.ts": "e22343c1fdcacfaea8f37784ad782683ec1cf599ae9b1b618954e9c22f376f2c",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_is_error.ts": "f856b3bc978a7aa6a601f3fec6603491ab6255118afa6baa84b04426dd3cc491",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_less.ts": "60b61e13a1982865a72726a5fa86c24fad7eb27c3c08b13883fb68882b307f68",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_less_or_equal.ts": "d2c84e17faba4afe085e6c9123a63395accf4f9e00150db899c46e67420e0ec3",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_match.ts": "ace1710dd3b2811c391946954234b5da910c5665aed817943d086d4d4871a8b7",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_not_equals.ts": "78d45dd46133d76ce624b2c6c09392f6110f0df9b73f911d20208a68dee2ef29",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_not_instance_of.ts": "3434a669b4d20cdcc5359779301a0588f941ffdc2ad68803c31eabdb4890cf7a",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_not_match.ts": "df30417240aa2d35b1ea44df7e541991348a063d9ee823430e0b58079a72242a",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_not_strict_equals.ts": "37f73880bd672709373d6dc2c5f148691119bed161f3020fff3548a0496f71b8",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_object_match.ts": "411450fd194fdaabc0089ae68f916b545a49d7b7e6d0026e84a54c9e7eed2693",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_rejects.ts": "4bee1d6d565a5b623146a14668da8f9eb1f026a4f338bbf92b37e43e0aa53c31",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_strict_equals.ts": "b4f45f0fd2e54d9029171876bd0b42dd9ed0efd8f853ab92a3f50127acfa54f5",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_string_includes.ts": "496b9ecad84deab72c8718735373feb6cdaa071eb91a98206f6f3cb4285e71b8",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assert_throws.ts": "c6508b2879d465898dab2798009299867e67c570d7d34c90a2d235e4553906eb",
|
||||||
|
"https://deno.land/std@0.224.0/assert/assertion_error.ts": "ba8752bd27ebc51f723702fac2f54d3e94447598f54264a6653d6413738a8917",
|
||||||
|
"https://deno.land/std@0.224.0/assert/equal.ts": "bddf07bb5fc718e10bb72d5dc2c36c1ce5a8bdd3b647069b6319e07af181ac47",
|
||||||
|
"https://deno.land/std@0.224.0/assert/fail.ts": "0eba674ffb47dff083f02ced76d5130460bff1a9a68c6514ebe0cdea4abadb68",
|
||||||
|
"https://deno.land/std@0.224.0/assert/mod.ts": "48b8cb8a619ea0b7958ad7ee9376500fe902284bb36f0e32c598c3dc34cbd6f3",
|
||||||
|
"https://deno.land/std@0.224.0/assert/unimplemented.ts": "8c55a5793e9147b4f1ef68cd66496b7d5ba7a9e7ca30c6da070c1a58da723d73",
|
||||||
|
"https://deno.land/std@0.224.0/assert/unreachable.ts": "5ae3dbf63ef988615b93eb08d395dda771c96546565f9e521ed86f6510c29e19",
|
||||||
|
"https://deno.land/std@0.224.0/fmt/colors.ts": "508563c0659dd7198ba4bbf87e97f654af3c34eb56ba790260f252ad8012e1c5",
|
||||||
|
"https://deno.land/std@0.224.0/internal/diff.ts": "6234a4b493ebe65dc67a18a0eb97ef683626a1166a1906232ce186ae9f65f4e6",
|
||||||
|
"https://deno.land/std@0.224.0/internal/format.ts": "0a98ee226fd3d43450245b1844b47003419d34d210fa989900861c79820d21c2",
|
||||||
|
"https://deno.land/std@0.224.0/internal/mod.ts": "534125398c8e7426183e12dc255bb635d94e06d0f93c60a297723abe69d3b22e",
|
||||||
|
"https://deno.land/std@0.84.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58",
|
||||||
|
"https://deno.land/std@0.84.0/_util/os.ts": "e282950a0eaa96760c0cf11e7463e66babd15ec9157d4c9ed49cc0925686f6a7",
|
||||||
|
"https://deno.land/std@0.84.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853",
|
||||||
|
"https://deno.land/std@0.84.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4",
|
||||||
|
"https://deno.land/std@0.84.0/path/_util.ts": "f4fa69aa3cbbd8568763bfc43c7236875015ba343602d8bafd332b4b4243681b",
|
||||||
|
"https://deno.land/std@0.84.0/path/common.ts": "eaf03d08b569e8a87e674e4e265e099f237472b6fd135b3cbeae5827035ea14a",
|
||||||
|
"https://deno.land/std@0.84.0/path/glob.ts": "4a524c1c9da3e79a9fdabdc6e850cd9e41bdf31e442856ffa19c5b123268ca95",
|
||||||
|
"https://deno.land/std@0.84.0/path/mod.ts": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12",
|
||||||
|
"https://deno.land/std@0.84.0/path/posix.ts": "1408f8ba482a4dc5fc0a7cd7be28bbbff9608d2b3b5ffdcf288ae1228d959add",
|
||||||
|
"https://deno.land/std@0.84.0/path/separator.ts": "8fdcf289b1b76fd726a508f57d3370ca029ae6976fcde5044007f062e643ff1c",
|
||||||
|
"https://deno.land/std@0.84.0/path/win32.ts": "6ca052f54500f00cd7a5172fde62900626ab620dcd5bdcf4e6f5695d001ddef6",
|
||||||
|
"https://deno.land/std@0.99.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58",
|
||||||
|
"https://deno.land/std@0.99.0/_util/os.ts": "e282950a0eaa96760c0cf11e7463e66babd15ec9157d4c9ed49cc0925686f6a7",
|
||||||
|
"https://deno.land/std@0.99.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853",
|
||||||
|
"https://deno.land/std@0.99.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4",
|
||||||
|
"https://deno.land/std@0.99.0/path/_util.ts": "2e06a3b9e79beaf62687196bd4b60a4c391d862cfa007a20fc3a39f778ba073b",
|
||||||
|
"https://deno.land/std@0.99.0/path/common.ts": "eaf03d08b569e8a87e674e4e265e099f237472b6fd135b3cbeae5827035ea14a",
|
||||||
|
"https://deno.land/std@0.99.0/path/glob.ts": "314ad9ff263b895795208cdd4d5e35a44618ca3c6dd155e226fb15d065008652",
|
||||||
|
"https://deno.land/std@0.99.0/path/mod.ts": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12",
|
||||||
|
"https://deno.land/std@0.99.0/path/posix.ts": "f56c3c99feb47f30a40ce9d252ef6f00296fa7c0fcb6dd81211bdb3b8b99ca3b",
|
||||||
|
"https://deno.land/std@0.99.0/path/separator.ts": "8fdcf289b1b76fd726a508f57d3370ca029ae6976fcde5044007f062e643ff1c",
|
||||||
|
"https://deno.land/std@0.99.0/path/win32.ts": "77f7b3604e0de40f3a7c698e8a79e7f601dc187035a1c21cb1e596666ce112f8",
|
||||||
|
"https://deno.land/x/media_types@v2.7.1/db.ts": "1d95aa3fc1fe076638550640609394f0e157b18b430800e419aa7ece5c151d9c",
|
||||||
|
"https://deno.land/x/media_types@v2.7.1/deps.ts": "cd4c31e4b5ed8c4d8c61bd2fb38a82d68d3fd2dcf6d43f22511cbe6d9d310e51",
|
||||||
|
"https://deno.land/x/media_types@v2.7.1/mod.ts": "d63583b978d32eff8b76e1ae5d83cba2fb27baa90cc1bcb0ad15a06122ea8c19",
|
||||||
|
"https://deno.land/x/static_files@1.1.6/mod.ts": "8a9bb05599e53864c54eb22931fe98507818517e0d69f26e099a1d8f4ef2b638",
|
||||||
|
"https://deno.land/x/static_files@1.1.6/src/deps.ts": "fb62be7a780339157bf692a619d6d02ea9662490deca275f488f9f9db917fc4a",
|
||||||
|
"https://deno.land/x/static_files@1.1.6/src/types.ts": "ef201288626294e9e1b8ee85cdfe2cdfb282e4d78af445df1726050dfa0c0988",
|
||||||
|
"https://deno.land/x/static_files@1.1.6/src/utils.ts": "9e6172dc97fed01e70a6b063c5afff40e20fe726b3bae0c5f0a962bad74b7107",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/deps.ts": "1fb4acd6b3b6261c308280b09e8feadac7b0fac1e01bd0e0f1e75527a2181a52",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/mod.ts": "ab690911075158ee3762bd7aefe209cdcb6ead7b492f14b0693d7025244db8e6",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/plugins/echo.ts": "f7c064fb6d34b29852f46f6e01583ed87656dcbbc5cae51c8f29198d6951d0cf",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/plugins/escape.ts": "8115ec84c84c13811f4a43263b8954e912df94df6565d6ff9ce7faea7daa50be",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/plugins/export.ts": "ef54811ed0205aaeef6ad09557c94b8ae98e1457234898da5a1c5461a7dcf424",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/plugins/for.ts": "6313e139a23ed17ca8b0852031f8d9e11aeb7520b228e68b9233418d25745414",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/plugins/function.ts": "cdf610a98493e4a093c53473abdad7d47cbcff40aa8362d280e39910620cb8d6",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/plugins/if.ts": "9de295f8675cacaec7866ad21068b6b089bfcadf72d3c62e1df50ca378c04279",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/plugins/import.ts": "406204ab9d785db206da5d5cbcffa9a111cef2a39a19574e630cdea89b0691c5",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/plugins/include.ts": "a9c65ce90354766220c0c9f7b21ea2db97bed99d9ffbe28f8a5ac035d488b163",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/plugins/js.ts": "2c50d60061e9c5b6280a145266e617181534b8767e91127d59d5cf5febdcfb03",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/plugins/layout.ts": "b9970b762ba73cf5605e63e585792803a48e326621c6cb2ec216502ba21a90cd",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/plugins/set.ts": "016235a906f99cbfab78d29dfdfe8ca0925db7a46458fd873adacd0d7c6ed82d",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/plugins/unescape.ts": "946512835a409815d6ad98ac4529440e9a368f42ca499791d0f25ee0ecc4c4d6",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/src/environment.ts": "9c28fbf05176297adb93fc688711125b295c69089554d4211cd38a5b04028ec5",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/src/loader.ts": "eb01b0dca7ea8bcdcdfd30b1f90f2fad28fb7f2cfd943900322a85bfaa86130c",
|
||||||
|
"https://deno.land/x/vento@v0.9.1/src/tokenizer.ts": "e9918ac58f941e048fe08cea10e65fb6e19c00fe7ed31fb050663445f11c6e9d",
|
||||||
|
"https://esm.sh/lodash-es@4.17.21": "460848e64379750386465df2bfcbe530dc5be584cabb39816e0dec105e5f9af2",
|
||||||
|
"https://esm.sh/v135/lodash-es@4.17.21/denonext/lodash-es.mjs": "ca6d37e6a1271d1bd8920da5ff11f7d05465f5d7961d5d09b44db331838981d7"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
exec deno run -A https://deno.land/x/deploy/deployctl.ts deploy --prod --project=phenix server.ts
|
||||||
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 1.4 KiB |
Generated
+60
@@ -0,0 +1,60 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1710146030,
|
||||||
|
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1719848872,
|
||||||
|
"narHash": "sha256-H3+EC5cYuq+gQW8y0lSrrDZfH71LB4DAf+TDFyvwCNA=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "00d80d13810dbfea8ab4ed1009b09100cca86ba8",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
description = "Phenix website";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "nixpkgs/nixos-unstable";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, flake-utils }:
|
||||||
|
|
||||||
|
flake-utils.lib.eachDefaultSystem (system:
|
||||||
|
let
|
||||||
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
|
build-static-files = pkgs.stdenv.mkDerivation {
|
||||||
|
name = "phenix-website-static-assets";
|
||||||
|
src = ./static;
|
||||||
|
buildPhase = ''
|
||||||
|
find . -type f -exec ${pkgs.brotli}/bin/brotli -9 -f -k {} \;
|
||||||
|
'';
|
||||||
|
installPhase = ''
|
||||||
|
cp -r . $out
|
||||||
|
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
packages = { static = build-static-files; };
|
||||||
|
devShell = pkgs.mkShell {
|
||||||
|
name = "Phenix-Website";
|
||||||
|
buildInputs = with pkgs; [ deno ];
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
-128
@@ -1,128 +0,0 @@
|
|||||||
var gulp = require('gulp');
|
|
||||||
var help = require('gulp-task-listing');
|
|
||||||
var clean = require('gulp-clean');
|
|
||||||
var toml = require('gulp-toml');
|
|
||||||
var sass = require('gulp-sass');
|
|
||||||
var rename = require("gulp-rename");
|
|
||||||
var yaml = require('gulp-yaml');
|
|
||||||
var template = require('gulp-template');
|
|
||||||
var wrapper = require('gulp-wrapper');
|
|
||||||
var webserver = require('gulp-webserver');
|
|
||||||
var marked = require('marked');
|
|
||||||
var spritz = require('spritzjs');
|
|
||||||
var modify = require('gulp-modify');
|
|
||||||
var _ = require('lodash');
|
|
||||||
|
|
||||||
gulp.task('help', help);
|
|
||||||
|
|
||||||
|
|
||||||
gulp.task('sass', [], function(){
|
|
||||||
var extraSassPath = ['./node_modules/'];
|
|
||||||
return gulp.src('./scss/*.scss')
|
|
||||||
.pipe(sass({includePaths: extraSassPath}).on('error', console.log))
|
|
||||||
.pipe(gulp.dest('./css'));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('clean', function(){
|
|
||||||
return gulp.src(["lib/", "css/"], {read: false})
|
|
||||||
.pipe(clean());
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('compile-results', function(){
|
|
||||||
return gulp.src('data/*.yaml')
|
|
||||||
.pipe(yaml({safe: true}))
|
|
||||||
.pipe(gulp.dest('./api'));
|
|
||||||
});
|
|
||||||
|
|
||||||
var encryptFile = function(message){
|
|
||||||
var keyLengthInBytes = 128;
|
|
||||||
var salt = process.env.SALT || 'salt';
|
|
||||||
var stringKey = salt + (process.env.KEY || 'qwerty');
|
|
||||||
var key = spritz.hash(stringKey, keyLengthInBytes);
|
|
||||||
var byteArrMessage = spritz.stringToUtf8ByteArray(message);
|
|
||||||
var cypher = spritz.encrypt(key, byteArrMessage);
|
|
||||||
return JSON.stringify(cypher);
|
|
||||||
};
|
|
||||||
|
|
||||||
var wrapEncryptedData = function(encryptedData){
|
|
||||||
return 'window.encryptedPlayerList = ' + encryptedData + ';';
|
|
||||||
};
|
|
||||||
|
|
||||||
gulp.task('encrypt-results', ['compile-results'], function(){
|
|
||||||
return gulp.src('api/*.clear.json')
|
|
||||||
.pipe(modify({
|
|
||||||
fileModifier: function(file, content) {
|
|
||||||
return wrapEncryptedData(encryptFile(content));
|
|
||||||
}
|
|
||||||
}))
|
|
||||||
.pipe(rename(function(path){
|
|
||||||
path.basename = path.basename.replace(/\.clear$/i, '');
|
|
||||||
path.extname = '.spritz.js';
|
|
||||||
return path;
|
|
||||||
}))
|
|
||||||
.pipe(gulp.dest('./api'));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('template-prod', function () {
|
|
||||||
return gulp.src('index.tmpl.html')
|
|
||||||
.pipe(rename("index.html"))
|
|
||||||
.pipe(template({production: true, salt: process.env.SALT, playerListLocation: process.env.PLAYER_LIST_LOCATION}))
|
|
||||||
.pipe(gulp.dest('.'));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('template-dev', function () {
|
|
||||||
return gulp.src('index.tmpl.html')
|
|
||||||
.pipe(rename("index.html"))
|
|
||||||
.pipe(template({production: false, salt: 'salt', playerListLocation: 'api/players.spritz.js'}))
|
|
||||||
.pipe(gulp.dest('.'));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('compile-articles', function(){
|
|
||||||
|
|
||||||
var transformArticle = function(article){
|
|
||||||
var isMarkdownKey = /markdown/i;
|
|
||||||
_.each(article, function(section, sectionName){
|
|
||||||
_.each(section, function(value, key){
|
|
||||||
if(isMarkdownKey.test(key) && _.isString(value)){
|
|
||||||
section[key] = marked(value);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return JSON.stringify(article, null, 4);
|
|
||||||
};
|
|
||||||
|
|
||||||
gulp.src('data/articles/**/*.toml.md')
|
|
||||||
.pipe(toml({to: transformArticle}))
|
|
||||||
.pipe(wrapper({
|
|
||||||
header: "define(['m', '_'], function (m, _ ) {\nreturn ",
|
|
||||||
footer: ';\n});\n'
|
|
||||||
}))
|
|
||||||
.pipe(rename(function(path){
|
|
||||||
path.basename = path.basename.replace(/\.toml$/i, '');
|
|
||||||
path.extname = '.js';
|
|
||||||
return path;
|
|
||||||
}))
|
|
||||||
.pipe(gulp.dest('./script/articles/'));
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('default', ['sass', 'encrypt-results', 'compile-results', 'compile-articles']);
|
|
||||||
|
|
||||||
gulp.task('prod', ['default', 'template-prod']);
|
|
||||||
|
|
||||||
gulp.task('webserver', function(){
|
|
||||||
return gulp.src('.')
|
|
||||||
.pipe(webserver({
|
|
||||||
host: '0.0.0.0',
|
|
||||||
port: 4321,
|
|
||||||
livereload: false,
|
|
||||||
directoryListing: false,
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('dev', ['default', 'webserver', 'template-dev'], function(){
|
|
||||||
gulp.watch('./scss/*.scss', ['sass']);
|
|
||||||
gulp.watch('*.tmpl.html', ['template-dev']);
|
|
||||||
gulp.watch('./data/articles/**/*', ['compile-articles']);
|
|
||||||
return gulp.watch('./data/*.yaml', ['encrypt-results', 'compile-results']);
|
|
||||||
});
|
|
||||||
File diff suppressed because it is too large.
Load diff
Binary file not shown.
File diff suppressed because it is too large.
Load diff
|
Before Width: | Height: | Size: 219 KiB |
File diff suppressed because it is too large.
Load diff
|
Before Width: | Height: | Size: 379 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 68 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 145 KiB |
@@ -1,23 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" >
|
|
||||||
<title>Balle Phenix</title>
|
|
||||||
<link rel="shortcut icon" href="/favicon.ico">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="css/style.css" />
|
|
||||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.0/css/font-awesome.min.css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<script>
|
|
||||||
window.salt = "<%= salt %>";
|
|
||||||
</script>
|
|
||||||
<script src="<%= playerListLocation %>"></script>
|
|
||||||
<%if(production){ %>
|
|
||||||
<script src="main-built.js"></script>
|
|
||||||
<% }else{ %>
|
|
||||||
<script data-main="script/main" src="node_modules/requirejs/require.js"></script>
|
|
||||||
<% } %>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
hello {{ title }}
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "phenix-website",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "Main web site of Balle Phénix.",
|
|
||||||
"main": "index.html",
|
|
||||||
"dependencies": {
|
|
||||||
"gulp": "^3.9.0",
|
|
||||||
"gulp-clean": "^0.3.1",
|
|
||||||
"gulp-modify": "^0.1.1",
|
|
||||||
"gulp-rename": "^1.2.2",
|
|
||||||
"gulp-sass": "^2.1.1",
|
|
||||||
"gulp-task-listing": "^1.0.1",
|
|
||||||
"gulp-template": "^3.1.0",
|
|
||||||
"gulp-toml": "^0.1.1",
|
|
||||||
"gulp-wrap": "^0.11.0",
|
|
||||||
"gulp-wrapper": "^1.0.0",
|
|
||||||
"lodash": "^4.6.1",
|
|
||||||
"marked": "^0.3.5",
|
|
||||||
"requirejs": "^2.1.22",
|
|
||||||
"uikit": "2.27.2",
|
|
||||||
"mithril": "~0.2.1",
|
|
||||||
"almond": "~0.3.1",
|
|
||||||
"requirejs": "~2.1.22",
|
|
||||||
"spritzjs": "https://gitlab.com/didiercrunch/spritzjs.git"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"gulp-webserver": "^0.9.1",
|
|
||||||
"gulp-yaml": "^1.0.1"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://gitlab.com/didiercrunch/phenix-website"
|
|
||||||
},
|
|
||||||
"author": "didier amyot <didier.amyot@gmail.com>",
|
|
||||||
"license": "MIT"
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
*.js
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
define(['m', 'articles/saison2017', 'articles/saison_retardee', 'articles/inscription_2017', 'articles/inscription', 'articles/inscription_rappel', 'articles/walter_stewart', 'articles/changement_de_parc'], function (m, saison2017, saison_retardee, inscription_2017, inscription, inscription_rappel, walter_stewart, changement_de_parc) {
|
|
||||||
var simplifyArticleStructure = function(article){
|
|
||||||
var ret = {};
|
|
||||||
_.each(article, function(section, sectionName){
|
|
||||||
ret[sectionName] = m.trust(section.innerMarkdown);
|
|
||||||
});
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
var articles = [
|
|
||||||
saison2017,
|
|
||||||
saison_retardee,
|
|
||||||
inscription_2017,
|
|
||||||
changement_de_parc,
|
|
||||||
walter_stewart,
|
|
||||||
inscription_rappel,
|
|
||||||
inscription
|
|
||||||
];
|
|
||||||
|
|
||||||
return _.map(articles, simplifyArticleStructure);
|
|
||||||
});
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
define(['m', '_'], function (m, _ ) {
|
|
||||||
return {
|
|
||||||
"title": {
|
|
||||||
"innerMarkdown": "<h2 id=\"d-but-saison-2017-retard-e\">Début saison 2017 retardée</h2>\n"
|
|
||||||
},
|
|
||||||
"meta": {
|
|
||||||
"innerMarkdown": "<p>Samedi 23 avril 2017</p>\n"
|
|
||||||
},
|
|
||||||
"body": {
|
|
||||||
"innerMarkdown": "<p>Suite à la situation au parc Walter-Stewart, nous n'avons toujours pas de date définie\npour le début de la saison. La situation devrait se régler incessamment. Nous vous\ndonnerons des nouvelles dès que nous en aurons.</p>\n<p>Merci beaucoup,</p>\n<p>Comité ballephenix!</p>\n"
|
|
||||||
}
|
|
||||||
};
|
|
||||||
});
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
requirejs.config({
|
|
||||||
paths: {
|
|
||||||
'_': '../node_modules/lodash/lodash.min',
|
|
||||||
'm': '../node_modules/mithril/mithril.min',
|
|
||||||
'spritz': '../node_modules/spritzjs/dist/spritz'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
requirejs(['m', 'views/mainPage', 'views/historicPage', 'views/newsPage', 'views/calendarPage', 'views/rulesPage', 'views/photosPage', 'views/confidentialPage', 'views/contactPage', 'views/inscriptionForm'], function(m, mainPage, historicPage, newsPage, calendarPage, rulesPage, photosPage, confidentialPage, contactPage, inscriptionForm){
|
|
||||||
m.route.mode = "hash";
|
|
||||||
m.route(document.body, "/", {
|
|
||||||
"/": mainPage,
|
|
||||||
"/nouvelles": newsPage,
|
|
||||||
"/inscription-form": inscriptionForm,
|
|
||||||
"/calendrier": calendarPage,
|
|
||||||
"/reglement": rulesPage,
|
|
||||||
"/photos": photosPage,
|
|
||||||
"/membre": confidentialPage,
|
|
||||||
"/historique": historicPage,
|
|
||||||
"/contact": contactPage
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
define(['_'], function(_) {
|
|
||||||
var resultParser = {};
|
|
||||||
|
|
||||||
resultParser._addJSDateToResult = function(res){
|
|
||||||
var date = res.date.split('/');
|
|
||||||
var time = _.isString(res.time) ? res.time.split(':'): [0, 0];
|
|
||||||
res.jsDate = new Date(
|
|
||||||
Number(date[0]),
|
|
||||||
Number(date[1]) - 1,
|
|
||||||
Number(date[2]),
|
|
||||||
Number(time[0]),
|
|
||||||
Number(time[1])
|
|
||||||
);
|
|
||||||
return res;
|
|
||||||
};
|
|
||||||
|
|
||||||
resultParser.parseResults = function(rawResults){
|
|
||||||
rawResults = _.map(rawResults, resultParser._addJSDateToResult);
|
|
||||||
rawResults = _.map(rawResults, resultParser._addCustomStyle);
|
|
||||||
return rawResults;
|
|
||||||
};
|
|
||||||
|
|
||||||
resultParser.getNightGames = function(rawResults){
|
|
||||||
var ret = {};
|
|
||||||
_.each(resultParser.parseResults(rawResults), function(res){
|
|
||||||
if(_.has(ret, res.date)){
|
|
||||||
ret[res.date].push(res);
|
|
||||||
}else{
|
|
||||||
ret[res.date] = [res];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return _.map(ret, function(games, date){
|
|
||||||
return resultParser._addJSDateToResult({date: date, games: games});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
resultParser._getAllTeams = function(rawResults){
|
|
||||||
var homeTeams = _.map(rawResults, 'home');
|
|
||||||
var awayTeams = _.map(rawResults, 'away');
|
|
||||||
return _.uniq(_.concat(homeTeams, awayTeams));
|
|
||||||
};
|
|
||||||
|
|
||||||
resultParser._getWinner = function(res){
|
|
||||||
if(res.home_points > res.away_points){
|
|
||||||
return res.home;
|
|
||||||
}
|
|
||||||
if(res.home_points < res.away_points){
|
|
||||||
return res.away;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
resultParser._hasWon = function(res, team){
|
|
||||||
return resultParser._getWinner(res) == team;
|
|
||||||
};
|
|
||||||
|
|
||||||
resultParser._hasLost = function(res, team){
|
|
||||||
return !resultParser._isDraw(res) && resultParser._getWinner(res) != team;
|
|
||||||
};
|
|
||||||
|
|
||||||
resultParser._isDraw = function(res){
|
|
||||||
return res.home_points == res.away_points;
|
|
||||||
};
|
|
||||||
|
|
||||||
resultParser._getPointsFor = function(res, team){
|
|
||||||
if(res.home == team){
|
|
||||||
return res.home_points;
|
|
||||||
}
|
|
||||||
return res.away_points;
|
|
||||||
};
|
|
||||||
|
|
||||||
resultParser._getPointsForOpponent = function(res, team){
|
|
||||||
if(res.home == team){
|
|
||||||
return res.away_points;
|
|
||||||
}
|
|
||||||
return res.home_points;
|
|
||||||
};
|
|
||||||
|
|
||||||
resultParser._getPointsForGame = function(res, team){
|
|
||||||
if(resultParser._hasWon(res, team)){
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
return resultParser._isDraw(res) ? 1: 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
resultParser._getTeamStats = function(rawResults, team){
|
|
||||||
var ret = {
|
|
||||||
team: team, gamePlayed: 0, victories: 0, points: 0,
|
|
||||||
defeats: 0, draws: 0, pointsFor: 0, pointsAgaint: 0};
|
|
||||||
_.each(rawResults, function(res){
|
|
||||||
if((team != res.home && team != res.away) || !_.isNumber(res.home_points)){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ret.gamePlayed += 1;
|
|
||||||
ret.victories += resultParser._hasWon(res, team) ? 1: 0;
|
|
||||||
ret.defeats += resultParser._hasLost(res, team) ? 1: 0;
|
|
||||||
ret.draws += resultParser._isDraw(res) ? 1: 0;
|
|
||||||
ret.pointsFor += resultParser._getPointsFor(res, team);
|
|
||||||
ret.pointsAgaint += resultParser._getPointsForOpponent(res, team);
|
|
||||||
ret.points += resultParser._getPointsForGame(res, team);
|
|
||||||
});
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
resultParser._removeTemporaryResults = function(rawResults){
|
|
||||||
return _.filter(rawResults, function(rawResult){
|
|
||||||
return !rawResult.temporary;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
resultParser.getStats = function(rawResults){
|
|
||||||
var allTeams = resultParser._getAllTeams(resultParser._removeTemporaryResults(rawResults));
|
|
||||||
var getTeamStats = _.partial(resultParser._getTeamStats, rawResults);
|
|
||||||
return _.map(allTeams, getTeamStats);
|
|
||||||
};
|
|
||||||
|
|
||||||
return resultParser;
|
|
||||||
});
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
define(['m', '_'], function (m, _) {
|
|
||||||
var teams = {};
|
|
||||||
|
|
||||||
teams.teams = function(){
|
|
||||||
return [
|
|
||||||
{name: 'jaune', color: '#FF0'},
|
|
||||||
{name:'rouge', color: '#F00'},
|
|
||||||
{name:'bleu', color: '#00F'},
|
|
||||||
{name:'gris', color: '#808080'},
|
|
||||||
{name:'vert', color: '#008000'},
|
|
||||||
{name: 'orange', color: '#FFA500'}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
teams.getTeamColor = function(teamName){
|
|
||||||
var color;
|
|
||||||
_.each(teams.teams(), function(team){
|
|
||||||
if(team.name == teamName){
|
|
||||||
color = team.color;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return color;
|
|
||||||
};
|
|
||||||
|
|
||||||
return teams;
|
|
||||||
});
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
define(['m'], function(m) {
|
|
||||||
var util = {};
|
|
||||||
util.loremIpsum = function(n){
|
|
||||||
var loremIpsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a"+
|
|
||||||
" diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula "+
|
|
||||||
"ac quam viverra nec consectetur ante hendrerit. Donec et mollis"+
|
|
||||||
" dolor. Praesent et diam eget libero egestas mattis sit amet"+
|
|
||||||
" vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia "+
|
|
||||||
"consectetur. Donec ut libero sed arcu vehicula ultricies a non"+
|
|
||||||
" tortor. Lorem ipsum dolor sit amet, consectetur adipiscing "+
|
|
||||||
"elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a "+
|
|
||||||
"semper sed, adipiscing id dolor. Pellentesque auctor nisi id "+
|
|
||||||
"magna consequat sagittis. Curabitur dapibus enim sit amet elit "+
|
|
||||||
"pharetra tincidunt feugiat nisl imperdiet. Ut convallis libero "+
|
|
||||||
"in urna ultrices accumsan. Donec sed od";
|
|
||||||
loremIpsum = loremIpsum.split(' ');
|
|
||||||
n = n || loremIpsum.length;
|
|
||||||
return loremIpsum.splice(0, n).join(" ");
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
util.formatDate = function(date){
|
|
||||||
var monthNames = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',
|
|
||||||
'juillet', 'août', 'septembre', 'octobre', 'novembre',
|
|
||||||
'decembre'];
|
|
||||||
return [date.getDate(),
|
|
||||||
monthNames[date.getMonth()],
|
|
||||||
date.getFullYear()].join(' ');
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
util.formatDateSmall = function(date){
|
|
||||||
var smallMonthNames = ['janv', 'févr', 'mars', 'avr', 'mai', 'juin',
|
|
||||||
'juill', 'août', 'sept', 'oct', 'nov',
|
|
||||||
'dec'];
|
|
||||||
return [date.getDate(),
|
|
||||||
smallMonthNames[date.getMonth()],
|
|
||||||
date.getFullYear() % 1000].join(' ');
|
|
||||||
};
|
|
||||||
|
|
||||||
util.join = function(arr, sep){
|
|
||||||
if(!_.isArray(arr) || arr.length < 1){
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
var ret = [arr.pop()];
|
|
||||||
_.each(arr, function(elm){
|
|
||||||
ret.push(sep);
|
|
||||||
ret.push(elm);
|
|
||||||
});
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
util.facebookLink = function(){
|
|
||||||
return m('a[href="https://www.facebook.com/LigueDeBalleLesPhenix"]',
|
|
||||||
m('i.fa.fa-facebook-square')
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
util.resultatsURL = function(){
|
|
||||||
var cacheBuster = 2;
|
|
||||||
return "api/resultats.json?_=" + cacheBuster;
|
|
||||||
};
|
|
||||||
|
|
||||||
return util;
|
|
||||||
});
|
|
||||||
@@ -1,147 +0,0 @@
|
|||||||
define(['m', '_', 'util', 'resultParser', 'teams', 'views/topNavBar', 'views/footer', 'images/rain.svg'], function(m, _, util, resultParser, teams, topNavBar, footer, rainSvg) {
|
|
||||||
var statsView = {};
|
|
||||||
|
|
||||||
statsView.controller = function(){
|
|
||||||
var games = m.prop([]);
|
|
||||||
return m.request({method: "GET", url: "api/resultats.json"})
|
|
||||||
.then(games)
|
|
||||||
.then(resultParser.getStats);
|
|
||||||
};
|
|
||||||
|
|
||||||
statsView.getStatRow = function(teamStats){
|
|
||||||
var formatStat = function(n){
|
|
||||||
return teamStats.gamePlayed === 0 ? '-' : n;
|
|
||||||
};
|
|
||||||
return m('tr', [
|
|
||||||
m('td', teamStats.team),
|
|
||||||
m('td', teamStats.gamePlayed),
|
|
||||||
m('td', formatStat(teamStats.victories)),
|
|
||||||
m('td', formatStat(teamStats.defeats)),
|
|
||||||
m('td', formatStat(teamStats.draws)),
|
|
||||||
m('td', formatStat(teamStats.pointsFor)),
|
|
||||||
m('td', formatStat(teamStats.pointsAgaint)),
|
|
||||||
m('td', formatStat(teamStats.pointsFor - teamStats.pointsAgaint)),
|
|
||||||
m('td', formatStat(teamStats.points))
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
statsView.mainTable = function(stats){
|
|
||||||
var orderedStats = _.reverse(_.sortBy(stats, ['victories', 'pointsFor']));
|
|
||||||
return m('table.uk-table.uk-table-hover.uk-table-striped',[
|
|
||||||
m('thead', m('tr', [
|
|
||||||
m('th', 'Équipes'),
|
|
||||||
m('th', 'PJ'),
|
|
||||||
m('th', 'V'),
|
|
||||||
m('th', 'D'),
|
|
||||||
m('th', 'N'),
|
|
||||||
m('th', 'PP'),
|
|
||||||
m('th', 'PC'),
|
|
||||||
m('th', 'DIF'),
|
|
||||||
m('th', 'PTS')
|
|
||||||
])),
|
|
||||||
m('tbody', _.map(orderedStats, statsView.getStatRow))
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
statsView.legend = function(){
|
|
||||||
var items = ["PJ : Parties joués", "V : Victoire", "D : Défaite",
|
|
||||||
"N : Nul", "PP : Points pour", "PC : Points contre",
|
|
||||||
"DIF : Diférenciel","PTS : Points"];
|
|
||||||
return m('ul.uk-subnav.uk-subnav-line.uk-flex-center',[
|
|
||||||
_.map(items, function(itm){
|
|
||||||
return m('li', itm);
|
|
||||||
})
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
statsView.view = function(stats){
|
|
||||||
return m('div.uk-grid',
|
|
||||||
m('div.uk-width-medium-1-1.uk-width-large-1-1.uk-container-center',[
|
|
||||||
m('h2', 'Classement 2017'),
|
|
||||||
statsView.mainTable(stats()),
|
|
||||||
statsView.legend()
|
|
||||||
]));
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
var tabView = {};
|
|
||||||
|
|
||||||
tabView.view = function(){
|
|
||||||
return m('div.uk-margin', m('h2', 'Calendrier 2017'),
|
|
||||||
m('ul.uk-tab', [
|
|
||||||
m('li.uk-active', m('a', 'Saison')),
|
|
||||||
m('li', m('a', 'Éliminatoire'))
|
|
||||||
]));
|
|
||||||
};
|
|
||||||
|
|
||||||
var schedulView = {};
|
|
||||||
|
|
||||||
schedulView.controller = function(){
|
|
||||||
var games = m.prop([]);
|
|
||||||
return m.request({method: "GET", url: "api/resultats.json"})
|
|
||||||
.then(games)
|
|
||||||
.then(resultParser.getNightGames);
|
|
||||||
};
|
|
||||||
|
|
||||||
schedulView._getTeamTag = function(teamName){
|
|
||||||
var teamColor = teams.getTeamColor(teamName);
|
|
||||||
return [
|
|
||||||
m('i.fa.fa-flag', {style: {color: teamColor}}),
|
|
||||||
m('span', ' ' + teamName)
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
schedulView._asGamePoints = function(points){
|
|
||||||
return !_.isNumber(points) ? '-' : points + '';
|
|
||||||
};
|
|
||||||
|
|
||||||
schedulView._gameName = function(game){
|
|
||||||
if(game.rain){
|
|
||||||
return [rainSvg('1.5em'), " ", game.time];
|
|
||||||
}
|
|
||||||
return [game.time, " ", m('span', {style: {visibility: 'hidden'}}, rainSvg('1.5em'))];
|
|
||||||
};
|
|
||||||
|
|
||||||
schedulView._gameRow = function(game){
|
|
||||||
|
|
||||||
return m('tr',[
|
|
||||||
m('td', schedulView._gameName(game)),
|
|
||||||
m('td', schedulView._getTeamTag(game.home)),
|
|
||||||
m('td', schedulView._asGamePoints(game.home_points)),
|
|
||||||
m('td', 'vs'),
|
|
||||||
m('td', schedulView._getTeamTag(game.away)),
|
|
||||||
m('td', schedulView._asGamePoints(game.away_points))
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
schedulView._gameView = function(gameNight){
|
|
||||||
return m('div', [m('h3', util.formatDate(gameNight.jsDate)),
|
|
||||||
m('table.uk-table.uk-table-hover.uk-table-condensed.uk-table-striped',
|
|
||||||
m('tbody',[
|
|
||||||
_.map(gameNight.games, schedulView._gameRow),
|
|
||||||
])
|
|
||||||
)
|
|
||||||
]);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
schedulView.view = function(games){
|
|
||||||
return m('div.uk-grid',
|
|
||||||
m('div.uk-width-large-3-5.uk-width-medium-1-1',
|
|
||||||
_.concat([m('h2', 'Calendrier 2017')], _.map(games(), schedulView._gameView))));
|
|
||||||
};
|
|
||||||
|
|
||||||
calendarPage = {};
|
|
||||||
|
|
||||||
calendarPage.view = function(){
|
|
||||||
return [m.component(topNavBar),
|
|
||||||
m('div.uk-grid.uk-margin-top.uk-margin-bottom',
|
|
||||||
m('div.uk-width-large-3-5.uk-width-medium-4-5.uk-width-small-1-1.uk-container-center',[
|
|
||||||
m.component(statsView),
|
|
||||||
m.component(tabView),
|
|
||||||
m.component(schedulView)])),
|
|
||||||
m.component(footer)];
|
|
||||||
};
|
|
||||||
|
|
||||||
return calendarPage;
|
|
||||||
});
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
define(['m', '_', 'teams', 'views/loginPage', 'views/playersPage', 'views/topNavBar', 'views/footer'], function (m, _ , teams, loginPage, playersPage, topNavBar, footer) {
|
|
||||||
|
|
||||||
var confidentialPage = {};
|
|
||||||
|
|
||||||
confidentialPage.view = function(){
|
|
||||||
var body;
|
|
||||||
if(_.isEmpty(localStorage.getItem('secret'))){
|
|
||||||
body = loginPage;
|
|
||||||
}else{
|
|
||||||
body = playersPage;
|
|
||||||
}
|
|
||||||
return [
|
|
||||||
m.component(topNavBar),
|
|
||||||
m.component(body),
|
|
||||||
m.component(footer)
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
return confidentialPage;
|
|
||||||
});
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
define(['m', '_', 'util', 'resultParser', 'views/topNavBar', 'views/footer'], function (m, _ , util, resultParser, topNavBar, footer) {
|
|
||||||
|
|
||||||
var contactBody = {};
|
|
||||||
|
|
||||||
contactBody.logo = function(){
|
|
||||||
var style = 'height: 300px; width: 300px; background-size: 300px; background-image: url(images/logosansfond.JPG);';
|
|
||||||
return m('div.uk-cover-background.uk-container-center', {style: style});
|
|
||||||
};
|
|
||||||
|
|
||||||
contactBody.logoLine = function(){
|
|
||||||
return m('div.uk-grid.uk-margin',
|
|
||||||
m('div.uk-width-1-1', contactBody.logo()));
|
|
||||||
};
|
|
||||||
|
|
||||||
contactBody.email = function(){
|
|
||||||
return m('a[href=mailto:ballephenix@gmail.com]', 'ballephenix@gmail.com');
|
|
||||||
};
|
|
||||||
|
|
||||||
contactBody.tel = function(){
|
|
||||||
return ' (514) 563-1736';
|
|
||||||
};
|
|
||||||
|
|
||||||
contactBody.address = function(){
|
|
||||||
return m('p', ' 9200 rue hochelage, App 205', m('br'), 'Montréal, Québec H1L 0B2');
|
|
||||||
};
|
|
||||||
|
|
||||||
contactBody.website = function(){
|
|
||||||
var gitlabUrl = 'https://gitlab.com/ballephenix/website';
|
|
||||||
return m('p', ' Le site web est ouvert et accessible sur ',
|
|
||||||
m('a', {href: gitlabUrl}, 'gitlab.'));
|
|
||||||
};
|
|
||||||
|
|
||||||
contactBody.contact = function(){
|
|
||||||
return m('div.div.uk-panel.uk-panel-box.uk-panel-box-secondary.uk-container-center.uk-margin',[
|
|
||||||
m('table.uk-table',
|
|
||||||
m('tr',
|
|
||||||
m('td.uk-text-right', m('i.fa.fa-desktop')),
|
|
||||||
m('td', contactBody.email())
|
|
||||||
),
|
|
||||||
m('tr',
|
|
||||||
m('td.uk-text-right', m('i.fa.fa-phone')),
|
|
||||||
m('td', contactBody.tel())
|
|
||||||
),
|
|
||||||
m('tr',
|
|
||||||
m('td.uk-text-right', m('i.fa.fa-envelope')),
|
|
||||||
m('td', contactBody.address())
|
|
||||||
),
|
|
||||||
m('tr',
|
|
||||||
m('td.uk-text-right', m('i.fa.fa-gitlab')),
|
|
||||||
m('td', contactBody.website())
|
|
||||||
)
|
|
||||||
)
|
|
||||||
]);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
contactBody.view = function(){
|
|
||||||
return m('div.uk-margin-top.uk-margin-bottom.uk-grid',
|
|
||||||
m('div.uk-width-large-2-5.uk-width-medium-4-5.uk-width-small-1-1.uk-container-center', [
|
|
||||||
contactBody.logoLine(),
|
|
||||||
contactBody.contact()
|
|
||||||
])
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
var contactPage = {};
|
|
||||||
|
|
||||||
contactPage.view = function(){
|
|
||||||
return [
|
|
||||||
m.component(topNavBar),
|
|
||||||
m.component(contactBody),
|
|
||||||
m.component(footer)
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
return contactPage;
|
|
||||||
});
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
define(['m', '_', 'util'], function (m, _, util) {
|
|
||||||
var footer = {};
|
|
||||||
|
|
||||||
footer.wording = function(){
|
|
||||||
return [
|
|
||||||
m('span.uk-hidden-small', 'Ligue de balle les Phénix... pour le plaisir de jouer!'),
|
|
||||||
m('h4.uk-visible-small', 'Ligue de balle les Phénix')
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
footer.view = function(){
|
|
||||||
return m('footer.uk-grid.ph-footer', {style: {padding: '40px'}},
|
|
||||||
m('div.uk-container.uk-container-center.uk-text-center', [
|
|
||||||
m('div.uk-panel', footer.wording()),
|
|
||||||
m('ul.uk-subnav.uk-subnav-line.uk-flex-center',
|
|
||||||
m('li', m('a[href="mailto:ballephenix@gmail.com"]', 'ballephenix@gmail.com'))),
|
|
||||||
m('h1', util.facebookLink())
|
|
||||||
])
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
return footer;
|
|
||||||
});
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
define(['m', '_', 'util', 'views/topNavBar', 'views/calendarPage'], function(m, _, util, topNavBar, calendarPage) {
|
|
||||||
|
|
||||||
var yearSelector = {};
|
|
||||||
|
|
||||||
yearSelector.view = function(){
|
|
||||||
return m('div.uk-grid',
|
|
||||||
m('div.uk-width-large-3-5.uk-width-medium-1-1.uk-container-center',
|
|
||||||
yearSelector.tab()));
|
|
||||||
};
|
|
||||||
|
|
||||||
yearSelector.tab = function(){
|
|
||||||
return m('ul.uk-tab.uk-margin-top', [
|
|
||||||
m('li.uk-active', m('a', 'Saison 2016'))
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
var historicPage = {};
|
|
||||||
|
|
||||||
historicPage.view = function(){
|
|
||||||
return [
|
|
||||||
m.component(topNavBar),
|
|
||||||
m.component(yearSelector)
|
|
||||||
// m.component(calendarPage)
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
return historicPage;
|
|
||||||
});
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
define(['m', '_',], function (m, _ ) {
|
|
||||||
|
|
||||||
var inscriptionForm = {};
|
|
||||||
|
|
||||||
inscriptionForm.title = function(){
|
|
||||||
return m('h1.uk-width-1-1.uk-text-center', 'Inscription Balle Phénix');
|
|
||||||
};
|
|
||||||
|
|
||||||
inscriptionForm._field = function(label){
|
|
||||||
return m('label', label, m('input.uk-form-width-large', {type: 'text'}));
|
|
||||||
};
|
|
||||||
|
|
||||||
inscriptionForm.identification = function(){
|
|
||||||
return m('form.uk-form', m('fieldset',
|
|
||||||
m('legend', 'Identification'),
|
|
||||||
m('div.uk-margin-top.uk-margin-bottom.uk-grid',
|
|
||||||
m('div.uk-width-1-2', inscriptionForm._field('Nom')),
|
|
||||||
m('div.uk-width-1-2', inscriptionForm._field('Prénom'))),
|
|
||||||
m('div.uk-margin-top.uk-margin-bottom.uk-grid',
|
|
||||||
m('div.uk-width-1-2', inscriptionForm._field('Adresse')),
|
|
||||||
m('div.uk-width-1-2', inscriptionForm._field('Chanson préférée'))),
|
|
||||||
m('div.uk-margin-top.uk-margin-bottom.uk-grid',
|
|
||||||
m('div.uk-width-1-3', inscriptionForm._field('Ville')),
|
|
||||||
m('div.uk-width-1-3', inscriptionForm._field('Code postal')),
|
|
||||||
m('div.uk-width-1-3', inscriptionForm._field('Tél')))
|
|
||||||
|
|
||||||
));
|
|
||||||
};
|
|
||||||
|
|
||||||
inscriptionForm.inscription = function(){
|
|
||||||
return m('form.uk-form',
|
|
||||||
m('h2.uk-width-1-1.uk-text-center', 'Inscription'),
|
|
||||||
m('div.uk-margin-top.uk-margin-bottom.uk-grid',
|
|
||||||
m('div.uk-width-1-1',
|
|
||||||
inscriptionForm._field('Inscription en duo. Inscrivez le nom du joueur')))
|
|
||||||
|
|
||||||
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
inscriptionForm.view = function(){
|
|
||||||
return [
|
|
||||||
inscriptionForm.title(),
|
|
||||||
inscriptionForm.identification(),
|
|
||||||
inscriptionForm.inscription()
|
|
||||||
|
|
||||||
];
|
|
||||||
// return m('form', m('label', 'Nom', m('input', {type: 'text'})));
|
|
||||||
};
|
|
||||||
|
|
||||||
return inscriptionForm;
|
|
||||||
});
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
define(['m', '_'], function (m, _) {
|
|
||||||
|
|
||||||
var loginPage = {};
|
|
||||||
loginPage.salt = window.salt;
|
|
||||||
|
|
||||||
loginPage.controller = function(){
|
|
||||||
return {email: m.prop(''), password: m.prop('')};
|
|
||||||
};
|
|
||||||
|
|
||||||
loginPage.logo = function(){
|
|
||||||
var style = 'height: 250px; width: 250px; background-size: 250px; background-image: url(images/logosansfond.JPG);';
|
|
||||||
return m('div.uk-cover-background.uk-container-center', {style: style});
|
|
||||||
};
|
|
||||||
|
|
||||||
loginPage.logoLine = function(){
|
|
||||||
return m('div.uk-grid.uk-margin',
|
|
||||||
m('div.uk-width-1-1', loginPage.logo()));
|
|
||||||
};
|
|
||||||
|
|
||||||
loginPage.login = function(ctrl){
|
|
||||||
return function(){
|
|
||||||
localStorage.setItem('secret', loginPage.salt + ctrl.email() + ctrl.password());
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
loginPage.formChange = function(ctrl){
|
|
||||||
return function(evt){
|
|
||||||
ctrl[evt.target.name](evt.target.value);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
loginPage.loginForm = function(ctrl){
|
|
||||||
return m('div.uk-panel.uk-panel-box.uk-panel-box-secondary.uk-width-large-1-3.uk-container-center.uk-margin', [
|
|
||||||
m('form.uk-text-center[action]', {onsubmit: loginPage.login(ctrl), onchange: loginPage.formChange(ctrl)},
|
|
||||||
m('div.uk-form-row',
|
|
||||||
m('label', "Nom d'utilisateur ",
|
|
||||||
m('input[type=text][name=email][required].uk-form-width-small', {value: ctrl.email()} ))),
|
|
||||||
m('div.uk-form-row',
|
|
||||||
m('label', "Mot de passe ",
|
|
||||||
m('input[type=password][name=password][required].uk-form-width-small', {value: ctrl.password()}))),
|
|
||||||
m('div.uk-form-row', m('button.uk-button', m("i.fa.fa-mars-double"), " Pénétrez"))
|
|
||||||
)
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
loginPage.view = function(ctrl){
|
|
||||||
return m('div', [
|
|
||||||
loginPage.logoLine(),
|
|
||||||
loginPage.loginForm(ctrl)
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
return loginPage;
|
|
||||||
});
|
|
||||||
@@ -1,216 +0,0 @@
|
|||||||
define(['m', '_', 'util', 'resultParser', 'views/topNavBar', 'views/footer', 'articles/articles', 'images/rain.svg'], function (m, _ , util, resultParser, topNavBar, footer, articles, rainSvg) {
|
|
||||||
var mainPageLogo = {};
|
|
||||||
|
|
||||||
mainPageLogo.view = function(){
|
|
||||||
return m('div.uk-grid', [
|
|
||||||
m('div.uk-large-1-3.uk-medium-2-3.uk-container-center', [
|
|
||||||
m('div.uk-cover-background.uk-container-center.uk-margin-left.uk-margin-top',{style: 'height:300px; width: 300px; background-size: 300px; background-image: url(images/logosansfond.JPG);'})
|
|
||||||
])
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
var mainPageNews = {};
|
|
||||||
|
|
||||||
mainPageNews.view = function(){
|
|
||||||
var article = _.get(articles, 0, {});
|
|
||||||
return m('div.uk-panel.uk-panel-box',[
|
|
||||||
m('div.uk-panel-badge.uk-badge', [
|
|
||||||
m('i.fa.fa-newspaper-o', {style: {'font-size': '1.7em'}})
|
|
||||||
]),
|
|
||||||
m('h3.uk-panel-title', m('a.uk-link-muted', {href: '#/nouvelles'}, article.title)),
|
|
||||||
m('p', article.smallBody || article.body)
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
var nextGameDaySchedule = {};
|
|
||||||
|
|
||||||
nextGameDaySchedule._toDay = function(){
|
|
||||||
var now = new Date();
|
|
||||||
return new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
||||||
};
|
|
||||||
|
|
||||||
nextGameDaySchedule.controller = function(){
|
|
||||||
var games = m.prop([]);
|
|
||||||
var toDay = new Date();
|
|
||||||
return m.request({method: "GET", url: util.resultatsURL()})
|
|
||||||
.then(games)
|
|
||||||
.then(resultParser.getNightGames)
|
|
||||||
.then(function(nightGames){
|
|
||||||
return nextGameDaySchedule._getNextNightGame(nightGames, nextGameDaySchedule._toDay()).games;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
nextGameDaySchedule._getNextNightGame = function(games, date){
|
|
||||||
return _.first(_.filter(games, function(game){
|
|
||||||
return game.jsDate.getTime() >= date.getTime();
|
|
||||||
}));
|
|
||||||
};
|
|
||||||
|
|
||||||
nextGameDaySchedule._getTableHead = function(){
|
|
||||||
return m('thead', m('tr', [
|
|
||||||
m('td', 'Date'),
|
|
||||||
m('td', 'Heure'),
|
|
||||||
m('td', 'Visiteur'),
|
|
||||||
m('td', 'Receveur')
|
|
||||||
]));
|
|
||||||
};
|
|
||||||
|
|
||||||
nextGameDaySchedule._responsoveText = function(largeText, smallText, rain){
|
|
||||||
var ret = [];
|
|
||||||
if(rain){
|
|
||||||
ret.push(rainSvg('1.5em'));
|
|
||||||
ret.push(' ');
|
|
||||||
}
|
|
||||||
ret.push(m('span.uk-visible-large', largeText));
|
|
||||||
ret.push(m('span.uk-hidden-large', smallText));
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
nextGameDaySchedule._getGamesRow = function(game){
|
|
||||||
return m('tr', [
|
|
||||||
m('td', nextGameDaySchedule._responsoveText(util.formatDate(game.jsDate),
|
|
||||||
util.formatDateSmall(game.jsDate),
|
|
||||||
game.rain)),
|
|
||||||
m('td', game.time),
|
|
||||||
m('td', game.away),
|
|
||||||
m('td', game.home)
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
nextGameDaySchedule._getGamesRows = function(games){
|
|
||||||
return _.map(games(), nextGameDaySchedule._getGamesRow);
|
|
||||||
};
|
|
||||||
|
|
||||||
nextGameDaySchedule.view = function(games){
|
|
||||||
return m('table.uk-table.uk-table-hover.uk-table-striped.uk-table-condensed',[
|
|
||||||
nextGameDaySchedule._getTableHead(),
|
|
||||||
m('tbody',
|
|
||||||
nextGameDaySchedule._getGamesRows(games)
|
|
||||||
)]);
|
|
||||||
};
|
|
||||||
|
|
||||||
var scheduleNotYetSet = {};
|
|
||||||
|
|
||||||
scheduleNotYetSet. view = function(){
|
|
||||||
return m('div',
|
|
||||||
m('h4', 'À venir...'),
|
|
||||||
m('p', "Suite a la situation au parc Walter-Stewart, " +
|
|
||||||
"nous n'avons toujours pas de date définie " +
|
|
||||||
"pour le début de la saison. La situation" +
|
|
||||||
"devrait se regler incessamment"));
|
|
||||||
};
|
|
||||||
|
|
||||||
var mainPageSchedule = {};
|
|
||||||
|
|
||||||
mainPageSchedule.view = function(){
|
|
||||||
return m('div.uk-panel.uk-panel-box',[
|
|
||||||
m('div.uk-panel-badge.uk-badge', m('i.fa.fa-calendar', {style: {'font-size': '1.7em'}})),
|
|
||||||
m('h3.uk-panel-title', m('a.uk-link-muted', {href: '#/calendrier'}, 'Horaire')),
|
|
||||||
m.component(nextGameDaySchedule)
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
var mainMap = {};
|
|
||||||
|
|
||||||
mainMap.getWalterStewartMap = function(){
|
|
||||||
var iframeUrl = "//www.openstreetmap.org/export/embed.html?bbox=-73.55936229228975%2C45.53102667048665%2C-73.55230271816255%2C45.53444249585723&layer=mapnik"; // "//www.openstreetmap.org/export/embed.html?bbox=-73.56355190277101%2C45.5294483312637%2C-73.54943275451662%2C45.53627996625677&layer=mapnik"; // "//www.openstreetmap.org/export/embed.html?bbox=-73.56355190277101%2C45.5294483312637%2C-73.54943275451662%2C45.53627996625677&layer=mapnik";
|
|
||||||
var externalLink = "http://www.openstreetmap.org/#map=17/45.53216/-73.55692";
|
|
||||||
var iframeParams = {
|
|
||||||
style: {border: '1px solid black', 'min-height': '300px'},
|
|
||||||
width: '100%',
|
|
||||||
frameborder: 0,
|
|
||||||
scrolling: 'no',
|
|
||||||
marginheight: 0,
|
|
||||||
src: iframeUrl
|
|
||||||
};
|
|
||||||
return [
|
|
||||||
m('iframe', iframeParams),
|
|
||||||
m('br'),
|
|
||||||
m('small', m('a', {href: externalLink}, 'Voir la carte'))
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
mainMap.getGeorgesVernotMap = function(){
|
|
||||||
// " style="border: 1px solid black"></iframe><br/><small><a href="http://www.openstreetmap.org/#map=16/45.5670/-73.6177">View Larger Map</a></small>
|
|
||||||
|
|
||||||
var iframeUrl = "//www.openstreetmap.org/export/embed.html?bbox=-73.63185167312623%2C45.560217957150535%2C-73.60361337661745%2C45.57387292040785&layer=mapnik";
|
|
||||||
var externalLink = "http://www.openstreetmap.org/#map=17/45.53216/-73.55692";
|
|
||||||
var iframeParams = {
|
|
||||||
style: {border: '1px solid black', 'min-height': '300px'},
|
|
||||||
width: '100%',
|
|
||||||
frameborder: 0,
|
|
||||||
scrolling: 'no',
|
|
||||||
marginheight: 0,
|
|
||||||
src: iframeUrl
|
|
||||||
};
|
|
||||||
return [
|
|
||||||
m('iframe', iframeParams),
|
|
||||||
m('br'),
|
|
||||||
m('small', m('a', {href: externalLink}, 'Voir la carte'))
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
mainMap.view = function(){
|
|
||||||
return m('div.uk-panel.uk-panel-box',[
|
|
||||||
m('div.uk-panel-badge.uk-badge', [
|
|
||||||
m('i.fa.fa-map-o', {style: {'font-size': '1.7em'}})
|
|
||||||
]),
|
|
||||||
m('h3.uk-panel-title', 'Parc Georges-Vernot'),
|
|
||||||
mainMap.getGeorgesVernotMap()
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
var mainPageBottom = {};
|
|
||||||
|
|
||||||
mainPageBottom.regularSizeView = function(){
|
|
||||||
return m('div.uk-grid.uk-visible-large.uk-grid-match', [
|
|
||||||
m('div.uk-width-large-1-3.uk-width-medium-1-3', m.component(mainPageNews)),
|
|
||||||
m('div.uk-width-large-1-3.uk-width-medium-1-3', m.component(mainPageSchedule)),
|
|
||||||
m('div.uk-width-large-1-3.uk-width-medium-1-3', m.component(mainMap))
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
mainPageBottom.mediumSizeView = function(){
|
|
||||||
return m('div.uk-visible-medium', [
|
|
||||||
m('div.uk-grid.uk-grid-match', [
|
|
||||||
m('div.uk-width-medium-1-2', [m.component(mainPageNews)]),
|
|
||||||
m('div.uk-width-medium-1-2', [m.component(mainPageSchedule)]),
|
|
||||||
]),
|
|
||||||
m('div.uk-grid',
|
|
||||||
m('div.uk-width-medium-1-1', m.component(mainMap))
|
|
||||||
)
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
mainPageBottom.smallSizeView = function(){
|
|
||||||
return m('div.uk-visible-small',
|
|
||||||
[
|
|
||||||
m('div.uk-grid', m('div.uk-width-small-1-1', m.component(mainPageNews))),
|
|
||||||
m('div.uk-grid', m('div.uk-width-small-1-1', m.component(mainPageSchedule))),
|
|
||||||
m('div.uk-grid', m('div.uk-width-small-1-1', m.component(mainMap)))
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
mainPageBottom.view = function(){
|
|
||||||
return m('div.uk-margin-top.uk-margin-bottom.uk-grid',
|
|
||||||
m('div.uk-width-large-3-5.uk-width-medium-4-5.uk-width-small-1-1.uk-container-center', [
|
|
||||||
mainPageBottom.regularSizeView(),
|
|
||||||
mainPageBottom.mediumSizeView(),
|
|
||||||
mainPageBottom.smallSizeView()
|
|
||||||
])
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
var mainPage = {};
|
|
||||||
|
|
||||||
mainPage.view = function(){
|
|
||||||
return [
|
|
||||||
m.component(topNavBar),
|
|
||||||
m.component(mainPageLogo),
|
|
||||||
m.component(mainPageBottom),
|
|
||||||
m.component(footer)
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
return mainPage;
|
|
||||||
});
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
define(['m', '_', 'util', 'resultParser', 'articles/articles', 'views/topNavBar', 'views/footer'], function (m, _ , util, resultParser, articles, topNavBar, footer) {
|
|
||||||
|
|
||||||
var newsPageBody = {};
|
|
||||||
|
|
||||||
newsPageBody.logo = function(){
|
|
||||||
var style = 'height: 250px; width: 250px; background-size: 250px; background-image: url(images/logosansfond.JPG);';
|
|
||||||
return m('div.uk-cover-background.uk-container-center', {style: style});
|
|
||||||
};
|
|
||||||
|
|
||||||
newsPageBody.getArticle = function(article){
|
|
||||||
return m('article.uk-article.uk-margin-',
|
|
||||||
m('h1.uk-article-title', article.title),
|
|
||||||
m('p.uk-article-meta', article.meta),
|
|
||||||
article.body
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
newsPageBody.view = function(){
|
|
||||||
var arts = _.reverse(_.map(articles, newsPageBody.getArticle));
|
|
||||||
return m('div', util.join(arts, m('hr')));
|
|
||||||
};
|
|
||||||
|
|
||||||
var newsPage = {};
|
|
||||||
|
|
||||||
newsPage.view = function(){
|
|
||||||
return [
|
|
||||||
m.component(topNavBar),
|
|
||||||
m('div.uk-grid.uk-margin-top.uk-margin-bottom',
|
|
||||||
m('div.uk-width-large-2-5.uk-width-medium-3-5.uk-width-small-1-1.uk-container-center',
|
|
||||||
m.component(newsPageBody))),
|
|
||||||
m.component(footer)
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
return newsPage;
|
|
||||||
});
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
define(['m', '_', 'util', 'resultParser', 'views/topNavBar', 'views/footer'], function (m, _ , util, resultParser, topNavBar, footer) {
|
|
||||||
|
|
||||||
var rulesPageBody = {};
|
|
||||||
|
|
||||||
rulesPageBody.logo = function(){
|
|
||||||
var style = 'height: 250px; width: 250px; background-size: 250px; background-image: url(images/logosansfond.JPG);';
|
|
||||||
return m('div.uk-cover-background.uk-container-center', {style: style});
|
|
||||||
};
|
|
||||||
|
|
||||||
rulesPageBody.view = function(){
|
|
||||||
return m('div.uk-grid',
|
|
||||||
m('div.uk-width-1-1', rulesPageBody.logo()));
|
|
||||||
};
|
|
||||||
|
|
||||||
var photosPage = {};
|
|
||||||
|
|
||||||
photosPage.view = function(){
|
|
||||||
return [
|
|
||||||
m.component(topNavBar),
|
|
||||||
m.component(rulesPageBody),
|
|
||||||
m.component(footer)
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
return photosPage;
|
|
||||||
});
|
|
||||||
@@ -1,318 +0,0 @@
|
|||||||
define(['m', '_', 'spritz', 'teams'], function (m, _ , spritz, teams) {
|
|
||||||
|
|
||||||
var playersSelectionBar = {};
|
|
||||||
|
|
||||||
playersSelectionBar.toggleTeam = function(teamId, activatedTeams){
|
|
||||||
return function(isActive){
|
|
||||||
isActive = isActive != 'true';
|
|
||||||
if(isActive){
|
|
||||||
activatedTeams().push(teamId);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
activatedTeams(_.difference(activatedTeams(), [teamId]));
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
playersSelectionBar.teamInput = function(teamName, teamId, activatedTeams){
|
|
||||||
var isActive = _.includes(activatedTeams(), teamId);
|
|
||||||
var class_ = isActive ? 'uk-badge-success' : '';
|
|
||||||
var callback = playersSelectionBar.toggleTeam(teamId, activatedTeams);
|
|
||||||
return m('div.uk-badge.uk-margin-left.uk-border-rounded',
|
|
||||||
{class: class_, 'data-selected': isActive, onclick: m.withAttr("data-selected", callback)},
|
|
||||||
m('span', {style: {'min-width': '40px', display: 'inline-block'}}, teamName)
|
|
||||||
);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
playersSelectionBar.scoreInput = function(score, activatedScores){
|
|
||||||
var isActive = _.includes(activatedScores(), score);
|
|
||||||
var class_ = isActive ? 'uk-badge-success' : '';
|
|
||||||
var callback = playersSelectionBar.toggleTeam(score, activatedScores);
|
|
||||||
return m('div.uk-badge.uk-margin-left.uk-border-rounded',
|
|
||||||
{class: class_, 'data-selected': isActive, onclick: m.withAttr("data-selected", callback)},
|
|
||||||
m('span', {style: {'min-width': '30px', display: 'inline-block'}}, score)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
playersSelectionBar.getTeamInput = function(model, team){
|
|
||||||
var label = team.name;
|
|
||||||
return playersSelectionBar.teamInput(label, team.name, model.activatedTeams);
|
|
||||||
};
|
|
||||||
|
|
||||||
playersSelectionBar.chooseTeams = function(model){
|
|
||||||
return m('form.uk-grid', {style: {'margin-top': '1em'}},
|
|
||||||
m('div.uk-width-1-6', m('label', m('b', 'Équipes'))),
|
|
||||||
m('div.uk-width-5-6',
|
|
||||||
m('div.uk-grid',
|
|
||||||
_.map(teams.teams(), _.partial(playersSelectionBar.getTeamInput, model))
|
|
||||||
))
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
playersSelectionBar.chooseScore = function(model){
|
|
||||||
return m('form.uk-grid', {style: {'margin-top': '1em'}},
|
|
||||||
m('div.uk-width-1-6', m('label', m('b', 'Cote'))),
|
|
||||||
m('div.uk-width-5-6',
|
|
||||||
m('div.uk-grid', [
|
|
||||||
playersSelectionBar.scoreInput(1, model.activatedScores),
|
|
||||||
playersSelectionBar.scoreInput(2, model.activatedScores),
|
|
||||||
playersSelectionBar.scoreInput(3, model.activatedScores),
|
|
||||||
playersSelectionBar.scoreInput(4, model.activatedScores),
|
|
||||||
playersSelectionBar.scoreInput(5, model.activatedScores)
|
|
||||||
])));
|
|
||||||
};
|
|
||||||
|
|
||||||
playersSelectionBar.searchFactory = function(model){
|
|
||||||
return function(){
|
|
||||||
model.searchTerm(this.value);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
playersSelectionBar.searchBar = function(model){
|
|
||||||
var icon = m('i.fa.fa-search', {'aria-hidden': true}, '');
|
|
||||||
return m('form.uk-grid', {style: {'margin-top': '1em'}},
|
|
||||||
m('div.uk-width-1-1.', {style: 'text-align: right;'},
|
|
||||||
m('label', m('b', icon, " Rechercher ")),
|
|
||||||
m('input', {type: 'text', onkeypress: playersSelectionBar.searchFactory(model)})));
|
|
||||||
};
|
|
||||||
|
|
||||||
playersSelectionBar.controller = function(model){
|
|
||||||
return model;
|
|
||||||
};
|
|
||||||
|
|
||||||
playersSelectionBar.view = function(model){
|
|
||||||
return m('div.uk-grid', [
|
|
||||||
m('div.uk-width-1-2',
|
|
||||||
playersSelectionBar.chooseTeams(model),
|
|
||||||
playersSelectionBar.chooseScore(model)),
|
|
||||||
m('div.uk-width-1-2',
|
|
||||||
playersSelectionBar.searchBar(model))
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
var playersTable = {};
|
|
||||||
|
|
||||||
playersTable._sortPlayers = function(sorting, playerList){
|
|
||||||
var sortingKeys = _.map(sorting(), 'key');
|
|
||||||
var sortingDirections = _.map(sorting(), function(o){
|
|
||||||
return o.direction == 1 ? 'desc' : 'asc';
|
|
||||||
});
|
|
||||||
return _.orderBy(playerList, sortingKeys, sortingDirections);
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.decryptPlayerList = function(encryptedPlayerList){
|
|
||||||
var keyLengthInBytes = 128;
|
|
||||||
var key = spritz.hash(localStorage.getItem('secret') || '', keyLengthInBytes);
|
|
||||||
var decryptedMessage = spritz.decrypt(key, encryptedPlayerList);
|
|
||||||
try{
|
|
||||||
return JSON.parse(spritz.utf8ByteArrayToString(decryptedMessage));
|
|
||||||
}catch(e){
|
|
||||||
localStorage.removeItem('secret');
|
|
||||||
m.route('/membre');
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.getEncryptedPlayerList = function(){
|
|
||||||
var deferred = m.deferred();
|
|
||||||
var interval = setInterval(function() {
|
|
||||||
if(!_.isEmpty(window.encryptedPlayerList)){
|
|
||||||
clearInterval(interval);
|
|
||||||
deferred.resolve(window.encryptedPlayerList);
|
|
||||||
m.redraw();
|
|
||||||
}
|
|
||||||
}, 333);
|
|
||||||
return deferred.promise;
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.controller = function(model){
|
|
||||||
var ctrl = {};
|
|
||||||
ctrl.model = model;
|
|
||||||
|
|
||||||
ctrl.players = playersTable.getEncryptedPlayerList()
|
|
||||||
.then(playersTable.decryptPlayerList);
|
|
||||||
|
|
||||||
ctrl.sortPlayers = function(){
|
|
||||||
ctrl.players(playersTable._sortPlayers(ctrl.model.sorting, ctrl.players()));
|
|
||||||
};
|
|
||||||
return ctrl;
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable._getSortDict = function(sorting){
|
|
||||||
var ret = {};
|
|
||||||
_.each(sorting(), function(elm){
|
|
||||||
ret[elm.key] = elm.direction;
|
|
||||||
});
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable._isSortingUp = function(sorting, key){
|
|
||||||
var dict = playersTable._getSortDict(sorting);
|
|
||||||
return dict[key] === 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable._isSortingDown = function(sorting, key){
|
|
||||||
var dict = playersTable._getSortDict(sorting);
|
|
||||||
return dict[key] === -1;
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.arrows = function(sorting, key){
|
|
||||||
var sortUp = playersTable._isSortingUp(sorting, key);
|
|
||||||
var sortDown = playersTable._isSortingDown(sorting, key);
|
|
||||||
var style = {
|
|
||||||
display: 'inline-block',
|
|
||||||
'line-height': '0.5em',
|
|
||||||
'margin-right': '1em',
|
|
||||||
'font-size': '0.7em'
|
|
||||||
};
|
|
||||||
var sortedStyle = {color: '#8cc14c', 'font-weight': 'bold'};
|
|
||||||
return m('span', {style: style},
|
|
||||||
m('i.fa.fa-chevron-up', {style: sortUp ? sortedStyle: {}}),
|
|
||||||
m('br'),
|
|
||||||
m('i.fa.fa-chevron-down', {style: sortDown ? sortedStyle: {}})
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable._setSorting = function(sorting, key){
|
|
||||||
var newDirection = {key: key, direction: -1 * playersTable._getSortDict(sorting)[key]};
|
|
||||||
var directions = _.filter(sorting(), function(o){
|
|
||||||
return o.key != key;
|
|
||||||
});
|
|
||||||
sorting([newDirection].concat(directions));
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.tableHeader = function(sorting){
|
|
||||||
var setSorting = function(key){
|
|
||||||
return _.partial(playersTable._setSorting, sorting, key);
|
|
||||||
};
|
|
||||||
return m('thead',
|
|
||||||
m('tr', [
|
|
||||||
m('th', {onclick: setSorting('team')}, playersTable.arrows(sorting, 'team'), 'Équipe'),
|
|
||||||
m('th', {onclick: setSorting('name')}, playersTable.arrows(sorting, 'name'), 'Nom'),
|
|
||||||
m('th.uk-hidden-small', 'Courriel'),
|
|
||||||
m('th.uk-hidden-small', 'Téléphone'),
|
|
||||||
m('th', {onclick: setSorting('score')}, playersTable.arrows(sorting, 'score'), 'Cote')
|
|
||||||
]));
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.getPlayerTeamIcon = function(player){
|
|
||||||
var background = teams.getTeamColor(player.team);
|
|
||||||
var style = {width: '20px', height: '20px', 'background-color': background};
|
|
||||||
return m('div', {style: style}, m.trust(' '));
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.showOrHidePlayerDetail = function(player){
|
|
||||||
return function(){
|
|
||||||
player.showDetails = !player.showDetails;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.playerTelLink = function(player){
|
|
||||||
return m('a[href=tel:' + player.tel + ']', player.tel);
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.playerRow = function(player){
|
|
||||||
return m('tr', {onclick: playersTable.showOrHidePlayerDetail(player)}, [
|
|
||||||
m('td', playersTable.getPlayerTeamIcon(player)),
|
|
||||||
m('td', player.name),
|
|
||||||
m('td.uk-hidden-small', player.email),
|
|
||||||
m('td.uk-hidden-small', player.tel),
|
|
||||||
m('td', player.score)
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.playerInformation = function(player){
|
|
||||||
return m('tr.uk-visible-small', [
|
|
||||||
m('td', ''),
|
|
||||||
m('td[colspan=3]',
|
|
||||||
m('ul', [
|
|
||||||
m('li', [m('b', 'tel: '), playersTable.playerTelLink(player)]),
|
|
||||||
m('li', [m('b', 'email: '), player.email])
|
|
||||||
]))
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.playerRowAndInformation = function(player){
|
|
||||||
if(player.showDetails){
|
|
||||||
return [playersTable.playerRow(player),
|
|
||||||
m('tr', {style: {height: '0px'}}),
|
|
||||||
playersTable.playerInformation(player)];
|
|
||||||
}
|
|
||||||
return playersTable.playerRow(player);
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.onlyPlayerOfTeams = function(visibleTeams){
|
|
||||||
return function(player){
|
|
||||||
return _.includes(visibleTeams, player.team);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.onlyPlayerOfScore = function(visibleScores){
|
|
||||||
return function(player){
|
|
||||||
return _.includes(visibleScores, player.score);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.playerHasBeenSearchedFor = function(searchTerm){
|
|
||||||
return function(player){
|
|
||||||
if(_.isEmpty(searchTerm)){
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return new RegExp(searchTerm, 'i').test(player.name);
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
playersTable.tableBody = function(players, visibleTeams, activatedScores, searchTerm){
|
|
||||||
return m('tbody',
|
|
||||||
_(players)
|
|
||||||
.filter(playersTable.onlyPlayerOfTeams(visibleTeams))
|
|
||||||
.filter(playersTable.onlyPlayerOfScore(activatedScores))
|
|
||||||
.filter(playersTable.playerHasBeenSearchedFor(searchTerm))
|
|
||||||
.map(playersTable.playerRowAndInformation).flatten().value()
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
playersTable.view = function(ctrl){
|
|
||||||
ctrl.sortPlayers();
|
|
||||||
return m('table.uk-table.uk-table-hover.uk-table-striped',
|
|
||||||
playersTable.tableHeader(ctrl.model.sorting),
|
|
||||||
playersTable.tableBody(ctrl.players(),
|
|
||||||
ctrl.model.activatedTeams(),
|
|
||||||
ctrl.model.activatedScores(),
|
|
||||||
ctrl.model.searchTerm()
|
|
||||||
|
|
||||||
)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
var playersPage = {};
|
|
||||||
|
|
||||||
playersPage.controller = function(){
|
|
||||||
var model = {};
|
|
||||||
model.activatedTeams = m.prop(_.map(teams.teams(), 'name'));
|
|
||||||
model.activatedScores = m.prop([1, 2, 3, 4, 5]);
|
|
||||||
model.sorting = m.prop([{key: 'team', direction: 1}, {key: 'score', direction: -1}, {key: 'name', direction: 1}]);
|
|
||||||
model.searchTerm = m.prop('');
|
|
||||||
return model;
|
|
||||||
};
|
|
||||||
|
|
||||||
playersPage.downloadButton = function(){
|
|
||||||
return m('button.uk-button.uk-button-success.uk-border-rounded',
|
|
||||||
m('i.fa.fa-download', {'aria-hidden': true}),
|
|
||||||
" Télécharger");
|
|
||||||
};
|
|
||||||
|
|
||||||
playersPage.view = function(model){
|
|
||||||
return m('div.uk-grid.uk-margin-top.uk-margin-bottom',
|
|
||||||
m('div.uk-width-large-3-5.uk-width-small-1-1.uk-container-center', [
|
|
||||||
m.component(playersSelectionBar, model),
|
|
||||||
m.component(playersTable, model),
|
|
||||||
playersPage.downloadButton()
|
|
||||||
]));
|
|
||||||
};
|
|
||||||
|
|
||||||
return playersPage;
|
|
||||||
});
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
define(['m', '_', 'util', 'resultParser', 'views/topNavBar', 'views/footer'], function (m, _ , util, resultParser, topNavBar, footer) {
|
|
||||||
|
|
||||||
var rulesPage = {};
|
|
||||||
|
|
||||||
rulesPage.missionText = function(){
|
|
||||||
return "La ligue de balle Les Phénix a été fondée en 2004 afin "+
|
|
||||||
"d'offrir aux membres de la communauté gaie et lesbienne et à "+
|
|
||||||
"leurs amis hétéros l'opportunité de s'amuser et de pratiquer "+
|
|
||||||
"un sport dans une ambiance amicale et décontractée. "+
|
|
||||||
"L'ouverture d'esprit, la camaraderie et le plaisir de "+
|
|
||||||
"pratiquer un sport à l'extérieur caractérisent cette ligue.";
|
|
||||||
};
|
|
||||||
|
|
||||||
rulesPage.logo = function(){
|
|
||||||
var style = 'height: 250px; width: 250px; background-size: 250px; background-image: url(images/logosansfond.JPG);';
|
|
||||||
return m('div.uk-cover-background.uk-container-center', {style: style});
|
|
||||||
};
|
|
||||||
|
|
||||||
rulesPage.ruleSection = function(){
|
|
||||||
var urlASBM = 'http://montreal.baseballquebec.com/fr/publication/nouvelle/recherche_un_directeur_general_asbm.html';
|
|
||||||
return [
|
|
||||||
m('h2', 'Règlements 2017'),
|
|
||||||
m('ul',[
|
|
||||||
m('li', m('h3', m('a', {href: 'files/reglements_generaux.pdf'}, 'Règlements généraux'))),
|
|
||||||
m('li', m('h3', m('a', {href: 'files/regles_procedures2017.pdf'},'Règles et procédures'))),
|
|
||||||
m('li', m('h3', m('a', {href: 'files/reglements_de_terrain2016.pdf'},'Règlements de terrain'))),
|
|
||||||
m('li', m('h3', m('a', {href: urlASBM}, 'Association des Sports de Balle à Montréal (ASBM)'))),
|
|
||||||
])
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
rulesPage.rules = function(){
|
|
||||||
return m('div.uk-width-large-2-3.uk-width-small-1-1',
|
|
||||||
m('div.uk-panel.uk-panel-box.uk-panel-box-secondary',
|
|
||||||
rulesPage.ruleSection()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
rulesPage.generalAssemblies = function(){
|
|
||||||
return m('div.uk-width-large-1-1.uk-width-small-1-1.uk-margin',
|
|
||||||
m('div.uk-panel.uk-panel-box.uk-panel-box-secondary', [
|
|
||||||
m('h2', 'Procès verbaux des Assemblées Générales'),
|
|
||||||
m('ul',[
|
|
||||||
m('li', m('h3', m('a', {href: 'files/aga2016.pdf'}, 'Assemblée générale annuelle 2016'))),
|
|
||||||
])
|
|
||||||
])
|
|
||||||
);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
rulesPage.logoAndRules = function(){
|
|
||||||
return m('div.uk-grid',[
|
|
||||||
m('div.uk-width-large-1-3.uk-width-small-1-1', rulesPage.logo()),
|
|
||||||
rulesPage.rules(),
|
|
||||||
rulesPage.generalAssemblies()
|
|
||||||
]
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
rulesPage.mission = function(){
|
|
||||||
return m('div.uk-panel.uk-panel-box.uk-panel-box-secondary', [
|
|
||||||
m('h2', 'Mission'),
|
|
||||||
m('p', rulesPage.missionText())
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
rulesPage.view = function(){
|
|
||||||
return [
|
|
||||||
m.component(topNavBar),
|
|
||||||
|
|
||||||
m('div.uk-margin-top.uk-margin-bottom.uk-grid',
|
|
||||||
m('div.uk-width-large-3-5.uk-width-medium-4-5.uk-width-large-1-1.uk-container-center', [
|
|
||||||
rulesPage.logoAndRules(),
|
|
||||||
rulesPage.mission()
|
|
||||||
])),
|
|
||||||
m.component(footer)
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
return rulesPage;
|
|
||||||
});
|
|
||||||
@@ -1,128 +0,0 @@
|
|||||||
define(['m', '_', 'util'], function (m, _, util) {
|
|
||||||
|
|
||||||
var topNavBar = {};
|
|
||||||
|
|
||||||
topNavBar._urlMapping = [
|
|
||||||
{name: 'Accueil', path: '', fa: 'fa-home'},
|
|
||||||
{name: 'Nouvelles', path: 'nouvelles', fa: 'fa-newspaper-o'},
|
|
||||||
{name: 'Calendrier', path: 'calendrier', fa: 'fa-calendar'},
|
|
||||||
{name: 'Règlement', path: 'reglement', fa: 'fa-legal'},
|
|
||||||
{name: 'Membre', path: 'membre', fa: 'fa-lock'},
|
|
||||||
{name: 'Historique', path: 'historique', fa: 'fa-history'},
|
|
||||||
{name: 'Nous Joindre', path: 'contact', fa: 'fa-phone'}
|
|
||||||
];
|
|
||||||
|
|
||||||
topNavBar.controller = function(){
|
|
||||||
var model = {};
|
|
||||||
model.openDropdown = false;
|
|
||||||
return model;
|
|
||||||
};
|
|
||||||
|
|
||||||
topNavBar._getUrlForId = function(id_){
|
|
||||||
return '#/' + id_;
|
|
||||||
};
|
|
||||||
|
|
||||||
topNavBar._isActive = function(id_){
|
|
||||||
return topNavBar._getUrlForId(id_) == window.location.hash;
|
|
||||||
};
|
|
||||||
topNavBar._getItemIcon = function(item){
|
|
||||||
return m('i.fa.' + item.fa);
|
|
||||||
};
|
|
||||||
|
|
||||||
topNavBar._getLargeItem = function(item){
|
|
||||||
var class_ = topNavBar._isActive(item.path) ? 'uk-active' : '';
|
|
||||||
var url = topNavBar._getUrlForId(item.path);
|
|
||||||
return m("li", {class: class_},
|
|
||||||
m("a", {href: url},
|
|
||||||
m('div', topNavBar._getItemIcon(item), ' ', item.name)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
topNavBar._getMediumItem = function(item){
|
|
||||||
var class_ = topNavBar._isActive(item.path) ? 'uk-active' : '';
|
|
||||||
var url = topNavBar._getUrlForId(item.path);
|
|
||||||
return m("li", {class: class_},
|
|
||||||
m("a", {href: url},
|
|
||||||
topNavBar._getItemIcon(item), ' ', item.name
|
|
||||||
)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
topNavBar._getSmallItem = function(item){
|
|
||||||
var class_ = topNavBar._isActive(item.path) ? 'uk-active' : '';
|
|
||||||
var url = topNavBar._getUrlForId(item.path);
|
|
||||||
return m("li", {class: class_},
|
|
||||||
m("a", {href: url},
|
|
||||||
topNavBar._getItemIcon(item),
|
|
||||||
' ',
|
|
||||||
item.name
|
|
||||||
)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
topNavBar.largeTopNav = function(){
|
|
||||||
return [
|
|
||||||
m('li.uk-parent', m('div.uk-navbar-brand', util.facebookLink())),
|
|
||||||
_.map(topNavBar._urlMapping, topNavBar._getLargeItem)
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
topNavBar.mediumTopNav = function(){
|
|
||||||
return [
|
|
||||||
m('li.uk-parent', m('div.uk-navbar-brand', util.facebookLink())),
|
|
||||||
_.map(topNavBar._urlMapping, topNavBar._getMediumItem)
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
topNavBar.dropdown = function(){
|
|
||||||
return m('div.uk-dropdown',
|
|
||||||
m('ul.uk-nav.uk-nav-navbar.uk-dropdown-navbar',
|
|
||||||
_.map(topNavBar._urlMapping, topNavBar._getSmallItem)
|
|
||||||
));
|
|
||||||
};
|
|
||||||
|
|
||||||
topNavBar.toggleDropdown = function(model){
|
|
||||||
return function(){
|
|
||||||
model.openDropdown = !model.openDropdown;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
topNavBar.clickElsewhere = function(model){
|
|
||||||
var style = {
|
|
||||||
position: 'fixed',
|
|
||||||
top: '0px',
|
|
||||||
bottom: '0px',
|
|
||||||
left: '0px',
|
|
||||||
right: '0px',
|
|
||||||
background: 'black',
|
|
||||||
opacity: 0.5,
|
|
||||||
'z-index': 2
|
|
||||||
};
|
|
||||||
var attrs = {style: style, onclick: topNavBar.toggleDropdown(model)};
|
|
||||||
return m('div', attrs);
|
|
||||||
};
|
|
||||||
|
|
||||||
topNavBar.smallTopNav = function(model){
|
|
||||||
var class_ = model.openDropdown ? 'uk-open' : '';
|
|
||||||
var attrs = {class: class_, onclick: topNavBar.toggleDropdown(model)};
|
|
||||||
var ret = [
|
|
||||||
m('li.uk-parent', m('div.uk-navbar-brand', util.facebookLink())),
|
|
||||||
m('li.uk-parent[data-uk-dropdown][aria-expanded]', attrs, m('a', m('i.fa.fa-bars'), ' Menu'), topNavBar.dropdown()),
|
|
||||||
];
|
|
||||||
if(model.openDropdown){
|
|
||||||
ret.push(topNavBar.clickElsewhere(model));
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
topNavBar.view = function(model){
|
|
||||||
return m("nav.uk-navbar.uk-navbar-attached", [
|
|
||||||
m("ul.uk-navbar-nav.uk-visible-large.uk-navbar-content.uk-navbar-center", topNavBar.largeTopNav()),
|
|
||||||
m("ul.uk-navbar-nav.uk-visible-medium", topNavBar.mediumTopNav()),
|
|
||||||
m("ul.uk-navbar-nav.uk-visible-small", topNavBar.smallTopNav(model)),
|
|
||||||
]);
|
|
||||||
};
|
|
||||||
|
|
||||||
return topNavBar;
|
|
||||||
});
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
// LESS related
|
|
||||||
@import "uikit/dist/scss/uikit-mixins.scss";
|
|
||||||
@import "uikit/dist/scss/core/variables.scss";
|
|
||||||
|
|
||||||
// Phenix colors
|
|
||||||
|
|
||||||
$navbar-background: #f08d28; //#dabd5e;
|
|
||||||
|
|
||||||
$panel-box-background: #fce3ca;
|
|
||||||
$table-striped-background: #fce3ca;
|
|
||||||
$navbar-nav-active-background: #fce3ca;
|
|
||||||
$navbar-nav-hover-background: #fce3ca;
|
|
||||||
$panel-box-secondary-background: #fce3ca;
|
|
||||||
$badge-background: #fce3ca;
|
|
||||||
$badge-color: black;
|
|
||||||
|
|
||||||
// Defaults
|
|
||||||
@import "uikit/dist/scss/core/base.scss";
|
|
||||||
|
|
||||||
// Layout
|
|
||||||
@import "uikit/dist/scss/core/grid.scss";
|
|
||||||
@import "uikit/dist/scss/core/panel.scss";
|
|
||||||
@import "uikit/dist/scss/core/block.scss";
|
|
||||||
@import "uikit/dist/scss/core/article.scss";
|
|
||||||
@import "uikit/dist/scss/core/comment.scss";
|
|
||||||
@import "uikit/dist/scss/core/cover.scss";
|
|
||||||
|
|
||||||
// Navs
|
|
||||||
@import "uikit/dist/scss/core/nav.scss";
|
|
||||||
@import "uikit/dist/scss/core/navbar.scss";
|
|
||||||
@import "uikit/dist/scss/core/subnav.scss";
|
|
||||||
@import "uikit/dist/scss/core/breadcrumb.scss";
|
|
||||||
@import "uikit/dist/scss/core/pagination.scss";
|
|
||||||
@import "uikit/dist/scss/core/tab.scss";
|
|
||||||
@import "uikit/dist/scss/core/thumbnav.scss";
|
|
||||||
|
|
||||||
// Elements
|
|
||||||
@import "uikit/dist/scss/core/list.scss";
|
|
||||||
@import "uikit/dist/scss/core/description-list.scss";
|
|
||||||
@import "uikit/dist/scss/core/table.scss";
|
|
||||||
@import "uikit/dist/scss/core/form.scss";
|
|
||||||
|
|
||||||
// Common
|
|
||||||
@import "uikit/dist/scss/core/button.scss";
|
|
||||||
@import "uikit/dist/scss/core/icon.scss";
|
|
||||||
@import "uikit/dist/scss/core/close.scss";
|
|
||||||
@import "uikit/dist/scss/core/badge.scss";
|
|
||||||
@import "uikit/dist/scss/core/alert.scss";
|
|
||||||
@import "uikit/dist/scss/core/thumbnail.scss";
|
|
||||||
@import "uikit/dist/scss/core/overlay.scss";
|
|
||||||
@import "uikit/dist/scss/core/column.scss";
|
|
||||||
@import "uikit/dist/scss/core/animation.scss";
|
|
||||||
|
|
||||||
// JavaScript
|
|
||||||
@import "uikit/dist/scss/core/dropdown.scss";
|
|
||||||
@import "uikit/dist/scss/core/modal.scss";
|
|
||||||
@import "uikit/dist/scss/core/offcanvas.scss";
|
|
||||||
@import "uikit/dist/scss/core/switcher.scss";
|
|
||||||
|
|
||||||
// Need to be loaded last
|
|
||||||
@import "uikit/dist/scss/core/text.scss";
|
|
||||||
@import "uikit/dist/scss/core/utility.scss";
|
|
||||||
@import "uikit/dist/scss/core/flex.scss";
|
|
||||||
@import "uikit/dist/scss/core/contrast.scss";
|
|
||||||
@import "uikit/dist/scss/core/print.scss";
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
@import "custom_uikit";
|
|
||||||
.foo{
|
|
||||||
border: solid;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ph-footer{
|
|
||||||
background-color: $navbar-background;
|
|
||||||
// height: 200px;
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,218 @@
|
|||||||
|
import { Application } from "jsr:@oak/oak/application";
|
||||||
|
import { Router } from "jsr:@oak/oak/router";
|
||||||
|
import { GameService } from "./server/game-service.ts";
|
||||||
|
import { Game } from "./server/types.ts";
|
||||||
|
import staticFiles from "https://deno.land/x/static_files@1.1.6/mod.ts";
|
||||||
|
import vento from "https://deno.land/x/vento@v0.9.1/mod.ts";
|
||||||
|
import { LoginService } from "./server/login-service.ts";
|
||||||
|
|
||||||
|
const env = vento();
|
||||||
|
setInterval(() => env.cache.clear(), 1000);
|
||||||
|
const gameService = new GameService(await Deno.openKv());
|
||||||
|
const loginService = LoginService.officialLoginService();
|
||||||
|
|
||||||
|
const router = new Router();
|
||||||
|
|
||||||
|
router.get("/", async (ctx) => {
|
||||||
|
const template = await env.load("templates/home.vto");
|
||||||
|
const result = await template({ tab: "home" });
|
||||||
|
ctx.response.body = result.content;
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get("/calendrier", async (ctx) => {
|
||||||
|
const template = await env.load("templates/calendrier.vto");
|
||||||
|
const result = await template({
|
||||||
|
tab: "calendrier",
|
||||||
|
});
|
||||||
|
ctx.response.body = result.content;
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get("/nouvelles", async (ctx) => {
|
||||||
|
const template = await env.load("templates/nouvelles.vto");
|
||||||
|
const result = await template({ tab: "nouvelles" });
|
||||||
|
ctx.response.body = result.content;
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get("/contact", async (ctx) => {
|
||||||
|
const template = await env.load("templates/contact.vto");
|
||||||
|
const result = await template({ tab: "contact" });
|
||||||
|
ctx.response.body = result.content;
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get("/reglement", async (ctx) => {
|
||||||
|
const template = await env.load("templates/reglement.vto");
|
||||||
|
const result = await template({ tab: "reglement" });
|
||||||
|
ctx.response.body = result.content;
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get("/login", async (ctx) => {
|
||||||
|
const username = ctx.request.url.searchParams.get("username") || "";
|
||||||
|
const password = ctx.request.url.searchParams.get("password") || "";
|
||||||
|
|
||||||
|
if (!(await loginService.validateCredentials(username, password))) {
|
||||||
|
ctx.response.status = 403;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await loginService.login(ctx);
|
||||||
|
ctx.response.redirect("/membre/games-editor/today");
|
||||||
|
});
|
||||||
|
|
||||||
|
const memberRouter = new Router();
|
||||||
|
|
||||||
|
memberRouter.use(async (ctx, next) => {
|
||||||
|
const isLoggedIn = await loginService.isLoggedIn(ctx);
|
||||||
|
if (ctx.request.url.pathname !== "/membre" && !isLoggedIn) {
|
||||||
|
ctx.response.redirect("/membre");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ctx.params.isLoggedIn = isLoggedIn;
|
||||||
|
await next();
|
||||||
|
});
|
||||||
|
|
||||||
|
memberRouter.get("/", async (ctx) => {
|
||||||
|
const template = await env.load("templates/membre.vto");
|
||||||
|
const result = await template({
|
||||||
|
tab: "membre",
|
||||||
|
isLoggedIn: ctx.params.isLoggedIn,
|
||||||
|
});
|
||||||
|
ctx.response.body = result.content;
|
||||||
|
});
|
||||||
|
|
||||||
|
function today(): Date {
|
||||||
|
const date = new Date().toLocaleDateString("fr-CA", {
|
||||||
|
timeZone: "America/New_York",
|
||||||
|
});
|
||||||
|
return new Date(date);
|
||||||
|
}
|
||||||
|
|
||||||
|
memberRouter.get("/games-editor/today", async (ctx) => {
|
||||||
|
const template = await env.load("templates/partials/games-editor.vto");
|
||||||
|
const games = await gameService.getAllGames();
|
||||||
|
const lastGameDay = games
|
||||||
|
.map((g) => g.date)
|
||||||
|
.filter((d) => new Date(d) <= today())
|
||||||
|
.sort()
|
||||||
|
.reverse()[0];
|
||||||
|
|
||||||
|
const result = await template({
|
||||||
|
tab: "membre",
|
||||||
|
selectedYear: null,
|
||||||
|
isToday: true,
|
||||||
|
games: games.filter((g) => g.date === lastGameDay),
|
||||||
|
years: [...new Set(games.map((x) => x.year))].sort().reverse(),
|
||||||
|
});
|
||||||
|
ctx.response.body = result.content;
|
||||||
|
});
|
||||||
|
|
||||||
|
memberRouter.get("/games-editor/:year", async (ctx) => {
|
||||||
|
const template = await env.load("templates/partials/games-editor.vto");
|
||||||
|
const games = await gameService.getAllGames();
|
||||||
|
const selectedYear = parseInt(ctx.params.year);
|
||||||
|
const result = await template({
|
||||||
|
tab: "membre",
|
||||||
|
selectedYear: selectedYear,
|
||||||
|
games: games.filter((g) => g.year === selectedYear),
|
||||||
|
years: [...new Set(games.map((x) => x.year))].sort().reverse(),
|
||||||
|
});
|
||||||
|
ctx.response.body = result.content;
|
||||||
|
});
|
||||||
|
|
||||||
|
memberRouter.get("/new-game-editor", async (ctx) => {
|
||||||
|
const template = await env.load("templates/partials/new-games-editor.vto");
|
||||||
|
const result = await template({
|
||||||
|
tab: "membre",
|
||||||
|
});
|
||||||
|
ctx.response.body = result.content;
|
||||||
|
});
|
||||||
|
|
||||||
|
memberRouter.post("/new-game", async (ctx) => {
|
||||||
|
const payload = await ctx.request.body.form();
|
||||||
|
const preGame = {
|
||||||
|
date: payload.get("game-date"),
|
||||||
|
time: payload.get("game-time"),
|
||||||
|
away: payload.get("away-team"),
|
||||||
|
home: payload.get("home-team"),
|
||||||
|
};
|
||||||
|
const [game, error] = await gameService.createNewGame(preGame);
|
||||||
|
|
||||||
|
if (error !== "") {
|
||||||
|
const template = await env.load("templates/partials/new-game-error.vto");
|
||||||
|
const result = await template({
|
||||||
|
tab: "membre",
|
||||||
|
error: error,
|
||||||
|
});
|
||||||
|
ctx.response.status = 500;
|
||||||
|
ctx.response.body = result.content;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const template = await env.load("templates/partials/single-game-editor.vto");
|
||||||
|
const result = await template({
|
||||||
|
tab: "membre",
|
||||||
|
game: game,
|
||||||
|
});
|
||||||
|
ctx.response.headers.set("game-id", game?.id ?? "");
|
||||||
|
ctx.response.body = result.content;
|
||||||
|
});
|
||||||
|
|
||||||
|
memberRouter.delete("/games/:gameId", async (ctx) => {
|
||||||
|
if (!(await loginService.isLoggedIn(ctx))) {
|
||||||
|
ctx.response.redirect("/membre");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const success = await gameService.deleteGameById(ctx.params.gameId);
|
||||||
|
ctx.response.body = `${success}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
memberRouter.post("/games/:gameId", async (ctx) => {
|
||||||
|
if (!(await loginService.isLoggedIn(ctx))) {
|
||||||
|
ctx.response.redirect("/membre");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const payload = await ctx.request.body.form();
|
||||||
|
let preGame = {
|
||||||
|
awayScore: payload.get("away-score") ?? null,
|
||||||
|
homeScore: payload.get("home-score") ?? null,
|
||||||
|
rain: payload.get("game-type") === "rain",
|
||||||
|
practice: payload.get("game-type") === "practice",
|
||||||
|
};
|
||||||
|
|
||||||
|
preGame = Object.fromEntries(
|
||||||
|
Object.entries(preGame).filter(([_, v]) => v !== null),
|
||||||
|
) as Partial<Game>;
|
||||||
|
|
||||||
|
const success = await gameService.updateGame(ctx.params.gameId, preGame);
|
||||||
|
ctx.response.body = success
|
||||||
|
? `<i class="fa fa-floppy-o" aria-hidden="true"></i>`
|
||||||
|
: `<i class="fa fa-exclamation-triangle" aria-hidden="true"></i>`;
|
||||||
|
});
|
||||||
|
|
||||||
|
const apiRouter = new Router();
|
||||||
|
|
||||||
|
apiRouter.get("/results/:year.json", async (ctx) => {
|
||||||
|
ctx.response.json = true;
|
||||||
|
const games = await gameService.getAllGames();
|
||||||
|
ctx.response.body = games
|
||||||
|
.filter((g) => g.year == ctx.params.year)
|
||||||
|
.map((g) => {
|
||||||
|
g[g.home] = parseInt(g.homeScore);
|
||||||
|
g[g.away] = parseInt(g.awayScore);
|
||||||
|
return g;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
apiRouter.get("/available-years.json", async (ctx) => {
|
||||||
|
ctx.response.json = true;
|
||||||
|
const games = await gameService.getAllGames();
|
||||||
|
ctx.response.body = [...new Set(games.map((g) => g.year))];
|
||||||
|
});
|
||||||
|
|
||||||
|
router.use("/membre", memberRouter.routes());
|
||||||
|
router.use("/api", apiRouter.routes());
|
||||||
|
|
||||||
|
const app = new Application();
|
||||||
|
app.use(router.routes());
|
||||||
|
|
||||||
|
app.use(staticFiles("static", { brotli: true, fetch: true }));
|
||||||
|
|
||||||
|
await app.listen({ port: 8000 });
|
||||||
@@ -0,0 +1,323 @@
|
|||||||
|
import { Game, PreGame } from "./types.ts";
|
||||||
|
import {
|
||||||
|
assertEquals,
|
||||||
|
assertNotEquals,
|
||||||
|
} from "https://deno.land/std@0.224.0/assert/mod.ts";
|
||||||
|
|
||||||
|
type GamePrimaryKey = ["phenix", "games", string];
|
||||||
|
|
||||||
|
type date = [number, number, number];
|
||||||
|
type time = [number, number];
|
||||||
|
type DateIndex = ["phenix", "indexes", "game-date", ...date, ...time];
|
||||||
|
|
||||||
|
export class GameService {
|
||||||
|
readonly kv: Deno.Kv;
|
||||||
|
private readonly DATE_VALIDATOR =
|
||||||
|
/^(?<year>\d{4})-(?<month>\d{1,2})-(?<day>\d{1,2})$/;
|
||||||
|
private readonly TIME_VALIDATOR = /^(?<hour>\d{1,2})(:|h)(?<minute>\d{1,2})$/;
|
||||||
|
private readonly VALID_TEAMS: string[] = [
|
||||||
|
"jaune",
|
||||||
|
"rouge",
|
||||||
|
"bleu",
|
||||||
|
"gris",
|
||||||
|
"vert",
|
||||||
|
"noir",
|
||||||
|
"orange",
|
||||||
|
"mauve",
|
||||||
|
];
|
||||||
|
|
||||||
|
constructor(kv: Deno.Kv) {
|
||||||
|
this.kv = kv;
|
||||||
|
}
|
||||||
|
|
||||||
|
private chronologicalGameOrder(game1: Game, game2: Game): number {
|
||||||
|
if (game1.date < game2.date) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (game1.date > game2.date) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (game1.time < game2.time) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (game1.time > game2.time) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getAllGames(): Promise<Game[]> {
|
||||||
|
const ite = this.kv.list<Game>({ prefix: ["phenix", "games"] });
|
||||||
|
return (await Array.fromAsync(ite))
|
||||||
|
.map((e) => e.value)
|
||||||
|
.sort(this.chronologicalGameOrder);
|
||||||
|
}
|
||||||
|
|
||||||
|
private gamePrimaryKey(id: string): GamePrimaryKey {
|
||||||
|
return ["phenix", "games", id];
|
||||||
|
}
|
||||||
|
|
||||||
|
private dateIndex(date: string, time: string): DateIndex | null {
|
||||||
|
let destructedDate = this.DATE_VALIDATOR.exec(date)?.groups;
|
||||||
|
let destructedTime = this.TIME_VALIDATOR.exec(time)?.groups;
|
||||||
|
|
||||||
|
if (!destructedDate || !destructedTime) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
"phenix",
|
||||||
|
"indexes",
|
||||||
|
"game-date",
|
||||||
|
parseInt(destructedDate.year),
|
||||||
|
parseInt(destructedDate.month),
|
||||||
|
parseInt(destructedDate.day),
|
||||||
|
parseInt(destructedTime.hour),
|
||||||
|
parseInt(destructedTime.minute),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private cleanTime(raw: string): string {
|
||||||
|
const groups = this.TIME_VALIDATOR.exec(raw)!.groups!;
|
||||||
|
return `${groups.hour.padStart(2, "0")}:${groups.minute.padStart(2, "0")}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
private cleanDate(raw: string): string {
|
||||||
|
const groups = this.DATE_VALIDATOR.exec(raw)!.groups!;
|
||||||
|
return `${groups.year}-${groups.month.padStart(2, "0")}-${groups.day.padStart(2, "0")}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
private extractYearFromDate(date: string): number {
|
||||||
|
return parseInt(this.DATE_VALIDATOR.exec(date)!.groups!.year);
|
||||||
|
}
|
||||||
|
|
||||||
|
private createGame(preGame: PreGame): Game {
|
||||||
|
const ret = {
|
||||||
|
...preGame,
|
||||||
|
id: crypto.randomUUID(),
|
||||||
|
practice: false,
|
||||||
|
rain: false,
|
||||||
|
year: this.extractYearFromDate(preGame.date),
|
||||||
|
homeScore: null,
|
||||||
|
awayScore: null,
|
||||||
|
};
|
||||||
|
ret.time = this.cleanTime(ret.time);
|
||||||
|
ret.date = this.cleanDate(ret.date);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
private validatePregate(preGame: PreGame): string {
|
||||||
|
if (!this.DATE_VALIDATOR.test(preGame.date)) {
|
||||||
|
return `Invalide date format ${preGame.date}`;
|
||||||
|
}
|
||||||
|
if (!this.TIME_VALIDATOR.test(preGame.time)) {
|
||||||
|
return `Invalide time format ${preGame.time}`;
|
||||||
|
}
|
||||||
|
if (!this.VALID_TEAMS.includes(preGame.away)) {
|
||||||
|
return `Invalide away format ${preGame.away}`;
|
||||||
|
}
|
||||||
|
if (!this.VALID_TEAMS.includes(preGame.home)) {
|
||||||
|
return `Invalide home format ${preGame.home}`;
|
||||||
|
}
|
||||||
|
if (preGame.home === preGame.away) {
|
||||||
|
return `Home and away teams must be different (received ${preGame.home} for both)`;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
async createNewGame(preGame: PreGame): Promise<[Game | null, string]> {
|
||||||
|
if (this.validatePregate(preGame) !== "") {
|
||||||
|
return [null, this.validatePregate(preGame)];
|
||||||
|
}
|
||||||
|
const game = this.createGame(preGame);
|
||||||
|
const dateIndex = this.dateIndex(game.date, game.time);
|
||||||
|
if (!dateIndex) {
|
||||||
|
return [null, "Cound not parse date or time"];
|
||||||
|
}
|
||||||
|
const precondition = await this.kv.get<string>(dateIndex);
|
||||||
|
if (precondition.value !== null) {
|
||||||
|
return [null, "game already exists " + precondition.value];
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = await this.kv
|
||||||
|
.atomic()
|
||||||
|
.check(precondition)
|
||||||
|
.set(this.gamePrimaryKey(game.id), game)
|
||||||
|
.set(dateIndex, game.id)
|
||||||
|
.commit();
|
||||||
|
if (!res.ok) {
|
||||||
|
return [null, "Transaction failed"];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [game, ""];
|
||||||
|
}
|
||||||
|
|
||||||
|
async getGameById(id: string): Promise<Game | null> {
|
||||||
|
const res = await this.kv.get<Game>(this.gamePrimaryKey(id));
|
||||||
|
return res.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
async deleteGameById(id: string): Promise<boolean> {
|
||||||
|
const precond = await this.kv.get<Game>(this.gamePrimaryKey(id));
|
||||||
|
if (precond.value === null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = await this.kv
|
||||||
|
.atomic()
|
||||||
|
.check(precond)
|
||||||
|
.delete(this.gamePrimaryKey(precond.value.id))
|
||||||
|
.delete(this.dateIndex(precond.value.date, precond.value.time)!)
|
||||||
|
.commit();
|
||||||
|
return res.ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
async updateGame(id: string, partial: Partial<Game>): Promise<boolean> {
|
||||||
|
delete partial.id;
|
||||||
|
const precond = await this.kv.get<Game>(this.gamePrimaryKey(id));
|
||||||
|
if (precond.value === null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const res = await this.kv
|
||||||
|
.atomic()
|
||||||
|
.check(precond)
|
||||||
|
.delete(this.gamePrimaryKey(precond.value.id))
|
||||||
|
.delete(this.dateIndex(precond.value.date, precond.value.time)!)
|
||||||
|
.set(
|
||||||
|
this.dateIndex(precond.value.date, precond.value.time)!,
|
||||||
|
precond.value.id,
|
||||||
|
)
|
||||||
|
.set(this.gamePrimaryKey(precond.value.id), {
|
||||||
|
...precond.value,
|
||||||
|
...partial,
|
||||||
|
})
|
||||||
|
.commit();
|
||||||
|
return res.ok;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Deno.test("saving simple games", async (t) => {
|
||||||
|
const kv = await Deno.openKv();
|
||||||
|
const service = new GameService(kv);
|
||||||
|
|
||||||
|
async function deleteAllKeys() {
|
||||||
|
const keys = kv.list({ prefix: [] });
|
||||||
|
for await (const entry of keys) {
|
||||||
|
await kv.delete(entry.key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function validePreGame(seed: number): PreGame {
|
||||||
|
let year = ((645 * seed + 162) % 10000) + 1;
|
||||||
|
let month = ((335 * seed + 71) % 12) + 1;
|
||||||
|
let day = ((72625 * seed + 176) % 28) + 1;
|
||||||
|
return {
|
||||||
|
date: `${(year + "").padStart(4, "0")}-${(month + "").padStart(2, "0")}-${(day + "").padStart(2, "0")}`,
|
||||||
|
time: "18:45",
|
||||||
|
away: "jaune",
|
||||||
|
home: "rouge",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
await deleteAllKeys();
|
||||||
|
|
||||||
|
await t.step("creating games", async () => {
|
||||||
|
const preGame = validePreGame(7276);
|
||||||
|
const [game, error] = await service.createNewGame(preGame);
|
||||||
|
assertEquals(error, "");
|
||||||
|
const ret = await service.getGameById(game!.id);
|
||||||
|
assertEquals(game, ret);
|
||||||
|
});
|
||||||
|
|
||||||
|
await deleteAllKeys();
|
||||||
|
|
||||||
|
await t.step("creating games with old date format", async () => {
|
||||||
|
const preGame = validePreGame(7276);
|
||||||
|
preGame.date = "2017-8-5";
|
||||||
|
const [game, error] = await service.createNewGame(preGame);
|
||||||
|
assertEquals(error, "");
|
||||||
|
assertEquals(game?.date, "2017-08-05");
|
||||||
|
});
|
||||||
|
|
||||||
|
await deleteAllKeys();
|
||||||
|
|
||||||
|
await t.step("creating games with old time format", async () => {
|
||||||
|
const preGame = validePreGame(7276);
|
||||||
|
preGame.time = "9:00";
|
||||||
|
const [game, error] = await service.createNewGame(preGame);
|
||||||
|
assertEquals(error, "");
|
||||||
|
assertEquals(game?.time, "09:00");
|
||||||
|
});
|
||||||
|
|
||||||
|
await deleteAllKeys();
|
||||||
|
|
||||||
|
await t.step(
|
||||||
|
"saving two games in the same timeslot should fail",
|
||||||
|
async () => {
|
||||||
|
const preGame = validePreGame(7276);
|
||||||
|
let [_, error] = await service.createNewGame(preGame);
|
||||||
|
assertEquals(error, "");
|
||||||
|
[_, error] = await service.createNewGame(preGame);
|
||||||
|
assertNotEquals(error, "");
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
await deleteAllKeys();
|
||||||
|
|
||||||
|
await t.step("saving games with bad fields", async () => {
|
||||||
|
let i = 0;
|
||||||
|
for (const key of Object.keys(validePreGame(7276))) {
|
||||||
|
let [_, error] = await service.createNewGame({
|
||||||
|
...validePreGame(7262 + i),
|
||||||
|
[key]: `Broken ${key}`,
|
||||||
|
});
|
||||||
|
assertNotEquals(error, "");
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await t.step("saving games with the same home and away teams", async () => {
|
||||||
|
const preGame = validePreGame(7276);
|
||||||
|
preGame.home = preGame.away;
|
||||||
|
let [_, error] = await service.createNewGame(preGame);
|
||||||
|
assertNotEquals(error, "");
|
||||||
|
});
|
||||||
|
|
||||||
|
await deleteAllKeys();
|
||||||
|
|
||||||
|
await t.step("listing games", async () => {
|
||||||
|
for (let i = 0; i < 10; i++) {
|
||||||
|
await service.createNewGame(validePreGame(666 + i));
|
||||||
|
}
|
||||||
|
assertEquals((await service.getAllGames()).length, 10);
|
||||||
|
});
|
||||||
|
|
||||||
|
await deleteAllKeys();
|
||||||
|
|
||||||
|
await t.step("deleting games", async () => {
|
||||||
|
let [game, error] = await service.createNewGame(validePreGame(8992));
|
||||||
|
await service.deleteGameById(game!.id);
|
||||||
|
assertEquals((await service.getAllGames()).length, 0);
|
||||||
|
|
||||||
|
[game, error] = await service.createNewGame(validePreGame(8992));
|
||||||
|
assertEquals(error, "");
|
||||||
|
});
|
||||||
|
|
||||||
|
await deleteAllKeys();
|
||||||
|
|
||||||
|
await t.step("updating game scores", async () => {
|
||||||
|
let [game, _] = await service.createNewGame(validePreGame(8992));
|
||||||
|
const ret = await service.updateGame(game!.id, {
|
||||||
|
homeScore: 10,
|
||||||
|
awayScore: 32,
|
||||||
|
});
|
||||||
|
assertEquals(ret, true);
|
||||||
|
game = await service.getGameById(game!.id);
|
||||||
|
assertEquals(game!.homeScore, 10);
|
||||||
|
assertEquals(game!.awayScore, 32);
|
||||||
|
});
|
||||||
|
|
||||||
|
await deleteAllKeys();
|
||||||
|
await kv.close();
|
||||||
|
});
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
import {
|
||||||
|
assert,
|
||||||
|
assertFalse,
|
||||||
|
} from "https://deno.land/std@0.224.0/assert/mod.ts";
|
||||||
|
|
||||||
|
type User = { username: string; passwordHashWithSalt: string };
|
||||||
|
|
||||||
|
const officialUsers: User[] = [
|
||||||
|
{
|
||||||
|
username: "marqueur",
|
||||||
|
passwordHashWithSalt:
|
||||||
|
"5603007580f73044864e7a0b66744f405406eaaf28fa514d724ccf11d010bd89:070b1a477e6a877d44f31961dc0402a9f3258465eed73ab6a9110c461ac68714",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export class LoginService {
|
||||||
|
private readonly users: User[];
|
||||||
|
private readonly sessionKey: string;
|
||||||
|
|
||||||
|
constructor(users: User[], sessionKey: string) {
|
||||||
|
this.users = users;
|
||||||
|
this.sessionKey = sessionKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static officialLoginService(): LoginService {
|
||||||
|
return new LoginService(
|
||||||
|
officialUsers,
|
||||||
|
Deno.env.get("SESSION_KEY") || "dev-only",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async hashMessage(message: string): Promise<string> {
|
||||||
|
const msgUint8 = new TextEncoder().encode(message); // encode as (utf-8) Uint8Array
|
||||||
|
const hashBuffer = await crypto.subtle.digest("SHA-256", msgUint8); // hash the message
|
||||||
|
const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert buffer to byte array
|
||||||
|
const hashHex = hashArray
|
||||||
|
.map((b) => b.toString(16).padStart(2, "0"))
|
||||||
|
.join(""); // convert bytes to hex string
|
||||||
|
return hashHex;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async shittyHmac(message: string, salt: string): Promise<string> {
|
||||||
|
const h1 = await this.hashMessage(message + salt);
|
||||||
|
const h2 = await this.hashMessage(salt + message);
|
||||||
|
return await this.hashMessage(h1 + h2);
|
||||||
|
}
|
||||||
|
|
||||||
|
async hashPassword(password: string): Promise<string> {
|
||||||
|
const salt = await this.hashMessage(`${Math.random()}`);
|
||||||
|
const hash = await this.shittyHmac(password, salt);
|
||||||
|
return `${salt}:${hash}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
async verifyPassword(
|
||||||
|
password: string,
|
||||||
|
passwordHashWithSalt: string,
|
||||||
|
): Promise<boolean> {
|
||||||
|
const [passwordSalt, passwordHash] = passwordHashWithSalt.split(":");
|
||||||
|
return passwordHash === (await this.shittyHmac(password, passwordSalt));
|
||||||
|
}
|
||||||
|
|
||||||
|
async validateCredentials(
|
||||||
|
username: string,
|
||||||
|
password: string,
|
||||||
|
): Promise<boolean> {
|
||||||
|
for (const user of this.users) {
|
||||||
|
if (user.username === username) {
|
||||||
|
return this.verifyPassword(password, user.passwordHashWithSalt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async login(ctx: any): Promise<void> {
|
||||||
|
const nDays = 90;
|
||||||
|
const maxAgesInSecond = nDays * 24 * 3600;
|
||||||
|
const maxUnixEpoch = Math.floor(Date.now() / 1000) + maxAgesInSecond;
|
||||||
|
|
||||||
|
await ctx.cookies.set("phenix-session", `${maxUnixEpoch}`, {
|
||||||
|
maxAge: maxAgesInSecond,
|
||||||
|
});
|
||||||
|
await ctx.cookies.set(
|
||||||
|
"phenix-session-sign",
|
||||||
|
await this.shittyHmac(`${maxUnixEpoch}`, this.sessionKey),
|
||||||
|
{
|
||||||
|
maxAge: maxAgesInSecond,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async isLoggedIn(ctx: any): Promise<boolean> {
|
||||||
|
const expiration = await ctx.cookies.get("phenix-session");
|
||||||
|
const signature = await ctx.cookies.get("phenix-session-sign");
|
||||||
|
if (signature !== (await this.shittyHmac(expiration, this.sessionKey))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!expiration || !/^\d+$/.test(expiration)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return Date.now() < parseInt(expiration) * 1000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Deno.test("login service", async (t) => {
|
||||||
|
await t.step("hashing password", async () => {
|
||||||
|
const service = new LoginService([]);
|
||||||
|
const passwordHashWithSalt = await service.hashPassword("qwerty");
|
||||||
|
assert(await service.verifyPassword("qwerty", passwordHashWithSalt));
|
||||||
|
assertFalse(await service.verifyPassword("ytrewq", passwordHashWithSalt));
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
export type Game = {
|
||||||
|
id: string;
|
||||||
|
date: string;
|
||||||
|
time: string;
|
||||||
|
home: string;
|
||||||
|
away: string;
|
||||||
|
year: number;
|
||||||
|
homeScore: number | null;
|
||||||
|
awayScore: number | null;
|
||||||
|
practice: boolean;
|
||||||
|
rain: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type PreGame = {
|
||||||
|
date: string;
|
||||||
|
time: string;
|
||||||
|
home: string;
|
||||||
|
away: string;
|
||||||
|
};
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,5 @@
|
|||||||
|
[Dolphin]
|
||||||
|
SortRole=modificationtime
|
||||||
|
Timestamp=2018,3,19,17,32,48
|
||||||
|
Version=4
|
||||||
|
ViewMode=1
|
||||||
File renamed without changes.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File renamed without changes.
File renamed without changes.
Binary file not shown.
Binary file not shown.
File renamed without changes.
Binary file not shown.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File renamed without changes.
@@ -0,0 +1,26 @@
|
|||||||
|
import * as util from "./util.js";
|
||||||
|
import m from "https://esm.sh/mithril@2.2.2"
|
||||||
|
import _ from "https://esm.sh/lodash-es@4.17.21"
|
||||||
|
import {statsView, tabView, schedulView } from './schedule.js'
|
||||||
|
|
||||||
|
const calendarPage = {
|
||||||
|
view: function(){
|
||||||
|
const availableYears = util.getAvailableYears();
|
||||||
|
const year = _.get(m.route.param(), 'year', util.getDefaultYear());
|
||||||
|
|
||||||
|
return m('div.uk-grid.uk-margin-top.uk-margin-bottom',
|
||||||
|
m('div.uk-width-large-3-5.uk-width-medium-4-5.uk-width-small-1-1.uk-container-center',
|
||||||
|
[
|
||||||
|
m(statsView, {year}),
|
||||||
|
m(tabView, {year, availableYears}),
|
||||||
|
m(schedulView, {year}),
|
||||||
|
]),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m.route.mode = "hash";
|
||||||
|
m.route(document.getElementById('mithril-content'), "/", {
|
||||||
|
"/": calendarPage,
|
||||||
|
"/:year": calendarPage,
|
||||||
|
});
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
define(['m'], function(m) {
|
import m from "https://esm.sh/mithril@2.2.2"
|
||||||
return function(size){
|
|
||||||
|
export function rainSvg (size){
|
||||||
return m("svg[viewBox='0 0 107.95 87.723']",{width: size, height: size}, [
|
return m("svg[viewBox='0 0 107.95 87.723']",{width: size, height: size}, [
|
||||||
m("defs[id='defs16']"),
|
m("defs[id='defs16']"),
|
||||||
m("g[id='layer1'][transform='translate(-310.1 -167.39)']", [
|
m("g[id='layer1'][transform='translate(-310.1 -167.39)']", [
|
||||||
@@ -15,5 +16,4 @@ define(['m'], function(m) {
|
|||||||
])
|
])
|
||||||
])
|
])
|
||||||
]);
|
]);
|
||||||
};
|
}
|
||||||
});
|
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */
|
||||||
|
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}function fe(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}ce.fn=ce.prototype={jquery:t,constructor:ce,length:0,toArray:function(){return ae.call(this)},get:function(e){return null==e?ae.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=ce.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return ce.each(this,e)},map:function(n){return this.pushStack(ce.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(ae.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(ce.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(ce.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:oe.sort,splice:oe.splice},ce.extend=ce.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||v(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(ce.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||ce.isPlainObject(n)?n:{},i=!1,a[t]=ce.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},ce.extend({expando:"jQuery"+(t+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==i.call(e))&&(!(t=r(e))||"function"==typeof(n=ue.call(t,"constructor")&&t.constructor)&&o.call(n)===a)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){m(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(c(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},text:function(e){var t,n="",r=0,i=e.nodeType;if(!i)while(t=e[r++])n+=ce.text(t);return 1===i||11===i?e.textContent:9===i?e.documentElement.textContent:3===i||4===i?e.nodeValue:n},makeArray:function(e,t){var n=t||[];return null!=e&&(c(Object(e))?ce.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:se.call(t,e,n)},isXMLDoc:function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!l.test(t||n&&n.nodeName||"HTML")},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(c(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:le}),"function"==typeof Symbol&&(ce.fn[Symbol.iterator]=oe[Symbol.iterator]),ce.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var pe=oe.pop,de=oe.sort,he=oe.splice,ge="[\\x20\\t\\r\\n\\f]",ve=new RegExp("^"+ge+"+|((?:^|[^\\\\])(?:\\\\.)*)"+ge+"+$","g");ce.contains=function(e,t){var n=t&&t.parentNode;return e===n||!(!n||1!==n.nodeType||!(e.contains?e.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))};var f=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function p(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}ce.escapeSelector=function(e){return(e+"").replace(f,p)};var ye=C,me=s;!function(){var e,b,w,o,a,T,r,C,d,i,k=me,S=ce.expando,E=0,n=0,s=W(),c=W(),u=W(),h=W(),l=function(e,t){return e===t&&(a=!0),0},f="checked|selected|async|autofocus|autoplay|conLine truncated
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
// alert("ok")
|
||||||
|
import * as util from "./util.js";
|
||||||
|
import * as resultParser from './resultParser.js'
|
||||||
|
import * as teams from './teams.js'
|
||||||
|
import m from "https://esm.sh/mithril@2.2.2"
|
||||||
|
import {rainSvg} from "./images.js";
|
||||||
|
import _ from "https://esm.sh/lodash-es@4.17.21"
|
||||||
|
|
||||||
|
import {statsView, tabView, scheduleTeamTags } from './schedule.js'
|
||||||
|
|
||||||
|
|
||||||
|
const nextGameDaySchedule = {};
|
||||||
|
|
||||||
|
nextGameDaySchedule._toDay = function(){
|
||||||
|
var now = new Date();
|
||||||
|
return new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
||||||
|
};
|
||||||
|
|
||||||
|
nextGameDaySchedule.oninit = async function(){
|
||||||
|
|
||||||
|
const result = await m.request({
|
||||||
|
method: "GET",
|
||||||
|
url: `/api/results/2024.json`
|
||||||
|
});
|
||||||
|
const nightGames = resultParser.getNightGames(result);
|
||||||
|
nextGameDaySchedule.games = nextGameDaySchedule._getNextNightGame(nightGames, nextGameDaySchedule._toDay());
|
||||||
|
};
|
||||||
|
|
||||||
|
nextGameDaySchedule._getNextNightGame = function(games, date){
|
||||||
|
return _(games)
|
||||||
|
.filter(g => g.jsDate.getTime() >= date.getTime())
|
||||||
|
.last()
|
||||||
|
.games
|
||||||
|
.sort((g1, g2) => g1.jsDate - g2.jsDate);
|
||||||
|
};
|
||||||
|
|
||||||
|
nextGameDaySchedule._getTableHead = function(){
|
||||||
|
return m('thead', m('tr', [
|
||||||
|
m('td', 'Date'),
|
||||||
|
m('td', 'Heure'),
|
||||||
|
m('td', 'Receveur'),
|
||||||
|
m('td', 'Visiteur')
|
||||||
|
]));
|
||||||
|
};
|
||||||
|
|
||||||
|
nextGameDaySchedule._responsoveText = function(largeText, smallText, game){
|
||||||
|
var ret = [];
|
||||||
|
if(game.rain){
|
||||||
|
ret.push(rainSvg('1.5em'));
|
||||||
|
ret.push(' ');
|
||||||
|
} else if(game.practice){
|
||||||
|
ret.push(m('span.uk-badge.uk-badge-success', 'pratique!'));
|
||||||
|
ret.push(' ');
|
||||||
|
}
|
||||||
|
ret.push(m('span.uk-visible-large', largeText));
|
||||||
|
ret.push(m('span.uk-hidden-large', smallText));
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
nextGameDaySchedule._getGamesRow = function(game){
|
||||||
|
return m('tr', [
|
||||||
|
m('td', nextGameDaySchedule._responsoveText(util.formatDate(game.jsDate),
|
||||||
|
util.formatDateSmall(game.jsDate),
|
||||||
|
game)),
|
||||||
|
m('td', game.time),
|
||||||
|
m('td', scheduleTeamTags.getHomeTeamTag(game)),
|
||||||
|
m('td',scheduleTeamTags.getAwayTeamTag(game))
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
|
||||||
|
nextGameDaySchedule._getGamesRows = function(games){
|
||||||
|
return _.map(games, nextGameDaySchedule._getGamesRow);
|
||||||
|
};
|
||||||
|
|
||||||
|
nextGameDaySchedule.view = function(){
|
||||||
|
return m('table.uk-table.uk-table-hover.uk-table-striped.uk-table-condensed',[
|
||||||
|
nextGameDaySchedule._getTableHead(),
|
||||||
|
m('tbody',
|
||||||
|
nextGameDaySchedule._getGamesRows(nextGameDaySchedule.games)
|
||||||
|
)]);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const LittleCalendar = {}
|
||||||
|
|
||||||
|
LittleCalendar.view = function(){
|
||||||
|
return m(nextGameDaySchedule);
|
||||||
|
}
|
||||||
|
|
||||||
|
const containerIds = ['large-mithril-container',
|
||||||
|
'medium-mithril-container',
|
||||||
|
'small-mithril-container']
|
||||||
|
|
||||||
|
for(const id of containerIds){
|
||||||
|
m.mount(document.getElementById(id), LittleCalendar);
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
import * as _ from "https://esm.sh/lodash-es@4.17.21"
|
||||||
|
|
||||||
|
|
||||||
|
let resultParser = {};
|
||||||
|
|
||||||
|
resultParser._addJSDateToResult = function(res){
|
||||||
|
let date = res.date.split('-');
|
||||||
|
let time = _.isString(res.time) ? res.time.split(':'): [0, 0];
|
||||||
|
res.jsDate = new Date(
|
||||||
|
Number(date[0]),
|
||||||
|
Number(date[1]) - 1,
|
||||||
|
Number(date[2]),
|
||||||
|
Number(time[0]),
|
||||||
|
Number(time[1])
|
||||||
|
);
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
|
resultParser._setCanonicalPoints = function(res){
|
||||||
|
if(!_.isNumber(res.home_points) && _.isNumber(_.get(res, res.home))){
|
||||||
|
res.home_points = res[res.home];
|
||||||
|
}
|
||||||
|
if(!_.isNumber(res.away_points) && _.isNumber(_.get(res, res.away))){
|
||||||
|
res.away_points = res[res.away];
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
resultParser.parseResults = function(rawResults){
|
||||||
|
rawResults = _.map(rawResults, resultParser._setCanonicalPoints);
|
||||||
|
rawResults = _.map(rawResults, resultParser._addJSDateToResult);
|
||||||
|
rawResults = _.map(rawResults, resultParser._addCustomStyle);
|
||||||
|
return rawResults;
|
||||||
|
};
|
||||||
|
|
||||||
|
resultParser.getNightGames = function(rawResults){
|
||||||
|
let ret = {};
|
||||||
|
_.each(resultParser.parseResults(rawResults), function(res){
|
||||||
|
if(_.has(ret, res.date)){
|
||||||
|
ret[res.date].push(res);
|
||||||
|
}else{
|
||||||
|
ret[res.date] = [res];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return _.map(ret, function(games, date){
|
||||||
|
return resultParser._addJSDateToResult({date: date, games: games});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
resultParser._getAllTeams = function(rawResults){
|
||||||
|
let homeTeams = _.map(rawResults, 'home');
|
||||||
|
let awayTeams = _.map(rawResults, 'away');
|
||||||
|
return _.uniq(_.concat(homeTeams, awayTeams));
|
||||||
|
};
|
||||||
|
|
||||||
|
resultParser._getWinner = function(res){
|
||||||
|
if(res.home_points > res.away_points){
|
||||||
|
return res.home;
|
||||||
|
}
|
||||||
|
if(res.home_points < res.away_points){
|
||||||
|
return res.away;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
resultParser._hasWon = function(res, team){
|
||||||
|
return resultParser._getWinner(res) == team;
|
||||||
|
};
|
||||||
|
|
||||||
|
resultParser._hasLost = function(res, team){
|
||||||
|
return !resultParser._isDraw(res) && resultParser._getWinner(res) != team;
|
||||||
|
};
|
||||||
|
|
||||||
|
resultParser._isDraw = function(res){
|
||||||
|
return res.home_points == res.away_points;
|
||||||
|
};
|
||||||
|
|
||||||
|
resultParser._getPointsFor = function(res, team){
|
||||||
|
if(res.home == team){
|
||||||
|
return res.home_points;
|
||||||
|
}
|
||||||
|
return res.away_points;
|
||||||
|
};
|
||||||
|
|
||||||
|
resultParser._getPointsForOpponent = function(res, team){
|
||||||
|
if(res.home == team){
|
||||||
|
return res.away_points;
|
||||||
|
}
|
||||||
|
return res.home_points;
|
||||||
|
};
|
||||||
|
|
||||||
|
resultParser._getPointsForGame = function(res, team){
|
||||||
|
if(resultParser._hasWon(res, team)){
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
return resultParser._isDraw(res) ? 1: 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
resultParser._getTeamStats = function(rawResults, team){
|
||||||
|
let ret = {
|
||||||
|
team: team, gamePlayed: 0, victories: 0, points: 0,
|
||||||
|
defeats: 0, draws: 0, pointsFor: 0, pointsAgaint: 0};
|
||||||
|
_.each(rawResults, function(res){
|
||||||
|
if((team != res.home && team != res.away) || !_.isNumber(res.home_points)){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ret.gamePlayed += 1;
|
||||||
|
ret.victories += resultParser._hasWon(res, team) ? 1: 0;
|
||||||
|
ret.defeats += resultParser._hasLost(res, team) ? 1: 0;
|
||||||
|
ret.draws += resultParser._isDraw(res) ? 1: 0;
|
||||||
|
ret.pointsFor += resultParser._getPointsFor(res, team);
|
||||||
|
ret.pointsAgaint += resultParser._getPointsForOpponent(res, team);
|
||||||
|
ret.points += resultParser._getPointsForGame(res, team);
|
||||||
|
});
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
|
||||||
|
resultParser._removeTemporaryResults = function(rawResults){
|
||||||
|
return _.filter(rawResults, function(rawResult){
|
||||||
|
return !rawResult.temporary;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
resultParser._isValidGame = function(game){
|
||||||
|
return !game.rain && ! game.practice;
|
||||||
|
};
|
||||||
|
|
||||||
|
resultParser.getStats = function(rawResults){
|
||||||
|
rawResults = _.filter(rawResults, resultParser._isValidGame);
|
||||||
|
rawResults = _.map(rawResults, resultParser._setCanonicalPoints);
|
||||||
|
let allTeams = resultParser._getAllTeams(resultParser._removeTemporaryResults(rawResults));
|
||||||
|
let getTeamStats = _.partial(resultParser._getTeamStats, rawResults);
|
||||||
|
return _.map(allTeams, getTeamStats);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getStats = resultParser.getStats;
|
||||||
|
export const getNightGames = resultParser.getNightGames;
|
||||||
@@ -0,0 +1,218 @@
|
|||||||
|
import * as util from "./util.js";
|
||||||
|
import * as resultParser from './resultParser.js'
|
||||||
|
import * as teams from './teams.js'
|
||||||
|
import m from "https://esm.sh/mithril@2.2.2"
|
||||||
|
import {rainSvg} from "./images.js";
|
||||||
|
import _ from "https://esm.sh/lodash-es@4.17.21"
|
||||||
|
|
||||||
|
function ppYear(year, availableYears) {
|
||||||
|
return _.last(availableYears) === year ? "" : year;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export const scheduleTeamTags = {};
|
||||||
|
|
||||||
|
scheduleTeamTags._getTeamTag = function(teamName){
|
||||||
|
var teamColor = teams.getTeamColor(teamName);
|
||||||
|
return [
|
||||||
|
m('i.fa.fa-flag', {style: {color: teamColor}}),
|
||||||
|
m('span', ' ' + teamName)
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
scheduleTeamTags._getAwayPracticeTeamTag = function(){
|
||||||
|
return [
|
||||||
|
m('i.fa.fa-hand-spock-o', {style: {color: ' #ff1493'}, title: 'pratique'}),
|
||||||
|
m('span', ' Amis #1')
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
scheduleTeamTags._getHomePracticeTeamTag = function(){
|
||||||
|
return [
|
||||||
|
m('i.fa.fa-hand-spock-o', {style: {color: '#acbf60'}, title: 'pratique'}),
|
||||||
|
m('span', ' Amis #2')
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
scheduleTeamTags.getAwayTeamTag = function(game){
|
||||||
|
if(game.practice){
|
||||||
|
return scheduleTeamTags._getAwayPracticeTeamTag();
|
||||||
|
}
|
||||||
|
return scheduleTeamTags._getTeamTag(game.away);
|
||||||
|
};
|
||||||
|
|
||||||
|
scheduleTeamTags.getHomeTeamTag = function(game){
|
||||||
|
if(game.practice){
|
||||||
|
return scheduleTeamTags._getHomePracticeTeamTag();
|
||||||
|
}
|
||||||
|
return scheduleTeamTags._getTeamTag(game.home);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export const statsView = {};
|
||||||
|
statsView.stats = [];
|
||||||
|
|
||||||
|
statsView.oninit = async function(vnode){
|
||||||
|
if(statsView.currentYear === vnode.attrs.year){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
statsView.currentYear = vnode.attrs.year;
|
||||||
|
const result = await m.request({
|
||||||
|
method: "GET",
|
||||||
|
url: `/api/results/${vnode.attrs.year}.json`
|
||||||
|
});
|
||||||
|
statsView.stats = resultParser.getStats(result)
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
statsView.onupdate = statsView.oninit;
|
||||||
|
|
||||||
|
|
||||||
|
statsView.getStatRow = function(teamStats){
|
||||||
|
var formatStat = function(n){
|
||||||
|
return teamStats.gamePlayed === 0 ? '-' : n;
|
||||||
|
};
|
||||||
|
return m('tr', [
|
||||||
|
m('td', teamStats.team),
|
||||||
|
m('td', teamStats.gamePlayed),
|
||||||
|
m('td', formatStat(teamStats.victories)),
|
||||||
|
m('td', formatStat(teamStats.defeats)),
|
||||||
|
m('td', formatStat(teamStats.draws)),
|
||||||
|
m('td', formatStat(teamStats.pointsFor)),
|
||||||
|
m('td', formatStat(teamStats.pointsAgaint)),
|
||||||
|
m('td', formatStat(teamStats.pointsFor - teamStats.pointsAgaint)),
|
||||||
|
m('td', formatStat(teamStats.points))
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
|
||||||
|
statsView.isStatForValidTeam = function(stat){
|
||||||
|
var teamNames = _.map(teams.teams(), 'name');
|
||||||
|
return _.includes(teamNames, stat.team);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
statsView.mainTable = function(stats){
|
||||||
|
var orderedStats = _.reverse(_.sortBy(stats, ['points', 'pointsFor']));
|
||||||
|
return m('table.uk-table.uk-table-hover.uk-table-striped',[
|
||||||
|
m('thead', m('tr', [
|
||||||
|
m('th', 'Équipes'),
|
||||||
|
m('th', 'PJ'),
|
||||||
|
m('th', 'V'),
|
||||||
|
m('th', 'D'),
|
||||||
|
m('th', 'N'),
|
||||||
|
m('th', 'PP'),
|
||||||
|
m('th', 'PC'),
|
||||||
|
m('th', 'DIF'),
|
||||||
|
m('th', 'PTS')
|
||||||
|
])),
|
||||||
|
m('tbody', _(orderedStats)
|
||||||
|
.filter(statsView.isStatForValidTeam)
|
||||||
|
.map(statsView.getStatRow)
|
||||||
|
.value())
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
|
||||||
|
statsView.legend = function(){
|
||||||
|
var items = ["PJ : Parties joués", "V : Victoire", "D : Défaite",
|
||||||
|
"N : Nul", "PP : Points pour", "PC : Points contre",
|
||||||
|
"DIF : Diférenciel","PTS : Points"];
|
||||||
|
return m('ul.uk-subnav.uk-subnav-line.uk-flex-center',[
|
||||||
|
_.map(items, function(itm){
|
||||||
|
return m('li', itm);
|
||||||
|
})
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
|
||||||
|
statsView.view = function(vnode){
|
||||||
|
return m('div.uk-grid',
|
||||||
|
m('div.uk-width-medium-1-1.uk-width-large-1-1.uk-container-center',[
|
||||||
|
m('h2', 'Classement ' + vnode.attrs.year),
|
||||||
|
statsView.mainTable(statsView.stats),
|
||||||
|
statsView.legend()
|
||||||
|
]));
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export const schedulView = {};
|
||||||
|
|
||||||
|
schedulView.oninit = async function(vnode){
|
||||||
|
if(vnode.attrs.year === schedulView.currentYear){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
schedulView.currentYear = vnode.attrs.year;
|
||||||
|
const result = await m.request({
|
||||||
|
method: "GET",
|
||||||
|
url: `/api/results/${vnode.attrs.year}.json`
|
||||||
|
});
|
||||||
|
schedulView.games = resultParser.getNightGames(result)
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
schedulView.onupdate = schedulView.oninit;
|
||||||
|
|
||||||
|
|
||||||
|
schedulView._asGamePoints = function(points){
|
||||||
|
return !_.isNumber(points) ? '-' : points + '';
|
||||||
|
};
|
||||||
|
|
||||||
|
schedulView._rainIcon = function(game){
|
||||||
|
if(game.rain){
|
||||||
|
return m('span', {title: 'pluie, partie annulée.'}, rainSvg('1.5em'));
|
||||||
|
}
|
||||||
|
return m('span', {style: {visibility: 'hidden'}}, rainSvg('1.5em'));
|
||||||
|
};
|
||||||
|
|
||||||
|
schedulView._gameName = function(game){
|
||||||
|
return [schedulView._rainIcon(game),
|
||||||
|
" ",
|
||||||
|
game.time];
|
||||||
|
};
|
||||||
|
|
||||||
|
schedulView._gameRow = function(game){
|
||||||
|
|
||||||
|
return m('tr',[
|
||||||
|
m('td', schedulView._gameName(game)),
|
||||||
|
m('td', scheduleTeamTags.getAwayTeamTag(game)),
|
||||||
|
m('td', schedulView._asGamePoints(game.away_points)),
|
||||||
|
m('td', 'vs'),
|
||||||
|
m('td', scheduleTeamTags.getHomeTeamTag(game)),
|
||||||
|
m('td', schedulView._asGamePoints(game.home_points))
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
|
||||||
|
schedulView._gameView = function(gameNight){
|
||||||
|
return m('div', [m('h3', util.formatDate(gameNight.jsDate)),
|
||||||
|
m('table.uk-table.uk-table-hover.uk-table-condensed.uk-table-striped',
|
||||||
|
m('tbody',[
|
||||||
|
_.map(gameNight.games, schedulView._gameRow),
|
||||||
|
])
|
||||||
|
)
|
||||||
|
]);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
schedulView.view = function(){
|
||||||
|
return m('div.uk-grid',
|
||||||
|
m('div.uk-width-large-3-5.uk-width-medium-1-1',
|
||||||
|
_.map(schedulView.games, schedulView._gameView)));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export const tabView = {};
|
||||||
|
|
||||||
|
tabView._createTab = function(activeYear, availableYears, year){
|
||||||
|
const isActive = (activeYear == year) || (activeYear == ppYear(year, availableYears));
|
||||||
|
return m('li', {'class': isActive ? 'uk-active': ''}, // 'uk-active'
|
||||||
|
m('a', {href: '#/' + ppYear(year, availableYears)}, 'Saison ' + year));
|
||||||
|
}
|
||||||
|
|
||||||
|
tabView.view = function(vnode){
|
||||||
|
const activeYear = vnode.attrs.year;
|
||||||
|
const availableYears = vnode.attrs.availableYears;
|
||||||
|
const createTab = _.partial(tabView._createTab, activeYear, availableYears);
|
||||||
|
return m('div.uk-margin', m('h2', 'Calendrier ' + ppYear(activeYear, availableYears)),
|
||||||
|
m('ul.uk-tab', _.reverse(_.map(availableYears, createTab))));
|
||||||
|
};
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import * as _ from "https://esm.sh/lodash-es@4.17.21"
|
||||||
|
|
||||||
|
|
||||||
|
export function teams(){
|
||||||
|
return [
|
||||||
|
{name: 'remplaçants', color: '#FFA500'},
|
||||||
|
{name: 'jaune', color: '#FF0'},
|
||||||
|
{name:'rouge', color: '#F00'},
|
||||||
|
{name:'bleu', color: '#00F'},
|
||||||
|
{name:'gris', color: '#808080'},
|
||||||
|
{name:'vert', color: '#008000'},
|
||||||
|
{name: 'noir', color: '#000000'},
|
||||||
|
{name: 'orange', color: '#FFA500'},
|
||||||
|
{name: 'mauve', color: '#E0B0FF'}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
export function getTeamColor(teamName){
|
||||||
|
return teams().filter(t => t.name == teamName)[0]?.color;
|
||||||
|
};
|
||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
/*! UIkit 2.27.2 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
|
||||||
|
!function(t){if("function"==typeof define&&define.amd&&define("uikit",function(){var i=window.UIkit||t(window,window.jQuery,window.document);return i.load=function(t,e,n,o){var s,a=t.split(","),r=[],l=(o.config&&o.config.uikit&&o.config.uikit.base?o.config.uikit.base:"").replace(/\/+$/g,"");if(!l)throw new Error("Please define base path to UIkit in the requirejs config.");for(s=0;s<a.length;s+=1){var c=a[s].replace(/\./g,"/");r.push(l+"/components/"+c)}e(r,function(){n(i)})},i}),!window.jQuery)throw new Error("UIkit requires jQuery");window&&window.jQuery&&t(window,window.jQuery,window.document)}(function(t,i,e){"use strict";var n={},o=t.UIkit?Object.create(t.UIkit):void 0;if(n.version="2.27.2",n.noConflict=function(){return o&&(t.UIkit=o,i.UIkit=o,i.fn.uk=o.fn),n},n.prefix=function(t){return t},n.$=i,n.$doc=n.$(document),n.$win=n.$(window),n.$html=n.$("html"),n.support={},n.support.transition=function(){var t=function(){var t,i=e.body||e.documentElement,n={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(t in n)if(void 0!==i.style[t])return n[t]}();return t&&{end:t}}(),n.support.animation=function(){var t=function(){var t,i=e.body||e.documentElement,n={WebkitAnimation:"webkitAnimationEnd",MozAnimation:"animationend",OAnimation:"oAnimationEnd oanimationend",animation:"animationend"};for(t in n)if(void 0!==i.style[t])return n[t]}();return t&&{end:t}}(),function(){Date.now=Date.now||function(){return(new Date).getTime()};for(var t=["webkit","moz"],i=0;i<t.length&&!window.requestAnimationFrame;++i){var e=t[i];window.requestAnimationFrame=window[e+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e+"CancelAnimationFrame"]||window[e+"CancelRequestAnimationFrame"]}if(/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent)||!window.requestAnimationFrame||!window.cancelAnimationFrame){var n=0;window.requestAnimationFrame=function(t){var i=Date.now(),e=Math.max(n+16,i);return setTimeout(function(){t(n=e)},e-i)},window.cancelAnimationFrame=clearTimeout}}(),n.support.touch="ontouchstart"in document||t.DocumentTouch&&document instanceof t.DocumentTouch||t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints>0||t.navigator.pointerEnabled&&t.navigator.maxTouchPoints>0||!1,n.support.mutationobserver=t.MutationObserver||t.WebKitMutationObserver||null,n.Utils={},n.Utils.isFullscreen=function(){return document.webkitFullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.fullscreenElement||!1},n.Utils.str2json=function(t,i){try{return i?JSON.parse(t.replace(/([\$\w]+)\s*:/g,function(t,i){return'"'+i+'":'}).replace(/'([^']+)'/g,function(t,i){return'"'+i+'"'})):new Function("","var json = "+t+"; return JSON.parse(JSON.stringify(json));")()}catch(e){return!1}},n.Utils.debounce=function(t,i,e){var n;return function(){var o=this,s=arguments,a=function(){n=null,e||t.apply(o,s)},r=e&&!n;clearTimeout(n),n=setTimeout(a,i),r&&t.apply(o,s)}},n.Utils.throttle=function(t,i){var e=!1;return function(){e||(t.call(),e=!0,setTimeout(function(){e=!1},i))}},n.Utils.removeCssRules=function(t){var i,e,n,o,s,a,r,l,c,u;t&&setTimeout(function(){try{for(u=document.styleSheets,o=0,r=u.length;r>o;o++){for(n=u[o],e=[],n.cssRules=n.cssRules,i=s=0,l=n.cssRules.length;l>s;i=++s)n.cssRules[i].type===CSSRule.STYLE_RULE&&t.test(n.cssRules[i].selectorText)&&e.unshift(i);for(a=0,c=e.length;c>a;a++)n.deleteRule(e[a])}}catch(d){}},0)},n.Utils.isInView=function(t,e){var o=i(t);if(!o.is(":visible"))return!1;var s=n.$win.scrollLeft(),a=n.$win.scrollTop(),r=o.offset(),l=r.left,c=r.top;return e=i.extend({topoffset:0,leftoffset:0},e),c+o.height()>=a&&c-e.topoffset<=a+n.$win.height()&&l+o.width()>=s&&l-e.leftoffset<=s+n.$win.width()?!0:!1},n.Utils.checkDisplay=function(t,e){var o=n.$("[data-uk-margin], [data-uk-grid-match], [data-uk-grid-margin], [data-uk-check-display]",t||document);return t&&!o.length&&(o=i(t)),o.trigger("display.uk.check"),e&&("string"!=typeof e&&(e='[class*="uk-animation-"]'),o.find(e).each(function(){var t=n.$(this),i=t.attr("class"),e=i.match(/uk-animation-(.+)/);t.removeClass(e[0]).width(),t.addClass(e[0])})),o},n.Utils.options=function(t){if("string"!=i.type(t))return t;-1!=t.indexOf(":")&&"}"!=t.trim().substr(-1)&&(t="{"+t+"}");var e=t?t.indexOf("{"):-1,o={};if(-1!=e)try{o=n.Utils.str2json(t.substr(e))}catch(s){}return o},n.Utils.animate=function(t,e){var o=i.Deferred();return t=n.$(t),t.css("display","none").addClass(e).one(n.support.animation.end,function(){t.removeClass(e),o.resolve()}),t.css("display",""),o.promise()},n.Utils.uid=function(t){return(t||"id")+(new Date).getTime()+"RAND"+Math.ceil(1e5*Math.random())},n.Utils.template=function(t,i){for(var e,n,o,s,a=t.replace(/\n/g,"\\n").replace(/\{\{\{\s*(.+?)\s*\}\}\}/g,"{{!$1}}").split(/(\{\{\s*(.+?)\s*\}\})/g),r=0,l=[],c=0;r<a.length;){if(e=a[r],e.match(/\{\{\s*(.+?)\s*\}\}/))switch(r+=1,e=a[r],n=e[0],o=e.substring(e.match(/^(\^|\#|\!|\~|\:)/)?1:0Line truncated
|
||||||
|
if(e=u.split("-"),h=d[u]?d[u]:d["bottom-left"],this.justified&&this.justified.length)i(a.css({left:0}),this.justified,c);else if(this.options.preventflip!==!0){var p;switch(this.checkBoundary(n.left+h.left,n.top+h.top,r,l,c)){case"x":"x"!==this.options.preventflip&&(p=o.x[u]||"right-top");break;case"y":"y"!==this.options.preventflip&&(p=o.y[u]||"top-left");break;case"xy":this.options.preventflip||(p=o.xy[u]||"right-bottom")}p&&(e=p.split("-"),h=d[p]?d[p]:d["bottom-left"],a.addClass("uk-dropdown-autoflip"),this.checkBoundary(n.left+h.left,n.top+h.top,r,l,c)&&(e=u.split("-"),h=d[u]?d[u]:d["bottom-left"]))}r>c&&(a.addClass("uk-dropdown-stack"),this.trigger("stack.uk.dropdown",[this])),a.css(h).css("display","").addClass("uk-dropdown-"+e[0])}},checkBoundary:function(i,e,n,o,s){var a="";return(0>i||i-t.$win.scrollLeft()+n>s)&&(a+="x"),(e-t.$win.scrollTop()<0||e-t.$win.scrollTop()+o>window.innerHeight)&&(a+="y"),a}}),t.component("dropdownOverlay",{defaults:{justify:!1,cls:"",duration:200},boot:function(){t.ready(function(i){t.$("[data-uk-dropdown-overlay]",i).each(function(){var i=t.$(this);i.data("dropdownOverlay")||t.dropdownOverlay(i,t.Utils.options(i.attr("data-uk-dropdown-overlay")))})})},init:function(){var e=this;this.justified=this.options.justify?t.$(this.options.justify):!1,this.overlay=this.element.find("uk-dropdown-overlay"),this.overlay.length||(this.overlay=t.$('<div class="uk-dropdown-overlay"></div>').appendTo(this.element)),this.overlay.addClass(this.options.cls),this.on({"beforeshow.uk.dropdown":function(t,n){e.dropdown=n,e.justified&&e.justified.length&&i(e.overlay.css({display:"block",marginLeft:"",marginRight:""}),e.justified,e.justified.outerWidth())},"show.uk.dropdown":function(){var i=e.dropdown.dropdown.outerHeight(!0);e.dropdown.element.removeClass("uk-open"),e.overlay.stop().css("display","block").animate({height:i},e.options.duration,function(){e.dropdown.dropdown.css("visibility",""),e.dropdown.element.addClass("uk-open"),t.Utils.checkDisplay(e.dropdown.dropdown,!0)}),e.pointerleave=!1},"hide.uk.dropdown":function(){e.overlay.stop().animate({height:0},e.options.duration)},"pointerenter.uk.dropdown":function(){clearTimeout(e.remainIdle)},"pointerleave.uk.dropdown":function(){e.pointerleave=!0}}),this.overlay.on({mouseenter:function(){e.remainIdle&&(clearTimeout(e.dropdown.remainIdle),clearTimeout(e.remainIdle))},mouseleave:function(){e.pointerleave&&n&&(e.remainIdle=setTimeout(function(){n&&n.hide()},n.options.remaintime))}})}})}(UIkit),function(t){"use strict";var i=[];t.component("gridMatchHeight",{defaults:{target:!1,row:!0,ignorestacked:!1,observe:!1},boot:function(){t.ready(function(i){t.$("[data-uk-grid-match]",i).each(function(){var i,e=t.$(this);e.data("gridMatchHeight")||(i=t.gridMatchHeight(e,t.Utils.options(e.attr("data-uk-grid-match"))))})})},init:function(){var e=this;this.columns=this.element.children(),this.elements=this.options.target?this.find(this.options.target):this.columns,this.columns.length&&(t.$win.on("load resize orientationchange",function(){var i=function(){e.element.is(":visible")&&e.match()};return t.$(function(){i()}),t.Utils.debounce(i,50)}()),this.options.observe&&t.domObserve(this.element,function(){e.element.is(":visible")&&e.match()}),this.on("display.uk.check",function(){this.element.is(":visible")&&this.match()}.bind(this)),i.push(this))},match:function(){var i=this.columns.filter(":visible:first");if(i.length){var e=Math.ceil(100*parseFloat(i.css("width"))/parseFloat(i.parent().css("width")))>=100;return e&&!this.options.ignorestacked?this.revert():t.Utils.matchHeights(this.elements,this.options),this}},revert:function(){return this.elements.css("min-height",""),this}}),t.component("gridMargin",{defaults:{cls:"uk-grid-margin",rowfirst:"uk-row-first"},boot:function(){t.ready(function(i){t.$("[data-uk-grid-margin]",i).each(function(){var i,e=t.$(this);e.data("gridMargin")||(i=t.gridMargin(e,t.Utils.options(e.attr("data-uk-grid-margin"))))})})},init:function(){t.stackMargin(this.element,this.options)}})}(UIkit),function(t){"use strict";function i(i,e){return e?("object"==typeof i?(i=i instanceof jQuery?i:t.$(i),i.parent().length&&(e.persist=i,e.persist.data("modalPersistParent",i.parent()))):i="string"==typeof i||"number"==typeof i?t.$("<div></div>").html(i):t.$("<div></div>").html("UIkit.modal Error: Unsupported data type: "+typeof i),i.appendTo(e.element.find(".uk-modal-dialog")),e):void 0}var e,n=!1,o=0,s=t.$html;t.$win.on("resize orientationchange",t.Utils.debounce(function(){t.$(".uk-modal.uk-open").each(function(){return t.$(this).data("modal")&&t.$(this).data("modal").resize()})},150)),t.component("modal",{defaults:{keyboard:!0,bgclose:!0,minScrollHeight:150,center:!1,modal:!0},scrollable:!1,transition:!1,hasTransitioned:!0,init:function(){if(e||(e=t.$("body")),this.element.length){var i=this;this.paddingdir="padding-"+("left"==t.langdirection?"right":"left"),this.dialog=this.find(".uk-modal-dialog"),this.active=!1,this.element.attr("aria-hiddLine truncated
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
import m from "https://esm.sh/mithril@2.2.2"
|
||||||
|
import * as _ from "https://esm.sh/lodash-es@4.17.21"
|
||||||
|
|
||||||
|
|
||||||
|
let availableYears = []
|
||||||
|
m.request({
|
||||||
|
method: "GET",
|
||||||
|
url: `api/available-years.json`
|
||||||
|
}).then(d => {
|
||||||
|
availableYears = d.sort();
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
function resultatsURL (year){
|
||||||
|
var cacheBuster = window.Date.now();
|
||||||
|
year = !!year ? year: util.getDefaultYear();
|
||||||
|
return "api/resultats" + year + ".json?_=" + cacheBuster;
|
||||||
|
};
|
||||||
|
|
||||||
|
export function getAvailableYears(){
|
||||||
|
if(window.availableYears){
|
||||||
|
return _.clone(window.availableYears)
|
||||||
|
}
|
||||||
|
return availableYears.map(x => x)
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
export function getDefaultYear(){
|
||||||
|
return _.max(getAvailableYears());
|
||||||
|
}
|
||||||
|
|
||||||
|
export function formatDate(date){
|
||||||
|
const monthNames = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',
|
||||||
|
'juillet', 'août', 'septembre', 'octobre', 'novembre',
|
||||||
|
'decembre'];
|
||||||
|
return [date.getDate(),
|
||||||
|
monthNames[date.getMonth()],
|
||||||
|
date.getFullYear()].join(' ');
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export function getResults(year){
|
||||||
|
var url = resultatsURL(year);
|
||||||
|
return m.request({method: "GET", url: url})
|
||||||
|
};
|
||||||
|
|
||||||
|
export function getDefaultResults() {
|
||||||
|
return getResults(getDefaultYear());
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export function formatDateSmall(date){
|
||||||
|
var smallMonthNames = ['janv', 'févr', 'mars', 'avr', 'mai', 'juin',
|
||||||
|
'juill', 'août', 'sept', 'oct', 'nov',
|
||||||
|
'dec'];
|
||||||
|
return [date.getDate(),
|
||||||
|
smallMonthNames[date.getMonth()],
|
||||||
|
date.getFullYear() % 1000].join(' ');
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{{ layout "templates/container.vto" }}
|
||||||
|
|
||||||
|
|
||||||
|
<div id="mithril-content"></div>
|
||||||
|
|
||||||
|
<script type=module src="scripts/calendar.js"></script>
|
||||||
|
|
||||||
|
{{ /layout }}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
{{ layout "templates/container.vto" }}
|
||||||
|
|
||||||
|
<div class="uk-width-large-2-5 uk-width-medium-4-5 uk-width-small-1-1 uk-container-center">
|
||||||
|
<div class="uk-grid uk-margin">
|
||||||
|
<div class="uk-width-1-1">
|
||||||
|
<div style="height: 300px; width: 300px; background-size: 300px; background-image: url(images/logosansfond.JPG);" class="uk-cover-background uk-container-center"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="div uk-panel uk-panel-box uk-panel-box-secondary uk-container-center uk-margin">
|
||||||
|
<table class="uk-table">
|
||||||
|
<tr>
|
||||||
|
<td class="uk-text-right"><i class="fa fa-desktop"></i></td>
|
||||||
|
<td><a href="mailto:sportsphenixmtl@gmail.com">sportsphenixmtl@gmail.com</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="uk-text-right"><i class="fa fa-phone"></i></td>
|
||||||
|
<td> (514) 838-8950</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="uk-text-right"><i class="fa fa-envelope"></i></td>
|
||||||
|
<td>
|
||||||
|
<p> 10454 Sylvain-Garneau<br>Montréal, Québec H1C 0A2</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="uk-text-right"><i class="fa fa-gitlab"></i></td>
|
||||||
|
<td>
|
||||||
|
<p> Le site web est ouvert et accessible sur <a href="https://gitlab.com/ballephenix/website">gitlab.</a></p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ /layout }}
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Balle Phenix</title>
|
||||||
|
|
||||||
|
<link rel="shortcut icon" href="https://www.ballephenix.com/favicon.ico">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<script src="scripts/jquery-3.7.1.min.js"></script>
|
||||||
|
<script src="scripts/uikit.min.js"></script>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
<script src="https://unpkg.com/htmx.org@2.0.0"></script>
|
||||||
|
<link rel="stylesheet" href="/css/style.css">
|
||||||
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<nav class="uk-navbar uk-navbar-attached">
|
||||||
|
<ul class="uk-navbar-nav uk-visible-large uk-navbar-content uk-navbar-center">
|
||||||
|
<li class="uk-parent">
|
||||||
|
<div class="uk-navbar-brand"><a href="https://www.facebook.com/SportsPhenixMtl"><i class="fa fa-facebook-square"></i></a></div>
|
||||||
|
</li>
|
||||||
|
<li class="{{ if it.tab === 'home'}}uk-active{{ /if }}">
|
||||||
|
<a href="/">
|
||||||
|
<div><i class="fa fa-home"></i> Accueil</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="{{ if it.tab === 'nouvelles'}}uk-active{{ /if }}">
|
||||||
|
<a href="/nouvelles">
|
||||||
|
<div><i class="fa fa-newspaper-o"></i> Nouvelles</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="{{ if it.tab === 'calendrier'}}uk-active{{ /if }}">
|
||||||
|
<a href="/calendrier">
|
||||||
|
<div><i class="fa fa-calendar"></i> Calendrier</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="{{ if it.tab === 'reglement'}}uk-active{{ /if }}">
|
||||||
|
<a href="/reglement">
|
||||||
|
<div><i class="fa fa-legal"></i> Règlement</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="{{ if it.tab === 'membre'}}uk-active{{ /if }}">
|
||||||
|
<a href="/membre">
|
||||||
|
<div><i class="fa fa-lock"></i> Membre</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="{{ if it.tab === 'contact'}}uk-active{{ /if }}">
|
||||||
|
<a href="/contact">
|
||||||
|
<div><i class="fa fa-phone"></i> Nous Joindre</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<ul class="uk-navbar-nav uk-visible-medium">
|
||||||
|
<li class="uk-parent">
|
||||||
|
<div class="uk-navbar-brand"><a href="https://www.facebook.com/SportsPhenixMtl"><i class="fa fa-facebook-square"></i></a></div>
|
||||||
|
</li>
|
||||||
|
<li class="{{ if tab === 'home'}}uk-active{{ /if }}"><a href="/"><i class="fa fa-home"></i> Accueil </a></li>
|
||||||
|
<li class="{{ if tab === 'nouvelles'}}uk-active{{ /if }}"><a href="/nouvelles"><i class="fa fa-newspaper-o"></i> Nouvelles</a></li>
|
||||||
|
<li class="{{ if it.tab === 'calendrier'}}uk-active{{ /if }}"><a href="/calendrier"><i class="fa fa-calendar"></i> Calendrier</a></li>
|
||||||
|
<li class="{{ if it.tab === 'reglement'}}uk-active{{ /if }}"><a href="/reglement"><i class="fa fa-legal"></i> Règlement</a></li>
|
||||||
|
<li class="{{ if it.tab === 'membre'}}uk-active{{ /if }}"><a href="/membre"><i class="fa fa-lock"></i> Membre</a></li>
|
||||||
|
<li class="{{ if it.tab === 'contact'}}uk-active{{ /if }}"><a href="/contact"><i class="fa fa-phone"></i> Nous Joindre</a></li>
|
||||||
|
</ul>
|
||||||
|
<ul class="uk-navbar-nav uk-visible-small">
|
||||||
|
<li class="uk-parent">
|
||||||
|
<div class="uk-navbar-brand"><a href="https://www.facebook.com/SportsPhenixMtl"><i class="fa fa-facebook-square"></i></a></div>
|
||||||
|
</li>
|
||||||
|
<li data-uk-dropdown="" aria-expanded="" class="uk-parent"><a><i class="fa fa-bars"></i> Menu</a>
|
||||||
|
<div class="uk-dropdown">
|
||||||
|
<ul class="uk-nav uk-nav-navbar uk-dropdown-navbar">
|
||||||
|
<li class="uk-active"><a href="/"><i class="fa fa-home"></i> Accueil</a></li>
|
||||||
|
<li class=""><a href="/nouvelles"><i class="fa fa-newspaper-o"></i> Nouvelles</a></li>
|
||||||
|
<li class=""><a href="/calendrier"><i class="fa fa-calendar"></i> Calendrier</a></li>
|
||||||
|
<li class=""><a href="/reglement"><i class="fa fa-legal"></i> Règlement</a></li>
|
||||||
|
<li class=""><a href="/membre"><i class="fa fa-lock"></i> Membre</a></li>
|
||||||
|
<li class=""><a href="/contact"><i class="fa fa-phone"></i> Nous Joindre</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
{{ content }}
|
||||||
|
|
||||||
|
<footer class="uk-grid ph-footer" style="padding: 40px;">
|
||||||
|
<div class="uk-container uk-container-center uk-text-center">
|
||||||
|
<div class="uk-panel"><span class="uk-hidden-small">Ligue de balle les Phénix... pour le plaisir de jouer!</span>
|
||||||
|
<h4 class="uk-visible-small">Ligue de balle les Phénix</h4>
|
||||||
|
</div>
|
||||||
|
<ul class="uk-subnav uk-subnav-line uk-flex-center">
|
||||||
|
<li><a href="mailto:sportsphenixmtl@gmail.com">sportsphenixmtl@gmail.com</a></li>
|
||||||
|
</ul>
|
||||||
|
<h1><a href="https://www.facebook.com/SportsPhenixMtl"><i class="fa fa-facebook-square"></i></a></h1>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
|
||||||
|
{{ layout "templates/container.vto" }}
|
||||||
|
<script type="module" src="scripts/little-calendar.js"></script>
|
||||||
|
|
||||||
|
<div class="uk-grid">
|
||||||
|
<div class="uk-large-1-3 uk-medium-2-3 uk-container-center">
|
||||||
|
<div style="height:300px; width: 300px; background-size: 300px; background-image: url(images/logosansfond.JPG);" class="uk-cover-background uk-container-center uk-margin-left uk-margin-top"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="uk-margin-top uk-margin-bottom uk-grid">
|
||||||
|
<div class="uk-width-large-3-5 uk-width-medium-4-5 uk-width-small-1-1 uk-container-center">
|
||||||
|
<div class="uk-grid uk-visible-large uk-grid-match">
|
||||||
|
<div class="uk-width-large-1-3 uk-width-medium-1-3">
|
||||||
|
<div class="uk-panel uk-panel-box">
|
||||||
|
<div class="uk-panel-badge uk-badge">
|
||||||
|
<i class="fa fa-newspaper-o" style="font-size: 1.7em;"></i>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{{ include "templates/includes/home-news.vto" }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="uk-width-large-1-3 uk-width-medium-1-3">
|
||||||
|
<div class="uk-panel uk-panel-box">
|
||||||
|
<div class="uk-panel-badge uk-badge"><i class="fa fa-calendar" style="font-size: 1.7em;"></i></div>
|
||||||
|
<h3 class="uk-panel-title"><a href="#/calendrier" class="uk-link-muted">Calendrier</a></h3>
|
||||||
|
<div id="large-mithril-container"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="uk-width-large-1-3 uk-width-medium-1-3">
|
||||||
|
<div class="uk-panel uk-panel-box">
|
||||||
|
<div class="uk-panel-badge uk-badge"><i class="fa fa-map-o" style="font-size: 1.7em;"></i></div>
|
||||||
|
<h3 class="uk-panel-title">Parc Walter-Stewart</h3>
|
||||||
|
{{ include "templates/includes/walter-stewart-map.vto" }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- start -->
|
||||||
|
<div class="uk-visible-medium">
|
||||||
|
<div class="uk-grid uk-grid-match">
|
||||||
|
<div class="uk-width-medium-1-2">
|
||||||
|
<div class="uk-panel uk-panel-box">
|
||||||
|
<div class="uk-panel-badge uk-badge"><i class="fa fa-newspaper-o" style="font-size: 1.7em;"></i></div>
|
||||||
|
<div>
|
||||||
|
{{ include "templates/includes/home-news.vto" }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="uk-width-medium-1-2">
|
||||||
|
<div class="uk-panel uk-panel-box">
|
||||||
|
<div class="uk-panel-badge uk-badge"><i class="fa fa-calendar" style="font-size: 1.7em;"></i></div>
|
||||||
|
<h3 class="uk-panel-title"><a href="#/calendrier" class="uk-link-muted">Calendrier</a></h3>
|
||||||
|
<div id="medium-mithril-container"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="uk-grid">
|
||||||
|
<div class="uk-width-medium-1-1">
|
||||||
|
<div class="uk-panel uk-panel-box">
|
||||||
|
<div class="uk-panel-badge uk-badge"><i class="fa fa-map-o" style="font-size: 1.7em;"></i></div>
|
||||||
|
<h3 class="uk-panel-title">Parc Walter-Stewart</h3>
|
||||||
|
{{ include "templates/includes/walter-stewart-map.vto" }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<!-- end -->
|
||||||
|
<div class="uk-visible-small">
|
||||||
|
<div class="uk-grid">
|
||||||
|
<div class="uk-width-small-1-1">
|
||||||
|
<div class="uk-panel uk-panel-box">
|
||||||
|
<div class="uk-panel-badge uk-badge"><i class="fa fa-newspaper-o" style="font-size: 1.7em;"></i></div>
|
||||||
|
<div>
|
||||||
|
{{ include "templates/includes/home-news.vto" }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="uk-grid">
|
||||||
|
<div class="uk-width-small-1-1">
|
||||||
|
<div class="uk-panel uk-panel-box">
|
||||||
|
<div class="uk-panel-badge uk-badge"><i class="fa fa-calendar" style="font-size: 1.7em;"></i></div>
|
||||||
|
<h3 class="uk-panel-title"><a href="#/calendrier" class="uk-link-muted">Calendrier</a></h3>
|
||||||
|
<div id="small-mithril-container"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="uk-grid">
|
||||||
|
<div class="uk-width-small-1-1">
|
||||||
|
<div class="uk-panel uk-panel-box">
|
||||||
|
<div class="uk-panel-badge uk-badge"><i class="fa fa-map-o" style="font-size: 1.7em;"></i></div>
|
||||||
|
<h3 class="uk-panel-title">Parc Walter-Stewart</h3>
|
||||||
|
{{ include "templates/includes/walter-stewart-map.vto" }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{ /layout }}
|
||||||
Loaded 100 of 111 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user