From e744891ded9672a3bfb374af2c2f7271a1842576 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Tue, 30 Jun 2026 13:35:45 +0530 Subject: [PATCH 1/2] OpenConceptLab/ocl_issues#2384 | Full project JSON download --- src/components/map-projects/Controls.jsx | 6 ++++++ src/components/map-projects/MapProject.jsx | 3 +++ 2 files changed, 9 insertions(+) diff --git a/src/components/map-projects/Controls.jsx b/src/components/map-projects/Controls.jsx index 9296192..4d5d717 100644 --- a/src/components/map-projects/Controls.jsx +++ b/src/components/map-projects/Controls.jsx @@ -153,6 +153,12 @@ const Controls = ({project, onDownload, onSave, onDelete, owner, file, isSaving, {t('map_project.candidates_metadata')} + {setAnchorEl(null); onDownload('full_export');}} disabled={!isCoreUser}> + + + + {t('map_project.full_project_export')} + {setAnchorEl(null); onImport();}} disabled={!onImport || isRunningImport}> diff --git a/src/components/map-projects/MapProject.jsx b/src/components/map-projects/MapProject.jsx index 8caf976..7e9a3e2 100644 --- a/src/components/map-projects/MapProject.jsx +++ b/src/components/map-projects/MapProject.jsx @@ -2402,6 +2402,9 @@ const MapProject = () => { } downloadObject(JSON.stringify(projectData, undefined, 2), 'application/json', `${name}.candidates_metadata.json`) log = true + } else if (option === 'full_export') { + downloadObject(JSON.stringify(project, undefined, 2), 'application/json', `${name}.full_export.json`) + log = true } if(log) projectLog({action: 'downloaded', extras: {option: option}}) From b5ffa4e84cb857b7c0c079bec0d06031bb14407e Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Tue, 30 Jun 2026 13:38:45 +0530 Subject: [PATCH 2/2] OpenConceptLab/ocl_issues#2384 | Project log to mention what was downloaded --- src/components/map-projects/ProjectLogs.jsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/components/map-projects/ProjectLogs.jsx b/src/components/map-projects/ProjectLogs.jsx index f21f4bf..69f5f7b 100644 --- a/src/components/map-projects/ProjectLogs.jsx +++ b/src/components/map-projects/ProjectLogs.jsx @@ -30,6 +30,17 @@ import CloseIconButton from '../common/CloseIconButton'; const ProjectLogs = ({onClose, logs, project}) => { const { t } = useTranslation() + const getDownloadTitle = option => { + if(option === 'csv') + return t('common.download_csv') + if(option === 'candidates_metadata') + return t('map_project.candidates_metadata') + if(option === 'full_export') + return t('map_project.full_project_export') + + return option ? startCase(option) : startCase('downloaded') + } + const getIconAndColor = log => { const action = log?.action?.toLowerCase() if(action === 'created') @@ -71,6 +82,8 @@ const ProjectLogs = ({onClose, logs, project}) => { {log.extras.id} + if(log.action === 'downloaded') + return getDownloadTitle(log.extras?.option) if(['auto_match_started', 'auto_match_finished', 'auto_matched'].includes(log.action)) { const rawSubActions = (log.extras?.sub_actions || []).filter(subAction => log.extras?.selected_rows_count ? subAction !== 'selected_rows' : true) const subActions = map(rawSubActions, formatSubAction)