From 2eda51fc3fa89b832bc1c83bc9b47564e87e2e36 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 17 Sep 2024 18:01:18 +0200
Subject: [PATCH 01/91] =?UTF-8?q?Met=20=C3=A0=20jour/compl=C3=A8te=20les?=
=?UTF-8?q?=20pictos=20pour=20la=20landing=20page?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/Picto/BigBasketPicto.tsx | 1672 +++++++++--------
.../Picto/CollectiviteEngageePicto.tsx | 214 +++
.../components/Picto/DashboardPicto.tsx | 1110 ++++++-----
3 files changed, 1593 insertions(+), 1403 deletions(-)
create mode 100644 packages/panier/components/Picto/CollectiviteEngageePicto.tsx
diff --git a/packages/panier/components/Picto/BigBasketPicto.tsx b/packages/panier/components/Picto/BigBasketPicto.tsx
index 23b57d0824..93599c65f3 100644
--- a/packages/panier/components/Picto/BigBasketPicto.tsx
+++ b/packages/panier/components/Picto/BigBasketPicto.tsx
@@ -9,1049 +9,1071 @@ const BigBasketPicto = ({className}: {className?: string}) => {
xmlns="http://www.w3.org/2000/svg"
xmlnsXlink="http://www.w3.org/1999/xlink"
>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ {' '}
+
+
+ fill="#fff"
+ d="M0 0H1700V1702.14H0z"
+ transform="translate(-1031 -119)"
+ >
-
-
-
-
-
-
-
-
-
-
-
-
+ fill="#EEF4FF"
+ d="M495.5 260.5c0 122.331-109.669 156-232 156S57 373.831 57 251.5 151.169 58 273.5 58s222 80.169 222 202.5z"
+ opacity="0.6"
+ >
+
+
+
+
+
+
+
+
+ strokeWidth="1.061"
+ rx="10.075"
+ transform="rotate(60.013 267.331 153.122)"
+ >
+ width="139.339"
+ height="8.76"
+ x="228.178"
+ y="199.114"
+ fill="#7CD4A5"
+ rx="4.38"
+ transform="rotate(60.013 228.178 199.114)"
+ >
+ rx="4.38"
+ transform="rotate(60.013 238.295 193.276)"
+ >
+ rx="4.38"
+ transform="rotate(60.013 339.409 319.814)"
+ >
+ rx="4.38"
+ transform="rotate(60.013 216.375 205.925)"
+ >
-
-
+ d="M251.078 189.07l10.041-5.794 1.176 2.037-10.041 5.794-1.176-2.037zm5.915 1.899c2.108-1.217 4.704-.86 6.02 1.421.563.975.667 1.852.431 2.734l4.102-2.367 1.06 1.836-10.758 6.208-1.06-1.836.574-.331c-.882-.237-1.589-.766-2.152-1.741-1.316-2.281-.326-4.707 1.783-5.924zm1.101 1.908c-1.263.728-1.726 2.047-1.014 3.28.472.818 1.205 1.294 2.147 1.401l2.352-1.358c.379-.868.334-1.741-.138-2.559-.712-1.233-2.085-1.493-3.347-.764zm6.031 16.085c-1.293-.153-2.498-.949-3.284-2.312-1.482-2.567-.525-5.051 1.584-6.268 2.137-1.233 4.679-.903 6.045 1.464 1.159 2.008.558 4.114-1.336 5.207a5.37 5.37 0 01-1.084.473l-2.922-5.064c-1.249.95-1.314 2.097-.66 3.23.455.789 1.196 1.279 1.936 1.368l-.279 1.902zm2.828-6.298c-.538-.932-1.41-1.251-2.473-.906l1.921 3.328c.715-.451 1.14-1.404.552-2.422zm-3.052 8.627l7.23-4.171 1.051 1.821-.574.331c.778.221 1.539.68 2.094 1.641.902 1.564.547 3.432-1.591 4.666l-4.303 2.483-1.059-1.836 4.231-2.442c.961-.555 1.249-1.447.736-2.337-.53-.918-1.428-1.05-2.044-1.057l-4.72 2.723-1.051-1.822zm8.005 7.775l2.955-1.705-.778-1.348 1.635-.944.778 1.349 1.807-1.043 1.06 1.836-1.807 1.043 1.274 2.209-1.635.943-1.275-2.209-2.955 1.705c-.803.464-.87 1.076-.456 1.793.289.503.537.799.778.985l-1.592.919c-.365-.268-.685-.656-1.032-1.259-1.043-1.807-.521-3.256 1.243-4.274zm9.658 3.218a1.393 1.393 0 01.503-1.878 1.393 1.393 0 011.878.504c.372.645.133 1.49-.512 1.863-.646.372-1.497.156-1.869-.489zm-9.022 3.982l7.23-4.172 1.051 1.822-7.23 4.171-1.051-1.821zm9.028-1.055l.778 1.348.761-.438c1.534-.886 3.356-.579 4.399 1.228.38.66.545 1.31.566 1.91l-1.967.103a1.672 1.672 0 00-.218-1.041c-.356-.617-1.018-.77-1.678-.389l-.803.463 1.275 2.209-1.636.944-1.274-2.209-5.595 3.228-1.059-1.836 5.594-3.228-.778-1.348 1.635-.944zm5.692 6.948a1.392 1.392 0 01.504-1.877 1.392 1.392 0 011.877.503c.373.646.134 1.491-.511 1.863-.646.373-1.497.157-1.87-.489zm-9.021 3.982l7.229-4.171 1.052 1.821-7.23 4.172-1.051-1.822zm7.329 9.984c-1.293-.153-2.498-.949-3.285-2.312-1.481-2.567-.524-5.051 1.584-6.268 2.138-1.233 4.68-.903 6.046 1.464 1.159 2.008.557 4.114-1.336 5.207a5.398 5.398 0 01-1.085.473l-2.921-5.064c-1.249.951-1.314 2.097-.661 3.23.456.789 1.197 1.279 1.937 1.368l-.279 1.902zm2.828-6.298c-.538-.932-1.41-1.251-2.473-.906l1.921 3.328c.715-.451 1.14-1.404.552-2.422zm-3.052 8.627l7.229-4.171 1.052 1.821-.718.414c.761.192 1.49.594 1.962 1.411.141.244.222.484.264.689l-1.793 1.035a3.63 3.63 0 00-.363-.861c-.514-.89-1.332-1.182-1.949-1.19l-4.633 2.674-1.051-1.822zm11.469 12.652l4.102-2.368 1.06 1.836-4.017 2.318c-2.166 1.25-4.228.757-5.453-1.366-1.225-2.122-.611-4.14 1.555-5.39l4.016-2.318 1.06 1.836-4.103 2.368c-1.047.604-1.378 1.521-.799 2.526.572.989 1.532 1.162 2.579.558zm4.113 11.634c-1.293-.153-2.498-.949-3.284-2.312-1.482-2.567-.525-5.051 1.584-6.268 2.137-1.233 4.679-.903 6.045 1.464 1.159 2.008.558 4.114-1.336 5.207-.401.232-.808.39-1.084.473l-2.922-5.064c-1.249.951-1.314 2.097-.66 3.23.455.789 1.196 1.279 1.936 1.368l-.279 1.902zm2.828-6.298c-.538-.932-1.41-1.251-2.473-.906l1.921 3.328c.715-.451 1.14-1.404.552-2.422z"
+ >
+
+ rx="9.5"
+ transform="rotate(81.692 244.549 203.422)"
+ >
+ rx="4.5"
+ transform="rotate(81.692 189.48 231.17)"
+ >
+ rx="4.5"
+ transform="rotate(81.692 201.354 229.436)"
+ >
+ rx="4.5"
+ transform="rotate(81.692 248.343 378.208)"
+ >
+ rx="4.5"
+ transform="rotate(81.692 175.627 233.193)"
+ >
-
-
+ d="M216.574 229.85l10.816-1.579.399 2.735-4.157 3.305 4.929 1.979.399 2.735-10.816 1.579-.32-2.194 7.756-1.133-4.4-1.819-.226-1.545 3.697-3.001-7.757 1.132-.32-2.194zm4.271 20.389c-1.079-.584-1.858-1.702-2.072-3.169-.404-2.766 1.299-4.609 3.571-4.94 2.302-.337 4.414.838 4.787 3.388.315 2.163-.945 3.799-2.984 4.097a5.03 5.03 0 01-1.115.036l-.797-5.454c-1.425.397-1.881 1.379-1.703 2.6.124.85.603 1.537 1.22 1.873l-.907 1.569zm4.672-4.533c-.147-1.004-.8-1.587-1.851-1.655l.523 3.585c.784-.146 1.488-.833 1.328-1.93zm-2.766 6.56l3.183-.464-.212-1.453 1.761-.257.212 1.452 1.947-.284.289 1.978-1.947.284.347 2.38-1.761.257-.348-2.38-3.183.465c-.865.127-1.137.64-1.024 1.412.079.541.192.887.339 1.134l-1.715.251c-.227-.362-.371-.814-.466-1.463-.284-1.947.677-3.034 2.578-3.312zm.982 6.73l3.183-.465-.212-1.452 1.762-.257.212 1.452 1.947-.284.288 1.978-1.947.284.348 2.379-1.762.258-.347-2.38-3.183.465c-.865.126-1.137.639-1.025 1.412.079.541.193.887.34 1.134l-1.716.25c-.226-.361-.371-.813-.466-1.462-.284-1.947.678-3.034 2.578-3.312zm-1.95 6.53l7.788-1.137.286 1.962-.773.113c.6.433 1.099 1.039 1.228 1.919.038.263.025.502-.009.696l-1.932.282a3.397 3.397 0 00-.018-.881c-.14-.958-.755-1.499-1.293-1.721l-4.99.729-.287-1.962zm3.182 12.929c-1.079-.584-1.858-1.701-2.072-3.169-.404-2.766 1.299-4.608 3.571-4.94 2.302-.336 4.414.839 4.787 3.388.316 2.163-.945 3.799-2.984 4.097a5.1 5.1 0 01-1.115.037l-.797-5.455c-1.425.398-1.881 1.38-1.703 2.6.124.85.603 1.538 1.22 1.874l-.907 1.568zm4.672-4.532c-.147-1.005-.8-1.588-1.851-1.655l.523 3.584c.784-.146 1.488-.832 1.328-1.929zm-2.757 17.644c-1.08-.584-1.858-1.701-2.073-3.169-.404-2.765 1.3-4.608 3.571-4.94 2.303-.336 4.415.839 4.787 3.389.316 2.163-.944 3.799-2.984 4.096-.432.064-.843.06-1.115.037l-.796-5.454c-1.425.397-1.882 1.379-1.704 2.6.125.85.604 1.537 1.221 1.873l-.907 1.568zm4.672-4.532c-.147-1.004-.8-1.588-1.852-1.655l.524 3.585c.783-.146 1.488-.833 1.328-1.93zm-5.68 6.496l7.788-1.137.286 1.962-.618.09c.605.464 1.112 1.132 1.263 2.167.246 1.684-.716 3.198-3.018 3.534l-4.636.677-.289-1.978 4.559-.665c1.035-.152 1.598-.833 1.458-1.791-.144-.989-.885-1.418-1.423-1.639l-5.083.742-.287-1.962zm-1.802 14.241l11.588-1.692.287 1.962-.634.092c.691.515 1.141 1.222 1.297 2.289.361 2.472-1.354 4.237-3.625 4.569-2.272.331-4.42-.87-4.781-3.342-.155-1.066.074-1.873.589-2.564l-4.435.648-.286-1.962zm10.643 2.643c-.133-.911-.643-1.594-1.441-1.983l-2.442.357c-.665.633-.945 1.416-.814 2.312.194 1.329 1.309 2.05 2.669 1.851 1.36-.198 2.222-1.208 2.028-2.537zm-5.362 6.941l11.589-1.692.286 1.963-11.588 1.692-.287-1.963zm.719 6.544c-.228-1.561.513-2.758 1.95-2.968 1.174-.171 2.188.612 2.71 2.24l.749 2.321.201-.029c.818-.12 1.254-.815 1.123-1.711-.111-.757-.552-1.292-1.185-1.626l.888-1.597c1.059.555 1.813 1.613 2.021 3.034.329 2.256-.846 3.611-2.561 3.862l-5.037.735-.286-1.962.757-.11c-.675-.407-1.197-1.278-1.33-2.189zm2.327-1.034c-.526.076-.805.543-.708 1.208.131.896.643 1.484 1.318 1.78l1.097-.16-.58-1.809c-.259-.799-.648-1.089-1.127-1.019zm.951 11.056c.113.773.559 1.339 1.154 1.631l-.951 1.701c-1.064-.587-1.849-1.64-2.057-3.061-.392-2.689 1.304-4.578 3.576-4.909 2.271-.332 4.437.993 4.83 3.681.207 1.422-.244 2.656-1.096 3.522l-1.398-1.359c.487-.449.752-1.119.635-1.923-.187-1.282-1.314-2.08-2.674-1.882-1.375.201-2.211 1.286-2.019 2.599zm1.419 11.664c-1.079-.584-1.858-1.701-2.072-3.169-.404-2.766 1.3-4.608 3.571-4.94 2.302-.336 4.415.839 4.787 3.388.316 2.163-.944 3.799-2.984 4.097a5.1 5.1 0 01-1.115.037l-.796-5.455c-1.426.398-1.882 1.38-1.704 2.6.124.85.603 1.538 1.221 1.874l-.908 1.568zm4.672-4.533c-.146-1.004-.8-1.587-1.851-1.654l.523 3.584c.784-.146 1.489-.833 1.328-1.93zm-4.136 16.956l8.668-1.266-1.594-2.055 1.332-1.252 2.419 3.055.295 2.024-10.815 1.58-.305-2.086z"
+ >
+ strokeWidth="0.905"
+ rx="8.597"
+ transform="rotate(104.602 396.227 224.685)"
+ >
-
+ rx="4.072"
+ transform="rotate(104.602 340.55 228.415)"
+ >
+ rx="4.072"
+ transform="rotate(104.602 337.819 371.714)"
+ >
+ rx="4.072"
+ transform="rotate(104.602 328.291 225.221)"
+ >
-
-
-
+ d="M365.115 236.906l7.356 1.916-.484 1.86-3.558.992 2.621 2.602-.484 1.86-7.356-1.916.389-1.493 5.275 1.375-2.326-2.357.273-1.051 3.181-.922-5.276-1.374.389-1.492zm-2.783 14.216c-.534-.666-.73-1.592-.47-2.591.49-1.881 2.08-2.6 3.625-2.197 1.566.408 2.601 1.732 2.149 3.466-.383 1.471-1.633 2.178-3.02 1.816a3.457 3.457 0 01-.725-.278l.967-3.709c-1.021-.132-1.579.374-1.795 1.204-.151.578-.03 1.148.274 1.53l-1.005.759zm4.22-1.638c.177-.683-.083-1.234-.738-1.562l-.635 2.438c.541.119 1.178-.13 1.373-.876zm-3.548 3.453l2.164.564.258-.988 1.198.312-.258.988 1.324.345-.35 1.345-1.324-.345-.422 1.619-1.198-.312.422-1.619-2.165-.564c-.588-.153-.902.102-1.039.627-.095.368-.116.621-.089.819l-1.167-.304c-.047-.293-.017-.622.098-1.063.345-1.324 1.255-1.761 2.548-1.424zm-1.193 4.577l2.165.564.257-.988 1.198.312-.257.988 1.324.345-.35 1.345-1.325-.345-.421 1.618-1.198-.312.421-1.618-2.164-.564c-.589-.153-.902.102-1.039.627-.096.368-.117.621-.09.819l-1.166-.304c-.047-.293-.018-.622.097-1.063.345-1.324 1.256-1.761 2.548-1.424zm-3.017 3.655l5.297 1.38-.348 1.334-.526-.137c.267.44.423.963.267 1.562a1.52 1.52 0 01-.194.443l-1.314-.342a2.36 2.36 0 00.227-.569c.17-.652-.078-1.165-.362-1.452l-3.394-.885.347-1.334zm-1.462 9.144c-.533-.667-.729-1.593-.469-2.592.49-1.881 2.08-2.6 3.625-2.197 1.565.408 2.601 1.732 2.149 3.466-.383 1.471-1.634 2.178-3.021 1.817a3.52 3.52 0 01-.724-.279l.967-3.709c-1.021-.132-1.579.374-1.795 1.204-.151.578-.03 1.148.274 1.53l-1.006.76zm4.22-1.639c.178-.683-.082-1.234-.738-1.561l-.635 2.437c.542.119 1.179-.13 1.373-.876zm-6.543 10.556c-.533-.666-.729-1.592-.469-2.591.49-1.881 2.08-2.6 3.624-2.198 1.566.408 2.601 1.733 2.15 3.467-.384 1.471-1.634 2.178-3.021 1.816a3.525 3.525 0 01-.724-.278l.966-3.71c-1.02-.131-1.578.375-1.795 1.205-.15.578-.029 1.148.275 1.53l-1.006.759zm4.22-1.638c.178-.683-.083-1.234-.738-1.562l-.635 2.438c.541.119 1.179-.13 1.373-.876zm-5.397 2.623l5.297 1.38-.348 1.335-.42-.11c.261.461.406 1.026.222 1.73-.298 1.146-1.324 1.854-2.89 1.447l-3.153-.822.351-1.345 3.1.808c.704.183 1.249-.101 1.419-.753.175-.672-.184-1.147-.468-1.434l-3.457-.901.347-1.335zm-5.009 8.635l7.881 2.053-.348 1.334-.431-.112c.303.517.4 1.092.212 1.817-.438 1.681-2.015 2.348-3.56 1.945-1.544-.402-2.595-1.753-2.157-3.434.189-.725.554-1.18 1.071-1.483l-3.016-.786.348-1.334zm6.102 4.574a1.759 1.759 0 00-.387-1.66l-1.66-.433c-.598.226-.989.652-1.148 1.261-.235.904.284 1.667 1.209 1.908.925.241 1.75-.172 1.986-1.076zm-5.314 2.995l7.881 2.053-.347 1.335-7.882-2.053.348-1.335zm-1.311 4.386c.277-1.061 1.075-1.627 2.052-1.373.799.208 1.236.984 1.13 2.168l-.149 1.69.137.036c.557.145 1.024-.183 1.183-.792.134-.515-.004-.977-.319-1.362l1.001-.783c.528.642.725 1.524.473 2.491-.4 1.534-1.519 2.084-2.686 1.78l-3.425-.892.347-1.335.515.134c-.322-.443-.42-1.142-.259-1.762zm1.77-.032c-.357-.093-.662.13-.78.582-.159.609.01 1.125.362 1.497l.746.194.119-1.315c.05-.582-.121-.873-.447-.958zm-2.383 7.34c-.137.525-.005 1.008.297 1.356l-1.069.833c-.523-.664-.741-1.551-.489-2.518.476-1.828 2.074-2.579 3.619-2.177 1.545.403 2.574 1.838 2.097 3.666-.251.967-.874 1.635-1.655 1.959l-.527-1.248c.433-.156.785-.514.927-1.06.227-.872-.278-1.689-1.203-1.929-.935-.244-1.764.224-1.997 1.118zm-2.249 7.856c-.533-.667-.729-1.593-.469-2.592.49-1.881 2.08-2.6 3.625-2.197 1.565.408 2.6 1.732 2.149 3.466-.383 1.471-1.634 2.178-3.021 1.817a3.52 3.52 0 01-.724-.279l.966-3.709c-1.02-.132-1.578.374-1.795 1.204-.15.578-.029 1.148.275 1.53l-1.006.76zm4.22-1.639c.178-.683-.083-1.234-.738-1.561l-.635 2.438c.542.118 1.179-.131 1.373-.877zm-4.752 9.542l3.005.782-.35 1.346-2.943-.767c-1.587-.413-2.323-1.593-1.918-3.148.405-1.555 1.621-2.215 3.208-1.801l2.942.766-.35 1.345-3.006-.783c-.767-.2-1.344.076-1.535.812-.189.725.179 1.248.947 1.448zm-3.026 2.225l5.296 1.38-.348 1.334-.42-.109c.261.461.406 1.026.222 1.73-.298 1.145-1.324 1.854-2.89 1.446l-3.153-.821.351-1.345 3.1.808c.704.183 1.249-.101 1.419-.753.175-.672-.184-1.147-.468-1.435l-3.457-.9.348-1.335zm-2.037 12.125c-.137.525-.005 1.008.297 1.356l-1.069.833c-.523-.664-.741-1.551-.489-2.518.476-1.828 2.075-2.579 3.619-2.177 1.545.403 2.574 1.838 2.098 3.666-.252.967-.875 1.635-1.655 1.959l-.528-1.248c.434-.156.785-.514.927-1.06.227-.872-.278-1.689-1.203-1.929-.935-.244-1.764.224-1.997 1.118zm3.009 6.712c-.449 1.723-2.027 2.569-3.613 2.155-1.587-.413-2.552-1.921-2.103-3.645.449-1.723 2.027-2.569 3.614-2.155 1.586.413 2.551 1.921 2.102 3.645zm-4.461-1.14c-.221.851.295 1.67 1.209 1.908.925.241 1.764-.225 1.986-1.076.23-.883-.273-1.709-1.198-1.95-.924-.241-1.767.235-1.997 1.118zm-2.118 3.823l5.297 1.379-.348 1.335-.399-.104c.253.448.398.968.229 1.619-.176.673-.623 1.185-1.281 1.384.364.498.632 1.107.399 2-.285 1.093-1.266 1.758-2.758 1.369l-3.258-.849.351-1.345 3.205.835c.641.167 1.131-.076 1.287-.675.15-.578-.167-.997-.47-1.3a1.716 1.716 0 01-.233-.05l-3.258-.849.35-1.345 3.205.835c.641.167 1.131-.075 1.287-.674.159-.61-.211-1.043-.495-1.33l-3.457-.901.347-1.334zm3.53 11.95a.913.913 0 011.1-.645.913.913 0 01.645 1.099.903.903 0 01-1.097.634.903.903 0 01-.648-1.088zm-6.045-2.294l5.296 1.38-.348 1.335-5.296-1.38.348-1.335zm1.081 3.775l2.165.564.257-.988 1.198.313-.257.987 1.324.345-.351 1.345-1.324-.345-.421 1.619-1.198-.312.421-1.619-2.164-.564c-.589-.153-.902.102-1.039.627-.096.368-.117.621-.09.819l-1.166-.304c-.047-.293-.018-.622.097-1.063.345-1.324 1.255-1.76 2.548-1.424zm2.345 8.23l.334-1.282 1.459 1.547-.378 1.451-1.415-1.716zm-5.744.423c-.533-.667-.729-1.593-.469-2.591.49-1.881 2.08-2.6 3.624-2.198 1.566.408 2.601 1.732 2.15 3.466-.384 1.471-1.634 2.178-3.021 1.817a3.52 3.52 0 01-.724-.279l.966-3.709c-1.02-.131-1.578.374-1.795 1.204-.15.578-.029 1.148.275 1.531l-1.006.759zm4.22-1.639c.178-.683-.083-1.233-.738-1.561l-.635 2.438c.541.118 1.179-.131 1.373-.877zm-3.388 5.768c1.545.402 2.593 1.764 2.158 3.435-.186.714-.541 1.172-1.058 1.475l3.006.783-.351 1.345-7.881-2.054.35-1.345.421.11c-.303-.517-.39-1.089-.204-1.804.435-1.671 2.015-2.348 3.559-1.945zm-.364 1.397c-.925-.241-1.748.162-1.983 1.066a1.789 1.789 0 00.358 1.642l1.723.449a1.79 1.79 0 001.113-1.259c.236-.904-.286-1.657-1.211-1.898zm-4.588 10.288c-.533-.667-.729-1.593-.469-2.591.49-1.881 2.08-2.601 3.625-2.198 1.565.408 2.601 1.732 2.149 3.466-.383 1.471-1.633 2.178-3.021 1.817a3.52 3.52 0 01-.724-.279l.967-3.709c-1.021-.131-1.579.374-1.795 1.204-.151.578-.03 1.148.274 1.531l-1.006.759zm4.22-1.639c.178-.683-.082-1.233-.738-1.561l-.635 2.438c.542.118 1.179-.131 1.373-.877zm14.613-152.213l7.881 2.053-.347 1.335-.431-.113c.303.517.4 1.092.211 1.817-.438 1.682-2.014 2.348-3.559 1.946-1.545-.403-2.595-1.754-2.157-3.435.188-.725.554-1.18 1.07-1.483l-3.016-.786.348-1.334zm6.102 4.575c.162-.62.02-1.196-.386-1.661l-1.661-.433c-.597.226-.988.652-1.147 1.261-.236.904.284 1.668 1.208 1.909.925.24 1.751-.173 1.986-1.076zm.732 5.288a.913.913 0 011.1-.645.913.913 0 01.645 1.099.904.904 0 01-1.097.635.905.905 0 01-.648-1.089zm-6.045-2.294l5.296 1.38-.348 1.335-5.296-1.38.348-1.335zm-.765 2.935l7.881 2.054-.347 1.334-7.882-2.053.348-1.335zm4.085 6.892c-.449 1.723-2.027 2.569-3.614 2.156-1.587-.414-2.552-1.922-2.103-3.645.449-1.724 2.027-2.569 3.614-2.156 1.587.413 2.552 1.921 2.103 3.645zm-4.461-1.14c-.222.851.294 1.67 1.208 1.908.925.241 1.765-.224 1.986-1.076.23-.882-.272-1.709-1.197-1.95-.925-.241-1.767.235-1.997 1.118zm-.256 4.601l2.164.564.258-.988 1.198.313-.258.987 1.324.345-.35 1.345-1.324-.345-.422 1.619-1.198-.312.422-1.619-2.165-.564c-.588-.153-.901.102-1.038.628-.096.367-.117.62-.09.818l-1.166-.304c-.048-.293-.018-.622.097-1.063.345-1.324 1.255-1.76 2.548-1.424zm-3.564 5.106c.277-1.061 1.075-1.627 2.053-1.373.798.208 1.236.984 1.129 2.168l-.148 1.69.136.036c.557.145 1.024-.183 1.183-.792.134-.515-.004-.977-.318-1.362l1-.783c.529.642.725 1.524.473 2.491-.399 1.534-1.519 2.084-2.685 1.78l-3.426-.892.348-1.335.515.134c-.323-.443-.421-1.142-.26-1.762zm1.771-.032c-.358-.093-.663.13-.78.582-.159.609.01 1.125.362 1.497l.746.194.118-1.315c.05-.582-.12-.873-.446-.958zm-3.56 3.757c.525.136.877.509 1.101 1.072.265-.156.579-.197.852-.126.42.109.71.376.9.852a1.846 1.846 0 011.647-.334c1.03.268 1.652 1.283 1.307 2.607-.107.41-.273.748-.489 1.017l-.504 1.933-1.135-.295.244-.935a1.758 1.758 0 01-.534-.061c-1.041-.271-1.679-1.268-1.323-2.634.047-.178.101-.344.173-.493-.074-.143-.174-.236-.289-.266-.21-.055-.346.033-.409.275l-.347 1.334c-.348 1.335-1.251 1.874-2.239 1.616-1.177-.306-1.788-1.666-1.358-3.316.441-1.692 1.289-2.537 2.403-2.246zm3.069 3.38c-.145.557.109 1.005.634 1.142.526.136.955-.133 1.1-.69.151-.578-.106-1.015-.621-1.149-.525-.137-.962.119-1.113.697zm-3.208-2.07c-.505-.132-.946.27-1.19 1.205-.251.967-.023 1.554.503 1.691.399.104.746-.064.913-.705l.427-1.64c-.137-.248-.328-.466-.653-.551zm-.941 10.159c-.534-.666-.73-1.592-.47-2.591.49-1.881 2.08-2.6 3.625-2.197 1.566.407 2.601 1.732 2.149 3.466-.383 1.471-1.633 2.178-3.02 1.816a3.514 3.514 0 01-.725-.278l.967-3.71c-1.021-.131-1.579.375-1.795 1.205-.151.578-.03 1.148.274 1.53l-1.005.759zm4.219-1.638c.178-.683-.082-1.234-.737-1.562l-.636 2.438c.542.119 1.179-.13 1.373-.876zm-4.288 6.296l2.165.564.257-.988 1.198.312-.257.988 1.324.345-.351 1.345-1.324-.345-.421 1.618-1.198-.312.421-1.618-2.164-.564c-.589-.154-.902.101-1.039.627-.096.368-.117.62-.09.818l-1.166-.304c-.047-.293-.018-.621.097-1.063.345-1.324 1.255-1.76 2.548-1.423zm-3.017 3.655l5.296 1.379-.347 1.335-.526-.137c.267.44.423.963.267 1.562a1.56 1.56 0 01-.194.443l-1.314-.342c.086-.157.164-.328.227-.569.17-.652-.078-1.165-.362-1.453l-3.395-.884.348-1.334zm-1.592 5.463c.277-1.061 1.075-1.628 2.053-1.373.798.208 1.236.984 1.129 2.168l-.148 1.69.136.035c.557.145 1.024-.182 1.183-.791.134-.515-.004-.977-.319-1.362l1.001-.783c.528.642.725 1.524.473 2.491-.399 1.534-1.519 2.084-2.685 1.78l-3.426-.893.348-1.334.515.134c-.323-.443-.421-1.142-.26-1.762zm1.771-.032c-.358-.094-.663.13-.78.582-.159.609.01 1.125.361 1.497l.747.194.118-1.316c.05-.581-.121-.873-.446-.957zm-2.772 4.523l5.296 1.379-.348 1.335-.42-.109c.262.46.406 1.025.223 1.73-.299 1.145-1.325 1.854-2.891 1.446l-3.152-.821.35-1.345 3.1.807c.704.184 1.25-.101 1.419-.752.175-.673-.183-1.148-.468-1.435l-3.457-.901.348-1.334zm-.8 6.213l.569 1.09c-.495.219-.89.531-1.021 1.036-.113.431.082.717.397.799.925.241 1.238-2.382 3.098-1.897.935.243 1.434 1.215 1.146 2.318-.21.81-.791 1.444-1.404 1.688l-.548-1.085c.408-.186.771-.461.878-.871.109-.421-.07-.681-.343-.752-.904-.235-1.248 2.38-3.077 1.903-1.108-.311-1.485-1.363-1.225-2.361.247-.946.8-1.52 1.53-1.868zm3.368 5.637l-.372 1.429-4.142.391 3.428 2.351-.375 1.44-4.793-3.313.457-1.755 5.797-.543zm-7.369 10.111c-.534-.667-.73-1.593-.47-2.591.49-1.881 2.08-2.601 3.625-2.198 1.566.408 2.601 1.732 2.149 3.466-.383 1.471-1.633 2.178-3.02 1.817a3.497 3.497 0 01-.724-.279l.966-3.709c-1.021-.131-1.579.374-1.795 1.204-.151.578-.03 1.148.275 1.531l-1.006.759zm4.22-1.639c.178-.683-.083-1.233-.738-1.561l-.635 2.438c.541.118 1.178-.131 1.373-.877zm-5.397 2.624l5.296 1.379-.347 1.335-.526-.137c.267.44.423.963.267 1.562-.047.179-.12.328-.194.443l-1.314-.342c.086-.157.164-.328.227-.569.17-.652-.078-1.165-.362-1.452l-3.395-.885.348-1.334zm-.225 4.006l.569 1.091c-.495.219-.89.531-1.021 1.036-.113.43.082.717.397.799.925.241 1.238-2.382 3.098-1.897.935.243 1.434 1.215 1.146 2.318-.21.809-.791 1.444-1.404 1.688l-.548-1.086c.408-.185.771-.461.878-.871.109-.42-.07-.68-.343-.751-.904-.235-1.248 2.379-3.077 1.903-1.108-.311-1.485-1.363-1.225-2.362.247-.945.8-1.519 1.53-1.868zm-2.674 6.476c.277-1.062 1.075-1.628 2.052-1.374.799.209 1.236.985 1.13 2.169l-.149 1.689.137.036c.557.145 1.024-.182 1.183-.792.134-.515-.004-.977-.319-1.362l1.001-.783c.528.643.725 1.524.473 2.491-.4 1.534-1.519 2.084-2.686 1.78l-3.425-.892.347-1.335.515.134c-.322-.443-.42-1.141-.259-1.761zm1.77-.033c-.357-.093-.662.13-.78.582-.159.61.01 1.125.362 1.497l.746.195.119-1.316c.05-.582-.121-.873-.447-.958zm-2.771 4.523l7.881 2.053-.348 1.335-7.881-2.053.348-1.335z"
+ >
+
+
+
+
+
+
+
+
+
+ rx="3.064"
+ transform="rotate(32.957 258.872 65.117)"
+ >
+
+
+
+
+
+ rx="1.71"
+ transform="rotate(-19.252 130.553 173.477)"
+ >
+ rx="1.71"
+ transform="rotate(-19.252 186.439 143.897)"
+ >
+ rx="1.71"
+ transform="rotate(-19.252 133.811 182.804)"
+ >
-
-
-
-
-
+ d="M129.42 167.751l-.924-2.643.537-.188.923 2.644-.536.187zm.716-1.318c-.194-.555.008-1.155.608-1.365.257-.089.47-.075.669.021l-.378-1.08.484-.169.989 2.832-.484.169-.052-.151c-.096.199-.253.343-.51.433-.601.209-1.132-.135-1.326-.69zm.503-.175c.116.332.408.501.732.388a.658.658 0 00.429-.447l-.216-.619a.656.656 0 00-.613-.082c-.325.113-.449.427-.332.76zm4.088-.708c-.095.3-.338.55-.696.675-.676.236-1.223-.102-1.417-.657-.196-.563-.003-1.152.62-1.369.529-.185 1.001.053 1.175.551.037.106.056.209.064.279l-1.333.465c.169.339.438.406.736.302a.643.643 0 00.412-.398l.439.152zm-1.367-.955c-.246.086-.361.279-.327.547l.877-.306a.419.419 0 00-.55-.241zm1.91 1.113l-.665-1.903.48-.168.052.151a.823.823 0 01.484-.423c.411-.144.839.025 1.035.588l.396 1.132-.483.169-.389-1.114c-.089-.253-.288-.361-.522-.28-.241.085-.313.292-.343.438l.434 1.242-.479.168zm2.205-1.55l-.272-.778-.355.124-.15-.43.355-.124-.166-.476.483-.169.166.476.582-.203.15.43-.581.203.271.778c.074.212.216.255.405.189a.788.788 0 00.269-.14l.146.419a.928.928 0 01-.345.188c-.476.167-.796-.022-.958-.487zm1.198-2.147a.337.337 0 01-.423-.204.337.337 0 01.204-.423.333.333 0 01.219.627zm.539 2.32l-.665-1.903.48-.168.665 1.904-.48.167zm.156-2.19l.355-.124-.07-.2c-.141-.404.013-.822.489-.989a.995.995 0 01.479-.048l-.064.471a.412.412 0 00-.257.005c-.162.057-.228.207-.168.381l.074.211.582-.203.15.431-.581.203.514 1.473-.483.169-.515-1.473-.355.124-.15-.431zm1.905-1.038a.337.337 0 01-.423-.204.337.337 0 01.204-.423.333.333 0 01.219.627zm.539 2.32l-.665-1.903.48-.168.664 1.904-.479.167zm2.699-1.29c-.095.3-.338.55-.697.675-.676.237-1.222-.102-1.416-.657-.196-.563-.003-1.152.62-1.369.528-.185 1.001.053 1.175.551.037.106.056.209.064.279l-1.334.465c.17.339.439.406.737.302a.643.643 0 00.412-.398l.439.152zm-1.368-.954c-.245.085-.36.278-.326.546l.876-.306a.417.417 0 00-.55-.24zm1.91 1.112l-.664-1.903.479-.168.066.189a.725.725 0 01.423-.402.588.588 0 01.176-.032l.165.472a.895.895 0 00-.221.048.552.552 0 00-.37.409l.426 1.219-.48.168zm3.519-2.152l-.378-1.08.484-.169.369 1.057c.199.57-.01 1.038-.569 1.233-.559.195-1.01-.041-1.21-.612l-.369-1.057.484-.169.377 1.08c.096.276.299.396.563.303.261-.091.345-.311.249-.586zm1.301.469l-.664-1.904.479-.167.053.151a.816.816 0 01.484-.423c.411-.144.839.025 1.035.587l.396 1.133-.484.169-.389-1.114c-.088-.253-.287-.362-.521-.28-.242.085-.313.292-.343.438l.434 1.242-.48.168zm1.791-2.117c-.04-.116-.037-.208.01-.275a.39.39 0 01.206-.152.388.388 0 01.251-.008c.079.024.139.093.179.209.039.111.036.202-.01.275a.384.384 0 01-.201.151.396.396 0 01-.256.008c-.08-.028-.14-.098-.179-.208zm3.257.006c-.094.3-.337.55-.696.676-.676.236-1.222-.103-1.416-.658-.197-.563-.004-1.151.619-1.369.529-.185 1.002.053 1.176.551.037.106.056.209.063.279l-1.333.465c.169.34.439.407.737.302a.646.646 0 00.412-.398l.438.152zm-1.367-.954c-.245.085-.36.278-.326.546l.876-.306a.417.417 0 00-.55-.24zm3.264-1.835l-.46.161.173-.764.521-.182-.234.785zm1.308 1.67c-.094.3-.337.55-.696.675-.676.236-1.222-.102-1.416-.658-.197-.562-.004-1.151.619-1.368.529-.185 1.001.052 1.175.551.037.106.057.209.064.279l-1.333.465c.169.339.438.406.737.302a.644.644 0 00.411-.398l.439.152zm-1.367-.955c-.246.086-.361.279-.326.546l.876-.306a.419.419 0 00-.55-.24zm1.91 1.113l-.989-2.832.479-.168.989 2.832-.479.168zm2.021-1.63l-.377-1.08.483-.168.369 1.057c.199.57-.01 1.037-.569 1.233-.559.195-1.01-.042-1.209-.612l-.37-1.057.484-.169.377 1.08c.096.276.299.395.563.303.261-.091.345-.311.249-.587zm1.638-2.122l-.461.16.174-.764.521-.182-.234.786zm1.308 1.67c-.095.3-.338.55-.697.675-.676.236-1.222-.103-1.416-.658-.196-.562-.003-1.151.62-1.369.528-.184 1.001.053 1.175.552.037.105.056.209.064.278l-1.334.466c.17.339.439.406.737.302a.648.648 0 00.412-.398l.439.152zm-1.368-.955c-.245.086-.36.279-.326.546l.876-.306a.417.417 0 00-.55-.24zm1.91 1.113l-.664-1.904.479-.167.066.189a.725.725 0 01.423-.402.558.558 0 01.176-.032l.165.472a.851.851 0 00-.221.048.55.55 0 00-.37.408l.426 1.22-.48.168zm3.098-1.429c-.095.299-.338.55-.697.675-.676.236-1.222-.103-1.416-.658-.196-.563-.004-1.151.619-1.369.529-.184 1.002.053 1.176.552.037.105.056.209.063.278l-1.333.466c.17.339.439.406.737.302a.65.65 0 00.412-.398l.439.152zm-1.368-.955c-.245.086-.36.278-.326.546l.876-.306a.417.417 0 00-.55-.24zm1.91 1.112l-.664-1.903.479-.167.053.151a.814.814 0 01.483-.423c.412-.144.84.024 1.036.587l.396 1.133-.484.169-.389-1.114c-.088-.253-.287-.362-.521-.28-.242.084-.313.292-.343.438l.434 1.242-.48.167zm2.205-1.549l-.271-.778-.355.124-.151-.431.355-.124-.166-.476.484-.168.166.475.581-.203.151.431-.582.203.272.778c.074.211.216.255.405.189a.786.786 0 00.269-.141l.146.42a.95.95 0 01-.345.188c-.476.166-.796-.023-.959-.487zm1.202-1.132c-.041-.115-.038-.207.01-.274a.384.384 0 01.205-.152.384.384 0 01.252-.008c.078.023.138.093.178.209.039.111.036.202-.01.275a.382.382 0 01-.201.15.39.39 0 01-.256.009c-.08-.028-.14-.098-.178-.209zm3.256.007c-.094.3-.337.55-.696.675-.676.236-1.222-.103-1.416-.658-.196-.562-.004-1.151.619-1.368.529-.185 1.002.052 1.176.551.037.106.056.209.063.279l-1.333.465c.17.339.439.406.737.302a.646.646 0 00.412-.398l.438.152zm-1.367-.955c-.245.086-.36.279-.326.546l.876-.306a.418.418 0 00-.55-.24z"
+ >
+
+
+
+ width="13.919"
+ height="1.861"
+ x="178.774"
+ y="104.078"
+ fill="#F4F5FD"
+ rx="0.931"
+ transform="rotate(-2.116 178.774 104.078)"
+ >
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+ fill="#3F72B5"
+ d="M419.844 143.846l-.404-1.469.298-.082.404 1.469-.298.082zm.438-.689c-.085-.309.047-.627.38-.719a.453.453 0 01.362.036l-.165-.6.269-.074.433 1.574-.269.074-.023-.084a.447.447 0 01-.293.216c-.333.092-.609-.114-.694-.423zm.279-.077c.051.185.203.288.384.238a.36.36 0 00.249-.227l-.095-.344a.357.357 0 00-.33-.067c-.18.049-.259.215-.208.4zm2.246-.234a.577.577 0 01-.403.341c-.375.104-.66-.1-.745-.409-.086-.313.041-.625.387-.72.294-.081.542.065.618.342a.692.692 0 01.024.154l-.741.204c.08.19.224.236.389.191a.354.354 0 00.239-.201l.232.098zm-.707-.568c-.137.037-.206.138-.197.284l.487-.134a.227.227 0 00-.29-.15zm.996.674l-.291-1.058.267-.073.023.084a.441.441 0 01.278-.212c.229-.063.455.044.541.357l.173.629-.269.074-.17-.619c-.039-.141-.143-.207-.273-.171-.134.037-.181.147-.202.225l.19.691-.267.073zm1.255-.761l-.119-.432-.198.054-.066-.239.198-.054-.073-.265.269-.074.072.265.324-.089.066.239-.324.089.119.433c.033.117.108.146.213.117a.425.425 0 00.151-.066l.064.233a.517.517 0 01-.194.089c-.265.073-.431-.041-.502-.3zm.729-1.121a.183.183 0 01-.222-.127.183.183 0 01.126-.222.181.181 0 01.096.349zm.207 1.279l-.291-1.058.267-.073.291 1.058-.267.073zm.166-1.183l.197-.054-.031-.112c-.062-.224.038-.446.302-.519a.547.547 0 01.262-.008l-.052.253a.224.224 0 00-.14-.006c-.09.024-.131.104-.105.2l.033.118.323-.089.066.239-.324.089.226.819-.269.074-.225-.819-.198.054-.065-.239zm1.072-.494a.183.183 0 01-.222-.126.183.183 0 01.126-.222.18.18 0 01.096.348zm.208 1.28l-.291-1.058.266-.073.291 1.057-.266.074zm1.512-.601a.582.582 0 01-.402.341c-.376.103-.66-.101-.745-.41-.086-.312.04-.625.386-.72.294-.081.542.065.618.342a.703.703 0 01.025.154l-.741.204c.079.19.223.237.389.191a.354.354 0 00.238-.201l.232.099zm-.707-.569c-.136.037-.206.138-.197.284l.487-.134a.228.228 0 00-.29-.15zm.996.674l-.291-1.058.267-.073.029.105a.392.392 0 01.244-.203.317.317 0 01.097-.011l.072.263a.5.5 0 00-.122.017.302.302 0 00-.216.209l.187.678-.267.073zm1.99-1.039l-.165-.601.268-.073.162.587c.087.317-.044.563-.354.649-.311.085-.547-.06-.635-.377l-.161-.588.268-.073.166.6c.042.153.147.226.294.185.145-.04.199-.156.157-.309zm.69.302l-.291-1.058.266-.073.023.084a.447.447 0 01.278-.212c.229-.063.455.044.541.357l.173.63-.268.074-.171-.62c-.038-.14-.142-.206-.273-.171-.134.037-.18.147-.202.225l.19.691-.266.073zm1.05-1.083c-.018-.065-.013-.114.015-.149a.217.217 0 01.117-.075.206.206 0 01.137.005c.042.016.072.056.09.12.017.061.012.111-.016.149a.205.205 0 01-.115.074.219.219 0 01-.139-.004c-.042-.019-.072-.059-.089-.12zm1.768.123a.581.581 0 01-.403.341c-.375.103-.66-.101-.745-.409-.086-.313.041-.626.387-.721.294-.081.542.066.618.343a.685.685 0 01.024.153l-.741.204c.08.191.224.237.389.191a.351.351 0 00.239-.201l.232.099zm-.707-.569c-.137.038-.206.138-.197.285l.487-.134a.228.228 0 00-.29-.151zm1.84-.876l-.256.07.122-.408.29-.08-.156.418zm.648.955a.582.582 0 01-.402.341c-.376.103-.66-.101-.745-.409-.086-.313.04-.625.386-.721.294-.081.542.066.618.343a.695.695 0 01.025.153l-.741.204c.079.191.223.237.389.191a.351.351 0 00.238-.201l.232.099zm-.707-.569c-.136.038-.206.138-.197.285l.487-.134a.228.228 0 00-.29-.151zm.996.675l-.433-1.575.267-.073.433 1.574-.267.074zm1.158-.811l-.165-.6.268-.074.162.588c.087.317-.044.563-.355.648-.31.085-.547-.06-.634-.377l-.161-.587.268-.074.165.6c.043.153.148.226.295.186.145-.04.199-.157.157-.31zm.967-1.092l-.256.07.123-.408.289-.08-.156.418zm.649.955a.583.583 0 01-.403.341c-.376.103-.66-.101-.745-.41-.086-.312.041-.625.387-.72.294-.081.542.065.618.342a.692.692 0 01.024.154l-.741.204c.08.19.223.237.389.191a.35.35 0 00.238-.201l.233.099zm-.707-.569c-.137.038-.206.138-.198.285l.487-.134a.226.226 0 00-.289-.151zm.996.674l-.291-1.058.267-.073.028.105c.05-.09.125-.17.245-.203a.283.283 0 01.096-.01l.072.262a.454.454 0 00-.121.018.298.298 0 00-.216.208l.186.678-.266.073zm1.734-.662a.581.581 0 01-.403.341c-.375.104-.66-.101-.744-.409-.087-.313.04-.625.386-.721.294-.08.542.066.618.343a.692.692 0 01.024.154l-.741.203c.08.191.224.237.389.192a.354.354 0 00.239-.201l.232.098zm-.707-.569c-.137.038-.206.138-.197.285l.487-.134a.229.229 0 00-.29-.151zm.996.675l-.291-1.058.267-.073.023.083a.443.443 0 01.278-.211c.229-.063.455.044.541.357l.173.629-.269.074-.17-.619c-.039-.141-.143-.207-.273-.171-.134.037-.181.147-.202.225l.19.69-.267.074zm1.255-.761l-.119-.432-.198.054-.066-.239.198-.054-.073-.265.269-.074.072.265.324-.089.066.239-.324.089.119.432c.033.118.108.147.213.118a.425.425 0 00.151-.066l.064.233a.517.517 0 01-.194.089c-.265.073-.431-.042-.502-.3zm.693-.57c-.017-.064-.012-.114.016-.149a.217.217 0 01.117-.075.213.213 0 01.137.006c.042.015.072.055.089.119.017.062.012.112-.015.149a.216.216 0 01-.115.075.212.212 0 01-.139-.005c-.043-.018-.073-.058-.09-.12zm1.769.123a.584.584 0 01-.403.342c-.376.103-.66-.101-.745-.41-.086-.313.04-.625.387-.72.293-.081.541.065.618.342a.757.757 0 01.024.154l-.741.204c.079.19.223.236.389.191a.354.354 0 00.238-.201l.233.098zm-.708-.568c-.136.037-.206.138-.197.284l.487-.134a.228.228 0 00-.29-.15z"
+ >
+
+
+
+
+
+
+
+ fill="#3F72B5"
+ d="M93.062 86.731l.612-1.395.283.124-.612 1.396-.283-.125zm.774-.259c.129-.293.431-.457.748-.318.136.06.215.144.259.256l.25-.57.255.111-.656 1.496-.255-.112.035-.08a.451.451 0 01-.364-.017c-.317-.139-.4-.473-.272-.766zm.265.116c-.077.176-.023.351.148.427.114.05.229.043.337-.02l.143-.326a.359.359 0 00-.214-.26c-.171-.076-.337.004-.414.18zm1.891 1.234a.582.582 0 01-.528.011c-.356-.156-.448-.494-.32-.787.13-.297.425-.46.754-.316.28.123.38.392.264.656a.71.71 0 01-.078.134l-.703-.308c-.059.197.024.324.181.393.11.048.227.042.312-.006l.118.223zm-.19-.887c-.13-.057-.247-.023-.333.096l.463.203a.227.227 0 00-.13-.3zm.348 1.151l.44-1.004.254.11-.035.08a.446.446 0 01.35.011c.217.095.325.32.194.618l-.262.598-.255-.112.258-.588c.059-.134.02-.25-.104-.305-.128-.056-.233 0-.299.047l-.288.656-.253-.11zm1.453.2l.18-.41-.187-.083.1-.227.187.082.11-.25.256.111-.11.251.306.135-.1.227-.306-.134-.18.41c-.05.112-.009.182.09.226.07.03.12.043.16.043l-.097.222a.514.514 0 01-.208-.053c-.25-.11-.308-.304-.2-.55zm1.274-.411a.183.183 0 01-.093-.238.183.183 0 01.238-.093c.09.04.13.148.09.237a.181.181 0 01-.235.094zm-.646 1.124l.441-1.004.253.11-.44 1.005-.254-.11zm.874-.814l.188.082.046-.106c.094-.213.31-.323.562-.212.091.04.159.096.208.158l-.2.164a.22.22 0 00-.104-.093c-.086-.038-.168-.003-.208.09l-.05.11.308.135-.1.228-.307-.135-.34.778-.256-.112.341-.778-.187-.082.1-.228zm1.144.292a.183.183 0 01-.093-.238.184.184 0 01.238-.093.18.18 0 01-.145.331zm-.645 1.124l.441-1.004.253.11-.441 1.006-.253-.112zm1.553.487a.58.58 0 01-.527.01c-.357-.156-.449-.493-.321-.786.131-.297.426-.46.755-.316.279.123.379.392.263.656a.674.674 0 01-.078.134l-.703-.309c-.059.198.024.325.181.394.11.048.227.042.312-.006l.118.223zm-.19-.887c-.13-.057-.247-.023-.333.096l.463.203a.228.228 0 00-.13-.3zm.348 1.151l.441-1.005.253.111-.044.1a.395.395 0 01.318-.003.315.315 0 01.082.052l-.11.25a.457.457 0 00-.105-.064.3.3 0 00-.299.026l-.283.644-.253-.11zm2.2.447l.25-.57.255.112-.245.558c-.132.3-.388.41-.684.28-.295-.13-.387-.391-.255-.692l.245-.558.255.112-.25.57c-.064.145-.027.268.112.33.138.06.253.004.317-.142zm.345.67l.441-1.005.253.11-.035.08a.444.444 0 01.349.011c.218.095.325.321.195.618l-.262.598-.255-.112.258-.588c.058-.133.019-.25-.105-.305-.127-.056-.232 0-.298.048l-.288.655-.253-.11zm1.498-.18c.027-.061.062-.096.106-.106a.212.212 0 01.138.016c.047.02.081.05.103.09.023.039.021.088-.006.15-.026.058-.061.093-.106.105a.21.21 0 01-.136-.014.212.212 0 01-.105-.092c-.022-.04-.019-.09.006-.149zm1.295 1.21a.58.58 0 01-.527.011c-.357-.157-.449-.494-.321-.787.131-.297.426-.46.755-.316.279.123.379.392.264.656a.721.721 0 01-.079.134l-.703-.309c-.059.198.024.325.181.394.11.048.227.042.312-.006l.118.223zm-.19-.887c-.13-.057-.247-.023-.333.097l.463.202a.228.228 0 00-.13-.3zm1.98.479l-.243-.107.353-.24.275.12-.385.227zm-.098 1.15a.582.582 0 01-.528.011c-.356-.156-.448-.494-.32-.787.13-.297.425-.46.754-.316.279.123.38.393.264.656a.673.673 0 01-.078.134l-.703-.308c-.059.198.024.324.181.393.11.048.227.042.312-.006l.118.223zm-.191-.887c-.129-.057-.246-.023-.332.097l.463.203a.228.228 0 00-.131-.3zm.349 1.151l.656-1.495.253.111-.656 1.496-.253-.112zm1.409.1l.25-.57.256.112-.245.558c-.132.302-.389.41-.684.28-.295-.129-.387-.39-.255-.692l.245-.558.255.112-.25.57c-.064.146-.028.269.112.33.137.06.253.004.316-.142zm1.44-.238l-.243-.107.352-.24.275.12-.384.227zm-.098 1.15a.582.582 0 01-.528.011c-.357-.156-.449-.494-.32-.787.13-.297.425-.46.754-.316.279.123.379.393.264.656a.673.673 0 01-.078.134l-.704-.308c-.058.198.024.324.182.393a.35.35 0 00.311-.006l.119.223zm-.191-.887c-.13-.057-.247-.023-.332.097l.462.203a.227.227 0 00-.13-.3zm.349 1.151l.44-1.004.254.11-.044.1a.395.395 0 01.318-.003.31.31 0 01.081.053l-.109.249a.494.494 0 00-.106-.063.3.3 0 00-.299.026l-.282.644-.253-.112zm1.763.58a.58.58 0 01-.527.01c-.357-.156-.449-.494-.321-.787.131-.297.426-.46.755-.316.279.123.379.393.264.656a.786.786 0 01-.078.134l-.704-.308c-.059.198.024.324.181.393.11.048.227.042.312-.006l.118.223zm-.19-.888c-.13-.057-.247-.023-.333.097l.463.203a.228.228 0 00-.13-.3zm.348 1.151l.441-1.004.253.11-.035.08a.447.447 0 01.35.011c.217.096.325.321.195.618l-.263.598-.255-.112.258-.588c.059-.133.02-.25-.104-.305-.128-.056-.233 0-.299.048l-.288.656-.253-.112zm1.453.2l.181-.41-.188-.082.1-.228.187.082.11-.25.256.111-.111.252.307.134-.099.227-.307-.134-.18.41c-.049.112-.009.182.091.226.07.03.119.043.159.044l-.097.22a.507.507 0 01-.207-.052c-.252-.11-.309-.304-.202-.55zm.898-.005c.027-.061.062-.096.106-.106a.211.211 0 01.138.016c.047.02.081.05.103.09.023.039.021.088-.006.15-.025.058-.061.093-.105.105a.212.212 0 01-.137-.014.212.212 0 01-.105-.091c-.021-.042-.019-.091.006-.15zm1.296 1.21a.583.583 0 01-.528.011c-.357-.157-.449-.494-.32-.787.13-.297.425-.46.754-.316.279.123.379.392.264.656a.726.726 0 01-.078.134l-.704-.309c-.058.198.024.325.182.394a.35.35 0 00.311-.006l.119.223zm-.191-.887c-.13-.057-.247-.023-.333.097l.463.202a.227.227 0 00-.13-.3z"
+ >
-
-
-
-
+
+
+
+
+
+
+ fill="#3F72B5"
+ d="M228.812 128.244l.453-.614.125.092-.453.614-.125-.092zm.407-.041c.095-.129.261-.176.401-.073a.228.228 0 01.098.153l.185-.251.112.083-.485.658-.112-.083.025-.035a.224.224 0 01-.175-.048c-.14-.103-.144-.276-.049-.404zm.117.086c-.057.077-.05.169.025.224.05.037.107.046.167.028l.106-.144a.18.18 0 00-.076-.151c-.076-.055-.165-.035-.222.043zm.787.811a.29.29 0 01-.258-.053c-.158-.116-.165-.291-.07-.42.096-.131.258-.178.403-.071.123.091.142.234.057.349a.337.337 0 01-.053.057l-.31-.228c-.05.09-.024.161.045.212a.176.176 0 00.153.032l.033.122zm.005-.455c-.057-.042-.118-.038-.173.011l.204.15a.115.115 0 00-.031-.161zm.043.601l.326-.442.112.082-.026.035a.227.227 0 01.17.044c.095.071.123.193.027.323l-.195.264-.112-.083.191-.259c.043-.059.037-.12-.017-.16-.056-.042-.114-.026-.151-.01l-.213.288-.112-.082zm.688.258l.133-.181-.082-.06.074-.1.082.06.082-.11.112.083-.082.11.135.1-.073.1-.135-.1-.134.181c-.036.049-.024.088.02.12a.219.219 0 00.073.039l-.072.097a.249.249 0 01-.095-.048c-.111-.082-.117-.183-.038-.291zm.667-.06a.093.093 0 01-.019-.127.093.093 0 01.127-.019.091.091 0 01.018.126.092.092 0 01-.126.02zm-.439.478l.326-.443.112.083-.326.442-.112-.082zm.517-.302l.082.061.035-.047c.069-.094.187-.123.297-.042.041.03.068.065.085.101l-.116.058a.108.108 0 00-.041-.057c-.037-.028-.081-.02-.111.021l-.036.049.135.099-.074.1-.135-.099-.252.342-.113-.083.253-.342-.083-.061.074-.1zm.526.269a.092.092 0 01-.019-.126.092.092 0 01.127-.02.09.09 0 01-.108.146zm-.439.478l.326-.442.112.082-.326.442-.112-.082zm.705.409a.29.29 0 01-.259-.053c-.157-.116-.164-.291-.069-.42.096-.13.258-.177.403-.071.123.091.142.234.056.35a.379.379 0 01-.053.057l-.309-.229c-.05.09-.024.161.045.212a.176.176 0 00.153.032l.033.122zm.005-.454c-.057-.042-.118-.039-.173.01l.203.15c.032-.046.032-.114-.03-.16zm.043.6l.326-.442.112.082-.033.044a.2.2 0 01.156.034.156.156 0 01.034.034l-.081.11a.185.185 0 00-.045-.042.146.146 0 00-.148-.021l-.209.284-.112-.083zm1.025.461l.185-.251.113.083-.182.246c-.097.132-.235.157-.364.061-.13-.096-.146-.234-.049-.366l.181-.246.113.083-.185.251c-.048.064-.043.128.018.173.061.045.123.03.17-.034zm.095.365l.326-.442.111.082-.026.035a.227.227 0 01.17.044c.096.071.123.193.027.323l-.194.264-.112-.083.19-.259c.044-.059.038-.12-.017-.16-.056-.042-.114-.026-.151-.01l-.213.288-.111-.082zm.751.078c.02-.027.041-.04.064-.04a.1.1 0 01.066.023c.02.015.034.033.04.055.007.021 0 .045-.02.072-.019.026-.04.039-.063.04a.102.102 0 01-.065-.022.102.102 0 01-.041-.056c-.006-.022 0-.047.019-.072zm.5.734a.295.295 0 01-.259-.053c-.157-.116-.165-.291-.07-.42.096-.131.258-.178.403-.071.123.09.142.233.057.349a.337.337 0 01-.053.057l-.31-.228c-.05.09-.024.161.046.212a.174.174 0 00.152.032l.034.122zm.004-.455c-.057-.042-.118-.038-.173.011l.204.15a.114.114 0 00-.031-.161zm.915.453l-.107-.079.198-.079.122.09-.213.068zm-.175.551a.295.295 0 01-.259-.053c-.157-.116-.165-.291-.07-.42.097-.131.259-.178.404-.071.122.091.142.233.056.349a.3.3 0 01-.053.057l-.309-.228c-.051.09-.024.161.045.212a.176.176 0 00.153.032l.033.122zm.005-.455c-.057-.042-.118-.038-.173.011l.203.15a.115.115 0 00-.03-.161zm.043.601l.485-.658.112.082-.486.658-.111-.082zm.677.204l.185-.251.113.083-.182.246c-.097.132-.235.157-.364.061-.13-.096-.146-.233-.049-.366l.181-.246.113.083-.185.251c-.048.064-.043.128.018.174.061.044.123.029.17-.035zm.73.043l-.107-.079.198-.079.121.09-.212.068zm-.175.551a.295.295 0 01-.259-.053c-.157-.116-.165-.291-.07-.42.097-.131.259-.178.404-.071.122.09.142.233.056.349a.3.3 0 01-.053.057l-.309-.228c-.051.09-.024.161.045.212a.176.176 0 00.153.032l.033.122zm.005-.455c-.057-.042-.118-.038-.173.011l.203.15a.115.115 0 00-.03-.161zm.043.601l.326-.442.111.082-.032.044a.196.196 0 01.156.033.184.184 0 01.034.035l-.081.11a.268.268 0 00-.045-.043.15.15 0 00-.149-.02l-.209.283-.111-.082zm.797.477a.287.287 0 01-.258-.053c-.158-.115-.165-.29-.07-.419.096-.131.258-.178.403-.071.123.09.142.233.057.349a.381.381 0 01-.053.057l-.31-.229c-.05.091-.024.162.045.213a.179.179 0 00.153.031l.033.122zm.005-.454c-.057-.042-.118-.038-.173.01l.204.15a.114.114 0 00-.031-.16zm.043.601l.326-.443.112.083-.026.035a.226.226 0 01.17.043c.095.071.123.193.027.324l-.195.263-.112-.083.191-.259c.043-.058.037-.12-.017-.16-.056-.041-.114-.026-.151-.01l-.213.289-.112-.082zm.688.258l.133-.181-.082-.061.074-.1.082.061.082-.111.112.083-.082.111.135.099-.073.1-.135-.099-.134.18c-.036.049-.024.088.02.121a.212.212 0 00.073.038l-.072.098a.27.27 0 01-.095-.049c-.111-.081-.117-.183-.038-.29zm.439.096c.02-.027.041-.04.064-.04.022 0 .044.007.065.023a.105.105 0 01.041.055c.007.022 0 .046-.02.073-.019.025-.04.039-.063.04a.107.107 0 01-.065-.023.102.102 0 01-.041-.056c-.006-.022 0-.046.019-.072zm.499.734a.293.293 0 01-.259-.053c-.157-.116-.164-.291-.069-.42.096-.131.258-.178.403-.071.123.091.142.234.057.349a.337.337 0 01-.053.057l-.31-.228c-.05.09-.024.161.045.212a.176.176 0 00.153.032l.033.122zm.005-.455c-.057-.042-.118-.038-.173.011l.204.15a.115.115 0 00-.031-.161z"
+ >
+
+
+
+
+
+
+
+
+
+ fill="#47479F"
+ d="M268.87 345.675a8.61 8.61 0 018.61 8.61v51.67a8.61 8.61 0 01-17.22 0v-51.67a8.61 8.61 0 018.61-8.61zM303.32 345.675a8.61 8.61 0 018.61 8.61v51.67a8.61 8.61 0 01-17.22 0v-51.67c0-4.76 3.85-8.61 8.61-8.61zM199.98 345.675a8.61 8.61 0 018.61 8.61v51.67a8.61 8.61 0 01-17.22 0v-51.67c-.01-4.76 3.85-8.61 8.61-8.61zM234.42 345.675a8.61 8.61 0 018.61 8.61v51.67a8.61 8.61 0 01-17.22 0v-51.67a8.61 8.61 0 018.61-8.61z"
+ >
+ fill="#9498F6"
+ d="M393.74 302.615c-.04 4.74-3.87 8.58-8.61 8.61H152.61a8.63 8.63 0 01-8.61-8.61c.04-4.74 3.87-8.58 8.61-8.61h1.33c.4 4.44 4.11 7.86 8.57 7.88h44.39l-22.78-7.88h87.11l.86.3c14.5 5 29.74 7.57 45.08 7.58h76.52c.05.24.06.48.05.73z"
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+ >
+ >
-
+
-
-
-
-
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+
+ result="effect1_dropShadow_523_1843"
+ >
+ >
-
+
-
-
-
-
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+
+ result="effect1_dropShadow_523_1843"
+ >
+ >
-
+
-
-
-
-
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+
+ result="effect1_dropShadow_523_1843"
+ >
+ >
-
+
-
-
-
-
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+
+ result="effect1_dropShadow_523_1843"
+ >
+ >
-
+
-
-
-
-
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+
+ result="effect1_dropShadow_523_1843"
+ >
+ >
-
+
+ >
+ >
+ transform="matrix(.0113 0 0 .00917 -.02 0)"
+ xlinkHref="#image0_523_1843"
+ >
-
+
-
-
-
-
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+
+ result="effect1_dropShadow_523_1843"
+ >
+ >
-
+
-
-
-
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+
+
+
+
+
+
+ in="SourceAlpha"
+ result="hardAlpha"
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+
+ result="effect1_dropShadow_523_1843"
+ >
+ >
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
+
+ fill="#fff"
+ d="M0 0H1700V1702.14H0z"
+ transform="translate(-1031 -119)"
+ >
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
+ fill="#fff"
+ d="M0 95.12A8.12 8.12 0 018.12 87H198.88A8.12 8.12 0 01207 95.12v18.408a8.12 8.12 0 01-8.119 8.12H8.119A8.12 8.12 0 010 113.528V95.119z"
+ >
-
+
+ fill="#fff"
+ d="M0 0H15V15H0z"
+ transform="translate(20 96.824)"
+ >
+ >
);
diff --git a/packages/panier/components/Picto/CollectiviteEngageePicto.tsx b/packages/panier/components/Picto/CollectiviteEngageePicto.tsx
new file mode 100644
index 0000000000..820c4e2d4f
--- /dev/null
+++ b/packages/panier/components/Picto/CollectiviteEngageePicto.tsx
@@ -0,0 +1,214 @@
+import React from 'react';
+
+const CollectiviteEngageePicto = () => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+export default CollectiviteEngageePicto;
diff --git a/packages/panier/components/Picto/DashboardPicto.tsx b/packages/panier/components/Picto/DashboardPicto.tsx
index 690220153e..180f1893c9 100644
--- a/packages/panier/components/Picto/DashboardPicto.tsx
+++ b/packages/panier/components/Picto/DashboardPicto.tsx
@@ -1,937 +1,891 @@
const DashboardPicto = ({className}: {className?: string}) => {
return (
-
+ d="M471.5 206.045c0 122.332-109.669 156-232 156S33 319.377 33 197.045c0-122.33 94.169-193.5 216.5-193.5s222 80.17 222 202.5z"
+ opacity="0.6"
+ >
+
+ rx="5.884"
+ >
-
-
+ x="424.77"
+ y="88.621"
+ fill="#fff"
+ rx="3.362"
+ >
+ strokeWidth="1.681"
+ d="M434.5 92.97v10.15M430.875 94.783v8.337M438.125 96.958v6.162"
+ >
-
-
+ d="M456.5 225.537c0 22.263-5.588 40.464-15.509 55.252-9.923 14.791-24.201 26.196-41.625 34.83-34.861 17.275-82.253 23.426-132.304 23.426-50.041 0-92.192-7.793-121.82-26.688-29.587-18.87-46.742-48.849-46.742-93.397 0-44.54 19.197-79.749 50.87-103.835 31.685-24.097 75.883-37.08 125.879-37.08 99.996 0 181.251 58.472 181.251 147.492z"
+ >
+
+
-
-
-
+ d="M383.5 208.537c0 22.263-5.588 40.464-15.509 55.252-9.923 14.791-24.201 26.196-41.625 34.83-34.861 17.275-82.253 23.426-132.304 23.426-50.041 0-92.192-7.793-121.82-26.688C42.656 276.487 25.5 246.508 25.5 201.96c0-44.54 19.197-79.749 50.87-103.835 31.685-24.097 75.883-37.08 125.879-37.08 99.996 0 181.251 58.472 181.251 147.492z"
+ >
+
+
+
+ x="141.533"
+ y="69.546"
+ fill="#fff"
+ rx="7.626"
+ >
+ rx="4.766"
+ >
+ rx="2.86"
+ >
+ d="M168.145 109.712a.207.207 0 01-.147-.061l-.557-.556a.211.211 0 010-.295.21.21 0 01.295 0l.556.556a.21.21 0 01-.147.356z"
+ >
+ fill="#fff"
+ d="M167.958 108.91v-4.671h1.181l1.142 1.962 1.141-1.962h1.181v4.671h-.948v-3.35l-1.041 1.748h-.667l-1.041-1.748v3.35h-.948zm7.391-3.497c1.094 0 1.842.808 1.842 1.815 0 1.008-.748 1.815-1.842 1.815-1.095 0-1.842-.807-1.842-1.815 0-1.007.747-1.815 1.842-1.815zm.013 2.83c.541 0 .948-.434.948-1.015 0-.587-.407-1.014-.948-1.014-.56 0-.974.427-.974 1.014 0 .588.414 1.015.974 1.015zm2.602.667v-3.363h.847v.267c.234-.227.547-.401.994-.401.728 0 1.308.501 1.308 1.495v2.002h-.854v-1.969c0-.447-.254-.727-.667-.727-.427 0-.654.287-.781.501v2.195h-.847zm5.91 1.641v-5.004h.847v.273c.261-.26.588-.407 1.048-.407 1.068 0 1.708.834 1.708 1.815s-.64 1.815-1.708 1.815c-.46 0-.787-.146-1.048-.407v1.915h-.847zm1.775-4.337c-.394 0-.714.174-.928.487v1.055c.227.32.541.487.928.487.574 0 .948-.427.948-1.015 0-.587-.374-1.014-.948-1.014zm2.604 2.696v-5.005h.848v5.005h-.848zm2.811.1c-.674 0-1.134-.387-1.134-1.008 0-.507.394-.887 1.114-1.007l1.028-.174v-.086c0-.354-.267-.581-.654-.581a.915.915 0 00-.761.4l-.62-.473c.3-.414.794-.668 1.408-.668.974 0 1.474.581 1.474 1.322v2.175h-.847v-.327c-.214.26-.614.427-1.008.427zm-.293-1.048c0 .227.18.374.467.374.387 0 .667-.18.834-.447v-.474l-.801.134c-.353.06-.5.207-.5.413zm3.119.948v-3.363h.847v.267c.234-.227.547-.401.995-.401.727 0 1.307.501 1.307 1.495v2.002h-.854v-1.969c0-.447-.253-.727-.667-.727-.427 0-.654.287-.781.501v2.195h-.847zm6.838-3.897l-.801-1.108h.921l.687 1.108h-.807zm.02 3.997c-.674 0-1.135-.387-1.135-1.008 0-.507.394-.887 1.115-1.007l1.027-.174v-.086c0-.354-.266-.581-.653-.581a.915.915 0 00-.761.4l-.621-.473c.301-.414.794-.668 1.408-.668.974 0 1.475.581 1.475 1.322v2.175h-.848v-.327c-.213.26-.613.427-1.007.427zm-.294-1.048c0 .227.18.374.467.374a.94.94 0 00.834-.447v-.474l-.8.134c-.354.06-.501.207-.501.413zm5.345-3.002a.562.562 0 01-.554-.554c0-.301.254-.554.554-.554a.555.555 0 010 1.108zm-.427 3.95v-3.363h.847v3.363h-.847zm1.864 0v-3.363h.847v.253c.227-.22.514-.387.928-.387.427 0 .8.187 1.021.548.24-.294.56-.548 1.127-.548.694 0 1.241.481 1.241 1.428v2.069h-.854v-2.035c0-.407-.22-.661-.6-.661-.367 0-.567.254-.701.481.007.046.007.093.007.146v2.069h-.854v-2.035c0-.407-.221-.661-.601-.661-.387 0-.587.287-.714.501v2.195h-.847zm6.132 1.641v-5.004h.847v.273c.26-.26.587-.407 1.048-.407 1.067 0 1.708.834 1.708 1.815s-.641 1.815-1.708 1.815c-.461 0-.788-.146-1.048-.407v1.915h-.847zm1.775-4.337c-.394 0-.714.174-.928.487v1.055c.227.32.541.487.928.487.574 0 .947-.427.947-1.015 0-.587-.373-1.014-.947-1.014zm3.473 2.796c-.674 0-1.134-.387-1.134-1.008 0-.507.393-.887 1.114-1.007l1.028-.174v-.086c0-.354-.267-.581-.654-.581a.915.915 0 00-.761.4l-.621-.473c.301-.414.795-.668 1.408-.668.975 0 1.475.581 1.475 1.322v2.175h-.847v-.327c-.214.26-.614.427-1.008.427zm-.293-1.048c0 .227.18.374.467.374.387 0 .667-.18.834-.447v-.474l-.801.134c-.354.06-.5.207-.5.413zm4.733.281a.9.9 0 00.761-.387l.661.507c-.314.413-.808.68-1.422.68-1.161 0-1.855-.834-1.855-1.815s.694-1.815 1.855-1.815c.614 0 1.108.267 1.422.681l-.661.507a.907.907 0 00-.774-.387c-.554 0-.961.427-.961 1.014 0 .594.407 1.015.974 1.015zm2.301-.561v-1.374h-.628v-.761h.628v-.841h.854v.841h1.027v.761h-1.027v1.374c0 .374.2.521.533.521.234 0 .388-.027.501-.074v.741c-.167.073-.367.107-.647.107-.841 0-1.241-.474-1.241-1.295z"
+ >
-
+ d="M352.003 104.439c.637-.548 1.602.04 1.409.857l-.255 1.082a.866.866 0 00.393.94l.95.577c.718.437.458 1.537-.38 1.606l-1.107.091a.866.866 0 00-.773.665l-.256 1.081c-.193.818-1.319.91-1.644.135l-.428-1.025a.868.868 0 00-.872-.529l-1.107.091c-.837.069-1.274-.974-.637-1.522l.843-.725a.866.866 0 00.234-.992l-.429-1.025c-.324-.775.533-1.512 1.251-1.076l.949.578a.867.867 0 001.016-.084l.843-.725z"
+ >
+
-
+
+ d="M0 0H74.355V35.748H0z"
+ transform="translate(162.981 233.031)"
+ >
+ strokeWidth="0.111"
+ rx="1.054"
+ >
+ rx="1.641"
+ >
+ rx="1.641"
+ >
+ rx="1.641"
+ >
+ rx="1.641"
+ >
-
+
+ d="M0 0H74.832V35.748H0z"
+ transform="translate(244.009 141.994)"
+ >
+ strokeWidth="0.111"
+ rx="1.054"
+ >
+ rx="1.566"
+ >
+ rx="1.907"
+ >
+ rx="1.641"
+ >
-
+
+ d="M0 0H74.832V35.748H0z"
+ transform="translate(160.598 141.994)"
+ >
+ strokeWidth="0.111"
+ rx="1.054"
+ >
+ rx="1.566"
+ >
+ rx="1.907"
+ >
+ rx="1.641"
+ >
-
+
+ d="M0 0H74.832V35.271H0z"
+ transform="translate(244.009 187.751)"
+ >
+ strokeWidth="0.111"
+ rx="1.054"
+ >
+ rx="1.545"
+ >
+ rx="1.62"
+ >
+ rx="1.62"
+ >
-
+
+ d="M0 0H74.832V35.271H0z"
+ transform="translate(160.598 187.751)"
+ >
+ strokeWidth="0.111"
+ rx="1.054"
+ >
+ rx="1.545"
+ >
+ rx="1.62"
+ >
+ rx="1.62"
+ >
-
+
+ d="M0 0H74.832V35.748H0z"
+ transform="translate(244.009 233.031)"
+ >
+ strokeWidth="0.111"
+ rx="1.054"
+ >
+ rx="1.641"
+ >
+ rx="1.641"
+ >
+ rx="1.641"
+ >
+ rx="1.641"
+ >
+ rx="2.35"
+ >
+ strokeWidth="0.477"
+ >
+ strokeWidth="0.477"
+ >
+ strokeWidth="0.477"
+ >
-
+
+ rx="4.766"
+ >
-
+
+ d="M95.533 245.19H195.626V245.667H95.533z"
+ opacity="0.06"
+ >
+ rx="4.766"
+ >
+ fill="#000"
+ d="M103.798 272.535c.538 0 .991-.238 1.272-.61v-.958h-1.11v-.148h1.272v1.177c-.31.42-.815.692-1.434.692-1.059 0-1.778-.811-1.778-1.764s.7-1.764 1.73-1.764c.591 0 1.082.282 1.387.696l-.138.105a1.504 1.504 0 00-1.249-.648c-.911 0-1.559.734-1.559 1.611s.668 1.611 1.607 1.611zm2.027-3.279h.176l.844 3.184 1.039-3.184h.238l1.039 3.184.849-3.184h.171l-.9 3.336h-.239l-1.039-3.155-1.039 3.155h-.238l-.901-3.336zm5.134 3.336v-3.336h.162v1.563h2.454v-1.563h.162v3.336h-.162v-1.625h-2.454v1.625h-.162z"
+ >
+ d="M105.893 264.518c0 .991-.809 1.647-1.899 1.647-.961 0-1.586-.404-2.013-1.136l.732-.45c.312.587.709.839 1.273.839.603 0 1.053-.351 1.053-.938 0-.557-.412-.923-1.053-.923h-.892v-.747h.801c.541 0 .9-.313.9-.786 0-.48-.359-.755-.847-.755-.465 0-.793.237-1.037.664l-.686-.42c.389-.625.961-.991 1.777-.991.953 0 1.654.557 1.654 1.418 0 .504-.228.938-.663 1.198.58.267.9.778.9 1.38zm1.749 1.495h-.961l2.761-4.584h-2.876v-.755h3.768v.755l-2.692 4.584z"
+ >
+ strokeWidth="0.477"
+ d="M151.299 271.167s11.372-12.365 19.065-9.294c3.792 1.513 3.589 6.548 7.627 7.149 5.118.762 10.486-8.103 10.486-8.103"
+ >
+ rx="4.766"
+ >
+ fill="#000"
+ d="M103.283 303.521c.372 0 .677-.176.867-.448l.129.1c-.219.3-.567.496-1.001.496-.758 0-1.282-.596-1.282-1.297 0-.7.524-1.296 1.282-1.296.429 0 .782.2 1.001.496l-.129.1c-.19-.272-.5-.448-.867-.448-.658 0-1.125.524-1.125 1.148 0 .625.467 1.149 1.125 1.149zm2.629-2.445c.768 0 1.283.62 1.283 1.296 0 .677-.515 1.297-1.283 1.297-.762 0-1.277-.62-1.277-1.297 0-.676.515-1.296 1.277-1.296zm.005 2.445c.639 0 1.106-.553 1.106-1.149 0-.6-.467-1.148-1.106-1.148-.658 0-1.12.548-1.12 1.148 0 .601.462 1.149 1.12 1.149zm1.933.053v-.148l1.115-1.206c.548-.591.748-.787.748-1.235 0-.443-.333-.691-.762-.691-.396 0-.668.153-.882.515l-.143-.086c.252-.386.581-.581 1.025-.581.524 0 .934.348.934.853 0 .453-.286.777-.782 1.311l-1.039 1.12h1.921v.148h-2.135z"
+ >
+ d="M103.46 296.986v-4.484l-1.273.709-.428-.594 1.716-.969h.816v5.338h-.831zm2.59.1a.565.565 0 01-.572-.565.57.57 0 011.137 0 .564.564 0 01-.565.565zm3.276-5.583c.846 0 1.388.382 1.746.892l-.656.519c-.297-.419-.633-.648-1.098-.648-.877 0-1.335.694-1.38 1.899.358-.351.831-.542 1.395-.542 1.03 0 1.709.755 1.709 1.709 0 .983-.702 1.815-1.884 1.815-1.312 0-2.09-.946-2.09-2.761 0-1.701.687-2.883 2.258-2.883zm-.13 2.868c-.496 0-.938.206-1.235.625.122 1.007.571 1.388 1.182 1.388.648 0 1.037-.442 1.037-1.022 0-.564-.412-.991-.984-.991zm2.865.16l.153-2.875h3.05v.755h-2.25l-.076 1.372h.61c1.335 0 1.937.664 1.937 1.648 0 1.052-.816 1.716-1.899 1.716-.945 0-1.586-.397-2.013-1.137l.732-.45c.32.588.725.839 1.281.839.603 0 1.045-.351 1.045-.938 0-.564-.404-.93-1.121-.93h-1.449zm4.649 2.463v-5.338h1.106l1.479 2.501 1.495-2.501h1.106v5.338h-.877v-4.133l-1.396 2.303h-.64l-1.403-2.319v4.149h-.87z"
+ >
-
-
-
+ strokeWidth="0.477"
+ d="M149.869 300.53s6.726-10.88 13.108-10.01c6.236.851 3.725 12.981 10.009 12.631 5.464-.304 3.828-10.728 9.294-10.486 2.663.118 6.197 2.86 6.197 2.86"
+ >
+
+
+
-
+
+ rx="4.766"
+ >
+ d="M348.683 172.078v-4.2h1.386c.924 0 1.488.474 1.488 1.254 0 .774-.564 1.248-1.488 1.248h-.534v1.698h-.852zm1.422-3.492h-.57v1.086h.57c.36 0 .576-.21.576-.552 0-.318-.216-.534-.576-.534zm2.79 3.582c-.606 0-1.02-.348-1.02-.906 0-.456.354-.798 1.002-.906l.924-.156v-.078c0-.318-.24-.522-.588-.522a.82.82 0 00-.684.36l-.558-.426c.27-.372.714-.6 1.266-.6.876 0 1.326.522 1.326 1.188v1.956h-.762v-.294c-.192.234-.552.384-.906.384zm-.264-.942c0 .204.162.336.42.336.348 0 .6-.162.75-.402v-.426l-.72.12c-.318.054-.45.186-.45.372zm2.805.852v-3.024h.762v.24c.21-.204.492-.36.894-.36.654 0 1.176.45 1.176 1.344v1.8h-.768v-1.77c0-.402-.228-.654-.6-.654-.384 0-.588.258-.702.45v1.974h-.762zm4.081-3.552a.505.505 0 01-.498-.498c0-.27.228-.498.498-.498a.5.5 0 01.492.498.5.5 0 01-.492.498zm-.384 3.552v-3.024h.762v3.024h-.762zm4.46-.492c-.282.378-.75.612-1.32.612-1.074 0-1.68-.75-1.68-1.632 0-.894.564-1.632 1.554-1.632.84 0 1.392.57 1.392 1.362 0 .168-.024.324-.048.426h-2.118c.072.564.42.792.894.792.33 0 .618-.144.78-.36l.546.432zm-1.464-2.028c-.39 0-.648.216-.732.612h1.392a.626.626 0 00-.66-.612zm2.154 2.52v-3.024h.762v.3c.198-.204.456-.36.798-.36a.84.84 0 01.264.042v.75a1.313 1.313 0 00-.336-.042.825.825 0 00-.726.396v1.938h-.762zm3.839-1.512c0-.882.582-1.632 1.536-1.632.408 0 .702.126.936.36v-1.716h.768v4.5h-.768v-.24c-.234.234-.528.36-.936.36-.954 0-1.536-.75-1.536-1.632zm.798 0c0 .528.33.912.846.912a.989.989 0 00.828-.42v-.984a.989.989 0 00-.828-.42c-.516 0-.846.384-.846.912zm3.762-.96h-.708l.54-1.728h.864l-.696 1.728zm1.869 2.562c-.606 0-1.02-.348-1.02-.906 0-.456.354-.798 1.002-.906l.924-.156v-.078c0-.318-.24-.522-.588-.522a.82.82 0 00-.684.36l-.558-.426c.27-.372.714-.6 1.266-.6.876 0 1.326.522 1.326 1.188v1.956h-.762v-.294c-.192.234-.552.384-.906.384zm-.264-.942c0 .204.162.336.42.336.348 0 .6-.162.75-.402v-.426l-.72.12c-.318.054-.45.186-.45.372zm4.257.252c.3 0 .54-.138.684-.348l.594.456c-.282.372-.726.612-1.278.612-1.044 0-1.668-.75-1.668-1.632 0-.882.624-1.632 1.668-1.632.552 0 .996.24 1.278.612l-.594.456a.815.815 0 00-.696-.348c-.498 0-.864.384-.864.912 0 .534.366.912.876.912zm2.068-.504v-1.236h-.564v-.684h.564v-.756h.768v.756h.924v.684h-.924v1.236c0 .336.18.468.48.468.21 0 .348-.024.45-.066v.666c-.15.066-.33.096-.582.096-.756 0-1.116-.426-1.116-1.164zm2.758-2.448a.505.505 0 01-.498-.498c0-.27.228-.498.498-.498a.5.5 0 01.492.498.5.5 0 01-.492.498zm-.384 3.552v-3.024h.762v3.024h-.762zm3.116-3.144c.984 0 1.656.726 1.656 1.632 0 .906-.672 1.632-1.656 1.632-.984 0-1.656-.726-1.656-1.632 0-.906.672-1.632 1.656-1.632zm.012 2.544c.486 0 .852-.39.852-.912 0-.528-.366-.912-.852-.912-.504 0-.876.384-.876.912s.372.912.876.912zm2.339.6v-3.024h.762v.24c.21-.204.492-.36.894-.36.654 0 1.176.45 1.176 1.344v1.8h-.768v-1.77c0-.402-.228-.654-.6-.654-.384 0-.588.258-.702.45v1.974h-.762zm3.433-.438l.504-.456c.186.234.408.402.696.402.246 0 .372-.144.372-.324 0-.528-1.446-.33-1.446-1.392 0-.534.45-.936 1.08-.936.462 0 .882.222 1.098.516l-.504.444c-.156-.192-.354-.348-.588-.348-.24 0-.354.132-.354.288 0 .516 1.446.336 1.446 1.38-.012.636-.522.984-1.092.984-.54 0-.924-.216-1.212-.558zm5.458-3.066l-.72-.996h.828l.618.996h-.726zm.018 3.594c-.606 0-1.02-.348-1.02-.906 0-.456.354-.798 1.002-.906l.924-.156v-.078c0-.318-.24-.522-.588-.522a.82.82 0 00-.684.36l-.558-.426c.27-.372.714-.6 1.266-.6.876 0 1.326.522 1.326 1.188v1.956h-.762v-.294c-.192.234-.552.384-.906.384zm-.264-.942c0 .204.162.336.42.336.348 0 .6-.162.75-.402v-.426l-.72.12c-.318.054-.45.186-.45.372zm4.806-2.7a.505.505 0 01-.498-.498c0-.27.228-.498.498-.498a.5.5 0 01.492.498.5.5 0 01-.492.498zm-.384 3.552v-3.024h.762v3.024h-.762zm1.675 0v-3.024h.762v.228c.204-.198.462-.348.834-.348.384 0 .72.168.918.492.216-.264.504-.492 1.014-.492.624 0 1.116.432 1.116 1.284v1.86h-.768v-1.83c0-.366-.198-.594-.54-.594-.33 0-.51.228-.63.432a.929.929 0 01.006.132v1.86h-.768v-1.83c0-.366-.198-.594-.54-.594-.348 0-.528.258-.642.45v1.974h-.762zm5.514 1.476v-4.5h.762v.246c.234-.234.528-.366.942-.366.96 0 1.536.75 1.536 1.632 0 .882-.576 1.632-1.536 1.632-.414 0-.708-.132-.942-.366v1.722h-.762zm1.596-3.9a.971.971 0 00-.834.438v.948a.98.98 0 00.834.438c.516 0 .852-.384.852-.912s-.336-.912-.852-.912zm3.123 2.514c-.606 0-1.02-.348-1.02-.906 0-.456.354-.798 1.002-.906l.924-.156v-.078c0-.318-.24-.522-.588-.522a.82.82 0 00-.684.36l-.558-.426c.27-.372.714-.6 1.266-.6.876 0 1.326.522 1.326 1.188v1.956h-.762v-.294c-.192.234-.552.384-.906.384zm-.264-.942c0 .204.162.336.42.336.348 0 .6-.162.75-.402v-.426l-.72.12c-.318.054-.45.186-.45.372zm4.257.252c.3 0 .54-.138.684-.348l.594.456c-.282.372-.726.612-1.278.612-1.044 0-1.668-.75-1.668-1.632 0-.882.624-1.632 1.668-1.632.552 0 .996.24 1.278.612l-.594.456a.815.815 0 00-.696-.348c-.498 0-.864.384-.864.912 0 .534.366.912.876.912zm2.068-.504v-1.236h-.564v-.684h.564v-.756h.768v.756h.924v.684h-.924v1.236c0 .336.18.468.48.468.21 0 .348-.024.45-.066v.666c-.15.066-.33.096-.582.096-.756 0-1.116-.426-1.116-1.164z"
+ >
+ rx="1.43"
+ >
+ rx="1.43"
+ >
+ rx="1.43"
+ >
+ rx="1.43"
+ >
+ rx="1.43"
+ >
-
-
-
-
+ rx="1.43"
+ >
+ rx="5"
+ >
+ rx="5"
+ >
+ rx="5"
+ >
-
+
+ rx="5.884"
+ >
-
+
+ d="M114.429 179.795a.253.253 0 00-.077-.18.24.24 0 00-.084-.053.24.24 0 00-.099-.016 7.474 7.474 0 00-6.957 5.709 7.485 7.485 0 003.56 8.267.258.258 0 00.194.023.267.267 0 00.088-.047.264.264 0 00.063-.078l1.319-2.552a.25.25 0 00-.092-.328 4.113 4.113 0 01-1.861-4.49 4.108 4.108 0 011.345-2.173 4.108 4.108 0 012.369-.96.25.25 0 00.232-.249v-2.873z"
+ >
+ d="M111.273 193.5a.235.235 0 00-.027.097.24.24 0 00.012.099.26.26 0 00.05.087c.023.025.05.045.08.06a7.322 7.322 0 004.319.605.245.245 0 00.203-.198.28.28 0 000-.1l-.573-2.832a.25.25 0 00-.276-.199 4.03 4.03 0 01-2.162-.303.246.246 0 00-.318.115l-1.308 2.569z"
+ >
+ d="M116.004 194.064a.244.244 0 00.112.16c.029.018.06.03.094.035a.241.241 0 00.1-.004 7.503 7.503 0 004.41-3.065 7.396 7.396 0 001.205-5.205.237.237 0 00-.034-.093.226.226 0 00-.068-.073.235.235 0 00-.091-.041.259.259 0 00-.1-.002l-2.833.52a.253.253 0 00-.156.096.251.251 0 00-.047.176 4.068 4.068 0 01-.678 2.751 4.12 4.12 0 01-2.315 1.657.248.248 0 00-.178.289l.579 2.799z"
+ >
-
-
+ d="M121.584 185.669a.253.253 0 00.163-.109.235.235 0 00.036-.093.24.24 0 00-.002-.1 7.51 7.51 0 00-2.498-4.094 7.417 7.417 0 00-4.454-1.727.255.255 0 00-.239.151.256.256 0 00-.02.098v2.879a.25.25 0 00.232.249c.858.06 1.676.39 2.337.944a4.125 4.125 0 011.347 2.142.251.251 0 00.107.148.245.245 0 00.179.035l2.812-.523z"
+ >
+
+
-
+ d="M346 261.384a3.84 3.84 0 013.839-3.839h76.356a3.838 3.838 0 013.838 3.839v5.375a3.838 3.838 0 01-3.838 3.839h-76.356a3.84 3.84 0 01-3.839-3.839v-5.375z"
+ >
+
+
+
+ fill="#fff"
+ d="M363.267 265.551c.369 0 .659-.18.843-.442l.516.396c-.294.401-.774.659-1.359.659-1.018 0-1.713-.783-1.713-1.705 0-.921.695-1.704 1.713-1.704.585 0 1.065.262 1.359.654l-.516.401a1.007 1.007 0 00-.843-.443c-.608 0-1.041.475-1.041 1.092 0 .618.433 1.092 1.041 1.092zm1.849.521v-2.322h.585v.23a.836.836 0 01.612-.276c.079 0 .148.014.203.032v.576a.986.986 0 00-.258-.032.632.632 0 00-.557.304v1.488h-.585zm3.122-2.691h-.562l.479-.764h.636l-.553.764zm.788 2.313c-.217.29-.576.47-1.014.47-.824 0-1.29-.576-1.29-1.253 0-.687.433-1.253 1.194-1.253.644 0 1.068.437 1.068 1.045 0 .129-.018.249-.037.327h-1.626c.056.434.323.609.687.609a.747.747 0 00.599-.277l.419.332zm-1.124-1.557c-.3 0-.498.166-.562.47h1.068a.48.48 0 00-.506-.47zm3.773 1.557c-.216.29-.575.47-1.013.47-.825 0-1.29-.576-1.29-1.253 0-.687.433-1.253 1.193-1.253.645 0 1.069.437 1.069 1.045 0 .129-.018.249-.037.327h-1.626c.055.434.322.609.686.609a.744.744 0 00.599-.277l.419.332zm-1.124-1.557c-.299 0-.497.166-.562.47h1.069a.48.48 0 00-.507-.47zm1.655 1.935v-2.322h.585v.23a.836.836 0 01.612-.276c.079 0 .148.014.203.032v.576a.986.986 0 00-.258-.032.632.632 0 00-.557.304v1.488h-.585zm3.113 0v-2.322h.585v.175a.876.876 0 01.64-.267c.295 0 .553.129.705.377.166-.202.387-.377.779-.377.479 0 .856.331.856.986v1.428h-.589v-1.405c0-.281-.152-.456-.415-.456-.253 0-.391.175-.484.331.005.032.005.065.005.102v1.428h-.59v-1.405c0-.281-.152-.456-.414-.456-.267 0-.406.198-.493.345v1.516h-.585zm5.339-2.414c.755 0 1.271.557 1.271 1.253 0 .695-.516 1.253-1.271 1.253-.756 0-1.272-.558-1.272-1.253 0-.696.516-1.253 1.272-1.253zm.009 1.953c.373 0 .654-.299.654-.7 0-.406-.281-.7-.654-.7-.387 0-.673.294-.673.7 0 .405.286.7.673.7zm1.796.461v-2.322h.585v.184a.941.941 0 01.686-.276c.502 0 .903.345.903 1.032v1.382h-.59v-1.359c0-.309-.175-.502-.46-.502-.295 0-.452.198-.539.345v1.516h-.585zm4.08 1.133v-3.455h.585v.189c.18-.18.406-.281.723-.281.737 0 1.18.576 1.18 1.253 0 .677-.443 1.253-1.18 1.253-.317 0-.543-.102-.723-.281v1.322h-.585zm1.225-2.994a.745.745 0 00-.64.336v.728a.752.752 0 00.64.336c.397 0 .655-.295.655-.7 0-.406-.258-.7-.655-.7zm1.798 1.861v-3.455h.585v3.455h-.585zm1.941.069c-.465 0-.783-.267-.783-.696 0-.35.272-.613.769-.696l.71-.119v-.06c0-.244-.185-.401-.452-.401a.63.63 0 00-.525.276l-.428-.327c.207-.285.548-.46.972-.46.672 0 1.018.4 1.018.912v1.502h-.585v-.226c-.148.18-.424.295-.696.295zm-.203-.724c0 .157.125.258.323.258.267 0 .46-.124.576-.308v-.327l-.553.092c-.244.041-.346.143-.346.285zm2.154.655v-2.322h.585v.184a.94.94 0 01.686-.276c.502 0 .903.345.903 1.032v1.382h-.59v-1.359c0-.309-.175-.502-.46-.502-.295 0-.452.198-.539.345v1.516h-.585zm3.914-1.161c0-.677.447-1.253 1.179-1.253.314 0 .539.096.719.276v-1.317h.59v3.455h-.59v-.185c-.18.18-.405.277-.719.277-.732 0-1.179-.576-1.179-1.253zm.613 0c0 .405.253.7.649.7a.76.76 0 00.636-.323v-.755a.76.76 0 00-.636-.322c-.396 0-.649.294-.649.7zm2.888-.737h-.543l.415-1.327h.663l-.535 1.327zm1.435 1.967c-.465 0-.783-.267-.783-.696 0-.35.272-.613.77-.696l.709-.119v-.06c0-.244-.184-.401-.451-.401a.633.633 0 00-.526.276l-.428-.327c.207-.285.548-.46.972-.46.673 0 1.018.4 1.018.912v1.502h-.585v-.226c-.147.18-.424.295-.696.295zm-.202-.724c0 .157.124.258.322.258a.65.65 0 00.576-.308v-.327l-.553.092c-.244.041-.345.143-.345.285zm3.268.194c.23 0 .414-.106.525-.267l.456.35a1.2 1.2 0 01-.981.47c-.802 0-1.281-.576-1.281-1.253 0-.677.479-1.253 1.281-1.253.424 0 .765.184.981.47l-.456.35a.624.624 0 00-.534-.267c-.383 0-.664.294-.664.7 0 .41.281.7.673.7zm1.892-1.437h-.543l.414-1.327h.664l-.535 1.327zm1.435 1.967c-.465 0-.783-.267-.783-.696 0-.35.272-.613.769-.696l.71-.119v-.06c0-.244-.185-.401-.452-.401a.63.63 0 00-.525.276l-.428-.327c.207-.285.548-.46.972-.46.672 0 1.018.4 1.018.912v1.502h-.585v-.226c-.148.18-.424.295-.696.295zm-.203-.724c0 .157.125.258.323.258a.65.65 0 00.576-.308v-.327l-.553.092c-.244.041-.346.143-.346.285zm3.269.194c.23 0 .414-.106.525-.267l.456.35c-.217.285-.558.47-.981.47-.802 0-1.281-.576-1.281-1.253 0-.677.479-1.253 1.281-1.253a1.2 1.2 0 01.981.47l-.456.35a.625.625 0 00-.535-.267c-.382 0-.663.294-.663.7 0 .41.281.7.673.7zm1.587-.387v-.949h-.433v-.525h.433v-.581h.59v.581h.709v.525h-.709v.949c0 .258.138.359.369.359a.912.912 0 00.345-.05v.511a1.08 1.08 0 01-.447.074c-.58 0-.857-.327-.857-.894zm2.118-1.88a.387.387 0 01-.382-.382c0-.207.175-.382.382-.382.208 0 .378.175.378.382 0 .207-.17.382-.378.382zm-.295 2.728v-2.322h.585v2.322h-.585zm2.393-2.414c.755 0 1.271.557 1.271 1.253 0 .695-.516 1.253-1.271 1.253-.756 0-1.272-.558-1.272-1.253 0-.696.516-1.253 1.272-1.253zm.009 1.953c.373 0 .654-.299.654-.7 0-.406-.281-.7-.654-.7-.387 0-.673.294-.673.7 0 .405.286.7.673.7zm1.796.461v-2.322h.585v.184a.941.941 0 01.686-.276c.502 0 .903.345.903 1.032v1.382h-.59v-1.359c0-.309-.175-.502-.46-.502-.295 0-.452.198-.539.345v1.516h-.585z"
+ >
-
+
-
-
-
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+ result="effect1_dropShadow_2639_10667"
+ >
+ >
-
+
+ >
+ result="effect1_foregroundBlur_2639_10667"
+ stdDeviation="30.259"
+ >
-
+
-
-
-
-
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+
+ result="effect1_dropShadow_2639_10667"
+ >
+ >
-
+
-
-
-
-
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+
+ result="effect1_dropShadow_2639_10667"
+ >
+ >
-
+
-
-
-
-
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+
+ result="effect1_dropShadow_2639_10667"
+ >
+ >
-
+
-
-
-
-
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+
+ result="effect1_dropShadow_2639_10667"
+ >
+ >
-
+
-
-
-
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+ result="effect1_dropShadow_2639_10667"
+ >
+ >
-
+
-
-
-
-
+ values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
+ >
+
+
+
+
+ result="effect1_dropShadow_2639_10667"
+ >
+ >
-
+
+ x="141.533"
+ y="69.546"
+ fill="#fff"
+ rx="7.626"
+ >
-
+
+ x="151.065"
+ y="129.125"
+ fill="#fff"
+ rx="4.766"
+ >
+
+
+
-
+
+ fill="#fff"
+ d="M0 0H5.758V5.758H0z"
+ transform="translate(353.678 261.192)"
+ >
From c21aa9462bcc8509033c4583b2684f9235f30bac Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 17 Sep 2024 18:03:41 +0200
Subject: [PATCH 02/91] =?UTF-8?q?Ajoute=20le=20composant=20de=20recherche/?=
=?UTF-8?q?s=C3=A9lection=20d'une=20collectivit=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/Landing/SelectCollectivite.tsx | 42 +++++++++++++++++++
.../Landing/useFilteredCollectivites.ts | 31 ++++++++++++++
2 files changed, 73 insertions(+)
create mode 100644 packages/panier/components/Landing/SelectCollectivite.tsx
create mode 100644 packages/panier/components/Landing/useFilteredCollectivites.ts
diff --git a/packages/panier/components/Landing/SelectCollectivite.tsx b/packages/panier/components/Landing/SelectCollectivite.tsx
new file mode 100644
index 0000000000..8b820441a9
--- /dev/null
+++ b/packages/panier/components/Landing/SelectCollectivite.tsx
@@ -0,0 +1,42 @@
+'use client';
+
+import {useState} from 'react';
+import {Select} from '@tet/ui';
+import {useFilteredCollectivites} from '@components/Landing/useFilteredCollectivites';
+
+/**
+ * Permet de rechercher et sélectionner une collectivité
+ */
+const SelectCollectivite = ({
+ collectiviteId,
+ onSelectCollectivite,
+}: {
+ collectiviteId: number | null;
+ onSelectCollectivite: (id: number | null) => void;
+}) => {
+ const [search, setSearch] = useState('');
+ const {data: collectivites, isLoading} = useFilteredCollectivites(search);
+
+ return (
+ ({
+ value: c.collectivite_id!,
+ label: `${c.nom!} (${c.departement_code})`,
+ })) || []
+ }
+ values={collectiviteId ? collectiviteId : undefined}
+ isSearcheable
+ onSearch={setSearch}
+ isLoading={isLoading}
+ onChange={value => {
+ const id = collectiviteId === value ? null : (value as number);
+ onSelectCollectivite(id);
+ }}
+ />
+ );
+};
+
+export default SelectCollectivite;
diff --git a/packages/panier/components/Landing/useFilteredCollectivites.ts b/packages/panier/components/Landing/useFilteredCollectivites.ts
new file mode 100644
index 0000000000..831f6f7d33
--- /dev/null
+++ b/packages/panier/components/Landing/useFilteredCollectivites.ts
@@ -0,0 +1,31 @@
+import {makeSearchString} from '@tet/api';
+import {supabase} from 'src/clientAPI';
+import useSWR from 'swr';
+
+/** Donne la liste des collectivités dont le nom inclus la chaîne recherchée */
+export const useFilteredCollectivites = (search: string, limit = 10) => {
+ const key = `site_labellisation-filtered-${search}`;
+ return useSWR(key, async () => {
+ const query = supabase
+ .from('site_labellisation')
+ .select('collectivite_id, nom, departement_code, engagee')
+ .order('nom')
+ .limit(limit);
+
+ const processedSearch = makeSearchString(search, 'nom');
+ if (processedSearch) {
+ query.or(processedSearch);
+ }
+
+ const {error, data} = await query;
+
+ if (error) {
+ throw new Error(key);
+ }
+ if (!data || !data.length) {
+ return null;
+ }
+
+ return data || [];
+ });
+};
From f22e09a10d43fa2b6f6f51e49b9561fd6543776f Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 17 Sep 2024 18:05:45 +0200
Subject: [PATCH 03/91] =?UTF-8?q?Extrait=20et=20met=20=C3=A0=20jour=20le?=
=?UTF-8?q?=20contenu=20de=20la=20section=20"comment=20=C3=A7a=20marche"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/Landing/CommentCaMarche.tsx | 37 +++++++++++++++++++
packages/panier/components/Landing/index.tsx | 17 +--------
2 files changed, 39 insertions(+), 15 deletions(-)
create mode 100644 packages/panier/components/Landing/CommentCaMarche.tsx
diff --git a/packages/panier/components/Landing/CommentCaMarche.tsx b/packages/panier/components/Landing/CommentCaMarche.tsx
new file mode 100644
index 0000000000..17ab6ee466
--- /dev/null
+++ b/packages/panier/components/Landing/CommentCaMarche.tsx
@@ -0,0 +1,37 @@
+export const CommentCaMarche = () => (
+ <>
+ Comment ça marche ?
+
+ Explorez les actions disponibles
+
+ Parcourez la liste d'actions pour découvrir celles qui
+ correspondent le mieux aux besoins de votre territoire.
+
+ Accédez aux détails de chaque action
+
+ Cliquez sur une action pour obtenir toutes les informations nécessaires
+ à sa mise en œuvre : étapes, coût, temps, financement, et autres
+ ressources utiles.
+
+ Sélectionnez les actions pertinentes
+
+ Ajoutez les actions les plus adaptées à votre panier, triez celles déjà
+ faites ou en cours et retrouvez les toutes au sein de votre plan
+ d'action.
+
+ Validez votre panier et créez votre plan d'action
+
+ Confirmez votre sélection, créez un compte, et accédez à votre plan
+ d'action pilotable directement sur la plateforme Territoires en
+ Transitions.
+
+ Pilotez et suivez votre plan
+
+ Utilisez la plateforme comme espace de travail collaboratif pour gérer
+ votre plan d'action en y ajoutant des indicateurs de suivi. Suivez
+ la progression de vos actions grâce au tableau de bord et invitez vos
+ collègues pour travailler sur une plateforme unique.
+
+
+ >
+);
diff --git a/packages/panier/components/Landing/index.tsx b/packages/panier/components/Landing/index.tsx
index 3b80ea728b..8cfdc1fcd6 100644
--- a/packages/panier/components/Landing/index.tsx
+++ b/packages/panier/components/Landing/index.tsx
@@ -3,6 +3,7 @@ import DashboardPicto from '@tet/panier/components/Picto/DashboardPicto';
import Section from '@tet/panier/components/Section';
import CestParti from './CestParti';
import ReprendrePanier from './ReprendrePanier';
+import {CommentCaMarche} from './CommentCaMarche';
const Landing = () => {
return (
@@ -45,21 +46,7 @@ const Landing = () => {
-
Comment ça marche ?
-
-
- Ajoutez à votre panier les actions impactantes et pertinentes pour
- votre collectivité.
-
-
- Retrouvez vos fiches actions directement sur votre compte
- Territoires en Transitions.
-
-
- A vous de jouer ! Vous pouvez modifiez les actions à volonté et
- vous en servir comme base de travail et outil de dialogue.
-
-
+
>
From bab368848217fe377bf59076f5a7df8f7a38d52c Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 17 Sep 2024 18:08:07 +0200
Subject: [PATCH 04/91] =?UTF-8?q?Ajoute=20la=20section=20"Vous=20=C3=AAtes?=
=?UTF-8?q?=20une=20collectivit=C3=A9=20d=C3=A9j=C3=A0=20engag=C3=A9e..."?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/panier/components/Landing/index.tsx | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/packages/panier/components/Landing/index.tsx b/packages/panier/components/Landing/index.tsx
index 8cfdc1fcd6..f0e2a924b7 100644
--- a/packages/panier/components/Landing/index.tsx
+++ b/packages/panier/components/Landing/index.tsx
@@ -49,6 +49,21 @@ const Landing = () => {
+
+
+
+ Vous êtes une collectivité déjà engagée dans le programme Territoires
+ Engagés Transition Écologique ?
+
+
+ Le panier d'actions basé principalement sur les actions des
+ référentiels est conçu en priorité pour faciliter le passage à
+ l'action aux collectivités qui ne sont pas encore engagées !{' '}
+
+
>
);
};
From ecc0b78d8e4c2404ff889096bc5d8e182edc91e9 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 17 Sep 2024 18:08:58 +0200
Subject: [PATCH 05/91] =?UTF-8?q?Ajoute=20le=20s=C3=A9lecteur=20de=20colle?=
=?UTF-8?q?ctivit=C3=A9=20sur=20la=20landing=20page=20g=C3=A9n=C3=A9rique?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../api/src/panier_action_impact/panierAPI.ts | 6 +-
.../panier/components/Landing/CestParti.tsx | 59 +++++++++++++++----
packages/panier/components/Landing/index.tsx | 25 +++-----
.../components/Landing/useCollectiviteInfo.ts | 25 ++++++++
4 files changed, 83 insertions(+), 32 deletions(-)
create mode 100644 packages/panier/components/Landing/useCollectiviteInfo.ts
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index 2895617e7d..80651d2c43 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -34,9 +34,9 @@ export class PanierAPI {
this.supabase = supabase;
}
- async panierFromLanding(collectivite_id?: number): Promise {
- const { data, error } =
- collectivite_id === undefined
+ async panierFromLanding(collectivite_id: number | null): Promise {
+ const {data, error} =
+ collectivite_id === null
? await this.supabase.rpc('panier_from_landing')
: await this.supabase.rpc('panier_from_landing', { collectivite_id });
diff --git a/packages/panier/components/Landing/CestParti.tsx b/packages/panier/components/Landing/CestParti.tsx
index 6fd1deb655..92c129ec43 100644
--- a/packages/panier/components/Landing/CestParti.tsx
+++ b/packages/panier/components/Landing/CestParti.tsx
@@ -1,9 +1,11 @@
'use client';
-
-import { panierAPI } from '@tet/panier/src/clientAPI';
-import { Button, useEventTracker } from '@tet/ui';
-import { useParams, usePathname, useRouter } from 'next/navigation';
+import {useState} from 'react';
+import {panierAPI} from '@tet/panier/src/clientAPI';
+import {useParams, usePathname, useRouter} from 'next/navigation';
+import {useEventTracker, Button, Icon} from '@tet/ui';
+import SelectCollectivite from './SelectCollectivite';
+import {useCollectiviteInfo} from './useCollectiviteInfo';
const CestParti = () => {
const params = useParams();
@@ -11,25 +13,56 @@ const CestParti = () => {
const router = useRouter();
const pathnameArray = pathname.split('/');
const id = params['id'];
- const collectivite_id =
- pathnameArray[2] === 'collectivite' && id
- ? parseInt(id as string)
- : undefined;
+ const collectiviteIdFromUrl = pathnameArray[2] === 'collectivite' && id;
+ const [collectiviteId, setCollectiviteId] = useState(
+ collectiviteIdFromUrl ? parseInt(id as string) : null,
+ );
+ const {data: collectiviteInfo} = useCollectiviteInfo(collectiviteId);
const tracker = useEventTracker(
- collectivite_id ? 'panier/landing/collectivite' : 'panier/landing',
+ collectiviteId ? 'panier/landing/collectivite' : 'panier/landing',
);
const onClick = async () => {
- const base = await panierAPI.panierFromLanding(collectivite_id);
- collectivite_id
- ? tracker('cta_panier_click', {collectivite_preset: collectivite_id})
+ const base = await panierAPI.panierFromLanding(collectiviteId);
+ collectiviteId
+ ? tracker('cta_panier_click', {collectivite_preset: collectiviteId})
: // @ts-expect-error
tracker('cta_panier_click');
router.push(`/panier/${base.id}`);
};
- return C'est parti ! ;
+ return (
+
+ {!collectiviteIdFromUrl && (
+
+
+ {collectiviteInfo?.engagee && (
+
+
+
+
+ Vous êtes membre d'une collectivité déjà engagée dans le
+ programme Territoire Engagé Transition Écologique ?
+
+
+ Le panier d'actions basé principalement sur les actions des
+ référentiels est conçu en priorité pour faciliter le passage à
+ l'action aux collectivités qui ne sont pas encore engagées
+ !
+
+
+ )}
+
+ )}
+
+ C'est parti !
+
+
+ );
};
export default CestParti;
diff --git a/packages/panier/components/Landing/index.tsx b/packages/panier/components/Landing/index.tsx
index f0e2a924b7..1c162204c7 100644
--- a/packages/panier/components/Landing/index.tsx
+++ b/packages/panier/components/Landing/index.tsx
@@ -1,5 +1,6 @@
import BigBasketPicto from '@tet/panier/components/Picto/BigBasketPicto';
import DashboardPicto from '@tet/panier/components/Picto/DashboardPicto';
+import CollectiviteEngageePicto from '@tet/panier/components/Picto/CollectiviteEngageePicto';
import Section from '@tet/panier/components/Section';
import CestParti from './CestParti';
import ReprendrePanier from './ReprendrePanier';
@@ -14,23 +15,14 @@ const Landing = () => {
>
- Identifiez des actions à impact pour votre collectivité
- en quelques clics.
+ Faites vivre la transition écologique sur votre territoire.{' '}
+ la transition écologique
-
-
- Vous avez besoin d'aide pour identifier des actions concrètes
- adaptées à votre territoire ?
-
-
- Vous souhaitez accélérer votre démarche de transition écologique
- pour votre commune ou votre intercommunalité ?
-
-
- Vous cherchez à prioriser quelques actions clés à valider avec vos
- élus ?
-
-
+
+ Avec le panier d’action à impact, constituez une base d’actions
+ adaptés aux compétences de votre collectivité et retrouvez là au
+ sein d’un plan d’action pilotable.
+
@@ -49,6 +41,7 @@ const Landing = () => {
+
{
+ const key = `collectivite-info-${collectiviteId}`;
+ return useSWR(key, async () => {
+ if (!collectiviteId) return null;
+
+ const {error, data} = await supabase
+ .from('site_labellisation')
+ .select('collectivite_id, nom, engagee')
+ .eq('collectivite_id', collectiviteId);
+
+ if (error) {
+ throw new Error(key);
+ }
+ if (!data || !data.length) {
+ return null;
+ }
+
+ return data[0];
+ });
+};
From 626878a1762d8a1279bd2ec1c6af27607757363f Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 17 Sep 2024 18:15:30 +0200
Subject: [PATCH 06/91] =?UTF-8?q?D=C3=A9sactive=20le=20bouton=20"C'est=20p?=
=?UTF-8?q?arti"=20si=20il=20n'y=20a=20pas=20de=20collectivit=C3=A9=20de?=
=?UTF-8?q?=20s=C3=A9lectionn=C3=A9e?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/panier/components/Landing/CestParti.tsx | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/packages/panier/components/Landing/CestParti.tsx b/packages/panier/components/Landing/CestParti.tsx
index 92c129ec43..ba9adee0c7 100644
--- a/packages/panier/components/Landing/CestParti.tsx
+++ b/packages/panier/components/Landing/CestParti.tsx
@@ -58,7 +58,11 @@ const CestParti = () => {
)}
)}
-
+
C'est parti !
From 05ff64ad51bc93db1bca6b091ac923c2f23802b9 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 18 Sep 2024 11:14:35 +0200
Subject: [PATCH 07/91] =?UTF-8?q?Ajoute=20l'encadr=C3=A9=20invitant=20au?=
=?UTF-8?q?=20partage=20du=20lien=20vers=20le=20panier?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../PanierRealtime/PartagerLeLien.tsx | 72 +++++++++++++++++++
.../components/PanierRealtime/index.tsx | 3 +
packages/panier/components/Picto/Membres.tsx | 41 +++++++++++
3 files changed, 116 insertions(+)
create mode 100644 packages/panier/components/PanierRealtime/PartagerLeLien.tsx
create mode 100644 packages/panier/components/Picto/Membres.tsx
diff --git a/packages/panier/components/PanierRealtime/PartagerLeLien.tsx b/packages/panier/components/PanierRealtime/PartagerLeLien.tsx
new file mode 100644
index 0000000000..f7e7e97242
--- /dev/null
+++ b/packages/panier/components/PanierRealtime/PartagerLeLien.tsx
@@ -0,0 +1,72 @@
+'use client';
+import {useEffect, useState} from 'react';
+import {Card, Button, Icon, useCopyToClipboard} from '@tet/ui';
+import Membres from '@components/Picto/Membres';
+
+/**
+ * Affiche l'encadré invitant au partage du lien vers le panier
+ */
+export const PartagerLeLien = () => {
+ const [opened, setOpened] = useState(true);
+ const [copied, setCopied] = useState(false);
+ const [timeoutId, setTimeoutId] = useState(null);
+
+ const {copy} = useCopyToClipboard();
+
+ // TODO: remplacer ça par le composant Toast de l'app et du site
+ // (à mutualiser dans le package ui)
+ useEffect(() => {
+ if (copied) {
+ if (timeoutId) {
+ window.clearTimeout(timeoutId);
+ }
+ const id = window.setTimeout(() => setCopied(false), 2000);
+ setTimeoutId(id);
+ }
+ return () => {
+ if (timeoutId) {
+ window.clearTimeout(timeoutId);
+ setTimeoutId(null);
+ }
+ };
+ // eslint-disable-next-line
+ }, [copied]);
+
+ return opened ? (
+
+ setOpened(false)}
+ className="ml-auto cursor-pointer h-fit w-fit"
+ >
+
+
+
+ Inviter des membres de votre collectivité
+
+ Vous pouvez partager ce lien aux autres services de votre collectivité
+ afin de travailler de façon synchronisée ! La coopération entre les
+ services de la collectivité favorise la mise en place d’une politique
+ locale de transition écologique transversale et impactante.
+
+ {copied && (
+
+ Le lien a été copié dans le presse-papier
+
+ )}
+ {
+ copy(document.location.href);
+ setCopied(true);
+ }}
+ >
+ Copier le lien du panier
+
+
+ ) : (
+
+ setOpened(true)} />
+
+ );
+};
diff --git a/packages/panier/components/PanierRealtime/index.tsx b/packages/panier/components/PanierRealtime/index.tsx
index ab062732b2..a52a2f6d89 100644
--- a/packages/panier/components/PanierRealtime/index.tsx
+++ b/packages/panier/components/PanierRealtime/index.tsx
@@ -17,6 +17,7 @@ import {
usePanierContext,
useUserContext,
} from '@tet/panier/providers';
+import {PartagerLeLien} from './PartagerLeLien';
type PanierRealtimeProps = {
panier: Panier;
@@ -134,6 +135,8 @@ const PanierRealtime = ({
budgets={budgets}
onToggleSelected={handleToggleSelected}
/>
+
+
);
};
diff --git a/packages/panier/components/Picto/Membres.tsx b/packages/panier/components/Picto/Membres.tsx
new file mode 100644
index 0000000000..aec7206f46
--- /dev/null
+++ b/packages/panier/components/Picto/Membres.tsx
@@ -0,0 +1,41 @@
+import React from 'react';
+
+const Membres = ({className}: {className?: string}) => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+export default Membres;
From 45da3196ed96674c4f2056510ec071dfbc9b9872 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 18 Sep 2024 12:23:10 +0200
Subject: [PATCH 08/91] =?UTF-8?q?Ajoute=20un=20CTA=20"Voir=20le=20d=C3=A9t?=
=?UTF-8?q?ail=20de=20la=20fiche"=20dans=20la=20preview=20des=20fiches?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ActionImpact/CarteActionImpact.tsx | 16 +++++++++-------
.../panier/components/ActionImpact/index.tsx | 1 -
.../panier/components/PanierActions/index.tsx | 5 +++--
3 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/packages/panier/components/ActionImpact/CarteActionImpact.tsx b/packages/panier/components/ActionImpact/CarteActionImpact.tsx
index b9add07a9b..c6f796ebe9 100644
--- a/packages/panier/components/ActionImpact/CarteActionImpact.tsx
+++ b/packages/panier/components/ActionImpact/CarteActionImpact.tsx
@@ -1,6 +1,6 @@
import classNames from 'classnames';
import {CarteActionImpactProps} from './types';
-import {Badge, Button, Card} from '@tet/ui';
+import {Badge, Button, Card, Icon} from '@tet/ui';
import NiveauBudget from './NiveauBudget';
/**
@@ -21,9 +21,7 @@ export const CarteActionImpact = ({
return (
@@ -37,13 +35,13 @@ export const CarteActionImpact = ({
{/* Boutons d'action, visibles au hover de la carte */}
-
+
{panier ? (
handleToggleSelect(false)}>
Retirer du panier
) : (
- <>
+
handleToggleSelect(true)}>
Ajouter au panier
- >
+
)}
+
+
+ Voir le détail de la fiche
+
}
diff --git a/packages/panier/components/ActionImpact/index.tsx b/packages/panier/components/ActionImpact/index.tsx
index 4e744d718d..745d99d01f 100644
--- a/packages/panier/components/ActionImpact/index.tsx
+++ b/packages/panier/components/ActionImpact/index.tsx
@@ -17,7 +17,6 @@ export const ActionImpact = ({
useEffect(() => setIsActionSelected(panier), [panier]);
const handleToggleSelect = (value: boolean) => {
- setIsActionSelected(value);
onToggleSelected(value);
};
diff --git a/packages/panier/components/PanierActions/index.tsx b/packages/panier/components/PanierActions/index.tsx
index 2078408948..04f38694d3 100644
--- a/packages/panier/components/PanierActions/index.tsx
+++ b/packages/panier/components/PanierActions/index.tsx
@@ -1,5 +1,5 @@
/* eslint-disable react/no-unescaped-entities */
-import {CarteActionImpact} from '@tet/panier/components/ActionImpact/CarteActionImpact';
+import {ActionImpact} from '@tet/panier/components/ActionImpact';
import BasketPicto from '@tet/panier/components/Picto/BasketPicto';
import EmptyBasketPicto from '@tet/panier/components/Picto/EmptyBasketPicto';
import ValiderPanierButton from '@tet/panier/components/ValidationPanier/ValiderPanierButton';
@@ -51,8 +51,9 @@ const PanierActions = ({
{actionsListe.map(action => (
-
Date: Wed, 18 Sep 2024 18:27:59 +0200
Subject: [PATCH 09/91] =?UTF-8?q?Charge=20l'id=20de=20la=20fiche=20action?=
=?UTF-8?q?=20=C3=A0=20impact=20associ=C3=A9e=20=C3=A0=20une=20FA=20cr?=
=?UTF-8?q?=C3=A9=C3=A9e=20depuis=20le=20panier?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../PlansActions/FicheAction/data/types.ts | 2 +-
.../data/useFicheActionImpactId.ts | 19 +++++++++++++++++++
.../PlanAction/data/useAxeFiches.ts | 8 +++++++-
3 files changed, 27 insertions(+), 2 deletions(-)
create mode 100644 app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/data/useFicheActionImpactId.ts
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/data/types.ts b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/data/types.ts
index 867860faec..129955ecd9 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/data/types.ts
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/data/types.ts
@@ -57,4 +57,4 @@ export type Financeur = Omit<
// pilotes: Personne[] | null;
// };
-export type FicheResume = FicheResumeZod;
+export type FicheResume = FicheResumeZod & {actionImpactId?: number};
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/data/useFicheActionImpactId.ts b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/data/useFicheActionImpactId.ts
new file mode 100644
index 0000000000..9929b2e925
--- /dev/null
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/data/useFicheActionImpactId.ts
@@ -0,0 +1,19 @@
+import {supabaseClient} from 'core-logic/api/supabase';
+import {useQuery} from 'react-query';
+
+export const useFicheActionImpactId = (ficheId: number | null) =>
+ useQuery(['action_impact_fiche_action', ficheId], async () => {
+ if (!ficheId) return;
+ const {data, error} = await fetchActionImpactId([ficheId]);
+ if (error) {
+ throw new Error(error.message);
+ }
+
+ return data?.[0]?.action_impact_id;
+ });
+
+export const fetchActionImpactId = (ficheIds: (number | null)[]) =>
+ supabaseClient
+ .from('action_impact_fiche_action')
+ .select()
+ .in('fiche_id', ficheIds);
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/PlanAction/data/useAxeFiches.ts b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/PlanAction/data/useAxeFiches.ts
index 0485c9bbcd..7f19876f2a 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/PlanAction/data/useAxeFiches.ts
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/PlanAction/data/useAxeFiches.ts
@@ -2,6 +2,7 @@ import {supabaseClient} from 'core-logic/api/supabase';
import {useQuery} from 'react-query';
import {FicheResume} from '../../FicheAction/data/types';
import {sortFichesResume} from '../../FicheAction/data/utils';
+import {fetchActionImpactId} from '../../FicheAction/data/useFicheActionImpactId';
type Args = {
ficheIds: number[];
@@ -15,6 +16,11 @@ export const useAxeFiches = ({ficheIds, axeId}: Args) => {
.select()
.in('id', ficheIds);
- return sortFichesResume(data as FicheResume[]);
+ const {data: actionsImpact} = await fetchActionImpactId(ficheIds);
+
+ return sortFichesResume(data as FicheResume[]).map(fiche => {
+ const actionImpact = actionsImpact?.find(f => f.fiche_id === fiche.id);
+ return {...fiche, actionImpactId: actionImpact?.action_impact_id};
+ });
});
};
From 805c2d4dc7b20f09c8c5fdcc735f2fbe99c9b539 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 18 Sep 2024 18:29:01 +0200
Subject: [PATCH 10/91] =?UTF-8?q?Indique=20sur=20une=20fiche=20action=20si?=
=?UTF-8?q?=20elle=20est=20issue=20d'une=20action=20=C3=A0=20impact?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../FicheAction/Carte/FicheActionCard.tsx | 14 ++++++++-
.../PlansActions/FicheAction/FicheAction.tsx | 4 +++
.../FicheAction/FicheActionImpact.tsx | 31 +++++++++++++++++++
3 files changed, 48 insertions(+), 1 deletion(-)
create mode 100644 app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact.tsx
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/Carte/FicheActionCard.tsx b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/Carte/FicheActionCard.tsx
index 6ec556f4b9..318d6e6aed 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/Carte/FicheActionCard.tsx
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/Carte/FicheActionCard.tsx
@@ -124,7 +124,9 @@ const FicheActionCard = ({
external={openInNewTab}
header={
// Badges priorité et statut de la fiche
- (ficheAction.niveau_priorite || ficheAction.statut) && (
+ (ficheAction.niveau_priorite ||
+ ficheAction.statut ||
+ ficheAction.actionImpactId) && (
{ficheAction.niveau_priorite && (
)}
+ {ficheAction.actionImpactId && (
+
+
+
+ )}
)
}
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheAction.tsx b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheAction.tsx
index b3e71615d7..84332f7274 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheAction.tsx
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheAction.tsx
@@ -10,6 +10,7 @@ import FicheActionPlanning from './FicheActionPlanning/FicheActionPlanning';
import FicheActionActeurs from './FicheActionActeurs/FicheActionActeurs';
import FicheActionRestreint from './FicheActionRestreint/FicheActionRestreint';
import FicheActionOnglets from './FicheActionOnglets';
+import FicheActionImpact from './FicheActionImpact';
type FicheActionProps = {
isReadonly: boolean;
@@ -67,6 +68,9 @@ const FicheAction = ({isReadonly}: FicheActionProps) => {
}
/>
+ {/** Fiche action issue du panier d’action */}
+
+
{/* Date de dernière modification */}
{fiche.modified_at && (
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact.tsx b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact.tsx
new file mode 100644
index 0000000000..30356a8d80
--- /dev/null
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact.tsx
@@ -0,0 +1,31 @@
+import classNames from 'classnames';
+import {Icon, Notification} from '@tet/ui';
+import {FicheAction} from './data/types';
+import {useFicheActionImpactId} from './data/useFicheActionImpactId';
+
+type FicheActionImpactProps = {
+ fiche: FicheAction;
+};
+
+/** Indique sur une fiche action si elle est issue d'une action à impact */
+const FicheActionImpact = ({fiche}: FicheActionImpactProps) => {
+ const {data: actionImpactId} = useFicheActionImpactId(fiche.id);
+
+ return actionImpactId ? (
+
+
+ Fiche action issue du panier d’action
+
+
+ ) : null;
+};
+
+export default FicheActionImpact;
From 475d40c9f747c5d81f56ab8497001230b0d890ca Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 18 Sep 2024 18:31:16 +0200
Subject: [PATCH 11/91] =?UTF-8?q?D=C3=A9place=20une=20partie=20du=20code?=
=?UTF-8?q?=20du=20panier=20dans=20le=20package=20ui=20pour=20pouvoir=20le?=
=?UTF-8?q?=20r=C3=A9utiliser=20dans=20l'app?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ActionImpact/LienExterneModale.tsx | 24 --
.../ActionImpact/ModaleActionImpact.tsx | 195 ++--------------
.../InfoActionImpact/InfoActionImpact.tsx | 221 ++++++++++++++++++
.../src/components/InfoActionImpact/index.ts | 1 +
packages/ui/src/index.ts | 1 +
5 files changed, 242 insertions(+), 200 deletions(-)
delete mode 100644 packages/panier/components/ActionImpact/LienExterneModale.tsx
create mode 100644 packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx
create mode 100644 packages/ui/src/components/InfoActionImpact/index.ts
diff --git a/packages/panier/components/ActionImpact/LienExterneModale.tsx b/packages/panier/components/ActionImpact/LienExterneModale.tsx
deleted file mode 100644
index 0ad0e9d352..0000000000
--- a/packages/panier/components/ActionImpact/LienExterneModale.tsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import {Icon} from '@tet/ui';
-
-type LienExterneModaleProps = {
- url: string;
- label: string;
-};
-
-const LienExterneModale = ({url, label}: LienExterneModaleProps) => {
- return (
-
- );
-};
-
-export default LienExterneModale;
diff --git a/packages/panier/components/ActionImpact/ModaleActionImpact.tsx b/packages/panier/components/ActionImpact/ModaleActionImpact.tsx
index 2a3a3710c8..4cf3bcdab6 100644
--- a/packages/panier/components/ActionImpact/ModaleActionImpact.tsx
+++ b/packages/panier/components/ActionImpact/ModaleActionImpact.tsx
@@ -1,39 +1,28 @@
-/* eslint-disable react/no-unescaped-entities */
import classNames from 'classnames';
import {ModaleActionImpactProps} from './types';
import {
- Badge,
Button,
- Divider,
- InfoTooltip,
Modal,
ModalFooter,
ModalFooterSection,
+ InfoActionImpact,
} from '@tet/ui';
-import LienExterneModale from './LienExterneModale';
import Markdown from '@tet/panier/components/Markdown';
-const URL_AIDES_TERRITOIRES = 'https://aides-territoires.beta.gouv.fr';
-
/**
* Modale action à impact du panier d'actions
*/
+export const ModaleActionImpact = (props: ModaleActionImpactProps) => {
+ const {
+ children,
+ titre,
+ description,
+ statut,
+ panier,
+ onToggleSelected,
+ onUpdateStatus,
+ } = props;
-export const ModaleActionImpact = ({
- children,
- titre,
- thematiques,
- budget,
- description,
- miseEnOeuvre,
- ressources,
- rex,
- subventions,
- statut,
- panier,
- onToggleSelected,
- onUpdateStatus,
-}: ModaleActionImpactProps) => {
return (
{
return (
-
- {/* Badges thématiques */}
- {!!thematiques.length && (
-
- {thematiques.map(theme => (
-
- ))}
-
- )}
-
- {/* Description */}
-
-
- {/* Temps de mise en oeuvre */}
-
- Temps de mise en oeuvre :{' '}
-
- {miseEnOeuvre?.nom.toLowerCase() ?? 'non estimé'}
-
-
-
- Temps estimatif correspondant au déploiement de l’action
- une fois celle-ci validée, de son démarrage à ses
- premières réalisations.
-
-
- Cette temporalité peut varier en fonction des
- priorisations, des moyens et des ressources disponibles.
-
-
- En savoir plus
-
-
- }
- />
-
-
- {/* Estimation budgétaire */}
-
- Estimation budgétaire :{' '}
-
- {budget?.nom.toLowerCase() ?? 'non estimé'}
-
-
-
- Estimation budgétaire HT (investissement et
- fonctionnement, hors subvention).
-
-
- Une évaluation précise du budget sera à réaliser lors du
- dimensionnement exacte de l’action.
-
-
- En savoir plus
-
-
- }
+
-
-
- {/* Ressources externes */}
- {!!ressources && ressources.length > 0 && (
-
- {ressources.map(r => (
-
- ))}
-
- )}
-
-
-
- {/* REX */}
-
-
- D’autres collectivités l’ont fait :
-
-
- {!rex || rex.length === 0 ? (
-
- Exemples d'autres collectivités à venir
-
- ) : (
- rex.map(r => )
- )}
-
-
-
- {/* Subventions mobilisables */}
-
-
- Subventions mobilisables :{' '}
-
-
- De nombreux programmes d’aides nationaux et locaux
- peuvent vous permettre de financer ou d’accompagner vos
- projets.
-
-
- Les liens directs vers les programmes concernés seront
- prochainement disponibles sur la plateforme.
-
-
- }
- />
-
-
-
- {!!subventions &&
- subventions.length > 0 &&
- subventions.map(
- s =>
- s.url &&
- s.url !== URL_AIDES_TERRITOIRES &&
- s.url !== `${URL_AIDES_TERRITOIRES}/` && (
-
- ),
- )}
-
-
-
+ }
+ />
);
}}
renderFooter={({close}) => (
diff --git a/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx b/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx
new file mode 100644
index 0000000000..73bb1dd4a5
--- /dev/null
+++ b/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx
@@ -0,0 +1,221 @@
+import {
+ ActionImpactFourchetteBudgetaire,
+ ActionImpactTempsMiseEnOeuvre,
+ ActionImpactThematique,
+} from '@tet/api';
+
+import {Badge} from 'design-system/Badge';
+import {Button} from 'design-system/Button';
+import {Divider} from 'design-system/Divider';
+import {InfoTooltip} from 'design-system/Tooltip';
+import {ReactNode} from 'react';
+
+const URL_AIDES_TERRITOIRES = 'https://aides-territoires.beta.gouv.fr';
+
+type LinkType = {
+ url: string;
+ label: string;
+};
+
+export type ActionImpactDetail = {
+ /** Titre de l'action à impact */
+ titre: string;
+ /** Thématiques de l'action à impact */
+ thematiques: ActionImpactThematique[];
+ /** Budget de la mise en place de l'action : petit, moyen ou élevé */
+ budget?: ActionImpactFourchetteBudgetaire;
+ /** Description de l'action à impact */
+ description: string;
+ /** Temps de mise en oeuvre */
+ miseEnOeuvre?: ActionImpactTempsMiseEnOeuvre;
+ /** Lien vers les ressources externes */
+ ressources?: LinkType[] | null;
+ /** Lien vers les retours d'expérience */
+ rex?: LinkType[] | null;
+ /** Lien vers les subventions mobilisables */
+ subventions?: LinkType[] | null;
+ /** Statut de l'action */
+ statut?: 'non_pertinent' | 'en_cours' | 'realise' | null;
+};
+
+type InfoActionImpactProps = {
+ /** Détail de l'action */
+ action: ActionImpactDetail;
+ /** Description de l'action à impact rendu depuis le contenu Markdown */
+ descriptionMarkdown: React.JSX.Element;
+ /** Styles additionnels */
+ className?: string;
+};
+
+/**
+ * Affiche les informations détaillées d'une action à impact
+ */
+export const InfoActionImpact = ({
+ action,
+ descriptionMarkdown,
+ className,
+}: InfoActionImpactProps) => {
+ const {thematiques, budget, miseEnOeuvre, ressources, rex, subventions} =
+ action;
+
+ return (
+
+ {/* Badges thématiques */}
+ {!!thematiques.length && (
+
+ {thematiques.map(theme => (
+
+ ))}
+
+ )}
+
+ {/* Description */}
+ {descriptionMarkdown}
+
+ {/* Temps de mise en oeuvre */}
+
+ Temps de mise en oeuvre :{' '}
+
+ {miseEnOeuvre?.nom.toLowerCase() ?? 'non estimé'}
+
+
+
+ Temps estimatif correspondant au déploiement de l’action une
+ fois celle-ci validée, de son démarrage à ses premières
+ réalisations.
+
+
+ Cette temporalité peut varier en fonction des priorisations, des
+ moyens et des ressources disponibles.
+
+
+ En savoir plus
+
+
+ }
+ />
+
+
+ {/* Estimation budgétaire */}
+
+ Estimation budgétaire :{' '}
+
+ {budget?.nom.toLowerCase() ?? 'non estimé'}
+
+
+
+ Estimation budgétaire HT (investissement et fonctionnement, hors
+ subvention).
+
+
+ Une évaluation précise du budget sera à réaliser lors du
+ dimensionnement exacte de l’action.
+
+
+ En savoir plus
+
+
+ }
+ />
+
+
+ {/* Ressources externes */}
+ {!!ressources && ressources.length > 0 && (
+
+ {ressources.map((r, i) => (
+
+ {r.label}
+
+ ))}
+
+ )}
+
+
+
+ {/* REX */}
+
+
+ D’autres collectivités l’ont fait :
+
+
+ {!rex || rex.length === 0 ? (
+
+ Exemples d'autres collectivités à venir
+
+ ) : (
+ rex.map((r, i) => (
+
+ {r.label}
+
+ ))
+ )}
+
+
+
+ {/* Subventions mobilisables */}
+
+
+ Subventions mobilisables :{' '}
+
+
+ De nombreux programmes d’aides nationaux et locaux peuvent
+ vous permettre de financer ou d’accompagner vos projets.
+
+
+ Les liens directs vers les programmes concernés seront
+ prochainement disponibles sur la plateforme.
+
+
+ }
+ />
+
+
+
+ Aides territoires
+
+ {!!subventions &&
+ subventions.length > 0 &&
+ subventions.map(
+ (s, i) =>
+ s.url &&
+ s.url !== URL_AIDES_TERRITOIRES &&
+ s.url !== `${URL_AIDES_TERRITOIRES}/` && (
+
+ {s.url}
+
+ )
+ )}
+
+
+
+ );
+};
diff --git a/packages/ui/src/components/InfoActionImpact/index.ts b/packages/ui/src/components/InfoActionImpact/index.ts
new file mode 100644
index 0000000000..381ba1fde0
--- /dev/null
+++ b/packages/ui/src/components/InfoActionImpact/index.ts
@@ -0,0 +1 @@
+export * from './InfoActionImpact';
diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts
index 00e9e2dbcc..4e5f1a6016 100644
--- a/packages/ui/src/index.ts
+++ b/packages/ui/src/index.ts
@@ -11,6 +11,7 @@ export * from './hooks/useCopyToClipboard';
// dossier composants
export * from './components/layout';
export * from './components/tracking';
+export * from './components/InfoActionImpact';
// dossier design-system
export * from './design-system/Accordion';
From 2f16fca65ad4208ede53cf9532df0f8910eb7112 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Thu, 19 Sep 2024 18:00:09 +0200
Subject: [PATCH 12/91] =?UTF-8?q?Affiche=20dans=20l'app=20le=20descriptif?=
=?UTF-8?q?=20d'une=20action=20=C3=A0=20impact=20(du=20panier=20d'actions)?=
=?UTF-8?q?=20li=C3=A9e=20=C3=A0=20une=20fiche=20action?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../FicheAction/FicheActionImpact.tsx | 29 ++++++------
.../FicheActionImpact/ModaleActionImpact.tsx | 44 +++++++++++++++++++
.../FicheActionImpact/useActionImpact.ts | 23 ++++++++++
.../src/ui/Markdown/index.tsx | 15 +++++++
.../InfoActionImpact/InfoActionImpact.tsx | 3 +-
5 files changed, 99 insertions(+), 15 deletions(-)
create mode 100644 app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/ModaleActionImpact.tsx
create mode 100644 app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/useActionImpact.ts
create mode 100644 app.territoiresentransitions.react/src/ui/Markdown/index.tsx
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact.tsx b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact.tsx
index 30356a8d80..7ab6b4cc0c 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact.tsx
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact.tsx
@@ -2,6 +2,7 @@ import classNames from 'classnames';
import {Icon, Notification} from '@tet/ui';
import {FicheAction} from './data/types';
import {useFicheActionImpactId} from './data/useFicheActionImpactId';
+import {ModaleActionImpact} from 'app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/ModaleActionImpact';
type FicheActionImpactProps = {
fiche: FicheAction;
@@ -12,19 +13,21 @@ const FicheActionImpact = ({fiche}: FicheActionImpactProps) => {
const {data: actionImpactId} = useFicheActionImpactId(fiche.id);
return actionImpactId ? (
-
-
- Fiche action issue du panier d’action
-
-
+
+
+
+ Fiche action issue du panier d’action
+
+
+
) : null;
};
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/ModaleActionImpact.tsx b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/ModaleActionImpact.tsx
new file mode 100644
index 0000000000..29c9ef41f7
--- /dev/null
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/ModaleActionImpact.tsx
@@ -0,0 +1,44 @@
+import {Modal, InfoActionImpact} from '@tet/ui';
+import {useActionImpact} from './useActionImpact';
+import Markdown from 'ui/Markdown';
+
+type ModaleActionImpactProps = {
+ actionImpactId: number;
+ children: React.JSX.Element;
+};
+
+/**
+ * Affiche le descriptif d'une action à impact (du panier d'actions)
+ */
+export const ModaleActionImpact = (props: ModaleActionImpactProps) => {
+ const {actionImpactId, children} = props;
+ const {data: action} = useActionImpact(actionImpactId);
+
+ if (!action) {
+ return null;
+ }
+
+ const {titre, description} = action;
+ return (
+ {
+ return (
+
+ }
+ />
+ );
+ }}
+ >
+ {children}
+
+ );
+};
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/useActionImpact.ts b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/useActionImpact.ts
new file mode 100644
index 0000000000..54ff1ecf9b
--- /dev/null
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/useActionImpact.ts
@@ -0,0 +1,23 @@
+import {useQuery} from 'react-query';
+import {supabaseClient} from 'core-logic/api/supabase';
+import {ActionImpact, ActionImpactThematique} from '@tet/api';
+
+type ActionImpactDetail = ActionImpact & {
+ thematiques: ActionImpactThematique[];
+};
+
+/**
+ * Charge le détail d'une action à impact
+ */
+export const useActionImpact = (actionImpactId: number) =>
+ useQuery(['action_impact', actionImpactId], async () => {
+ const {data, error} = await supabaseClient
+ .from('action_impact')
+ .select()
+ .eq('id', actionImpactId)
+ .returns();
+
+ if (error) throw new Error(error.message);
+
+ return data?.[0];
+ });
diff --git a/app.territoiresentransitions.react/src/ui/Markdown/index.tsx b/app.territoiresentransitions.react/src/ui/Markdown/index.tsx
new file mode 100644
index 0000000000..2a8da5a58b
--- /dev/null
+++ b/app.territoiresentransitions.react/src/ui/Markdown/index.tsx
@@ -0,0 +1,15 @@
+import MarkdownBase from 'react-markdown';
+import remarkGfm from 'remark-gfm';
+
+type MarkdownProps = {
+ content: string;
+ className?: string;
+};
+
+const Markdown = ({content, className}: MarkdownProps) => (
+
+ {content}
+
+);
+
+export default Markdown;
diff --git a/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx b/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx
index 73bb1dd4a5..2631184add 100644
--- a/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx
+++ b/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx
@@ -8,7 +8,6 @@ import {Badge} from 'design-system/Badge';
import {Button} from 'design-system/Button';
import {Divider} from 'design-system/Divider';
import {InfoTooltip} from 'design-system/Tooltip';
-import {ReactNode} from 'react';
const URL_AIDES_TERRITOIRES = 'https://aides-territoires.beta.gouv.fr';
@@ -61,7 +60,7 @@ export const InfoActionImpact = ({
return (
{/* Badges thématiques */}
- {!!thematiques.length && (
+ {!!thematiques?.length && (
{thematiques.map(theme => (
Date: Thu, 19 Sep 2024 18:13:15 +0200
Subject: [PATCH 13/91] =?UTF-8?q?Retire=20de=20la=20s=C3=A9lection=20les?=
=?UTF-8?q?=20actions=20d=C3=A9j=C3=A0=20ajout=C3=A9es=20au=20panier?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/panier/components/ListeActions/index.tsx | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/packages/panier/components/ListeActions/index.tsx b/packages/panier/components/ListeActions/index.tsx
index af03b91cd6..4468a9b141 100644
--- a/packages/panier/components/ListeActions/index.tsx
+++ b/packages/panier/components/ListeActions/index.tsx
@@ -71,8 +71,9 @@ const ListeActions = ({
{...tabsList.map(tab => {
const actionsFiltrees = actionsListe.filter(
a =>
- (!a.statut && a.statut === tab.status) ||
- (a.statut && a.statut.categorie_id === tab.status),
+ ((!a.statut && a.statut === tab.status) ||
+ (a.statut && a.statut.categorie_id === tab.status)) &&
+ (tab.status || !a.isinpanier),
);
return (
From 446674e469877ef64af9cf9e7207035aeaf52430 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Thu, 19 Sep 2024 18:17:21 +0200
Subject: [PATCH 14/91] =?UTF-8?q?Change=20le=20libell=C3=A9=20du=20bouton?=
=?UTF-8?q?=20de=20validation=20du=20panier?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../panier/components/ValidationPanier/ValiderPanierButton.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/panier/components/ValidationPanier/ValiderPanierButton.tsx b/packages/panier/components/ValidationPanier/ValiderPanierButton.tsx
index 3caa39b367..dd938691f7 100644
--- a/packages/panier/components/ValidationPanier/ValiderPanierButton.tsx
+++ b/packages/panier/components/ValidationPanier/ValiderPanierButton.tsx
@@ -31,7 +31,7 @@ const ValiderPanierButton = () => {
});
}}
>
- Valider la création
+ Créer un plan d’action
Date: Thu, 19 Sep 2024 18:27:43 +0200
Subject: [PATCH 15/91] =?UTF-8?q?Change=20les=20styles=20de=20l'encadr?=
=?UTF-8?q?=C3=A9=20"Inviter=20des=20membres"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/PanierRealtime/PartagerLeLien.tsx | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/packages/panier/components/PanierRealtime/PartagerLeLien.tsx b/packages/panier/components/PanierRealtime/PartagerLeLien.tsx
index f7e7e97242..40999d0966 100644
--- a/packages/panier/components/PanierRealtime/PartagerLeLien.tsx
+++ b/packages/panier/components/PanierRealtime/PartagerLeLien.tsx
@@ -33,7 +33,7 @@ export const PartagerLeLien = () => {
}, [copied]);
return opened ? (
-
+
setOpened(false)}
className="ml-auto cursor-pointer h-fit w-fit"
@@ -65,8 +65,15 @@ export const PartagerLeLien = () => {
) : (
-
-
setOpened(true)} />
+
+ setOpened(true)}
+ >
+ Inviter des membres
+
);
};
From 74d7b57d005a2b629272e958c217886ca695a311 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Thu, 19 Sep 2024 19:11:27 +0200
Subject: [PATCH 16/91] Ajoute le bouton "Initier votre plan d'action"
---
.../.env.sample | 3 +-
.../ParcoursCreationPlan/Selection.tsx | 61 ++++++++++++-------
.../ParcoursCreationPlan/document-add.svg | 9 +++
.../document-download.svg | 20 ++++++
.../ParcoursCreationPlan/shopping-basket.svg | 15 +++++
.../src/app/paths.ts | 7 +++
.../src/environmentVariables.ts | 1 +
7 files changed, 93 insertions(+), 23 deletions(-)
create mode 100644 app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/document-add.svg
create mode 100644 app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/document-download.svg
create mode 100644 app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/shopping-basket.svg
diff --git a/app.territoiresentransitions.react/.env.sample b/app.territoiresentransitions.react/.env.sample
index 2a0858d066..5802113fe9 100644
--- a/app.territoiresentransitions.react/.env.sample
+++ b/app.territoiresentransitions.react/.env.sample
@@ -4,4 +4,5 @@ NX_PUBLIC_CRISP_WEBSITE_ID="// Crisp integration (warning: use different ID by d
NX_PUBLIC_SENTRY_DSN=""
NX_PUBLIC_POSTHOG_KEY=
NX_PUBLIC_POSTHOG_HOST=
-NX_PUBLIC_BACKEND_URL=
+NX_PUBLIC_BACKEND_URL=http://localhost:8080
+NX_PUBLIC_PANIER_URL=http://localhost:3002
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/Selection.tsx b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/Selection.tsx
index fad253ad11..5b2a24bd11 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/Selection.tsx
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/Selection.tsx
@@ -1,4 +1,5 @@
import {
+ makeCollectivitePanierUrl,
makeCollectivitePlansActionsCreerUrl,
makeCollectivitePlansActionsImporterUrl,
} from 'app/paths';
@@ -6,6 +7,10 @@ import classNames from 'classnames';
import {useCollectiviteId} from 'core-logic/hooks/params';
import {useFonctionTracker} from 'core-logic/hooks/useFonctionTracker';
import {Link, useHistory} from 'react-router-dom';
+import {ReactComponent as DocumentAddPicto} from './document-add.svg';
+import {ReactComponent as DocumentDownloadPicto} from './document-download.svg';
+import {ReactComponent as ShoppingBasket} from './shopping-basket.svg';
+import {Button} from '@tet/ui';
const Selection = () => {
const collectivite_id = useCollectiviteId();
@@ -14,41 +19,51 @@ const Selection = () => {
const tracker = useFonctionTracker();
return (
-
+
-
Ajouter un plan d’action
+
Créer un plan d’action
Vous souhaitez
+ }
+ url={makeCollectivitePlansActionsCreerUrl({
+ collectiviteId: collectivite_id!,
+ })}
+ />
}
url={makeCollectivitePlansActionsImporterUrl({
collectiviteId: collectivite_id!,
})}
/>
}
+ url={makeCollectivitePanierUrl({
collectiviteId: collectivite_id!,
})}
/>
-
{
history.goBack();
tracker({fonction: 'annulation', action: 'clic'});
}}
>
Annuler
-
+
@@ -60,7 +75,7 @@ export default Selection;
type SelectFlowButtonProps = {
dataTest?: string;
url: string;
- iconClass: string;
+ icon: React.JSX.Element;
title: string;
subTitle: string;
isPrimary?: boolean;
@@ -69,7 +84,7 @@ type SelectFlowButtonProps = {
const SelectFlowButton = ({
dataTest,
url,
- iconClass,
+ icon,
title,
subTitle,
isPrimary = false,
@@ -80,14 +95,12 @@ const SelectFlowButton = ({
{'!bg-primary hover:!bg-primary-6': isPrimary}
)}
>
-
-
+ {icon}
{title}
-
);
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/document-add.svg b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/document-add.svg
new file mode 100644
index 0000000000..b470987862
--- /dev/null
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/document-add.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/document-download.svg b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/document-download.svg
new file mode 100644
index 0000000000..5c5c6755ff
--- /dev/null
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/document-download.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/shopping-basket.svg b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/shopping-basket.svg
new file mode 100644
index 0000000000..88870e7ec3
--- /dev/null
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/shopping-basket.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app.territoiresentransitions.react/src/app/paths.ts b/app.territoiresentransitions.react/src/app/paths.ts
index 23a47367bd..c877c74b8e 100644
--- a/app.territoiresentransitions.react/src/app/paths.ts
+++ b/app.territoiresentransitions.react/src/app/paths.ts
@@ -1,5 +1,6 @@
import {Referentiel} from 'types/litterals';
import {getAuthPaths} from '@tet/api';
+import {ENV} from '../environmentVariables';
const authPaths = getAuthPaths(
document.location.hostname,
@@ -508,6 +509,12 @@ export const makeCollectiviteJournalUrl = ({
collectiviteId.toString()
);
+export const makeCollectivitePanierUrl = ({
+ collectiviteId,
+}: {
+ collectiviteId: number;
+}) => `${ENV.panier_url}/landing/collectivite/${collectiviteId}`;
+
export const makeInvitationLandingPath = (
invitationId: string,
email: string
diff --git a/app.territoiresentransitions.react/src/environmentVariables.ts b/app.territoiresentransitions.react/src/environmentVariables.ts
index 90b5664fd5..df65a3cec3 100644
--- a/app.territoiresentransitions.react/src/environmentVariables.ts
+++ b/app.territoiresentransitions.react/src/environmentVariables.ts
@@ -4,6 +4,7 @@ export const ENV = {
supabase_anon_key: process.env.NX_PUBLIC_SUPABASE_KEY,
supabase_url: process.env.NX_PUBLIC_SUPABASE_URL,
sentry_dsn: process.env.NX_PUBLIC_SENTRY_DSN,
+ panier_url: process.env.REACT_APP_PANIER_URL,
posthog: {
host: process.env.NX_PUBLIC_POSTHOG_HOST,
key: process.env.NX_PUBLIC_POSTHOG_KEY,
From fc2ed6de65b4d4d9ae0dbf7ba6867867c07c92f3 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 23 Sep 2024 11:14:30 +0200
Subject: [PATCH 17/91] =?UTF-8?q?Am=C3=A9liore=20l'affichage=20de=20la=20d?=
=?UTF-8?q?escription=20de=20l'action=20=C3=A0=20impact=20li=C3=A9e=20?=
=?UTF-8?q?=C3=A0=20une=20fiche=20action?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../FicheAction/FicheActionImpact/useActionImpact.ts | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/useActionImpact.ts b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/useActionImpact.ts
index 54ff1ecf9b..db70d06039 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/useActionImpact.ts
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/useActionImpact.ts
@@ -13,7 +13,16 @@ export const useActionImpact = (actionImpactId: number) =>
useQuery(['action_impact', actionImpactId], async () => {
const {data, error} = await supabaseClient
.from('action_impact')
- .select()
+ .select(
+ `titre,
+ thematiques:action_impact_thematique(...thematique(id,nom)),
+ budget:action_impact_fourchette_budgetaire(*),
+ miseEnOeuvre:action_impact_temps_de_mise_en_oeuvre(*),
+ ressources:ressources_externes,
+ rex,
+ subventions:subventions_mobilisables
+ `
+ )
.eq('id', actionImpactId)
.returns();
From 15849e61f7bf80c52ad293317a3dd65850c7836a Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 25 Sep 2024 13:55:13 +0200
Subject: [PATCH 18/91] =?UTF-8?q?Ajoute=20dans=20la=20m=C3=A9thode=20de=20?=
=?UTF-8?q?fetch=20des=20actions=20=C3=A0=20impact=20le=20filtrage=20sur?=
=?UTF-8?q?=20les=20comp=C3=A9tences=20de=20la=20collectivit=C3=A9=20assoc?=
=?UTF-8?q?i=C3=A9e=20au=20panier?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../api/src/panier_action_impact/panierAPI.ts | 49 +++++++++++++++++--
1 file changed, 46 insertions(+), 3 deletions(-)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index 80651d2c43..5671449d1d 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -109,7 +109,9 @@ export class PanierAPI {
panier_id: string,
thematique_ids: number[],
niveau_budget_ids: number[],
- niveau_temps_ids: number[]
+ niveau_temps_ids: number[],
+ /** indique que les actions à impact ne sont pas filtrées sur les compétences de la collectivité */
+ sansFiltreCompetences: boolean
): Promise {
const builder = this.supabase
.from('panier')
@@ -155,9 +157,50 @@ export class PanierAPI {
);
}
- const { data, error } = await builder.single();
+ if (!sansFiltreCompetences) {
+ // @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
+ builder.url.searchParams.append(
+ 'action_impact_state.matches_competences',
+ 'is.true'
+ );
+ }
+
+ const {data, error} = await builder.single();
if (error) throw error;
- return data;
+ return sansFiltreCompetences ? data : this.filterActionsCommune(data);
+ }
+
+ async fetchCollectiviteTypes(collectivite_id: number) {
+ const {data, error} = await this.supabase
+ .from('collectivite_identite')
+ .select('type')
+ .eq('id', collectivite_id);
+ if (error) throw error;
+ const collectivite = data?.[0];
+ return collectivite?.type || null;
+ }
+
+ // filtre a posteriori les actions pour les communes
+ async filterActionsCommune(panier: Panier) {
+ const collectiviteId = panier.collectivite_id || panier.collectivite_preset;
+ if (!collectiviteId) return panier;
+
+ // type et compétences de la collectivité
+ const collectiviteTypes = await this.fetchCollectiviteTypes(collectiviteId);
+
+ // pour les communes : filtre sur les flags “independamment_competences” et/ou “competences_communales”
+ if (collectiviteTypes?.includes('commune')) {
+ return {
+ ...panier,
+ states: panier.states.filter(
+ state =>
+ state.action.independamment_competences ||
+ state.action.competences_communales
+ ),
+ };
+ }
+
+ return panier;
}
/**
From 0ec3fbb23a149afb9b6a890353df681bf160efb8 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 25 Sep 2024 13:55:26 +0200
Subject: [PATCH 19/91] =?UTF-8?q?Supprime=20une=20ligne=20dupliqu=C3=A9e?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/api/src/panier_action_impact/index.ts | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/packages/api/src/panier_action_impact/index.ts b/packages/api/src/panier_action_impact/index.ts
index 9ea8c9d167..0512d8b22d 100644
--- a/packages/api/src/panier_action_impact/index.ts
+++ b/packages/api/src/panier_action_impact/index.ts
@@ -1,4 +1,3 @@
export * from "./actionImpactAPI";
export * from "./panierAPI";
-export * from "./types";
-export * from "./types";
+export * from './types';
From 4adfc0ffdae91c261ea1bc20ef342a7a9251f879 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 25 Sep 2024 13:56:57 +0200
Subject: [PATCH 20/91] =?UTF-8?q?Permet=20d'avoir=20un=20filtre=20par=20ch?=
=?UTF-8?q?eckbox=20dans=20les=20options=20de=20filtrage=20des=20actions?=
=?UTF-8?q?=20=C3=A0=20impact?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../FiltresActions/BadgesFilters.tsx | 115 +++++++++++++-----
1 file changed, 83 insertions(+), 32 deletions(-)
diff --git a/packages/panier/components/FiltresActions/BadgesFilters.tsx b/packages/panier/components/FiltresActions/BadgesFilters.tsx
index a39569753c..1fc2b678ed 100644
--- a/packages/panier/components/FiltresActions/BadgesFilters.tsx
+++ b/packages/panier/components/FiltresActions/BadgesFilters.tsx
@@ -2,9 +2,10 @@ import classNames from 'classnames';
import { useEffect, useState } from 'react';
import {
- Badge,
ButtonMenu,
+ Checkbox,
Field,
+ Icon,
OptionValue,
SelectMultiple,
SelectMultipleOnChangeArgs,
@@ -12,7 +13,8 @@ import {
getFlatOptions,
} from '@tet/ui';
-type FilterType = {
+type FilterSelect = {
+ type?: never;
/** Titre affiché dans */
title: string;
/** Tag optionnel, affiché dans les badges */
@@ -27,6 +29,22 @@ type FilterType = {
onChange: (args: SelectMultipleOnChangeArgs) => void;
};
+type FilterCheckbox = {
+ type: 'checkbox';
+ /** Titre affiché dans */
+ title: string;
+ /** Tag optionnel, affiché dans les badges */
+ tag?: string;
+ /** Valeur de la checkbox */
+ value?: boolean;
+ /** Contenu de l'infobulle */
+ tooltip?: string;
+ /** Détecte le changement de valeur de la checkbox */
+ onChange: (value: boolean) => void;
+};
+
+type FilterType = FilterSelect | FilterCheckbox;
+
type BadgeType = {
filter: FilterType;
value: OptionValue;
@@ -51,17 +69,28 @@ export const BadgesFilters = ({
const handleCloseBadge = (badge: BadgeType) => {
const selectedValue = badge.value;
- const values: OptionValue[] | undefined = badge.filter.values?.filter(
- (v) => v !== badge.value
- );
+ if (badge.filter.type === 'checkbox') {
+ badge.filter.onChange(badge.filter.value ?? false);
+ } else {
+ const values: OptionValue[] | undefined = badge.filter.values?.filter(
+ v => v !== badge.value,
+ );
- badge.filter.onChange({ selectedValue, values });
+ badge.filter.onChange({selectedValue, values});
+ }
};
/** Supprime tous les filtres sélectionnés */
const handleClearFilters = () => {
- badgesList?.forEach((badge) => {
- badge.filter.onChange({ selectedValue: badge.value, values: undefined });
+ badgesList?.forEach(badge => {
+ if (badge.filter.type === 'checkbox') {
+ badge.filter.onChange(false);
+ } else {
+ badge.filter.onChange({
+ selectedValue: badge.value,
+ values: undefined,
+ });
+ }
});
};
@@ -69,20 +98,25 @@ export const BadgesFilters = ({
useEffect(() => {
const newList: BadgeType[] = [];
- filters.forEach((filter) => {
- if (filter.values !== undefined) {
- const options = getFlatOptions(filter.options);
-
- filter.values.forEach((value) => {
- const option = options.find((opt) => opt.value === value);
-
- option &&
- newList.push({
- filter,
- value: option.value,
- label: option.label,
- });
- });
+ filters.forEach(filter => {
+ if (filter.type === 'checkbox') {
+ if (filter.value)
+ newList.push({filter, value: 'true', label: filter.title});
+ } else {
+ if (filter.values !== undefined) {
+ const options = getFlatOptions(filter.options);
+
+ filter.values.forEach(value => {
+ const option = options.find(opt => opt.value === value);
+
+ option &&
+ newList.push({
+ filter,
+ value: option.value,
+ label: option.label,
+ });
+ });
+ }
}
});
@@ -141,16 +175,33 @@ export const BadgesFilters = ({
}
>
- {filters.map((filter) => (
-
-
-
- ))}
+ {filters.map(filter =>
+ filter.type === 'checkbox' ? (
+
+ filter.onChange(evt.currentTarget.checked)}
+ />
+ {!!filter.tooltip && (
+
+ )}
+
+ ) : (
+
+
+
+ ),
+ )}
From 663809f1321094216d96bb0438a4d1f2f603c38f Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 25 Sep 2024 13:57:23 +0200
Subject: [PATCH 21/91] =?UTF-8?q?Ajoute=20l'option=20de=20filtrage=20"?=
=?UTF-8?q?=C3=89largir=20au-del=C3=A0=20des=20comp=C3=A9tences=20territor?=
=?UTF-8?q?iales"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/FiltresActions/index.tsx | 30 +++++++++++++++++--
1 file changed, 27 insertions(+), 3 deletions(-)
diff --git a/packages/panier/components/FiltresActions/index.tsx b/packages/panier/components/FiltresActions/index.tsx
index d7b2a2053a..f5345dc811 100644
--- a/packages/panier/components/FiltresActions/index.tsx
+++ b/packages/panier/components/FiltresActions/index.tsx
@@ -19,12 +19,14 @@ type FiltresActionsProps = {
budgets: ActionImpactFourchetteBudgetaire[];
temps: ActionImpactTempsMiseEnOeuvre[];
thematiques: ActionImpactThematique[];
+ sansFiltreCompetences: boolean;
};
const FiltresActions = ({
budgets,
temps,
thematiques,
+ sansFiltreCompetences,
}: FiltresActionsProps) => {
const router = useRouter();
const pathname = usePathname();
@@ -39,6 +41,9 @@ const FiltresActions = ({
OptionValue[] | undefined
>();
const [tempsValues, setTempsValues] = useState();
+ const [sansFiltreCompetencesValue, setSansFiltreCompetencesValue] = useState(
+ sansFiltreCompetences,
+ );
useEffect(() => {
// Permet de conserver les filtres lors d'un changement d'onglet
@@ -54,12 +59,13 @@ const FiltresActions = ({
const tempsParams = searchParams
.get('m')
?.split(',')
- .map((val) => parseInt(val));
- // const competencesParams = searchParams.get('c');
+ .map(val => parseInt(val));
+ const competencesParams = searchParams.get('c');
if (thematiquesParams) setThematiquesValues(thematiquesParams);
if (budgetsParams) setBudgetsValues(budgetsParams);
if (tempsParams) setTempsValues(tempsParams);
+ setSansFiltreCompetencesValue(competencesParams === 'true');
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
@@ -77,6 +83,9 @@ const FiltresActions = ({
if (!!tempsValues && tempsValues?.length > 0) {
paramsArray.push(`m=${tempsValues.join(',')}`);
}
+ if (sansFiltreCompetencesValue) {
+ paramsArray.push('c=true');
+ }
const href =
paramsArray.length > 0
@@ -90,13 +99,19 @@ const FiltresActions = ({
thematique_ids: thematiquesValues,
niveau_budget_ids: budgetsValues,
niveau_temps_ids: tempsValues,
+ match_competences: sansFiltreCompetencesValue,
});
router.push(href, { scroll: false });
};
trackThenNavigate();
// eslint-disable-next-line react-hooks/exhaustive-deps
- }, [thematiquesValues?.length, budgetsValues?.length, tempsValues?.length]);
+ }, [
+ thematiquesValues?.length,
+ budgetsValues?.length,
+ tempsValues?.length,
+ sansFiltreCompetencesValue,
+ ]);
return (
+ setSansFiltreCompetencesValue(!sansFiltreCompetencesValue),
+ },
]}
className="my-4"
btnMenuClassName="-mt-14"
From 95f89962a5f35ba129f7c6a9f2a93d3bd7aa8446 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 25 Sep 2024 14:01:07 +0200
Subject: [PATCH 22/91] =?UTF-8?q?Passe=20l'option=20de=20filtrage=20"?=
=?UTF-8?q?=C3=89largir=20au-del=C3=A0=20des=20comp=C3=A9tences=20territor?=
=?UTF-8?q?iales"=20aux=20diff=C3=A9rents=20composants?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/panier/app/panier/[id]/PagePanier.tsx | 5 +++--
packages/panier/app/panier/[id]/page.tsx | 11 +++++++----
packages/panier/app/panier/[id]/utils.ts | 7 +++++--
packages/panier/components/ListeActions/index.tsx | 6 +++++-
packages/panier/components/PanierRealtime/index.tsx | 4 +++-
5 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/packages/panier/app/panier/[id]/PagePanier.tsx b/packages/panier/app/panier/[id]/PagePanier.tsx
index 4dac797cf2..5b0db2dc76 100644
--- a/packages/panier/app/panier/[id]/PagePanier.tsx
+++ b/packages/panier/app/panier/[id]/PagePanier.tsx
@@ -15,9 +15,10 @@ type PagePanierProps = {
budgets: ActionImpactFourchetteBudgetaire[];
temps: ActionImpactTempsMiseEnOeuvre[];
thematiques: ActionImpactThematique[];
+ sansFiltreCompetences: boolean;
};
-const PagePanier = ({panier, budgets, temps, thematiques}: PagePanierProps) => {
+const PagePanier = (props: PagePanierProps) => {
return (
<>
{
/>
>
);
diff --git a/packages/panier/app/panier/[id]/page.tsx b/packages/panier/app/panier/[id]/page.tsx
index 1b8f2e0bd7..9dfe5d11d6 100644
--- a/packages/panier/app/panier/[id]/page.tsx
+++ b/packages/panier/app/panier/[id]/page.tsx
@@ -12,7 +12,7 @@ import { TrackPageView } from '@tet/ui';
* - t pour les ids des thématiques ex : 1 ou 1,2
* - b pour les ids des fourchettes budgétaires ex : 1 ou 1,2
* - m pour les ids de temps de mise en oeuvre ex : 1 ou 1,2
- * - c pour utiliser les competences ex : true ou false (true par défaut)
+ * - c pour ne pas restreindre aux compétences territoriales ex : true ou false (false par défaut)
*
* Ainsi que le contrôle de la modale de "Création de plan d’action”
* - Si le paramètre `modale` est égal à `creation` la modale est initialement ouverte
@@ -28,13 +28,14 @@ async function Page({
const thematique_ids = extractIdsFromParam(searchParams['t'] as string);
const budget_ids = extractIdsFromParam(searchParams['b'] as string);
const temps_ids = extractIdsFromParam(searchParams['m'] as string);
- // const match_competences = searchParams['c'] !== 'false';
+ const sansFiltreCompetences = searchParams['c'] === 'true';
const panier = await fetchPanier(
panierId,
thematique_ids,
budget_ids,
- temps_ids
+ temps_ids,
+ sansFiltreCompetences,
);
if (!panier) return notFound();
@@ -52,7 +53,9 @@ async function Page({
panier_id: panier.id,
}}
/>
-
+
>
);
}
diff --git a/packages/panier/app/panier/[id]/utils.ts b/packages/panier/app/panier/[id]/utils.ts
index 973b7ac054..204f2890d7 100644
--- a/packages/panier/app/panier/[id]/utils.ts
+++ b/packages/panier/app/panier/[id]/utils.ts
@@ -22,7 +22,8 @@ export const fetchPanier = async (
panierId: string,
thematique_ids: number[],
budget_ids: number[],
- temps_ids: number[]
+ temps_ids: number[],
+ sansFiltreCompetences: boolean,
): Promise => {
const supabase = createClient(cookies());
const api = new PanierAPI(supabase);
@@ -31,7 +32,8 @@ export const fetchPanier = async (
panierId,
thematique_ids,
budget_ids,
- temps_ids
+ temps_ids,
+ sansFiltreCompetences,
);
return panier;
@@ -63,3 +65,4 @@ export const fetchNiveaux = async (
const response = await fetch(`${apiUrl}/rest/v1/${table}`, getInit);
return await response.json();
};
+
diff --git a/packages/panier/components/ListeActions/index.tsx b/packages/panier/components/ListeActions/index.tsx
index 4468a9b141..3b045c846d 100644
--- a/packages/panier/components/ListeActions/index.tsx
+++ b/packages/panier/components/ListeActions/index.tsx
@@ -31,6 +31,7 @@ type ListeActionsProps = {
budgets: ActionImpactFourchetteBudgetaire[];
temps: ActionImpactTempsMiseEnOeuvre[];
thematiques: ActionImpactThematique[];
+ sansFiltreCompetences: boolean;
onToggleSelected: (actionId: number, selected: boolean) => void;
onUpdateStatus: (actionId: number, statusId: string | null) => void;
onChangeTab: (tab: PanierOngletName) => void;
@@ -41,6 +42,7 @@ const ListeActions = ({
budgets,
temps,
thematiques,
+ sansFiltreCompetences,
onToggleSelected,
onUpdateStatus,
onChangeTab,
@@ -78,7 +80,9 @@ const ListeActions = ({
return (
-
+
{!tab.status &&
!actionsFiltrees.length &&
diff --git a/packages/panier/components/PanierRealtime/index.tsx b/packages/panier/components/PanierRealtime/index.tsx
index a52a2f6d89..9d16ac09ba 100644
--- a/packages/panier/components/PanierRealtime/index.tsx
+++ b/packages/panier/components/PanierRealtime/index.tsx
@@ -24,6 +24,7 @@ type PanierRealtimeProps = {
budgets: ActionImpactFourchetteBudgetaire[];
temps: ActionImpactTempsMiseEnOeuvre[];
thematiques: ActionImpactThematique[];
+ sansFiltreCompetences: boolean;
};
/**
@@ -40,6 +41,7 @@ const PanierRealtime = ({
budgets,
temps,
thematiques,
+ sansFiltreCompetences,
}: PanierRealtimeProps) => {
const [currentTab, setCurrentTab] = useState('selection');
@@ -126,7 +128,7 @@ const PanierRealtime = ({
onToggleSelected={handleToggleSelected}
onUpdateStatus={handleUpdateStatus}
onChangeTab={handleChangeTab}
- {...{ budgets, temps, thematiques }}
+ {...{budgets, temps, thematiques, sansFiltreCompetences}}
/>
From f50f4ec590346f2db154677977d7a1a8862188cf Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 25 Sep 2024 13:57:43 +0200
Subject: [PATCH 23/91] =?UTF-8?q?Supprime=20un=20fichier=20inutilis=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ListeActions/FiltresActions.tsx | 165 ------------------
1 file changed, 165 deletions(-)
delete mode 100644 packages/panier/components/ListeActions/FiltresActions.tsx
diff --git a/packages/panier/components/ListeActions/FiltresActions.tsx b/packages/panier/components/ListeActions/FiltresActions.tsx
deleted file mode 100644
index 64f7610335..0000000000
--- a/packages/panier/components/ListeActions/FiltresActions.tsx
+++ /dev/null
@@ -1,165 +0,0 @@
-'use client';
-
-import {useEffect, useState} from 'react';
-import {usePathname, useRouter, useSearchParams} from 'next/navigation';
-import {
- ActionImpactFourchetteBudgetaire,
- ActionImpactTempsMiseEnOeuvre,
- ActionImpactThematique,
-} from '@tet/api';
-import {
- Button,
- Field,
- OptionValue,
- SelectMultiple,
- useEventTracker,
-} from '@tet/ui';
-import {usePanierContext} from '@tet/panier/providers';
-
-type FiltresActionsProps = {
- budgets: ActionImpactFourchetteBudgetaire[];
- temps: ActionImpactTempsMiseEnOeuvre[];
- thematiques: ActionImpactThematique[];
-};
-
-const FiltresActions = ({budgets, temps, thematiques}: FiltresActionsProps) => {
- const router = useRouter();
- const pathname = usePathname();
- const searchParams = useSearchParams();
- const tracker = useEventTracker('panier/panier');
- const {panier} = usePanierContext();
-
- const [thematiquesValues, setThematiquesValues] = useState<
- OptionValue[] | undefined
- >();
- const [budgetsValues, setBudgetsValues] = useState<
- OptionValue[] | undefined
- >();
- const [tempsValues, setTempsValues] = useState();
- // const [competencesValue, setCompetencesValue] = useState(false);
-
- useEffect(() => {
- // Permet de conserver les filtres lors d'un changement d'onglet
- // ou au refresh de la page
- const thematiquesParams = searchParams
- .get('t')
- ?.split(',')
- .map(val => parseInt(val));
- const budgetsParams = searchParams
- .get('b')
- ?.split(',')
- .map(val => parseInt(val));
- const tempsParams = searchParams
- .get('m')
- ?.split(',')
- .map(val => parseInt(val));
- // const competencesParams = searchParams.get('c');
-
- if (!!thematiquesParams) setThematiquesValues(thematiquesParams);
- if (!!budgetsParams) setBudgetsValues(budgetsParams);
- if (!!tempsParams) setTempsValues(tempsParams);
- // if (!!competencesParams)
- // setCompetencesValue(competencesParams === 'true' ? true : false);
-
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, []);
-
- useEffect(() => {
- // Mise à jour de l'url (et du panier) lorsqu'un filtre est modifié
- let paramsArray = [];
-
- if (!!thematiquesValues && thematiquesValues?.length > 0) {
- paramsArray.push(`t=${thematiquesValues.join(',')}`);
- }
- if (!!budgetsValues && budgetsValues?.length > 0) {
- paramsArray.push(`b=${budgetsValues.join(',')}`);
- }
- if (!!tempsValues && tempsValues?.length > 0) {
- paramsArray.push(`m=${tempsValues.join(',')}`);
- }
- // if (competencesValue) paramsArray.push('c=true');
-
- const href =
- paramsArray.length > 0
- ? `${pathname}?${paramsArray.join('&')}`
- : pathname;
-
- const trackThenNavigate = async () => {
- await tracker('filtre', {
- collectivite_preset: panier?.collectivite_preset ?? null,
- panier_id: panier?.id ?? '',
- thematique_ids: thematiquesValues,
- niveau_budget_ids: budgetsValues,
- niveau_temps_ids: tempsValues,
- });
- router.push(href, {scroll: false});
- };
-
- trackThenNavigate();
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [thematiquesValues?.length, budgetsValues?.length, tempsValues?.length]);
-
- const handleClearFilters = () => {
- setThematiquesValues(undefined);
- setBudgetsValues(undefined);
- setTempsValues(undefined);
- };
-
- return (
-
-
-
- ({value: t.id, label: t.nom}))}
- values={thematiquesValues}
- onChange={({values}) => {
- setThematiquesValues(values);
- }}
- small
- />
-
-
- ({value: b.niveau, label: b.nom}))}
- values={budgetsValues}
- onChange={({values}) => {
- setBudgetsValues(values);
- }}
- small
- />
-
-
- ({value: t.niveau, label: t.nom}))}
- values={tempsValues}
- onChange={({values}) => {
- setTempsValues(values);
- }}
- small
- />
-
-
-
- Supprimer tous les filtres
-
-
-
-
- {/*
- setCompetencesValue(prevState => !prevState)}
- />
-
*/}
-
- );
-};
-
-export default FiltresActions;
From b136b46ce5db2f4fbf9ea97ab2d4c7d612fc35ec Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 25 Sep 2024 15:44:11 +0200
Subject: [PATCH 24/91] =?UTF-8?q?Supprime=20un=20import=20inutilis=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../PlansActions/ParcoursCreationPlan/Selection.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/Selection.tsx b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/Selection.tsx
index 5b2a24bd11..9c1ebce29c 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/Selection.tsx
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/Selection.tsx
@@ -6,7 +6,7 @@ import {
import classNames from 'classnames';
import {useCollectiviteId} from 'core-logic/hooks/params';
import {useFonctionTracker} from 'core-logic/hooks/useFonctionTracker';
-import {Link, useHistory} from 'react-router-dom';
+import {useHistory} from 'react-router-dom';
import {ReactComponent as DocumentAddPicto} from './document-add.svg';
import {ReactComponent as DocumentDownloadPicto} from './document-download.svg';
import {ReactComponent as ShoppingBasket} from './shopping-basket.svg';
From b02aaf26607e317dc5d48ef35710e4cac6d56561 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 25 Sep 2024 16:09:57 +0200
Subject: [PATCH 25/91] Affiche les contenus markdown dans la description d'une
fiche action
---
.../FicheActionDescription.tsx | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionDescription/FicheActionDescription.tsx b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionDescription/FicheActionDescription.tsx
index 7f2bc436ce..8852a558f0 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionDescription/FicheActionDescription.tsx
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionDescription/FicheActionDescription.tsx
@@ -4,6 +4,7 @@ import {Badge, Button} from '@tet/ui';
import {FicheAction} from '../data/types';
import MenuDescription from './MenuDescription';
import {getTruncatedText} from '../utils';
+import Markdown from 'ui/Markdown';
type FicheActionDescriptionProps = {
isReadonly: boolean;
@@ -87,9 +88,17 @@ const FicheActionDescription = ({
Description de l'action :
- {(isFullDescription || !isDescriptionTruncated
- ? description
- : truncatedDescription) || 'Non renseigné'}
+ {description ? (
+
+ ) : (
+ 'Non renseigné'
+ )}
{isDescriptionTruncated && (
Date: Thu, 26 Sep 2024 11:29:39 +0200
Subject: [PATCH 26/91] =?UTF-8?q?Supprime=20du=20code=20inutilis=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../panier_action_impact/actionImpactAPI.ts | 25 -------------------
.../api/src/panier_action_impact/index.ts | 3 +--
.../components/ActionImpactDetails/index.tsx | 23 -----------------
packages/panier/src/clientAPI.ts | 10 +++-----
4 files changed, 4 insertions(+), 57 deletions(-)
delete mode 100644 packages/api/src/panier_action_impact/actionImpactAPI.ts
delete mode 100644 packages/panier/components/ActionImpactDetails/index.tsx
diff --git a/packages/api/src/panier_action_impact/actionImpactAPI.ts b/packages/api/src/panier_action_impact/actionImpactAPI.ts
deleted file mode 100644
index cec041bb35..0000000000
--- a/packages/api/src/panier_action_impact/actionImpactAPI.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-
-import { SupabaseClient } from "@supabase/supabase-js";
-import { Database } from '../database.types';
-import { ActionImpactDetails } from './types';
-
-export const actionDetailsSelect = "*, categoriesFNV:categorie_fnv(*), thematiques:thematique(*)";
-
-export class ActionImpactAPI {
- protected supabase: SupabaseClient;
-
- constructor(supabase: SupabaseClient) {
- this.supabase = supabase;
- }
-
- async fetchActionImpactDetails(
- id: number,
- ): Promise {
- const { data, error } = await this.supabase.from("action_impact")
- .select(actionDetailsSelect)
- .eq("id", id)
- .single();
- if (error) throw error;
- return data;
- }
-}
diff --git a/packages/api/src/panier_action_impact/index.ts b/packages/api/src/panier_action_impact/index.ts
index 0512d8b22d..12edc4a5bb 100644
--- a/packages/api/src/panier_action_impact/index.ts
+++ b/packages/api/src/panier_action_impact/index.ts
@@ -1,3 +1,2 @@
-export * from "./actionImpactAPI";
-export * from "./panierAPI";
+export * from './panierAPI';
export * from './types';
diff --git a/packages/panier/components/ActionImpactDetails/index.tsx b/packages/panier/components/ActionImpactDetails/index.tsx
deleted file mode 100644
index 8874361d47..0000000000
--- a/packages/panier/components/ActionImpactDetails/index.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-'use client';
-
-import useSWR from 'swr';
-import type {ActionImpactDetails} from '@tet/api';
-import {actionImpactAPI} from '@tet/panier/src/clientAPI';
-
-
-export default function ActionImpactDetails({id}: { id: number }) {
- const {data, error} =
- useSWR(
- ['ActionImpactDetails', id],
- () => actionImpactAPI.fetchActionImpactDetails(id));
-
- if (!data) {
- return Loading...
;
- }
-
- return
-
{data.titre}
-
{data.description}
-
{JSON.stringify(data, null, 2)}
-
;
-}
diff --git a/packages/panier/src/clientAPI.ts b/packages/panier/src/clientAPI.ts
index 4bf4c7bcb8..ec8b54479d 100644
--- a/packages/panier/src/clientAPI.ts
+++ b/packages/panier/src/clientAPI.ts
@@ -1,10 +1,6 @@
-import {ActionImpactAPI, PanierAPI} from '@tet/api';
-import {createClient} from '@tet/panier/src/supabase/client';
+import {PanierAPI} from '@tet/api';
+import { createClient } from './supabase/client';
-export const supabase = createClient()
+export const supabase = createClient();
-// @ts-ignore
-export const actionImpactAPI = new ActionImpactAPI(supabase);
-
-// @ts-ignore
export const panierAPI = new PanierAPI(supabase);
From 330f45d5fe418e3689a08e942cc3a92c86d41314 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Thu, 26 Sep 2024 15:44:29 +0200
Subject: [PATCH 27/91] =?UTF-8?q?Corrige=20le=20filtrage=20par=20comp?=
=?UTF-8?q?=C3=A9tences?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../api/src/panier_action_impact/panierAPI.ts | 35 +------------------
1 file changed, 1 insertion(+), 34 deletions(-)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index 5671449d1d..432a9c1825 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -167,40 +167,7 @@ export class PanierAPI {
const {data, error} = await builder.single();
if (error) throw error;
- return sansFiltreCompetences ? data : this.filterActionsCommune(data);
- }
-
- async fetchCollectiviteTypes(collectivite_id: number) {
- const {data, error} = await this.supabase
- .from('collectivite_identite')
- .select('type')
- .eq('id', collectivite_id);
- if (error) throw error;
- const collectivite = data?.[0];
- return collectivite?.type || null;
- }
-
- // filtre a posteriori les actions pour les communes
- async filterActionsCommune(panier: Panier) {
- const collectiviteId = panier.collectivite_id || panier.collectivite_preset;
- if (!collectiviteId) return panier;
-
- // type et compétences de la collectivité
- const collectiviteTypes = await this.fetchCollectiviteTypes(collectiviteId);
-
- // pour les communes : filtre sur les flags “independamment_competences” et/ou “competences_communales”
- if (collectiviteTypes?.includes('commune')) {
- return {
- ...panier,
- states: panier.states.filter(
- state =>
- state.action.independamment_competences ||
- state.action.competences_communales
- ),
- };
- }
-
- return panier;
+ return data;
}
/**
From 7497f57cb943a0a52d7cb3d9b7b9ee3324e9c413 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Thu, 26 Sep 2024 15:50:43 +0200
Subject: [PATCH 28/91] =?UTF-8?q?Ajoute=20l'affichage=20des=20actions=20de?=
=?UTF-8?q?s=20r=C3=A9f=C3=A9rentiels=20li=C3=A9es=20=C3=A0=20une=20action?=
=?UTF-8?q?=20=C3=A0=20impact?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../api/src/panier_action_impact/panierAPI.ts | 3 +-
.../api/src/panier_action_impact/types.ts | 13 ++++-
.../ActionImpact/ModaleActionImpact.tsx | 50 +++++++++++++++----
.../panier/components/ActionImpact/types.ts | 3 ++
.../ListeActions/ListeActionsFiltrees.tsx | 1 +
5 files changed, 59 insertions(+), 11 deletions(-)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index 432a9c1825..92a840779b 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -13,7 +13,8 @@ export const panierSelect =
'*,' +
'thematiques:thematique(*),' +
'fourchette_budgetaire:action_impact_fourchette_budgetaire(*),' +
- 'temps_de_mise_en_oeuvre:action_impact_temps_de_mise_en_oeuvre(*)' +
+ 'temps_de_mise_en_oeuvre:action_impact_temps_de_mise_en_oeuvre(*),' +
+ 'actions_liees:action_definition(identifiant,referentiel,nom)' +
')' +
')';
diff --git a/packages/api/src/panier_action_impact/types.ts b/packages/api/src/panier_action_impact/types.ts
index e0ca83d802..4f792173f1 100644
--- a/packages/api/src/panier_action_impact/types.ts
+++ b/packages/api/src/panier_action_impact/types.ts
@@ -35,7 +35,9 @@ export type ActionImpact = Omit<
/* Le resumé d'une action à impact, utilisé pour les cartes */
export type ActionImpactSnippet =
// todo: Omit
- ActionImpact & {thematiques: ActionImpactThematique[]};
+ ActionImpact & {
+ thematiques: ActionImpactThematique[];
+ };
/* Une action à impact avec des informations complémentaires, utilisé par la modale */
export type ActionImpactDetails = ActionImpact & {
@@ -45,13 +47,22 @@ export type ActionImpactDetails = ActionImpact & {
export type ActionImpactStatut =
Database['public']['Tables']['action_impact_statut']['Row'];
+export type ActionReferentiel = {
+ identifiant: string;
+ referentiel: string;
+ nom: string;
+};
+
export type ActionImpactState = {
action: ActionImpact;
isinpanier: boolean;
statut: ActionImpactStatut | null;
thematiques: ActionImpactThematique[];
+ actions_liees: ActionReferentiel[] | null;
+ matches_competences: boolean;
};
+
export type PanierBase = Database['public']['Tables']['panier']['Row'];
export type Panier =
diff --git a/packages/panier/components/ActionImpact/ModaleActionImpact.tsx b/packages/panier/components/ActionImpact/ModaleActionImpact.tsx
index 4cf3bcdab6..e917ece3d9 100644
--- a/packages/panier/components/ActionImpact/ModaleActionImpact.tsx
+++ b/packages/panier/components/ActionImpact/ModaleActionImpact.tsx
@@ -6,15 +6,22 @@ import {
ModalFooter,
ModalFooterSection,
InfoActionImpact,
+ Card,
} from '@tet/ui';
import Markdown from '@tet/panier/components/Markdown';
+const referentielToName: Record = {
+ cae: 'Climat Air Énergie',
+ eci: 'Économie Circulaire',
+};
+
/**
* Modale action à impact du panier d'actions
*/
export const ModaleActionImpact = (props: ModaleActionImpactProps) => {
const {
children,
+ actionsLiees,
titre,
description,
statut,
@@ -30,15 +37,40 @@ export const ModaleActionImpact = (props: ModaleActionImpactProps) => {
textAlign="left"
render={() => {
return (
-
- }
- />
+ <>
+
+ }
+ />
+ {!!actionsLiees?.length && (
+
+
+ Actions des référentiels liés :
+
+
+ {actionsLiees.map(({identifiant, nom, referentiel}) => (
+
+
+ Référentiel {referentielToName[referentiel]}
+
+
+
+ {identifiant} {nom}
+
+
+ ))}
+
+
+ )}
+ >
);
}}
renderFooter={({close}) => (
diff --git a/packages/panier/components/ActionImpact/types.ts b/packages/panier/components/ActionImpact/types.ts
index 8c1eddc874..a3a67dea9f 100644
--- a/packages/panier/components/ActionImpact/types.ts
+++ b/packages/panier/components/ActionImpact/types.ts
@@ -2,6 +2,7 @@ import {
ActionImpactFourchetteBudgetaire,
ActionImpactTempsMiseEnOeuvre,
ActionImpactThematique,
+ ActionReferentiel,
} from '@tet/api';
type LinkType = {
@@ -28,6 +29,8 @@ export type ActionImpactProps = {
subventions?: LinkType[] | null;
/** Statut de l'action */
statut?: 'non_pertinent' | 'en_cours' | 'realise' | null;
+ /** Actions des référentiels liées */
+ actionsLiees?: ActionReferentiel[] | null;
/** Indique si l'action est mise dans le panier */
panier: boolean;
/** Initialisation de l'état sélectionné de la carte */
diff --git a/packages/panier/components/ListeActions/ListeActionsFiltrees.tsx b/packages/panier/components/ListeActions/ListeActionsFiltrees.tsx
index 5bf04bccda..15602cf73a 100644
--- a/packages/panier/components/ListeActions/ListeActionsFiltrees.tsx
+++ b/packages/panier/components/ListeActions/ListeActionsFiltrees.tsx
@@ -25,6 +25,7 @@ const ListeActionsFiltrees = ({
{actionsListe.map(action => (
Date: Fri, 27 Sep 2024 09:12:56 +0200
Subject: [PATCH 29/91] =?UTF-8?q?G=C3=A8re=20un=20=C3=A9tat=20`disabled`?=
=?UTF-8?q?=20sur=20le=20bouton=20"Cr=C3=A9er=20un=20plan=20d=E2=80=99acti?=
=?UTF-8?q?on"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/ValidationPanier/ValiderPanierButton.tsx | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/packages/panier/components/ValidationPanier/ValiderPanierButton.tsx b/packages/panier/components/ValidationPanier/ValiderPanierButton.tsx
index dd938691f7..0274676242 100644
--- a/packages/panier/components/ValidationPanier/ValiderPanierButton.tsx
+++ b/packages/panier/components/ValidationPanier/ValiderPanierButton.tsx
@@ -1,8 +1,8 @@
'use client';
-import {Button, Modal, useEventTracker} from '@tet/ui';
import {useState} from 'react';
import {useSearchParams} from 'next/navigation';
+import {Button, Modal, useEventTracker} from '@tet/ui';
import ValiderPanierModale from './ValiderPanierModale';
import {usePanierContext} from '@tet/panier/providers';
@@ -12,7 +12,7 @@ import {usePanierContext} from '@tet/panier/providers';
* Contrôle la modale de "Création de plan d’action”
* Si le paramètre `modale` est égal à `creation` la modale est initialement ouverte
*/
-const ValiderPanierButton = () => {
+const ValiderPanierButton = ({disabled}: {disabled?: boolean}) => {
const searchParams = useSearchParams();
const initiallyOpen = searchParams.get('modale') === 'creation';
const [createModalOpen, setCreateModalOpen] = useState(initiallyOpen);
@@ -23,6 +23,7 @@ const ValiderPanierButton = () => {
<>
{
setCreateModalOpen(true);
tracker('cta_valider_creation_panier_click', {
From f61f18a39a294dc54feeda4fa27073f245c2600c Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Fri, 27 Sep 2024 09:14:17 +0200
Subject: [PATCH 30/91] =?UTF-8?q?Affiche=20le=20bouton=20"Retirer=20des=20?=
=?UTF-8?q?actions=20r=C3=A9alis=C3=A9es/en=20cours"=20sur=20les=20cartes?=
=?UTF-8?q?=20plac=C3=A9es=20dans=20une=20de=20ces=20deux=20sous-s=C3=A9le?=
=?UTF-8?q?ctions?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ActionImpact/CarteActionImpact.tsx | 49 ++++++++++---------
1 file changed, 26 insertions(+), 23 deletions(-)
diff --git a/packages/panier/components/ActionImpact/CarteActionImpact.tsx b/packages/panier/components/ActionImpact/CarteActionImpact.tsx
index c6f796ebe9..e775b03d75 100644
--- a/packages/panier/components/ActionImpact/CarteActionImpact.tsx
+++ b/packages/panier/components/ActionImpact/CarteActionImpact.tsx
@@ -42,30 +42,33 @@ export const CarteActionImpact = ({
) : (
- onUpdateStatus?.('en_cours')}
- >
- En cours
-
- onUpdateStatus?.('realise')}
- >
- Réalisée
-
+ {statut === 'en_cours' || statut === 'realise' ? (
+ onUpdateStatus?.(statut)}>
+ Retirer des actions{' '}
+ {statut === 'realise' ? 'réalisées' : 'en cours'}
+
+ ) : (
+ <>
+ onUpdateStatus?.('en_cours')}
+ >
+ En cours
+
+ onUpdateStatus?.('realise')}
+ >
+ Réalisée
+
- handleToggleSelect(true)}>
- Ajouter au panier
-
+ handleToggleSelect(true)}>
+ Ajouter au panier
+
+ >
+ )}
)}
From dec45d89a0506e07dd47ce776879a0d23d1ec4f2 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Fri, 27 Sep 2024 09:15:38 +0200
Subject: [PATCH 31/91] =?UTF-8?q?Affiche=20un=20message=20=C3=A0=20propos?=
=?UTF-8?q?=20de=20l'ajout=20des=20actions=20plac=C3=A9es=20"r=C3=A9alis?=
=?UTF-8?q?=C3=A9es"=20et=20"en=20cours"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../panier/components/ListeActions/index.tsx | 65 +++++++++++++++++--
1 file changed, 58 insertions(+), 7 deletions(-)
diff --git a/packages/panier/components/ListeActions/index.tsx b/packages/panier/components/ListeActions/index.tsx
index 3b045c846d..ae76ad5d7d 100644
--- a/packages/panier/components/ListeActions/index.tsx
+++ b/packages/panier/components/ListeActions/index.tsx
@@ -1,3 +1,4 @@
+/* eslint-disable react/no-unescaped-entities */
import {useSearchParams} from 'next/navigation';
import {
ActionImpactFourchetteBudgetaire,
@@ -5,7 +6,14 @@ import {
ActionImpactTempsMiseEnOeuvre,
ActionImpactThematique,
} from '@tet/api';
-import {PanierOngletName, Tab, Tabs} from '@tet/ui';
+import {
+ Alert,
+ Button,
+ PanierOngletName,
+ SITE_BASE_URL,
+ Tab,
+ Tabs,
+} from '@tet/ui';
import ListeActionsFiltrees from './ListeActionsFiltrees';
import ListeVide from './ListeVide';
import FiltresActions from '@tet/panier/components/FiltresActions';
@@ -92,12 +100,55 @@ const ListeActions = ({
!actionsFiltrees.length ? (
) : (
-
+ <>
+ {(tab.status === 'en_cours' || tab.status === 'realise') && (
+
+ Valorisez ces actions "réalisées" sur l'
+
+ outil numérique
+
+ aux côtés des actions en cours et à venir pour
+ constituer et piloter un plan d'action sur l'outil
+ numérique. Il vous suffit de cocher la case "Ajouter
+ les actions classées comme “réalisées” au niveau du
+ panier à droite.
+
+ ) : (
+
+ Pour retrouver ces actions "en cours" sur l'
+
+ outil numérique
+
+ et les piloter, il vous suffit de cocher la case
+ "Ajouter les actions classées comme “en cours” au
+ niveau du panier à droite.
+
+ )
+ }
+ />
+ )}
+
+ >
)}
);
From 8a2c06b733f81815fce9763ed5a3cac1acf80629 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Fri, 27 Sep 2024 09:23:05 +0200
Subject: [PATCH 32/91] =?UTF-8?q?Ajoute=20les=20cases=20=C3=A0=20cocher=20?=
=?UTF-8?q?(et=20le=20gestionnaire=20d'=C3=A9tat=20associ=C3=A9)=20permett?=
=?UTF-8?q?ant=20d'ajouter/enlever=20la=20s=C3=A9lection=20d'actions=20"r?=
=?UTF-8?q?=C3=A9alis=C3=A9es"=20ou=20"en=20cours"=20du=20panier?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../AjouterActionsRealiseesOuEnCours.tsx | 48 +++++++++++
.../panier/components/PanierActions/index.tsx | 36 ++++++--
...eAjouterActionsRealiseesOuEnCoursState.tsx | 85 +++++++++++++++++++
3 files changed, 161 insertions(+), 8 deletions(-)
create mode 100644 packages/panier/components/PanierActions/AjouterActionsRealiseesOuEnCours.tsx
create mode 100644 packages/panier/components/PanierActions/useAjouterActionsRealiseesOuEnCoursState.tsx
diff --git a/packages/panier/components/PanierActions/AjouterActionsRealiseesOuEnCours.tsx b/packages/panier/components/PanierActions/AjouterActionsRealiseesOuEnCours.tsx
new file mode 100644
index 0000000000..791aa756be
--- /dev/null
+++ b/packages/panier/components/PanierActions/AjouterActionsRealiseesOuEnCours.tsx
@@ -0,0 +1,48 @@
+import {ActionImpactState} from '@tet/api';
+import {Checkbox} from '@tet/ui';
+import classNames from 'classnames';
+import {AjouterActionsRealiseesOuEnCoursState} from './useAjouterActionsRealiseesOuEnCoursState';
+
+/**
+ * Affiche les cases à cocher permettant d'ajouter/enlever la sélection
+ * d'actions "réalisées" ou "en cours" du panier
+ */
+export const AjouterActionsRealiseesOuEnCours = ({
+ className,
+ state,
+}: {
+ className?: string;
+ state: AjouterActionsRealiseesOuEnCoursState;
+}) => {
+ const {
+ nbEnCours,
+ nbEnCoursInPanier,
+ nbRealisees,
+ nbRealiseesInPanier,
+ ajoutEnCours,
+ toggleAjoutEnCours,
+ ajoutRealisees,
+ toggleAjoutRealisees,
+ } = state;
+
+ return nbEnCours + nbRealisees === 0 ? null : (
+
+ {!!nbEnCours && (
+
+ )}
+ {!!nbRealisees && (
+
+ )}
+
+ );
+};
diff --git a/packages/panier/components/PanierActions/index.tsx b/packages/panier/components/PanierActions/index.tsx
index 04f38694d3..a7b73b32cb 100644
--- a/packages/panier/components/PanierActions/index.tsx
+++ b/packages/panier/components/PanierActions/index.tsx
@@ -5,7 +5,8 @@ import EmptyBasketPicto from '@tet/panier/components/Picto/EmptyBasketPicto';
import ValiderPanierButton from '@tet/panier/components/ValidationPanier/ValiderPanierButton';
import {ActionImpactFourchetteBudgetaire, ActionImpactSnippet} from '@tet/api';
import {Alert} from '@tet/ui';
-import React from 'react';
+import {AjouterActionsRealiseesOuEnCours} from './AjouterActionsRealiseesOuEnCours';
+import {useAjouterActionsRealiseesOuEnCoursState} from './useAjouterActionsRealiseesOuEnCoursState';
type PanierActionsProps = {
actionsListe: ActionImpactSnippet[];
@@ -18,20 +19,34 @@ const PanierActions = ({
budgets,
onToggleSelected,
}: PanierActionsProps) => {
+ const ajouterActionsRealiseesOuEnCours =
+ useAjouterActionsRealiseesOuEnCoursState();
+ const {nbEnCours, nbRealisees} = ajouterActionsRealiseesOuEnCours;
+
return (
{actionsListe.length === 0 ? (
-
+
-
-
-
- Votre panier d'actions est vide !
-
+
+
+ {nbEnCours + nbRealisees > 0 && (
+
+ )}
+
+
+
+
+
+ Votre panier d'actions est vide !
+
+
) : (
@@ -45,6 +60,11 @@ const PanierActions = ({
{actionsListe.length} action{actionsListe.length > 1 ? 's' : ''}{' '}
dans mon panier
+
+
diff --git a/packages/panier/components/PanierActions/useAjouterActionsRealiseesOuEnCoursState.tsx b/packages/panier/components/PanierActions/useAjouterActionsRealiseesOuEnCoursState.tsx
new file mode 100644
index 0000000000..f2aa79e610
--- /dev/null
+++ b/packages/panier/components/PanierActions/useAjouterActionsRealiseesOuEnCoursState.tsx
@@ -0,0 +1,85 @@
+import {Panier} from '@tet/api';
+import {useState, useEffect} from 'react';
+import {panierAPI} from 'src/clientAPI';
+import {usePanierContext} from '../../providers';
+
+/**
+ * Fourni les décomptes d'actions réalisées/en cours totaux et ajouter dans le panier
+ * ainsi que des fonctions pour ajouter/enlever une de ces sous-sélections du panier.
+ */
+export const useAjouterActionsRealiseesOuEnCoursState = () => {
+ const {panier} = usePanierContext();
+
+ const {
+ count: nbEnCours,
+ countInPanier: nbEnCoursInPanier,
+ ajout: ajoutEnCours,
+ toggleAjout: toggleAjoutEnCours,
+ } = useToggleAjoutActions(panier, 'en_cours');
+ const {
+ count: nbRealisees,
+ countInPanier: nbRealiseesInPanier,
+ ajout: ajoutRealisees,
+ toggleAjout: toggleAjoutRealisees,
+ } = useToggleAjoutActions(panier, 'realise');
+
+ return {
+ nbEnCours,
+ nbEnCoursInPanier,
+ ajoutEnCours,
+ toggleAjoutEnCours,
+ nbRealisees,
+ nbRealiseesInPanier,
+ ajoutRealisees,
+ toggleAjoutRealisees,
+ };
+};
+export type AjouterActionsRealiseesOuEnCoursState = ReturnType<
+ typeof useAjouterActionsRealiseesOuEnCoursState
+>;
+
+// enlève/ajoute un sous-ensemble d'actions dans le panier
+const useToggleAjoutActions = (
+ panier: Panier | null,
+ subset: 'en_cours' | 'realise',
+) => {
+ const [ajout, setAjout] = useState(false);
+
+ const panierId = panier?.id;
+
+ // le sous-ensemble
+ const actions = panier?.states.filter(
+ state => state.statut?.categorie_id === subset,
+ );
+
+ // nombre d'items total et dans le panier
+ const count = actions?.length ?? 0;
+ const countInPanier =
+ actions?.filter(action => action.isinpanier).length ?? 0;
+
+ // ajoute/enlève les actions du panier
+ const toggleAjout = () => {
+ if (!actions?.length || !panierId) return;
+ if (ajout) {
+ actions.forEach(state =>
+ panierAPI.removeActionFromPanier(state.action.id, panierId),
+ );
+ } else {
+ actions.forEach(state =>
+ panierAPI.addActionToPanier(state.action.id, panierId),
+ );
+ }
+ setAjout(!ajout);
+ };
+
+ // synchronise l'état si il n'y a plus d'actions dans le panier
+ useEffect(() => {
+ if (!countInPanier && ajout) {
+ setAjout(false);
+ } else if (countInPanier && !ajout) {
+ setAjout(true);
+ }
+ }, [countInPanier, ajout]);
+
+ return {ajout, toggleAjout, count, countInPanier};
+};
From c2bbd8e77f22bb5b29ae3976493fb9b0d83c5fdc Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Fri, 27 Sep 2024 09:41:04 +0200
Subject: [PATCH 33/91] =?UTF-8?q?Ajoute=20une=20fonction=20permettant=20d'?=
=?UTF-8?q?obtenir=20l'id=20du=20panier=20d'une=20collectivit=C3=A9=20et?=
=?UTF-8?q?=20le=20nombre=20d'actions=20de=20celui-ci?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../api/src/panier_action_impact/panierAPI.ts | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index 92a840779b..8029658079 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -171,6 +171,23 @@ export class PanierAPI {
return data;
}
+ /**
+ * Renvoi l'id du panier d'une collectivité et le nombre d'actions de celui-ci
+ */
+ async getCollectivitePanierInfo(collectivite_id: number) {
+ const {data, error} = await this.supabase
+ .from('panier')
+ .select('id,actions:action_impact_state(isinpanier)')
+ .or(
+ `collectivite_id.eq.${collectivite_id},collectivite_preset.eq.${collectivite_id}`
+ )
+ .is('action_impact_state.isinpanier', true);
+ if (error) throw error;
+ return data?.[0]
+ ? {panierId: data[0].id, count: data[0].actions?.length ?? 0}
+ : null;
+ }
+
/**
* Crée un plan d'action pour la collectivité à partir d'un panier
*
From 19371ef6842d4337a58761e73e5c763eae4aa7a1 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 30 Sep 2024 16:26:28 +0200
Subject: [PATCH 34/91] Ajoute le lien vers le panier dans l'app
---
.../app/Layout/Header/AccesPanierAction.tsx | 45 +++++++++++++++++++
.../src/app/Layout/Header/AccesRapide.tsx | 6 +++
2 files changed, 51 insertions(+)
create mode 100644 app.territoiresentransitions.react/src/app/Layout/Header/AccesPanierAction.tsx
diff --git a/app.territoiresentransitions.react/src/app/Layout/Header/AccesPanierAction.tsx b/app.territoiresentransitions.react/src/app/Layout/Header/AccesPanierAction.tsx
new file mode 100644
index 0000000000..44c92752aa
--- /dev/null
+++ b/app.territoiresentransitions.react/src/app/Layout/Header/AccesPanierAction.tsx
@@ -0,0 +1,45 @@
+import {useQuery} from 'react-query';
+import {PanierAPI} from '@tet/api';
+import {Button} from '@tet/ui';
+import {supabaseClient} from 'core-logic/api/supabase';
+import {useCollectiviteId} from 'core-logic/hooks/params';
+import {ENV} from 'environmentVariables';
+import classNames from 'classnames';
+
+const panierAPI = new PanierAPI(supabaseClient);
+
+/**
+ * Affiche un bouton d'accès au panier d'actions
+ */
+export const AccesPanierAction = () => {
+ const collectiviteId = useCollectiviteId();
+ const {data} = useNbActionsDansPanier(collectiviteId);
+ const {panierId, count} = data || {};
+
+ return (
+ panierId && (
+ {
+ window.open(`${ENV.panier_url}/panier/${panierId}`, '_blank');
+ }}
+ >
+ Panier d'action
+
+ )
+ );
+};
+
+/**
+ * Charge le nombre d'actions présentes dans le panier d'une collectivité
+ */
+export const useNbActionsDansPanier = (collectiviteId: number | null) => {
+ return useQuery(['nb_actions_dans_panier', collectiviteId], async () => {
+ if (!collectiviteId) return;
+ return panierAPI.getCollectivitePanierInfo(collectiviteId);
+ });
+};
diff --git a/app.territoiresentransitions.react/src/app/Layout/Header/AccesRapide.tsx b/app.territoiresentransitions.react/src/app/Layout/Header/AccesRapide.tsx
index aba22b7bf0..6fcb6dfe64 100644
--- a/app.territoiresentransitions.react/src/app/Layout/Header/AccesRapide.tsx
+++ b/app.territoiresentransitions.react/src/app/Layout/Header/AccesRapide.tsx
@@ -2,6 +2,7 @@ import {signInPath, signUpPath} from 'app/paths';
import {useFonctionTracker} from 'core-logic/hooks/useFonctionTracker';
import MenuUtilisateur from './MenuUtilisateur';
import {HeaderPropsWithModalState} from './types';
+import {AccesPanierAction} from './AccesPanierAction';
/** liens en "accès rapide" */
export const AccesRapide = (props: HeaderPropsWithModalState) => {
@@ -10,6 +11,11 @@ export const AccesRapide = (props: HeaderPropsWithModalState) => {
return (
+ {isConnected && user && (
+
+
+
+ )}
setModalOpened(false)}>
From c39d8fbef7d9afe6fda420dfdeefbdbd654e40ee Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 30 Sep 2024 16:58:11 +0200
Subject: [PATCH 35/91] =?UTF-8?q?Utilise=20les=20composants=20Button=20du?=
=?UTF-8?q?=20DS=20dans=20l'en-t=C3=AAte=20de=20l'app?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
(TODO: utiliser HeaderTeT quand le MenuPrincipal sera intégré dedans)
---
.../src/app/Layout/Header/AccesRapide.tsx | 28 +++++++++----
.../src/app/Layout/Header/MenuUtilisateur.tsx | 42 +++++++++++--------
2 files changed, 43 insertions(+), 27 deletions(-)
diff --git a/app.territoiresentransitions.react/src/app/Layout/Header/AccesRapide.tsx b/app.territoiresentransitions.react/src/app/Layout/Header/AccesRapide.tsx
index 6fcb6dfe64..b7c6f83697 100644
--- a/app.territoiresentransitions.react/src/app/Layout/Header/AccesRapide.tsx
+++ b/app.territoiresentransitions.react/src/app/Layout/Header/AccesRapide.tsx
@@ -3,6 +3,7 @@ import {useFonctionTracker} from 'core-logic/hooks/useFonctionTracker';
import MenuUtilisateur from './MenuUtilisateur';
import {HeaderPropsWithModalState} from './types';
import {AccesPanierAction} from './AccesPanierAction';
+import {Button} from '@tet/ui';
/** liens en "accès rapide" */
export const AccesRapide = (props: HeaderPropsWithModalState) => {
@@ -26,24 +27,30 @@ export const AccesRapide = (props: HeaderPropsWithModalState) => {
) : (
<>
- setModalOpened(false)}
>
Créer un compte
-
+
- setModalOpened(false)}
>
Se connecter
-
+
>
)}
@@ -66,12 +73,15 @@ const Aide = () => {
};
return (
-
Aide
-
+
);
};
diff --git a/app.territoiresentransitions.react/src/app/Layout/Header/MenuUtilisateur.tsx b/app.territoiresentransitions.react/src/app/Layout/Header/MenuUtilisateur.tsx
index 9e118ec2a2..8d1a9eaf47 100644
--- a/app.territoiresentransitions.react/src/app/Layout/Header/MenuUtilisateur.tsx
+++ b/app.territoiresentransitions.react/src/app/Layout/Header/MenuUtilisateur.tsx
@@ -7,6 +7,7 @@ import {TAuthContext, UserData} from 'core-logic/api/auth/AuthProvider';
import DropdownFloater from 'ui/shared/floating-ui/DropdownFloater';
import {HeaderPropsWithModalState} from './types';
import './MenuUtilisateur.css';
+import {Button} from '@tet/ui';
/**
* Affiche le menu associé à l'utilisateur courant
@@ -23,7 +24,7 @@ const MenuUtilisateur = (props: HeaderPropsWithModalState) => {
return (
(
) => (
-
-
- {user.prenom}
-
-
-
+
+ {user.prenom}
+
+
)
);
From 02edd7834bffe43906dba1150e2649c51cd85a23 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 30 Sep 2024 19:05:12 +0200
Subject: [PATCH 36/91] =?UTF-8?q?D=C3=A9termine=20si=20une=20action=20?=
=?UTF-8?q?=C3=A0=20impact=20est=20d=C3=A9j=C3=A0=20import=C3=A9e=20dans?=
=?UTF-8?q?=20un=20PA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../api/src/panier_action_impact/panierAPI.ts | 34 ++++++++++++++++++-
.../api/src/panier_action_impact/types.ts | 1 +
2 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index 8029658079..c50321dd6e 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -168,7 +168,7 @@ export class PanierAPI {
const {data, error} = await builder.single();
if (error) throw error;
- return data;
+ return this.ajouteActionsDejaImportees(data);
}
/**
@@ -188,6 +188,38 @@ export class PanierAPI {
: null;
}
+ /**
+ * Ajoute aux items du tableau `states` un nouveau flag `dejaImportee`
+ * si une action à impact est liée à une fiche action de la collectivité.
+ */
+ async ajouteActionsDejaImportees(panier: Panier) {
+ const collectiviteId =
+ panier?.collectivite_id ?? panier?.collectivite_preset;
+ if (!collectiviteId) {
+ return panier;
+ }
+
+ const {data, error} = await this.supabase
+ .from('fiche_action')
+ .select('action_impact_fiche_action!inner(action_impact_id)')
+ .eq('collectivite_id', collectiviteId);
+ if (error) throw error;
+ const actionsDejaImportees = data?.flatMap(row =>
+ row.action_impact_fiche_action.map(action => action.action_impact_id)
+ );
+ if (!actionsDejaImportees?.length) {
+ return panier;
+ }
+
+ return {
+ ...panier,
+ states: panier.states?.map(state => ({
+ ...state,
+ dejaImportee: actionsDejaImportees.includes(state.action.id),
+ })),
+ };
+ }
+
/**
* Crée un plan d'action pour la collectivité à partir d'un panier
*
diff --git a/packages/api/src/panier_action_impact/types.ts b/packages/api/src/panier_action_impact/types.ts
index 4f792173f1..2fd60da433 100644
--- a/packages/api/src/panier_action_impact/types.ts
+++ b/packages/api/src/panier_action_impact/types.ts
@@ -60,6 +60,7 @@ export type ActionImpactState = {
thematiques: ActionImpactThematique[];
actions_liees: ActionReferentiel[] | null;
matches_competences: boolean;
+ dejaImportee?: boolean;
};
From 8fe36217dcdbc7d2c819b490fc7095918e542b21 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 30 Sep 2024 19:07:50 +0200
Subject: [PATCH 37/91] =?UTF-8?q?Ajoute=20l'onglet=20"fiches=20d=C3=A9j?=
=?UTF-8?q?=C3=A0=20import=C3=A9es"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../panier/components/ListeActions/index.tsx | 32 +++++++++++++++----
.../src/components/tracking/trackingPlan.ts | 6 +++-
2 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/packages/panier/components/ListeActions/index.tsx b/packages/panier/components/ListeActions/index.tsx
index ae76ad5d7d..9c9a6ecab9 100644
--- a/packages/panier/components/ListeActions/index.tsx
+++ b/packages/panier/components/ListeActions/index.tsx
@@ -71,6 +71,15 @@ const ListeActions = ({
},
];
+ const actionsDejaImportees = actionsListe.filter(state => state.dejaImportee);
+ if (actionsDejaImportees.length) {
+ tabsList.push({
+ label: 'Fiches déjà importées',
+ shortName: 'importees',
+ status: 'importees',
+ });
+ }
+
return (
onChangeTab(tabsList[activeTab].shortName)}
@@ -79,12 +88,15 @@ const ListeActions = ({
tabsListClassName="!justify-start mb-0"
>
{...tabsList.map(tab => {
- const actionsFiltrees = actionsListe.filter(
- a =>
- ((!a.statut && a.statut === tab.status) ||
- (a.statut && a.statut.categorie_id === tab.status)) &&
- (tab.status || !a.isinpanier),
- );
+ const actionsFiltrees =
+ tab.shortName === 'importees'
+ ? actionsDejaImportees
+ : actionsListe.filter(
+ a =>
+ ((!a.statut && a.statut === tab.status) ||
+ (a.statut && a.statut.categorie_id === tab.status)) &&
+ (tab.status || !a.isinpanier),
+ );
return (
@@ -142,6 +154,14 @@ const ListeActions = ({
}
/>
)}
+ {tab.shortName === 'importees' && (
+
+ )}
+
=
/**
* Liste des onglets de la page panier
*/
-export type PanierOngletName = 'selection' | 'réalisées' | 'en cours';
+export type PanierOngletName =
+ | 'selection'
+ | 'réalisées'
+ | 'en cours'
+ | 'importees';
/** Pour le tracking de page sans données additionnelles */
type NoProps = {
From b535fe56a5384e075fa3de65955efba721318de0 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 1 Oct 2024 08:46:08 +0200
Subject: [PATCH 38/91] =?UTF-8?q?Evite=20de=20charger=20en=20double=20les?=
=?UTF-8?q?=20informations=20des=20actions=20=C3=A0=20impact?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../api/src/panier_action_impact/panierAPI.ts | 20 ++++++++-----------
.../api/src/panier_action_impact/types.ts | 9 ---------
.../panier/components/PanierActions/index.tsx | 8 ++++----
.../components/PanierRealtime/index.tsx | 2 +-
packages/panier/hooks/useLandingPathname.ts | 4 ++--
5 files changed, 15 insertions(+), 28 deletions(-)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index c50321dd6e..dbd58f284b 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -4,19 +4,15 @@ import { MesCollectivite, Panier, PanierBase } from './types';
/**
* On sélectionne toutes les colonnes du panier : *
- * puis les `action_impact` par la relation `action_impact_panier` que l'on renomme `contenuPanier`
+ * puis les `action_impact` par la relation `action_impact_state` que l'on renomme `states`
*/
-export const panierSelect =
- '*,' +
- 'contenu:action_impact!action_impact_panier(*,thematiques:thematique(*)),' +
- 'states:action_impact_state(' +
- '*,' +
- 'thematiques:thematique(*),' +
- 'fourchette_budgetaire:action_impact_fourchette_budgetaire(*),' +
- 'temps_de_mise_en_oeuvre:action_impact_temps_de_mise_en_oeuvre(*),' +
- 'actions_liees:action_definition(identifiant,referentiel,nom)' +
- ')' +
- ')';
+export const panierSelect = `*,states:action_impact_state(
+ *,
+ thematiques:thematique(*),
+ fourchette_budgetaire:action_impact_fourchette_budgetaire(*),
+ temps_de_mise_en_oeuvre:action_impact_temps_de_mise_en_oeuvre(*),
+ actions_liees:action_definition(identifiant,referentiel,nom)
+)`;
type RealtimePayload = {
type: string;
diff --git a/packages/api/src/panier_action_impact/types.ts b/packages/api/src/panier_action_impact/types.ts
index 2fd60da433..5aa56fad8d 100644
--- a/packages/api/src/panier_action_impact/types.ts
+++ b/packages/api/src/panier_action_impact/types.ts
@@ -32,13 +32,6 @@ export type ActionImpact = Omit<
subventions_mobilisables: Link[];
};
-/* Le resumé d'une action à impact, utilisé pour les cartes */
-export type ActionImpactSnippet =
- // todo: Omit
- ActionImpact & {
- thematiques: ActionImpactThematique[];
- };
-
/* Une action à impact avec des informations complémentaires, utilisé par la modale */
export type ActionImpactDetails = ActionImpact & {
thematiques: ActionImpactThematique[];
@@ -69,8 +62,6 @@ export type PanierBase = Database['public']['Tables']['panier']['Row'];
export type Panier =
/* Le panier en tant que tel */
PanierBase & {
- /* Liste des actions ajoutée au panier */
- contenu: ActionImpactSnippet[];
/* Liste de toutes les actions avec leurs states. */
states: ActionImpactState[];
};
diff --git a/packages/panier/components/PanierActions/index.tsx b/packages/panier/components/PanierActions/index.tsx
index a7b73b32cb..0441f1999a 100644
--- a/packages/panier/components/PanierActions/index.tsx
+++ b/packages/panier/components/PanierActions/index.tsx
@@ -3,13 +3,13 @@ import {ActionImpact} from '@tet/panier/components/ActionImpact';
import BasketPicto from '@tet/panier/components/Picto/BasketPicto';
import EmptyBasketPicto from '@tet/panier/components/Picto/EmptyBasketPicto';
import ValiderPanierButton from '@tet/panier/components/ValidationPanier/ValiderPanierButton';
-import {ActionImpactFourchetteBudgetaire, ActionImpactSnippet} from '@tet/api';
+import {ActionImpactFourchetteBudgetaire, ActionImpactState} from '@tet/api';
import {Alert} from '@tet/ui';
import {AjouterActionsRealiseesOuEnCours} from './AjouterActionsRealiseesOuEnCours';
import {useAjouterActionsRealiseesOuEnCoursState} from './useAjouterActionsRealiseesOuEnCoursState';
type PanierActionsProps = {
- actionsListe: ActionImpactSnippet[];
+ actionsListe: ActionImpactState[];
budgets: ActionImpactFourchetteBudgetaire[];
onToggleSelected: (actionId: number, selected: boolean) => void;
};
@@ -70,12 +70,12 @@ const PanierActions = ({
- {actionsListe.map(action => (
+ {actionsListe.map(({action, thematiques}) => (
b.niveau === action.fourchette_budgetaire,
)}
diff --git a/packages/panier/components/PanierRealtime/index.tsx b/packages/panier/components/PanierRealtime/index.tsx
index 9d16ac09ba..38f1dc6a10 100644
--- a/packages/panier/components/PanierRealtime/index.tsx
+++ b/packages/panier/components/PanierRealtime/index.tsx
@@ -133,7 +133,7 @@ const PanierRealtime = ({
isinpanier)}
budgets={budgets}
onToggleSelected={handleToggleSelected}
/>
diff --git a/packages/panier/hooks/useLandingPathname.ts b/packages/panier/hooks/useLandingPathname.ts
index 07fc19a252..0206b9b814 100644
--- a/packages/panier/hooks/useLandingPathname.ts
+++ b/packages/panier/hooks/useLandingPathname.ts
@@ -13,10 +13,10 @@ const useLandingPathname = () => {
setLandingPathname(pathname);
} else if (collectiviteId) {
setLandingPathname(`/landing/collectivite/${collectiviteId}`);
- } else if (panier?.id && panier.contenu.length > 0) {
+ } else if (panier?.id && panier.states.length > 0) {
setLandingPathname(`/landing/panier/${panier.id}`);
}
- }, [pathname, collectiviteId, panier?.id, panier?.contenu.length]);
+ }, [pathname, collectiviteId, panier?.id, panier?.states.length]);
return landingPathname;
};
From 3b5ffe57edad41d65ec192461e8bcef20c020dc0 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 1 Oct 2024 11:23:07 +0200
Subject: [PATCH 39/91] =?UTF-8?q?Corrige=20un=20libell=C3=A9=20et=20change?=
=?UTF-8?q?=20les=20styles=20des=20titres=20de=20section?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/panier/components/Landing/CommentCaMarche.tsx | 2 +-
packages/panier/components/Landing/index.tsx | 7 ++++---
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/packages/panier/components/Landing/CommentCaMarche.tsx b/packages/panier/components/Landing/CommentCaMarche.tsx
index 17ab6ee466..0927f9a600 100644
--- a/packages/panier/components/Landing/CommentCaMarche.tsx
+++ b/packages/panier/components/Landing/CommentCaMarche.tsx
@@ -1,6 +1,6 @@
export const CommentCaMarche = () => (
<>
- Comment ça marche ?
+ Comment ça marche ?
Explorez les actions disponibles
diff --git a/packages/panier/components/Landing/index.tsx b/packages/panier/components/Landing/index.tsx
index 1c162204c7..58a24c7e68 100644
--- a/packages/panier/components/Landing/index.tsx
+++ b/packages/panier/components/Landing/index.tsx
@@ -15,8 +15,9 @@ const Landing = () => {
>
- Faites vivre la transition écologique sur votre territoire.{' '}
- la transition écologique
+ Faites vivre{' '}
+ la transition écologique sur
+ votre territoire.
Avec le panier d’action à impact, constituez une base d’actions
@@ -47,7 +48,7 @@ const Landing = () => {
containerClassName="bg-white"
>
-
+
Vous êtes une collectivité déjà engagée dans le programme Territoires
Engagés Transition Écologique ?
From c906bb50f9cb139fca48f89dfc5f67db63c1a577 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 1 Oct 2024 11:48:32 +0200
Subject: [PATCH 40/91] =?UTF-8?q?R=C3=A9alise=20le=20filtrage=20sur=20les?=
=?UTF-8?q?=20comp=C3=A9tences=20a=20posteriori=20pour=20qu'il=20ne=20s'ap?=
=?UTF-8?q?plique=20qu'=C3=A0=20l'onglet=20S=C3=A9lection?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../api/src/panier_action_impact/panierAPI.ts | 14 ++-------
packages/panier/app/panier/[id]/page.tsx | 1 -
packages/panier/app/panier/[id]/utils.ts | 2 --
.../panier/components/ListeActions/index.tsx | 29 +++++++++++++++----
4 files changed, 25 insertions(+), 21 deletions(-)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index dbd58f284b..efd3b0ef32 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -7,7 +7,7 @@ import { MesCollectivite, Panier, PanierBase } from './types';
* puis les `action_impact` par la relation `action_impact_state` que l'on renomme `states`
*/
export const panierSelect = `*,states:action_impact_state(
- *,
+ *, matches_competences,
thematiques:thematique(*),
fourchette_budgetaire:action_impact_fourchette_budgetaire(*),
temps_de_mise_en_oeuvre:action_impact_temps_de_mise_en_oeuvre(*),
@@ -106,9 +106,7 @@ export class PanierAPI {
panier_id: string,
thematique_ids: number[],
niveau_budget_ids: number[],
- niveau_temps_ids: number[],
- /** indique que les actions à impact ne sont pas filtrées sur les compétences de la collectivité */
- sansFiltreCompetences: boolean
+ niveau_temps_ids: number[]
): Promise {
const builder = this.supabase
.from('panier')
@@ -154,14 +152,6 @@ export class PanierAPI {
);
}
- if (!sansFiltreCompetences) {
- // @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
- builder.url.searchParams.append(
- 'action_impact_state.matches_competences',
- 'is.true'
- );
- }
-
const {data, error} = await builder.single();
if (error) throw error;
return this.ajouteActionsDejaImportees(data);
diff --git a/packages/panier/app/panier/[id]/page.tsx b/packages/panier/app/panier/[id]/page.tsx
index 9dfe5d11d6..05a68e20dc 100644
--- a/packages/panier/app/panier/[id]/page.tsx
+++ b/packages/panier/app/panier/[id]/page.tsx
@@ -35,7 +35,6 @@ async function Page({
thematique_ids,
budget_ids,
temps_ids,
- sansFiltreCompetences,
);
if (!panier) return notFound();
diff --git a/packages/panier/app/panier/[id]/utils.ts b/packages/panier/app/panier/[id]/utils.ts
index 204f2890d7..21d552933f 100644
--- a/packages/panier/app/panier/[id]/utils.ts
+++ b/packages/panier/app/panier/[id]/utils.ts
@@ -23,7 +23,6 @@ export const fetchPanier = async (
thematique_ids: number[],
budget_ids: number[],
temps_ids: number[],
- sansFiltreCompetences: boolean,
): Promise => {
const supabase = createClient(cookies());
const api = new PanierAPI(supabase);
@@ -33,7 +32,6 @@ export const fetchPanier = async (
thematique_ids,
budget_ids,
temps_ids,
- sansFiltreCompetences,
);
return panier;
diff --git a/packages/panier/components/ListeActions/index.tsx b/packages/panier/components/ListeActions/index.tsx
index 9c9a6ecab9..fb16a1b4f2 100644
--- a/packages/panier/components/ListeActions/index.tsx
+++ b/packages/panier/components/ListeActions/index.tsx
@@ -91,12 +91,9 @@ const ListeActions = ({
const actionsFiltrees =
tab.shortName === 'importees'
? actionsDejaImportees
- : actionsListe.filter(
- a =>
- ((!a.statut && a.statut === tab.status) ||
- (a.statut && a.statut.categorie_id === tab.status)) &&
- (tab.status || !a.isinpanier),
- );
+ : tab.shortName === 'selection'
+ ? filtreSelection({actionsListe, sansFiltreCompetences})
+ : actionsListe.filter(a => a.statut?.categorie_id === tab.status);
return (
@@ -177,4 +174,24 @@ const ListeActions = ({
);
};
+const filtreSelection = ({
+ actionsListe,
+ sansFiltreCompetences,
+}: {
+ actionsListe: ActionImpactState[];
+ sansFiltreCompetences: boolean;
+}) => {
+ // toutes les actions sauf celles qui ont un statut (en
+ // cours/réalisée), celles qui sont déjà dans le panier ou déjà
+ // importées dans un plan
+ const subset = actionsListe.filter(
+ a => a.statut === null && !a.isinpanier && !a.dejaImportee,
+ );
+
+ return sansFiltreCompetences
+ ? subset
+ : subset.filter(a => a.matches_competences);
+};
+
+
export default ListeActions;
From a7fe6d315c5163b777d30d410c6877fa58a92736 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 1 Oct 2024 12:02:09 +0200
Subject: [PATCH 41/91] =?UTF-8?q?Utilise=20la=20nouvelle=20table=20pour=20?=
=?UTF-8?q?l'affichage=20et=20l'=C3=A9dition=20des=20effets=20attendus=20(?=
=?UTF-8?q?anciennement=20"r=C3=A9sultats=20attendus")=20plut=C3=B4t=20qu'?=
=?UTF-8?q?une=20liste=20statique?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Indicateurs/IndicateursHeader.tsx | 7 +++-
.../src/types/alias.ts | 3 +-
.../EffetsAttendusDropdown.tsx | 31 +++++++-------
.../useEffetsAttendus.ts | 14 +++++++
.../src/ui/dropdownLists/listesStatiques.ts | 40 -------------------
5 files changed, 37 insertions(+), 58 deletions(-)
create mode 100644 app.territoiresentransitions.react/src/ui/dropdownLists/ficheAction/EffetsAttendusDropdown/useEffetsAttendus.ts
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/Indicateurs/IndicateursHeader.tsx b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/Indicateurs/IndicateursHeader.tsx
index 192c4cb00a..9279a12036 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/Indicateurs/IndicateursHeader.tsx
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/Indicateurs/IndicateursHeader.tsx
@@ -91,7 +91,12 @@ const IndicateursHeader = ({
{resultats && resultats.length ? (
resultats.map(res => (
-
+
))
) : (
Non renseignés
diff --git a/app.territoiresentransitions.react/src/types/alias.ts b/app.territoiresentransitions.react/src/types/alias.ts
index 1d5c4429d1..61aa6cc6b8 100644
--- a/app.territoiresentransitions.react/src/types/alias.ts
+++ b/app.territoiresentransitions.react/src/types/alias.ts
@@ -66,8 +66,7 @@ export type TFicheActionCibles = Enums<'fiche_action_cibles'>;
export type TFicheActionNiveauxPriorite =
Enums<'fiche_action_niveaux_priorite'>;
export type TFicheActionPiliersECI = Enums<'fiche_action_piliers_eci'>;
-export type TFicheActionResultatsAttendus =
- Enums<'fiche_action_resultats_attendus'>;
+export type TFicheActionResultatsAttendus = Tables<'effet_attendu'>;
export type TFicheActionStatuts = Enums<'fiche_action_statuts'>;
export type TFicheActionEcheances = Enums<'fiche_action_echeances'>;
diff --git a/app.territoiresentransitions.react/src/ui/dropdownLists/ficheAction/EffetsAttendusDropdown/EffetsAttendusDropdown.tsx b/app.territoiresentransitions.react/src/ui/dropdownLists/ficheAction/EffetsAttendusDropdown/EffetsAttendusDropdown.tsx
index 8ff11cb363..04b177fda7 100644
--- a/app.territoiresentransitions.react/src/ui/dropdownLists/ficheAction/EffetsAttendusDropdown/EffetsAttendusDropdown.tsx
+++ b/app.territoiresentransitions.react/src/ui/dropdownLists/ficheAction/EffetsAttendusDropdown/EffetsAttendusDropdown.tsx
@@ -1,31 +1,32 @@
import {SelectFilter, SelectMultipleProps} from '@tet/ui';
import {TFicheActionResultatsAttendus} from 'types/alias';
-import {ficheActionResultatsAttendusOptions} from '../../listesStatiques';
+import {useEffetsAttendus} from './useEffetsAttendus';
type EffetsAttendusDropdownProps = Omit<
SelectMultipleProps,
'values' | 'onChange' | 'options'
> & {
values?: TFicheActionResultatsAttendus[];
- onChange: ({
- effets,
- selectedEffet,
- }: {
- effets: TFicheActionResultatsAttendus[];
- selectedEffet: TFicheActionResultatsAttendus;
- }) => void;
+ onChange: ({effets}: {effets: TFicheActionResultatsAttendus[]}) => void;
};
-const EffetsAttendusDropdown = (props: EffetsAttendusDropdownProps) => {
+const EffetsAttendusDropdown = ({
+ values,
+ onChange,
+}: EffetsAttendusDropdownProps) => {
+ const {data: options} = useEffetsAttendus();
+ if (!options?.length) return;
+
return (
v.id)}
isSearcheable
- options={ficheActionResultatsAttendusOptions}
- onChange={({values, selectedValue}) =>
- props.onChange({
- effets: values as TFicheActionResultatsAttendus[],
- selectedEffet: selectedValue as TFicheActionResultatsAttendus,
+ options={options.map(({id, nom}) => ({value: id, label: nom}))}
+ onChange={({values}) =>
+ onChange({
+ effets: options.filter(v =>
+ values?.includes(v.id)
+ ) as TFicheActionResultatsAttendus[],
})
}
/>
diff --git a/app.territoiresentransitions.react/src/ui/dropdownLists/ficheAction/EffetsAttendusDropdown/useEffetsAttendus.ts b/app.territoiresentransitions.react/src/ui/dropdownLists/ficheAction/EffetsAttendusDropdown/useEffetsAttendus.ts
new file mode 100644
index 0000000000..847a3177e4
--- /dev/null
+++ b/app.territoiresentransitions.react/src/ui/dropdownLists/ficheAction/EffetsAttendusDropdown/useEffetsAttendus.ts
@@ -0,0 +1,14 @@
+import {useQuery} from 'react-query';
+import {supabaseClient} from 'core-logic/api/supabase';
+
+/**
+ * Charge les effets attendus
+ */
+export const useEffetsAttendus = () =>
+ useQuery(['effets_attendus'], async () => {
+ const {data, error} = await supabaseClient.from('effet_attendu').select();
+
+ if (error) throw new Error(error.message);
+
+ return data;
+ });
diff --git a/app.territoiresentransitions.react/src/ui/dropdownLists/listesStatiques.ts b/app.territoiresentransitions.react/src/ui/dropdownLists/listesStatiques.ts
index a103b400c2..0694172a39 100644
--- a/app.territoiresentransitions.react/src/ui/dropdownLists/listesStatiques.ts
+++ b/app.territoiresentransitions.react/src/ui/dropdownLists/listesStatiques.ts
@@ -4,7 +4,6 @@ import {
TFicheActionCibles,
TFicheActionEcheances,
TFicheActionNiveauxPriorite,
- TFicheActionResultatsAttendus,
} from 'types/alias';
type Options = {
@@ -13,45 +12,6 @@ type Options = {
disabled?: boolean;
}[];
-export const ficheActionResultatsAttendusOptions: Options =
- [
- {
- value: 'Adaptation au changement climatique',
- label: 'Adaptation au changement climatique',
- },
- {
- value: 'Allongement de la durée d’usage',
- label: 'Allongement de la durée d’usage',
- },
- {
- value: 'Amélioration de la qualité de vie',
- label: 'Amélioration de la qualité de vie',
- },
- {
- value: 'Développement des énergies renouvelables',
- label: 'Développement des énergies renouvelables',
- },
- { value: 'Efficacité énergétique', label: 'Efficacité énergétique' },
- {
- value: 'Préservation de la biodiversité',
- label: 'Préservation de la biodiversité',
- },
- {
- value: 'Réduction des consommations énergétiques',
- label: 'Réduction des consommations énergétiques',
- },
- { value: 'Réduction des déchets', label: 'Réduction des déchets' },
- {
- value: 'Réduction des polluants atmosphériques',
- label: 'Réduction des polluants atmosphériques',
- },
- {
- value: 'Réduction des émissions de gaz à effet de serre',
- label: 'Réduction des émissions de gaz à effet de serre',
- },
- { value: 'Sobriété énergétique', label: 'Sobriété énergétique' },
- ];
-
export const ficheActionCiblesOptions: Options = [
{
value: 'Grand public et associations',
From 5c5ac2fbc4f3279acff9130a25d958ab073223d9 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 1 Oct 2024 14:11:15 +0200
Subject: [PATCH 42/91] =?UTF-8?q?Change=20la=20mani=C3=A8re=20de=20charger?=
=?UTF-8?q?=20et=20de=20filtrer=20les=20th=C3=A9matiques=20associ=C3=A9es?=
=?UTF-8?q?=20aux=20actions=20=C3=A0=20impact=20pour=20qu'elles=20soient?=
=?UTF-8?q?=20tri=C3=A9es?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/api/src/panier_action_impact/panierAPI.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index efd3b0ef32..76d90b2d18 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -8,7 +8,7 @@ import { MesCollectivite, Panier, PanierBase } from './types';
*/
export const panierSelect = `*,states:action_impact_state(
*, matches_competences,
- thematiques:thematique(*),
+ thematiques:action_impact_thematique(...thematique(id,nom)),
fourchette_budgetaire:action_impact_fourchette_budgetaire(*),
temps_de_mise_en_oeuvre:action_impact_temps_de_mise_en_oeuvre(*),
actions_liees:action_definition(identifiant,referentiel,nom)
From 67b43aa1f327aa76a63b52e8d7f4a4af4b7c1f28 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 1 Oct 2024 14:59:13 +0200
Subject: [PATCH 43/91] Ajoute le tracking du bouton "copier le lien du panier"
---
.../components/PanierRealtime/PartagerLeLien.tsx | 10 ++++++++--
packages/panier/components/PanierRealtime/index.tsx | 2 +-
packages/ui/src/components/tracking/trackingPlan.ts | 2 ++
3 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/packages/panier/components/PanierRealtime/PartagerLeLien.tsx b/packages/panier/components/PanierRealtime/PartagerLeLien.tsx
index 40999d0966..1293c0dbd6 100644
--- a/packages/panier/components/PanierRealtime/PartagerLeLien.tsx
+++ b/packages/panier/components/PanierRealtime/PartagerLeLien.tsx
@@ -1,17 +1,19 @@
'use client';
import {useEffect, useState} from 'react';
-import {Card, Button, Icon, useCopyToClipboard} from '@tet/ui';
+import {Card, Button, Icon, useCopyToClipboard, useEventTracker} from '@tet/ui';
+import {Panier} from '@tet/api';
import Membres from '@components/Picto/Membres';
/**
* Affiche l'encadré invitant au partage du lien vers le panier
*/
-export const PartagerLeLien = () => {
+export const PartagerLeLien = ({panier}: {panier: Panier}) => {
const [opened, setOpened] = useState(true);
const [copied, setCopied] = useState(false);
const [timeoutId, setTimeoutId] = useState(null);
const {copy} = useCopyToClipboard();
+ const tracker = useEventTracker('panier/panier');
// TODO: remplacer ça par le composant Toast de l'app et du site
// (à mutualiser dans le package ui)
@@ -59,6 +61,10 @@ export const PartagerLeLien = () => {
onClick={() => {
copy(document.location.href);
setCopied(true);
+ tracker('copier_panier_URL', {
+ collectivite_preset: panier.collectivite_preset,
+ panier_id: panier.id,
+ });
}}
>
Copier le lien du panier
diff --git a/packages/panier/components/PanierRealtime/index.tsx b/packages/panier/components/PanierRealtime/index.tsx
index 38f1dc6a10..26639ed4eb 100644
--- a/packages/panier/components/PanierRealtime/index.tsx
+++ b/packages/panier/components/PanierRealtime/index.tsx
@@ -138,7 +138,7 @@ const PanierRealtime = ({
onToggleSelected={handleToggleSelected}
/>
-
+
);
};
diff --git a/packages/ui/src/components/tracking/trackingPlan.ts b/packages/ui/src/components/tracking/trackingPlan.ts
index 1196b5c66d..cd26f93200 100644
--- a/packages/ui/src/components/tracking/trackingPlan.ts
+++ b/packages/ui/src/components/tracking/trackingPlan.ts
@@ -297,6 +297,8 @@ export interface TrackingPlan extends Record {
action_id: number;
category_id: string | null;
};
+ /** Bouton "copier le lien du panier" */
+ copier_panier_URL: {};
/* Le bouton "valider la création" affiché dans le panier */
cta_valider_creation_panier_click: {};
/* Le bouton "créer le plan d'action" affiché dans la modale */
From c7d61eed346768392ad615d026244d8769647e28 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 1 Oct 2024 15:21:49 +0200
Subject: [PATCH 44/91] =?UTF-8?q?Corrige=20le=20tracking=20du=20filtre=20s?=
=?UTF-8?q?ur=20les=20comp=C3=A9tences?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/panier/components/FiltresActions/index.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/panier/components/FiltresActions/index.tsx b/packages/panier/components/FiltresActions/index.tsx
index f5345dc811..57ef99dca7 100644
--- a/packages/panier/components/FiltresActions/index.tsx
+++ b/packages/panier/components/FiltresActions/index.tsx
@@ -99,7 +99,7 @@ const FiltresActions = ({
thematique_ids: thematiquesValues,
niveau_budget_ids: budgetsValues,
niveau_temps_ids: tempsValues,
- match_competences: sansFiltreCompetencesValue,
+ match_competences: !sansFiltreCompetencesValue,
});
router.push(href, { scroll: false });
};
From f902e6866e6513460db908df6059d122136f5edb Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 1 Oct 2024 16:06:34 +0200
Subject: [PATCH 45/91] Ajoute le tracking du bouton "action issue du panier"
---
.../FicheAction/FicheActionImpact.tsx | 2 +-
.../FicheActionImpact/ModaleActionImpact.tsx | 16 +++++++++++++++-
.../ui/src/components/tracking/trackingPlan.ts | 1 +
3 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact.tsx b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact.tsx
index 7ab6b4cc0c..b6671d310b 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact.tsx
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact.tsx
@@ -2,7 +2,7 @@ import classNames from 'classnames';
import {Icon, Notification} from '@tet/ui';
import {FicheAction} from './data/types';
import {useFicheActionImpactId} from './data/useFicheActionImpactId';
-import {ModaleActionImpact} from 'app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/ModaleActionImpact';
+import {ModaleActionImpact} from './FicheActionImpact/ModaleActionImpact';
type FicheActionImpactProps = {
fiche: FicheAction;
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/ModaleActionImpact.tsx b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/ModaleActionImpact.tsx
index 29c9ef41f7..82a28ced94 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/ModaleActionImpact.tsx
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/ModaleActionImpact.tsx
@@ -1,4 +1,6 @@
-import {Modal, InfoActionImpact} from '@tet/ui';
+import {useState} from 'react';
+import {Modal, InfoActionImpact, useEventTracker} from '@tet/ui';
+import {useCollectiviteId} from 'core-logic/hooks/params';
import {useActionImpact} from './useActionImpact';
import Markdown from 'ui/Markdown';
@@ -13,6 +15,9 @@ type ModaleActionImpactProps = {
export const ModaleActionImpact = (props: ModaleActionImpactProps) => {
const {actionImpactId, children} = props;
const {data: action} = useActionImpact(actionImpactId);
+ const [isOpen, setIsOpen] = useState(false);
+ const trackEvent = useEventTracker('app/fiche-action');
+ const collectivite_id = useCollectiviteId()!;
if (!action) {
return null;
@@ -24,6 +29,15 @@ export const ModaleActionImpact = (props: ModaleActionImpactProps) => {
size="lg"
title={titre}
textAlign="left"
+ openState={{
+ isOpen,
+ setIsOpen: opened => {
+ if (opened) {
+ trackEvent('cta_fa_fai', {collectivite_id});
+ }
+ setIsOpen(opened);
+ },
+ }}
render={() => {
return (
{
validation_modale_acteurs_fa: {};
validation_modale_planning_fa: {};
cta_indicateur_perso_fa: {};
+ cta_fa_fai: {};
};
};
From 2e7a83c39182a6c594670697f623c55ca5409b91 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 1 Oct 2024 16:29:46 +0200
Subject: [PATCH 46/91] =?UTF-8?q?Ajoute=20le=20tracking=20des=20boutons=20?=
=?UTF-8?q?de=20la=20page=20"cr=C3=A9er=20un=20plan=20d'action"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../ParcoursCreationPlan/Selection.tsx | 71 +++++++++++--------
.../src/components/tracking/trackingPlan.ts | 11 +++
2 files changed, 53 insertions(+), 29 deletions(-)
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/Selection.tsx b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/Selection.tsx
index 9c1ebce29c..8c43fb38eb 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/Selection.tsx
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/ParcoursCreationPlan/Selection.tsx
@@ -10,7 +10,7 @@ import {useHistory} from 'react-router-dom';
import {ReactComponent as DocumentAddPicto} from './document-add.svg';
import {ReactComponent as DocumentDownloadPicto} from './document-download.svg';
import {ReactComponent as ShoppingBasket} from './shopping-basket.svg';
-import {Button} from '@tet/ui';
+import {Button, TrackingPlan, useEventTracker} from '@tet/ui';
const Selection = () => {
const collectivite_id = useCollectiviteId();
@@ -34,6 +34,7 @@ const Selection = () => {
url={makeCollectivitePlansActionsCreerUrl({
collectiviteId: collectivite_id!,
})}
+ trackingId="cta_creer"
/>
{
url={makeCollectivitePlansActionsImporterUrl({
collectiviteId: collectivite_id!,
})}
+ trackingId="cta_importer"
/>
{
url={makeCollectivitePanierUrl({
collectiviteId: collectivite_id!,
})}
+ trackingId="cta_commencer_pai"
/>
(
-
+ );
+};
diff --git a/packages/ui/src/components/tracking/trackingPlan.ts b/packages/ui/src/components/tracking/trackingPlan.ts
index 21c11e28fd..cb63b888dc 100644
--- a/packages/ui/src/components/tracking/trackingPlan.ts
+++ b/packages/ui/src/components/tracking/trackingPlan.ts
@@ -194,6 +194,17 @@ export interface TrackingPlan extends Record {
};
};
+ /** Page "créer un plan" */
+ 'app/creer-plan': {
+ properties: {collectivite_id: number};
+ onglets: never;
+ events: {
+ cta_creer: {};
+ cta_importer: {};
+ cta_commencer_pai: {};
+ };
+ };
+
/** Trajectoire SNBC territorialisée */
'app/trajectoires/snbc': {
properties: {
From f923a3cdc6584f10f1dfe8faa1055a241f677a74 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 1 Oct 2024 17:20:31 +0200
Subject: [PATCH 47/91] =?UTF-8?q?Ajoute=20le=20chargement=20de=20la=20typo?=
=?UTF-8?q?logie=20des=20actions=20=C3=A0=20impact?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/api/src/panier_action_impact/panierAPI.ts | 1 +
packages/api/src/panier_action_impact/types.ts | 4 ++++
2 files changed, 5 insertions(+)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index 76d90b2d18..8294d904f3 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -9,6 +9,7 @@ import { MesCollectivite, Panier, PanierBase } from './types';
export const panierSelect = `*,states:action_impact_state(
*, matches_competences,
thematiques:action_impact_thematique(...thematique(id,nom)),
+ typologie:action_impact_typologie(*),
fourchette_budgetaire:action_impact_fourchette_budgetaire(*),
temps_de_mise_en_oeuvre:action_impact_temps_de_mise_en_oeuvre(*),
actions_liees:action_definition(identifiant,referentiel,nom)
diff --git a/packages/api/src/panier_action_impact/types.ts b/packages/api/src/panier_action_impact/types.ts
index 5aa56fad8d..954835ef47 100644
--- a/packages/api/src/panier_action_impact/types.ts
+++ b/packages/api/src/panier_action_impact/types.ts
@@ -8,6 +8,9 @@ export type ActionImpactThematique = Omit<
'md_id'
>;
+export type ActionImpactTypologie =
+ Database['public']['Tables']['action_impact_typologie']['Row'];
+
export type Niveau = {niveau: number; nom: string};
export type ActionImpactFourchetteBudgetaire =
@@ -51,6 +54,7 @@ export type ActionImpactState = {
isinpanier: boolean;
statut: ActionImpactStatut | null;
thematiques: ActionImpactThematique[];
+ typologie: ActionImpactTypologie;
actions_liees: ActionReferentiel[] | null;
matches_competences: boolean;
dejaImportee?: boolean;
From 0288b22620a8210f6ff772bd9d725ce56d594d89 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 1 Oct 2024 17:23:43 +0200
Subject: [PATCH 48/91] =?UTF-8?q?Ajoute=20l'affichage=20de=20la=20typologi?=
=?UTF-8?q?e=20dans=20le=20d=C3=A9tail=20et=20la=20preview=20d'une=20actio?=
=?UTF-8?q?n=20=C3=A0=20impact?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/panier/components/ActionImpact/CarteActionImpact.tsx | 4 ++++
.../panier/components/ActionImpact/ModaleActionImpact.tsx | 2 ++
packages/panier/components/ActionImpact/types.ts | 4 ++++
.../panier/components/ListeActions/ListeActionsFiltrees.tsx | 1 +
packages/panier/components/PanierActions/index.tsx | 3 ++-
5 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/packages/panier/components/ActionImpact/CarteActionImpact.tsx b/packages/panier/components/ActionImpact/CarteActionImpact.tsx
index e775b03d75..2e6f0263e1 100644
--- a/packages/panier/components/ActionImpact/CarteActionImpact.tsx
+++ b/packages/panier/components/ActionImpact/CarteActionImpact.tsx
@@ -10,6 +10,7 @@ import NiveauBudget from './NiveauBudget';
export const CarteActionImpact = ({
titre,
thematiques,
+ typologie,
budget,
panier,
isSelected,
@@ -25,6 +26,9 @@ export const CarteActionImpact = ({
isSelected={isSelected}
footer={
+ {!!typologie && (
+
{typologie.nom}
+ )}
{/* Badge thématique */}
{!!thematiques.length && (
diff --git a/packages/panier/components/ActionImpact/ModaleActionImpact.tsx b/packages/panier/components/ActionImpact/ModaleActionImpact.tsx
index e917ece3d9..3914e8ba77 100644
--- a/packages/panier/components/ActionImpact/ModaleActionImpact.tsx
+++ b/packages/panier/components/ActionImpact/ModaleActionImpact.tsx
@@ -23,6 +23,7 @@ export const ModaleActionImpact = (props: ModaleActionImpactProps) => {
children,
actionsLiees,
titre,
+ typologie,
description,
statut,
panier,
@@ -34,6 +35,7 @@ export const ModaleActionImpact = (props: ModaleActionImpactProps) => {
{
return (
diff --git a/packages/panier/components/ActionImpact/types.ts b/packages/panier/components/ActionImpact/types.ts
index a3a67dea9f..9048958813 100644
--- a/packages/panier/components/ActionImpact/types.ts
+++ b/packages/panier/components/ActionImpact/types.ts
@@ -2,6 +2,7 @@ import {
ActionImpactFourchetteBudgetaire,
ActionImpactTempsMiseEnOeuvre,
ActionImpactThematique,
+ ActionImpactTypologie,
ActionReferentiel,
} from '@tet/api';
@@ -15,6 +16,8 @@ export type ActionImpactProps = {
titre: string;
/** Thématiques de l'action à impact */
thematiques: ActionImpactThematique[];
+ /** Typologie */
+ typologie: ActionImpactTypologie | null;
/** Budget de la mise en place de l'action : petit, moyen ou élevé */
budget?: ActionImpactFourchetteBudgetaire;
/** Description de l'action à impact */
@@ -50,6 +53,7 @@ export type CarteActionImpactProps = Pick<
ActionImpactProps,
| 'titre'
| 'thematiques'
+ | 'typologie'
| 'budget'
| 'statut'
| 'panier'
diff --git a/packages/panier/components/ListeActions/ListeActionsFiltrees.tsx b/packages/panier/components/ListeActions/ListeActionsFiltrees.tsx
index 15602cf73a..5486058229 100644
--- a/packages/panier/components/ListeActions/ListeActionsFiltrees.tsx
+++ b/packages/panier/components/ListeActions/ListeActionsFiltrees.tsx
@@ -28,6 +28,7 @@ const ListeActionsFiltrees = ({
actionsLiees={action.actions_liees}
titre={action.action.titre}
thematiques={action.thematiques}
+ typologie={action.typologie}
budget={budgets.find(
b => b.niveau === action.action.fourchette_budgetaire
)}
diff --git a/packages/panier/components/PanierActions/index.tsx b/packages/panier/components/PanierActions/index.tsx
index 0441f1999a..8334afe417 100644
--- a/packages/panier/components/PanierActions/index.tsx
+++ b/packages/panier/components/PanierActions/index.tsx
@@ -70,10 +70,11 @@ const PanierActions = ({
- {actionsListe.map(({action, thematiques}) => (
+ {actionsListe.map(({action, thematiques, typologie}) => (
Date: Tue, 1 Oct 2024 18:36:36 +0200
Subject: [PATCH 49/91] =?UTF-8?q?Ajoute=20l'affichage=20de=20la=20typologi?=
=?UTF-8?q?e=20dans=20le=20d=C3=A9tail=20d'une=20action=20=C3=A0=20impact?=
=?UTF-8?q?=20(depuis=20une=20fiche=20action)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../FicheAction/FicheActionImpact/ModaleActionImpact.tsx | 3 ++-
.../FicheAction/FicheActionImpact/useActionImpact.ts | 8 +++++++-
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/ModaleActionImpact.tsx b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/ModaleActionImpact.tsx
index 82a28ced94..f3a58330b1 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/ModaleActionImpact.tsx
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/ModaleActionImpact.tsx
@@ -23,11 +23,12 @@ export const ModaleActionImpact = (props: ModaleActionImpactProps) => {
return null;
}
- const {titre, description} = action;
+ const {titre, description, typologie} = action;
return (
.from('action_impact')
.select(
`titre,
+ typologie:action_impact_typologie(*),
thematiques:action_impact_thematique(...thematique(id,nom)),
budget:action_impact_fourchette_budgetaire(*),
miseEnOeuvre:action_impact_temps_de_mise_en_oeuvre(*),
From 1609c23a076a0150830efd6d1c6d68b96a06d52a Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Tue, 1 Oct 2024 18:59:12 +0200
Subject: [PATCH 50/91] =?UTF-8?q?Ajoute=20le=20filtrage=20par=20typologie?=
=?UTF-8?q?=20des=20actions=20=C3=A0=20impact?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../api/src/panier_action_impact/panierAPI.ts | 34 +++++++++++++++----
.../panier/app/panier/[id]/PagePanier.tsx | 2 ++
packages/panier/app/panier/[id]/page.tsx | 18 +++++++---
packages/panier/app/panier/[id]/utils.ts | 33 +++++++++++++-----
.../components/FiltresActions/index.tsx | 25 +++++++++++++-
.../panier/components/ListeActions/index.tsx | 11 +++++-
.../components/PanierRealtime/index.tsx | 5 ++-
7 files changed, 106 insertions(+), 22 deletions(-)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index 8294d904f3..1814cc33ae 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -103,16 +103,23 @@ export class PanierAPI {
}
}
- async fetchPanier(
- panier_id: string,
- thematique_ids: number[],
- niveau_budget_ids: number[],
- niveau_temps_ids: number[]
- ): Promise {
+ async fetchPanier({
+ panierId,
+ thematique_ids,
+ typologie_ids,
+ niveau_budget_ids,
+ niveau_temps_ids,
+ }: {
+ panierId: string;
+ thematique_ids: number[];
+ typologie_ids: number[];
+ niveau_budget_ids: number[];
+ niveau_temps_ids: number[];
+ }): Promise {
const builder = this.supabase
.from('panier')
.select(panierSelect)
- .eq('id', panier_id);
+ .eq('id', panierId);
if (thematique_ids && thematique_ids.length > 0) {
// @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
@@ -127,6 +134,19 @@ export class PanierAPI {
);
}
+ if (typologie_ids && typologie_ids.length > 0) {
+ // @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
+ builder.url.searchParams.append(
+ 'action_impact_state.typologie.id',
+ `in.(${typologie_ids.join(',')})`
+ );
+ // @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
+ builder.url.searchParams.append(
+ 'action_impact_state.typologie',
+ 'not.is.null'
+ );
+ }
+
if (niveau_budget_ids && niveau_budget_ids.length > 0) {
// @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
builder.url.searchParams.append(
diff --git a/packages/panier/app/panier/[id]/PagePanier.tsx b/packages/panier/app/panier/[id]/PagePanier.tsx
index 5b0db2dc76..f76546d4d9 100644
--- a/packages/panier/app/panier/[id]/PagePanier.tsx
+++ b/packages/panier/app/panier/[id]/PagePanier.tsx
@@ -6,6 +6,7 @@ import {
ActionImpactFourchetteBudgetaire,
ActionImpactTempsMiseEnOeuvre,
ActionImpactThematique,
+ ActionImpactTypologie,
Panier,
} from '@tet/api';
import {ControlledAlert} from '@tet/ui';
@@ -15,6 +16,7 @@ type PagePanierProps = {
budgets: ActionImpactFourchetteBudgetaire[];
temps: ActionImpactTempsMiseEnOeuvre[];
thematiques: ActionImpactThematique[];
+ typologies: ActionImpactTypologie[];
sansFiltreCompetences: boolean;
};
diff --git a/packages/panier/app/panier/[id]/page.tsx b/packages/panier/app/panier/[id]/page.tsx
index 05a68e20dc..b4794c3a28 100644
--- a/packages/panier/app/panier/[id]/page.tsx
+++ b/packages/panier/app/panier/[id]/page.tsx
@@ -1,7 +1,7 @@
import { extractIdsFromParam } from '@tet/panier/src/utils/extractIdsFromParam';
import { notFound } from 'next/navigation';
import PagePanier from './PagePanier';
-import { fetchNiveaux, fetchPanier, fetchThematiques } from './utils';
+import { fetchNiveaux, fetchPanier, fetchThematiques, fetchTypologies } from './utils';
import { TrackPageView } from '@tet/ui';
/**
@@ -26,22 +26,25 @@ async function Page({
}) {
const panierId = params.id;
const thematique_ids = extractIdsFromParam(searchParams['t'] as string);
+ const typologie_ids = extractIdsFromParam(searchParams['ty'] as string);
const budget_ids = extractIdsFromParam(searchParams['b'] as string);
const temps_ids = extractIdsFromParam(searchParams['m'] as string);
const sansFiltreCompetences = searchParams['c'] === 'true';
- const panier = await fetchPanier(
+ const panier = await fetchPanier({
panierId,
thematique_ids,
+ typologie_ids,
budget_ids,
temps_ids,
- );
+ });
if (!panier) return notFound();
const budgets = await fetchNiveaux('action_impact_fourchette_budgetaire');
const temps = await fetchNiveaux('action_impact_temps_de_mise_en_oeuvre');
const thematiques = await fetchThematiques();
+ const typologies = await fetchTypologies();
return (
<>
@@ -53,7 +56,14 @@ async function Page({
}}
/>
>
);
diff --git a/packages/panier/app/panier/[id]/utils.ts b/packages/panier/app/panier/[id]/utils.ts
index 21d552933f..98a45fc4a0 100644
--- a/packages/panier/app/panier/[id]/utils.ts
+++ b/packages/panier/app/panier/[id]/utils.ts
@@ -1,6 +1,7 @@
import {
ActionImpactCategorie,
ActionImpactThematique,
+ ActionImpactTypologie,
Niveau,
Panier,
PanierAPI,
@@ -18,21 +19,29 @@ const getInit = {
},
};
-export const fetchPanier = async (
- panierId: string,
- thematique_ids: number[],
- budget_ids: number[],
- temps_ids: number[],
-): Promise => {
+export const fetchPanier = async ({
+ panierId,
+ thematique_ids,
+ typologie_ids,
+ budget_ids,
+ temps_ids,
+}: {
+ panierId: string;
+ thematique_ids: number[];
+ typologie_ids: number[];
+ budget_ids: number[];
+ temps_ids: number[];
+}): Promise => {
const supabase = createClient(cookies());
const api = new PanierAPI(supabase);
- const panier: Panier | null = await api.fetchPanier(
+ const panier: Panier | null = await api.fetchPanier({
panierId,
thematique_ids,
+ typologie_ids,
budget_ids,
temps_ids,
- );
+ });
return panier;
};
@@ -53,6 +62,14 @@ export const fetchThematiques = async (): Promise => {
return await response.json();
};
+export const fetchTypologies = async (): Promise => {
+ const response = await fetch(
+ `${apiUrl}/rest/v1/action_impact_typologie?select=id,nom`,
+ getInit,
+ );
+ return await response.json();
+};
+
export const fetchNiveaux = async (
table:
| 'action_impact_complexite'
diff --git a/packages/panier/components/FiltresActions/index.tsx b/packages/panier/components/FiltresActions/index.tsx
index 57ef99dca7..4cb28f1f45 100644
--- a/packages/panier/components/FiltresActions/index.tsx
+++ b/packages/panier/components/FiltresActions/index.tsx
@@ -6,6 +6,7 @@ import {
ActionImpactFourchetteBudgetaire,
ActionImpactTempsMiseEnOeuvre,
ActionImpactThematique,
+ ActionImpactTypologie,
} from '@tet/api';
import {
OptionValue,
@@ -19,6 +20,7 @@ type FiltresActionsProps = {
budgets: ActionImpactFourchetteBudgetaire[];
temps: ActionImpactTempsMiseEnOeuvre[];
thematiques: ActionImpactThematique[];
+ typologies: ActionImpactTypologie[];
sansFiltreCompetences: boolean;
};
@@ -26,6 +28,7 @@ const FiltresActions = ({
budgets,
temps,
thematiques,
+ typologies,
sansFiltreCompetences,
}: FiltresActionsProps) => {
const router = useRouter();
@@ -37,6 +40,9 @@ const FiltresActions = ({
const [thematiquesValues, setThematiquesValues] = useState<
OptionValue[] | undefined
>();
+ const [typologiesValues, setTypologiesValues] = useState<
+ OptionValue[] | undefined
+ >();
const [budgetsValues, setBudgetsValues] = useState<
OptionValue[] | undefined
>();
@@ -51,7 +57,11 @@ const FiltresActions = ({
const thematiquesParams = searchParams
.get('t')
?.split(',')
- .map((val) => parseInt(val));
+ .map(val => parseInt(val));
+ const typologiesParams = searchParams
+ .get('ty')
+ ?.split(',')
+ .map(val => parseInt(val));
const budgetsParams = searchParams
.get('b')
?.split(',')
@@ -63,6 +73,7 @@ const FiltresActions = ({
const competencesParams = searchParams.get('c');
if (thematiquesParams) setThematiquesValues(thematiquesParams);
+ if (typologiesParams) setTypologiesValues(typologiesParams);
if (budgetsParams) setBudgetsValues(budgetsParams);
if (tempsParams) setTempsValues(tempsParams);
setSansFiltreCompetencesValue(competencesParams === 'true');
@@ -77,6 +88,9 @@ const FiltresActions = ({
if (!!thematiquesValues && thematiquesValues?.length > 0) {
paramsArray.push(`t=${thematiquesValues.join(',')}`);
}
+ if (!!typologiesValues && typologiesValues?.length > 0) {
+ paramsArray.push(`ty=${typologiesValues.join(',')}`);
+ }
if (!!budgetsValues && budgetsValues?.length > 0) {
paramsArray.push(`b=${budgetsValues.join(',')}`);
}
@@ -97,6 +111,7 @@ const FiltresActions = ({
collectivite_preset: panier?.collectivite_preset ?? null,
panier_id: panier?.id ?? '',
thematique_ids: thematiquesValues,
+ typologies_ids: typologiesValues,
niveau_budget_ids: budgetsValues,
niveau_temps_ids: tempsValues,
match_competences: !sansFiltreCompetencesValue,
@@ -108,6 +123,7 @@ const FiltresActions = ({
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [
thematiquesValues?.length,
+ typologiesValues?.length,
budgetsValues?.length,
tempsValues?.length,
sansFiltreCompetencesValue,
@@ -124,6 +140,13 @@ const FiltresActions = ({
setThematiquesValues((args as SelectMultipleOnChangeArgs).values),
multiple: true,
},
+ {
+ title: 'Typologies',
+ options: typologies.map(t => ({value: t.id, label: t.nom})),
+ values: typologiesValues,
+ onChange: ({values}) => setTypologiesValues(values),
+ multiple: true,
+ },
{
title: 'Ordre de grandeur budgétaire',
tag: 'Budget',
diff --git a/packages/panier/components/ListeActions/index.tsx b/packages/panier/components/ListeActions/index.tsx
index fb16a1b4f2..5a9f8e3a0a 100644
--- a/packages/panier/components/ListeActions/index.tsx
+++ b/packages/panier/components/ListeActions/index.tsx
@@ -5,6 +5,7 @@ import {
ActionImpactState,
ActionImpactTempsMiseEnOeuvre,
ActionImpactThematique,
+ ActionImpactTypologie,
} from '@tet/api';
import {
Alert,
@@ -39,6 +40,7 @@ type ListeActionsProps = {
budgets: ActionImpactFourchetteBudgetaire[];
temps: ActionImpactTempsMiseEnOeuvre[];
thematiques: ActionImpactThematique[];
+ typologies: ActionImpactTypologie[];
sansFiltreCompetences: boolean;
onToggleSelected: (actionId: number, selected: boolean) => void;
onUpdateStatus: (actionId: number, statusId: string | null) => void;
@@ -50,6 +52,7 @@ const ListeActions = ({
budgets,
temps,
thematiques,
+ typologies,
sansFiltreCompetences,
onToggleSelected,
onUpdateStatus,
@@ -98,7 +101,13 @@ const ListeActions = ({
return (
{!tab.status &&
diff --git a/packages/panier/components/PanierRealtime/index.tsx b/packages/panier/components/PanierRealtime/index.tsx
index 26639ed4eb..1690b898fc 100644
--- a/packages/panier/components/PanierRealtime/index.tsx
+++ b/packages/panier/components/PanierRealtime/index.tsx
@@ -6,6 +6,7 @@ import {
ActionImpactFourchetteBudgetaire,
ActionImpactTempsMiseEnOeuvre,
ActionImpactThematique,
+ ActionImpactTypologie,
Panier,
} from '@tet/api';
import { PanierOngletName, useEventTracker, useOngletTracker } from '@tet/ui';
@@ -24,6 +25,7 @@ type PanierRealtimeProps = {
budgets: ActionImpactFourchetteBudgetaire[];
temps: ActionImpactTempsMiseEnOeuvre[];
thematiques: ActionImpactThematique[];
+ typologies: ActionImpactTypologie[];
sansFiltreCompetences: boolean;
};
@@ -41,6 +43,7 @@ const PanierRealtime = ({
budgets,
temps,
thematiques,
+ typologies,
sansFiltreCompetences,
}: PanierRealtimeProps) => {
const [currentTab, setCurrentTab] = useState('selection');
@@ -128,7 +131,7 @@ const PanierRealtime = ({
onToggleSelected={handleToggleSelected}
onUpdateStatus={handleUpdateStatus}
onChangeTab={handleChangeTab}
- {...{budgets, temps, thematiques, sansFiltreCompetences}}
+ {...{budgets, temps, thematiques, typologies, sansFiltreCompetences}}
/>
From 99787335e08cbb33bb932d6c74469fbb220409f5 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 2 Oct 2024 09:10:36 +0200
Subject: [PATCH 51/91] =?UTF-8?q?Affiche=20les=20actions=20du=20panier=20r?=
=?UTF-8?q?egroup=C3=A9es=20par=20statut?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../panier/components/PanierActions/index.tsx | 97 ++++++++++++++++---
1 file changed, 82 insertions(+), 15 deletions(-)
diff --git a/packages/panier/components/PanierActions/index.tsx b/packages/panier/components/PanierActions/index.tsx
index 8334afe417..0fd3772114 100644
--- a/packages/panier/components/PanierActions/index.tsx
+++ b/packages/panier/components/PanierActions/index.tsx
@@ -23,6 +23,15 @@ const PanierActions = ({
useAjouterActionsRealiseesOuEnCoursState();
const {nbEnCours, nbRealisees} = ajouterActionsRealiseesOuEnCours;
+ // ventile les actions en sections par statut
+ const actionsParStatut = getActionsParStatut(actionsListe);
+ // et détermine les sections à afficher
+ const sections = SECTIONS.map(section =>
+ actionsParStatut[section.statut].length
+ ? {...section, actions: actionsParStatut[section.statut]}
+ : null,
+ ).filter(section => section !== null);
+
return (
{actionsListe.length === 0 ? (
@@ -55,7 +64,7 @@ const PanierActions = ({
-
+
{actionsListe.length} action{actionsListe.length > 1 ? 's' : ''}{' '}
dans mon panier
@@ -70,20 +79,32 @@ const PanierActions = ({
- {actionsListe.map(({action, thematiques, typologie}) => (
-
b.niveau === action.fourchette_budgetaire,
- )}
- panier={true}
- isSelected={false}
- onToggleSelected={() => onToggleSelected(action.id, false)}
- />
+ {sections.map(({statut, nom, nomPluriel, actions}) => (
+ <>
+
+ {actions.length} {actions.length > 1 ? nomPluriel : nom}
+
+ {actions.map(({action, thematiques, typologie}) => (
+ b.niveau === action.fourchette_budgetaire,
+ )}
+ panier={true}
+ isSelected={false}
+ onToggleSelected={() =>
+ onToggleSelected(action.id, false)
+ }
+ />
+ ))}
+ >
))}
@@ -93,4 +114,50 @@ const PanierActions = ({
);
};
+// pour afficher les actions du panier par statut
+const SECTIONS = [
+ {
+ statut: 'nouvelle',
+ nom: 'nouvelle action',
+ nomPluriel: 'nouvelles actions',
+ },
+ {
+ statut: 'realise',
+ nom: 'action réalisée',
+ nomPluriel: 'actions réalisées',
+ },
+ {
+ statut: 'en_cours',
+ nom: 'action en cours de réalisation',
+ nomPluriel: 'actions en cours de réalisation',
+ },
+ {
+ statut: 'importee',
+ nom: 'action déjà importée',
+ nomPluriel: 'actions déjà importées',
+ },
+] as const;
+type Statut = (typeof SECTIONS)[number]['statut'];
+
+// regroupe les actions par statut
+const getActionsParStatut = (actionsListe: ActionImpactState[]) => {
+ const actionsParStatut: Record
= {
+ realise: [],
+ en_cours: [],
+ importee: [],
+ nouvelle: [],
+ };
+ actionsListe.forEach(state => {
+ const statut = state.dejaImportee
+ ? 'importee'
+ : state.statut?.categorie_id === 'realise' ||
+ state.statut?.categorie_id === 'en_cours'
+ ? state.statut.categorie_id
+ : 'nouvelle';
+
+ actionsParStatut[statut].push(state);
+ });
+ return actionsParStatut;
+};
+
export default PanierActions;
From d912e5b0d8dd2b53c8a44ad8793c3ca2aece5907 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 2 Oct 2024 10:01:15 +0200
Subject: [PATCH 52/91] =?UTF-8?q?R=C3=A9pare=20un=20test?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/api/src/panier_action_impact/integration.test.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/packages/api/src/panier_action_impact/integration.test.ts b/packages/api/src/panier_action_impact/integration.test.ts
index 032fdcb437..ade0a166ef 100644
--- a/packages/api/src/panier_action_impact/integration.test.ts
+++ b/packages/api/src/panier_action_impact/integration.test.ts
@@ -69,7 +69,7 @@ describe('État du panier', async () => {
expect(selectPanierContenu.error).toBeNull();
expect(selectPanierContenu.data).toBeDefined();
- expect(selectPanierContenu.data?.contenu.length).toEqual(1);
+ expect(selectPanierContenu.data?.states.filter(s => s.isinpanier)).toEqual(1);
});
});
describe('État des actions', async () => {
@@ -92,7 +92,7 @@ describe('État des actions', async () => {
expect(selectPanierContenu.error).toBeNull();
expect(selectPanierContenu.data).toBeDefined();
- expect(selectPanierContenu.data?.contenu.length).toEqual(1);
+ expect(selectPanierContenu.data?.states.filter(s => s.isinpanier)).toEqual(1);
const { error } = await supabase
.from('panier')
From 3f162cbc7d315de51a8465ccb1baa33a379a145f Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 2 Oct 2024 10:02:05 +0200
Subject: [PATCH 53/91] =?UTF-8?q?R=C3=A9pare=20un=20passage=20de=20param?=
=?UTF-8?q?=C3=A8tres?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/panier/app/panier/[id]/utils.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/packages/panier/app/panier/[id]/utils.ts b/packages/panier/app/panier/[id]/utils.ts
index 98a45fc4a0..2884a1b4a1 100644
--- a/packages/panier/app/panier/[id]/utils.ts
+++ b/packages/panier/app/panier/[id]/utils.ts
@@ -39,8 +39,8 @@ export const fetchPanier = async ({
panierId,
thematique_ids,
typologie_ids,
- budget_ids,
- temps_ids,
+ niveau_budget_ids: budget_ids,
+ niveau_temps_ids: temps_ids,
});
return panier;
From 8d4fcc056fda5d8872da59d86efc528a77916ff0 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 2 Oct 2024 10:04:18 +0200
Subject: [PATCH 54/91] =?UTF-8?q?R=C3=A9pare=20le=20compteur=20d'actions?=
=?UTF-8?q?=20dans=20le=20panier=20=C3=A0=20la=20validation?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/ValidationPanier/ValiderPanierModale.tsx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/packages/panier/components/ValidationPanier/ValiderPanierModale.tsx b/packages/panier/components/ValidationPanier/ValiderPanierModale.tsx
index 812fd18d79..526eae4f9a 100644
--- a/packages/panier/components/ValidationPanier/ValiderPanierModale.tsx
+++ b/packages/panier/components/ValidationPanier/ValiderPanierModale.tsx
@@ -26,9 +26,9 @@ import {
import { panierAPI } from '@tet/panier/src/clientAPI';
const ValiderPanierModale = () => {
- const { panier } = usePanierContext();
- const { user } = useUserContext();
- const contenu = panier?.contenu ?? [];
+ const {panier} = usePanierContext();
+ const {user} = useUserContext();
+ const contenu = panier?.states?.filter(s => s.isinpanier) ?? [];
const steps = [
"Je crée mon plan et retrouve l'ensemble des fiches actions sélectionnées dans mon panier. ",
From c6c7e827fd7352f9029513f44831d936b06d2a31 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 2 Oct 2024 10:04:32 +0200
Subject: [PATCH 55/91] Evite une erreur de typage
---
.../panier/components/PanierActions/index.tsx | 62 ++++++++++---------
1 file changed, 34 insertions(+), 28 deletions(-)
diff --git a/packages/panier/components/PanierActions/index.tsx b/packages/panier/components/PanierActions/index.tsx
index 0fd3772114..29300f4cb3 100644
--- a/packages/panier/components/PanierActions/index.tsx
+++ b/packages/panier/components/PanierActions/index.tsx
@@ -30,7 +30,7 @@ const PanierActions = ({
actionsParStatut[section.statut].length
? {...section, actions: actionsParStatut[section.statut]}
: null,
- ).filter(section => section !== null);
+ );
return (
@@ -79,33 +79,39 @@ const PanierActions = ({
- {sections.map(({statut, nom, nomPluriel, actions}) => (
- <>
-
- {actions.length} {actions.length > 1 ? nomPluriel : nom}
-
- {actions.map(({action, thematiques, typologie}) => (
-
b.niveau === action.fourchette_budgetaire,
- )}
- panier={true}
- isSelected={false}
- onToggleSelected={() =>
- onToggleSelected(action.id, false)
- }
- />
- ))}
- >
- ))}
+ {sections.map(section => {
+ if (!section) {
+ return;
+ }
+ const {statut, nom, nomPluriel, actions} = section;
+ return (
+ <>
+
+ {actions.length} {actions.length > 1 ? nomPluriel : nom}
+
+ {actions.map(({action, thematiques, typologie}) => (
+ b.niveau === action.fourchette_budgetaire,
+ )}
+ panier={true}
+ isSelected={false}
+ onToggleSelected={() =>
+ onToggleSelected(action.id, false)
+ }
+ />
+ ))}
+ >
+ );
+ })}
From 5cca375167e3af5b2a67f1b2e79a8ecb4862044a Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 2 Oct 2024 10:43:05 +0200
Subject: [PATCH 56/91] Fixe les imports
---
.../src/components/InfoActionImpact/InfoActionImpact.tsx | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx b/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx
index 2631184add..769d2e00f3 100644
--- a/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx
+++ b/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx
@@ -3,11 +3,10 @@ import {
ActionImpactTempsMiseEnOeuvre,
ActionImpactThematique,
} from '@tet/api';
-
-import {Badge} from 'design-system/Badge';
-import {Button} from 'design-system/Button';
-import {Divider} from 'design-system/Divider';
-import {InfoTooltip} from 'design-system/Tooltip';
+import { Badge } from '@tet/ui/design-system/Badge';
+import { Button } from '@tet/ui/design-system/Button';
+import { Divider } from '@tet/ui/design-system/Divider';
+import { InfoTooltip } from '@tet/ui/design-system/Tooltip';
const URL_AIDES_TERRITOIRES = 'https://aides-territoires.beta.gouv.fr';
From c81e777fa810d48e06ec5c7ebd194e6a0f1b4845 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 2 Oct 2024 10:46:25 +0200
Subject: [PATCH 57/91] Corrige une erreur de typage
---
.../src/app/Layout/Header/MenuUtilisateur.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app.territoiresentransitions.react/src/app/Layout/Header/MenuUtilisateur.tsx b/app.territoiresentransitions.react/src/app/Layout/Header/MenuUtilisateur.tsx
index 8d1a9eaf47..370c5330d0 100644
--- a/app.territoiresentransitions.react/src/app/Layout/Header/MenuUtilisateur.tsx
+++ b/app.territoiresentransitions.react/src/app/Layout/Header/MenuUtilisateur.tsx
@@ -65,7 +65,7 @@ const MenuUtilisateurBtn = forwardRef(
isUserPath: boolean;
user: UserData;
},
- ref?: Ref
+ ref?: Ref
) => (
{user.prenom}
From c8e67333f89e0e2ce7df6e38d6b7ecf977b7f817 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 2 Oct 2024 12:03:29 +0200
Subject: [PATCH 58/91] Ajoute l'url du panier dans le build de l'app
---
.github/workflows/cd-app.yml | 1 +
Earthfile | 2 ++
2 files changed, 3 insertions(+)
diff --git a/.github/workflows/cd-app.yml b/.github/workflows/cd-app.yml
index 2ee0b3eeff..9de4fd13af 100644
--- a/.github/workflows/cd-app.yml
+++ b/.github/workflows/cd-app.yml
@@ -41,6 +41,7 @@ jobs:
--SENTRY_DSN=${{ vars.SENTRY_DSN }}
--CRISP_WEBSITE_ID=${{ vars.CRISP_WEBSITE_ID }}
--BACKEND_URL=${{ vars.BACKEND_URL }}
+ --PANIER_URL=${{ vars.PANIER_URL }}
--POSTHOG_HOST=${{ secrets.POSTHOG_HOST }} --POSTHOG_KEY=${{ secrets.POSTHOG_KEY }}
deploy-app:
diff --git a/Earthfile b/Earthfile
index 390d3ec8a6..17cc5065a7 100644
--- a/Earthfile
+++ b/Earthfile
@@ -370,6 +370,7 @@ app-build: ## construit l'image de l'app
ARG POSTHOG_HOST
ARG POSTHOG_KEY
ARG BACKEND_URL
+ ARG PANIER_URL
FROM +front-deps
ENV NX_PUBLIC_SUPABASE_URL=$API_URL
ENV NX_PUBLIC_SUPABASE_KEY=$ANON_KEY
@@ -378,6 +379,7 @@ app-build: ## construit l'image de l'app
ENV NX_PUBLIC_POSTHOG_HOST=$POSTHOG_HOST
ENV NX_PUBLIC_POSTHOG_KEY=$POSTHOG_KEY
ENV NX_PUBLIC_BACKEND_URL=$BACKEND_URL
+ ENV NX_PUBLIC_PANIER_URL=$PANIER_URL
LABEL org.opencontainers.image.description="Front-end $ENV_NAME, build depuis $GIT_BRANCH. API: $API_URL"
# copie les sources des modules à construire
COPY $APP_DIR/. $APP_DIR/
From e5316b4244e2a496f7d6260623151709f425586b Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 2 Oct 2024 14:11:46 +0200
Subject: [PATCH 59/91] Corrige des erreurs de build du panier suite au dernier
rebase
---
.../FiltresActions/BadgesFilters.tsx | 1 +
.../components/Landing/SelectCollectivite.tsx | 2 +-
.../components/Landing/useCollectiviteInfo.ts | 5 +-
.../Landing/useFilteredCollectivites.ts | 6 +-
...eAjouterActionsRealiseesOuEnCoursState.tsx | 2 +-
.../PanierRealtime/PartagerLeLien.tsx | 2 +-
packages/ui/src/design-system/Tabs/Tabs.tsx | 115 +++++++++---------
7 files changed, 66 insertions(+), 67 deletions(-)
diff --git a/packages/panier/components/FiltresActions/BadgesFilters.tsx b/packages/panier/components/FiltresActions/BadgesFilters.tsx
index 1fc2b678ed..0dfe7622e3 100644
--- a/packages/panier/components/FiltresActions/BadgesFilters.tsx
+++ b/packages/panier/components/FiltresActions/BadgesFilters.tsx
@@ -2,6 +2,7 @@ import classNames from 'classnames';
import { useEffect, useState } from 'react';
import {
+ Badge,
ButtonMenu,
Checkbox,
Field,
diff --git a/packages/panier/components/Landing/SelectCollectivite.tsx b/packages/panier/components/Landing/SelectCollectivite.tsx
index 8b820441a9..d1c42fcc01 100644
--- a/packages/panier/components/Landing/SelectCollectivite.tsx
+++ b/packages/panier/components/Landing/SelectCollectivite.tsx
@@ -2,7 +2,7 @@
import {useState} from 'react';
import {Select} from '@tet/ui';
-import {useFilteredCollectivites} from '@components/Landing/useFilteredCollectivites';
+import { useFilteredCollectivites } from './useFilteredCollectivites';
/**
* Permet de rechercher et sélectionner une collectivité
diff --git a/packages/panier/components/Landing/useCollectiviteInfo.ts b/packages/panier/components/Landing/useCollectiviteInfo.ts
index 4785afe708..f5656190d5 100644
--- a/packages/panier/components/Landing/useCollectiviteInfo.ts
+++ b/packages/panier/components/Landing/useCollectiviteInfo.ts
@@ -1,5 +1,4 @@
-import {makeSearchString} from '@tet/api';
-import {supabase} from 'src/clientAPI';
+import { supabase } from '../../src/clientAPI';
import useSWR from 'swr';
/** Donne des infos sur une collectivité */
@@ -8,7 +7,7 @@ export const useCollectiviteInfo = (collectiviteId: number | null) => {
return useSWR(key, async () => {
if (!collectiviteId) return null;
- const {error, data} = await supabase
+ const { error, data } = await supabase
.from('site_labellisation')
.select('collectivite_id, nom, engagee')
.eq('collectivite_id', collectiviteId);
diff --git a/packages/panier/components/Landing/useFilteredCollectivites.ts b/packages/panier/components/Landing/useFilteredCollectivites.ts
index 831f6f7d33..5a82ac4332 100644
--- a/packages/panier/components/Landing/useFilteredCollectivites.ts
+++ b/packages/panier/components/Landing/useFilteredCollectivites.ts
@@ -1,6 +1,6 @@
-import {makeSearchString} from '@tet/api';
-import {supabase} from 'src/clientAPI';
+import { makeSearchString } from '@tet/api';
import useSWR from 'swr';
+import { supabase } from '../../src/clientAPI';
/** Donne la liste des collectivités dont le nom inclus la chaîne recherchée */
export const useFilteredCollectivites = (search: string, limit = 10) => {
@@ -17,7 +17,7 @@ export const useFilteredCollectivites = (search: string, limit = 10) => {
query.or(processedSearch);
}
- const {error, data} = await query;
+ const { error, data } = await query;
if (error) {
throw new Error(key);
diff --git a/packages/panier/components/PanierActions/useAjouterActionsRealiseesOuEnCoursState.tsx b/packages/panier/components/PanierActions/useAjouterActionsRealiseesOuEnCoursState.tsx
index f2aa79e610..e1afc8d330 100644
--- a/packages/panier/components/PanierActions/useAjouterActionsRealiseesOuEnCoursState.tsx
+++ b/packages/panier/components/PanierActions/useAjouterActionsRealiseesOuEnCoursState.tsx
@@ -1,6 +1,6 @@
import {Panier} from '@tet/api';
import {useState, useEffect} from 'react';
-import {panierAPI} from 'src/clientAPI';
+import { panierAPI } from '../../src/clientAPI';
import {usePanierContext} from '../../providers';
/**
diff --git a/packages/panier/components/PanierRealtime/PartagerLeLien.tsx b/packages/panier/components/PanierRealtime/PartagerLeLien.tsx
index 1293c0dbd6..b42fd22ff0 100644
--- a/packages/panier/components/PanierRealtime/PartagerLeLien.tsx
+++ b/packages/panier/components/PanierRealtime/PartagerLeLien.tsx
@@ -2,7 +2,7 @@
import {useEffect, useState} from 'react';
import {Card, Button, Icon, useCopyToClipboard, useEventTracker} from '@tet/ui';
import {Panier} from '@tet/api';
-import Membres from '@components/Picto/Membres';
+import Membres from '../Picto/Membres';
/**
* Affiche l'encadré invitant au partage du lien vers le panier
diff --git a/packages/ui/src/design-system/Tabs/Tabs.tsx b/packages/ui/src/design-system/Tabs/Tabs.tsx
index 6b99f8f93f..b203f5c2ac 100644
--- a/packages/ui/src/design-system/Tabs/Tabs.tsx
+++ b/packages/ui/src/design-system/Tabs/Tabs.tsx
@@ -69,65 +69,64 @@ export const Tabs = ({
)}
role="tablist"
>
- {children
- .filter(elt => elt !== undefined)
- .map((element, index) => {
- const isActive = activeTab === index;
- return (
-
- {
+ const isActive = activeTab === index;
+ if (!element) return;
+ return (
+
+ handleChange(index)}
+ >
+ {element.props.icon &&
+ (!element.props.iconPosition ||
+ element.props.iconPosition === 'left') && (
+
)}
- type="button"
- role="tab"
- id={`tab-${index}`}
- aria-selected={isActive ? 'true' : 'false'}
- title={element.props.title}
- onClick={() => handleChange(index)}
- >
- {element.props.icon &&
- (!element.props.iconPosition ||
- element.props.iconPosition === 'left') && (
-
- )}
- {element.props.label}
- {element.props.icon &&
- element.props.iconPosition === 'right' && (
-
- )}
-
-
- );
- })}
+ {element.props.label}
+ {element.props.icon &&
+ element.props.iconPosition === 'right' && (
+
+ )}
+
+
+ );
+ })}
{tabsPanel}
From f54303fca8686ecf915a91a5b9e55b175063fc02 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 2 Oct 2024 14:22:32 +0200
Subject: [PATCH 60/91] =?UTF-8?q?Corrige=20la=20construction=20de=20l'url?=
=?UTF-8?q?=20d'acc=C3=A8s=20au=20panier=20depuis=20l'app?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../app/Layout/Header/AccesPanierAction.tsx | 31 ++++++++++---------
.../src/environmentVariables.ts | 2 +-
2 files changed, 18 insertions(+), 15 deletions(-)
diff --git a/app.territoiresentransitions.react/src/app/Layout/Header/AccesPanierAction.tsx b/app.territoiresentransitions.react/src/app/Layout/Header/AccesPanierAction.tsx
index 44c92752aa..d9660154aa 100644
--- a/app.territoiresentransitions.react/src/app/Layout/Header/AccesPanierAction.tsx
+++ b/app.territoiresentransitions.react/src/app/Layout/Header/AccesPanierAction.tsx
@@ -15,22 +15,25 @@ export const AccesPanierAction = () => {
const collectiviteId = useCollectiviteId();
const {data} = useNbActionsDansPanier(collectiviteId);
const {panierId, count} = data || {};
+ const url = panierId
+ ? `${ENV.panier_url}/panier/${panierId}`
+ : collectiviteId
+ ? `${ENV.panier_url}/landing/collectivite/${collectiviteId}`
+ : `${ENV.panier_url}/landing`;
return (
- panierId && (
- {
- window.open(`${ENV.panier_url}/panier/${panierId}`, '_blank');
- }}
- >
- Panier d'action
-
- )
+ {
+ window.open(url, '_blank');
+ }}
+ >
+ Panier d'action
+
);
};
diff --git a/app.territoiresentransitions.react/src/environmentVariables.ts b/app.territoiresentransitions.react/src/environmentVariables.ts
index df65a3cec3..c6f02c011f 100644
--- a/app.territoiresentransitions.react/src/environmentVariables.ts
+++ b/app.territoiresentransitions.react/src/environmentVariables.ts
@@ -4,7 +4,7 @@ export const ENV = {
supabase_anon_key: process.env.NX_PUBLIC_SUPABASE_KEY,
supabase_url: process.env.NX_PUBLIC_SUPABASE_URL,
sentry_dsn: process.env.NX_PUBLIC_SENTRY_DSN,
- panier_url: process.env.REACT_APP_PANIER_URL,
+ panier_url: process.env.NX_PUBLIC_PANIER_URL,
posthog: {
host: process.env.NX_PUBLIC_POSTHOG_HOST,
key: process.env.NX_PUBLIC_POSTHOG_KEY,
From fc19b1a9bf796bef9216d600b93d0c2cac0a9499 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 2 Oct 2024 14:48:26 +0200
Subject: [PATCH 61/91] =?UTF-8?q?R=C3=A9pare=20le=20filtrage=20sur=20les?=
=?UTF-8?q?=20th=C3=A9matiques?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/api/src/panier_action_impact/panierAPI.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index 1814cc33ae..f3b6b48566 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -124,7 +124,7 @@ export class PanierAPI {
if (thematique_ids && thematique_ids.length > 0) {
// @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
builder.url.searchParams.append(
- 'action_impact_state.thematiques.id',
+ 'action_impact_state.thematiques.thematique_id',
`in.(${thematique_ids.join(',')})`
);
// @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
From 8d7101fc90d8da02d9a0fdb197f520e9b77b92f8 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Wed, 2 Oct 2024 17:39:05 +0200
Subject: [PATCH 62/91] =?UTF-8?q?Change=20le=20libell=C3=A9=20de=20l'ongle?=
=?UTF-8?q?t=20"S=C3=A9lection"=20et=20g=C3=A8re=20le=20singulier=20pour?=
=?UTF-8?q?=20l'onglet=20"fiches=20d=C3=A9j=C3=A0=20import=C3=A9es"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../panier/components/ListeActions/index.tsx | 47 +++++++++++--------
1 file changed, 28 insertions(+), 19 deletions(-)
diff --git a/packages/panier/components/ListeActions/index.tsx b/packages/panier/components/ListeActions/index.tsx
index 5a9f8e3a0a..25bf949763 100644
--- a/packages/panier/components/ListeActions/index.tsx
+++ b/packages/panier/components/ListeActions/index.tsx
@@ -20,19 +20,20 @@ import ListeVide from './ListeVide';
import FiltresActions from '@tet/panier/components/FiltresActions';
const getTabLabel = (
- tab: {label: string; status: string | null},
- actionsNb: number,
+ tab: { label: string; labelOne?: string; status: string | null },
+ actionsNb: number
) => {
- if (tab.status !== null) {
- if (actionsNb > 1 || tab.status === 'en_cours') {
- return `${actionsNb} ${tab.label.toLowerCase()}`;
- } else {
- return `${actionsNb} ${tab.label
- .slice(0, tab.label.length - 1)
- .toLowerCase()}`;
- }
+ if (actionsNb === 1 && tab.labelOne) {
+ return `1 ${tab.labelOne.toLowerCase()}`;
+ }
+
+ if (actionsNb > 1 || tab.status === 'en_cours') {
+ return `${actionsNb} ${tab.label.toLowerCase()}`;
+ } else {
+ return `${actionsNb} ${tab.label
+ .slice(0, tab.label.length - 1)
+ .toLowerCase()}`;
}
- return tab.label;
};
type ListeActionsProps = {
@@ -62,11 +63,16 @@ const ListeActions = ({
const tabsList: {
label: string;
+ labelOne?: string;
shortName: PanierOngletName;
status: string | null;
}[] = [
- {label: 'Sélection', shortName: 'selection', status: null},
- {label: 'Réalisées', shortName: 'réalisées', status: 'realise'},
+ {
+ label: 'Propositions',
+ shortName: 'selection',
+ status: null,
+ },
+ { label: 'Réalisées', shortName: 'réalisées', status: 'realise' },
{
label: 'En cours de réalisation',
shortName: 'en cours',
@@ -74,10 +80,13 @@ const ListeActions = ({
},
];
- const actionsDejaImportees = actionsListe.filter(state => state.dejaImportee);
+ const actionsDejaImportees = actionsListe.filter(
+ (state) => state.dejaImportee
+ );
if (actionsDejaImportees.length) {
tabsList.push({
label: 'Fiches déjà importées',
+ labelOne: 'Fiche déjà importée',
shortName: 'importees',
status: 'importees',
});
@@ -85,18 +94,18 @@ const ListeActions = ({
return (
onChangeTab(tabsList[activeTab].shortName)}
+ onChange={(activeTab) => onChangeTab(tabsList[activeTab].shortName)}
className="grow flex flex-col"
tabPanelClassName="grow flex flex-col"
tabsListClassName="!justify-start mb-0"
>
- {...tabsList.map(tab => {
+ {...tabsList.map((tab) => {
const actionsFiltrees =
tab.shortName === 'importees'
? actionsDejaImportees
: tab.shortName === 'selection'
- ? filtreSelection({actionsListe, sansFiltreCompetences})
- : actionsListe.filter(a => a.statut?.categorie_id === tab.status);
+ ? filtreSelection({ actionsListe, sansFiltreCompetences })
+ : actionsListe.filter((a) => a.statut?.categorie_id === tab.status);
return (
@@ -172,7 +181,7 @@ const ListeActions = ({
actionsListe={actionsFiltrees}
onUpdateStatus={onUpdateStatus}
onToggleSelected={onToggleSelected}
- {...{budgets, temps}}
+ {...{ budgets, temps }}
/>
>
)}
From 6c440e9c234ca8fbab7d24d35279103928aa0987 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Thu, 3 Oct 2024 15:58:29 +0200
Subject: [PATCH 63/91] =?UTF-8?q?Revert=20"Evite=20de=20charger=20en=20dou?=
=?UTF-8?q?ble=20les=20informations=20des=20actions=20=C3=A0=20impact"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This reverts commit c618848be189b0a66c5f6eb88fe27dc87ebfb353.
---
.../api/src/panier_action_impact/panierAPI.ts | 6 ++-
.../api/src/panier_action_impact/types.ts | 9 ++++
.../panier/components/PanierActions/index.tsx | 52 ++++++-------------
.../components/PanierRealtime/index.tsx | 2 +-
packages/panier/hooks/useLandingPathname.ts | 4 +-
5 files changed, 33 insertions(+), 40 deletions(-)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index f3b6b48566..8be2565887 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -4,9 +4,11 @@ import { MesCollectivite, Panier, PanierBase } from './types';
/**
* On sélectionne toutes les colonnes du panier : *
- * puis les `action_impact` par la relation `action_impact_state` que l'on renomme `states`
+ * puis les `action_impact` par la relation `action_impact_panier` que l'on renomme `contenuPanier`
*/
-export const panierSelect = `*,states:action_impact_state(
+export const panierSelect = `*,
+ contenu:action_impact!action_impact_panier(*,thematiques:thematique(*)),
+ states:action_impact_state(
*, matches_competences,
thematiques:action_impact_thematique(...thematique(id,nom)),
typologie:action_impact_typologie(*),
diff --git a/packages/api/src/panier_action_impact/types.ts b/packages/api/src/panier_action_impact/types.ts
index 954835ef47..08703b2c1f 100644
--- a/packages/api/src/panier_action_impact/types.ts
+++ b/packages/api/src/panier_action_impact/types.ts
@@ -35,6 +35,13 @@ export type ActionImpact = Omit<
subventions_mobilisables: Link[];
};
+/* Le resumé d'une action à impact, utilisé pour les cartes */
+export type ActionImpactSnippet =
+ // todo: Omit
+ ActionImpact & {
+ thematiques: ActionImpactThematique[];
+ };
+
/* Une action à impact avec des informations complémentaires, utilisé par la modale */
export type ActionImpactDetails = ActionImpact & {
thematiques: ActionImpactThematique[];
@@ -66,6 +73,8 @@ export type PanierBase = Database['public']['Tables']['panier']['Row'];
export type Panier =
/* Le panier en tant que tel */
PanierBase & {
+ /* Liste des actions ajoutée au panier */
+ contenu: ActionImpactSnippet[];
/* Liste de toutes les actions avec leurs states. */
states: ActionImpactState[];
};
diff --git a/packages/panier/components/PanierActions/index.tsx b/packages/panier/components/PanierActions/index.tsx
index 29300f4cb3..d5ea25e20d 100644
--- a/packages/panier/components/PanierActions/index.tsx
+++ b/packages/panier/components/PanierActions/index.tsx
@@ -3,13 +3,13 @@ import {ActionImpact} from '@tet/panier/components/ActionImpact';
import BasketPicto from '@tet/panier/components/Picto/BasketPicto';
import EmptyBasketPicto from '@tet/panier/components/Picto/EmptyBasketPicto';
import ValiderPanierButton from '@tet/panier/components/ValidationPanier/ValiderPanierButton';
-import {ActionImpactFourchetteBudgetaire, ActionImpactState} from '@tet/api';
+import {ActionImpactFourchetteBudgetaire, ActionImpactSnippet} from '@tet/api';
import {Alert} from '@tet/ui';
import {AjouterActionsRealiseesOuEnCours} from './AjouterActionsRealiseesOuEnCours';
import {useAjouterActionsRealiseesOuEnCoursState} from './useAjouterActionsRealiseesOuEnCoursState';
type PanierActionsProps = {
- actionsListe: ActionImpactState[];
+ actionsListe: ActionImpactSnippet[];
budgets: ActionImpactFourchetteBudgetaire[];
onToggleSelected: (actionId: number, selected: boolean) => void;
};
@@ -79,39 +79,21 @@ const PanierActions = ({
- {sections.map(section => {
- if (!section) {
- return;
- }
- const {statut, nom, nomPluriel, actions} = section;
- return (
- <>
-
- {actions.length} {actions.length > 1 ? nomPluriel : nom}
-
- {actions.map(({action, thematiques, typologie}) => (
-
b.niveau === action.fourchette_budgetaire,
- )}
- panier={true}
- isSelected={false}
- onToggleSelected={() =>
- onToggleSelected(action.id, false)
- }
- />
- ))}
- >
- );
- })}
+ {actionsListe.map(action => (
+ b.niveau === action.fourchette_budgetaire,
+ )}
+ panier={true}
+ isSelected={false}
+ onToggleSelected={() => onToggleSelected(action.id, false)}
+ />
+ ))}
diff --git a/packages/panier/components/PanierRealtime/index.tsx b/packages/panier/components/PanierRealtime/index.tsx
index 1690b898fc..100718f2cf 100644
--- a/packages/panier/components/PanierRealtime/index.tsx
+++ b/packages/panier/components/PanierRealtime/index.tsx
@@ -136,7 +136,7 @@ const PanierRealtime = ({
isinpanier)}
+ actionsListe={panier.contenu}
budgets={budgets}
onToggleSelected={handleToggleSelected}
/>
diff --git a/packages/panier/hooks/useLandingPathname.ts b/packages/panier/hooks/useLandingPathname.ts
index 0206b9b814..07fc19a252 100644
--- a/packages/panier/hooks/useLandingPathname.ts
+++ b/packages/panier/hooks/useLandingPathname.ts
@@ -13,10 +13,10 @@ const useLandingPathname = () => {
setLandingPathname(pathname);
} else if (collectiviteId) {
setLandingPathname(`/landing/collectivite/${collectiviteId}`);
- } else if (panier?.id && panier.states.length > 0) {
+ } else if (panier?.id && panier.contenu.length > 0) {
setLandingPathname(`/landing/panier/${panier.id}`);
}
- }, [pathname, collectiviteId, panier?.id, panier?.states.length]);
+ }, [pathname, collectiviteId, panier?.id, panier?.contenu.length]);
return landingPathname;
};
From f81382dab5b1e3677d2845e876e5ec85577063a9 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Thu, 3 Oct 2024 15:59:37 +0200
Subject: [PATCH 64/91] =?UTF-8?q?Revert=20"R=C3=A9pare=20un=20test"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This reverts commit cf30f2c597a06e340b8a4be65d89e9e941367a3c.
---
packages/api/src/panier_action_impact/integration.test.ts | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/packages/api/src/panier_action_impact/integration.test.ts b/packages/api/src/panier_action_impact/integration.test.ts
index ade0a166ef..032fdcb437 100644
--- a/packages/api/src/panier_action_impact/integration.test.ts
+++ b/packages/api/src/panier_action_impact/integration.test.ts
@@ -69,7 +69,7 @@ describe('État du panier', async () => {
expect(selectPanierContenu.error).toBeNull();
expect(selectPanierContenu.data).toBeDefined();
- expect(selectPanierContenu.data?.states.filter(s => s.isinpanier)).toEqual(1);
+ expect(selectPanierContenu.data?.contenu.length).toEqual(1);
});
});
describe('État des actions', async () => {
@@ -92,7 +92,7 @@ describe('État des actions', async () => {
expect(selectPanierContenu.error).toBeNull();
expect(selectPanierContenu.data).toBeDefined();
- expect(selectPanierContenu.data?.states.filter(s => s.isinpanier)).toEqual(1);
+ expect(selectPanierContenu.data?.contenu.length).toEqual(1);
const { error } = await supabase
.from('panier')
From 648b7e7a5d6c3a5773d1d0dfdd474700119f7039 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Thu, 3 Oct 2024 18:33:08 +0200
Subject: [PATCH 65/91] =?UTF-8?q?Revert=20"R=C3=A9pare=20le=20compteur=20d?=
=?UTF-8?q?'actions=20dans=20le=20panier=20=C3=A0=20la=20validation"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This reverts commit 96032e14883cb785dc47ba278318d0f86edd3372.
---
.../components/ValidationPanier/ValiderPanierModale.tsx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/packages/panier/components/ValidationPanier/ValiderPanierModale.tsx b/packages/panier/components/ValidationPanier/ValiderPanierModale.tsx
index 526eae4f9a..812fd18d79 100644
--- a/packages/panier/components/ValidationPanier/ValiderPanierModale.tsx
+++ b/packages/panier/components/ValidationPanier/ValiderPanierModale.tsx
@@ -26,9 +26,9 @@ import {
import { panierAPI } from '@tet/panier/src/clientAPI';
const ValiderPanierModale = () => {
- const {panier} = usePanierContext();
- const {user} = useUserContext();
- const contenu = panier?.states?.filter(s => s.isinpanier) ?? [];
+ const { panier } = usePanierContext();
+ const { user } = useUserContext();
+ const contenu = panier?.contenu ?? [];
const steps = [
"Je crée mon plan et retrouve l'ensemble des fiches actions sélectionnées dans mon panier. ",
From c489044f2bee4a1809aca762044fcc81aacb71dd Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Thu, 3 Oct 2024 18:35:34 +0200
Subject: [PATCH 66/91] =?UTF-8?q?Ajoute=20le=20chargement=20de=20la=20typo?=
=?UTF-8?q?logie=20pour=20la=20fiche=20r=C3=A9sum=C3=A9=20d'une=20action?=
=?UTF-8?q?=20du=20panier?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/api/src/panier_action_impact/panierAPI.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index 8be2565887..c06645330f 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -7,7 +7,7 @@ import { MesCollectivite, Panier, PanierBase } from './types';
* puis les `action_impact` par la relation `action_impact_panier` que l'on renomme `contenuPanier`
*/
export const panierSelect = `*,
- contenu:action_impact!action_impact_panier(*,thematiques:thematique(*)),
+ contenu:action_impact!action_impact_panier(*,thematiques:thematique(*),typologie:action_impact_typologie(*)),
states:action_impact_state(
*, matches_competences,
thematiques:action_impact_thematique(...thematique(id,nom)),
From 3e46466aa4b2488712466f0d35925d27a3443e21 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Thu, 3 Oct 2024 18:37:26 +0200
Subject: [PATCH 67/91] Evite l'affichage d'une bulle vide quand il n'y a pas
de filtre actif
---
packages/panier/components/FiltresActions/BadgesFilters.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/panier/components/FiltresActions/BadgesFilters.tsx b/packages/panier/components/FiltresActions/BadgesFilters.tsx
index 0dfe7622e3..361f7353dc 100644
--- a/packages/panier/components/FiltresActions/BadgesFilters.tsx
+++ b/packages/panier/components/FiltresActions/BadgesFilters.tsx
@@ -172,7 +172,7 @@ export const BadgesFilters = ({
? {
number: badgesList.length,
}
- : {}
+ : undefined
}
>
From 1165ecab2d3ed552316705f3c4025f807858aa70 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Thu, 3 Oct 2024 18:39:33 +0200
Subject: [PATCH 68/91] =?UTF-8?q?Change=20un=20libell=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/panier/components/ListeActions/index.tsx | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/packages/panier/components/ListeActions/index.tsx b/packages/panier/components/ListeActions/index.tsx
index 25bf949763..06279337ea 100644
--- a/packages/panier/components/ListeActions/index.tsx
+++ b/packages/panier/components/ListeActions/index.tsx
@@ -147,8 +147,8 @@ const ListeActions = ({
aux côtés des actions en cours et à venir pour
constituer et piloter un plan d'action sur l'outil
numérique. Il vous suffit de cocher la case "Ajouter
- les actions classées comme “réalisées” au niveau du
- panier à droite.
+ les actions classées “réalisées” au niveau du panier à
+ droite.
) : (
@@ -162,8 +162,8 @@ const ListeActions = ({
outil numérique
et les piloter, il vous suffit de cocher la case
- "Ajouter les actions classées comme “en cours” au
- niveau du panier à droite.
+ "Ajouter les actions classées “en cours” au niveau du
+ panier à droite.
)
}
From 8fcb8b81b5cd7b4a3c14b51a352c7d38ed0a697d Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 7 Oct 2024 10:40:56 +0200
Subject: [PATCH 69/91] Refait fonctionner la connexion ws du panier en local
---
packages/panier/middleware.ts | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/packages/panier/middleware.ts b/packages/panier/middleware.ts
index 3f6eeda2f3..48a8118860 100644
--- a/packages/panier/middleware.ts
+++ b/packages/panier/middleware.ts
@@ -27,15 +27,16 @@ export function middleware(request: NextRequest) {
// options de la politique de sécurité
const cspHeader = `
default-src 'self';
- script-src ${scriptSrc} *.axept.io *.posthog.com;
+ script-src ${scriptSrc} *.axept.io *.posthog.com;
style-src ${styleSrc};
img-src 'self' blob: data: axeptio.imgix.net;
font-src 'self';
object-src 'none';
connect-src 'self'
${process.env.NEXT_PUBLIC_SUPABASE_URL!}
- ${process.env.NEXT_PUBLIC_SUPABASE_URL!.replace('http', 'ws')}
+ ${process.env.NEXT_PUBLIC_SUPABASE_URL!.replace('http', 'ws')}
ws://${request.nextUrl.host}
+ ws://127.0.0.1:54321
*.posthog.com
*.axept.io;
base-uri 'self';
From b590984839f4c6c22ef1c0645de82b4facece25a Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 7 Oct 2024 11:22:20 +0200
Subject: [PATCH 70/91] =?UTF-8?q?Change=20la=20mani=C3=A8re=20dont=20sont?=
=?UTF-8?q?=20charg=C3=A9es=20et=20filtr=C3=A9es=20les=20actions?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
notamment pour que les actions ajoutées au panier et/ou annotées "en cours" ou "réalisée", ne disparaissent pas quand les filtres sont modifiés
---
.../api/src/panier_action_impact/panierAPI.ts | 247 +++++++++++-------
.../api/src/panier_action_impact/types.ts | 66 +++--
2 files changed, 185 insertions(+), 128 deletions(-)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index c06645330f..11b6bbf982 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -1,21 +1,14 @@
import { SupabaseClient } from '@supabase/supabase-js';
import { Database } from '../database.types';
-import { MesCollectivite, Panier, PanierBase } from './types';
-
-/**
- * On sélectionne toutes les colonnes du panier : *
- * puis les `action_impact` par la relation `action_impact_panier` que l'on renomme `contenuPanier`
- */
-export const panierSelect = `*,
- contenu:action_impact!action_impact_panier(*,thematiques:thematique(*),typologie:action_impact_typologie(*)),
- states:action_impact_state(
- *, matches_competences,
- thematiques:action_impact_thematique(...thematique(id,nom)),
- typologie:action_impact_typologie(*),
- fourchette_budgetaire:action_impact_fourchette_budgetaire(*),
- temps_de_mise_en_oeuvre:action_impact_temps_de_mise_en_oeuvre(*),
- actions_liees:action_definition(identifiant,referentiel,nom)
-)`;
+import {
+ ActionImpactDetails,
+ ActionImpactFull,
+ ActionImpactStatut,
+ FiltreAction,
+ MesCollectivite,
+ Panier,
+ PanierBase,
+} from './types';
type RealtimePayload = {
type: string;
@@ -35,7 +28,7 @@ export class PanierAPI {
}
async panierFromLanding(collectivite_id: number | null): Promise {
- const {data, error} =
+ const { data, error } =
collectivite_id === null
? await this.supabase.rpc('panier_from_landing')
: await this.supabase.rpc('panier_from_landing', { collectivite_id });
@@ -92,8 +85,8 @@ export class PanierAPI {
): Promise {
if (category_id) {
await this.supabase.from('action_impact_statut').upsert({
- action_id: action_id,
- panier_id: panier_id,
+ action_id,
+ panier_id,
categorie_id: category_id,
});
} else {
@@ -107,84 +100,150 @@ export class PanierAPI {
async fetchPanier({
panierId,
- thematique_ids,
- typologie_ids,
- niveau_budget_ids,
- niveau_temps_ids,
+ filtre,
}: {
panierId: string;
- thematique_ids: number[];
- typologie_ids: number[];
- niveau_budget_ids: number[];
- niveau_temps_ids: number[];
+ filtre: FiltreAction;
}): Promise {
- const builder = this.supabase
+ const { data, error } = await this.supabase
.from('panier')
- .select(panierSelect)
- .eq('id', panierId);
+ .select(
+ `*,
+ etatActions:action_impact_state!inner(
+ id: action->>id,
+ statut: statut->>categorie_id,
+ isinpanier,
+ matches_competences
+ )`
+ )
+ .eq('id', panierId)
+ .single();
+ if (error) throw error;
- if (thematique_ids && thematique_ids.length > 0) {
- // @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
- builder.url.searchParams.append(
- 'action_impact_state.thematiques.thematique_id',
- `in.(${thematique_ids.join(',')})`
- );
- // @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
- builder.url.searchParams.append(
- 'action_impact_state.thematiques',
- 'not.is.null'
- );
- }
+ // charge toutes les actions par id
+ const actionsDetail = await this.getActionsImpact();
- if (typologie_ids && typologie_ids.length > 0) {
- // @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
- builder.url.searchParams.append(
- 'action_impact_state.typologie.id',
- `in.(${typologie_ids.join(',')})`
- );
- // @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
- builder.url.searchParams.append(
- 'action_impact_state.typologie',
- 'not.is.null'
- );
- }
+ // charge les ID des actions déjà importées
+ const actionsDejaImportees = await this.getActionsDejaImportees(
+ data?.collectivite_id ?? data?.collectivite_preset
+ );
- if (niveau_budget_ids && niveau_budget_ids.length > 0) {
- // @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
- builder.url.searchParams.append(
- 'action_impact_state.fourchette_budgetaire.niveau',
- `in.(${niveau_budget_ids.join(',')})`
+ // ajoute les flags d'état à chaque action
+ const actions = actionsDetail?.map((action) => {
+ const etat = data?.etatActions?.find(
+ // la relation calculée caste en string le champ `action_impact_state(action->>id)`
+ // il faut donc caster aussi pour la faire la comparaison
+ (etat) => etat.id === String(action.id)
);
- // @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
- builder.url.searchParams.append(
- 'action_impact_state.fourchette_budgetaire',
- 'not.is.null'
- );
- }
+ const { statut, isinpanier, matches_competences } = etat || {};
+ return {
+ ...action,
+ statut: statut as ActionImpactStatut,
+ isinpanier: isinpanier ?? false,
+ matches_competences: matches_competences ?? false,
+ dejaImportee: actionsDejaImportees?.includes(action.id),
+ };
+ });
- if (niveau_temps_ids && niveau_temps_ids.length > 0) {
- // @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
- builder.url.searchParams.append(
- 'action_impact_state.temps_de_mise_en_oeuvre.niveau',
- `in.(${niveau_temps_ids.join(',')})`
- );
- // @ts-expect-error Le client Supabase ne permet pas de filtrer à ce niveau
- builder.url.searchParams.append(
- 'action_impact_state.temps_de_mise_en_oeuvre',
- 'not.is.null'
- );
- }
+ return {
+ ...data,
+ // actions,
+ selection: this.applyFilters(filtre, actions),
+ realise: actions.filter((action) => action.statut === 'realise'),
+ en_cours: actions.filter((action) => action.statut === 'en_cours'),
+ importees: actions.filter((action) => action.dejaImportee),
+ inpanier: actions.filter((action) => action.isinpanier),
+ };
+ }
+
+ /**
+ * Applique les options de filtrage
+ */
+ applyFilters(filtre: FiltreAction, actions: ActionImpactFull[]) {
+ if (!filtre) return actions;
+ const {
+ thematique_ids,
+ typologie_ids,
+ niveau_budget_ids,
+ niveau_temps_ids,
+ matches_competences,
+ } = filtre;
+
+ return actions?.filter((action) => {
+ if (
+ action.dejaImportee ||
+ action.isinpanier ||
+ action.statut === 'en_cours' ||
+ action.statut === 'realise'
+ ) {
+ return false;
+ }
+
+ if (matches_competences && action.matches_competences === false) {
+ return false;
+ }
+
+ if (thematique_ids?.length && action.thematiques?.length) {
+ const thematiques = action.thematiques.map((t) => t.id);
+ if (!thematique_ids.find((id) => thematiques.includes(id))) {
+ return false;
+ }
+ }
+
+ if (
+ typologie_ids?.length &&
+ action.typologie_id &&
+ !typologie_ids.includes(action.typologie_id)
+ ) {
+ return false;
+ }
+
+ if (
+ niveau_budget_ids?.length &&
+ action.fourchette_budgetaire &&
+ !niveau_budget_ids.includes(action.fourchette_budgetaire.niveau)
+ ) {
+ return false;
+ }
+
+ if (
+ niveau_temps_ids?.length &&
+ action.temps_de_mise_en_oeuvre &&
+ !niveau_temps_ids.includes(action.temps_de_mise_en_oeuvre.niveau)
+ ) {
+ return false;
+ }
+
+ return true;
+ });
+ }
+
+ /**
+ * Renvoi le détail de toutes les actions à impact
+ */
+ async getActionsImpact() {
+ const { data, error } = await this.supabase
+ .from('action_impact')
+ .select(
+ `*,
+ thematiques:action_impact_thematique(...thematique(id,nom)),
+ typologie:action_impact_typologie(*),
+ fourchette_budgetaire:action_impact_fourchette_budgetaire(*),
+ temps_de_mise_en_oeuvre:action_impact_temps_de_mise_en_oeuvre(*),
+ actions_liees:action_definition(identifiant,referentiel,nom)
+ `
+ )
+ .returns();
- const {data, error} = await builder.single();
if (error) throw error;
- return this.ajouteActionsDejaImportees(data);
+ return data;
}
/**
* Renvoi l'id du panier d'une collectivité et le nombre d'actions de celui-ci
*/
async getCollectivitePanierInfo(collectivite_id: number) {
- const {data, error} = await this.supabase
+ const { data, error } = await this.supabase
.from('panier')
.select('id,actions:action_impact_state(isinpanier)')
.or(
@@ -193,40 +252,26 @@ export class PanierAPI {
.is('action_impact_state.isinpanier', true);
if (error) throw error;
return data?.[0]
- ? {panierId: data[0].id, count: data[0].actions?.length ?? 0}
+ ? { panierId: data[0].id, count: data[0].actions?.length ?? 0 }
: null;
}
/**
- * Ajoute aux items du tableau `states` un nouveau flag `dejaImportee`
- * si une action à impact est liée à une fiche action de la collectivité.
+ * Charge la liste des actions déjà importées (faisant partie d'un plan)
*/
- async ajouteActionsDejaImportees(panier: Panier) {
- const collectiviteId =
- panier?.collectivite_id ?? panier?.collectivite_preset;
+ async getActionsDejaImportees(collectiviteId: number | null) {
if (!collectiviteId) {
- return panier;
+ return [];
}
- const {data, error} = await this.supabase
+ const { data, error } = await this.supabase
.from('fiche_action')
.select('action_impact_fiche_action!inner(action_impact_id)')
.eq('collectivite_id', collectiviteId);
if (error) throw error;
- const actionsDejaImportees = data?.flatMap(row =>
- row.action_impact_fiche_action.map(action => action.action_impact_id)
+ return data?.flatMap((row) =>
+ row.action_impact_fiche_action.map((action) => action.action_impact_id)
);
- if (!actionsDejaImportees?.length) {
- return panier;
- }
-
- return {
- ...panier,
- states: panier.states?.map(state => ({
- ...state,
- dejaImportee: actionsDejaImportees.includes(state.action.id),
- })),
- };
}
/**
diff --git a/packages/api/src/panier_action_impact/types.ts b/packages/api/src/panier_action_impact/types.ts
index 08703b2c1f..12cccc9a4c 100644
--- a/packages/api/src/panier_action_impact/types.ts
+++ b/packages/api/src/panier_action_impact/types.ts
@@ -19,14 +19,12 @@ export type ActionImpactFourchetteBudgetaire =
export type ActionImpactTempsMiseEnOeuvre =
Database['public']['Tables']['action_impact_temps_de_mise_en_oeuvre']['Row'];
-export type FNV = Database['public']['Tables']['categorie_fnv']['Row'];
-
export type Link = {
url: string;
label: string;
};
-export type ActionImpact = Omit<
+export type ActionImpactBase = Omit<
Database['public']['Tables']['action_impact']['Row'],
'rex' | 'ressources_externes' | 'subventions_mobilisables'
> & {
@@ -35,20 +33,22 @@ export type ActionImpact = Omit<
subventions_mobilisables: Link[];
};
-/* Le resumé d'une action à impact, utilisé pour les cartes */
-export type ActionImpactSnippet =
- // todo: Omit
- ActionImpact & {
- thematiques: ActionImpactThematique[];
- };
-
-/* Une action à impact avec des informations complémentaires, utilisé par la modale */
-export type ActionImpactDetails = ActionImpact & {
+/* Une action à impact avec toutes les informations complémentaires */
+export type ActionImpactDetails = Omit<
+ ActionImpactBase,
+ 'fourchette_budgetaire' | 'temps_de_mise_en_oeuvre'
+> & {
thematiques: ActionImpactThematique[];
-} & {categoriesFNV: FNV[]};
+ typologie: ActionImpactTypologie;
+ fourchette_budgetaire: ActionImpactFourchetteBudgetaire | null;
+ temps_de_mise_en_oeuvre: ActionImpactTempsMiseEnOeuvre | null;
+ actions_liees: ActionReferentiel[] | null;
+};
-export type ActionImpactStatut =
- Database['public']['Tables']['action_impact_statut']['Row'];
+/** Action complète + les informations d'état de celle-ci dans le panier */
+export type ActionImpactFull = ActionImpactDetails & ActionImpactState;
+
+export type ActionImpactStatut = 'en_cours' | 'realise' | null | undefined;
export type ActionReferentiel = {
identifiant: string;
@@ -57,26 +57,29 @@ export type ActionReferentiel = {
};
export type ActionImpactState = {
- action: ActionImpact;
- isinpanier: boolean;
- statut: ActionImpactStatut | null;
- thematiques: ActionImpactThematique[];
- typologie: ActionImpactTypologie;
- actions_liees: ActionReferentiel[] | null;
- matches_competences: boolean;
+ statut: ActionImpactStatut;
+ isinpanier?: boolean;
dejaImportee?: boolean;
+ matches_competences?: boolean;
};
-
export type PanierBase = Database['public']['Tables']['panier']['Row'];
export type Panier =
/* Le panier en tant que tel */
PanierBase & {
- /* Liste des actions ajoutée au panier */
- contenu: ActionImpactSnippet[];
- /* Liste de toutes les actions avec leurs states. */
- states: ActionImpactState[];
+ /** toutes les actions */
+ // actions: ActionImpactFull[];
+ /** sélection disponible après filtrage */
+ selection: ActionImpactFull[];
+ /** actions marquées "réalisées" */
+ realise: ActionImpactFull[];
+ /** actions marquées "en cours de réalisation" */
+ en_cours: ActionImpactFull[];
+ /** actions déjà importées dans au moins un plan de la collectivité */
+ importees: ActionImpactFull[];
+ /** actions ajoutées au panier */
+ inpanier: ActionImpactFull[];
};
export type MaCollectivite = {
@@ -87,3 +90,12 @@ export type MaCollectivite = {
};
export type MesCollectivite = MaCollectivite[];
+
+/** Options de filtrage */
+export type FiltreAction = {
+ thematique_ids?: number[];
+ typologie_ids?: number[];
+ niveau_budget_ids?: number[];
+ niveau_temps_ids?: number[];
+ matches_competences?: boolean;
+};
From 448a6e404901a41a1afbb9283124d6310a392011 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 7 Oct 2024 11:30:28 +0200
Subject: [PATCH 71/91] =?UTF-8?q?Ajoute=20le=20tri=20local=20par=20ordre?=
=?UTF-8?q?=20d'affichage=20des=20th=C3=A9matiques?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/api/src/panier_action_impact/panierAPI.ts | 9 ++++++---
packages/api/src/panier_action_impact/types.ts | 2 +-
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/packages/api/src/panier_action_impact/panierAPI.ts b/packages/api/src/panier_action_impact/panierAPI.ts
index 11b6bbf982..01fd554358 100644
--- a/packages/api/src/panier_action_impact/panierAPI.ts
+++ b/packages/api/src/panier_action_impact/panierAPI.ts
@@ -183,7 +183,7 @@ export class PanierAPI {
return false;
}
- if (thematique_ids?.length && action.thematiques?.length) {
+ if (thematique_ids?.length) {
const thematiques = action.thematiques.map((t) => t.id);
if (!thematique_ids.find((id) => thematiques.includes(id))) {
return false;
@@ -226,7 +226,7 @@ export class PanierAPI {
.from('action_impact')
.select(
`*,
- thematiques:action_impact_thematique(...thematique(id,nom)),
+ thematiques:action_impact_thematique(...thematique(id,nom),ordre),
typologie:action_impact_typologie(*),
fourchette_budgetaire:action_impact_fourchette_budgetaire(*),
temps_de_mise_en_oeuvre:action_impact_temps_de_mise_en_oeuvre(*),
@@ -236,7 +236,10 @@ export class PanierAPI {
.returns();
if (error) throw error;
- return data;
+ return data?.map((action) => ({
+ ...action,
+ thematiques: action?.thematiques?.sort((a, b) => a.ordre - b.ordre),
+ }));
}
/**
diff --git a/packages/api/src/panier_action_impact/types.ts b/packages/api/src/panier_action_impact/types.ts
index 12cccc9a4c..10e90ccb59 100644
--- a/packages/api/src/panier_action_impact/types.ts
+++ b/packages/api/src/panier_action_impact/types.ts
@@ -6,7 +6,7 @@ export type ActionImpactCategorie =
export type ActionImpactThematique = Omit<
Database['public']['Tables']['thematique']['Row'],
'md_id'
->;
+> & { ordre: number };
export type ActionImpactTypologie =
Database['public']['Tables']['action_impact_typologie']['Row'];
From 8c40a032ab99319dbc3fb45fb13d7b0cb5a33f4a Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 7 Oct 2024 11:30:35 +0200
Subject: [PATCH 72/91] =?UTF-8?q?R=C3=A9pare=20un=20test=20et=20supprime?=
=?UTF-8?q?=20un=20test=20dupliqu=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../panier_action_impact/integration.test.ts | 44 +++----------------
1 file changed, 5 insertions(+), 39 deletions(-)
diff --git a/packages/api/src/panier_action_impact/integration.test.ts b/packages/api/src/panier_action_impact/integration.test.ts
index 032fdcb437..35f90decae 100644
--- a/packages/api/src/panier_action_impact/integration.test.ts
+++ b/packages/api/src/panier_action_impact/integration.test.ts
@@ -1,8 +1,7 @@
import { beforeAll, describe, it, expect } from 'vitest';
import { supabase } from '../tests/supabase';
import { testReset } from '../tests/testReset';
-import { panierSelect } from './panierAPI';
-import { Panier } from './types';
+import { PanierAPI } from './panierAPI';
describe('Création de panier', async () => {
beforeAll(async () => {
@@ -49,28 +48,6 @@ describe('État du panier', async () => {
expect(selectPanier.error).toBeNull();
expect(selectPanier.data).toBeDefined();
});
-
- it('On devrait pouvoir ajouter une action puis la retrouver dans le panier', async () => {
- const demandePanier = await supabase.rpc('panier_from_landing');
- const panierId = demandePanier.data?.id as string;
- const actionId = 1;
- const ajoutAction = await supabase.from('action_impact_panier').insert({
- action_id: actionId,
- panier_id: panierId,
- });
-
- expect(ajoutAction.error).toBeNull();
-
- const selectPanierContenu = await supabase
- .from('panier')
- .select(panierSelect)
- .eq('id', panierId)
- .single();
-
- expect(selectPanierContenu.error).toBeNull();
- expect(selectPanierContenu.data).toBeDefined();
- expect(selectPanierContenu.data?.contenu.length).toEqual(1);
- });
});
describe('État des actions', async () => {
it('On devrait pouvoir ajouter une action puis la retrouver dans le panier', async () => {
@@ -84,22 +61,11 @@ describe('État des actions', async () => {
expect(ajoutAction.error).toBeNull();
- const selectPanierContenu = await supabase
- .from('panier')
- .select(panierSelect)
- .eq('id', panierId)
- .single();
-
- expect(selectPanierContenu.error).toBeNull();
- expect(selectPanierContenu.data).toBeDefined();
- expect(selectPanierContenu.data?.contenu.length).toEqual(1);
+ const api = new PanierAPI(supabase);
+ const selectPanierContenu = await api.fetchPanier({ panierId, filtre: {} });
- const { error } = await supabase
- .from('panier')
- .select('*, states:action_impact_state(*)')
- .eq('id', panierId);
-
- expect(error).toBeNull();
+ expect(selectPanierContenu).toBeDefined();
+ expect(selectPanierContenu?.inpanier.length).toEqual(1);
});
});
From 3ce25a89bbc46d0963f8e03de2a8b46bacd390fb Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 7 Oct 2024 11:40:23 +0200
Subject: [PATCH 73/91] =?UTF-8?q?Extrait=20un=20typage=20partag=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/FiltresActions/index.tsx | 31 ++++++-------------
.../panier/components/FiltresActions/types.ts | 17 ++++++++++
2 files changed, 26 insertions(+), 22 deletions(-)
create mode 100644 packages/panier/components/FiltresActions/types.ts
diff --git a/packages/panier/components/FiltresActions/index.tsx b/packages/panier/components/FiltresActions/index.tsx
index 4cb28f1f45..e8e1e70b60 100644
--- a/packages/panier/components/FiltresActions/index.tsx
+++ b/packages/panier/components/FiltresActions/index.tsx
@@ -2,12 +2,6 @@
import { useEffect, useState } from 'react';
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
-import {
- ActionImpactFourchetteBudgetaire,
- ActionImpactTempsMiseEnOeuvre,
- ActionImpactThematique,
- ActionImpactTypologie,
-} from '@tet/api';
import {
OptionValue,
SelectMultipleOnChangeArgs,
@@ -15,21 +9,15 @@ import {
} from '@tet/ui';
import { usePanierContext } from '@tet/panier/providers';
import { BadgesFilters } from './BadgesFilters';
+import { ContenuListesFiltre } from './types';
-type FiltresActionsProps = {
- budgets: ActionImpactFourchetteBudgetaire[];
- temps: ActionImpactTempsMiseEnOeuvre[];
- thematiques: ActionImpactThematique[];
- typologies: ActionImpactTypologie[];
- sansFiltreCompetences: boolean;
-};
+type FiltresActionsProps = ContenuListesFiltre;
const FiltresActions = ({
budgets,
temps,
thematiques,
typologies,
- sansFiltreCompetences,
}: FiltresActionsProps) => {
const router = useRouter();
const pathname = usePathname();
@@ -47,9 +35,8 @@ const FiltresActions = ({
OptionValue[] | undefined
>();
const [tempsValues, setTempsValues] = useState();
- const [sansFiltreCompetencesValue, setSansFiltreCompetencesValue] = useState(
- sansFiltreCompetences,
- );
+ const [sansFiltreCompetencesValue, setSansFiltreCompetencesValue] =
+ useState(false);
useEffect(() => {
// Permet de conserver les filtres lors d'un changement d'onglet
@@ -57,11 +44,11 @@ const FiltresActions = ({
const thematiquesParams = searchParams
.get('t')
?.split(',')
- .map(val => parseInt(val));
+ .map((val) => parseInt(val));
const typologiesParams = searchParams
.get('ty')
?.split(',')
- .map(val => parseInt(val));
+ .map((val) => parseInt(val));
const budgetsParams = searchParams
.get('b')
?.split(',')
@@ -69,7 +56,7 @@ const FiltresActions = ({
const tempsParams = searchParams
.get('m')
?.split(',')
- .map(val => parseInt(val));
+ .map((val) => parseInt(val));
const competencesParams = searchParams.get('c');
if (thematiquesParams) setThematiquesValues(thematiquesParams);
@@ -142,9 +129,9 @@ const FiltresActions = ({
},
{
title: 'Typologies',
- options: typologies.map(t => ({value: t.id, label: t.nom})),
+ options: typologies.map((t) => ({ value: t.id, label: t.nom })),
values: typologiesValues,
- onChange: ({values}) => setTypologiesValues(values),
+ onChange: ({ values }) => setTypologiesValues(values),
multiple: true,
},
{
diff --git a/packages/panier/components/FiltresActions/types.ts b/packages/panier/components/FiltresActions/types.ts
new file mode 100644
index 0000000000..ad9b30b335
--- /dev/null
+++ b/packages/panier/components/FiltresActions/types.ts
@@ -0,0 +1,17 @@
+import {
+ ActionImpactFourchetteBudgetaire,
+ ActionImpactTempsMiseEnOeuvre,
+ ActionImpactThematique,
+ ActionImpactTypologie,
+} from '@tet/api';
+
+/**
+ * Listes passées au panneau de filtrage pour afficher les différentes
+ * listes déroulantes.
+ */
+export type ContenuListesFiltre = {
+ budgets: ActionImpactFourchetteBudgetaire[];
+ temps: ActionImpactTempsMiseEnOeuvre[];
+ thematiques: ActionImpactThematique[];
+ typologies: ActionImpactTypologie[];
+};
From ab61ee11fef747e69fd454d58ff3aa26e53134ed Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 7 Oct 2024 11:42:59 +0200
Subject: [PATCH 74/91] Utilise le nouveau typage
---
.../FicheActionImpact/useActionImpact.ts | 17 +---
.../panier/app/panier/[id]/PagePanier.tsx | 18 +---
packages/panier/app/panier/[id]/page.tsx | 21 ++---
packages/panier/app/panier/[id]/utils.ts | 22 ++---
.../panier/components/ActionImpact/types.ts | 3 +-
.../ListeActions/ListeActionsFiltrees.tsx | 41 ++++-----
.../panier/components/ListeActions/index.tsx | 57 ++----------
.../AjouterActionsRealiseesOuEnCours.tsx | 5 +-
.../panier/components/PanierActions/index.tsx | 90 +++++++++++--------
...eAjouterActionsRealiseesOuEnCoursState.tsx | 14 ++-
.../components/PanierRealtime/index.tsx | 28 +++---
.../ValidationPanier/ValiderPanierModale.tsx | 5 +-
packages/panier/hooks/useLandingPathname.ts | 4 +-
.../InfoActionImpact/InfoActionImpact.tsx | 3 +-
14 files changed, 131 insertions(+), 197 deletions(-)
diff --git a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/useActionImpact.ts b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/useActionImpact.ts
index 6592f550c7..64919212e0 100644
--- a/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/useActionImpact.ts
+++ b/app.territoiresentransitions.react/src/app/pages/collectivite/PlansActions/FicheAction/FicheActionImpact/useActionImpact.ts
@@ -1,25 +1,16 @@
import {useQuery} from 'react-query';
import {supabaseClient} from 'core-logic/api/supabase';
-import {
- ActionImpact,
- ActionImpactThematique,
- ActionImpactTypologie,
-} from '@tet/api';
-
-type ActionImpactDetail = ActionImpact & {
- thematiques: ActionImpactThematique[];
- typologie: ActionImpactTypologie | null;
-};
+import { ActionImpactDetails } from '@tet/api';
/**
* Charge le détail d'une action à impact
*/
export const useActionImpact = (actionImpactId: number) =>
useQuery(['action_impact', actionImpactId], async () => {
- const {data, error} = await supabaseClient
+ const { data, error } = await supabaseClient
.from('action_impact')
.select(
- `titre,
+ `titre,
typologie:action_impact_typologie(*),
thematiques:action_impact_thematique(...thematique(id,nom)),
budget:action_impact_fourchette_budgetaire(*),
@@ -30,7 +21,7 @@ export const useActionImpact = (actionImpactId: number) =>
`
)
.eq('id', actionImpactId)
- .returns();
+ .returns();
if (error) throw new Error(error.message);
diff --git a/packages/panier/app/panier/[id]/PagePanier.tsx b/packages/panier/app/panier/[id]/PagePanier.tsx
index f76546d4d9..e0ad9c7115 100644
--- a/packages/panier/app/panier/[id]/PagePanier.tsx
+++ b/packages/panier/app/panier/[id]/PagePanier.tsx
@@ -2,23 +2,13 @@
import PanierRealtime from '@tet/panier/components/PanierRealtime';
import Section from '@tet/panier/components/Section';
-import {
- ActionImpactFourchetteBudgetaire,
- ActionImpactTempsMiseEnOeuvre,
- ActionImpactThematique,
- ActionImpactTypologie,
- Panier,
-} from '@tet/api';
-import {ControlledAlert} from '@tet/ui';
+import { ContenuListesFiltre } from '@tet/panier/components/FiltresActions/types';
+import { Panier } from '@tet/api';
+import { ControlledAlert } from '@tet/ui';
type PagePanierProps = {
panier: Panier;
- budgets: ActionImpactFourchetteBudgetaire[];
- temps: ActionImpactTempsMiseEnOeuvre[];
- thematiques: ActionImpactThematique[];
- typologies: ActionImpactTypologie[];
- sansFiltreCompetences: boolean;
-};
+} & ContenuListesFiltre;
const PagePanier = (props: PagePanierProps) => {
return (
diff --git a/packages/panier/app/panier/[id]/page.tsx b/packages/panier/app/panier/[id]/page.tsx
index b4794c3a28..a469efc4c2 100644
--- a/packages/panier/app/panier/[id]/page.tsx
+++ b/packages/panier/app/panier/[id]/page.tsx
@@ -25,19 +25,15 @@ async function Page({
searchParams: { [key: string]: string | string[] | undefined };
}) {
const panierId = params.id;
- const thematique_ids = extractIdsFromParam(searchParams['t'] as string);
- const typologie_ids = extractIdsFromParam(searchParams['ty'] as string);
- const budget_ids = extractIdsFromParam(searchParams['b'] as string);
- const temps_ids = extractIdsFromParam(searchParams['m'] as string);
- const sansFiltreCompetences = searchParams['c'] === 'true';
- const panier = await fetchPanier({
- panierId,
- thematique_ids,
- typologie_ids,
- budget_ids,
- temps_ids,
- });
+ const filtre = {
+ thematique_ids: extractIdsFromParam(searchParams['t'] as string),
+ typologie_ids: extractIdsFromParam(searchParams['ty'] as string),
+ niveau_budget_ids: extractIdsFromParam(searchParams['b'] as string),
+ niveau_temps_ids: extractIdsFromParam(searchParams['m'] as string),
+ matches_competences: searchParams['c'] !== 'true',
+ };
+ const panier = await fetchPanier({ panierId, filtre });
if (!panier) return notFound();
@@ -62,7 +58,6 @@ async function Page({
temps,
thematiques,
typologies,
- sansFiltreCompetences,
}}
/>
>
diff --git a/packages/panier/app/panier/[id]/utils.ts b/packages/panier/app/panier/[id]/utils.ts
index 2884a1b4a1..f1902ddc8b 100644
--- a/packages/panier/app/panier/[id]/utils.ts
+++ b/packages/panier/app/panier/[id]/utils.ts
@@ -2,6 +2,7 @@ import {
ActionImpactCategorie,
ActionImpactThematique,
ActionImpactTypologie,
+ FiltreAction,
Niveau,
Panier,
PanierAPI,
@@ -9,38 +10,29 @@ import {
import { cookies } from 'next/headers';
import { createClient } from '@tet/panier/src/supabase/server';
-const apiKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!;
-const apiUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!;
+const apiKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;
+const apiUrl = process.env.NEXT_PUBLIC_SUPABASE_URL;
const getInit = {
method: 'GET',
headers: {
Authorization: `Bearer ${apiKey}`,
- apiKey: apiKey,
+ apiKey: apiKey ?? '',
},
};
export const fetchPanier = async ({
panierId,
- thematique_ids,
- typologie_ids,
- budget_ids,
- temps_ids,
+ filtre,
}: {
panierId: string;
- thematique_ids: number[];
- typologie_ids: number[];
- budget_ids: number[];
- temps_ids: number[];
+ filtre: FiltreAction;
}): Promise => {
const supabase = createClient(cookies());
const api = new PanierAPI(supabase);
const panier: Panier | null = await api.fetchPanier({
panierId,
- thematique_ids,
- typologie_ids,
- niveau_budget_ids: budget_ids,
- niveau_temps_ids: temps_ids,
+ filtre,
});
return panier;
diff --git a/packages/panier/components/ActionImpact/types.ts b/packages/panier/components/ActionImpact/types.ts
index 9048958813..c1cc822bc5 100644
--- a/packages/panier/components/ActionImpact/types.ts
+++ b/packages/panier/components/ActionImpact/types.ts
@@ -1,5 +1,6 @@
import {
ActionImpactFourchetteBudgetaire,
+ ActionImpactStatut,
ActionImpactTempsMiseEnOeuvre,
ActionImpactThematique,
ActionImpactTypologie,
@@ -31,7 +32,7 @@ export type ActionImpactProps = {
/** Lien vers les subventions mobilisables */
subventions?: LinkType[] | null;
/** Statut de l'action */
- statut?: 'non_pertinent' | 'en_cours' | 'realise' | null;
+ statut?: ActionImpactStatut;
/** Actions des référentiels liées */
actionsLiees?: ActionReferentiel[] | null;
/** Indique si l'action est mise dans le panier */
diff --git a/packages/panier/components/ListeActions/ListeActionsFiltrees.tsx b/packages/panier/components/ListeActions/ListeActionsFiltrees.tsx
index 5486058229..c70456df00 100644
--- a/packages/panier/components/ListeActions/ListeActionsFiltrees.tsx
+++ b/packages/panier/components/ListeActions/ListeActionsFiltrees.tsx
@@ -1,12 +1,12 @@
import {ActionImpact} from '@tet/panier/components/ActionImpact';
import {
ActionImpactFourchetteBudgetaire,
- ActionImpactState,
+ ActionImpactFull,
ActionImpactTempsMiseEnOeuvre,
} from '@tet/api';
type ListeActionsFiltreesProps = {
- actionsListe: ActionImpactState[];
+ actionsListe: ActionImpactFull[];
budgets: ActionImpactFourchetteBudgetaire[];
temps: ActionImpactTempsMiseEnOeuvre[];
onToggleSelected: (actionId: number, selected: boolean) => void;
@@ -22,40 +22,31 @@ const ListeActionsFiltrees = ({
}: ListeActionsFiltreesProps) => {
return (
- {actionsListe.map(action => (
+ {actionsListe.map((action) => (
b.niveau === action.action.fourchette_budgetaire
+ (b) => b.niveau === action.fourchette_budgetaire?.niveau
)}
- description={`${action.action.description}\n\n${action.action.description_complementaire}`}
+ description={`${action.description}\n\n${action.description_complementaire}`}
miseEnOeuvre={temps.find(
- t => t.niveau === action.action.temps_de_mise_en_oeuvre
+ (t) => t.niveau === action.temps_de_mise_en_oeuvre?.niveau
)}
- ressources={action.action.ressources_externes ?? []}
- rex={action.action.rex ?? []}
- subventions={action.action.subventions_mobilisables ?? []}
- statut={
- action.statut?.categorie_id as
- | 'non_pertinent'
- | 'en_cours'
- | 'realise'
- | null
- }
- panier={action.isinpanier}
+ ressources={action.ressources_externes ?? []}
+ rex={action.rex ?? []}
+ subventions={action.subventions_mobilisables ?? []}
+ statut={action.statut}
+ panier={action.isinpanier ?? false}
isSelected={action.isinpanier}
onToggleSelected={() =>
- onToggleSelected(action.action.id, !action.isinpanier)
+ onToggleSelected(action.id, !action.isinpanier)
}
- onUpdateStatus={statut =>
- onUpdateStatus(
- action.action.id,
- action.statut?.categorie_id === statut ? null : statut
- )
+ onUpdateStatus={(statut) =>
+ onUpdateStatus(action.id, action.statut === statut ? null : statut)
}
/>
))}
diff --git a/packages/panier/components/ListeActions/index.tsx b/packages/panier/components/ListeActions/index.tsx
index 06279337ea..cd5238c67d 100644
--- a/packages/panier/components/ListeActions/index.tsx
+++ b/packages/panier/components/ListeActions/index.tsx
@@ -1,12 +1,6 @@
/* eslint-disable react/no-unescaped-entities */
import {useSearchParams} from 'next/navigation';
-import {
- ActionImpactFourchetteBudgetaire,
- ActionImpactState,
- ActionImpactTempsMiseEnOeuvre,
- ActionImpactThematique,
- ActionImpactTypologie,
-} from '@tet/api';
+import { Panier } from '@tet/api';
import {
Alert,
Button,
@@ -18,6 +12,7 @@ import {
import ListeActionsFiltrees from './ListeActionsFiltrees';
import ListeVide from './ListeVide';
import FiltresActions from '@tet/panier/components/FiltresActions';
+import { ContenuListesFiltre } from '../FiltresActions/types';
const getTabLabel = (
tab: { label: string; labelOne?: string; status: string | null },
@@ -37,24 +32,18 @@ const getTabLabel = (
};
type ListeActionsProps = {
- actionsListe: ActionImpactState[];
- budgets: ActionImpactFourchetteBudgetaire[];
- temps: ActionImpactTempsMiseEnOeuvre[];
- thematiques: ActionImpactThematique[];
- typologies: ActionImpactTypologie[];
- sansFiltreCompetences: boolean;
+ panier: Panier;
onToggleSelected: (actionId: number, selected: boolean) => void;
onUpdateStatus: (actionId: number, statusId: string | null) => void;
onChangeTab: (tab: PanierOngletName) => void;
-};
+} & ContenuListesFiltre;
const ListeActions = ({
- actionsListe,
+ panier,
budgets,
temps,
thematiques,
typologies,
- sansFiltreCompetences,
onToggleSelected,
onUpdateStatus,
onChangeTab,
@@ -65,12 +54,12 @@ const ListeActions = ({
label: string;
labelOne?: string;
shortName: PanierOngletName;
- status: string | null;
+ status: 'realise' | 'en_cours' | 'selection' | 'importees';
}[] = [
{
label: 'Propositions',
shortName: 'selection',
- status: null,
+ status: 'selection',
},
{ label: 'Réalisées', shortName: 'réalisées', status: 'realise' },
{
@@ -80,9 +69,7 @@ const ListeActions = ({
},
];
- const actionsDejaImportees = actionsListe.filter(
- (state) => state.dejaImportee
- );
+ const actionsDejaImportees = panier.importees;
if (actionsDejaImportees.length) {
tabsList.push({
label: 'Fiches déjà importées',
@@ -100,12 +87,7 @@ const ListeActions = ({
tabsListClassName="!justify-start mb-0"
>
{...tabsList.map((tab) => {
- const actionsFiltrees =
- tab.shortName === 'importees'
- ? actionsDejaImportees
- : tab.shortName === 'selection'
- ? filtreSelection({ actionsListe, sansFiltreCompetences })
- : actionsListe.filter((a) => a.statut?.categorie_id === tab.status);
+ const actionsFiltrees = panier[tab.status];
return (
@@ -115,7 +97,6 @@ const ListeActions = ({
temps,
thematiques,
typologies,
- sansFiltreCompetences,
}}
/>
@@ -192,24 +173,4 @@ const ListeActions = ({
);
};
-const filtreSelection = ({
- actionsListe,
- sansFiltreCompetences,
-}: {
- actionsListe: ActionImpactState[];
- sansFiltreCompetences: boolean;
-}) => {
- // toutes les actions sauf celles qui ont un statut (en
- // cours/réalisée), celles qui sont déjà dans le panier ou déjà
- // importées dans un plan
- const subset = actionsListe.filter(
- a => a.statut === null && !a.isinpanier && !a.dejaImportee,
- );
-
- return sansFiltreCompetences
- ? subset
- : subset.filter(a => a.matches_competences);
-};
-
-
export default ListeActions;
diff --git a/packages/panier/components/PanierActions/AjouterActionsRealiseesOuEnCours.tsx b/packages/panier/components/PanierActions/AjouterActionsRealiseesOuEnCours.tsx
index 791aa756be..982636cdfe 100644
--- a/packages/panier/components/PanierActions/AjouterActionsRealiseesOuEnCours.tsx
+++ b/packages/panier/components/PanierActions/AjouterActionsRealiseesOuEnCours.tsx
@@ -1,7 +1,6 @@
-import {ActionImpactState} from '@tet/api';
-import {Checkbox} from '@tet/ui';
+import { Checkbox } from '@tet/ui';
import classNames from 'classnames';
-import {AjouterActionsRealiseesOuEnCoursState} from './useAjouterActionsRealiseesOuEnCoursState';
+import { AjouterActionsRealiseesOuEnCoursState } from './useAjouterActionsRealiseesOuEnCoursState';
/**
* Affiche les cases à cocher permettant d'ajouter/enlever la sélection
diff --git a/packages/panier/components/PanierActions/index.tsx b/packages/panier/components/PanierActions/index.tsx
index d5ea25e20d..e3194e5e4d 100644
--- a/packages/panier/components/PanierActions/index.tsx
+++ b/packages/panier/components/PanierActions/index.tsx
@@ -3,33 +3,38 @@ import {ActionImpact} from '@tet/panier/components/ActionImpact';
import BasketPicto from '@tet/panier/components/Picto/BasketPicto';
import EmptyBasketPicto from '@tet/panier/components/Picto/EmptyBasketPicto';
import ValiderPanierButton from '@tet/panier/components/ValidationPanier/ValiderPanierButton';
-import {ActionImpactFourchetteBudgetaire, ActionImpactSnippet} from '@tet/api';
-import {Alert} from '@tet/ui';
-import {AjouterActionsRealiseesOuEnCours} from './AjouterActionsRealiseesOuEnCours';
-import {useAjouterActionsRealiseesOuEnCoursState} from './useAjouterActionsRealiseesOuEnCoursState';
+import {
+ ActionImpactFourchetteBudgetaire,
+ ActionImpactFull,
+ Panier,
+} from '@tet/api';
+import { Alert } from '@tet/ui';
+import { AjouterActionsRealiseesOuEnCours } from './AjouterActionsRealiseesOuEnCours';
+import { useAjouterActionsRealiseesOuEnCoursState } from './useAjouterActionsRealiseesOuEnCoursState';
type PanierActionsProps = {
- actionsListe: ActionImpactSnippet[];
+ panier: Panier;
budgets: ActionImpactFourchetteBudgetaire[];
onToggleSelected: (actionId: number, selected: boolean) => void;
};
const PanierActions = ({
- actionsListe,
+ panier,
budgets,
onToggleSelected,
}: PanierActionsProps) => {
const ajouterActionsRealiseesOuEnCours =
useAjouterActionsRealiseesOuEnCoursState();
- const {nbEnCours, nbRealisees} = ajouterActionsRealiseesOuEnCours;
+ const { nbEnCours, nbRealisees } = ajouterActionsRealiseesOuEnCours;
// ventile les actions en sections par statut
+ const actionsListe = panier.inpanier;
const actionsParStatut = getActionsParStatut(actionsListe);
// et détermine les sections à afficher
- const sections = SECTIONS.map(section =>
+ const sections = SECTIONS.map((section) =>
actionsParStatut[section.statut].length
- ? {...section, actions: actionsParStatut[section.statut]}
- : null,
+ ? { ...section, actions: actionsParStatut[section.statut] }
+ : null
);
return (
@@ -64,13 +69,13 @@ const PanierActions = ({
-
+
{actionsListe.length} action{actionsListe.length > 1 ? 's' : ''}{' '}
dans mon panier
@@ -79,21 +84,37 @@ const PanierActions = ({
- {actionsListe.map(action => (
-
b.niveau === action.fourchette_budgetaire,
- )}
- panier={true}
- isSelected={false}
- onToggleSelected={() => onToggleSelected(action.id, false)}
- />
- ))}
+ {sections.map((section) => {
+ if (!section) {
+ return;
+ }
+ const { statut, nom, nomPluriel, actions } = section;
+ return (
+
+
+ {actions.length} {actions.length > 1 ? nomPluriel : nom}
+
+ {actions.map((action) => (
+
+ b.niveau === action.fourchette_budgetaire?.niveau
+ )}
+ panier={true}
+ isSelected={false}
+ onToggleSelected={() =>
+ onToggleSelected(action.id, false)
+ }
+ />
+ ))}
+
+ );
+ })}
@@ -128,22 +149,21 @@ const SECTIONS = [
type Statut = (typeof SECTIONS)[number]['statut'];
// regroupe les actions par statut
-const getActionsParStatut = (actionsListe: ActionImpactState[]) => {
- const actionsParStatut: Record = {
+const getActionsParStatut = (actionsListe: ActionImpactFull[]) => {
+ const actionsParStatut: Record = {
realise: [],
en_cours: [],
importee: [],
nouvelle: [],
};
- actionsListe.forEach(state => {
- const statut = state.dejaImportee
+ actionsListe.forEach((action) => {
+ const statut = action.dejaImportee
? 'importee'
- : state.statut?.categorie_id === 'realise' ||
- state.statut?.categorie_id === 'en_cours'
- ? state.statut.categorie_id
+ : action.statut === 'realise' || action.statut === 'en_cours'
+ ? action.statut
: 'nouvelle';
- actionsParStatut[statut].push(state);
+ actionsParStatut[statut].push(action);
});
return actionsParStatut;
};
diff --git a/packages/panier/components/PanierActions/useAjouterActionsRealiseesOuEnCoursState.tsx b/packages/panier/components/PanierActions/useAjouterActionsRealiseesOuEnCoursState.tsx
index e1afc8d330..ed6f8cd2cc 100644
--- a/packages/panier/components/PanierActions/useAjouterActionsRealiseesOuEnCoursState.tsx
+++ b/packages/panier/components/PanierActions/useAjouterActionsRealiseesOuEnCoursState.tsx
@@ -48,25 +48,23 @@ const useToggleAjoutActions = (
const panierId = panier?.id;
// le sous-ensemble
- const actions = panier?.states.filter(
- state => state.statut?.categorie_id === subset,
- );
+ const actions = panier?.[subset];
// nombre d'items total et dans le panier
const count = actions?.length ?? 0;
const countInPanier =
- actions?.filter(action => action.isinpanier).length ?? 0;
+ actions?.filter((action) => action.isinpanier).length ?? 0;
// ajoute/enlève les actions du panier
const toggleAjout = () => {
if (!actions?.length || !panierId) return;
if (ajout) {
- actions.forEach(state =>
- panierAPI.removeActionFromPanier(state.action.id, panierId),
+ actions.forEach((action) =>
+ panierAPI.removeActionFromPanier(action.id, panierId)
);
} else {
- actions.forEach(state =>
- panierAPI.addActionToPanier(state.action.id, panierId),
+ actions.forEach((action) =>
+ panierAPI.addActionToPanier(action.id, panierId)
);
}
setAjout(!ajout);
diff --git a/packages/panier/components/PanierRealtime/index.tsx b/packages/panier/components/PanierRealtime/index.tsx
index 100718f2cf..46c0f37b0a 100644
--- a/packages/panier/components/PanierRealtime/index.tsx
+++ b/packages/panier/components/PanierRealtime/index.tsx
@@ -2,13 +2,7 @@
import { useEffect, useState } from 'react';
import { useRouter } from 'next/navigation';
-import {
- ActionImpactFourchetteBudgetaire,
- ActionImpactTempsMiseEnOeuvre,
- ActionImpactThematique,
- ActionImpactTypologie,
- Panier,
-} from '@tet/api';
+import { Panier } from '@tet/api';
import { PanierOngletName, useEventTracker, useOngletTracker } from '@tet/ui';
import { panierAPI, supabase } from '@tet/panier/src/clientAPI';
import ListeActions from '@tet/panier/components/ListeActions';
@@ -19,15 +13,11 @@ import {
useUserContext,
} from '@tet/panier/providers';
import {PartagerLeLien} from './PartagerLeLien';
+import { ContenuListesFiltre } from '../FiltresActions/types';
type PanierRealtimeProps = {
panier: Panier;
- budgets: ActionImpactFourchetteBudgetaire[];
- temps: ActionImpactTempsMiseEnOeuvre[];
- thematiques: ActionImpactThematique[];
- typologies: ActionImpactTypologie[];
- sansFiltreCompetences: boolean;
-};
+} & ContenuListesFiltre;
/**
* La partie client du Panier d'Action à Impact
@@ -44,7 +34,6 @@ const PanierRealtime = ({
temps,
thematiques,
typologies,
- sansFiltreCompetences,
}: PanierRealtimeProps) => {
const [currentTab, setCurrentTab] = useState('selection');
@@ -127,16 +116,21 @@ const PanierRealtime = ({
}
diff --git a/packages/panier/components/ValidationPanier/ValiderPanierModale.tsx b/packages/panier/components/ValidationPanier/ValiderPanierModale.tsx
index 812fd18d79..0425072348 100644
--- a/packages/panier/components/ValidationPanier/ValiderPanierModale.tsx
+++ b/packages/panier/components/ValidationPanier/ValiderPanierModale.tsx
@@ -28,7 +28,7 @@ import { panierAPI } from '@tet/panier/src/clientAPI';
const ValiderPanierModale = () => {
const { panier } = usePanierContext();
const { user } = useUserContext();
- const contenu = panier?.contenu ?? [];
+ const contenu = panier?.inpanier ?? [];
const steps = [
"Je crée mon plan et retrouve l'ensemble des fiches actions sélectionnées dans mon panier. ",
@@ -177,7 +177,8 @@ const ModeConnecteRattache = ({
const handleOnClick = async () => {
const collectivite = collectivites.find(
(c) => c.collectivite_id === collectiviteId
- )!;
+ );
+ if (!collectivite) return;
await tracker('cta_creer_le_plan_click', {
collectivite_preset: collectivite.collectivite_id,
panier_id: panier?.id ?? '',
diff --git a/packages/panier/hooks/useLandingPathname.ts b/packages/panier/hooks/useLandingPathname.ts
index 07fc19a252..458e7af454 100644
--- a/packages/panier/hooks/useLandingPathname.ts
+++ b/packages/panier/hooks/useLandingPathname.ts
@@ -13,10 +13,10 @@ const useLandingPathname = () => {
setLandingPathname(pathname);
} else if (collectiviteId) {
setLandingPathname(`/landing/collectivite/${collectiviteId}`);
- } else if (panier?.id && panier.contenu.length > 0) {
+ } else if (panier?.id && panier.selection.length > 0) {
setLandingPathname(`/landing/panier/${panier.id}`);
}
- }, [pathname, collectiviteId, panier?.id, panier?.contenu.length]);
+ }, [pathname, collectiviteId, panier?.id, panier?.selection.length]);
return landingPathname;
};
diff --git a/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx b/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx
index 769d2e00f3..2dfcb77419 100644
--- a/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx
+++ b/packages/ui/src/components/InfoActionImpact/InfoActionImpact.tsx
@@ -1,5 +1,6 @@
import {
ActionImpactFourchetteBudgetaire,
+ ActionImpactStatut,
ActionImpactTempsMiseEnOeuvre,
ActionImpactThematique,
} from '@tet/api';
@@ -33,7 +34,7 @@ export type ActionImpactDetail = {
/** Lien vers les subventions mobilisables */
subventions?: LinkType[] | null;
/** Statut de l'action */
- statut?: 'non_pertinent' | 'en_cours' | 'realise' | null;
+ statut?: ActionImpactStatut;
};
type InfoActionImpactProps = {
From ce73499b0472328349e999d10b21457ac9c9532e Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 7 Oct 2024 12:13:16 +0200
Subject: [PATCH 75/91] =?UTF-8?q?Ajoute/enl=C3=A8ve=20automatiquement=20l'?=
=?UTF-8?q?action=20du=20panier=20si=20la=20case=20=C3=A0=20cocher=20"Ajou?=
=?UTF-8?q?ter=20les=20actions=20class=C3=A9es=20"=20est=20activ?=
=?UTF-8?q?=C3=A9e=20lors=20du=20changement=20de=20statut=20de=20l'action?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../panier/components/PanierActions/index.tsx | 6 ++--
.../components/PanierRealtime/index.tsx | 30 +++++++++++++++++++
2 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/packages/panier/components/PanierActions/index.tsx b/packages/panier/components/PanierActions/index.tsx
index e3194e5e4d..5212b7c214 100644
--- a/packages/panier/components/PanierActions/index.tsx
+++ b/packages/panier/components/PanierActions/index.tsx
@@ -10,21 +10,21 @@ import {
} from '@tet/api';
import { Alert } from '@tet/ui';
import { AjouterActionsRealiseesOuEnCours } from './AjouterActionsRealiseesOuEnCours';
-import { useAjouterActionsRealiseesOuEnCoursState } from './useAjouterActionsRealiseesOuEnCoursState';
+import { AjouterActionsRealiseesOuEnCoursState } from './useAjouterActionsRealiseesOuEnCoursState';
type PanierActionsProps = {
panier: Panier;
budgets: ActionImpactFourchetteBudgetaire[];
+ ajouterActionsRealiseesOuEnCours: AjouterActionsRealiseesOuEnCoursState;
onToggleSelected: (actionId: number, selected: boolean) => void;
};
const PanierActions = ({
panier,
budgets,
+ ajouterActionsRealiseesOuEnCours,
onToggleSelected,
}: PanierActionsProps) => {
- const ajouterActionsRealiseesOuEnCours =
- useAjouterActionsRealiseesOuEnCoursState();
const { nbEnCours, nbRealisees } = ajouterActionsRealiseesOuEnCours;
// ventile les actions en sections par statut
diff --git a/packages/panier/components/PanierRealtime/index.tsx b/packages/panier/components/PanierRealtime/index.tsx
index 46c0f37b0a..c70890b4f2 100644
--- a/packages/panier/components/PanierRealtime/index.tsx
+++ b/packages/panier/components/PanierRealtime/index.tsx
@@ -14,6 +14,7 @@ import {
} from '@tet/panier/providers';
import {PartagerLeLien} from './PartagerLeLien';
import { ContenuListesFiltre } from '../FiltresActions/types';
+import { useAjouterActionsRealiseesOuEnCoursState } from '../PanierActions/useAjouterActionsRealiseesOuEnCoursState';
type PanierRealtimeProps = {
panier: Panier;
@@ -36,6 +37,8 @@ const PanierRealtime = ({
typologies,
}: PanierRealtimeProps) => {
const [currentTab, setCurrentTab] = useState('selection');
+ const ajouterActionsRealiseesOuEnCours =
+ useAjouterActionsRealiseesOuEnCoursState();
const router = useRouter();
const { setCollectiviteId } = useCollectiviteContext();
@@ -86,12 +89,38 @@ const PanierRealtime = ({
statusId: string | null
) => {
await panierAPI.setActionStatut(actionId, panier.id, statusId);
+
+ // ajoute/enlève l'action du panier si la case à cocher "Ajouter les
+ // actions classées " est activée
+ const inpanier = panier.inpanier.find((a) => a.id === actionId);
+ if (!inpanier) {
+ if (
+ (statusId === 'en_cours' &&
+ ajouterActionsRealiseesOuEnCours.ajoutEnCours) ||
+ (statusId === 'realise' &&
+ ajouterActionsRealiseesOuEnCours.ajoutRealisees)
+ ) {
+ await panierAPI.addActionToPanier(actionId, panier.id);
+ }
+ }
+ if (inpanier && inpanier.statut !== statusId) {
+ if (
+ (inpanier.statut === 'en_cours' &&
+ ajouterActionsRealiseesOuEnCours.ajoutEnCours) ||
+ (inpanier.statut === 'realise' &&
+ ajouterActionsRealiseesOuEnCours.ajoutRealisees)
+ ) {
+ await panierAPI.removeActionFromPanier(actionId, panier.id);
+ }
+ }
+
await tracker('statut', {
collectivite_preset: panier.collectivite_preset,
panier_id: panier.id,
action_id: actionId,
category_id: statusId,
});
+
router.refresh();
};
@@ -132,6 +161,7 @@ const PanierRealtime = ({
From e4814ccdc1d82d31d67db20fea5582b1300103a1 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 7 Oct 2024 16:34:45 +0200
Subject: [PATCH 76/91] =?UTF-8?q?Affiche=20dans=20l'en-t=C3=AAte=20le=20no?=
=?UTF-8?q?m=20de=20la=20collectivit=C3=A9=20associ=C3=A9e=20au=20panier?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/panier/components/Layout/Header.tsx | 45 +++++++++++++++-----
1 file changed, 34 insertions(+), 11 deletions(-)
diff --git a/packages/panier/components/Layout/Header.tsx b/packages/panier/components/Layout/Header.tsx
index aa9681fb76..e5425a3dea 100644
--- a/packages/panier/components/Layout/Header.tsx
+++ b/packages/panier/components/Layout/Header.tsx
@@ -2,24 +2,47 @@
import useLandingPathname from '@tet/panier/hooks/useLandingPathname';
import { Button, HeaderTeT, SITE_BASE_URL } from '@tet/ui';
+import { getAppBaseUrl } from '@tet/api';
+import { useCollectiviteInfo } from '@tet/panier/components/Landing/useCollectiviteInfo';
+import { usePanierContext } from '@tet/panier/providers';
const Header = () => {
const landingPathname = useLandingPathname();
+ const { panier } = usePanierContext();
+ const { data: collectiviteInfo } = useCollectiviteInfo(
+ panier?.collectivite_id ?? panier?.collectivite_preset ?? null
+ );
return (
[
-
- Qui sommes-nous ?
- ,
- ]}
+ quickAccessButtons={(props) => {
+ const buttons = [
+
+ Qui sommes-nous ?
+ ,
+ ];
+ if (collectiviteInfo) {
+ buttons.push(
+
+ {collectiviteInfo?.nom}
+
+ );
+ }
+ return buttons;
+ }}
/>
);
};
From d1ea64645358a22cb707cbaa61d1c2c733ab8db0 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 7 Oct 2024 16:53:31 +0200
Subject: [PATCH 77/91] =?UTF-8?q?Affiche=20un=20message=20invitant=20?=
=?UTF-8?q?=C3=A0=20se=20connecter=20quand=20on=20veut=20acc=C3=A9der=20au?=
=?UTF-8?q?=20panier=20d'une=20collectivit=C3=A9=20d=C3=A9j=C3=A0=20activ?=
=?UTF-8?q?=C3=A9e?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../panier/components/Landing/CestParti.tsx | 95 +++++++++++++------
.../components/Landing/SelectCollectivite.tsx | 28 ++++--
.../components/Landing/useCollectiviteInfo.ts | 29 +++++-
3 files changed, 111 insertions(+), 41 deletions(-)
diff --git a/packages/panier/components/Landing/CestParti.tsx b/packages/panier/components/Landing/CestParti.tsx
index ba9adee0c7..6edc441cfa 100644
--- a/packages/panier/components/Landing/CestParti.tsx
+++ b/packages/panier/components/Landing/CestParti.tsx
@@ -6,6 +6,8 @@ import {useParams, usePathname, useRouter} from 'next/navigation';
import {useEventTracker, Button, Icon} from '@tet/ui';
import SelectCollectivite from './SelectCollectivite';
import {useCollectiviteInfo} from './useCollectiviteInfo';
+import { getAuthPaths } from '@tet/api';
+import { useUserContext } from '../../providers';
const CestParti = () => {
const params = useParams();
@@ -15,57 +17,92 @@ const CestParti = () => {
const id = params['id'];
const collectiviteIdFromUrl = pathnameArray[2] === 'collectivite' && id;
const [collectiviteId, setCollectiviteId] = useState(
- collectiviteIdFromUrl ? parseInt(id as string) : null,
+ collectiviteIdFromUrl ? parseInt(id as string) : null
);
- const {data: collectiviteInfo} = useCollectiviteInfo(collectiviteId);
+ const { data: collectiviteInfo } = useCollectiviteInfo(collectiviteId);
+ const { user } = useUserContext();
const tracker = useEventTracker(
- collectiviteId ? 'panier/landing/collectivite' : 'panier/landing',
+ collectiviteId ? 'panier/landing/collectivite' : 'panier/landing'
);
const onClick = async () => {
const base = await panierAPI.panierFromLanding(collectiviteId);
collectiviteId
- ? tracker('cta_panier_click', {collectivite_preset: collectiviteId})
- : // @ts-expect-error
+ ? tracker('cta_panier_click', { collectivite_preset: collectiviteId })
+ : // @ts-expect-error traque même si la collectivité n'est pas spécifiée
tracker('cta_panier_click');
router.push(`/panier/${base.id}`);
};
+ // récupère les urls du module auth.
+ let authPaths;
+ if (typeof window !== 'undefined') {
+ const redirectTo = new URL(document.location.href);
+ redirectTo.pathname = `/landing/collectivite/${collectiviteId}`;
+ authPaths = getAuthPaths(document.location.hostname, redirectTo.toString());
+ }
+
+ const nonRattache =
+ collectiviteInfo?.active && !collectiviteInfo.isOwnCollectivite;
+ const nonConnecte = !user;
+
return (
-
- {!collectiviteIdFromUrl && (
-
-
- {collectiviteInfo?.engagee && (
-
-
-
-
- Vous êtes membre d'une collectivité déjà engagée dans le
- programme Territoire Engagé Transition Écologique ?
-
-
- Le panier d'actions basé principalement sur les actions des
- référentiels est conçu en priorité pour faciliter le passage à
- l'action aux collectivités qui ne sont pas encore engagées
- !
-
+ <>
+
+ {(!collectiviteId || (nonRattache && !nonConnecte)) && (
+
+
+ {!collectiviteInfo?.active && collectiviteInfo?.engagee && (
+
+
+
+
+ Vous êtes membre d'une collectivité déjà engagée dans
+ le programme Territoire Engagé Transition Écologique ?
+
+
+ Le panier d'actions basé principalement sur les actions
+ des référentiels est conçu en priorité pour faciliter le
+ passage à l'action aux collectivités qui ne sont pas
+ encore engagées !
+
+
+ )}
+
+ )}
+
+ {nonRattache && (
+ <>
+
+
+
+ {nonConnecte
+ ? 'Connectez-vous ou créez un compte pour contribuer sur le panier de cette collectivité.'
+ : "Vous n'êtes pas rattaché à cette collectivité."}
+
+
+ {nonConnecte && authPaths && (
+
+
+ Se connecter
+
+ Créer un compte
)}
-
+ >
)}
C'est parti !
-
+ >
);
};
diff --git a/packages/panier/components/Landing/SelectCollectivite.tsx b/packages/panier/components/Landing/SelectCollectivite.tsx
index d1c42fcc01..d7529f6164 100644
--- a/packages/panier/components/Landing/SelectCollectivite.tsx
+++ b/packages/panier/components/Landing/SelectCollectivite.tsx
@@ -3,6 +3,7 @@
import {useState} from 'react';
import {Select} from '@tet/ui';
import { useFilteredCollectivites } from './useFilteredCollectivites';
+import { useCollectiviteInfo } from './useCollectiviteInfo';
/**
* Permet de rechercher et sélectionner une collectivité
@@ -15,23 +16,34 @@ const SelectCollectivite = ({
onSelectCollectivite: (id: number | null) => void;
}) => {
const [search, setSearch] = useState('');
- const {data: collectivites, isLoading} = useFilteredCollectivites(search);
+ const { data: collectivites, isLoading } = useFilteredCollectivites(search);
+ const { data: collectiviteInfo } = useCollectiviteInfo(collectiviteId);
+
+ const options =
+ collectivites?.map((c) => ({
+ value: c.collectivite_id,
+ label: `${c.nom} (${c.departement_code})`,
+ })) || [];
+ if (
+ !collectivites?.find((c) => c.collectivite_id === collectiviteId) &&
+ collectiviteInfo
+ ) {
+ options.push({
+ value: collectiviteInfo.collectivite_id,
+ label: collectiviteInfo.nom,
+ });
+ }
return (
({
- value: c.collectivite_id!,
- label: `${c.nom!} (${c.departement_code})`,
- })) || []
- }
+ options={options}
values={collectiviteId ? collectiviteId : undefined}
isSearcheable
onSearch={setSearch}
isLoading={isLoading}
- onChange={value => {
+ onChange={(value) => {
const id = collectiviteId === value ? null : (value as number);
onSelectCollectivite(id);
}}
diff --git a/packages/panier/components/Landing/useCollectiviteInfo.ts b/packages/panier/components/Landing/useCollectiviteInfo.ts
index f5656190d5..b61a5419d1 100644
--- a/packages/panier/components/Landing/useCollectiviteInfo.ts
+++ b/packages/panier/components/Landing/useCollectiviteInfo.ts
@@ -1,6 +1,13 @@
import { supabase } from '../../src/clientAPI';
import useSWR from 'swr';
+type Collectivite = {
+ collectivite_id: number;
+ nom: string;
+ engagee?: boolean;
+ active?: boolean;
+};
+
/** Donne des infos sur une collectivité */
export const useCollectiviteInfo = (collectiviteId: number | null) => {
const key = `collectivite-info-${collectiviteId}`;
@@ -9,16 +16,30 @@ export const useCollectiviteInfo = (collectiviteId: number | null) => {
const { error, data } = await supabase
.from('site_labellisation')
- .select('collectivite_id, nom, engagee')
- .eq('collectivite_id', collectiviteId);
+ .select('collectivite_id, nom, engagee, active')
+ .eq('collectivite_id', collectiviteId)
+ .returns();
if (error) {
- throw new Error(key);
+ throw new Error(error.message);
}
if (!data || !data.length) {
return null;
}
- return data[0];
+ const { error: errorUserCollectivites, data: userCollectivites } =
+ await supabase
+ .from('mes_collectivites')
+ .select('collectivite_id')
+ .eq('collectivite_id', collectiviteId);
+ if (errorUserCollectivites) {
+ throw new Error(errorUserCollectivites.message);
+ }
+
+ const isOwnCollectivite = !!userCollectivites?.find(
+ (c) => c.collectivite_id === collectiviteId
+ );
+
+ return { ...data[0], isOwnCollectivite };
});
};
From 96d534e3448f640526b38998bbb9934a30cfcbf8 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 7 Oct 2024 17:16:52 +0200
Subject: [PATCH 78/91] Ajoute l'url du panier dans le build du site
---
.github/workflows/cd-site.yml | 1 +
Earthfile | 2 --
packages/site/.env.sample | 1 +
packages/site/Earthfile | 4 ++++
4 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/cd-site.yml b/.github/workflows/cd-site.yml
index 0d581f7c4f..637f749691 100644
--- a/.github/workflows/cd-site.yml
+++ b/.github/workflows/cd-site.yml
@@ -38,6 +38,7 @@ jobs:
--STRAPI_KEY=${{ secrets.STRAPI_KEY }} --STRAPI_URL=${{ secrets.STRAPI_URL }}
--POSTHOG_HOST=${{ secrets.POSTHOG_HOST }} --POSTHOG_KEY=${{ secrets.POSTHOG_KEY }}
--AXEPTIO_ID=${{ vars.AXEPTIO_ID }}
+ --PANIER_URL=${{ vars.PANIER_URL }}
--CRISP_WEBSITE_ID=${{ vars.CRISP_WEBSITE_ID }}
- name: Deploy site on Koyeb
diff --git a/Earthfile b/Earthfile
index 17cc5065a7..a15ef123f3 100644
--- a/Earthfile
+++ b/Earthfile
@@ -503,8 +503,6 @@ site-deploy:
ARG --required KOYEB_API_KEY
BUILD --pass-args ./packages/site+deploy
-
-
site-run: ## construit et lance l'image du site en local
ARG network=supabase_network_tet
LOCALLY
diff --git a/packages/site/.env.sample b/packages/site/.env.sample
index 27580ad037..7e92d3ef6b 100644
--- a/packages/site/.env.sample
+++ b/packages/site/.env.sample
@@ -2,3 +2,4 @@ NEXT_PUBLIC_SUPABASE_URL=http://localhost:8000
NEXT_PUBLIC_SUPABASE_ANON_KEY=${SUPABASE_ANON_KEY}
NEXT_PUBLIC_CRISP_WEBSITE_ID="// Crisp integration (warning: use different ID by deployment env.)"
NEXT_PUBLIC_AXEPTIO_ID=${AXEPTIO_ID}
+NEXT_PUBLIC_PANIER_URL=http://localhost:3002
diff --git a/packages/site/Earthfile b/packages/site/Earthfile
index 4b09aae46a..31bfba4768 100644
--- a/packages/site/Earthfile
+++ b/packages/site/Earthfile
@@ -8,6 +8,7 @@ build:
ARG --required STRAPI_KEY
ARG --required STRAPI_URL
ARG --required AXEPTIO_ID
+ ARG --required PANIER_URL
COPY . ./packages/site
@@ -22,6 +23,7 @@ build:
ENV NEXT_PUBLIC_POSTHOG_KEY=$POSTHOG_KEY
ENV NEXT_PUBLIC_AXEPTIO_ID=$AXEPTIO_ID
ENV NEXT_PUBLIC_CRISP_WEBSITE_ID=$CRISP_WEBSITE_ID
+ ENV NEXT_PUBLIC_PANIER_URL=$PANIER_URL
RUN pnpm build:site
@@ -37,6 +39,7 @@ docker:
ARG --required STRAPI_KEY
ARG --required STRAPI_URL
ARG --required AXEPTIO_ID
+ ARG --required PANIER_URL
ARG POSTHOG_HOST
ARG POSTHOG_KEY
@@ -48,6 +51,7 @@ docker:
ENV NEXT_PUBLIC_POSTHOG_KEY=$POSTHOG_KEY
ENV NEXT_PUBLIC_AXEPTIO_ID=$AXEPTIO_ID
ENV NEXT_PUBLIC_CRISP_WEBSITE_ID=$CRISP_WEBSITE_ID
+ ENV NEXT_PUBLIC_PANIER_URL=$PANIER_URL
ARG DOCKER_IMAGE=$SITE_IMG_NAME
From d3ead48f681516c8cadd7def4328a8aafb410265 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 7 Oct 2024 17:17:20 +0200
Subject: [PATCH 79/91] =?UTF-8?q?Ajoute=20le=20lien=20vers=20le=20panier?=
=?UTF-8?q?=20dans=20la=20page=20"outil=20num=C3=A9rique"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/site/app/outil-numerique/PanierActionsImpact.tsx | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/packages/site/app/outil-numerique/PanierActionsImpact.tsx b/packages/site/app/outil-numerique/PanierActionsImpact.tsx
index 6104ca167b..36bb8a6867 100644
--- a/packages/site/app/outil-numerique/PanierActionsImpact.tsx
+++ b/packages/site/app/outil-numerique/PanierActionsImpact.tsx
@@ -37,7 +37,10 @@ const PanierActionsImpact = ({
texte={description}
className="paragraphe-primary-10 paragraphe-18 markdown_style colored_marker"
/>
-
+
{cta}
From b35faeeb1342dc8ccbb235da9f79d1a6d52abf5c Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 7 Oct 2024 19:27:36 +0200
Subject: [PATCH 80/91] =?UTF-8?q?Corrige=20l'url=20d'acc=C3=A8s=20=C3=A0?=
=?UTF-8?q?=20la=20collectivit=C3=A9=20depuis=20l'en-t=C3=AAte=20du=20pani?=
=?UTF-8?q?er?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/panier/components/Layout/Header.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/panier/components/Layout/Header.tsx b/packages/panier/components/Layout/Header.tsx
index e5425a3dea..8c55e89780 100644
--- a/packages/panier/components/Layout/Header.tsx
+++ b/packages/panier/components/Layout/Header.tsx
@@ -35,7 +35,7 @@ const Header = () => {
key="nom"
href={`${getAppBaseUrl(
document.location.hostname
- )}/collectivite/${collectiviteInfo.collectivite_id}`}
+ )}/collectivite/${collectiviteInfo.collectivite_id}/accueil`}
>
{collectiviteInfo?.nom}
From 4f163c4dc099af78e42443dfe1fd612da3a5715b Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 7 Oct 2024 19:38:15 +0200
Subject: [PATCH 81/91] =?UTF-8?q?R=C3=A9pare=20l'=C3=A9tat=20de=20la=20cas?=
=?UTF-8?q?e=20=C3=A0=20cocher=20"Je=20suis=20r=C3=A9f=C3=A9rent.e=20dans.?=
=?UTF-8?q?.."?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../RejoindreUneCollectivite/RejoindreUneCollectivite.tsx | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/packages/auth/components/RejoindreUneCollectivite/RejoindreUneCollectivite.tsx b/packages/auth/components/RejoindreUneCollectivite/RejoindreUneCollectivite.tsx
index efc8149cca..7050a3313e 100644
--- a/packages/auth/components/RejoindreUneCollectivite/RejoindreUneCollectivite.tsx
+++ b/packages/auth/components/RejoindreUneCollectivite/RejoindreUneCollectivite.tsx
@@ -158,8 +158,9 @@ export const RejoindreUneCollectivite = (
- setFormState(previous => ({
+ checked={est_referent}
+ onChange={(e) =>
+ setFormState((previous) => ({
...previous,
est_referent: e.target.checked,
}))
From 5b086382883c9c2aa34926cd37ef36a5e86be396 Mon Sep 17 00:00:00 2001
From: Marc Rutkowski
Date: Mon, 7 Oct 2024 19:53:55 +0200
Subject: [PATCH 82/91] Ajoute Crisp dans l'app panier
---
.github/workflows/cd-panier.yml | 1 +
Earthfile | 2 ++
packages/panier/.env.sample | 1 +
packages/panier/app/layout.tsx | 13 +++++++++++++
packages/panier/middleware.ts | 11 +++++++----
5 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/cd-panier.yml b/.github/workflows/cd-panier.yml
index e9532f04f8..248d165a8c 100644
--- a/.github/workflows/cd-panier.yml
+++ b/.github/workflows/cd-panier.yml
@@ -36,6 +36,7 @@ jobs:
--ENV_NAME=${{ github.event.inputs.target }}
--POSTHOG_HOST=${{ secrets.POSTHOG_HOST }} --POSTHOG_KEY=${{ secrets.POSTHOG_KEY }}
--AXEPTIO_ID=${{ vars.AXEPTIO_ID }}
+ --CRISP_WEBSITE_ID=${{ vars.CRISP_WEBSITE_ID }}
--ANON_KEY=${{ secrets.ANON_KEY }} --API_URL=${{ secrets.API_URL }}
- name: Deploy panier on Koyeb
diff --git a/Earthfile b/Earthfile
index a15ef123f3..35ba1f572d 100644
--- a/Earthfile
+++ b/Earthfile
@@ -466,6 +466,7 @@ panier-build: ## construit l'image du panier
ARG POSTHOG_HOST
ARG POSTHOG_KEY
ARG AXEPTIO_ID
+ ARG CRISP_WEBSITE_ID
ARG vars
FROM +front-deps
ENV NEXT_PUBLIC_SUPABASE_ANON_KEY=$ANON_KEY
@@ -473,6 +474,7 @@ panier-build: ## construit l'image du panier
ENV NEXT_PUBLIC_POSTHOG_HOST=$POSTHOG_HOST
ENV NEXT_PUBLIC_POSTHOG_KEY=$POSTHOG_KEY
ENV NEXT_PUBLIC_AXEPTIO_ID=$AXEPTIO_ID
+ ENV NEXT_PUBLIC_CRISP_WEBSITE_ID=$CRISP_WEBSITE_ID
ENV NEXT_TELEMETRY_DISABLED=1
ENV PUBLIC_PATH="/app/packages/panier/public"
ENV PORT=80
diff --git a/packages/panier/.env.sample b/packages/panier/.env.sample
index cfdbb855c7..b04f6b760d 100644
--- a/packages/panier/.env.sample
+++ b/packages/panier/.env.sample
@@ -1,2 +1,3 @@
NEXT_PUBLIC_SUPABASE_URL=http://localhost:8000
NEXT_PUBLIC_SUPABASE_ANON_KEY=${SUPABASE_ANON_KEY}
+NEXT_PUBLIC_CRISP_WEBSITE_ID=""
diff --git a/packages/panier/app/layout.tsx b/packages/panier/app/layout.tsx
index 59588d0721..a56cc454d7 100644
--- a/packages/panier/app/layout.tsx
+++ b/packages/panier/app/layout.tsx
@@ -2,6 +2,7 @@ import './global.css';
import Footer from '@tet/panier/components/Layout/Footer';
import Header from '@tet/panier/components/Layout/Header';
import { StoreProvider } from '../providers';
+import Script from 'next/script';
export const metadata = {
title: 'Territoires en Transitions',
@@ -45,6 +46,18 @@ export default function RootLayout({