Hello everyone!
Welcome back to another interesting post. In this post, let us see how you can render Widgets using Client Script.
Widgets are
embeddable UI components that you can create and add to your Zoho CRM. You can use widgets to perform functions that utilize data from
third-party applications. You can build widgets for Zoho CRM using our
JS SDK.
You can render a Widget through
Client Script and pass data from the Widget to the Client Script.
Use Case:
At Zylker, a manufacturing company, the Service Agent places orders using the Orders module. There is a sub-form named Product list. The user should add the products by clicking the "Add row" button every time.

To avoid this, Zylker wants the users to select multiple products from a single pop-up. Once the user selects the products from that pop-up , the sub-form "Product list" should get updated with all those products(one product in one sub-form row).
Solution:
Whenever the user picks the Product Category, you can create a Client Script to render the widget. The Products selected by the user on the widget , will be passed to the Client Script and will be added as separate rows in Product list subform.
1. Install Zoho CLI and add code to the app folder.
2. Upload the zip file as a Widget.
3. Create a Client Script to render the Widget and to add data to the Sub-form.
1. Install Zoho CLI and add code to the app folder
Follow the steps given in this
post and add the
html code, javascript file and css file.
Index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>Choose products</title> <link href="styles/style.css" rel="stylesheet" type="text/css" /> </head> <body> <div class="wgt_cp_popupContent"> <section class="wgt_cp_contentWrap"> <div hidden="true" id="noProductDiv"> <pre>No products associated to the selected deal</pre> </div> <table width="100%" cellspacing="0" id="pTable"> <thead> <tr class="wgt_productTblHead"> <th><input type="checkbox" id="selectAll" onclick="selectAllProducts(this)"></th> <th>Product Name</th> <th>Product Category</th> <th>Unit Price</th> <th>Quantity in Stock</th> </tr> </thead> <tbody id="tbody"></tbody> </table> </section> </div> <script src="./script/script.js"></script> </body> </html> |
Script.js
var count = 0; var productData, maxRows = 0; ZOHO.embeddedApp.on("PageLoad", async function (data) { console.log("data from Client Script", data); maxRows = data.max_rows; const search_response = await ZOHO.CRM.API.searchRecord({ Entity: "Products", Type: "criteria", Query: "(Product_Category:equals:" + data.product_category + ")" }) if (search_response && search_response.data && search_response.data.length) { productData = search_response.data; var htmlString = ""; productData.forEach(({ id, Product_Category, Product_Name, Unit_Price, Qty_in_Stock }) => { htmlString = htmlString.concat( `<tr> <td><input type='checkbox' onclick='selected(this)' id='${id}' class='products'></td> <td>${Product_Name}</td> <td>${Product_Category}</td> <td>${Unit_Price}</td> <td>${Qty_in_Stock}</td> </tr>` ); }); document.getElementById("tbody").innerHTML = htmlString; } else { document.getElementById("pTable").hidden = true; document.getElementById("noProductDiv").hidden = false;} }); ZOHO.embeddedApp.init(); function selected(element) { element.checked ? count++ : count-- ; document.getElementById("selectedCount").innerHTML = `${count} Products selected`; } function closewidget() { if (count > maxRows) { alert("Selected product is greater than the maximum subform rows."); } else { var selected_products = []; for (product_element of document.getElementsByClassName('products')) { product_element.checked && selected_products.push(productData.find(product => product.id === product_element.id));} console.log("returning to Client Script ...", JSON.stringify(selected_products)); $Client.close(selected_products);} } |
As per the above script, the products are fetched from the "Products" module based on the "Product Category" selected by the user. This information is captured in "search_response" and is added to the body of widget.html.
Here, the code
$Client.close(selected_products); will pass the selected products from Widget to the Client Script and close the widget rendered from Client Script.
Click here for more details about the variable $Client.
Next step is to upload the zip file of the app folder.
2. Upload the zip file as a Widget
- Go to Setup > Developer Space > Widgets.
- Click Create New Widget.
- The Hosting should be "Zoho" and mention the html page of the app folder that you uploaded.
Note: The widget should be of "button" type in order to render through a Client Script.
3. Create a Client Script to render Widget and to add data to the subform
- Go to Setup > Developer Space > Client Script. Click +New Script.
- Specify the details to create a script and click Next.
- The Client Script should render the Widget when the user selects Product Category. So Client Script should have field event on the field "Product Category".
- On the Client Script IDE, you can see the below details.
- Enter the following script in the Client Script IDE and click save.
var products_list = ZDK.Page.getField('Product_list').getValue(); if (products_list.length === 1) { // Clear subform if empty row !Object.values(products_list[0]).every(value => !!value) && products_list.pop(); } // Open widget with product category & max. allowed rows based on existing subform data var selected_products = ZDK.Client.openPopup({ api_name: 'choose_products', type: 'widget', header: 'Choose Products', animation_type: 1, height: '570px', width: '1359px', left: '150px' }, { product_category: value, max_rows: 25 - products_list.length }); // Update subform with Selected Products from the widget Popup if (selected_products.length) { selected_products.forEach(product => { products_list.push({ Product_Name: { id: product.id, name: product.Product_Name }, Quantity: 1, Unit_Price: product.Unit_Price }); }); ZDK.Page.getField('Product_list').setValue(products_list); }
|
- To render a widget from Client Script, use openPopup(config, data) ZDK. You can specify the configuration details like api name of the widget, title, size, animation type as parameters and specify the data to be passed as 'PageLoad' event data in the Widget.
- The response from the widget (i.e user selection) is captured by the variable "selected_products". Then each product (id,name,product_name,quantity and unit_price) is pushed to the list products_list. Finally, the product list value is updated to the Product Category sub-form using setValue(value) ZDK.
- Here is how the Widget gets rendered through Client Script.
We hope you found this post useful. We will meet you next week with another interesting topic! If you have any questions let us know in the comment section.
Click here for more details on Client Script in Zoho CRM.
As we approach the
100th post in our Kaizen series next week,
we invite you to share your queries and concerns with us. We are always looking for ways to improve our content and make it more relevant to our readers.
Please fill out this
form to share your thoughts.
Happy Coding!
Recent Topics
My zoho mail has been disabled and cannot send email
I’m the super admin for my company’s email accounts, but my own email address has been unexpectedly locked. I’m seeing the following error message: Could you please assist in unlocking my account so I can resume sending emails?
SMTP error
I am using SMTP from Zoho the account is accounts@khlaklaeeb.com it was working fine then started to have Error and unable to delivery messages SMTP host SMTP.zoho,com SMTP user: accounts@khlaklaeeb.com SMTP port 465 PAssword: App Password it was working
Automatically creating a ticket in Zoho Desk when an invoice is created in Zoho Books
I need to find a way to create a ticket automatically (i.e. using workflow) in Zoho Desk whenever an invoice is created in Zoho Books. Please advise if there is a way of doing that?
Been getting this error, every now and then "Get count limit exceeded, please try again after 3 mins"
it is really annoying.
Co-existing with Google Workspace
We currently use GWS and due to legacy practices, we cannot migrate away from it. Not easily anyway. The issue we have is that while we have Zoho Mail, we get duplicate copies of emails. Our setup is that GWS is our primary. We have Zoho MX records in
Stop Zoho Projects From Automatically Adding Client Users
I have a custom function that creates a Zoho Project for every Quote attached to a Deal when it moves to Closed Won. Everything works fine, except for the fact that connecting a Zoho Project to the CRM automatically takes the Contact associated with the
dd Linked Note to Comments & History via Custom Function + Zoho Document View Feature
Hi all, I have a couple of custom functions running in Zoho (specifically in Inventory/Books), and I'm trying to streamline it. Here’s the scenario: When a Purchase Receive is processed, my custom function automatically creates a Package. I'd like to
How to break line in zohoCRM
Hello everyone, I'm currently working with Deluge scripting language and encountering an issue with newline characters (\n). My goal is to format a string with multiple lines, but the newline characters are not being interpreted correctly. Instead of
Marketer’s Space: Supercharged Workflow with Zoho CRM Integration
Hello Marketers! Welcome back to another post in Marketer’s Space. Today, we’ll explore how integrating Zoho CRM with Zoho Campaigns can help you create smarter, more personalized Workflow. In this post, we’ll look at a specific use case to demonstrate
Zoho Live chat doesnt chat on CRM Contact page????
We have used Salesforce Live Agent for the last 8 years and the chat comes in on the Contact record which is logical and intuitive as the chat agent can see the customers sales history and open opportunities...etc... We just migrated to Zoho CRM and I
Image Quality Issue on Zoho Assist
Hello, For the past two days, I've been experiencing a significant image quality issue on Zoho Assist when connecting to one of my computers. I’ve tried reinstalling the application, but the issue persists across multiple devices. The internet connection
New views to manage activities within a record
Dear customers, We hope you're well! Today, we're here with a useful update to the Activities related list. As you might be aware, parent records display related information from other modules as related lists. This helps you get a 360-degree view of
Sent Mail not in "Sent" IMAP folder
I have configured ZOHO to use IMAP. When I send an email from within Zoho, the email does not show up in my "Sent" IMAP folder. Every email client I have ever used, stores sent mails in the "Sent" folder. This is a serious flaw! Please fix this ASAP! Oliver
Admin Control for Subscribing Users to Bots in Zoho Cliq
Hello, I would like to request an enhancement to Zoho Cliq, specifically related to subscribing users to bots. Current Issue: When using the Zoho Desk integration with Cliq, notifications such as Mentions, Happiness Ratings, and Pending Blueprint Transitions
Eighth Insight - Oversee module relationships with Lookups
The Wheels of Ticketing - Desk Stories Oversee module relationships with Lookups Learning about lookups A lookup field provides a powerful way to display and utilize data from another module directly within a field of your current module. This functionality
New capabilities for custom buttons: Elevate UX and CX with just a click!
-------------------------------------------------Post moderated on 24th May-------------------------------------------------------------- Dear all, The feature is now available for all users in all DCs. Dear Customers, We hope you're well! We're happy
Client Side Scripts for Meetings Module
Will zoho please add client side scripting support to the meetings module? Our workflow requires most meeting details have a specific format to work with other software we have. So we rely on a custom function to auto fill certain things. We currently
CRM APP
So the crm can now have image uploads. Great for us doing site surveys and linking them to customers. Unfortunatley the crm app does not show the image fields. Any ideas of must we create a form and then link that?
Zia Summary for Account - What is its reach
Hello! I've been working with the Zia summary feature and it's very useful. However, it seems to pull in notes and things directly "on" the Account. If I have a meeting or phone call and provided detailed summaries with the event associated to the account,
Search a custom module record based on a date range
Hi , I hope you can share some guidance. I need to look up a record from a custom module based on the Closing Date of a Deal (in the Deals module). Here’s the context: 1. I have a custom module that stores quarterly values (e.g., rates or thresholds).
How do I associate an expense to multiple projects?
How do I associate itemized expenses to multiple projects, like assigning each line to the respective project
So what's the limit?
Recently our team encountered an error popping out when sending a service report. Although the report was sent successfully to zoho desk but the site asset record isn't updated. We notice this error occur only when line items [subform record] exceeds
Charge to add client users to a ZOHO Project?
Is there a charge to add client users to access a zoho project portal? An additional license charge or any other additional costs? Thank You
Zoho CRM Notifications API - Channel Expiry
Has anyone built a reliable integration with CRM Notification API (https://www.zoho.com/crm/developer/docs/api/v8/notifications/overview.html)? Need to sync CRM data with my external system and prefer not to use CRM workflows which ist a nice low code
Create Tasks in arbitrary Zoho Project triggered from CRM [Zoho CRM]
Community, hello What I'm trying to do is to create a Zoho Project when a Deal is created in CRM and then to be able to add tasks to this Project also from Zoho CRM with the trigger (Blueprint/ Workflow). I succeeded in creating Project using Zoho Flow,
job opening status is locked and and I cannot change it
Dear Support I am using standard plan. The job opening status is locked and and I cannot change it.
IDN domain
Why I can't use my domain www.blažek.com I do not want use unfolded shape www.xn--blaek-wib.com in my mail. Can you help me please?
Gmail - Error 553 Relaying Disallowed
Hey Zoho, I have just set up my mail server and added a couple of email accounts. I've verified my domain and added the mx records with my registrar (namecheap.com) What I'm trying to do is to be able to send email from my domain through Gmail. In Google
Candidate status change
I am trying to change candidate status from "interview scheduled" to "hired". Where do I do this at?
How can I set up my contacts so that all users can have them on hand when they sign in?
Hi. For my business I would like to set up the Contacts so they are available for any user.
Sharing Knowledge Base articles across multiple departments
It would be useful to share some Knowledge Base articles across multiple departments where they are applicable, rather than having to go into other departments to find the article you're looking for. For example. Our reception uses the 'Admin' desk whereas our IT guys use the 'Support' desk, however both divisions would find KB articles about our company intranet useful. Reception does not have access to the support desk, so cannot see articles created in the Support KB. Perhaps you could install
Where do we manage tags?
Where is the page where we can view all tags and manage them (like change a tag name to something else or merge tickets under a particular tag with another)?
Custom Return Path - Host Name
Hi there, I've successfully set up SPF/ DKIM for Marketing Automation, but struggling to complete the Custom Return Path. I'm settting up on Wix. What should the host name be for the CNAME record? In Zoho Help it just says: "type your host name (sub-domain
How to send Messages to Leads/customers
I’d like to inquire about the process for sending messages or follow-up communications to customers directly from Zoho CRM. Could you please guide me on the best way to do this—whether via email, SMS, or any integrated messaging feature? Additionally,
Daily-rate for projects
I am billing my client through daily billing rates; for Zoho Books projects, only hourly rates can be set up. Please enhance this. Thanks.
Admin Console Email
I can't remember the admin console email or password. How do I find that out?
help me! the button "remove zoho ad" is not responding
help me! the button "remove zoho ad" is not responding, kindly advice. please to check the follows : https://sitepreview-643549202.zohositescontent.com/previewsite https://sitebuilder-643549202.zohositescontent.com/builder thanks,best regards
Zoho Forms API
Is there any way to get all form entry list using API? Looking forward to hear from you
Free tier
Does a completely free tier Zoho email still exists? If so why am I receiving email reminders that my account would expire in 2 days
Disable "skip to content" in Help Center
Our users used to be able to press the tab button to skip between fields when submitting a new ticket in the help center. Now it pulls up the "skip to content" button in the top left corner. I know this is an accessibility feature, but is there any way
Next Page