Calendar Configuration Example
Calendar Module can be helpful to track all the worklogs and also be able to directly modify their duration or start date. First of all, create a calendar entity called “Worklog Calendar” and then configure the main part, which is the source.
This calendar will be based on the ‘started_at’ field of the activity model.
- collection_code
// Retrieve the activity collection and filter it by type of worklog.
$collection = Deep::getResourceModel('deep_activity/activity_collection') ->addFieldToFilter('model_alias','deep_service/operation')->addFieldToFilter('type',2);
// A time range is set on the started_at field, by using $start and $end variables , which correspond to ‘start_date_field’ and ‘end_date_field’.
$collection->addFieldToFilter('started_at', ['gteq' => $start]);
$collection->addFieldToFilter('started_at', ['lteq' => $end]);
// A join operation is performed on the activity collection, in order to access service operation fields and display them on the calendar
$collection->getSelect()->join(
array('operation_table'=>'deep_service_operation'),
'main_table.model_id = operation_table.entity_id',
['assigned_username'=>'operation_table.assigned_username','ticket_title'=>'operation_table.title' ,'assigned_group_id'=>'operation_table.assigned_group_id',
'ticket_status'=>'operation_table.status','operation_type'=>'operation_table.type_id']);
// it applies the filters selected on the calendar
$this->applyFilters($collection);
//Loop through each worklog
foreach ($collection as $worklog)
{
// set the accurate timezone for the start date that comes from database
$startEvent = $this->convertToTimezone($worklog->getStartedAt());
// calculate the end of the worklog by using duration field
$endDate = date_create_from_format('Y-m-d H:i:s',$startEvent);
$duration = $worklog->getDuration();
$endDate->modify("+ $duration second");
$endDate = $endDate->format('Y-m-d H:i:s');
// convert end date to an accurate timezone
$endEvent = $this->convertToTimezone($endDate);
// Retrieve the url of the ticket
$modelUrl = Deep::getUrl('*/service_operation/edit',['id'=>$worklog->getModelId()]);
// Retrieve the User who create the worklog
$createdByUser = Deep::getModel('deep_admin/user')->loadByUsername($worklog->getCreatedBy())->getDisplayUsername();
// worklog data is loaded and then converted to an array
$worklog->loadTypeData();
$worklog->toArray();
// set the ticket Url as an array element
$worklog['model_url'] = $modelUrl;
// check if start date and end date are populated correctly, then add the current worklog as an event in the calendar.
if($worklog->getStartedAt() !='' && $start !='' && $end !='')
{
$this->addEvent($startEvent,$endEvent,$worklog);
}
}
- Event_name
/* event variable is a javascript object that is populated with all worklog’s fields. The syntax to access a field is event.” Field name”, in this case ticket_title field is used.
On this section an html text element should be returned, such as , etc.
*/
const eventTitle = ""+event.item.ticket_title+"";
return eventTitle;
- drop_code
// load worklog by using the $item variable, which is an array with all worklog’s fields.
$worklog = Deep::getModel('deep_activity/activity')->load($item['entity_id']);
// check if $start is set after the event is dropped
if ($start)
{
// Set started_at field to the new start date and save the model
$worklog->setData('started_at',$this->convertToSystemTimezone($start));
$worklog->save();
}
- Tooltip_code
// create a main div element to wrap the tooltip
var html = jQuery('');
// create an element to contain the start_date field
var startDateContainer = jQuery('');
var startedAt = new Date(event.item.started_at+'+00:00');
// Set start date to the right timezone and date format
startedAt = startedAt.toLocaleString('it-IT',{timeZone:'Europe/Rome', day:"2-digit",month:"2-digit",year:"numeric",hour: '2-digit', minute:'2-digit'});
// modify the text of the start_at element by adding its value
startDateContainer.text("Started At: "+startedAt);
// add styles to its text
startDateContainer.css('padding', '5px 0');
startDateContainer.css('font-weight', 'bold');
// append the started_at element to the main div
html.append(startDateContainer);
// create a paragraph element that will contain the ‘created by user
var createdByContainer = jQuery('');
createdByContainer.text('Technician: ' + event.item.technician);
createdByContainer.css('padding', '5px 0');
createdByContainer.css('font-weight', 'bold');
html.append(createdByContainer);
// select the element which is an event on the calendar, and initialize tooltip with specific configurations.
jQuery(element).tooltipster({
theme: "tooltipster-shadow", // specify the tooltip theme
interactive: true, // Makes the tooltip content interactive
side: "right", // positions the tooltip on the right side of the target element
content: html // append the above created tooltip to the content
});
// adds an onclick event listener the element, which opens the ticket where the worklog is added
jQuery(element).on('click', function(){
window.open(event.item.model_url, '_blank');
});
- drop_js_code
// create a confirm box to warn the user about dropping the event
if (confirm('Are you sure?'))
return true; // if confirmed event is dropped
else
return false;
Filters
Worklogs will be filtered by : Ticket Status, Ticket Type, Assigned Group and Assigned user.
- html_element
$statusList = Deep::helper('deep_list')->loadListValues('service_operation_status')->toOptionHash(); // Retrieve operation status values
// retrieve operation types
$operationTypes = Deep::getResourceModel('deep_service/type_collection')->toOptionHash();
// retrieve groups values
$groups = Deep::getResourceModel('deep_group/group_collection')->toOptionHash();
$users =[];
// Every filter is added by using $this->addField()
$this->addField(
'operation_table.status', // filter name which should be unique
'select', // filter field type
array(
'label' => ' Ticket Status', // filter label
'name' => ''operation_table.status', // filter name
'multiple' => 'multiple', // sets this filter as multiselect
'values' => $statusList // set the values from which the select will filter
)
);
$this->addField(
'operation_table.type_id',
'select',
array(
'label' => 'Service Type',
'name' => 'type_id',
'multiple' => 'multiple',
'values' => $operationTypes
));
' Assigned Group',
'name' => 'operation_table.assigned_group_id',
'multiple' => 'multiple',
'values' => $groups
));
- collection_code
// loop through all the filters and filter the collection based the column name.
// In this case it is required that filter and collection field have the same name
foreach ( $this->getRequestFilter() as $k => $v){
if ($v)
{
$collection->addFieldToFilter($k, ['in' => $v]);
}
}