diff --git a/src/components/map-projects/AdvancedSettings.jsx b/src/components/map-projects/AdvancedSettings.jsx
index e5f7f05..a12d37e 100644
--- a/src/components/map-projects/AdvancedSettings.jsx
+++ b/src/components/map-projects/AdvancedSettings.jsx
@@ -3,21 +3,24 @@ 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 FormHelperText from '@mui/material/FormHelperText'
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)
return (
-
:
} onClick={() => setOpen(!open)} sx={{textTransform: 'none'}}>
- {t('map_project.advanced_settings')}
-
+
:
} onClick={() => setOpen(!open)} sx={{textTransform: 'none'}}>
+ {t('map_project.advanced_settings')}
+
-
+
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')}
+ />
+ {t('map_project.use_lexical_variants_description')}
+ >
+ }
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}
/>
)
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 版本",