From a4deb76b2c473c1ee4b626516e4193e932b25388 Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Wed, 13 May 2026 14:50:35 +0530 Subject: [PATCH 1/2] OpenConceptLab/ocl_issues#2505 | added config for use_lexical_variants --- .../map-projects/AdvancedSettings.jsx | 18 +++++++++++++++++- .../map-projects/ConfigurationForm.jsx | 4 ++-- src/components/map-projects/MapProject.jsx | 9 ++++++++- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/components/map-projects/AdvancedSettings.jsx b/src/components/map-projects/AdvancedSettings.jsx index e5f7f05..9508cce 100644 --- a/src/components/map-projects/AdvancedSettings.jsx +++ b/src/components/map-projects/AdvancedSettings.jsx @@ -3,11 +3,13 @@ import { useTranslation } from 'react-i18next' import TextField from '@mui/material/TextField' import Collapse from '@mui/material/Collapse' import Button from '@mui/material/Button' +import FormControlLabel from '@mui/material/FormControlLabel' +import Checkbox from '@mui/material/Checkbox' import UpIcon from '@mui/icons-material/ArrowDropUp'; import DownIcon from '@mui/icons-material/ArrowDropDown'; -const AdvancedSettings = ({ namespaceValue, setNamespace, defaultNamespace }) => { +const AdvancedSettings = ({ namespaceValue, setNamespace, defaultNamespace, isCoreUser, useLexicalVariants, setUseLexicalVariants }) => { const { t } = useTranslation() const [open, setOpen] = React.useState(false) @@ -31,6 +33,20 @@ const AdvancedSettings = ({ namespaceValue, setNamespace, defaultNamespace }) => defaultValue: 'Namespace passed to $resolveReference. When blank, defaults to {{owner}}. Drives which URL Registry entries apply when resolving canonical URLs.' })} /> + { + isCoreUser && + setUseLexicalVariants(event.target.checked)} + /> + } + label={t('map_project.use_lexical_variants', 'Use Lexical Variants')} + /> + } diff --git a/src/components/map-projects/ConfigurationForm.jsx b/src/components/map-projects/ConfigurationForm.jsx index 3661541..c358a20 100644 --- a/src/components/map-projects/ConfigurationForm.jsx +++ b/src/components/map-projects/ConfigurationForm.jsx @@ -58,7 +58,7 @@ const VisuallyHiddenInput = styled('input')({ const deriveCanonicalUrl = relativeUrl => relativeUrl ? `https://ns.openconceptlab.org${relativeUrl}` : '' -const ConfigurationForm = ({ project, handleFileUpload, file, owner, setOwner, name, setName, description, setDescription, repo, onRepoChange, repoVersion, setRepoVersion, versions, mappedSources, targetSourcesFromRows, algosSelected, setAlgosSelected, sx, algos, validColumns, columns, isValidColumnValue, updateColumn, configure, setConfigure, columnVisibilityModel, setColumnVisibilityModel, onSave, isSaving, candidatesScore, onScoreChange, includeDefaultFilter, setIncludeDefaultFilter, filters, setFilters, locales, isLoadingLocales, setAIAssistantColumns, AIAssistantColumns, inAIAssistantGroup, lookupConfig, setLookupConfig, encoderModel, setEncoderModel, isCoreUser, canBridge, canScispacy, promptTemplates, promptTemplate, onPromptTemplateChange, AIModels, AIModel, setAIModel, namespace, setNamespace, promptOutputLocale, setPromptOutputLocale }) => { +const ConfigurationForm = ({ project, handleFileUpload, file, owner, setOwner, name, setName, description, setDescription, repo, onRepoChange, repoVersion, setRepoVersion, versions, mappedSources, targetSourcesFromRows, algosSelected, setAlgosSelected, sx, algos, validColumns, columns, isValidColumnValue, updateColumn, configure, setConfigure, columnVisibilityModel, setColumnVisibilityModel, onSave, isSaving, candidatesScore, onScoreChange, includeDefaultFilter, setIncludeDefaultFilter, filters, setFilters, locales, isLoadingLocales, setAIAssistantColumns, AIAssistantColumns, inAIAssistantGroup, lookupConfig, setLookupConfig, encoderModel, setEncoderModel, isCoreUser, canBridge, canScispacy, promptTemplates, promptTemplate, onPromptTemplateChange, AIModels, AIModel, setAIModel, namespace, setNamespace, promptOutputLocale, setPromptOutputLocale, useLexicalVariants, setUseLexicalVariants }) => { const { t } = useTranslation(); const isLLMAlgoNotAllowed = !repoVersion?.match_algorithms?.includes('llm') const appliedLocales = filters?.locale ? filters?.locale?.split(',') : [] @@ -308,7 +308,7 @@ const ConfigurationForm = ({ project, handleFileUpload, file, owner, setOwner, n { setNamespace && - + } { inAIAssistantGroup && isCoreUser && promptTemplates?.length > 0 && diff --git a/src/components/map-projects/MapProject.jsx b/src/components/map-projects/MapProject.jsx index 1153d87..e53c2b6 100644 --- a/src/components/map-projects/MapProject.jsx +++ b/src/components/map-projects/MapProject.jsx @@ -248,6 +248,7 @@ const MapProject = () => { const [lookupConfig, setLookupConfig] = React.useState({}) const [encoderModel, setEncoderModel] = React.useState(DEFAULT_ENCODER_MODEL) const [promptOutputLocale, setPromptOutputLocale] = React.useState(null) + const [useLexicalVariants, setUseLexicalVariants] = React.useState(false) // Project canonical-resolution context (plans/unified-mapper-model.md // "Project configuration: explicit canonical context"). Empty = use the // project owner as the default resolution namespace. @@ -555,6 +556,7 @@ const MapProject = () => { setRetired(Boolean(copiedProject.include_retired || false)) setAlgosSelected(copiedProject.algorithms || []) setEncoderModel(copiedProject.encoder_model || DEFAULT_ENCODER_MODEL) + setUseLexicalVariants(Boolean(copiedProject.use_lexical_variants)) if(copiedProject.target_repo_url) { const repoParams = URIToParentParams(copiedProject.target_repo_url, true) fetchRepo(dropVersion(copiedProject.target_repo_url)) @@ -747,6 +749,7 @@ const MapProject = () => { setEncoderModel(response.data?.encoder_model || DEFAULT_ENCODER_MODEL) setProjectPromptTemplateKey(response.data?.prompt_template_key || '') setPromptOutputLocale(response.data?.prompt_output_locale || null) + setUseLexicalVariants(Boolean(response.data?.use_lexical_variants)) setAnalysis(response.data?.analysis || {}) setProject(response.data) setConfigure(false) @@ -1216,6 +1219,7 @@ const MapProject = () => { formData.append('filters', JSON.stringify(getFilters())) formData.append('prompt_template_key', getProjectPromptTemplateKey()) formData.append('prompt_output_locale', promptOutputLocale || '') + formData.append('use_lexical_variants', useLexicalVariants) const isUpdate = Boolean(project?.id) let service = APIService.new().overrideURL(owner).appendToUrl('map-projects/') if(isUpdate) @@ -1328,7 +1332,8 @@ const MapProject = () => { 'source': _repo.short_code || _repo.id }, map_config: getMapConfigs(), - filter: rows.length > 1 ? getFilters() : getFacetQueryParam(isEmpty(_filters) ? appliedFacets[rows[0].__index] : _filters) + filter: rows.length > 1 ? getFilters() : getFacetQueryParam(isEmpty(_filters) ? appliedFacets[rows[0].__index] : _filters), + variants: useLexicalVariants } } @@ -3948,6 +3953,8 @@ const MapProject = () => { setPromptOutputLocale={setPromptOutputLocale} namespace={namespace} setNamespace={setNamespace} + useLexicalVariants={useLexicalVariants} + setUseLexicalVariants={setUseLexicalVariants} /> ) From 1c4fcdc48f8bec76c267a093c27fb89f32010e2b Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Thu, 14 May 2026 10:35:57 +0530 Subject: [PATCH 2/2] OpenConceptLab/ocl_issues#2505 | added description and translations --- .../map-projects/AdvancedSettings.jsx | 34 +++++++++++-------- src/i18n/locales/en/translations.json | 4 ++- src/i18n/locales/es/translations.json | 4 ++- src/i18n/locales/zh/translations.json | 4 ++- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/components/map-projects/AdvancedSettings.jsx b/src/components/map-projects/AdvancedSettings.jsx index 9508cce..a12d37e 100644 --- a/src/components/map-projects/AdvancedSettings.jsx +++ b/src/components/map-projects/AdvancedSettings.jsx @@ -5,6 +5,7 @@ import Collapse from '@mui/material/Collapse' import Button from '@mui/material/Button' import FormControlLabel from '@mui/material/FormControlLabel' import Checkbox from '@mui/material/Checkbox' +import FormHelperText from '@mui/material/FormHelperText' import UpIcon from '@mui/icons-material/ArrowDropUp'; import DownIcon from '@mui/icons-material/ArrowDropDown'; @@ -15,11 +16,11 @@ const AdvancedSettings = ({ namespaceValue, setNamespace, defaultNamespace, isCo return (
- + -
+
{ isCoreUser && - setUseLexicalVariants(event.target.checked)} - /> - } - label={t('map_project.use_lexical_variants', 'Use Lexical Variants')} - /> + <> + setUseLexicalVariants(event.target.checked)} + /> + } + label={t('map_project.use_lexical_variants')} + /> + {t('map_project.use_lexical_variants_description')} + }
diff --git a/src/i18n/locales/en/translations.json b/src/i18n/locales/en/translations.json index 2d4b869..47daad3 100644 --- a/src/i18n/locales/en/translations.json +++ b/src/i18n/locales/en/translations.json @@ -626,7 +626,9 @@ "create_similar": "Create similar", "create_similar_name": "Copy of {{name}}", "set_ai_assistant_output_language": "Set AI Assistant output language", - "ai_assistant_output_locale": "Output locale" + "ai_assistant_output_locale": "Output locale", + "use_lexical_variants": "Use Lexical Variants", + "use_lexical_variants_description": "Expand $match search to include English spelling variants (e.g. color/colour, leukemia/leukaemia) when matching concept names." }, "app": { "web_version": "Web Version", diff --git a/src/i18n/locales/es/translations.json b/src/i18n/locales/es/translations.json index 066a5bd..ec8d6a1 100644 --- a/src/i18n/locales/es/translations.json +++ b/src/i18n/locales/es/translations.json @@ -601,7 +601,9 @@ "config_error_missing_canonical": "Al algoritmo personalizado \"{{name}}\" le falta una URL canónica válida.", "target_repo_required_on_load": "A este proyecto le falta un repositorio de destino. Configure el repositorio de destino para ver los candidatos guardados.", "create_similar": "Crear similar", - "create_similar_name": "Copia de {{name}}" + "create_similar_name": "Copia de {{name}}", + "use_lexical_variants": "Usar variantes léxicas", + "use_lexical_variants_description": "Amplíe la búsqueda $match para incluir variantes ortográficas en inglés (p. ej. color/colour, leukemia/leukaemia) al comparar nombres de conceptos." }, "app": { "web_version": "Versión Web", diff --git a/src/i18n/locales/zh/translations.json b/src/i18n/locales/zh/translations.json index 698a800..3273dbb 100644 --- a/src/i18n/locales/zh/translations.json +++ b/src/i18n/locales/zh/translations.json @@ -626,7 +626,9 @@ "config_error_missing_canonical": "自定义算法“{{name}}”缺少有效的规范 URL。", "target_repo_required_on_load": "此项目缺少目标仓库。请先配置目标仓库,才能查看已保存的候选项。", "create_similar": "创建类似项目", - "create_similar_name": "{{name}} 的副本" + "create_similar_name": "{{name}} 的副本", + "use_lexical_variants": "使用词汇变体", + "use_lexical_variants_description": "扩展 $match 搜索范围,以在匹配概念名称时包含英语拼写变体(例如 color/colour、leukemia/leukaemia)。" }, "app": { "web_version": "Web 版本",