La línea de tiempo de recursos y las columnas de recursos de FullCalendar forman parte de Premium: una aplicación comercial necesita una clave de licencia de pago. Su página de licencias enumera las opciones gratuitas, para aplicaciones totalmente AGPL y para organizaciones sin ánimo de lucro registradas. El planificador de Needless UI ofrece ambas cosas con licencia MIT, junto con eventos recurrentes y archivos iCalendar. Esta guía lleva una aplicación Angular de uno a otro: lo que se mantiene, lo que no y los datos que hay que convertir.

La guía usa los nombres de FullCalendar 7, con los de la versión 6 entre corchetes cuando difieren. El conector de FullCalendar para Angular es compatible con Angular 16 a 22; Needless UI necesita Angular 22.

Qué obtienes

FullCalendar y el planificador de Needless UI
FunciónFullCalendarNeedless UI
Línea de tiempo de recursos: una fila por sala o personaPremiumSí: un día, una semana o un mes
Recursos como columnas en las vistas de día y de semanaPremiumSí
Vistas de mes, semana y díaGratisSí
Arrastrar para mover y redimensionarGratis; a otro recurso, con PremiumSí, también a otros recursos. El final se estira; el inicio, no.
Seleccionar un intervalo para crear un eventoGratisSí, con un puntero, una pulsación larga o el teclado
Reglas como «sin solapamientos»Gratis: opciones de solapamiento y de restriccionesSí: una sola función allow, que se consulta antes de cada cambio
Mover y redimensionar eventos con el tecladoNo aparece en su documentación de accesibilidad, que trata las etiquetas ARIA y el foco con TabSí, con anuncios para lectores de pantalla
Eventos recurrentesGratis, con el plugin y la biblioteca rruleIntegrados: reglas RFC 5545, sin EXRULE, RDATE ni reglas por horas
iCalendar (.ics)Gratis: lee un feedLee y escribe archivos .ics
Vistas de lista y de añoGratisUna agenda de los próximos días; sin vistas de año
Zonas horariasGratis: local, UTC o zonas con nombreNo: muestra las horas tal como le llegan
Recursos agrupados, anidados o en varias columnasPremiumNo: una columna, que dibuja tu plantilla
Arrastrar y soltar desde fuera, eventos de fondoGratisNo
Impresión, renderizado virtualPremiumNo
FrameworksAngular 16 a 22, React, Vue, JavaScript puro y másAngular 22 y React 19

Qué equivale a qué

Opciones de FullCalendar y sus equivalentes en Needless UI
FullCalendarPlanificador de Needless UI
<full-calendar [options]>, plugins, schedulerLicenseKey<nui-scheduler>, con un input para cada opción; sin plugins y sin clave
initialView: 'resourceTimelineDay'view="timeline", y timelineSpan para una semana o un mes
initialView: 'timeGridWeek'view="week"; [(view)] es bidireccional
resources, events[resources], [events]
resourceId, extendedPropsresource, data
editable, selectableeditable, selectable
select(slotSelect): { start, end, allDay, resource }
eventDrop, eventResize(eventChange): nada se mueve hasta que actualizas events
eventClick(eventClick)
eventOverlap, selectOverlap, eventAllow[allow]: una sola función para movimientos, cambios de tamaño y selecciones
slotDuration, snapDurationslotMinutes, snapMinutes, en minutos
slotMinTime, slotMaxTime, scrollTimedayStart, dayEnd, scrollHour, en horas
businessHours[businessHours], con los días de la semana de 1 (lunes) a 7
datesSet(rangeChange)
eventContent, resourceCellContent [resourceLabelContent]Plantillas nuiSchedulerEvent y nuiSchedulerResource
locale, firstDaylocale (cualquier etiqueta BCP 47), firstDay de 1 a 7 y labels para sus textos

Una línea de tiempo de reservas de salas, con ambos

Las salas son recursos y las reservas son eventos. Se arrastra sobre una sala para reservarla y se arrastra una reserva para moverla, y una sala solo admite una reserva a la vez. Con FullCalendar 7 y su línea de tiempo de recursos Premium:

Con el planificador de Needless UI:

Hay dos cosas que funcionan de otra manera. FullCalendar mueve la reserva por su cuenta y la aplicación copia el cambio; el planificador de Needless UI solo lo comunica, y el cambio se mantiene cuando actualizas events, por lo que tus datos siguen siendo la única fuente. Y allow es código normal, que se consulta antes de cada cambio hecho con un puntero o con el teclado, así que la regla la puedes probar tú. La guía de reservas de salas construye esta aplicación paso a paso.

Convertir los datos

Datos de FullCalendar y lo que espera el planificador
FullCalendarNeedless UI
En un evento de todo el día, end es el día siguiente al eventoEn un evento de todo el día, end es su último día: resta un día
Las horas pueden acabar en Z o en un desfase como +02:00Horas locales sin desfase, como 2026-11-02T09:30
Días de la semana de 0 (domingo) a 6, en businessHours y firstDayDías de la semana de 1 (lunes) a 7 (domingo)
Duraciones como cadenas, por ejemplo '00:30'Números: minutos u horas
Recursos ordenados por id y después por títuloRecursos en el orden del array
rrule como objeto, y exruleUna cadena RFC 5545, como FREQ=WEEKLY;BYDAY=MO,FR, y exdate
Una zona horaria como America/New_YorkConvierte antes las horas. nuiSchedulerFromIcs(text, { timeZone }) convierte los archivos .ics al leerlos.

Si necesitas lo que falta

Si tu aplicación depende de zonas horarias, recursos agrupados, arrastrar y soltar desde fuera o la impresión, el planificador todavía no puede sustituir a FullCalendar. Abre un issue con lo que necesitas. Para todo lo demás, la página del planificador tiene todos los inputs, outputs y ejemplos.