209 lines
6.4 KiB
JavaScript
Executable File
209 lines
6.4 KiB
JavaScript
Executable File
/*
|
|
Template Name: webadmin - Admin & Dashboard Template
|
|
Author: Themesdesign
|
|
Website: https://Themesdesign.com/
|
|
Contact: Themesdesign@gmail.com
|
|
File: Calendar init js
|
|
*/
|
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
|
|
var addEvent = new bootstrap.Modal(document.getElementById('event-modal'), {
|
|
keyboard: false
|
|
})
|
|
document.getElementById('event-modal');
|
|
var modalTitle = document.getElementById('modal-title');
|
|
var formEvent = document.getElementById('form-event');
|
|
var selectedEvent = null;
|
|
var newEventData = null;
|
|
var forms = document.getElementsByClassName('needs-validation');
|
|
var selectedEvent = null;
|
|
var newEventData = null;
|
|
var eventObject = null;
|
|
/* initialize the calendar */
|
|
|
|
var date = new Date();
|
|
var d = date.getDate();
|
|
var m = date.getMonth();
|
|
var y = date.getFullYear();
|
|
var Draggable = FullCalendar.Draggable;
|
|
var externalEventContainerEl = document.getElementById('external-events');
|
|
|
|
// init dragable
|
|
new Draggable(externalEventContainerEl, {
|
|
itemSelector: '.external-event',
|
|
eventData: function (eventEl) {
|
|
return {
|
|
title: eventEl.innerText,
|
|
start: new Date(),
|
|
className: eventEl.getAttribute('data-class')
|
|
};
|
|
}
|
|
});
|
|
|
|
var defaultEvents = [{
|
|
title: 'All Day Event',
|
|
start: new Date(y, m, 1),
|
|
className: 'bg-primary'
|
|
},
|
|
{
|
|
title: 'Long Event',
|
|
start: new Date(y, m, d - 5),
|
|
end: new Date(y, m, d - 2),
|
|
className: 'bg-warning'
|
|
},
|
|
{
|
|
id: 999,
|
|
title: 'Repeating Event',
|
|
start: new Date(y, m, d - 3, 16, 0),
|
|
allDay: false,
|
|
className: 'bg-info'
|
|
},
|
|
{
|
|
id: 999,
|
|
title: 'Repeating Event',
|
|
start: new Date(y, m, d + 4, 16, 0),
|
|
allDay: false,
|
|
className: 'bg-primary'
|
|
},
|
|
{
|
|
title: 'Meeting',
|
|
start: new Date(y, m, d, 10, 30),
|
|
allDay: false,
|
|
className: 'bg-success'
|
|
},
|
|
{
|
|
title: 'Lunch',
|
|
start: new Date(y, m, d, 12, 0),
|
|
end: new Date(y, m, d, 14, 0),
|
|
allDay: false,
|
|
className: 'bg-danger'
|
|
},
|
|
{
|
|
title: 'Birthday Party',
|
|
start: new Date(y, m, d + 1, 19, 0),
|
|
end: new Date(y, m, d + 1, 22, 30),
|
|
allDay: false,
|
|
className: 'bg-success'
|
|
},
|
|
{
|
|
title: 'Click for Google',
|
|
start: new Date(y, m, 28),
|
|
end: new Date(y, m, 29),
|
|
url: 'http://google.com/',
|
|
className: 'bg-dark'
|
|
}];
|
|
|
|
var draggableEl = document.getElementById('external-events');
|
|
var calendarEl = document.getElementById('calendar');
|
|
|
|
function addNewEvent(info) {
|
|
addEvent.show();
|
|
formEvent.classList.remove("was-validated");
|
|
formEvent.reset();
|
|
selectedEvent = null;
|
|
modalTitle.innerText = 'Add Event';
|
|
newEventData = info;
|
|
}
|
|
|
|
function getInitialView() {
|
|
if (window.innerWidth >= 768 && window.innerWidth < 1200) {
|
|
return 'timeGridWeek';
|
|
} else if (window.innerWidth <= 768) {
|
|
return 'listMonth';
|
|
} else {
|
|
return 'dayGridMonth';
|
|
}
|
|
}
|
|
|
|
var calendar = new FullCalendar.Calendar(calendarEl, {
|
|
timeZone: 'local',
|
|
editable: true,
|
|
droppable: true,
|
|
selectable: true,
|
|
initialView: getInitialView(),
|
|
themeSystem: 'bootstrap',
|
|
headerToolbar: {
|
|
left: 'prev,next today',
|
|
center: 'title',
|
|
right: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth'
|
|
},
|
|
// responsive
|
|
windowResize: function (view) {
|
|
var newView = getInitialView();
|
|
calendar.changeView(newView);
|
|
},
|
|
eventDidMount: function (info) {
|
|
if (info.event.extendedProps.status === 'done') {
|
|
|
|
// Change background color of row
|
|
info.el.style.backgroundColor = 'red';
|
|
|
|
// Change color of dot marker
|
|
var dotEl = info.el.getElementsByClassName('fc-event-dot')[0];
|
|
if (dotEl) {
|
|
dotEl.style.backgroundColor = 'white';
|
|
}
|
|
}
|
|
},
|
|
eventClick: function (info) {
|
|
document.getElementById("btn-delete-event").style.display = "block";
|
|
addEvent.show();
|
|
formEvent.reset();
|
|
document.getElementById("event-title").value[0] = "";
|
|
selectedEvent = info.event;
|
|
document.getElementById("event-title").value = selectedEvent.title;
|
|
document.getElementById('event-category').value = selectedEvent.classNames[0];
|
|
newEventData = null;
|
|
modalTitle.innerText = 'Edit Event';
|
|
newEventData = null;
|
|
},
|
|
dateClick: function (info) {
|
|
document.getElementById("btn-delete-event").style.display = "none";
|
|
addNewEvent(info);
|
|
},
|
|
events: defaultEvents
|
|
});
|
|
calendar.render();
|
|
|
|
/*Add new event*/
|
|
// Form to add new event
|
|
|
|
formEvent.addEventListener('submit', function (ev) {
|
|
ev.preventDefault();
|
|
|
|
var updatedTitle = document.getElementById("event-title").value;
|
|
var updatedCategory = document.getElementById('event-category').value;
|
|
|
|
// validation
|
|
if (forms[0].checkValidity() === false) {
|
|
forms[0].classList.add('was-validated');
|
|
} else {
|
|
if (selectedEvent) {
|
|
selectedEvent.setProp("title", updatedTitle);
|
|
selectedEvent.setProp("classNames", [updatedCategory]);
|
|
} else {
|
|
var newEvent = {
|
|
title: updatedTitle,
|
|
start: newEventData.date,
|
|
allDay: newEventData.allDay,
|
|
className: updatedCategory
|
|
}
|
|
calendar.addEvent(newEvent);
|
|
}
|
|
addEvent.hide();
|
|
}
|
|
});
|
|
|
|
document.getElementById("btn-delete-event").addEventListener("click", function (e) {
|
|
if (selectedEvent) {
|
|
selectedEvent.remove();
|
|
selectedEvent = null;
|
|
selectedEvent.hide();
|
|
}
|
|
});
|
|
document.getElementById("btn-new-event").addEventListener("click", function (e) {
|
|
document.getElementById("btn-delete-event").style.display = "none";
|
|
addNewEvent({ date: new Date(), allDay: true });
|
|
});
|
|
}); |