Таймлайн ресурсов и столбцы ресурсов в FullCalendar относятся к Premium: коммерческому приложению нужен платный лицензионный ключ. На странице лицензий FullCalendar перечислены бесплатные варианты — для приложений, полностью открытых под AGPL, и для зарегистрированных некоммерческих организаций. В планировщике Needless UI и то и другое доступно под лицензией MIT, а вместе с ними повторяющиеся события и файлы iCalendar. Это руководство помогает перевести приложение Angular с одного на другое: что переносится, что нет и какие данные нужно преобразовать.
Здесь используются названия из FullCalendar 7, а там, где в версии 6 они другие, старые названия указаны в квадратных скобках. Коннектор FullCalendar для Angular поддерживает Angular с 16 по 22; Needless UI нужен Angular 22.
Что вы получаете
| Возможность | FullCalendar | Needless UI |
|---|---|---|
| Таймлайн ресурсов: по строке на каждую комнату или человека | Premium | Да: день, неделя или месяц |
| Ресурсы столбцами в видах дня и недели | Premium | Да |
| Виды месяца, недели и дня | Бесплатно | Да |
| Перенос и изменение длительности перетаскиванием | Бесплатно; на другой ресурс — в Premium | Да, в том числе на другие ресурсы. Длительность меняется за конец, а не за начало. |
| Выбор времени для создания события | Бесплатно | Да: указателем, долгим нажатием или с клавиатуры |
| Правила вроде запрета пересечений | Бесплатно: параметры пересечений и ограничений | Да: одна функция allow, которая вызывается перед каждым изменением |
| Перенос и изменение длительности событий с клавиатуры | Нет в его документации по доступности: она описывает метки ARIA и фокус по Tab | Да, с озвучиванием для скринридеров |
| Повторяющиеся события | Бесплатно, с плагином и библиотекой rrule | Встроены: правила RFC 5545, кроме EXRULE, RDATE и ежечасных правил |
| iCalendar (.ics) | Бесплатно: чтение фида | Чтение и запись файлов .ics |
| Виды списка и года | Бесплатно | Повестка дня на ближайшие дни; видов года нет |
| Часовые пояса | Бесплатно: локальный, UTC или именованный | Нет: показывает полученное время как есть |
| Сгруппированные, вложенные или многоколоночные ресурсы | Premium | Нет: один столбец, который рисует ваш шаблон |
| Перетаскивание извне, фоновые события | Бесплатно | Нет |
| Печать, виртуальный рендеринг | Premium | Нет |
| Фреймворки | Angular с 16 по 22, React, Vue, чистый JavaScript и другие | Angular 22 и React 19 |
Что чему соответствует
| FullCalendar | Планировщик Needless UI |
|---|---|
<full-calendar [options]>, plugins, schedulerLicenseKey | <nui-scheduler> с входным свойством для каждого параметра; без плагинов и ключа |
initialView: 'resourceTimelineDay' | view="timeline", а для недели или месяца — timelineSpan |
initialView: 'timeGridWeek' | view="week"; [(view)] — двусторонняя привязка |
resources, events | [resources], [events] |
resourceId, extendedProps | resource, data |
editable, selectable | editable, selectable |
select | (slotSelect): { start, end, allDay, resource } |
eventDrop, eventResize | (eventChange): ничего не сдвинется, пока вы не обновите events |
eventClick | (eventClick) |
eventOverlap, selectOverlap, eventAllow | [allow]: одна функция для переноса, изменения длительности и выбора времени |
slotDuration, snapDuration | slotMinutes, snapMinutes — в минутах |
slotMinTime, slotMaxTime, scrollTime | dayStart, dayEnd, scrollHour — в часах |
businessHours | [businessHours] с днями недели от 1 (понедельник) до 7 |
datesSet | (rangeChange) |
eventContent, resourceCellContent [resourceLabelContent] | Шаблоны nuiSchedulerEvent и nuiSchedulerResource |
locale, firstDay | locale (любой тег BCP 47), firstDay от 1 до 7 и labels для текстов планировщика |
Таймлайн бронирования переговорных в двух вариантах
Переговорные — это ресурсы, а бронирования — события. Пользователи протягивают по строке переговорной, чтобы забронировать её, и перетаскивают бронирование, чтобы перенести его, а в переговорной одновременно может быть только одно бронирование. С FullCalendar 7 и его таймлайном ресурсов из Premium:
С планировщиком Needless UI:
Есть два отличия. FullCalendar сам переносит бронирование, а приложение копирует изменение; планировщик Needless UI только сообщает о нём, а сохраняется оно, когда вы обновляете events, так что единственным источником истины остаются ваши данные. Кроме того, allow — обычный код, который вызывается перед каждым изменением указателем или с клавиатуры, поэтому правило в ваших руках и его можно протестировать. В руководстве по календарю бронирования это приложение собирается шаг за шагом.
Преобразование данных
| FullCalendar | Needless UI |
|---|---|
end события на весь день — следующий день после события | end события на весь день — его последний день: вычтите один день |
Время может заканчиваться на Z или на смещение вроде +02:00 | Время без смещения, как на часах, например 2026-11-02T09:30 |
Дни недели от 0 (воскресенье) до 6 в businessHours и firstDay | Дни недели от 1 (понедельник) до 7 (воскресенье) |
Длительности строками, например '00:30' | Числа: минуты или часы |
| Ресурсы сортируются по id, затем по названию | Ресурсы идут в порядке массива |
rrule в виде объекта и exrule | Строка RFC 5545, например FREQ=WEEKLY;BYDAY=MO,FR, и exdate |
Часовой пояс, например America/New_York | Сначала пересчитайте время. nuiSchedulerFromIcs(text, { timeZone }) делает это сам при чтении файлов .ics. |
Если вам нужно то, чего нет
Если ваше приложение зависит от часовых поясов, сгруппированных ресурсов, перетаскивания извне или печати, планировщик пока не заменит FullCalendar. Откройте issue и опишите, что вам нужно. Для всего остального на странице планировщика есть все входные и выходные свойства и примеры.