From f9a41c16304a9271d978275b677a920725a96b55 Mon Sep 17 00:00:00 2001 From: Dobromir Popov Date: Fri, 21 Jun 2024 02:13:59 +0300 Subject: [PATCH] more derails on survey-details; publisher list --- components/survey/SurveyForm.tsx | 103 ++++++++++++++++++++++++------- 1 file changed, 82 insertions(+), 21 deletions(-) diff --git a/components/survey/SurveyForm.tsx b/components/survey/SurveyForm.tsx index 4b6f37d..1c7f551 100644 --- a/components/survey/SurveyForm.tsx +++ b/components/survey/SurveyForm.tsx @@ -1,5 +1,5 @@ import axiosInstance from '../../src/axiosSecure'; -import { useEffect, useState } from "react"; +import { use, useEffect, useState } from "react"; import { toast } from "react-hot-toast"; import { useRouter } from "next/router"; import Link from "next/link"; @@ -55,6 +55,8 @@ const SurveyForm: React.FC = ({ existingItem }) => { const router = useRouter(); const [editMode, setEditMode] = useState(existingItem ? true : false); + const [pubs, setPubs] = useState([]); + const [item, setItem] = useState(existingItem || { ...existingItem, @@ -72,6 +74,12 @@ const SurveyForm: React.FC = ({ existingItem }) => { setItem(transformedItem); }, [existingItem]); + useEffect(async () => { + const pubs = await axiosInstance.get("/api/data/publishers?select=id,firstName,lastName,email"); + setPubs(pubs.data); + }, []); + + const handleChange = ({ target }) => { setItem({ ...item, [target.name]: target.value }); @@ -96,7 +104,6 @@ const SurveyForm: React.FC = ({ existingItem }) => { } else { //get all publisherIds and create a message for each - const pubs = await axiosInstance.get("/api/data/publishers"); const messages = pubs.data.map(pub => { return { publisherId: pub.id, @@ -154,6 +161,34 @@ const SurveyForm: React.FC = ({ existingItem }) => { }); } + + const getNamesByIds = (ids) => { + return ids + .map((id) => { + const pub = pubs.find((p) => p.id === id); + return pub ? `${pub.firstName} ${pub.lastName}` : null; + }) + .filter((name) => name !== null) + .join(", "); + }; + + const getIdsForAnswer = (answer) => { + return item.messages + .filter((message) => message.answer === answer) + .map((message) => message.publisherId); + }; + + const getIdsForAnswered = () => { + return item.messages + .filter((message) => message.answer) + .map((message) => message.publisherId); + }; + + const getIdsForUnanswered = () => { + return item.messages + .filter((message) => !message.answer) + .map((message) => message.publisherId); + }; return (
< form className="bg-white dark:bg-gray-800 shadow-md rounded px-8 pt-6 pb-8 mb-4" onSubmit={handleSubmit} > @@ -186,29 +221,55 @@ const SurveyForm: React.FC = ({ existingItem }) => {
{/* show count of each answer and the total answered/unanswered messages */} {item?.answersCount?.length > 0 && ( -
-

Отговори:

- {item.answersCount.map((answer, index) => ( -
- -

- {item.messages ? item.messages.filter((message) => message.answer === answer).length : 0} -

+
+ {item?.answersCount?.length > 0 && ( +
+

Отговори:

+ {item.answersCount.map((answer, index) => { + const currentCount = item.messages ? item.messages.filter((message) => message.answer === answer).length : 0; + const totalCount = item.messages ? item.messages.length : 0; + const percentage = totalCount > 0 ? (currentCount / totalCount) * 100 : 0; + const ids = getIdsForAnswer(answer); + const names = getNamesByIds(ids); + + return ( +
+ +
+
+
+ {currentCount} ({percentage.toFixed(1)}%) +
+
+
+ ); + })} +
+ +
+
message.answer).length / item.messages.length) * 100 : 0}%` }}>
+
+ {item.messages ? item.messages.filter((message) => message.answer).length : 0} +
+
+
+
+ +
+
!message.answer).length / item.messages.length) * 100 : 0}%` }}>
+
+ {item.messages ? item.messages.filter((message) => !message.answer).length : 0} +
+
+
- ))} -
- -

{item.messages ? item.messages.filter((message) => message.answer).length : 0}

-
-
- -

{item.messages ? item.messages.filter((message) => !message.answer).length : 0}

-
+ )}
)} +
{editMode && (<>