/*+***********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
*************************************************************************************/
Calendar_CalendarView_Js("SharedCalendar_SharedCalendarView_Js",{
currentInstance : false,
initiateCalendarFeeds : function() {
Calendar_CalendarView_Js.currentInstance.performCalendarFeedIntiate();
}
},{
multipleEvents : {},
getAllUserColors : function() {
var result = {};
var calendarfeeds = jQuery('[data-calendar-feed]');
calendarfeeds.each(function(index,element){
var feedcheckbox = jQuery(element);
var disabledOnes = app.cacheGet('calendar.feeds.disabled',[]);
if (disabledOnes.indexOf(feedcheckbox.data('calendar-sourcekey')) == -1) {
feedcheckbox.attr('checked',true);
var id = feedcheckbox.data('calendar-userid');
result[id] = feedcheckbox.data('calendar-feed-color')+','+feedcheckbox.data('calendar-feed-textcolor');
}
});
return result;
},
fetchAllCalendarFeeds : function() {
var thisInstance = this;
var calendarfeeds = jQuery('[data-calendar-feed]');
calendarfeeds.each(function(index,element){
var feedcheckbox = jQuery(element);
thisInstance.fetchCalendarFeed(feedcheckbox);
});
this.multipleEvents = false;
},
toDateString : function(date) {
var d = date.getDate();
var m = date.getMonth() +1;
var y = date.getFullYear();
d = (d <= 9)? ("0"+d) : d;
m = (m <= 9)? ("0"+m) : m;
return y + "-" + m + "-" + d;
},
fetchCalendarFeed : function(feedcheckbox) {
var thisInstance = this;
//var type = feedcheckbox.data('calendar-sourcekey');
this.calendarfeedDS[feedcheckbox.data('calendar-sourcekey')] = function(start, end, callback) {
if(typeof thisInstance.multipleEvents != 'undefined' && thisInstance.multipleEvents != false){
var events = thisInstance.multipleEvents[feedcheckbox.data('calendar-userid')];
if(events !== false) {
callback(events);
return;
}
}
if(feedcheckbox.not(':checked').length > 0) {
callback([]);
return;
}
feedcheckbox.attr('disabled', true);
var params = {
module: 'Calendar',
action: 'Feed',
start: thisInstance.toDateString(start),
end: thisInstance.toDateString(end),
type: feedcheckbox.data('calendar-feed'),
userid : feedcheckbox.data('calendar-userid'),
color : feedcheckbox.data('calendar-feed-color'),
textColor : feedcheckbox.data('calendar-feed-textcolor')
}
AppConnector.request(params).then(function(events){
callback(events);
feedcheckbox.attr('disabled', false).attr('checked', true);
},
function(error){
//To send empty events if error occurs
callback([]);
});
}
this.getCalendarView().fullCalendar('addEventSource', this.calendarfeedDS[feedcheckbox.data('calendar-sourcekey')]);
},
allocateColorsForAllUsers : function() {
var calendarfeeds = jQuery('[data-calendar-feed]');
calendarfeeds.each(function(index,element){
var feedUserElement = jQuery(element);
var feedUserLabel = feedUserElement.closest('.addedCalendars').find('.label');
var sourcekey = feedUserElement.data('calendar-sourcekey');
var color = feedUserElement.data('calendar-feed-color');
if(color == '' || typeof color == 'undefined') {
color = app.cacheGet(sourcekey);
if(color != null){
} else {
color = '#'+(0x1000000+(Math.random())*0xffffff).toString(16).substr(1,6);
app.cacheSet(sourcekey, color);
}
feedUserElement.data('calendar-feed-color',color);
feedUserLabel.css({'background-color':color});
}
var colorContrast = app.getColorContrast(color.slice(1));
if(colorContrast == 'light') {
var textColor = 'black'
} else {
textColor = 'white'
}
feedUserElement.data('calendar-feed-textcolor',textColor);
feedUserLabel.css({'color':textColor});
});
},
fetchAllEvents : function() {
var thisInstance = this;
var result = this.getAllUserColors();
var params = {
module: 'Calendar',
action: 'Feed',
start: thisInstance.toDateString(thisInstance.getCalendarView().fullCalendar('getView').visStart),
end: thisInstance.toDateString(thisInstance.getCalendarView().fullCalendar('getView').visEnd),
type: 'MultipleEvents',
mapping : result
}
AppConnector.request(params).then(function(multipleEvents){
thisInstance.multipleEvents = multipleEvents;
thisInstance.fetchAllCalendarFeeds();
},
function(error){
});
},
isAllowedToAddCalendarEvent : function(calendarDetails){
var assignedUserId = calendarDetails.assigned_user_id.value;
if(jQuery('[data-calendar-userid='+assignedUserId+']').is(':checked')) {
return true;
} else {
return false;
}
},
addCalendarEvent : function(calendarDetails) {
if(calendarDetails.activitytype.value == 'Task'){
var msg = app.vtranslate('JS_TASK_IS_SUCCESSFULLY_ADDED_TO_YOUR_CALENDAR');
var customParams = {
text : msg,
type: 'info'
}
Vtiger_Helper_Js.showPnotify(customParams);
return;
} else {
this._super(calendarDetails);
}
},
/**
* Function used to delete user calendar
*/
deleteCalendarView : function(feedcheckbox) {
var aDeferred = jQuery.Deferred();
var thisInstance = this;
var params = {
module: 'Calendar',
action: 'CalendarUserActions',
mode : 'deleteUserCalendar',
userid : feedcheckbox.data('calendar-userid')
}
AppConnector.request(params).then(function(response) {
var result = response['result'];
feedcheckbox.closest('.addedCalendars').remove();
//After delete user reset accodion height to auto
thisInstance.resetAccordionHeight();
//Remove the events of deleted user in shared calendar feed
thisInstance.getCalendarView().fullCalendar('removeEventSource', thisInstance.calendarfeedDS[feedcheckbox.data('calendar-sourcekey')]);
//Update the adding and editing users list in hidden modal
var userSelectElement = jQuery('#calendarview-feeds').find('[name="usersCalendarList"]');
userSelectElement.append('');
var editUserSelectElement = jQuery('#calendarview-feeds').find('[name="editingUsersList"]');
editUserSelectElement.find('option[value="'+result['sharedid']+'"]').remove();
jQuery('#calendarview-feeds').find('.invisibleCalendarViews').val('true');
aDeferred.resolve();
},
function(error){
aDeferred.reject();
});
return aDeferred.promise();
},
/**
* Function to register event for edit user calendar color
*/
registerEventForEditUserCalendar : function() {
var thisInstance = this;
var parentElement = jQuery('#calendarview-feeds');
parentElement.on('click', '.editCalendarColor', function(e) {
e.preventDefault();
var currentTarget = jQuery(e.currentTarget);
var addedCalendarEle = currentTarget.closest('.addedCalendars');
var feedUserEle = addedCalendarEle.find('[data-calendar-feed]');
var editCalendarViewsList = jQuery('#calendarview-feeds').find('.editCalendarViewsList');
var selectElement = editCalendarViewsList.find('[name="editingUsersList"]');
selectElement.find('option:selected').removeAttr('selected');
selectElement.find('option[value="'+feedUserEle.data('calendar-userid')+'"]').attr('selected', true);
thisInstance.showAddUserCalendarModal(currentTarget);
})
},
/**
* Function to register change event for users list select element in edit user calendar modal
*/
registerViewsListChangeEvent : function(data) {
var parentElement = jQuery('#calendarview-feeds');
var selectElement = data.find('[name="editingUsersList"]');
var selectedUserColor = data.find('.selectedUserColor');
//on change of edit user, update color picker with the selected user color
selectElement.on('change', function() {
var userid = selectElement.find('option:selected').val();
var userColor = jQuery('[data-calendar-userid="'+userid+'"]', parentElement).data('calendar-feed-color');
selectedUserColor.val(userColor);
data.find('.calendarColorPicker').ColorPickerSetColor(userColor)
});
},
/**
* Function to save added user calendar
*/
saveUserCalendar : function(data, currentEle) {
var thisInstance = this;
var userColor = data.find('.selectedUserColor').val();
var userId = data.find('.selectedUser').val();
var userName = data.find('.selectedUser').data('username');
var params = {
module: 'Calendar',
action: 'CalendarUserActions',
mode : 'addUserCalendar',
selectedUser : userId,
selectedColor : userColor
};
AppConnector.request(params).then(function() {
app.hideModalWindow();
var parentElement = jQuery('#calendarview-feeds');
var colorContrast = app.getColorContrast(userColor.slice(1));
if(colorContrast == 'light') {
var textColor = 'black'
} else {
textColor = 'white'
}
if(data.find('.userCalendarMode').val() == 'edit') {
var feedUserEle = jQuery('[data-calendar-userid="'+userId+'"]', parentElement);
feedUserEle.data('calendar-feed-color',userColor).data('calendar-feed-textcolor',textColor);
feedUserEle.closest('.addedCalendars').find('.label').css({'background-color':userColor,'color':textColor});
thisInstance.getCalendarView().fullCalendar('removeEventSource', thisInstance.calendarfeedDS[feedUserEle.data('calendar-sourcekey')]);
thisInstance.fetchCalendarFeed(feedUserEle);
//notification message
var message = app.vtranslate('JS_CALENDAR_VIEW_COLOR_UPDATED_SUCCESSFULLY');
} else {
var labelModal = jQuery('.labelModal', parentElement);
var clonedContainer = labelModal.clone(true, true);
var labelView = clonedContainer.find('label');
feedUserEle = labelView.find('[type="checkbox"]');
feedUserEle.attr('checked', 'checked');
feedUserEle.attr('data-calendar-feed-color',userColor).attr('data-calendar-feed', 'Events').attr('data-calendar-userid', userId)
.attr('data-calendar-sourcekey', 'Events33_'+userId).attr('data-calendar-feed-textcolor',textColor);
feedUserEle.closest('.addedCalendars').find('.label').css({'background-color':userColor,'color':textColor}).text(userName);
parentElement.append(labelView);
//After add user reset accodion height to auto
thisInstance.resetAccordionHeight();
thisInstance.fetchCalendarFeed(feedUserEle);
//Update the adding and editing users list in hidden modal
var userSelectElement = jQuery('#calendarview-feeds').find('[name="usersCalendarList"]');
userSelectElement.find('option[value="'+userId+'"]').remove();
if(userSelectElement.find('option').length <= 0) {
jQuery('#calendarview-feeds').find('.invisibleCalendarViews').val('false');
}
var editUserSelectElement = jQuery('#calendarview-feeds').find('[name="editingUsersList"]');
editUserSelectElement.append('');
//notification message
var message = app.vtranslate('JS_CALENDAR_VIEW_ADDED_SUCCESSFULLY');
}
//show notification after add or edit user
var params = {
text: message,
type: 'info'
};
Vtiger_Helper_Js.showPnotify(params);
},
function(error){
});
},
performCalendarFeedIntiate : function() {
this.allocateColorsForAllUsers();
this.fetchAllEvents();
this.registerCalendarFeedChange();
this.registerEventForDeleteUserCalendar();
this.registerEventForEditUserCalendar();
this.resetAccordionHeight();
},
restoreAddCalendarWidgetState : function() {
var key = 'Calendar_sideBar_LBL_ADDED_CALENDARS';
var value = app.cacheGet(key);
var widgetContainer = jQuery("#Calendar_sideBar_LBL_ADDED_CALENDARS");
if(value == 0){
Vtiger_Index_Js.loadWidgets(widgetContainer,false);
}
else{
Vtiger_Index_Js.loadWidgets(widgetContainer);
}
},
registerEvents : function() {
this._super();
this.restoreAddCalendarWidgetState();
return this;
}
});