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).