UNPKG

@event-calendar/core

Version:

Full-sized drag & drop event calendar with resource & timeline views

163 lines (135 loc) 4.9 kB
import {untrack} from 'svelte'; import { addDay, addDuration, bgEvent, ceil, cloneDate, createAllDayChunks, createDate, createSlots, createSlotTimeLimits, datesEqual, outsideRange, prepareAllDayChunks, setMidnight, toSeconds } from '#lib'; import {createChunks, groupChunks} from './lib.js'; export function grid(mainState, viewState) { return () => { // Dependencies let {viewDates, options: {highlightedDates, validRange}} = mainState; let {slotTimeLimits} = viewState; let days = []; untrack(() => { let gridColumn = 1; for (let date of viewDates) { days.push({ gridColumn, gridRow: 1, resource: undefined, start: addDuration(cloneDate(date), slotTimeLimits.min), end: addDuration(cloneDate(date), slotTimeLimits.max), dayStart: date, dayEnd: addDay(cloneDate(date)), disabled: outsideRange(date, validRange), highlight: highlightedDates.some(d => datesEqual(d, date)) }); ++gridColumn; } }); return [days]; }; } export function eventChunks(mainState, viewState) { return () => { // Dependencies let {filteredEvents} = mainState; let {grid} = viewState; let chunks = []; let bgChunks = []; let allDayChunks = []; let allDayBgChunks = []; untrack(() => { for (let event of filteredEvents) { for (let days of grid) { if (bgEvent(event.display)) { bgChunks = bgChunks.concat(createChunks(event, days)); if (event.allDay) { allDayBgChunks = allDayBgChunks.concat(createAllDayChunks(event, days)); } } else { if (event.allDay) { allDayChunks = allDayChunks.concat(createAllDayChunks(event, days)); } else { chunks = chunks.concat(createChunks(event, days)); } } } } groupChunks(chunks); prepareAllDayChunks(allDayChunks); }); return {chunks, bgChunks, allDayChunks, allDayBgChunks}; }; } export function iEventChunks(mainState, viewState) { return () => { // Dependencies let {iEvents} = mainState; let {grid} = viewState; let iChunks = []; let allDayIChunks = []; for (let [, event] of iEvents) { if (!event) { continue; } untrack(() => { for (let days of grid) { if (event.allDay) { allDayIChunks = allDayIChunks.concat(createAllDayChunks(event, days, false)); } else { iChunks = iChunks.concat(createChunks(event, days, false)); } } }); } return {iChunks, allDayIChunks}; }; } export function slotTimeLimits(mainState) { return () => { // Dependencies let {filteredEvents, viewDates, options: {flexibleSlotTimeLimits, slotMinTime, slotMaxTime}} = mainState; let limits; untrack(() => { limits = createSlotTimeLimits(slotMinTime, slotMaxTime, flexibleSlotTimeLimits, viewDates, filteredEvents); }); return limits; }; } export function slotLabelPeriodicity(mainState) { return () => { // Dependencies let {options: {slotDuration, slotLabelInterval}} = mainState; let periodicity; untrack(() => { periodicity = slotLabelInterval === undefined ? toSeconds(slotDuration) < 3600 ? 2 : 1 : (ceil(toSeconds(slotLabelInterval) / toSeconds(slotDuration)) || 1) }); return periodicity; }; } export function slots(mainState, viewState) { return () => { // Dependencies let {options: {slotDuration}} = mainState; let {intlSlotLabel, slotLabelPeriodicity, slotTimeLimits} = viewState; let slots; untrack(() => { slots = createSlots(setMidnight(createDate()), slotDuration, slotLabelPeriodicity, slotTimeLimits, intlSlotLabel); }); return slots; }; } export function snap(mainState) { return () => { // Dependencies let {options: {slotDuration, snapDuration}} = mainState; snapDuration ??= slotDuration; return { duration: snapDuration, ratio: toSeconds(snapDuration) / toSeconds(slotDuration) }; }; }