PATH:
home
/
letacommog
/
crmleta
/
layouts
/
v7
/
modules
/
Vtiger
/
resources
/*+*********************************************************************************** * 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. *************************************************************************************/ Vtiger.Class("Vtiger_List_Js", { listInstance: false, filterClick: false, getInstance: function () { if (Vtiger_List_Js.listInstance == false) { var module = app.getModuleName(); var parentModule = app.getParentModuleName(); if (parentModule == 'Settings') { var moduleClassName = parentModule + "_" + module + "_List_Js"; if (typeof window[moduleClassName] == 'undefined') { moduleClassName = module + "_List_Js"; } var fallbackClassName = parentModule + "_Vtiger_List_Js"; if (typeof window[fallbackClassName] == 'undefined') { fallbackClassName = "Vtiger_List_Js"; } } else { moduleClassName = module + "_List_Js"; fallbackClassName = "Vtiger_List_Js"; } if (typeof window[moduleClassName] != 'undefined') { var instance = new window[moduleClassName](); } else { var instance = new window[fallbackClassName](); } Vtiger_List_Js.listInstance = instance; return instance; } return Vtiger_List_Js.listInstance; }, triggerMassEdit: function (url) { var listInstance = window.app.controller(); var selectedRecordCount = listInstance.getSelectedRecordCount(); if (selectedRecordCount > 500) { app.helper.showErrorNotification({message: app.vtranslate('JS_MASS_EDIT_LIMIT')}); return; } app.event.trigger('post.listViewMassEdit.click', url); var params = listInstance.getListSelectAllParams(true); if (params) { app.helper.showProgress(); app.request.get({url: url, data: params}).then(function (error, data) { var overlayParams = {'backdrop': 'static', 'keyboard': false}; app.helper.loadPageContentOverlay(data, overlayParams).then(function (container) { app.event.trigger('post.listViewMassEdit.loaded', container); }) app.helper.hideProgress(); }); } else { listInstance.noRecordSelectedAlert(); } }, triggerSendSms: function (massActionUrl, module) { var listInstance = app.controller(); var validationResult = listInstance.checkListRecordSelected(); if (validationResult != true) { app.helper.showProgress(); app.helper.checkServerConfig(module).then(function (data) { app.helper.hideProgress(); if (data == true) { Vtiger_List_Js.triggerMassAction(massActionUrl); } else { app.helper.showAlertBox({message: app.vtranslate('JS_SMS_SERVER_CONFIGURATION')}) } }); } else { listInstance.noRecordSelectedAlert(); } }, getListViewInstance: function () { return window.app.controller(); }, massDeleteRecords: function (url, instance) { var listInstance = app.controller(); listInstance.performMassDeleteRecords(url); }, triggerExportAction: function (exportActionUrl) { var listInstance = window.app.controller(); listInstance.performExportAction(exportActionUrl); }, /* * function to trigger send Email * @params: send email url , module name. */ triggerSendEmail: function (massActionUrl, module, params) { var listInstance = window.app.controller(); var listSelectParams = listInstance.getListSelectAllParams(false); if (listSelectParams) { var postData = listInstance.getDefaultParams(); delete postData.module; delete postData.view; delete postData.parent; jQuery.extend(postData, listSelectParams); var data = app.convertUrlToDataParams(massActionUrl); jQuery.extend(postData, data); if (params) { jQuery.extend(postData, params); } Vtiger_Index_Js.showComposeEmailPopup(postData); } else { listInstance.noRecordSelectedAlert(); } }, triggerTransferOwnership: function (massActionUrl) { var listInstance = window.app.controller(); var listSelectParams = listInstance.getListSelectAllParams(); if (listSelectParams) { app.helper.showProgress(); app.request.get({'url': massActionUrl}).then( function (error, data) { app.helper.hideProgress(); if (data) { var callback = function (data) { var chagneOwnerForm = jQuery('#changeOwner'); chagneOwnerForm.vtValidate({ submitHandler: function (form) { listInstance.transferOwnershipSave(jQuery(form)); return false; } }); } var params = {}; params.cb = callback app.helper.showModal(data, params); } } ); } else { listInstance.noRecordSelectedAlert(); } }, triggerMassAction: function (massActionUrl) { var listInstance = window.app.controller(); var listSelectParams = listInstance.getListSelectAllParams(true); if (listSelectParams) { var postData = listInstance.getDefaultParams(); delete postData.module; delete postData.view; delete postData.parent; var data = app.convertUrlToDataParams(massActionUrl); postData = jQuery.extend(postData, data); postData = jQuery.extend(postData, listSelectParams); app.helper.showProgress(); app.request.get({'data': postData}).then( function (err, data) { app.helper.hideProgress(); if (data) { app.helper.showModal(data, {'cb': function (modal) { if (postData.mode === "showAddCommentForm") { var vtigerInstance = Vtiger_Index_Js.getInstance(); vtigerInstance.registerMultiUpload(); } app.event.trigger('post.listViewMassAction.loaded', modal); } }); } } ); } else { listInstance.noRecordSelectedAlert(); } }, showDuplicateSearchForm: function (url) { app.helper.showProgress(); app.request.get({'url': url}).then(function (error, data) { if (data) { app.helper.hideProgress(); app.helper.showModal(data, {'cb': function (container) { container.find('form').vtValidate({}) }}); } }) }, triggerMergeRecord: function () { var listInstance = window.app.controller(); listInstance.performMergeRecords(); }, triggerAddStar: function () { var listInstance = app.controller(); var listSelectParams = listInstance.getListSelectAllParams(true) if (listSelectParams) { listInstance.massStarSave({'value': 1}); } else { listInstance.noRecordSelectedAlert(); } }, triggerRemoveStar: function () { var listInstance = app.controller(); var listSelectParams = listInstance.getListSelectAllParams(true) if (listSelectParams) { listInstance.massStarSave({'value': 0}); } else { listInstance.noRecordSelectedAlert(); } }, triggerPreviewForRecord: function (recordId, appName) { var listInstance = Vtiger_List_Js.getInstance(); listInstance.showQuickPreviewForId(recordId, appName, ''); return false; }, triggerAddTag: function () { var listInstance = app.controller(); var listInstance = app.controller(); var listSelectParams = listInstance.getListSelectAllParams(true); if (listSelectParams) { listInstance.showAllTags(jQuery('.main-container')); } else { listInstance.noRecordSelectedAlert(); } }, triggerRemoveTag: function (tagId) { var listInstance = app.controller(); var listSelectParams = listInstance.getListSelectAllParams(true); if (listSelectParams) { listInstance.massRemoveTag(tagId); } else { listInstance.noRecordSelectedAlert(); } }, /** * Function to show the content of a file in an iframe * @param {type} e * @param {type} recordId * @returns {undefined} */ previewFile: function (e, recordId, attachmentId) { e.stopPropagation(); if (recordId) { var params = { module: 'ModComments', view: 'FilePreview', record: recordId, attachmentid: attachmentId }; app.request.post({data: params}).then(function (err, res) { app.helper.showModal(res); jQuery('.filePreview .preview-area').height(jQuery(window).height() - 143); }); } } }, { //contains the List View element. listViewContainer: false, _moduleName: false, init: function () { this.addComponents(); }, addComponents: function () { this.addModuleSpecificComponent('CustomView'); this.addModuleSpecificComponent('ListSidebar'); this.addIndexComponent(); this.addComponent('Vtiger_MergeRecords_Js'); this.addModuleSpecificComponent('Pagination'); this.addComponent('Vtiger_Tag_Js'); }, addIndexComponent: function () { this.addModuleSpecificComponent('Index', 'Vtiger', app.getParentModuleName()); }, getListViewContainer: function () { if (this.listViewContainer === false) { this.listViewContainer = jQuery('#listViewContent'); } return this.listViewContainer; }, setListViewContainer: function (container) { this.listViewContainer = container; return this; }, recordSelectTrackerInstance: false, getRecordSelectTrackerInstance: function () { if (this.recordSelectTrackerInstance === false) { this.recordSelectTrackerInstance = Vtiger_RecordSelectTracker_Js.getInstance(); this.recordSelectTrackerInstance.setCvId(this.getCurrentCvId()); } else { this.recordSelectTrackerInstance.setCvId(this.getCurrentCvId()); } return this.recordSelectTrackerInstance; }, getCurrentCvId: function () { var listViewContainer = this.getListViewContainer(); return listViewContainer.find('[name="cvid"]').val(); }, getModuleName: function () { if (this._moduleName != false) { return this._moduleName; } return app.module(); }, setModuleName: function (module) { this._moduleName = module; return this; }, /* * Function to return alerts if no records selected. */ noRecordSelectedAlert: function () { return app.helper.showAlertBox({message: app.vtranslate('JS_PLEASE_SELECT_ONE_RECORD')}); }, registerRemoveListViewSort: function () { var listViewContainer = this.getListViewContainer(); var thisInstance = this; listViewContainer.on('click', '.removeSorting', function (e) { var cvId = thisInstance.getCurrentCvId(); thisInstance.loadFilter(cvId, {'mode': 'removeSorting'}); }); }, performMassDeleteRecords: function (url) { var listInstance = this; var params = {}; var paramArray = url.slice(url.indexOf('?') + 1).split('&'); for (var i = 0; i < paramArray.length; i++) { var param = paramArray[i].split('='); params[param[0]] = param[1]; } var listSelectParams = listInstance.getListSelectAllParams(true); listSelectParams = jQuery.extend(listSelectParams, params); if (listSelectParams) { var message = app.vtranslate('LBL_MASS_DELETE_CONFIRMATION'); app.helper.showConfirmationBox({'message': message}).then(function (e) { listSelectParams['module'] = app.getModuleName(); listSelectParams['action'] = 'MassDelete'; listSelectParams['search_params'] = JSON.stringify(listInstance.getListSearchParams()); app.helper.showProgress(); app.request.post({data: listSelectParams}).then( function (error, result) { app.helper.hideProgress(); if (error) { app.helper.showErrorNotification(); return; } listInstance.clearList(); listInstance.getPageCount().then(function (data) { var pageCount = parseInt(data.page); var container = listInstance.getListViewContainer(); var currentPageElement = container.find('#pageNumber'); var currentPageNumber = parseInt(currentPageElement.val()); var params = {}; if (currentPageNumber > pageCount) { params = {'page': 1}; } listInstance.loadListViewRecords(params); }); } ); }); } else { listInstance.noRecordSelectedAlert(); } }, performExportAction: function (url) { var listInstance = this; var listViewContainer = this.getListViewContainer(); var pageNumber = listViewContainer.find('#pageNumber').val(); var postData = listInstance.getDefaultParams(); var params = app.convertUrlToDataParams(url); postData = jQuery.extend(postData, params); var listSelectAllParams = listInstance.getListSelectAllParams(true); listSelectAllParams['search_params'] = JSON.stringify(listInstance.getListSearchParams()); postData = jQuery.extend(postData, listSelectAllParams); app.helper.showProgress(); app.request.get({data: postData}).then(function (error, data) { app.helper.loadPageContentOverlay(data).then(function (container) { container.find('form#exportForm').on('submit', function () { jQuery(this).find('button[type="submit"]').attr('disabled', 'disabled'); app.helper.hidePageContentOverlay(); }); }); app.helper.hideProgress(); }); }, registerListViewSort: function () { var listViewContainer = this.getListViewContainer(); var thisInstance = this; listViewContainer.on('click', '.listViewContentHeaderValues', function (e) { var fieldName = jQuery(e.currentTarget).data('columnname'); var sortOrderVal = jQuery(e.currentTarget).data('nextsortorderval'); if (sortOrderVal === 'ASC') { jQuery('i', e.currentTarget).addClass('fa-sort-asc'); } else { jQuery('i', e.currentTarget).addClass('fa-sort-desc'); } listViewContainer.find('[name="sortOrder"]').val(sortOrderVal); listViewContainer.find('[name="orderBy"]').val(fieldName); var cvId = thisInstance.getCurrentCvId(); thisInstance.loadListViewRecords(); }); }, // To clear sorting information before changing Custom View resetData: function () { var self = this; var listViewContainer = this.getListViewContainer(); listViewContainer.find('#pageNumber').val("1"); listViewContainer.find('#pageToJump').val('1'); listViewContainer.find('#orderBy').val(''); listViewContainer.find("#sortOrder").val(''); listViewContainer.find('#currentSearchParams').val(JSON.stringify(new Array())); listViewContainer.find('#currentTagParams').val(JSON.stringify(new Array())); listViewContainer.find('[name="tag"]').val(''); listViewContainer.find('[name="list_headers"]').val(''); var recordTrackerInstance = self.getRecordSelectTrackerInstance(); recordTrackerInstance.clearList(); }, loadFilter: function (id, loadParams) { if (typeof loadParams == 'undefined') loadParams = {}; var params = { module: this.getModuleName(), view: app.view(), viewname: id } params = jQuery.extend(params, loadParams); this.loadListViewRecords(params); }, loadListViewRecords: function (urlParams) { var self = this; var aDeferred = jQuery.Deferred(); var defParams = this.getDefaultParams(); if (typeof urlParams == "undefined") { urlParams = {}; } if (typeof urlParams.search_params == "undefined") { urlParams.search_params = JSON.stringify(this.getListSearchParams(false)); } urlParams = jQuery.extend(defParams, urlParams); app.helper.showProgress(); if (urlParams['view'] == 'ListAjax') { app.request.post({data: urlParams}).then(function (err, res) { aDeferred.resolve(res); self.postLoadListViewRecords(res); }); } else { app.request.pjax({data: urlParams}).then(function (err, res) { aDeferred.resolve(res); self.postLoadListViewRecords(res); }); } return aDeferred.promise(); }, postLoadListViewRecords: function (res) { var self = this; self.placeListContents(res); app.event.trigger('post.listViewFilter.click', jQuery('.searchRow')); app.helper.hideProgress(); self.markSelectedIdsCheckboxes(); self.registerDynamicListHeaders(); self.registerPostLoadListViewActions(); }, placeListContents: function (contents) { var container = this.getListViewContainer(); container.html(contents); }, getDefaultParams: function () { var container = this.getListViewContainer(); var pageNumber = container.find('#pageNumber').val(); var module = this.getModuleName(); var parent = app.getParentModuleName(); var cvId = this.getCurrentCvId(); var orderBy = container.find('[name="orderBy"]').val(); var sortOrder = container.find('[name="sortOrder"]').val(); var appName = container.find('#appName').val(); var params = { 'module': module, 'parent': parent, 'page': pageNumber, 'view': "List", 'viewname': cvId, 'orderby': orderBy, 'sortorder': sortOrder, 'app': appName } params.search_params = JSON.stringify(this.getListSearchParams()); params.tag_params = JSON.stringify(this.getListTagParams()); params.nolistcache = (container.find('#noFilterCache').val() == 1) ? 1 : 0; params.starFilterMode = container.find('.starFilter li.active a').data('type'); params.list_headers = container.find('[name="list_headers"]').val(); params.tag = container.find('[name="tag"]').val(); return params; }, getListTagParams: function () { var listViewPageDiv = this.getListViewContainer(); var currentTagParams = new Array(); var tagParams = new Array(); if (listViewPageDiv.find('#currentTagParams').val()) { currentTagParams = JSON.parse(listViewPageDiv.find('#currentTagParams').val()); } for (var i in currentTagParams) { var fieldName = currentTagParams[i]['fieldName']; var searchValue = currentTagParams[i]['searchValue']; var searchOperator = currentTagParams[i]['comparator']; if (fieldName == null || fieldName.length <= 0) { continue; } var tagInfo = new Array(); tagInfo.push(fieldName); tagInfo.push(searchOperator); tagInfo.push(searchValue); tagParams.push(tagInfo); } if (tagParams.length > 0) { var listTagParams = new Array(tagParams); } else { var listTagParams = new Array(); } return listTagParams; }, isInteger: function (num) { return !isNaN(num); }, getListSearchParams: function (includeStarFilters) { if (typeof includeStarFilters == "undefined") { includeStarFilters = true; } var listViewPageDiv = this.getListViewContainer(); var listViewTable = listViewPageDiv.find('.searchRow'); var searchParams = new Array(); var currentSearchParams = new Array(); if (listViewPageDiv.find('#currentSearchParams').val()) { currentSearchParams = JSON.parse(listViewPageDiv.find('#currentSearchParams').val()); } if (this.filterClick) { return; } listViewTable.find('.listSearchContributor').each(function (index, domElement) { var searchInfo = new Array(); var searchContributorElement = jQuery(domElement); var fieldName = searchContributorElement.attr('name'); var fieldInfo = uimeta.field.get(fieldName); /** * If we have any related record fields in the list, then list search will not work. * Because, uimeta will only hold field info of current module not all related modules */ if (typeof fieldInfo == 'undefined') { fieldInfo = searchContributorElement.data("fieldinfo"); } if (currentSearchParams != null) { if (typeof fieldName != 'undefined') { if (fieldName in currentSearchParams) { delete currentSearchParams[fieldName]; } } if ('starred' in currentSearchParams) { delete currentSearchParams['starred']; } } var searchValue = searchContributorElement.val(); if (typeof searchValue == "object") { if (searchValue == null) { searchValue = ""; } else { searchValue = searchValue.join(','); } } searchValue = searchValue.trim(); if (searchValue.length <= 0) { //continue return true; } var searchOperator = 'c'; if (fieldInfo.type == "date" || fieldInfo.type == "datetime") { searchOperator = 'bw'; } else if (fieldInfo.type == 'percentage' || fieldInfo.type == "double" || fieldInfo.type == "integer" || fieldInfo.type == 'currency' || fieldInfo.type == "number" || fieldInfo.type == "boolean" || fieldInfo.type == "picklist") { searchOperator = 'e'; } var storedOperator = searchContributorElement.parent().parent().find('.operatorValue').val(); if (storedOperator) { searchOperator = storedOperator; storedOperator = false; } searchInfo.push(fieldName); searchInfo.push(searchOperator); searchInfo.push(searchValue); searchParams.push(searchInfo); }); for (var i in currentSearchParams) { // Number.isInteger(parseInt(i)) (Previously Used which is not supported by IE.) // http://codereview.stackexchange.com/questions/101484/simple-function-to-verify-if-a-number-is-integer // http://stackoverflow.com/questions/26482645/number-isintegerx-which-is-created-can-not-work-in-ie if (!this.isInteger(parseInt(i))) { continue; } var fieldName = currentSearchParams[i]['fieldName']; var searchValue = currentSearchParams[i]['searchValue']; var searchOperator = currentSearchParams[i]['comparator']; if (fieldName == null || fieldName.length <= 0) { continue; } var searchInfo = new Array(); searchInfo.push(fieldName); searchInfo.push(searchOperator); searchInfo.push(searchValue); searchParams.push(searchInfo); } if (searchParams.length > 0) { var listSearchParams = new Array(searchParams); } else { var listSearchParams = new Array(); } if (includeStarFilters) { listSearchParams = this.addStarSearchParams(listSearchParams); } return listSearchParams; }, addStarSearchParams: function (listSearchParams) { var listViewContainer = this.getListViewContainer(); var activeStarFilter = listViewContainer.find('.starFilter li.active').find('a').data('type'); if (activeStarFilter == "starred") { if (typeof listSearchParams[0] == "undefined") { listSearchParams[0] = new Array(); } var starSearchParams = new Array(); starSearchParams.push('starred'); starSearchParams.push('e'); starSearchParams.push('1'); listSearchParams[0].push(starSearchParams); } else if (activeStarFilter == "unstarred") { if (typeof listSearchParams[0] == "undefined") { listSearchParams[0] = new Array(); } var unStarSearchParams = new Array(); unStarSearchParams.push('starred'); unStarSearchParams.push('e'); unStarSearchParams.push('0'); listSearchParams[0].push(unStarSearchParams); } return listSearchParams; }, pageJump: function () { var thisInstance = this; var listViewContainer = thisInstance.getListViewContainer(); var element = listViewContainer.find('#totalPageCount'); var totalPageNumber = element.text(); var pageCount; if (totalPageNumber === "") { var totalCountElem = listViewContainer.find('#totalCount'); var totalRecordCount = totalCountElem.val(); if (totalRecordCount !== '') { var recordPerPage = listViewContainer.find('#pageLimit').val(); if (recordPerPage === '0') recordPerPage = 1; pageCount = Math.ceil(totalRecordCount / recordPerPage); if (pageCount === 0) { pageCount = 1; } element.text(pageCount); return; } thisInstance.getPageCount().then(function (data) { var pageCount = data.page; totalCountElem.val(data.numberOfRecords); if (pageCount === 0) { pageCount = 1; } element.text(pageCount); }); } }, pageJumpOnSubmit: function (element) { var thisInstance = this; var container = this.getListViewContainer(); var currentPageElement = container.find('#pageNumber'); var currentPageNumber = parseInt(currentPageElement.val()); var newPageNumber = parseInt(container.find('#pageToJump').val()); var totalPages = parseInt(container.find('#totalPageCount').text()); if (newPageNumber > totalPages) { var message = app.vtranslate('JS_PAGE_NOT_EXIST'); app.helper.showErrorNotification({'message': message}) return; } if (newPageNumber === currentPageNumber) { var message = app.vtranslate('JS_YOU_ARE_IN_PAGE_NUMBER') + " " + newPageNumber; app.helper.showAlertNotification({'message': message}); return; } var urlParams = thisInstance.getPagingParams(); urlParams['page'] = newPageNumber; thisInstance.loadListViewRecords(urlParams).then(function (data) { element.closest('.btn-group ').removeClass('open'); }); }, /** * Function to register Inline Edit * @param {type} currentTrElement * @returns {undefined} */ registerInlineEdit: function (currentTrElement) { var self = this; currentTrElement.addClass('edited'); var tdElements = jQuery('.listViewEntryValue', currentTrElement); currentTrElement.addClass('edited'); jQuery('.action', currentTrElement).addClass('hide'); jQuery('.inline-save', currentTrElement).removeClass('hide'); for (var i = 0; i < tdElements.length; i++) { var fieldData = []; var tdElement = jQuery(tdElements[i]); var editElement = jQuery('.edit', tdElement); var valueElement = jQuery('.fieldValue', tdElement); var moduleName = this.getModuleName(); var fieldName = tdElement.data("name"); //ignore other related modules fields if (fieldName.match(/\((\w+)\s\;\s\((\w+)\)\s(\w+)\)/g) && fieldName.match(/\((\w+)\s\;\s\((\w+)\)\s(\w+)\)/g).length) { continue; } var fieldType = tdElement.data("field-type"); var fieldBasicInfo = new Array(); if (typeof uimeta !== "undefined") { fieldBasicInfo = uimeta.field.get(fieldName); } //In advance search uimeta will not have selected module's fields info. So checking in adv_search_uimeta if ((typeof fieldBasicInfo == "undefined" || fieldBasicInfo.length <= 0) && (typeof adv_search_uimeta !== "undefined")) { fieldBasicInfo = adv_search_uimeta.field.get(fieldName); } var value = jQuery.trim(valueElement.text()); //adding string,text,url,currency in customhandling list as string will be textlengthchecked var customHandlingFields = ['owner', 'ownergroup', 'picklist', 'multipicklist', 'reference', 'string', 'url', 'currency', 'text', 'email']; if (jQuery.inArray(fieldType, customHandlingFields) !== -1) { value = tdElement.data('rawvalue'); } fieldData["value"] = value; jQuery.extend(fieldData, fieldBasicInfo); // For non editable fields if (editElement.length <= 0) { continue; } // if element is already edited if (editElement.is(':visible')) { continue; } var fieldObject = new Vtiger_Field_Js.getInstance(fieldData, moduleName); var fieldModel = fieldObject.getUiTypeModel(); if (jQuery('input', editElement).length === 0) { editElement.append(fieldModel.getUi()); } // for reference fields, actual value will be ID but we need to show related name of that ID if (fieldType === 'reference') { if (value !== 0) { jQuery('input[name="' + fieldName + '"]', editElement).prop('value', jQuery.trim(valueElement.text())); } } valueElement.addClass('hide'); editElement.removeClass('hide'); if (fieldType === 'picklist') { self.registerEventForPicklistDependencySetup(currentTrElement); } } app.event.trigger('post.listViewInlineEdit.click', currentTrElement); }, registerEventForPicklistDependencySetup: function (container) { var picklistDependcyElemnt = jQuery('[name="picklistDependency"]'); if (picklistDependcyElemnt.length <= 0) { return; } var picklistDependencyMapping = JSON.parse(picklistDependcyElemnt.val()); var sourcePicklists = Object.keys(picklistDependencyMapping); if (sourcePicklists.length <= 0) { return; } var sourcePickListNames = ""; for (var i = 0; i < sourcePicklists.length; i++) { if (i != sourcePicklists.length - 1) sourcePickListNames += '[name="' + sourcePicklists[i] + '"],'; else sourcePickListNames += '[name="' + sourcePicklists[i] + '"]'; } var sourcePickListElements = container.find(sourcePickListNames); sourcePickListElements.on('change', function (e) { var currentElement = jQuery(e.currentTarget); var sourcePicklistname = currentElement.attr('name'); var configuredDependencyObject = picklistDependencyMapping[sourcePicklistname]; var selectedValue = currentElement.val(); var targetObjectForSelectedSourceValue = configuredDependencyObject[selectedValue]; var picklistmap = configuredDependencyObject["__DEFAULT__"]; if (typeof targetObjectForSelectedSourceValue == 'undefined') { targetObjectForSelectedSourceValue = picklistmap; } jQuery.each(picklistmap, function (targetPickListName, targetPickListValues) { var targetPickListMap = targetObjectForSelectedSourceValue[targetPickListName]; if (typeof targetPickListMap == "undefined") { targetPickListMap = targetPickListValues; } var targetPickList = jQuery('[name="' + targetPickListName + '"]', container); if (targetPickList.length <= 0) { return; } var listOfAvailableOptions = targetPickList.data('availableOptions'); if (typeof listOfAvailableOptions == "undefined") { listOfAvailableOptions = jQuery('option', targetPickList); targetPickList.data('available-options', listOfAvailableOptions); } var targetOptions = new jQuery(); var optionSelector = []; optionSelector.push(''); for (var i = 0; i < targetPickListMap.length; i++) { optionSelector.push(targetPickListMap[i]); } jQuery.each(listOfAvailableOptions, function (i, e) { var picklistValue = jQuery(e).val(); if (jQuery.inArray(picklistValue, optionSelector) != -1) { targetOptions = targetOptions.add(jQuery(e)); } }) var targetPickListSelectedValue = ''; var targetPickListSelectedValue = targetOptions.filter('[selected]').val(); if (targetPickListMap.length == 1) { var targetPickListSelectedValue = targetPickListMap[0]; // to automatically select picklist if only one picklistmap is present. } if ((targetPickListName == 'group_id' || targetPickListName == 'assigned_user_id') && currentElement.val() == '') { return false; } targetPickList.html(targetOptions).val(targetPickListSelectedValue).trigger("change"); }) }); //To Trigger the change on load sourcePickListElements.trigger('change'); }, validateAndSaveInlineEdit: function (currentTrElement) { var listViewContainer = this.getListViewContainer(); var thisInstance = this; var tdElements = jQuery('.listViewEntryValue', currentTrElement); var record = currentTrElement.data('id'); var values = {}; for (var i = 0; i < tdElements.length; i++) { var tdElement = jQuery(tdElements[i]); var newValueElement = jQuery('.inputElement', tdElement); var fieldName = tdElement.data("name"); values[fieldName] = thisInstance.getInlineEditedFieldValue(tdElement, newValueElement); } var params = { 'ignore': ".listSearchContributor,input[type='hidden']", submitHandler: function (form) { // NOTE : hack added, submit was getting triggered for 2nd and 3rd click on save, need to debug this. if (this.numberOfInvalids() > 0) { this.form(); return false; } var params = { 'module': thisInstance.getModuleName(), 'action': 'SaveAjax', 'record': record }; var params = jQuery.extend(values, params); app.helper.showProgress(); jQuery('.inline-save', currentTrElement).find('button').attr('disabled', 'disabled'); app.request.post({data: params}).then(function (err, result) { if (result) { jQuery('.vt-notification').remove(); jQuery('.inline-save', currentTrElement).find('button').removeAttr('disabled'); var params = {}; thisInstance.loadListViewRecords(params).then(function (data) { thisInstance.toggleInlineEdit(currentTrElement); app.helper.hideProgress(); app.helper.showSuccessNotification({"message": ''}); //Register Event to show quick preview for reference field. app.event.trigger('onclick.referenceField.quickPreview', currentTrElement); }); } else { app.helper.hideProgress(); app.event.trigger('post.save.failed', err); jQuery('.inline-save', currentTrElement).find('button').removeAttr('disabled'); return false; } }); return false; // blocks regular submit since you have ajax } }; validateAndSubmitForm(listViewContainer.find('#listedit'), params); }, /** * Function to register Save Event on Inline Edit * @returns {undefined} */ registerInlineEditSaveEvent: function () { var thisInstance = this; var listViewContainer = this.getListViewContainer(); listViewContainer.on('click', '.save', function (e) { e.preventDefault(); var currentTarget = jQuery(e.currentTarget); var currentTrElement = currentTarget.closest('tr'); thisInstance.validateAndSaveInlineEdit(currentTrElement); }); }, /** * Function to register Cancel event on Inline Edit * @returns {undefined} */ registerInlineEditCancelEvent: function () { var thisInstance = this; var listViewContainer = this.getListViewContainer(); listViewContainer.on('click', '.cancel', function (e) { e.preventDefault(); var currentTarget = jQuery(e.currentTarget); var currentTrElement = currentTarget.closest('tr'); thisInstance.toggleInlineEdit(currentTrElement); currentTrElement.removeClass('edited'); //negating adjusted height var $table = jQuery('#listview-table'); var tableContainer = $table.closest('.table-container'); tableContainer.height(tableContainer.height() - 28); tableContainer.perfectScrollbar('update'); }); }, /** * Function to get value from Edited field * @param {type} fieldElement * @param {type} inputElement * @return value */ getInlineEditedFieldValue: function (fieldElement, inputElement) { var value = null; var fieldType = fieldElement.data('field-type'); var picklistTypes = ['owner', 'picklist', 'ownergroup', 'currencyList']; if (jQuery.inArray(fieldType, picklistTypes) !== -1) { value = jQuery(".inputElement.select2", fieldElement).find(":selected").val(); } else if (fieldType === "reference") { value = inputElement.data('value'); } else if (fieldType === "multipicklist") { var selectedOptions = jQuery(".inputElement.select2", fieldElement).find(":selected"); value = []; for (var i = 0; i < selectedOptions.length; i++) { var option = jQuery(selectedOptions.get(i)); value.push(option.val()); } } else if (fieldType == 'boolean') { if (fieldElement.find('input:checkbox').is(':checked')) { value = 1; } else { value = 0; } } else { value = inputElement.val(); } return value; }, /** * Function to Change List record from Inline Edit View to Normal View * @param {type} record * @returns {undefined} */ toggleInlineEdit: function (record) { jQuery('.inline-save', record).addClass('hide'); jQuery('.action', record).removeClass('hide'); jQuery('.edit', record).empty(); jQuery('.edit', record).addClass('hide'); jQuery('.fieldValue', record).removeClass('hide'); record.removeClass('edited'); }, searchModuleNames: function (params) { var aDeferred = jQuery.Deferred(); if (typeof params.module == 'undefined') { params.module = this.getModuleName(); } if (typeof params.action == 'undefined') { params.action = 'BasicAjax'; } if (typeof params.base_record == 'undefined') { var record = jQuery('[name="record"]'); var recordId = app.getRecordId(); if (record.length) { params.base_record = record.val(); } else if (recordId) { params.base_record = recordId; } else if (app.view() == 'List') { var editRecordId = jQuery('#listview-table').find('tr.listViewEntries.edited').data('id'); if (editRecordId) { params.base_record = editRecordId; } } } app.request.get({data: params}).then( function (err, res) { aDeferred.resolve(res); }, function (error) { //TODO : Handle error aDeferred.reject(); } ); return aDeferred.promise(); }, /** * Function to get reference search params */ getReferenceSearchParams: function (element) { var tdElement = jQuery(element).closest('td'); var params = {}; var referenceModuleElement = jQuery('input[name="referenceModule"]', tdElement).length ? jQuery('input[name="referenceModule"]', tdElement) : jQuery('input.referenceModule', tdElement); var searchModule = referenceModuleElement.val(); params.search_module = searchModule; return params; }, /* * Function to register the list view row click event */ registerRowClickEvent: function () { var thisInstance = this; var listViewContentDiv = this.getListViewContainer(); // added to stop the link functunality for few milli seconds listViewContentDiv.on('click', '.listViewEntries a', function (e) { var currentAElement = jQuery(e.currentTarget); var href = currentAElement.attr('href'); var target = jQuery(e.target); if (!target.hasClass('js-reference-display-value')) { // Redirect only after 500 milliseconds if (!currentAElement.data('timer') && typeof href != 'undefined') { currentAElement.data('timer', setTimeout(function () { window.location = href; }, 500)); } e.preventDefault(); } e.stopPropagation(); }); // Single click event - detail view listViewContentDiv.on('click', '.listViewEntries', function (e) { var target = jQuery(e.target); if (!target.hasClass('js-reference-display-value')) { setTimeout(function () { var editedLength = jQuery('.listViewEntries.edited').length; if (editedLength === 0) { var selection = window.getSelection().toString(); if (selection.length == 0) { var target = jQuery(e.target, jQuery(e.currentTarget)); if (target.closest('td').is('td:first-child')) return; if (target.closest('tr').hasClass('edited')) return; if (jQuery(e.target).is('input[type="checkbox"]')) return; var elem = jQuery(e.currentTarget); var recordUrl = elem.data('recordurl'); if (typeof recordUrl == 'undefined') { return; } window.location.href = recordUrl; } } }, 300); } }); }, /* * Function to register the list view row double click event */ registerRowDoubleClickEvent: function () { var thisInstance = this; var listViewContentDiv = this.getListViewContainer(); // Double click event - ajax edit listViewContentDiv.on('dblclick', '.listViewEntries', function (e) { if (listViewContentDiv.find('#isExcelEditSupported').val() == 'no') { return; } var currentTrElement = jQuery(e.currentTarget); // added to unset the time out set for <a> tags var rows = currentTrElement.find('a'); rows.each(function (i, elem) { if (jQuery(elem).data('timer')) { clearTimeout(jQuery(elem).data('timer')); jQuery(elem).data('timer', null); } ; }); var editedLength = jQuery('.listViewEntries.edited').length; if (editedLength === 0) { var currentTrElement = jQuery(e.currentTarget); var target = jQuery(e.target, jQuery(e.currentTarget)); if (target.closest('td').is('td:first-child')) return; if (target.closest('tr').hasClass('edited')) return; thisInstance.registerInlineEdit(currentTrElement); } }); }, /* * Funtion to register events for reference field actions */ registerFieldActionEvents: function (editedRow) { var vtigerInstance = Vtiger_Index_Js.getInstance(); vtigerInstance.registerAutoCompleteFields(editedRow); vtigerInstance.registerClearReferenceSelectionEvent(editedRow); vtigerInstance.referenceModulePopupRegisterEvent(editedRow); }, registerInlineSaveOnEnterEvent: function (editedRow) { editedRow.find('.inputElement:not(textarea)').on('keyup', function (e) { var ignoreList = ['reference', 'picklist', 'multipicklist', 'owner']; var fieldType = jQuery(e.target).closest('.listViewEntryValue').data('fieldType'); if (ignoreList.indexOf(fieldType) !== -1) return; (e.keyCode || e.which) === 13 && editedRow.find('button.save').trigger('click'); }); }, /** * Function to register all list view record actions * @returns {undefined} */ registerListViewBasicActions: function () { var thisInstance = this; var listViewContainer = this.getListViewContainer(); listViewContainer.on('click', '.table-actions .inlineEdit', function (e) { var editedLength = jQuery('.listViewEntries.edited').length; if (editedLength === 0) { var currentTrElement = jQuery(e.currentTarget).parents('tr'); thisInstance.registerInlineEdit(currentTrElement); } }); this.registerInlineEditSaveEvent(); this.registerInlineEditCancelEvent(); app.event.on('post.listViewInlineEdit.click', function (event, editedRow) { vtUtils.applyFieldElementsView(editedRow); thisInstance.registerFieldActionEvents(editedRow); //height adjustment to accomodate inline edit container var $table = jQuery('#listview-table'); var tableContainer = $table.closest('.table-container'); tableContainer.height(tableContainer.height() + 28); tableContainer.perfectScrollbar('update'); thisInstance.registerInlineSaveOnEnterEvent(editedRow); }); var isOwnerChanged = false; app.event.on('post.listViewMassEdit.loaded', function (e, container) { app.event.trigger('post.listViewInlineEdit.click', container); var offset = container.find('.modal-body .datacontent').offset(); var viewPortHeight = $(window).height() - 60; var params = { setHeight: (viewPortHeight - offset['top']) + 'px' }; container.find('[name="assigned_user_id"]').on('click', function() { isOwnerChanged = true; }); app.helper.showVerticalScroll(container.find('.modal-body .datacontent'), params); var editInstance = Vtiger_Edit_Js.getInstance(); editInstance.registerBasicEvents(container); var form_original_data = $("#massEdit").serialize(); $('#massEdit').on('submit', function (event) { thisInstance.saveMassedit(event, form_original_data, isOwnerChanged); isOwnerChanged = false; }); app.helper.registerLeavePageWithoutSubmit($("#massEdit")); app.helper.registerModalDismissWithoutSubmit($("#massEdit")); }); app.event.on('post.listViewMassAction.loaded', function (e, container) { jQuery('#phoneFormatWarningPop').popover(); jQuery('#massSave').vtValidate({ // Note : JQuery Validator is not working with multi file upload fields ignore: "input[type='file'].multi", submitHandler: function (form) { var domForm = jQuery(form); var formData = jQuery(form).serializeFormData(); var formData = new FormData(domForm[0]); if (Vtiger_Index_Js.files) { formData.append("filename", Vtiger_Index_Js.files); delete Vtiger_Index_Js.files; } var params = { url: "index.php", type: "POST", data: formData, processData: false, contentType: false }; app.helper.showProgress(); app.request.post(params).then(function (err, data) { app.helper.hideProgress(); app.helper.hideModal(); if (jQuery(form).find('[name="module"]').val() == 'SMSNotifier') { var statusDetails = data.statusdetails; var status = statusDetails.status; if (status == 'Failed') { var errorMsg = statusDetails.statusmessage + '<br>' + app.vtranslate('JS_PHONEFORMAT_ERROR'); app.helper.showErrorNotification({'title': status, 'message': errorMsg}); } else { var msg = statusDetails.statusmessage; app.helper.showSuccessNotification({'title': status, 'message': msg}); } } app.event.trigger('post.listViewMassEditSave'); if (err) { return; } }); return false; } }); }); }, /** * Function to register the list view row search event */ registerListViewSearch: function () { var listViewPageDiv = this.getListViewContainer(); var thisInstance = this; listViewPageDiv.on('click', '[data-trigger="listSearch"]', function (e) { e.preventDefault(); var params = { 'page': '1' } thisInstance.loadListViewRecords(params).then( function (data) { //To unmark the all the selected ids jQuery('#deSelectAllMsgDiv').trigger('click'); }, function (textStatus, errorThrown) { } ); }); //floatThead change event object has undefined keyCode, using keyup instead var prevSearchValues = []; listViewPageDiv.on('keyup', '.listSearchContributor', function (e) { var element = jQuery(e.currentTarget); var fieldName = element.attr('name'); var searchValue = element.val(); if (e.keyCode == 13 && prevSearchValues[fieldName] !== searchValue) { e.preventDefault(); var element = jQuery(e.currentTarget); var parentElement = element.closest('tr'); var searchTriggerElement = parentElement.find('[data-trigger="listSearch"]'); searchTriggerElement.trigger('click'); prevSearchValues[fieldName] = searchValue; } }); listViewPageDiv.on('datepicker-change', '.dateField', function (e) { var element = jQuery(e.currentTarget); element.trigger('change'); }); }, saveMassedit: function (event, form_original_data, isOwnerChanged) { event.preventDefault(); var form = $('#massEdit'); var form_new_data = form.serialize(); app.helper.showProgress(); if (form_new_data !== form_original_data || isOwnerChanged) { var originalData = app.convertUrlToDataParams(form_original_data); var newData = app.convertUrlToDataParams(form_new_data); for (var key in originalData) { if ((form.find('[name="' + key + '"]').is("select") || form.find('[name="' + key + '"]').is("input[type='checkbox']")) && (originalData[key] == newData[key])) { delete newData[key]; } } if (!newData['assigned_user_id'] && isOwnerChanged) { newData['assigned_user_id'] = originalData['assigned_user_id']; } var form_update_data = ''; for (var key in newData) { form_update_data += key + '=' + newData[key] + '&'; } form_update_data = form_update_data.slice(0, -1); app.request.post({data: form_update_data}).then(function (err, data) { app.helper.hideProgress(); if (data) { jQuery('.vt-notification').remove(); app.helper.hidePageContentOverlay(); window.onbeforeunload = null; app.event.trigger('post.listViewMassEditSave'); } else { app.event.trigger('post.save.failed', err); } }); } else { app.helper.hideProgress(); app.helper.showAlertBox({'message': app.vtranslate('NONE_OF_THE_FIELD_VALUES_ARE_CHANGED_IN_MASS_EDIT')}); } }, markSelectedIdsCheckboxes: function () { var self = this; var recordSelectTrackerObj = self.getRecordSelectTrackerInstance(); var selectAllMode = recordSelectTrackerObj.getSelectAllMode(); var excludedIds = recordSelectTrackerObj.getExcludedIds(); var excludedIdsAreEmpty = self.checkIdsAreEmpty(excludedIds); var selectedIds = recordSelectTrackerObj.getSelectedIds(); var currentViewId = self.getCurrentCvId(); var recordTackerCvId = recordSelectTrackerObj.getCvid(); var rows = jQuery('tr.listViewEntries'); if (selectAllMode == true) { jQuery('#deSelectAllMsgDiv').closest('div.messageContainer').addClass('show'); //jQuery(".listViewEntriesMainCheckBox").prop('checked', true); if (this.isStarFilterMode()) { rows = this.getStarRecordRows(); } else if (this.isUnStarFilterMode()) { rows = this.getUnStarRecordRows(); } if (excludedIdsAreEmpty) { rows.each(function (i, elem) { jQuery(elem).find(".listViewEntriesCheckBox").prop('checked', true); }); } else { rows.each(function (i, elem) { var rowId = $(elem).data('id'); jQuery(elem).find('.listViewEntriesCheckBox').prop('checked', true); for (var j = 0; j < excludedIds.length; j++) { var excludedRecordIdValue = excludedIds[j]; if (excludedRecordIdValue == rowId) { jQuery('.listViewEntriesCheckBox[value="' + excludedRecordIdValue + '"]').prop('checked', false); jQuery(".listViewEntriesMainCheckBox").prop('checked', false); } } }); } } else { var isEmpty = self.checkIdsAreEmpty(selectedIds); if (!isEmpty) { rows.each(function (i, elem) { var rowId = $(elem).data('id'); for (var j = 0; j < selectedIds.length; j++) { var selectedRecordIdValue = selectedIds[j]; if (selectedRecordIdValue == rowId) { jQuery('.listViewEntriesCheckBox[value="' + selectedRecordIdValue + '"]').prop('checked', true); } } }); var listViewPageDiv = self.getListViewContainer(); if (listViewPageDiv.find('.listViewEntriesCheckBox').not(":checked").length == 0) { listViewPageDiv.find('.listViewEntriesMainCheckBox').prop("checked", true) } else { listViewPageDiv.find('.listViewEntriesMainCheckBox').prop("checked", false) } } } }, checkIdsAreEmpty: function (val) { return (val == undefined || val == null || val.length <= 0) ? true : false; }, performMergeRecords: function () { var self = this; var selectedIds = self.readSelectedIds(); if (selectedIds.length > 3) { app.helper.showErrorNotification({message: app.vtranslate('JS_ALLOWED_TO_SELECT_MAX_OF_THREE_RECORDS')}); return; } if (selectedIds.length < 2) { app.helper.showErrorNotification({message: app.vtranslate('JS_SELECT_ATLEAST_TWO_RECORD_FOR_MERGING')}); return; } app.event.trigger('Request.MergeRecords.show', {records: selectedIds}); app.event.one('post.MergeRecords', function (e) { self.clearList(); self.loadListViewRecords(); }) }, clearList: function () { var recordSelectTracker = this.getRecordSelectTrackerInstance(); recordSelectTracker.clearList(); }, getListSelectAllParams: function (jsonDecode) { var self = this; var recordSelectTrackerInstance = self.getRecordSelectTrackerInstance(); var params = recordSelectTrackerInstance.getSelectedAndExcludedIds(jsonDecode); params.search_params = JSON.stringify(self.getListSearchParams()); return params; }, registerCheckBoxClickEvent: function () { var self = this; var listViewPageDiv = self.getListViewContainer(); var recordSelectTrackerInstance = self.getRecordSelectTrackerInstance(); listViewPageDiv.on('click', '.listViewEntriesCheckBox', function (e) { var element = listViewPageDiv.find(e.currentTarget); var row = element.closest('.listViewEntries'); if (element.is(':checked')) { row.trigger('Post.ListRow.Checked', {"id": row.data('id')}); self.registerPostLoadListViewActions(); if (recordSelectTrackerInstance.selectAllMode) { var excludedIds = recordSelectTrackerInstance.getExcludedIds(); if (self.checkIdsAreEmpty(excludedIds)) { listViewPageDiv.find('.listViewEntriesMainCheckBox').prop("checked", true); } } } else { row.trigger('Post.ListRow.UnChecked', {"id": row.data('id')}); self.registerPostLoadListViewActions(); if (recordSelectTrackerInstance.selectAllMode) { listViewPageDiv.find('.listViewEntriesMainCheckBox').prop("checked", false) } } if (listViewPageDiv.find('.listViewEntriesCheckBox').not(":checked").length == 0) { listViewPageDiv.find('.listViewEntriesMainCheckBox').prop("checked", true) } else { listViewPageDiv.find('.listViewEntriesMainCheckBox').prop("checked", false) } }); }, readSelectedIds: function (jsonDecode) { var recordTracker = this.getRecordSelectTrackerInstance(); var selectedIds = recordTracker.getSelectedIds(); if (jsonDecode) { if (typeof selectedIds == 'object') { return JSON.stringify(selectedIds); } } return selectedIds; }, readExcludedIds: function (jsonDecode) { var recordTracker = this.getRecordSelectTrackerInstance(); var excludedIds = recordTracker.getExcludedIds(); if (jsonDecode) { return JSON.stringify(excludedIds); } return excludedIds; }, getSelectAllMode: function () { var recordTracker = this.getRecordSelectTrackerInstance(); return recordTracker.getSelectAllMode(); }, showSelectAllMsgDiv: function () { jQuery("#deSelectAllMsgDiv").closest('div.messageContainer').removeClass('show'); jQuery("#deSelectAllMsgDiv").closest('div.messageContainer').addClass('hide'); jQuery("#selectAllMsgDiv").closest('div.messageContainer').addClass("show"); }, showDeSelectAllMsgDiv: function () { jQuery('#selectAllMsgDiv').closest('div.messageContainer').removeClass("show"); jQuery('#selectAllMsgDiv').closest('div.messageContainer').addClass("hide"); jQuery('#deSelectAllMsgDiv').closest('div.messageContainer').addClass('show'); }, deSelectAllWithNoMessage: function () { jQuery('#selectAllMsgDiv').closest('div.messageContainer').removeClass("show"); jQuery('#selectAllMsgDiv').closest('div.messageContainer').addClass("hide"); jQuery('#deSelectAllMsgDiv').closest('div.messageContainer').removeClass("show"); jQuery('#deSelectAllMsgDiv').closest('div.messageContainer').addClass("hide"); }, showSelectAll: function () { var self = this; app.helper.showProgress(); self.getRecordsCount().then(function (res) { self.showSelectAllMsgDiv(); jQuery('#totalRecordsCount').text(res['count']); app.helper.hideProgress(); }) }, registerListViewMainCheckBoxClickEvent: function () { var self = this; var listViewPageDiv = this.getListViewContainer(); listViewPageDiv.on('click', '.listViewEntriesMainCheckBox', function (e) { e.stopPropagation(); var element = jQuery(e.currentTarget); if (element.is(':checked')) { var rows = listViewPageDiv.find('tr.listViewEntries'); if (self.isStarFilterMode()) { rows = self.getStarRecordRows(); } else if (self.isUnStarFilterMode()) { rows = self.getUnStarRecordRows(); } rows.find('.listViewEntriesCheckBox').each(function (e) { jQuery(this).prop('checked', true); var row = jQuery(this).closest('.listViewEntries'); row.trigger('Post.ListRow.Checked', {"id": row.data('id')}); self.registerPostLoadListViewActions(); }); if (self.getSelectAllMode() == true) { self.markSelectedIdsCheckboxes(); } else { // If it is not select all mode then only do this self.showSelectAll(); } } else { if (self.getSelectAllMode() == true) { self.showDeSelectAllMsgDiv(); } else { self.deSelectAllWithNoMessage(); } jQuery('.listViewEntriesCheckBox').each(function (e) { jQuery(this).prop('checked', false); var row = jQuery(this).closest('.listViewEntries'); row.trigger('Post.ListRow.UnChecked', {"id": row.data('id')}); self.registerPostLoadListViewActions(); }); } }); }, registerSelectAllClickEvent: function () { var self = this; var listViewPageDiv = this.getListViewContainer(); listViewPageDiv.on('click', '#selectAllMsgDiv', function (e) { self.showDeSelectAllMsgDiv(); var cvId = self.getCurrentCvId(); listViewPageDiv.trigger('Post.ListSelectAll', {"mode": true, "cvId": cvId}); }); self.markSelectedIdsCheckboxes(); }, registerDeSelectAllClickEvent: function () { var self = this; var listViewPageDiv = this.getListViewContainer(); listViewPageDiv.on('click', '#deSelectAllMsgDiv', function (e) { jQuery('#deSelectAllMsgDiv').closest('div.messageContainer').removeClass('show'); jQuery('#deSelectAllMsgDiv').closest('div.messageContainer').addClass("hide"); listViewPageDiv.trigger('Post.ListDeSelectAll', {"mode": false}); self.registerPostLoadListViewActions(); jQuery('.listViewEntriesMainCheckBox').prop('checked', false); jQuery('.listViewEntriesCheckBox').each(function (e) { jQuery(this).prop('checked', false); }); }); }, getRecordsCount: function () { var aDeferred = jQuery.Deferred(); var self = this; var cvId = self.getCurrentCvId(); var module = this.getModuleName(); var parent = app.getParentModuleName(); var defaultParams = this.getDefaultParams(); var postData = { "module": module, "parent": parent, "view": "ListAjax", "viewname": cvId, "mode": "getRecordsCount" }; postData = jQuery.extend(defaultParams, postData); var params = {}; params.data = postData; app.request.get(params).then( function (err, response) { aDeferred.resolve(response); } ); return aDeferred.promise(); }, transferOwnershipSave: function (form) { var listInstance = window.app.controller(); var listSelectParams = listInstance.getListSelectAllParams(false); if (listSelectParams) { var formData = form.serializeFormData(); var data = jQuery.extend(formData, listSelectParams); app.helper.showProgress(); app.request.post({'data': data}).then(function (err, data) { app.helper.hideProgress(); if (err == null) { jQuery('.vt-notification').remove(); app.helper.hideModal(); listInstance.loadListViewRecords().then(function (e) { listInstance.clearList(); app.helper.showSuccessNotification({message: app.vtranslate('JS_RECORDS_TRANSFERRED_SUCCESSFULLY')}); }); } else { app.event.trigger('post.save.failed', err); jQuery(form).find("button[name='saveButton']").removeAttr('disabled'); } }); } }, registerStarToggle: function () { var self = this; var listViewContainer = this.getListViewContainer(); listViewContainer.on('click', '.markStar', function (e) { var element = jQuery(e.currentTarget); if (element.hasClass('processing')) return; element.addClass('processing'); var record = element.closest('tr.listViewEntries').data('id'); var params = {}; params.module = self.getModuleName(); params.action = 'SaveStar'; params.record = record; if (element.hasClass('active')) { params.value = 0; element.removeClass('fa-star').addClass('fa-star-o'); } else { params.value = 1; element.removeClass('fa-star-o').addClass('fa-star'); } element.toggleClass('active'); params._timeStampNoChangeMode = true; app.request.post({data: params}).then(function (err, data) { if (data) { if (params.value == 0) { element.attr("title", app.vtranslate('JS_NOT_STARRED')); } else { element.attr("title", app.vtranslate('JS_STARRED')); } } element.removeClass('processing'); }) if(element.hasClass('active')){ app.helper.showSuccessNotification({'message':app.vtranslate('JS_FOLLOW_RECORD')}); } else { app.helper.showSuccessNotification({'message':app.vtranslate('JS_UNFOLLOW_RECORD')}); } }); }, massStarSave: function (params) { var self = this; var listInstance = window.app.controller(); var selectedRecordCount = listInstance.getSelectedRecordCount(); params.module = this.getModuleName(); params.action = 'SaveStar'; var cvId = this.getCurrentCvId(); params.viewname = cvId; params.search_params = JSON.stringify(self.getListSearchParams()); params = jQuery.extend(params, self.getListSelectAllParams(false)); params._timeStampNoChangeMode = true; app.helper.showProgress(); app.request.post({data: params}).then(function (err, data) { app.helper.hideProgress(); self.loadListViewRecords().then(function (e) { self.clearList(); if(params.value == 1){ app.helper.showSuccessNotification({'message':(app.vtranslate('JS_FOLLOWING')) +' '+ selectedRecordCount +' '+ app.vtranslate(params.module)}); } else { app.helper.showSuccessNotification({'message':app.vtranslate('JS_UNFOLLOWING') +' '+ selectedRecordCount +' '+ app.vtranslate(params.module)}); } }); }) }, getStarRecordRows: function () { var listViewContainer = this.getListViewContainer(); return listViewContainer.find('tr.listViewEntries .markStar.fa-star .active').closest('tr'); }, getUnStarRecordRows: function () { var listViewContainer = this.getListViewContainer(); return listViewContainer.find('tr.listViewEntries .markStar .fa-star-o').closest('tr'); }, isStarFilterMode: function () { var filterType = jQuery('.starFilter li.active').find('a').data('type'); if (filterType == "starred") { return true; } return false; }, isUnStarFilterMode: function () { var filterType = jQuery('.starFilter li.active').find('a').data('type'); if (filterType == "unstarred") { return true; } return false; }, selectRecordsDependingOnStarFilter: function () { if (this.isStarFilterMode()) { this.getStarRecordRows().find('.listViewEntriesCheckBox').trigger('click'); } else if (this.isUnStarFilterMode()) { this.getUnStarRecordRows().find('.listViewEntriesCheckBox').trigger('click'); } else { jQuery('tr.listViewEntries').find('.listViewEntriesCheckBox').trigger('click'); } }, registerStarUnstarFilter: function () { var self = this; var listViewContainer = this.getListViewContainer(); listViewContainer.on('click', '.starFilter li', function (e) { var element = jQuery(e.currentTarget); jQuery('.starFilter li').removeClass('active'); element.addClass('active'); // We need to clear all the check boxes before changing the mode jQuery('tr.listViewEntries').find('.listViewEntriesCheckBox').prop('checked', false); self.clearList(); self.selectRecordsDependingOnStarFilter(); self.showSelectAll(); }); }, /** * Function to get Page Jump Params */ getPageJumpParams: function () { var params = this.getDefaultParams(); params['view'] = "ListAjax"; params['mode'] = "getPageCount"; return params; }, getPagingParams: function () { var thisInstance = this; var params = { "orderby": jQuery('#orderBy').val(), "sortorder": jQuery("#sortOrder").val(), "viewname": thisInstance.getCurrentCvId() }; return params; }, /** * Function to get page count and total number of records in list */ getPageCount: function () { var aDeferred = jQuery.Deferred(); var pageCountParams = this.getPageJumpParams(); var params = { "type": "GET", "data": pageCountParams } app.request.get(params).then( function (err, data) { var response; if (typeof data !== "object") { response = JSON.parse(data); } else { response = data; } aDeferred.resolve(response); } ); return aDeferred.promise(); }, registerDeleteRecordClickEvent: function () { var thisInstance = this; jQuery('#page').on('click', '.deleteRecordButton', function (e) { var elem = jQuery(e.currentTarget); var parent = elem; var params = {}; var originalDropDownMenu = elem.closest('.dropdown-menu').data('original-menu'); if (originalDropDownMenu && typeof originalDropDownMenu != 'undefined') { parent = app.helper.getDropDownmenuParent(originalDropDownMenu); var moduleName = jQuery('#searchModuleList').val(); if (moduleName && typeof moduleName != 'undefined') { params['module'] = moduleName; } } var recordId = parent.closest('tr').data('id'); thisInstance.deleteRecord(recordId, params); // e.stopPropagation(); }); }, _deleteRecord: function (recordId, extraParams) { var thisInstance = this; var module = app.getModuleName(); var postData = { "data": { "module": module, "action": "DeleteAjax", "record": recordId, "parent": app.getParentModuleName(), "viewname": this.getCurrentCvId() } }; if (typeof extraParams === 'undefined') { extraParams = {}; } jQuery.extend(postData.data, extraParams); app.helper.showProgress(); app.request.post(postData).then( function (err, data) { if (err == null) { app.helper.hideProgress(); thisInstance.loadListViewRecords(); } else { app.helper.hideProgress(); app.helper.showErrorNotification({message: app.vtranslate(err.message)}) } }); }, deleteRecord: function (recordId, extraParams) { var thisInstance = this; var message = app.vtranslate('LBL_DELETE_CONFIRMATION'); app.helper.showConfirmationBox({'message': message}).then(function () { thisInstance._deleteRecord(recordId, extraParams); }); }, totalNumOfRecords_performingAsyncAction: false, totalNumOfRecords: function (currentEle) { var thisInstance = this; var listViewContainer = thisInstance.getListViewContainer(); var totalRecordsElement = listViewContainer.find('#totalCount'); var totalNumberOfRecords = totalRecordsElement.val(); if (thisInstance.totalNumOfRecords_performingAsyncAction) { return; } currentEle.find('.showTotalCountIcon').addClass('hide'); if (totalNumberOfRecords === '') { thisInstance.totalNumOfRecords_performingAsyncAction = true; thisInstance.getPageCount().then(function (data) { currentEle.addClass('hide'); totalNumberOfRecords = data.numberOfRecords; totalRecordsElement.val(totalNumberOfRecords); listViewContainer.find('ul#listViewPageJumpDropDown #totalPageCount').text(data.page); thisInstance.showPagingInfo(); thisInstance.totalNumOfRecords_performingAsyncAction = false; }); } else { currentEle.addClass('hide'); thisInstance.showPagingInfo(); } }, showPagingInfo: function () { var thisInstance = this; var listViewContainer = thisInstance.getListViewContainer(); var totalNumberOfRecords = jQuery('#totalCount', listViewContainer).val(); var pageNumberElement = jQuery('.pageNumbersText', listViewContainer); var pageRange = pageNumberElement.text(); var newPagingInfo = pageRange.trim() + " " + app.vtranslate('of') + " " + totalNumberOfRecords + " "; var listViewEntriesCount = parseInt(jQuery('#noOfEntries', listViewContainer).val()); if (listViewEntriesCount !== 0) { jQuery('.pageNumbersText', listViewContainer).html(newPagingInfo); } else { jQuery('.pageNumbersText', listViewContainer).html(""); } }, registerEventToShowQuickPreview: function () { var self = this; var listViewPageDiv = self.getListViewContainer(); listViewPageDiv.on('click', '.quickView', function (e) { var element = listViewPageDiv.find(e.currentTarget); var app = element.data('app'); var row = element.closest('.listViewEntries'); var recordId = row.data('id'); self.showQuickPreviewForId(recordId, app); }); }, registerMoreRecentUpdatesClickEvent: function (container, recordId) { container.find('.moreRecentUpdates').on('click', function () { var recentUpdateURL = "index.php?view=Detail&mode=showRecentActivities&page=1&module=" + app.getModuleName() + "&record=" + recordId + "&tab_label=LBL_UPDATES"; window.location.href = recentUpdateURL; }); }, registerNextRecordClickEvent: function (container) { var self = this; container.find('#quickPreviewNextRecordButton').on('click', function (e) { var element = jQuery(e.currentTarget); var nextRecordId = element.data('record'); var appName = element.data('app'); self.showQuickPreviewForId(nextRecordId, appName); }); }, registerPreviousRecordClickEvent: function (container) { var self = this; container.find('#quickPreviewPreviousRecordButton').on('click', function (e) { var element = jQuery(e.currentTarget); var prevRecordId = element.data('record'); var appName = element.data('app'); self.showQuickPreviewForId(prevRecordId, appName); }); }, showQuickPreviewForId: function (recordId, appName) { var self = this; var vtigerInstance = Vtiger_Index_Js.getInstance(); vtigerInstance.showQuickPreviewForId(recordId, self.getModuleName(), appName); }, registerDynamicListHeaders: function () { var self = this; var listViewContainer = this.getListViewContainer(); if (jQuery('#filterListColumns').length > 0) { jQuery('#filterListColumns').instaFilta({ targets: '.listColumnFilter .list-group-item', sections: '.listColumnFilter .block-item', hideEmptySections: true, beginsWith: false, caseSensitive: false, typeDelay: 0 }); } jQuery('.listColumnFilter .dropdown-menu').on('click', function (e) { e.stopPropagation(); }); var params = { setHeight: '' }; app.helper.showVerticalScroll(jQuery('.viewColumnsList'), params); jQuery('.viewColumnsList').on('click', 'input[type="checkbox"]', function (e, params) { var listHeaderFieldEle = $('input[name="list_headers"]'); var listHeaderFields = JSON.parse(listHeaderFieldEle.val()); if ($(this).is(':checked')) { listHeaderFields = app.helper.array_merge(listHeaderFields, [$(this).val()]); } else { var index = app.helper.array_search($(this).val(), listHeaderFields); delete listHeaderFields[index]; } listHeaderFieldEle.val(JSON.stringify(listHeaderFields)); }); jQuery('#updateListing').on('click', function (e, params) { if (typeof params === "undefined" || !params.noFilterLoad) { self.loadListViewRecords(); } }); }, /* * Function to check whether atleast one record is checked */ checkListRecordSelected: function () { var selectedIds = this.readSelectedIds(); if (typeof selectedIds == 'object' && selectedIds.length <= 0) { return true; } return false; }, /** * Function to update Pagining status */ updatePagination: function () { var listViewContainer = this.getListViewContainer(); var previousPageExist = jQuery('#previousPageExist', listViewContainer).val(); var nextPageExist = jQuery('#nextPageExist', listViewContainer).val(); var previousPageButton = jQuery('#PreviousPageButton', listViewContainer); var nextPageButton = jQuery('#NextPageButton', listViewContainer); var pageJumpButton = jQuery('#PageJump', listViewContainer); var listViewEntriesCount = parseInt(jQuery('#noOfEntries', listViewContainer).val()); var pageStartRange = parseInt(jQuery('#pageStartRange', listViewContainer).val()); var pageEndRange = parseInt(jQuery('#pageEndRange', listViewContainer).val()); var pages = jQuery('#totalPageCount', listViewContainer).text(); var totalNumberOfRecords = jQuery('.totalNumberOfRecords', listViewContainer); var pageNumbersTextElem = jQuery('.pageNumbersText', listViewContainer); var currentPageNumber = jQuery('#pageNumber', listViewContainer).val(); jQuery('#pageToJump', listViewContainer).val(currentPageNumber); if (pages > 1) { pageJumpButton.removeAttr('disabled'); } if (previousPageExist !== "") { previousPageButton.removeAttr('disabled'); } else if (previousPageExist === "") { previousPageButton.attr("disabled", "disabled"); } if ((nextPageExist !== "")) { nextPageButton.removeAttr('disabled'); } else if ((nextPageExist === "") || (pages === 1)) { nextPageButton.attr("disabled", "disabled"); } if (listViewEntriesCount !== 0) { var pageNumberText = pageStartRange + " " + app.vtranslate('to') + " " + pageEndRange; pageNumbersTextElem.html(pageNumberText); totalNumberOfRecords.removeClass('hide'); } else { pageNumbersTextElem.html("<span> </span>"); if (!totalNumberOfRecords.hasClass('hide')) { totalNumberOfRecords.addClass('hide'); } } }, initializePaginationEvents: function () { var thisInstance = this; var paginationObj = this.getComponentInstance('Vtiger_Pagination_Js'); var listViewContainer = thisInstance.getListViewContainer(); paginationObj.initialize(listViewContainer); app.event.on(paginationObj.nextPageButtonClickEventName, function () { var pageLimit = listViewContainer.find('#pageLimit').val(); var noOfEntries = listViewContainer.find('#noOfEntries').val(); var nextPageExist = listViewContainer.find('#nextPageExist').val(); var pageNumber = listViewContainer.find('#pageNumber').val(); var nextPageNumber = parseInt(parseFloat(pageNumber)) + 1; if (noOfEntries === pageLimit && nextPageExist) { var urlParams = {}; listViewContainer.find("#pageNumber").val(nextPageNumber); thisInstance.loadListViewRecords(urlParams); } }); app.event.on(paginationObj.previousPageButtonClickEventName, function () { var pageNumber = listViewContainer.find('#pageNumber').val(); var previousPageNumber = parseInt(parseFloat(pageNumber)) - 1; if (pageNumber > 1) { var urlParams = {}; listViewContainer.find('#pageNumber').val(previousPageNumber); thisInstance.loadListViewRecords(urlParams); } }); app.event.on(paginationObj.pageJumpButtonClickEventName, function (event, currentEle) { thisInstance.pageJump(); }); app.event.on(paginationObj.totalNumOfRecordsButtonClickEventName, function (event, currentEle) { thisInstance.totalNumOfRecords(currentEle); }); app.event.on(paginationObj.pageJumpSubmitButtonClickEvent, function (event, currentEle) { thisInstance.pageJumpOnSubmit(currentEle); }); }, saveTag: function (callerParams) { var aDeferred = jQuery.Deferred(); var params = { 'module': app.getModuleName(), 'action': 'TagCloud', 'mode': 'saveTags' }; var cvId = this.getCurrentCvId(); params.viewname = cvId; params.search_params = JSON.stringify(this.getListSearchParams()); params = jQuery.extend(params, this.getListSelectAllParams(false)); var params = jQuery.extend(params, callerParams); app.request.post({'data': params}).then( function (error, data) { if (error == null) { aDeferred.resolve(data); } else { aDeferred.reject(data); } } ); return aDeferred.promise(); }, constructTagElement: function (params) { var tagElement = jQuery(jQuery('#dummyTagElement').html()).clone(true); tagElement.attr('data-id', params.id).attr('data-type', params.type); tagElement.find('.tagLabel').text(params.name); return tagElement }, addTagToList: function (tagElement) { var container = jQuery('#listViewTagContainer'); var tagsListCount = parseInt(container.data('listTagCount')); if (container.find('>.tag').length < tagsListCount) { container.append(tagElement); } else { container.find('.moreListTags').append(tagElement); } var moreTagTriggerEle = container.find('.moreTagCount'); var moreTagCount = parseInt(moreTagTriggerEle.text()); moreTagCount++; moreTagTriggerEle.text(moreTagCount); if (moreTagTriggerEle.hasClass('hide') && moreTagCount > 0 && (!container.find('.moreListTags').hasClass('hide'))) { moreTagTriggerEle.removeClass('hide'); } }, checkAndAddTagsToList: function (tagEleList) { var self = this; var container = jQuery('#listViewTagContainer'); tagEleList.each(function (index, domEle) { var tagEle = jQuery(domEle); var tagId = tagEle.data('id'); if (container.find('[data-id="' + tagId + '"]').length <= 0) { // No delete option from list view tagEle.find(".deleteTag").remove(); self.addTagToList(tagEle); } }) }, addToExistingTagSelector: function (tagEle) { var showAllTagContainer = jQuery('.showAllTagContainer'); var existingTagMenu = showAllTagContainer.find('.currentTagMenu'); if (existingTagMenu.find('.tag[data-id="' + tagEle.data('id') + '"]').length <= 0) { var clonedTagEle = tagEle; clonedTagEle.find('.editTag').remove(); var dummyTagListElement = existingTagMenu.find('.dummyExistingTagElement').clone(true).removeClass('dummyExistingTagElement'); dummyTagListElement.find('.tag').replaceWith(clonedTagEle); dummyTagListElement.removeClass('hide').appendTo(existingTagMenu.find('ul')); } }, showAllTags: function (container) { var self = this; var recordParams = {}; var cvId = this.getCurrentCvId(); recordParams.viewname = cvId; recordParams.search_params = JSON.stringify(this.getListSearchParams()); recordParams = jQuery.extend(recordParams, this.getListSelectAllParams(false)); app.event.one('post.MassTag.save', function (e, modalContainerClone, data) { var newlySelectedTags = modalContainerClone.find('.currentTag .tag'); self.checkAndAddTagsToList(newlySelectedTags); var newlyAddedTags = data['new']; for (var tagId in newlyAddedTags) { var newTagParams = newlyAddedTags[tagId]; newTagParams.id = tagId; var newTagEle = self.constructTagElement(newTagParams); self.addTagToList(newTagEle.clone(true)); self.addToExistingTagSelector(newTagEle.clone(true)); } app.helper.showSuccessNotification({"message": ''}); }); app.event.trigger('Request.MassTag.show', container, recordParams); }, massRemoveTag: function (tagId) { var self = this; var tagElement = jQuery("#listViewTagContainer").find('[data-id="' + tagId + '"]'); var tagName = tagElement.find('.tagLabel').text(); var message = app.vtranslate('JS_REMOVE_MASS_TAG_WARNING', tagName); app.helper.showConfirmationBox({'message': message}).then(function () { var tagInstance = self.getComponentInstance('Vtiger_Tag_Js'); var deleteParams = {}; var cvId = self.getCurrentCvId(); deleteParams.search_params = JSON.stringify(self.getListSearchParams()); deleteParams = jQuery.extend(deleteParams, self.getListSelectAllParams(false)); deleteParams.viewname = cvId; var saveTagList = {}; var tagIdsToDelete = new Array(); var tagIdsToAdd = new Array(); var existingTagIdList = new Array(); tagIdsToDelete.push(tagId); saveTagList['existing'] = existingTagIdList; saveTagList['new'] = tagIdsToAdd; saveTagList['deleted'] = tagIdsToDelete; deleteParams['tagsList'] = saveTagList; tagInstance.saveTag(deleteParams).then(function (data) { self.clearList(); self.loadListViewRecords().then(function (e) { app.helper.showSuccessNotification({"message": ''}); }); }); }) }, registerEditLink: function () { jQuery('#page').on('click', 'a[name="editlink"]', function (e) { var element = jQuery(e.currentTarget); var url = element.data('url'); var listInstance = Vtiger_List_Js.getInstance(); var postData = listInstance.getDefaultParams(); for (var key in postData) { if (postData[key]) { postData['return' + key] = postData[key]; delete postData[key]; } else { delete postData[key]; } } e.preventDefault(); e.stopPropagation(); window.location.href = url + '&' + $.param(postData); }); }, registerDynamicDropdownPosition: function (container, relativeto) { if (typeof jQuery.fn.sadropdown === 'function') { jQuery('.' + container).find('.dropdown-toggle').sadropdown({ relativeTo: '.' + relativeto }); } }, registerPostLoadListViewActions: function () { var self = this; var recordSelectTrackerObj = self.getRecordSelectTrackerInstance(); var selectedIds = recordSelectTrackerObj.getSelectedIds(); if (selectedIds != '') { self.enableListViewActions(); } else { self.disableListViewActions(); } self.registerDynamicDropdownPosition(); self.registerDropdownPosition(); }, enableListViewActions: function () { jQuery('.btn-group.listViewActionsContainer').find('button').removeAttr('disabled'); jQuery('.btn-group.listViewActionsContainer').find('li').removeClass('hide'); }, disableListViewActions: function () { jQuery('.btn-group.listViewActionsContainer').find('button').attr('disabled', "disabled"); jQuery('.btn-group.listViewActionsContainer').find('.dropdown-toggle').removeAttr("disabled"); jQuery('.btn-group.listViewActionsContainer').find('li').addClass('hide'); var selectFreeRecords = jQuery('.btn-group.listViewActionsContainer').find('li.selectFreeRecords'); selectFreeRecords.removeClass('hide'); if (selectFreeRecords.length == 0) { jQuery('.btn-group.listViewActionsContainer').find('.dropdown-toggle').attr('disabled', "disabled"); } }, /* * Function to register the click event of email field */ registerEmailFieldClickEvent: function () { var listViewContentDiv = this.getListViewContainer(); listViewContentDiv.on('click', '.emailField', function (e) { e.stopPropagation(); }); }, /* * Function to register the click event of phone field */ registerPhoneFieldClickEvent: function () { var listViewContentDiv = this.getListViewContainer(); listViewContentDiv.on('click', '.phoneField', function (e) { e.stopPropagation(); }); }, registerConfigureColumnsEvents: function () { var thisInstance = this; var listViewContentDiv = this.getListViewContainer(); listViewContentDiv.on('click', '.listColumnFilter', function (e) { if (jQuery(e.currentTarget).hasClass('disabled')) { return false; } var params = { module: app.module(), view: 'ListAjax', mode: 'ShowListColumnsEdit', source_module: app.module(), cvid: thisInstance.getCurrentCvId() }; var callback = function (container) { var selectedFieldsList = jQuery('#selectedFieldsList'); var selectedFieldsListContainer = container.find('.selectedFieldsListContainer'); var availFieldsList = jQuery('#avialFieldsList'); var availFieldsListContainer = container.find('.avialFieldsListContainer'); //register ui events app.helper.showVerticalScroll(availFieldsListContainer, {setHeight: '200', advanced: {updateOnSelectorChange: 'true'}}); app.helper.showVerticalScroll(selectedFieldsListContainer, {setHeight: '250', advanced: {updateOnSelectorChange: 'true'}}); selectedFieldsList.sortable({ start: function (e, ui) { if (!ui.item.hasClass('active')) { ui.item.addClass('active'); } }, stop: function (e, ui) { ui.item.removeClass('active'); } }); container.find('.searchAvailFields').instaFilta({ onFilterComplete: function (macthedItems) { if (macthedItems.length > 0) { jQuery.each(macthedItems, function (i, ele) { var parent = jQuery(ele).closest('.instafilta-section'); var availFieldBlock = parent.find('.availFieldBlock'); if (availFieldBlock.find('i').hasClass('fa-caret-right')) { availFieldBlock.find('a[data-parent="#accordion"]').trigger('click'); } }); } } }); availFieldsListContainer.on('click', '.availFieldBlock a[data-parent="#accordion"]', function (e) { var target = jQuery(e.currentTarget); var closestItag = target.find('i'); if (closestItag.hasClass('fa-caret-right')) { closestItag.removeClass('fa-caret-right').addClass('fa-caret-down'); } else { closestItag.removeClass('fa-caret-down').addClass('fa-caret-right'); } if (params && params.autoIconChangeForOthers) { return true; } }); //remove selected field event selectedFieldsList.on('click', '.removeField', function (e) { var selectedFieldsEles = selectedFieldsList.find('.item'); if (selectedFieldsEles.length <= 1) { app.helper.showErrorNotification({message: app.vtranslate('Atleast one field should be selected')}); return false; } var ele = jQuery(e.currentTarget); var sourceFieldEle = ele.parent('.item'); var targetFieldEle = availFieldsListContainer.find('.item[data-cv-columnname="' + sourceFieldEle.attr('data-cv-columnname') + '"]'); targetFieldEle.removeClass('hide'); sourceFieldEle.remove(); }); //add available field to selected list availFieldsList.on('click', '.item', function (e) { var selectedFieldsEles = selectedFieldsList.find('.item'); if (selectedFieldsEles.length > 15) { app.helper.showErrorNotification({message: app.vtranslate('JS_ADD_MAX_15_ITEMS')}); return false; } var sourceFieldEle = jQuery(e.currentTarget); var targetFieldEle = selectedFieldsListContainer.find('.item-dummy').clone(); targetFieldEle.removeClass('hide item-dummy').addClass('item'); targetFieldEle.attr('data-cv-columnname', sourceFieldEle.attr('data-cv-columnname')); targetFieldEle.attr('data-columnname', sourceFieldEle.attr('data-columnname')); targetFieldEle.attr('data-field-id', sourceFieldEle.attr('data-field-id')); targetFieldEle.find('.fieldLabel').html(sourceFieldEle.find('.fieldLabel').html()); targetFieldEle.appendTo(selectedFieldsList); sourceFieldEle.addClass('hide'); }); var configColumnsForm = container.find('.configColumnsForm'); var params = { submitHandler: function (form) { var formData = jQuery(form).serializeFormData(); var columnsList = []; var selectedFieldEles = selectedFieldsList.find('.item'); jQuery.each(selectedFieldEles, function (i, e) { var ele = jQuery(e); columnsList.push(ele.attr('data-cv-columnname')); }); formData.source_module = app.module(); formData.columnslist = JSON.stringify(columnsList); app.helper.showProgress(); app.request.post({data: formData}).then(function (err, res) { app.helper.hideProgress(); if (err) { app.helper.showErrorNotification({"message": err}); return false; } else { app.helper.showSuccessNotification({message: res.message}); app.helper.hideModal(); var appName = app.getAppName(); var url = res['listviewurl'] + '&app=' + appName; window.location.href = url; } }); } }; configColumnsForm.vtValidate(params); } app.helper.showProgress(); app.request.post({data: params}).then(function (err, res) { app.helper.hideProgress(); if (!err) { app.helper.showModal(jQuery(res), {cb: callback}); } }); }); }, /** * Function to get field value of closeset element from sourceElement * @param {type} fieldName * @param {type} sourceElement * @returns {unresolved} */ getFieldValue: function (fieldName, sourceElement) { var closestContextEle = sourceElement.closest('tr'); return closestContextEle.find('[name="' + fieldName + '"]').val(); }, /** * Function to register event to handle stickyhead for window scroll action * @returns {undefined} */ registerEventToHandleStickyHeadOnWindowScroll: function () { var thisInstance = this; jQuery(window).scroll(function () { var container = thisInstance.getListViewContainer(); var stickyHeader = container.find('.sticky-thead'); if (stickyHeader.css('display') == "block") { var select2Elem = jQuery(stickyHeader).find('select.select2'); if (select2Elem.length > 1) { jQuery(select2Elem).each(function (key, value) { var element = jQuery(value); var parentTableHeader = element.closest('th'); parentTableHeader.find('div.select2-container').remove(); vtUtils.showSelect2ElementView(element); }); } else { var parentTableHeader = select2Elem.closest('th'); parentTableHeader.find('div.select2-container').remove(); vtUtils.showSelect2ElementView(select2Elem); } } }); }, registerPostListLoadListener: function () { var self = this; app.event.on('post.listViewFilter.click', function (event, searchRow) { if (searchRow) { vtUtils.applyFieldElementsView(searchRow); self.filterClick = false; } self.registerFloatingThead(); }); }, registerEvents: function () { var thisInstance = this; this._super(); this.registerListViewSort(); this.registerRemoveListViewSort(); this.registerRowClickEvent(); this.registerRowDoubleClickEvent(); this.registerListViewBasicActions(); this.registerListViewSearch(); this.registerDeleteRecordClickEvent(); this.registerCheckBoxClickEvent(); this.registerSelectAllClickEvent(); this.registerDeSelectAllClickEvent(); this.registerListViewMainCheckBoxClickEvent(); this.registerStarToggle(); this.registerStarUnstarFilter(); this.registerDynamicListHeaders(); this.registerEditLink(); this.registerEmailFieldClickEvent(); this.registerPhoneFieldClickEvent(); this.registerDynamicDropdownPosition(); this.registerDropdownPosition(); this.registerConfigureColumnsEvents(); var recordSelectTrackerObj = this.getRecordSelectTrackerInstance(); recordSelectTrackerObj.registerEvents(); this.registerPostListLoadListener(); this.registerPostLoadListViewActions(); app.event.on('post.listViewMassEditSave', function () { var urlParams = {}; thisInstance.loadListViewRecords(urlParams); thisInstance.clearList(); }); this.registerEventToShowQuickPreview(); //reference fields quick preview handled in Vtiger.js // this.registerEventToHandleStickyHeadOnWindowScroll(); // if(jQuery('#listViewContent').find('table.listview-table').length){ // if(jQuery('.sticky-wrap').length == 0){ // stickyheader.controller(); // var container = this.getListViewContainer(); // container.find('.sticky-thead').addClass('listview-table'); // app.helper.dynamicListViewHorizontalScroll(); // } // } // //floatTHead, some timeout so correct height can be caught for computations setTimeout(function () { thisInstance.registerFloatingThead(); }, 10); app.event.on('Vtiger.Post.MenuToggle', function () { thisInstance.reflowList(); }); this.registerDynamicDropdownPosition(); this.registerHeaderReflowOnListSearchSelections(); this.registerDropdownPosition(); //For Pagination thisInstance.initializePaginationEvents(); //END }, registerHeaderReflowOnListSearchSelections: function () { var listViewContentDiv = this.getListViewContainer(); var thisInstance = this; var $table = jQuery('#listview-table'); listViewContentDiv.on('select2-selecting select2-close select2-removed', '.listSearchContributor', function () { thisInstance.reflowList($table); }); }, registerDropdownPosition: function (container) { if (typeof container === "undefined") { container = "#page"; } jQuery('.table-actions').on('click', '.dropdown', function (e) { var containerTarget = jQuery(this).closest(container); var content = jQuery(this).closest(".dropdown"); var dropdown = jQuery(e.currentTarget); if (dropdown.find('[data-toggle]').length <= 0) { return; } var dropdown_menu = dropdown.find('.dropdown-menu'); var dropdownStyle = dropdown_menu.find('li a'); dropdownStyle.css('padding', "0 6px", 'important'); var fixed_dropdown_menu = dropdown_menu.clone(true); fixed_dropdown_menu.data('original-menu', dropdown_menu); dropdown_menu.css('position', 'relative'); dropdown_menu.css('display', 'none'); var currtargetTop; var currtargetLeft; var dropdownBottom; var ftop = 'auto'; var fbottom = 'auto'; if (container === "#page") { currtargetTop = dropdown.offset().top + dropdown.height(); currtargetLeft = dropdown.offset().left; dropdownBottom = jQuery(window).height() - currtargetTop + dropdown.height(); } var windowBottom = jQuery(window).height() - dropdown.offset().top; if (windowBottom < 250) { ftop = 'auto'; fbottom = dropdownBottom + 'px'; } else { ftop = currtargetTop + 'px'; fbottom = "auto"; } fixed_dropdown_menu.css({ 'display': 'block', 'position': 'absolute', 'top': ftop, 'left': currtargetLeft + 'px', 'bottom': fbottom }).appendTo(containerTarget); $('#table-content').scroll(function () { var tTop; var cBottom = $('#table-content').height() - content.position().top; var tBottom; if (cBottom < 250) { tTop = "auto"; tBottom = dropdown.height(); } else { tTop = dropdown.height(); tBottom = "auto"; } if (content.hasClass('open')) { fixed_dropdown_menu.css({ 'display': 'block', 'top': tTop, 'position': 'absolute', 'bottom': tBottom, 'left': 0, 'z-index': 100 }).appendTo(content); } else { dropdown_menu.css('display', 'none'); } }); dropdown.on('hidden.bs.dropdown', function () { dropdown_menu.removeClass('invisible'); fixed_dropdown_menu.remove(); jQuery('.listViewEntries').removeClass('dropDownOpen'); }); }); jQuery('.listViewEntries').mouseleave(function (e) { var currentDropDown = jQuery(e.currentTarget).find('.dropdown'); setTimeout(function () { if (jQuery('.dropdown-menu:hover').length == 0) { if (currentDropDown.hasClass('open')) { jQuery(e.currentTarget).find('.dropdown').trigger('click'); } jQuery(e.currentTarget).removeClass('dropDownOpen'); } else { jQuery(e.currentTarget).addClass('dropDownOpen'); } }, 50); }); }, getListViewContentHeight: function () { var windowHeight = jQuery(window).height(); //list height should be 76% of window height var listViewContentHeight = windowHeight * 0.76103500761035; var listViewTable = jQuery('#listview-table'); if (listViewTable.length) { if (!listViewTable.find('tr.emptyRecordsDiv').length) { var listTableHeight = jQuery('#listview-table').height(); if (listTableHeight < listViewContentHeight) { listViewContentHeight = listTableHeight + 3; } } } return listViewContentHeight + 'px'; }, getListViewContentWidth: function () { return '100%'; }, reflowList: function () { if (typeof $.fn.perfectScrollbar !== 'function' || typeof $.fn.floatThead !== 'function') { return; } var $table = jQuery('#listview-table'); if (!$table.length) return; var height = this.getListViewContentHeight(); var width = this.getListViewContentWidth(); var tableContainer = $table.closest('.table-container'); tableContainer.css({ 'position': 'relative', 'height': height, 'width': width }); tableContainer.perfectScrollbar('update'); $table.floatThead('reflow'); }, registerFloatingThead: function () { if (typeof $.fn.perfectScrollbar !== 'function' || typeof $.fn.floatThead !== 'function') { return; } var $table = jQuery('#listview-table'); if (!$table.length) return; var height = this.getListViewContentHeight(); var width = this.getListViewContentWidth(); var tableContainer = $table.closest('.table-container'); tableContainer.css({ 'position': 'relative', 'height': height, 'width': width }); tableContainer.perfectScrollbar({ 'wheelPropagation': true }); $table.floatThead({ scrollContainer: function ($table) { return $table.closest('.table-container'); } }); }, getSelectedRecordCount: function () { var count = 0; var selectedRecords = this.readSelectedIds(); if (selectedRecords) { if (selectedRecords != 'all') { count = selectedRecords.length; } else { var excludedIdsCount = this.readExcludedIds().length; var totalRecords = jQuery('#totalRecordsCount').text(); count = totalRecords - excludedIdsCount; } } return count; } });
[+]
..
[-] RelatedList.js
[edit]
[-] EmailsRelatedPopup.js
[edit]
[-] Detail.js
[edit]
[-] Field.js
[edit]
[-] CkEditor.js
[edit]
[-] Tag.js
[edit]
[-] Header.js
[edit]
[-] AdvanceSearch.js
[edit]
[-] validation.js
[edit]
[-] ExtensionCommon.js
[edit]
[-] SearchList.js
[edit]
[-] Edit.js
[edit]
[-] MergeRecords.js
[edit]
[-] Pagination.js
[edit]
[-] Popup.js
[edit]
[-] FindDuplicates.js
[edit]
[-] RecordSelectTracker.js
[edit]
[-] Vtiger.js
[edit]
[-] DashBoard.js
[edit]
[-] SearchAdvanceFilter.js
[edit]
[+]
dashboards
[-] AdvanceFilter.js
[edit]
[-] AdvanceSearchList.js
[edit]
[-] List.js
[edit]
[-] Base.js
[edit]
[-] Utils.js
[edit]
[-] Extension.js
[edit]
[-] ListSidebar.js
[edit]
[-] Class.js
[edit]
[-] BasicSearch.js
[edit]
[-] BaseList.js
[edit]