Contact is individual, and Account contain a classification field (Private, or Governorate)
At Creating lead i want when user choose Existing contact filter product according to individual type only, and when user choose account filter according to classification
The JS code i write works only at the first time i choose contact or account, when i remove or choose another type not clearing filter or change it
I but onload method at Form OnLoad Event Handler And applyProductFilter at Existing Contact, And Existing Account OnChange Event Handler
var isProductFilterApplied = false;
function onLoad(executionContext) {
var formContext = executionContext.getFormContext();
var formType = formContext.ui.getFormType();
if (formType !== 1) return; // Only apply for new records
console.log("onLoad executed, form type: " + formType);
// Add OnChange event handlers for parentcontactid and parentaccountid
var parentContactField = formContext.getAttribute("parentcontactid");
var parentAccountField = formContext.getAttribute("parentaccountid");
if (parentContactField) {
parentContactField.addOnChange(function (context) {
applyProductFilter(context);
});
}
if (parentAccountField) {
parentAccountField.addOnChange(function (context) {
applyProductFilter(context);
});
}
// Apply filter on load
applyProductFilter(executionContext);
}
function applyProductFilter(executionContext) {
var formContext = executionContext.getFormContext();
debugger;
var parentContactField = formContext.getAttribute("parentcontactid");
var parentAccountField = formContext.getAttribute("parentaccountid");
var parentContact = parentContactField ? parentContactField.getValue() : null;
var parentAccount = parentAccountField ? parentAccountField.getValue() : null;
console.log("applyProductFilter executed");
clearProductFilter(formContext);
if (parentAccount) {
var accountId = parentAccount[0].id.replace('{', '').replace('}', '');
console.log("Parent Account ID: " + accountId);
filterProductsByAccount(formContext, accountId);
} else if (parentContact) {
var contactId = parentContact[0].id.replace('{', '').replace('}', '');
console.log("Parent Contact ID: " + contactId);
filterProductsByContact(formContext, contactId);
} else {
console.log("No parent contact or account selected");
}
}
function clearProductFilter(formContext) {
var productField = formContext.getControl("crf2e_service");
if (productField) {
console.log("Clearing product filter");
productField.removePreSearch(productFilterHandler);
productField.addPreSearch(function () {
productField.addCustomFilter("<filter type='and'></filter>");
});
isProductFilterApplied = false;
}
}
function productFilterHandler() {
// Dummy function to use as a reference for adding/removing the handler
}
function filterProductsByContact(formContext, contactId) {
Xrm.WebApi.retrieveRecord("contact", contactId, "?$select=contactid").then(
function success(result) {
console.log("filterProductsByContact executed");
var filter = "<filter type='and'><condition attribute='crf2e_isindividual' operator='eq' value='true' /></filter>";
applyProductLookupFilter(formContext, filter);
},
function (error) {
console.log("Error retrieving contact: " + error.message);
}
);
}
function filterProductsByAccount(formContext, accountId) {
Xrm.WebApi.retrieveRecord("account", accountId, "?$select=ownershipcode").then(
function success(result) {
console.log("filterProductsByAccount executed");
var classification = result.ownershipcode;
var filter = "";
if (classification === 2) { // Assuming 2 is the value for Private
filter = "<filter type='and'><condition attribute='crf2e_isprivate' operator='eq' value='true' /></filter>";
} else if (classification === 1) { // Assuming 1 is the value for Government
filter = "<filter type='and'><condition attribute='crf2e_isgovernment' operator='eq' value='true' /></filter>";
}
applyProductLookupFilter(formContext, filter);
},
function (error) {
console.log("Error retrieving account: " + error.message);
}
);
}
function applyProductLookupFilter(formContext, filter) {
var productField = formContext.getControl("crf2e_service");
if (productField) {
console.log("Applying product lookup filter: " + filter);
productField.addPreSearch(function () {
productField.addCustomFilter(filter);
});
isProductFilterApplied = true;
}
}