merge merged_APE into master for evaluation #2

Merged
antoine.perederii merged 29 commits from merged_APE into main 1 year ago

2
.gitignore vendored

@ -435,4 +435,4 @@ FodyWeavers.xsd
### VisualStudio Patch ### ### VisualStudio Patch ###
# Additional files built by Visual Studio # Additional files built by Visual Studio
# End of https://www.toptal.com/developers/gitignore/api/dotnetcore,visualstudio,visualstudiocode # End of https://www.toptal.com/developers/gitignore/api/dotnetcore,visualstudio,visualstudiocode

@ -1,6 +1,6 @@
<div align = center> <div align = center>
<h1>HeartTrack</h1> <h1>HeartTrack - Admin</h1>
</div> </div>
@ -9,17 +9,15 @@
--- ---
&nbsp; ![PHP](https://img.shields.io/badge/Blazor-56478C?style=for-the-badge&logo=Blazor&logoColor=FFFFFF&labelColor=56478C) &nbsp; ![Blazor](https://img.shields.io/badge/Blazor-56478C?style=for-the-badge&logo=Blazor&logoColor=FFFFFF&labelColor=56478C)
&nbsp; ![CSS](https://img.shields.io/badge/CSS-000?style=for-the-badge&logo=css3&logoColor=white&color=darkblue) &nbsp; ![CSS](https://img.shields.io/badge/CSS-000?style=for-the-badge&logo=css3&logoColor=white&color=darkblue)
&nbsp; ![DOCKER](https://img.shields.io/badge/.NET-56478C?style=for-the-badge&logo=.NET&logoColor=FFFFFF&labelColor=56478C) &nbsp; ![.NET](https://img.shields.io/badge/.NET-56478C?style=for-the-badge&logo=.NET&logoColor=FFFFFF&labelColor=56478C)
&nbsp; ![PostgreSQL](https://img.shields.io/badge/Postgresql-000?style=for-the-badge&logo=postgresql&logoColor=white&color=blue)
&nbsp; ![JAVASCRIPT](https://img.shields.io/badge/JavaScript-000?style=for-the-badge&logo=javascript&logoColor=white&color=yellow)
</br> </br>
</div> </div>
# Table des matières # Table des matières
[Présentation](#présentation) | [Répartition du Git](#répartition-du-git) | [Documentation](#documentation) | [Prerequisites](#prerequisites) | [Getting Started](#getting-started) | [Features](#features) | [Ce que nous avons fait](#ce-que-nous-avons-fait) | [Fabriqué avec](#fabriqué-avec) | [Contributeurs](#contributeurs) | [Comment contribuer](#comment-contribuer) | [License](#license) | [Remerciements](#remerciements) [Présentation](#présentation) | [Fonctionnalités principales](#fonctionnalités-principales) | [Répartition du Git](#répartition-du-git) | [Prerequis](#prérequis) | [Fabriqué avec](#fabriqué-avec) | [Contributeurs](#contributeurs) | [Comment contribuer](#comment-contribuer) | [License](#license) | [Remerciements](#remerciements)
@ -33,37 +31,88 @@ HeartTrack est une application web PHP et mobile Android destinée aux sportifs
### Récapitulatif du Projet ### Récapitulatif du Projet
Le projet HeartTrack, avec son application HeartTrack, vise à offrir une solution Open Source d'analyse des données de fréquence cardiaque, en mettant l'accent sur les besoins des sportifs et des coachs. L'application sera capable de traiter et d'interpréter les données de manière intelligente, fournissant ainsi des informations précieuses pour optimiser les performances sportives et la santé. Ce dépôt contient une application Blazor conçue pour faciliter l'administration des utilisateurs au sein de votre application. L'application utilise le framework Blazor, qui permet le développement d'applications web interactives avec .NET.
## Fonctionnalités principales
1. **Gestion des Utilisateurs**: Ajoutez, modifiez et supprimez des utilisateurs de manière simple et efficace.
2. **Rôles Utilisateurs**: Attribuez des rôles à chaque utilisateur pour définir leurs permissions et accès.
3. **Tableau de Bord Convivial**: Interface utilisateur intuitive pour une expérience d'administration agréable.
4. **Sécurité Intégrée**: Utilisation des fonctionnalités de sécurité de Blazor pour protéger les données sensibles.
## Les attendus du projet
* [x] Implementation of a data visualization page with pagination (2 points)
* [x] Page for adding an element with validation (2 point)
* [x] Edit page of an element without validation (2 point)
* [x] Deletion of an element with a confirmation (2 point)
* [ ] Complex component (5 point)
* [x] Use API (Get / Insert / Update / Delete) (3 point)
* [x] IOC & DI use (4 point)
* [x] Localization & Globalization (at least two languages) (1 point)
* [ ] Use of the configuration (1 point)
* [ ] Logs (2 points)
* [x] Code cleanliness (2 point)
* [x] GUI (Global design, placement of buttons, ...) (2 point)
* [x] Code location (No code in views) (2 point)
* [x] The Readme (2 points)
* [x] Description of how the client solution works (code-level illustration) (6 points)
* [x] Merge request (2 points)
## Ce que nous avons fait
* [x] Les listing dans la page de tickets et d'Activités
* [x] La modification dans la page de tickets
* [x] La suppression dans la page de tickets
* [x] Le get by id dans la page de tickets
* [x] L'implementation de la partie API et du data service dans la pages d'Activités
* [x] L'authentification dans la branch `issue_auth` mais des problèmes persistent (les actions des services ne sont pas gerer par l'authentification)
* [ ] Le data service dans toutes les pages
* [ ] La répartitions des fonctionnalités de la page de tickets sur les autres pages
## Répartition du Git ## Répartition du Git
[**Sources**](Sources/) : **Code de l'application** [**Sources**](Sources/HeartTrack) : **Code de l'application**
[**Documents**](Documents/README_DOCUMENTS.md) : **Documentation de l'application et diagrammes**
<!-- [**Wiki**](https://codefirst.iut.uca.fr/git/HeartDev/Web/wiki/PHP) : **Wiki de notre projet (attendus PHP)** -->
--- ---
Le projet HeartTrack utilise un modèle de flux de travail Git (Gitflow) pour organiser le développement. Voici une brève explication des principales branches : Le projet HeartTrack utilise un modèle de flux de travail Git (Gitflow) pour organiser le développement. Voici une brève explication des principales branches :
- **branche prod** : Cette branche contient la version de production stable de l'application. Les modifications sur cette branche sont généralement destinées à des mises en production. - **branche WORK-NAME** : Cette branche contient la version de travail des différents membres de l'équipe. Les modifications sur cette branche sont bien souvent réalisé par le nom du membre en question.
- **branche master** : La branche master est similaire à la branche de production, mais elle peut contenir des fonctionnalités en cours de développement qui sont presque prêtes pour une mise en production. - **branche master** : La branche master est similaire à la branche de production, mais elle contient la version stable et final de notre application.
- **branche test** : Cette branche est utilisée pour permettre différents tests sur l'application. ### API PHP
- **branche issue** : Pour chaque problème (issue) que vous résolvez, vous devez créer une branche portant le nom de l'issue, par exemple, "issue_#32_nom" où 32 est le numéro de l'issue et nom est une description courte de l'issue. Une fois l'issue résolue, assurez-vous de mettre à jour le changelog et de créer une merge request. L'application Blazor utilise une API en PHP pour récupérer les données depuis la base de données.
- **branche démo** : Cette branche est utilisée pour déployer une version démo de l'application. Elle est mise à jour avec les dernières fonctionnalités en développement. Pour l'utiliser, vous devez faire tourner notre projet PHP disponible [ici](https://codefirst.iut.uca.fr/git/HeartDev/Web/src/branch/API_tests) sur votre machine locale. Pour ensuite changer le type de skockage `ActivityDataServiceFactice` par `ActivityDataServiceAPI` et vice versa dans le fichier `Program.cs` de l'application Blazor en ligne 24 `Add Data Services`.
## Documentation
Documentation et informations à propos de `HearthTrack` disponible [ici]()
### Prérequis ### Prérequis
* [Visual Studio Code](https://code.visualstudio.com/) - Exemple d'IDE gratuit * [Visual Studio](https://visualstudio.microsoft.com/fr/vs/) - IDE
* [Git](https://git-scm.com/) - Gestion de version * [Git](https://git-scm.com/) - Gestion de version
* [PostgreSQL](https://www.postgresql.org/) - Base de Données * [.NET SDK](https://dotnet.microsoft.com/download) - Platform open-source pour le développement d'applications
## Installation et Exécution
1. Clonez ce dépôt sur votre machine locale :
```bash
git clone https://codefirst.iut.uca.fr/git/HeartDev/Admin.git
```
2. Lacer Visual Studio et ouvrez le projet `HeartTrack.sln` dans le dossier `Sources/HeartTrack`.
Pour des raison de manque de la partie php, vous ne pourrez utiliser l'application qu'en localStorage. Il est cependant possible de tester l'aaplication avec la partie API en PHP en faisant tourner en local le projet php disponible [ici](https://codefirst.iut.uca.fr/git/HeartDev/Web/src/branch/API_tests) et en changant le type de skockage `ActivityDataServiceFactice` par `ActivityDataServiceAPI` dans le fichier `Program.cs` de l'application Blazor en ligne 24 `Add Data Services` et importer les dépendances en conséquence.
Comme ceci :
```csharp
// Add Data Services
builder.Services.AddScoped<IActivityDataService, ActivityDataServiceAPI>();
builder.Services.AddScoped<ITicketDataService, TicketDataServiceAPI>();
```
### Fabriqué avec ### Fabriqué avec
* [Visual Studio](https://visualstudio.microsoft.com/fr/vs/) - IDE * [Visual Studio](https://visualstudio.microsoft.com/fr/vs/) - IDE
@ -73,7 +122,6 @@ Documentation et informations à propos de `HearthTrack` disponible [ici]()
* [Blazor](https://dotnet.microsoft.com/apps/aspnet/web-apps/blazor) - Framework Web * [Blazor](https://dotnet.microsoft.com/apps/aspnet/web-apps/blazor) - Framework Web
* [C#](https://docs.microsoft.com/fr-fr/dotnet/csharp/) - Langage * [C#](https://docs.microsoft.com/fr-fr/dotnet/csharp/) - Langage
* [HTML 5, CSS 3](https://developer.mozilla.org/fr/docs/Web/HTML) - Langages * [HTML 5, CSS 3](https://developer.mozilla.org/fr/docs/Web/HTML) - Langages
* [Doxygen](https://codefirst.iut.uca.fr/sonar/) - Documentation
## Contributeurs ## Contributeurs
* [Antoine PEREDERII](https://codefirst.iut.uca.fr/git/antoine.perederii) * [Antoine PEREDERII](https://codefirst.iut.uca.fr/git/antoine.perederii)
@ -83,7 +131,7 @@ Documentation et informations à propos de `HearthTrack` disponible [ici]()
* [David D'HALMEIDA](https://codefirst.iut.uca.fr/git/david.d_almeida) * [David D'HALMEIDA](https://codefirst.iut.uca.fr/git/david.d_almeida)
## Comment contribuer ## Comment contribuer
1. Forkez le projet (<https://codefirst.iut.uca.fr/git/HeartDev/Web>) 1. Forkez le projet (<https://codefirst.iut.uca.fr/git/HeartDev/Admin>)
2. Créez votre branche (`git checkout -b feature/featureName`) 2. Créez votre branche (`git checkout -b feature/featureName`)
3. commit vos changements (`git commit -am 'Add some feature'`) 3. commit vos changements (`git commit -am 'Add some feature'`)
4. Push sur la branche (`git push origin feature/featureName`) 4. Push sur la branche (`git push origin feature/featureName`)

@ -9,5 +9,4 @@
<p role="alert">Sorry, there's nothing at this address.</p> <p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView> </LayoutView>
</NotFound> </NotFound>
</Router> </Router>

@ -0,0 +1,22 @@
namespace HeartTrack.Controllers
{
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc;
[Route("[controller]/[action]")]
public class CultureController : Controller
{
public IActionResult SetCulture(string culture, string redirectUri)
{
if (culture != null)
{
this.HttpContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(
new RequestCulture(culture)));
}
return this.LocalRedirect(redirectUri);
}
}
}

@ -1,13 +0,0 @@
namespace HeartTrack.Data;
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string? Summary { get; set; }
}

@ -1,20 +0,0 @@
namespace HeartTrack.Data;
public class WeatherForecastService
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate)
{
return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = startDate.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
}).ToArray());
}
}

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
@ -6,4 +6,33 @@
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="Blazored.LocalStorage" Version="4.4.0" />
<PackageReference Include="Blazorise" Version="1.4.1" />
<PackageReference Include="Blazorise.Bootstrap" Version="1.4.0" />
<PackageReference Include="Blazorise.DataGrid" Version="1.4.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.4.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="8.0.1" />
<PackageReference Include="MudBlazor" Version="6.12.0" />
</ItemGroup>
<ItemGroup>
<Folder Include="Services\ActivityDataService\" />
<Folder Include="Models\Activity\" />
<Folder Include="wwwroot\data\" />
<Folder Include="Services\TicketDataService\" />
</ItemGroup>
<ItemGroup>
<None Remove="Services\ActivityDataService\" />
<None Remove="Models\Activity\" />
<None Remove="Services\DataLocalService\" />
<None Remove="Services\ReportDataService\" />
<None Remove="Services\UserDataService\" />
<None Remove="Services\TicketDataService\" />
</ItemGroup>
<ItemGroup>
<Content Remove="wwwroot\data\" />
</ItemGroup>
</Project> </Project>

@ -1,25 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 17
VisualStudioVersion = 25.0.1706.7 VisualStudioVersion = 17.8.34330.188
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HeartTrack", "HeartTrack.csproj", "{17956D4F-7446-434C-8987-6B10A1FC66E8}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HeartTrack", "HeartTrack.csproj", "{17956D4F-7446-434C-8987-6B10A1FC66E8}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{17956D4F-7446-434C-8987-6B10A1FC66E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {17956D4F-7446-434C-8987-6B10A1FC66E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{17956D4F-7446-434C-8987-6B10A1FC66E8}.Debug|Any CPU.Build.0 = Debug|Any CPU {17956D4F-7446-434C-8987-6B10A1FC66E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{17956D4F-7446-434C-8987-6B10A1FC66E8}.Release|Any CPU.ActiveCfg = Release|Any CPU {17956D4F-7446-434C-8987-6B10A1FC66E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{17956D4F-7446-434C-8987-6B10A1FC66E8}.Release|Any CPU.Build.0 = Release|Any CPU {17956D4F-7446-434C-8987-6B10A1FC66E8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {2F984935-D2F4-4E45-A861-034CC5F7147B} SolutionGuid = {2F984935-D2F4-4E45-A861-034CC5F7147B}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

@ -0,0 +1,20 @@
namespace HeartTrack.Models
{
public class Activity
{
public int IdActivity { get; set; }
public string Type { get; set; }
public DateOnly Date { get; set; }
public DateOnly StartTime { get; set; }
public DateOnly EndTime { get; set; }
public int EffortRessenti { get; set; }
public float Variability { get; set; }
public float Variance { get; set; }
public float StandardDeviation { get; set; }
public float Average { get; set; }
public int Maximum { get; set; }
public int Minimum { get; set; }
public float AvrTemperature { get; set; }
public bool HasAutoPause { get; set; }
}
}

@ -0,0 +1,14 @@
using Blazorise;
namespace HeartTrack.Models
{
public class Report
{
public int Id { get; set; }
public string Username { get; set; }
public string ReportedUser { get; set; }
public string Raison { get; set; }
public string Description { get; set; }
public Image Image { get; set; }
}
}

@ -0,0 +1,25 @@
using Blazorise;
using System.ComponentModel.DataAnnotations;
namespace HeartTrack.Models
{
public class ReportModel
{
[Required]
[Range(0, 121425711425541)]
public int Id { get; set; }
[Required]
[StringLength(50)]
public string Username { get; set; }
[Required]
[StringLength(50)]
public string ReportedUser { get; set; }
[Required]
[StringLength(150)]
public string Raison { get; set; }
[Required]
[StringLength(500)]
public string Description { get; set; }
public Image Image { get; set; }
}
}

@ -0,0 +1,12 @@
namespace HeartTrack.Models
{
public class Ticket
{
public int Id { get; set; }
public string Username { get; set; }
public string Contexte { get; set; }
public string Description { get; set; }
public string Urgence { get; set; }
public Boolean isCheck { get; set; }
}
}

@ -0,0 +1,26 @@
using Blazorise;
using System.ComponentModel.DataAnnotations;
using System.Diagnostics.CodeAnalysis;
namespace HeartTrack.Models
{
public class TicketModel
{
[Required]
[Range(0, 121425711425541)]
public int Id { get; set; }
[Required]
[StringLength(50, ErrorMessage = "The username must not exceed 50 characters.")]
public string Username { get; set; }
[Required]
[StringLength(25, ErrorMessage = "The subject must not exceed 25 characters.")]
public string Contexte { get; set; }
[Required]
[StringLength(500, ErrorMessage = "Description must not exceed 500 characters.")]
public string Description { get; set; }
public Boolean Urgence { get; set; }
public Boolean isCheck { get; set; } = false;
}
}

@ -0,0 +1,17 @@
namespace HeartTrack.Models
{
public class User
{
public int Id { get; set; }
public string Username { get; set; }
public string Nom { get; set; }
public string Prenom { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string Sexe { get; set; }
public float Taille { get; set; }
public float Poids { get; set; }
public DateTime BirthDate { get; set; }
public Boolean isBan { get; set; }
}
}

@ -0,0 +1,39 @@
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace HeartTrack.Models
{
public class UserModel
{
[Required]
[Range(0,121425711425541)]
public int Id { get; set; }
[Required]
[StringLength(50, ErrorMessage = "The username must not exceed 50 characters.")]
public string Username { get; set; }
[Required]
[StringLength(50, ErrorMessage = "The name must not exceed 50 characters.")]
[RegularExpression(@"^[A-Za-z]$", ErrorMessage = "Numbers are not accepted.")]
public string FirstName { get; set; }
[Required]
[StringLength(25, ErrorMessage = "The last name must not exceed 25 characters.")]
[RegularExpression(@"^[A-Za-z]*$", ErrorMessage = "Numbers are not accepted.")]
public string LastName { get; set; }
[Required]
public string Email { get; set; }
[Required]
public string Password { get; set; }
[Required]
public string Sexe { get; set; }
[Required]
public float Taille { get; set; }
[Required]
public float Poids { get; set; }
[Required]
public DateTime BirthDate { get; set; }
public Boolean isBan { get; set; }
}
}

@ -0,0 +1,33 @@
@page "/activities"
@using HeartTrack.Models
<PageTitle>Activities</PageTitle>
<h1>@Localizer["Title"]</h1>
<p>
@Localizer["Description"]
</p>
<DataGrid TItem="Activity"
Data="@activities"
ReadData="@OnReadData"
TotalItems="@totalActivity"
PageSize="10"
ShowPager
Responsive>
<DataGridColumn TItem="Activity" Field="@nameof(Activity.IdActivity)" Caption="Id" />
<DataGridColumn TItem="Activity" Field="@nameof(Activity.Type)" Caption="Type" />
<DataGridColumn TItem="Activity" Field="@nameof(Activity.Date)" Caption="Date" />
<DataGridColumn TItem="Activity" Field="@nameof(Activity.StartTime)" Caption="@Localizer["StartTime"]" />
<DataGridColumn TItem="Activity" Field="@nameof(Activity.EndTime)" Caption="@Localizer["EndTime"]" />
<DataGridColumn TItem="Activity" Field="@nameof(Activity.EffortRessenti)" Caption="@Localizer["EffortRessenti"]" />
<DataGridColumn TItem="Activity" Field="@nameof(Activity.Variability)" Caption="@Localizer["Variability"]" />
<DataGridColumn TItem="Activity" Field="@nameof(Activity.Variance)" Caption="@Localizer["Variance"]" />
<DataGridColumn TItem="Activity" Field="@nameof(Activity.StandardDeviation)" Caption="@Localizer["StandardDeviation"]" />
<DataGridColumn TItem="Activity" Field="@nameof(Activity.Average)" Caption="@Localizer["Average"]" />
<DataGridColumn TItem="Activity" Field="@nameof(Activity.Maximum)" Caption="Maximum" />
<DataGridColumn TItem="Activity" Field="@nameof(Activity.Minimum)" Caption="Minimum" />
<DataGridColumn TItem="Activity" Field="@nameof(Activity.AvrTemperature)" Caption="@Localizer["AvrTemperature"]" />
<DataGridColumn TItem="Activity" Field="@nameof(Activity.HasAutoPause)" Caption="@Localizer["HasAutoPause"]" />
</DataGrid>

@ -0,0 +1,28 @@
using System;
using System.Net.Http;
using Blazorise.DataGrid;
using HeartTrack.Models;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization;
using HeartTrack.Services.ActivityDataService;
namespace HeartTrack.Pages
{
public partial class Activities
{
private List<Activity> activities;
private int totalActivity;
[Inject]
private IActivityDataService ActivitiesDataService { get; set; }
[Inject]
public IStringLocalizer<Activities> Localizer { get; set; }
private async Task OnReadData()
{
this.activities = await this.ActivitiesDataService.getAllActivities();
this.totalActivity = activities.Count();
}
}
}

@ -0,0 +1,37 @@
@page "/tickets/add"
<h3>Add Ticket</h3>
<EditForm Model="@ticketModel" OnValidSubmit="@HandleValidSubmit">
<DataAnnotationsValidator />
<ValidationSummary />
<p>
<label for="username">
Username:
<InputText id="username" @bind-Value="ticketModel.Username" />
</label>
</p>
<p>
<label for="context">
Context:
<InputText id="context" @bind-Value="ticketModel.Contexte" />
</label>
</p>
<p>
<label for="description">
Description:
<InputText id="description" @bind-Value="ticketModel.Description" />
</label>
</p>
<p>
<label for="urgence">
Urgence:
<InputCheckbox id="urgence" @bind-Value="ticketModel.Urgence" />
</label>
</p>
<button type="submit">Submit</button>
</EditForm>

@ -0,0 +1,43 @@
using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components;
using HeartTrack.Models;
using HeartTrack.Services;
using HeartTrack.Services.TicketDataService;
namespace HeartTrack.Pages
{
public partial class AddTicket
{
[Inject]
public ITicketDataService TicketStorage { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
[Inject]
public IWebHostEnvironment WebHostEnvironment { get; set; }
public TicketModel ticketModel = new(){};
private async void HandleValidSubmit()
{
var currentData = await TicketStorage.getAllTickets();
ticketModel.Id = currentData.Max(s => s.Id) + 1;
currentData.Add(new Ticket
{
Id = ticketModel.Id,
Username = ticketModel.Username,
Contexte = ticketModel.Contexte,
Description = ticketModel.Description/*,
Urgence = ticketModel.Urgence*/
});
await TicketStorage.SaveAllTickets(currentData);
NavigationManager.NavigateTo("tickets");
}
}
}

@ -1,19 +0,0 @@
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}

@ -1,49 +0,0 @@
@page "/fetchdata"
<PageTitle>Weather forecast</PageTitle>
@using HeartTrack.Data
@inject WeatherForecastService ForecastService
<h1>Weather forecast</h1>
<p>This component demonstrates fetching data from a service.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[]? forecasts;
protected override async Task OnInitializedAsync()
{
forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
}
}

@ -1,10 +1,16 @@
@page "/" @page "/"
@using System.Globalization
<PageTitle>Index</PageTitle> <PageTitle>Global View</PageTitle>
<h1>Hello, world!</h1> <h1>Global View</h1>
Welcome to your new app. This is the global statistics of our website.
<div style="align-content:flex-start">
<SurveyPrompt Title="How is Blazor working for you?" /> <div style=" display:block; margin:50px;">
<p>Number of views of the website</p>
<MudChart ChartType="ChartType.Line" ChartSeries="@Series" @bind-SelectedIndex="IndexChart" XAxisLabels="@XAxisLabels" Width="100%" Height="350px" ChartOptions="@Options" />
</div>
</div>

@ -0,0 +1,18 @@
using MudBlazor;
namespace HeartTrack.Pages
{
public partial class Index
{
private int IndexChart = -1;
public ChartOptions Options = new ChartOptions();
public List<ChartSeries> Series = new List<ChartSeries>()
{
new ChartSeries() { Name = "Views", Data = new double[] { 90, 79, 72, 69, 62, 62, 55, 65, 70 } }
};
public string[] XAxisLabels = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep" };
}
}

@ -0,0 +1,60 @@
@page "/tickets"
@using HeartTrack.Models
<PageTitle>Tickets</PageTitle>
<h1>Tickets list</h1>
This is the ticket list of users.
<div>
<MudButtonGroup Color="Color.Primary" Variant="Variant.Filled" Style="margin-top:50px; margin-bottom:5px;">
<MudButton OnClick="OnNavigateOnAddClicked">Add</MudButton>
</MudButtonGroup>
</div>
<DataGrid @ref="dataGrid"
TItem="Ticket"
Data="@tickets"
ReadData="@OnReadData"
TotalItems="@totalTicket"
PageSize="10"
ShowPager
Responsive
Sortable
SortMode="DataGridSortMode.Single">
<DataGridColumn TItem="Ticket" Field="@nameof(Ticket.Username)" Caption="Username" />
<DataGridColumn TItem="Ticket" Field="@nameof(Ticket.Contexte)" Caption="Context" />
<DataGridColumn TItem="Ticket" Field="@nameof(Ticket.Urgence)" Caption="Urgency" Width="150px" />
<DataGridColumn TItem="Ticket" Field="@nameof(Ticket.isCheck)" Caption="Status" SortField="@nameof( Ticket.isCheck )" SortDirection="Blazorise.SortDirection.Ascending" Width="150px" Editable>
<DisplayTemplate>
@if (context.isCheck)
{
<MudChip Variant="Variant.Outlined" Color="Color.Success">Closed</MudChip>
} else
{
<MudChip Variant="Variant.Outlined" Color="Color.Error">Open</MudChip>
}
</DisplayTemplate>
</DataGridColumn>
<DataGridColumn TItem="Ticket" Field="@nameof(Ticket.Id)" Caption="Actions" Sortable="false" Width="150px">
<DisplayTemplate>
@if (context.isCheck)
{
<MudFab Color="Color.Tertiary" StartIcon="@Icons.Material.Filled.RemoveRedEye" Size="Size.Small" @onclick="() => OnView(context.Id)" />
<MudFab Color="Color.Secondary" StartIcon="@Icons.Material.Filled.Delete" Size="Size.Small" @onclick="() => OnDelete(context)" />
}
else
{
<MudFab Color="Color.Tertiary" StartIcon="@Icons.Material.Filled.RemoveRedEye" Size="Size.Small" @onclick="() => OnView(context.Id)" />
<MudFab Color="Color.Secondary" StartIcon="@Icons.Material.Filled.Close" Size="Size.Small" @onclick="() => OnClose(context.Id)" />
<MudFab Color="Color.Secondary" StartIcon="@Icons.Material.Filled.Delete" Size="Size.Small" @onclick="() => OnDelete(context)" />
}
</DisplayTemplate>
</DataGridColumn>
</DataGrid>

@ -0,0 +1,98 @@
using Blazored.LocalStorage;
using Blazorise;
using Blazorise.DataGrid;
using HeartTrack.Models;
using HeartTrack.Services;
using HeartTrack.Services.TicketDataService;
using Microsoft.AspNetCore.Components;
using MudBlazor;
using System;
using static MudBlazor.CategoryTypes;
namespace HeartTrack.Pages
{
public partial class Tickets
{
private List<Ticket> tickets;
private int totalTicket;
private DataGrid<Ticket> dataGrid;
[Inject]
public HttpClient Http { get; set; }
[Inject]
public ILocalStorageService LocalStorage { get; set; }
[Inject]
public ITicketDataService TicketService { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
protected override async Task OnAfterRenderAsync(bool firstRender)
{
// Do not treat this action if is not the first render
if (!firstRender)
{
return;
}
var currentData = await LocalStorage.GetItemAsync<Ticket[]>("data");
// Check if data exist in the local storage
if (currentData == null)
{
// this code add in the local storage the fake data (we load the data sync for initialize the data before load the OnReadData method)
var originalData = Http.GetFromJsonAsync<Ticket[]>($"{NavigationManager.BaseUri}data/fake-tickets.json").Result;
await LocalStorage.SetItemAsync("data", originalData);
}
}
private async Task OnReadData(DataGridReadDataEventArgs<Ticket> e)
{
if (e.CancellationToken.IsCancellationRequested)
{
return;
}
// When you use a real API, we use this follow code
//var response = await Http.GetJsonAsync<Data[]>( $"http://my-api/api/data?page={e.Page}&pageSize={e.PageSize}" );
var response = (await LocalStorage.GetItemAsync<Ticket[]>("data")).Skip((e.Page - 1) * e.PageSize).Take(e.PageSize).ToList();
if (!e.CancellationToken.IsCancellationRequested)
{
totalTicket = (await LocalStorage.GetItemAsync<List<Ticket>>("data")).Count;
tickets = new List<Ticket>(response); // an actual data for the current page
}
}
private async void OnClose(int id)
{
await TicketService.Close(id);
// Reload the page
NavigationManager.NavigateTo("tickets", true);
}
private void OnView(int id)
{
NavigationManager.NavigateTo("tickets/view/"+id);
}
private void OnNavigateOnAddClicked()
{
NavigationManager.NavigateTo("tickets/add");
}
private async void OnDelete(Ticket t)
{
await TicketService.RemoveTicket(t);
NavigationManager.NavigateTo("tickets", true);
}
}
}

@ -0,0 +1,21 @@
@page "/tickets/view/{Id:int}"
<h3>Ticket number @Id</h3>
<p>
Username: @ticket.Username
</p>
<p>
Contexte: @ticket.Contexte
</p>
<p>
Description: @ticket.Description
</p>
<p>
Urgence: @ticket.Urgence
</p>
<p>
Status: @ticket.isCheck
</p>

@ -0,0 +1,39 @@
using HeartTrack.Models;
using HeartTrack.Services;
using HeartTrack.Services.TicketDataService;
using Microsoft.AspNetCore.Components;
namespace HeartTrack.Pages
{
public partial class ViewTicket
{
[Parameter]
public int Id { get; set; }
private Ticket ticket { get; set; } = new();
[Inject]
public ITicketDataService TicketService { get; set; }
[Inject]
public NavigationManager NavigationManager { get; set; }
[Inject]
public IWebHostEnvironment WebHostEnvironment { get; set; }
protected async Task OnInitializedAsync()
{
var item = await TicketService.getTicketById(Id);
ticket = new Ticket
{
Id = item.Id,
Username = item.Username,
Contexte = item.Contexte,
Description = item.Description,
Urgence = item.Urgence,
isCheck = item.isCheck
};
}
}
}

@ -28,6 +28,16 @@
</div> </div>
<script src="_framework/blazor.server.js"></script> <script src="_framework/blazor.server.js"></script>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.15.4/css/all.css">
@* Blazorised *@
<link href="_content/Blazorise/blazorise.css" rel="stylesheet" />
<link href="_content/Blazorise.Bootstrap/blazorise.bootstrap.css" rel="stylesheet" />
@* MudBlazor *@
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" />
<link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet" />
<script src="_content/MudBlazor/MudBlazor.min.js"></script>
</body> </body>
</html> </html>

@ -1,13 +1,78 @@
using Microsoft.AspNetCore.Components; using Blazorise;
using Microsoft.AspNetCore.Components.Web; using Blazorise.Bootstrap;
using HeartTrack.Data; using Blazorise.Icons.FontAwesome;
using Microsoft.AspNetCore.Localization;
using System.Globalization;
using Microsoft.Extensions.Options;
using Blazored.LocalStorage;
using HeartTrack.Services.ActivityDataService;
using HeartTrack.Services.TicketDataService;
using MudBlazor.Services;
using HeartTrack.Services.ActivityDataServiceFactice;
using HeartTrack.Services.TicketDataServiceFactice;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
// Add Badge Component services
builder.Services.AddMudServices();
// Add services to the container. // Add services to the container.
builder.Services.AddRazorPages(); builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor(); builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>(); builder.Services.AddHttpClient();
// Add Data Services
builder.Services.AddScoped<IActivityDataService, ActivityDataServiceFactice>();
builder.Services.AddScoped<ITicketDataService, TicketDataServiceFactice>();
builder.Services.AddBlazorise()
.AddBootstrapProviders()
.AddFontAwesomeIcons();
// Add the controller of the app
builder.Services.AddControllers();
// Add the localization to the app and specify the resources path
builder.Services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });
// Configure the localtization
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
// Set the default culture of the web site
options.DefaultRequestCulture = new RequestCulture(new CultureInfo("en-US"));
// Declare the supported culture
options.SupportedCultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("fr-FR") };
options.SupportedUICultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("fr-FR") };
});
builder.Services.AddBlazoredLocalStorage();
builder.Services.AddHttpClient();
builder.Services.AddBlazorise()
.AddBootstrapProviders()
.AddFontAwesomeIcons();
// Add the controller of the app
builder.Services.AddControllers();
// Add the localization to the app and specify the resources path
builder.Services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });
// Configure the localtization
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
// Set the default culture of the web site
options.DefaultRequestCulture = new RequestCulture(new CultureInfo("en-US"));
// Declare the supported culture
options.SupportedCultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("fr-FR") };
options.SupportedUICultures = new List<CultureInfo> { new CultureInfo("en-US"), new CultureInfo("fr-FR") };
});
builder.Services.AddBlazoredLocalStorage();
var app = builder.Build(); var app = builder.Build();
@ -25,8 +90,22 @@ app.UseStaticFiles();
app.UseRouting(); app.UseRouting();
// Get the current localization options
var options = ((IApplicationBuilder)app).ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
if (options?.Value != null)
{
// use the default localization
app.UseRequestLocalization(options.Value);
}
// Add the controller to the endpoint
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.MapBlazorHub(); app.MapBlazorHub();
app.MapFallbackToPage("/_Host"); app.MapFallbackToPage("/_Host");
app.Run(); app.Run();

@ -0,0 +1,150 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Title" xml:space="preserve">
<value>List d'activités</value>
</data>
<data name="Description" xml:space="preserve">
<value>This is t.</value>
</data>
<data name="StartTime" xml:space="preserve">
<value>helle</value>
</data>
<data name="EndTime" xml:space="preserve">
<value>Last e</value>
</data>
<data name="EffortRessenti" xml:space="preserve">
<value>Efforressenti</value>
</data>
<data name="Variability" xml:space="preserve">
<value>Variablity</value>
</data>
<data name="StandardDeviation" xml:space="preserve">
<value>Standard deviation</value>
</data>
<data name="Average" xml:space="preserve">
<value>Average</value>
</data>
<data name="AvrTemperature" xml:space="preserve">
<value>Average temperature</value>
</data>
<data name="HasAutoPause" xml:space="preserve">
<value>Has auto pause</value>
</data>
</root>

@ -0,0 +1,150 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Title" xml:space="preserve">
<value>Activities List</value>
</data>
<data name="Description" xml:space="preserve">
<value>This is the activity list of users.</value>
</data>
<data name="StartTime" xml:space="preserve">
<value>First name</value>
</data>
<data name="EndTime" xml:space="preserve">
<value>Last name</value>
</data>
<data name="EffortRessenti" xml:space="preserve">
<value>Effort ressenti</value>
</data>
<data name="Variability" xml:space="preserve">
<value>Variability</value>
</data>
<data name="StandardDeviation" xml:space="preserve">
<value>Standard deviation</value>
</data>
<data name="Average" xml:space="preserve">
<value>Average</value>
</data>
<data name="AvrTemperature" xml:space="preserve">
<value>Average temperature</value>
</data>
<data name="HasAutoPause" xml:space="preserve">
<value>Has auto pause</value>
</data>
</root>

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Description" xml:space="preserve">
<value>Cette page regroupe la liste des jetons (nom utilisateur et le mot de passe) du site.</value>
</data>
<data name="FirstN" xml:space="preserve">
<value>Nom de famille</value>
</data>
<data name="LastN" xml:space="preserve">
<value>Prénom</value>
</data>
<data name="Password" xml:space="preserve">
<value>Mot de passe</value>
</data>
<data name="Title" xml:space="preserve">
<value>Jetons utilisateurs</value>
</data>
<data name="Username" xml:space="preserve">
<value>Nom d'utilisateur</value>
</data>
</root>

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Description" xml:space="preserve">
<value>This is the token list of users.</value>
</data>
<data name="FirstN" xml:space="preserve">
<value>First name</value>
</data>
<data name="LastN" xml:space="preserve">
<value>Last name</value>
</data>
<data name="Password" xml:space="preserve">
<value>Password</value>
</data>
<data name="Title" xml:space="preserve">
<value>User token</value>
</data>
<data name="Username" xml:space="preserve">
<value>Username</value>
</data>
</root>

@ -0,0 +1,141 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Activity" xml:space="preserve">
<value>Activité</value>
</data>
<data name="Admin" xml:space="preserve">
<value>Gérer les admins</value>
</data>
<data name="Ban" xml:space="preserve">
<value>Utilisateurs bannis</value>
</data>
<data name="Global" xml:space="preserve">
<value>Vue d'ensemble</value>
</data>
<data name="Report" xml:space="preserve">
<value>Signalement</value>
</data>
<data name="Ticket" xml:space="preserve">
<value>Ticket utilisateur</value>
</data>
<data name="Token" xml:space="preserve">
<value>Jetons d'utilisateurs</value>
</data>
</root>

@ -0,0 +1,141 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Activity" xml:space="preserve">
<value>Activities</value>
</data>
<data name="Admin" xml:space="preserve">
<value>Admin managment</value>
</data>
<data name="Ban" xml:space="preserve">
<value>Ban users</value>
</data>
<data name="Global" xml:space="preserve">
<value>Global view</value>
</data>
<data name="Report" xml:space="preserve">
<value>Reports</value>
</data>
<data name="Ticket" xml:space="preserve">
<value>Tickets</value>
</data>
<data name="Token" xml:space="preserve">
<value>Tokens</value>
</data>
</root>

@ -0,0 +1,87 @@
using System;
using HeartTrack.Models;
using Microsoft.AspNetCore.Components;
namespace HeartTrack.Services.ActivityDataService
{
public class ActivityDataServiceAPI : IActivityDataService
{
[Inject]
private HttpClient _clientHttp { get; set; }
public ActivityDataServiceAPI(HttpClient clientHttp)
{
this._clientHttp = clientHttp;
}
public async Task AddActivity(Activity a)
{
HttpResponseMessage response = await _clientHttp.PostAsJsonAsync("http://localhost:8080/api/activities", a);
if (response.IsSuccessStatusCode)
{
Console.WriteLine("API - Activité avec l'id " + a.IdActivity + " ajouté avec succès");
}
else
{
Console.WriteLine("API - Problème ajout Activité");
}
}
public async Task<Activity> getActivityById(int id)
{
Activity activity = await _clientHttp.GetFromJsonAsync<Activity>("http://localhost:8080/api/activities/{id}");
return activity;
}
public async Task<List<Activity>> getAllActivities()
{
List<Activity> lActivities = await _clientHttp.GetFromJsonAsync<List<Activity>>("http://localhost:8080/api/activities");
return lActivities;
}
public async Task RemoveActivity(Activity a)
{
HttpResponseMessage response = await _clientHttp.DeleteAsync($"http://localhost:8080/api/activities/{a.IdActivity}");
if (response.IsSuccessStatusCode)
{
Console.WriteLine("API - Activité avec l'id " + a.IdActivity + " supprimé avec succès");
}
else
{
Console.WriteLine("API - Problème suppression Activité");
}
}
public async Task SaveAllActivities(List<Activity> list)
{
HttpResponseMessage response = await _clientHttp.PutAsJsonAsync("http://localhost:8080/api/activities", list);
if (response.IsSuccessStatusCode)
{
Console.WriteLine("API - List d'activités sauvegardé avec succès");
}
else
{
Console.WriteLine("API - Problème sauvegarde List d'activités");
}
}
public async Task UpdateActivity(Activity a)
{
HttpResponseMessage response = await _clientHttp.PutAsJsonAsync($"http://localhost:8080/api/activities/{a.IdActivity}", a);
if (response.IsSuccessStatusCode)
{
Console.WriteLine("API - Activité avec l'id " + a.IdActivity + " mis à jour avec succès");
}
else
{
Console.WriteLine("API - Problème mise à jour Activité");
}
}
}
}

@ -0,0 +1,140 @@
using System;
using Blazored.LocalStorage;
using HeartTrack.Models;
using HeartTrack.Services.ActivityDataService;
using Microsoft.AspNetCore.Components;
namespace HeartTrack.Services.ActivityDataServiceFactice
{
public class ActivityDataServiceFactice : IActivityDataService
{
[Inject]
private HttpClient _clientHttp { get; set; }
[Inject]
public ILocalStorageService _localStorage { get; set; }
[Inject]
public NavigationManager _navigationManager { get; set; }
private String EmplacementLocalStorage { get; set; }
private String EmplacementJson { get; set; }
public ActivityDataServiceFactice(HttpClient clientHttp, ILocalStorageService localStorage, NavigationManager navigationManager)
{
this._clientHttp = clientHttp;
this._localStorage = localStorage;
this._navigationManager = navigationManager;
this.EmplacementLocalStorage = "activitiesData";
this.EmplacementJson = $"{_navigationManager.BaseUri}data/fake-activities.json";
}
public async Task AddActivity(Activity a)
{
List<Activity> data = await getAllActivities();
data.Add(a);
await this.SaveAllActivities(data);
}
public async Task<Activity> getActivityById(int id)
{
Console.WriteLine("Passage dans le getFromPseudo...");
List<Activity> activities = await getAllActivities();
Activity? temp = null;
foreach (Activity a in activities)
{
if (a.IdActivity == id)
{
temp = a;
}
}
return temp;
}
public async Task<List<Activity>> getAllActivities()
{
List<Activity> lActivities = new List<Activity>();
lActivities = await this.getActivitiesFromLocalStorage();
if(lActivities.Count == 0)
{
lActivities = await this.getActivitiesFromJson(this.EmplacementJson);
await this.saveActivitiesLocalStorage(lActivities);
}
return lActivities;
}
private async Task<List<Activity>> getActivitiesFromJson(String cheminVersJson)
{
List<Activity> activitiesDeserialiser = new List<Activity>();
var data = await _clientHttp.GetFromJsonAsync<Activity[]>(cheminVersJson);
activitiesDeserialiser = data.ToList();
return activitiesDeserialiser;
}
private async Task<List<Activity>> getActivitiesFromLocalStorage()
{
List<Activity> activitiesFromLocalStorage = null;
var data = await _localStorage.GetItemAsync<Activity[]>(EmplacementLocalStorage);
if (data == null)
{
activitiesFromLocalStorage = new List<Activity>();
}
else
{
activitiesFromLocalStorage = data.ToList();
}
return activitiesFromLocalStorage;
}
public async Task RemoveActivity(Activity a)
{
List<Activity> data = await getAllActivities();
int index = -1;
foreach (Activity temp in data)
{
if (temp.IdActivity == a.IdActivity)
{
index = data.IndexOf(temp);
}
}
if (index != -1)
{
data.RemoveAt(index);
}
await this.SaveAllActivities(data);
data = await this.getAllActivities();
}
public async Task SaveAllActivities(List<Activity> list)
{
await this.saveActivitiesLocalStorage(list);
}
private async Task saveActivitiesLocalStorage(List<Activity> lActivities)
{
await _localStorage.SetItemAsync(this.EmplacementLocalStorage, lActivities);
}
public async Task UpdateActivity(Activity a)
{
await this.RemoveActivity(a);
await this.AddActivity(a);
}
}
}

@ -0,0 +1,21 @@
using System;
using HeartTrack.Models;
namespace HeartTrack.Services.ActivityDataService
{
public interface IActivityDataService
{
public Task<List<Activity>> getAllActivities();
public Task SaveAllActivities(List<Activity> list);
public Task AddActivity(Activity u);
public Task RemoveActivity(Activity u);
public Task UpdateActivity(Activity u);
public Task<Activity> getActivityById(int id);
}
}

@ -0,0 +1,22 @@
using System;
using HeartTrack.Models;
namespace HeartTrack.Services.TicketDataService
{
public interface ITicketDataService
{
public Task<List<Ticket>> getAllTickets();
public Task SaveAllTickets(List<Ticket> list);
public Task AddTicket(Ticket t);
public Task RemoveTicket(Ticket t);
public Task UpdateTicket(Ticket t);
public Task<Ticket> getTicketById(int id);
public Task Close(int Id);
}
}

@ -0,0 +1,91 @@
using System;
using HeartTrack.Models;
using Microsoft.AspNetCore.Components;
namespace HeartTrack.Services.TicketDataService
{
public class TicketDataServiceAPI : ITicketDataService
{
[Inject]
private HttpClient _clientHttp { get; set; }
public TicketDataServiceAPI(HttpClient clientHttp)
{
this._clientHttp = clientHttp;
}
public async Task AddTicket(Ticket t)
{
HttpResponseMessage response = await _clientHttp.PostAsJsonAsync("http://localhost:8080/api/tickets", t);
if (response.IsSuccessStatusCode)
{
Console.WriteLine("API - Ticket avec l'id " + t.Id + " ajouté avec succès");
}
else
{
Console.WriteLine("API - Problème ajout Ticket");
}
}
public async Task<Ticket> getTicketById(int id)
{
Ticket Ticket = await _clientHttp.GetFromJsonAsync<Ticket>("http://localhost:8080/api/tickets/{id}");
return Ticket;
}
public async Task<List<Ticket>> getAllTickets()
{
List<Ticket> lTickets = await _clientHttp.GetFromJsonAsync<List<Ticket>>("http://localhost:8080/api/tickets");
return lTickets;
}
public async Task RemoveTicket(Ticket t)
{
HttpResponseMessage response = await _clientHttp.DeleteAsync($"http://localhost:8080/api/tickets/{t.Id}");
if (response.IsSuccessStatusCode)
{
Console.WriteLine("API - Ticket avec l'id " + t.Id + " supprimé avec succès");
}
else
{
Console.WriteLine("API - Problème suppression Ticket");
}
}
public async Task SaveAllTickets(List<Ticket> list)
{
HttpResponseMessage response = await _clientHttp.PutAsJsonAsync("http://localhost:8080/api/tickets", list);
if (response.IsSuccessStatusCode)
{
Console.WriteLine("API - List de tickets sauvegardé avec succès");
}
else
{
Console.WriteLine("API - Problème sauvegarde List de tickets");
}
}
public async Task UpdateTicket(Ticket t)
{
HttpResponseMessage response = await _clientHttp.PutAsJsonAsync($"http://localhost:8080/api/tickets/{t.Id}", t);
if (response.IsSuccessStatusCode)
{
Console.WriteLine("API - Ticket avec l'id " + t.Id + " mis à jour avec succès");
}
else
{
Console.WriteLine("API - Problème mise à jour Ticket");
}
}
public async Task Close(int id)
{
}
}
}

@ -0,0 +1,144 @@
using System;
using Blazored.LocalStorage;
using HeartTrack.Models;
using HeartTrack.Services.TicketDataService;
using Microsoft.AspNetCore.Components;
namespace HeartTrack.Services.TicketDataServiceFactice
{
public class TicketDataServiceFactice : ITicketDataService
{
[Inject]
private HttpClient _clientHttp { get; set; }
[Inject]
public ILocalStorageService _localStorage { get; set; }
[Inject]
public NavigationManager _navigationManager { get; set; }
private String EmplacementLocalStorage { get; set; }
private String EmplacementJson { get; set; }
public TicketDataServiceFactice(HttpClient clientHttp, ILocalStorageService localStorage, NavigationManager navigationManager)
{
this._clientHttp = clientHttp;
this._localStorage = localStorage;
this._navigationManager = navigationManager;
this.EmplacementLocalStorage = "ticketsData";
this.EmplacementJson = $"{_navigationManager.BaseUri}data/fake-tickets.json";
}
public async Task AddTicket(Ticket t)
{
List<Ticket> data = await getAllTickets();
data.Add(t);
await this.SaveAllTickets(data);
}
public async Task<Ticket> getTicketById(int id)
{
List<Ticket> tickets = await getAllTickets();
Ticket? temp = null;
foreach (Ticket t in tickets)
{
if (t.Id == id)
{
temp = t;
}
}
return temp;
}
public async Task<List<Ticket>> getAllTickets()
{
List<Ticket> lTickets = new List<Ticket>();
lTickets = await this.getTicketsFromLocalStorage();
if (lTickets.Count == 0)
{
lTickets = await this.getTicketsFromJson(this.EmplacementJson);
await this.saveTicketsLocalStorage(lTickets);
}
return lTickets;
}
private async Task<List<Ticket>> getTicketsFromJson(String cheminVersJson)
{
List<Ticket> TicketsDeserialiser = new List<Ticket>();
var data = await _clientHttp.GetFromJsonAsync<Ticket[]>(cheminVersJson);
TicketsDeserialiser = data.ToList();
return TicketsDeserialiser;
}
private async Task<List<Ticket>> getTicketsFromLocalStorage()
{
List<Ticket> TicketsFromLocalStorage = null;
var data = await _localStorage.GetItemAsync<Ticket[]>(EmplacementLocalStorage);
if (data == null)
{
TicketsFromLocalStorage = new List<Ticket>();
}
else
{
TicketsFromLocalStorage = data.ToList();
}
return TicketsFromLocalStorage;
}
public async Task RemoveTicket(Ticket t)
{
// Get the current data
var currentData = await _localStorage.GetItemAsync<List<Ticket>>("data");
// Get the item int the list
var item = currentData.FirstOrDefault(w => w.Id == t.Id);
// Delete item in
currentData.Remove(item);
// Save the data
await _localStorage.SetItemAsync("data", currentData);
}
public async Task SaveAllTickets(List<Ticket> list)
{
await this.saveTicketsLocalStorage(list);
}
private async Task saveTicketsLocalStorage(List<Ticket> lTickets)
{
await _localStorage.SetItemAsync(this.EmplacementLocalStorage, lTickets);
}
public async Task UpdateTicket(Ticket t)
{
await this.RemoveTicket(t);
await this.AddTicket(t);
}
public async Task Close(int Id)
{
// Get the current data
var currentData = await _localStorage.GetItemAsync<List<Ticket>>("data");
// Get the item int the list
var item = currentData.FirstOrDefault(w => w.Id == Id);
// Update item status
item.isCheck = true;
// Save the data
await _localStorage.SetItemAsync("data", currentData);
}
}
}

@ -0,0 +1,12 @@
@using System.Globalization
<p>
<label>
<select @bind="Culture">
@foreach (var culture in @supportedCultures)
{
<option value="@culture">@culture.DisplayName</option>
}
</select>
</label>
</p>

@ -0,0 +1,37 @@
using Microsoft.AspNetCore.Components;
using System.Globalization;
namespace HeartTrack.Shared
{
public partial class CultureSelector
{
[Inject]
private NavigationManager NavigationManager { get; set; }
private CultureInfo[] supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("fr-FR")
};
private CultureInfo Culture
{
get => CultureInfo.CurrentCulture;
set
{
if (CultureInfo.CurrentUICulture == value)
{
return;
}
var culture = value.Name.ToLower(CultureInfo.InvariantCulture);
var uri = new Uri(this.NavigationManager.Uri).GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
var query = $"?culture={Uri.EscapeDataString(culture)}&" + $"redirectUri={Uri.EscapeDataString(uri)}";
// Redirect the user to the culture controller to set the cookie
this.NavigationManager.NavigateTo("/Culture/SetCulture" + query, forceLoad: true);
}
}
}
}

@ -1,20 +1,39 @@
@inherits LayoutComponentBase @inherits LayoutComponentBase
<MudThemeProvider />
<MudDialogProvider />
<MudSnackbarProvider />
<PageTitle>HeartTrack</PageTitle> <PageTitle>HeartTrack</PageTitle>
<div class="page"> <div class="page">
<div class="sidebar"> <div class="sidebar @NavMenuCssClass" @onclick="ToggleNavMenu">
<NavMenu /> <NavMenu />
</div> </div>
<main> <main>
<div class="top-row px-4">
<a href="https://docs.microsoft.com/aspnet/" target="_blank">About</a> <MudAppBar Color="Color.Primary" Fixed="false">
</div> <MudIconButton Icon="@Icons.Material.Filled.Menu" Color="Color.Inherit" Edge="Edge.Start" @onclick="ToggleNavMenu">
<span class="navbat-toggler-icon"></span>
</MudIconButton>
<MudSpacer />
<MudIconButton Icon="@Icons.Material.Filled.ManageAccounts" Color="Color.Inherit" Edge="Edge.End" @onclick="ToggleProfilMenu"/>
</MudAppBar>
@* <div class="top-row px-4 auth">
@* <div class="container-fluid toggler-container">
<button title="Navigation menu" class="navbar-toggler custom-toggler" @onclick="ToggleNavMenu">
<span class="navbat-toggler-icon"></span>
</button>
</div> *@
@* Messages, notifs et pp compte à mettre *@
@* <div class="top-row px-4">
<CultureSelector />
<button type="button" class="btn btn-link ml-md-auto" @onclick="@LogoutClick">Logout</button>
</div>
</div> *@
<article class="content px-4"> <article class="content px-4">
@Body @Body
</article> </article>
</main> </main>
</div> </div>

@ -0,0 +1,25 @@
using HeartTrack.Services;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components;
namespace HeartTrack.Shared
{
public partial class MainLayout
{
[Inject]
public NavigationManager NavigationManager { get; set; }
private bool collapseNavMenu = true;
private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
private void ToggleNavMenu()
{
collapseNavMenu = !collapseNavMenu;
}
private void ToggleProfilMenu()
{
}
}
}

@ -1,40 +1,26 @@
<div class="top-row ps-3 navbar navbar-dark"> <div class="top-row ps-3 navbar navbar-dark">
<div class="container-fluid"> <div class="container-fluid">
<a class="navbar-brand" href="">HeartTrack</a> <a class="navbar-brand" href="">@Localizer["Panel"]</a>
<button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
<span class="navbar-toggler-icon"></span>
</button>
</div> </div>
</div> </div>
<div class="@NavMenuCssClass" @onclick="ToggleNavMenu"> <div>
<nav class="flex-column"> <nav class="flex-column">
<div class="nav-item px-3"> <div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All"> <NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span> Home <span class="oi oi-home" aria-hidden="true"></span> @Localizer["Global"]
</NavLink> </NavLink>
</div> </div>
<div class="nav-item px-3"> <div class="nav-item px-3">
<NavLink class="nav-link" href="counter"> <NavLink class="nav-link" href="activities">
<span class="oi oi-plus" aria-hidden="true"></span> Counter <span class="oi oi-list-rich" aria-hidden="true"></span> @Localizer["Activity"]
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="fetchdata">
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
</NavLink> </NavLink>
</div> </div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="tickets">
<span class="oi oi-plus" aria-hidden="true"></span> @Localizer["Ticket"]
</NavLink>
</div>
</nav> </nav>
</div> </div>
@code {
private bool collapseNavMenu = true;
private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
private void ToggleNavMenu()
{
collapseNavMenu = !collapseNavMenu;
}
}

@ -0,0 +1,12 @@
using HeartTrack.Pages;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization;
namespace HeartTrack.Shared
{
public partial class NavMenu
{
[Inject]
public IStringLocalizer<NavMenu> Localizer { get; set; }
}
}

@ -1,16 +1,19 @@
.navbar-toggler { /* Bouton rétrécicement de menu */
background-color: rgba(255, 255, 255, 0.1); .navbar-toggler {
background-color: black;
} }
/* En-tête */
.top-row { .top-row {
height: 3.5rem; height: 3.5rem;
background-color: rgba(0,0,0,0.4); background-color: darkblue;
} }
.navbar-brand { .navbar-brand {
font-size: 1.1rem; font-size: 1.1rem;
} }
/* Icons */
.oi { .oi {
width: 2rem; width: 2rem;
font-size: 1.1rem; font-size: 1.1rem;
@ -40,19 +43,22 @@
line-height: 3rem; line-height: 3rem;
} }
/* Rectangle items*/
.nav-item ::deep a.active { .nav-item ::deep a.active {
background-color: rgba(255,255,255,0.25); background-color: black;
color: white; color: white;
} }
/* Hover des items */
.nav-item ::deep a:hover { .nav-item ::deep a:hover {
background-color: rgba(255,255,255,0.1); background-color: rgba(255,255,255,0.1);
color: white; color: white;
} }
@media (min-width: 641px) { @media (min-width: 641px) {
/* Activer ou non le bouton défilement menu*/
.navbar-toggler { .navbar-toggler {
display: none; display: block;
} }
.collapse { .collapse {

@ -1,17 +0,0 @@
<div class="alert alert-secondary mt-4">
<span class="oi oi-pencil me-2" aria-hidden="true"></span>
<strong>@Title</strong>
<span class="text-nowrap">
Please take our
<a target="_blank" class="font-weight-bold link-dark" href="https://go.microsoft.com/fwlink/?linkid=2149017">brief survey</a>
</span>
and tell us what you think.
</div>
@code {
// Demonstrates how a parent component can supply parameters
[Parameter]
public string? Title { get; set; }
}

@ -8,4 +8,5 @@
@using Microsoft.JSInterop @using Microsoft.JSInterop
@using HeartTrack @using HeartTrack
@using HeartTrack.Shared @using HeartTrack.Shared
@using Blazorise.DataGrid
@using MudBlazor

@ -63,3 +63,17 @@ a, .btn-link {
content: "An error has occurred." content: "An error has occurred."
} }
.custom-toggler .navbar-toggler-icon {
background-image: url("https://icons8.com/icon/JTddWDKbAzgl/menu");
}
.custom-toggler.navbar-toggler {
border-color: rgb(255,102,203);
}
.navbar-toggler:focus,
.navbar-toggler:active,
.navbar-toggler-icon:focus {
outline: none;
box-shadow: none;
}

@ -0,0 +1,418 @@
[
{
"idActivity": 1,
"type": "Type2",
"date": "2014-01-16",
"startTime": "2022-01-18",
"endTime": "1990-12-23",
"effortRessenti": 5,
"variability": 31.9135,
"variance": 47.9027,
"standardDeviation": 51.4366,
"average": 77.616,
"maximum": 156,
"minimum": 99,
"avrTemperature": 47.9859,
"hasAutoPause": false
},
{
"idActivity": 2,
"type": "Type1",
"date": "2018-11-27",
"startTime": "2008-09-06",
"endTime": "1971-04-16",
"effortRessenti": 2,
"variability": 63.2869,
"variance": 4.3233,
"standardDeviation": 36.6456,
"average": 14.0372,
"maximum": 182,
"minimum": 57,
"avrTemperature": 47.8921,
"hasAutoPause": true
},
{
"idActivity": 3,
"type": "Type2",
"date": "2018-01-24",
"startTime": "2009-03-24",
"endTime": "1941-05-20",
"effortRessenti": 4,
"variability": 66.0437,
"variance": 40.1499,
"standardDeviation": 85.1707,
"average": 52.538,
"maximum": 114,
"minimum": 41,
"avrTemperature": 48.6091,
"hasAutoPause": true
},
{
"idActivity": 4,
"type": "Type3",
"date": "2014-07-05",
"startTime": "1954-10-02",
"endTime": "2019-11-13",
"effortRessenti": 3,
"variability": 72.5219,
"variance": 88.7179,
"standardDeviation": 56.3285,
"average": 99.2423,
"maximum": 101,
"minimum": 35,
"avrTemperature": 99.5707,
"hasAutoPause": false
},
{
"idActivity": 5,
"type": "Type1",
"date": "2020-07-27",
"startTime": "1970-07-09",
"endTime": "2014-01-07",
"effortRessenti": 1,
"variability": 91.2868,
"variance": 35.2977,
"standardDeviation": 89.1283,
"average": 24.5516,
"maximum": 185,
"minimum": 55,
"avrTemperature": 61.2443,
"hasAutoPause": false
},
{
"idActivity": 6,
"type": "Type3",
"date": "2022-01-21",
"startTime": "1988-07-11",
"endTime": "1947-10-08",
"effortRessenti": 2,
"variability": 39.2403,
"variance": 68.3035,
"standardDeviation": 48.4541,
"average": 15.0519,
"maximum": 87,
"minimum": 61,
"avrTemperature": 24.96,
"hasAutoPause": true
},
{
"idActivity": 7,
"type": "Type2",
"date": "2020-07-04",
"startTime": "1966-07-04",
"endTime": "1953-11-28",
"effortRessenti": 3,
"variability": 77.9106,
"variance": 50.2753,
"standardDeviation": 27.6544,
"average": 73.1399,
"maximum": 178,
"minimum": 80,
"avrTemperature": 70.0154,
"hasAutoPause": true
},
{
"idActivity": 8,
"type": "Type3",
"date": "2021-11-01",
"startTime": "1966-06-30",
"endTime": "1966-10-08",
"effortRessenti": 5,
"variability": 12.8896,
"variance": 91.5997,
"standardDeviation": 28.1367,
"average": 63.2516,
"maximum": 99,
"minimum": 64,
"avrTemperature": 47.2724,
"hasAutoPause": false
},
{
"idActivity": 9,
"type": "Type1",
"date": "2020-10-18",
"startTime": "1993-02-09",
"endTime": "1922-01-12",
"effortRessenti": 2,
"variability": 75.0622,
"variance": 28.5926,
"standardDeviation": 84.1056,
"average": 82.6735,
"maximum": 184,
"minimum": 58,
"avrTemperature": 2.5165,
"hasAutoPause": true
},
{
"idActivity": 10,
"type": "Type3",
"date": "2019-07-21",
"startTime": "1978-01-14",
"endTime": "1921-10-28",
"effortRessenti": 2,
"variability": 38.4167,
"variance": 8.9565,
"standardDeviation": 79.1064,
"average": 71.7045,
"maximum": 189,
"minimum": 41,
"avrTemperature": 11.3153,
"hasAutoPause": false
},
{
"idActivity": 11,
"type": "Type2",
"date": "2015-01-10",
"startTime": "1982-05-10",
"endTime": "2000-06-20",
"effortRessenti": 2,
"variability": 7.298,
"variance": 84.2038,
"standardDeviation": 59.7613,
"average": 24.1556,
"maximum": 84,
"minimum": 40,
"avrTemperature": 79.2884,
"hasAutoPause": true
},
{
"idActivity": 12,
"type": "Type1",
"date": "2014-12-15",
"startTime": "2003-07-20",
"endTime": "1957-10-10",
"effortRessenti": 4,
"variability": 6.1594,
"variance": 39.0998,
"standardDeviation": 87.1683,
"average": 99.7483,
"maximum": 84,
"minimum": 36,
"avrTemperature": 90.0641,
"hasAutoPause": true
},
{
"idActivity": 13,
"type": "Type3",
"date": "2019-07-09",
"startTime": "1977-03-04",
"endTime": "1960-01-01",
"effortRessenti": 4,
"variability": 44.0535,
"variance": 12.5373,
"standardDeviation": 58.7271,
"average": 19.4843,
"maximum": 193,
"minimum": 76,
"avrTemperature": 22.6955,
"hasAutoPause": true
},
{
"idActivity": 14,
"type": "Type2",
"date": "2023-12-11",
"startTime": "1954-06-28",
"endTime": "1993-06-24",
"effortRessenti": 2,
"variability": 10.3723,
"variance": 54.257,
"standardDeviation": 69.0052,
"average": 97.0453,
"maximum": 181,
"minimum": 72,
"avrTemperature": 81.2482,
"hasAutoPause": false
},
{
"idActivity": 15,
"type": "Type1",
"date": "2018-07-02",
"startTime": "2024-01-03",
"endTime": "1964-08-30",
"effortRessenti": 2,
"variability": 48.2932,
"variance": 67.7662,
"standardDeviation": 94.5576,
"average": 98.3297,
"maximum": 177,
"minimum": 38,
"avrTemperature": 91.9669,
"hasAutoPause": true
},
{
"idActivity": 16,
"type": "Type1",
"date": "2018-07-06",
"startTime": "2012-12-28",
"endTime": "2014-04-26",
"effortRessenti": 1,
"variability": 26.7247,
"variance": 8.6121,
"standardDeviation": 32.8475,
"average": 36.0507,
"maximum": 135,
"minimum": 95,
"avrTemperature": 64.4691,
"hasAutoPause": true
},
{
"idActivity": 17,
"type": "Type2",
"date": "2022-07-08",
"startTime": "1934-08-04",
"endTime": "1948-01-16",
"effortRessenti": 3,
"variability": 24.5678,
"variance": 89.474,
"standardDeviation": 6.4851,
"average": 80.388,
"maximum": 198,
"minimum": 65,
"avrTemperature": 73.0159,
"hasAutoPause": false
},
{
"idActivity": 18,
"type": "Type3",
"date": "2020-08-08",
"startTime": "1943-01-04",
"endTime": "1984-11-01",
"effortRessenti": 4,
"variability": 15.8206,
"variance": 10.1982,
"standardDeviation": 89.2815,
"average": 60.1575,
"maximum": 177,
"minimum": 55,
"avrTemperature": 95.3616,
"hasAutoPause": false
},
{
"idActivity": 19,
"type": "Type1",
"date": "2017-01-31",
"startTime": "1995-01-14",
"endTime": "1967-07-28",
"effortRessenti": 2,
"variability": 10.3217,
"variance": 25.3434,
"standardDeviation": 64.5326,
"average": 6.7419,
"maximum": 83,
"minimum": 72,
"avrTemperature": 19.6569,
"hasAutoPause": false
},
{
"idActivity": 20,
"type": "Type3",
"date": "2017-05-29",
"startTime": "1959-03-03",
"endTime": "1943-08-27",
"effortRessenti": 2,
"variability": 12.9503,
"variance": 90.5546,
"standardDeviation": 57.812,
"average": 44.4189,
"maximum": 144,
"minimum": 79,
"avrTemperature": 95.1186,
"hasAutoPause": false
},
{
"idActivity": 21,
"type": "Type1",
"date": "2015-10-03",
"startTime": "1946-05-27",
"endTime": "1934-06-04",
"effortRessenti": 3,
"variability": 59.5777,
"variance": 61.9804,
"standardDeviation": 46.6558,
"average": 11.234,
"maximum": 144,
"minimum": 73,
"avrTemperature": 72.5805,
"hasAutoPause": false
},
{
"idActivity": 22,
"type": "Type1",
"date": "2015-04-05",
"startTime": "1948-02-07",
"endTime": "1925-04-24",
"effortRessenti": 3,
"variability": 4.6783,
"variance": 66.7362,
"standardDeviation": 79.8471,
"average": 52.3693,
"maximum": 141,
"minimum": 85,
"avrTemperature": 48.7024,
"hasAutoPause": false
},
{
"idActivity": 23,
"type": "Type1",
"date": "2023-06-05",
"startTime": "1920-11-12",
"endTime": "1926-06-26",
"effortRessenti": 5,
"variability": 67.8302,
"variance": 33.2865,
"standardDeviation": 4.516,
"average": 17.2584,
"maximum": 150,
"minimum": 47,
"avrTemperature": 52.2994,
"hasAutoPause": true
},
{
"idActivity": 24,
"type": "Type2",
"date": "2014-03-03",
"startTime": "1988-05-05",
"endTime": "1944-06-29",
"effortRessenti": 1,
"variability": 12.7751,
"variance": 92.9296,
"standardDeviation": 76.843,
"average": 32.2267,
"maximum": 114,
"minimum": 77,
"avrTemperature": 80.627,
"hasAutoPause": true
},
{
"idActivity": 25,
"type": "Type3",
"date": "2016-07-01",
"startTime": "1927-11-09",
"endTime": "2011-12-16",
"effortRessenti": 3,
"variability": 45.0597,
"variance": 37.5072,
"standardDeviation": 6.6945,
"average": 70.5156,
"maximum": 81,
"minimum": 32,
"avrTemperature": 57.5543,
"hasAutoPause": false
},
{
"idActivity": 26,
"type": "Type3",
"date": "2020-06-25",
"startTime": "1940-12-10",
"endTime": "1944-05-02",
"effortRessenti": 2,
"variability": 20.6298,
"variance": 54.2174,
"standardDeviation": 56.4106,
"average": 4.487,
"maximum": 112,
"minimum": 98,
"avrTemperature": 80.8548,
"hasAutoPause": false
}
]

@ -0,0 +1,209 @@
[
{
"id": 1,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
},
{
"id": 2,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
},
{
"id": 3,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": false
},
{
"id": 4,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": false
},
{
"id": 5,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
},
{
"id": 6,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": false
},
{
"id": 7,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
},
{
"id": 8,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
},
{
"id": 9,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": false
},
{
"id": 10,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
},
{
"id": 11,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": false
},
{
"id": 12,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
},
{
"id": 13,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
},
{
"id": 14,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
},
{
"id": 15,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": false
},
{
"id": 16,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
},
{
"id": 17,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": false
},
{
"id": 18,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
},
{
"id": 19,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
},
{
"id": 20,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
},
{
"id": 21,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
},
{
"id": 22,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": false
},
{
"id": 23,
"username": "johndoe",
"nom": "Doe",
"prenom": "John",
"contexte": "Jvais dire wallah",
"description": "Wallah c`est la description",
"urgence": true
}
]
Loading…
Cancel
Save