10.5. Arrastrar eventos a otros días (PHP) - Piptonita/crear-calendario-FullCalendar GitHub Wiki
Vamos a utilizar la propiedad eventDrop para arrastrar y soltar eventos en otros días y que queden fijado en la base de datos.
- Lo primero que vamos a hacer es crear una función en calendarHelper.js donde cortaremos y pegaremos la captura y pega de datos de los campos que hay en el modal:
botonCrear = document.getElementById('crear');
botonCrear.addEventListener('click', ()=> {
sendForm('crear');
calendar.refetchEvents();
cerrarModal();
vaciarCampos();
});
botonEditar = document.getElementById('editar');
botonEditar.addEventListener('click', ()=>{
cerrarModal();
sendForm('editar');
calendar.refetchEvents();
vaciarCampos();
});
botonBorrar = document.getElementById('borrar');
botonBorrar.addEventListener('click', ()=>{
cerrarModal();
sendForm('borrar');
calendar.refetchEvents();
vaciarCampos();
})
var modal = document.getElementById('modal');
function abrirModal(permisos){
if(permisos == 'crear'){
document.getElementById('editar').style.cssText = "display: none";
document.getElementById('crear').style.cssText = "display: block";
document.getElementById('borrar').style.cssText = "display: none";
}else{
document.getElementById('editar').style.cssText = "display: block";
document.getElementById('crear').style.cssText = "display: none";
document.getElementById('borrar').style.cssText = "display: block";
}
modal.style.cssText = "display: flex;";
window.setTimeout(()=>{
modal.style.cssText += "opacity: 1; transition: 0.5s";
}, 10);
}
function recuperarCampos(){
var nuevoEvento = {};
nuevoEvento.title = document.getElementById('titulo').value;
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;
return nuevoEvento;
}
var botonCerrar = document.getElementById('cancelar');
botonCerrar.addEventListener('click', ()=>{
cerrarModal();
vaciarCampos();
});
function cerrarModal(){
modal.style.cssText += 'opacity: 0; transition: 0.5s';
window.setTimeout(()=>{
modal.style.cssText = 'display: none';
}, 500);
}
function vaciarCampos(){
document.getElementById('id').value = '';
document.getElementById('titulo').value = '';
document.getElementById('fechaInicio').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';
}
function cortarFecha(fecha){
fecha = fecha.split("T");
if(fecha[1]){
fecha[1] = fecha[1].substr(0,8);
}
return fecha;
}
// creamos la función establecerValores para grabar los valores en los campos como hacíamos en eventClick:
function establecerValores(info){
// cortamos los valores que hay dentro de eventClick y los pegamos aquí:
document.getElementById('tituloEntrada').innerHTML = info.event.title;
document.getElementById('id').value = info.event.id;
document.getElementById('titulo').value = info.event.title;
fechaInicio = cortarFecha(info.event.startStr);
document.getElementById('fechaInicio').value = fechaInicio[0];
if(fechaInicio.length > 1){
document.getElementById('horaInicio').value = fechaInicio[1];
}
fechaFin = cortarFecha(info.event.endStr);
document.getElementById('fechaFin').value = fechaFin[0];
if(fechaFin.length > 1){
document.getElementById('horaFin').value = fechaFin[1];
}
if(info.event.extendedProps.description){
document.getElementById('descripcion').value = info.event.extendedProps.description;
}
document.getElementById('color').value = info.event.backgroundColor;
document.getElementById('textColor').value = info.event.textColor;
}
function sendForm(opcion){
let data = new FormData(document.getElementById('form'));
fetch('./eventos.php?accion=' + opcion, {
method: 'POST',
body: data
})
.then((respuesta)=>{
if(respuesta.ok){
return respuesta.text();
}else{
throw "Error en el envío del formulario";
}
})
.then((texto)=>{
//console.log(texto);
})
.catch((error)=>{
//console.log(error);
});
}
- Ahora que tenemos lista la función vamos a limpiar eventClick para pasarle esta función y cargramos la propiedad eventDrop:
var calendarDiv = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarDiv, {
locales: 'es',
initialView: 'dayGridMonth',
headerToolbar: {
left: 'prev,crearEntrada',
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'
},
customButtons: {
crearEntrada: {
text: 'Nuevo evento',
click: ()=>{
abrirModal('crear');
vaciarCampos();
}
}
},
events: "./eventos.php",
dateClick: (info) => {
abrirModal('crear');
var fecha = document.getElementById('fechaInicio');
fecha.value = info.dateStr;
},
eventClick: (info) => {
// cargamos la función establecerValores y le pasamos la info del evento:
establecerValores(info);
abrirModal('editar');
},
editable: true,
eventDrop: (info)=>{
// cargamos la función establecerValores y le pasamos la info del evento:
establecerValores(info);
sendForm('editar');
}
});
calendar.render();
Con esto ya podemos hacer los movimientos de eventos a distintos días y que queden guardados en la base de datos.