106 lines
3.3 KiB
TypeScript
106 lines
3.3 KiB
TypeScript
import axiosServer from '../../../../src/axiosServer';
|
|
import NewPubPage from "../new";
|
|
export default NewPubPage;
|
|
|
|
import { Assignment, Shift, UserRole } from "prisma/prisma-client";
|
|
// import { monthNamesBG } from "~/src/helpers/const"
|
|
import { monthNamesBG } from "src/helpers/const";
|
|
|
|
function getShiftGroups(shifts: [Shift]) {
|
|
|
|
const groupedShifts = shifts.reduce((groups, shift) => {
|
|
// Extract the year and month from the shift date
|
|
const yearMonth = shift.startTime.substring(0, 7)
|
|
// Initialize the group for the year-month if it doesn't exist
|
|
if (!groups[yearMonth]) {
|
|
groups[yearMonth] = []
|
|
}
|
|
// Add the shift to the group
|
|
groups[yearMonth].push(shift)
|
|
// Return the updated groups object
|
|
return groups
|
|
}, {})
|
|
|
|
// Sort the groups by year-month
|
|
const sortedGroups = Object.keys(groupedShifts).sort((a, b) => {
|
|
// Compare the year-month strings lexicographically
|
|
if (a < b) return -1
|
|
if (a > b) return 1
|
|
return 0
|
|
}).reduce((result, key) => {
|
|
// Rebuild the object with the sorted keys
|
|
result[key] = groupedShifts[key]
|
|
return result
|
|
}, {})
|
|
return sortedGroups;
|
|
}
|
|
|
|
export const getServerSideProps = async (context) => {
|
|
const axios = await axiosServer(context);
|
|
|
|
context.res.setHeader("Cache-Control", "s-maxage=1, stale-while-revalidate");
|
|
if (!context.query || !context.query.id) {
|
|
return {
|
|
props: {}
|
|
};
|
|
}
|
|
var url = process.env.PUBLIC_URL + "/api/data/publishers/" + context.query.id + "?include=availabilities,assignments,assignments.shift";
|
|
console.log("GET PUBLISHER FROM:" + url)
|
|
const { data: item } = await axios.get(url);
|
|
|
|
// item.allShifts = item.assignments.map((a: Assignment[]) => a.shift);
|
|
|
|
//group shifts by month, remove duplicates
|
|
//sort availabilities by start time
|
|
// item.availabilities = item.availabilities
|
|
// .sort((a, b) => b.startTime - a.startTime);
|
|
|
|
item.assignments = item.assignments
|
|
.sort((a, b) => b.startTime - a.startTime)
|
|
.reduce((acc, assignment: Assignment) => {
|
|
|
|
const date = new Date(assignment.shift.startTime);
|
|
const year = date.getFullYear();
|
|
const month = date.getMonth();
|
|
const tabId = year + "-" + month;
|
|
const tabName = monthNamesBG[month] + " " + year;
|
|
const day = date.getDate();
|
|
// console.log("shift: year: " + year + " month: " + month + " day: " + day);
|
|
if (!acc.items[tabId]) {
|
|
acc.items[tabId] = [];
|
|
}
|
|
if (!acc.items[tabId][day]) {
|
|
acc.items[tabId][day] = [];
|
|
}
|
|
//remove duplicates
|
|
if (acc.items[tabId][day].find(s => s.id == assignment.shift.id)) {
|
|
return acc;
|
|
}
|
|
// acc.months = acc.months || [];
|
|
if (!acc.months[tabId]) {
|
|
acc.months[tabId] = [];
|
|
}
|
|
|
|
if (!acc.keys.includes(tabId)) {
|
|
acc.months[tabId] = tabName;
|
|
acc.keys.push(tabId);
|
|
}
|
|
|
|
acc.items[tabId][day].push({
|
|
start: assignment.shift.startTime,
|
|
end: assignment.shift.endTime,
|
|
id: assignment.id,
|
|
shiftId: assignment.shift.id,
|
|
isConfirmed: assignment.isConfirmed ? true : false,
|
|
});
|
|
return acc;
|
|
}, { items: {}, keys: [], months: {} });
|
|
// console.log("server item:");
|
|
// console.dir(item, { depth: null });
|
|
return {
|
|
props: {
|
|
item: item
|
|
},
|
|
};
|
|
};
|