iflrandevu/doc/code/js/backend_calendar.js.html

358 lines
14 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JSDoc: Source: backend_calendar.js</title>
<script src="scripts/prettify/prettify.js"> </script>
<script src="scripts/prettify/lang-css.js"> </script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<div id="main">
<h1 class="page-title">Source: backend_calendar.js</h1>
<section>
<article>
<pre class="prettyprint source"><code>/**
* This namespace contains functions that are used by the backend calendar page.
*
* @namespace BackendCalendar
*/
var BackendCalendar = {
FILTER_TYPE_PROVIDER : 'provider',
FILTER_TYPE_SERVICE : 'service',
lastFocusedEvent : undefined, // Contain event data for later use.
/**
* This function makes the necessary initialization for the default backend
* calendar page. If this namespace is used in another page then this function
* might not be needed.
*
* @param {bool} defaultEventHandlers (OPTIONAL = TRUE) Determines whether the
* default event handlers will be set for the current page.
*/
initialize: function(defaultEventHandlers) {
if (defaultEventHandlers === undefined) defaultEventHandlers = true;
// :: INITIALIZE THE DOM ELEMENTS OF THE PAGE
$('#calendar').fullCalendar({
defaultView : 'agendaWeek',
height : BackendCalendar.getCalendarHeight(),
editable : true,
columnFormat : {
month : 'ddd',
week : 'ddd d/M',
day : 'dddd d/M'
},
titleFormat : {
month : 'MMMM yyyy',
week : "MMMM d[ yyyy]{ '&#8212;'[ MMM] d, yyyy}",
day : 'dddd, MMM d, yyyy'
},
header : {
left : 'prev,next today',
center : 'title',
right : 'agendaDay,agendaWeek,month'
},
windowResize : function(view) {
$('#calendar').fullCalendar('option', 'height',
BackendCalendar.getCalendarHeight());
},
dayClick : function(date, allDay, jsEvent, view) {
if (allDay) {
// Switch to day view
$('#calendar').fullCalendar('gotoDate', date);
$('#calendar').fullCalendar('changeView', 'agendaDay');
}
},
eventClick : function(event, jsEvent, view) {
// Display a popover with the event details.
var html =
'&lt;style type="text/css">'
+ '.popover-content strong {min-width: 80px; display:inline-block;}'
+ '.popover-content button {margin-right: 10px;}'
+ '&lt;/style>' +
'&lt;strong>Start&lt;/strong> '
+ event.start.toString('dd-MM-yyyy HH:mm')
+ '&lt;br>' +
'&lt;strong>End&lt;/strong> '
+ event.end.toString('dd-MM-yyyy HH:mm')
+ '&lt;br>' +
'&lt;strong>Service&lt;/strong> '
+ event.title
+ '&lt;br>' +
'&lt;strong>Provider&lt;/strong> '
+ event.data['provider']['first_name'] + ' '
+ event.data['provider']['last_name']
+ '&lt;br>' +
'&lt;strong>Customer&lt;/strong> '
+ event.data['customer']['first_name'] + ' '
+ event.data['customer']['last_name']
+ '&lt;hr>' +
'&lt;center>' +
'&lt;button class="edit-popover btn btn-primary">Edit&lt;/button>' +
'&lt;button class="close-popover btn" data-po=' + jsEvent.target + '>Close&lt;/button>' +
'&lt;/center>';
$(jsEvent.target).popover({
placement : 'top',
title : event.title,
content : html,
html : true,
container : 'body',
trigger : 'manual'
});
$(jsEvent.target).popover('show');
BackendCalendar.lastFocusedEvent = event;
},
eventResize : function(event, dayDelta, minuteDelta, revertFunc, jsEvent, ui, view) {
// @task Display confirmation modal.
},
eventDrop : function(event, dayDelta, minuteDelta, allDay, revertFunc, jsEvent, ui, view) {
// @task Display confirmation modal.
},
viewDisplay : function(view) {
// Place the footer into correct position because the calendar
// height might change.
BackendCalendar.refreshCalendarAppointments(
$('#calendar'),
$('#select-filter-item').val(),
$('#select-filter-item option:selected').attr('type'),
$('#calendar').fullCalendar('getView').visStart,
$('#calendar').fullCalendar('getView').visEnd);
$(window).trigger('resize');
$('.fv-events').each(function(index, eventHandle) {
$(eventHandle).popover();
});
}
});
// :: FILL THE SELECT ELEMENTS OF THE PAGE
var optgroupHtml = '&lt;optgroup label="Providers">';
$.each(GlobalVariables.availableProviders, function(index, provider) {
optgroupHtml += '&lt;option value="' + provider['id'] + '" ' +
'type="' + BackendCalendar.FILTER_TYPE_PROVIDER + '">' +
provider['first_name'] + ' ' + provider['last_name'] + '&lt;/option>';
});
optgroupHtml += '&lt;/optgroup>';
$('#select-filter-item').append(optgroupHtml)
optgroupHtml = '&lt;optgroup label="Services">';
$.each(GlobalVariables.availableServices, function(index, service) {
optgroupHtml += '&lt;option value="' + service['id'] + '" ' +
'type="' + BackendCalendar.FILTER_TYPE_SERVICE + '">'
+ service['name'] + '&lt;/option>';
});
optgroupHtml += '&lt;/optgroup>';
$('#select-filter-item').append(optgroupHtml)
// :: BIND THE DEFAULT EVENT HANDLERS
if (defaultEventHandlers === true) {
BackendCalendar.bindEventHandlers();
$('#select-filter-item').trigger('change');
}
},
/**
* This method binds the default event handlers for the backend calendar
* page. If you do not need the default handlers then initialize the page
* by setting the "defaultEventHandlers" argument to "false".
*/
bindEventHandlers: function() {
/**
* Event: Calendar filter item "Changed"
*
* Load the appointments that correspond to the select filter item and
* display them on the calendar.
*/
$('#select-filter-item').change(function() {
BackendCalendar.refreshCalendarAppointments(
$('#calendar'),
$('#select-filter-item').val(),
$('#select-filter-item option:selected').attr('type'),
$('#calendar').fullCalendar('getView').visStart,
$('#calendar').fullCalendar('getView').visEnd);
// @task If current value is service, then the sync buttons must be disabled.
});
/**
* Event: Popover close button "Clicked"
*
* Hides the open popover element.
*/
$(document).on('click', '.close-popover', function() {
$(this).parents().eq(2).remove();
});
/**
* Event: Popover edit button "Clicked"
*
* Enables the edit dialog of the selected calendar event.
*/
$(document).on('click', '.edit-popover', function() {
$(this).parents().eq(2).remove();
// :: APPLY APPOINTMENT DATA AND SHOW TO MODAL DIALOG
$('.manage-appointment').find('input, textarea').val('');
// Fill the services listbox and select the appointment service.
$.each(GlobalVariables.availableServices, function(index, service) {
var option = new Option(service['name'], service['id']);
$('.manage-appointment #select-service').append(option);
});
$('.manage-appointment #select-service').val(
BackendCalendar.lastFocusedEvent.data['id_services']);
// Fill the providers listbox with providers that can serve the appointment's
// service and then select the user's provider.
$.each(GlobalVariables.availableProviders, function(index, provider) {
var canProvide = false;
$.each(provider['services'], function(index, service) {
if (service['id'] == BackendCalendar.lastFocusedEvent['id_services']) {
canProvide = true;
return;
}
});
if (canProvide) {
var option = new Option(provider['first_name'] + ' '
+ provider['last_name'], provider['id']);
$('#manage-appointments #select-provider').append(option);
}
});
// .... more stuff here
});
$('#manage-appointments #cancel-button').click(function() {
$('#manage-appointments').modal('hide');
});
$('#manage-appointments #save-button').click(function() {
// :: PREPARE APPOINTMENT DATA FOR AJAX CALL
var appointmentData = {};
// :: CALL THE UPDATE APPOINTMENT METHOD
BackendCalendar.updateAppointment(appointmentData);
});
},
/**
* This method calculates the proper calendar height, in order to be displayed
* correctly, even when the browser window is resizing.
*
* @return {int} Returns the calendar element height in pixels.
*/
getCalendarHeight: function () {
var result = window.innerHeight - $('#footer').height() - $('#header').height()
- $('#calendar-toolbar').height() - 80; // 80 for fine tuning
return (result > 500) ? result : 500; // Minimum height is 500px
},
/**
* This method reloads the registered appointments for the selected date period
* and filter type.
*
* @param {object} calendarHandle The calendar jQuery object.
* @param {int} recordId The selected record id.
* @param {string} filterType The filter type, could be either FILTER_TYPE_PROVIDER
* or FILTER_TYPE_SERVICE
* @param {date} startDate Visible start date of the calendar.
* @param {type} endDate Visible end date of the calendar.
*/
refreshCalendarAppointments: function(calendarHandle, recordId, filterType,
startDate, endDate) {
var ajaxUrl = GlobalVariables.baseUrl + 'backend/ajax_get_calendar_appointments';
var postData = {
record_id : recordId,
start_date : startDate.toString('yyyy-MM-dd'),
end_date : endDate.toString('yyyy-MM-dd'),
filter_type : filterType
};
$.post(ajaxUrl, postData, function(response) {
////////////////////////////////////////////////////////////////////
//console.log('Refresh Calendar Appointments Response :', response);
////////////////////////////////////////////////////////////////////
// Add the appointments to the calendar.
var calendarEvents = new Array();
$.each(response, function(index, appointment){
var event = {
id : appointment['id'],
title : appointment['service']['name'],
start : appointment['start_datetime'],
end : appointment['end_datetime'],
allDay : false,
data : appointment // For later use
};
calendarEvents.push(event);
});
calendarHandle.fullCalendar('removeEvents');
calendarHandle.fullCalendar('addEventSource', calendarEvents);
}, 'json');
},
/**
* This method stores the changes of an already registered appointment
* into the database, via an ajax call.
*
* @param {object} appointmentData Contain the new appointment data. The
* id of the appointment MUST be already included.
*/
updateAppointment: function(appointmentData) {
}
};</code></pre>
</article>
</section>
</div>
<nav>
<h2><a href="index.html">Index</a></h2><h3>Namespaces</h3><ul><li><a href="Backend.html">Backend</a></li><li><a href="BackendCalendar.html">BackendCalendar</a></li><li><a href="FrontendBook.html">FrontendBook</a></li><li><a href="GeneralFunctions.html">GeneralFunctions</a></li></ul>
</nav>
<br clear="both">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.2.0-dev</a> on Thu Jun 13 2013 16:52:47 GMT+0300 (EEST)
</footer>
<script> prettyPrint(); </script>
<script src="scripts/linenumber.js"> </script>
</body>
</html>