From acd776e98881ec9134eec668fda3756c7f6c3dde Mon Sep 17 00:00:00 2001 From: Dobromir Popov Date: Tue, 26 Mar 2024 01:08:57 +0200 Subject: [PATCH 1/5] renames --- components/ExampleForm.js | 8 +++---- components/availability/AvailabilityForm.js | 2 +- .../AvailabilityFormDatePicker.js | 10 ++++---- components/availability/AvailabilityList.js | 2 +- components/calendar/ShiftComponent.tsx | 2 +- components/calendar/avcalendar.tsx | 12 +++++----- components/cartevent/CartEventForm.tsx | 6 ++--- components/location/LocationCard.js | 4 ++-- components/location/LocationForm.js | 10 ++++---- components/publisher/PublisherCard.js | 4 ++-- components/publisher/PublisherForm.js | 8 +++---- components/publisher/PublisherSearchBox.js | 4 ++-- components/publisher/ShiftsList.tsx | 2 +- components/sidebar.tsx | 2 +- pages/api/index.ts | 4 ++-- pages/api/schedule.ts | 2 +- pages/api/shiftgenerate.ts | 10 ++++---- pages/cart/availabilities/index.tsx | 10 ++++---- pages/cart/calendar/index.tsx | 18 +++++++-------- pages/cart/cartevents/index.tsx | 2 +- pages/cart/publishers/import.tsx | 10 ++++---- pages/cart/publishers/index.tsx | 2 +- pages/cart/publishers/stats.tsx | 6 ++--- pages/cart/reports/list.tsx | 12 ++++++++++ pages/dash.tsx | 6 ++--- prisma/bl/subqueries.js | 4 ++-- .../20221130072538_updates/migration.sql | 6 ++--- .../migrations/20221201223336_/migration.sql | 4 ++-- .../migration.sql | 2 +- .../migration.sql | 4 ++-- .../20240325214807_misc_renames/migration.sql | 15 ++++++++++++ prisma/schema.prisma | 23 +++++++++++++------ prisma/seed.sql | 6 ++--- server.js | 4 ++-- src/helpers/data.js | 6 ++--- src/helpers/excel.js | 14 +++++------ src/sql/dev-test.sql | 4 ++-- 37 files changed, 143 insertions(+), 107 deletions(-) create mode 100644 prisma/migrations/20240325214807_misc_renames/migration.sql diff --git a/components/ExampleForm.js b/components/ExampleForm.js index 45f49f8..bf9050f 100644 --- a/components/ExampleForm.js +++ b/components/ExampleForm.js @@ -40,7 +40,7 @@ class ExampleForm extends React.Component { } const [item, set] = useState({ - isactive: true, + isActive: true, }); const router = useRouter(); @@ -63,7 +63,7 @@ class ExampleForm extends React.Component { handleChange = ({ target }) => { - if (target.name === "isactive") { + if (target.name === "isActive") { set({ ...item, [target.name]: target.checked }); } else if (target.name === "age") { set({ ...item, [target.name]: parseInt(target.value) }); @@ -100,8 +100,8 @@ class ExampleForm extends React.Component {

{router.query?.id ? "Редактирай" : "Създай"} Item

- -
diff --git a/components/availability/AvailabilityForm.js b/components/availability/AvailabilityForm.js index f95870e..19d09a4 100644 --- a/components/availability/AvailabilityForm.js +++ b/components/availability/AvailabilityForm.js @@ -39,7 +39,7 @@ export default function AvailabilityForm({ publisherId, existingItems, inline, o dayOfMonth: null, // startTime: "08:00", // endTime: "20:00", - isactive: true, + isActive: true, repeatWeekly: false, endDate: null, isFirst: false, diff --git a/components/availability/AvailabilityFormDatePicker.js b/components/availability/AvailabilityFormDatePicker.js index 5d8f4fc..e7a3f26 100644 --- a/components/availability/AvailabilityFormDatePicker.js +++ b/components/availability/AvailabilityFormDatePicker.js @@ -36,7 +36,7 @@ model Availability { weekOfMonth Int? startTime DateTime endTime DateTime - isactive Boolean @default(true) + isActive Boolean @default(true) type AvailabilityType @default(Weekly) isWithTransport Boolean @default(false) isFromPreviousAssignment Boolean @default(false) @@ -69,7 +69,7 @@ export default function AvailabilityForm({ publisherId, existingItem, inline, on dayOfMonth: null, startTime: "08:00", endTime: "20:00", - isactive: true, + isActive: true, repeatWeekly: false, endDate: null, }); @@ -554,11 +554,11 @@ export default function AvailabilityForm({ publisherId, existingItem, inline, on
- - + +
- {/* */} + {/* */}
diff --git a/components/availability/AvailabilityList.js b/components/availability/AvailabilityList.js index 65bdf6d..cb9cc56 100644 --- a/components/availability/AvailabilityList.js +++ b/components/availability/AvailabilityList.js @@ -56,7 +56,7 @@ export default function AvailabilityList({ publisher, showNew }) { {items?.sort((a, b) => new Date(a.startTime) - new Date(b.startTime)).map(item => ( - + {item.dayOfMonth ? `${common.getDateFormated(new Date(item.startTime))}` : `Всеки(Всяка) ${common.getDayOfWeekName(new Date(item.startTime))}`} {/* {common.getDateFormated(new Date(item.startTime))} */} diff --git a/components/calendar/ShiftComponent.tsx b/components/calendar/ShiftComponent.tsx index 0802bc8..a50db70 100644 --- a/components/calendar/ShiftComponent.tsx +++ b/components/calendar/ShiftComponent.tsx @@ -70,7 +70,7 @@ function ShiftComponent({ shift, onShiftSelect, isSelected, onPublisherSelect, a const newAssignment = { publisher: { connect: { id: publisher.id } }, shift: { connect: { id: shiftId } }, - //isactive: true, + //isActive: true, isConfirmed: true, }; const { data } = await axiosInstance.post("/api/data/assignments", newAssignment); diff --git a/components/calendar/avcalendar.tsx b/components/calendar/avcalendar.tsx index 8fd7026..c631c72 100644 --- a/components/calendar/avcalendar.tsx +++ b/components/calendar/avcalendar.tsx @@ -206,7 +206,7 @@ const AvCalendar = ({ publisherId, events, selectedDate }) => { // startTime: start, // endTime: end, // dayOfMonth: start.getDate(), - // isactive: true, + // isActive: true, // publisherId: publisherId, // // Add any other initial values needed // //set dayOfMonth to null, so that we repeat the availability every week @@ -273,9 +273,9 @@ const AvCalendar = ({ publisherId, events, selectedDate }) => { //if event.type is availability show in blue. if it is schedule - green if confirmed, yellow if not confirmed //if event is not active - show in gray let bgColorClass = 'bg-gray-500'; // Default color for inactive events - var bgColor = event.isactive ? "" : "bg-gray-500"; + var bgColor = event.isActive ? "" : "bg-gray-500"; if (event.type === "assignment") { - bgColor = event.isTentative ? "bg-red-500" : (event.isConfirmed ? "bg-green-500" : "bg-yellow-500"); + bgColor = event.isBySystem ? "bg-red-500" : (event.isConfirmed ? "bg-green-500" : "bg-yellow-500"); //event.title = event.publisher.name; //ToDo: add other publishers names //event.title = common.getTimeFomatted(event.startTime) + " - " + common.getTimeFomatted(event.endTime); @@ -319,7 +319,7 @@ const AvCalendar = ({ publisherId, events, selectedDate }) => { toast.info("Потвърдено!", { autoClose: 2000 }); // Update the event data event.isConfirmed = true; - event.isTentative = false; + event.isBySystem = false; // Update the events array by first removing the old event and then adding the updated one setEvents(currentEvents => { const filteredEvents = currentEvents.filter(e => e.id !== event.id); @@ -328,7 +328,7 @@ const AvCalendar = ({ publisherId, events, selectedDate }) => { //store the updated event in the database var assignment = { isConfirmed: true, - isTentative: false + isBySystem: false }; axiosInstance.put('/api/data/assignments/' + event.id, assignment) .then((response) => { @@ -388,7 +388,7 @@ const AvCalendar = ({ publisherId, events, selectedDate }) => { // orange-500 from Tailwind CSS backgroundColor = '#f56565'; } - if (event.isactive) { + if (event.isActive) { switch (event.type) { case 'assignment': backgroundColor = event.isConfirmed ? '#48bb78' : '#f6e05e'; // green-500 and yellow-300 from Tailwind CSS diff --git a/components/cartevent/CartEventForm.tsx b/components/cartevent/CartEventForm.tsx index 1399799..d6d6fdd 100644 --- a/components/cartevent/CartEventForm.tsx +++ b/components/cartevent/CartEventForm.tsx @@ -15,7 +15,7 @@ model CartEvent { shiftDuration Int shifts Shift[] dayofweek DayOfWeek - isactive Boolean @default(true) + isActive Boolean @default(true) }*/ interface Location { id: number; @@ -174,8 +174,8 @@ export default function CartEventForm(props: IProps) {
- - + +
diff --git a/components/location/LocationCard.js b/components/location/LocationCard.js index 2a2a3ec..adaf15c 100644 --- a/components/location/LocationCard.js +++ b/components/location/LocationCard.js @@ -28,11 +28,11 @@ export default function LocationCard({ location }) { <>
router.push(`/cart/locations/edit/${location.id}`)} >
- {location.name} ({location.isactive ? "active" : "inactive"}) + {location.name} ({location.isActive ? "active" : "inactive"})

{location.address} diff --git a/components/location/LocationForm.js b/components/location/LocationForm.js index 098186a..4f58fdb 100644 --- a/components/location/LocationForm.js +++ b/components/location/LocationForm.js @@ -19,7 +19,7 @@ const common = require('src/helpers/common'); // id Int @id @default(autoincrement()) // name String // address String -// isactive Boolean @default(true) +// isActive Boolean @default(true) // content String? @db.Text // cartEvents CartEvent[] // reports Report[] @@ -65,7 +65,7 @@ export default function LocationForm() { const [location, set] = useState({ name: "", address: "", - isactive: true, + isActive: true, }); // const [isEdit, setIsEdit] = useState(false); @@ -171,11 +171,11 @@ export default function LocationForm() {

- {/* UI for Location.isactive */} + {/* UI for Location.isActive */}
- - + +
{/* backupLocation */} diff --git a/components/publisher/PublisherCard.js b/components/publisher/PublisherCard.js index a993240..248f067 100644 --- a/components/publisher/PublisherCard.js +++ b/components/publisher/PublisherCard.js @@ -57,7 +57,7 @@ export default function PublisherCard({ publisher }) { return isCardVisible ? ( // className="block p-6 max-w-sm bg-white rounded-lg border border-gray-200 shadow-md hover:bg-gray-100 dark:bg-gray-800 dark:border-gray-700 dark:hover:bg-gray-700 mb-3"
- {publisher.firstName} {publisher.lastName} ({publisher.isactive ? "active" : "inactive"}) + {publisher.firstName} {publisher.lastName} ({publisher.isActive ? "active" : "inactive"})

{publisher.assignments.length} смени общо

diff --git a/components/publisher/PublisherForm.js b/components/publisher/PublisherForm.js index f5f1f44..a95e520 100644 --- a/components/publisher/PublisherForm.js +++ b/components/publisher/PublisherForm.js @@ -23,7 +23,7 @@ import { UserRole } from "@prisma/client"; // lastName String // email String @unique // phone String? -// isactive Boolean @default(true) +// isActive Boolean @default(true) // isImported Boolean @default(false) // age Int? // availabilities Availability[] @@ -75,7 +75,7 @@ export default function PublisherForm({ item, me }) { }, []); const [publisher, set] = useState(item || { - isactive: true, + isActive: true, }); const handleChange = ({ target }) => { @@ -259,8 +259,8 @@ export default function PublisherForm({ item, me }) {
- - + + diff --git a/components/publisher/PublisherSearchBox.js b/components/publisher/PublisherSearchBox.js index 605b70c..4926504 100644 --- a/components/publisher/PublisherSearchBox.js +++ b/components/publisher/PublisherSearchBox.js @@ -18,7 +18,7 @@ function PublisherSearchBox({ selectedId, onChange, isFocused, filterDate, showS 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&searchText=${searchText}&availabilities=false`; if (filterDate) { url += `&filterDate=${common.getISODateOnly(filterDate)}`; @@ -29,7 +29,7 @@ function PublisherSearchBox({ selectedId, onChange, isFocused, filterDate, showS const { data: publishersData } = await axiosInstance.get(url); //setPublishers(publishersData); - const activePublishers = publishersData.filter(publisher => publisher.isactive === true); + const activePublishers = publishersData.filter(publisher => publisher.isActive === true); setPublishers(activePublishers); } catch (error) { diff --git a/components/publisher/ShiftsList.tsx b/components/publisher/ShiftsList.tsx index 49cc71a..ac3bb30 100644 --- a/components/publisher/ShiftsList.tsx +++ b/components/publisher/ShiftsList.tsx @@ -35,7 +35,7 @@ const ShiftsList = ({ assignments, selectedtab }: ShiftsListProps) => { try { var assignment = (await axiosInstance.get("/api/data/assignments/" + id)).data; assignment.isConfirmed = false; - assignment.isTentative = true; + // ! assignment.isTentative = true; // assignment.isDeleted = true; await axiosInstance.put("/api/data/assignments/" + id, assignment); toast.success("Shift Tentative", { diff --git a/components/sidebar.tsx b/components/sidebar.tsx index b0d4838..b20a168 100644 --- a/components/sidebar.tsx +++ b/components/sidebar.tsx @@ -99,7 +99,7 @@ export default function Sidebar({ isSidebarOpen, toggleSidebar }) { try { const response = await axiosInstance.get('/api/data/locations'); // Adjust the API endpoint as needed const locationsData = response.data - .filter(location => location.isactive === true) + .filter(location => location.isActive === true) .map(location => ({ text: location.name, url: `/cart/locations/${location.id}`, diff --git a/pages/api/index.ts b/pages/api/index.ts index 260bc92..6979920 100644 --- a/pages/api/index.ts +++ b/pages/api/index.ts @@ -143,7 +143,7 @@ export default async function handler(req, res) { case "getUnassignedPublishers": //let monthInfo = common.getMonthDatesInfo(date); - let allPubs = await filterPublishers("id,firstName,lastName,email,isactive".split(","), "", date, true, true, false); + let allPubs = await filterPublishers("id,firstName,lastName,email,isActive".split(","), "", date, true, true, false); let unassignedPubs = allPubs.filter(pub => pub.currentMonthAssignments == 0 && pub.availabilities.length > 0); res.status(200).json(unassignedPubs); break; @@ -690,7 +690,7 @@ async function replaceInAssignment(oldPublisherId, newPublisherId, shiftId) { data: { publisherId: newPublisherId, isConfirmed: false, - isTentative: true, + isBySystem: true, isMailSent: false } }); diff --git a/pages/api/schedule.ts b/pages/api/schedule.ts index 22ae3d9..e322568 100644 --- a/pages/api/schedule.ts +++ b/pages/api/schedule.ts @@ -89,7 +89,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) const shifts = await prisma.shift.findMany({ where: { - isactive: true, + isActive: true, startTime: { gte: fromDate, lt: toDate, diff --git a/pages/api/shiftgenerate.ts b/pages/api/shiftgenerate.ts index 64b2104..4d44052 100644 --- a/pages/api/shiftgenerate.ts +++ b/pages/api/shiftgenerate.ts @@ -68,7 +68,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { case "test": var data = prisma.shift.findMany({ where: { - isactive: true + isActive: true } }); @@ -110,7 +110,7 @@ async function GenerateSchedule(axios: Axios, date: string, copyFromPreviousMont } console.log("finding shifts for previous 3 months for statistics (between " + new Date(monthInfo.date.getFullYear(), monthInfo.date.getMonth() - 3, 1).toISOString() + " and " + monthInfo.firstDay.toISOString() + ")"); - const { data: events } = await axios.get(`/api/data/cartevents?where={"isactive":{"$eq":true}}`); + const { data: events } = await axios.get(`/api/data/cartevents?where={"isActive":{"$eq":true}}`); //// let [shiftsLastMonth, publishers] = await getShiftsAndPublishersForPreviousMonths(lastMonthInfo); //use filterPublishers from /pages/api/data/index.ts to get publishers with stats @@ -308,7 +308,7 @@ async function GenerateSchedule(axios: Axios, date: string, copyFromPreviousMont assignments: 'true', availabilities: 'true', date: common.getISODateOnly(shiftStart), - select: 'id,firstName,lastName,isactive,desiredShiftsPerMonth' + select: 'id,firstName,lastName,isActive,desiredShiftsPerMonth' }); let allAvailablePublishers = (await axios.get(`/api/?${queryParams.toString()}`)).data; let availablePublishers = allAvailablePublishers; @@ -616,12 +616,12 @@ async function ImportShiftsFromDocx(axios: Axios) { // prisma.publisher.findMany({ // where: { -// isactive: true, +// isActive: true, // }, // include: { // availabilities: { // where: { -// isactive: true, +// isActive: true, // }, // }, // assignments: { diff --git a/pages/cart/availabilities/index.tsx b/pages/cart/availabilities/index.tsx index 4cd257b..0cd158a 100644 --- a/pages/cart/availabilities/index.tsx +++ b/pages/cart/availabilities/index.tsx @@ -30,7 +30,7 @@ export default function AvPage({ initialItems, id }: IProps) { date: new Date(item.startTime), start: new Date(item.startTime), end: new Date(item.endTime), - isactive: item.isactive, + isActive: item.isActive, publisherId: item.publisher.id, dayOfMonth: item.dayOfMonth, dayOfWeek: item.dayOfWeek, @@ -66,9 +66,9 @@ export default function AvPage({ initialItems, id }: IProps) { {initialItems?.map((item: Availability) => ( - + - {item.id} {item.isactive} + {item.id} {item.isActive} {item.publisher.lastName}, {item.publisher.firstName} @@ -133,14 +133,14 @@ export const getServerSideProps = async (context) => { const role = session?.user.role; console.log("server role: " + role); - var queryUrl = process.env.NEXTAUTH_URL + "/api/data/availabilities?select=id,name,isactive,dayofweek,dayOfMonth,startTime,endTime,publisher.firstName,publisher.lastName,publisher.id"; + var queryUrl = process.env.NEXTAUTH_URL + "/api/data/availabilities?select=id,name,isActive,dayofweek,dayOfMonth,startTime,endTime,publisher.firstName,publisher.lastName,publisher.id"; if (role === UserRole.USER || context.query.my) { queryUrl += `&where={"publisherId":"${session?.user.id}"}`; } else if (role == UserRole.ADMIN) { if (context.query.id) { queryUrl += `&where={"publisherId":"${context.query.id}"}`; } else { - queryUrl += `&where={"isactive":true}`; + queryUrl += `&where={"isActive":true}`; } } var resp = await axios.get( diff --git a/pages/cart/calendar/index.tsx b/pages/cart/calendar/index.tsx index a3f5746..77b2d4a 100644 --- a/pages/cart/calendar/index.tsx +++ b/pages/cart/calendar/index.tsx @@ -100,7 +100,7 @@ export default function CalendarPage({ initialEvents, initialShifts }) { console.log("Setting date to '" + date.toLocaleDateString() + "' from '" + selectedDate.toLocaleDateString() + "'. ISO: " + date.toISOString(), "locale ISO:", common.getISODateOnly(date)); if (isCheckboxChecked) { console.log(`getting unassigned publishers for ${common.getMonthName(date.getMonth())} ${date.getFullYear()}`); - const { data: availablePubsForDate } = await axiosInstance.get(`/api/?action=getUnassignedPublishers&date=${dateStr}&select=id,firstName,lastName,isactive,desiredShiftsPerMonth`); + const { data: availablePubsForDate } = await axiosInstance.get(`/api/?action=getUnassignedPublishers&date=${dateStr}&select=id,firstName,lastName,isActive,desiredShiftsPerMonth`); setAvailablePubs(availablePubsForDate); } else { @@ -108,7 +108,7 @@ export default function CalendarPage({ initialEvents, initialShifts }) { try { const { data: shiftsForDate } = await axiosInstance.get(`/api/?action=getShiftsForDay&date=${dateStr}`); setShifts(shiftsForDate); - let { data: availablePubsForDate } = await axiosInstance.get(`/api/?action=filterPublishers&assignments=true&availabilities=true&date=${dateStr}&select=id,firstName,lastName,isactive,desiredShiftsPerMonth`); + let { data: availablePubsForDate } = await axiosInstance.get(`/api/?action=filterPublishers&assignments=true&availabilities=true&date=${dateStr}&select=id,firstName,lastName,isActive,desiredShiftsPerMonth`); availablePubsForDate.forEach(pub => { pub.canTransport = pub.availabilities.some(av => @@ -172,8 +172,8 @@ export default function CalendarPage({ initialEvents, initialShifts }) { // currentMonthAssignments and previousMonthAssignments properties // Sort publishers based on availability and then by assignment counts. const sortedPubs = updatedPubs.sort((a, b) => { - if (a.isactive !== b.isactive) { - return a.isactive ? -1 : 1; + if (a.isActive !== b.isActive) { + return a.isActive ? -1 : 1; } // First, sort by isselected. if (a.isSelected !== b.isSelected) { @@ -355,7 +355,7 @@ export default function CalendarPage({ initialEvents, initialShifts }) { const newAssignment = { publisher: { connect: { id: publisher.id } }, shift: { connect: { id: shiftId } }, - isactive: true, + isActive: true, isConfirmed: true }; const { data } = await axiosInstance.post("/api/data/assignments", newAssignment); @@ -669,7 +669,7 @@ export default function CalendarPage({ initialEvents, initialShifts }) { // Determine border class if selected const selectedBorderClass = pub.isSelected ? 'border-blue-400 border-b-4' : ''; // Determine opacity class - const activeOpacityClass = pub.isactive ? '' : 'opacity-25'; + const activeOpacityClass = pub.isActive ? '' : 'opacity-25'; return ( @@ -878,20 +878,20 @@ export const getServerSideProps = async (context) => { const url = `/api/data/shifts?where={"startTime":{"$and":[{"$gte":"${common.getISODateOnly(firstDayOfMonth)}","$lt":"${common.getISODateOnly(lastDayOfMonth)}"}]}}`; const prismaClient = common.getPrismaClient(); - // let events = await prismaClient.cartEvent.findMany({ where: { isactive: true } }); + // let events = await prismaClient.cartEvent.findMany({ where: { isActive: true } }); // events = events.map(event => ({ // ...event, // // Convert Date objects to ISO strings // startTime: event.startTime.toISOString(), // endTime: event.endTime.toISOString(), // })); - const { data: events } = await axios.get(`/api/data/cartevents?where={"isactive":true}`); + const { data: events } = await axios.get(`/api/data/cartevents?where={"isActive":true}`); //const { data: shifts } = await axios.get(url); // get all shifts for the month, including assigments let shifts = await prismaClient.shift.findMany({ where: { - isactive: true, + isActive: true, startTime: { gte: firstDayOfMonth, //lt: lastDayOfMonth diff --git a/pages/cart/cartevents/index.tsx b/pages/cart/cartevents/index.tsx index c5006c1..0396d9f 100644 --- a/pages/cart/cartevents/index.tsx +++ b/pages/cart/cartevents/index.tsx @@ -69,7 +69,7 @@ export default function CartEventPage({ items, locations }: ICartEventPageProps) {item.shiftDuration} - {item.isactive ? "Yes" : "No"} + {item.isActive ? "Yes" : "No"} + + +
diff --git a/pages/dash.tsx b/pages/dash.tsx index c5f8ced..71718db 100644 --- a/pages/dash.tsx +++ b/pages/dash.tsx @@ -86,7 +86,7 @@ async function getAvailabilities(userId) { select: { id: true, name: true, - isactive: true, + isActive: true, isFromPreviousAssignment: true, dayofweek: true, dayOfMonth: true, @@ -121,7 +121,7 @@ async function getAvailabilities(userId) { shiftId Int publisher Publisher @relation(fields: [publisherId], references: [id], onDelete: Cascade) publisherId String - isactive Boolean @default(true) + isActive Boolean @default(true) isConfirmed Boolean @default(false) isWithTransport Boolean @default(false) Report Report[] @@ -133,7 +133,7 @@ async function getAvailabilities(userId) { }, select: { id: true, - isTentative: true, + isBySystem: true, isConfirmed: true, isWithTransport: true, shift: { diff --git a/prisma/bl/subqueries.js b/prisma/bl/subqueries.js index ab557e0..44f977f 100644 --- a/prisma/bl/subqueries.js +++ b/prisma/bl/subqueries.js @@ -13,7 +13,7 @@ export const publisherSelectWithAvCount = { select: { availability: { where: { - isactive: true + isActive: true } } @@ -40,7 +40,7 @@ export const publisherSelect = { // endTime: true, // dayOfMonth: true, // dayofweek: true, -// isactive: true, +// isActive: true, // count: 'Availability_count' // } // } \ No newline at end of file diff --git a/prisma/migrations/20221130072538_updates/migration.sql b/prisma/migrations/20221130072538_updates/migration.sql index 239a224..978530e 100644 --- a/prisma/migrations/20221130072538_updates/migration.sql +++ b/prisma/migrations/20221130072538_updates/migration.sql @@ -5,7 +5,7 @@ CREATE TABLE `Publisher` ( `lastName` VARCHAR(191) NOT NULL, `email` VARCHAR(191) NOT NULL, `phone` VARCHAR(191) NULL, - `isactive` BOOLEAN NOT NULL DEFAULT true, + `isActive` BOOLEAN NOT NULL DEFAULT true, `age` INTEGER NULL, UNIQUE INDEX `Publisher_email_key`(`email`), @@ -41,7 +41,7 @@ CREATE TABLE `Shift` ( `name` VARCHAR(191) NOT NULL, `startTime` DATETIME(3) NOT NULL, `endTime` DATETIME(3) NOT NULL, - `isactive` BOOLEAN NOT NULL DEFAULT true, + `isActive` BOOLEAN NOT NULL DEFAULT true, `requiresTransport` BOOLEAN NOT NULL DEFAULT false, PRIMARY KEY (`id`) @@ -52,7 +52,7 @@ CREATE TABLE `Location` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `name` VARCHAR(191) NOT NULL, `address` VARCHAR(191) NOT NULL, - `isactive` BOOLEAN NOT NULL DEFAULT true, + `isActive` BOOLEAN NOT NULL DEFAULT true, `dayofweek` ENUM('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday') NOT NULL, PRIMARY KEY (`id`) diff --git a/prisma/migrations/20221201223336_/migration.sql b/prisma/migrations/20221201223336_/migration.sql index 90fe9cb..446e110 100644 --- a/prisma/migrations/20221201223336_/migration.sql +++ b/prisma/migrations/20221201223336_/migration.sql @@ -6,10 +6,10 @@ */ -- AlterTable -ALTER TABLE `Availability` ADD COLUMN `isactive` BOOLEAN NOT NULL DEFAULT true; +ALTER TABLE `Availability` ADD COLUMN `isActive` BOOLEAN NOT NULL DEFAULT true; -- AlterTable -ALTER TABLE `CartEvent` ADD COLUMN `isactive` BOOLEAN NOT NULL DEFAULT true, +ALTER TABLE `CartEvent` ADD COLUMN `isActive` BOOLEAN NOT NULL DEFAULT true, ADD COLUMN `locationId` INTEGER NOT NULL, ADD COLUMN `shiftDuration` INTEGER NOT NULL; diff --git a/prisma/migrations/20221217221944_publisher_to_shift_renamed_assignment/migration.sql b/prisma/migrations/20221217221944_publisher_to_shift_renamed_assignment/migration.sql index a466b86..cd87cb8 100644 --- a/prisma/migrations/20221217221944_publisher_to_shift_renamed_assignment/migration.sql +++ b/prisma/migrations/20221217221944_publisher_to_shift_renamed_assignment/migration.sql @@ -18,7 +18,7 @@ CREATE TABLE `Assignment` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `shiftId` INTEGER NOT NULL, `publisherId` INTEGER NOT NULL, - `isactive` BOOLEAN NOT NULL DEFAULT true, + `isActive` BOOLEAN NOT NULL DEFAULT true, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; diff --git a/prisma/migrations/20240131113517_assignment_isactive_renamed_istetative/migration.sql b/prisma/migrations/20240131113517_assignment_isactive_renamed_istetative/migration.sql index 0d0703e..55bc254 100644 --- a/prisma/migrations/20240131113517_assignment_isactive_renamed_istetative/migration.sql +++ b/prisma/migrations/20240131113517_assignment_isactive_renamed_istetative/migration.sql @@ -1,11 +1,11 @@ /* Warnings: - - You are about to drop the column `isactive` on the `assignment` table. All the data in the column will be lost. + - You are about to drop the column `isActive` on the `assignment` table. All the data in the column will be lost. */ -- AlterTable -ALTER TABLE `Assignment` DROP COLUMN `isactive`, +ALTER TABLE `Assignment` DROP COLUMN `isActive`, ADD COLUMN `isTentative` BOOLEAN NOT NULL DEFAULT false; -- AlterTable diff --git a/prisma/migrations/20240325214807_misc_renames/migration.sql b/prisma/migrations/20240325214807_misc_renames/migration.sql new file mode 100644 index 0000000..2a2f6e7 --- /dev/null +++ b/prisma/migrations/20240325214807_misc_renames/migration.sql @@ -0,0 +1,15 @@ +/* + Warnings: + + - You are about to drop the column `isTentative` on the `Assignment` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE `Assignment` + ADD COLUMN `isBySystem` BOOLEAN NOT NULL DEFAULT false; +UPDATE `Assignment` SET `isBySystem` = isTentative; + +ALTER TABLE `Assignment` DROP COLUMN `isTentative`, + +-- AlterTable +ALTER TABLE `Report` ADD COLUMN `type` ENUM('ServiceReport', 'Experience', 'Feedback_Problem', 'Feedback_Suggestion', 'Feedback') NOT NULL DEFAULT 'ServiceReport'; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 2ea7b1f..91b56e0 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -81,13 +81,21 @@ enum PublisherType { SpecialPioneer_Missionary } +enum ReportType { + ServiceReport + Experience + Feedback_Problem + Feedback_Suggestion + Feedback +} + model Publisher { id String @id @default(cuid()) firstName String lastName String email String @unique phone String? - isactive Boolean @default(true) + isActive Boolean @default(true) isImported Boolean @default(false) isTrained Boolean @default(false) age Int? @@ -124,7 +132,7 @@ model Availability { weekOfMonth Int? startTime DateTime endTime DateTime - isactive Boolean @default(true) + isActive Boolean @default(true) type AvailabilityType @default(Weekly) isWithTransportIn Boolean @default(false) isWithTransportOut Boolean @default(false) @@ -143,7 +151,7 @@ model CartEvent { shiftDuration Int shifts Shift[] dayofweek DayOfWeek - isactive Boolean @default(true) + isActive Boolean @default(true) location Location @relation(fields: [locationId], references: [id]) locationId Int eventType EventType @default(PW_Cart) @@ -160,7 +168,7 @@ model Shift { name String startTime DateTime endTime DateTime - isactive Boolean @default(true) + isActive Boolean @default(true) requiresTransport Boolean @default(false) notes String? //date DateTime @@ -177,7 +185,7 @@ model Assignment { shiftId Int publisher Publisher @relation(fields: [publisherId], references: [id], onDelete: Cascade) publisherId String - isTentative Boolean @default(false) // if no availability for it, when importing previous schedules + isBySystem Boolean @default(false) // if no availability for it, when importing previous schedules isConfirmed Boolean @default(false) isWithTransport Boolean @default(false) isMailSent Boolean @default(false) @@ -190,7 +198,7 @@ model Location { id Int @id @default(autoincrement()) name String address String - isactive Boolean @default(true) + isActive Boolean @default(true) content String? @db.LongText cartEvents CartEvent[] reports Report[] @@ -219,7 +227,8 @@ model Report { returnVisitInfoCount Int? conversationCount Int? - experienceInfo String? @db.LongText + experienceInfo String? @db.LongText + type ReportType @default(ServiceReport) @@map("Report") } diff --git a/prisma/seed.sql b/prisma/seed.sql index f64a4f5..6261a5c 100644 --- a/prisma/seed.sql +++ b/prisma/seed.sql @@ -30,7 +30,7 @@ INSERT INTO `id`, `name`, `address`, - `isactive` + `isActive` ) VALUES ( 1, @@ -57,7 +57,7 @@ INSERT INTO `startTime`, `endTime`, `dayofweek`, - `isactive`, + `isActive`, `locationId`, `shiftDuration`, `eventType`, @@ -147,7 +147,7 @@ VALUES ( /*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */ ; --- INSERT INTO `cartevent` (`id`, `startTime`, `endTime`, `dayofweek`, `isactive`, `locationId`, `shiftDuration`, `eventType`, `numberOfPublishers`) +-- INSERT INTO `cartevent` (`id`, `startTime`, `endTime`, `dayofweek`, `isActive`, `locationId`, `shiftDuration`, `eventType`, `numberOfPublishers`) -- VALUES -- (2, '2023-12-27 07:00:33.174', '2023-12-27 16:00:33.174', 'Tuesday', 1, 2, 90, 'PW_Cart', 4), -- (3, '2023-12-28 07:00:33.174', '2023-12-28 16:00:33.174', 'Wednesday', 1, 3, 90, 'PW_Cart', 4), diff --git a/server.js b/server.js index bfd1b44..f420718 100644 --- a/server.js +++ b/server.js @@ -259,7 +259,7 @@ nextApp var shifts = await prisma.shift.findMany({ where: { - isactive: true, + isActive: true, startTime: { gte: fromDate, lt: toDate, @@ -410,7 +410,7 @@ nextApp var publishers = await prisma.publisher.findMany({ where: { - isactive: true, + isActive: true, email: { not: "", }, diff --git a/src/helpers/data.js b/src/helpers/data.js index 7c0916b..af888ce 100644 --- a/src/helpers/data.js +++ b/src/helpers/data.js @@ -147,7 +147,7 @@ async function getAvailabilities(userId) { select: { id: true, name: true, - isactive: true, + isActive: true, isFromPreviousAssignment: true, dayofweek: true, dayOfMonth: true, @@ -182,7 +182,7 @@ async function getAvailabilities(userId) { shiftId Int publisher Publisher @relation(fields: [publisherId], references: [id], onDelete: Cascade) publisherId String - isactive Boolean @default(true) + isActive Boolean @default(true) isConfirmed Boolean @default(false) isWithTransport Boolean @default(false) Report Report[] @@ -194,7 +194,7 @@ async function getAvailabilities(userId) { }, select: { id: true, - isTentative: true, + isBySystem: true, isConfirmed: true, isWithTransport: true, shift: { diff --git a/src/helpers/excel.js b/src/helpers/excel.js index 40f2f1c..fd361bc 100644 --- a/src/helpers/excel.js +++ b/src/helpers/excel.js @@ -323,21 +323,21 @@ exports.processEvents = async function (events, year, monthNumber, progressCallb } var shifts = await prisma.shift.findMany({ where: { - isactive: true, + isActive: true, startTime: { gte: monthDatesInfo.firstMonday, lt: monthDatesInfo.lastSunday, }, } }); - var locations = await prisma.location.findMany({ where: { isactive: true, } }); + var locations = await prisma.location.findMany({ where: { isActive: true, } }); - var cartEvents = await prisma.cartEvent.findMany({ where: { isactive: true, } }); + var cartEvents = await prisma.cartEvent.findMany({ where: { isActive: true, } }); var publishers = await prisma.publisher.findMany({ - where: { isactive: true, }, + where: { isActive: true, }, include: { - availabilities: { where: { isactive: true, }, }, + availabilities: { where: { isActive: true, }, }, assignments: { include: { shift: true, }, }, }, }); @@ -472,7 +472,7 @@ exports.processEvents = async function (events, year, monthNumber, progressCallb email: name.toLowerCase().replace(/ /g, "."), // + "@gmail.com" firstName: firstname, lastName: lastname, - isactive: true, + isActive: true, isImported: true, // role: "EXTERNAL", }; @@ -492,7 +492,7 @@ exports.processEvents = async function (events, year, monthNumber, progressCallb // endTime: endTime, // name: `от предишен график, ${publisher.firstName} ${publisher.lastName}`, // isFromPreviousAssignment: true, - // isactive: true, + // isActive: true, // }, // }); // console.log(`Created WEEKLY availability with ID ${availability.id} for date '${date.toDateString()}' and publisher '${publisher.firstName} ${publisher.lastName}'`); diff --git a/src/sql/dev-test.sql b/src/sql/dev-test.sql index d7fe46b..09a3621 100644 --- a/src/sql/dev-test.sql +++ b/src/sql/dev-test.sql @@ -11,7 +11,7 @@ SELECT DISTINCT Publisher.* FROM Publisher INNER JOIN Availability ON Availability.publisherId = Publisher.id WHERE - Availability.isactive = true + Availability.isActive = true AND ( ( Availability.dayOfMonth IS NOT NULL AND Availability.startTime <= '2023-03-30 13:00:00' @@ -30,7 +30,7 @@ SELECT DISTINCT Publisher.* FROM Publisher INNER JOIN Availability ON Availability.publisherId = Publisher.id WHERE - Availability.isactive = true + Availability.isActive = true AND (Availability.dayOfMonth = 5) clfuyo33e005aknvchf1wm3bu All publishers: 121; (118) unique, From 3ccd9ad1064b17b9b5dfd38cc94396195d0e5ec6 Mon Sep 17 00:00:00 2001 From: Dobromir Popov Date: Wed, 27 Mar 2024 09:05:17 +0200 Subject: [PATCH 2/5] schedule is now published to be visible to the public --- pages/api/index.ts | 27 ++++++++++++++++++++++++--- pages/api/schedule.ts | 1 + pages/cart/calendar/index.tsx | 21 ++++++++++++++++++++- pages/cart/publishers/stats.tsx | 9 ++++++++- 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/pages/api/index.ts b/pages/api/index.ts index 6979920..f5e5d14 100644 --- a/pages/api/index.ts +++ b/pages/api/index.ts @@ -7,6 +7,7 @@ const subq = require('../../prisma/bl/subqueries'); import fs from 'fs'; import path from 'path'; +import { all } from "axios"; /** * @@ -29,7 +30,7 @@ export default async function handler(req, res) { var action = req.query.action; var filter = req.query.filter; - let date: Date; + let date: Date, monthInfo: any; if (req.query.date) { date = new Date(req.query.date); //date.setDate(date.getDate()); // Subtract one day to get the correct date, as calendar sends wrong date (one day ahead) @@ -77,7 +78,7 @@ export default async function handler(req, res) { //gets publisher by names with availabilities and assignments case "deleteAvailabilityForPublisher": let publisherId = req.query.publisherId; - let dateFor, monthInfo; + let dateFor; if (req.query.date) { dateFor = new Date(req.query.date); //get month info from date @@ -212,11 +213,31 @@ export default async function handler(req, res) { case "replaceInAssignment": const { oldPublisherId, newPublisherId, shiftId } = req.method === "POST" ? req.body : req.query; - const prisma = common.getPrismaClient(); + const result = await replaceInAssignment(oldPublisherId, newPublisherId, shiftId); res.status(200).json(result); break; + case "updateShifts": + //get all shifts for the month and publish them (we pass date ) + let monthInfo = common.getMonthDatesInfo(date); + let isPublished = common.parseBool(req.query.isPublished); + let updated = await prisma.shift.updateMany({ + where: { + startTime: { + gte: new Date(monthInfo.firstMonday.getFullYear(), monthInfo.firstMonday.getMonth(), 1), + lt: new Date(monthInfo.lastSunday.getFullYear(), monthInfo.lastSunday.getMonth() + 1, 1), + } + }, + data: { + isPublished: isPublished + } + }); + console.log("Updated shifts: " + updated.count); + res.status(200).json({ "message": "ok" }); + + break; + default: res.status(200).json({ "message": "no action '" + action + "' found" diff --git a/pages/api/schedule.ts b/pages/api/schedule.ts index e322568..087ce81 100644 --- a/pages/api/schedule.ts +++ b/pages/api/schedule.ts @@ -90,6 +90,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) const shifts = await prisma.shift.findMany({ where: { isActive: true, + isPublished: true, startTime: { gte: fromDate, lt: toDate, diff --git a/pages/cart/calendar/index.tsx b/pages/cart/calendar/index.tsx index 77b2d4a..f183eb5 100644 --- a/pages/cart/calendar/index.tsx +++ b/pages/cart/calendar/index.tsx @@ -57,7 +57,7 @@ export default function CalendarPage({ initialEvents, initialShifts }) { const [allShifts, setAllShifts] = useState(initialShifts); - const [value, onChange] = useState(new Date()); + const [isPublished, setIsPublished] = useState(() => initialShifts.some(shift => shift.isPublished)); const [value, onChange] = useState(new Date()); const [shifts, setShifts] = React.useState([]); const [error, setError] = React.useState(null); const [availablePubs, setAvailablePubs] = React.useState([]); @@ -108,6 +108,7 @@ export default function CalendarPage({ initialEvents, initialShifts }) { try { const { data: shiftsForDate } = await axiosInstance.get(`/api/?action=getShiftsForDay&date=${dateStr}`); setShifts(shiftsForDate); + setIsPublished(shiftsForDate.some(shift => shift.isPublished)); let { data: availablePubsForDate } = await axiosInstance.get(`/api/?action=filterPublishers&assignments=true&availabilities=true&date=${dateStr}&select=id,firstName,lastName,isActive,desiredShiftsPerMonth`); availablePubsForDate.forEach(pub => { @@ -511,6 +512,18 @@ export default function CalendarPage({ initialEvents, initialShifts }) { } } + const togglePublished = async () => { + try { + const publishState = !isPublished; // Toggle the state + const isPublishedParam = publishState ? 'true' : 'fasle'; + await axiosInstance.get(`/api/?action=updateShifts&isPublished=${isPublishedParam}&date=${common.getISODateOnly(value)}`); + setIsPublished(publishState); // Update state based on the action + + } catch (error) { + console.log(error); + } + } + const [isMenuOpen, setIsMenuOpen] = useState(false); @@ -550,6 +563,12 @@ export default function CalendarPage({ initialEvents, initialShifts }) { }} message="Това ще изпрати имейли до всички участници за смените им през избрания месец. Сигурни ли сте?" /> +
- +
{pub.firstName} {pub.lastName}{pub.firstName} {pub.lastName} {pub.currentMonthAvailabilityDaysCount || 0} | {pub.currentMonthAvailabilityHoursCount || 0} @@ -84,6 +84,13 @@ export const getServerSideProps = async (context) => { 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) { From e0dfbc51ecebf68c95b76f146f6315107e050163 Mon Sep 17 00:00:00 2001 From: Dobromir Popov Date: Thu, 28 Mar 2024 18:11:41 +0200 Subject: [PATCH 3/5] new function - copyOldAvailabilities --- pages/api/index.ts | 68 ++++++++++++++++++++++++++++++++ pages/cart/calendar/index.tsx | 8 +++- pages/cart/publishers/import.tsx | 1 + 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/pages/api/index.ts b/pages/api/index.ts index f5e5d14..7e4658f 100644 --- a/pages/api/index.ts +++ b/pages/api/index.ts @@ -210,6 +210,74 @@ export default async function handler(req, res) { res.status(200).json(shiftsForDate); break; + case "copyOldAvailabilities": + //get all publishers that don't have availabilities for the current month + monthInfo = common.getMonthDatesInfo(date); + // await prisma.availability.deleteMany({ + // where: { + // startTime: { + // gte: monthInfo.firstMonday, + // }, + // isFromPreviousMonth: true + // } + // }); + let oldpubs = await prisma.publisher.findMany({ + where: { + availabilities: { + none: { + startTime: { + gte: monthInfo.firstMonday, + } + } + } + }, + select: { + id: true, + firstName: true, + lastName: true, + availabilities: true + } + }); + oldpubs.forEach(async pub => { + console.log("" + pub.firstName + " " + pub.lastName + " copying " + pub.availabilities.length + " availabilities from previous months."); + pub.availabilities.forEach(async avail => { + //get the new date based on the day of week and week of month + let newStart = common.getDateFromWeekNrAndDayOfWeek(avail.weekNr, avail.dayofweek, avail.startTime); + let newEnd = new Date(newStart.getTime()); + newEnd.setHours(avail.endTime.getHours(), avail.endTime.getMinutes(), 0, 0); + await prisma.availability.create({ + data: { + publisherId: pub.id, + dayOfMonth: null, + dayofweek: avail.dayofweek || common.getDayOfWeekNameEnEnum(avail.startTime), + weekOfMonth: avail.weekofMonth || common.getWeekOfMonth(avail.startTime), + dateOfEntry: new Date(), //avail.dateOfEntry || avail.startTime, + startTime: avail.startTime, + endTime: avail.endTime, + weekNr: avail.weekNr, + type: 3, + isFromPreviousMonth: true, + name: avail.name || "старо предпочитание", + } + }); + }); + }); + + //convert old assignments to availabilities + + res.status(200).json({ "message": "ok" }); + break; + case "deleteCopiedAvailabilities": + //delete all availabilities that are copied from previous months + monthInfo = common.getMonthDatesInfo(date); + await prisma.availability.deleteMany({ + where: { + startTime: { + gte: monthInfo.firstMonday, + }, + isFromPreviousMonth: true + } + }); case "replaceInAssignment": const { oldPublisherId, newPublisherId, shiftId } = req.method === "POST" ? req.body : req.query; diff --git a/pages/cart/calendar/index.tsx b/pages/cart/calendar/index.tsx index f183eb5..7a77aec 100644 --- a/pages/cart/calendar/index.tsx +++ b/pages/cart/calendar/index.tsx @@ -57,7 +57,8 @@ export default function CalendarPage({ initialEvents, initialShifts }) { const [allShifts, setAllShifts] = useState(initialShifts); - const [isPublished, setIsPublished] = useState(() => initialShifts.some(shift => shift.isPublished)); const [value, onChange] = useState(new Date()); + const [isPublished, setIsPublished] = useState(() => initialShifts.some(shift => shift.isPublished)); + const [value, onChange] = useState(new Date()); const [shifts, setShifts] = React.useState([]); const [error, setError] = React.useState(null); const [availablePubs, setAvailablePubs] = React.useState([]); @@ -528,6 +529,10 @@ export default function CalendarPage({ initialEvents, initialShifts }) { const [isMenuOpen, setIsMenuOpen] = useState(false); const [isConfirmModalOpen, setConfirmModalOpen] = useState(false); + async function copyOldAvailabilities(event: MouseEvent): Promise { + await axiosInstance.get(`/api/?action=copyOldAvailabilities&date=${common.getISODateOnly(value)}`); + } + return ( <> @@ -610,6 +615,7 @@ export default function CalendarPage({ initialEvents, initialShifts }) { + )} diff --git a/pages/cart/publishers/import.tsx b/pages/cart/publishers/import.tsx index 5ed1e4b..7e10eb7 100644 --- a/pages/cart/publishers/import.tsx +++ b/pages/cart/publishers/import.tsx @@ -136,6 +136,7 @@ export default function ImportPage() { const handleSave = async () => { try { common.logger.debug("handleSave to: " + common.getBaseUrl()); + console.log("handleSave to: " + common.getBaseUrl()); const header = rawData[mode.headerRow]; for (let i = mode.headerRow + 1; i < rawData.length; i++) { //fullData.length; each publisher //update status.info with current publisher From a6b7c62768e606dbf6cc56cf0d77d36c57dbf359 Mon Sep 17 00:00:00 2001 From: Dobromir Popov Date: Thu, 28 Mar 2024 18:12:16 +0200 Subject: [PATCH 4/5] js error log fix --- src/helpers/common.js | 96 ++++++++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 43 deletions(-) diff --git a/src/helpers/common.js b/src/helpers/common.js index 4cc84e7..d706006 100644 --- a/src/helpers/common.js +++ b/src/helpers/common.js @@ -4,8 +4,9 @@ const levenshtein = require('fastest-levenshtein'); -const fs = require("fs"); -const path = require("path"); +const fs = typeof window === 'undefined' ? require('fs') : undefined; +const path = typeof window === 'undefined' ? require('path') : undefined; + const { PrismaClient } = require('@prisma/client'); const DayOfWeek = require("@prisma/client").DayOfWeek; @@ -75,43 +76,42 @@ exports.setBaseUrl = function (req) { }; exports.getBaseUrl = function (relative = "", req = null) { - const filePath = path.join(__dirname, 'baseUrl.txt'); + if (typeof window === 'undefined') { + // Server-side logic + // Read the base URL from env (NEXTAUTH_URL): + return process.env.NEXTAUTH_URL + relative; - try { - if (fs.existsSync(filePath)) { - const baseUrl = fs.readFileSync(filePath, 'utf8').trim(); - const fullUrl = relative ? new URL(relative, baseUrl).toString() : baseUrl; - return fullUrl; - } else { - if (req) { - const baseUrl = exports.setBaseUrl(req); // Correctly reference setBaseUrl - return `${baseUrl}/${relative.replace(/^\/|\/$/g, '')}`; - } - console.log('Base URL file does not exist.'); - return null; - } - } catch (error) { - console.error('Error reading the base URL file:', error); - return null; + // const filePath = path.join(__dirname, 'baseUrl.txt'); + + // try { + // if (fs.existsSync(filePath)) { + // const baseUrl = fs.readFileSync(filePath, 'utf8').trim(); + // const fullUrl = relative ? new URL(relative, baseUrl).toString() : baseUrl; + // return fullUrl; + // } else { + // if (req) { + // // Assuming setBaseUrl is defined somewhere in this file + // const baseUrl = exports.setBaseUrl(req); + // return `${baseUrl}/${relative.replace(/^\/|\/$/g, '')}`; + // } + // console.log('Base URL file does not exist.'); + // return null; + // } + // } catch (error) { + // console.error('Error reading the base URL file:', error); + // return null; + // } + } else { + // Client-side logic + // Fetch the base URL from the server endpoint you've set up + const baseUrl = window.location.origin; + const fullUrl = relative ? `${baseUrl}/${relative.replace(/^\/|\/$/g, '')}` : baseUrl; + //console.log("getBaseUrl()=", fullUrl); + return fullUrl.toString(); } - // const host = process.env.NEXT_PUBLIC_HOST || '127.0.0.1'; - // const port = process.env.NEXT_PUBLIC_PORT ? `:${ process.env.NEXT_PUBLIC_PORT } ` : ''; - // const protocol = process.env.NEXT_PUBLIC_PROTOCOL || "https" - - // //const url = `${ protocol }://${host}${port}/${relative.replace(/^\/|\/$/g, '')}/`; - // const isRelativeEmpty = !relative || relative.trim() === ''; - // const formattedRelative = !isRelativeEmpty ? '/' + relative.replace(/^\/|\/$/g, '') : ''; - // const url = `${protocol}://${host}${port}${formattedRelative}`; - - - // logger.debug("NODE_ENV = ", process.env.NODE_ENV, "protocol:", protocol); - // logger.debug("getBaseURL = ", url); - - // return url; }; - let prisma; exports.getPrismaClient = function getPrismaClient() { if (!prisma) { @@ -228,15 +228,25 @@ exports.getDayOfWeekDate = function (dayOfWeekName, date = new Date()) { return date; }; //common.getWeekOfMonth(date) -// exports.getWeekOfMonth = function (date) { -// // Copy date so don't modify original -// date = new Date(date); -// // Adjust to Monday of this week -// date.setDate(date.getDate() + 3 - (date.getDayEuropean() + 6) % 7); -// // Return week number -// const weekNumber = Math.floor((date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000 / 7); -// return weekNumber; -// } +exports.getWeekOfMonth = function (inputDate) { + let date = new Date(inputDate); + let firstDayOfMonth = new Date(date.getFullYear(), date.getMonth(), 1); + let firstMonday = new Date(firstDayOfMonth); + + // Adjust firstDayOfMonth to the first Monday of the month + if (firstDayOfMonth.getDay() === 0) { // Sunday + firstMonday.setDate(2); + } else if (firstDayOfMonth.getDay() !== 1) { // Not Monday + firstMonday.setDate(9 - firstDayOfMonth.getDay()); + } + + // Calculate the difference in days + let diff = (date - firstMonday) / (1000 * 60 * 60 * 24); + // Calculate week number + let weekNumber = Math.ceil((diff + 1) / 7); + + return weekNumber; +}; exports.getMonthDatesInfo = function (date) { // get first day of the month From a26dd954c0b8a8228524b2d8fabcb1f383ab9472 Mon Sep 17 00:00:00 2001 From: Dobromir Popov Date: Thu, 28 Mar 2024 22:55:35 +0200 Subject: [PATCH 5/5] availability serf reference; fix copying last month; --- components/calendar/avcalendar.tsx | 8 ++ pages/api/index.ts | 73 +++++++++++++------ pages/cart/publishers/stats.tsx | 5 ++ .../20240325214807_misc_renames/migration.sql | 14 +++- .../migration.sql | 5 ++ prisma/schema.prisma | 5 +- server.js | 4 +- src/helpers/common.js | 32 +++++++- src/helpers/data.js | 33 +++------ src/helpers/excel.js | 70 +++++++++--------- src/helpers/imports.js | 4 - 11 files changed, 163 insertions(+), 90 deletions(-) create mode 100644 prisma/migrations/20240328162213_add_availability_self_ref/migration.sql delete mode 100644 src/helpers/imports.js diff --git a/components/calendar/avcalendar.tsx b/components/calendar/avcalendar.tsx index c631c72..577c53e 100644 --- a/components/calendar/avcalendar.tsx +++ b/components/calendar/avcalendar.tsx @@ -274,6 +274,11 @@ const AvCalendar = ({ publisherId, events, selectedDate }) => { //if event is not active - show in gray let bgColorClass = 'bg-gray-500'; // Default color for inactive events var bgColor = event.isActive ? "" : "bg-gray-500"; + //ToDo: fix this. maybe we're missing some properties + // if (event.isFromPreviousMonth) { + // // set opacity to 0.5 + // bgColor = "bg-orange-500"; + // } if (event.type === "assignment") { bgColor = event.isBySystem ? "bg-red-500" : (event.isConfirmed ? "bg-green-500" : "bg-yellow-500"); @@ -297,11 +302,14 @@ const AvCalendar = ({ publisherId, events, selectedDate }) => { } } + eventStyle = { ...style, // backgroundColor: bgColorClass, //height: "50px", //color: 'white', + //if (event.isFromPreviousAssignment) { set opacity to 0.5 } + // opacity: event.isFromPreviousMonth ? 0.5 : 1, whiteSpace: 'normal', // Allow the text to wrap to the next line overflow: 'hidden', // Hide overflowed content textOverflow: 'ellipsis' // Add ellipsis to text that's too long to fit diff --git a/pages/api/index.ts b/pages/api/index.ts index 7e4658f..4aa8313 100644 --- a/pages/api/index.ts +++ b/pages/api/index.ts @@ -1,6 +1,6 @@ import { getToken } from "next-auth/jwt"; import { NextApiRequest, NextApiResponse } from 'next' -import { DayOfWeek } from '@prisma/client'; +import { DayOfWeek, AvailabilityType } from '@prisma/client'; const common = require('../../src/helpers/common'); const data = require('../../src/helpers/data'); const subq = require('../../prisma/bl/subqueries'); @@ -221,7 +221,7 @@ export default async function handler(req, res) { // isFromPreviousMonth: true // } // }); - let oldpubs = await prisma.publisher.findMany({ + let outdatedPubs = await prisma.publisher.findMany({ where: { availabilities: { none: { @@ -238,28 +238,55 @@ export default async function handler(req, res) { availabilities: true } }); - oldpubs.forEach(async pub => { + outdatedPubs.forEach(async pub => { + // avail.startTime >= monthInfo.firstMonday + //get prev month date: + let prevMonth = new Date(monthInfo.firstMonday); + prevMonth.setMonth(prevMonth.getMonth() - 1); + let prevMonthInfo = common.getMonthDatesInfo(prevMonth); + pub.availabilities = pub.availabilities.filter(avail => avail.startTime > prevMonthInfo.firstMonday); console.log("" + pub.firstName + " " + pub.lastName + " copying " + pub.availabilities.length + " availabilities from previous months."); pub.availabilities.forEach(async avail => { //get the new date based on the day of week and week of month - let newStart = common.getDateFromWeekNrAndDayOfWeek(avail.weekNr, avail.dayofweek, avail.startTime); + if (!avail.weekOfMonth) { + avail.weekOfMonth = common.getWeekOfMonth(avail.startTime) + } + let origMonthInfo = common.getMonthDatesInfo(avail.startTime); + + let newStart = common.getDateFromWeekNrAndDayOfWeek(monthInfo.firstMonday, avail.weekOfMonth, avail.dayofweek, avail.startTime); + //ToDo: fix double check. also check if we're in 5th week and the month has 4 weeks + // const availability = await data.findPublisherAvailability(publisher.id, newStart); + // if (availability) { + // return; + // } let newEnd = new Date(newStart.getTime()); newEnd.setHours(avail.endTime.getHours(), avail.endTime.getMinutes(), 0, 0); - await prisma.availability.create({ - data: { - publisherId: pub.id, - dayOfMonth: null, - dayofweek: avail.dayofweek || common.getDayOfWeekNameEnEnum(avail.startTime), - weekOfMonth: avail.weekofMonth || common.getWeekOfMonth(avail.startTime), - dateOfEntry: new Date(), //avail.dateOfEntry || avail.startTime, - startTime: avail.startTime, - endTime: avail.endTime, - weekNr: avail.weekNr, - type: 3, - isFromPreviousMonth: true, - name: avail.name || "старо предпочитание", - } - }); + let data = { + publisherId: pub.id, + dayOfMonth: null, + dayofweek: avail.dayofweek || common.getDayOfWeekNameEnEnum(avail.startTime), + weekOfMonth: avail.weekofMonth || common.getWeekOfMonth(avail.startTime), + dateOfEntry: new Date(), //avail.dateOfEntry || avail.startTime, + startTime: newStart, + endTime: newEnd, + type: AvailabilityType.Monthly, + isFromPreviousMonth: true, + name: avail.name || "старо предпочитание", + parentAvailabilityId: avail.id + } + await prisma.availability.create({ data: data }); + + //if month has 5 weeks and the monthInfo has 4 weeks copy the availabilities also from the 1st week to the 5th week + if (monthInfo.nrOfWeeks == 5 && avail.weekOfMonth == 1 && origMonthInfo.nrOfWeeks == 4) { + newStart = common.getDateFromWeekNrAndDayOfWeek(monthInfo.firstMonday, 5, avail.dayofweek, avail.startTime); + newEnd = new Date(newStart.getTime()); + newEnd.setHours(avail.endTime.getHours(), avail.endTime.getMinutes(), 0, 0); + data.weekOfMonth = 5; + data.startTime = newStart; + data.endTime = newEnd; + await prisma.availability.create({ data: data }); + } + }); }); @@ -531,8 +558,8 @@ export async function filterPublishers(selectFields, searchText, filterDate, fet // also, permanent weekly availabilities will have dayOfMonth = null and type = 0 // for 0 we will match by dayOfWeekEnum and times // for 1 we will match by exact date and times - // for 2 we will match by dayofweek, weeknr and times - // for 3 we will match by dayofweek, weeknr and times - this is the same as 2, but we will not count them as availabilities for the current month + // for 2 we will match by dayofweek, weekOfMonth and times + // for 3 we will match by dayofweek, weekOfMonth and times - this is the same as 2, but we will not count them as availabilities for the current month // generaion of schedule: @@ -562,7 +589,7 @@ export async function filterPublishers(selectFields, searchText, filterDate, fet { dayOfMonth: null, dayofweek: dayOfWeekEnum, - // ToDo: and weekNr + // ToDo: and weekOfMonth //startTime: { gte: currentMonthStart }, } ] @@ -614,7 +641,7 @@ export async function filterPublishers(selectFields, searchText, filterDate, fet // dayOfMonth: true, // startTime: true, // endTime: true, - // weekNr: true, + // weekOfMonth: true, // type: true // }, // where: { diff --git a/pages/cart/publishers/stats.tsx b/pages/cart/publishers/stats.tsx index c0161a9..d881b1f 100644 --- a/pages/cart/publishers/stats.tsx +++ b/pages/cart/publishers/stats.tsx @@ -107,8 +107,13 @@ export const getServerSideProps = async (context) => { } } }); + //remove availabilities that isFromPreviousAssignment + publisher.availabilities = publisher.availabilities.filter(availability => !availability.isFromPreviousAssignment); + }); + //remove publishers without availabilities + publishers = publishers.filter(publisher => publisher.availabilities.length > 0); return { props: { diff --git a/prisma/migrations/20240325214807_misc_renames/migration.sql b/prisma/migrations/20240325214807_misc_renames/migration.sql index 2a2f6e7..890be7a 100644 --- a/prisma/migrations/20240325214807_misc_renames/migration.sql +++ b/prisma/migrations/20240325214807_misc_renames/migration.sql @@ -4,12 +4,18 @@ - You are about to drop the column `isTentative` on the `Assignment` table. All the data in the column will be lost. */ + -- AlterTable -ALTER TABLE `Assignment` - ADD COLUMN `isBySystem` BOOLEAN NOT NULL DEFAULT false; +ALTER TABLE `Assignment` + ADD COLUMN `isBySystem` BOOLEAN NOT NULL DEFAULT FALSE; + +-- Depending on your DBMS, you might need to execute one statement at a time. +-- Especially, the UPDATE statement should be run separately. UPDATE `Assignment` SET `isBySystem` = isTentative; -ALTER TABLE `Assignment` DROP COLUMN `isTentative`, +-- Drop the isTentative column +ALTER TABLE `Assignment` DROP COLUMN `isTentative`; -- AlterTable -ALTER TABLE `Report` ADD COLUMN `type` ENUM('ServiceReport', 'Experience', 'Feedback_Problem', 'Feedback_Suggestion', 'Feedback') NOT NULL DEFAULT 'ServiceReport'; +ALTER TABLE `Report` + ADD COLUMN `type` ENUM('ServiceReport', 'Experience', 'Feedback_Problem', 'Feedback_Suggestion', 'Feedback') NOT NULL DEFAULT 'ServiceReport'; diff --git a/prisma/migrations/20240328162213_add_availability_self_ref/migration.sql b/prisma/migrations/20240328162213_add_availability_self_ref/migration.sql new file mode 100644 index 0000000..c2d2a1e --- /dev/null +++ b/prisma/migrations/20240328162213_add_availability_self_ref/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE `availability` ADD COLUMN `parentAvailabilityId` INTEGER NULL; + +-- AddForeignKey +ALTER TABLE `Availability` ADD CONSTRAINT `Availability_parentAvailabilityId_fkey` FOREIGN KEY (`parentAvailabilityId`) REFERENCES `Availability`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 91b56e0..b76fc17 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -141,7 +141,10 @@ model Availability { repeatWeekly Boolean? // New field to indicate weekly repetition // until now dayofweek was used for repetition when dayOfMonth is null repeatFrequency Int? // New field to indicate repetition frequency endDate DateTime? // New field for the end date of repetition - dateOfEntry DateTime? //NEW v1.0.1 trade storage for intuintivity + dateOfEntry DateTime? //NEW v1.0.1 + parentAvailabilityId Int? + parentAvailability Availability? @relation("ParentAvailability", fields: [parentAvailabilityId], references: [id]) + ChildAvailabilities Availability[] @relation("ParentAvailability") } model CartEvent { diff --git a/server.js b/server.js index f420718..324eb33 100644 --- a/server.js +++ b/server.js @@ -84,6 +84,8 @@ nextApp next(); }); server.use("/favicon.ico", express.static("styles/favicon_io/favicon.ico")); + // server.use("/robots.txt", express.static("styles/favicon_io/robots.txt")); + // server.use("/sitemap.xml", express.static("styles/favicon_io/sitemap.xml")); server.get("/last_schedule_json", (req, res) => { // var data = JSON.parse(fs.readFileSync("./content/sources/march_flat.json", "utf8")); @@ -557,7 +559,7 @@ nextApp }); //check if ssl is enabled - if (process.env.SSL_ENABLED === "true") { + if (process.env.SSL_ENABLED === "true" || 1 == 1) { console.log("SSL_ENABLED = true"); // Redirect from http to https // server.use((req, res, next) => { diff --git a/src/helpers/common.js b/src/helpers/common.js index d706006..a72ab2f 100644 --- a/src/helpers/common.js +++ b/src/helpers/common.js @@ -248,6 +248,33 @@ exports.getWeekOfMonth = function (inputDate) { return weekNumber; }; +exports.getDateFromWeekNrAndDayOfWeek = function (firstMonday, weekNr, dayOfWeekEnum, startTime) { + firstMonday = new Date(firstMonday); + startTime = new Date(startTime); + if (!weekNr || weekNr < 1 || weekNr > 5) { + weekNr = this.getWeekOfMonth(startTime); + } + //get int from dayOfWeekEnum + let dayOfWeekNr = this.getDayOfWeekIndex(dayOfWeekEnum); + if (dayOfWeekNr < 0 || dayOfWeekNr > 6) { + dayOfWeekNr = 0; + } + + // Calculate the day offset from the first Monday of the month + // Note: Assuming dayOfWeekEnum starts from 0 (Monday) to 6 (Sunday) + const daysFromFirstMonday = (weekNr - 1) * 7 + dayOfWeekNr; + + // Calculate the new date + let newStart = new Date(firstMonday); + newStart.setDate(firstMonday.getDate() + daysFromFirstMonday); + + // Extract time from startTime and apply it to newStart + const time = new Date(startTime); + newStart.setHours(time.getHours(), time.getMinutes(), time.getSeconds()); + + return newStart; +} + exports.getMonthDatesInfo = function (date) { // get first day of the month var firstDay = new Date(date.getFullYear(), date.getMonth(), 1); @@ -285,6 +312,9 @@ exports.getMonthDatesInfo = function (date) { // lastSunday.setDate(firstDayNextMonth.getDate() - firstDayNextMonth.getDay()); //logger.debug("Last Sunday: ", lastSunday); + const diffInDays = (lastSunday - firstMonday) / (1000 * 60 * 60 * 24); + // Calculate number of weeks, rounding up for partial weeks + const nrOfWeeks = Math.ceil((diffInDays + 1) / 7); return { firstDay: firstDay, @@ -295,7 +325,7 @@ exports.getMonthDatesInfo = function (date) { date: date, monthName: monthName, year: date.getFullYear(), - nrOfWeeks: Math.ceil((lastMonday.getDate() - firstMonday.getDate()) / 7) + nrOfWeeks: nrOfWeeks }; }; exports.getMonthInfo = exports.getMonthDatesInfo; diff --git a/src/helpers/data.js b/src/helpers/data.js index af888ce..dc39ff2 100644 --- a/src/helpers/data.js +++ b/src/helpers/data.js @@ -79,10 +79,7 @@ async function findPublisher(names, email, select, getAll = false) { } async function findPublisherAvailability(publisherId, date) { - const prisma = common.getPrismaClient(); - const dayOfWeek = common.getDayOfWeekNameEnEnum(date); // Assuming common.getDayOfWeekNameEnEnum returns the day of week - //const weekOfMonth = common.getWeekOfMonth(date); // Assuming common.getWeekOfMonth returns the week of month date = new Date(date); // Convert to date object if not already const hours = date.getHours(); const minutes = date.getMinutes(); @@ -90,32 +87,24 @@ async function findPublisherAvailability(publisherId, date) { const potentialAvailabilities = await prisma.availability.findMany({ where: { publisherId: publisherId, - OR: [ + AND: [ // Ensure both conditions must be met { - // Exact date match startTime: { - gte: new Date(date.setHours(0, 0, 0, 0)), - lt: new Date(date.setHours(23, 59, 59, 999)) - } + lte: new Date(date), // startTime is less than or equal to the date + }, }, { - // Correct day of week and before the date, with endDate consideration - dayofweek: dayOfWeek, - OR: [ - { - endDate: null - }, - { - endDate: { - gt: date - } - } - ] - } - ] + endTime: { + gte: new Date(date), // endTime is greater than or equal to the date + }, + }, + ], } }); + if (potentialAvailabilities.length === 0) { + return null; // No availability found + } // Filter the results based on time and other criteria when not exact date match const availability = potentialAvailabilities.find(avail => { const availStartHours = avail.startTime.getHours(); diff --git a/src/helpers/excel.js b/src/helpers/excel.js index fd361bc..30efda8 100644 --- a/src/helpers/excel.js +++ b/src/helpers/excel.js @@ -481,23 +481,22 @@ exports.processEvents = async function (events, year, monthNumber, progressCallb // create availability with the same date as the event. //ToDo: add parameter to control if we want to create availability for each event. can be done whe we import previous shifts. - // if (createAvailabilities) { - // const dayofWeek = common.getDayOfWeekNameEnEnum(date); - // const availability = await prisma.availability.create({ - // data: { - // publisherId: publisher.id, - // //date: date, - // dayofweek: dayofWeek, - // startTime: startTime, - // endTime: endTime, - // name: `от предишен график, ${publisher.firstName} ${publisher.lastName}`, - // isFromPreviousAssignment: true, - // isActive: true, - // }, - // }); - // console.log(`Created WEEKLY availability with ID ${availability.id} for date '${date.toDateString()}' and publisher '${publisher.firstName} ${publisher.lastName}'`); - // } - // const personResponse = await axiosInstance.post("/publishers", manualPub); + if (createAvailabilities) { + const dayofWeek = common.getDayOfWeekNameEnEnum(date); + const availability = await prisma.availability.create({ + data: { + publisherId: publisher.id, + dayofweek: dayofWeek, + startTime: startTime, + endTime: endTime, + name: `от график, ${publisher.firstName} ${publisher.lastName}`, + isFromPreviousAssignment: true, + isActive: true, + }, + }); + console.log(`Created WEEKLY availability with ID ${availability.id} for date '${date.toDateString()}' and publisher '${publisher.firstName} ${publisher.lastName}'`); + } + const personResponse = await axiosInstance.post("/publishers", manualPub); // let personId = personResponse.data.id; } catch (e) { @@ -533,23 +532,26 @@ exports.processEvents = async function (events, year, monthNumber, progressCallb }); //ToDo: fix findPublisherAvailability and creation of availabilities // check if there is an availability for this publisher on this date, and if not, create one - // const availability = await data.findPublisherAvailability(publisher.id, start); - // if (!availability && createAvailabilities) { - // const dayofWeek = common.getDayOfWeekNameEnEnum(date); - // const availability = await prisma.availability.create({ - // data: { - // publisherId: publisher.id, - // //date: date, - // dayofweek: dayofWeek, - // //weekOfMonth: common.getWeekOfMonth(date), - // startTime: start, - // endTime: end, - // name: `от предишен график, ${publisher.firstName} ${publisher.lastName}`, - // isFromPreviousAssignment: true, - // }, - // }); - // console.log(`Created WEEKLY availability with ID ${availability.id} for date '${date.toDateString()}' and publisher '${publisher.firstName} ${publisher.lastName}'`); - // } + //ToDo: check if that works + const availability = await data.findPublisherAvailability(publisher.id, start); + if (!availability && createAvailabilities) { + const dayofWeek = common.getDayOfWeekNameEnEnum(date); + const availability = await prisma.availability.create({ + data: { + publisherId: publisher.id, + //date: date, + dayofweek: dayofWeek, + //weekOfMonth: common.getWeekOfMonth(date), + startTime: start, + endTime: end, + name: `от предишен график, ${publisher.firstName} ${publisher.lastName}`, + isFromPreviousAssignment: true, + isWithTransportIn: isWithTransport && event.shiftNr == 1, + isWithTransportOut: isWithTransport && event.shiftNr > 1, + }, + }); + console.log(`Created SYSTEM availability with ID ${availability.id} for date '${date.toDateString()}' and publisher '${publisher.firstName} ${publisher.lastName}'`); + } console.log(`Created assignment with ID ${assignment.id} for date '${date.toDateString()}' and location '${event.placeOfEvent}'. publisher: ${publisher.firstName} ${publisher.lastName}}`); } diff --git a/src/helpers/imports.js b/src/helpers/imports.js deleted file mode 100644 index a866ff6..0000000 --- a/src/helpers/imports.js +++ /dev/null @@ -1,4 +0,0 @@ -//??? can we consolidate all imports into one file? -import ProtectedRoute from '../../../components/protectedRoute'; -import axiosInstance from '../../../src/axiosSecure'; -import Layout from "../../../components/layout"; \ No newline at end of file