From 92726e75c8360d09b314964c0d23f1307de0ee23 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Fri, 22 May 2026 16:26:48 +0200 Subject: [PATCH 1/6] feat: support exporting data to platform without integration --- client/eslint.config.mjs | 2 + .../deposits/DepositCreationModal.tsx | 39 +++++++++++-------- .../deposits/deposits.constants.ts | 6 ++- .../deposits/deposits.types.ts | 10 ++++- 4 files changed, 36 insertions(+), 21 deletions(-) diff --git a/client/eslint.config.mjs b/client/eslint.config.mjs index 9f560fde9d..9201e84a99 100644 --- a/client/eslint.config.mjs +++ b/client/eslint.config.mjs @@ -93,6 +93,8 @@ const jsRules = { "dropdown", "dropzone", "enum", + "envi", + "envidat", "etag", "favicon", "fetchable", diff --git a/client/src/features/dataConnectorsV2/deposits/DepositCreationModal.tsx b/client/src/features/dataConnectorsV2/deposits/DepositCreationModal.tsx index f56b3caca4..a6ebbb28d5 100644 --- a/client/src/features/dataConnectorsV2/deposits/DepositCreationModal.tsx +++ b/client/src/features/dataConnectorsV2/deposits/DepositCreationModal.tsx @@ -22,7 +22,7 @@ import { useGetOauth2ConnectionsQuery, useGetOauth2ProvidersQuery, } from "~/features/connectedServices/api/connectedServices.api"; -import { DataConnectorRead } from "../api/data-connectors.api"; +import { DataConnectorRead, DepositProvider } from "../api/data-connectors.api"; import { usePostDepositsMutation } from "../api/data-connectors.enhanced-api"; import DepositIntegrationInfo from "./DepositIntegrationInfo"; import { PROVIDER_OPTIONS } from "./deposits.constants"; @@ -50,26 +50,29 @@ export default function DepositCreationModal({ }); const [postDeposit, result] = usePostDepositsMutation(); - // Fetch connection information for the selected provider + // Fetch connection information for the selected provider if necessary const userSelectedProvider = useWatch({ control, name: "provider", }); - const targetProviderString = ["zenodo"].includes(userSelectedProvider) - ? userSelectedProvider - : null; + const targetProviderIntegration = PROVIDER_OPTIONS.find( + (provider) => + provider.value === userSelectedProvider && provider.integration, + )?.integration; const { data: providers, error: providersError, isLoading: isLoadingProviders, - } = useGetOauth2ProvidersQuery(targetProviderString ? undefined : skipToken); + } = useGetOauth2ProvidersQuery( + targetProviderIntegration ? undefined : skipToken, + ); const targetProvider = useMemo(() => { return providers?.find( - (provider) => provider.kind === targetProviderString, + (provider) => provider.kind === targetProviderIntegration, ); - }, [providers, targetProviderString]); + }, [providers, targetProviderIntegration]); const { data: connections, @@ -92,7 +95,7 @@ export default function DepositCreationModal({ data_connector_id: dataConnector?.id ?? "", name: data.name, path: data.path, - provider: data.provider, + provider: data.provider as DepositProvider, // ! Temp -- remove }, }); }, @@ -216,14 +219,16 @@ export default function DepositCreationModal({ Different platforms might have different limitations/requirements. -
- -
+ {targetProviderIntegration && ( +
+ +
+ )} diff --git a/client/src/features/dataConnectorsV2/deposits/deposits.constants.ts b/client/src/features/dataConnectorsV2/deposits/deposits.constants.ts index 7713ddc1d6..a2fe7ad96f 100644 --- a/client/src/features/dataConnectorsV2/deposits/deposits.constants.ts +++ b/client/src/features/dataConnectorsV2/deposits/deposits.constants.ts @@ -3,6 +3,8 @@ import { ProviderOption } from "./deposits.types"; export const POLL_TIME_INACTIVE_DEPOSITS = 60_000; export const POLL_TIME_ACTIVE_DEPOSITS = 5_000; export const PROVIDER_OPTIONS: ProviderOption[] = [ - { value: "zenodo", label: "Zenodo" }, + { value: "zenodo", label: "Zenodo", integration: "zenodo" }, + { value: "envidat", label: "EnviDat", integration: undefined }, ]; -export const LAST_DEPOSIT_QUERY_PARAMS = { page: 1, per_page: 1 }; // We only consider the last deposit for now +// ? We only consider the last deposit for now +export const LAST_DEPOSIT_QUERY_PARAMS = { page: 1, per_page: 1 }; diff --git a/client/src/features/dataConnectorsV2/deposits/deposits.types.ts b/client/src/features/dataConnectorsV2/deposits/deposits.types.ts index 2e09cd473c..7e667a6e93 100644 --- a/client/src/features/dataConnectorsV2/deposits/deposits.types.ts +++ b/client/src/features/dataConnectorsV2/deposits/deposits.types.ts @@ -1,13 +1,19 @@ import { DepositProvider, DepositStatus } from "../api/data-connectors.api"; +type DepositProviders = DepositProvider | "envidat"; + export interface CreateDepositionForm { name: string; path: string; - provider: DepositProvider; + provider: DepositProviders; } export interface EditDepositionForm { name: string; path: string; status: DepositStatus; } -export type ProviderOption = { value: DepositProvider; label: string }; +export type ProviderOption = { + value: DepositProviders; + label: string; + integration?: string; +}; From 31c3b899db1ea066a96698295adc23c6361d5a9a Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Tue, 9 Jun 2026 15:17:38 +0200 Subject: [PATCH 2/6] chore: update api spec --- client/src/features/dataConnectorsV2/api/data-connectors.api.ts | 2 +- .../features/dataConnectorsV2/api/data-connectors.openapi.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/features/dataConnectorsV2/api/data-connectors.api.ts b/client/src/features/dataConnectorsV2/api/data-connectors.api.ts index 1b66705179..6cfce94aa1 100644 --- a/client/src/features/dataConnectorsV2/api/data-connectors.api.ts +++ b/client/src/features/dataConnectorsV2/api/data-connectors.api.ts @@ -648,7 +648,7 @@ export type DataConnectorSecretPatch = { value: SecretValueNullable; }; export type DataConnectorSecretPatchList = DataConnectorSecretPatch[]; -export type DepositProvider = "zenodo"; +export type DepositProvider = "zenodo" | "envidat"; export type DepositSourcePath = string; export type DepositPost = { name: DataConnectorName; diff --git a/client/src/features/dataConnectorsV2/api/data-connectors.openapi.json b/client/src/features/dataConnectorsV2/api/data-connectors.openapi.json index 6e719bbbae..875011e002 100644 --- a/client/src/features/dataConnectorsV2/api/data-connectors.openapi.json +++ b/client/src/features/dataConnectorsV2/api/data-connectors.openapi.json @@ -1623,7 +1623,7 @@ }, "DepositProvider": { "type": "string", - "enum": ["zenodo"] + "enum": ["zenodo", "envidat"] }, "DepositStatus": { "type": "string", From 4b6bc10768e5ac85c50681edb134850b89794a33 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Tue, 9 Jun 2026 15:20:29 +0200 Subject: [PATCH 3/6] remove unnecessary code for envidat --- .../dataConnectorsV2/deposits/DepositCreationModal.tsx | 4 ++-- .../src/features/dataConnectorsV2/deposits/deposits.types.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/features/dataConnectorsV2/deposits/DepositCreationModal.tsx b/client/src/features/dataConnectorsV2/deposits/DepositCreationModal.tsx index a6ebbb28d5..bfc9adebab 100644 --- a/client/src/features/dataConnectorsV2/deposits/DepositCreationModal.tsx +++ b/client/src/features/dataConnectorsV2/deposits/DepositCreationModal.tsx @@ -22,7 +22,7 @@ import { useGetOauth2ConnectionsQuery, useGetOauth2ProvidersQuery, } from "~/features/connectedServices/api/connectedServices.api"; -import { DataConnectorRead, DepositProvider } from "../api/data-connectors.api"; +import { DataConnectorRead } from "../api/data-connectors.api"; import { usePostDepositsMutation } from "../api/data-connectors.enhanced-api"; import DepositIntegrationInfo from "./DepositIntegrationInfo"; import { PROVIDER_OPTIONS } from "./deposits.constants"; @@ -95,7 +95,7 @@ export default function DepositCreationModal({ data_connector_id: dataConnector?.id ?? "", name: data.name, path: data.path, - provider: data.provider as DepositProvider, // ! Temp -- remove + provider: data.provider, }, }); }, diff --git a/client/src/features/dataConnectorsV2/deposits/deposits.types.ts b/client/src/features/dataConnectorsV2/deposits/deposits.types.ts index 7e667a6e93..e98053fe0d 100644 --- a/client/src/features/dataConnectorsV2/deposits/deposits.types.ts +++ b/client/src/features/dataConnectorsV2/deposits/deposits.types.ts @@ -1,6 +1,6 @@ import { DepositProvider, DepositStatus } from "../api/data-connectors.api"; -type DepositProviders = DepositProvider | "envidat"; +type DepositProviders = DepositProvider; export interface CreateDepositionForm { name: string; From d2d1b032cae5d47845e343d01d51443fa5792ed8 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Tue, 9 Jun 2026 16:48:15 +0200 Subject: [PATCH 4/6] add envidat specific changes --- .../deposits/DepositCreationModal.tsx | 24 ++++++++++- .../deposits/DepositEditModal.tsx | 42 +++++++++++++------ .../deposits/deposits.constants.ts | 5 +++ 3 files changed, 57 insertions(+), 14 deletions(-) diff --git a/client/src/features/dataConnectorsV2/deposits/DepositCreationModal.tsx b/client/src/features/dataConnectorsV2/deposits/DepositCreationModal.tsx index bfc9adebab..7715f461f5 100644 --- a/client/src/features/dataConnectorsV2/deposits/DepositCreationModal.tsx +++ b/client/src/features/dataConnectorsV2/deposits/DepositCreationModal.tsx @@ -16,7 +16,9 @@ import { ModalHeader, } from "reactstrap"; +import { WarnAlert } from "~/components/Alert"; import RtkOrDataServicesError from "~/components/errors/RtkOrDataServicesError"; +import ExternalLink from "~/components/ExternalLink"; import { Loader } from "~/components/Loader"; import { useGetOauth2ConnectionsQuery, @@ -25,7 +27,7 @@ import { import { DataConnectorRead } from "../api/data-connectors.api"; import { usePostDepositsMutation } from "../api/data-connectors.enhanced-api"; import DepositIntegrationInfo from "./DepositIntegrationInfo"; -import { PROVIDER_OPTIONS } from "./deposits.constants"; +import { ENVIDAT_DASHBOARD_URL, PROVIDER_OPTIONS } from "./deposits.constants"; import { CreateDepositionForm } from "./deposits.types"; interface DepositCreationModalProps { @@ -229,6 +231,11 @@ export default function DepositCreationModal({ /> )} + {userSelectedProvider === "envidat" && ( +
+ +
+ )} @@ -264,3 +271,18 @@ export default function DepositCreationModal({ ); } + +export function EnviDatWarning() { + return ( + +

+ You need an account with Editor permissions on the{" "} + + EnviDat platform + {" "} + to publish Datasets. Please check your account before starting the + export. +

+
+ ); +} diff --git a/client/src/features/dataConnectorsV2/deposits/DepositEditModal.tsx b/client/src/features/dataConnectorsV2/deposits/DepositEditModal.tsx index 0d00737a24..8a5bb3d8ef 100644 --- a/client/src/features/dataConnectorsV2/deposits/DepositEditModal.tsx +++ b/client/src/features/dataConnectorsV2/deposits/DepositEditModal.tsx @@ -27,7 +27,9 @@ import { usePatchDepositsByDepositIdMutation, usePostDepositsByDepositIdJobMutation, } from "../api/data-connectors.enhanced-api"; +import { EnviDatWarning } from "./DepositCreationModal"; import DepositIntegrationInfo from "./DepositIntegrationInfo"; +import { PROVIDER_OPTIONS } from "./deposits.constants"; import { EditDepositionForm } from "./deposits.types"; interface DepositEditModalProps { @@ -53,16 +55,23 @@ export default function DepositEditModal({ usePatchDepositsByDepositIdMutation(); const [postJob, postJobResult] = usePostDepositsByDepositIdJobMutation(); - // Fetch connection information for the target provider + // Fetch connection information for the selected provider if necessary + const targetProviderIntegration = PROVIDER_OPTIONS.find( + (provider) => provider.value === deposit?.provider && provider.integration, + )?.integration; + const { data: providers, error: providersError, isLoading: isLoadingProviders, - } = useGetOauth2ProvidersQuery(deposit?.provider ? undefined : skipToken); - + } = useGetOauth2ProvidersQuery( + targetProviderIntegration ? undefined : skipToken, + ); const targetProvider = useMemo(() => { - return providers?.find((provider) => provider.kind === deposit?.provider); - }, [providers, deposit?.provider]); + return providers?.find( + (provider) => provider.kind === targetProviderIntegration, + ); + }, [providers, targetProviderIntegration]); const { data: connections, @@ -216,14 +225,21 @@ export default function DepositEditModal({ need to change it, please delete this export and create a new one with the desired configuration. -
- -
+ {targetProviderIntegration && ( +
+ +
+ )} + {deposit?.provider === "envidat" && ( +
+ +
+ )} diff --git a/client/src/features/dataConnectorsV2/deposits/deposits.constants.ts b/client/src/features/dataConnectorsV2/deposits/deposits.constants.ts index a2fe7ad96f..a73084e895 100644 --- a/client/src/features/dataConnectorsV2/deposits/deposits.constants.ts +++ b/client/src/features/dataConnectorsV2/deposits/deposits.constants.ts @@ -2,9 +2,14 @@ import { ProviderOption } from "./deposits.types"; export const POLL_TIME_INACTIVE_DEPOSITS = 60_000; export const POLL_TIME_ACTIVE_DEPOSITS = 5_000; + export const PROVIDER_OPTIONS: ProviderOption[] = [ { value: "zenodo", label: "Zenodo", integration: "zenodo" }, { value: "envidat", label: "EnviDat", integration: undefined }, ]; + // ? We only consider the last deposit for now export const LAST_DEPOSIT_QUERY_PARAMS = { page: 1, per_page: 1 }; + +export const ENVIDAT_BASE_URL = "https://www.envidat.ch"; +export const ENVIDAT_DASHBOARD_URL = `${ENVIDAT_BASE_URL}/#/dashboard`; From 441ed848cc3ed4ea2c1fb6fc9b0a995503cedfd7 Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Tue, 9 Jun 2026 16:48:28 +0200 Subject: [PATCH 5/6] fix settings now showing logs --- .../show/DataConnectorSettings.tsx | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/client/src/features/dataConnectorsV2/show/DataConnectorSettings.tsx b/client/src/features/dataConnectorsV2/show/DataConnectorSettings.tsx index 624deff934..42b85fd807 100644 --- a/client/src/features/dataConnectorsV2/show/DataConnectorSettings.tsx +++ b/client/src/features/dataConnectorsV2/show/DataConnectorSettings.tsx @@ -287,6 +287,16 @@ export default function DataConnectorSettings() { Delete )} + {lastDeposit && ( + + )} {lastDeposit && lastDeposit.status !== "complete" && (