71 Commits
Author SHA1 Message Date
didier 123481d748 mdldfs 2026-08-08 09:17:05 -04:00
didier 11031eb5a3 added new thing 2026-08-08 09:13:46 -04:00
didier e5850a448b feat: removed gitlab ci 2026-07-18 09:22:22 -04:00
didier 7162be1f49 feat: removed gitlab-ci 2026-07-17 09:23:42 -04:00
didier 3413c4f94a feat: foo 2026-07-13 21:07:08 -04:00
didier 9d741b8516 feat: fixed flake 2026-07-13 20:27:00 -04:00
didier bb13614d1e feat: fixed flake 2026-07-13 20:20:33 -04:00
didier 29ed46aa7f feat: moved to C# thanks to deepseek 2026-07-12 21:01:09 -04:00
didier ab81a1c4be feat: added script to create 2026 schedule 2026-05-04 08:48:28 -04:00
didier 4399d1b434 fix: changed passeord 2026-05-01 15:13:30 -04:00
didier 428842affe added new news 2026-03-09 07:20:41 -04:00
didier 514bb0ac47 Added shome shit to invert who is home and away. 2025-05-28 14:23:38 -04:00
didier 3bc18baa30 pour le respect 2025-05-26 21:11:04 -04:00
didier 3adcdcbd78 pour le respect 2025-05-26 20:57:14 -04:00
didier e6675c0d90 fixed game order 2025-04-27 21:15:27 -04:00
didier fb84c8229c updated deploy script 2025-04-25 10:01:05 -04:00
didier 0858a3f1e7 updated deno.lock 2025-04-25 09:57:04 -04:00
didier ce399ce258 Fixed couple of bugs 2025-04-25 09:53:48 -04:00
didier 5a5cc814c3 Revert "added didider stuff"
This reverts commit 2948e5dabc.
2024-10-18 08:54:17 -04:00
didier 2948e5dabc added didider stuff 2024-10-17 18:39:40 -04:00
didier 1e874b790d boom 2024-07-02 20:03:47 -04:00
didier 8d883b9416 fixed gitlab-ci 2024-07-02 19:55:25 -04:00
didier 74ac5b5ef7 fixed gitlab-ci 2024-07-02 19:53:50 -04:00
didier 7bee9526fc Merge branch 'deno' into 'master'
Deno

See merge request ballephenix/website!2
2024-07-02 23:51:24 +00:00
didier 95a8ed5ffa added the worst kind of security ever 2024-07-02 19:43:24 -04:00
didier cd45813228 fixed type 2024-07-02 19:22:51 -04:00
didier a31390d55a prepared for migration 2024-07-02 19:01:57 -04:00
didier.amyot df26a3fe96 Added new website 2024-07-02 18:36:05 -04:00
didier.amyot 293b7727e2 deleted old website. fuck it. 2024-07-02 18:35:00 -04:00
didier ce4f47b79c added more scores 2024-06-29 19:09:02 -04:00
didier e874c125ea boom 2024-06-19 07:46:42 -04:00
didier amyot ae180fc3c8 added results 2024-05-13 20:49:21 -04:00
didier amyot 65c9da0a1d added new season 2024-05-13 20:32:31 -04:00
didier amyot 32d5666c4e fixed little bug. 2023-08-27 12:48:55 +00:00
Cameron Letourneau f853ccd820 Update resultats2023.yaml 2023-08-25 12:30:24 +00:00
Cameron Letourneau 297aa5c3b0 Update resultats2023.yaml 2023-08-18 14:58:02 +00:00
Cameron Letourneau da556a5d25 Update resultats2023.yaml 2023-08-18 14:33:30 +00:00
didier amyot ac05980fad modified jour-de-la-balle 2023-08-07 18:27:14 -04:00
didier amyot 593ed01669 updated jour-de-la-balle 2023-08-05 10:58:41 -04:00
didier amyot 8393749900 added one game for la fete de la balle 2023-08-01 10:39:50 -04:00
Cameron Letourneau 12676278c1 Update resultats2023.yaml 2023-07-28 13:46:36 +00:00
didier amyot 016d629aed adeed new game 2023-07-25 10:29:18 -04:00
didier amyot 1ebf5dc2d0 Added new scores 2023-07-21 09:28:03 -04:00
Cameron Letourneau ad5f3c0a67 Update resultats2023.yaml 2023-07-14 13:28:00 +00:00
didier amyot 89899d82b8 forgotten to add file 2023-07-12 16:57:13 -04:00
didier amyot 3c505d7d5e fixed small bug 2023-07-12 16:54:49 -04:00
Cameron Letourneau 250fe56322 Update pour article 2023 2023-07-09 16:22:12 +00:00
Cameron Letourneau 958ccaf246 Add new file 2023-07-09 16:16:03 +00:00
Cameron Letourneau c6cba8ef62 Update resultats2023.yaml 2023-07-08 17:09:48 +00:00
Cameron Letourneau 87d6b9667a Update resultats2023.yaml 2023-06-30 13:59:53 +00:00
Cameron Letourneau 19fa311496 Update resultats2023.yaml 2023-06-24 13:15:38 +00:00
Cameron Letourneau e19a7c5c68 Update resultats2023.yaml 2023-06-23 19:53:20 +00:00
Cameron Letourneau a1bec8a62b Update resultats2023.yaml 2023-06-09 09:53:38 +00:00
Cameron Letourneau 795d9d4099 Update resultats2023.yaml 2023-06-02 23:56:25 +00:00
Cameron Letourneau cc1dd3d652 Merge branch 'master' into 'master'
Update file resultats2023.yaml

See merge request ballephenix/website!1
2023-06-02 23:54:56 +00:00
Cameron Letourneau 51eb6d1ebb Update file resultats2023.yaml 2023-06-02 23:09:06 +00:00
didier amyot cf2de58a77 added updated schedule 2023-06-01 13:19:06 -04:00
didier amyot 05897534c8 Updated games 2023-06-01 13:07:17 -04:00
didier amyot c472aac40b fixed time in 2023 result file 2023-05-22 11:41:36 -04:00
didier amyot 257fc4e630 changed results and schedule of 2023 season. 2023-05-22 11:19:35 -04:00
didier amyot 978d4dd6b1 fixed plurialization typo from 'gri' to 'gris' 2023-05-02 14:37:19 -04:00
didier amyot e58239e6b9 Rename yaml file extension from yml to yaml to make it work with build system 2023-05-02 14:32:39 -04:00
didier amyot f68b91602d added 2023 schedule 2023-05-02 13:45:14 -04:00
didier amyot bdb6b24da7 nsdds 2022-07-19 18:19:58 -04:00
didier amyot e42d42189c added more games 2022-07-04 20:32:20 -04:00
didier amyot 4aef8a9e84 no rain tomorrow 2022-06-29 17:43:15 -04:00
didier amyot e5916dcd21 calisse 2022-06-28 20:08:32 -04:00
didier amyot cf23f25af7 ostie d'or 2022-06-28 20:01:41 -04:00
didier amyot 9f8386af74 added more results 2022-06-11 18:45:12 -04:00
didier amyot 10950b4f50 fixed shit 2022-05-28 14:02:19 -04:00
didier amyot 29a7b9c078 added results 2022-05-28 13:56:08 -04:00
145 changed files with 10824 additions and 10099 deletions

No files matched your search

+1
View File
@@ -0,0 +1 @@
use flake
+11 -7
View File
@@ -1,8 +1,12 @@
node_modules/* # Nix build result
lib/*
css/*
/api/resultats.json
/index.html
/main-built.js
/api
result result
# .NET
bin/
obj/
*.user
*.suo
*.db
publish/
.direnv/
-29
View File
@@ -1,29 +0,0 @@
image: "node:12.22.1"
before_script:
# install ssh-agent
- 'which npm || ( apt-get update -y && apt-get install node -y )'
pages:
stage: deploy
cache:
paths:
- node_modules/
- lib/
script:
- export SALT="salt_and_pepper"
- export KEY="qwerty"
- export PLAYER_LIST_LOCATION="//ballephenix.gitlab.io/private/players.spritz.js"
- npm install
- node_modules/.bin/gulp prod
- node_modules/.bin/r.js -o build.js
- rm -rf node_modules .public public
- mkdir .public
- cp -r * .public
- cp -r .well-known .public # for let's encrypt
- mv .public public
artifacts:
paths:
- public
only:
- master
-1
View File
@@ -1 +0,0 @@
4.4.3
@@ -1 +0,0 @@
4VCd-x0J9qsZgGuJ-c3Wu_KpOphzhjXfVhEyFGBCQ-c.x_X1OQlfsQAsCyXJHKuPmU8SV-1VK_3KvYbbl7KY81A
@@ -1 +0,0 @@
o16F72Bt8czXRTmH9wMZn_OiOinya_kW16yTtSj0bEk.x_X1OQlfsQAsCyXJHKuPmU8SV-1VK_3KvYbbl7KY81A
@@ -1 +0,0 @@
umfDF6CvoJs42QhTKeBgEe12M-iVjbMHwxdEoweV6G8.x_X1OQlfsQAsCyXJHKuPmU8SV-1VK_3KvYbbl7KY81A
+74
View File
@@ -0,0 +1,74 @@
using Microsoft.AspNetCore.Mvc;
using Phenix.Models;
using Phenix.Services;
namespace Phenix.Controllers;
public record CreateGameRequest(
string Date, string Time, string Home, string Away,
int? HomeScore = null, int? AwayScore = null,
bool Practice = false, bool Rain = false
);
[Route("/api")]
public class ApiController : Controller
{
private readonly IGameService _games;
public ApiController(IGameService games)
{
_games = games;
}
[HttpGet("results/{year}.json")]
public async Task<IActionResult> ResultsJson(int year)
{
var games = await _games.GetAllGames();
var results = games
.Where(g => g.Year == year)
.Select(g => new Dictionary<string, object?>
{
["id"] = g.Id,
["date"] = g.Date,
["time"] = g.Time,
["home"] = g.Home,
["away"] = g.Away,
["year"] = g.Year,
[g.Home] = g.HomeScore,
[g.Away] = g.AwayScore,
["practice"] = g.Practice,
["rain"] = g.Rain,
});
return Json(results);
}
[HttpGet("available-years.json")]
public async Task<IActionResult> AvailableYearsJson()
{
var games = await _games.GetAllGames();
var years = games.Select(g => g.Year).Distinct().OrderByDescending(y => y);
return Json(years);
}
[HttpPost("games")]
public async Task<IActionResult> CreateGame([FromBody] CreateGameRequest req)
{
var (game, error) = await _games.CreateNewGame(req.Date, req.Time, req.Home, req.Away);
if (game is null)
return error switch
{
"game already exists at this date/time" => Conflict(new { error }),
_ => BadRequest(new { error }),
};
await _games.UpdateGame(game.Id, req.HomeScore, req.AwayScore, req.Rain, req.Practice);
return Created($"/api/games/{game.Id}", game);
}
[HttpDelete("games")]
public async Task<IActionResult> ClearGames()
{
await _games.ClearAllGames();
return NoContent();
}
}
+22
View File
@@ -0,0 +1,22 @@
using Microsoft.AspNetCore.Mvc;
using Phenix.Services;
namespace Phenix.Controllers;
public class HomeController : Controller
{
[HttpGet("/")]
public IActionResult Index() => View();
[HttpGet("/calendrier")]
public IActionResult Calendrier() => View();
[HttpGet("/nouvelles")]
public IActionResult Nouvelles() => View();
[HttpGet("/contact")]
public IActionResult Contact() => View();
[HttpGet("/reglement")]
public IActionResult Reglement() => View();
}
+141
View File
@@ -0,0 +1,141 @@
using Microsoft.AspNetCore.Mvc;
using Phenix.Services;
namespace Phenix.Controllers;
[Route("/membre")]
public class MembreController : Controller
{
private readonly IGameService _games;
private readonly LoginService _login;
private const string SessionCookie = "phenix-session";
private const string SessionSignCookie = "phenix-session-sign";
public MembreController(IGameService games, LoginService login)
{
_games = games;
_login = login;
}
[HttpGet("")]
public IActionResult Index()
{
ViewBag.IsLoggedIn = IsLoggedIn();
return View();
}
[HttpGet("/login")]
public IActionResult Login(string? username, string? password)
{
if (username is null || password is null || !_login.ValidateCredentials(username, password))
return StatusCode(403);
var expiresAt = DateTimeOffset.UtcNow.AddDays(90).ToUnixTimeSeconds();
Response.Cookies.Append(SessionCookie, expiresAt.ToString(), new CookieOptions
{
MaxAge = TimeSpan.FromDays(90),
});
Response.Cookies.Append(SessionSignCookie, _login.SignSession(expiresAt), new CookieOptions
{
MaxAge = TimeSpan.FromDays(90),
});
return Redirect("/membre/games-editor/today");
}
[HttpGet("games-editor/today")]
public async Task<IActionResult> GamesEditorToday()
{
if (!IsLoggedIn()) return Redirect("/membre");
var games = await _games.GetAllGames();
var today = DateOnly.FromDateTime(TimeZoneInfo.ConvertTime(
DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("America/New_York")));
var lastGameDay = games
.Where(g => DateOnly.Parse(g.Date) <= today)
.Select(g => g.Date)
.OrderByDescending(d => d)
.FirstOrDefault();
ViewBag.SelectedYear = (int?)null;
ViewBag.IsToday = true;
ViewBag.Years = games.Select(g => g.Year).Distinct().OrderByDescending(y => y).ToList();
ViewBag.Games = games.Where(g => g.Date == lastGameDay).ToList();
return PartialView("GamesEditor");
}
[HttpGet("games-editor/{year:int}")]
public async Task<IActionResult> GamesEditorByYear(int year)
{
if (!IsLoggedIn()) return Redirect("/membre");
var games = await _games.GetAllGames();
ViewBag.SelectedYear = year;
ViewBag.IsToday = false;
ViewBag.Years = games.Select(g => g.Year).Distinct().OrderByDescending(y => y).ToList();
ViewBag.Games = games.Where(g => g.Year == year).ToList();
return PartialView("GamesEditor");
}
[HttpGet("new-game-editor")]
public IActionResult NewGameEditor()
{
if (!IsLoggedIn()) return Redirect("/membre");
return PartialView();
}
[HttpPost("new-game")]
public async Task<IActionResult> NewGame(string gameDate, string gameTime, string homeTeam, string awayTeam)
{
if (!IsLoggedIn()) return Redirect("/membre");
var (game, error) = await _games.CreateNewGame(gameDate, gameTime, homeTeam, awayTeam);
if (error != "")
{
ViewBag.Error = error;
return StatusCode(500, PartialView("NewGameError"));
}
Response.Headers["game-id"] = game!.Id;
return PartialView("SingleGameEditor", game);
}
[HttpDelete("games/{gameId}")]
public async Task<IActionResult> DeleteGame(string gameId)
{
if (!IsLoggedIn()) return Redirect("/membre");
var ok = await _games.DeleteGameById(gameId);
return Content(ok ? "true" : "false");
}
[HttpPost("games/{gameId}")]
public async Task<IActionResult> UpdateGame(string gameId, int? awayScore, int? homeScore, string? gameType)
{
if (!IsLoggedIn()) return Redirect("/membre");
var success = await _games.UpdateGame(gameId, homeScore, awayScore,
rain: gameType == "rain", practice: gameType == "practice");
return Content(success
? "<i class=\"fa fa-floppy-o\" aria-hidden=\"true\"></i>"
: "<i class=\"fa fa-exclamation-triangle\" aria-hidden=\"true\"></i>");
}
[HttpPost("games/{gameId}/switch")]
public async Task<IActionResult> SwitchVisitors(string gameId)
{
if (!IsLoggedIn()) return Redirect("/membre");
var success = await _games.SwitchVisitors(gameId);
if (!success)
return Content("<i class=\"fa fa-exclamation-triangle\" aria-hidden=\"true\"></i>");
var game = await _games.GetGameById(gameId);
Response.Headers["game-id"] = gameId;
return PartialView("SingleGameEditor", game);
}
private bool IsLoggedIn()
{
Request.Cookies.TryGetValue(SessionCookie, out var expires);
Request.Cookies.TryGetValue(SessionSignCookie, out var sig);
return _login.VerifySession(expires, sig);
}
}
-2
View File
@@ -1,2 +0,0 @@
dev:
node_modules/.bin/gulp dev
+15
View File
@@ -0,0 +1,15 @@
namespace Phenix.Models;
public class Game
{
public string Id { get; set; } = "";
public string Date { get; set; } = "";
public string Time { get; set; } = "";
public string Home { get; set; } = "";
public string Away { get; set; } = "";
public int Year { get; set; }
public int? HomeScore { get; set; }
public int? AwayScore { get; set; }
public bool Practice { get; set; }
public bool Rain { get; set; }
}
+8
View File
@@ -0,0 +1,8 @@
namespace Phenix.Models;
public class TeamSelectorModel
{
public string Name { get; set; } = "";
public string SelectedTeam { get; set; } = "";
public bool IsDisabled { get; set; }
}
+15
View File
@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<RootNamespace>Phenix</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.0" />
<PackageReference Include="Npgsql" Version="8.0.0" />
</ItemGroup>
</Project>
+47
View File
@@ -0,0 +1,47 @@
using Phenix.Services;
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
Args = args,
WebRootPath = "static",
});
builder.Services
.AddControllersWithViews()
.AddRazorOptions(o =>
{
o.ViewLocationFormats.Clear();
o.ViewLocationFormats.Add("/Views/{1}/{0}.cshtml");
o.ViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
o.ViewLocationFormats.Add("/Views/{0}.cshtml");
});
builder.Services.AddSingleton<IGameService>(sp =>
{
var config = sp.GetRequiredService<IConfiguration>();
var connStr = config.GetConnectionString("Default")
?? "Data Source=phenix.db";
var provider = config["DatabaseProvider"] ?? "Sqlite";
IGameService svc = provider.ToLowerInvariant() switch
{
"postgres" or "postgresql" => new PostgresGameService(connStr),
_ => new SqliteGameService(connStr),
};
svc.Init().GetAwaiter().GetResult();
return svc;
});
builder.Services.AddSingleton(sp =>
{
var key = sp.GetRequiredService<IConfiguration>()["SessionKey"] ?? "dev-only";
return new LoginService(key);
});
var app = builder.Build();
app.UseStaticFiles();
app.MapControllers();
app.Run();
+27 -30
View File
@@ -1,42 +1,39 @@
# Site Web de Balle Phénix # Site Web de [Balle Phénix](http://ballephenix.com)
![Image Alt](https://gitlab.com/ballephenix/website/raw/master/images/phenix_logo.png)
## Stack
## introduction - **ASP.NET Core 9** — Razor Views (`Views/*.cshtml`), contrôleurs dans `Controllers/`
- **SQLite** par défaut (`phenix.db`), Postgres au choix via `DatabaseProvider`
- **Nix** — build et déploiement via `flake.nix` (service NixOS, domaine `ballephenix.com`)
- Les assets statiques vivent dans `static/` et sont servis par `app.config.WebRootPath = "static"`
Vous trouverez le code source du site web pour les Phénix ici. Le site web ## Développement
en lui-même est accessible au http://ballephenix.com ou au
https://ballephenix.gitlab.io/website/.
### Structure du site web. ```shell
dotnet run
```
Premièrement, mille excuses pour mes choix hétéroclites. J'ai décidé d'explorer Base de données SQLite par défaut (`phenix.db`). La config se règle dans `appsettings.json`
de nouvels technologies avec ce projet. En conséquence, le code est un peu (ou par variables d'environnement en prod, voir le module NixOS dans `flake.nix`).
difficile à comprendre à première vue mais il est __tellement__ plus cool!
Pour peupler une instance locale depuis la prod:
#### Choix ```shell
python dev/populate-db/populate.py --source https://ballephenix.com --target http://localhost:5000 --force
```
* mithril.js comme framework dans le fureteur ## Déploiement
* require.js pour les dépendances
* uikit avec sass comme framework css
* gulp pour la compilation
* gitlab pour le deployment
--- Le build et le service NixOS sont décrits dans `flake.nix` (`packages.website` et
`nixosModules.x86_64-linux`). Le module déploie le binaire `Phenix` avec `static/`
et une base de données dans `/var/lib/phenix`.
# English Version ## Outils d'administration
All the source code is in english. The source code is for a static web - `debut_saison.ts` — script Deno qui crée le calendrier de la saison: se connecte
side for The softball league 'Balle Phénix'. via `GET /login` puis POST chaque partie à `/membre/new-game`. Mettre à jour les
identifiants en haut du fichier et les dates avant de le lancer.
## How to build ```shell
deno run -A debut_saison.ts
$ npm install ```
$ node_modules/.bin/gulp help
# How it is made
* mithril.js as client side framework
* uikit as css framework
* coffee and love
+15
View File
@@ -0,0 +1,15 @@
using Phenix.Models;
namespace Phenix.Services;
public interface IGameService
{
Task Init();
Task<List<Game>> GetAllGames();
Task<Game?> GetGameById(string id);
Task<(Game? Game, string Error)> CreateNewGame(string date, string time, string home, string away);
Task<bool> UpdateGame(string id, int? homeScore, int? awayScore, bool? rain, bool? practice);
Task<bool> DeleteGameById(string id);
Task<bool> SwitchVisitors(string id);
Task ClearAllGames();
}
+67
View File
@@ -0,0 +1,67 @@
using System.Security.Cryptography;
using System.Text;
namespace Phenix.Services;
public class LoginService
{
private readonly Dictionary<string, string> _users;
private readonly string _sessionKey;
private static readonly (string User, string Hash)[] OfficialUsers =
[
("marqueur", "34373780cc542a1eddb6a08488ec149323b94d66025421acd98ffc20eb5055a0:6f2fa05777d45a2da9db79b7fd11e3bc69eb1807642ccb53d41a0b9eb71a3311"),
("comite", "8649feff48a50f53448e59ce480db97b5549eef1d92c886c49b5a14ee22648e5:a0017b879c8834d2f34938e7a4fa3f4c7be8f70545b9bb22a28cf56ab2eb26d9"),
];
public LoginService(string sessionKey)
{
_users = OfficialUsers.ToDictionary(x => x.User, x => x.Hash);
_sessionKey = sessionKey;
}
public bool ValidateCredentials(string username, string password)
{
if (!_users.TryGetValue(username, out var hashWithSalt))
return false;
return VerifyPassword(password, hashWithSalt);
}
public string SignSession(long expiresAt)
{
return ShittyHmac(expiresAt.ToString(), _sessionKey);
}
public bool VerifySession(string? expiresAt, string? signature)
{
if (expiresAt is null || signature is null)
return false;
if (!long.TryParse(expiresAt, out var ts))
return false;
if (signature != ShittyHmac(ts.ToString(), _sessionKey))
return false;
return DateTimeOffset.UtcNow.ToUnixTimeSeconds() < ts;
}
private static bool VerifyPassword(string password, string hashWithSalt)
{
var parts = hashWithSalt.Split(':');
if (parts.Length != 2) return false;
var salt = parts[0];
var expected = parts[1];
return ShittyHmac(password, salt) == expected;
}
private static string HashMessage(string message)
{
var bytes = SHA256.HashData(Encoding.UTF8.GetBytes(message));
return Convert.ToHexStringLower(bytes);
}
private static string ShittyHmac(string message, string salt)
{
var h1 = HashMessage(message + salt);
var h2 = HashMessage(salt + message);
return HashMessage(h1 + h2);
}
}
+209
View File
@@ -0,0 +1,209 @@
using System.Data.Common;
using Npgsql;
using Phenix.Models;
namespace Phenix.Services;
public class PostgresGameService : IGameService
{
private readonly string _connectionString;
public PostgresGameService(string connectionString)
{
_connectionString = connectionString;
}
public async Task Init()
{
await using var conn = new NpgsqlConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = """
CREATE TABLE IF NOT EXISTS games (
id TEXT PRIMARY KEY,
date TEXT NOT NULL,
time TEXT NOT NULL,
home TEXT NOT NULL,
away TEXT NOT NULL,
year INTEGER NOT NULL,
home_score INTEGER,
away_score INTEGER,
practice BOOLEAN NOT NULL DEFAULT FALSE,
rain BOOLEAN NOT NULL DEFAULT FALSE,
UNIQUE(date, time)
)
""";
await cmd.ExecuteNonQueryAsync();
}
public async Task<List<Game>> GetAllGames()
{
var games = new List<Game>();
await using var conn = new NpgsqlConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM games ORDER BY date, time";
await using var reader = await cmd.ExecuteReaderAsync();
while (await reader.ReadAsync())
games.Add(ReadGame(reader));
return games;
}
public async Task<Game?> GetGameById(string id)
{
await using var conn = new NpgsqlConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM games WHERE id = @id";
cmd.Parameters.AddWithValue("@id", id);
await using var reader = await cmd.ExecuteReaderAsync();
if (await reader.ReadAsync())
return ReadGame(reader);
return null;
}
public async Task<(Game? Game, string Error)> CreateNewGame(string date, string time, string home, string away)
{
date = CleanDate(date);
time = CleanTime(time);
if (!DateOnly.TryParse(date, out _))
return (null, $"Invalide date format {date}");
if (!TimeOnly.TryParse(time, out _))
return (null, $"Invalide time format {time}");
if (!ValidTeams.Contains(away))
return (null, $"Invalide away format {away}");
if (!ValidTeams.Contains(home))
return (null, $"Invalide home format {home}");
if (home == away)
return (null, $"Home and away teams must be different (received {home} for both)");
var year = DateOnly.Parse(date).Year;
var game = new Game
{
Id = Guid.NewGuid().ToString(),
Date = date,
Time = time,
Home = home,
Away = away,
Year = year,
};
try
{
await using var conn = new NpgsqlConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = """
INSERT INTO games (id, date, time, home, away, year)
VALUES (@id, @date, @time, @home, @away, @year)
""";
cmd.Parameters.AddWithValue("@id", game.Id);
cmd.Parameters.AddWithValue("@date", game.Date);
cmd.Parameters.AddWithValue("@time", game.Time);
cmd.Parameters.AddWithValue("@home", game.Home);
cmd.Parameters.AddWithValue("@away", game.Away);
cmd.Parameters.AddWithValue("@year", game.Year);
await cmd.ExecuteNonQueryAsync();
}
catch (PostgresException ex) when (ex.SqlState == "23505")
{
return (null, "game already exists at this date/time");
}
return (game, "");
}
public async Task<bool> UpdateGame(string id, int? homeScore, int? awayScore, bool? rain, bool? practice)
{
await using var conn = new NpgsqlConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = """
UPDATE games SET
home_score = COALESCE(@homeScore, home_score),
away_score = COALESCE(@awayScore, away_score),
rain = COALESCE(@rain, rain),
practice = COALESCE(@practice, practice)
WHERE id = @id
""";
cmd.Parameters.AddWithValue("@id", id);
cmd.Parameters.AddWithValue("@homeScore", (object?)homeScore ?? DBNull.Value);
cmd.Parameters.AddWithValue("@awayScore", (object?)awayScore ?? DBNull.Value);
cmd.Parameters.AddWithValue("@rain", rain ?? (object?)DBNull.Value);
cmd.Parameters.AddWithValue("@practice", practice ?? (object?)DBNull.Value);
return await cmd.ExecuteNonQueryAsync() > 0;
}
public async Task<bool> DeleteGameById(string id)
{
await using var conn = new NpgsqlConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = "DELETE FROM games WHERE id = @id";
cmd.Parameters.AddWithValue("@id", id);
return await cmd.ExecuteNonQueryAsync() > 0;
}
public async Task ClearAllGames()
{
await using var conn = new NpgsqlConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = "DELETE FROM games";
await cmd.ExecuteNonQueryAsync();
}
public async Task<bool> SwitchVisitors(string id)
{
var game = await GetGameById(id);
if (game is null) return false;
await using var conn = new NpgsqlConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = """
UPDATE games SET home = @home, away = @away,
home_score = @homeScore, away_score = @awayScore
WHERE id = @id
""";
cmd.Parameters.AddWithValue("@id", id);
cmd.Parameters.AddWithValue("@home", game.Away);
cmd.Parameters.AddWithValue("@away", game.Home);
cmd.Parameters.AddWithValue("@homeScore", (object?)game.AwayScore ?? DBNull.Value);
cmd.Parameters.AddWithValue("@awayScore", (object?)game.HomeScore ?? DBNull.Value);
return await cmd.ExecuteNonQueryAsync() > 0;
}
private static Game ReadGame(DbDataReader r) => new()
{
Id = r.GetString(r.GetOrdinal("id")),
Date = r.GetString(r.GetOrdinal("date")),
Time = r.GetString(r.GetOrdinal("time")),
Home = r.GetString(r.GetOrdinal("home")),
Away = r.GetString(r.GetOrdinal("away")),
Year = r.GetInt32(r.GetOrdinal("year")),
HomeScore = r.IsDBNull(r.GetOrdinal("home_score")) ? null : r.GetInt32(r.GetOrdinal("home_score")),
AwayScore = r.IsDBNull(r.GetOrdinal("away_score")) ? null : r.GetInt32(r.GetOrdinal("away_score")),
Practice = r.GetBoolean(r.GetOrdinal("practice")),
Rain = r.GetBoolean(r.GetOrdinal("rain")),
};
private static readonly string[] ValidTeams =
["jaune", "rouge", "bleu", "gris", "vert", "noir", "orange", "mauve"];
private static string CleanDate(string raw)
{
var parts = raw.Split('-');
if (parts.Length != 3) return raw;
return $"{parts[0]}-{parts[1].PadLeft(2, '0')}-{parts[2].PadLeft(2, '0')}";
}
private static string CleanTime(string raw)
{
var sep = raw.Contains('h') ? 'h' : ':';
var parts = raw.Split(sep);
if (parts.Length != 2) return raw;
return $"{parts[0].PadLeft(2, '0')}:{parts[1].PadLeft(2, '0')}";
}
}
+209
View File
@@ -0,0 +1,209 @@
using System.Data.Common;
using Microsoft.Data.Sqlite;
using Phenix.Models;
namespace Phenix.Services;
public class SqliteGameService : IGameService
{
private readonly string _connectionString;
public SqliteGameService(string connectionString)
{
_connectionString = connectionString;
}
public async Task Init()
{
await using var conn = new SqliteConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = """
CREATE TABLE IF NOT EXISTS games (
id TEXT PRIMARY KEY,
date TEXT NOT NULL,
time TEXT NOT NULL,
home TEXT NOT NULL,
away TEXT NOT NULL,
year INTEGER NOT NULL,
home_score INTEGER,
away_score INTEGER,
practice INTEGER NOT NULL DEFAULT 0,
rain INTEGER NOT NULL DEFAULT 0,
UNIQUE(date, time)
)
""";
await cmd.ExecuteNonQueryAsync();
}
public async Task<List<Game>> GetAllGames()
{
var games = new List<Game>();
await using var conn = new SqliteConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM games ORDER BY date, time";
await using var reader = await cmd.ExecuteReaderAsync();
while (await reader.ReadAsync())
games.Add(ReadGame(reader));
return games;
}
public async Task<Game?> GetGameById(string id)
{
await using var conn = new SqliteConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM games WHERE id = @id";
cmd.Parameters.AddWithValue("@id", id);
await using var reader = await cmd.ExecuteReaderAsync();
if (await reader.ReadAsync())
return ReadGame(reader);
return null;
}
public async Task<(Game? Game, string Error)> CreateNewGame(string date, string time, string home, string away)
{
date = CleanDate(date);
time = CleanTime(time);
if (!DateOnly.TryParse(date, out _))
return (null, $"Invalide date format {date}");
if (!TimeOnly.TryParse(time, out _))
return (null, $"Invalide time format {time}");
if (!ValidTeams.Contains(away))
return (null, $"Invalide away format {away}");
if (!ValidTeams.Contains(home))
return (null, $"Invalide home format {home}");
if (home == away)
return (null, $"Home and away teams must be different (received {home} for both)");
var year = DateOnly.Parse(date).Year;
var game = new Game
{
Id = Guid.NewGuid().ToString(),
Date = date,
Time = time,
Home = home,
Away = away,
Year = year,
};
try
{
await using var conn = new SqliteConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = """
INSERT INTO games (id, date, time, home, away, year)
VALUES (@id, @date, @time, @home, @away, @year)
""";
cmd.Parameters.AddWithValue("@id", game.Id);
cmd.Parameters.AddWithValue("@date", game.Date);
cmd.Parameters.AddWithValue("@time", game.Time);
cmd.Parameters.AddWithValue("@home", game.Home);
cmd.Parameters.AddWithValue("@away", game.Away);
cmd.Parameters.AddWithValue("@year", game.Year);
await cmd.ExecuteNonQueryAsync();
}
catch (SqliteException ex) when (ex.SqliteErrorCode == 19)
{
return (null, "game already exists at this date/time");
}
return (game, "");
}
public async Task<bool> UpdateGame(string id, int? homeScore, int? awayScore, bool? rain, bool? practice)
{
await using var conn = new SqliteConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = """
UPDATE games SET
home_score = COALESCE(@homeScore, home_score),
away_score = COALESCE(@awayScore, away_score),
rain = COALESCE(@rain, rain),
practice = COALESCE(@practice, practice)
WHERE id = @id
""";
cmd.Parameters.AddWithValue("@id", id);
cmd.Parameters.AddWithValue("@homeScore", (object?)homeScore ?? DBNull.Value);
cmd.Parameters.AddWithValue("@awayScore", (object?)awayScore ?? DBNull.Value);
cmd.Parameters.AddWithValue("@rain", rain ?? (object?)DBNull.Value);
cmd.Parameters.AddWithValue("@practice", practice ?? (object?)DBNull.Value);
return await cmd.ExecuteNonQueryAsync() > 0;
}
public async Task<bool> DeleteGameById(string id)
{
await using var conn = new SqliteConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = "DELETE FROM games WHERE id = @id";
cmd.Parameters.AddWithValue("@id", id);
return await cmd.ExecuteNonQueryAsync() > 0;
}
public async Task ClearAllGames()
{
await using var conn = new SqliteConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = "DELETE FROM games";
await cmd.ExecuteNonQueryAsync();
}
public async Task<bool> SwitchVisitors(string id)
{
var game = await GetGameById(id);
if (game is null) return false;
await using var conn = new SqliteConnection(_connectionString);
await conn.OpenAsync();
var cmd = conn.CreateCommand();
cmd.CommandText = """
UPDATE games SET home = @home, away = @away,
home_score = @homeScore, away_score = @awayScore
WHERE id = @id
""";
cmd.Parameters.AddWithValue("@id", id);
cmd.Parameters.AddWithValue("@home", game.Away);
cmd.Parameters.AddWithValue("@away", game.Home);
cmd.Parameters.AddWithValue("@homeScore", (object?)game.AwayScore ?? DBNull.Value);
cmd.Parameters.AddWithValue("@awayScore", (object?)game.HomeScore ?? DBNull.Value);
return await cmd.ExecuteNonQueryAsync() > 0;
}
private static Game ReadGame(DbDataReader r) => new()
{
Id = r.GetString(r.GetOrdinal("id")),
Date = r.GetString(r.GetOrdinal("date")),
Time = r.GetString(r.GetOrdinal("time")),
Home = r.GetString(r.GetOrdinal("home")),
Away = r.GetString(r.GetOrdinal("away")),
Year = r.GetInt32(r.GetOrdinal("year")),
HomeScore = r.IsDBNull(r.GetOrdinal("home_score")) ? null : r.GetInt32(r.GetOrdinal("home_score")),
AwayScore = r.IsDBNull(r.GetOrdinal("away_score")) ? null : r.GetInt32(r.GetOrdinal("away_score")),
Practice = r.GetBoolean(r.GetOrdinal("practice")),
Rain = r.GetBoolean(r.GetOrdinal("rain")),
};
private static readonly string[] ValidTeams =
["jaune", "rouge", "bleu", "gris", "vert", "noir", "orange", "mauve"];
private static string CleanDate(string raw)
{
var parts = raw.Split('-');
if (parts.Length != 3) return raw;
return $"{parts[0]}-{parts[1].PadLeft(2, '0')}-{parts[2].PadLeft(2, '0')}";
}
private static string CleanTime(string raw)
{
var sep = raw.Contains('h') ? 'h' : ':';
var parts = raw.Split(sep);
if (parts.Length != 2) return raw;
return $"{parts[0].PadLeft(2, '0')}:{parts[1].PadLeft(2, '0')}";
}
}
+7
View File
@@ -0,0 +1,7 @@
@{
Layout = "_Layout";
ViewData["Tab"] = "calendrier";
}
<div id="mithril-content"></div>
<script type=module src="scripts/calendar.js"></script>
+36
View File
@@ -0,0 +1,36 @@
@{
Layout = "_Layout";
ViewData["Tab"] = "contact";
}
<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>
+103
View File
@@ -0,0 +1,103 @@
@{
Layout = "_Layout";
ViewData["Tab"] = "home";
}
<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>
<partial name="HomeNews" />
</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>
<partial name="WalterStewartMap" />
</div>
</div>
</div>
<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>
<partial name="HomeNews" />
</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>
<partial name="WalterStewartMap" />
</div>
</div>
</div>
</div>
<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>
<partial name="HomeNews" />
</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>
<partial name="WalterStewartMap" />
</div>
</div>
</div>
</div>
</div>
</div>
+64
View File
@@ -0,0 +1,64 @@
@{
Layout = "_Layout";
ViewData["Tab"] = "nouvelles";
}
<div class="uk-width-large-2-5 uk-width-medium-3-5 uk-width-small-1-1 uk-container-center">
<div>
<article class="uk-article uk-margin-">
<h1 class="uk-article-title">
<h2 id="pre-inscription">Pré-inscription</h2>
</h1>
<p class="uk-article-meta">
<p>Samedi 8 Août 2026</p>
</p>
<p>
La pré-inscription pour la balle-molle Phénix est maintenant ouverte. Ça ne coûte rien et c'est sans prix!
</p>
<p>
<a href="https://forms.gle/Mv2wCVdbP83uiMdC7">https://forms.gle/Mv2wCVdbP83uiMdC7</a>
</p>
</article>
</div>
</div>
<div class="uk-width-large-2-5 uk-width-medium-3-5 uk-width-small-1-1 uk-container-center">
<div>
<article class="uk-article uk-margin-">
<h1 class="uk-article-title">
<h2 id="saison-2025">Saison 2026</h2>
</h1>
<p class="uk-article-meta">
<p>Lundi 9 Mars 2026</p>
</p>
<p>
La saison de la balle annonce à grand pas et les inscriptions débuteront lundi prochain (16 mars 2026). Le coût de la saison sera le même que l'an passé: 155$ pour la saison + 20$ de dépôt remboursable pour le prêt du chandail.
</p>
<p>
Comme à l'habitude, nous jouerons au parc walter-stewart les jeudis soir. La ligue comptera quatre équipes pour un grand total de 44 joueurs.
</p>
<p>
Les inscriptions en présentiel auront lieu le vendredi 20 mars au bar fullum entre 18h00 et 21h00. Pour ceux qui veulle venir prendre une petite bière avec nous ou payer en argent compten.
</p>
<p>
On vous tiens au courrant!
</p>
</article>
</div>
</div>
<div class="uk-width-large-2-5 uk-width-medium-3-5 uk-width-small-1-1 uk-container-center">
<div>
<article class="uk-article uk-margin-">
<h1 class="uk-article-title">
<h2 id="saison-2025">Saison 2025</h2>
</h1>
<p class="uk-article-meta">
<p>Vendredi 25 Avril 2025</p>
</p>
<p>Bonne saison à tous et toutes!</p>
<p>N'oubliez pas de consulter la page facebook: <a href="https://www.facebook.com/SportsPhenixMtl/">https://www.facebook.com/SportsPhenixMtl/</a> pour toutes mises à jour, y compris les annulations due à la météo.</p>
<p>Votre Comité 2023</p>
</article>
</div>
</div>
+43
View File
@@ -0,0 +1,43 @@
@{
Layout = "_Layout";
ViewData["Tab"] = "reglement";
}
<div class="uk-margin-top uk-margin-bottom uk-grid">
<div class="uk-width-large-3-5 uk-width-medium-4-5 uk-width-large-1-1 uk-container-center">
<div class="uk-grid">
<div class="uk-width-large-1-3 uk-width-small-1-1">
<div style="height: 250px; width: 250px; background-size: 250px; background-image: url(images/logosansfond.JPG);" class="uk-cover-background uk-container-center"></div>
</div>
<div class="uk-width-large-2-3 uk-width-small-1-1">
<div class="uk-panel uk-panel-box uk-panel-box-secondary">
<h2>Règlements 2021</h2>
<ul>
<li>
<h3><a href="files/regle_de_jeux_2021.pdf">Règles de jeu</a></h3>
</li>
<li>
<h3><a href="files/regles_et_procedures_2021.pdf">Règles et procédures</a></h3>
</li>
<li>
<h3><a href="files/charte_organisationnelle_2021.pdf">Charte Organisationnelle</a></h3>
</li>
<li>
<h3><a href="files/formulaire_inscription_2021.pdf">Formulaire d'inscription</a></h3>
</li>
<li>
<h3><a href="files/code_ethique_2021.pdf">Code d'éthique</a></h3>
</li>
<li>
<h3><a href="http://www.asbm.ca/">Association des Sports de Balle à Montréal (ASBN)</a></h3>
</li>
</ul>
</div>
</div>
</div>
<div class="uk-panel uk-panel-box uk-panel-box-secondary">
<h2>Mission</h2>
<p>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.</p>
</div>
</div>
</div>
+36
View File
@@ -0,0 +1,36 @@
@{
var isToday = ViewBag.IsToday == true;
var years = (List<int>)ViewBag.Years;
var games = (List<Phenix.Models.Game>)ViewBag.Games;
var selectedYear = (int?)ViewBag.SelectedYear;
}
<div class="uk-width-large-2-3 uk-container-center uk-margin">
<div class="uk-margin" style="margin-top: 1em">
<ul class="uk-tab">
<li class="@(isToday ? "uk-active" : "")">
<a hx-get="/membre/games-editor/today" hx-target="#content">Aujourd'hui</a>
</li>
@foreach (var year in years)
{
<li class="@(year == selectedYear ? "uk-active" : "")">
<a hx-get="/membre/games-editor/@year" hx-target="#content">Saison @year</a>
</li>
}
</ul>
</div>
@foreach (var game in games)
{
<div class="uk-panel uk-panel-box uk-panel-box-secondary uk-margin">
<partial name="GameEditor" model="game" />
</div>
}
<hr>
<button class="uk-button"
hx-get="/membre/new-game-editor"
hx-target="#content">
Nouvelle Partie
</button>
</div>
+28
View File
@@ -0,0 +1,28 @@
@{
Layout = "_Layout";
ViewData["Tab"] = "membre";
}
<div id="content"
@if (ViewBag.IsLoggedIn == true)
{
@:hx-get="/membre/games-editor/today"
@:hx-trigger="load"
@:hx-target="#content"
}>
<div class="uk-grid uk-margin">
<div class="uk-width-1-1">
<div style="height: 250px; width: 250px; background-size: 250px; background-image: url(images/logosansfond.JPG);" class="uk-cover-background uk-container-center"></div>
</div>
</div>
<div class="uk-panel uk-panel-box uk-panel-box-secondary uk-width-large-1-3 uk-container-center uk-margin">
<form action=""
class="uk-text-center"
hx-get="/login"
hx-target="#content">
<div class="uk-form-row"><label>Nom d'utilisateur <input type="text" name="username" class="uk-form-width-small"></label></div>
<div class="uk-form-row"><label>Mot de passe <input type="password" name="password" class="uk-form-width-small"></label></div>
<div class="uk-form-row"><button class="uk-button"><i class="fa fa-mars-double"></i> Pénétrez</button></div>
</form>
</div>
</div>
+35
View File
@@ -0,0 +1,35 @@
@{
Layout = null;
}
<div class="uk-width-large-2-3 uk-container-center uk-margin">
<div class="uk-margin"></div>
<div class="uk-panel uk-panel-box uk-panel-box-secondary uk-margin">
<form hx-post="/membre/new-game"
hx-target="#created-game"
hx-swap="afterbegin">
<div class="uk-form-row" style="text-align: center; font-size: 2em;">
<partial name="TeamSelector" model='new Phenix.Models.TeamSelectorModel { Name = "awayTeam" }' />
<label>Vs.</label>
<partial name="TeamSelector" model='new Phenix.Models.TeamSelectorModel { Name = "homeTeam" }' />
</div>
<div class="uk-form-row">
<label>Date: <input type=date name="gameDate" required></label>
</div>
<div class="uk-form-row">
<label>Heure: <input type="time" name="gameTime"></label>
</div>
<br>
<div style="text-align: right;">
<button class="uk-button">Creer</button>
</div>
</form>
</div>
<div id="created-game"></div>
</div>
+9
View File
@@ -0,0 +1,9 @@
@{
Layout = null;
}
<div class="uk-width-large-2-3 uk-container-center uk-margin">
<div class="uk-panel uk-panel-box uk-panel-box-secondary uk-margin">
<pre>@ViewBag.Error</pre>
</div>
</div>
+7
View File
@@ -0,0 +1,7 @@
@model Phenix.Models.Game
<div class="uk-width-large-2-3 uk-container-center uk-margin">
<div class="uk-panel uk-panel-box uk-panel-box-secondary uk-margin">
<partial name="GameEditor" model="Model" />
</div>
</div>
+53
View File
@@ -0,0 +1,53 @@
@model Phenix.Models.Game
@{
var prettyDate = DateOnly.Parse(Model.Date).ToString("d MMMM yyyy", new System.Globalization.CultureInfo("fr-CA"));
}
<div id="game-@Model.Id">
<h3>@Model.Away vs @Model.Home | @prettyDate | @Model.Time</h3>
<form style="font-size: 1.1em;"
hx-trigger="input delay:250ms"
hx-post="/membre/games/@Model.Id"
hx-target="#saving-result">
<div class="uk-form-row">
<label>
Points @Model.Away : <input type=number min=0 name="awayScore"
value="@(Model.AwayScore ?? 0)"
disabled="@(Model.Rain || Model.Practice ? true : null)">
</label>
</div>
<div class="uk-form-row">
<label>
Points @Model.Home : <input type=number min=0 name="homeScore"
value="@(Model.HomeScore ?? 0)"
disabled="@(Model.Rain || Model.Practice ? true : null)">
</label>
</div>
<div class="uk-form-row">
<label>
Partie reguliere <input type=radio name="gameType" value="regular-game"
checked="@(!Model.Practice && !Model.Rain ? true : null)">
</label>
<label>
Pluie <input type=radio name="gameType" value="rain"
checked="@(Model.Rain ? true : null)">
</label>
<label>
Pratique <input type=radio name="gameType" value="practice"
checked="@(Model.Practice && !Model.Rain ? true : null)">
</label>
</div>
<div id="saving-result"></div>
</form>
<div style="text-align: right">
<button class="uk-button"
hx-post="/membre/games/@Model.Id/switch"
hx-target="#game-@Model.Id">Inverser visiteur/receveur</button>
<button class="uk-button-danger"
hx-delete="/membre/games/@Model.Id"
hx-confirm="Certain de voulez supprimer la partie?"
hx-target="#game-@Model.Id"
hx-swap="delete">Supprimer</button>
</div>
</div>
+9
View File
@@ -0,0 +1,9 @@
<h3 class="uk-panel-title">
<a href="/nouvelles" class="uk-link-muted">
<h2 id="pre-inscription">Pré-inscription</h2>
</a>
</h3>
<p>
Pré-inscription pour la balle-molle Phénix, ça ne coûte rien et c'est sans prix! <a href="https://forms.gle/Mv2wCVdbP83uiMdC7">https://forms.gle/Mv2wCVdbP83uiMdC7</a>
</p>
<p><strong><a href="/nouvelles">lire la suite ...</a></strong></p>
+11
View File
@@ -0,0 +1,11 @@
@model Phenix.Models.TeamSelectorModel
@{
var teams = new[] { "jaune", "rouge", "bleu", "gris", "vert", "noir", "orange", "mauve" };
}
<select name="@Model.Name" class="uk-select" disabled="@(Model.IsDisabled)">
@foreach (var team in teams)
{
<option value="@team" selected="@(Model.SelectedTeam == team)">@team</option>
}
</select>
+14
View File
@@ -0,0 +1,14 @@
<div>
<iframe
style="border: 1px solid black; min-height: 300px;"
width="100%"
frameborder="0"
scrolling="no"
marginheight="0"
src="//www.openstreetmap.org/export/embed.html?bbox=-73.55936229228975%2C45.53102667048665%2C-73.55230271816255%2C45.53444249585723&amp;layer=mapnik">
</iframe>
<br>
<small>
<a href="http://www.openstreetmap.org/#map=17/45.53216/-73.55692">Voir la carte</a>
</small>
</div>
+86
View File
@@ -0,0 +1,86 @@
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Balle Phenix</title>
<link rel="shortcut icon" href="/images/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>
<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="@((ViewData["Tab"] as string) == "home" ? "uk-active" : "")">
<a href="/"><div><i class="fa fa-home"></i> Accueil</div></a>
</li>
<li class="@((ViewData["Tab"] as string) == "nouvelles" ? "uk-active" : "")">
<a href="/nouvelles"><div><i class="fa fa-newspaper-o"></i> Nouvelles</div></a>
</li>
<li class="@((ViewData["Tab"] as string) == "calendrier" ? "uk-active" : "")">
<a href="/calendrier"><div><i class="fa fa-calendar"></i> Calendrier</div></a>
</li>
<li class="@((ViewData["Tab"] as string) == "reglement" ? "uk-active" : "")">
<a href="/reglement"><div><i class="fa fa-legal"></i> Règlement</div></a>
</li>
<li class="@((ViewData["Tab"] as string) == "membre" ? "uk-active" : "")">
<a href="/membre"><div><i class="fa fa-lock"></i> Membre</div></a>
</li>
<li class="@((ViewData["Tab"] as string) == "contact" ? "uk-active" : "")">
<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="@((ViewData["Tab"] as string) == "home" ? "uk-active" : "")"><a href="/"><i class="fa fa-home"></i> Accueil </a></li>
<li class="@((ViewData["Tab"] as string) == "nouvelles" ? "uk-active" : "")"><a href="/nouvelles"><i class="fa fa-newspaper-o"></i> Nouvelles</a></li>
<li class="@((ViewData["Tab"] as string) == "calendrier" ? "uk-active" : "")"><a href="/calendrier"><i class="fa fa-calendar"></i> Calendrier</a></li>
<li class="@((ViewData["Tab"] as string) == "reglement" ? "uk-active" : "")"><a href="/reglement"><i class="fa fa-legal"></i> Règlement</a></li>
<li class="@((ViewData["Tab"] as string) == "membre" ? "uk-active" : "")"><a href="/membre"><i class="fa fa-lock"></i> Membre</a></li>
<li class="@((ViewData["Tab"] as string) == "contact" ? "uk-active" : "")"><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>
@RenderBody()
<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>
+1
View File
@@ -0,0 +1 @@
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+3
View File
@@ -0,0 +1,3 @@
@{
Layout = "_Layout";
}
+7
View File
@@ -0,0 +1,7 @@
{
"DatabaseProvider": "Sqlite",
"ConnectionStrings": {
"Default": "Data Source=phenix.db"
},
"SessionKey": "dev-only"
}
-13
View File
@@ -1,13 +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",
optimize: 'none'
})
-190
View File
@@ -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 &hellip; 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>
-44
View File
@@ -1,44 +0,0 @@
[title]
innerMarkdown = """
## Assemblée Générale 2017!
"""
[meta]
innerMarkdown = """
Dimanche 17 Septembre 2017
"""
[body]
innerMarkdown = """
Bonjour à tous,
Voilà déjà le temps de penser à l'AGA 2017, vous êtes donc invités le 23
septembre 2017 à 13:00 au [2120, boul. Pie-IX](https://goo.gl/maps/ApFhYX4Gz6A2).
Cette année il y a deux postes à pourvoir soit:
* **Président(e)**: mandat de deux ans
* **Trésorier(ère)**: mandat de deux ans.
Si un des deux postes vous intéresse, veuillez faire parvenir un courriel à
nathalie7033@gmail.com avant le 22 septembre 2017. Si nous recevons plusieurs
noms pour le même poste, il y aura élection par les membres le 23 septembre.
Si vous ne pouvez pas être présent et aimeriez qu'on discute d'un sujet qui
vous tient à coeur, vous pouvez nous contacter et et nous les metterons
à l'ordre du jour.
bien à vous,
votre commite.
"""
[smallBody]
innerMarkdown = """
Bonjour à tous,
Voilà déjà le temps de penser à l'AGA 2017, vous êtes donc invités le 23
septembre 2017 à 13:00 au [2120, boul. Pie-IX](https://goo.gl/maps/ApFhYX4Gz6A2).
**[lire la suite ...](#/nouvelles)**
"""
-33
View File
@@ -1,33 +0,0 @@
[title]
innerMarkdown = """
## Virée au Bar L’Astral 2000
"""
[meta]
innerMarkdown = """
Samedi 13 Juillet 2019
"""
[body]
innerMarkdown = """
La ligue de balle lente Les Phénix remercie son commanditaire Le Bar L’Astral 2000 pour sa contribution à notre saison 2019. Sa commandite a permis, en partie, à fournir 5 nouveaux uniformes d’équipes aux Phénix.
Maintenant que le beau temps se montre il sera de coutume d’aller faire un tour au Bar L’Astral 2000 le jeudi soir après nos matchs, question de socialiser entre nous et chanter, car c’est aussi un bar karaoké! Rendez-vous au [1845 Rue Ontario Est](https://goo.gl/maps/L3gdVVhKvrrgYDcc7).
[![astral 2000](images/Astral_logo.png)](https://www.facebook.com/Astral-2000-494597793884464/)
<p style="text-align: center; width: 100%;">
<a href="https://www.facebook.com/Astral-2000-494597793884464/">
<i class="fa fa-facebook-square" style="font-size: 3em;"></i>
</a>
</p>
"""
[smallBody]
innerMarkdown = """
Vous êtes tannés de l’hiver et vous avez hâte de sortir gant et bâton, de jouer dans le sable et sur l’herbe du terrain, retrouver une ambiance amicale et se faire de nouveaux ami(e)s ?
**[lire la suite ...](#/nouvelles)**
"""
-24
View File
@@ -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.
"""
-38
View File
@@ -1,38 +0,0 @@
[title]
innerMarkdown = """
## Evaluation et pratique 2018!
"""
[meta]
innerMarkdown = """
Lundi 07 mai 2018
"""
[body]
innerMarkdown = """
Bonsoir à tous les membres des Phénix - nouveaux et anciens,
La saison va bientôt commencer et nous souhaitons évaluer les nouveaux membres des Phénix dans un contexte de jeu. Ce qui veut dire que nous voulons voir les joueurs en action. Nous vous invitons donc à participer à cet événement le 12 mai prochain à compter de 13h30 au parc Walter-Stewart. Apportez votre gant !
Pour les anciens, venez faire connaissance avec les nouveaux, et par le fait même, vous mettre en forme pour la prochaine saison. Tous les anciens sont bienvenus.
Les capitaines seront rapidement appelés à faire leurs équipes après la journée d'évaluation. Nous prévoyons commencer à jouer dès le jeudi 17 mai prochain. L'heure vous sera confirmée par vos capitaines.
Pour votre information, cette saison nous allons avoir 4 équipes de 10 joueurs et pour ceux qui connaissent des joueurs ou joueuses qui voudraient à l'occasion agir comme remplaçants, nous sommes à constituer une liste qui servira aux capitaines pour faciliter les remplacements. N'hésitez pas à nous donner les noms et adresses courriel de vos amis qui seraient intéressés.
À bientôt
"""
[smallBody]
innerMarkdown = """
Bonsoir à tous les membres des Phénix - nouveaux et anciens,
La saison va bientôt commencer et nous souhaitons évaluer les nouveaux membres des Phénix dans un contexte de jeu. Ce qui veut dire que nous voulons voir les joueurs en action. Nous vous invitons donc à participer à cet événement le 12 mai prochain à compter de 13h30 au parc Walter-Stewart. Apportez votre gant !
**[Tous les details ...](#/nouvelles)**
"""
-61
View File
@@ -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)**
"""
-60
View File
@@ -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)**
"""
-85
View File
@@ -1,85 +0,0 @@
[title]
innerMarkdown = """
## Inscription 2018!
"""
[meta]
innerMarkdown = """
Samedi 17 mars 2018
"""
[body]
innerMarkdown = """
Bonjour à tous les membres de la Ligue de balle des Phénix et les autres qui
se joindront à nous,
L'hiver tire à sa fin. C'est donc un signe que la saison de la balle-molle
arrive à grand pas.
Mais d'abord, nous voudrions remercier Nathalie Ste-Marie et Sylvain Grenier
pour tout le travail effectué, la grande collaboration et la transmission des
effets de la Ligue ainsi que de tout le matériel. Nous savons que votre
implication immense a permis à la Ligue de continuer à se développer.
Merci encore.
Comme par le passé, il y aura une soirée d'inscription. Elle aura lieu le
vendredi 6 avril 2018 de 18h à 21h au [Bar l'Astral 2000](http://bit.ly/2FHSjMC)
situé au 1845 Rue Ontario E, Montréal, QC H2K 1T7. Comme vous le constatez,
c'est un nouveau lieu de rassemblement pour les Phénix. Le Bar est situé
beaucoup plus près de notre terrain de balle habituel ([parc Walter-Stuart](http://bit.ly/2G2fhxn)) que la Taverne Normandie
où nous allions auparavant et que nous avons délaissée l'an passé. Le Bar
l'[Astral 2000](http://bit.ly/2FHSjMC) est aussi notre commanditaire. Il faudra l'encourager, ce
que je ne doute même pas. Nous en profiterons pour vous parler des nouvelles
règles qui s'appliqueront cet été.
Le prix de l'inscription reste le même que l'année dernière soit de 110$
incluant la location du chandail au coût de 10$. La valeur de la location
du chandail vous sera rendue lorsque vous le remettrez à la fin de la saison.
De plus, nous offrirons un rabais sur l'inscription de 25 $ pour les personnes
qui seront choisies comme capitaine. Cette somme leur sera remise à la fin de
la saison. Nous jouerons les jeudis comme les années passées. La saison va
débuter au début du mois de mai quand les terrains seront officiellement
disponibles et se terminer à la fin août.
Une nouveauté cette année, il n'y aura que deux matchs par soir, ce qui
devrait nous permettre de socialiser un peu plus après les parties. Ça nous
permettra d'utiliser l'Astral comme lieu de rassemblement pour rire un peu
et nous rappeler nos bons et mauvais coups.
Pour ceux et celles qui ne pourront être présents à l'inscription, vous
pouvez vous inscrire par courrier. Imprimez, remplissez et envoyez le
formulaire d'inscription et le code de conduite avec votre chèque. Faites-vite,
puisque les places sont limitées. Maximum 50 joueurs.
Nous avons très hâte de vous voir !!!
Votre comité exécutif de La Ligue de balle les Phénix.
Marie-Ève, Didier, Richard et Gilles
[<i class="fa fa-paperclip"></i> Formulaire d'inscription](/files/inscription2018.pdf)
[<i class="fa fa-paperclip"></i> Code de conduite](/files/code_de_conduite.pdf)
"""
[smallBody]
innerMarkdown = """
Bonjour a tous!
**L'inscription pour la saison 2018 aura lieu le vendredi 6 avril 2018 de 18h à
21h au [Bar l'Astral 2000](http://bit.ly/2FHSjMC)**. Le prix reste le meme a
110$ (incluant un 10$ qui de depot pour le chandail).
Cette annee, il vous faudra remplir le
[formulaire d'inscription](/files/inscription2018.pdf) et un signer un
[code de conduite](/files/code_de_conduite.pdf). Si vous ne pouvez pas
vous presenter a l'inscription, vous pouvez toujours envoyer les formulaires
ainsi que votre cheque par la poste.
[<i class="fa fa-paperclip"></i> Formulaire d'inscription](/files/inscription2018.pdf)
[<i class="fa fa-paperclip"></i> Code de conduite](/files/code_de_conduite.pdf)
**[Tous les details ...](#/nouvelles)**
"""
-55
View File
@@ -1,55 +0,0 @@
[title]
innerMarkdown = """
## Inscription 2019!
"""
[meta]
innerMarkdown = """
Dimanche 17 Février 2019
"""
[body]
innerMarkdown = """
Vous êtes tannés de l’hiver et vous avez hâte de sortir gant et bâton, de jouer
dans le sable et sur l’herbe du terrain, retrouver une ambiance amicale et se
faire de nouveaux ami(e)s ?
Venez rencontrer des membres de la ligue de balle-lente Les Phénix - et tous
ceux et celles qui veulent se joindre à nous - à une soirée d’inscription, le
vendredi 5 avril 2019, de 18h30 à 20h30, au Bar L’Astral 2000, situé au 1845
rue Ontario Est, à Montréal. Ce bar qui nous commandite permet de nous réunir
après nos parties pour parler, boire et chanter au karaoké!
Combien ça coûte pour jouer? Les frais d’inscription 2019 sont de 100$. Aucun
dépôt pour le chandail d’équipe. Payable en argent comptant ou chèque. Saison
et party compris.
Chaque semaine, il y aura deux parties à l’horaire le jeudi soir au parc
Walter-Stewart, près du métro Frontenac, de mai à fin août (environ 16
semaines de jeu). Une pratique optionnelle sera organisée le dimanche.
Les nouveaux joueurs seront conviés fin avril pour une évaluation sur le
terrain afin de permettre la formation d’équipes équilibrées.
Au plaisir de vous voir en grand nombre le 5 avril!
Les personnes qui préfèrent s’inscrire par courrier peuvent remplir et signer
le [formulaire et le code de conduite](/files/inscription_et_code_2019.pdf).
Pour information sur les inscriptions : Richard Dicaire, trésorier, au 514-714-2246
Votre comité des Phénix
[<i class="fa fa-paperclip"></i> Formulaire d'inscription](/files/inscription_et_code_2019.pdf)
"""
[smallBody]
innerMarkdown = """
Vous êtes tannés de l’hiver et vous avez hâte de sortir gant et bâton, de jouer dans le sable et sur l’herbe du terrain, retrouver une ambiance amicale et se faire de nouveaux ami(e)s ?
**[lire la suite ...](#/nouvelles)**
"""
@@ -1,25 +0,0 @@
[title]
innerMarkdown = """
## Viens t’inscrire le 5 avril
"""
[meta]
innerMarkdown = """
Lundi 1er Avril 2019
"""
[body]
innerMarkdown = """
Profitez de l’arrivée du printemps pour vous présenter à la soirée d’inscription
la ligue de balle-lente Les Phénix le vendredi 5 avril 2019, de 18h30 à 20h30,
au [Bar L’Astral 2000, situé au 1845 rue Ontario Est, à Montréal](https://goo.gl/maps/3SND4ZqGZKP2). Coût de 100$
comptant ou chèque pour jouer le jeudi soir au parc Walter-Stewart, de la
mi-mai à la fin août. Évaluation des nouveaux vers la fin avril. Le comité
2019 se fera un plaisir de vous accueillir, répondre vos questions et
socialiser avec les futurs joueurs.
[<i class="fa fa-paperclip"></i> Formulaire d'inscription](/files/inscription_et_code_2019.pdf)
"""
-50
View File
@@ -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)**
"""
-30
View File
@@ -1,30 +0,0 @@
[title]
innerMarkdown = """
## Nouveau Comité 2019!
"""
[meta]
innerMarkdown = """
Dimanche 17 Février 2019
"""
[body]
innerMarkdown = """
La dernière année des Phénix s’est terminée avec l’élection d’un nouveau comité
exécutif.
Les membres présents à l’assemblée générale annuelle du 2 novembre 2018 ont élu
Marc-André Bonin au poste de vice-président et Alexandre Gauthier au poste de
secrétaire. Les postes de Gilles Dicaire, président, et Richard Dicaire,
trésorier, n’étaient pas en élection. Le nouvel exécutif des Phénix tient à
remercier Marie-Ève Clavel et Didier Amyot pour leur engagement des dernières années.
"""
[smallBody]
innerMarkdown = """
La dernière année des Phénix s’est terminée avec l’élection d’un nouveau comité
exécutif.
**[lire la suite ...](#/nouvelles)**
"""
-27
View File
@@ -1,27 +0,0 @@
[title]
innerMarkdown = """
## Party fin de saison 2017!
"""
[meta]
innerMarkdown = """
Mercredi 23 Aout 2017
"""
[body]
innerMarkdown = """
Bonjour à tous les phénixiens phénixiennes.
Les séries commencent et nous devons déjà penser a fêter la fin de
la saison. Comme à l'habitude, nous allons festoyer à la [taverne
normandie](http://www.taverne-normandie.ca/), [1295 Amherst](https://goo.gl/maps/neafXHhkW292).
Le party aura lieu le **vendredi 8 septembre 2017**, nous devrions
commencer à arriver vers 19h00. Il y aura pizza, biere et animation.
# <i class="fa fa-beer" aria-hidden="true"></i>
bien à vous,
votre commite.
"""
-22
View File
@@ -1,22 +0,0 @@
[title]
innerMarkdown = """
## Reprise saison 2018
"""
[meta]
innerMarkdown = """
Lundi 9 juillet 2018
"""
[body]
innerMarkdown = """
Bonjour a toutes et a tous!
Finalement, les travaux au parc walter-stewart sont finis et nous pouvons
reprendre nos activites. Nous devrions finir la saison plus tard pour
reprendre nos parties.
On se voit jeudi!
"""
@@ -1,50 +0,0 @@
[title]
innerMarkdown = """
## Retour à Walter-Stewart
"""
[meta]
innerMarkdown = """
Samedi 20 juin 2017
"""
[body]
innerMarkdown = """
Bonjour a tous,
nous sommes heureux de vous aviser que nous retrouverons notre nid dès jeudi!
En effet, a partir de ce jeudi (22 juin 2017) nous allons jouer nos parties
au parc Walter-Stewart, juste à cote du metro Frontenac.
Pour ceux qui sont interessés, le parc Walter-Stewart est le lieux où Rodger
Brulotte est tombé en amour avec le baseball. Walter Stewart fut un journaliste
important au canada englais, mais comme le parc fut batisé avant le déces de
M. Stewart, il serait surprenant que le parc aille été nomme en son honneur.
Il y a un tres bon restaurant tout près du parc, le Resto De La Rivière; c'est
assez cher. Il y a, aussi, une nombre incalculable de gens qui ont perdu leurs
virginité dans notre cher parc; probablement sans penser à notre cher Rodger,
au journaliste homonyme ou d'avoir salivé à l'idee une creme-brulee.
Veuillez rependre la bonne nouvelle; dites le a vos amis, chums/blondes, beaux parents...
Merci beaucoup,
Comité ballephenix!
"""
[smallBody]
innerMarkdown = """
Bonjour a tous,
nous sommes heureux de vous aviser que nous retrouverons notre nid dès jeudi!
En effet, a partir de ce jeudi (22 juin 2017) nous allons jouer nos parties
au parc Walter-Stewart, juste à cote du metro Frontenac.
Veuillez rependre la bonne nouvelle; dites le a vos amis, chums/blondes, beaux parents...
Merci beaucoup,
**[lire la suite ...](#/nouvelles)**
"""
-50
View File
@@ -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)**
"""
-29
View File
@@ -1,29 +0,0 @@
[title]
innerMarkdown = """
## Début Saison 2021
"""
[meta]
innerMarkdown = """
Mardi 15 Juin 2021
"""
[body]
innerMarkdown = """
Nous avons eu le permis de la ville de Montréal pour débuter notre saison le 24 Juin !!!
Notez que la ville n'a émis aucun permis avant le 20 juin, le Jeudi 24 Juin est le plus tôt que nous pouvons débuter notre saison avec notre permis.
Comme la ville ne prépare pas de terrain et ne fournit pas d'officiel, les 24 juin et 1 juillet, ce sera des matchs hors concours avec les membres présents.
Voici donc sans plus tarder notre calendrier pour la saison 2021 !!!
Votre Comité 2021
"""
[smallBody]
innerMarkdown = """
Nous avons eu le permis de la ville de Montréal pour débuter notre saison le 24 Juin !!!
Notez que la ville n'a émis aucun permis avant le 20 juin, le Jeudi 24 Juin est le plus tôt que nous pouvons débuter notre saison avec notre permis.
**[lire la suite ...](#/nouvelles)**
"""
-20
View File
@@ -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!
"""
-33
View File
@@ -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)**
"""
-307
View File
@@ -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
-419
View File
@@ -1,419 +0,0 @@
---
# generated by https://scheduler.leaguelobster.com/edit/236693/new-league/new-season/#
# WEEK 1
# -
# date: 2017/5/25 # year/month/day
# time: "18:30"
# home: gris # t1
# away: bleu # t5
# home_points: 11
# away_points: 6
# rain: true
# -
# date: 2017/5/25 # year/month/day
# time: "20:00"
# home: rouge # t4
# away: jaune # t6
# home_points: ~
# away_points: ~
# rain: true
# -
# date: 2017/5/25 # year/month/day
# time: "21:30"
# home: vert # t2
# away: orange # t3
# home_points: ~
# away_points: ~
# rain: true
# WEEK 2
-
date: 2017/6/1 # year/month/day
time: "18:30"
home: gris # t1
away: jaune # t6
home_points: 11
away_points: 6
rain: false
-
date: 2017/6/1 # year/month/day
time: "20:00"
home: orange # t3
away: rouge # t4
home_points: 8
away_points: 21
rain: false
-
date: 2017/6/1 # year/month/day
time: "21:30"
home: bleu # t5
away: vert # t2
home_points: 6
away_points: 9
rain: false
# WEEK 3
-
date: 2017/6/8 # year/month/day
time: "18:30"
home: rouge # t4
away: bleu # t5
home_points: 10
away_points: 8
rain: false
-
date: 2017/6/8 # year/month/day
time: "20:00"
home: vert # t2
away: jaune # t6
home_points: 8
away_points: 5
rain: false
-
date: 2017/6/8 # year/month/day
time: "21:30"
home: orange # t3
away: gris # t1
home_points: 9
away_points: 11
rain: false
# WEEK 4
-
date: 2017/6/15 # year/month/day
time: "18:30"
home: bleu # t5
away: jaune # t6
home_points: 6
away_points: 18
rain: false
-
date: 2017/6/15 # year/month/day
time: "20:00"
home: orange # t3
away: vert # t2
home_points: 7
away_points: 15
rain: false
-
date: 2017/6/15 # year/month/day
time: "21:30"
home: rouge # t4
away: gris # t1
home_points: 6
away_points: 17
rain: false
# WEEK 5
-
date: 2017/6/22 # year/month/day
time: "18:30"
home: orange # t3
away: vert # t2
home_points: 10
away_points: 13
rain: false
-
date: 2017/6/22 # year/month/day
time: "20:00"
home: bleu # t5
away: gris # t1
home_points: 17
away_points: 15
rain: false
-
date: 2017/6/22 # year/month/day
time: "21:30"
home: jaune # t6
away: rouge # t4
home_points: 9
away_points: 8 # didier a fait un grand chelem!
rain: false
# WEEK 6
-
date: 2017/6/29 # year/month/day
time: "18:30"
home: vert # t2
away: rouge # t4
home_points: 15
away_points: 6
rain: false
-
date: 2017/6/29 # year/month/day
time: "20:00"
home: jaune # t6
away: gris # t1
home_points: 20
away_points: 14
rain: false
-
date: 2017/6/29 # year/month/day
time: "21:30"
home: bleu # t5
away: orange # t3
home_points: 12
away_points: 18
rain: false
# WEEK 7
-
date: 2017/7/6 # year/month/day
time: "18:30"
home: gris # t1
away: vert # t2
home_points: 20
away_points: 14
rain: false
-
date: 2017/7/6 # year/month/day
time: "20:00"
home: rouge # t4
away: orange # t3
home_points: 12
away_points: 10
rain: false
-
date: 2017/7/6 # year/month/day
time: "21:30"
home: jaune # t6
away: bleu # t5
home_points: 18
away_points: 9
rain: false
# WEEK 8
-
date: 2017/7/13 # year/month/day
time: "18:30"
home: rouge # t4
away: bleu # t5
home_points: 14
away_points: 6
rain: false
-
date: 2017/7/13 # year/month/day
time: "20:00"
home: gris # t1
away: vert # t2
home_points: 14
away_points: 4
rain: false
-
date: 2017/7/13 # year/month/day
time: "21:30"
home: orange # t3
away: jaune # t6
home_points: 14
away_points: 9
rain: false
# WEEK 9
-
date: 2017/7/20 # year/month/day
time: "18:30"
home: bleu # t5
away: orange # t3
home_points: 11
away_points: 25
rain: false
-
date: 2017/7/20 # year/month/day
time: "18:30"
home: rouge # t4
away: gris # t1
home_points: 11
away_points: 18
rain: false
-
date: 2017/7/20 # year/month/day
time: "21:30"
home: jaune # t6
away: vert # t2
home_points: 13
away_points: 15
rain: false
# WEEK 10
-
date: 2017/7/27 # year/month/day
time: "18:30"
home: jaune # t6
away: orange # t3
home_points: 14
away_points: 11
rain: false
-
date: 2017/7/27 # year/month/day
time: "20:00"
home: vert # t2
away: bleu # t5
home_points: 18
away_points: 9
rain: false
-
date: 2017/7/27 # year/month/day
time: "21:30"
home: rouge # t4
away: gris # t1
home_points: 13
away_points: 13
rain: false
# WEEK 11
-
date: 2017/8/3 # year/month/day
time: "18:30"
home: vert # t2
away: rouge # t4
home_points: 12
away_points: 12
rain: false
-
date: 2017/8/3 # year/month/day
time: "20:00"
home: bleu # t5
away: orange # t3
home_points: 4
away_points: 16
rain: false
-
date: 2017/8/3 # year/month/day
time: "21:30"
home: jaune # t6
away: gris # t1
home_points: 5
away_points: 22
rain: false
# WEEK 12
-
date: 2017/8/10 # year/month/day
time: "18:30"
home: orange # t3
away: rouge # t4
home_points: 4
away_points: 10
rain: false
-
date: 2017/8/10 # year/month/day
time: "20:00"
home: jaune # t6
away: bleu # t5
home_points: 12
away_points: 13
rain: false
-
date: 2017/8/10 # year/month/day
time: "21:30"
home: gris # t1
away: vert # t2
home_points: 23
away_points: 14
rain: false
# WEEK 13
-
date: 2017/8/17 # year/month/day
time: "18:30"
home: vert # t2
away: jaune # t6
home_points: 15
away_points: 16
rain: false
-
date: 2017/8/17 # year/month/day
time: "20:00"
home: gris # t1
away: orange # t3
home_points: 17
away_points: 11
rain: false
-
date: 2017/8/17 # year/month/day
time: "21:30"
home: bleu # t5
away: rouge # t4
home_points: 12
away_points: 17
rain: false
# WEEK 14
-
date: 2017/8/24 # year/month/day e 6vs5 et 4vs3,
time: "19:00"
home: rouge # t1
away: bleu
home_points: ~
away_points: ~
rain: false
-
date: 2017/8/24 # year/month/day
time: "20:30"
home: jaune # t2
away: orange # t5
home_points: ~
away_points: ~
rain: false
# WEEK 15
-
date: 2017/8/31 # year/month/day e 6vs5 et 4vs3,
time: "18:30"
home: bleu
away: gris # t3
home_points: ~
away_points: ~
rain: false
-
date: 2017/8/31 # year/month/day
time: "20:00"
home: orange
away: vert # t5
home_points: ~
away_points: ~
rain: false
-
date: 2017/8/31 # year/month/day
time: "21:30"
home: "gagnant bleu-gris" # t2
away: "gagnant orange-vert" # t5
home_points: ~
away_points: ~
rain: false
-294
View File
@@ -1,294 +0,0 @@
---
## Semaine 1
-
date: 2018/5/17 # year/month/day
time: "18:45"
away: jaune
home: gris
home_points: 14
away_points: 16
rain: false
-
date: 2018/5/17 # year/month/day
time: "20:15"
away: vert
home: rouge
home_points: 20
away_points: 9
rain: false
## Semaine 2
-
date: 2018/5/24 # year/month/day
time: "18:45"
away: vert
home: gris
home_points: 15
away_points: 7
rain: false
-
date: 2018/5/24 # year/month/day
time: "20:15"
away: rouge
home: jaune
home_points: 25
away_points: 4
rain: false
## Semaine 3
-
date: 2018/5/31 # year/month/day
time: "18:45"
away: vert
home: jaune
home_points: 9
away_points: 15
rain: false
-
date: 2018/5/31 # year/month/day
time: "20:15"
away: rouge
home: gris
home_points: 13
away_points: 12
rain: false
## Semaine 4
-
date: 2018/6/7 # year/month/day
time: "18:45"
away: rouge
home: vert
home_points: 9
away_points: 16
rain: false
-
date: 2018/6/7 # year/month/day
time: "20:15"
away: gris
home: jaune
home_points: 19
away_points: 8
rain: false
## Semaine 5
-
date: 2018/6/14 # year/month/day
time: "18:45"
away: jaune
home: rouge
home_points: ~
away_points: ~
rain: yes
-
date: 2018/6/14 # year/month/day
time: "20:15"
away: vert
home: gris
home_points: ~
away_points: ~
rain: yes
## Semaine 6
-
date: 2018/6/21 # year/month/day
time: "18:45"
away: gris
home: rouge
home_points: ~
away_points: ~
rain: yes
-
date: 2018/6/21 # year/month/day
time: "20:15"
away: jaune
home: vert
home_points: ~
away_points: ~
rain: yes
## Semaine 7
-
date: 2018/6/28 # year/month/day
time: "18:45"
away: vert
home: rouge
home_points: ~
away_points: ~
rain: true
-
date: 2018/6/28 # year/month/day
time: "20:15"
away: gris
home: jaune
home_points: ~
away_points: ~
rain: true
## Semaine 8
-
date: 2018/7/5 # year/month/day
time: "18:45"
away: jaune
home: rouge
home_points: ~
away_points: ~
rain: true
-
date: 2018/7/5 # year/month/day
time: "20:15"
away: gris
home: vert
home_points: ~
away_points: ~
rain: true
## Semaine 9
-
date: 2018/7/12 # year/month/day
time: "18:45"
away: vert
home: jaune
home_points: 8
away_points: 12
rain: false
-
date: 2018/7/12 # year/month/day
time: "20:15"
away: rouge
home: gris
home_points: 15
away_points: 9
rain: false
## Semaine 10
-
date: 2018/7/19 # year/month/day
time: "18:45"
away: jaune
home: gris
home_points: 6
away_points: 15
rain: false
-
date: 2018/7/19 # year/month/day
time: "20:15"
away: rouge
home: vert
home_points: 12
away_points: 12
rain: false
## Semaine 11
-
date: 2018/7/26 # year/month/day
time: "18:45"
away: vert
home: gris
home_points: 3
away_points: 22
rain: false
-
date: 2018/7/26 # year/month/day
time: "20:15"
away: rouge
home: jaune
home_points: 13
away_points: 11
rain: false
## Semaine 12
-
date: 2018/8/2 # year/month/day
time: "18:45"
away: gris
home: rouge
home_points: 10
away_points: 10
rain: false
-
date: 2018/8/2 # year/month/day
time: "20:15"
away: jaune
home: vert
home_points: 20
away_points: 4
rain: false
## Semaine 13
-
date: 2018/8/9 # year/month/day
time: "18:45"
away: vert
home: rouge
home_points: 2
away_points: 15
rain: false
-
date: 2018/8/9 # year/month/day
time: "20:15"
away: gris
home: jaune
home_points: 19
away_points: 10
rain: false
## Semaine 14
-
date: 2018/8/16 # year/month/day
time: "18:45"
away: jaune
home: rouge
home_points: 5
away_points: 14
rain: false
-
date: 2018/8/16 # year/month/day
time: "20:15"
away: gris
home: vert
home_points: 19
away_points: 5
rain: false
## Semaine 15
-
date: 2018/8/23 # year/month/day
time: "18:45"
away: rouge
home: gris
home_points: 14
away_points: 13
rain: false
-
date: 2018/8/23 # year/month/day
time: "20:15"
away: vert
home: jaune
home_points: 12
away_points: 13
rain: false
## Semaine 16 | Finale
-
date: 2018/8/30 # year/month/day
time: "18:45"
away: rouge
home: gris
home_points: ~
away_points: ~
rain: false
-
date: 2018/8/30 # year/month/day
time: "20:15"
away: vert
home: jaune
home_points: ~
away_points: ~
rain: false
-346
View File
@@ -1,346 +0,0 @@
---
-
date: 2019/05/16
time: "18:45"
away: orange
home: noir
noir : ~
orange : ~
rain: true
-
date: 2019/05/16
time: "20:15"
away: bleu
home: rouge
rouge : ~
bleu : ~
rain: true
-
date: 2019/05/23
time: "18:45"
away: rouge
home: orange
orange : ~
rouge : ~
rain: true
-
date: 2019/05/23
time: "20:15"
away: noir
home: bleu
bleu : ~
noir : ~
rain: true
-
date: 2019/05/30
time: "18:45"
away: orange
home: bleu
bleu : 16
orange : 19
rain: false
-
date: 2019/05/30
time: "20:15"
away: noir
home: rouge
rouge : 13
noir : 9
rain: false
-
date: 2019/06/06
time: "18:45"
away: rouge
home: bleu
bleu : 9
rouge : 11
rain: false
-
date: 2019/06/06
time: "20:15"
away: noir
home: orange
orange : 15
noir : 14
rain: false
-
date: 2019/06/13
time: "18:45"
away: orange
home: rouge
rouge : 14
orange : 6
rain: false
-
date: 2019/06/13
time: "20:15"
away: bleu
home: noir
noir : 1
bleu : 16
rain: false
-
date: 2019/06/15
time: "14:00"
away: orange
home: noir
noir : 14
orange : 2
rain: false
-
date: 2019/06/15
time: "15:30"
away: bleu
home: rouge
rouge : 8
bleu : 9
rain: false
-
date: 2019/06/20
time: "18:45"
away: bleu
home: orange
orange : ~
bleu : ~
rain: true
-
date: 2019/06/20
time: "20:15"
away: rouge
home: noir
noir : ~
rouge : ~
rain: true
-
date: 2019/06/27
time: "18:45"
away: bleu
home: rouge
rouge : 12
bleu : 12
rain: false
-
date: 2019/06/27
time: "20:15"
away: orange
home: noir
noir : 17
orange : 8
rain: false
-
date: 2019/07/04
time: "18:45"
away: noir
home: bleu
bleu : 15
noir : 14
rain: false
-
date: 2019/07/04
time: "20:15"
away: rouge
home: orange
orange : 7
rouge : 17
rain: false
-
date: 2019/07/11
time: "18:45"
away: noir
home: rouge
rouge : ~
noir : ~
rain: yes
-
date: 2019/07/11
time: "20:15"
away: orange
home: bleu
bleu : ~
orange : ~
rain: yes
-
date: 2019/07/18
time: "18:45"
away: rouge
home: bleu
bleu : 12
rouge : 8
rain: false
-
date: 2019/07/18
time: "20:15"
away: noir
home: orange
orange : 6
noir : 6
rain: false
-
date: 2019/07/25
time: "18:45"
away: bleu
home: noir
noir : 11
bleu : 14
rain: false
-
date: 2019/07/25
time: "20:15"
away: orange
home: rouge
rouge : 17
orange : 16
rain: false
-
date: 2019/08/01
time: "18:45"
away: rouge
home: noir
noir : 16
rouge : 9
rain: false
-
date: 2019/08/01
time: "20:15"
away: bleu
home: orange
orange : 16
bleu : 24
rain: false
-
date: 2019/08/08
time: "18:45"
away: rouge
home: noir
noir : 6
rouge : 14
rain: false
-
date: 2019/08/08
time: "20:15"
away: bleu
home: orange
orange : 9
bleu : 18
rain: false
#######################
-
date: 2019/08/10
time: "10:30"
away: orange
home: rouge
orange : 8
rouge : 14
rain: false
-
date: 2019/08/10
time: "12:00"
away: noir
home: bleu
noir : 13
bleu : 14
rain: false
-
date: 2019/08/10
time: "13:30"
away: bleu
home: orange
bleu : 14
orange : 7
rain: false
-
date: 2019/08/10
time: "15:00"
away: rouge
home: noir
rouge : 11
noir : 8
rain: false
#########################
-
date: 2019/08/15
time: "18:45"
away: noir
home: bleu
bleu : ~
noir : ~
rain: false
-
date: 2019/08/15
time: "20:15"
away: rouge
home: orange
orange : ~
rouge : ~
rain: false
-
date: 2019/08/22
time: "18:45"
away: orange
home: bleu
1 : ~
4 : ~
rain: false
-
date: 2019/08/22
time: "20:15"
away: noir
home: rouge
2 : ~
3 : ~
rain: false
-
date: 2019/08/29
time: "18:45"
away: petite
home: finale
finale : ~
petite : ~
rain: false
-
date: 2019/08/29
time: "20:15"
away: grande
home: finale
finale : ~
grande : ~
rain: false
-218
View File
@@ -1,218 +0,0 @@
---
-
date: 2020/07/09
time: '18:30'
away: rouge
home: bleu
bleu : 12
rouge : 13
rain: false
-
date: 2020/07/09
time: '20:00'
away: jaune
home: noir
noir : 14
jaune : 30
rain: false
-
date: 2020/07/16
time: '18:30'
away: bleu
home: noir
noir : 12
bleu : 10
rain: false
-
date: 2020/07/16
time: '20:00'
away: rouge
home: jaune
jaune : 15
rouge : 14
rain: false
-
date: 2020/07/23
time: '18:30'
away: noir
home: rouge
rouge : 6
noir : 11
rain: false
-
date: 2020/07/23
time: '20:00'
away: bleu
home: jaune
jaune : 7
bleu : 10
rain: false
-
date: 2020/08/06
time: '18:30'
away: jaune
home: rouge
rouge : 16
jaune : 10
rain: false
-
date: 2020/08/06
time: '20:00'
away: noir
home: jaune
jaune : 15
noir : 14
rain: false
-
date: 2020/08/06
time: '21:30'
away: noir
home: bleu
bleu : 14
noir : 17
rain: false
-
date: 2020/08/13
time: '18:30'
away: bleu
home: rouge
rouge : 9
bleu : 17
rain: false
-
date: 2020/08/20
time: '18:30'
away: jaune
home: noir
noir : 14
jaune : 18
rain: false
-
date: 2020/08/20
time: '20:00'
away: jaune
home: bleu
bleu : 13
jaune : 6
rain: false
-
date: 2020/08/27
time: '20:00'
away: noir
home: rouge
rouge : 11
noir : 20
rain: false
-
date: 2020/08/27
time: '18:30'
away: bleu
home: noir
noir : 14
bleu : 13
rain: false
-
date: 2020/08/27
time: '21:30'
away: rouge
home: jaune
jaune : 17
rouge : 22
rain: false
-
date: 2020/09/03
time: '18:30'
away: noir
home: rouge
rouge : 19
noir : 12
rain: false
-
date: 2020/09/03
time: '20:00'
away: rouge
home: bleu
bleu : 12
rouge : 23
rain: false
-
date: 2020/09/03
time: '21:30'
away: bleu
home: jaune
jaune : 21
bleu : 19
rain: false
-
date: 2020/09/10
time: '18:30'
away: jaune
home: noir
noir : 15
jaune : 5
rain: false
-
date: 2020/09/10
time: '20:00'
away: bleu
home: rouge
rouge : 8
bleu : 9
rain: false
-
date: 2020/09/17
time: '18:30'
away: jaune
home: rouge
rouge : 19
jaune : 15
rain: false
-
date: 2020/09/17
time: '20:00'
away: bleu
home: noir
noir : 14
bleu : 20
rain: false
-
date: 2020/09/24
time: '18:30'
away: jaune
home: noir
noir : 14
jaune : 16
rain: false
-
date: 2020/09/24
time: '20:00'
away: bleu
home: rouge
rouge : 24
bleu : 23
rain: false
-276
View File
@@ -1,276 +0,0 @@
---
-
date: 2021/06/24 # year/month/day
time: "18:30"
home: gris
away: jaune
gris: ~
jaune: ~
practice: true
rain: false
##################################################################
-
date: 2021/07/01 # year/month/day
time: "18:30"
home: gris
away: jaune
gris: ~
jaune: ~
practice: true
rain: false
##############################################################
-
date: 2021/07/08 # year/month/day
time: "18:30"
away: bleu
home: rouge
bleu: ~
rouge: ~
rain: true
-
date: 2021/07/08 # year/month/day
time: "20:00"
away: jaune
home: orange
jaune: ~
orange: ~
rain: true
##############################################################
-
date: 2021/07/15 # year/month/day
time: "18:30"
away: rouge
home: jaune
rouge: 13
jaune: 12
rain: false
-
date: 2021/07/15 # year/month/day
time: "20:00"
away: bleu
home: orange
bleu: 11
orange: 12
rain: false
##############################################################
-
date: 2021/07/22 # year/month/day
time: "18:30"
away: jaune
home: bleu
jaune: 9
bleu: 19
rain: false
-
date: 2021/07/22 # year/month/day
time: "20:00"
away: orange
home: rouge
orange: 16 # mais rich a peté ça coche, ca devrait donc enlever des points.
rouge: 10
rain: false
##############################################################
-
date: 2021/07/29 # year/month/day
time: "18:30"
away: orange
home: jaune
orange: 10
jaune: 8
rain: false
-
date: 2021/07/29 # year/month/day
time: "20:00"
away: rouge
home: bleu
rouge: 10
bleu: 10
rain: false
##############################################################
-
date: 2021/08/05 # year/month/day
time: "18:30"
away: rouge
home: orange
rouge: ~
orange: ~
rain: false
-
date: 2021/08/05 # year/month/day
time: "20:00"
away: bleu
home: jaune
bleu: ~
jaune: ~
rain: false
##############################################################
-
date: 2021/08/12 # year/month/day
time: "18:30"
away: orange
home: bleu
orange: ~
bleu: ~
rain: false
-
date: 2021/08/12 # year/month/day
time: "20:00"
away: jaune
home: rouge
jaune: ~
rouge: ~
rain: false
##############################################################
-
date: 2021/08/19 # year/month/day
time: "18:30"
away: bleu
home: orange
bleu: ~
orange: ~
rain: false
-
date: 2021/08/19 # year/month/day
time: "20:00"
away: rouge
home: jaune
rouge: ~
jaune: ~
rain: false
##############################################################
-
date: 2021/08/26 # year/month/day
time: "18:30"
away: jaune
home: bleu
jaune: ~
bleu: ~
rain: false
-
date: 2021/08/26 # year/month/day
time: "20:00"
away: orange
home: rouge
orange: ~
rouge: ~
rain: false
##############################################################
-
date: 2021/09/02 # year/month/day
time: "18:30"
away: rouge
home: bleu
rouge: ~
bleu: ~
rain: false
-
date: 2021/09/02 # year/month/day
time: "20:00"
away: orange
home: jaune
orange: ~
jaune: ~
rain: false
##############################################################
-
date: 2021/09/09 # year/month/day
time: "18:30"
away: jaune
home: rouge
jaune: ~
rouge: ~
rain: false
-
date: 2021/09/09 # year/month/day
time: "20:00"
away: orange
home: bleu
orange: ~
bleu: ~
rain: false
##############################################################
-
date: 2021/09/16 # year/month/day
time: "18:30"
away: rouge
home: orange
rouge: ~
orange: ~
rain: false
-
date: 2021/09/16 # year/month/day
time: "20:00"
away: bleu
home: jaune
bleu: ~
jaune: ~
rain: false
##############################################################
-
date: 2021/09/23 # year/month/day
time: "18:30"
away: jaune
home: orange
jaune: ~
orange: ~
rain: false
-
date: 2021/09/23 # year/month/day
time: "20:00"
away: bleu
home: rouge
bleu: ~
rouge: ~
rain: false
-361
View File
@@ -1,361 +0,0 @@
---
-
date: 2022/05/19
time: '18:45'
away: bleu
home: rouge
bleu : ~
rouge : ~
practice: false
rain: true
-
date: 2022/05/19
time: '20:15'
away: orange
home: jaune
orange : ~
jaune : ~
practice: false
rain: true
##
-
date: 2022/05/26
time: '18:45'
away: rouge
home: orange
rouge : ~
orange : ~
practice: false
rain: false
-
date: 2022/05/26
time: '20:15'
away: jaune
home: bleu
jaune : ~
bleu : ~
practice: false
rain: false
##
-
date: 2022/06/02
time: '18:45'
away: jaune
home: rouge
bleu : ~
rouge : ~
practice: false
rain: false
-
date: 2022/06/02
time: '20:15'
away: bleu
home: orange
bleu : ~
rouge : ~
practice: false
rain: false
##
-
date: 2022/06/09
time: '18:45'
away: jaune
home: orange
jaune : ~
orange : ~
practice: false
rain: false
-
date: 2022/06/09
time: '20:15'
away: rouge
home: bleu
rouge : ~
bleu : ~
practice: false
rain: false
##
-
date: 2022/06/16
time: '18:45'
away: jaune
home: bleu
jaune : ~
bleu : ~
practice: false
rain: false
-
date: 2022/06/16
time: '20:15'
away: orange
home: rouge
orange : ~
rouge : ~
practice: false
rain: false
##
-
date: 2022/06/23
time: '18:45'
away: bleu
home: orange
bleu : ~
orange : ~
practice: false
rain: false
-
date: 2022/06/23
time: '20:15'
away: rouge
home: jaune
rouge : ~
jaune : ~
practice: false
rain: false
##
-
date: 2022/06/30
time: '18:45'
away: orange
home: rouge
orange : ~
rouge : ~
practice: false
rain: false
-
date: 2022/06/30
time: '20:15'
away: bleu
home: jaune
bleu : ~
jaune : ~
practice: false
rain: false
##
-
date: 2022/07/07
time: '18:45'
away: jaune
home: orange
orange : ~
jaune : ~
practice: false
rain: false
-
date: 2022/07/07
time: '20:15'
away: bleu
home: jaune
bleu : ~
jaune : ~
practice: false
rain: false
##
-
date: 2022/07/14
time: '18:45'
away: rouge
home: jaune
rouge : ~
jaune : ~
practice: false
rain: false
-
date: 2022/07/14
time: '20:15'
away: orange
home: bleu
orange : ~
bleu : ~
practice: false
rain: false
##
-
date: 2022/07/21
time: '18:45'
away: bleu
home: rouge
bleu : ~
rouge : ~
practice: false
rain: false
-
date: 2022/07/21
time: '20:15'
away: orange
home: jaune
orange : ~
jaune : ~
practice: false
rain: false
##
-
date: 2022/07/28
time: '18:45'
away: bleu
home: jaune
bleu : ~
jaune : ~
practice: false
rain: false
-
date: 2022/07/28
time: '20:15'
away: rouge
home: orange
rouge : ~
orange : ~
practice: false
rain: false
##
-
date: 2022/08/04
time: '18:45'
away: orange
home: bleu
orange : ~
bleu : ~
practice: false
rain: false
-
date: 2022/08/04
time: '20:15'
away: jaune
home: rouge
jaune : ~
rouge : ~
practice: false
rain: false
##
-
date: 2022/08/11
time: '18:45'
away: jaune
home: bleu
jaune : ~
bleu : ~
practice: false
rain: false
-
date: 2022/08/11
time: '20:15'
away: orange
home: rouge
orange : ~
rouge : ~
practice: false
rain: false
##
-
date: 2022/08/11
time: '18:45'
away: jaune
home: bleu
jaune : ~
bleu : ~
practice: false
rain: false
-
date: 2022/08/11
time: '20:15'
away: orange
home: rouge
orange : ~
rouge : ~
practice: false
rain: false
##
-
date: 2022/08/18
time: '18:45'
away: bleu
home: rouge
rouge : ~
bleu : ~
practice: false
rain: false
-
date: 2022/08/18
time: '20:15'
away: orange
home: jaune
orange : ~
jaune : ~
practice: false
rain: false
##
-
date: 2022/08/25
time: '18:45'
away: rouge
home: jaune
rouge : ~
jaune : ~
practice: false
rain: false
-
date: 2022/08/25
time: '20:15'
away: bleu
home: orange
bleu : ~
orange : ~
practice: false
rain: false
+171
View File
@@ -0,0 +1,171 @@
const URL = "https://ballephenix.com";
const USERNAME = "XXXXXX";
const PASSWORD = "XXXXXX";
type PreGame = {
date: string;
time: string;
home: string;
away: string;
};
class WeekDay {
readonly year: number;
readonly month: number;
readonly day: number;
constructor(iso: string) {
const [y, m, d] = iso.split("-").map(Number);
this.year = y;
this.month = m;
this.day = d;
}
next(): WeekDay {
const d = new Date(this.year, this.month - 1, this.day + 7);
return new WeekDay(
`${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`,
);
}
saturday(): WeekDay {
const d = new Date(this.year, this.month - 1, this.day + 2);
return new WeekDay(
`${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`,
);
}
toString(): string {
return `${this.year}-${String(this.month).padStart(2, "0")}-${String(this.day).padStart(2, "0")}`;
}
}
const w1 = new WeekDay("2026-05-14");
const w2 = w1.next();
const w3 = w2.next();
const w4 = w3.next();
// skip Saint-Jean
const w5 = w4.next().next();
const w6 = w5.next();
const w7 = w6.next();
const w8 = w7.next();
const w9 = w8.next();
const w10 = w9.next();
const w11 = w10.next();
const w12 = w11.next();
// const tournament = w12.saturday();
const w13 = w12.next();
const w14 = w13.next();
const games: PreGame[] = [
{ date: `${w1}`, time: "18:45", home: "gris", away: "bleu" },
{ date: `${w1}`, time: "20:15", home: "mauve", away: "jaune" },
{ date: `${w2}`, time: "18:45", home: "jaune", away: "gris" },
{ date: `${w2}`, time: "20:15", home: "bleu", away: "mauve" },
{ date: `${w3}`, time: "18:45", home: "gris", away: "mauve" },
{ date: `${w3}`, time: "20:15", home: "jaune", away: "bleu" },
{ date: `${w4}`, time: "18:45", home: "mauve", away: "bleu" },
{ date: `${w4}`, time: "20:15", home: "gris", away: "jaune" },
{ date: `${w5}`, time: "18:45", home: "bleu", away: "jaune" },
{ date: `${w5}`, time: "20:15", home: "mauve", away: "gris" },
{ date: `${w6}`, time: "18:45", home: "jaune", away: "mauve" },
{ date: `${w6}`, time: "20:15", home: "bleu", away: "gris" },
{ date: `${w7}`, time: "18:45", home: "gris", away: "bleu" },
{ date: `${w7}`, time: "20:15", home: "mauve", away: "jaune" },
{ date: `${w8}`, time: "18:45", home: "jaune", away: "gris" },
{ date: `${w8}`, time: "20:15", home: "bleu", away: "mauve" },
{ date: `${w9}`, time: "18:45", home: "gris", away: "mauve" },
{ date: `${w9}`, time: "20:15", home: "jaune", away: "bleu" },
{ date: `${w10}`, time: "18:45", home: "mauve", away: "bleu" },
{ date: `${w10}`, time: "20:15", home: "gris", away: "jaune" },
{ date: `${w10}`, time: "21:35", home: "jaune", away: "gris" },
{ date: `${w11}`, time: "18:45", home: "bleu", away: "jaune" },
{ date: `${w11}`, time: "20:15", home: "mauve", away: "gris" },
{ date: `${w12}`, time: "18:45", home: "jaune", away: "mauve" },
{ date: `${w12}`, time: "20:15", home: "bleu", away: "gris" },
// { date: `${tournament}`, time: "09:00", home: "gris", away: "bleu" },
// { date: `${tournament}`, time: "10:30", home: "mauve", away: "jaune" },
// { date: `${tournament}`, time: "15:30", home: "bleu", away: "mauve" },
{ date: `${w13}`, time: "18:45", home: "gris", away: "mauve" },
{ date: `${w13}`, time: "20:15", home: "jaune", away: "bleu" },
{ date: `${w14}`, time: "18:45", home: "gris", away: "bleu" },
{ date: `${w14}`, time: "20:15", home: "mauve", away: "jaune" },
];
function extractCookies(headers: Headers): string {
const cookies: string[] = [];
for (const value of headers.getSetCookie()) {
cookies.push(value.split(";")[0]);
}
return cookies.join("; ");
}
async function login(): Promise<string> {
const res = await fetch(
`${URL}/login?username=${encodeURIComponent(USERNAME)}&password=${encodeURIComponent(PASSWORD)}`,
{ redirect: "manual" },
);
if (res.status !== 302) {
throw new Error(`Login failed with status ${res.status}`);
}
return extractCookies(res.headers);
}
async function createGame(cookie: string, game: PreGame): Promise<void> {
const body = new URLSearchParams({
"game-date": game.date,
"game-time": game.time,
"home-team": game.home,
"away-team": game.away,
});
const res = await fetch(`${URL}/membre/new-game`, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Cookie: cookie,
},
body: body.toString(),
redirect: "manual",
});
if (res.status >= 400) {
const text = await res.text();
throw new Error(
`Failed to create ${game.date} ${game.time} ${game.home} vs ${game.away}: ${text}`,
);
}
await res.body?.cancel();
}
async function main() {
console.log("Logging in...");
const cookie = await login();
console.log("Logged in.\n");
for (const game of games) {
console.log(
`Creating: ${game.date} ${game.time} ${game.home} vs ${game.away}`,
);
await createGame(cookie, game);
}
console.log(`\nDone. ${games.length} games created.`);
}
main();
+12
View File
@@ -0,0 +1,12 @@
{ fetchNuGet }: [
(fetchNuGet { pname = "Microsoft.Data.Sqlite"; version = "9.0.0"; sha256 = "0m58j9cdrkk8m0yl24z8jy3iafxfbwmf3v01cwhwnqs0cbq1ara8"; })
(fetchNuGet { pname = "Microsoft.Data.Sqlite.Core"; version = "9.0.0"; sha256 = "11s3pf12x4ghi1xn2dv6dsj3ckxq062m82dcinn2l42z590ny5fg"; })
(fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection.Abstractions"; version = "8.0.0"; sha256 = "1zw0bpp5742jzx03wvqc8csnvsbgdqi0ls9jfc5i2vd3cl8b74pg"; })
(fetchNuGet { pname = "Microsoft.Extensions.Logging.Abstractions"; version = "8.0.0"; sha256 = "1klcqhg3hk55hb6vmjiq2wgqidsl81aldw0li2z98lrwx26msrr6"; })
(fetchNuGet { pname = "Npgsql"; version = "8.0.0"; sha256 = "1x3jlin44frkhd7d50q0vmy0gapxqhmd4jv1nvsnkndp3xjsaynd"; })
(fetchNuGet { pname = "SQLitePCLRaw.bundle_e_sqlite3"; version = "2.1.10"; sha256 = "1irrg46sv2w12nh6jc810clbi06fgclnbky14b8kamfkgy61d4li"; })
(fetchNuGet { pname = "SQLitePCLRaw.core"; version = "2.1.10"; sha256 = "03q02p1cajqzcbk9112mgw3qq733l4gd2vi21dq2am4911imr5l2"; })
(fetchNuGet { pname = "SQLitePCLRaw.lib.e_sqlite3"; version = "2.1.10"; sha256 = "0xqa3l4p68vm3p5n4h3d2gs97vrpnvhwfv366i6fv5x80m2zcswv"; })
(fetchNuGet { pname = "SQLitePCLRaw.provider.e_sqlite3"; version = "2.1.10"; sha256 = "0n7cdwix5h9k578a07g00sw9c03sv4liy91qzpj9wb8k4673gfrh"; })
(fetchNuGet { pname = "System.Memory"; version = "4.5.3"; sha256 = "0naqahm3wljxb5a911d37mwjqjdxv9l0b49p5dmfyijvni2ppy8a"; })
]
+90
View File
@@ -0,0 +1,90 @@
#!/usr/bin/env python3
import argparse
import os
import sys
import requests
def fetch_json(api_root, path):
url = f"{api_root}{path}"
resp = requests.get(url, timeout=30)
resp.raise_for_status()
return resp.json()
def main():
parser = argparse.ArgumentParser(
description="Populate a local instance from production data via REST"
)
parser.add_argument(
"--source",
default=os.environ.get("PHENIX_SOURCE_URL", "https://ballephenix.com"),
help="Source API root (default: https://ballephenix.com)",
)
parser.add_argument(
"--target",
default=os.environ.get("PHENIX_TARGET_URL", "http://localhost:5000"),
help="Target API root (default: http://localhost:5000)",
)
parser.add_argument(
"--force",
action="store_true",
help="Clear existing games before inserting",
)
args = parser.parse_args()
source_root = args.source.rstrip("/")
target_root = args.target.rstrip("/")
years = fetch_json(source_root, "/api/available-years.json")
print(f"Years on source: {len(years)} ({min(years)}–{max(years)})")
all_games = []
for year in years:
games = fetch_json(source_root, f"/api/results/{year}.json")
all_games.extend(games)
print(f"Total games fetched: {len(all_games)}")
if args.force:
resp = requests.delete(f"{target_root}/api/games", timeout=30)
if resp.status_code not in (204, 200):
print(f"Failed to clear games: {resp.status_code} {resp.text}", file=sys.stderr)
sys.exit(1)
print("Cleared existing games")
inserted = 0
skipped = 0
errors = 0
for g in all_games:
payload = {
"date": g.get("date", ""),
"time": g.get("time", ""),
"home": g.get("home", ""),
"away": g.get("away", ""),
"homeScore": g.get("homeScore"),
"awayScore": g.get("awayScore"),
"practice": bool(g.get("practice")),
"rain": bool(g.get("rain")),
}
try:
resp = requests.post(f"{target_root}/api/games", json=payload, timeout=30)
if resp.status_code == 201:
inserted += 1
elif resp.status_code == 409:
skipped += 1
else:
print(f"Error on {g.get('date')} {g.get('time')}: {resp.status_code} {resp.text}", file=sys.stderr)
errors += 1
except requests.RequestException as e:
print(f"Request error on {g.get('date')} {g.get('time')}: {e}", file=sys.stderr)
errors += 1
print(f"Inserted: {inserted}, skipped: {skipped}, errors: {errors}")
print(f"Target: {target_root}")
if __name__ == "__main__":
main()
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Generated
+25 -7
View File
@@ -1,12 +1,15 @@
{ {
"nodes": { "nodes": {
"flake-utils": { "flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": { "locked": {
"lastModified": 1649676176, "lastModified": 1710146030,
"narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=", "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide", "owner": "numtide",
"repo": "flake-utils", "repo": "flake-utils",
"rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678", "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -17,16 +20,16 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1650998007, "lastModified": 1719848872,
"narHash": "sha256-NcJnbGDBBN023x8s3ll3HZxBcQoPq1ry9E2sjg+4flc=", "narHash": "sha256-H3+EC5cYuq+gQW8y0lSrrDZfH71LB4DAf+TDFyvwCNA=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "a3917caedfead19f853aa5769de4c3ea4e4db584", "rev": "00d80d13810dbfea8ab4ed1009b09100cca86ba8",
"type": "github" "type": "github"
}, },
"original": { "original": {
"id": "nixpkgs", "id": "nixpkgs",
"ref": "nixos-21.11", "ref": "nixos-unstable",
"type": "indirect" "type": "indirect"
} }
}, },
@@ -35,6 +38,21 @@
"flake-utils": "flake-utils", "flake-utils": "flake-utils",
"nixpkgs": "nixpkgs" "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", "root": "root",
+117 -22
View File
@@ -1,32 +1,127 @@
{ {
description = "Trying nest.js"; description = "Balle Phenix website — ASP.NET + SQLite";
inputs = { inputs = {
nixpkgs.url = "nixpkgs/nixos-21.11"; nixpkgs.url = "nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils"; flake-utils.url = "github:numtide/flake-utils";
}; };
outputs = { self, nixpkgs, flake-utils }: outputs = { self, nixpkgs, flake-utils, ... }:
let
nixosModule = { config, lib, pkgs, ... }:
let
cfg = config.services.all-dressed-programming.phenix-website;
phenix = self.packages.${pkgs.system}.website;
in {
options.services.all-dressed-programming.phenix-website = {
enable = lib.mkEnableOption "Balle Phenix website";
domain = lib.mkOption {
type = lib.types.str;
default = "ballephenix.com";
};
port = lib.mkOption {
type = lib.types.port;
default = 8000;
};
dataDir = lib.mkOption {
type = lib.types.path;
default = "/var/lib/phenix";
};
databaseUrl = lib.mkOption {
type = lib.types.str;
default = "";
};
sessionKey = lib.mkOption {
type = lib.types.str;
default = "";
};
};
flake-utils.lib.eachDefaultSystem (system: config = lib.mkIf cfg.enable {
let pkgs = nixpkgs.legacyPackages.${system}; in systemd.services.phenix-website = {
rec { description = "Balle Phenix website";
packages = flake-utils.lib.flattenTree { wantedBy = [ "multi-user.target" ];
hello = pkgs.hello; after = [ "network.target" ];
gitAndTools = pkgs.gitAndTools;
nodejs = pkgs.nodejs; serviceConfig = {
}; Type = "simple";
defaultPackage = packages.hello; ExecStart = "${phenix}/lib/Phenix";
apps.hello = flake-utils.lib.mkApp { drv = packages.hello; }; WorkingDirectory = "${phenix}/lib/";
defaultApp = apps.hello; Restart = "always";
devShell = pkgs.mkShell { RestartSec = 5;
name = "Nid-JS"; User = "phenix";
buildInputs = with pkgs; [ Group = "phenix";
nodejs
flyway
nodePackages.node2nix
];
}; };
environment =
{
ASPNETCORE_URLS = "http://0.0.0.0:${toString cfg.port}";
ASPNETCORE_ENVIRONMENT = "Production";
} }
); // lib.optionalAttrs (cfg.databaseUrl == "") {
ConnectionStrings__Default = "Data Source=${cfg.dataDir}/phenix.db";
}
// lib.optionalAttrs (cfg.databaseUrl != "") {
DatabaseProvider = "Postgres";
ConnectionStrings__Default = cfg.databaseUrl;
}
// lib.optionalAttrs (cfg.sessionKey != "") {
SessionKey = cfg.sessionKey;
};
postStart = ''
mkdir -p ${cfg.dataDir}
'';
};
users.users.phenix = {
isSystemUser = true;
group = "phenix";
home = cfg.dataDir;
createHome = true;
};
users.groups.phenix = {};
};
};
in
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
dotnet = pkgs.dotnetCorePackages.sdk_9_0;
pythonEnv = pkgs.python3.withPackages (ps: [ ps.requests ]);
phenix-website = pkgs.buildDotnetModule {
name = "phenix-website";
src = ./.;
projectFile = "Phenix.csproj";
selfContainedBuild = true;
dotnet-sdk = dotnet;
dotnet-runtime = pkgs.dotnetCorePackages.runtime_9_0;
runtimeIdentifiers = "linux-x64";
nugetDeps = ./deps.nix;
postInstall = ''
cp -r static $out/lib/static/
cp appsettings.json $out/lib/
'';
meta.mainProgram = "Phenix";
};
in {
packages = {
default = phenix-website;
website = phenix-website;
};
devShell = pkgs.mkShell {
name = "Phenix-Website";
buildInputs = [ dotnet pkgs.nuget-to-nix pythonEnv ];
shellHook = ''
export PATH="$PWD/dev/populate-db:$PATH"
'';
};
}) // {
nixosModules.x86_64-linux = nixosModule;
};
} }
-151
View File
@@ -1,151 +0,0 @@
var gulp = require('gulp');
const { series } = require('gulp');
var help = require('gulp-task-listing');
var clean = require('gulp-clean');
var toml = require('gulp-toml');
var gulpSass = 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');
var fs = require('fs');
exports.help = help;
exports.sass = function sass(){
var extraSassPath = ['./node_modules/'];
return gulp.src('./scss/*.scss')
.pipe(gulpSass({includePaths: extraSassPath}).on('error', gulpSass.logError))
.pipe(gulp.dest('./css'));
}
exports.clean = function clean(){
return gulp.src(["lib/", "css/"], {read: false})
.pipe(clean());
}
exports.compileResults = function compileResults(){
return gulp.src('data/*.yaml')
.pipe(yaml({safe: true}).on('error', console.log))
.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 + ';';
};
exports.encryptResults = function encryptResults(){
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'));
};
function getAvailableYears(files) {
var rgx = /^resultats(\d*).yaml/;
return files
.map((f) => rgx.exec(f))
.filter(_.isArray)
.map((a) => _.get(a, 1, ''))
.filter(_.identity)
.sort();
}
exports.templateProd = function templateProd() {
var dataFiles = fs.readdirSync('./data');
var data = {
production: true,
availableYears: JSON.stringify(getAvailableYears(dataFiles)),
salt: process.env.SALT,
playerListLocation: process.env.PLAYER_LIST_LOCATION}
return gulp.src('index.tmpl.html')
.pipe(rename("index.html"))
.pipe(template(data))
.pipe(gulp.dest('.'));
};
exports.templateDev = function templateDev() {
var dataFiles = fs.readdirSync('./data');
var data = {
availableYears: JSON.stringify(getAvailableYears(dataFiles)),
production: false,
salt: 'salt',
playerListLocation: 'api/players.spritz.js'}
console.log(data);
return gulp.src('index.tmpl.html')
.pipe(rename("index.html"))
.pipe(template(data))
.pipe(gulp.dest('.'));
};
exports.compileArticles = function compileArticles(){
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);
};
return 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/'));
};
exports.base = series(
exports.sass,
exports.compileResults,
exports.compileArticles,
exports.encryptResults
);
exports.prod = series(
exports.base,
exports.templateProd
);
exports.dev = series(
exports.base,
exports.templateDev
);
-24
View File
@@ -1,24 +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.7.0/css/font-awesome.min.css">
</head>
<body>
<script>
window.salt = "<%= salt %>";
window.availableYears = <%= availableYears %>;
</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>
-4937
View File
File diff suppressed because it is too large. Load diff
-35
View File
@@ -1,35 +0,0 @@
{
"name": "phenix-website",
"version": "1.0.0",
"description": "Main web site of Balle Phénix.",
"main": "index.html",
"dependencies": {
"almond": "^0.3.3",
"gulp": "^4.0.2",
"gulp-clean": "^0.4.0",
"gulp-modify": "^0.1.1",
"gulp-rename": "^2.0.0",
"gulp-sass": "^4.1.0",
"gulp-task-listing": "^1.1.0",
"gulp-template": "^5.0.0",
"gulp-toml": "^0.2.0",
"gulp-webserver": "^0.9.1",
"gulp-wrapper": "^1.0.0",
"gulp-yaml": "^2.0.4",
"lodash": "^4.17.21",
"marked": "^2.0.7",
"mithril": "^0.2.5",
"requirejs": "^2.3.6",
"spritzjs": "https://gitlab.com/didiercrunch/spritzjs.git",
"uikit": "^2.27.2"
},
"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
View File
@@ -1 +0,0 @@
*.js
-15
View File
@@ -1,15 +0,0 @@
define(['m', 'articles/saison_2021'], function (m, saison_2021) {
var simplifyArticleStructure = function(article){
var ret = {};
_.each(article, function(section, sectionName){
ret[sectionName] = m.trust(section.innerMarkdown);
});
return ret;
};
var articles = [
saison_2021
];
return _.map(articles, simplifyArticleStructure);
});
-13
View File
@@ -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&#39;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"
}
};
});
-24
View File
@@ -1,24 +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,
"/calendrier/:year": calendarPage,
"/reglement": rulesPage,
"/photos": photosPage,
"/membre": confidentialPage,
"/historique": historicPage,
"/contact": contactPage
});
});
-134
View File
@@ -1,134 +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._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){
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._isValidGame = function(game){
return !game.rain && ! game.practice;
};
resultParser.getStats = function(rawResults){
rawResults = _.filter(rawResults, resultParser._isValidGame);
rawResults = _.map(rawResults, resultParser._setCanonicalPoints);
var allTeams = resultParser._getAllTeams(resultParser._removeTemporaryResults(rawResults));
var getTeamStats = _.partial(resultParser._getTeamStats, rawResults);
return _.map(allTeams, getTeamStats);
};
return resultParser;
});
-29
View File
@@ -1,29 +0,0 @@
define(['m', '_'], function (m, _) {
var teams = {};
teams.teams = function(){
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'},
];
};
teams.getTeamColor = function(teamName){
var color;
_.each(teams.teams(), function(team){
if(team.name == teamName){
color = team.color;
return false;
}
});
return color;
};
return teams;
});
-92
View File
@@ -1,92 +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/SportsPhenixMtl"]',
m('i.fa.fa-facebook-square')
);
};
util.emailLink = function(){
return m('a[href="mailto:sportsphenixmtl@gmail.com"]', 'sportsphenixmtl@gmail.com');
};
util.resultatsURL = function(year){
var cacheBuster = window.Date.now();
year = !!year ? year: util.getDefaultYear();
return "api/resultats" + year + ".json?_=" + cacheBuster;
};
util.getAvailableYears = function(){
if(window.availableYears){
return _.clone(window.availableYears)
}
return [];
};
util.getDefaultYear = function(){
return _.max(util.getAvailableYears());
}
util.getResults = function(year){
var url = util.resultatsURL(year);
return m.request({method: "GET", url: url})
};
util.getDefaultResults = function(){
return util.getResults(util.getDefaultYear());
};
return util;
});
-138
View File
@@ -1,138 +0,0 @@
define(['m', '_', 'util', 'resultParser', 'teams', 'views/topNavBar', 'views/footer', 'views/schedulView'], function(m, _, util, resultParser, teams, topNavBar, footer, schedulView) {
function ppYear(year, availableYears) {
return _.last(availableYears) == year ? "" : year;
}
var statsView = {};
statsView.controller = function(year){
var games = m.prop([]);
return util.getResults(year)
.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.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(stats, year){
return m('div.uk-grid',
m('div.uk-width-medium-1-1.uk-width-large-1-1.uk-container-center',[
m('h2', 'Classement ' + year),
statsView.mainTable(stats()),
statsView.legend()
]));
};
var tabView = {};
tabView._createTab = function(activeYear, availableYears, year){
var isActive = (activeYear == year) || (activeYear == ppYear(year, availableYears));
return m('li', {'class': isActive ? 'uk-active': ''}, // 'uk-active'
m('a', {href: '#/calendrier/' + ppYear(year, availableYears)}, 'Saison ' + year));
}
tabView.view = function(vnode, isPlayoff, activeYear, availableYears){
var 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))));
};
var playoffView = {};
playoffView.line = function(x1, y1, x2, y2){
return m('line', {'x1': x1,
'y1': y1,
'x2': x2,
'y2': y2,
style: 'stroke:rgb(255,0,0);stroke-width:2'})
}
playoffView.horizontalLine = function(x1, x2, y){
return playoffView.line(x1, y, x2, y);
};
playoffView.view = function(){
var width = 600;
var height = 600;
var padding = 40;
return m('div',
m('svg', {width: width, height: height},
playoffView.horizontalLine(padding, width/2 - padding, height/3),
playoffView.horizontalLine(padding, width/2 - padding, 2 * height/3)
));
};
calendarPage = {};
calendarPage.view = function(vnode){
var isPlayoff = window.location.hash.endsWith('playoff');
var availableYears = util.getAvailableYears();
var year = _.get(m.route.param(), 'year', util.getDefaultYear());
var main = isPlayoff ? m.component(playoffView) : m.component(schedulView, year, availableYears);
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, year, availableYears),
m.component(tabView, isPlayoff, year, availableYears),
main
])),
m.component(footer)];
};
return calendarPage;
});
-20
View File
@@ -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;
});
-73
View File
@@ -1,73 +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.tel = function(){
return ' (514) 838-8950';
};
contactBody.address = function(){
return m('p', ' 10454 Sylvain-Garneau', m('br'), 'Montréal, Québec H1C 0A2');
};
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', util.emailLink())
),
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;
});
-23
View File
@@ -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', util.emailLink())),
m('h1', util.facebookLink())
])
);
};
return footer;
});
-28
View File
@@ -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;
});
-53
View File
@@ -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;
});
-55
View File
@@ -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;
});
-154
View File
@@ -1,154 +0,0 @@
define(['m', '_', 'views/nextGameDaySchedule', 'views/topNavBar', 'views/footer', 'articles/articles'], function (m, _ , nextGameDaySchedule, topNavBar, footer, articles) {
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.showMiniArticle = function(article){
return m('div', m('h3.uk-panel-title', m('a.uk-link-muted', {href: '#/nouvelles'}, article.title)),
m('p', article.smallBody || article.body));
}
mainPageNews.view = function(){
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'}})
]),
mainPageNews.showMiniArticle(_.get(articles, 0, {}))
]);
};
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'}, 'Calendrier')),
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&amp;layer=mapnik"; // "//www.openstreetmap.org/export/embed.html?bbox=-73.56355190277101%2C45.5294483312637%2C-73.54943275451662%2C45.53627996625677&amp;layer=mapnik"; // "//www.openstreetmap.org/export/embed.html?bbox=-73.56355190277101%2C45.5294483312637%2C-73.54943275451662%2C45.53627996625677&amp;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&amp;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 Walter-Stewart'),
mainMap.getWalterStewartMap()
]);
};
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;
});
-36
View File
@@ -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;
});
-73
View File
@@ -1,73 +0,0 @@
define(['m', '_', 'util', 'resultParser', 'views/scheduleTeamTags', 'images/rain.svg'], function (m, _ , util, resultParser, scheduleTeamTags, rainSvg) {
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([]);
return util.getDefaultResults()
.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', '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(games){
return m('table.uk-table.uk-table-hover.uk-table-striped.uk-table-condensed',[
nextGameDaySchedule._getTableHead(),
m('tbody',
nextGameDaySchedule._getGamesRows(games)
)]);
};
return nextGameDaySchedule;
});
-26
View File
@@ -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;
});
-318
View File
@@ -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('&nbsp;'));
};
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(_.isObject)
.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)
]));
};
return playersPage;
});
-72
View File
@@ -1,72 +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://www.asbm.ca/';
return [
m('h2', 'Règlements 2021'),
m('ul',[
m('li', m('h3', m('a', {href: 'files/regle_de_jeux_2021.pdf'},'Règles de jeu'))),
m('li', m('h3', m('a', {href: 'files/regles_et_procedures_2021.pdf'},'Règles et procédures'))),
m('li', m('h3', m('a', {href: 'files/charte_organisationnelle_2021.pdf'}, 'Charte Organisationnelle'))),
m('li', m('h3', m('a', {href: 'files/formulaire_inscription_2021.pdf'}, 'Formulaire d\'inscription'))),
m('li', m('h3', m('a', {href: 'files/code_ethique_2021.pdf'}, 'Code d\'éthique'))),
m('li', m('h3', m('a', {href: urlASBM}, 'Association des Sports de Balle à Montréal (ASBN)'))),
])
];
};
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.logoAndRules = function(){
return m('div.uk-grid',[
m('div.uk-width-large-1-3.uk-width-small-1-1', rulesPage.logo()),
rulesPage.rules()
]
);
};
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;
});
-60
View File
@@ -1,60 +0,0 @@
define(['m', '_', 'util', 'resultParser', 'teams', 'views/scheduleTeamTags', 'images/rain.svg'], function(m, _, util, resultParser, teams, scheduleTeamTags, rainSvg) {
var schedulView = {};
schedulView.controller = function(year){
var games = m.prop([]);
return util.getResults(year)
.then(games)
.then(resultParser.getNightGames);
};
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(games){
return m('div.uk-grid',
m('div.uk-width-large-3-5.uk-width-medium-1-1',
_.map(games(), schedulView._gameView)));
};
return schedulView;
})
-45
View File
@@ -1,45 +0,0 @@
define(['m', '_', 'teams'], function(m, _, teams) {
var 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);
};
return scheduleTeamTags;
})
-131
View File
@@ -1,131 +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', includeSubPath: true},
{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_, includeSubPath){
if(includeSubPath){
return window.location.hash.startsWith(topNavBar._getUrlForId(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, item.includeSubPath) ? '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;
});
-65
View File
@@ -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";
-9
View File
@@ -1,9 +0,0 @@
@import "custom_uikit";
.foo{
border: solid;
}
.ph-footer{
background-color: $navbar-background;
// height: 200px;
}
Loaded 100 of 145 files, more files were not shown because too many files have changed in this diff. Show more