[Vtigercrm-developers] Multiple contacts connected to a single field

Uma S uma.s at vtiger.com
Tue Oct 6 07:15:49 GMT 2020


Hi Mohan,

>From you explanation on this issue, I can notice that you are facing issue
with addNewContactToRelatedList() api in the below mentioned line

var selectContainer = jQuery(element.data('select2').container, form);

As you're looking for a data object on string, Please to convert 'element'
of string type to jQuery object before accessing contents.I mean you should
use jQuery(element).data('select2').

On Tue, Oct 6, 2020 at 2:42 AM Sukhdev Mohan <s.mohan at myti.it> wrote:

> Hi Uma,
>
> So I’ve managed to select, save, edit and view a single field. I’m now
> facing problem to add this functionality to other 4 fields. I’m sharing the
> Edit.js
> Since I wanted to avoid duplicating registerRelatedContactSpecificEvents I’ve
> tried to modularise by defining an array of elements and cycle on it (not
> the most elegant solution I recon) But as you can guess this doesn’t work:
> when the pop up opens it’s fine, when I select the the contacts it give me
> error "Uncaught TypeError: element.data(...) is undefined: Im guessing
> the loop isn’t working as I thought. Can you (*or anybody else) help me out
> editing this code to work for my use case?
>
> /*+***********************************************************************************
>  * 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_Edit_Js("Processi_Edit_Js",{
>
> },{
>
>     relatedContactElement : false,
>
>     elementwithContacts: [
>         'mbs_contact',
>         'bsm_contact',
>         'bi_contact',
>         'altri_contact',
>         'comune_contact'
>     ],
>
>     getRelatedContactElement : function(form, element) {
>         if(typeof form == "undefined") {
>             form = this.getForm();
>         }
>         this.relatedContactElement =  jQuery(`#${element}_display`, form);
>         return this.relatedContactElement;
>     },
>
>     openPopUp : function(e){
>         var thisInstance = this;
>         var parentElem = thisInstance.getParentElement(jQuery(e.target));
>
>         var params = this.getPopUpParams(parentElem);
>         params.view = 'Popup';
>
>         var isMultiple = false;
>         if(params.multi_select) {
>             isMultiple = true;
>         }
>
>         var sourceFieldElement = jQuery('input[class="sourceField"]',parentElem);
>
>         var prePopupOpenEvent = jQuery.Event(Vtiger_Edit_Js.preReferencePopUpOpenEvent);
>         sourceFieldElement.trigger(prePopupOpenEvent);
>
>         if(prePopupOpenEvent.isDefaultPrevented()) {
>             return ;
>         }
>         var popupInstance = Vtiger_Popup_Js.getInstance();
>         popupInstance.showPopup(params,function(data){
>             var responseData = JSON.parse(data);
>             var dataList = new Array();
>             for(var id in responseData){
>                 var data = {
>                     'name' : responseData[id].name,
>                     'id' : id
>                 }
>                 dataList.push(data);
>                 if(!isMultiple) {
>                     thisInstance.setReferenceFieldValue(parentElem, data);
>                 }
>             }
>
>             if(isMultiple) {
>                 sourceFieldElement.trigger(Vtiger_Edit_Js.refrenceMultiSelectionEvent,{'data':dataList});
>             }
>             sourceFieldElement.trigger(Vtiger_Edit_Js.postReferenceSelectionEvent,{'data':responseData});
>         });
>     },
>
>     registerRelatedContactSpecificEvents : function(form) {
>         console.log(form);
>         this.elementwithContacts.forEach(element => {
>             console.log(element);
>             var thisInstance = this;
>             if(typeof form == "undefined") {
>                 form = this.getForm();
>             }
>             form.find(`[name="${element}"]`).on(Vtiger_Edit_Js.preReferencePopUpOpenEvent,function(e){
>                 var parentIdElement = form.find(`[name="${element}"]`);
>                 var container = parentIdElement.closest('td');
>                 var popupReferenceModule = jQuery('input[name="popupReferenceModule"]',container).val();
>             })
>
>             this.getRelatedContactElement(form).select2({
>                 minimumInputLength: 3,
>                 ajax : {
>                     'url' : 'index.php?module=Contacts&action=BasicAjax&search_module=Contacts',
>                     'dataType' : 'json',
>                     'data' : function(term,page){
>                         var data = {};
>                         data['search_value'] = term;
>
>                         return data;
>                     },
>                     'results' : function(data){
>                         data.results = data.result;
>                         for(var index in data.results ) {
>
>                             var resultData = data.result[index];
>                             resultData.text = resultData.label;
>                         }
>                         return data
>                     },
>                     transport : function(params){
>                         return jQuery.ajax(params);
>                     }
>                 },
>                 multiple : true,
>                 //To Make the menu come up in the case of quick create
>                 dropdownCss : {'z-index' : '10001'}
>             });
>
>             //To add multiple selected contact from popup
>             form.find(`[name="${element}"]`).on(Vtiger_Edit_Js.refrenceMultiSelectionEvent,function(e,result){
>                 thisInstance.addNewContactToRelatedList(result,form, element);
>             });
>
>             this.fillRelatedContacts(form, element);
>         });
>     },
>     /**
>      * Function to get reference search params
>      */
>     getReferenceSearchParams : function(element){
>         var tdElement = jQuery(element).closest('td');
>         var params = {};
>         var previousTd = tdElement.prev();
>         var multiModuleElement = jQuery('select.referenceModulesList', previousTd);
>
>         var referenceModuleElement;
>         if(multiModuleElement.length) {
>             referenceModuleElement = multiModuleElement;
>         } else {
>             referenceModuleElement = jQuery('input[name="popupReferenceModule"]',tdElement).length ?
>                 jQuery('input[name="popupReferenceModule"]',tdElement) : jQuery('input.popupReferenceModule',tdElement);
>         }
>         var searchModule =  referenceModuleElement.val();
>         params.search_module = searchModule;
>         return params;
>     },
>
>     initializeContactIdList : function(form, element) {
>         var relatedContactElement = this.getRelatedContactElement(form, element);
>         if(this.isEvents(form) && relatedContactElement.length) {
>             jQuery(`<input type="hidden" name=${element}_contactidlist />`).appendTo(form).val(relatedContactElement.val().split(',').join(';'));
>             form.find(`[name="${element}"]`).attr('name','');
>         }
>     },
>
>     registerRecordPreSaveEvent : function(form) {
>         var thisInstance = this;
>         if(typeof form === "undefined") {
>             form = this.getForm();
>         }
>         var InitialFormData = form.serialize();
>         app.event.one(Vtiger_Edit_Js.recordPresaveEvent,function(e) {
>             thisInstance.registerRecurringEditOptions(e,form,InitialFormData);
>             thisInstance.addInviteesIds(form);
>             thisInstance.resetRecurringDetailsIfDisabled(form);
>             thisInstance.initializeContactIdList(form);
>         });
>     },
>
>
>     /**
>      * Function which will fill the already saved contacts on load
>      */
>     fillRelatedContacts : function(form, element) {
>         if(typeof form == "undefined") {
>             form = this.getForm();
>         }
>         var relatedContactValue = form.find(`[name="related_${element}_info"]`).data('value');
>         for(var contactId in relatedContactValue) {
>             var info = relatedContactValue[contactId];
>             info.text = info.name;
>             relatedContactValue[contactId] = info;
>         }
>         this.getRelatedContactElement(form, element).select2('data',relatedContactValue);
>     },
>
>
>     addNewContactToRelatedList : function(newContactInfo, form, element){
>         if(form.length <= 0) {
>             form = this.getForm();
>         }
>         var resultentData = new Array();
>
>         var element =  jQuery(`#${element}_display`, form);
>         var selectContainer = jQuery(element.data('select2').container, form);
>         var choices = selectContainer.find('.select2-search-choice');
>         choices.each(function(index,element){
>             resultentData.push(jQuery(element).data('select2-data'));
>         });
>         var select2FormatedResult = newContactInfo.data;
>         for(var i=0 ; i < select2FormatedResult.length; i++) {
>             var recordResult = select2FormatedResult[i];
>             recordResult.text = recordResult.name;
>             resultentData.push( recordResult );
>         }
>         element.select2('data',resultentData);
>         if(form.find('.quickCreateContent').length > 0) {
>             form.find(`[name="related_${element}_info"]`).data('value', resultentData);
>             var relatedContactElement = this.getRelatedContactElement(form);
>             if(relatedContactElement.length > 0) {
>                 jQuery(`<input type="hidden" name=${element}_contactidlist />`).appendTo(form).val(relatedContactElement.val().split(',').join(';'));
>                 form.find(`[name="${element}"]`).attr('name','');
>             }
>         }
>     },
>
>
>     registerBasicEvents : function(container) {
>         this._super(container);
>         this.registerRecordPreSaveEvent(container);
>         this.registerRelatedContactSpecificEvents(container);
>     }
> });
>
>
> Best Regards,
> *Sukhdev Mohan* | *Software Developer*
>
> _______________________________________________
> http://www.vtiger.com/



-- 
With
Best Regards
Uma.S
Vtiger Team
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.vtigercrm.com/pipermail/vtigercrm-developers/attachments/20201006/b5777792/attachment-0001.html>


More information about the vtigercrm-developers mailing list