diff --git a/package.json b/package.json
index 964478f..ddc88f8 100644
--- a/package.json
+++ b/package.json
@@ -25,6 +25,7 @@
"cm6-theme-basic-dark": "0.2.0",
"d3": "^7.9.0",
"dayjs": "1.11.10",
+ "jsonata": "^2.0.5",
"localforage": "1.10.0",
"match-sorter": "6.3.1",
"postal-mime": "2.0.2",
diff --git a/src/Components/DataPoints/DataPoints.jsx b/src/Components/DataPoints/DataPoints.jsx
index ed3636d..8f9dbbc 100644
--- a/src/Components/DataPoints/DataPoints.jsx
+++ b/src/Components/DataPoints/DataPoints.jsx
@@ -3,6 +3,7 @@ import {DataTable} from "primereact/datatable";
import {Column} from "primereact/column";
import {getPrograms} from "../../Data/ProgramData";
import {getRecordByRecordIDs} from "../../Data/RecordData";
+import {getApplicant} from "../../Data/ApplicantData";
import {Form, Outlet, redirect, useLoaderData, useNavigate, useParams} from "react-router-dom";
import './DataPoints.css';
import React, {useEffect, useState} from "react";
@@ -28,6 +29,7 @@ import {ThemeSwitcherProvider} from 'react-css-theme-switcher';
import {TriStateCheckbox} from 'primereact/tristatecheckbox';
import {Dropdown} from "primereact/dropdown";
import ControlPointIcon from '@mui/icons-material/ControlPoint';
+import jsonata from "jsonata";
export async function loader() {
let programs = await getPrograms();
@@ -405,11 +407,37 @@ export default function DataPoints() {
return record;
});
+ const [recordsWrapped, setRecordsWrapped] = useState(records);
+
+ useEffect(() => {
+ (async () => {
+ const query = new URLSearchParams(window.location.search);
+
+ const filter = query.get('filter');
+ if (!filter) return;
+
+ const recordsExtended = await Promise.all(records.map(async (record) => {
+ record.Applicant = await getApplicant(record.ApplicantID);
+ return record;
+ }));
+
+ const filterExpr = decodeURIComponent(filter);
+ const filterFunc = jsonata(filterExpr);
+ const filteredRecords = await filterFunc.evaluate(recordsExtended);
+
+ if (!filteredRecords || !filteredRecords[0]) return;
+ if (Object.keys(recordsExtended[0]).length
+ !== Object.keys(filteredRecords[0]).length) return;
+
+ setRecordsWrapped(filteredRecords);
+ })();
+ });
+
return (
<>