@parkassist/pa-ui-library
Version:
INX Platform elements
121 lines • 4.49 kB
JavaScript
import dayjs from 'dayjs';
const getLabelFromTime = time => {
const fullHour = Math.floor(time);
const minutes = (time - fullHour) * 60;
const endTime = dayjs().hour(fullHour).minute(minutes);
const formattedEndTime = fullHour === 24 && endTime.minute() === 0 ? endTime.hour(23).minute(59) : endTime;
return formattedEndTime.format("HH:mm");
};
const getTimeFromLabel = label => {
const [hour, minutes] = label.split(":");
return +hour + +minutes / 60;
};
export const getDefaultWeekHoursObject = () => ({
0: [],
1: [],
2: [],
3: [],
4: [],
5: [],
6: []
});
export const checkIsInRange = (selected, element) => {
return selected.day === element.day && element.time >= selected.start.time && element.time <= selected.end.time;
};
export const checkIfClicked = (selected, element) => {
if (!selected) return false;
return selected.day === element.day && selected.start.time === element.time;
};
export const prepareRange = (element, finalTime, day) => {
return Object.assign(Object.assign({}, element), {
day,
end: finalTime.finalEnd ? Object.assign({}, finalTime.finalEnd) : element.end,
start: finalTime.finalStart ? Object.assign({}, finalTime.finalStart) : element.start
});
};
export const setStartEndTimes = (el, selectedElement) => {
const start = el.time > selectedElement.start.time ? selectedElement.start : el;
const end = el.time > selectedElement.start.time ? el : selectedElement.start;
return Object.assign(Object.assign({}, selectedElement), {
start,
end
});
};
export const shouldConcatRanges = (range, element, interval) => {
const value = interval / 60;
return range.start.time >= element.start.time && range.end.time <= element.end.time || range.start.time <= element.end.time && range.end.time >= element.end.time || range.start.time <= element.start.time && range.end.time >= element.start.time || range.start.time - value === element.end.time || range.end.time + value === element.start.time;
};
export const getNoOverlappingRangesAndFinalEnd = (ranges, element, interval) => {
let finalEnd, finalStart;
const notOverlappingRanges = [];
ranges.forEach(range => {
if (shouldConcatRanges(range, element, interval)) {
const end = range.end.time >= element.end.time ? range.end : element.end;
const start = range.start.time <= element.start.time ? range.start : element.start;
finalStart = (finalStart === null || finalStart === void 0 ? void 0 : finalStart.time) <= start.time ? finalStart : start;
finalEnd = (finalEnd === null || finalEnd === void 0 ? void 0 : finalEnd.time) >= end.time ? finalEnd : end;
} else {
notOverlappingRanges.push(range);
}
});
return {
notOverlappingRanges,
finalTime: {
finalEnd: finalEnd || element.end,
finalStart: finalStart || element.start
}
};
};
export const getOptions = interval => {
const value = interval / 60;
return Array(24 / value).fill(null).map((_, i) => {
const hour = i * value;
const fullHour = Math.floor(hour);
const minutes = (hour - fullHour) * 60;
return {
time: hour,
label: dayjs().hour(fullHour).minute(minutes).format("HH:mm")
};
});
};
export const createRanges = (value, interval) => {
const preparedRanges = [];
Object.keys(value).forEach(key => {
const ranges = value[key];
if (ranges.length > 0) {
ranges.forEach(range => {
const intervalToSubtract = range.end === '23:59' ? interval - 1 : interval;
const startTime = getTimeFromLabel(range.start);
const endTime = getTimeFromLabel(range.end) - intervalToSubtract / 60;
const endLabel = getLabelFromTime(endTime);
const preparedRange = {
day: +key,
start: {
label: range.start,
time: startTime
},
end: {
label: endLabel,
time: endTime
}
};
preparedRanges.push(preparedRange);
});
}
});
return preparedRanges;
};
export const formatRanges = (ranges, interval) => {
const finalRanges = getDefaultWeekHoursObject();
const sorted = [...ranges];
sorted.sort((a, b) => a.start.time - b.start.time);
sorted.forEach(range => {
const changedEndTime = range.end.time + interval / 60;
const formattedEndTime = getLabelFromTime(changedEndTime);
finalRanges[range.day].push({
start: range.start.label,
end: formattedEndTime
});
});
return finalRanges;
};