Skip to content

Commit eb0ae3a

Browse files
committed
update
1 parent f9266bd commit eb0ae3a

File tree

4 files changed

+115
-26
lines changed

4 files changed

+115
-26
lines changed

src/app/(dashboard)/stats/actions.ts

+12-19
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import { FilterFormData } from "@/model/filters";
66
import { fhirR4 } from "@smile-cdr/fhirts";
77
import { format } from "date-fns";
88
import { QueryParam, fixDate } from "./model";
9-
import { createPatientFilters } from "./filters";
9+
import {
10+
createPatientFilters,
11+
createQuestionnaireResponseFilters,
12+
} from "./filters";
1013

1114
export async function fetchRequiredData() {
1215
const locationQuery = paramGenerator("/Location", {
@@ -51,32 +54,22 @@ export async function fetchData(formData: FormData) {
5154
rawDate = fixDate(rawDate);
5255
}
5356

54-
const allFinishVisitsQuery = new QueryParam({
55-
_summary: "count",
56-
questionnaire: "patient-finish-visit",
57-
});
58-
59-
allFinishVisitsQuery.fromArray(baseFilter);
60-
allFinishVisitsQuery.remove("date");
61-
62-
if (rawDate) {
63-
allFinishVisitsQuery.set("authored", format(rawDate, "yyyy-MM-dd"));
64-
}
65-
66-
const allVisits = allFinishVisitsQuery.toUrl("/QuestionnaireResponse");
67-
6857
const bundle = await fetchBundle([
69-
allVisits,
58+
createQuestionnaireResponseFilters(
59+
"patient-finish-visit",
60+
rawDate,
61+
baseFilter
62+
),
7063
createPatientFilters(["newly-diagnosed-client"], rawDate, baseFilter),
7164
createPatientFilters(["client-already-on-art"], rawDate, baseFilter),
7265
createPatientFilters(["exposed-infant"], rawDate, baseFilter),
7366
// createPatientFilters(["exposed-infant", "newly-diagnosed-client", "client-already-on-art"], baseFilter),
7467
]);
7568
const summary: string[] = [
7669
"Total visits",
77-
"Newly diagnosed clients",
78-
"Already on Art",
79-
"Exposed infant",
70+
"Newly diagnosed clients (created)",
71+
"Already on Art (created)",
72+
"Exposed infant (created)",
8073
];
8174
console.log(JSON.stringify(bundle));
8275

src/app/(dashboard)/stats/filters.ts

+32-6
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,54 @@ type PatientType =
66
| "client-already-on-art"
77
| "exposed-infant";
88

9+
export const createQuestionnaireResponseFilters = (
10+
questionnaire: string,
11+
date: string | null,
12+
baseFilter: Record<string, string>[],
13+
hasCount = true
14+
) => {
15+
const query = new QueryParam({
16+
questionnaire: questionnaire,
17+
});
18+
19+
if (hasCount) {
20+
query.set("_summary", "count");
21+
}
22+
query.fromArray(baseFilter);
23+
24+
query.remove("date");
25+
if (date) {
26+
query.set(
27+
"_tag",
28+
`https://d-tree.org/fhir/created-on-tag|${format(date, "dd/MM/yyyy")}`
29+
);
30+
}
31+
return query.toUrl("/QuestionnaireResponse");
32+
};
33+
34+
935
export const createPatientFilters = (
1036
types: PatientType[] | undefined = undefined,
1137
date: string | null,
1238
baseFilter: Record<string, string>[]
1339
) => {
14-
const allNewlyRegisteredQuery = new QueryParam({
40+
const query = new QueryParam({
1541
_summary: "count",
1642
});
17-
allNewlyRegisteredQuery.fromArray(baseFilter);
43+
query.fromArray(baseFilter);
1844

19-
allNewlyRegisteredQuery.remove("date");
45+
query.remove("date");
2046
if (date) {
21-
allNewlyRegisteredQuery.set(
47+
query.set(
2248
"_tag",
2349
`https://d-tree.org/fhir/created-on-tag|${format(date, "dd/MM/yyyy")}`
2450
);
2551
}
2652
if (types) {
27-
allNewlyRegisteredQuery.add(
53+
query.add(
2854
"_tag",
2955
`https://d-tree.org/fhir/patient-meta-tag|${types.join(",")}`
3056
);
3157
}
32-
return allNewlyRegisteredQuery.toUrl("/Patient");
58+
return query.toUrl("/Patient");
3359
};

src/components/filters/filter-card.tsx

+57-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ import { useFieldArray, useFormContext } from "react-hook-form";
2828
import { Input } from "@/components/ui/input";
2929
import { Button } from "../ui/button";
3030
import { cn } from "@/lib/utils";
31-
import { format, formatISO } from "date-fns";
31+
import { eachDayOfInterval, format, formatISO } from "date-fns";
32+
import { DateRange } from "react-day-picker";
3233

3334
const GetInput = ({
3435
type,
@@ -126,6 +127,51 @@ const GetInput = ({
126127
)}
127128
/>
128129
);
130+
} else if (type === FilterParamType.dateRange) {
131+
return (
132+
<FormField
133+
control={control}
134+
name={name}
135+
render={({ field }) => (
136+
<FormItem className="flex flex-col">
137+
<Popover>
138+
<PopoverTrigger asChild>
139+
<FormControl>
140+
<Button
141+
variant={"outline"}
142+
className={cn(
143+
"w-full pl-3 text-left font-normal",
144+
!field.value && "text-muted-foreground"
145+
)}
146+
>
147+
{field.value ? (
148+
formatRandge(field.value)
149+
) : (
150+
<span>Pick a date</span>
151+
)}
152+
<CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
153+
</Button>
154+
</FormControl>
155+
</PopoverTrigger>
156+
<PopoverContent className="w-auto p-0" align="start">
157+
<Calendar
158+
mode="range"
159+
selected={field.value}
160+
onSelect={(date) => {
161+
field.onChange(date);
162+
}}
163+
// disabled={(date) =>
164+
// date > new Date() || date < new Date("1900-01-01")
165+
// }
166+
initialFocus
167+
/>
168+
</PopoverContent>
169+
</Popover>
170+
<FormMessage />
171+
</FormItem>
172+
)}
173+
/>
174+
);
129175
}
130176

131177
return <div>Input</div>;
@@ -177,4 +223,14 @@ const FilterCard = ({
177223
);
178224
};
179225

226+
const formatRandge = (value: DateRange | undefined) => {
227+
if (value) {
228+
return `${value.from ? format(value.from, "PPP") : "Pick a date"} - ${
229+
value.to ? format(value.to, "PPP") : "Pick a date"
230+
}`;
231+
}
232+
233+
return "Pick a date";
234+
};
235+
180236
export default FilterCard;

src/model/filters.ts

+14
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export interface Filter {
99
export enum FilterParamType {
1010
string = "string",
1111
date = "date",
12+
dateRange = "dateRange",
1213
number = "number",
1314
boolean = "boolean",
1415
select = "select",
@@ -105,6 +106,19 @@ export const statsFilters: Filter[] = [
105106
},
106107
],
107108
},
109+
{
110+
id: "filter-by-date-rage",
111+
name: "Search by date range",
112+
template: "date",
113+
isObject: true,
114+
params: [
115+
{
116+
name: "dateRange",
117+
title: "Enter date",
118+
type: FilterParamType.dateRange,
119+
},
120+
],
121+
},
108122
];
109123

110124
export const filters = {

0 commit comments

Comments
 (0)