diff --git a/src/application/controllers/Backend_api.php b/src/application/controllers/Backend_api.php index cac378fc..d2e05eff 100644 --- a/src/application/controllers/Backend_api.php +++ b/src/application/controllers/Backend_api.php @@ -52,6 +52,49 @@ class Backend_api extends CI_Controller { } } + /** + * Get Calendar Events + * + * This method will return all the calendar events within a specified period. + */ + public function ajax_get_calendar_events() { + try { + $this->output->set_content_type('application/json'); + $this->load->model('appointments_model'); + $this->load->model('customers_model'); + $this->load->model('services_model'); + $this->load->model('providers_model'); + + $startDate = $_POST['startDate'] . ' 00:00:00'; + $endDate = $_POST['endDate'] . ' 23:59:59'; + + $response = [ + 'appointments' => $this->appointments_model->get_batch([ + 'is_unavailable' => false, + 'start_datetime >=' => $startDate, + 'end_datetime <=' => $endDate + ]), + 'unavailabilities' => $this->appointments_model->get_batch([ + 'is_unavailable' => true, + 'start_datetime >=' => $startDate, + 'end_datetime <=' => $endDate + ]) + ]; + + foreach($response['appointments'] as &$appointment) { + $appointment['provider'] = $this->providers_model->get_row($appointment['id_users_provider']); + $appointment['service'] = $this->services_model->get_row($appointment['id_services']); + $appointment['customer'] = $this->customers_model->get_row($appointment['id_users_customer']); + } + + $this->output->set_output(json_encode($response)); + } catch(Exception $exc) { + $this->output->set_output(json_encode([ + 'exceptions' => [exceptionToJavaScript($exc)] + ])); + } + } + /** * [AJAX] Get the registered appointments for the given date period and record. * diff --git a/src/assets/js/backend_calendar_default_view.js b/src/assets/js/backend_calendar_default_view.js index e8e6e99c..8f137986 100644 --- a/src/assets/js/backend_calendar_default_view.js +++ b/src/assets/js/backend_calendar_default_view.js @@ -1064,9 +1064,7 @@ window.BackendCalendarDefaultView = window.BackendCalendarDefaultView || {}; eventClick: _calendarEventClick, eventResize: _calendarEventResize, eventDrop: _calendarEventDrop, - eventAfterAllRender: function() { - _convertTitlesToHtml(); - } + eventAfterAllRender: _convertTitlesToHtml }); // Trigger once to set the proper footer position after calendar initialization. diff --git a/src/assets/js/backend_calendar_table_view.js b/src/assets/js/backend_calendar_table_view.js index 1307c923..c34deef2 100644 --- a/src/assets/js/backend_calendar_table_view.js +++ b/src/assets/js/backend_calendar_table_view.js @@ -19,14 +19,241 @@ window.BackendCalendarTableView = window.BackendCalendarTableView || {}; (function(exports) { + 'use strict'; function _bindEventHandlers() { + var $calendarToolbar = $('#calendar-toolbar'); + var $calendar = $('#calendar'); + + $calendar.on('click', '.calendar-header .btn.previous', function() { + var endDate = new Date($('#calendar .date-column:first').data('date')).add({days: -1}); + var startDate = new Date(endDate.getTime()).add({days: -1 * (parseInt($('#select-filter-item').val()) - 1)}); + _createView(startDate, endDate); + }); + + $calendar.on('click', '.calendar-header .btn.next', function() { + var startDate = new Date($('#calendar .date-column:last').data('date')).add({days: 1}); + var endDate = new Date(startDate.getTime()).add({days: parseInt($('#select-filter-item').val()) - 1}); + _createView(startDate, endDate); + }); + + // @todo reload appts event + + // @todo click slot shows appointments modal + } + + function _createHeader() { + var $calendarFilter = $('#calendar-filter'); + + $calendarFilter + .find('select') + .empty() + .append(new Option('1 Days', 1)) + .append(new Option('4 Days', 4)); + + var $calendarHeader = $('
').appendTo('#calendar'); + + $calendarHeader + .html( + '' + + '' + ); + } + + /** + * Create table schedule view. + * + * This method will destroy any previous instances and create a new view for displaying the appointments in + * a table format. + * + * @param {Date} startDate Start date to be displayed. + * @param {Date} endDate End date to be displayed. + */ + function _createView(startDate, endDate) { + $('#calendar .calendar-view').remove(); + + var $calendarView = $('').appendTo('#calendar'); + + $calendarView.data({ + startDate: startDate.toString('yyyy-MM-dd'), + endDate: endDate.toString('yyyy-MM-dd') + }); + + _getCalendarEvents(startDate, endDate) + .done(function(response) { + if (!GeneralFunctions.handleAjaxExceptions(response)) { + return; + } + + var currentDate = startDate; + + while(currentDate <= endDate) { + _createDateColumn($calendarView, currentDate, response); + currentDate.add({days: 1}); + } + }) + .fail(GeneralFunctions.ajaxFailureHandler); + } - exports.initialize = function() { + function _createDateColumn($calendarView, date, events) { + var $dateColumn = $('').appendTo($calendarView); + $dateColumn + .data('date', date.getTime()) + .append('