2019-12-04 18:39:57 +00:00
|
|
|
|
import React from 'react';
|
2019-12-04 23:54:44 +00:00
|
|
|
|
import PropTypes from 'prop-types';
|
2019-12-03 22:00:21 +00:00
|
|
|
|
import Graph from './Graph.js';
|
|
|
|
|
import {useAsync} from '../util.js';
|
2019-12-04 23:54:44 +00:00
|
|
|
|
import {Term, termTypes} from '../data/model.js';
|
|
|
|
|
import {symptomsSubgraph} from '../data/mock';
|
2019-12-03 22:00:21 +00:00
|
|
|
|
|
2019-12-04 23:54:44 +00:00
|
|
|
|
/**
|
|
|
|
|
* Graphe de maladies et symptômes.
|
|
|
|
|
*
|
2019-12-05 02:24:21 +00:00
|
|
|
|
* @prop terms Termes à afficher.
|
|
|
|
|
* @prop query Ensemble de termes recherchés par l’utilisateur.
|
|
|
|
|
* @prop setQuery Fonction de rappel pour ajouter de nouveaux termes de
|
2019-12-04 23:54:44 +00:00
|
|
|
|
* recherche.
|
|
|
|
|
*/
|
2019-12-05 02:24:21 +00:00
|
|
|
|
const DiseaseGraph = ({terms, query, setQuery}) =>
|
2019-12-03 22:00:21 +00:00
|
|
|
|
{
|
|
|
|
|
const {nodes, edges} = useAsync({
|
|
|
|
|
nodes: {},
|
|
|
|
|
edges: []
|
2019-12-05 02:24:21 +00:00
|
|
|
|
}, symptomsSubgraph, terms);
|
2019-12-03 22:00:21 +00:00
|
|
|
|
|
2019-12-04 04:20:06 +00:00
|
|
|
|
/**
|
|
|
|
|
* Rendu d’un nœud du graphe.
|
|
|
|
|
*
|
|
|
|
|
* @param id Identifiant du nœud à afficher.
|
|
|
|
|
*/
|
2019-12-03 22:00:21 +00:00
|
|
|
|
const render = id =>
|
|
|
|
|
{
|
2019-12-05 02:06:19 +00:00
|
|
|
|
const term = nodes[id];
|
2019-12-05 02:24:21 +00:00
|
|
|
|
const isInQuery = query.some(({id: termId}) => termId === id);
|
2019-12-04 23:54:44 +00:00
|
|
|
|
const isDisease = nodes[id].types.includes(termTypes.disease);
|
2019-12-03 22:00:21 +00:00
|
|
|
|
|
|
|
|
|
return (
|
2019-12-05 02:06:19 +00:00
|
|
|
|
<span
|
|
|
|
|
className={[
|
|
|
|
|
'SearchResults_result',
|
2019-12-05 02:24:21 +00:00
|
|
|
|
isInQuery ? 'SearchResults_result-inQuery' : '',
|
2019-12-05 02:06:19 +00:00
|
|
|
|
isDisease ? 'SearchResults_result-disease' : '',
|
|
|
|
|
].join(' ')}
|
|
|
|
|
title={
|
|
|
|
|
`Cliquez pour plus d’informations sur « ${term.name} »\n`
|
|
|
|
|
+ '(Ctrl-clic pour l’ajouter à la requête)'
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
{nodes[id].name}
|
|
|
|
|
</span>
|
2019-12-03 22:00:21 +00:00
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
2019-12-04 04:20:06 +00:00
|
|
|
|
/**
|
|
|
|
|
* Gère le clic sur un nœud du graphe.
|
|
|
|
|
*
|
|
|
|
|
* @param id Identifiant du nœud cliqué.
|
2019-12-05 02:06:19 +00:00
|
|
|
|
* @param ev Événement DOM décrivant le clic.
|
2019-12-04 04:20:06 +00:00
|
|
|
|
*/
|
2019-12-05 02:06:19 +00:00
|
|
|
|
const handleNodeClick = (id, ev) =>
|
2019-12-04 04:20:06 +00:00
|
|
|
|
{
|
2019-12-05 02:24:21 +00:00
|
|
|
|
const term = nodes[id];
|
|
|
|
|
const queryIndex = query.findIndex(({id: termId}) => termId === id);
|
2019-12-04 04:20:06 +00:00
|
|
|
|
|
2019-12-05 02:24:21 +00:00
|
|
|
|
if (!ev.ctrlKey)
|
|
|
|
|
{
|
|
|
|
|
// Clic normal : Ouverture de la ressource
|
|
|
|
|
window.open(term.url, '_blank');
|
|
|
|
|
}
|
|
|
|
|
else if (queryIndex >= 0)
|
|
|
|
|
{
|
|
|
|
|
// Ctrl-clic : Retrait d’un terme déjà dans la requête
|
|
|
|
|
setQuery([
|
|
|
|
|
...query.slice(0, queryIndex),
|
|
|
|
|
...query.slice(queryIndex + 1)
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
else
|
2019-12-04 04:20:06 +00:00
|
|
|
|
{
|
2019-12-05 02:24:21 +00:00
|
|
|
|
// Ctrl-clic : Ajout d’un nouveau terme dans la requête
|
|
|
|
|
setQuery(query.concat([term]));
|
2019-12-04 04:20:06 +00:00
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2019-12-03 22:00:21 +00:00
|
|
|
|
return (
|
|
|
|
|
<Graph
|
|
|
|
|
nodes={Object.keys(nodes)}
|
|
|
|
|
edges={edges}
|
2019-12-04 04:20:06 +00:00
|
|
|
|
emptyMessage="Aucune maladie ne corresond à ces symptômes"
|
2019-12-03 22:00:21 +00:00
|
|
|
|
render={render}
|
2019-12-04 04:20:06 +00:00
|
|
|
|
onNodeClick={handleNodeClick}
|
2019-12-03 22:00:21 +00:00
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
2019-12-04 23:54:44 +00:00
|
|
|
|
DiseaseGraph.propTypes = {
|
|
|
|
|
terms: PropTypes.arrayOf(Term).isRequired,
|
2019-12-05 02:24:21 +00:00
|
|
|
|
query: PropTypes.arrayOf(Term).isRequired,
|
|
|
|
|
setQuery: PropTypes.func.isRequired,
|
2019-12-04 23:54:44 +00:00
|
|
|
|
};
|
|
|
|
|
|
2019-12-03 22:00:21 +00:00
|
|
|
|
export default DiseaseGraph;
|