UNPKG

@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
/**----------------------------------------------------------------------------------------- * 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] = {}; } } }