diff --git a/dashboard/src/scenes/stats/Consultations.js b/dashboard/src/scenes/stats/ConsultationsStats.js
similarity index 77%
rename from dashboard/src/scenes/stats/Consultations.js
rename to dashboard/src/scenes/stats/ConsultationsStats.js
index a1158a7ee..d9c16e7ec 100644
--- a/dashboard/src/scenes/stats/Consultations.js
+++ b/dashboard/src/scenes/stats/ConsultationsStats.js
@@ -7,7 +7,7 @@ import { Block } from './Blocks';
import CustomFieldsStats from './CustomFieldsStats';
import Filters from '../../components/Filters';
-const ConsultationsStats = ({ consultations, personsWithConsultations, filterBase, filterPersons, setFilterPersons }) => {
+export default function ConsultationsStats({ consultations, personsWithConsultations, filterBase, filterPersons, setFilterPersons }) {
const organisation = useRecoilValue(organisationState);
const filterTitle = useMemo(() => {
@@ -35,7 +35,15 @@ const ConsultationsStats = ({ consultations, personsWithConsultations, filterBas
-
+ {
+ if (e.target.open) {
+ window.localStorage.setItem('consultations-stats-general-open', 'true');
+ } else {
+ window.localStorage.removeItem('consultations-stats-general-open');
+ }
+ }}>
Global
@@ -59,7 +67,16 @@ const ConsultationsStats = ({ consultations, personsWithConsultations, filterBas
{organisation.consultations.map((c) => {
return (
-
+ {
+ if (e.target.open) {
+ window.localStorage.setItem(`person-stats-${c.name.replace(' ', '-').toLocaleLowerCase()}-open`, 'true');
+ } else {
+ window.localStorage.removeItem(`person-stats-${c.name.replace(' ', '-').toLocaleLowerCase()}-open`);
+ }
+ }}
+ key={c.name}>
Statistiques des consultations de type « {c.name} » ({consultationsByType[c.name]?.length ?? 0})
@@ -76,6 +93,4 @@ const ConsultationsStats = ({ consultations, personsWithConsultations, filterBas
})}
>
);
-};
-
-export default ConsultationsStats;
+}
diff --git a/dashboard/src/scenes/stats/MedicalFiles.js b/dashboard/src/scenes/stats/MedicalFiles.js
index 52073dce1..5e567ab18 100644
--- a/dashboard/src/scenes/stats/MedicalFiles.js
+++ b/dashboard/src/scenes/stats/MedicalFiles.js
@@ -3,7 +3,7 @@ import { CustomResponsivePie } from './charts';
import { getPieData } from './utils';
import CustomFieldsStats from './CustomFieldsStats';
import Filters from '../../components/Filters';
-import { AgeRangeBar } from './Persons';
+import { AgeRangeBar } from './PersonsStats';
const MedicalFilesStats = ({ filterBase, filterPersons, setFilterPersons, personsForStats, customFieldsMedicalFile, personFields, title }) => {
return (
diff --git a/dashboard/src/scenes/stats/Passages.js b/dashboard/src/scenes/stats/Passages.js
index a264bda6c..c988c2e67 100644
--- a/dashboard/src/scenes/stats/Passages.js
+++ b/dashboard/src/scenes/stats/Passages.js
@@ -1,7 +1,7 @@
import React, { useMemo } from 'react';
import { CustomResponsivePie } from './charts';
import { getPieData } from './utils';
-import { AgeRangeBar } from './Persons';
+import { AgeRangeBar } from './PersonsStats';
import Filters from '../../components/Filters';
const PassagesStats = ({
diff --git a/dashboard/src/scenes/stats/Persons.js b/dashboard/src/scenes/stats/PersonsStats.js
similarity index 73%
rename from dashboard/src/scenes/stats/Persons.js
rename to dashboard/src/scenes/stats/PersonsStats.js
index ac5dcdcd5..fd3cc30b1 100644
--- a/dashboard/src/scenes/stats/Persons.js
+++ b/dashboard/src/scenes/stats/PersonsStats.js
@@ -12,24 +12,16 @@ import { Block } from './Blocks';
import CustomFieldsStats from './CustomFieldsStats';
import { ModalBody, ModalContainer, ModalFooter, ModalHeader } from '../../components/tailwind/Modal';
import { organisationState, teamsState } from '../../recoil/auth';
-import { personFieldsIncludingCustomFieldsSelector, sortPersons } from '../../recoil/persons';
+import { customFieldsPersonsSelector, personFieldsIncludingCustomFieldsSelector, sortPersons } from '../../recoil/persons';
import TagTeam from '../../components/TagTeam';
import Table from '../../components/table';
import { dayjsInstance, formatDateWithFullMonth } from '../../services/date';
import CustomFieldDisplay from '../../components/CustomFieldDisplay';
import { groupsState } from '../../recoil/groups';
-const PersonStats = ({
- title,
- firstBlockHelp,
- filterBase,
- filterPersons,
- setFilterPersons,
- personsForStats,
- personFields,
- flattenedCustomFieldsPersons,
-}) => {
+export default function PersonStats({ title, firstBlockHelp, filterBase, filterPersons, setFilterPersons, personsForStats, personFields }) {
const allGroups = useRecoilValue(groupsState);
+ const customFieldsPersons = useRecoilValue(customFieldsPersonsSelector);
const [personsModalOpened, setPersonsModalOpened] = useState(false);
const [sliceField, setSliceField] = useState(null);
@@ -65,95 +57,128 @@ const PersonStats = ({
<>
Statistiques des {title}
-
-
-
-
-
-
- {
- onSliceClick(newSlice, 'gender');
- }}
- data={getPieData(personsForStats, 'gender', { options: personFields.find((f) => f.name === 'gender').options })}
- help={`Genre des ${title} dans la période définie.\n\nSi aucune période n'est définie, on considère l'ensemble des personnes.`}
- />
- {
- setSliceField(personFields.find((f) => f.name === 'birthdate'));
- setSliceValue(newSlice);
- setSlicedData(data);
- setPersonsModalOpened(true);
- }}
- />
- {
- setSliceField(personFields.find((f) => f.name === 'followedSince'));
- setSliceValue(newSlice);
- setSlicedData(data);
- setPersonsModalOpened(true);
- }}
- />
- {
- setSliceField(personFields.find((f) => f.name === 'wanderingAt'));
- setSliceValue(newSlice);
- setSlicedData(data);
- setPersonsModalOpened(true);
- }}
- />
- {
- onSliceClick(newSlice, 'alertness');
- }}
- data={getPieData(personsForStats, 'alertness', { isBoolean: true })}
- help={`${title.capitalize()} vulnérables dans la période définie.\n\nSi aucune période n'est définie, on considère l'ensemble des personnes.`}
- />
- {
- onSliceClick(newSlice, 'outOfActiveList');
- }}
- data={getPieData(personsForStats, 'outOfActiveList', { isBoolean: true })}
- help={`${title} dans la période définie, sorties de la file active. La date de sortie de la file active n'est pas nécessairement dans la période définie.\n\nSi aucune période n'est définie, on considère l'ensemble des personnes.`}
- />
- {
- onSliceClick(
- newSlice,
- 'outOfActiveListReasons',
- personsForStats.filter((p) => !!p.outOfActiveList)
- );
- }}
- axisTitleY="File active"
- axisTitleX="Raison de sortie de file active"
- isMultiChoice
- totalForMultiChoice={personsForStats.filter((p) => !!p.outOfActiveList).length}
- totalTitleForMultiChoice={Nombre de personnes concernées}
- data={getMultichoiceBarData(
- personsForStats.filter((p) => !!p.outOfActiveList),
- 'outOfActiveListReasons'
- )}
- />
-
- `${label.capitalize()} des ${title} dans la période définie.\n\nSi aucune période n'est définie, on considère l'ensemble des personnes.`
- }
- totalTitleForMultiChoice={Nombre de personnes concernées}
- />
+ {
+ if (e.target.open) {
+ window.localStorage.setItem('person-stats-general-open', 'true');
+ } else {
+ window.localStorage.removeItem('person-stats-general-open');
+ }
+ }}>
+
+ Général
+
+
+
+
+
+
+
+ {
+ onSliceClick(newSlice, 'gender');
+ }}
+ data={getPieData(personsForStats, 'gender', { options: personFields.find((f) => f.name === 'gender').options })}
+ help={`Genre des ${title} dans la période définie.\n\nSi aucune période n'est définie, on considère l'ensemble des personnes.`}
+ />
+ {
+ setSliceField(personFields.find((f) => f.name === 'birthdate'));
+ setSliceValue(newSlice);
+ setSlicedData(data);
+ setPersonsModalOpened(true);
+ }}
+ />
+ {
+ setSliceField(personFields.find((f) => f.name === 'followedSince'));
+ setSliceValue(newSlice);
+ setSlicedData(data);
+ setPersonsModalOpened(true);
+ }}
+ />
+ {
+ setSliceField(personFields.find((f) => f.name === 'wanderingAt'));
+ setSliceValue(newSlice);
+ setSlicedData(data);
+ setPersonsModalOpened(true);
+ }}
+ />
+ {
+ onSliceClick(newSlice, 'alertness');
+ }}
+ data={getPieData(personsForStats, 'alertness', { isBoolean: true })}
+ help={`${title.capitalize()} vulnérables dans la période définie.\n\nSi aucune période n'est définie, on considère l'ensemble des personnes.`}
+ />
+ {
+ onSliceClick(newSlice, 'outOfActiveList');
+ }}
+ data={getPieData(personsForStats, 'outOfActiveList', { isBoolean: true })}
+ help={`${title} dans la période définie, sorties de la file active. La date de sortie de la file active n'est pas nécessairement dans la période définie.\n\nSi aucune période n'est définie, on considère l'ensemble des personnes.`}
+ />
+ {
+ onSliceClick(
+ newSlice,
+ 'outOfActiveListReasons',
+ personsForStats.filter((p) => !!p.outOfActiveList)
+ );
+ }}
+ axisTitleY="File active"
+ axisTitleX="Raison de sortie de file active"
+ isMultiChoice
+ totalForMultiChoice={personsForStats.filter((p) => !!p.outOfActiveList).length}
+ totalTitleForMultiChoice={Nombre de personnes concernées}
+ data={getMultichoiceBarData(
+ personsForStats.filter((p) => !!p.outOfActiveList),
+ 'outOfActiveListReasons'
+ )}
+ />
+
+ {customFieldsPersons.map((section) => {
+ return (
+ {
+ if (e.target.open) {
+ window.localStorage.setItem(`person-stats-${section.name.replace(' ', '-').toLocaleLowerCase()}-open`, 'true');
+ } else {
+ window.localStorage.removeItem(`person-stats-${section.name.replace(' ', '-').toLocaleLowerCase()}-open`);
+ }
+ }}>
+
+ {section.name}
+
+
+ `${label.capitalize()} des ${title} dans la période définie.\n\nSi aucune période n'est définie, on considère l'ensemble des personnes.`
+ }
+ totalTitleForMultiChoice={Nombre de personnes concernées}
+ />
+
+ );
+ })}
{
@@ -170,7 +195,7 @@ const PersonStats = ({
/>
>
);
-};
+}
const BlockWanderingAt = ({ persons }) => {
persons = persons.filter((p) => Boolean(p.wanderingAt));
@@ -571,5 +596,3 @@ const SelectedPersonsModal = ({ open, onClose, persons, title, onAfterLeave, sli
);
};
-
-export default PersonStats;
diff --git a/dashboard/src/scenes/stats/index.js b/dashboard/src/scenes/stats/index.js
index eae770a67..05a232a5b 100644
--- a/dashboard/src/scenes/stats/index.js
+++ b/dashboard/src/scenes/stats/index.js
@@ -25,12 +25,12 @@ import { getDataForPeriod } from './utils';
import GeneralStats from './General';
import ServicesStats from './Services';
import ActionsStats from './Actions';
-import PersonStats from './Persons';
+import PersonStats from './PersonsStats';
import PassagesStats from './Passages';
import RencontresStats from './Rencontres';
import ObservationsStats from './Observations';
import ReportsStats from './Reports';
-import ConsultationsStats from './Consultations';
+import ConsultationsStats from './ConsultationsStats';
import MedicalFilesStats from './MedicalFiles';
import ButtonCustom from '../../components/ButtonCustom';
import dayjs from 'dayjs';