Dynamic Field Handler
The dynamic field change handler is associated with the dynamic-select field type. This handler dynamically updates the drop-down menu options as the user types, giving relevant suggestions based on the user's input.
The list of menu items to be populated in the drop-down is configured in this handler as a comma separated value list, and the search trigger works based on the following criteria:
starts-with
contains
Search results are populated based on the starts-with criteria followed by items that match with the contains criteria.
Note:
For optimum results configure dynamic_select field only when the search results are more than 100. Incase of results lesser than 100, use the select field.
The list of attributes that are passed when this handler is triggered are given below
Attribute Name | Type | Description |
target | map | The target map contains the users' search query and the field for which the search was triggered. |
form | map | Form contains all the values and inputs of all the search fields in the form. |
user | map | The user map contains details about the user who is interacting with the form. |
chat | map | The chat map contains details about the chat where the form is displayed as a response. |
Target Map Syntax
{
"query": "",
"name": ""
}
Example : Update a lead's status in CRM
Consider a /crm command that lets you search for a lead and update the lead status within your Cliq interface.
- Once you execute this command, a lead status form is displayed as a response.
- You can then search for the lead and choose the lead status.
- On choosing these options, the form function submit handler is executed to update the lead record in your CRM.
Pre-requisite :
Before beginning to script the code below, we must create a connection in Cliq with Zoho CRM. Once a connection is created and connected, you can use it in Deluge integration tasks and invoke URL scripts to access data from the required service.
Create a Zoho Oauth default connection with a unique name - "crmforcliq", with scopes - ZohoCRM.modules.ALL or ZohoCRM.modules.Lead.ALL
Refer to the below links to learn more :
/crm Command Execution Handler
response = Map();
inputs = list();
getLeads = invokeUrl
[
url : "https://www.zohoapis.com/crm/v2/Leads"
type : GET
connection : "crmforcliq"
];
info getLeads;
leads = getLeads.get("data");
leadlist = List();
count = 0;
for each lead in leads
{
leadName = lead.get("Full_Name");
leadId = lead.get("id");
Lead = {"label":leadName,"value":leadId};
if (count < 10 )
{
leadlist.add(Lead);
}
count = count +1;
}
inputs.add({"type":"dynamic_select","trigger_on_change":true,"name":"leadsearch","label":"Search Lead","hint":"Search the lead to be updated","placeholder":"ABC Corp","mandatory":true,"value":"ABCCorp","options":leadlist});
form = {"type":"form","title":"Update lead status","hint":"Search and update a lead","name":"lead","version":1,"button_label":"Update","action":{"type":"invoke.function","name":"leadupdate"},"trigger_on_cancel":true,"inputs":inputs};
return form;
leadupdate Form Function Dynamic Field Handler
info target;
searchValue = target.get("query");
getLeads = invokeurl
[
url :"https://www.zohoapis.com/crm/v2/Leads"
type :GET
connection:"crmforcliq"
];
info getLeads;
leads = getLeads.get("data");
leadlist = list();
for each lead in leads
{
if(lead.containsIgnoreCase(searchValue))
{
leadName = lead.get("Full_Name");
leadId = lead.get("id");
Lead = {"label":leadName,"value":leadId};
leadlist.add(Lead);
}
}
return {"options":leadlist};
leadupdate Form Function Change Handler
targetName = target.get("name");
info targetName;
inputValues = form.get("values");
info inputValues;
actions = list();
leadStatus = {{"label":"Attempted to Contact","value":"attempt"},{"label":"Contact in Future","value":"future"},{"label":"Contacted","value":"contacted"},{"label":"Junk Lead","value":"junklead"},{"label":"Lost Lead","value":"lostlead"},{"label":"Pre-Qualified","value":"prequalified"},{"label":"Qualified","value":"Qualified"}};
if(targetName.containsIgnoreCase("leadsearch"))
{
fieldValue = inputValues.get("leadsearch").get("value");
getLeadInfo = invokeurl
[
url :"https://www.zohoapis.com/crm/v2/Leads/" + fieldValue
type :GET
connection:"crmforcliq"
];
currentStatus = getLeadInfo.get("data").toList().get(0).toMap().get("Lead_Status");
info currentStatus;
leadStatuslist = List();
for each statitem in leadStatus
{
label = statitem.get("label");
mapvalue = statitem.get("value");
if(!label.equalsIgnoreCase(currentStatus))
{
leadStatusMap = {"label":label,"value":mapvalue};
leadStatuslist.add(leadStatusMap);
}
}
info leadStatusMap;
info leadStatuslist;
actions.add({"type":"add_after","name":"leadsearch","input":{"type":"select","name":"leadstatus","label":"Lead Status","hint":"Update your lead status","placeholder":"Contacted","mandatory":true,"options":leadStatuslist}});
}
return {"type":"form_modification","actions":actions};
leadupdate Form Function Submit Handler
response = Map();
leadid = form.get("values").get("leadsearch").get("value");
leadstatus = form.get("values").get("leadstatus").get("label");
info leadstatus;
dataMap = {
"data": [
{
"Lead_Status": leadstatus
}
]
};
updateLeads = invokeurl
[
url : "https://www.zohoapis.com/crm/v2/Leads/" + leadid
type : PUT
parameters: dataMap.toString()
connection:"crmforcliq"
];
info updateLeads;
if (updateLeads.get("data").toMap().get("code").equalsIgnoreCase("SUCCESS"))
{
response = {"text":"Your lead status has been updated to "+leadstatus +" :fireworks: "};
}
else
{
response = {"text":"Unable to update lead status. Please try again later!"};
}
return response;