From 94f413234ad82479db3262f3947014456c291c77 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Thu, 15 Oct 2026 15:45:48 +0530 Subject: [PATCH 1/3] OpenConceptLab/ocl_issues#2903 | a new user's empty project list explains the first step and offers a sample spreadsheet --- public/mapper_sample_lab_tests.csv | 11 ++++++++ src/components/map-projects/MapProjects.jsx | 28 +++++++++++++++++++-- src/i18n/locales/en/translations.json | 2 ++ src/i18n/locales/es/translations.json | 2 ++ src/i18n/locales/pt-BR/translations.json | 2 ++ src/i18n/locales/zh/translations.json | 2 ++ 6 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 public/mapper_sample_lab_tests.csv diff --git a/public/mapper_sample_lab_tests.csv b/public/mapper_sample_lab_tests.csv new file mode 100644 index 00000000..025c64c1 --- /dev/null +++ b/public/mapper_sample_lab_tests.csv @@ -0,0 +1,11 @@ +Code,Name,Specimen +GLU,Glucose,Serum +HBA1C,Hemoglobin A1c,Whole blood +HGB,Hemoglobin,Whole blood +CREA,Creatinine,Serum +NA,Sodium,Serum +K,Potassium,Serum +CHOL,Total Cholesterol,Serum +LDL,LDL Cholesterol,Serum +ALT,Alanine aminotransferase,Serum +TSH,Thyroid stimulating hormone,Serum diff --git a/src/components/map-projects/MapProjects.jsx b/src/components/map-projects/MapProjects.jsx index 85599a41..c487db61 100644 --- a/src/components/map-projects/MapProjects.jsx +++ b/src/components/map-projects/MapProjects.jsx @@ -13,6 +13,7 @@ import Menu from '@mui/material/Menu' import MenuItem from '@mui/material/MenuItem' import Paper from '@mui/material/Paper' import Typography from '@mui/material/Typography' +import Link from '@mui/material/Link' import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; @@ -200,8 +201,31 @@ const MapProjects = () => { { loaded && projects.length === 0 && - - + + + {t('map_project.no_projects_found')} + {t('map_project.no_projects_hint')} + +
+ + {t('map_project.download_sample_spreadsheet')} + +
+ + } + />
} diff --git a/src/i18n/locales/en/translations.json b/src/i18n/locales/en/translations.json index 534b4dcb..2a6779eb 100644 --- a/src/i18n/locales/en/translations.json +++ b/src/i18n/locales/en/translations.json @@ -413,6 +413,8 @@ "project_owner": "Project Owner", "project_name": "Project Name", "no_projects_found": "No projects found.", + "no_projects_hint": "To start, upload a .csv or .xlsx file with one row per local term you want to map.", + "download_sample_spreadsheet": "Download a sample spreadsheet", "input_data": "Input Data", "upload_file_description": "Upload a spreadsheet (.csv, .xls, .xlsx) that contains the input data to be mapped.", "upload_file": "Upload file", diff --git a/src/i18n/locales/es/translations.json b/src/i18n/locales/es/translations.json index 75f09c51..f6590423 100644 --- a/src/i18n/locales/es/translations.json +++ b/src/i18n/locales/es/translations.json @@ -388,6 +388,8 @@ "project_owner": "Propietario del Proyecto", "project_name": "Nombre del Proyecto", "no_projects_found": "No se encontraron proyectos.", + "no_projects_hint": "Para empezar, suba un archivo .csv o .xlsx con una fila por cada término local que desee mapear.", + "download_sample_spreadsheet": "Descargar una hoja de cálculo de ejemplo", "input_data": "Datos de Entrada", "upload_file_description": "Suba una hoja de cálculo (.csv, .xls, .xlsx) que contenga los datos de entrada a mapear.", "upload_file": "Subir archivo", diff --git a/src/i18n/locales/pt-BR/translations.json b/src/i18n/locales/pt-BR/translations.json index 5fc3f368..8c57a1f7 100644 --- a/src/i18n/locales/pt-BR/translations.json +++ b/src/i18n/locales/pt-BR/translations.json @@ -413,6 +413,8 @@ "project_owner": "Proprietário do Projeto", "project_name": "Nome do Projeto", "no_projects_found": "Nenhum projeto encontrado.", + "no_projects_hint": "Para começar, envie um arquivo .csv ou .xlsx com uma linha para cada termo local que deseja mapear.", + "download_sample_spreadsheet": "Baixar uma planilha de exemplo", "input_data": "Dados de Entrada", "upload_file_description": "Carregue uma planilha (.csv, .xls, .xlsx) que contenha os dados de entrada a serem mapeados.", "upload_file": "Carregar arquivo", diff --git a/src/i18n/locales/zh/translations.json b/src/i18n/locales/zh/translations.json index 5f585f68..e08a6764 100644 --- a/src/i18n/locales/zh/translations.json +++ b/src/i18n/locales/zh/translations.json @@ -413,6 +413,8 @@ "project_owner": "项目所有者", "project_name": "项目名称", "no_projects_found": "未找到项目。", + "no_projects_hint": "开始之前,请上传一个 .csv 或 .xlsx 文件,每行对应一个要映射的本地术语。", + "download_sample_spreadsheet": "下载示例电子表格", "input_data": "输入数据", "upload_file_description": "上传包含要映射的输入数据的电子表格(.csv、.xls、.xlsx)。", "upload_file": "上传文件", From fb8a72767f9df37fbc32bc8ee5097014fc9daeab Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Thu, 15 Oct 2026 17:35:03 +0530 Subject: [PATCH 2/3] OpenConceptLab/ocl_issues#2903 | review feedbacks --- Dockerfile | 1 + src/i18n/locales/pt-BR/translations.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 31c986e9..892ef7be 100644 --- a/Dockerfile +++ b/Dockerfile @@ -51,6 +51,7 @@ RUN cp public/light-favicon.svg dist/ RUN cp public/fhir.svg dist/ RUN cp public/openmrs_logo_white.gif dist/ RUN cp public/mapper_landing_placeholder.png dist/ +RUN cp public/mapper_sample_lab_tests.csv dist/ RUN cp public/FullLogo-BlackText.png dist/ RUN cp -rf public/fontello dist/ diff --git a/src/i18n/locales/pt-BR/translations.json b/src/i18n/locales/pt-BR/translations.json index 8c57a1f7..f66072a2 100644 --- a/src/i18n/locales/pt-BR/translations.json +++ b/src/i18n/locales/pt-BR/translations.json @@ -413,7 +413,7 @@ "project_owner": "Proprietário do Projeto", "project_name": "Nome do Projeto", "no_projects_found": "Nenhum projeto encontrado.", - "no_projects_hint": "Para começar, envie um arquivo .csv ou .xlsx com uma linha para cada termo local que deseja mapear.", + "no_projects_hint": "Para começar, carregue um arquivo .csv ou .xlsx com uma linha para cada termo local que deseja mapear.", "download_sample_spreadsheet": "Baixar uma planilha de exemplo", "input_data": "Dados de Entrada", "upload_file_description": "Carregue uma planilha (.csv, .xls, .xlsx) que contenha os dados de entrada a serem mapeados.", From 43573156851710106ae054abffebfcfb4d6fe646 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Fri, 16 Oct 2026 06:50:55 +0530 Subject: [PATCH 3/3] OpenConceptLab/ocl_issues#2903 | review feedbacks --- src/components/map-projects/MapProjects.jsx | 27 ++++++++++++++++++--- src/components/search/NoResults.jsx | 4 +-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/components/map-projects/MapProjects.jsx b/src/components/map-projects/MapProjects.jsx index c487db61..1ccff267 100644 --- a/src/components/map-projects/MapProjects.jsx +++ b/src/components/map-projects/MapProjects.jsx @@ -41,6 +41,26 @@ import QuotaDialog from '../common/QuotaDialog' const NEW_PROJECT_BLOCK_ERROR_CODES = {access: 'mapper_access_denied', projects_not_entitled: 'mapper_projects_not_entitled'} +// The sample lives in ocl-docs so it can change without a Mapper release +// (OpenConceptLab/ocl_issues#2903). The bundled copy covers networks that +// block raw.githubusercontent.com. +const SAMPLE_SPREADSHEET_URL = 'https://raw.githubusercontent.com/OpenConceptLab/ocl-docs/main/docs/source/oclmap/samples/mapper_sample_lab_tests.csv' +const SAMPLE_SPREADSHEET_FALLBACK_URL = '/mapper_sample_lab_tests.csv' + +const getCSV = url => fetch(url).then(response => response.ok ? response.blob() : Promise.reject(response.status)) + +const onSampleSpreadsheetClick = event => { + event.preventDefault() + getCSV(SAMPLE_SPREADSHEET_URL).catch(() => getCSV(SAMPLE_SPREADSHEET_FALLBACK_URL)).then(blob => { + const url = URL.createObjectURL(blob) + const link = Object.assign(document.createElement('a'), {href: url, download: 'mapper_sample_lab_tests.csv'}) + document.body.appendChild(link) + link.click() + link.remove() + setTimeout(() => URL.revokeObjectURL(url), 1000) + }) +} + const MapProjects = () => { const { t } = useTranslation(); const history = useHistory() @@ -201,9 +221,10 @@ const MapProjects = () => { { loaded && projects.length === 0 && - + {t('map_project.no_projects_found')} @@ -219,7 +240,7 @@ const MapProjects = () => { {t('map_project.new_map_project')}
- + {t('map_project.download_sample_spreadsheet')}
diff --git a/src/components/search/NoResults.jsx b/src/components/search/NoResults.jsx index 785560be..5e9172a1 100644 --- a/src/components/search/NoResults.jsx +++ b/src/components/search/NoResults.jsx @@ -2,11 +2,11 @@ import React from 'react'; import SvgIcon from '@mui/material/SvgIcon'; import { useTranslation } from 'react-i18next' -const NoResults = ({searchedText, height, text}) => { +const NoResults = ({searchedText, height, text, graphicWidth}) => { const { t } = useTranslation() return (
- +