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
| Función | FullCalendar | Needless UI |
|---|---|---|
| Línea de tiempo de recursos: una fila por sala o persona | Premium | Sí: un día, una semana o un mes |
| Recursos como columnas en las vistas de día y de semana | Premium | Sí |
| Vistas de mes, semana y día | Gratis | Sí |
| Arrastrar para mover y redimensionar | Gratis; a otro recurso, con Premium | Sí, también a otros recursos. El final se estira; el inicio, no. |
| Seleccionar un intervalo para crear un evento | Gratis | Sí, con un puntero, una pulsación larga o el teclado |
| Reglas como «sin solapamientos» | Gratis: opciones de solapamiento y de restricciones | Sí: una sola función allow, que se consulta antes de cada cambio |
| Mover y redimensionar eventos con el teclado | No aparece en su documentación de accesibilidad, que trata las etiquetas ARIA y el foco con Tab | Sí, con anuncios para lectores de pantalla |
| Eventos recurrentes | Gratis, con el plugin y la biblioteca rrule | Integrados: reglas RFC 5545, sin EXRULE, RDATE ni reglas por horas |
| iCalendar (.ics) | Gratis: lee un feed | Lee y escribe archivos .ics |
| Vistas de lista y de año | Gratis | Una agenda de los próximos días; sin vistas de año |
| Zonas horarias | Gratis: local, UTC o zonas con nombre | No: muestra las horas tal como le llegan |
| Recursos agrupados, anidados o en varias columnas | Premium | No: una columna, que dibuja tu plantilla |
| Arrastrar y soltar desde fuera, eventos de fondo | Gratis | No |
| Impresión, renderizado virtual | Premium | No |
| Frameworks | Angular 16 a 22, React, Vue, JavaScript puro y más | Angular 22 y React 19 |
Qué equivale a qué
| FullCalendar | Planificador 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, extendedProps | resource, data |
editable, selectable | editable, 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, snapDuration | slotMinutes, snapMinutes, en minutos |
slotMinTime, slotMaxTime, scrollTime | dayStart, 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, firstDay | locale (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
| FullCalendar | Needless UI |
|---|---|
En un evento de todo el día, end es el día siguiente al evento | En 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:00 | Horas locales sin desfase, como 2026-11-02T09:30 |
Días de la semana de 0 (domingo) a 6, en businessHours y firstDay | Dí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ítulo | Recursos en el orden del array |
rrule como objeto, y exrule | Una cadena RFC 5545, como FREQ=WEEKLY;BYDAY=MO,FR, y exdate |
Una zona horaria como America/New_York | Convierte 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.