more date fixes
This commit is contained in:
@ -69,8 +69,11 @@ export default function AvailabilityForm({ publisherId, existingItems, inline, o
|
|||||||
|
|
||||||
|
|
||||||
// get cart event or set default time for Sofia timezone
|
// get cart event or set default time for Sofia timezone
|
||||||
const minTime = cartEvent?.startTime || DateTime.now().set({ hour: 8, minute: 0, second: 0, millisecond: 0, zone: 'Europe/Sofia' }).toJSDate();
|
// const minTime = cartEvent?.startTime || DateTime.now().set({ hour: 8, minute: 0, zone: 'Europe/Sofia' }).toJSDate();
|
||||||
const maxTime = cartEvent?.endTime || DateTime.now().set({ hour: 20, minute: 0, second: 0, millisecond: 0, zone: 'Europe/Sofia' }).toJSDate();
|
// const maxTime = cartEvent?.endTime || DateTime.now().set({ hour: 20, minute: 0, zone: 'Europe/Sofia' }).toJSDate();
|
||||||
|
const d = DateTime.fromJSDate(day).setZone('Europe/Sofia', { keepLocalTime: true });
|
||||||
|
const minTime = d.set({ hour: 9, minute: 0 }).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, availabilities));
|
||||||
@ -189,11 +192,14 @@ export default function AvailabilityForm({ publisherId, existingItems, inline, o
|
|||||||
|
|
||||||
// Common function to set shared properties
|
// Common function to set shared properties
|
||||||
function setSharedAvailabilityProperties(availability, group, timeSlots) {
|
function setSharedAvailabilityProperties(availability, group, timeSlots) {
|
||||||
let startTime = common.setTimeHHmm(new Date(availability.startTime || day), common.getTimeFormatted(group[0].startTime));
|
const d = DateTime.fromJSDate(day).setZone('Europe/Sofia', { keepLocalTime: true });
|
||||||
let endTime = common.setTimeHHmm(new Date(availability.endTime || day), common.getTimeFormatted(group[group.length - 1].endTime));
|
console.log("day: " + d.toISODate());
|
||||||
|
let startTime = common.setTime(d, group[0].startTime).toJSDate();
|
||||||
|
let endTime = common.setTime(d, group[group.length - 1].endTime).toJSDate();
|
||||||
|
|
||||||
availability.startTime = startTime;
|
availability.startTime = startTime;
|
||||||
availability.endTime = endTime;
|
availability.endTime = endTime;
|
||||||
availability.name = common.getTimeFormatted(group[0].startTime) + "--" + common.getTimeFormatted(group[group.length - 1].endTime);
|
availability.name = common.getTimeFormatted(group[0].startTime) + "/" + common.getTimeFormatted(group[group.length - 1].endTime);
|
||||||
|
|
||||||
availability.isWithTransportIn = group[0].isFirst && timeSlots[0].isWithTransport;
|
availability.isWithTransportIn = group[0].isFirst && timeSlots[0].isWithTransport;
|
||||||
availability.isWithTransportOut = group[group.length - 1].isLast && timeSlots[timeSlots.length - 1].isWithTransport;
|
availability.isWithTransportOut = group[group.length - 1].isLast && timeSlots[timeSlots.length - 1].isWithTransport;
|
||||||
@ -283,18 +289,14 @@ export default function AvailabilityForm({ publisherId, existingItems, inline, o
|
|||||||
const generateTimeSlots = (start, end, increment, items) => {
|
const generateTimeSlots = (start, end, increment, items) => {
|
||||||
const slots = [];
|
const slots = [];
|
||||||
let currentTime = start;
|
let currentTime = start;
|
||||||
|
|
||||||
//const baseDate = new Date(Date.UTC(2000, 0, 1, 0, 0, 0));
|
|
||||||
//const baseDate = new Date(start);
|
|
||||||
|
|
||||||
while (isBefore(currentTime, end)) {
|
while (isBefore(currentTime, end)) {
|
||||||
let slotStart = currentTime;
|
let slotStart = currentTime;
|
||||||
let slotEnd = addMinutes(currentTime, increment);
|
let slotEnd = addMinutes(currentTime, increment);
|
||||||
|
|
||||||
const isChecked = items.some(item => {
|
const isChecked = items.some(item => {
|
||||||
return item.startTime && item.endTime &&
|
return item.startTime && item.endTime &&
|
||||||
(slotStart.getTime() < item.endTime.getTime()) &&
|
common.isTimeBetween(item.startTime, item.endTime, slotStart) &&
|
||||||
(slotEnd.getTime() > item.startTime.getTime());
|
common.isTimeBetween(item.startTime, item.endTime, slotEnd);
|
||||||
});
|
});
|
||||||
|
|
||||||
slots.push({ startTime: slotStart, endTime: slotEnd, isChecked: isChecked, });
|
slots.push({ startTime: slotStart, endTime: slotEnd, isChecked: isChecked, });
|
||||||
|
@ -230,10 +230,13 @@ const AvCalendar = ({ publisherId, events, selectedDate, cartEvents }) => {
|
|||||||
end = common.setTimeHHmm(startdate, "23:59");
|
end = common.setTimeHHmm(startdate, "23:59");
|
||||||
}
|
}
|
||||||
|
|
||||||
setDate(start);
|
// Update date state and calculate events based on the new startdate
|
||||||
let existingEvents = filterEvents(evts, publisherId, startdate);
|
setDate(startdate);
|
||||||
console.log("handleSelect: " + existingEvents);
|
const existingEvents = filterEvents(evts, publisherId, startdate);
|
||||||
setCartEvent(getCartEvent(date));
|
console.log("handleSelect: ", existingEvents);
|
||||||
|
|
||||||
|
// Use the updated startdate for getCartEvent and ensure it reflects in the state properly
|
||||||
|
setCartEvent(getCartEvent(startdate));
|
||||||
setSelectedEvents(existingEvents);
|
setSelectedEvents(existingEvents);
|
||||||
setIsModalOpen(true);
|
setIsModalOpen(true);
|
||||||
};
|
};
|
||||||
|
@ -15,6 +15,7 @@ import { toast } from 'react-toastify';
|
|||||||
import ProtectedRoute from '../../../components/protectedRoute';
|
import ProtectedRoute from '../../../components/protectedRoute';
|
||||||
import ConfirmationModal from '../../../components/ConfirmationModal';
|
import ConfirmationModal from '../../../components/ConfirmationModal';
|
||||||
import LocalShippingIcon from '@mui/icons-material/LocalShipping';
|
import LocalShippingIcon from '@mui/icons-material/LocalShipping';
|
||||||
|
const { DateTime } = require('luxon');
|
||||||
|
|
||||||
// import { FaPlus, FaCogs, FaTrashAlt, FaSpinner } from 'react-icons/fa'; // Import FontAwesome icons
|
// import { FaPlus, FaCogs, FaTrashAlt, FaSpinner } from 'react-icons/fa'; // Import FontAwesome icons
|
||||||
|
|
||||||
@ -544,7 +545,7 @@ export default function CalendarPage({ initialEvents, initialShifts }) {
|
|||||||
var dayName = common.DaysOfWeekArray[value.getDayEuropean()];
|
var dayName = common.DaysOfWeekArray[value.getDayEuropean()];
|
||||||
const cartEvent = events.find(event => event.dayofweek == dayName);
|
const cartEvent = events.find(event => event.dayofweek == dayName);
|
||||||
lastShift = {
|
lastShift = {
|
||||||
endTime: new Date(value.setHours(9, 0, 0, 0)),
|
endTime: DateTime.fromJSDate(value).setZone('Europe/Sofia', { keepLocalTime: true }).set({ hour: 9 }).toJSDate(),
|
||||||
cartEventId: cartEvent.id
|
cartEventId: cartEvent.id
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -370,6 +370,8 @@ exports.getDateFormatedShort = function (date) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*Todo: remove:
|
/*Todo: remove:
|
||||||
toISOString
|
toISOString
|
||||||
slice(0, 10)
|
slice(0, 10)
|
||||||
@ -527,7 +529,7 @@ exports.fuzzySearch = function (publishers, searchQuery, distanceThreshold = 0.9
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
exports.getCurrentNonthFormatted = function () {
|
exports.getCurrentMonthFormatted = function () {
|
||||||
const getCurrentYearMonth = () => {
|
const getCurrentYearMonth = () => {
|
||||||
const currentDate = new Date();
|
const currentDate = new Date();
|
||||||
const year = currentDate.getFullYear();
|
const year = currentDate.getFullYear();
|
||||||
@ -546,11 +548,28 @@ exports.getCurrentYearMonth = () => {
|
|||||||
|
|
||||||
|
|
||||||
// new date FNs
|
// new date FNs
|
||||||
// Utility to handle date parsing consistently
|
/**
|
||||||
|
* Parses an input into a Luxon DateTime object, setting the timezone to 'Europe/Sofia' while keeping the local time.
|
||||||
|
* @param {string|Date} input - The input date string or JavaScript Date object.
|
||||||
|
* @returns {DateTime} - A Luxon DateTime object with the timezone set to 'Europe/Sofia', preserving the local time.
|
||||||
|
*/
|
||||||
const parseDate = (input) => {
|
const parseDate = (input) => {
|
||||||
return (typeof input === 'string' || input instanceof Date)
|
let dateTime;
|
||||||
? DateTime.fromJSDate(new Date(input), { zone: 'Europe/Sofia' })
|
|
||||||
: DateTime.now({ zone: 'Europe/Sofia' });
|
if (input instanceof DateTime) {
|
||||||
|
// If input is already a Luxon DateTime, we adjust the zone only.
|
||||||
|
dateTime = input.setZone('Europe/Sofia');
|
||||||
|
} else if (typeof input === 'string' || input instanceof Date) {
|
||||||
|
// Create a DateTime from the input assuming local timezone to preserve local time when changing the zone.
|
||||||
|
dateTime = DateTime.fromJSDate(new Date(input), { zone: 'local' });
|
||||||
|
dateTime = dateTime.setZone('Europe/Sofia');
|
||||||
|
} else {
|
||||||
|
// Use the current time if no input is given, considered as local time.
|
||||||
|
dateTime = DateTime.local().setZone('Europe/Sofia');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the timezone to 'Europe/Sofia' while keeping the original local time.
|
||||||
|
return dateTime.setZone('Europe/Sofia', { keepLocalTime: true });
|
||||||
};
|
};
|
||||||
exports.parseDate = parseDate;
|
exports.parseDate = parseDate;
|
||||||
|
|
||||||
@ -560,6 +579,18 @@ exports.setTimezone = (input) => {
|
|||||||
dateTime = dateTime.setZone('Europe/Sofia', { keepLocalTime: true });
|
dateTime = dateTime.setZone('Europe/Sofia', { keepLocalTime: true });
|
||||||
return dateTime.toJSDate();
|
return dateTime.toJSDate();
|
||||||
};
|
};
|
||||||
|
exports.setTime = (baseDateTime, timeDateTime) => {
|
||||||
|
// Ensure both inputs are DateTime objects
|
||||||
|
baseDateTime = parseDate(baseDateTime);
|
||||||
|
timeDateTime = parseDate(timeDateTime);
|
||||||
|
|
||||||
|
return baseDateTime.set({
|
||||||
|
hour: timeDateTime.hour,
|
||||||
|
minute: timeDateTime.minute,
|
||||||
|
second: timeDateTime.second,
|
||||||
|
millisecond: timeDateTime.millisecond
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
// Format date to a specified format, defaulting to 'HH:mm'
|
// Format date to a specified format, defaulting to 'HH:mm'
|
||||||
exports.getTimeFormatted = (input, format = 'HH:mm') => {
|
exports.getTimeFormatted = (input, format = 'HH:mm') => {
|
||||||
@ -571,7 +602,7 @@ exports.getTimeFormatted = (input, format = 'HH:mm') => {
|
|||||||
exports.setTimeHHmm = (input, timeString) => {
|
exports.setTimeHHmm = (input, timeString) => {
|
||||||
let dateTime = parseDate(input);
|
let dateTime = parseDate(input);
|
||||||
const [hour, minute] = timeString.split(':').map(Number);
|
const [hour, minute] = timeString.split(':').map(Number);
|
||||||
dateTime = dateTime.set({ hour, minute, second: 0, millisecond: 0 });
|
dateTime = dateTime.set({ hour, minute });
|
||||||
return dateTime.toJSDate();
|
return dateTime.toJSDate();
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -579,9 +610,25 @@ exports.setTimeHHmm = (input, timeString) => {
|
|||||||
exports.parseTimeHHmm = (timeString) => {
|
exports.parseTimeHHmm = (timeString) => {
|
||||||
const dateTime = DateTime.now({ zone: 'Europe/Sofia' });
|
const dateTime = DateTime.now({ zone: 'Europe/Sofia' });
|
||||||
const [hour, minute] = timeString.split(':').map(Number);
|
const [hour, minute] = timeString.split(':').map(Number);
|
||||||
return dateTime.set({ hour, minute, second: 0, millisecond: 0 }).toJSDate();
|
return dateTime.set({ hour, minute }).toJSDate();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function isTimeBetween(startTime, endTime, checkTime) {
|
||||||
|
const start = new Date(0, 0, 0, startTime.getHours(), startTime.getMinutes());
|
||||||
|
const end = new Date(0, 0, 0, endTime.getHours(), endTime.getMinutes());
|
||||||
|
const check = new Date(0, 0, 0, checkTime.getHours(), checkTime.getMinutes());
|
||||||
|
|
||||||
|
// If the end time is less than the start time, it means the time range spans midnight
|
||||||
|
if (end < start) {
|
||||||
|
// Check time is between start and midnight or between midnight and end
|
||||||
|
return (check >= start && check <= new Date(0, 0, 1, 0, 0, 0)) || (check >= new Date(0, 0, 0, 0, 0, 0) && check <= end);
|
||||||
|
} else {
|
||||||
|
return check >= start && check <= end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.isTimeBetween = isTimeBetween;
|
||||||
|
|
||||||
|
|
||||||
// ToDo: update all uses of this function to use the new one
|
// ToDo: update all uses of this function to use the new one
|
||||||
|
|
||||||
// exports.getTimeFormatted = function (date) {
|
// exports.getTimeFormatted = function (date) {
|
||||||
|
Reference in New Issue
Block a user