Skip to content

Commit

Permalink
pmsi suite
Browse files Browse the repository at this point in the history
  • Loading branch information
aetchego committed Jan 16, 2025
1 parent 5e4912b commit 62ba9c2
Show file tree
Hide file tree
Showing 9 changed files with 167 additions and 81 deletions.
96 changes: 49 additions & 47 deletions src/components/PatientsBoard/SearchSection/FilterAction.tsx
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
import React, { useEffect, useMemo, useState } from 'react'
import React, { useEffect, useState } from 'react'
import CheckboxGroup from 'components/ui/Inputs/CheckboxGroup'
import DurationRange from 'components/ui/Inputs/DurationRange'
import Modal from 'components/ui/Modal'
import { FilterKeys, Filters, LabelObject, genderOptions, vitalStatusesOptions } from 'types/searchCriterias'
import { FilterKeys, Filters, genderOptions, vitalStatusesOptions } from 'types/searchCriterias'
import FilterList from 'assets/icones/filter.svg?react'
import { Button } from '@mui/material'
import { Controller, useForm } from 'react-hook-form'
import TextInput from 'components/Filters/TextInput'
import RadioGroup from 'components/ui/RadioGroup'
import ValueSets from 'components/ui/Inputs/ValueSets'
import { ResourceType } from 'types/requestCriterias'
import { getValueSetsFromSystems } from 'utils/valueSets'
import { getConfig } from 'config'
import MultiSelectInput from 'components/Filters/MultiSelectInput'
import { getCodeList } from 'services/aphp/serviceValueSets'
import { AdditionalInfo } from '../usePatientsBoard'
import CalendarRange from 'components/ui/Inputs/CalendarRange'
import ExecutiveUnits from 'components/ui/Inputs/ExecutiveUnits'
import { SourceType } from 'types/scope'
import TextInput from 'components/ui/Inputs/Text'
import MultiSelect from 'components/ui/Inputs/MultiSelect'

type FilterActionProps = {
filters: Filters
type: ResourceType
infos: AdditionalInfo
deidentified?: boolean
onSubmit: (filters: Filters) => void
}
Expand All @@ -38,7 +38,7 @@ const sourceOptions = [
}
]

const FilterAction = ({ filters, type, deidentified, onSubmit }: FilterActionProps) => {
const FilterAction = ({ filters, deidentified, infos, onSubmit }: FilterActionProps) => {
const {
control,
handleSubmit,
Expand All @@ -54,25 +54,7 @@ const FilterAction = ({ filters, type, deidentified, onSubmit }: FilterActionPro
useEffect(() => {
reset(filters)
}, [filters])

const references = useMemo(() => {
switch (type) {
case ResourceType.CONDITION:
return getValueSetsFromSystems([getConfig().features.condition.valueSets.conditionHierarchy.url])
case ResourceType.PROCEDURE:
return getValueSetsFromSystems([getConfig().features.procedure.valueSets.procedureHierarchy.url])
default:
return getValueSetsFromSystems([getConfig().features.claim.valueSets.claimHierarchy.url])
}
}, [type])

const allDiagnosticTypes = useMemo(() => {
let diags: LabelObject[] = []
getCodeList(getConfig().features.condition.valueSets.conditionStatus.url).then((res) => (diags = res.results))
return diags
}, [])

console.log("test diags", allDiagnosticTypes)
console.log("test error", isValid, errors)

return (
<>
Expand Down Expand Up @@ -112,13 +94,13 @@ const FilterAction = ({ filters, type, deidentified, onSubmit }: FilterActionPro
render={({ field }) => <CheckboxGroup {...field} label="Statut vital :" options={vitalStatusesOptions} />}
/>
)}
{/*<DurationRange
value={birthdatesRanges}
label="Âge :"
deidentified={deidentified ?? false}
onChange={(value) => changeInput(FilterKeys.BIRTHDATES, value)}
onError={changeFormError}
/>*/}
{FilterKeys.BIRTHDATES in filters && (
<Controller
name={FilterKeys.BIRTHDATES}
control={control}
render={({ field }) => <DurationRange {...field} label="Âge :" deidentified={deidentified ?? false} />}
/>
)}
{!deidentified && FilterKeys.NDA in filters && (
<Controller
name={FilterKeys.NDA}
Expand All @@ -135,39 +117,59 @@ const FilterAction = ({ filters, type, deidentified, onSubmit }: FilterActionPro
)}
/>
)}
{FilterKeys.CODE in filters && (
<Controller
name={FilterKeys.CODE}
control={control}
render={({ field }) => <ValueSets {...field} label="Codes :" references={infos.references ?? []} />}
/>
)}
{FilterKeys.DIAGNOSTIC_TYPES in filters && (
<Controller
name={FilterKeys.DIAGNOSTIC_TYPES}
control={control}
render={({ field }) => (
<MultiSelect {...field} options={infos.diagnosticTypesList ?? []} label="Type de diagnostics :" />
)}
/>
)}
{FilterKeys.SOURCE in filters && (
<Controller
name={FilterKeys.SOURCE}
control={control}
render={({ field }) => <CheckboxGroup {...field} label="Source :" options={sourceOptions} />}
/>
)}
{FilterKeys.CODE in filters && (
{FilterKeys.DURATION_RANGE in filters && (
<Controller
name={FilterKeys.SOURCE}
name={FilterKeys.DURATION_RANGE}
control={control}
render={({ field }) => <ValueSets {...field} label="Codes :" references={references} />}
render={({ field }) => <CalendarRange {...field} label="Date :" onError={() => {}} />}
/>
)}
{FilterKeys.DIAGNOSTIC_TYPES in filters && (
{/* Vérifier les sourceTypes*/}
{FilterKeys.EXECUTIVE_UNITS in filters && (
<Controller
name={FilterKeys.SOURCE}
name={FilterKeys.EXECUTIVE_UNITS}
control={control}
render={({ field }) => (
<MultiSelectInput {...field} options={allDiagnosticTypes} label="Type de diagnostics :" />
<ExecutiveUnits {...field} label="Unité exécutrice :" sourceType={infos.sourceType ?? SourceType.ALL} />
)}
/>
)}

{/*FilterKeys.START_DATE in filters && FilterKeys.END_DATE in filters && (
{FilterKeys.ENCOUNTER_STATUS in filters && (
<Controller
name={[FilterKeys.START_DATE, FilterKeys.END_DATE]}
name={FilterKeys.ENCOUNTER_STATUS}
control={control}
render={({ field }) => (
<DatesRangeFilter {...field} names={[FilterKeys.START_DATE, FilterKeys.END_DATE]} label="Date :" />
<MultiSelect
{...field}
options={infos.encounterStatusList ?? []}
label="Statut de la visite associée :"
/>
)}
/>
)*/}
)}
</Modal>
</>
)
Expand Down
7 changes: 4 additions & 3 deletions src/components/PatientsBoard/SearchSection/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,22 @@ import FilterAction from './FilterAction'
import OccurrencesSearch from './OccurrenceSearch'
import { Filters, SearchByTypes, SearchCriterias } from 'types/searchCriterias'
import { ResourceType } from 'types/requestCriterias'
import { AdditionalInfo } from '../usePatientsBoard'

type SearchSectionProps = {
deidentified: boolean
type: ResourceType
criterias: SearchCriterias<Filters>
infos: AdditionalInfo
onSearch: (searchCriterias: SearchCriterias<Filters>) => void
}

const SearchSection = ({ deidentified, type, criterias, onSearch }: SearchSectionProps) => {
const SearchSection = ({ deidentified, criterias, infos, onSearch }: SearchSectionProps) => {
return (
<Grid container justifyContent="space-between">
<Grid container item xs={5}>
<Grid container item xs={6}>
<FilterAction
type={type}
infos={infos}
deidentified={deidentified}
filters={criterias.filters as Filters}
onSubmit={(newFilters) => onSearch({ ...criterias, filters: newFilters })}
Expand Down
20 changes: 11 additions & 9 deletions src/components/PatientsBoard/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { useEffect } from 'react'
import DataSection from './DataSection'
import { useDataToTable } from './useDataToTable'
import { useSearchParams } from 'react-router-dom'
import { Filters, PatientsFilters, PMSIFilters, SearchCriterias } from 'types/searchCriterias'

type PatientsBoardProps = {
deidentified?: boolean
Expand All @@ -19,23 +20,24 @@ const PatientsBoard = ({ deidentified = true, type }: PatientsBoardProps) => {
const [searchParams] = useSearchParams()
const groupId = searchParams.get('groupId') || undefined
const page = parseInt(searchParams.get('page') || '0', 10)
const { criterias, searchCriterias, onSaveSearchCriterias, onSort, removeFilter } = usePatientBoard(type)
const { data, loadingStatus } = useData(type, searchCriterias, page, groupId)
const { tableData } = useDataToTable(data, deidentified)
const { additionalInfo, criterias, searchCriterias, onSaveSearchCriterias, onSort, removeFilter } =
usePatientBoard(type)
// const { data, loadingStatus } = useData(type, searchCriterias, page, groupId)
// const { tableData } = useDataToTable(data, deidentified)

useEffect(() => {
console.log('test deidentified', deidentified)
console.log('test data', data, tableData)
console.log('test criterias', searchCriterias)
}, [data])
// console.log('test deidentified', deidentified)
// console.log('test data', data, tableData)
console.log('test criterias', type, searchCriterias.filters, additionalInfo)
}, [searchCriterias.filters, additionalInfo])

return (
<Grid container gap="25px">
<Grid container gap="25px">
<SearchSection
deidentified={deidentified}
criterias={searchCriterias}
type={type}
infos={additionalInfo}
onSearch={(searchCriterias) => onSaveSearchCriterias(searchCriterias)}
/>
<SavedFiltersSection
Expand All @@ -45,7 +47,7 @@ const PatientsBoard = ({ deidentified = true, type }: PatientsBoardProps) => {
onSelect={onSaveSearchCriterias}
/>
<CriteriasSection onDelete={removeFilter} value={criterias} />
<DataSection loadingStatus={loadingStatus} data={tableData} orderBy={searchCriterias.orderBy} onSort={onSort} />
{/*<DataSection loadingStatus={loadingStatus} data={tableData} orderBy={searchCriterias.orderBy} onSort={onSort} />*/}
</Grid>
</Grid>
)
Expand Down
94 changes: 80 additions & 14 deletions src/components/PatientsBoard/usePatientsBoard.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,29 @@
import { useMemo } from 'react'
import { getConfig } from 'config'
import { useEffect, useMemo, useState } from 'react'
import useSearchCriterias, {
initPatientsSearchCriterias,
initPmsiSearchCriterias
} from 'reducers/searchCriteriasReducer'
import { getCodeList } from 'services/aphp/serviceValueSets'
import { ResourceType } from 'types/requestCriterias'
import { Filters, SearchCriterias } from 'types/searchCriterias'
import { SourceType } from 'types/scope'
import { LabelObject, PMSIFilters, PatientsFilters, SearchCriterias } from 'types/searchCriterias'
import { Reference } from 'types/valueSet'
import { selectFiltersAsArray } from 'utils/filters'
import { getValueSetsFromSystems } from 'utils/valueSets'

export const usePatientBoard = (resource: ResourceType) => {
const getInit = (resource: ResourceType) => {
switch (resource) {
export type AdditionalInfo = {
diagnosticTypesList?: LabelObject[]
encounterStatusList?: LabelObject[]
references?: Reference[]
sourceType?: SourceType
}

export const usePatientBoard = (type: ResourceType) => {
const [additionalInfo, setAllAdditionalInfo] = useState<AdditionalInfo>({})

const getInit = (type: ResourceType) => {
switch (type) {
case ResourceType.PATIENT:
return initPatientsSearchCriterias
case ResourceType.CONDITION:
Expand All @@ -21,26 +35,78 @@ export const usePatientBoard = (resource: ResourceType) => {

const [
{ searchBy, orderBy, searchInput, filters },
{ changeSearchBy, changeOrderBy, changeSearchInput, addFilters, removeFilter }
] = useSearchCriterias(getInit(resource))
{ changeSearchBy, changeOrderBy, changeSearchInput, addFilters, removeFilter, removeSearchCriterias }
] = useSearchCriterias<PatientsFilters | PMSIFilters>(getInit(type))

const references = useMemo(() => {
switch (type) {
case ResourceType.CONDITION:
return getValueSetsFromSystems([getConfig().features.condition.valueSets.conditionHierarchy.url])
case ResourceType.PROCEDURE:
return getValueSetsFromSystems([getConfig().features.procedure.valueSets.procedureHierarchy.url])
default:
return undefined
}
}, [type])

const sourceType = useMemo(() => {
switch (type) {
case ResourceType.CONDITION:
return SourceType.CIM10
case ResourceType.PROCEDURE:
return SourceType.CCAM
case ResourceType.CLAIM:
return SourceType.GHM
default:
return undefined
}
}, [type])

useEffect(() => {
removeSearchCriterias()
fetchAdditionalInfos()
}, [type])

const criterias = useMemo(() => {
return filters ? selectFiltersAsArray(filters) : []
}, [filters])

const searchCriterias = useMemo(
() => ({ orderBy, searchBy, searchInput, filters }),
[orderBy, searchBy, searchInput, filters]
)

const onSaveSearchCriterias = ({ searchBy, searchInput, filters }: SearchCriterias<Filters>) => {
const onSaveSearchCriterias = ({
searchBy,
searchInput,
filters
}: SearchCriterias<PatientsFilters | PMSIFilters>) => {
if (searchBy) changeSearchBy(searchBy)
if (searchInput !== undefined) changeSearchInput(searchInput)
if (filters) addFilters(filters)
}

const fetchAdditionalInfos = async () => {
const fetchValueSet = async (valueSet: string) => {
try {
const { results } = await getCodeList(valueSet)
return results
} catch (e) {
return []
}
}
let diagnosticTypesList = additionalInfo.diagnosticTypesList
let encounterStatusList = additionalInfo.encounterStatusList
if (type === ResourceType.CONDITION && !diagnosticTypesList)
diagnosticTypesList = await fetchValueSet(getConfig().features.condition.valueSets.conditionStatus.url)
if (type === ResourceType.CONDITION && !encounterStatusList)
encounterStatusList = await fetchValueSet(getConfig().core.valueSets.encounterStatus.url)
setAllAdditionalInfo({
references,
sourceType,
diagnosticTypesList,
encounterStatusList
})
}

return {
searchCriterias,
additionalInfo,
searchCriterias: { orderBy, searchBy, searchInput, filters },
criterias,
onSaveSearchCriterias,
onSort: changeOrderBy,
Expand Down
2 changes: 1 addition & 1 deletion src/components/ui/Inputs/CalendarRange/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ const CalendarRange = ({
<BlockWrapper>
{isString(label) ? (
<BlockWrapper item xs={12} margin="0px 0px 10px 0px">
<CalendarLabel variant="h3">{label} :</CalendarLabel>
<CalendarLabel variant="h3">{label}</CalendarLabel>
</BlockWrapper>
) : (
label
Expand Down
2 changes: 1 addition & 1 deletion src/components/ui/Inputs/ExecutiveUnits/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ type ExecutiveUnitsProps = {
value: Hierarchy<ScopeElement>[]
sourceType: SourceType
disabled?: boolean
onChange: (value: Hierarchy<ScopeElement>[]) => void
label?: ReactNode
onChange: (value: Hierarchy<ScopeElement>[]) => void
}

const ExecutiveUnits = ({ value, sourceType, disabled = false, onChange, label }: ExecutiveUnitsProps) => {
Expand Down
Loading

0 comments on commit 62ba9c2

Please sign in to comment.