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;
This commit is contained in:
Dobromir Popov
2024-05-07 19:16:03 +03:00
parent 8d4ae3ebf5
commit 4b45342877
7 changed files with 40 additions and 17 deletions

View File

@ -76,8 +76,8 @@ export default function AvailabilityForm({ publisherId, existingItems, inline, o
const maxTime = d.set({ hour: 19, minute: 30 }).toJSDate(); const maxTime = d.set({ hour: 19, minute: 30 }).toJSDate();
useEffect(() => { useEffect(() => {
setTimeSlots(generateTimeSlots(new Date(minTime), new Date(maxTime), cartEvent.shiftDuration, availabilities)); 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 + " min. shifts"); console.log("AvailabilityForm: minTime: " + common.getTimeFormatted(minTime) + ", maxTime: " + common.getTimeFormatted(maxTime), ", " + cartEvent?.shiftDuration || 90 + " min. shifts", cartEvent ? "cartEvent" : "cartEvent MISSING!!!");
}, []); }, []);

View File

@ -173,6 +173,9 @@ function ShiftComponent({ shift, onShiftSelect, isSelected, onPublisherSelect, a
borderStyles += 'border-l-2 border-blue-500 '; // Left border for specific availability conditions borderStyles += 'border-l-2 border-blue-500 '; // Left border for specific availability conditions
ass.canTransport = av.isWithTransportIn || av.isWithTransportOut; ass.canTransport = av.isWithTransportIn || av.isWithTransportOut;
} }
else {
borderStyles += 'border-l-4 border-red-500 ';
}
if (publisherInfo.hasUpToDateAvailabilities) { if (publisherInfo.hasUpToDateAvailabilities) {
//add green right border //add green right border

View File

@ -74,7 +74,10 @@ const AvCalendar = ({ publisherId, events, selectedDate, cartEvents }) => {
return ce; return ce;
} }
useEffect(() => { setCartEvent(getCartEvent(date)); }, useEffect(() => {
//console.log("useEffect: ", date, selectedEvents, cartEvents);
setCartEvent(getCartEvent(date));
},
[date, selectedEvents]); [date, selectedEvents]);
// Update internal state when `events` prop changes // Update internal state when `events` prop changes
@ -236,7 +239,9 @@ const AvCalendar = ({ publisherId, events, selectedDate, cartEvents }) => {
console.log("handleSelect: ", existingEvents); console.log("handleSelect: ", existingEvents);
// Use the updated startdate for getCartEvent and ensure it reflects in the state properly // 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); setSelectedEvents(existingEvents);
setIsModalOpen(true); setIsModalOpen(true);
}; };

View File

@ -24,7 +24,7 @@ function PublisherSearchBox({ id, selectedId, onChange, isFocused, filterDate, s
const fetchPublishers = async () => { const fetchPublishers = async () => {
console.log("fetchPublishers called"); console.log("fetchPublishers called");
try { 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) { if (filterDate) {
url += `&filterDate=${common.getISODateOnly(filterDate)}`; url += `&filterDate=${common.getISODateOnly(filterDate)}`;

View File

@ -1,6 +1,8 @@
import { getToken } from "next-auth/jwt"; import { getToken } from "next-auth/jwt";
import { authOptions } from './auth/[...nextauth]'
import { getServerSession } from "next-auth/next"
import { NextApiRequest, NextApiResponse } from '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 common = require('../../src/helpers/common');
const dataHelper = require('../../src/helpers/data'); const dataHelper = require('../../src/helpers/data');
const subq = require('../../prisma/bl/subqueries'); const subq = require('../../prisma/bl/subqueries');
@ -46,6 +48,9 @@ export default async function handler(req, res) {
let monthInfo = common.getMonthDatesInfo(day); let monthInfo = common.getMonthDatesInfo(day);
const searchText = req.query.searchText?.normalize('NFC'); const searchText = req.query.searchText?.normalize('NFC');
const sessionServer = await getServerSession(req, res, authOptions)
var isAdmin = sessionServer?.user.role == UserRole.ADMIN
try { try {
switch (action) { switch (action) {
case "initDb": case "initDb":
@ -137,7 +142,7 @@ export default async function handler(req, res) {
break; break;
case "getCalendarEvents": 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); res.status(200).json(events);
case "getPublisherInfo": case "getPublisherInfo":

View File

@ -194,15 +194,24 @@ export const getServerSideProps = async (context) => {
req: context.req, req: context.req,
allowedRoles: [/* ...allowed roles... */] allowedRoles: [/* ...allowed roles... */]
}); });
const session = await getSession(context); // const session = await getSession(context);
const sessionServer = await getServerSession(context.req, context.res, authOptions) const sessionServer = await getServerSession(context.req, context.res, authOptions)
if (!session) { return { props: {} } } if (!sessionServer) {
const role = session?.user.role; return {
console.log("server role: " + role); redirect: {
const userId = session?.user.id; 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); // common.convertDatesToISOStrings(items);
//serializable dates //serializable dates
items = items.map(item => { items = items.map(item => {
@ -210,7 +219,8 @@ export const getServerSideProps = async (context) => {
...item, ...item,
startTime: item.startTime.toISOString(), startTime: item.startTime.toISOString(),
endTime: item.endTime.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) { if (updatedItem.shift) {
@ -246,7 +256,7 @@ export const getServerSideProps = async (context) => {
return { return {
props: { props: {
initialItems: items, initialItems: items,
userId: session?.user.id, userId: sessionServer?.user.id,
cartEvents: cartEvents, cartEvents: cartEvents,
// messages: (await import(`../content/i18n/${context.locale}.json`)).default // messages: (await import(`../content/i18n/${context.locale}.json`)).default
}, },

View File

@ -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 = []; const result = [];
// let pubs = await filterPublishers("id,firstName,lastName,email".split(","), "", date, assignments, availabilities, date ? true : false, publisherId); // 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 //only published shifts
publisher.assignments?.filter( publisher.assignments?.filter(
assignment => assignment.shift.isPublished assignment => assignment.shift.isPublished || includeUnpublished
).forEach(item => { ).forEach(item => {
result.push({ result.push({
...item, ...item,