晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
|
Server : Apache System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 User : rainic ( 1014) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/akaindir/public_html/crm/layouts/vlayout/modules/Vtiger/resources/ |
Upload File : |
/*+***********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
*************************************************************************************/
jQuery.Class("Vtiger_Edit_Js",{
//Event that will triggered when reference field is selected
referenceSelectionEvent : 'Vtiger.Reference.Selection',
//Event that will triggered when reference field is selected
referenceDeSelectionEvent : 'Vtiger.Reference.DeSelection',
//Event that will triggered before saving the record
recordPreSave : 'Vtiger.Record.PreSave',
refrenceMultiSelectionEvent : 'Vtiger.MultiReference.Selection',
preReferencePopUpOpenEvent : 'Vtiger.Referece.Popup.Pre',
editInstance : false,
postReferenceSelectionEvent: 'Vtiger.PostReference.Selection',
/**
* Function to get Instance by name
* @params moduleName:-- Name of the module to create instance
*/
getInstanceByModuleName : function(moduleName){
if(typeof moduleName == "undefined"){
moduleName = app.getModuleName();
}
var parentModule = app.getParentModuleName();
if(parentModule == 'Settings'){
var moduleClassName = parentModule+"_"+moduleName+"_Edit_Js";
if(typeof window[moduleClassName] == 'undefined'){
moduleClassName = moduleName+"_Edit_Js";
}
var fallbackClassName = parentModule+"_Vtiger_Edit_Js";
if(typeof window[fallbackClassName] == 'undefined') {
fallbackClassName = "Vtiger_Edit_Js";
}
} else {
moduleClassName = moduleName+"_Edit_Js";
fallbackClassName = "Vtiger_Edit_Js";
}
if(typeof window[moduleClassName] != 'undefined'){
var instance = new window[moduleClassName]();
}else{
var instance = new window[fallbackClassName]();
}
return instance;
},
getInstance: function(){
if(Vtiger_Edit_Js.editInstance == false){
var instance = Vtiger_Edit_Js.getInstanceByModuleName();
Vtiger_Edit_Js.editInstance = instance;
return instance;
}
return Vtiger_Edit_Js.editInstance;
}
},{
formElement : false,
getForm : function() {
if(this.formElement == false){
this.setForm(jQuery('#EditView'));
}
return this.formElement;
},
setForm : function(element){
this.formElement = element;
return this;
},
getPopUpParams : function(container) {
var params = {};
var sourceModule = app.getModuleName();
var popupReferenceModule = jQuery('input[name="popupReferenceModule"]',container).val();
var sourceFieldElement = jQuery('input[class="sourceField"]',container);
var sourceField = sourceFieldElement.attr('name');
var sourceRecordElement = jQuery('input[name="record"]');
var sourceRecordId = '';
if(sourceRecordElement.length > 0) {
sourceRecordId = sourceRecordElement.val();
}
var isMultiple = false;
if(sourceFieldElement.data('multiple') == true){
isMultiple = true;
}
var params = {
'module' : popupReferenceModule,
'src_module' : sourceModule,
'src_field' : sourceField,
'src_record' : sourceRecordId
}
if(isMultiple) {
params.multi_select = true ;
}
return params;
},
openPopUp : function(e){
var thisInstance = this;
var parentElem = jQuery(e.target).closest('td');
var params = this.getPopUpParams(parentElem);
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.show(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});
});
},
setReferenceFieldValue : function(container, params) {
var sourceField = container.find('input[class="sourceField"]').attr('name');
var fieldElement = container.find('input[name="'+sourceField+'"]');
var sourceFieldDisplay = sourceField+"_display";
var fieldDisplayElement = container.find('input[name="'+sourceFieldDisplay+'"]');
var popupReferenceModule = container.find('input[name="popupReferenceModule"]').val();
var selectedName = params.name;
var id = params.id;
fieldElement.val(id)
fieldDisplayElement.val(selectedName).attr('readonly',true);
fieldElement.trigger(Vtiger_Edit_Js.referenceSelectionEvent, {'source_module' : popupReferenceModule, 'record' : id, 'selectedName' : selectedName});
fieldDisplayElement.validationEngine('closePrompt',fieldDisplayElement);
},
proceedRegisterEvents : function(){
if(jQuery('.recordEditView').length > 0){
return true;
}else{
return false;
}
},
referenceModulePopupRegisterEvent : function(container){
var thisInstance = this;
container.on("click",'.relatedPopup',function(e){
thisInstance.openPopUp(e);
});
container.find('.referenceModulesList').chosen().change(function(e){
var element = jQuery(e.currentTarget);
var closestTD = element.closest('td').next();
var popupReferenceModule = element.val();
var referenceModuleElement = jQuery('input[name="popupReferenceModule"]', closestTD);
var prevSelectedReferenceModule = referenceModuleElement.val();
referenceModuleElement.val(popupReferenceModule);
//If Reference module is changed then we should clear the previous value
if(prevSelectedReferenceModule != popupReferenceModule) {
closestTD.find('.clearReferenceSelection').trigger('click');
}
});
},
getReferencedModuleName : function(parenElement){
return jQuery('input[name="popupReferenceModule"]',parenElement).val();
},
searchModuleNames : function(params) {
var aDeferred = jQuery.Deferred();
if(typeof params.module == 'undefined') {
params.module = app.getModuleName();
}
if(typeof params.action == 'undefined') {
params.action = 'BasicAjax';
}
AppConnector.request(params).then(
function(data){
aDeferred.resolve(data);
},
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 searchModule = this.getReferencedModuleName(tdElement);
params.search_module = searchModule;
return params;
},
/**
* Function which will handle the reference auto complete event registrations
* @params - container <jQuery> - element in which auto complete fields needs to be searched
*/
registerAutoCompleteFields : function(container) {
var thisInstance = this;
container.find('input.autoComplete').autocomplete({
'minLength' : '3',
'source' : function(request, response){
//element will be array of dom elements
//here this refers to auto complete instance
var inputElement = jQuery(this.element[0]);
var searchValue = request.term;
var params = thisInstance.getReferenceSearchParams(inputElement);
params.search_value = searchValue;
thisInstance.searchModuleNames(params).then(function(data){
var reponseDataList = new Array();
var serverDataFormat = data.result
if(serverDataFormat.length <= 0) {
jQuery(inputElement).val('');
serverDataFormat = new Array({
'label' : app.vtranslate('JS_NO_RESULTS_FOUND'),
'type' : 'no results'
});
}
for(var id in serverDataFormat){
var responseData = serverDataFormat[id];
reponseDataList.push(responseData);
}
response(reponseDataList);
});
},
'select' : function(event, ui ){
var selectedItemData = ui.item;
//To stop selection if no results is selected
if(typeof selectedItemData.type != 'undefined' && selectedItemData.type=="no results"){
return false;
}
selectedItemData.name = selectedItemData.value;
var element = jQuery(this);
var tdElement = element.closest('td');
thisInstance.setReferenceFieldValue(tdElement, selectedItemData);
var sourceField = tdElement.find('input[class="sourceField"]').attr('name');
var fieldElement = tdElement.find('input[name="'+sourceField+'"]');
fieldElement.trigger(Vtiger_Edit_Js.postReferenceSelectionEvent,{'data':selectedItemData});
},
'change' : function(event, ui) {
var element = jQuery(this);
//if you dont have readonly attribute means the user didnt select the item
if(element.attr('readonly')== undefined) {
element.closest('td').find('.clearReferenceSelection').trigger('click');
}
},
'open' : function(event,ui) {
//To Make the menu come up in the case of quick create
jQuery(this).data('autocomplete').menu.element.css('z-index','100001');
}
});
},
/**
* Function which will register reference field clear event
* @params - container <jQuery> - element in which auto complete fields needs to be searched
*/
registerClearReferenceSelectionEvent : function(container) {
container.find('.clearReferenceSelection').on('click', function(e){
var element = jQuery(e.currentTarget);
var parentTdElement = element.closest('td');
var fieldNameElement = parentTdElement.find('.sourceField');
var fieldName = fieldNameElement.attr('name');
fieldNameElement.val('');
parentTdElement.find('#'+fieldName+'_display').removeAttr('readonly').val('');
element.trigger(Vtiger_Edit_Js.referenceDeSelectionEvent);
e.preventDefault();
})
},
/**
* Function which will register event to prevent form submission on pressing on enter
* @params - container <jQuery> - element in which auto complete fields needs to be searched
*/
registerPreventingEnterSubmitEvent : function(container) {
container.on('keypress', function(e){
//Stop the submit when enter is pressed in the form
var currentElement = jQuery(e.target);
if(e.which == 13 && (!currentElement.is('textarea'))) {
e. preventDefault();
}
})
},
/**
* Function which will give you all details of the selected record
* @params - an Array of values like {'record' : recordId, 'source_module' : searchModule, 'selectedName' : selectedRecordName}
*/
getRecordDetails : function(params) {
var aDeferred = jQuery.Deferred();
var url = "index.php?module="+app.getModuleName()+"&action=GetData&record="+params['record']+"&source_module="+params['source_module'];
AppConnector.request(url).then(
function(data){
if(data['success']) {
aDeferred.resolve(data);
} else {
aDeferred.reject(data['message']);
}
},
function(error){
aDeferred.reject();
}
)
return aDeferred.promise();
},
registerTimeFields : function(container) {
app.registerEventForTimeFields(container);
},
referenceCreateHandler : function(container) {
var thisInstance = this;
var postQuickCreateSave = function(data) {
var params = {};
params.name = data.result._recordLabel;
params.id = data.result._recordId;
thisInstance.setReferenceFieldValue(container, params);
}
var referenceModuleName = this.getReferencedModuleName(container);
var quickCreateNode = jQuery('#quickCreateModules').find('[data-name="'+ referenceModuleName +'"]');
if(quickCreateNode.length <= 0) {
Vtiger_Helper_Js.showPnotify(app.vtranslate('JS_NO_CREATE_OR_NOT_QUICK_CREATE_ENABLED'))
}
quickCreateNode.trigger('click',{'callbackFunction':postQuickCreateSave});
},
/**
* Function which will register event for create of reference record
* This will allow users to create reference record from edit view of other record
*/
registerReferenceCreate : function(container) {
var thisInstance = this;
container.on('click','.createReferenceRecord', function(e){
var element = jQuery(e.currentTarget);
var controlElementTd = element.closest('td');
thisInstance.referenceCreateHandler(controlElementTd);
})
},
/**
* Function to register the event status change event
*/
registerEventStatusChangeEvent : function(container){
var followupContainer = container.find('.followUpContainer');
//if default value is set to Held then display follow up container
var defaultStatus = container.find('select[name="eventstatus"]').val();
if(defaultStatus == 'Held'){
followupContainer.show();
}
container.find('select[name="eventstatus"]').on('change',function(e){
var selectedOption = jQuery(e.currentTarget).val();
if(selectedOption == 'Held'){
followupContainer.show();
} else{
followupContainer.hide();
}
});
},
/**
* Function which will register basic events which will be used in quick create as well
*
*/
registerBasicEvents : function(container) {
this.referenceModulePopupRegisterEvent(container);
this.registerAutoCompleteFields(container);
this.registerClearReferenceSelectionEvent(container);
this.registerPreventingEnterSubmitEvent(container);
this.registerTimeFields(container);
//Added here instead of register basic event of calendar. because this should be registered all over the places like quick create, edit, list..
this.registerEventStatusChangeEvent(container);
this.registerRecordAccessCheckEvent(container);
this.registerEventForPicklistDependencySetup(container);
},
/**
* Function to register event for image delete
*/
registerEventForImageDelete : function(){
var formElement = this.getForm();
var recordId = formElement.find('input[name="record"]').val();
formElement.find('.imageDelete').on('click',function(e){
var element = jQuery(e.currentTarget);
var parentTd = element.closest('td');
var imageUploadElement = parentTd.find('[name="imagename[]"]');
var fieldInfo = imageUploadElement.data('fieldinfo');
var mandatoryStatus = fieldInfo.mandatory;
var imageId = element.closest('div').find('img').data().imageId;
element.closest('div').remove();
var exisitingImages = parentTd.find('[name="existingImages"]');
if(exisitingImages.length < 1 && mandatoryStatus){
formElement.validationEngine('detach');
imageUploadElement.attr('data-validation-engine','validate[required,funcCall[Vtiger_Base_Validator_Js.invokeValidation]]');
formElement.validationEngine('attach');
}
if(formElement.find('[name=imageid]').length != 0) {
var imageIdValue = JSON.parse(formElement.find('[name=imageid]').val());
imageIdValue.push(imageId);
formElement.find('[name=imageid]').val(JSON.stringify(imageIdValue));
} else {
var imageIdJson = [];
imageIdJson.push(imageId);
formElement.append('<input type="hidden" name="imgDeleted" value="true" />');
formElement.append('<input type="hidden" name="imageid" value="'+JSON.stringify(imageIdJson)+'" />');
}
});
},
triggerDisplayTypeEvent : function() {
var widthType = app.cacheGet('widthType', 'narrowWidthType');
if(widthType) {
var elements = jQuery('#EditView').find('td');
elements.addClass(widthType);
}
},
registerSubmitEvent: function() {
var editViewForm = this.getForm();
editViewForm.submit(function(e){
//Form should submit only once for multiple clicks also
if(typeof editViewForm.data('submit') != "undefined") {
return false;
} else {
var module = jQuery(e.currentTarget).find('[name="module"]').val();
if(editViewForm.validationEngine('validate')) {
//Once the form is submiting add data attribute to that form element
editViewForm.data('submit', 'true');
//on submit form trigger the recordPreSave event
var recordPreSaveEvent = jQuery.Event(Vtiger_Edit_Js.recordPreSave);
editViewForm.trigger(recordPreSaveEvent, {'value' : 'edit'});
if(recordPreSaveEvent.isDefaultPrevented()) {
//If duplicate record validation fails, form should submit again
editViewForm.removeData('submit');
e.preventDefault();
}
} else {
//If validation fails, form should submit again
editViewForm.removeData('submit');
// to avoid hiding of error message under the fixed nav bar
app.formAlignmentAfterValidation(editViewForm);
}
}
});
},
/*
* Function to check the view permission of a record after save
*/
registerRecordAccessCheckEvent : function(form) {
form.on(Vtiger_Edit_Js.recordPreSave, function(e, data) {
var assignedToSelectElement = jQuery('[name="assigned_user_id"]',form);
if(assignedToSelectElement.data('recordaccessconfirmation') == true) {
return;
}else{
if(assignedToSelectElement.data('recordaccessconfirmationprogress') != true) {
var recordAccess = assignedToSelectElement.find('option:selected').data('recordaccess');
if(recordAccess == false) {
var message = app.vtranslate('JS_NO_VIEW_PERMISSION_AFTER_SAVE');
Vtiger_Helper_Js.showConfirmationBox({'message' : message}).then(
function(e) {
assignedToSelectElement.data('recordaccessconfirmation',true);
assignedToSelectElement.removeData('recordaccessconfirmationprogress');
form.append('<input type="hidden" name="returnToList" value="true" />');
form.submit();
},
function(error, err){
assignedToSelectElement.removeData('recordaccessconfirmationprogress');
e.preventDefault();
});
assignedToSelectElement.data('recordaccessconfirmationprogress',true);
} else {
return true;
}
}
}
e.preventDefault();
});
},
/**
* Function to register event for setting up picklistdependency
* for a module if exist on change of picklist value
*/
registerEventForPicklistDependencySetup : function(container){
var picklistDependcyElemnt = jQuery('[name="picklistDependency"]',container);
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++){
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();
targetPickList.html(targetOptions).val(targetPickListSelectedValue).trigger("liszt:updated");
})
});
//To Trigger the change on load
sourcePickListElements.trigger('change');
},
registerLeavePageWithoutSubmit : function(form){
InitialFormData = form.serialize();
window.onbeforeunload = function(e){
if (InitialFormData != form.serialize() && form.data('submit') != "true") {
return app.vtranslate("JS_CHANGES_WILL_BE_LOST");
}
};
},
registerEvents: function(){
var editViewForm = this.getForm();
var statusToProceed = this.proceedRegisterEvents();
if(!statusToProceed){
return;
}
this.registerBasicEvents(this.getForm());
this.registerEventForImageDelete();
this.registerSubmitEvent();
this.registerLeavePageWithoutSubmit(editViewForm);
app.registerEventForDatePickerFields('#EditView');
var params = app.validationEngineOptions;
params.onValidationComplete = function(element,valid){
if(valid){
var ckEditorSource = editViewForm.find('.ckEditorSource');
if(ckEditorSource.length > 0){
var ckEditorSourceId = ckEditorSource.attr('id');
var fieldInfo = ckEditorSource.data('fieldinfo');
var isMandatory = fieldInfo.mandatory;
var CKEditorInstance = CKEDITOR.instances;
var ckEditorValue = jQuery.trim(CKEditorInstance[ckEditorSourceId].document.getBody().getText());
if(isMandatory && (ckEditorValue.length === 0)){
var ckEditorId = 'cke_'+ckEditorSourceId;
var message = app.vtranslate('JS_REQUIRED_FIELD');
jQuery('#'+ckEditorId).validationEngine('showPrompt', message , 'error','topLeft',true);
return false;
}else{
return valid;
}
}
return valid;
}
return valid
}
editViewForm.validationEngine(params);
this.registerReferenceCreate(editViewForm);
//this.triggerDisplayTypeEvent();
}
});