New Datatable Features

The new v4.2.0 release of Datatable is now available!

Updates

The newest feature is Pagination. You can now specify how many records to show at a time and allow the user to page back and forth through the table.

A reactive Table Header is another new addition to this release. You can use a Text Temple, Formula or any other reactive component as part of your table header.

Based on feedback on how users were configuring the component, I moved the Configure Columns button from the top to the bottom of the Table Formatting section of the Property Editor.


Bug Fixes

The following bugs have been addressed in this release.

  • Fixed a bug where the maximum number of rows to be displayed gets cleared
  • Fixed a bug where an invalid link would show when an Apex Defined Lookup field was empty (@spyros-michailidisspyros-michailidis PR#1524)
  • Fixed an install issue with ers_DatatableController.cls if the target org has a class named โ€œTestโ€
  • Fixed a bug where Date fields from External Objects would show as blank (@philipnovak-pentair PR#1529)

Notes

If you also update the FlowActionsBasePack to v3.16 or later and the FlowScreenComponentsBasePack to v3.3.3 or later, the object selector for Datatable and many other USF components will now support standard objects released since API version 53.0. The most recent supported version is now API 60.0.

This release of Datatable will not yet retain selected rows when changing Search Terms, Column Filters, Sorting or Pagination. This support is planned for a future release.

Convert Text to Base64 Invocable Flow Action

Convert Text to Base64 Invocable Flow Action

Created by Eric Smith


This Post was most recently updated on: 4/7/24
Current Version: 1.0.0


Recently I was trying to convert a JavaScript button from Salesforce Classic to Lightning that was designed to take the user to an external link for the DocuWare application.

JavaScript Button

window.open(‘https://ami.docuware.cloud:443/DocuWare/Platform/WebClient/3024/Integration?p=RLV&rl=98c8d544-9b8a-48f0-b8a7-c8287d509e5f&fc=3f857eb7-7752-4aea-afdf-5c29a5843515&q=’+btoa(‘[FIELD_10] = “{!Case.CaseNumber}”‘));

Normally, for this type of link, I like to create a Screen Flow with a custom button and the Navigate Everywhere component and use a Text Template to define the URL to navigate to.

This project was a bit trickier because the button was referencing a deprecated JavaScript function (btoa) thatโ€™s designed to encode a String as a Base64 representation.

There is no standard function in Flow that will handle this type of conversion so I created a new Invocable Flow Action that will convert any Text to Base64.  With this new action I was able to create my Text Template URL for the navigation action.

My input to the ConvertTextToBase64 action was a text template which identified the string I needed to convert.

ttCaseNumber

[FIELD_10] = “{!recordId.CaseNumber}”

The URL text template used as the input to the Navigate Everywhere action was then able to reference the output of the ConvertTextToBase64 action.

ttButton1URL

https://ami.docuware.cloud:443/DocuWare/Platform/WebClient/3024/Integration?p=RLV&rl=98c8d544-9b8a-48f0-b8a7-c8287d509e5f&fc=3f857eb7-7752-4aea-afdf-5c29a5843515&q={!Convert_to_Base64.base64Output}


Attributes

AttributeTypeNotes
INPUT
Text Value for ConversionStringThe text to convert
OUTPUT
Base64 ValueStringThe converted Base64 value

Installation

Production or Developer Version 1.0.0

Sandbox Version 1.0.0


Release Notes

4/7/24 – Eric Smith – v1.0.0
Initial Release


View Source

Source Code

Invocable Actions – A Great New Overview Presentation and Video

I was able to join with Eric Smith and Rubin Roy to do a 40 minute breakout on Invocable Actions at TDX24. It gave us the chance to really put some fresh updated content together. Check out the video and the deck, below.



Invocable Actions Resources

Invocable Action Resources Home Page

From James Barker: Using Formulas with Data Fetcher to Reactively Push the Envelope’s Edge


With all of the news and updates with Reactive Screen Flow Components in tandem with Data Fetcher on the AppExchange, we can take multi-screen processes and simplify the user experience with less clicks and more real-time changes.

This article will go through examples in-depth on creating a Data Table with multiple levels of complexity:

  1. Single Dimension
  2. Multidimensional
  3. Multidimensional Criteria With Reactive Components
  4. Extending Our Criteria With SOSL

Before We Start – How Data Fetcher and Reactivity Work Together

The solutions discussed here make use of and require the Data Fetcher component. Data Fetcher enables you to dynamically query Salesforce records using SOQL and SOSL to return records in a collection variable based on user interaction on a screen flow. For example, a user can select a specific query from a picklist and return those records to a data table.

For a deeper understanding of Data Fetcher, see Data Fetcher on the AppExchange. In addition, see  Take Your Screen Flows to the Next Level with Reactivity | Automate This! on YouTube.

Primary Use-Case

As a project manager, I need to be able to identify which consultants are a good fit for the project that I am staffing using the individual’s department..


Data Fetcher Eliminates Steps

Prior to this package, this would have to be built using separate screens with a GET RECORDS between them. With reactive screen flow components we could dynamically show the criteria on the first screen, but the GET RECORDS would still be in between. 

Note that in this scenario, to adjust the Department we had to go back to change the value then repeat the GET RECORDS.

When we add the  Data Fetcher component to the screen, weโ€™re able to query for our record data without leaving the screen. To do this we tap into screen reactivity and so need to use reactive components. , I have switched the Picklist component to Quick Choice for the reactivity with Data Fetcher and the Data Table. 


Building Simple Formulas for Data Fetcher

To connect our QuickChoice component to our DataTable, weโ€™ll load Data Fetcher with this formula:

Formula

“SELECT Id, Name, Department, Tenure__c FROM Contact WHERE Department= ” + {!DepartmentQuickChoice.value}

See the components that were used below as well as a video walking through the logic for this.


Multidimensional

Sub Use-Case

As a project manager, I need to be able to identify which consultants are a good fit for the project that I am staffing using a list of different types of criteria.

Now we have our single-screen experience to identify the best resource. Our sub-use case requires another dimension for different types of criteria. 

In this version we are using two different types of input fields, Quick Choice and Slider. We are using these because we need to be able to pull the โ€œvalueโ€ into the formula.

Now we have two dimensions in our query for Data Fetcher and thus the Data Table. Note in the formula that we couldnโ€™t just use the value from the Tenure input, but had to convert it to TEXT first.

Formula

“SELECT Id, Name, Department, Tenure__c FROM Contact WHERE Department= ” + {!DepartmentQuickChoice.value} + “AND Tenure__c>=” +TEXT({!Tenure.value})


Aggregated Queries

Data Fetcher is not only great for managing the queries for a Data Table, but also for getting aggregations such as SUM or COUNT.

With what is available OOTB today with Flows, you are not able to do any sort of aggregation for search results. At best, we use assignments to handle a similar count, but this would require splitting up this experience into multiple screens/sections. 

This is another reason why SOQL and SOSL are so powerful to use with Data Fetcher as part of our user experience. 

Below you can see the Total Results reacting as the Tenure slider moves up and down.

Formula

“SELECT Count(Id) FROM Contact WHERE Department= ” + {!DepartmentQuickChoice.value} + “AND Tenure__c>=” +TEXT({!Tenure.value})


Multidimensional Criteria With Reactive Components

Our original use-case was: As a project manager, I need to be able to identify which consultants are a good fit for the project that I am staffing using a list of different types of criteria.

Now with a combination of reactive components, we have the following all embedded in a single experience:

Label Formula

<div class=”slds-box”>Feedback Notes: <br>{!Results.firstSelectedRow.Notes__c}</div>

Formula

“SELECT Id, Name, Department, Tenure__c, Notes__c, Title,Ptnr_Onbd_Fmwk__Onboarding_Status__c FROM Contact WHERE Department= ” + {!DepartmentQuickChoice.value} + “AND Tenure__c>=” +TEXT({!Tenure.value})


Extending Our Criteria With SOSL

Suppose you want to solve for multiple attributes within a single criteria. This could be multiple skills for a contact, where skills are stored as a custom object and are based on records. 

With SOQL statements, we would require the data to be structured to the point where each skill would require its own lookup to map to a specific field on the contact. This is not an optimal experience. 

With SOSL, you would be able to extend the search capabilities across multiple attributes within the criteria and not need the data to reside in specific mapped fields. 

Here, I wanted to build a way to use a list of skills that our Project Manager in the original use-case can use to further filter their talent.

So, how do we do this with SOSL and Data Fetcher?

First, we need a multi-select option to select our skills that will output all of the records in a consistent format. Enabling multi-select for the standard lookup input will work well as a simple UI for a user to interact with. 

Once we have the output, then we need to be able to do a query off of it.

The output of the lookup component looks like:

a7cHs0000006Bp8IAE,a7cHs0000006BpDIAU

The challenge with this is that a SOSL statement requires the use of โ€œ ORโ€ in order to add multiple search terms. So we need to clean the output before passing it to the actual SOSL statement. To do this, I used the Substitute formula. 

Original SUBSTITUTE function:

SUBSTITUTE({!Skills.recordIds}, “,”, ” AND “)

The next challenge with this is that this will only substitute the first โ€œ ,โ€ and not any subsequent. So we need to iterate on this to match the number of records we allow the user to search for in the lookup. 

The first iteration of the clean-up for the SUBSTITUTE is:

SUBSTITUTE({!CleanSkillsList1}, “,”, ” AND “)

Now our output from the lookup component is formatted the way we need it for our SOSL statement. 

Specifically for the SOSL query, we have:

“Find {” + {!CleanSkillsList} +”} IN ALL FIELDS RETURNING Contact(id,name)”

Now, I can write a simple query to get the right contacts with the right skills (there is a separate flow that when a skill is added to the contact, we stamp the ID onto the record detail directly for this search).


New Use Case: Multiple Data Tables & Related Lists For A Consumer Goods Brand

Letโ€™s look at another use-case that  can be built with formulas and Data Fetcher. This solution also uses Flow Button Bar by David Fromstein.

As a Campaign Manager for a consumer goods brand, I want to make sure that every store (example Loblaws, Whole Foods, etc) has the right promotional setup so that we know that they are in compliance. 

Effectively, this role wants to see images from a Promotion and compare it to the images from multiple store Visits.Note that visits are related to the account and the account represents the store. 

SOQL query for Promotions

 “SELECT Id, Name, Image_1_Preview__c, Image_1_View__c, Image_2_Preview__c, Image_2_View__c FROM Promotion WHERE Name =” + {!PromotionChoice.value}

SOQL query for Visits 

“Find {” + {!DynamicStoreId} +”} IN ALL FIELDS RETURNING Visit(id,name,AccountId,cgcloud__Subject__c, Image_1__c ,Image_1_Preview__c,Image_1_View__c, Image_2__c, Image_2_Preview__c, Image_2_View__c WHERE cgcloud__Completed_Date__c > “+{!FromCleanDate}+” AND cgcloud__Completed_Date__c < “+{!ToCleanDate}+”)”

Example substitute formula to clean the lookup records

SUBSTITUTE({!Stores.recordIds}, “,”, ” OR “)

Date clean-up formula 

TEXT(YEAR({!From})) & “-” & {!FromMonthCleanup} & “-” & {!FromDayCleanup}

Day data clean-up formula for SOSL format

CASE(Day({!From}),

1,”01″,2,”02″,3,”03″,4,”04″,5,”05″,6,”06″,7,”07″,8,”08″,9,”09″,10,”10″,11,”11″,12,”12″,13,”13″,14,”14″,15,”15″,16,”16″,17,”17″,18,”18″,19,”19″,20,”20″,21,”21″,22,”22″,23,”23″,24,”24″,25,”25″,26,”26″,27,”27″,28,”28″,29,”29″,30,”30″,”31″)


Thank you so much for following along with this article. I hope that it helped give some great ideas for how you can be leveraging Data Fetcher and Reactive Screen Flow Components.

If you have any questions or feedback, please comment down below.


Related

Watch the Automation Roadmap from TDX 24

The Automation Roadmap breakout session has become a fixture at Dreamforce and TDX. It’s unquestionably the best view into work underway on Flow and Actions.

Watch it here:

and see the slides here:

Spotlight on Hard-to-Find Features: Screen Flow Usage Reporting

It was recently pointed out that this feature exists in a 4-year old release note but has not yet been documented. So we thought we’d bring some attention to it.

From Titan: Combine Titan OCR with the Power of Salesforce Flow

Editorโ€™s Note: UnofficialSF is pleased to enable commercial creators of Flow extensions like Titan to introduce their products and demonstrate useful use cases. One of our goals is to see a rich tier of commercial solutions in addition to the many free extensions that will continue to be available. UnofficialSF receives no compensation for this.

Salesforce automation tools can help you stay ahead of the pack in today’s competitive business environment. They enable organizations to streamline operations, increase efficiency, reduce costs, improve accuracy, and focus on strategic initiatives.

Salesforce Flow is the silver bullet when it comes to streamlining business processes and automating tedious manual tasks. Salesforce Flow can automate various business processes across different departments and functions, such as marketing and sales, customer services and operations, and finance and human resources. With Salesforce Flow, you can streamline actions such as sending emails and custom notifications, executing business logic, manipulating data, and editing records in your CRM. Salesforce Flow empower you to create interactive and guided experiences by defining and automating a series of steps. 

If you want to extract data from various files using the power of Salesforce Flow, you can get Salesforce Einstein AI for your Enterprise or Unlimited edition. Alternatively, you can harness the power of Titan and OCR.

In this use case, we will show you how to trigger Titanโ€™s OCR (Optical Character Recognition feature) from within a Salesforce Flow. Combining Salesforce Flow and Titan OCR will allow you to seamlessly extract data from a variety of file types. Leverage the power of Salesforce Flow and Titanโ€™s OCR feature to easily create and update records in Salesforce using AI functionalities.

Before getting started, you will need to have an API-enabled edition of Salesforce and to have installed your Titan package. Install Titan on the Salesforce AppExchange by clicking Get It Now, and following the prompts. Once Titan is installed, itโ€™s also a good idea to read up on how to connect Titan to Salesforce.

Now you are good to go!

What is Titan OCR?

Titanโ€™s OCR feature gives you the power to parse and extract data from documents automatically using Titan Vision AI. Customers can upload documents such as passports, driverโ€™s licenses, and certificates, which are read by Titan. Data from these documents is then pushed to Salesforce in real time. Subsequently, a record is either updated or created in Salesforce using the OCR feature. In addition, native Salesforce files can be used to create or update records using Titan Flow. This gives you the opportunity to convert a file to data that can be used later to update information in Salesforce. 

In this use case, we look at how you can trigger Titan OCR from within a Salesforce Flow to automatically read information from important files and push the information to Salesforce.

How Does Salesforce Flow Work with Titan OCR?

In this article, we examine a Salesforce Flow triggered by a record in Salesforce that then, in turn, triggers a Titan Flow. The Titan Flow gets the file related to the triggering record to the OCR of the file. Then the JSON of the OCR is pushed back to Salesforce to the triggering record. This is useful if you want to go beyond using a static file format (which Titan OCR can do) to create or update records in Salesforce. 

In many cases, such as this, the customer works with multiple different formats that are also continually changing. So, in this instance, Titan OCR will extract this data to the JSON or plain text format and push this to Salesforce. This gives the Salesforce admin the ability to create a Salesforce automation (Apex) that will parse the data and create or update records accordingly.

Note: For those of you who are not familiar with Titan Flow, it is Titanโ€™s process management tool. Not to be confused with Salesforce Flow, this tool enables you to combine different processes in the Titan platform, manage integrations to third-party systems, and perform unique actions that extend the Titan platform.*

Salesforce Flow & Titan OCR: Use Case Unpacked

Before using Salesforce Flow and Titan OCR, you need to make sure Titan Flow is set up to run a Get from the file related to the Account record.**

Letโ€™s take a closer look at how this use case works by checking out the steps below:

Salesforce Flow

  1. For this use case, our Salesforce Flow is triggered by an Account Object:

2. If we open up this trigger, you can see that the Salesforce Flow is triggered every time that itโ€™s updated or created to meet the condition โ€œfield trigger_titan_flow_ocr_c equals Trueโ€.


3. Now that the Salesforce Flow trigger is set, an Action can be added. In the Action window, you need to run the โ€œForm_Builder_TitanFlowโ€ Action. This Action (and many more) comes with Titanโ€™s AppExchange managed package.

In order to run this action, you need to paste the Titan Flow ftFormHash (which is copied after setting up Titan Flow) as well as the recordId of the Account that triggers the flow:

4. You will be able to browse to Salesforce and open the Account record, then find the Trigger Titan Flow OCR checkbox and click the Edit icon.

Note: There are other parameters that can be passed to the Titan Flow if needed. For this, you will need to toggle on โ€œDonโ€™t Includeโ€ and add parameters.

5. Click the Titan Flow OCR checkbox on the Account record and then the Save button.

6. Then in Salesforce Flow, which triggers Titan Flow, OCR is performed. And you will be able to see your piece of JSON in the Account record field: 

Note: Here, we show you how to get this JSON and send it to Salesforce. You could also send it as a related file or a Flow Transform utility.

Bear in mind that if the format of your file is static, you can skip pushing JSON (as demonstrated above) and do straightforward creation or updating of fields and records in Salesforce.

Salesforce Flow + Titan OCR: Wrapped

And thatโ€™s a wrap on how you can trigger Titan OCR via a Salesforce Flow using no code and minimal configuration. Work with multiple and changing formats without breaking a sweat. This is only one example of how you can combine Titan and Salesforce Flow and there are many other cool actions you can perform with this no-code software. 

Footnotes:


*See an example of Titan Flow set up for this use case:

Titan Flow gets the Account Record ID and then the file that is related to this account

Here are some examples of Salesforce and non-Salesforce actions and integrations you can run with Titan Flow: 

** Set up OCR in Titan Flow: 

  1. Note: In this example, we use only one related file but there can be multiple files related to the record. If you choose, there can be multiple logic conditions added to this Get action. This determines the file/s the Get needs to fetch from Salesforce.
  1. OCR is configured for this file by adding the Titan Vision AI node:

3. Then a Salesforce Action node is added to update the triggering record, in our case, the Account, and push the JSON into a Salesforce field or as a file attached to the Salesforce record. 

4. For this use case to work in Salesforce Flow, we need the FormHash of the Titan Flow that has just been set up. Copy and save it by clicking โ€œPublishโ€ in the Titan Flow project:



From Adam White: Info on the new Copilot and how it works with Flow

Copilot is available for beta use as part of the Einstein SKU. Check out Adam’s Linked In post for more info.

FROM KAZUTAKA TSUJI: USE CUSTOM APPOINTMENT REVIEW SCREEN LWC FOR SALESFORCE SCHEDULER

Introduction

The OOTB Flow available in Salesforce Scheduler makes it easy and fast to manage reservations/appointments on Salesforce. However, there are several things that cannot be achieved with the standard functionality.

This article introduces a LWC to solve the things that cannot be done with the standard functions in the Review Inbound or Outbound Service Appointment component (it is used in the appointment review screen, see the Salesforce help) that can be used in the Salesforce Scheduler Flow.

What the standard OOTB Flow cannot archive:

  1. In the Scheduler OOTB Flow, when allowing end-users to enter data for custom fields on Service Appointment object, which are not displayed as populated values on the Review Inbound or Outbound Service Appointment component (e.g., custom reference field for Asset).
  2. Service Appointment layout is synchronized with the fields displayed in the [Review Inbound or Outbound Service Appointment] component, so if you delete the above custom fields from the layout, it will also be deleted from the record layout (if the custom field is important for your appointment, you will not be able to understand what the appointment is for).
  3. In order to save custom field values in the Service Appointment record entered during the Scheduler Flow, a JSON variable must be created in the Flow with using a formula (see this Chris’s article in What if I wanted to set the values for the serviceAppointmentFields variable myself? section)
  4. Certain fields cannot be removed from the [Review Inbound or Outbound Service Appointment]  component (e.g. Work Type, Parent record, Address)

Therefore, if you want to utilize the OOTB Flow, but do not want to develop all appointment screens and have issues with the standard appointment review screen, the LWC presented here may work for you.

Configuration

  1. Install the unmanaged package from this URL.
  2. After installing the package, assign the Permission Set to the Flow execution user.

Note: This Permission Set gives only Apex Class access that is used by LWC, there is no problem with granting Apex Class (FieldLabelController) access directly to the target user profile.

  1. Click on the Review Screen element of the Scheduler Flow you want to use.
  2. Replace standard [Review Inbound or Outbound Service Appointment] component to Custom Review Screen For Scheduler Flow from the Custom section as shown below.
  3. There are 8 parameters to configure: 
  • Is Modified Appointment? (Required)

Set to False for new appointments. Set to True for modified appointments.

  • Service Appointment Record (Required)

Set the record variable ServiceAppointment.

  • Service Resources Variable (Required)

For anonymous booking: set serviceResourceId text variable.

For multi-resource booking: set serviceResources text variable.

  • Work Type Group Id (Required)

Set WorkTypeGroupId text variable.

  • Excluded Fields

Specify field API names that you do not want to display on the appointment review screen, separated by comma.

Example: Comments,AdditionalInformation,IsAnonymousBooking,EngagementChannelTypeId

  • Lead Record

Required for guest user booking. Set the Lead Record variable.

  • Show Map

Specify whether to show Google Map for the appointment address. Default is False.

  • Show Service Resources

Whether or not to show service resource information on the review screen. Default is False.

  1. As per Chris’ article (From Chris Albanese: Build your own appointment review screen), a JSON variable must be set on the โ€œSave Appointmentโ€ element in order to create/modify a Service Appointment record, Set serviceAppointmentFields variable to the output.

That’s it for the setup!

What does this LWC look like?

As shown below, it is possible to display only the fields you really want to display, or to set up an appointment review screen with the populated values for the custom fields in the Service Appointment object.
Needless to say, this will not be synchronized with the Service Appointment layout.

In addition, since Custom Labels are used for header items in LWC, they can be freely changed, and translations can be added.

P.S.

  • This LWC does not have a feature of sorting fields. Although It can be added as a parameter to sort by API name in ascending or descending order, I want to make this LWC simple, so I decided not to consider it at this time.
  • This LWC is an unmanaged package and is treated as open source. Any bugs and pull requests can be sent to this GitHub repository, and you are free to Fork and modify it as you wish. 

ๆ—ฅๆœฌ่ชž

Salesforce Schedulerใซใฆใ€ไบˆ็ด„็ขบ่ช็”ป้ขใฎLWCใ‚’ไฝฟ็”จใ™ใ‚‹

ๅˆใ‚ใซ

Salesforce Schedulerใงไฝฟ็”จใงใใ‚‹OOTBใƒ•ใƒญใƒผใ‚’ไฝฟใˆใฐใ€ไบˆ็ด„็ฎก็†ใ‚’็ฐกๅ˜ใƒป่ฟ…้€ŸใซSalesforceไธŠใง่กŒใ†ใ“ใจใŒใงใใ‚‹ใ€‚ใ—ใ‹ใ—ใ€ๆจ™ๆบ–ๆฉŸ่ƒฝใงๅฎŸ็พใงใใชใ„ใ“ใจใ‚‚ใ„ใใคใ‹ใ‚ใ‚‹ใ€‚

ใ“ใกใ‚‰ใฎ่จ˜ไบ‹ใงใฏใ€Salesforce Schedulerใƒ•ใƒญใƒผใงไฝฟ็”จใงใใ‚‹[ๅ—ไฟกใพใŸใฏ้€ไฟกใ‚ตใƒผใƒ“ใ‚นไบˆๅฎšใ‚’ใƒฌใƒ“ใƒฅใƒผ]ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆ๏ผˆไบˆ็ด„็ขบ่ช็”ป้ข๏ผ‰ใงๆจ™ๆบ–ๆฉŸ่ƒฝใงใฏๅ‡บๆฅใชใ„ใ“ใจใ‚’่งฃๆฑบใ™ใ‚‹ใŸใ‚ใซ้–‹็™บใ—ใŸLWCใ‚’็ดนไป‹ใ™ใ‚‹ใ€‚

ๆจ™ๆบ–OOTBใƒ•ใƒญใƒผใงใงใใชใ„ใ“ใจ

  1. Scheduler OOTBใƒ•ใƒญใƒผใงใ€ใ‚ตใƒผใƒ“ใ‚นไบˆๅฎšใฎใ‚ซใ‚นใ‚ฟใƒ ้ …็›ฎใซๅฏพใ—ใฆใ‚จใƒณใƒ‰ใƒฆใƒผใ‚ถใซใƒ‡ใƒผใ‚ฟๅ…ฅๅŠ›ใ•ใ›ใ‚‹ๅ ดๅˆใซใ€ใ‚ตใƒผใƒ“ใ‚นไบˆๅฎšใฎใ‚ซใ‚นใ‚ฟใƒ ้ …็›ฎใŒ[ๅ—ไฟกใพใŸใฏ้€ไฟกใ‚ตใƒผใƒ“ใ‚นไบˆๅฎšใ‚’ใƒฌใƒ“ใƒฅใƒผ]ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใซใƒ‡ใƒผใ‚ฟใŒๅ…ฅๅŠ›ใ•ใ‚ŒใŸ็Šถๆ…‹ใง่กจ็คบใ•ใ‚Œใชใ„๏ผˆไพ‹: ็ดๅ…ฅๅ•†ๅ“ใฎใ‚ซใ‚นใ‚ฟใƒ ๅ‚็…ง้ …็›ฎใชใฉ๏ผ‰
  1. ใ‚ตใƒผใƒ“ใ‚นไบˆๅฎšใฎใƒฌใ‚คใ‚ขใ‚ฆใƒˆใจ[ๅ—ไฟกใพใŸใฏ้€ไฟกใ‚ตใƒผใƒ“ใ‚นไบˆๅฎšใ‚’ใƒฌใƒ“ใƒฅใƒผ]ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใซ่กจ็คบใ•ใ‚Œใ‚‹้ …็›ฎใฏๅŒๆœŸใ•ใ‚Œใฆใ„ใ‚‹ใŸใ‚ใ€ไธŠ่จ˜ใ‚ซใ‚นใ‚ฟใƒ ้ …็›ฎใ‚’ใƒฌใ‚คใ‚ขใ‚ฆใƒˆใ‹ใ‚‰ๆถˆใ—ใŸๅ ดๅˆใ€ใƒฌใ‚ณใƒผใƒ‰ใฎใƒฌใ‚คใ‚ขใ‚ฆใƒˆใ‹ใ‚‰ใ‚‚ๅ‰Š้™คใ•ใ‚Œใฆใ—ใพใ†๏ผˆใ‚ซใ‚นใ‚ฟใƒ ้ …็›ฎใŒ้‡่ฆใชๅ ดๅˆใ€ไฝ•ใซๅฏพใ™ใ‚‹ไบˆ็ด„ใชใฎใ‹ใ‚ใ‹ใ‚‰ใชใใชใฃใฆใ—ใพใ†๏ผ‰
  2. ไบˆ็ด„ๅฎŒไบ†ๆ™‚ใซๅ…ฅๅŠ›ใ•ใ‚ŒใŸใ‚ตใƒผใƒ“ใ‚นไบˆๅฎšใฎใ‚ซใ‚นใ‚ฟใƒ ้ …็›ฎใ‚’ใ‚ตใƒผใƒ“ใ‚นไบˆๅฎšใƒฌใ‚ณใƒผใƒ‰ใซไฟๅญ˜ใ™ใ‚‹ใŸใ‚ใซใฏใ€ๅˆฅ้€”ใƒ•ใƒญใƒผๅ†…ใงๆ•ฐๅผใงJSONๅค‰ๆ•ฐใ‚’ไฝœๆˆใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚‹ ๏ผˆChrisใฎใ“ใกใ‚‰ใฎ่จ˜ไบ‹ใฎWhat if I wanted to set the values for the serviceAppointmentFields variable myself?ใ‚’ๅ‚็…ง๏ผ‰
  3. ็‰นๅฎšใฎใƒ•ใ‚ฃใƒผใƒซใƒ‰ใฏ[ๅ—ไฟกใพใŸใฏ้€ไฟกใ‚ตใƒผใƒ“ใ‚นไบˆๅฎšใ‚’ใƒฌใƒ“ใƒฅใƒผ]ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใ‹ใ‚‰ๅ‰Š้™คใ™ใ‚‹ใ“ใจใŒใงใใชใ„๏ผˆไพ‹: ไฝœๆฅญ็จฎๅˆฅใ€่ฆชใƒฌใ‚ณใƒผใƒ‰ใ€ไฝๆ‰€๏ผ‰

ใ‚ˆใฃใฆใ€OOTBใƒ•ใƒญใƒผใ‚’ๆœ€ๅคง้™ๆดป็”จใ—ใŸใ„ใŒใ€ๅ…จใฆใฎไบˆ็ด„็”ป้ขใ‚’้–‹็™บใ—ใŸใใชใใ€ๆจ™ๆบ–ใฎไบˆ็ด„็ขบ่ช็”ป้ขใซ่ชฒ้กŒใŒใ‚ใ‚‹ๅ ดๅˆใ€ไปŠๅ›ž็ดนไป‹ใ™ใ‚‹LWCใฏๅŠนๆžœใ‚’็™บๆฎใ™ใ‚‹ใ‹ใ‚‚ใ—ใ‚Œใชใ„ใ€‚

่จญๅฎš

  1. ใ“ใกใ‚‰ใฎURLใ‹ใ‚‰้ž็ฎก็†ใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ™ใ‚‹ใ€‚
  2. ใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใ‚คใƒณใ‚นใƒˆใƒผใƒซๅพŒใ€ๆจฉ้™ใ‚ปใƒƒใƒˆใ‚’ใƒ•ใƒญใƒผๅฎŸ่กŒใƒฆใƒผใ‚ถใธๅ‰ฒใ‚Šๅฝ“ใฆใ‚‹
    1. โ€ปLWCใงไฝฟ็”จใ™ใ‚‹Apexใ‚ฏใƒฉใ‚นใฎใ‚ขใ‚ฏใ‚ปใ‚นใฎใฟใชใฎใงใ€FieldLabelController ใฎApexใ‚ขใ‚ฏใ‚ปใ‚นใ‚’ๅฏพ่ฑกใƒฆใƒผใ‚ถใซ็›ดๆŽฅไป˜ไธŽใ—ใฆใ‚‚ๅ•้กŒใชใ„ใ€‚
  1. ไฝฟ็”จใ—ใŸใ„Schedulerใƒ•ใƒญใƒผใฎReview Screen่ฆ็ด ใ‚’ใ‚ฏใƒชใƒƒใ‚ฏใ™ใ‚‹
  1. ไธ‹่จ˜ใฎใ‚ˆใ†ใซใ€Customใ‚ปใ‚ฏใ‚ทใƒงใƒณใ‹ใ‚‰ใ€Custom Review Screen For Scheduler Flow ใ‚’่จญ็ฝฎใ™ใ‚‹ใ€‚ๆจ™ๆบ–ใฎ[ๅ—ไฟกใพใŸใฏ้€ไฟกใ‚ตใƒผใƒ“ใ‚นไบˆๅฎšใ‚’ใƒฌใƒ“ใƒฅใƒผ]ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใฏๅ‰Š้™คใ™ใ‚‹ใ€‚

่จญๅฎšใƒ‘ใƒฉใƒกใƒผใ‚ฟใฏไธ‹่จ˜ใฎ8ใค:

  • Is Modified Appointment? (Required)
    • ๆ–ฐ่ฆไบˆ็ด„ใฎๅ ดๅˆใ€Falseใ‚’่จญๅฎšใ™ใ‚‹ใ€‚ไบˆ็ด„ๅค‰ๆ›ดใฎๅ ดๅˆใฏTrueใ‚’่จญๅฎšใ™ใ‚‹
  • Service Appointment Record (Required)
    • ใƒฌใ‚ณใƒผใƒ‰ๅค‰ๆ•ฐใฎ ServiceAppointment ใ‚’่จญๅฎšใ™ใ‚‹
  • Service Resources Variable (Required)
    • ๅŒฟๅไบˆ็ด„ใฎๅ ดๅˆ: serviceResourceId ใƒ†ใ‚ญใ‚นใƒˆๅค‰ๆ•ฐใ‚’่จญๅฎšใ™ใ‚‹
    • ใƒžใƒซใƒใƒชใ‚ฝใƒผใ‚นไบˆ็ด„ใฎๅ ดๅˆ: serviceResources ใƒ†ใ‚ญใ‚นใƒˆๅค‰ๆ•ฐใ‚’่จญๅฎšใ™ใ‚‹
  • Work Type Group Id (Required)
    • WorkTypeGroupId ใƒ†ใ‚ญใ‚นใƒˆๅค‰ๆ•ฐใ‚’่จญๅฎšใ™ใ‚‹
  • Excluded Fields
    • ไบˆ็ด„็ขบ่ช็”ป้ขใซ่กจ็คบใ—ใŸใใชใ„้ …็›ฎใฎAPIๅใ‚’ใ‚ซใƒณใƒžๅŒบๅˆ‡ใ‚ŠใงๆŒ‡ๅฎšใ™ใ‚‹
      ไพ‹: Comments,AdditionalInformation,IsAnonymousBooking,EngagementChannelTypeId
  • Lead Record
    • ใ‚ฒใ‚นใƒˆใƒฆใƒผใ‚ถไบˆ็ด„ใฎๅ ดๅˆใซ่จญๅฎšๅฟ…้ ˆ. Lead ใƒฌใ‚ณใƒผใƒ‰ๅค‰ๆ•ฐใ‚’่จญๅฎšใ™ใ‚‹
  • Show Map
    • ไบˆ็ด„ไฝๆ‰€ใซๅฏพใ—ใฆGoogle Mapใ‚’่กจ็คบใ™ใ‚‹ใ‹ใฉใ†ใ‹ใ€‚True / False ใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใ€‚ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใฏFalse.
  • Show Service Resources
    • ใ‚ตใƒผใƒ“ใ‚นใƒชใ‚ฝใƒผใ‚นๆƒ…ๅ ฑใ‚’ไบˆ็ด„็ขบ่ช็”ป้ขใซ่กจ็คบใ™ใ‚‹ใ‹ใฉใ†ใ‹ใ€‚True / False ใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใ€‚ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใฏFalse.
  1. Chrisใฎ่จ˜ไบ‹ (From Chris Albanese: Build your own appointment review screen) ใซใ‚ใ‚‹ใ‚ˆใ†ใซใ€Save Appointment่ฆ็ด ใซใฏใ‚ตใƒผใƒ“ใ‚นไบˆๅฎšใ‚’ไฝœๆˆใ™ใ‚‹ใŸใ‚ใฎJSONใ‚’่จญๅฎšใ—ใชใ‘ใ‚Œใฐใ„ใ‘ใชใ„ใฎใงใ€serviceAppointmentFields ๅค‰ๆ•ฐใ‚’ใ‚ขใ‚ฆใƒˆใƒ—ใƒƒใƒˆใซ่จญๅฎšใ™ใ‚‹ใ€‚

ไปฅไธŠใง่จญๅฎšใฏ็ต‚ไบ†ใงใ™ใ€‚

ๅ‹•ไฝœ

ไธ‹่จ˜ใฎใ‚ˆใ†ใซใ€่กจ็คบใ—ใŸใ„้ …็›ฎใ ใ‘ใ‚’่กจ็คบใ—ใŸใ‚Šใ€ใ‚ตใƒผใƒ“ใ‚นไบˆๅฎšใฎใ‚ซใ‚นใ‚ฟใƒ ้ …็›ฎใŒๅ€คใŒใ‚ปใƒƒใƒˆใ•ใ‚ŒใŸ็Šถๆ…‹ใงไบˆ็ด„็ขบ่ช็”ป้ขใ‚’่จญๅฎšใ™ใ‚‹ใ“ใจใŒๅฏ่ƒฝใซใชใ‚‹ใ€‚ใ‚‚ใกใ‚ใ‚“ใ€ใ‚ตใƒผใƒ“ใ‚นไบˆๅฎšใฎใƒฌใ‚คใ‚ขใ‚ฆใƒˆใจใฏๅŒๆœŸใ•ใ‚Œใชใ„ใ€‚

ใพใŸใ€ใƒ˜ใƒƒใƒ€ใƒผ้ƒจๅˆ†ใฎ้ …็›ฎใชใฉใฏใ‚ซใ‚นใ‚ฟใƒ ่กจ็คบใƒฉใƒ™ใƒซใ‚’ไฝฟ็”จใ—ใฆใ„ใ‚‹ใŸใ‚ใ€่‡ช็”ฑใซๅค‰ๆ›ดใŒๅฏ่ƒฝใ‹ใคใ€ๅคš่จ€่ชžๅฏพๅฟœใ‚‚ๅฏ่ƒฝใ€‚

่ฃœ่ถณๆƒ…ๅ ฑ

  • ใ“ใกใ‚‰ใฎLWCใงใฏใ€้ …็›ฎใฎไธฆใณๆ›ฟใˆใŒๅ‡บๆฅใชใ„ใ€‚ใ‚‚ใกใ‚ใ‚“ใ€APIๅใงใฎๆ˜‡้ †ใƒป้™้ †ใชใฉใฎไธฆใณๆ›ฟใˆใฏ่จญๅฎšใซ่ฟฝๅŠ ใ™ใ‚‹ใ“ใจใฏๅฏ่ƒฝใ ใฃใŸใฎใ ใŒใ€ไปŠๅ›žใฏ่€ƒๆ…ฎใ—ใฆใ„ใชใ„ใ€‚
  • ็ดนไป‹ใ—ใŸLWCใฏ้ž็ฎก็†ใƒ‘ใƒƒใ‚ฑใƒผใ‚ธใฎใŸใ‚ใ€ใ‚ชใƒผใƒ—ใƒณใ‚ฝใƒผใ‚นใฎๆ‰ฑใ„ใจใชใ‚‹ใ€‚Bugใ‚„Pull Requestใฏใ“ใกใ‚‰ใฎGitHubใƒฌใƒใ‚ธใƒˆใƒชใพใงใ€‚Forkใ—ใฆใ”่‡ช็”ฑใซๅค‰ๆ›ดใ—ใฆใ„ใŸใ ใ„ใฆๆง‹ใ„ใพใ›ใ‚“ ๐Ÿ™‚