From 4da00d4ec38ce4160952674e87e8dfc500ee5041 Mon Sep 17 00:00:00 2001 From: Dobromir Popov Date: Mon, 17 Jun 2024 08:01:51 +0300 Subject: [PATCH] new survey page --- components/reports/ReportForm.js | 1 + components/survey/SurveyForm.js | 169 ++++++++++++++++++ package-lock.json | 1 + package.json | 1 + pages/cart/surveys/index.tsx | 73 ++++++++ pages/dash.tsx | 7 +- .../migration.sql | 5 + prisma/schema.prisma | 2 +- 8 files changed, 255 insertions(+), 4 deletions(-) create mode 100644 components/survey/SurveyForm.js create mode 100644 pages/cart/surveys/index.tsx create mode 100644 prisma/migrations/20240617043350_cascade_delete_messages/migration.sql diff --git a/components/reports/ReportForm.js b/components/reports/ReportForm.js index 998a236..3672487 100644 --- a/components/reports/ReportForm.js +++ b/components/reports/ReportForm.js @@ -81,6 +81,7 @@ export default function ReportForm({ shiftId, existingItem, onDone }) { }; fetchData(); }, [item.date, existingItem]); + const handleChange = ({ target }) => { setItem({ ...item, [target.name]: target.value }); }; diff --git a/components/survey/SurveyForm.js b/components/survey/SurveyForm.js new file mode 100644 index 0000000..4ed75be --- /dev/null +++ b/components/survey/SurveyForm.js @@ -0,0 +1,169 @@ +import axiosInstance from '../../src/axiosSecure'; +import { useEffect, useState } from "react"; +import { toast } from "react-hot-toast"; +import { useRouter } from "next/router"; +import Link from "next/link"; +import { useSession } from "next-auth/react" +import { MessageType, Message, Survey } from "@prisma/client"; +// import { content } from 'googleapis/build/src/apis/content'; +import { DatePicker } from '@mui/x-date-pickers/DatePicker'; +// import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFnsV3'; +// import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs' +import dayjs from 'dayjs'; + +const common = require('src/helpers/common'); + + +// ------------------ ------------------ +// This component is used to create and edit +/* location model: + +model Survey { + id Int @id @default(autoincrement()) + content String + answers Json? + messages Message[] + publicFrom DateTime? + publicUntil DateTime? +} + +model Message { + id Int @id @default(autoincrement()) + publisher Publisher @relation(fields: [publisherId], references: [id]) + publisherId String + date DateTime + content String + isRead Boolean @default(false) + isPublic Boolean @default(false) + type MessageType @default(Email) + publicUntil DateTime? + shownDate DateTime? + answer String? + answerDate DateTime? + + Survey Survey? @relation(fields: [surveyId], references: [id]) + surveyId Int? +} +*/ + +export default function SurveyForm({ existingItem }) { + + const router = useRouter(); + const [editMode, setEditMode] = useState(existingItem ? true : false); + const [item, setItem] = useState(existingItem || { + content: "Нова анкета", + answers: [], + publicFrom: new Date().toISOString(), + publicUntil: new Date().toISOString(), + }); + + useState(() => setEditMode(existingItem ? true : false), [existingItem]); + + + const handleChange = ({ target }) => { + setItem({ ...item, [target.name]: target.value }); + }; + + const handleDateChange = (fieldName, newDate) => { + setItem((prevItem) => ({ + ...prevItem, + [fieldName]: newDate + })); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + try { + //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, + content: JSON.stringify({ message: item.content, options: item.answers }), + date: new Date(), + isPublic: false, + type: MessageType.InApp, + publicUntil: item.publicUntil, + } + }); + item.messages = { create: messages }; + const { data } = await axiosInstance.post("/api/data/surveys", item); + toast.success("Анкетата е създадена успешно"); + router.push("/cart/surveys"); + } catch (error) { + toast.error("Възникна грешка при създаването на анкетата"); + console.error("Error creating survey:", error); + } + } + + const handleDelete = async (e) => { + e.preventDefault(); + if (!editMode) return; + try { + await axiosInstance.delete(`/api/data/surveys/${existingItem.id}`); + + toast.success("Записът изтрит", { + position: "bottom-center", + }); + + } catch (error) { + //alert("Нещо се обърка при изтриването. Моля, опитайте отново или се свържете с нас"); + console.log(JSON.stringify(error)); + toast.error(error.response?.data?.message || "Нещо се обърка при изтриването. Моля, опитай отново и се свържете с нас ако проблема продължи."); + } + }; + return ( +
+ < form className="bg-white dark:bg-gray-800 shadow-md rounded px-8 pt-6 pb-8 mb-4" onSubmit={handleSubmit} > + +

Анкета {existingItem?.id}

+
+ + handleDateChange('publicFrom', newDate)} value={dayjs(item.publicFrom)} /> +
+
+ + handleDateChange('publicUntil', newDate)} value={dayjs(item.publicUntil)} /> +
+
+ +