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 ( <> theme.palette.mode === "dark" ? "#1A1E24" : "#FAFAFA"}}> - +