Skip to content

Commit

Permalink
Merge branch 'staging' of github.com:betagouv/ma-cantine into 4674-re…
Browse files Browse the repository at this point in the history
…facto-classes-etl
  • Loading branch information
qloridant committed Nov 22, 2024
2 parents 86f3f38 + ac3d92d commit 8a7c367
Show file tree
Hide file tree
Showing 23 changed files with 429 additions and 362 deletions.
459 changes: 233 additions & 226 deletions 2024-frontend/package-lock.json

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions 2024-frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"@gouvminint/vue-dsfr": "^7.1.0",
"@vuelidate/core": "^2.0.3",
"@vuelidate/validators": "^2.0.4",
"@vueuse/core": "^11.1.0",
"@vueuse/core": "^11.2.0",
"django-vite-plugin": "^4.0.4",
"pinia": "^2.2.6",
"vue": "^3.5.11",
Expand All @@ -28,10 +28,10 @@
"@rushstack/eslint-patch": "^1.10.4",
"@vitejs/plugin-vue": "^5.1.5",
"@vue/eslint-config-prettier": "^9.0.0",
"eslint": "^9.13.0",
"eslint": "^9.15.0",
"eslint-plugin-vue": "^9.31.0",
"prettier": "^3.3.3",
"vite": "^5.4.10",
"vite-plugin-vue-devtools": "^7.6.3"
"vite": "^5.4.11",
"vite-plugin-vue-devtools": "^7.6.4"
}
}
15 changes: 10 additions & 5 deletions 2024-frontend/src/components/SourceChart.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<script setup>
import { computed, ref } from "vue"
import { formatNumber, getPercentage } from "@/utils"
import Constants from "@/constants.js"
const props = defineProps(["measurement"])
Expand All @@ -25,7 +26,11 @@ const measurementGraphValues = computed(() => {
props.measurement.unservedTotalMass,
props.measurement.leftoversTotalMass,
]),
x: JSON.stringify(["Excédents de préparation", "Denrées non servies", "Reste-assiette"]),
x: JSON.stringify([
Constants.WasteMeasurement.preparation.title,
Constants.WasteMeasurement.unserved.title,
Constants.WasteMeasurement.leftovers.title,
]),
}
})
Expand Down Expand Up @@ -69,15 +74,15 @@ const displayOption = ref("chart")
<div v-else-if="displayOption === 'text'">
<ul>
<li>
Excédents de préparation : {{ formatNumber(measurement.preparationTotalMass) }} kg, soit
{{ formatNumber(measurementPercentageValues.preparation) }} %
{{ Constants.WasteMeasurement.preparation.title }} : {{ formatNumber(measurement.preparationTotalMass) }} kg,
soit {{ formatNumber(measurementPercentageValues.preparation) }} %
</li>
<li>
Denrées présentées mais non servies : {{ formatNumber(measurement.unservedTotalMass) }} kg, soit
{{ Constants.WasteMeasurement.unserved.title }} : {{ formatNumber(measurement.unservedTotalMass) }} kg, soit
{{ formatNumber(measurementPercentageValues.unserved) }} %
</li>
<li>
Reste-assiette : {{ formatNumber(measurement.leftoversTotalMass) }} kg, soit
{{ Constants.WasteMeasurement.leftovers.title }} : {{ formatNumber(measurement.leftoversTotalMass) }} kg, soit
{{ formatNumber(measurementPercentageValues.leftovers) }} %
</li>
</ul>
Expand Down
37 changes: 19 additions & 18 deletions 2024-frontend/src/components/WasteMeasurementDetail.vue
Original file line number Diff line number Diff line change
@@ -1,73 +1,74 @@
<script setup>
import { formatNumber } from "@/utils"
import Constants from "@/constants.js"
const props = defineProps(["measurement"])
const detailedFields = [
{
key: "totalMass",
label: "Masse totale de gaspillage relevée sur la période de mesure",
label: Constants.WasteMeasurement.totalMass.title,
},
{
key: "daysInPeriod",
label: "Période de mesure de mon gaspillage alimentaire",
label: Constants.WasteMeasurement.daysInPeriod.title,
unit: "jours",
},
{
label: "Nombre de couverts sur la période",
unit: "couverts",
key: "mealCount",
label: Constants.WasteMeasurement.mealCount.title,
unit: "couverts",
},
{
key: "totalYearlyWasteEstimation",
label: "Masse totale de gaspillage sur l'année",
label: "Masse totale de déchets alimentaires sur l'année",
unit: "kg",
tooltip:
"Calculé en prenant le gaspillage par repas pour la période, multiplié par le nombre de couverts par année pour l'établissement",
"Calculé en prenant les déchets alimentaires par repas pour la période, multiplié par le nombre de couverts par année pour l'établissement",
},
{
heading: "Excédents de préparation",
heading: Constants.WasteMeasurement.preparation.title,
},
{
label: "Gaspillage total",
label: "Total",
key: "preparationTotalMass",
},
{
label: "Gaspillage de denrées comestibles",
label: "Denrées comestibles",
key: "preparationEdibleMass",
},
{
label: "Gaspillage de denrées non comestibles",
label: "Denrées non comestibles",
key: "preparationInedibleMass",
},
{
heading: "Denrées présentées aux convives mais non servies",
heading: Constants.WasteMeasurement.unserved.title,
},
{
label: "Gaspillage total",
label: "Total",
key: "unservedTotalMass",
},
{
label: "Gaspillage de denrées comestibles",
label: "Denrées comestibles",
key: "unservedEdibleMass",
},
{
label: "Gaspillage de denrées non comestibles",
label: "Denrées non comestibles",
key: "unservedInedibleMass",
},
{
heading: "Reste assiette",
heading: Constants.WasteMeasurement.leftovers.title,
},
{
label: "Gaspillage total",
label: "Total",
key: "leftoversTotalMass",
},
{
label: "Gaspillage de denrées comestibles",
label: "Denrées comestibles",
key: "leftoversEdibleMass",
},
{
label: "Gaspillage de denrées non comestibles",
label: "Denrées non comestibles",
key: "leftoversInedibleMass",
},
]
Expand Down
2 changes: 1 addition & 1 deletion 2024-frontend/src/components/WasteMeasurementSummary.vue
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ const activeAccordion = ref("")
</div>
<div v-else>
<DsfrAlert>
Triez votre gaspillage alimentaire par source pour mieux comprendre comment agir.
Triez vos déchets alimentaires par source pour mieux comprendre comment agir.
</DsfrAlert>
</div>
</div>
Expand Down
20 changes: 20 additions & 0 deletions 2024-frontend/src/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,24 @@ export default Object.freeze({
"Vous ne connaissez pas les données par cantine satellite, que par livreur de repas. Vous connaissez les labels et les familles de produits de vos achats",
},
],
WasteMeasurement: {
daysInPeriod: {
title: "Période de mesure de mes déchets alimentaires",
},
mealCount: {
title: "Nombre de couverts sur la période",
},
totalMass: {
title: "Masse totale des déchets alimentaires relevée sur la période de mesure",
},
preparation: {
title: "Excédents de préparation dont stock",
},
unserved: {
title: "Denrées présentées aux convives mais non servies",
},
leftovers: {
title: "Restes assiettes",
},
},
})
6 changes: 3 additions & 3 deletions 2024-frontend/src/data/key-measures.json
Original file line number Diff line number Diff line change
Expand Up @@ -106,11 +106,11 @@
"badgeId": "diversification",
"baseComponent": "DiversificationMeasure",
"baseMeasureComponent": "DiversificationMeasure",
"id": "diversification-des-menus",
"id": "menus-vegetariens",
"mdiIcon": "$leaf-fill",
"mdiIconColor": "green darken-1",
"progressField": "tunnelDiversification",
"shortTitle": "Diversification des menus",
"shortTitle": "Menus végétariens",
"subMeasures": [
{
"deadline": {
Expand Down Expand Up @@ -162,7 +162,7 @@
}
],
"successExplanation": "La cantine offre au moins un repas végétarien par semaine si elle est dans le secteur scolaire, ou et depuis janvier 2023, un repas végétarien par jour pour les restaurants collectifs de l'État, les établissements publics et les entreprises publiques nationales (s'ils proposent habituellement un choix multiple de menus).",
"tabText": "Protéines végétales",
"tabText": "Menus végétariens",
"title": "Diversification des sources de protéines et menus végétariens"
},
{
Expand Down
4 changes: 2 additions & 2 deletions 2024-frontend/src/router/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const routes = [
component: WasteMeasurementTunnel,
props: (route) => ({ ...route.query, ...route.params }),
meta: {
title: "Évaluation gaspillage alimentaire",
title: "Évaluation déchets alimentaires",
authenticationRequired: true,
fullscreen: true,
},
Expand All @@ -31,7 +31,7 @@ const routes = [
component: WasteMeasurements,
props: (route) => ({ ...route.params }),
meta: {
title: "Gaspillage alimentaire",
title: "Déchets alimentaires",
authenticationRequired: true,
breadcrumbs: [
{ to: { name: "ManagementPage" }, title: "Mon tableau de bord" },
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<script setup>
import { onMounted, reactive, watch, computed, inject, nextTick } from "vue"
import Constants from "@/constants.js"
import { useVuelidate } from "@vuelidate/core"
import { formatError } from "@/utils.js"
import HelpText from "./HelpText.vue"
Expand All @@ -15,8 +16,8 @@ const sources = {
sortedKey: "preparationIsSorted",
edibleKey: "preparationEdibleMass",
inedibleKey: "preparationInedibleMass",
title: "Excédents de préparation",
primaryLabel: "Masse de gaspillage pour les excédents de préparation",
title: Constants.WasteMeasurement.preparation.title,
primaryLabel: "Masse de déchets alimentaires pour les excédents de préparation (en kg)",
description:
"Par exemple, si vous avez jeté des épluchures, des parures ou si vous avez des ingrédients excédentaires que vous ne réutiliserez pas, il s’agit d’excédents de préparation",
edibleHelp:
Expand All @@ -27,8 +28,8 @@ const sources = {
sortedKey: "unservedIsSorted",
edibleKey: "unservedEdibleMass",
inedibleKey: "unservedInedibleMass",
title: "Denrées présentées aux convives mais non servies",
primaryLabel: "Masse de gaspillage pour les denrées présentées aux convives mais non servies",
title: Constants.WasteMeasurement.unserved.title,
primaryLabel: "Masse de déchets alimentaires pour les denrées présentées aux convives mais non servies (en kg)",
description:
"Par exemple, si vous présentez en vitrine un nombre excédentaire de salades, de parts de tarte aux pommes et que ces denrées supplémentaires ne sont ni consommées ni valorisées, il s’agit d’excédents présentés aux convives et non servis",
edibleHelp:
Expand All @@ -39,8 +40,8 @@ const sources = {
sortedKey: "leftoversIsSorted",
edibleKey: "leftoversEdibleMass",
inedibleKey: "leftoversInedibleMass",
title: "Reste assiette",
primaryLabel: "Masse de gaspillage pour le reste assiette",
title: Constants.WasteMeasurement.leftovers.title,
primaryLabel: "Masse de déchets alimentaires pour le reste assiette (en kg)",
description:
"Il s’agit de l’ensemble des restes alimentaires des plateaux repas /assiettes incluant les os, noyaux et épluchures",
edibleHelp:
Expand All @@ -64,7 +65,7 @@ const sumCheck = () => {
return payload.edibleKey + payload.inedibleKey === payload.totalKey
}
const combination = helpers.withMessage(
"La somme de denrées comestibles et non-comestibles devrait être égale au total",
"La somme de denrées comestibles et non comestibles devrait être égale au total",
sumCheck
)
Expand Down Expand Up @@ -120,7 +121,7 @@ onMounted(() => {
v-model.number="payload.totalKey"
type="number"
:label="source.primaryLabel"
hint="En kg (optionnel)"
hint="Optionnel"
label-visible
class="fr-mb-2w"
:error-message="formatError(v$.totalKey)"
Expand All @@ -138,7 +139,7 @@ onMounted(() => {
<div :class="leftHandQuestionsClass">
<DsfrBooleanRadio
v-model="payload.sortedKey"
legend="Avez-vous trié entre comestible et non-comestible&nbsp;?"
legend="Avez-vous trié entre comestible et non comestible&nbsp;?"
hint="Optionnel"
name="sortedKey"
class="fr-mb-2w"
Expand All @@ -165,17 +166,17 @@ onMounted(() => {
<DsfrInputGroup
v-model.number="payload.edibleKey"
type="number"
label="Total du gaspillage de denrées comestibles"
hint="En kg (optionnel)"
label="Masse des déchets alimentaires comestibles (assimilable à du gaspillage alimentaire) (en kg)"
hint="Optionnel"
label-visible
class="fr-mb-2w"
:error-message="formatError(v$.edibleKey)"
/>
<DsfrInputGroup
v-model.number="payload.inedibleKey"
type="number"
label="Total du gaspillage de denrées non comestibles"
hint="En kg (optionnel)"
label="Masse des déchets alimentaires non comestibles (en kg)"
hint="Optionnel"
label-visible
class="fr-mb-2w"
:error-message="formatError(v$.inedibleKey)"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { onMounted, reactive, watch, inject, computed } from "vue"
import { useVuelidate } from "@vuelidate/core"
import { formatError } from "@/utils.js"
import HelpText from "./HelpText.vue"
import Constants from "@/constants.js"
import { helpers } from "@vuelidate/validators"
import { useValidators } from "@/validators.js"
Expand Down Expand Up @@ -84,7 +85,7 @@ onMounted(() => {
<div class="fr-grid-row fr-grid-row--middle">
<div class="fr-col-12 fr-col-md-6">
<fieldset class="fr-px-0 fr-pt-0 fr-mx-0">
<legend class="fr-text--lg fr-mb-1w fr-px-0">Période de mesure de mon gaspillage alimentaire</legend>
<legend class="fr-text--lg fr-mb-1w fr-px-0">{{ Constants.WasteMeasurement.daysInPeriod.title }}</legend>
<div class="fr-col-md-7">
<DsfrInputGroup
v-model="payload.periodStartDate"
Expand Down Expand Up @@ -124,7 +125,7 @@ onMounted(() => {
<DsfrInputGroup
v-model.number="payload.mealCount"
type="number"
label="Nombre de couverts sur la période"
:label="Constants.WasteMeasurement.mealCount.title"
:hint="`${daysInPeriod || '?'} jours`"
label-visible
:error-message="formatError(v$.mealCount)"
Expand Down Expand Up @@ -162,7 +163,7 @@ onMounted(() => {
<DsfrInputGroup
v-model.number="payload.mealCount"
type="number"
label="Nombre de couverts sur la période"
:label="Constants.WasteMeasurement.mealCount.title"
:hint="`${daysInPeriod || '?'} jours`"
label-visible
:error-message="formatError(v$.mealCount)"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import { onMounted, reactive, watch, inject } from "vue"
import { useVuelidate } from "@vuelidate/core"
import { formatError } from "@/utils.js"
import Constants from "@/constants.js"
import HelpText from "./HelpText.vue"
import { useValidators } from "@/validators.js"
const { required, decimal, minValue } = useValidators()
Expand Down Expand Up @@ -39,18 +40,18 @@ onMounted(() => {
<DsfrInputGroup
v-model.number="payload.totalMass"
type="number"
label="Masse totale de gaspillage relevée sur la période de mesure"
:label="Constants.WasteMeasurement.totalMass.title"
hint="en kg"
label-visible
class="fr-mb-2w"
:error-message="formatError(v$.totalMass)"
/>
</div>
<div class="fr-col-sm-6">
<HelpText question="Dois-je compter les os et les épluchures ?">
<HelpText>
<p class="fr-mb-0">
Inutile à ce stade de différencier les denrées comestibles et non comestibles. Si vous l’avez fait, vous
pourrez saisir les données détaillées aux étapes suivantes.
Les déchets alimentaires incluent une fraction comestible (assimilable à du gaspillage alimentaire) et une
fraction non comestible (os, épluchures, arêtes).
</p>
</HelpText>
</div>
Expand Down
Loading

0 comments on commit 8a7c367

Please sign in to comment.