From 9e523ed8d7fb6eaa4ed5d4b37054146d3886e8ed Mon Sep 17 00:00:00 2001 From: Dobromir Popov Date: Sun, 28 Apr 2024 13:38:47 +0300 Subject: [PATCH] new cover me logs page --- _doc/ToDo.md | 7 +- components/sidemenuData.js | 5 ++ pages/api/data/prisma/[...model].ts | 44 +++++++++ pages/cart/reports/coverMe.tsx | 133 ++++++++++++++++++++++++++++ 4 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 pages/api/data/prisma/[...model].ts create mode 100644 pages/cart/reports/coverMe.tsx diff --git a/_doc/ToDo.md b/_doc/ToDo.md index b5f5b1f..d111925 100644 --- a/_doc/ToDo.md +++ b/_doc/ToDo.md @@ -232,4 +232,9 @@ in schedule admin - if a publisher is always pair & family is not in the shift - [x] OK заместник, предпочитание в миналото - да не може. [] Да иска потвърждение преди да заместиш някой [] да не се виждат непубликуваните смени в Моите смени -[] да не се виждат старите предпочитания ако не си админ в публишерс \ No newline at end of file +[] да не се виждат старите предпочитания ако не си админ в публишерс + +[] import avalabilities only if no availabilities are set for the month! +[] new page to show EventLog (substitutions) +[] fix "login as" +[] list with open shift replacements (coverMe requests) diff --git a/components/sidemenuData.js b/components/sidemenuData.js index 56e9119..b845493 100644 --- a/components/sidemenuData.js +++ b/components/sidemenuData.js @@ -112,6 +112,11 @@ const sidemenu = [ text: "Статистика", url: "/cart/publishers/stats", roles: [UserRole.ADMIN, UserRole.POWERUSER], + }, { + id: "coverMeLogs", + text: "Замествания", + url: "/cart/reports/coverMe", + roles: [UserRole.ADMIN, UserRole.POWERUSER], }, ] diff --git a/pages/api/data/prisma/[...model].ts b/pages/api/data/prisma/[...model].ts new file mode 100644 index 0000000..fb60ee3 --- /dev/null +++ b/pages/api/data/prisma/[...model].ts @@ -0,0 +1,44 @@ +import { NextApiRequest, NextApiResponse } from 'next'; +import { PrismaClient } from '@prisma/client'; + +const common = require('../../../../src/helpers/common'); +const logger = require('../../../../src/logger'); + +// Utility to parse query parameters into a Prisma query +const parseQueryParams = (query: any) => { + return { + select: query.select ? JSON.parse(query.select) : undefined, + include: query.include ? JSON.parse(query.include) : undefined, + where: query.where ? JSON.parse(query.where) : undefined, + orderBy: query.orderBy ? JSON.parse(query.orderBy) : undefined, + skip: query.skip ? parseInt(query.skip, 10) : undefined, + limit: query.limit ? parseInt(query.limit, 10) : undefined, + distinct: query.distinct ? query.distinct.split(',') : undefined, + }; +}; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + const prisma: PrismaClient = common.getPrismaClient(); + const modelArray = (req.query.model || (req.body && req.body.model)) as string[]; + let queryOptions = {}; + + if (req.method === 'POST' && req.headers['content-type']?.includes('application/json')) { + // Handle POST request + queryOptions = req.body; + } else { + // Handle GET request + queryOptions = parseQueryParams(req.query); + } + + try { + if (!modelArray || modelArray.length === 0) { + throw new Error('Model is required as a part of the URL path.'); + } + const modelName = modelArray[0]; // Get the first part of the model array + const result = await prisma[modelName].findMany(queryOptions); + res.status(200).json(result); + } catch (error) { + console.error(error); + res.status(500).json({ error: error.message }); + } +} diff --git a/pages/cart/reports/coverMe.tsx b/pages/cart/reports/coverMe.tsx new file mode 100644 index 0000000..fcb888a --- /dev/null +++ b/pages/cart/reports/coverMe.tsx @@ -0,0 +1,133 @@ +//page to show all repots in the database with a link to the report page +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" +//const common = require('src/helpers/common'); +import common from '../../../src/helpers/common'; +import Layout from "../../../components/layout"; +import ProtectedRoute from '../../../components/protectedRoute'; +import { Location, Shift, UserRole, EventLog, EventType } from "@prisma/client"; +import { set } from 'date-fns'; + + +export default function EventLogList() { + const [eventLogs, setEventLog] = useState([]); + const [publicShifts, setPublicShifts] = useState([]); + const router = useRouter(); + const { data: session } = useSession(); + + const [locations, setLocations] = useState([]); + const [showOpenRequests, setShowOpenRequests] = useState(false); + + useEffect(() => { + const fetchLocations = async () => { + try { + console.log("fetching locations"); + const { data: locData } = await axiosInstance.get("/api/data/locations"); + setLocations(locData); + console.log(locData); + axiosInstance.get(`/api/data/eventlogs`) + .then((res) => { + // let reports = res.data; + // reports.forEach((report) => { + // report.location = data.find((loc) => loc.id === report.locationId); + // }); + setEventLog(res.data); + }) + .catch((err) => { + console.log(err); + }); + //get shifts where publicGuid is not null + const { data: shiftsData } = await axiosInstance.get(`/api/data/prisma/assignment?where={"publicGuid":{"not":"NULL"}}`) + setPublicShifts(shiftsData); + + } catch (error) { + console.error(error); + } + }; + if (!locations.length) { + fetchLocations(); + } + }, []); + return ( + + + +
+
+

Заявки за заместване

+ {/* + + */} +
+ + + +
+
+ + + + + + + + + + + {!showOpenRequests && (eventLogs.map((event) => ( + + + + + + + + )) + )} + {showOpenRequests && (publicShifts.map((shift) => ( + + + + + + + + )) + )} + +
ОтДатаСмянаДействия
{event.publisher.firstName + " " + event.publisher.lastName}{common.getDateFormated(new Date(event.date))}{event.shift?.name} + {event.content} + + +
{shift.publisher.firstName + " " + shift.publisher.lastName}{common.getDateFormated(new Date(shift.date))}{shift.name} + {shift.content} + + +
+
+
+
+
+
+ ); +} + +