502 lines
20 KiB
JavaScript
502 lines
20 KiB
JavaScript
/*+***********************************************************************************
|
|
* 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.
|
|
*************************************************************************************/
|
|
|
|
jQuery.Class("Vtiger_Header_Js", {
|
|
quickCreateModuleCache: {},
|
|
self: false,
|
|
getInstance: function() {
|
|
if (this.self != false) {
|
|
return this.self;
|
|
}
|
|
this.self = new Vtiger_Header_Js();
|
|
return this.self;
|
|
}
|
|
}, {
|
|
menuContainer: false,
|
|
contentContainer: false,
|
|
quickCreateCallBacks: [],
|
|
init: function() {
|
|
this.setMenuContainer('.navbar-fixed-top').setContentsContainer('.mainContainer');
|
|
},
|
|
setMenuContainer: function(element) {
|
|
if (element instanceof jQuery) {
|
|
this.menuContainer = element;
|
|
} else {
|
|
this.menuContainer = jQuery(element);
|
|
}
|
|
return this;
|
|
},
|
|
getMenuContainer: function() {
|
|
return this.menuContainer;
|
|
},
|
|
setContentsContainer: function(element) {
|
|
if (element instanceof jQuery) {
|
|
this.contentContainer = element;
|
|
} else {
|
|
this.contentContainer = jQuery(element);
|
|
}
|
|
return this;
|
|
},
|
|
getContentsContainer: function() {
|
|
return this.contentContainer;
|
|
},
|
|
getQuickCreateForm: function(url, moduleName, params) {
|
|
var thisInstance = this;
|
|
var aDeferred = jQuery.Deferred();
|
|
var requestParams;
|
|
if (typeof params == 'undefined') {
|
|
params = {};
|
|
}
|
|
if ((!params.noCache) || (typeof (params.noCache) == "undefined")) {
|
|
if (typeof Vtiger_Header_Js.quickCreateModuleCache[moduleName] != 'undefined') {
|
|
aDeferred.resolve(Vtiger_Header_Js.quickCreateModuleCache[moduleName]);
|
|
return aDeferred.promise();
|
|
}
|
|
}
|
|
requestParams = url;
|
|
if (typeof params.data != "undefined") {
|
|
var requestParams = {};
|
|
requestParams['data'] = params.data;
|
|
requestParams['url'] = url;
|
|
}
|
|
AppConnector.request(requestParams).then(function(data) {
|
|
if ((!params.noCache) || (typeof (params.noCache) == "undefined")) {
|
|
Vtiger_Header_Js.quickCreateModuleCache[moduleName] = data;
|
|
}
|
|
aDeferred.resolve(data);
|
|
});
|
|
return aDeferred.promise();
|
|
},
|
|
registerQuickCreateCallBack: function(callBackFunction) {
|
|
if (typeof callBackFunction != 'function') {
|
|
return false;
|
|
}
|
|
this.quickCreateCallBacks.push(callBackFunction);
|
|
return true;
|
|
},
|
|
/**
|
|
* Function which will align the contents container at specified height depending on the top fixed menu
|
|
* It will caliculate the height by following formaula menuContianer.height+1 *
|
|
*/
|
|
alignContentsContainer: function(topValue,speed, effect) {
|
|
if (typeof topValue == 'undefined') {
|
|
topValue = '90px';
|
|
}
|
|
var contentsContainer = this.getContentsContainer();
|
|
contentsContainer.animate({'margin-top': topValue}, speed, effect);
|
|
return this;
|
|
},
|
|
/**
|
|
* Function to save the quickcreate module
|
|
* @param accepts form element as parameter
|
|
* @return returns deferred promise
|
|
*/
|
|
quickCreateSave: function(form) {
|
|
var aDeferred = jQuery.Deferred();
|
|
var quickCreateSaveUrl = form.serializeFormData();
|
|
AppConnector.request(quickCreateSaveUrl).then(
|
|
function(data) {
|
|
//TODO: App Message should be shown
|
|
aDeferred.resolve(data);
|
|
},
|
|
function(textStatus, errorThrown) {
|
|
aDeferred.reject(textStatus, errorThrown);
|
|
}
|
|
);
|
|
return aDeferred.promise();
|
|
},
|
|
/**
|
|
* Function to navigate from quickcreate to editView Fullform
|
|
* @param accepts form element as parameter
|
|
*/
|
|
quickCreateGoToFullForm: function(form, editViewUrl) {
|
|
var formData = form.serializeFormData();
|
|
//As formData contains information about both view and action removed action and directed to view
|
|
delete formData.module;
|
|
delete formData.action;
|
|
var formDataUrl = jQuery.param(formData);
|
|
var completeUrl = editViewUrl + "&" + formDataUrl;
|
|
window.location.href = completeUrl;
|
|
},
|
|
setAnnouncement: function() {
|
|
// var announcementoff = app.cacheGet('announcement.turnoff' , false);
|
|
// var announcementBtn = jQuery('#announcementBtn');
|
|
// var thisInstance = this;
|
|
// if(announcementoff === true) {
|
|
// jQuery('#announcement').hide();
|
|
// announcementBtn.attr('src', app.vimage_path('btnAnnounceOff.png'));
|
|
// thisInstance.alignContentsContainer('69px',0,'linear');
|
|
// }
|
|
// else{
|
|
// jQuery('#announcement').show();
|
|
// announcementBtn.attr('src', app.vimage_path('btnAnnounce.png'));
|
|
// thisInstance.alignContentsContainer('92px',0,'linear');
|
|
// }
|
|
},
|
|
registerAnnouncement: function() {
|
|
var thisInstance = this;
|
|
var announcementBtn = jQuery('#announcementBtn');
|
|
var announcementTurnOffKey = 'announcement.turnoff';
|
|
|
|
announcementBtn.click(function(e, manual) {
|
|
var displayStatus = jQuery('#announcement').css('display');
|
|
if (displayStatus == 'none') {
|
|
jQuery('#announcement').show();
|
|
thisInstance.alignContentsContainer('114px',200,'linear');
|
|
announcementBtn.attr('src', app.vimage_path('btnAnnounce.png'));
|
|
|
|
// Turn-on always
|
|
if (!manual) {
|
|
app.cacheSet(announcementTurnOffKey, false);
|
|
}
|
|
} else {
|
|
thisInstance.alignContentsContainer('90px',200,'linear');
|
|
jQuery('#announcement').hide();
|
|
announcementBtn.attr('src', app.vimage_path('btnAnnounceOff.png'));
|
|
|
|
// Turn-off always
|
|
// NOTE: Add preference on server - to reenable on announcement content change.
|
|
if (!manual) {
|
|
app.cacheSet(announcementTurnOffKey, true);
|
|
}
|
|
|
|
}
|
|
});
|
|
|
|
if (app.cacheGet(announcementTurnOffKey, false)) {
|
|
announcementBtn.trigger('click', true);
|
|
}
|
|
},
|
|
registerCalendarButtonClickEvent: function() {
|
|
var element = jQuery('#calendarBtn');
|
|
var dateFormat = element.data('dateFormat');
|
|
var currentDate = element.data('date');
|
|
var vtigerDateFormat = app.convertToDatePickerFormat(dateFormat);
|
|
element.on('click', function(e) {
|
|
e.stopImmediatePropagation();
|
|
element.closest('div.nav').find('div.open').removeClass('open');
|
|
var calendar = jQuery('#' + element.data('datepickerId'));
|
|
if (jQuery(calendar).is(':visible')) {
|
|
element.DatePickerHide();
|
|
} else {
|
|
element.DatePickerShow();
|
|
}
|
|
})
|
|
element.DatePicker({
|
|
format: vtigerDateFormat,
|
|
date: currentDate,
|
|
calendars: 1,
|
|
starts: 1,
|
|
className: 'globalCalendar'
|
|
});
|
|
},
|
|
handleQuickCreateData: function(data, params) {
|
|
if (typeof params == 'undefined') {
|
|
params = {};
|
|
}
|
|
var thisInstance = this;
|
|
app.showModalWindow(data, function(data) {
|
|
var quickCreateForm = data.find('form[name="QuickCreate"]');
|
|
var moduleName = quickCreateForm.find('[name="module"]').val();
|
|
var editViewInstance = Vtiger_Edit_Js.getInstanceByModuleName(moduleName);
|
|
editViewInstance.registerBasicEvents(quickCreateForm);
|
|
quickCreateForm.validationEngine(app.validationEngineOptions);
|
|
if (typeof params.callbackPostShown != "undefined") {
|
|
params.callbackPostShown(quickCreateForm);
|
|
}
|
|
thisInstance.registerQuickCreatePostLoadEvents(quickCreateForm, params);
|
|
app.registerEventForDatePickerFields(quickCreateForm);
|
|
var quickCreateContent = quickCreateForm.find('.quickCreateContent');
|
|
var quickCreateContentHeight = quickCreateContent.height();
|
|
var contentHeight = parseInt(quickCreateContentHeight);
|
|
if (contentHeight > 300) {
|
|
app.showScrollBar(jQuery('.quickCreateContent'), {
|
|
'height': '300px'
|
|
});
|
|
}
|
|
});
|
|
},
|
|
registerQuickCreatePostLoadEvents: function(form, params) {
|
|
var thisInstance = this;
|
|
var submitSuccessCallbackFunction = params.callbackFunction;
|
|
var goToFullFormCallBack = params.goToFullFormcallback;
|
|
if (typeof submitSuccessCallbackFunction == 'undefined') {
|
|
submitSuccessCallbackFunction = function() {
|
|
};
|
|
}
|
|
|
|
form.on('submit', function(e) {
|
|
var form = jQuery(e.currentTarget);
|
|
var module = form.find('[name="module"]').val();
|
|
//Form should submit only once for multiple clicks also
|
|
if (typeof form.data('submit') != "undefined") {
|
|
return false;
|
|
} else {
|
|
var invalidFields = form.data('jqv').InvalidFields;
|
|
|
|
if (invalidFields.length > 0) {
|
|
//If validation fails, form should submit again
|
|
form.removeData('submit');
|
|
form.closest('#globalmodal').find('.modal-header h3').progressIndicator({
|
|
'mode': 'hide'
|
|
});
|
|
e.preventDefault();
|
|
return;
|
|
} else {
|
|
//Once the form is submiting add data attribute to that form element
|
|
form.data('submit', 'true');
|
|
form.closest('#globalmodal').find('.modal-header h3').progressIndicator({
|
|
smallLoadingImage: true,
|
|
imageContainerCss: {
|
|
display: 'inline',
|
|
'margin-left': '18%',
|
|
position: 'absolute'
|
|
}
|
|
});
|
|
}
|
|
|
|
var recordPreSaveEvent = jQuery.Event(Vtiger_Edit_Js.recordPreSave);
|
|
form.trigger(recordPreSaveEvent, {
|
|
'value': 'edit',
|
|
'module': module
|
|
});
|
|
if (!(recordPreSaveEvent.isDefaultPrevented())) {
|
|
var targetInstance = thisInstance;
|
|
var moduleInstance = Vtiger_Edit_Js.getInstanceByModuleName(module);
|
|
if(typeof(moduleInstance.quickCreateSave) === 'function'){
|
|
targetInstance = moduleInstance;
|
|
}
|
|
|
|
targetInstance.quickCreateSave(form).then(
|
|
function(data) {
|
|
app.hideModalWindow();
|
|
//fix for Refresh list view after Quick create
|
|
var parentModule=app.getModuleName();
|
|
var viewname=app.getViewName();
|
|
if((module == parentModule) && (viewname=="List")){
|
|
var listinstance = new Vtiger_List_Js();
|
|
listinstance.getListViewRecords();
|
|
}
|
|
submitSuccessCallbackFunction(data);
|
|
var registeredCallBackList = thisInstance.quickCreateCallBacks;
|
|
for (var index = 0; index < registeredCallBackList.length; index++) {
|
|
var callBack = registeredCallBackList[index];
|
|
callBack({
|
|
'data': data,
|
|
'name': form.find('[name="module"]').val()
|
|
});
|
|
}
|
|
},
|
|
function(error, err) {
|
|
}
|
|
);
|
|
} else {
|
|
//If validation fails in recordPreSaveEvent, form should submit again
|
|
form.removeData('submit');
|
|
form.closest('#globalmodal').find('.modal-header h3').progressIndicator({
|
|
'mode': 'hide'
|
|
});
|
|
}
|
|
e.preventDefault();
|
|
}
|
|
});
|
|
|
|
form.find('#goToFullForm').on('click', function(e) {
|
|
var form = jQuery(e.currentTarget).closest('form');
|
|
var editViewUrl = jQuery(e.currentTarget).data('editViewUrl');
|
|
if (typeof goToFullFormCallBack != "undefined") {
|
|
goToFullFormCallBack(form);
|
|
}
|
|
thisInstance.quickCreateGoToFullForm(form, editViewUrl);
|
|
});
|
|
|
|
this.registerTabEventsInQuickCreate(form);
|
|
},
|
|
registerTabEventsInQuickCreate: function(form) {
|
|
var tabElements = form.find('.nav.nav-pills , .nav.nav-tabs').find('a');
|
|
|
|
//This will remove the name attributes and assign it to data-element-name . We are doing this to avoid
|
|
//Multiple element to send as in calendar
|
|
var quickCreateTabOnHide = function(tabElement) {
|
|
var container = jQuery(tabElement.attr('data-target'));
|
|
|
|
container.find('[name]').each(function(index, element) {
|
|
element = jQuery(element);
|
|
element.attr('data-element-name', element.attr('name')).removeAttr('name');
|
|
});
|
|
}
|
|
|
|
//This will add the name attributes and get value from data-element-name . We are doing this to avoid
|
|
//Multiple element to send as in calendar
|
|
var quickCreateTabOnShow = function(tabElement) {
|
|
var container = jQuery(tabElement.attr('data-target'));
|
|
|
|
container.find('[data-element-name]').each(function(index, element) {
|
|
element = jQuery(element);
|
|
element.attr('name', element.attr('data-element-name')).removeAttr('data-element-name');
|
|
});
|
|
}
|
|
|
|
tabElements.on('shown', function(e) {
|
|
var previousTab = jQuery(e.relatedTarget);
|
|
var currentTab = jQuery(e.currentTarget);
|
|
|
|
quickCreateTabOnHide(previousTab);
|
|
quickCreateTabOnShow(currentTab);
|
|
|
|
//while switching tabs we have to clear the invalid fields list
|
|
form.data('jqv').InvalidFields = [];
|
|
|
|
});
|
|
|
|
//To show aleady non active element , this we are doing so that on load we can remove name attributes for other fields
|
|
quickCreateTabOnHide(tabElements.closest('li').filter(':not(.active)').find('a'));
|
|
},
|
|
basicSearch: function() {
|
|
var thisInstance = this;
|
|
jQuery('#globalSearchValue').keypress(function(e) {
|
|
var currentTarget = jQuery(e.currentTarget)
|
|
if (e.which == 13) {
|
|
thisInstance.labelSearch(currentTarget);
|
|
}
|
|
});
|
|
},
|
|
labelSearch: function(currentTarget) {
|
|
var val = currentTarget.val();
|
|
if (val == '') {
|
|
alert(app.vtranslate('JS_PLEASE_ENTER_SOME_VALUE'));
|
|
currentTarget.focus();
|
|
return false;
|
|
}
|
|
var basicSearch = new Vtiger_BasicSearch_Js();
|
|
var progress = jQuery.progressIndicator();
|
|
basicSearch.search(val).then(function(data) {
|
|
basicSearch.showSearchResults(data);
|
|
progress.progressIndicator({
|
|
'mode': 'hide'
|
|
});
|
|
});
|
|
},
|
|
|
|
adjustContentHeight: function(){
|
|
if(app.getViewName() === 'Detail' || app.getViewName() === 'Calendar' || app.getViewName() === 'ExtensionImport'){
|
|
if(jQuery('div.detailViewInfo > .related').outerHeight() > jQuery('div.detailViewInfo > div.details ').outerHeight()){
|
|
jQuery('div.detailViewInfo > div.details').css('min-height',jQuery('.detailViewInfo > .related').outerHeight());
|
|
}
|
|
bodyHeight = jQuery('div.detailViewContainer').outerHeight();
|
|
}else{
|
|
bodyHeight = jQuery(".bodyContents").outerHeight();
|
|
}
|
|
jQuery(".mainContainer").css('min-height', bodyHeight);
|
|
jQuery(".mainContainer > .span2 ").css('min-height', bodyHeight);
|
|
jQuery(".contentsDiv").css('min-height', bodyHeight);
|
|
},
|
|
|
|
registerEvents: function() {
|
|
var thisInstance = this;
|
|
|
|
//Show Alert if user is on a unsupported browser (IE7, IE8, ..etc)
|
|
if(jQuery.browser.msie && jQuery.browser.version < 9.0) {
|
|
if(app.getCookie('oldbrowser') != 'true') {
|
|
app.setCookie("oldbrowser",true, 365);
|
|
window.location.href = 'layouts/vlayout/modules/Vtiger/browsercompatibility/Browser_compatibility.html';
|
|
}
|
|
}
|
|
|
|
jQuery('#globalSearch').click(function() {
|
|
var advanceSearchInstance = new Vtiger_AdvanceSearch_Js();
|
|
advanceSearchInstance.initiateSearch().then(function() {
|
|
advanceSearchInstance.selectBasicSearchValue();
|
|
});
|
|
});
|
|
jQuery('#searchIcon').on('click', function(e) {
|
|
var currentTarget = jQuery('#globalSearchValue');
|
|
var pressEvent = jQuery.Event("keypress");
|
|
pressEvent.which = 13;
|
|
currentTarget.trigger(pressEvent);
|
|
});
|
|
thisInstance.registerAnnouncement();
|
|
//this.setAnnouncement();
|
|
jQuery('#announcementBtn').trigger('click');
|
|
|
|
this.registerCalendarButtonClickEvent();
|
|
jQuery('#moreMenu').click(function(e) {
|
|
var moreElem = jQuery(e.currentTarget);
|
|
var moreMenu = jQuery('.moreMenus', moreElem)
|
|
var index = jQuery(".modulesList > li", thisInstance.getMenuContainer()).length;
|
|
// for left aligning the more menus dropdown if the modules list is below 5
|
|
if (index < 5) {
|
|
moreMenu.css('left', 0).addClass('leftAligned');
|
|
}
|
|
});
|
|
|
|
//After selecting the global search module, focus the input element to type
|
|
jQuery('#basicSearchModulesList').change(function() {
|
|
jQuery('#globalSearchValue').focus();
|
|
});
|
|
|
|
thisInstance.basicSearch();
|
|
jQuery('#quickCreateModules,#compactquickCreate').on("click", ".quickCreateModule", function(e, params) {
|
|
if (typeof params == 'undefined') {
|
|
params = {};
|
|
}
|
|
|
|
if (typeof params.callbackFunction == 'undefined') {
|
|
params.callbackFunction = function() {
|
|
};
|
|
}
|
|
|
|
var quickCreateElem = jQuery(e.currentTarget);
|
|
var quickCreateUrl = quickCreateElem.data('url');
|
|
var quickCreateModuleName = quickCreateElem.data('name');
|
|
|
|
var progress = jQuery.progressIndicator();
|
|
thisInstance.getQuickCreateForm(quickCreateUrl, quickCreateModuleName, params).then(function(data) {
|
|
thisInstance.handleQuickCreateData(data, params);
|
|
progress.progressIndicator({
|
|
'mode': 'hide'
|
|
});
|
|
});
|
|
|
|
});
|
|
if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ){
|
|
jQuery('#basicSearchModulesList_chzn').find('.chzn-results').css({'max-height':'350px','overflow-y':'scroll'});
|
|
}
|
|
else{
|
|
app.showScrollBar(jQuery('#basicSearchModulesList_chzn').find('.chzn-results'),
|
|
{
|
|
height: '450px',
|
|
railVisible: true,
|
|
alwaysVisible: true,
|
|
size: '6px'
|
|
});
|
|
|
|
|
|
|
|
//Added to support standard resolution 1024x768
|
|
if (window.outerWidth <= 1024) {
|
|
$('.headerLinksContainer').css('margin-right', '8px');
|
|
}
|
|
|
|
// setting sidebar Height wrt Content
|
|
$(document).ajaxComplete(function() {
|
|
Vtiger_Header_Js.getInstance().adjustContentHeight();
|
|
});
|
|
$(document).load(function() {
|
|
Vtiger_Header_Js.getInstance().adjustContentHeight();
|
|
});
|
|
}
|
|
}
|
|
});
|
|
jQuery(document).ready(function() {
|
|
|
|
|
|
Vtiger_Header_Js.getInstance().registerEvents();
|
|
|
|
}); |