From 543fbb07085f31212600583fd05790227d0b3d59 Mon Sep 17 00:00:00 2001 From: Orka Arnest CRUZE Date: Mon, 14 Oct 2024 19:41:46 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20fin=20de=20formulaire=20g=C3=A9n=C3=A9r?= =?UTF-8?q?ation=20de=20pyramide=20raster=20#470?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/@types/app.ts | 11 +- assets/data/ol-defaults.json | 7 +- .../PyramidRasterGenerateForm.tsx | 115 +++++++++--------- .../ReportTab/ProcessingExecutionReport.tsx | 18 --- .../StoredDataDetails/StoredDataDetails.tsx | 2 +- assets/utils.ts | 10 ++ .../Entrepot/PyramidRasterController.php | 25 ++-- 7 files changed, 93 insertions(+), 95 deletions(-) diff --git a/assets/@types/app.ts b/assets/@types/app.ts index f12c65cb..6498e606 100644 --- a/assets/@types/app.ts +++ b/assets/@types/app.ts @@ -118,6 +118,10 @@ export type PyramidRaster = StoredData & { type: StoredDataPrivateDetailResponseDtoTypeEnum.ROK4PYRAMIDRASTER; tags: { datasheet_name?: string; + upload_id?: string; + proc_int_id?: string; + vectordb_id?: string; + proc_pyr_creat_id?: string; }; }; @@ -181,7 +185,12 @@ export type TmsMetadata = { }; /** configuration & offerings */ -export type Configuration = ConfigurationDetailResponseDto & { styles?: CartesStyle[] }; +export type Configuration = ConfigurationDetailResponseDto & { + styles?: CartesStyle[]; + tags: { + datasheet_name?: string; + }; +}; export type Offering = OfferingDetailResponseDto; export { OfferingStatusEnum } from "./entrepot"; diff --git a/assets/data/ol-defaults.json b/assets/data/ol-defaults.json index a688b3b7..fa321a98 100644 --- a/assets/data/ol-defaults.json +++ b/assets/data/ol-defaults.json @@ -1,10 +1,13 @@ { "default_background_layer": "GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2", - "center": [2.35, 48.85], + "center": [ + 2.35, + 48.85 + ], "projection": "EPSG:3857", "zoom": 10, "zoom_levels": { "TOP": 1, "BOTTOM": 18 } -} +} \ No newline at end of file diff --git a/assets/entrepot/pages/service/wms-raster-wmts/PyramidRasterGenerateForm.tsx b/assets/entrepot/pages/service/wms-raster-wmts/PyramidRasterGenerateForm.tsx index fcc3e1ed..e10a5fc6 100644 --- a/assets/entrepot/pages/service/wms-raster-wmts/PyramidRasterGenerateForm.tsx +++ b/assets/entrepot/pages/service/wms-raster-wmts/PyramidRasterGenerateForm.tsx @@ -5,14 +5,14 @@ import ButtonsGroup from "@codegouvfr/react-dsfr/ButtonsGroup"; import Input from "@codegouvfr/react-dsfr/Input"; import Stepper from "@codegouvfr/react-dsfr/Stepper"; import { yupResolver } from "@hookform/resolvers/yup"; -import { useMutation, useQuery } from "@tanstack/react-query"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { declareComponentKeys } from "i18nifty"; import { FC, useCallback, useState } from "react"; import { useForm } from "react-hook-form"; import * as yup from "yup"; import type { PyramidRaster, Service } from "../../../../@types/app"; -import type { BoundingBox, ConfigurationWmsVectorDetailsContent } from "../../../../@types/entrepot"; +import type { ConfigurationWmsVectorDetailsContent } from "../../../../@types/entrepot"; import DatastoreLayout from "../../../../components/Layout/DatastoreLayout"; import LoadingIcon from "../../../../components/Utils/LoadingIcon"; import LoadingText from "../../../../components/Utils/LoadingText"; @@ -24,26 +24,18 @@ import { Translations, useTranslation } from "../../../../i18n/i18n"; import RQKeys from "../../../../modules/entrepot/RQKeys"; import { CartesApiException } from "../../../../modules/jsonFetch"; import { routes } from "../../../../router/router"; +import { bboxToWkt } from "../../../../utils"; import api from "../../../api"; import { DatasheetViewActiveTabEnum } from "../../datasheet/DatasheetView/DatasheetView"; -function bboxToWkt(bbox: BoundingBox) { - const str = "POLYGON((west north,east north,east south,west south,west north))"; - - return str.replace(/[a-z]+/g, function (s) { - return bbox[s]; - }); -} - const STEPS = { TECHNICAL_NAME: 1, - // TOP_ZOOM_LEVEL: 2, - BOTTOM_ZOOM_LEVEL: 2, + ZOOM_RANGE: 2, }; type PyramidRasterGenerateFormType = { technical_name: string; - bottom_zoom_level: number; + zoom_range: number[]; }; type PyramidRasterGenerateFormProps = { @@ -63,21 +55,23 @@ const PyramidRasterGenerateForm: FC = ({ datasto staleTime: 60000, }); + const queryClient = useQueryClient(); + const schemas = {}; schemas[STEPS.TECHNICAL_NAME] = yup.object({ technical_name: yup.string().typeError(t("technical_name.error.mandatory")).required(t("technical_name.error.mandatory")), }); - schemas[STEPS.BOTTOM_ZOOM_LEVEL] = yup.object({ - bottom_zoom_level: yup.number().required(), + schemas[STEPS.ZOOM_RANGE] = yup.object({ + zoom_range: yup.array().of(yup.number()).length(2, t("zoom_range.error")).required(t("zoom_range.error")), }); const form = useForm({ resolver: yupResolver(schemas[currentStep]), mode: "onChange", defaultValues: { - technical_name: "test wms raster", - bottom_zoom_level: 10, + technical_name: "", + zoom_range: [4, 16], }, }); @@ -90,7 +84,7 @@ const PyramidRasterGenerateForm: FC = ({ datasto watch, } = form; - const bottomLevel = watch("bottom_zoom_level"); + const zoomRange = watch("zoom_range"); const generatePyramidRasterMutation = useMutation({ mutationFn: () => { @@ -100,19 +94,13 @@ const PyramidRasterGenerateForm: FC = ({ datasto wmsv_config_bbox: bboxToWkt((serviceQuery.data?.configuration.type_infos as ConfigurationWmsVectorDetailsContent).bbox!), }; - console.log("formData", formData); - return api.pyramidRaster.add(datastoreId, formData); }, onSuccess() { - // if (pyramidQuery.data?.tags?.datasheet_name) { - // queryClient.invalidateQueries({ - // queryKey: RQKeys.datastore_datasheet(datastoreId, pyramidQuery.data?.tags.datasheet_name), - // }); - // routes.datastore_datasheet_view({ datastoreId, datasheetName: pyramidQuery.data?.tags.datasheet_name, activeTab: "services" }).push(); - // } else { - // routes.datasheet_list({ datastoreId }).push(); - // } + queryClient.invalidateQueries({ + queryKey: RQKeys.datastore_datasheet(datastoreId, datasheetName), + }); + routes.datastore_datasheet_view({ datastoreId, datasheetName: datasheetName, activeTab: "dataset" }).push(); }, }); @@ -133,8 +121,6 @@ const PyramidRasterGenerateForm: FC = ({ datasto } }, [currentStep, generatePyramidRasterMutation, trigger]); - console.log("errors", errors); - return (

{t("title")}

@@ -157,12 +143,25 @@ const PyramidRasterGenerateForm: FC = ({ datasto } /> + ) : (serviceQuery.data?.configuration.type_infos as ConfigurationWmsVectorDetailsContent).bbox === undefined ? ( + + {t("back_to_datasheet")} + + } + /> ) : ( <> @@ -185,19 +184,22 @@ const PyramidRasterGenerateForm: FC = ({ datasto /> -
-

{t("bottom_zoom_level.lead_text")}

-

{t("bottom_zoom_level.explanation")}

- - setFormValue("bottom_zoom_level", values[0])} - step={1} - mode="top" - overlayContent={t("bottom_zoom_level.overlay_text")} - /> +
+

{t("zoom_range.lead_text")}

+

{t("zoom_range.explanation")}

+ {currentStep === STEPS.ZOOM_RANGE && ( + <> + setFormValue("zoom_range", values)} + step={1} + mode="both" + /> + {errors.zoom_range?.message !== undefined &&

{errors.zoom_range?.message}

} + + )}
()({ PyramidRasterGenerateForm, @@ -267,23 +270,24 @@ export const PyramidRasterGenerateFormFrTranslations: Translations<"fr">["Pyrami case 1: return "Nom de la pyramide de tuiles raster"; case 2: - return "Niveau de zoom bottom"; + return "Niveaux de pyramide"; default: return ""; } }, "wmsv-service.loading": "Chargement du service WMS-Vecteur...", "wmsv-service.fetch_failed": "Récupération des informations sur le service WMS-Vecteur a échoué", + "wmsv-service.bbox_not_found": "La bbox du service WMS-Vecteur n'a pas été trouvée, veuillez vérifier le service et la donnée stockée utilisée", back_to_datasheet: "Retour à la fiche de données", "technical_name.lead_text": "Choisissez le nom technique de la pyramide de tuiles raster", "technical_name.label": "Nom technique de la pyramide de tuiles raster", "technical_name.explanation": "II s'agit du nom technique du service qui apparaitra dans votre espace de travail, il ne sera pas publié en ligne. Si vous le renommez, choisissez un nom explicite.", "technical_name.error.mandatory": "Le nom technique de la pyramide de tuiles raster est obligatoire", - "bottom_zoom_level.lead_text": "Choisissez le niveau de zoom bottom de votre flux WMS-Vecteur", - "bottom_zoom_level.explanation": - "Les niveaux de zoom de la pyramide de tuiles raster sont prédéfinis. Choisissez la borne minimum de votre pyramide de tuiles en vous aidant de la carte de gauche. Le zoom maximum sur l’image de droite est fixe et ne peut être modifié. Tous les niveaux intermédiaires seront générés.", - "bottom_zoom_level.overlay_text": "Le zoom maximum est déterminé par la résolution des images fournies en entrée", + "zoom_range.lead_text": "Choisissez les niveaux de pyramide à générer", + "zoom_range.explanation": + "Les niveaux de zoom de la pyramide de tuiles raster sont prédéfinis. Choisissez la borne minimum de votre pyramide de tuiles en vous aidant de la carte de gauche et le zoom maximum en vous aidant de la carte de droite. Tous les niveaux intermédiaires seront générés.", + "zoom_range.error": "Les bornes de la pyramide sont obligatoires.", "generate.in_progress": "Génération de pyramide de tuiles raster en cours", }; @@ -292,13 +296,14 @@ export const PyramidRasterGenerateFormEnTranslations: Translations<"en">["Pyrami "step.title": undefined, "wmsv-service.loading": undefined, "wmsv-service.fetch_failed": undefined, + "wmsv-service.bbox_not_found": undefined, back_to_datasheet: undefined, "technical_name.error.mandatory": undefined, "technical_name.lead_text": undefined, "technical_name.label": undefined, "technical_name.explanation": undefined, - "bottom_zoom_level.lead_text": undefined, - "bottom_zoom_level.explanation": undefined, - "bottom_zoom_level.overlay_text": undefined, + "zoom_range.lead_text": undefined, + "zoom_range.explanation": undefined, + "zoom_range.error": undefined, "generate.in_progress": undefined, }; diff --git a/assets/entrepot/pages/stored_data/StoredDataDetails/ReportTab/ProcessingExecutionReport.tsx b/assets/entrepot/pages/stored_data/StoredDataDetails/ReportTab/ProcessingExecutionReport.tsx index e37e0cf7..ff4c7995 100644 --- a/assets/entrepot/pages/stored_data/StoredDataDetails/ReportTab/ProcessingExecutionReport.tsx +++ b/assets/entrepot/pages/stored_data/StoredDataDetails/ReportTab/ProcessingExecutionReport.tsx @@ -24,24 +24,6 @@ const ProcessingExecutionReport: FC = ({ process
  • {"Identifiant technique de la donnée en sortie :"} {processingExecution?.output?.stored_data._id}{" "}
  • -
  • - Entrée : -
    -                    {JSON.stringify(processingExecution.inputs, null, 4)}
    -                
    -
  • -
  • - Sortie : -
    -                    {JSON.stringify(processingExecution.output, null, 4)}
    -                
    -
  • -
  • - Paramètres : -
    -                    {JSON.stringify(processingExecution.parameters, null, 4)}
    -                
    -
  • diff --git a/assets/entrepot/pages/stored_data/StoredDataDetails/StoredDataDetails.tsx b/assets/entrepot/pages/stored_data/StoredDataDetails/StoredDataDetails.tsx index d5dbf2f3..b37b5f69 100644 --- a/assets/entrepot/pages/stored_data/StoredDataDetails/StoredDataDetails.tsx +++ b/assets/entrepot/pages/stored_data/StoredDataDetails/StoredDataDetails.tsx @@ -31,7 +31,7 @@ const StoredDataDetails: FC = ({ datastoreId, storedData const reportQuery = useQuery({ queryKey: RQKeys.datastore_stored_data_report(datastoreId, storedDataId), queryFn: ({ signal }) => api.storedData.getReportData(datastoreId, storedDataId, { signal }), - refetchInterval: 60000, + refetchInterval: 30000, enabled: reportQueryEnabled, }); diff --git a/assets/utils.ts b/assets/utils.ts index dcc79148..7fe3b1bb 100644 --- a/assets/utils.ts +++ b/assets/utils.ts @@ -11,6 +11,7 @@ import charsets from "./data/charset_list.json"; // https://github.com/haliaeetus/iso-639/blob/master/data/iso_639-2.json import langs from "./data/iso_639-2.json"; import { OfferingTypeEnum } from "./@types/app"; +import { BoundingBox } from "./@types/entrepot"; export type LanguageType = { language: string; @@ -221,6 +222,14 @@ const trimObject = (obj: object): object => { return newObject; }; +const bboxToWkt = (bbox: BoundingBox) => { + const str = "POLYGON((west north,east north,east south,west south,west north))"; + + return str.replace(/[a-z]+/g, function (s) { + return bbox[s]; + }); +}; + export { getInspireKeywords, getLanguages, @@ -237,4 +246,5 @@ export { formatDateWithoutTimeFromISO, getArrayRange, trimObject, + bboxToWkt, }; diff --git a/src/Controller/Entrepot/PyramidRasterController.php b/src/Controller/Entrepot/PyramidRasterController.php index 95b1b7bb..6685e9a1 100644 --- a/src/Controller/Entrepot/PyramidRasterController.php +++ b/src/Controller/Entrepot/PyramidRasterController.php @@ -42,20 +42,6 @@ public function __construct( parent::__construct($datastoreApiService, $configurationApiService, $cartesServiceApiService, $capabilitiesService, $cartesMetadataApiService, $sandboxService); } - /** - * @param array $bbox - */ - private function bboxToWkt(array $bbox): string - { - $str = 'POLYGON((west north,east north,east south,west south,west north))'; - - return preg_replace_callback('/[a-z]+/', function ($matches) use ($bbox) { - $key = $matches[0]; - - return $bbox[$key]; - }, $str); - } - #[Route('/add', name: 'add', methods: ['POST'])] public function add(string $datastoreId, Request $request): JsonResponse { @@ -81,6 +67,9 @@ public function add(string $datastoreId, Request $request): JsonResponse throw new AppException('URL du service WMS-Vecteur non trouvée', Response::HTTP_BAD_REQUEST); } + $zoomRange = $data['zoom_range']; + $harvestLevels = array_map(fn ($v) => strval($v), array_reverse(range($zoomRange[0], $zoomRange[1], 1), false)); + $requestBody = [ 'processing' => $processingId, 'output' => [ @@ -93,13 +82,13 @@ public function add(string $datastoreId, Request $request): JsonResponse 'sampleformat' => 'UINT8', 'tms' => 'PM', 'compression' => 'jpg', - 'bottom' => '14', - 'harvest_levels' => ['14', '10'], + 'bottom' => strval($zoomRange[1]), + 'harvest_levels' => $harvestLevels, + 'harvest_format' => 'image/jpeg', 'harvest_url' => $harvestUrl, 'harvest_layers' => $wmsvOffering['layer_name'], - 'harvest_area' => $data['wmsv_config_bbox'] ?? $this->bboxToWkt($wmsvConfiguration['type_infos']['bbox']), - // 'POLYGON((1.999375 50.25875,5.8734375 50.25875,5.8734375 47.940898437,1.999375 47.940898437,1.999375 50.25875))', + 'harvest_area' => $data['wmsv_config_bbox'], ], ];