From 7e7fbf3f93de58e5b79ce9ce0879d730065ca963 Mon Sep 17 00:00:00 2001 From: Majk Shkurti Date: Mon, 24 Jun 2024 01:24:22 +0200 Subject: [PATCH] fixes --- .../map/common/LayerFieldSelector.tsx | 1 + apps/web/components/modals/DatasetTable.tsx | 134 +++++++++++++++--- apps/web/i18n/locales/de/common.json | 27 ++-- apps/web/i18n/locales/en/common.json | 1 + apps/web/lib/validations/layer.ts | 2 +- 5 files changed, 129 insertions(+), 36 deletions(-) diff --git a/apps/web/components/map/common/LayerFieldSelector.tsx b/apps/web/components/map/common/LayerFieldSelector.tsx index 1121aa33..30245d2c 100644 --- a/apps/web/components/map/common/LayerFieldSelector.tsx +++ b/apps/web/components/map/common/LayerFieldSelector.tsx @@ -42,6 +42,7 @@ export const containsText = (text: string, searchText: string) => export const FieldTypeColors = { string: [140, 210, 205], number: [248, 194, 28], + object: [255, 138, 101], }; export const FieldTypeTag = styled("div")<{ fieldType: string }>( diff --git a/apps/web/components/modals/DatasetTable.tsx b/apps/web/components/modals/DatasetTable.tsx index 98e94fd5..148fd7c3 100644 --- a/apps/web/components/modals/DatasetTable.tsx +++ b/apps/web/components/modals/DatasetTable.tsx @@ -1,7 +1,7 @@ import { FieldTypeTag } from "@/components/map/common/LayerFieldSelector"; import useLayerFields from "@/hooks/map/CommonHooks"; import { useDatasetCollectionItems } from "@/lib/api/layers"; -import { IconButton, Skeleton } from "@mui/material"; +import { Box, Collapse, IconButton, Skeleton } from "@mui/material"; import type { GetCollectionItemsQueryParams, @@ -22,7 +22,9 @@ import { TableRow, Typography, } from "@mui/material"; -import { useEffect, useState } from "react"; +import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown"; +import KeyboardArrowUpIcon from "@mui/icons-material/KeyboardArrowUp"; +import { useEffect, useMemo, useState } from "react"; import { ICON_NAME, Icon } from "@p4b/ui/components/Icon"; import NoValuesFound from "@/components/map/common/NoValuesFound"; @@ -33,6 +35,93 @@ interface DatasetTableDialogProps { dataset: ProjectLayer | Layer; } +const Row = ({ row, fields }) => { + const [open, setOpen] = useState(false); + + const primitiveFields = useMemo( + () => fields.filter((field) => field.type !== "object"), + [fields], + ); + + const objectFields = useMemo( + () => fields.filter((field) => field.type === "object"), + [fields], + ); + + return ( + <> + + {objectFields.length > 0 && ( + + setOpen(!open)} + > + {open ? : } + + + )} + {primitiveFields.map((field, fieldIndex) => ( + {row.properties[field.name]} + ))} + + + {!!objectFields.length && ( + + + + + {objectFields.map((field) => { + const jsonData = JSON.parse(row.properties[field.name]); + return ( + <> + + + {field.name} + + + {field.type} + + + + + + {jsonData.length > 0 && + Object.keys(jsonData[0]).map((key) => ( + {key} + ))} + + + + {jsonData.map((item, rowIndex) => ( + + {Object.values(item).map((value: string, cellIndex) => ( + {value} + ))} + + ))} + +
+ + ); + })} +
+
+
+
+ )} + + ); +}; + const DatasetTableModal: React.FC = ({ open, onClose, @@ -40,7 +129,7 @@ const DatasetTableModal: React.FC = ({ }) => { const { layerFields: fields, isLoading: areFieldsLoading } = useLayerFields( dataset["layer_id"] || dataset["id"] || "", - undefined + undefined, ); const defaultParams = { limit: 50, @@ -56,6 +145,8 @@ const DatasetTableModal: React.FC = ({ dataQueryParams, ); + console.log(data); + const [displayData, setDisplayData] = useState(data); useEffect(() => { if (data) { @@ -105,18 +196,23 @@ const DatasetTableModal: React.FC = ({ - {fields.map((field, index) => ( - - - - {field.name} - - - {field.type} - - - - ))} + {fields.some((field) => field.type === "object") && ( + + )} + {fields + .filter((field) => field.type !== "object") + .map((field, index) => ( + + + + {field.name} + + + {field.type} + + + + ))} @@ -133,13 +229,7 @@ const DatasetTableModal: React.FC = ({ )} {displayData.features?.length && displayData.features.map((row) => ( - - {fields.map((field, fieldIndex) => ( - - {row.properties[field.name]} - - ))} - + ))}
diff --git a/apps/web/i18n/locales/de/common.json b/apps/web/i18n/locales/de/common.json index d590817e..14aae76f 100644 --- a/apps/web/i18n/locales/de/common.json +++ b/apps/web/i18n/locales/de/common.json @@ -134,7 +134,7 @@ "create_message": "Erstellen Sie Teams, um Ihre Projekte einfach zu verwalten", "create_new_dataset": "Neuen Datensatz erstellen", "create_new_project": "Neues Projekt erstellen", - "create_scenario": "", + "create_scenario": "Szenario erstellen", "created": "Erstellt", "created_successfully": "Ordner erfolgreich erstellt", "csv": "CSV", @@ -176,8 +176,8 @@ "delete_project": "Projekt löschen", "delete_project_error": "Fehler beim Löschen des Projekts", "delete_project_success": "Projekt erfolgreich gelöscht", - "delete_scenario": "", - "delete_scenario_confirmation": "", + "delete_scenario": "Szenario löschen", + "delete_scenario_confirmation": "Sind Sie sicher, dass Sie das Szenario {{scenario}} löschen möchten?", "delete_starting_point": "Startpunkt löschen", "deleted_successfully": "Ordner erfolgreich gelöscht", "desc": "Absteigend", @@ -198,7 +198,7 @@ "duplicate": "Duplizieren", "edit": "Bearbeiten", "edit_metadata": "Metadaten bearbeiten", - "edit_scenario": "", + "edit_scenario": "Szenario bearbeiten", "editor": "Bearbeiter", "eg": "z.B.", "email": "E-Mail", @@ -212,8 +212,8 @@ "error": "Fehler", "error_adding_layer": "Fehler beim Hinzufügen des Layers", "error_creating_project": "Fehler beim Erstellen des Projekts", - "error_creating_scenario": "", - "error_deleting_scenario": "", + "error_creating_scenario": "Fehler beim Erstellen des Szenarios", + "error_deleting_scenario": "Fehler beim Löschen des Szenarios", "error_downloading": "Fehler beim Herunterladen", "error_duplicating_layer": "Fehler beim Duplizieren der Ebene", "error_loading_chart_data": "Fehler beim Laden der Diagrammdaten", @@ -229,7 +229,7 @@ "error_running_oev_gueteklassen": "Fehler beim Ausführen der ÖV-Güteklassen", "error_running_trip_count": "Fehler beim Ausführen der Abfahrten-Berechnung", "error_updating_project_layer_order": "Fehler beim Aktualisieren der Reihenfolge der Projektlayer", - "error_updating_scenario": "", + "error_updating_scenario": "Fehler beim Aktualisierungsszenario", "error_uploading_dataset": "Fehler beim Hochladen des Datensatzes", "exit_fullscreen": "Beenden Sie den Vollbildmodus", "expired": "Abgelaufen", @@ -499,7 +499,7 @@ "no_projects_found": "Keine Projekte gefunden", "no_result": "Kein Ergebnis", "no_result_found": "Keine Ergebnisse gefunden!", - "no_scenarios_created": "", + "no_scenarios_created": "Keine Szenarien erstellt", "no_starting_points_added": "Keine Startpunkte hinzugefügt", "no_table_layers": "Keine Tabellen-Layer gefunden", "no_values_found": "Keine Werte gefunden", @@ -517,7 +517,7 @@ "oev_gueteklasse_header": "ÖV-Güteklassen", "oev_gueteklassen_computation_started": "Berechnung der ÖV-Güteklassen gestartet", "oev_guteklassen": "ÖV-Güteklassen", - "ok": "", + "ok": "OK", "opacity": "Deckkraft", "open_data_table": "Daten ansehen", "open_documentation": "Dokumentation öffnen", @@ -697,10 +697,10 @@ "save_as_default": "Speichern als Standard", "save_in_folder": "In Ordner speichern", "scenario": "Szenario", - "scenario_created_successfully": "", - "scenario_deleted_success": "", - "scenario_updated_successfully": "", - "scenarios": "", + "scenario_created_successfully": "Szenario erfolgreich erstellt", + "scenario_deleted_success": "Szenario erfolgreich gelöscht", + "scenario_updated_successfully": "Szenario erfolgreich aktualisiert", + "scenarios": "Szenarien", "search": "Suche", "search_address": "Adresse suchen", "search_datasets": "Datensatz durchsuchen", @@ -794,6 +794,7 @@ "starting": "Startpunkte", "starting_point": "Startpunkt", "starting_point_desc": "Wählen Sie eine Variante aus um die Startpunkte auszuwählen", + "starting_point_max_points": "Maximale Startpunkte:", "starting_points": "Starting Points", "station_configuration": "Station Konfiguration", "statistics": "Statistiken", diff --git a/apps/web/i18n/locales/en/common.json b/apps/web/i18n/locales/en/common.json index eee6d2a0..57fa520b 100644 --- a/apps/web/i18n/locales/en/common.json +++ b/apps/web/i18n/locales/en/common.json @@ -794,6 +794,7 @@ "starting": "Starting Points", "starting_point": "Starting Point", "starting_point_desc": "Chose a way to select the starting point/s of the catchment area", + "starting_point_max_points": "Maximum starting points:", "starting_points": "Starting Points", "station_configuration": "Station Configuration", "statistics": "Statistics", diff --git a/apps/web/lib/validations/layer.ts b/apps/web/lib/validations/layer.ts index 07b00ab3..4ff24ba2 100644 --- a/apps/web/lib/validations/layer.ts +++ b/apps/web/lib/validations/layer.ts @@ -30,7 +30,7 @@ export const classBreaks = z.enum([ export const sizeScale = z.enum(["linear", "logarithmic", "exponential"]); const layerFieldType = z.object({ name: z.string(), - type: z.union([z.literal("string"), z.literal("number")]), + type: z.union([z.literal("string"), z.literal("number"), z.literal("object")]), }); export const layerClassBreaks = z.object({