<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Untitled Publication]]></title><description><![CDATA[Untitled Publication]]></description><link>https://robstechblog.com</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Apr 2026 02:36:47 GMT</lastBuildDate><atom:link href="https://robstechblog.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[New LWC lightning__FlowAction Target]]></title><description><![CDATA[The Salesforce Winter ’26 release for LWC introduced a few really cool features. I may post about more of them later, but in this article I want to focus on the new configuration target available for our components.
The new configuration target is li...]]></description><link>https://robstechblog.com/new-lwc-lightningflowaction-target</link><guid isPermaLink="true">https://robstechblog.com/new-lwc-lightningflowaction-target</guid><category><![CDATA[lwc]]></category><category><![CDATA[Salesforce]]></category><category><![CDATA[salesforce development]]></category><dc:creator><![CDATA[Robert Strunk]]></dc:creator><pubDate>Thu, 16 Oct 2025 17:29:11 GMT</pubDate><content:encoded><![CDATA[<p>The Salesforce Winter ’26 release for LWC introduced a few really cool features. I may post about more of them later, but in this article I want to focus on the new configuration target available for our components.</p>
<p>The new configuration target is <code>lightning__FlowAction</code>, and it opens some pretty cool doors for screen flow customizations. <a target="_blank" href="https://developer.salesforce.com/docs/platform/lwc/guide/targets-lightning-flow-action.html">Check it out</a> in the official docs.</p>
<p>Basically, it allows us to create an LWC that can be called as an action from a flow. The cool thing is that the component has access to the browser and some of its features/APIs.</p>
<p>My initial thought was, “How cool would it be if the LWC could access the <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/API/File_System_API">File System API</a>”. I didn’t think that would be allowed due to security restrictions. But I admit it’s been a while since I’ve had the time to play with LWCs, and the security landscape has changed a bit.</p>
<p>To my surprise, I was able to access the File API. I created a quick LWC and pulled it in via flow. Screenshots and code below.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1760636522923/cdef47a8-826f-4ad0-b692-9b478b904b16.png" alt class="image--center mx-auto" /></p>
<p>Here is the flow at runtime. When the user clicks the button it invokes the LWC.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1760634592339/9e1012f0-6fbe-4fe0-b11f-09aa6e0732d4.png" alt class="image--center mx-auto" /></p>
<p>After the “Next” button is clicked, the LWC tells the browser to open a file window in the machine’s operating system. In the screenshot below we see that I have selected a text file named “example file.txt”</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1760634765786/7426ca59-434f-47e1-bedf-9895fe4b5e3a.png" alt class="image--center mx-auto" /></p>
<p>When I click the “Open” button, the text file is sent from local file system to the browser and then to the LWC that is inside the flow. This LWC only logs the file header and the file contents to the console, but you can do some pretty cool things from this point.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1760635113027/5e7ab822-e62b-4dd8-ab7a-4fe45e7baf3e.png" alt class="image--center mx-auto" /></p>
<h3 id="heading-lwc-configuration-file-code">LWC Configuration File Code</h3>
<pre><code class="lang-xml"><span class="hljs-meta">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">LightningComponentBundle</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://soap.sforce.com/2006/04/metadata"</span>&gt;</span>
   <span class="hljs-tag">&lt;<span class="hljs-name">apiVersion</span>&gt;</span>65.0<span class="hljs-tag">&lt;/<span class="hljs-name">apiVersion</span>&gt;</span>
   <span class="hljs-tag">&lt;<span class="hljs-name">isExposed</span>&gt;</span>true<span class="hljs-tag">&lt;/<span class="hljs-name">isExposed</span>&gt;</span>
   <span class="hljs-tag">&lt;<span class="hljs-name">targets</span>&gt;</span>
       <span class="hljs-tag">&lt;<span class="hljs-name">target</span>&gt;</span>lightning__FlowAction<span class="hljs-tag">&lt;/<span class="hljs-name">target</span>&gt;</span>
   <span class="hljs-tag">&lt;/<span class="hljs-name">targets</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">LightningComponentBundle</span>&gt;</span>
</code></pre>
<h3 id="heading-lwc-javascript-file-code">LWC Javascript File Code</h3>
<pre><code class="lang-javascript"><span class="hljs-keyword">import</span> { api, LightningElement } <span class="hljs-keyword">from</span> <span class="hljs-string">'lwc'</span>;

<span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">FlowAction</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">LightningElement</span> </span>{

    @api <span class="hljs-keyword">async</span> invoke() {

        <span class="hljs-keyword">const</span> [fileHandle] = <span class="hljs-keyword">await</span> <span class="hljs-built_in">window</span>.showOpenFilePicker({
            <span class="hljs-attr">types</span>: [{
                <span class="hljs-attr">description</span>: <span class="hljs-string">"Text"</span>,
                <span class="hljs-attr">accept</span>: {<span class="hljs-string">"text/plain"</span>: [<span class="hljs-string">".txt"</span>]}
            }],
            <span class="hljs-attr">excludeAcceptAllOption</span>: <span class="hljs-literal">true</span>,
            <span class="hljs-attr">multiple</span>: <span class="hljs-literal">false</span>,
        });

        <span class="hljs-keyword">const</span> file = <span class="hljs-keyword">await</span> fileHandle.getFile();

        <span class="hljs-comment">// declutter</span>
        <span class="hljs-built_in">console</span>.clear();

        <span class="hljs-comment">// log file header</span>
        <span class="hljs-built_in">console</span>.group(<span class="hljs-string">'FILE HEADER'</span>)
        <span class="hljs-built_in">console</span>.log(file);
        <span class="hljs-built_in">console</span>.groupEnd();

        <span class="hljs-keyword">const</span> reader = <span class="hljs-keyword">new</span> FileReader();

        reader.addEventListener(<span class="hljs-string">"load"</span>, <span class="hljs-function">() =&gt;</span> {

            <span class="hljs-comment">// log file content</span>
            <span class="hljs-built_in">console</span>.group(<span class="hljs-string">'FILE CONTENT'</span>);
            <span class="hljs-built_in">console</span>.log(reader.result);
            <span class="hljs-built_in">console</span>.groupEnd();
        });

        <span class="hljs-keyword">if</span> (file) {
            reader.readAsText(file);
        }
    }
}
</code></pre>
]]></content:encoded></item><item><title><![CDATA[The Ultimate Platform]]></title><description><![CDATA[As strange as this may seem to some, my appreciation for nature has deepened over the years as a direct result of learning more about how software is architected. When I say nature, I am not just talking about trees and beautiful scenic vistas, I am ...]]></description><link>https://robstechblog.com/the-ultimate-platform</link><guid isPermaLink="true">https://robstechblog.com/the-ultimate-platform</guid><dc:creator><![CDATA[Robert Strunk]]></dc:creator><pubDate>Thu, 09 Oct 2025 00:57:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1759972041929/f3b6e607-cdf9-491f-8da8-317a05db19f0.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>As strange as this may seem to some, my appreciation for nature has deepened over the years as a direct result of learning more about how software is architected. When I say nature, I am not just talking about trees and beautiful scenic vistas, I am referring to literally everything that exists (AKA the universe). I see the universe as the ultimate platform and I am in awe of what exists and how it may have come to be.</p>
<p>In my line of work, the word “platform” is very common and used almost daily. As with many words in the English language, it can have multiple meanings depending on the context. In the software world, the term can be thought of as a “foundational environment” that enables the creation and execution of software.</p>
<p>The foundational environment has some elemental capabilities, constraints, and/or mechanisms. Platform architects and engineers take those elements and weave them together into more targeted components or services. Those components or services can further be woven together to create meaningful software solutions that address many use cases. Each time something new emerges from combining lower level elements, it represents a new <strong>layer of abstraction</strong>. The foundational layer is considered the lowest level of abstraction and each new layer is one step higher on the abstraction rung.</p>
<p>That probably sounds confusing, keep reading.</p>
<p>I love using analogies, so here is one that I hope will convey this concept of abstraction layers in a more digestible way. It’s not a perfect analogy but If you can resist the urge to overanalyze it, it will get the point across. Think of the English alphabet as a platform. But instead of software creation, this platform is used to describe ideas in a written form.</p>
<p>With this analogy, the lowest level of abstraction is the letters of the alphabet and any rules that govern how those letters can be arranged. So if we take various letters and arrange them together we then create a word. Different letters and different arrangements of those letters will create different words.</p>
<p>The concept of a word represents the next layer of abstraction. We went from the lowest level of abstraction (letters) to a slightly higher level of abstraction (words). Each individual word has some specific meaning (capability) that generally differs from the other words. We then take words and arrange them together to form sentences.</p>
<p>The concept of a sentence represents the next layer of abstraction here. A sentence is just words arranged together, and words are just an arrangement of letters. And a sentence can represent simple ideas.</p>
<p>Some have estimated that roughly one hundred million books have been written in the English language. How many unique ideas do you think have been expressed in those books? Not a small number for sure, and there isn’t a real limit to how many ideas can be expressed using our alphabet platform.</p>
<p>Every single one of those ideas are <strong>just different combinations of our 26 elemental letters</strong> which is pretty amazing! (In software, it all boils down to just 1s and 0s!)</p>
<p>Now that we are aligned with the usage of the word “platform” and have an understanding of abstraction layers, I want to nerd out on the ultimate platform a little.</p>
<p>In my mind, the universe is the ultimate platform because literally everything that exists is just something created from things on an abstraction layer below them. Let's start with a basic example to show you what I mean by that.</p>
<p>Water.</p>
<p>Water seems like a very basic thing. I mean, it's just water right? Yes and no, depending on your perspective. Water, from the human perspective, is just a liquid. But if you zoom in enough you see that water isn’t one thing. It's just a mind-blowingly large number of little tiny things (molecules). Water is considered a substance. Substances are just a bunch of molecules. So in this example, there is an abstraction layer where molecules sit and an abstraction layer slightly above it where substances sit.</p>
<p>And that is just a super basic example. Literally everything around us is some construct that exists at a higher level of abstraction. And the coolest part is that scientists still don’t know what the lowest abstraction layer of the universe is. <a target="_blank" href="https://en.wikipedia.org/wiki/String_theory">String theory</a> is the leading guess at the moment.</p>
<p>For THOUSANDS (yep BC/BCE) of years it was thought that the atom was the lowest indivisible building block of everything. But in the very late 1800s electrons were discovered. Then protons. Then neutrons. So an atom turned out to be just some arrangement of the things on a lower abstraction layer. A half a century later, advancements in particle physics showed that even protons, neutrons, and electrons were made up of smaller things like quarks and gluons.</p>
<p>I get super excited when I think about how we <strong>(self aware, thinking, and conscious beings)</strong> are just some arrangement of whatever the low level building blocks of the universe are. I sit in wonder of all the amazing possibilities of other things that can be built on this beautifully sophisticated platform of elegance we call the universe.</p>
<p><a target="_blank" href="https://youtube.com/shorts/HNwYUGLwMhU?si=Zme51qVEfMfAR6ok">This video is a perfect example of nature taking something from one abstraction layer and creating something on a layer a little higher up!</a></p>
]]></content:encoded></item></channel></rss>