2- If field A is with the value "account", add a filter showing only contacts that are related to an account (I have this account ID to pass inside the fetch)
I tried this (dynamicFunction was added "addOnChange" of field A:
dynamicFilter: async function (executionContext) {
const formContext = typeof executionContext.getFormContext === "function" ? executionContext.getFormContext() : executionContext;
const lookupControl = formContext.getControl("user_contact_id");
if (preSearch) lookupControl.removePreSearch(addFilter);
lookupControl.addPreSearch(addFilter);
async function addFilter() {
const signAs = formContext.getAttribute("sign_as")?.getValue();
if (preSearch) lookupControl.removePreSearch(addFilter);
if (!signAs) {
lookupControl.addCustomFilter(`<filter><condition attribute='contactid' operator='eq' value='00000000-0000-0000-0000-000000000000' /></filter>`);
} else if (signAs == signAsUser) {
var filterXmlUser = `<filter><condition attribute='systemuserid' operator='neq' value='00000000-0000-0000-0000-000000000000' /></filter>`;
lookupControl.setEntityTypes(["systemuser"]);
lookupControl.addPreSearch(() => {
lookupControl.addCustomFilter(filterXmlUser);
});
} else if (signAs == signAsAccount) {
const record = formContext.getAttribute("related_record")?.getValue()[0]?.id;
const result = await Xrm.WebApi.online.retrieveRecord("recordX", record, "?$select=_counterpart_value");
if (result) {
const counterpart = result._counterpart_value;
if (counterpart) {
const fetchXml = `
<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true">
<entity name="contact">
<attribute name="contactid"/>
<link-entity name="edpb2c_account_contact" from="contactid" to="contactid" visible="false" intersect="true">
<link-entity name="account" from="accountid" to="accountid" alias="ac">
<filter>
<condition attribute="accountid" operator="eq" uitype="account" value="${counterpart}"/>
</filter>
</link-entity>
</link-entity>
</entity>
</fetch>`;
const contacts = await Xrm.WebApi.retrieveMultipleRecords("contact", `?fetchXml=${encodeURIComponent(fetchXml)}`);
if (contacts?.entities?.length) {
const contactIds = contacts.entities.map(contact => `<value>${contact.contactid}</value>`).join("");
const filterXml = `<filter><condition attribute='contactid' operator='in'>${contactIds}</condition></filter>`;
lookupControl.setEntityTypes(["contact"]);
lookupControl.addPreSearch(() => lookupControl.addCustomFilter(fetchXml, "contact"));
}
}
}
} else {
lookupControl.addCustomFilter(`<filter><condition attribute='contactid' operator='eq' value='00000000-0000-0000-0000-000000000000' /></filter>`);
}
preSearch = true;
}
}