05. Añadir eventos al calendario. - Piptonita/crear-calendario-FullCalendar GitHub Wiki

Lo siguiente en este tutorial es añadir nuevos eventos al calendario.

  • Para ello vamos a crear un modal en index.html:
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Calendario a Full</title>
    <link rel="stylesheet" href="vendor/fullcalendar/main.css">
    <link rel="stylesheet" href="src/css/calendar.css">
</head>
<body>
    <div id="calendar"></div>

    <div id="modal">
        <div class="containerModal column">
            <h2>Modal entrada</h2>
            <hr>
            <input type="text" id="titulo" placeholder="Título del evento">
            <div class="row">
                <input type="text" id="fechaInicio">
                <input type="text" id="horaInicio" placeholder="Hora de inicio (opcional)">
            </div>
            <div class="row">
                <input type="text" id="fechaFin" placeholder="Fecha de finalización (opcional)">
                <input type="text" id="horaFin" placeholder="Hora de finalización (opcional)">
            </div>
            <textarea id="descripcion" placeholder="Descripción del evento"></textarea>
            <div class="row">
                <label for="color">Color de la tarjeta:</label>
                <input type="color" id="color" name="color" value="#00C217">
                <label for="textColor">Color del texto:</label>
                <input type="color" id="textColor" name="textColor" value="#0018CC">
            </div>
            <div class="row">
                <button id="crear">Guardar</button>
                <button id="cancelar">Cancelar</button>
            </div>
        </div>
    </div>
    
    <script src="vendor/fullcalendar/main.js"></script>
    <script src="vendor/fullcalendar/locales/es.js"></script>
    <script src="src/js/calendar.js"></script>
</body>
</html>
  • Ahora para editar el estilo del modal, creamos un archivo en la carpeta src/css llamado calendar.css.

  • Vinculamos calendar.css en index.html añadiendo arriba la línea: <link rel="stylesheet" href="src/css/styles.css">

  • Editamos el archivo calendar.css:

body{
    margin: 0 auto;
}

.row{
    display: flex;
    flex-direction: row;
}

.column{
    display: flex;
    flex-direction: column;
}

#modal {
    position: fixed;
    top: 0;
    width: 100%;
    height: 100%;
    background: RGBA(0,0,0,0.5);
    z-index: 2;
    justify-content: center;
    align-items: center;
    opacity: 0;
    display: none;
}

.containerModal {
    width: 500px;
    min-height: 300px;
    background: #ffffff;
    display: flex;
    flex-direction: column;
    align-items: center;
    border-radius: 20px;
    box-shadow: 0px 0px 8px;
    transition: 0.5s;
}

h2{
    margin-bottom: 5px;
}

hr {
    width: 90%;
}

input{
    width: 90%;
    height: 30px;
    border-radius: 5px;
    font-size: 18px;
    margin: 8px;
}

textarea#descripcion {
    width: 90%;
    height: 150px;
    margin: 8px;
    border-radius: 5px;
    padding: 8px;
}

#color, #textColor{
    width: 50px;
}

button {
    margin: 15px;
    font-size: 18px;
    cursor: pointer;
}
  • Ahora vamos a utilizar una propiedad en javascript para activar los modals. Para ello utilizamos la propiedad dateClick en el archivo calendar.js:
var calendarDiv = document.getElementById('calendar');


var calendar = new FullCalendar.Calendar(calendarDiv, {
    locales: 'es', 
    initialView: 'dayGridMonth', 
    headerToolbar: { 
        left: 'prev', 
        center: 'title', 
        right: 'next',

    },
    footerToolbar: {
        left: 'prevYear',    
        center: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth,today',
        right: 'nextYear'
    }, 
    buttonText: {
        today: 'Hoy',
        month: 'Mes',
        week: 'Semana',
        day: 'Día',
        list: 'Listado'
    }, 
    events: [
        {
            title: 'Evento de prueba 1',
            description: 'Esta es una descripción de prueba', 
            start: '2020-09-20 12:00:00', 
            end: '2020-09-25 12:00:00', 
            color: 'yellow', 
            textColor: 'red', 
        },
        {
            title: 'Evento de prueba 2',
            descripcion: 'Este es otro evento de un solo día',
            start: '2020-09-26',
            color: 'red',
            textColor: 'yellow'
        },
        {
            title: 'Evento de prueba 3',
            description: 'Este evento dura un tiempo determinado',
            start: '2020-09-27 08:00:00', 
            end: '2020-09-27 10:00:00', 
            color: 'blue',
            textColor: 'green'
        }
        
    ], // añadimos la propiedad dateClick que se dispara cuando hacemos click en un día y le pasamos el atributo info:
    dateClick: (info) => { // este atributo contiene información del día pulsado
        // abrimos el modal creando una función dedicada:
        abrirModal();
        // creamos una variable para capturar el campo fecha y asignarle la fecha actual:
        var fecha = document.getElementById('fechaInicio');
        fecha.value = info.dateStr; // recuperamos este campo del objeto info con la fecha y lo asignamos al input.

    }
});

// Capturamos el modal:
var modal = document.getElementById('modal');

// creamos un método para abrir el modal:
function abrirModal(){
    modal.style.cssText = "display: flex;";
    window.setTimeout(()=>{
        modal.style.cssText += "opacity: 1; transition: 0.5s";
    }, 10);
}

calendar.render();
  • Ahora vamos a registrar el evento en el calendario, recuerda que sin una base de datos solo se mostrará guardado hasta refrescar la página. Para ello editamos nuevamente calendar.js:
var calendarDiv = document.getElementById('calendar');


var calendar = new FullCalendar.Calendar(calendarDiv, {
    locales: 'es', 
    initialView: 'dayGridMonth', 
    headerToolbar: { 
        left: 'prev', 
        center: 'title', 
        right: 'next',

    },
    footerToolbar: {
        left: 'prevYear',    
        center: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth,today',
        right: 'nextYear'
    }, 
    buttonText: {
        today: 'Hoy',
        month: 'Mes',
        week: 'Semana',
        day: 'Día',
        list: 'Listado'
    }, 
    events: [
        {
            title: 'Evento de prueba 1',
            description: 'Esta es una descripción de prueba', 
            start: '2020-09-20 12:00:00', 
            end: '2020-09-25 12:00:00', 
            color: 'yellow', 
            textColor: 'red', 
        },
        {
            title: 'Evento de prueba 2',
            descripcion: 'Este es otro evento de un solo día',
            start: '2020-09-26',
            color: 'red',
            textColor: 'yellow'
        },
        {
            title: 'Evento de prueba 3',
            description: 'Este evento dura un tiempo determinado',
            start: '2020-09-27 08:00:00', 
            end: '2020-09-27 10:00:00', 
            color: 'blue',
            textColor: 'green'
        }
        
    ], 
    dateClick: (info) => { 
        abrirModal();

        var fecha = document.getElementById('fechaInicio');
        fecha.value = info.dateStr; 
        
    }
});

// capturamos el botón de crear evento y establecemos una acción:
botonCrear = document.getElementById('crear');
botonCrear.addEventListener('click', ()=> {
    // aquí entonces llamamos a la función que se encargará de recuperar los campos del calendario:
    recuperarCampos();
    // Añadimos el evento al calendario:
    calendar.addEvent(recuperarCampos());
    // y para finalizar cerramos el modal:
    cerrarModal();
    // y vaciamos los campos:
    vaciarCampos();

});

var modal = document.getElementById('modal');

function abrirModal(){
    modal.style.cssText = "display: flex;";
    window.setTimeout(()=>{
        modal.style.cssText += "opacity: 1; transition: 0.5s";
    }, 10);
}

// creamos la función que captura los campos:
function recuperarCampos(){
    // creamos un objeto:
    var nuevoEvento = [];
    // recuperamos el valor de todos los campos 
    nuevoEvento.title = document.getElementById('titulo').value;
    // este campo combina la fecha y hora:
    if(document.getElementById('horaInicio').value != ''){
        nuevoEvento.start = document.getElementById('fechaInicio').value + " " + document.getElementById('horaInicio').value;
    }else{
        nuevoEvento.start = document.getElementById('fechaInicio').value;
    }
    nuevoEvento.end = document.getElementById('fechaFin').value + " " + document.getElementById('horaFin').value;
    nuevoEvento.description = document.getElementById('descripcion').value;
    nuevoEvento.color = document.getElementById('color').value;
    nuevoEvento.textColor = document.getElementById('textColor').value;
    // retornamos los datos:
    console.log(nuevoEvento);
    return nuevoEvento;
}

// creamos independientemente el botón para cerrar el formulario:
var botonCerrar = document.getElementById('cancelar');
botonCerrar.addEventListener('click', ()=>{
    cerrarModal();
});

// creamos también una función para cerrar el modal:
function cerrarModal(){
    // hacemos el modal invisible:
    modal.style.cssText += 'opacity: 0; transition: 0.5s';
    // y un temporizador para esperar a que termine y lo ocultamos:
    window.setTimeout(()=>{
        modal.style.cssText = 'display: none';
    }, 500);
}

// y creamos otra función para vaciar campos:
function vaciarCampos(){
    // establecemos los campos value a '':
    document.getElementById('titulo').value = '';
    document.getElementById('horaInicio').value = '';
    document.getElementById('fechaFin').value = '';
    document.getElementById('horaFin').value = '';
    document.getElementById('descripcion').value = '';
    document.getElementById('color').value = '#00C217';
    document.getElementById('textColor').value = '#0018CC';
}

calendar.render();

Ya podemos insertar eventos haciendo clic en un día del calendario. Hemos creado las funciones para abrir y cerrar el modal y hemos usado la propiedad calendar.addEvent() para añadir el evento a la vista del calendario. (recuerda que los cambios se eliminarán una vez actualicemos la ventana).

⚠️ **GitHub.com Fallback** ⚠️