Skip to content

Commit 637695e

Browse files
committed
Allow amending and check questionnaire usage before delete
1 parent 6b6ea14 commit 637695e

File tree

5 files changed

+52
-5
lines changed

5 files changed

+52
-5
lines changed

aidbox-forms-smart-launch-2/src/app/(authorized)/questionnaires/page.tsx

+36
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,41 @@ export default async function QuestionnairesPage({ searchParams }: PageProps) {
6161
const total = response.total || 0;
6262
const totalPages = Math.ceil(total / pageSize);
6363

64+
async function checkQuestionnaireUsage(questionnaire: Questionnaire) {
65+
"use server";
66+
67+
let total = 0;
68+
const aidbox = await getCurrentAidbox();
69+
70+
if (questionnaire.url) {
71+
const response = await aidbox
72+
.get("fhir/QuestionnaireResponse", {
73+
searchParams: {
74+
_summary: 'count',
75+
questionnaire: questionnaire.url,
76+
},
77+
})
78+
.json<Bundle<QuestionnaireResponse>>();
79+
80+
total += response.total || 0;
81+
82+
if (questionnaire.version && total === 0) {
83+
const response = await aidbox
84+
.get("fhir/QuestionnaireResponse", {
85+
searchParams: {
86+
_summary: 'count',
87+
questionnaire: `${questionnaire.url}|${questionnaire.version}`,
88+
},
89+
})
90+
.json<Bundle<QuestionnaireResponse>>();
91+
92+
total += response.total || 0;
93+
}
94+
}
95+
96+
return total !== 0;
97+
}
98+
6499
async function deleteQuestionnaire(questionnaire: Questionnaire) {
65100
"use server";
66101

@@ -183,6 +218,7 @@ export default async function QuestionnairesPage({ searchParams }: PageProps) {
183218
<TableCell className="text-right pr-6">
184219
<QuestionnairesActions
185220
questionnaire={resource}
221+
onCheckQuestionnaireUsageAction={checkQuestionnaireUsage}
186222
onDeleteAction={deleteQuestionnaire}
187223
onCreateResponseAction={createQuestionnaireResponse}
188224
/>

aidbox-forms-smart-launch-2/src/components/forms-renderer.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export function FormsRenderer({
6464
ref={ref}
6565
questionnaire={JSON.stringify(questionnaire)}
6666
questionnaire-response={JSON.stringify(questionnaireResponse)}
67+
config={JSON.stringify({ form: { "allow-amend": true } })}
6768
style={{
6869
width: "100%",
6970
height: "100%",

aidbox-forms-smart-launch-2/src/components/questionnaires-actions.tsx

+11-5
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@ import { useRouter } from "next/navigation";
3636
export function QuestionnairesActions({
3737
questionnaire,
3838
library,
39+
onCheckQuestionnaireUsageAction,
3940
onDeleteAction,
4041
onImportAction,
4142
onCreateResponseAction,
4243
}: {
4344
questionnaire: Questionnaire;
4445
library?: boolean;
46+
onCheckQuestionnaireUsageAction?: (questionnaire: Questionnaire) => Promise<boolean>;
4547
onDeleteAction?: (questionnaire: Questionnaire) => Promise<void>;
4648
onImportAction?: (questionnaire: Questionnaire) => Promise<Questionnaire>;
4749
onCreateResponseAction?: (
@@ -105,12 +107,16 @@ export function QuestionnairesActions({
105107
className="text-destructive focus:text-destructive"
106108
onClick={async () => {
107109
if (onDeleteAction) {
108-
await withRunning(onDeleteAction(questionnaire));
110+
const used = onCheckQuestionnaireUsageAction ? await onCheckQuestionnaireUsageAction(questionnaire) : false;
109111

110-
toast({
111-
title: "Questionnaire deleted",
112-
description: `Questionnaire deleted successfully`,
113-
});
112+
if (confirm(`Are you sure you want to delete this questionnaire? ${used ? `\n\nWarning: This questionnaire is used in responses. Deleting it will make them invalid.` : ""}`)) {
113+
await withRunning(onDeleteAction(questionnaire));
114+
115+
toast({
116+
title: "Questionnaire deleted",
117+
description: `Questionnaire deleted successfully`,
118+
});
119+
}
114120
}
115121
}}
116122
>

aidbox-forms-smart-launch-2/src/lib/server/aidbox.ts

+3
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,13 @@ export const getOrganizationalAidbox = cache(async (serverUrl: string) => {
6464
"[aidbox]",
6565
response.status,
6666
response.headers.get("content-type"),
67+
);
68+
console.dir(
6769
await response
6870
.clone()
6971
.json()
7072
.catch(() => null),
73+
{ depth: 1000 },
7174
);
7275
},
7376
],

aidbox-forms-smart-launch-2/types.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ declare global {
1616
> & {
1717
questionnaire?: string;
1818
"questionnaire-response"?: string;
19+
config?: string;
1920
};
2021
"aidbox-form-builder": React.DetailedHTMLProps<
2122
React.IframeHTMLAttributes<HTMLIFrameElement>,

0 commit comments

Comments
 (0)