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 (
+
+ } onClick={exportData} disabled={isDatsFileEmpty}>
+ {t('Download DATS File')}
+
+
+ );
+};
+
+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