import { useState } from 'react'; import Layout from "../../../components/layout"; import ProtectedRoute from '../../../components/protectedRoute'; import { Prisma, UserRole } from '@prisma/client'; import axiosServer from '../../../src/axiosServer'; import common from '../../../src/helpers/common'; // import { filterPublishers, /* other functions */ } from '../../api/index'; import data from '../../../src/helpers/data'; // const data = require('../../src/helpers/data'); function ContactsPage({ publishers, allPublishers }) { const [searchQuery, setSearchQuery] = useState(''); const filteredPublishers = allPublishers.filter((publisher) => publisher.firstName.toLowerCase().includes(searchQuery.toLowerCase()) || publisher.lastName.toLowerCase().includes(searchQuery.toLowerCase()) || publisher.email.toLowerCase().includes(searchQuery.toLowerCase()) || publisher.phone?.toLowerCase().includes(searchQuery.toLowerCase()) ); return (

Статистика

{publishers.length} участника с предпочитания за месеца (от {allPublishers.length} )
setSearchQuery(e.target.value)} className="border border-gray-300 rounded-md px-2 py-2 mb-4 w-full text-base md:text-sm" />
{filteredPublishers.map((allPub) => { // Find the publisher in the publishers collection to access statistics const pub = publishers.find(publisher => publisher.id === allPub.id); return ( {/* Display statistics if publisher is found */} {pub ? ( <> ) : ( <> {/* Empty cell for alignment */} )} ); })}
Име Възможности Участия Последно влизане
{allPub.firstName} {allPub.lastName} {pub.currentMonthAvailabilityDaysCount || 0} | {pub.currentMonthAvailabilityHoursCount || 0}
{pub.currentWeekAssignments || 0} {pub.currentMonthAssignments || 0} {pub.previousMonthAssignments || 0}
{pub.lastLogin ? new Date(pub.lastLogin).toLocaleString("bg") : ""}
{allPub.currentMonthAssignments || 0} {allPub.previousMonthAssignments || 0}
); } export default ContactsPage; // Helper functions ToDo: move them to common and replace all implementations with the common ones function countAssignments(assignments, startTime, endTime) { return assignments.filter(assignment => assignment.shift.startTime >= startTime && assignment.shift.startTime <= endTime ).length; } function convertShiftDates(assignments) { assignments.forEach(assignment => { if (assignment.shift && assignment.shift.startTime) { assignment.shift.startTime = new Date(assignment.shift.startTime).toISOString(); assignment.shift.endTime = new Date(assignment.shift.endTime).toISOString(); } }); } export const getServerSideProps = async (context) => { const prisma = common.getPrismaClient(); const dateStr = new Date().toISOString().split('T')[0]; let publishers = await data.filterPublishersNew('id,firstName,lastName,email,isActive,desiredShiftsPerMonth,lastLogin', dateStr, false, true, true, true, true); // const axios = await axiosServer(context); // const { data: publishers } = await axios.get(`api/?action=filterPublishers&assignments=true&availabilities=true&date=${dateStr}&select=id,firstName,lastName,isActive,desiredShiftsPerMonth`); // api/index?action=filterPublishers&assignments=true&availabilities=true&date=2024-03-14&select=id%2CfirstName%2ClastName%2CisActive%2CdesiredShiftsPerMonth publishers.forEach(publisher => { publisher.desiredShiftsPerMonth = publisher.desiredShiftsPerMonth || 0; publisher.assignments = publisher.assignments || []; publisher.availabilities = publisher.availabilities || []; publisher.lastUpdate = publisher.availabilities.reduce((acc, curr) => curr.dateOfEntry > acc ? curr.dateOfEntry : acc, null); if (publisher.lastUpdate) { publisher.lastUpdate = common.getDateFormated(publisher.lastUpdate); } else { publisher.lastUpdate = "Няма данни"; } //serialize dates in publisher.assignments and publisher.availabilities publisher.assignments.forEach(assignment => { if (assignment.shift && assignment.shift.startTime) { assignment.shift.startTime = assignment.shift.startTime.toISOString(); assignment.shift.endTime = assignment.shift.endTime.toISOString(); } }); publisher.availabilities.forEach(availability => { if (availability.startTime) { availability.startTime = availability.startTime.toISOString(); availability.endTime = availability.endTime.toISOString(); if (availability.dateOfEntry) { availability.dateOfEntry = availability.dateOfEntry.toISOString(); } } }); publisher.lastLogin = publisher.lastLogin ? publisher.lastLogin.toISOString() : null; //remove availabilities that isFromPreviousAssignment publisher.availabilities = publisher.availabilities.filter(availability => !availability.isFromPreviousAssignment); }); //remove publishers without availabilities publishers = publishers.filter(publisher => publisher.availabilities.length > 0); let allPublishers = await prisma.publisher.findMany({ select: { id: true, firstName: true, lastName: true, email: true, phone: true, isActive: true, desiredShiftsPerMonth: true, lastLogin: true, assignments: { select: { id: true, shift: { select: { startTime: true, endTime: true, }, }, }, }, }, }); let monthInfo, currentMonthStart, currentMonthEnd, previousMonthStart, previousMonthEnd; monthInfo = common.getMonthDatesInfo(new Date()); currentMonthStart = monthInfo.firstMonday; currentMonthEnd = monthInfo.lastSunday; let prevMnt = new Date(); prevMnt.setMonth(prevMnt.getMonth() - 1); monthInfo = common.getMonthDatesInfo(prevMnt); previousMonthStart = monthInfo.firstMonday; previousMonthEnd = monthInfo.lastSunday; allPublishers.forEach(publisher => { // Use helper functions to calculate and assign assignment counts publisher.currentMonthAssignments = countAssignments(publisher.assignments, currentMonthStart, currentMonthEnd); publisher.previousMonthAssignments = countAssignments(publisher.assignments, previousMonthStart, previousMonthEnd); publisher.lastLogin = publisher.lastLogin ? publisher.lastLogin.toISOString() : null; // Convert date formats within the same iteration convertShiftDates(publisher.assignments); }); // Optionally, if you need a transformed list or additional properties, map the publishers allPublishers = allPublishers.map(publisher => ({ ...publisher, // Potentially add more computed properties or transformations here if needed })); allPublishers.sort((a, b) => a.firstName.localeCompare(b.firstName) || a.lastName.localeCompare(b.lastName)); return { props: { publishers, allPublishers, }, }; };