From 4b453428777a5cdd32703c75d7093ba3367c7530 Mon Sep 17 00:00:00 2001 From: Dobromir Popov Date: Tue, 7 May 2024 19:16:03 +0300 Subject: [PATCH] fix initial calendar loading; show unpublished events in calendar for ADMINS mark unavailable publishers when they are available on another time on the same day; --- components/availability/AvailabilityForm.js | 4 ++-- components/calendar/ShiftComponent.tsx | 3 +++ components/calendar/avcalendar.tsx | 9 +++++-- components/publisher/PublisherSearchBox.js | 2 +- pages/api/index.ts | 9 +++++-- pages/dash.tsx | 26 ++++++++++++++------- src/helpers/data.js | 4 ++-- 7 files changed, 40 insertions(+), 17 deletions(-) diff --git a/components/availability/AvailabilityForm.js b/components/availability/AvailabilityForm.js index dd579f4..0197755 100644 --- a/components/availability/AvailabilityForm.js +++ b/components/availability/AvailabilityForm.js @@ -76,8 +76,8 @@ export default function AvailabilityForm({ publisherId, existingItems, inline, o const maxTime = d.set({ hour: 19, minute: 30 }).toJSDate(); useEffect(() => { - setTimeSlots(generateTimeSlots(new Date(minTime), new Date(maxTime), cartEvent.shiftDuration, availabilities)); - console.log("AvailabilityForm: minTime: " + common.getTimeFormatted(minTime) + ", maxTime: " + common.getTimeFormatted(maxTime), ", " + cartEvent.shiftDuration + " min. shifts"); + setTimeSlots(generateTimeSlots(new Date(minTime), new Date(maxTime), cartEvent?.shiftDuration || 90, availabilities)); + console.log("AvailabilityForm: minTime: " + common.getTimeFormatted(minTime) + ", maxTime: " + common.getTimeFormatted(maxTime), ", " + cartEvent?.shiftDuration || 90 + " min. shifts", cartEvent ? "cartEvent" : "cartEvent MISSING!!!"); }, []); diff --git a/components/calendar/ShiftComponent.tsx b/components/calendar/ShiftComponent.tsx index 99e4976..7dd6341 100644 --- a/components/calendar/ShiftComponent.tsx +++ b/components/calendar/ShiftComponent.tsx @@ -173,6 +173,9 @@ function ShiftComponent({ shift, onShiftSelect, isSelected, onPublisherSelect, a borderStyles += 'border-l-2 border-blue-500 '; // Left border for specific availability conditions ass.canTransport = av.isWithTransportIn || av.isWithTransportOut; } + else { + borderStyles += 'border-l-4 border-red-500 '; + } if (publisherInfo.hasUpToDateAvailabilities) { //add green right border diff --git a/components/calendar/avcalendar.tsx b/components/calendar/avcalendar.tsx index d5997e7..6605fc9 100644 --- a/components/calendar/avcalendar.tsx +++ b/components/calendar/avcalendar.tsx @@ -74,7 +74,10 @@ const AvCalendar = ({ publisherId, events, selectedDate, cartEvents }) => { return ce; } - useEffect(() => { setCartEvent(getCartEvent(date)); }, + useEffect(() => { + //console.log("useEffect: ", date, selectedEvents, cartEvents); + setCartEvent(getCartEvent(date)); + }, [date, selectedEvents]); // Update internal state when `events` prop changes @@ -236,7 +239,9 @@ const AvCalendar = ({ publisherId, events, selectedDate, cartEvents }) => { console.log("handleSelect: ", existingEvents); // Use the updated startdate for getCartEvent and ensure it reflects in the state properly - setCartEvent(getCartEvent(startdate)); + const cartEvent = getCartEvent(startdate); + setCartEvent(cartEvent); + console.log("cartEvent: ", cartEvent.dayofweek); setSelectedEvents(existingEvents); setIsModalOpen(true); }; diff --git a/components/publisher/PublisherSearchBox.js b/components/publisher/PublisherSearchBox.js index fe21a12..7ad9925 100644 --- a/components/publisher/PublisherSearchBox.js +++ b/components/publisher/PublisherSearchBox.js @@ -24,7 +24,7 @@ function PublisherSearchBox({ id, selectedId, onChange, isFocused, filterDate, s const fetchPublishers = async () => { console.log("fetchPublishers called"); try { - let url = `/api/?action=filterPublishers&select=id,firstName,lastName,email,isActive&searchText=${searchText}&availabilities=false`; + let url = `/api/?action=filterPublishers&select=id,firstName,lastName,email,isActive&availabilities=false`; if (filterDate) { url += `&filterDate=${common.getISODateOnly(filterDate)}`; diff --git a/pages/api/index.ts b/pages/api/index.ts index 704e0bc..293ea8f 100644 --- a/pages/api/index.ts +++ b/pages/api/index.ts @@ -1,6 +1,8 @@ import { getToken } from "next-auth/jwt"; +import { authOptions } from './auth/[...nextauth]' +import { getServerSession } from "next-auth/next" import { NextApiRequest, NextApiResponse } from 'next' -import { DayOfWeek, AvailabilityType } from '@prisma/client'; +import { DayOfWeek, AvailabilityType, UserRole } from '@prisma/client'; s const common = require('../../src/helpers/common'); const dataHelper = require('../../src/helpers/data'); const subq = require('../../prisma/bl/subqueries'); @@ -46,6 +48,9 @@ export default async function handler(req, res) { let monthInfo = common.getMonthDatesInfo(day); const searchText = req.query.searchText?.normalize('NFC'); + const sessionServer = await getServerSession(req, res, authOptions) + var isAdmin = sessionServer?.user.role == UserRole.ADMIN + try { switch (action) { case "initDb": @@ -137,7 +142,7 @@ export default async function handler(req, res) { break; case "getCalendarEvents": - let events = await dataHelper.getCalendarEvents(req.query.publisherId, day); + let events = await dataHelper.getCalendarEvents(req.query.publisherId, true, true, isAdmin); res.status(200).json(events); case "getPublisherInfo": diff --git a/pages/dash.tsx b/pages/dash.tsx index dc5d560..951d9ca 100644 --- a/pages/dash.tsx +++ b/pages/dash.tsx @@ -194,15 +194,24 @@ export const getServerSideProps = async (context) => { req: context.req, allowedRoles: [/* ...allowed roles... */] }); - const session = await getSession(context); + // const session = await getSession(context); const sessionServer = await getServerSession(context.req, context.res, authOptions) - if (!session) { return { props: {} } } - const role = session?.user.role; - console.log("server role: " + role); - const userId = session?.user.id; + if (!sessionServer) { + return { + redirect: { + destination: '/auth/signin', + permanent: false, + }, + }; + } - var items = await dataHelper.getCalendarEvents(session.user.id); + const role = sessionServer?.user.role; + console.log("server role: " + role); + const userId = sessionServer?.user.id; + var isAdmin = sessionServer?.user.role == UserRole.ADMIN;//role.localeCompare(UserRole.ADMIN) === 0; + + var items = await dataHelper.getCalendarEvents(userId, true, true, isAdmin); // common.convertDatesToISOStrings(items); //serializable dates items = items.map(item => { @@ -210,7 +219,8 @@ export const getServerSideProps = async (context) => { ...item, startTime: item.startTime.toISOString(), endTime: item.endTime.toISOString(), - date: item.date.toISOString() + date: item.date.toISOString(), + name: common.getTimeFormatted(item.startTime) + "-" + common.getTimeFormatted(item.endTime) }; if (updatedItem.shift) { @@ -246,7 +256,7 @@ export const getServerSideProps = async (context) => { return { props: { initialItems: items, - userId: session?.user.id, + userId: sessionServer?.user.id, cartEvents: cartEvents, // messages: (await import(`../content/i18n/${context.locale}.json`)).default }, diff --git a/src/helpers/data.js b/src/helpers/data.js index 49a0004..53d9e13 100644 --- a/src/helpers/data.js +++ b/src/helpers/data.js @@ -614,7 +614,7 @@ function convertShiftDates(assignments) { } -async function getCalendarEvents(publisherId, date, availabilities = true, assignments = true) { +async function getCalendarEvents(publisherId, availabilities = true, assignments = true, includeUnpublished = false) { const result = []; // let pubs = await filterPublishers("id,firstName,lastName,email".split(","), "", date, assignments, availabilities, date ? true : false, publisherId); @@ -682,7 +682,7 @@ async function getCalendarEvents(publisherId, date, availabilities = true, assig //only published shifts publisher.assignments?.filter( - assignment => assignment.shift.isPublished + assignment => assignment.shift.isPublished || includeUnpublished ).forEach(item => { result.push({ ...item,