Kaizen #99 - Render Widgets Using Client Script

Kaizen #99 - Render Widgets Using Client Script

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.
Click here to view the complete code.

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!




    • Sticky Posts

    • Kaizen #217 - Actions APIs : Tasks

      Welcome to another week of Kaizen! In last week's post we discussed Email Notifications APIs which act as the link between your Workflow automations and you. We have discussed how Zylker Cloud Services uses Email Notifications API in their custom dashboard.
    • Kaizen #216 - Actions APIs : Email Notifications

      Welcome to another week of Kaizen! For the last three weeks, we have been discussing Zylker's workflows. We successfully updated a dormant workflow, built a new one from the ground up and more. But our work is not finished—these automated processes are
    • Kaizen #152 - Client Script Support for the new Canvas Record Forms

      Hello everyone! Have you ever wanted to trigger actions on click of a canvas button, icon, or text mandatory forms in Create/Edit and Clone Pages? Have you ever wanted to control how elements behave on the new Canvas Record Forms? This can be achieved
    • Kaizen #142: How to Navigate to Another Page in Zoho CRM using Client Script

      Hello everyone! Welcome back to another exciting Kaizen post. In this post, let us see how you can you navigate to different Pages using Client Script. In this Kaizen post, Need to Navigate to different Pages Client Script ZDKs related to navigation A.
    • Kaizen #210 - Answering your Questions | Event Management System using ZDK CLI

      Hello Everyone, Welcome back to yet another post in the Kaizen Series! As you already may know, for the Kaizen #200 milestone, we asked for your feedback and many of you suggested topics for us to discuss. We have been writing on these topics over the
    • Recent Topics

    • Feature Request Improve parent-child relationship visibility

      Hi team, The Parent-Child ticket feature is great, but I've struggled to see the relationship between tickets when using ticket list views. It would be a great quality of life enhancement for users if child tickets were nested under parent tickets in
    • need a third party to fix email authentication dns records

      at my wit's end - zoho began giving me spf, dmarc, dkim errors two weeks ago fussed with it since and now it seems dkim is the only problem and when i added the dkim record with the key from zoho mail it still wont work tired of this, need someone who
    • Add Button on Tickets

      is there a way I could add another button on the ticket aside of "closed ticket" only. Like I want to add another button "Send & Pending", "Pending for Response" like that.
    • Include Secondary Contacts (CCs) on Workflow Alerts

      Hi There, We use the Supervise Rules and Workflow Alerts to send automated messages to contacts in Zoho Desk. Most often, we are sending the ticket contact (our client) a reminder that we are waiting on their reply to our most recent message. The problem
    • Adding a lead by sending email message

      Hello, Our Zoho Mail is integrated with Zoho CRM (we have Enterprise) and we can add new leads to CRM right from the web interface/panel of Zoho Mail using buttons at the bottom right corner of the screen. This is very handy. We add leads on a regular
    • No Sales Returns on SO's with Dropped Shipped items + Inventory Items

      We have encountered an issue in Zoho related to sales orders that include both dropshipped items and inventory items. Specifically, it is currently not possible to create sales returns for the company’s own inventory items from these sales orders. This
    • ZMA v2 : Unable to delete a trigger from existing journey with several triggers

      I have multiple triggers on a single journey and need to delete one. However there isn't the function to do so, no delete icon or settings bar, no right click options of any kind. Every change I make affects all triggers ... How can I remove one of these
    • How to track the source of form submissions using referrer names in Zoho Forms?

      Ever wondered where your users are accessing your form links from? By tracking the origin of your form entries—whether it's from social media, email campaigns, direct links, or embedded on your website—you can identify which channels are driving the most
    • Snapchat

      Are there any plans to add Snapchat to Zoho Social or is there any API that we can use to integrate into Zoho.
    • Widget JS SDK to Upload a photo to a record in a Module

      Good day,  I would really appreciate it if someone can assist me. I have written a widget, to be used in a Custom Module in CRM.  My goal: I want to upload a photo from my computer and display it in die "upload image" field. I am using the JS SDK: https://help.zwidgets.com/help/v1.1/index.html
    • Zoho Creator Deluge - dynamically change fields depending on user input of field1 or field2

      Hi everyone and happy holidays! Hope that someone will help me figure out a solution to my problem… In my form there are currency, formulas and lookup fields. I’m well aware, that formulas fields if marked visible on form, cannot be hidden anywhere (like
    • Interbank transfers appear in Dashboard

      Hello. I notice that interbank transfers appear in both the incoming and outgoing part in the dashboard in ZohoBooks. This is not correct as it inflates both the incoming and outgoing, though the net effect offsets. Is there a way to avoid this?
    • Why Remove from Workflow is button is not working?

      Hey, I’ve got this contact that’s currently in an active workflow, but I’m having trouble removing it. When I check the workflow, click on that specific contact, and hit the "Remove from Workflow" button, nothing happens. Do you have any idea what might
    • Fixed Asset Manager items not on Balance Sheet report?

      Does the items added to the Fixed Asset Manager not pull in to report in the appropriate fixed asset categories on the Balance Sheet report? It seems only accumulated depreciation does (when run as accrual) but not fixed asset values.
    • Auto Charge Recurring Invoices on their due date vs issue date

      Requesting to auto charge recurring invoices on their due date. We are B2B and a lot of customers want terms net 30, 60 or 90 but want the convenience of auto pay and it's in our benefit as well. Is this something that could be implemented fairly quickly?
    • Commerce service

      If I am selling a service in Commerce, how do I turn off shipping?
    • Mobile App Location Features (Check-in, Maps) Not Working for Tasks Related to Deals (Address Data Copied via Function)

      Hello Zoho Community, I'm facing an issue with the Zoho CRM mobile app's location-based features (like check-in suggestions or map pins) specifically for Tasks related to Deals. Goal: I want the mobile app's location features to work for Tasks related
    • Not Able to access Api of Zoho Workdrive.

      I have Zoho One plan. And I am trying to use api of Zoho workdrive and Showing Invalid Client.
    • Schedule Zoho CRM reports only on Business Days

      Hello, Is it possible to schedule reports only on business days ? We currently get daily sales reports on weekend which has no value since the sales team doesn't work on weekends. Thanks
    • Creating task at someones date of birth

      Hi, I want to create a workflow which creates a task at someones date of birth. How can I do this?
    • How do I do a formula to join two fields together like first name and last name into full name?

      Having issues with this in my custom module.  In most CRM systems you would do: FIELD1 & " " & FIELD2 But it gives an error saying I'm not supposed to use double quotations so not sure what that means.  I've tried to read the formula help guide but it's
    • Zoho Support - Again!

      I've been using Zoho One for over 5 years and it seems the level of support just goes from bad to worse. The only thing that has kept me with them this long is the product itself. When something goes wrong, it is a mandatory 2 days wait for a response
    • Map Contact to Account record based on email domain

      Hi Community, I'm looking for a (presumably custom) solution to map Contact records to Accounts based on web domain. E.g. new Contact record John Smith with email john.smith@acme.com is automatically mapped to Account record Acme Ltd https://acme.com
    • Second Insight - Let's talk Layouts

      The Wheels of Ticketing - Desk Stories Let's talk Layouts What are layouts? Layouts refer to the arrangement or design of elements in a space, whether on a physical surface, like a room or a piece of furniture, or in digital contexts, such as web pages
    • Data Retention Policy Update – Effective May 1, 2025

      Starting May 1, 2025, we’re updating how long we store your landing page data based on your subscription plan. Here’s the new retention timeline: Trial Plan – 3 months Essentials Plan – 6 months Professional Plan – 9 months Enterprise & Bundle Plans –
    • Tip of the Week #52 – Use keyboard shortcuts!

      Tired of clicking around often? Navigating can feel slow when you’re switching between threads, views, or composing messages, all using just your mouse. Turn on Keyboard Shortcuts to move around your inboxes faster and work smarter. Once enabled, you
    • Random Email Missing for specific domians

      Our mail service randomly fails to receive emails. When certain domains proactively send emails, our sales team reports that they haven’t received those messages from clients. This creates a financial risk for us in certain cases. We’ve already submitted
    • CRM x WorkDrive : Intégration native de Zoho CRM avec Zoho WorkDrive

      Nous sommes heureux de vous annoncer le déploiement de l'intégration native de CRM avec WorkDrive ! La version initiale comprend les changements suivants : Il est désormais possible de connecter votre CRM org à un compte WorkDrive existant ou nouveau.
    • Making emails and notes private......

      Having experience using a plethora of CRM's I have noticed that this is one of the pitfalls of Zoho. Many notes and emails we want to add to Zoho we would like to make private or only visible to a set group of people.  The attached image from another CRM displays this feature.  While company policy at some firms could be that all information added to the CRM is public information.  This is a two way street.  Lots of companies have employees that are independent contractors in sales industries like
    • Two new updates to simplify your shift planning

      We’ve introduced two small but handy enhancements in Zoho Workerly that aim to reduce steps and give you more flexibility while planning shifts. Here’s what’s new and why it matters: Toggle between weekly and monthly roster views Pain point Planning shifts
    • Android and iOS Feature Updates

      The Zoho Desk mobile app (Android and iOS) provides agents with a platform to serve their customers from anywhere and at anytime. We are happy to introduce a few enhancements in the mobile apps that will support the users to be more productive and streamline
    • Agent form for car showroom

      Hey all! I am trying to make a useful crm form in creator for a car showroom. However, I am struggling with the best way to configure the CRM modules so I can make the form useable. They need to be able to have say a basic top level of is it a drop down
    • Multiple packages in one shipment

      Guys we have been asking for this for years. we want to be able to ship multiple packages for one customer in the same shipment, so as to avoid entering shipping info repeatedly, and avoid customer getting multiple tracking emails. When does this arise?
    • Changing Color Theme of Guided Conversations

      Hello, We have recently added Guided Conversations to one of our websites, but I am wondering if there is a way to customize the color scheme so it matches the appearance of the website? Thank you in advance!
    • Workdrive Android - how can I open a file in its native app?

      Hi, I'm testing Workdrive as a replacement for Onedrive. On a laptop/Windows this works fine. It syncs between devices and when I open a file, it opens the file in its native app. However, the Workdrive Android app seems to work differently. On a Android
    • Zoho SDK versioning and repositories need permanent naming/versioning changes moving forward

      I spent all day on this, a simple problem. Add a note to a lead, retrieve the notes from the lead. Finding samples and documentation is VERY difficult BECAUSE the versioning is totally non-standard. The php SDK doesn't follow SemVer. I suppose it may
    • Filter by technical IDs that should not be displayed

      Hello Zoho and Cumminity. I know I have already found similar requests elsewhere, but have not yet received a solution from Zoho. Therefore I would like to refresh the topic and hope that a solution can be found. I have reports in the Creator, which I
    • is Zoho desk down ?

      We have not received any tickets via email on the Zoho desk for the past hour. I also tried sending several test emails, but as of right now, no new ticket has been created on the desk.
    • How to make one code flow run for multiple people in the org

      Hi Folks, I have built a flow to transfer a Zoho calender event as Zoho CRM module record. The code works perfectly as needed. But the issue is I want the same functionality for others in our org. It is showing only my calendar in the selection trigger.
    • For security reasons your account has been blocked as you have exceeded the maximum number of requests per minute that can originate from one account.

      Hello Zoho Even if we open 10-15 windows in still we are getting our accounts locked with error " For security reasons your account has been blocked as you have exceeded the maximum number of requests per minute that can originate from one account. "
    • Next Page