PLC Core

Planificador Calendario Core: Un componente de eventos responsive. 🗓️

Integración Rápida

// 1. Incluye el archivo calendar.js
// 2. Inicializa en un contenedor (Ej: 
) const miCalendario = inicializarPlanificador({ node: 'mi-calendario', colorPrimario: '#3b82f6', modoOscuro: false, vistaInicial: 'month' });

Demo Interactivo

Prueba el Planificador Calendario Core. Los eventos de ejemplo están pre-cargados para **la fecha actual y los días siguientes**.

Nota:

Este demo usa la configuración por defecto: Modo Oscuro, Color Primario Azul, y vista de Mes. El **panel lateral está visible al cargar**. Haz clic en los eventos en el panel para ver sus detalles en un modal. Usa el botón "+ Nuevo" para crear un evento interactivo.


Primeros Pasos 🛠️

**PLC Core** es una librería Vanilla JavaScript. Para comenzar, solo necesita tres pasos: incluir el archivo **`calendar.js`**, definir el contenedor HTML y llamar a la función de inicialización.

1. Incluir la Librería (calendar.js):

Copie y pegue la siguiente etiqueta <script> justo antes de la etiqueta de cierre </body>.

<script src="https://guillepalma.xo.je/calendar/calendar.js"></script>

2. Estructura HTML:

Defina un contenedor vacío con un id. La librería inyectará todo el markup necesario dentro de él.

<!-- El calendario se renderizará aquí -->
<div id="mi-planificador" style="width: 100%; height: 500px;"></div>

<!-- NOTA: La librería se adapta al tamaño de este contenedor. 
Recomendamos darle un tamaño fijo o máximo. -->

3. Inicialización:

Finalmente, cree un bloque de script y llame a inicializarPlanificador.

<script>
    // Ejemplo de lista de eventos
    const eventosLista = [
        { date: '2025-10-15', time: '10:00', description: 'Reunión con Cliente', details: 'Tema A', category: 'work' },
        { date: '2025-10-15', time: '14:30', description: 'Cita Médica', details: 'Chequeo anual', category: 'personal' },
        // ... más eventos
    ];

    window.onload = function() {
        inicializarPlanificador({
            // **[OBLIGATORIO]** ID del contenedor:
            node: 'mi-planificador', 
            
            // Opciones:
            eventos: eventosLista,
            colorPrimario: '#3b82f6', // Azul principal para resaltar
            modoOscuro: false,
            vistaInicial: 'month',
            
            // Callbacks:
            alClicEnDia: (fecha, eventos) => console.log('Día clickeado:', fecha, eventos.length),
        });
    }
</script>

Ejemplos de Uso Avanzado 💡

La verdadera potencia de PLC Core reside en sus funciones de callback, que le permiten enlazar la interacción del usuario con cualquier lógica de negocio (abrir modales, enviar datos a una API, etc.).

1. Callback: Mostrar Detalle del Evento en un Modal (Vanilla JS)

Al usar alClicEnEvento, recibe el objeto evento completo y puede usarlo para poblar cualquier ventana de detalles o modal en su página.

Código JavaScript (Configuración del Callback):

inicializarPlanificador({
    // ... otras opciones
    alClicEnEvento: (evento) => {
        // Lógica de Vanilla JS para poblar y abrir un modal/ventana:
        document.getElementById('modalDetalleTitulo').textContent = evento.description;
        document.getElementById('modalDetalleFecha').textContent = evento.date;
        document.getElementById('modalDetalleHora').textContent = evento.time;
        document.getElementById('modalDetalleDesc').textContent = evento.details;
        
        // Muestra el modal (asumiendo que tiene un ID 'miModalDetalle')
        document.getElementById('miModalDetalle').style.display = 'block'; 
    },
});

Código HTML de Referencia para el Modal:

<div id="miModalDetalle" style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5);">
    <div style="background: white; margin: 10% auto; padding: 20px; width: 80%;">
        <h3 id="modalDetalleTitulo"></h3>
        <p>Fecha: <span id="modalDetalleFecha"></span></p>
        <p>Hora: <span id="modalDetalleHora"></span></p>
        <p>Detalles: <span id="modalDetalleDesc"></span></p>
        <button onclick="document.getElementById('miModalDetalle').style.display='none';">Cerrar</button>
    </div>
</div>

2. Callback: Abrir Formulario y Agregar Evento Dinámicamente

La función onNewEvent se activa al presionar el botón **+ Nuevo**. Podemos usarla para abrir un formulario y, crucialmente, **re-renderizar** el calendario con el nuevo evento.

// Asumimos que tiene un array 'eventosGlobales' fuera de la función de inicialización.
let eventosGlobales = [...eventosIniciales]; 
let planificadorInstancia; // Variable para almacenar la instancia del planificador

// Función principal para inicializar/re-inicializar
function cargarPlanificador() {
    planificadorInstancia = inicializarPlanificador({
        node: 'mi-planificador',
        eventos: eventosGlobales, // Usamos el array global
        
        // Callback para el botón '+ Nuevo'
        onNewEvent: (fechaSeleccionada) => {
            // 1. Pre-pobla la fecha en el formulario
            document.getElementById('formFecha').value = fechaSeleccionada;
            
            // 2. Muestra el modal del formulario
            document.getElementById('miModalForm').style.display = 'block';
        },
        // ... otros callbacks
    });
}


// ** Lógica para manejar el envío del formulario **
document.getElementById('miFormulario').addEventListener('submit', function(e) {
    e.preventDefault();
    
    const nuevoEvento = {
        date: document.getElementById('formFecha').value,
        time: document.getElementById('formHora').value,
        description: document.getElementById('formTitulo').value,
        details: document.getElementById('formDescripcion').value,
        category: document.getElementById('formCategoria').value,
    };

    // 1. Agregar el nuevo evento al array global
    eventosGlobales.push(nuevoEvento);

    // 2. Cerrar el modal
    document.getElementById('miModalForm').style.display = 'none';

    // 3. ¡MÁS IMPORTANTE! Vuelve a cargar el calendario con la lista actualizada.
    // Esto borra el viejo y dibuja el nuevo, incluyendo el evento recién creado.
    cargarPlanificador(); 
    
    alert('Evento creado y calendario actualizado.');
});


// Llamar al inicio para cargar la instancia
cargarPlanificador();

Opciones de Configuración y Eventos ⚙️

Parámetros (Opciones):

Se pasan como un objeto JavaScript a la función inicializarPlanificador(config).

Opción Tipo Descripción Default
node String **Obligatorio.** ID del elemento contenedor donde se renderizará el calendario. N/A
fechaInicial Date | String Fecha inicial que se mostrará al cargar. Acepta objetos Date o strings válidos (ej: '2025-10-01'). new Date()
eventos Array Lista de objetos evento para mostrar en el calendario. []
colorPrimario String (Hex) Color principal utilizado para resaltar días, el borde del panel y botones. Debe ser un **valor hexadecimal estricto** (ej: #10b981). #10b981
modoOscuro Boolean Si es true, activa la paleta de colores oscuros (fondos grises oscuros y texto claro). true
vistaInicial String Vista por defecto al cargar. Valores posibles: 'month' (Mes) o 'week' (Semana). 'month'
panelOcultoInicial Boolean Si es true, el panel lateral de eventos se ocultará al cargar. Se mostrará al hacer clic en un día. false

Estructura del Objeto Evento:

Cada elemento en el arreglo eventos debe seguir esta estructura:

{
    date: 'YYYY-MM-DD',      // [OBLIGATORIO] Fecha del evento (Ej: '2025-10-25')
    time: 'HH:MM',           // Hora del evento (Ej: '14:30')
    description: 'String',   // Título corto del evento
    details: 'String',       // Descripción larga para el panel
    category: 'String'       // Categoría para el punto de color (Ej: 'work', 'personal', etc.)
}

Funciones de Callback:

Callbacks que se ejecutan cuando el usuario interactúa con el calendario.

Callback Parámetros Descripción
alClicEnDia fechaString, eventosDia Se ejecuta cuando un usuario hace clic en un día. Recibe la fecha formateada ('YYYY-MM-DD') y la lista de eventos para ese día.
alClicEnEvento eventoObjeto Se ejecuta cuando un usuario hace clic en una tarjeta de evento en el panel lateral.
onNewEvent fechaString Se ejecuta cuando el usuario presiona el botón "+ Nuevo" en el panel lateral. Recibe la fecha seleccionada actualmente.