diff --git a/main.go b/main.go index 01b7b732..85c30d7f 100644 --- a/main.go +++ b/main.go @@ -188,6 +188,19 @@ func main() { return katsuRequest(path, nil, c, jsonDeserialize) } + katsuRequestFormattedData := func(path string, c echo.Context) ([]byte, error) { + result, err := genericRequestJsonOnly(fmt.Sprintf("%s%s", cfg.KatsuUrl, path), nil, c, jsonDeserialize) + if err != nil { + return nil, err + } + // Convert the result data to formatted JSON + jsonFormattedData, err := json.MarshalIndent(result, "", " ") + if err != nil { + return nil, fmt.Errorf("error formatting JSON: %w", err) + } + return jsonFormattedData, nil + } + wesRequestWithDetailsAndPublic := func(c echo.Context) error { qs := url.Values{} qs.Add("with_details", "true") @@ -353,6 +366,22 @@ func main() { return katsuRequestBasic("/api/public_dataset", c) }) + e.GET("/datasets/:id/dats", func(c echo.Context) error { + id := c.Param("id") + relativeUrl := fmt.Sprintf("/api/datasets/%s/dats", id) + + data, err := katsuRequestFormattedData(relativeUrl, c) + if err != nil { + return err + } + + // Set the content type and disposition for download + c.Response().Header().Set("Content-Disposition", `attachment; filename="DATS.json"`) + c.Response().Header().Set("Content-Type", "application/json") + + return c.String(http.StatusOK, string(data)) + }) + // Run e.Logger.Fatal(e.Start(fmt.Sprintf(":%d", cfg.Port))) } diff --git a/src/js/components/Provenance/DatasetProvenance.tsx b/src/js/components/Provenance/DatasetProvenance.tsx index ed66b908..1dd574b3 100644 --- a/src/js/components/Provenance/DatasetProvenance.tsx +++ b/src/js/components/Provenance/DatasetProvenance.tsx @@ -9,6 +9,7 @@ import SpatialCoverageTable from './Tables/SpatialCoverageTable'; import ExtraPropertiesTable from './Tables/ExtraPropertiesTable'; import PublicationsTable from './Tables/PublicationsTable'; import CreatedByTable from './Tables/CreatedByTable'; +import DownloadDats from './DownloadDats'; import { DEFAULT_TRANSLATION, NON_DEFAULT_TRANSLATION } from '@/constants/configConstants'; import { ProvenanceStoreDataset } from '@/types/provenance'; @@ -90,6 +91,9 @@ const DatasetProvenance = ({ metadata, loading }: DatasetProvenanceProps) => { {/* --- EXTRA PROPERTIES ---*/} + + {/* --- DOWNLOAD DATS --- */} + ); diff --git a/src/js/components/Provenance/DownloadDats.tsx b/src/js/components/Provenance/DownloadDats.tsx new file mode 100644 index 00000000..95b35d85 --- /dev/null +++ b/src/js/components/Provenance/DownloadDats.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { Button, Space } from 'antd'; +import { DownloadOutlined } from '@ant-design/icons'; +import { useTranslation } from 'react-i18next'; +import { ProvenanceStoreDataset } from '@/types/provenance'; + +const DownloadDats = ({ metadata }: { metadata: ProvenanceStoreDataset }) => { + const { t } = useTranslation(); + + const exportData = () => { + const id = metadata.identifier; + window.location.href = `/datasets/${id}/dats`; + }; + + const isDatsFileEmpty = metadata && metadata.dats_file ? Object.keys(metadata.dats_file).length === 0 : true; + + return ( + + + + ); +}; + +DownloadDats.propTypes = { + metadata: PropTypes.object.isRequired, +}; + +export default DownloadDats; diff --git a/src/js/types/provenance.ts b/src/js/types/provenance.ts index 31371592..c44bfef3 100644 --- a/src/js/types/provenance.ts +++ b/src/js/types/provenance.ts @@ -11,6 +11,7 @@ export interface Dataset { description: string; title: string; version: string; + identifier: string; } export interface DatsFile { diff --git a/src/public/locales/en/translation_en.json b/src/public/locales/en/translation_en.json index e272b39d..3b8c08a5 100644 --- a/src/public/locales/en/translation_en.json +++ b/src/public/locales/en/translation_en.json @@ -9,5 +9,6 @@ "MALE": "MALE", "FEMALE": "FEMALE", "I have no problems in walking about": "I have no problems in walking about", - "Results": "Results" + "Results": "Results", + "Download DATS File": "Download DATS File" } \ No newline at end of file diff --git a/src/public/locales/fr/translation_fr.json b/src/public/locales/fr/translation_fr.json index 97d12d8f..68448c6b 100644 --- a/src/public/locales/fr/translation_fr.json +++ b/src/public/locales/fr/translation_fr.json @@ -9,5 +9,6 @@ "Lab Test Result": "Résultats des tests de laboratoire", "Experiment Types": "Types d'expériences", "I have no problems in walking about": "Je n’ai aucun problème à marcher", - "Results": "Résultats" + "Results": "Résultats", + "Download DATS File": "Télécharger le fichier DATS" } \ No newline at end of file