From 853f36ef52c6d84f18aff6f9b44de6269847a026 Mon Sep 17 00:00:00 2001 From: JohannaPeanut <76495099+JohannaPeanut@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:43:06 +0200 Subject: [PATCH] SurveyResponse: add text search in filter form --- .../surveys/[surveyId]/responses/index.tsx | 8 +++-- .../EditableSurveyResponseFilterForm.tsx | 29 ++++++++++++++++-- .../ExternalSurveyResponseFormModal.tsx | 2 +- .../feedback/useFilteredResponses.ts | 30 +++++++++++++++++-- 4 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/pages/[projectSlug]/surveys/[surveyId]/responses/index.tsx b/src/pages/[projectSlug]/surveys/[surveyId]/responses/index.tsx index c535ca339..ae099967e 100644 --- a/src/pages/[projectSlug]/surveys/[surveyId]/responses/index.tsx +++ b/src/pages/[projectSlug]/surveys/[surveyId]/responses/index.tsx @@ -63,14 +63,18 @@ export const SurveyResponse = () => { } />
-

Beiträge aus Bürgerbeteiligung ({filteredResponses.length})

+

Beiträge aus Bürgerbeteiligung

- + {filteredResponses.length === 1 ? ( +

1 Beitrag

+ ) : ( +

{filteredResponses.length} Beiträge

+ )}
{filteredResponses.map((response) => (
>( hasnotes: queryHasnotes, haslocation: queryHaslocation, categories: queryCategories, + searchterm: querySearchTerm, } = router.query const surveyId = useParam("surveyId", "string") @@ -68,7 +73,8 @@ export function EditableSurveyResponseFilterForm>( queryTopics && queryHasnotes && queryHaslocation && - queryCategories + queryCategories && + querySearchTerm !== undefined if (!searchActive) { void router.push( @@ -82,6 +88,7 @@ export function EditableSurveyResponseFilterForm>( haslocation: "ALL", // default: radio "ALL" //@ts-expect-error categories: [...feedbackQuestion?.props?.responses.map((r: TResponse) => String(r.id))], // default: all checked + searchterm: "", }, }, undefined, @@ -97,6 +104,7 @@ export function EditableSurveyResponseFilterForm>( statuses: searchActive ? queryStatuses : [...Object.keys(surveyResponseStatus)], // default: all checked topics: searchActive ? queryTopics : [...topics.map((t) => String(t.id)), "0"], // default: all checked hasnotes: searchActive ? queryHasnotes : "ALL", // default: radio "ALL" + searchterm: searchActive ? querySearchTerm : "", // default: radio "ALL" haslocation: searchActive ? queryHaslocation : "ALL", // default: radio "ALL" categories: searchActive ? queryCategories @@ -119,9 +127,17 @@ export function EditableSurveyResponseFilterForm>( methods.setValue("haslocation", router.query.haslocation) // @ts-expect-error methods.setValue("categories", router.query.categories) + // @ts-expect-error + methods.setValue("searchterm", router.query.searchterm) }, [methods, router]) + useEffect(() => { + // @ts-expect-error + methods.setFocus("searchterm") + }, [methods, router.query.searchterm]) + const handleSubmit = async (values: any) => { + methods.reset(undefined, { keepValues: true }) await router.push({ query: { ...router.query, ...values } }, undefined, { scroll: false }) } @@ -227,6 +243,13 @@ export function EditableSurveyResponseFilterForm>( /> )}
+
+ +
{ const router = useRouter() - const { operator, statuses, topics, hasnotes, haslocation, categories } = router.query + const { operator, statuses, topics, hasnotes, haslocation, categories, searchterm } = router.query const { evaluationRefs } = getResponseConfigBySurveySlug(surveySlug) - if (!operator || !statuses || !topics || !hasnotes || !haslocation) return responses + if (!operator || !statuses || !topics || !hasnotes || !haslocation || searchterm === undefined) + return responses // console.log({ operator }) // console.log({ statuses }) @@ -19,6 +20,7 @@ export const useFilteredResponses = ( // console.log({ hasnotes }) // console.log({ haslocation }) // console.log({ categories }) + // console.log({ searchterm }) const filtered = responses // Handle `operator` which is the `operatorId: number` as 'string' @@ -70,6 +72,30 @@ export const useFilteredResponses = ( // @ts-expect-error `data` is of type unkown return categories.includes(String(response.data[evaluationRefs["feedback-category"]])) }) + // Handle `searchterm` + .filter((response) => { + if (!searchterm) return response + return ( + // @ts-expect-error - searchterm is a string + response.note?.toLowerCase().includes(searchterm.trim().toLowerCase()) || + (response?.data && + // @ts-expect-error `data` is of type unkown + response?.data[evaluationRefs["feedback-usertext-1"]] && + // @ts-expect-error `data` is of type unkown + response?.data[evaluationRefs["feedback-usertext-1"]] + .toLowerCase() + // @ts-expect-error - searchterm is a string + .includes(searchterm.trim().toLowerCase())) || + (response?.data && + // @ts-expect-error `data` is of type unkown + response?.data[evaluationRefs["feedback-usertext-2"]] && + // @ts-expect-error `data` is of type unkown + response?.data[evaluationRefs["feedback-usertext-2"]] + .toLowerCase() + // @ts-expect-error - searchterm is a string + .includes(searchterm.trim().toLowerCase())) + ) + }) return filtered }