From 0f40f975c664a134c7c718d384e08c9c50aa3d2d Mon Sep 17 00:00:00 2001 From: makombe Date: Tue, 1 Oct 2024 12:41:00 +0300 Subject: [PATCH 1/2] (fix) O3-4045: Display only tests with results in Result Viewer --- .../src/test-results/filter/filter-reducer.ts | 7 +++++++ .../test-results/filter/filter-set.component.tsx | 13 +++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/esm-patient-labs-app/src/test-results/filter/filter-reducer.ts b/packages/esm-patient-labs-app/src/test-results/filter/filter-reducer.ts index e629f3fef3..5402aac6ff 100644 --- a/packages/esm-patient-labs-app/src/test-results/filter/filter-reducer.ts +++ b/packages/esm-patient-labs-app/src/test-results/filter/filter-reducer.ts @@ -41,6 +41,13 @@ const computeParents = ( leaves.push(...activeLeaves); tests.push(...activeTests); lowestParents.push({ flatName: node.flatName, display: node.display }); + } else if (!node?.subSets?.length && node.obs?.length > 0) { + // Treat the current node as a leaf and a test + leaves.push(node.flatName); + tests.push([node.flatName, node]); + + // Add the current node to the lowest parents list + lowestParents.push({ flatName: node.flatName, display: node.display }); } else if (node?.subSets?.length) { node.subSets.forEach((subNode) => { const { diff --git a/packages/esm-patient-labs-app/src/test-results/filter/filter-set.component.tsx b/packages/esm-patient-labs-app/src/test-results/filter/filter-set.component.tsx index b3d48d7f34..c401206f54 100644 --- a/packages/esm-patient-labs-app/src/test-results/filter/filter-set.component.tsx +++ b/packages/esm-patient-labs-app/src/test-results/filter/filter-set.component.tsx @@ -68,7 +68,8 @@ const FilterNodeParent = ({ root, itemNumber }: filterNodeParentProps) => { const tablet = useLayoutType() === 'tablet'; const [expandAll, setExpandAll] = useState(undefined); - if (!root.subSets) return; + // Filter out root nodes without data + if (!root.subSets || !root.subSets.some((node) => node.hasData || node.subSets)) return null; const filterParent = root.subSets.map((node) => { return ( @@ -104,6 +105,11 @@ const FilterNode = ({ root, level, open }: FilterNodeProps) => { const indeterminate = isIndeterminate(parents[root.flatName], checkboxes); const allChildrenChecked = parents[root.flatName]?.every((kid) => checkboxes[kid]); + // Filter out nodes that don't have data or don't have children with data + if (!root.hasData && (!root.subSets || !root.subSets.some((subNode) => subNode.hasData || subNode.subSets))) { + return null; + } + return ( { const FilterLeaf = ({ leaf }: FilterLeafProps) => { const { checkboxes, toggleVal } = useContext(FilterContext); + + // Filter out leaves without data + if (!leaf.hasData) return null; + return (
{ labelText={leaf?.display} checked={checkboxes?.[leaf.flatName]} onChange={() => toggleVal(leaf.flatName)} - disabled={!leaf.hasData} />
); From 2abddf96839240146397c2bf4382d12ae77f5747 Mon Sep 17 00:00:00 2001 From: makombe Date: Wed, 2 Oct 2024 21:24:23 +0300 Subject: [PATCH 2/2] Code review changes --- .../src/test-results/filter/filter-reducer.ts | 13 ++--- .../filter/filter-set.component.tsx | 55 ++++++++++++------- 2 files changed, 42 insertions(+), 26 deletions(-) diff --git a/packages/esm-patient-labs-app/src/test-results/filter/filter-reducer.ts b/packages/esm-patient-labs-app/src/test-results/filter/filter-reducer.ts index 5402aac6ff..2663050da3 100644 --- a/packages/esm-patient-labs-app/src/test-results/filter/filter-reducer.ts +++ b/packages/esm-patient-labs-app/src/test-results/filter/filter-reducer.ts @@ -41,13 +41,6 @@ const computeParents = ( leaves.push(...activeLeaves); tests.push(...activeTests); lowestParents.push({ flatName: node.flatName, display: node.display }); - } else if (!node?.subSets?.length && node.obs?.length > 0) { - // Treat the current node as a leaf and a test - leaves.push(node.flatName); - tests.push([node.flatName, node]); - - // Add the current node to the lowest parents list - lowestParents.push({ flatName: node.flatName, display: node.display }); } else if (node?.subSets?.length) { node.subSets.forEach((subNode) => { const { @@ -61,6 +54,12 @@ const computeParents = ( tests.push(...newTests); lowestParents.push(...newLowestParents); }); + } else if (node.obs?.length > 0) { + // Treat the current node as a leaf and a test + leaves.push(node.flatName); + tests.push([node.flatName, node]); + // Add the current node to the lowest parents list + lowestParents.push({ flatName: node.flatName, display: node.display }); } parents[node.flatName] = leaves; return { parents, leaves, tests, lowestParents }; diff --git a/packages/esm-patient-labs-app/src/test-results/filter/filter-set.component.tsx b/packages/esm-patient-labs-app/src/test-results/filter/filter-set.component.tsx index c401206f54..f17dc6480a 100644 --- a/packages/esm-patient-labs-app/src/test-results/filter/filter-set.component.tsx +++ b/packages/esm-patient-labs-app/src/test-results/filter/filter-set.component.tsx @@ -22,7 +22,6 @@ interface filterNodeParentProps extends Pick { } function filterTreeNode(inputValue, treeNode) { - // If the tree node's display value contains the user input, or any of its children's display contains the user input, return true if ( treeNode && (treeNode.display.toLowerCase().includes(inputValue.toLowerCase()) || @@ -30,8 +29,6 @@ function filterTreeNode(inputValue, treeNode) { ) { return true; } - - // Otherwise, return false return false; } @@ -62,24 +59,39 @@ const FilterSet: React.FC = () => { ); }; +// Recursive function to check if a node or any of its descendants have data +const hasNodeOrChildrenWithData = (node) => { + if (node.hasData) { + return true; + } + if (node.subSets) { + return node.subSets.some((subNode) => hasNodeOrChildrenWithData(subNode)); + } + return false; +}; + const FilterNodeParent = ({ root, itemNumber }: filterNodeParentProps) => { const config = useConfig(); const { t } = useTranslation(); const tablet = useLayoutType() === 'tablet'; const [expandAll, setExpandAll] = useState(undefined); - // Filter out root nodes without data - if (!root.subSets || !root.subSets.some((node) => node.hasData || node.subSets)) return null; + if (!hasNodeOrChildrenWithData(root)) { + return null; + } - const filterParent = root.subSets.map((node) => { - return ( - - ); - }); + const filterParent = root.subSets + .filter((node) => hasNodeOrChildrenWithData(node)) + .map((node) => { + return ( + + ); + }); return (
@@ -105,8 +117,8 @@ const FilterNode = ({ root, level, open }: FilterNodeProps) => { const indeterminate = isIndeterminate(parents[root.flatName], checkboxes); const allChildrenChecked = parents[root.flatName]?.every((kid) => checkboxes[kid]); - // Filter out nodes that don't have data or don't have children with data - if (!root.hasData && (!root.subSets || !root.subSets.some((subNode) => subNode.hasData || subNode.subSets))) { + // Filter out nodes that don't have data or descendants with data + if (!hasNodeOrChildrenWithData(root)) { return null; } @@ -127,8 +139,11 @@ const FilterNode = ({ root, level, open }: FilterNodeProps) => { open={open ?? false} > {!root?.subSets?.[0]?.obs && - root?.subSets?.map((node, index) => )} - {root?.subSets?.[0]?.obs && root.subSets?.map((obs, index) => )} + root?.subSets + ?.filter((node) => hasNodeOrChildrenWithData(node)) + .map((node, index) => )} + {root?.subSets?.[0]?.obs && + root.subSets?.filter((obs) => obs.hasData).map((obs, index) => )} ); @@ -138,7 +153,9 @@ const FilterLeaf = ({ leaf }: FilterLeafProps) => { const { checkboxes, toggleVal } = useContext(FilterContext); // Filter out leaves without data - if (!leaf.hasData) return null; + if (!leaf.hasData) { + return null; + } return (