Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions src/__tests__/utilsFunction/hierarchy.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
getHierarchyRootCodes,
cleanNode,
mapHierarchyToMap,
getMissingCodesWithSystems,
getMissingCodesWithValueSets,
getMissingCodes,
buildMultipleTrees,
buildTree,
Expand Down Expand Up @@ -136,9 +136,9 @@ describe('Utility Functions', () => {
['system1', [{ id: 'root1', label: 'Root1', system: 'system1' }]],
['system2', [{ id: 'root1', label: 'Root1', system: 'system2', inferior_levels_ids: 'root3' }]]
])
const groupBySystem = [
const groupByValueSet = [
{
system: 'system2',
valueSetUrl: 'system2',
codes: [{ id: 'root4', label: 'Root4', system: 'system2', above_levels_ids: 'root1,root3' }]
}
]
Expand All @@ -154,7 +154,7 @@ describe('Utility Functions', () => {
.mockResolvedValue([
{ id: 'root3', label: 'Root3', system: 'system2', above_levels_ids: 'root1', inferior_levels_ids: 'root4' }
])
const result = await getMissingCodesWithSystems(trees, groupBySystem, codes, fetchHandler)
const result = await getMissingCodesWithValueSets(trees, groupByValueSet, codes, fetchHandler)
expect(fetchHandler).toHaveBeenCalledWith('root3', 'system2')
expect(result.get('system1')).toEqual(new Map([['root1', { id: 'root1', label: 'Root1', system: 'system1' }]]))
expect(result.get('system2')).toEqual(
Expand Down Expand Up @@ -233,6 +233,7 @@ describe('Utility Functions', () => {
above_levels_ids: '',
inferior_levels_ids: '',
system,
valueSetUrl: system,
status
})
})
Expand Down Expand Up @@ -464,9 +465,9 @@ describe('Utility Functions', () => {

describe('buildMultipleTrees', () => {
it('should build multiple trees according to different systems', () => {
const groupBySystem: GroupedBySystem<any>[] = [
const groupByValueSet: Array<{ valueSetUrl: string; codes: any[] }> = [
{
system: 'system1',
valueSetUrl: 'system1',
codes: [
{
id: HIERARCHY_ROOT,
Expand All @@ -476,7 +477,7 @@ describe('Utility Functions', () => {
]
},
{
system: 'system2',
valueSetUrl: 'system2',
codes: [
{
id: 'code1',
Expand Down Expand Up @@ -560,7 +561,7 @@ describe('Utility Functions', () => {
]
])
const mode = Mode.INIT
const result = buildMultipleTrees(baseTrees, groupBySystem, codes, new Map(), mode)
const result = buildMultipleTrees(baseTrees, groupByValueSet, codes, new Map(), mode)
expect(result.get('system1')).toEqual([
{
id: HIERARCHY_ROOT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import allDocTypes from 'assets/docTypes.json'
import moment from 'moment'
import { getDurationRangeLabel } from 'utils/age'
import { getConfig } from 'config'
import { getValueSetFromCodeSystem } from 'utils/valueSets'

/************************************************************************************/
/* Criteria Form Item Chip Display */
Expand Down Expand Up @@ -137,9 +138,22 @@ const getLabelsForCodeSearchItem = (
): LabelObject[] => {
return val
.map((value) => {
let cacheKey: string | undefined

if (value.system) {
// value.system is a CodeSystem URL, we need to find the corresponding ValueSet URL
const valueSetUrl = getValueSetFromCodeSystem(value.system)
if (valueSetUrl) {
cacheKey = valueSetUrl
} else {
// Fallback: try to find in any of the configured valueSets
cacheKey = item.valueSetsInfo.find((valueset) => valueSets.cache[valueset.url])?.url
}
}

return (
(value.system
? valueSets.cache[value.system]
(cacheKey
? valueSets.cache[cacheKey]
: item.valueSetsInfo.flatMap((valueset) => valueSets.cache[valueset.url])) || []
).find((code) => code && code.id === value.id) as LabelObject
})
Expand Down Expand Up @@ -194,7 +208,12 @@ const chipFromCodeSearch = (

// TODO refacto this to be more generic using config
const displaySystem = (system?: string) => {
switch (system) {
if (!system) return ''

// system might be a CodeSystem URL, so we need to find the corresponding ValueSet URL first
const valueSetUrl = getValueSetFromCodeSystem(system) || system

switch (valueSetUrl) {
case getConfig().features.medication.valueSets.medicationAtc.url:
return `${getConfig().features.medication.valueSets.medicationAtc.title}: `
case getConfig().features.medication.valueSets.medicationUcd.url:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
import { SourceType } from 'types/scope'
import { getConfig } from 'config'
import { BiologyStatus } from 'types'
import { getValueSetsFromSystems } from 'utils/valueSets'
import { getValueSetsByUrls } from 'utils/valueSets'
import { FhirItem } from 'types/valueSet'
import { Hierarchy } from 'types/hierarchy'

Expand Down Expand Up @@ -80,15 +80,18 @@ export const form: () => CriteriaForm<ObservationDataType> = () => ({
type: 'codeSearch',
label: 'Sélectionner les codes',
checkIsLeaf: true,
valueSetsInfo: getValueSetsFromSystems([
valueSetsInfo: getValueSetsByUrls([
getConfig().features.observation.valueSets.biologyHierarchyAnabio.url,
getConfig().features.observation.valueSets.biologyHierarchyLoinc.url
]),
noOptionsText: 'Veuillez entrer un code de biologie',
buildInfo: {
fhirKey: ObservationParamsKeys.CODE,
buildMethodExtraArgs: [
{ type: 'string', value: getConfig().features.observation.valueSets.biologyHierarchyAnabio.url },
{
type: 'string',
value: getConfig().features.observation.valueSets.biologyHierarchyAnabio.codeSystemUrls?.at(0) || ''
},
{ type: 'boolean', value: true }
]
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
} from '../CriteriaForm/types'
import { SourceType } from 'types/scope'
import { getConfig } from 'config'
import { getValueSetsFromSystems } from 'utils/valueSets'
import { getValueSetsByUrls } from 'utils/valueSets'
import { Hierarchy } from 'types/hierarchy'
import { FhirItem } from 'types/valueSet'

Expand Down Expand Up @@ -89,12 +89,15 @@ export const form: () => CriteriaForm<CcamDataType> = () => ({
valueKey: 'code',
type: 'codeSearch',
label: "Sélectionner les codes d'actes CCAM",
valueSetsInfo: getValueSetsFromSystems([getConfig().features.procedure.valueSets.procedureHierarchy.url]),
valueSetsInfo: getValueSetsByUrls([getConfig().features.procedure.valueSets.procedureHierarchy.url]),
noOptionsText: 'Veuillez entrer un code ou un acte CCAM',
buildInfo: {
fhirKey: ProcedureParamsKeys.CODE,
buildMethodExtraArgs: [
{ type: 'string', value: getConfig().features.procedure.valueSets.procedureHierarchy.url }
{
type: 'string',
value: getConfig().features.procedure.valueSets.procedureHierarchy.codeSystemUrls?.at(0) || ''
}
],
chipDisplayMethodExtraArgs: [
{ type: 'string', value: '' },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {
} from '../CriteriaForm/types'
import { SourceType } from 'types/scope'
import { getConfig } from 'config'
import { getValueSetsFromSystems } from 'utils/valueSets'
import { getValueSetsByUrls } from 'utils/valueSets'
import { FhirItem } from 'types/valueSet'
import { Hierarchy } from 'types/hierarchy'

Expand Down Expand Up @@ -90,13 +90,16 @@ export const form: () => CriteriaForm<Cim10DataType> = () => ({
{
valueKey: 'code',
type: 'codeSearch',
valueSetsInfo: getValueSetsFromSystems([getConfig().features.condition.valueSets.conditionHierarchy.url]),
valueSetsInfo: getValueSetsByUrls([getConfig().features.condition.valueSets.conditionHierarchy.url]),
noOptionsText: 'Veuillez entrer un code ou un diagnostic CIM10',
label: 'Sélectionner les codes CIM10',
buildInfo: {
fhirKey: ConditionParamsKeys.CODE,
buildMethodExtraArgs: [
{ type: 'string', value: getConfig().features.condition.valueSets.conditionHierarchy.url }
{
type: 'string',
value: getConfig().features.condition.valueSets.conditionHierarchy.codeSystemUrls?.at(0) || ''
}
],
chipDisplayMethodExtraArgs: [
{ type: 'string', value: '' },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
import { Link } from '@mui/material'
import { SourceType } from 'types/scope'
import { getConfig } from 'config'
import { getValueSetsFromSystems } from 'utils/valueSets'
import { getValueSetsByUrls } from 'utils/valueSets'
import { Hierarchy } from 'types/hierarchy'
import { FhirItem } from 'types/valueSet'

Expand Down Expand Up @@ -74,12 +74,14 @@ export const form: () => CriteriaForm<GhmDataType> = () => ({
{
valueKey: 'code',
type: 'codeSearch',
valueSetsInfo: getValueSetsFromSystems([getConfig().features.claim.valueSets.claimHierarchy.url]),
valueSetsInfo: getValueSetsByUrls([getConfig().features.claim.valueSets.claimHierarchy.url]),
noOptionsText: 'Aucun GHM trouvé',
label: 'Sélectionner les codes GHM',
buildInfo: {
fhirKey: ClaimParamsKeys.CODE,
buildMethodExtraArgs: [{ type: 'string', value: getConfig().features.claim.valueSets.claimHierarchy.url }],
buildMethodExtraArgs: [
{ type: 'string', value: getConfig().features.claim.valueSets.claimHierarchy.codeSystemUrls?.at(0) || '' }
],
chipDisplayMethodExtraArgs: [
{ type: 'string', value: '' },
{ type: 'boolean', value: true }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {
} from '../CriteriaForm/types'
import { SourceType } from 'types/scope'
import { getConfig } from 'config'
import { getValueSetsFromSystems } from 'utils/valueSets'
import { getValueSetsByUrls } from 'utils/valueSets'
import { Hierarchy } from 'types/hierarchy'
import { FhirItem } from 'types/valueSet'
import { hasSearchParam } from 'services/aphp/serviceFhirConfig'
Expand Down Expand Up @@ -94,14 +94,17 @@ export const form: () => CriteriaForm<MedicationDataType> = () => ({
type: 'codeSearch',
label: 'Sélectionner les codes',
noOptionsText: 'Veuillez entrer un code de médicament',
valueSetsInfo: getValueSetsFromSystems([
valueSetsInfo: getValueSetsByUrls([
getConfig().features.medication.valueSets.medicationAtc.url,
getConfig().features.medication.valueSets.medicationUcd.url
]),
buildInfo: {
fhirKey: PrescriptionParamsKeys.CODE,
buildMethodExtraArgs: [
{ type: 'string', value: getConfig().features.medication.valueSets.medicationAtc.url },
{
type: 'string',
value: getConfig().features.medication.valueSets.medicationAtc.codeSystemUrls?.at(0) || ''
},
{ type: 'boolean', value: true }
],
chipDisplayMethodExtraArgs: [
Expand Down
4 changes: 2 additions & 2 deletions src/components/ExplorationBoard/config/biology.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import {
narrowSearchCriterias,
resolveAdditionalInfos
} from 'utils/exploration'
import { getValueSetsFromSystems } from 'utils/valueSets'
import { getValueSetsByUrls } from 'utils/valueSets'

const fetchAdditionalInfos = async (additionalInfo: AdditionalInfo): Promise<AdditionalInfo> => {
const fetchersMap: Record<string, () => Promise<FhirItem[] | undefined>> = {
Expand All @@ -37,7 +37,7 @@ const fetchAdditionalInfos = async (additionalInfo: AdditionalInfo): Promise<Add
: Promise.resolve(undefined)
}
const resolved = await resolveAdditionalInfos(fetchersMap)
const references: Reference[] = getValueSetsFromSystems([
const references: Reference[] = getValueSetsByUrls([
getConfig().features.observation.valueSets.biologyHierarchyAnabio.url,
getConfig().features.observation.valueSets.biologyHierarchyLoinc.url
])
Expand Down
4 changes: 2 additions & 2 deletions src/components/ExplorationBoard/config/medication.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import {
narrowSearchCriterias,
resolveAdditionalInfos
} from 'utils/exploration'
import { getValueSetsFromSystems } from 'utils/valueSets'
import { getValueSetsByUrls } from 'utils/valueSets'

const fetchAdditionalInfos = async (additionalInfo: AdditionalInfo): Promise<AdditionalInfo> => {
const config = getConfig().features
Expand All @@ -48,7 +48,7 @@ const fetchAdditionalInfos = async (additionalInfo: AdditionalInfo): Promise<Add
: Promise.resolve(undefined)
}
const resolved = await resolveAdditionalInfos(fetchersMap)
const references: Reference[] = getValueSetsFromSystems([
const references: Reference[] = getValueSetsByUrls([
getConfig().features.medication.valueSets.medicationAtc.url,
getConfig().features.medication.valueSets.medicationUcd.url
])
Expand Down
8 changes: 4 additions & 4 deletions src/components/ExplorationBoard/config/pmsi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { CellType, Column, Row, Table } from 'types/table'
import { FhirItem, Reference } from 'types/valueSet'
import { fetchValueSet, narrowSearchCriterias, resolveAdditionalInfos } from 'utils/exploration'
import { getCategory } from 'utils/fhir'
import { getValueSetsFromSystems } from 'utils/valueSets'
import { getValueSetsByUrls } from 'utils/valueSets'

const fetchAdditionalInfos = async (additionalInfo: AdditionalInfo): Promise<AdditionalInfo> => {
const fetchersMap: Record<string, () => Promise<FhirItem[] | undefined>> = {
Expand Down Expand Up @@ -152,7 +152,7 @@ export const conditionConfig = (
narrowSearchCriterias(deidentified, searchCriterias, !!patient, [], ['searchBy']),
fetchAdditionalInfos: async (infos) => {
const _infos = await fetchAdditionalInfos(infos)
const references: Reference[] = getValueSetsFromSystems([
const references: Reference[] = getValueSetsByUrls([
getConfig().features.condition.valueSets.conditionHierarchy.url
])
const sourceType = SourceType.CIM10
Expand Down Expand Up @@ -183,7 +183,7 @@ export const procedureConfig = (
narrowSearchCriterias(deidentified, searchCriterias, !!patient, ['diagnosticTypes'], ['searchBy']),
fetchAdditionalInfos: async (infos) => {
const _infos = await fetchAdditionalInfos(infos)
const references: Reference[] = getValueSetsFromSystems([
const references: Reference[] = getValueSetsByUrls([
getConfig().features.procedure.valueSets.procedureHierarchy.url
])
const sourceType = SourceType.CCAM
Expand Down Expand Up @@ -213,7 +213,7 @@ export const claimConfig = (
narrowSearchCriterias(deidentified, searchCriterias, !!patient, ['diagnosticTypes', 'source'], ['searchBy']),
fetchAdditionalInfos: async (infos) => {
const _infos = await fetchAdditionalInfos(infos)
const references: Reference[] = getValueSetsFromSystems([getConfig().features.claim.valueSets.claimHierarchy.url])
const references: Reference[] = getValueSetsByUrls([getConfig().features.claim.valueSets.claimHierarchy.url])
const sourceType = SourceType.GHM
return { ..._infos, references, sourceType }
},
Expand Down
3 changes: 2 additions & 1 deletion src/config.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import { birthStatusData, booleanFieldsData, booleanOpenChoiceFieldsData, vmeDat
import { DeepPartial } from 'redux'

type ValueSetConfig = {
url: string
url: string // ValueSet URL (for searching/listing valuesets)
codeSystemUrls?: string[] // Array of CodeSystem URLs (for individual codes within valuesets)
title?: string
data?: LabelObject[]
}
Expand Down
7 changes: 7 additions & 0 deletions src/data/valueSets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export const getReferences = (config: Readonly<AppConfig>) => [
label: ReferencesLabel.ATC,
standard: true,
url: config.features.medication.valueSets.medicationAtc.url,
codeSystemUrls: config.features.medication.valueSets.medicationAtc.codeSystemUrls,
checked: true,
isHierarchy: true,
joinDisplayWithCode: true,
Expand All @@ -21,6 +22,7 @@ export const getReferences = (config: Readonly<AppConfig>) => [
label: ReferencesLabel.UCD,
standard: true,
url: config.features.medication.valueSets.medicationUcd.url,
codeSystemUrls: config.features.medication.valueSets.medicationUcd.codeSystemUrls,
checked: true,
joinDisplayWithCode: true,
joinDisplayWithSystem: true,
Expand All @@ -33,6 +35,7 @@ export const getReferences = (config: Readonly<AppConfig>) => [
label: ReferencesLabel.ANABIO,
standard: true,
url: config.features.observation.valueSets.biologyHierarchyAnabio.url,
codeSystemUrls: config.features.observation.valueSets.biologyHierarchyAnabio.codeSystemUrls,
checked: true,
isHierarchy: true,
joinDisplayWithCode: false,
Expand All @@ -54,6 +57,7 @@ export const getReferences = (config: Readonly<AppConfig>) => [
label: ReferencesLabel.LOINC,
standard: true,
url: config.features.observation.valueSets.biologyHierarchyLoinc.url,
codeSystemUrls: config.features.observation.valueSets.biologyHierarchyLoinc.codeSystemUrls,
checked: true,
isHierarchy: false,
joinDisplayWithCode: true,
Expand All @@ -66,6 +70,7 @@ export const getReferences = (config: Readonly<AppConfig>) => [
label: ReferencesLabel.CCAM,
standard: true,
url: config.features.procedure.valueSets.procedureHierarchy.url,
codeSystemUrls: config.features.procedure.valueSets.procedureHierarchy.codeSystemUrls,
checked: true,
isHierarchy: true,
joinDisplayWithCode: true,
Expand All @@ -78,6 +83,7 @@ export const getReferences = (config: Readonly<AppConfig>) => [
label: ReferencesLabel.CIM10,
standard: true,
url: config.features.condition.valueSets.conditionHierarchy.url,
codeSystemUrls: config.features.condition.valueSets.conditionHierarchy.codeSystemUrls,
checked: true,
isHierarchy: true,
joinDisplayWithSystem: false,
Expand All @@ -90,6 +96,7 @@ export const getReferences = (config: Readonly<AppConfig>) => [
label: ReferencesLabel.GHM,
standard: true,
url: config.features.claim.valueSets.claimHierarchy.url,
codeSystemUrls: config.features.claim.valueSets.claimHierarchy.codeSystemUrls,
checked: true,
isHierarchy: true,
joinDisplayWithCode: true,
Expand Down
Loading
Loading