Headless Quick Actions in Lightning Web Components

The Headless Quick Actions are a significant addition to the toolbox of Lightning Web Component developers. They allow you to execute custom code within a Lightning web component without opening a modal window, distinguishing them from traditional screen actions. This feature offers greater flexibility and control, enabling you to create more streamlined and efficient user experiences.

To enable your Lightning web component to function as a Headless Quick Action, you need to configure a target. This configuration file defines a headless action.

<?xml version="1.0" encoding="UTF-8" ?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
  <apiVersion>52.0</apiVersion>
  <isExposed>true</isExposed>
  <targets>
    <target>lightning__RecordAction</target>
  </targets>
  <targetConfigs>
    <targetConfig targets="lightning__RecordAction">
      <actionType>Action</actionType>
    </targetConfig>
  </targetConfigs>
</LightningComponentBundle>

One notable difference between LWC quick actions and other Lightning web components on record pages is the absence of the recordId in the connectedCallback(). If your code requires access to the recordId, you’ll need to set its value manually in your code.

_recordId;
set recordId(recordId) {
    if (recordId !== this._recordId) {
        this._recordId = recordId;
    }
}

Implementing the invoke() Method

In your Lightning web component, it’s essential to expose the invoke() method as a public method for Headless Quick Actions. The invoke() method is executed each time the quick action is triggered, making it a crucial part of your component’s functionality.

Here’s a simple example of an LWC component with the <strong>method:</strong>

import { LightningElement, api } from "lwc";

export default class HeadlessSimple extends LightningElement {
  @api invoke() {
    console.log("Hi, I'm an action.");
  }
}

Creating an Empty Template

In order to prevent the quick action from being executed multiple times in parallel during long-running actions, you should include an internal boolean flag. Although the return type of invoke() is void, it can be executed asynchronously by utilizing a Promise.

Here’s an example of using a boolean flag to ensure single execution and a Promise to manage asynchronous execution:

import { LightningElement, api } from "lwc";

export default class HeadlessAsync extends LightningElement {
  isExecuting = false;

  @api async invoke() {
    if (this.isExecuting) {
      return;
    }

    this.isExecuting = true;
    await this.sleep(2000); // Simulate a 2-second action
    this.isExecuting = false;
  }

  sleep(ms) {
    return new Promise((resolve) => setTimeout(resolve, ms));
  }
}

Navigation with Lightning Experience

To navigate to another page, record, or list within the Lightning Experience, you can utilize the navigation service. The following example demonstrates how to navigate to the contact home page:

import { LightningElement, api } from "lwc";
import { NavigationMixin } from "lightning/navigation";

export default class NavigateToRecordAction extends NavigationMixin(LightningElement) {
  @api invoke() {
    this[NavigationMixin.Navigate]({
      type: "standard__objectPage",
      attributes: {
        objectApiName: "Contact",
        actionName: "home",
      },
    });
  }
}

Dispatching Custom Events

Headless Quick Actions provide the ability to dispatch custom events, enhancing the interaction and feedback within your components. In the following example, we dispatch two toasts sequentially using the event provided by the lightning/platformShowToastEvent module:

import { LightningElement, api } from "lwc";
import { ShowToastEvent } from "lightning/platformShowToastEvent";

export default class DispatchEventAction extends LightningElement {
  @api async invoke() {
    let event = new ShowToastEvent({
      title: "I am a headless action!",
      message: "Hi there! Starting...",
    });
    this.dispatchEvent(event);

    await this.sleep(2000); // Simulate a 2-second delay

    event = new ShowToastEvent({
      title: "I am a headless action!",
      message: "All done!",
    });
    this.dispatchEvent(event);
  }

  sleep(ms) {
    return new Promise((resolve) => setTimeout(resolve, ms));
  }
}

Other user cases of headless quick action Below are a few additional scenarios along with examples and code snippets to illustrate how you can leverage this feature:

Data Validation and Error Handling

You can use headless quick actions to perform data validation and handle errors when users interact with records. For example, you might want to ensure that certain fields meet specific criteria before allowing a record update.

import { LightningElement, api } from 'lwc';

export default class DataValidationAction extends LightningElement {
    _recordId;
    set recordId(recordId) {
      if (recordId !== this._recordId) {
        this._recordId = recordId;
      }
    }
    @api
    async invoke(recordId) {
        // Retrieve the record data
        const record = await this.retrieveRecordData(recordId);

        // Validate data
        if (record && record.Field__c !== 'Valid Value') {
            this.displayValidationErrorToast();
        } else {
            // Perform the action if data is valid
            await this.performRecordUpdate(recordId);
        }
    }

    // Implement methods for data retrieval, update, and displaying toasts
}

Integration with External Services

Headless Quick Actions can be used to integrate with external services or APIs. This is especially useful when you need to synchronize data between Salesforce and external systems.

Dynamic Record Creation

You can use Headless Quick Actions to create new records dynamically based on certain conditions. For example, you might want to create a related record when a specific field is updated.

Custom Record Updates

You can implement custom logic for record updates based on specific criteria. For instance, you might want to update related records when a particular field is modified.

Conclusion

Headless Quick Actions in Lightning Web Components offer a powerful toolset for enhancing user experiences and executing custom code with precision. By configuring your component as a Headless Quick Action and implementing the invoke() method, you can streamline and optimize your development process. Additionally, you can seamlessly navigate to different pages and dispatch custom events, adding interactivity to your components. So, leverage these capabilities to their full potential and take your Lightning Web Component development to the next level.

About the blog

SFDCLessons is a blog where you can find various Salesforce tutorials and tips that we have written to help beginners and experienced developers alike. we also share my experience and knowledge on Salesforce best practices, troubleshooting, and optimization. Don’t forget to follow us on:

Newsletter

Subscribe to our email newsletter to be notified when a new post is published.

  • Extract Data from Images with Salesforce OCR
    Starting your Salesforce journey often involves manually inputting data, leading to time-consuming and error-prone processes. Databases are crucial for storing structured data and driving business decisions. Implementing OCR for Salesforce can automate data collection, ensuring data integrity. Titan Files offers powerful OCR integration in Salesforce, minimizing manual tasks and enhancing user flexibility.
  • Leverage Apex Cursor for Enhanced SOQL Query Result Handling
    Salesforce’s summer’24 release introduced Apex cursors (Beta) to process large SOQL query results within a single transaction. These stateless cursors provide flexibility in traversing result sets incrementally, offering an alternative to batch Apex. With limits and new governor methods, Apex Cursors are a game-changer for high-volume data processing tasks in Salesforce.
  • Streamline User Access Management with New “View Summary” Feature
    Salesforce admins, rejoice! The Summer ’24 release introduces a “View Summary” button on user detail page, providing a centralized summary of user permissions including user, object, field, custom permissions, group, and queue memberships. This feature streamlines troubleshooting, enhances security reviews, empowers admins, and supports organizational governance. Admins can prepare for the release and anticipate improved management of user permissions.
  • New Automation Lightning App – Streamlining Your Flows
    In the upcoming Summer’24 release, Salesforce will introduce the Automation Lightning app, designed to improve flow management for Trailblazers. It offers seamless creation, management, and collaboration on Salesforce Flow automations. Key features include enhanced search, collaboration, and recently viewed flows, accessible through the App Launcher by enabling the app in Process Automation Settings.
  • Automate Every Stage of Your File Management in Salesforce
    The digital revolution demands efficient file management. Salesforce automation minimizes errors and enhances productivity. Salesforce offers diverse file management features and integrates with Titan Files for enhanced functionality. Titan Files facilitates automated file transfers, document management, and Salesforce integration without the need for coding. It also provides virus scanning, image modification, and OCR capabilities.

Arun Kumar

Arun Kumar is a Salesforce Certified Platform Developer I with over 7+ years of experience working on the Salesforce platform. He specializes in developing custom applications, integrations, and reports to help customers streamline their business processes. Arun is passionate about helping businesses leverage the power of Salesforce to achieve their goals.

Leave a Reply