diff --git a/assets/css/_bootstrap.scss b/assets/css/_bootstrap.scss index 80d81238936104d4cc74b54e71ce4a49d572df85..fdfe56ef9f29a1a642142d0c25d1b4c59c4b4830 100644 --- a/assets/css/_bootstrap.scss +++ b/assets/css/_bootstrap.scss @@ -23,7 +23,7 @@ // @import "~bootstrap/scss/pagination"; @import "~bootstrap/scss/badge"; // @import "~bootstrap/scss/jumbotron"; -// @import "~bootstrap/scss/alert"; + @import "~bootstrap/scss/alert"; // @import "~bootstrap/scss/progress"; // @import "~bootstrap/scss/media"; @import "~bootstrap/scss/list-group"; diff --git a/layouts/default.vue b/layouts/default.vue index e4697c1341ac39b59c7f48d32eb57391cf3e3dee..c8745e74cc58366ea35348056a091c6788b5fba4 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -14,6 +14,7 @@ export default { { title: 'Toile de confiance', items : [ + {path: '/previsions',title: 'Prévisions'}, {path: '/inout',title: 'Entrées et sorties'}, {path: '/membres',title: 'Membres'} ]}, diff --git a/pages/inout.vue b/pages/inout.vue index 63ed00b0eed18fc99c5ac42c23aa14c9a818a1a9..30f284838259f76bdfad9802e75e46d78a62d80c 100644 --- a/pages/inout.vue +++ b/pages/inout.vue @@ -2,12 +2,10 @@ <main class="container"> <h2 class="text-center mb-5 font-weight-light">Entrées et sorties de la toile de confiance des 2 derniers jours</h2> <NavigationLoader :isLoading="$apollo.queries.newMembers.loading" class="d-block mx-auto" /> - <div class="row text-center" v-if="!$apollo.queries.newMembers.loading"> + <div class="row text-center" v-if="!$apollo.queries.newMembers.loading && newMembers"> <div class="col-lg-6"> - <div> - <h2 class="h4 text-success">Bienvenue à </h2> - <MemberList :members="newMembers['entrees']" :displayPubkey="false" :displayHead="false" /> - </div> + <h2 class="h4 text-success">Bienvenue à </h2> + <MemberList :members="newMembers['entrees']" :displayPubkey="false" :displayHead="false" /> </div> <div class="col-lg-6"> <h2 class="h4 text-danger">Au revoir à </h2> diff --git a/pages/membres/index.vue b/pages/membres/index.vue index 8b544c7122d3bb8a853eec788d1c61f726e6b469..937b2e25237f524a6032e97e025faebf373aee43 100644 --- a/pages/membres/index.vue +++ b/pages/membres/index.vue @@ -1,6 +1,6 @@ <template> <main class="content"> - <h2 class="display-2 text-center mb-5">Membres</h2> + <h2 class="text-center mb-5 font-weight-light">Membres</h2> <div class="row mb-4"> <div class="col-6 m-auto text-center"> <label for="rech" class="form-label">Votre recherche</label> diff --git a/pages/previsions.vue b/pages/previsions.vue new file mode 100644 index 0000000000000000000000000000000000000000..ec417fde1e3b257cfd1cfd1efdfc987199873843 --- /dev/null +++ b/pages/previsions.vue @@ -0,0 +1,189 @@ +<template> +<main class="container"> + <NavigationLoader :isLoading="$apollo.queries.wwResult.loading" class="d-block mx-auto" /> + <div v-if="!$apollo.queries.wwResult.loading"> + <h2 class="text-center mb-5 font-weight-light">Prévisions <small><span class="badge badge-secondary">{{ wwResult.dossiers_nb }} dossiers en attente</span></small></h2> + <div class="alert alert-info" role="alert"> + <ul class="list-unstyled m-0"> + <li>{{ wwResult.certifs_nb }} certifications internes</li> + <li>{{ wwResult.permutations_nb }} permutations</li> + </ul> + </div> + <div class="row mb-4"> + <div class="col"> + <div class="form-check form-check-inline"> + <input class="form-check-input" type="radio" id="forecastsByNames" value="forecastsByNames" checked v-model="display"> + <label class="form-check-label" for="forecastsByNames"> + Tri par membres + </label> + </div> + <div class="form-check form-check-inline"> + <input class="form-check-input" type="radio" id="forecastsByDates" value="forecastsByDates" v-model="display"> + <label class="form-check-label" for="forecastsByDates"> + Tri par dates + </label> + </div> + </div> + </div> + <div class="row"> + <div class="col-lg-6"> + <div v-if="display=='forecastsByNames'"> + <h3>Prévisions par membres</h3> + <div class="table-responsive"> + <table class="table previsions"> + <tbody> + <tr v-for="forecast in wwResult.forecastsByNames" :key="forecast.member.uid"> + <th scope="row">{{ forecast.member.uid }}</th> + <td class="p-0"> + <table class="table table-borderless mb-0"> + <tr class="d-flex justify-content-between" v-for="date in forecast.forecasts" :key="date.date"> + <td>{{ date.date | formatDateHeure }}</td> + <td>{{ date.proba * 100 }} %</td> + </tr> + </table> + </td> + </tr> + </tbody> + </table> + </div> + </div> + <div v-if="display=='forecastsByDates'"> + <h3>Prévisions par dates</h3> + <div class="table-responsive"> + <table class="table previsions"> + <tbody> + <tr v-for="forecast in wwResult.forecastsByDates" :key="forecast.date"> + <th scope="row">{{ forecast.date | formatDateHeure }}</th> + <td class="p-0"> + <table class="table table-borderless mb-0"> + <tr class="d-flex justify-content-between" v-for="member in forecast.forecasts" :key="member.member.uid"> + <td>{{ member.member.uid }}</td> + <td>{{ member.proba * 100 }} %</td> + </tr> + </table> + </td> + </tr> + </tbody> + </table> + </div> + </div> + </div> + </div> + </div> +</main> +</template> + +<script> +import gql from 'graphql-tag' + +export default { + data() { + // Variables locales + return { + // Fil d'ariane + breadcrumb: [ + { + text: 'Accueil', + to: '/' + }, + { + text: 'Prévisions', + active: true + } + ], + display: 'forecastsByNames' + } + }, + // Fonctions locales + methods: { + + }, + apollo: { + wwResult : { + query: gql`query { + wwResult { + permutations_nb + dossiers_nb + certifs_nb + forecastsByNames { + id { + pubkey + uid + status + hash + limitDate + received_certifications { + limit + } + } + date + after + proba + } + } + } `, + update (data) { + console.log(data) + let result = {'byName':[],'byDate':[]} + let forecasts = data.wwResult.forecastsByNames + + for (let i = 0; i < forecasts.length; i++) { + let member = forecasts[i].id + + // On traite les forecasts par nom + if (result['byName'].filter(function(e) { return e.member && e.member.uid === member.uid; }).length == 0) { + result['byName'].push({ + member: member, + forecasts: [{ + date: forecasts[i].date, + after: forecasts[i].after, + proba: forecasts[i].proba + }] + }) + } else { + result['byName'].filter(function(e) { return e.member && e.member.uid === member.uid; })[0].forecasts.push({ + date: forecasts[i].date, + after: forecasts[i].after, + proba: forecasts[i].proba + }) + } + + // On traite les forecasts par date + if (result['byDate'].filter(function(e) { return e.date === forecasts[i].date }).length == 0) { + result['byDate'].push({ + date: forecasts[i].date, + forecasts: [{ + member: member, + after: forecasts[i].after, + proba: forecasts[i].proba + }] + }) + } else { + result['byDate'].filter(function(e) { return e.date === forecasts[i].date })[0].forecasts.push({ + member: member, + after: forecasts[i].after, + proba: forecasts[i].proba + }) + } + } + + // On tri les résultats pour être sûr + // result['byName'].sort((a, b) => (a.member.uid.toLowerCase() > b.member.uid.toLowerCase()) ? 1 : -1) + // result['byDate'].sort((a, b) => (a.date > b.date) ? 1 : -1) + + return { + permutations_nb: data.wwResult.permutations_nb, + dossiers_nb: data.wwResult.dossiers_nb, + certifs_nb: data.wwResult.certifs_nb, + forecastsByNames: result['byName'], + forecastsByDates: result['byDate'] + } + } + } + }, + mounted () { + // Mise à jour du fil d'ariane au chargement + $nuxt.$emit('changeRoute',this.breadcrumb) + } +} +</script> \ No newline at end of file diff --git a/plugins/filters.js b/plugins/filters.js index e6b2487883eaeb7863d810cb44c213fd92b14f39..e586ee3b1074b848950e3757961d3516148b97a5 100644 --- a/plugins/filters.js +++ b/plugins/filters.js @@ -8,6 +8,10 @@ Vue.filter('formatDate', (val) => { return dayjs(val*1000).format('D MMMM YYYY') }) +Vue.filter('formatDateHeure', (val) => { + return dayjs(val*1000).format('D MMMM YYYY [à ] H[h]') +}) + Vue.filter('dateStatus', (val) => { const diff = val - dayjs().unix() switch (true) {