From 78e61293ee1d06e29aa871659bd71cccf29c7331 Mon Sep 17 00:00:00 2001 From: Brandon Egger <brandonegger64@gmail.com> Date: Tue, 11 Apr 2023 01:28:07 -0500 Subject: [PATCH] add dont care option to make survey UX more understandable --- src/components/Survey.tsx | 42 ++++++++++++++++++++++++++++++++-- src/pages/resources/survey.tsx | 1 + 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/components/Survey.tsx b/src/components/Survey.tsx index 1762cb7..c9f7a32 100644 --- a/src/components/Survey.tsx +++ b/src/components/Survey.tsx @@ -12,6 +12,7 @@ export interface Question<T> { for: string, header: string, question: string, + maxSelect?: number, optional: true, options: Option<T>[] } @@ -35,14 +36,19 @@ const GreetingPage = ({updatePage}: { /** * Single question component for a guided survey */ -const QuestionPage = ({isLastPage, page, question, updatePage, formData, updateFormData}: { +const QuestionPage = ({isLastPage, page, question, updatePage, formData, updateFormData, dontCareData, setDontCareData}: { isLastPage: boolean, page: number, question: Question<QuestionTypes>, updatePage: (pageNumber: number) => void, formData: Record<string, QuestionTypes[]>, updateFormData: Dispatch<SetStateAction<Record<string, QuestionTypes[]>>>, + dontCareData: Record<string, boolean>, + setDontCareData: Dispatch<SetStateAction<Record<string, boolean>>>, + }) => { + const dontCare = dontCareData[question.for] ?? false; + const OptionToggle = ({option}: {option: Option<QuestionTypes>}) => { const selected = formData[question.for]?.includes(option.value) ?? false; @@ -64,6 +70,14 @@ const QuestionPage = ({isLastPage, page, question, updatePage, formData, updateF updateFormData(newFormData); } + if (dontCare) { + return ( + <button disabled type="button" onClick={handleToggle} className={"mx-auto w-64 py-2 shadow rounded-lg border border-neutral-400 " + (selected ? "bg-amber-200" : "bg-white")}> + {option.label} + </button> + ) + } + return ( <button type="button" onClick={handleToggle} className={"mx-auto w-64 py-2 shadow rounded-lg border border-neutral-400 " + (selected ? "bg-amber-200" : "bg-white")}> {option.label} @@ -80,6 +94,24 @@ const QuestionPage = ({isLastPage, page, question, updatePage, formData, updateF } }); + const dontCareToggle = () => { + if (formData[question.for]) { + const newFormData = { + ...formData + }; + + newFormData[question.for] = []; + updateFormData(newFormData); + } + + const newDontCareData = { + ...dontCareData + } + + newDontCareData[question.for] = !dontCare; + setDontCareData(newDontCareData); + } + const nextClick = () => { updatePage(page + 1); } @@ -120,6 +152,11 @@ const QuestionPage = ({isLastPage, page, question, updatePage, formData, updateF ); })} </section> + {question.optional ? + <button type="button" onClick={dontCareToggle} className={"mx-auto w-64 py-2 shadow rounded-lg border border-neutral-400 " + (dontCare ? "bg-amber-200" : "bg-white")}> + No Preference + </button> + : undefined} <AdvanceButtons /> </div> ) @@ -152,6 +189,7 @@ const GuidedSurvey = ({questions}: { }) => { const [page, setPage] = useState<number>(0); const [formData, setFormData] = useState<(Record<string, QuestionTypes[]>)>({}); + const [dontCareData, setDoneCareData] = useState<(Record<string, boolean>)>({}); const [previousPage, setPreviousPage] = useState<number | undefined>(undefined); const updatePage = (pageNumber: number) => { @@ -180,7 +218,7 @@ const GuidedSurvey = ({questions}: { const isLastPage = pageNumber === questions.length return ( - <QuestionPage isLastPage={isLastPage} page={page} formData={formData} updateFormData={setFormData} updatePage={updatePage} question={question} /> + <QuestionPage dontCareData={dontCareData} setDontCareData={setDoneCareData} isLastPage={isLastPage} page={page} formData={formData} updateFormData={setFormData} updatePage={updatePage} question={question} /> ); } diff --git a/src/pages/resources/survey.tsx b/src/pages/resources/survey.tsx index 2a757d0..19ae224 100644 --- a/src/pages/resources/survey.tsx +++ b/src/pages/resources/survey.tsx @@ -6,6 +6,7 @@ const questions: Question<QuestionTypes>[] = [ for: "ages", header: "Age of Patient", question: "How old is the patient?", + maxSelect: 1, optional: true, options: [ {