import React, { useState, useEffect } from 'react'; import axiosInstance from '../../src/axiosSecure'; import PublisherSearchBox from '../publisher/PublisherSearchBox'; // Update the path import Modal from '../Modal'; import LocalShippingIcon from '@mui/icons-material/LocalShipping'; const common = require('src/helpers/common'); function ShiftComponent({ shift, onShiftSelect, isSelected, onPublisherSelect, allPublishersInfo, onAssignmentChange }) { const [isDeleted, setIsDeleted] = useState(false); const [assignments, setAssignments] = useState(shift.assignments); const [isModalOpen, setIsModalOpen] = useState(false); const [useFilterDate, setUseFilterDate] = useState(true); const [selectedPublisher, setSelectedPublisher] = useState(null); const [showCopyHint, setShowCopyHint] = useState(false); const [transportProvided, setTransportProvided] = useState(false); // Update assignments when shift changes useEffect(() => { setAssignments(shift.assignments); setTransportProvided(!shift.requiresTransport || shift.assignments.some(ass => ass.isWithTransport)); }, [shift.assignments]); const handleShiftClick = (shiftId) => { if (onShiftSelect) { onShiftSelect(shift); } }; const handlePublisherClick = (publisher) => { setSelectedPublisher(publisher); console.log("Publisher clicked:", publisher, "selected publisher:", selectedPublisher); shift.selectedPublisher = publisher; if (onShiftSelect) { onShiftSelect(shift); } // if (onPublisherSelect) { // onPublisherSelect(publisher); // } common.copyToClipboard(null, publisher.firstName + ' ' + publisher.lastName); } const deleteShift = async (id) => { try { console.log("Removing shift with id:", id); await axiosInstance.delete("/api/data/shifts/" + id); setIsDeleted(true); } catch (error) { console.error("Error removing shift:", error); } } const removeAssignment = async (id) => { try { console.log("Removing assignment with id:", id); await axiosInstance.delete("/api/data/assignments/" + id); let assingmnt = assignments.find(ass => ass.id == id); setAssignments(prevAssignments => prevAssignments.filter(ass => ass.id !== id)); if (onAssignmentChange) { onAssignmentChange(assingmnt.publisherId, 'remove'); } } catch (error) { console.error("Error removing assignment:", error); } }; const addAssignment = async (publisher, shiftId) => { try { console.log(`new assignment for publisher ${publisher.id} - ${publisher.firstName} ${publisher.lastName}`); const newAssignment = { publisher: { connect: { id: publisher.id } }, shift: { connect: { id: shiftId } }, //isActive: true, isConfirmed: true, }; const { data } = await axiosInstance.post("/api/data/assignments", newAssignment); // Update the 'publisher' property of the returned data with the full publisher object data.publisher = publisher; setAssignments(prevAssignments => [...prevAssignments, data]); if (onAssignmentChange) { onAssignmentChange(data.publisher.id, 'add') } } catch (error) { console.error("Error adding assignment:", error); } }; const copyAllPublisherNames = () => { const names = assignments.map(ass => `${ass.publisher.firstName} ${ass.publisher.lastName}`).join(', '); common.copyToClipboard(null, names); // Show hint and set a timer to hide it setShowCopyHint(true); setTimeout(() => setShowCopyHint(false), 1500); }; async function toggleTransport(assignment): Promise { try { assignment.isWithTransport = !assignment.isWithTransport; const { data } = await axiosInstance.put("/api/data/assignments/" + assignment.id, { isWithTransport: assignment.isWithTransport }) .then(() => { setTransportProvided(assignments.some(ass => ass.isWithTransport)) }); } catch (error) { } } async function toggleRequiresTransport(shiftId): Promise { try { shift.requiresTransport = !shift.requiresTransport; const { data } = await axiosInstance.put("/api/data/shifts/" + shiftId, { requiresTransport: shift.requiresTransport }) .then(() => { console.log("shift '" + shiftId + "' transport required:" + shift.requiresTransport); // setTransportProvided(assignments.some(ass => ass.isWithTransport)) }); } catch (error) { } } return ( <>{!isDeleted && (
{/* Time Window Header */}
{`${common.getTimeRange(new Date(shift.startTime), new Date(shift.endTime))}`} {/* {shift.requiresTransport && ()} */} {/* Toggle for Transport Requirement */} {/* Copy All Names Button */} {/* Hint Message */} {showCopyHint && (
Имената са копирани
)}
{/* Assignments */} {assignments.map((ass, index) => { const publisherInfo = allPublishersInfo.find(info => info?.id === ass.publisher.id) || ass.publisher; // Determine border styles let borderStyles = ''; let canTransport = false; if (selectedPublisher && selectedPublisher.id === ass.publisher.id) { borderStyles += 'bg-blue-200 font-bold '; // Bottom border for selected publishers } if (publisherInfo.availabilityCount == 0 || !publisherInfo.availabilities || publisherInfo.availabilities.length == 0) //user has never the filled the avalabilities form or if there is no publisherInfo - draw red border - publisher is no longer available for the day! { borderStyles += 'border-2 border-red-500 '; } else { // checkig if the publisher is available for this assignment //ToDo: verify if that check is correct const av = publisherInfo.availabilities?.find(av => av.startTime <= shift.startTime && av.endTime >= shift.endTime ); if (av) { borderStyles += 'border-b-2 border-blue-500 '; // Left border for specific availability conditions ass.canTransport = av.isWithTransportIn || av.isWithTransportOut; // console.log(publisherInfo.firstName, "available for shift", shift.id, "at", common.getDateFormattedShort(new Date(shift.startTime)), "av-" + av.id, ": a." + common.getTimeFormatted(av.startTime), "<=", common.getTimeFormatted(shift.startTime), "; a." + common.getTimeFormatted(av.endTime), ">=", common.getTimeFormatted(shift.endTime)); } else { borderStyles += 'border-l-4 border-red-500 '; } if (publisherInfo.hasUpToDateAvailabilities) { //add green right border borderStyles += 'border-r-2 border-green-300'; } //the pub is the same time as last month // if (publisherInfo.availabilities?.some(av => // (!av.dayOfMonth || av.isFromPreviousMonth) && // av.startTime <= ass.startTime && // av.endTime >= ass.endTime)) { // borderStyles += 'border-t-2 border-yellow-500 '; // Left border for specific availability conditions // } } return (
handlePublisherClick(ass.publisher)}> {publisherInfo.firstName} {publisherInfo.lastName}
{/* //if shift.isWithTransport, add trnsport button toggle, which sets ass.isWithTransportIn */} {shift.requiresTransport && ( toggleTransport(ass) : undefined} className={`material-icons ${ass.isWithTransport ? 'text-green-500 font-bold' : (transportProvided ? 'text-gray-400 ' : 'text-orange-400 font-bold')} ${ass.canTransport || ass.isWithTransport || true ? ' cursor-pointer' : 'cursor-not-allowed'} px-3 py-0 ml-2 rounded-md`} > {ass.isWithTransport ? "транспорт" : ass.canTransport ? "може транспорт" : "без транспорт"} )}
); })} {/* This is a placeholder for the dropdown to add a publisher. You'll need to implement or integrate a dropdown component */}
{/* Add Button */} {assignments.length == 0 && ( )}
{/* Modal for Publisher Search forDate={new Date(shift.startTime)} */} setIsModalOpen(false)} forDate={new Date(shift.startTime)} useFilterDate={useFilterDate} onUseFilterDateChange={(value) => setUseFilterDate(value)}> { // Add publisher as assignment logic setIsModalOpen(false); addAssignment(publisher, shift.id); }} showAllAuto={true} showSearch={true} showList={false} />
)} ); } export default ShiftComponent;