@progress/kendo-angular-scheduler
Version:
Kendo UI Scheduler Angular - Outlook or Google-style angular scheduler calendar. Full-featured and customizable embedded scheduling from the creator developers trust for professional UI components.
78 lines (77 loc) • 3.19 kB
JavaScript
/**-----------------------------------------------------------------------------------------
* Copyright © 2025 Progress Software Corporation. All rights reserved.
* Licensed under commercial license. See LICENSE.md in the project root for more information
*-------------------------------------------------------------------------------------------*/
import { intersects, toUTCDate, addUTCDays } from '../utils';
import { sortTasksByTime } from '../../common/util';
import { addDays } from '@progress/kendo-date-math';
const last = (arr) => arr[arr.length - 1];
/**
* @hidden
*/
export const createTasks = (periodStart, periodEnd, items, ranges) => {
const tasks = [];
const utcStart = toUTCDate(periodStart);
const utcEnd = toUTCDate(periodEnd);
for (let index = 0; index < items.length; index++) {
const item = items[index];
const data = {};
const startTime = item.start.toUTCDate();
const end = item.end;
const endTime = (item.end.getTime() !== end.getTime() ? end.addDays(1) : end).toUTCDate();
if (intersects(startTime, endTime, utcStart, utcEnd)) {
for (let rangeIdx = 0; rangeIdx < ranges.length; rangeIdx++) {
const range = ranges[rangeIdx];
const rangeStart = toUTCDate(range[0]);
const rangeEnd = addUTCDays(toUTCDate(last(range)), 1);
if (intersects(startTime, endTime, rangeStart, rangeEnd)) {
const task = {
index,
startTime,
endTime,
start: item.start,
end: item.end,
event: item.event,
isAllDay: item.event.isAllDay,
rangeIndex: rangeIdx,
data: data
};
task.head = task.endTime > rangeEnd;
task.tail = task.startTime < rangeStart;
let slotMatch;
range.forEach(slot => {
const slotStartTime = slot;
const slotEndTime = addDays(slot, 1);
if (task.event.start >= slotStartTime && task.event.start <= slotEndTime) {
slotMatch = { start: slotStartTime, end: slotEndTime };
}
});
task.isMultiDay = task.event.end > slotMatch?.end || task.head || task.tail;
tasks.push(task);
}
}
}
}
return sortTasksByTime(tasks);
};
function clearTaskData(task) {
const data = task.data;
for (const key in data) {
if (data.hasOwnProperty(key)) {
delete data[key];
}
}
}
/**
* @hidden
*/
export function updateTaskData(tasks) {
for (let idx = 0; idx < tasks.length; idx++) {
const task = tasks[idx];
const resources = task.resources;
clearTaskData(task);
for (let resourceIdx = 0; resourceIdx < resources.length; resourceIdx++) {
task.data[resources[resourceIdx].leafIdx] = {};
}
}
}