<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Low Code &amp; Fusion Dev Blog</title>
        <link>https://microsoft.github.io/Low-Code/blog</link>
        <description>Low Code &amp; Fusion Dev Blog</description>
        <lastBuildDate>Wed, 01 Mar 2023 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Continue The Journey!]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-next-steps</link>
            <guid>2023-next-steps</guid>
            <pubDate>Wed, 01 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Here's a recap of #30DaysOfLowCode! - join us at #LowCodeFebruary https://aka.ms/lowcode-february.]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>Thank you! ❤️</li><li>Recap of #30DaysOfLowCode</li><li>Continue the Journey</li><li><strong>Get Started</strong>: Sign up for your <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Free Developer Plan</strong></a></li></ul><p><img loading="lazy" alt="Mar1" src="/Low-Code/assets/images/30-final-dd8a64def3f6268fe7e4c1af0847ff96.png" width="1334" height="560" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="thank-you-️">Thank you! ❤️<a class="hash-link" href="#thank-you-️" title="Direct link to heading">​</a></h2><p> It's hard to believe that #30DaysOfLowCode is coming to an end! It seems like just yesterday that we launched this initiative, and yet here we are, 30 days later, with an incredible amount of learning and growth behind us. So... it's time for a wrap!</p><p> The numbers for the #LowCodeFebruary campaign are truly impressive, with over <strong>130,000</strong> visitors to the event page, <strong>16,000</strong> attendees (live and on-demand) to the Powerful Dev Conf, and <strong>2,500</strong> participants taking part in the cloud skills challenges. What's more, we have welcomed countless attendees joining the various events and activities, from blogs series, to workshops, learn lives, webinars, and more. </p><p>  From the bottom of our hearts, we want to thank each and every one of you for your participation, engagement, and enthusiasm. It's been truly inspiring to see the passion and dedication from this strong community, and we're honored to be a part of it. ✨</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="recap-of-30daysoflowcode">Recap of #30DaysOfLowCode<a class="hash-link" href="#recap-of-30daysoflowcode" title="Direct link to heading">​</a></h2><p>  As we wrap up this exciting event, we wanted to take a moment to reflect on all that we've accomplished together. Over the last 30 days, we've covered a lot of ground, from the basics of Power Platform to more advanced concepts like custom code and app lifecycle management. </p><p>  Now that the campaign is ending, we want to make sure that you have all the resources you need to continue honing your skills in the future. Whether you're looking to build your first app, collaborate with others, or simply keep learning, there are plenty of resources out there to help you achieve your goals. So, let's dive in and explore all the ways you can continue to skill up in Power Platform!  </p><p> <strong>Important skill-up resources:</strong></p><ol><li><p>📅 <a href="https://microsoft.github.io/Low-Code/lowcode-february/30Days/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>#30DaysOfLowCode</strong></a> By following the sequence of the blogs, you can build your knowledge step-by-step, gaining a deeper understanding of the various tools and capabilities of Power Platform along the way. This approach allows you to build a solid foundation of knowledge while also challenging yourself to grow and develop your skills. </p><p><a href="https://microsoft.github.io/Low-Code/lowcode-february/30Days/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>#30DaysOfLowCode Roadmap</strong></a>:</p><ul><li><strong>Week 1️⃣: Fundamentals:</strong> Power Platform core concepts, getting onboard and developer stories </li><li><strong>Week 2️⃣: Backend Integrations:</strong> Connectors, dataverse, custom connectors, API management, Azure integration and hand-on practices &amp; turorials </li><li><strong>Week 3️⃣: User Interface:</strong> Building a Canvas app, introduction to PowerFx, Power Component Framework Controls, Power Pages as well as OpenAI and Power Platform.</li><li><strong>Week 4️⃣: Dev Experience:</strong> Tutorials on ALM (App Lifecycle Management), GitHub Actions, App Governance, Automated testing, as well as ACS and OpenAI. </li><li><strong>Week 5️⃣: Wrap-up:</strong> API Management, Power Platform Pipelines and Monthly Recap </li></ul></li><li><p>🚀 <a href="/Low-Code/lowcode-february/ZeroToHero/"><strong>#ZeroToHero</strong></a>  Get the latest updates on technologies and products for low code development directly from product teams.</p></li><li><p>📺 <a href="/Low-Code/lowcode-february/Video-Live/"><strong>Video + Livestream</strong></a> 📻 Join online conversations with product teams and ask questions. </p><p>🎉 Sign Up for <a href="https://aka.ms/ATE0309/RSVP" target="_blank" rel="noopener noreferrer"><strong>Low Code February Ask The Experts! on Mar 09, 9AM PST</strong></a> for the hero Q&amp;A session from the Low Code February leadership team. Our experts will be available to answer questions about full code and low code integration.</p><p>Recap on past <strong>hero sessions</strong>🌟:</p><ol><li><a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Powerful Devs Conference: On-Demand</strong></a> The Powerful Devs Conference is a fantastic resource for developers who want to learn more about the Power Platform and how to build applications quickly and easily.</li><li><a href="https://mktoevents.com/Microsoft+Event/383091/157-GQE-382" target="_blank" rel="noopener noreferrer"><strong>Webinar: Power Platform &amp; Azure Deploys with GitHub: On-Demand</strong></a> Watch the on-demand webinar, where you'll get a chance to explore the powerful capabilities that the Power Platform opens up for GitHub.</li><li><a href="https://aka.ms/ATE0223/RSVP" target="_blank" rel="noopener noreferrer"><strong>Powerful Dev Ask The Expert: On-Demand</strong></a> - Watch the last session for Q&amp;A from the Powerful Devs Conference team. The Powerful Devs Conference is all about showing how code-first developers can integrate with the Power Platform to innovate faster. </li><li><a href="https://aka.ms/lowcode-february/LearnLive" target="_blank" rel="noopener noreferrer"><strong>Learn Live! - On-Demand</strong></a> Check out our Learn Live recordings if you have any questions or concerns about the Microsoft Learn modules or the Cloud Skills Challenge.</li></ol></li><li><p>📖 <strong>Self-Learning Resources</strong></p><ol><li><a href="https://www.youtube.com/playlist?list=PLi9EhCY4z99XUWIWXmw8Oc4N3qgwPA7Yl" target="_blank" rel="noopener noreferrer"><strong>Low Code February Video Turorials collection</strong></a></li><li><a href="https://learn.microsoft.com/en-us/users/nityan/collections/xz6ehr2mx031y0?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Power Platform Learn Modules</strong></a></li><li><a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer"><strong>Cloud skills Challenge</strong></a>: gives you a free curated set of learning modules to jumpstart your learning journey into Low Code and fusion development.</li></ol></li><li><p>⚒️ <a href="/Low-Code/docs/intro/"><strong>Dev Workshops</strong></a> Learn by doing! These labs help you gain hands-on experience from intro to advanced, whereever you're in the learning path. </p></li><li><p>😁 <a href="https://pnp.github.io/powerplatform-samples/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Community Buzz</strong></a> Connect with the community and contribute your expertise by building interesting demos or writing articles.</p></li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="continue-the-journey">Continue the Journey<a class="hash-link" href="#continue-the-journey" title="Direct link to heading">​</a></h2><p>  We believe that initiatives like #30daysoflowcode are critical in empowering developers to build up the technical skills they need to succeed in the digital transformance era. </p><p>  Stay tuned and <a href="https://aka.ms/lowcode-february" target="_blank" rel="noopener noreferrer"><strong>🔖 save the page</strong></a>, as we will be back soon with more exciting content and resources to help you continue your learning journey. We're committed to supporting you in your growth and development, and we'll be providing even more opportunities for you to learn and build with low code! 🎉</p><p>  <img loading="lazy" alt="Thank You" src="/Low-Code/assets/images/30-thankyou-6d9698d5c22fe0450028253b05ede15f.png" width="1001" height="420" class="img_ev3q"></p>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
            <category>developer experience</category>
            <category>backend integration</category>
            <category>UI</category>
        </item>
        <item>
            <title><![CDATA[27. 🚀API Management & Power Platform]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day27</link>
            <guid>2023-day27</guid>
            <pubDate>Mon, 27 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Introducing Authorizations in Azure API Management and showcasing its capabilities together with the Microsoft Power Platform. - join us at #30DaysOfLowCode and #LowCodeFebruary https://aka.ms/lowcode-february.]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 27</code> of #30DaysOfLowCode!</p><p>Introducing <a href="https://learn.microsoft.com/en-us/azure/api-management/authorizations-overview?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Authorizations</a> in Azure API Management and showcasing its capabilities together with the Microsoft Power Platform. Last time, we talked about how we can provide extra <a href="https://microsoft.github.io/Low-Code/blog/2023-day10" target="_blank" rel="noopener noreferrer">security to our web APIs using Azure API Management</a>. In this section, we will talk about the <a href="https://learn.microsoft.com/en-us/azure/api-management/authorizations-overview?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Authorizations</a> feature in Azure API Management and how this can elevate your low-code journey with web APIs.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li><a href="#what-is-api-management-authorizations">What is API Management Authorizations</a></li><li><a href="#scenario---power-apps-integration-with-github-and-api-management-authorizations">Scenario - Power Apps integration with GitHub and API Management Authorizations</a></li><li><a href="#scenario-overview">Scenario Overview</a></li><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#step-1-register-an-application-in-github-for-your-organization">Step 1: Register an application in GitHub for your organization</a></li><li><a href="#step-2-configure-an-authorization-in-api-management">Step 2: Configure an authorization in API Management</a></li><li><a href="#step-3-create-an-api-in-api-management-and-configure-a-policy">Step 3: Create an API in API Management and configure a policy</a></li><li><a href="#step-4-create-a-custom-connector-for-the-microsoft-power-platform-using-api-management">Step 4: Create a custom connector for the Microsoft Power Platform using API Management</a></li><li><a href="#step-5-call-your-web-api-via-your-power-app">Step 5: Call your web API via your Power App</a></li></ul><p><img loading="lazy" alt="feb27" src="/Low-Code/assets/images/30-27-c59d588b7a5514e6518adcbe834049e1.png" width="1334" height="560" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-api-management-authorizations">What is API Management Authorizations<a class="hash-link" href="#what-is-api-management-authorizations" title="Direct link to heading">​</a></h2><p><a href="https://learn.microsoft.com/en-us/azure/api-management/authorizations-overview" target="_blank" rel="noopener noreferrer">API Management authorizations</a> allows you to delegate authentication to API Management to let it authenticate against a given backend service or a given SaaS platform. It greatly simplifies the process for authenticating and authorizing users across these services and reduces development costs in ramping up, implementing and maintaining security features with service integrations. It lets you configure OAuth, Consent, Acquire Tokens, Cache Tokens and refreshes tokens for multiple services without writing a single line of code. API Management does all the heavy lifting for you, while you can focus on the application/domain logic.</p><blockquote><p><em>Note: It differs from managed identity in that it spans multiple identity providers (IDP), as it is not tight to Azure Active Directory. It also leverages OAuth flows, such as the Authorization code flow, while managed identities stick to the Client Credentials Grant.</em></p></blockquote><h2 class="anchor anchorWithStickyNavbar_LWe7" id="scenario---power-apps-integration-with-github-and-api-management-authorizations">Scenario - Power Apps integration with GitHub and API Management Authorizations<a class="hash-link" href="#scenario---power-apps-integration-with-github-and-api-management-authorizations" title="Direct link to heading">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-overview">Scenario Overview<a class="hash-link" href="#scenario-overview" title="Direct link to heading">​</a></h3><p>Imagine having a GitHub organization with multiple <a href="https://docs.github.com/en/organizations/collaborating-with-your-team/about-team-discussions" target="_blank" rel="noopener noreferrer">team discussions</a>. In one of your team discussions, you want to collect issues from users via comments. Now, to post a GitHub comment, every user requires a GitHub account and needs to understand where to find the relevant team discussion.</p><blockquote><p>Let's create a Power App that uses a custom connector to call the right GitHub API to post a comment about an issues to a team's discussion.</p></blockquote><p>Note: Microsoft Power Platform offers wide varity of pre-installed connectors, one of them for <a href="https://learn.microsoft.com/en-us/connectors/github/" target="_blank" rel="noopener noreferrer">GitHub</a>. For our scenarios however, this connector doesn't provide us with the right capability. Creating a custom connector using Azure API Management is an easy and secure way to expose your microservices/APIs directly. This way, you can expand the possibilities with the Microsoft Power Platform and adapt it according to your organization's use cases.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="prerequisites">Prerequisites<a class="hash-link" href="#prerequisites" title="Direct link to heading">​</a></h3><ul><li>A GitHub account is required.</li><li>A team discussion in your GitHub organization. Follow <a href="https://docs.github.com/en/organizations/collaborating-with-your-team/creating-a-team-discussion" target="_blank" rel="noopener noreferrer">Creating a team discussion</a> for more information.</li><li>A running API Management instance. Complete the following&nbsp;<a href="https://learn.microsoft.com/en-us/azure/api-management/get-started-create-service-instance" target="_blank" rel="noopener noreferrer">Quickstart: Create a new Azure API Management service instance by using the Azure portal</a>.</li><li>Enable <a href="https://learn.microsoft.com/en-us/azure/api-management/api-management-howto-use-managed-service-identity" target="_blank" rel="noopener noreferrer">managed service identiy</a> for API Management in the API Management instance.</li><li>Make sure you have a Power Apps or Power Automate <a href="https://learn.microsoft.com/en-us/power-apps/powerapps-overview#power-apps-for-developers" target="_blank" rel="noopener noreferrer">environment</a>.</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="step-1-register-an-application-in-github-for-your-organization">Step 1: Register an application in GitHub for your organization<a class="hash-link" href="#step-1-register-an-application-in-github-for-your-organization" title="Direct link to heading">​</a></h3><ol><li><p>Sign in to GitHub.</p></li><li><p>In your account profile, go to <strong>Your organizations</strong> and select the organization that the scenario is for.</p><p><img loading="lazy" alt="feb27" src="/Low-Code/assets/images/organization-2977eb3612ff11eee08f1ac4ce8f1e6c.png" width="874" height="2023" class="img_ev3q"></p></li><li><p>In your organization's profile, go to&nbsp;<strong>Settings &gt; Developer Settings &gt; OAuth Apps &gt; New OAuth App</strong></p></li></ol><ul><li>Enter <em>teamdiscussion</em> as your <strong>Application name</strong></li><li><em><a href="https://portal.azure.com" target="_blank" rel="noopener noreferrer">https://portal.azure.com</a></em> as your <strong>Homepage URL</strong></li><li>Optionally, add an&nbsp;application description.</li><li>In&nbsp;<strong>Authorization callback URL</strong>&nbsp;(the redirect URL), enter <em><a href="https://authorization-manager.consent.azure-apim.net/redirect/apim/%7BYOUR-APIM-SERVICENAME%7D" target="_blank" rel="noopener noreferrer">https://authorization-manager.consent.azure-apim.net/redirect/apim/{YOUR-APIM-SERVICENAME}</a></em> (substituting the API Management service name that is used).</li></ul><ol start="4"><li><p>Select&nbsp;<strong>Register application</strong>.</p></li><li><p>In the&nbsp;General&nbsp;page, copy the&nbsp;<strong>Client ID</strong>, which you'll use in a later step.</p></li><li><p>Select&nbsp;<strong>Generate a new client secret</strong>. Copy the secret, which won't be displayed again, and which you'll use in a later step.</p><p><img loading="lazy" alt="feb27" src="/Low-Code/assets/images/teamdiscussion-eacad1d173d327416fc4a8d934d980cb.png" width="3540" height="2319" class="img_ev3q"></p></li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="step-2-configure-an-authorization-in-api-management">Step 2: Configure an authorization in API Management<a class="hash-link" href="#step-2-configure-an-authorization-in-api-management" title="Direct link to heading">​</a></h3><ol><li><p>Sign into Azure portal and go to your API Management instance.</p></li><li><p>In the left menu, select&nbsp;<strong>Authorizations&nbsp;&gt;&nbsp;+ Create</strong>.</p><p><img loading="lazy" alt="feb27" src="/Low-Code/assets/images/authportal-0524f17569c382a5e8bddb5547b8a7e0.png" width="1217" height="636" class="img_ev3q"></p></li><li><p>In the&nbsp;<strong>Create authorization&nbsp;window</strong>, enter the following settings, and select&nbsp;<strong>Create</strong>:</p><table><thead><tr><th>Settings</th><th>Value</th></tr></thead><tbody><tr><td>Provider name</td><td><em>github-discussion</em></td></tr><tr><td>Identity provider</td><td>Select&nbsp;<em>GitHub</em></td></tr><tr><td>Grant type</td><td>Select&nbsp;<em>Authorization code</em></td></tr><tr><td>Client id</td><td>Paste the value you copied earlier from the app registration</td></tr><tr><td>Client secret</td><td>Paste the value you copied earlier from the app registration</td></tr><tr><td>Scope</td><td><em>write:discussion</em></td></tr><tr><td>Authorization name</td><td><em>auth-discussion</em></td></tr></tbody></table></li><li><p>After the authorization provider and authorization are created, select&nbsp;<strong>Next</strong>.</p></li><li><p>On the&nbsp;<strong>Login&nbsp;tab</strong>, select&nbsp;<strong>Login with GitHub</strong>. Before the authorization will work, it needs to be authorized at GitHub.</p></li><li><p>Sign in to your GitHub account if you're prompted to do so. If prompted during redirection, select&nbsp;<strong>Allow access</strong>.
<img loading="lazy" alt="feb27" src="/Low-Code/assets/images/allowaccess-9b85a0c416587117976bbe267716e53c.png" width="1850" height="1197" class="img_ev3q"></p></li><li><p>After authorization, the browser is redirected to API Management and the window is closed. In API Management, select&nbsp;<strong>Next</strong>.</p></li><li><p>On the&nbsp;Access policy&nbsp;page, create an access policy so that API Management has access to use the authorization. <em>Note: Ensure that a <a href="https://learn.microsoft.com/en-us/azure/api-management/api-management-howto-use-managed-service-identity#create-a-system-assigned-managed-identity" target="_blank" rel="noopener noreferrer">managed identity</a> is configured for API Management.</em></p></li><li><p>Select&nbsp;<strong>Managed identity&nbsp;+ Add members</strong>&nbsp;and then select your subscription.</p></li><li><p>In&nbsp;<strong>Select managed identity</strong>, select&nbsp;<strong>API Management service</strong>, and then select the API Management instance that is used. Click&nbsp;<strong>Select</strong>&nbsp;and then&nbsp;<strong>Complete</strong>.</p><p><img loading="lazy" alt="feb27" src="/Low-Code/assets/images/accesspolicy-4c18a37d9595eb544b65daf33b419dfc.png" width="1247" height="618" class="img_ev3q"></p></li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="step-3-create-an-api-in-api-management-and-configure-a-policy">Step 3: Create an API in API Management and configure a policy<a class="hash-link" href="#step-3-create-an-api-in-api-management-and-configure-a-policy" title="Direct link to heading">​</a></h3><ol><li><p>Sign into Azure portal and go to your API Management instance.</p></li><li><p>In the left menu, select&nbsp;<strong>APIs &gt; + Add API</strong> and select <strong>HTTP</strong>.</p><p><img loading="lazy" alt="feb27" src="/Low-Code/assets/images/addapi-5638e6105cd44f8b422bacd5c4381ea0.png" width="3652" height="2257" class="img_ev3q"></p></li><li><p>Enter the following settings. Then select&nbsp;<strong>Create</strong>.</p><table><thead><tr><th>Settings</th><th>Value</th></tr></thead><tbody><tr><td>Display name</td><td><em>githubdiscussion</em></td></tr><tr><td>Name</td><td><em>githubdiscussion</em></td></tr><tr><td>Web service URL</td><td><em><a href="https://api.github.com" target="_blank" rel="noopener noreferrer">https://api.github.com</a></em></td></tr><tr><td>API URL suffix</td><td><em>githubdiscussion</em></td></tr></tbody></table></li><li><p>Navigate to the newly created API and select&nbsp;<strong>Add Operation</strong>. Enter the following settings and select&nbsp;<strong>Save</strong>.</p><table><thead><tr><th>Settings</th><th>Value</th></tr></thead><tbody><tr><td>Display name</td><td><em>POSTdiscussioncomment</em></td></tr><tr><td>URL for <strong>POST</strong></td><td><em>/orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments</em></td></tr></tbody></table></li></ol><p>Please find here an example of a POST URL: </p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">/orgs/AuthorizationsOrganization/teams/AuthorizationEngineering/discussions/1/comments</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p><img loading="lazy" alt="feb27" src="/Low-Code/assets/images/addoperation-e8876236039bbb1a213dbc47325da5d1.png" width="4152" height="1807" class="img_ev3q"></p><ol start="5"><li><p>Next, we need to add a <strong>Request Body</strong> to your API. For this, within your Frontend section scroll down and select <strong>Request</strong>.</p><p><img loading="lazy" alt="feb27" src="/Low-Code/assets/images/request-14c26d1fbe35ed10ee43b342f4f489cf.png" width="4142" height="1801" class="img_ev3q"></p></li><li><p>Now <strong>Add representation</strong> and insert the following information:</p><table><thead><tr><th>Representations</th><th></th></tr></thead><tbody><tr><td>CONTENT TYPE</td><td>application/json</td></tr><tr><td>DEFINITION</td><td>{"body":"This is a test issue"}</td></tr></tbody></table><p><img loading="lazy" alt="feb27" src="/Low-Code/assets/images/representation-310ea5ecb1de1ed30be5b7f3fc600bc8.png" width="3136" height="1501" class="img_ev3q"></p></li><li><p>Select <strong>All operations</strong> and in the&nbsp;<strong>Inbound processing</strong>&nbsp;section, select the <code>(&lt;/&gt;)</code> (code editor) icon.</p></li><li><p>Copy the following, and paste in the policy editor. Make sure the provider-id and authorization-id correspond to the names in our previous step. Select&nbsp;<strong>Save</strong>.</p></li></ol><p>Inbound policy:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&lt;policies&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    &lt;inbound&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        &lt;base /&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        &lt;get-authorization-context provider-id="github-discussion" authorization-id="auth-discussion" context-variable-name="auth-context" identity-type="managed" ignore-error="false" /&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        &lt;set-header name="Authorization" exists-action="override"&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            &lt;value&gt;@("Bearer " + ((Authorization)context.Variables.GetValueOrDefault("auth-context"))?.AccessToken)&lt;/value&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        &lt;/set-header&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        &lt;set-header name="Accept" exists-action="override"&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            &lt;value&gt;application/vnd.github+json&lt;/value&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        &lt;/set-header&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        &lt;set-header name="X-GitHub-Api-Version" exists-action="override"&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            &lt;value&gt;2022-11-28&lt;/value&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        &lt;/set-header&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        &lt;set-header name="User-Agent" exists-action="override"&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            &lt;value&gt;API Management&lt;/value&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        &lt;/set-header&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    &lt;/inbound&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    &lt;backend&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        &lt;base /&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    &lt;/backend&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    &lt;outbound&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        &lt;base /&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    &lt;/outbound&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    &lt;on-error&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        &lt;base /&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    &lt;/on-error&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/policies&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>Note: The policy to be used consists of five parts.</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">1. Fetch an authorization token.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2. Create an HTTP header with the fetched authorization token.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">3. Create an HTTP header with an accept header [(API requirement)](https://docs.github.com/en/rest/teams/discussion-comments?apiVersion=2022-11-28#create-a-discussion-comment).</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">4. Create an HTTP header with a X-GitHub-Api-Version header [(API requirement)](https://docs.github.com/en/rest/teams/discussion-comments?apiVersion=2022-11-28#create-a-discussion-comment).</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">5. Create an HTTP header with a&nbsp;User-Agent&nbsp;header [(GitHub requirement)](https://docs.github.com/rest/overview/resources-in-the-rest-api#user-agent-required).</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></blockquote><ol start="9"><li>Test the API in Azure API Management:</li></ol><ul><li>Select your operation.</li><li>Go to the&nbsp;Test&nbsp;tab.</li><li>Select&nbsp;Send.</li></ul><p>You should get a <strong>HTTP/1.1 201 Created</strong> response and a comment should have been posted in your team's discussion.</p><p>  <img loading="lazy" alt="feb27" src="/Low-Code/assets/images/test-0a0ecc26dba34f3ad59d309195d11089.png" width="3470" height="1911" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="step-4-create-a-custom-connector-for-the-microsoft-power-platform-using-api-management">Step 4: Create a custom connector for the Microsoft Power Platform using API Management<a class="hash-link" href="#step-4-create-a-custom-connector-for-the-microsoft-power-platform-using-api-management" title="Direct link to heading">​</a></h3><p>As soon as your API was tested successfully, you are now able to export your web API to the Microsoft Power Platform. Please find a detailed guide here: <a href="https://learn.microsoft.com/en-us/azure/api-management/export-api-power-platform" target="_blank" rel="noopener noreferrer">Export APIs from Azure API Management to the Power Platform</a>.
If you want to add additional security to your API, check out our blog post on <a href="https://microsoft.com" target="_blank" rel="noopener noreferrer">10. Providing Power Platform custom connector with additional security via Azure API Management</a></p><p>  <img loading="lazy" alt="feb27" src="/Low-Code/assets/images/createpower-c06b51552a8aa8f48d939d4037c0953b.png" width="3025" height="2291" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="step-5-call-your-web-api-via-your-power-app">Step 5: Call your web API via your Power App<a class="hash-link" href="#step-5-call-your-web-api-via-your-power-app" title="Direct link to heading">​</a></h3><p>Next, we want to make an API call within your Power App. For this, we created a very simple Power App as our front-end with a <strong>Send</strong> Button and a <strong>TextInput</strong> field.</p><ol><li><p>In your Power App, add your custom connector to your Power App via the tab <strong>data &gt; + Add data</strong>.</p><p><img loading="lazy" alt="feb27" src="/Low-Code/assets/images/customconnectorpower-fd0c3bb897cde1e1311feb60ffb79a29.png" width="1677" height="2259" class="img_ev3q"></p></li><li><p>Next, we modify our <strong>Send</strong> Button with the following PowerFX formular:</p></li></ol><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">githubdiscussion.postdiscussioncomment({body:TextInputFeedback.Text}); Reset(TextInputFeedback); Notify("Success: 201 Created",NotificationType.Success)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>  <img loading="lazy" alt="powerappsinput" src="/Low-Code/assets/images/powerappsinput-0df6c0cdd028beaa33603424c87a7305.png" width="3971" height="1773" class="img_ev3q"></p><ol start="3"><li>Now, you are able to test your Power App and create a new comment in your GitHub team's discussion.</li></ol><blockquote><p>Enjoy this fun little tutorial and let us know what you think! <a href="https://www.linkedin.com/in/jukasper/" target="_blank" rel="noopener noreferrer">@jukasper</a></p></blockquote>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>zero-to-hero</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
            <category>API Management</category>
        </item>
        <item>
            <title><![CDATA[26. Recap - Dev Experience Week ✨]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day26</link>
            <guid>2023-day26</guid>
            <pubDate>Sun, 26 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Let's recap Week 4 of #30DaysOfLowCode focused on developer experience with power platform - join us at #LowCodeFebruary https://aka.ms/lowcode-february.]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 26</code> of #30DaysOfLowCode!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li><strong>Look Back</strong>: Recap Developer Experience Week</li><li><strong>Important events</strong>: Powerful Dev Conference, Learn Live and Webinar for Power Platform and GitHub</li><li><strong>Skill Up</strong>: Self-Study Resources &amp; Cloud-Skills Challenge</li><li><strong>Look Ahead</strong>: Continue The Journey!</li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Low Code February Collection</strong></a></li><li><strong>Exercise</strong>: Sign up for your <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Free Developer Plan</strong></a></li></ul><p><img loading="lazy" alt="Feb26" src="/Low-Code/assets/images/30-26-17b7bae40050597cb0623a452866fba5.png" width="1334" height="560" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="look-back-week-4-recap"><strong>Look Back</strong>: Week 4 Recap<a class="hash-link" href="#look-back-week-4-recap" title="Direct link to heading">​</a></h2><p>It's hard to believe that our #30daysoflowcode event is coming to an end. Time really flies, doesn't it? But what an amazing month it has been! Thanks to the incredible support from each and every one of you, we've welcomed <strong>100,000+ visitors</strong> to our event! We're thrilled to provide something useful and valuable to your learning journey and we hope that you've fallen in love with the power of low-code development tools. </p><p>We would love to hear your thoughts, and please don't hesitate to reach out to us through <a href="https://github.com/microsoft/Low-Code/discussions" target="_blank" rel="noopener noreferrer"><strong>GitHub Discussions</strong></a>. Your feedback is essential for us to improve and provide even better content and resources in the future. ❤️</p><p>Throughout the month, we've taken a comprehensive view of Power Platform and its capabilities, from creating custom integrations to building UI and more. And this week, we've focused on a critical topic for Power Platform: developer experience. As you know, it is essential for developers to build and deploy effective solutions, while managing app governance at the same time. </p><p>Let's take a look at what we've covered this week!</p><ul><li><p><a href="https://microsoft.github.io/Low-Code/blog/2023-day20" target="_blank" rel="noopener noreferrer"><strong>ALM For Power Platform</strong></a> - App lifecycle management can be a broad but critical topic for every developer, who is building, maintaining, or even retiring an application. By following best practices for app lifecycle management, developers can ensure that their applications are stable, reliable, and performant, while also meeting the needs of end-users and stakeholders.  In this blog, we introduce you to app lifecycel management, and explore how you can manage the entire app lifecycle with Power Platform. </p></li><li><p><a href="https://microsoft.github.io/Low-Code/blog/2023-day21" target="_blank" rel="noopener noreferrer"><strong>GitHub Actions for Power Platform</strong></a> -  GitHub actions is a powerful tool that allows you to define workflows in code, and Power Platform provides a range of features and connectors that can be used to integrate with GitHub Actions. In this blog, we walk you through basic GitHub Actions concepts and show you how to connect to a Power Platform environment using GitHub Actions to streamline your development process and automate your workflows. </p></li><li><p><a href="https://microsoft.github.io/Low-Code/blog/2023-day23" target="_blank" rel="noopener noreferrer"><strong>Power Platform and Governance</strong></a> - Governance is a key concern for many organizations when it comes to using low-code platforms like Power Platform. This blog provided guidance on how to manage your app governance at ease using Managed Environments for Power Platform.</p></li><li><p><a href="https://microsoft.github.io/Low-Code/blog/2023-day24" target="_blank" rel="noopener noreferrer"><strong>Power Apps &amp; Automated Testing</strong></a> - When we talk about app lifecycle management, automated testing is an important part of it. This blog introduces automated testing, and provides you with an overview of tools available to test your Power Apps. </p></li><li><p><a href="https://microsoft.github.io/Low-Code/blog/2023-day22" target="_blank" rel="noopener noreferrer"><strong>Power Automate, ACS and OpenAI</strong></a> - Integrating Power Automate with OpenAI and Azure Communication Services can enable you to build powerful and intelligent applications that can understand natural language and respond accordingly. In this blog, we'll show you a tutorial step-by-step how to build a SMS conversational bot yourself!</p></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="important-events"><strong>Important events</strong><a class="hash-link" href="#important-events" title="Direct link to heading">​</a></h2><ul><li><p><a href="http://localhost:3000/Low-Code/lowcode-february/Video-Live#ask-the-experts" target="_blank" rel="noopener noreferrer"><strong>Ask The Experts!</strong></a> </p><ol><li><p>🎙 <a href="https://aka.ms/ATE0309/RSVP" target="_blank" rel="noopener noreferrer"><strong>Mar 09, 9AM PST</strong></a> - Join our upcoming hero Q&amp;A session from the <strong>Low Code February</strong> leadership team, including authors of this #30DaysOfLowCode series. We will have experts live to answer questions related to the content of the Low Code February events. <a href="https://aka.ms/ATE0309/RSVP" target="_blank" rel="noopener noreferrer"><strong>Sign Up</strong></a> if you haven't already ✨</p></li><li><p>🎙 <a href="https://aka.ms/ATE0223/RSVP" target="_blank" rel="noopener noreferrer"><strong>Powerful Dev Ask The Expert: On-Demand</strong></a> - Watch the last session for Q&amp;A from the <strong>Powerful Devs Conference</strong> team. The Powerful Devs Conference is all about showing how code-first developers can integrate with the Power Platform to innovate faster.
<img loading="lazy" alt="Week 3 Roadmap" src="/Low-Code/assets/images/ate_lowcodefeb-8df8963f7f93df7614a68b24974114fa.png" width="3840" height="2160" class="img_ev3q"></p></li></ol></li></ul><ul><li><p><a href="https://aka.ms/lowcode-february/LearnLive" target="_blank" rel="noopener noreferrer"><strong>Learn Live!</strong></a> If you have any questions or concerns about the Microsoft Learn modules or the Cloud Skills Challenge, be sure to tune in to our "Learn Live" sessions. </p><ol><li>🎙 <a href="https://aka.ms/lowcode-february/LearnLive" target="_blank" rel="noopener noreferrer"><strong>Feb 27</strong></a> - Manage Microsoft Power Platform deployments. <a href="https://aka.ms/ATE0309/RSVP" target="_blank" rel="noopener noreferrer"><strong>Sign Up</strong></a> for our last session during #LowCodeFebruary! ✨</li></ol><p><img loading="lazy" alt="Week 3 Roadmap" src="/Low-Code/assets/images/LearnLive-fd1c85634a15c825a474e1deac2f0b8b.png" width="600" height="338" class="img_ev3q"></p></li><li><p><a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Powerful Devs Conference: On-Demand</strong></a> The Powerful Devs Conference is a fantastic resource for developers who want to learn more about the Power Platform and how to build applications quickly and easily. The conference features a wide range of sessions and talks from industry experts, Microsoft Cloud Advocates, community leaders, and members of the Power Platform Team.
<img loading="lazy" alt="Week 3 Roadmap" src="/Low-Code/assets/images/Powerful Dev Social-Simple1-cd315420c042bcafdb87fd3e9379326f.png" width="1080" height="608" class="img_ev3q"></p></li><li><p><a href="https://mktoevents.com/Microsoft+Event/383091/157-GQE-382" target="_blank" rel="noopener noreferrer"><strong>Webinar: Power Platform &amp; Azure Deploys with GitHub: On-Demand</strong></a> Watch the on-demand webinar, where you'll get a chance to explore the powerful capabilities that the Power Platform opens up for GitHub. You'll learn about the inner and outer loop functions that are available with Power Platform and GitHub, and see firsthand how to author CI/CD pipelines that can help you streamline your development process.
<img loading="lazy" alt="Week 3 Roadmap" src="/Low-Code/assets/images/webinar-b5b3df88894e6916d9151f237dd0502f.png" width="1555" height="871" class="img_ev3q"></p></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="skill-up-for-self-study"><strong>Skill Up:</strong> For Self-Study<a class="hash-link" href="#skill-up-for-self-study" title="Direct link to heading">​</a></h2><p>Check out these our self-study materials designed to help you learn at your own convenience:</p><ol><li><a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Sign up</strong></a> for the <strong>Free</strong> Power Apps Developer Plan to start your low-code advanture!</li><li><a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Resource Collection</strong></a>: Bookmark the collection for a 1-stop resource containing all relevant links to documentation and training, as covered in the #30DaysOfLowCode blogs. </li><li><a href="https://aka.ms/lowcode-february/workshop" target="_blank" rel="noopener noreferrer"><strong>Hands-on Workshops</strong></a>: learn by doing! These labs help you gain hands-on experience from intro to advanced, whereever you're in the learning path. </li><li><a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer"><strong>Cloud skills Challenge</strong></a>: gives you a free curated set of learning modules to jumpstart your learning journey into Low Code and Fusion development. </li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="look-forward-continue-the-journey"><strong>Look Forward</strong>: Continue The Journey!<a class="hash-link" href="#look-forward-continue-the-journey" title="Direct link to heading">​</a></h2><p>We're in the last week of #30daysoflowcode, but don't worry, we still have some exciting things for you! We've got two ZeroToHero blogs lined up, as well as our <a href="https://aka.ms/lowcode-february/LearnLive" target="_blank" rel="noopener noreferrer"><strong>Feb 27th Learn Live</strong></a> session and <a href="https://aka.ms/ATE0309/RSVP" target="_blank" rel="noopener noreferrer"><strong>March 09th Ask the Experts</strong></a> session! If you haven't already, make sure to sign up today so you don't miss out. And to top it off, we'll also have a recap of all the amazing content we've covered this month! 🎉</p><p>Don't forget to bookmark the <a href="https://aka.ms/lowcode-february/blog" target="_blank" rel="noopener noreferrer"><strong>#30DaysOfLowCode</strong></a> page, then follow along to read the daily blog post, ask questions, and connect with other learners. <em>Get empowered</em> with low code development!</p><p><img loading="lazy" alt="Thank You" src="/Low-Code/assets/images/30-thankyou-6d9698d5c22fe0450028253b05ede15f.png" width="1001" height="420" class="img_ev3q"></p>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
            <category>recap</category>
        </item>
        <item>
            <title><![CDATA[24. Power Apps & Automated Testing]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day24</link>
            <guid>2023-day24</guid>
            <pubDate>Fri, 24 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to use right selection of tools to support good testing practices to manage app lifecycle for Power Apps - join us at #LowCodeFebruary and #30daysoflowcode https://aka.ms/lowcode-february]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 24</code> of #30DaysOfLowCode!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>Why automated testing is important</li><li>Tools available today to test your Power Apps</li><li>Plans and investments in this area</li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Low Code February Collection</strong></a></li><li><strong>Activity</strong>: <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Sign up</strong></a> for the <strong>free</strong> Power Apps Developer Plan.</li></ul><p><img loading="lazy" alt="feb24" src="/Low-Code/assets/images/30-24-874d179b63098bc1638eefc4781db9b7.png" width="1334" height="560" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-automated-testing-is-important">Why automated testing is important<a class="hash-link" href="#why-automated-testing-is-important" title="Direct link to heading">​</a></h2><p>Automated testing is an important part of the app lifecycle. Our goal is to provide customers with the right selection of tools to support good testing practices. Customers often start with manual testing when apps are in their earlier stages.  But, we hear about customers who strive to introduce automated testing into their overall workflows and processes once they reach these inflection points:</p><ul><li><p><strong>As apps grow in complexity</strong> - As usage increases and makers respond to more and more feature requests in their apps, complexity grows as well.  Maybe an app calls out to an external API or has extensive Power Fx logic within it.  These are pieces that all must work together to ensure the proper functioning of your app, so it's important to make sure that they all come together to provide value from the end-user's perspective.</p></li><li><p><strong>As collaborators get involved</strong> - Collaboration is key, but the more cooks in the kitchen you have the more things can change unexpectedly.  How can you best ensure that when multiple people are collaborating on an app that changes don't introduce instability and other uenxpected behavior?  Running automated tests when changes are made can help ensure that apps stay functional when their are multiple collaobrators. </p></li><li><p><strong>As apps become more business critical</strong> - More and more customers are trusting Power Apps with business critical processes.  Simply put, if the app doesn't function then core business processes or functions may also be impacted.  Automated testing can help to ensure continuity of the app functionality upon which your business processes depend.  And, better stability can lead to increased end user trust and satisfaction when using apps.</p></li></ul><p>Let's take a look at what's available.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="tools-available-today-to-test-your-power-apps">Tools available today to test your Power Apps<a class="hash-link" href="#tools-available-today-to-test-your-power-apps" title="Direct link to heading">​</a></h2><p>There are a set of tools available today that you can use to test your apps.  </p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="test-studio">Test Studio<a class="hash-link" href="#test-studio" title="Direct link to heading">​</a></h3><p>Power Apps Test Studio is low-code solution to organize, record, and automate tests for canvas apps.  Test Studio features the following capabilities:</p><ul><li><p><strong>Test step recorder</strong> - Test Studio includes recording capabilities.  When you start the recorder, you can interact with the app as you expect your end users will. Test Studio will record your interactions as test steps.</p></li><li><p><strong>Test editor</strong> - Once you've recorded test steps with Test Studio, the next step is to add your custom assertions. You can use the Test Studio UI to insert the assertions where they make sense in your app's flow.
<img loading="lazy" alt="Test Studio editor" src="/Low-Code/assets/images/TS-EditSteps-8cdd4d8c39b39a1bf458d9b4e0f7efce.gif" width="1123" height="824" class="img_ev3q"></p></li><li><p><strong>Test playback</strong> - Test Studio can be run in Studio by pressing Play. If any of the assert statements you configured in the previous step were to fail, the test step will fail and you will be shown the error. or it can be integrated into CI/CD flows by following these instructions: <a href="https://learn.microsoft.com/power-apps/maker/canvas-apps/test-studio-yaml-pipeline?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Automate tests with Azure Pipelines using YAML</a></p><p><img loading="lazy" alt="Test Studio playback" src="/Low-Code/assets/images/TS-PlayMode-03997ec83a671d873939e4225b3f7239.png" width="666" height="727" class="img_ev3q"></p></li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="test-engine">Test Engine<a class="hash-link" href="#test-engine" title="Direct link to heading">​</a></h3><p>Test Engine is an evolution of our Power Apps testing tools. Test Engine builds upon the key use cases of Test Studio, but takes it in a new, powerful direction through open source collaboration and use of the Playwright browser testing platform. The goals of Test Engine are to provide customers with a robust testing platform for all types of Power Apps, and to make it super easy to integrate automated testing into your app development processes.</p><p>A lot more information about Test Engine can be found in the blog post <a href="https://powerapps.microsoft.com/blog/introducing-test-engine-an-open-platform-for-automated-testing-of-canvas-apps/" target="_blank" rel="noopener noreferrer">Introducing Test Engine: An open platform for automated testing of canvas apps</a></p><p>  <img loading="lazy" alt="Test Engine automating a test run" src="/Low-Code/assets/images/TE-Recording-840d661ebada877429aef8568b6fd0c9.gif" width="1462" height="923" class="img_ev3q"></p><p>Test Engine supports canvas apps today, with support for model-driven apps to come in the future.  Some of the key benefits of Test Engine are:</p><ul><li><p><strong>Power Fx test authoring</strong> - Test steps are written in familiar Power Fx, without the need for a pro-code solution using C#, JavaScript, or other complex code.</p></li><li><p><strong>Connector mocking</strong> - You can simulate the response your app receives from custom connectors.  This can be useful if you app hits an endpoint that has side effects, like inserting rows into Dataverse tables or kicking off Flows.</p></li><li><p><strong>Screenshot function and video recording</strong> - This lets you grab screenshots and video recordings of unattended test runs.  This will capture exactly what the user would see if they were interacting with the app.  This makes it easy to debug and follow up on test failures.</p></li><li><p><strong>Robust, stable tests</strong> - Test Engine has a special set of capabilities that abstract the app's browser DOM from you.  This means you create your tests by referencing the controls that you define at design-time, and you never need to worry about the specific output structure of the app in the browser.  Our goal here is that your tests should never break or need updating unless you make changes yourselves to the app being tested.</p></li><li><p><strong>Reuse Test Studio tests</strong> - If you want to reuse any tests you have recorded using Test Studio, you can export the test plan files for reuse in Test Engine by clicking the Download suite button:</p><p><img loading="lazy" alt="Alt text" src="/Low-Code/assets/images/TS-Export-e748d4e58c9dc6854ec98a178bb25144.png" width="483" height="262" class="img_ev3q"></p></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="plans-and-investments-in-automated-testing">Plans and investments in automated testing<a class="hash-link" href="#plans-and-investments-in-automated-testing" title="Direct link to heading">​</a></h2><p>We are investing in this area and are working on a couple key things in this area:</p><ul><li>CI/CD integration - Our goal is to make it as easy as possible for you to integrate Test Engine into your CI/CD tools and make functional testing a regular, robust part of your app development process.  We are integrating Test Engine into the PAC CLI toolset to make it easy to use (so you will not have to build and run the Test Engine GitHub project), and we will be building Azure DevOps Pipelines and GitHub Actions support as well.  We hope that by integrating more tightly into this tooling, we will make automated testing a no brainer for your organization.</li><li>Model-driven app support - As stated before, Test Engine and Test Studio support canvas apps today.  We want to build support for model-driven apps so that you have one set of comprehensive tools that will work with all of your Power Apps.</li><li>Low-code recording enhancements - Eventually, we want to bring the ease of test case recording that customers have in Test Studio to Test Engine. We would love to hear your feedback around what we should be prioritizing to make it easier to create test plans for your apps.</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li><strong>Try out Test Engine</strong> - <a href="https://github.com/microsoft/PowerApps-TestEngine#getting-started" target="_blank" rel="noopener noreferrer">Visit the Test Engine GitHub project</a></li><li><strong>Let us know any issues or feedback</strong> - <a href="https://github.com/microsoft/PowerApps-TestEngine#getting-started" target="_blank" rel="noopener noreferrer">GitHub issues for Test Engine</a></li><li><strong>Let us know any general feedback about test tools</strong> - <a href="https://powerusers.microsoft.com/t5/Building-Power-Apps/Power-Apps-Test-Studio-Feedback-discussion-thread/td-p/455051" target="_blank" rel="noopener noreferrer">Test Studio discussion thread</a></li></ul>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>power-platform</category>
            <category>automated testing</category>
        </item>
        <item>
            <title><![CDATA[23. Power Platform and Governance]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day23</link>
            <guid>2023-day23</guid>
            <pubDate>Thu, 23 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Enable governance-at-scale and proactively build and enforce best practices with Managed Environments for Power Platform.]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 23</code> of #30DaysOfLowCode!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>Governance for Power Platform</li><li>Visibility into Apps and Automations</li><li>Control over Apps Deployment </li><li>Manage App Estate at Scale</li><li><strong>Exercise</strong>: Sign up for your <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Free Developer Plan</strong></a></li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Low Code February Collection</strong></a></li></ul><p><img loading="lazy" alt="Feb 23" src="/Low-Code/assets/images/30-23-5a2d5ee8708f83086ad880bd630c2e24.png" width="1334" height="560" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="governing-the-power-platform">Governing the Power Platform<a class="hash-link" href="#governing-the-power-platform" title="Direct link to heading">​</a></h2><p>Power Platform administrators are charged with monitoring and managing a growing number of environments and resources in their tenants. Organizations are trying to find the right tools for their governance requirements in order to build guardrails around data, applications, and environments. Today, admins can enable governance-at-scale without additional IT resources and proactively build and enforce best practices with <a href="https://go.microsoft.com/fwlink/?linkid=2211534" target="_blank" rel="noopener noreferrer">Managed Environments</a> for Power Platform.</p><p>Managed Environments is a suite of capabilities that allows admins to manage the Power Platform at scale with more visibility, more control, and less effort. Once activated on an environment, Managed Environments allows admins to enable a suite of features that support the governance of their environments and resources by:
· Increasing visibility into the apps and automations in an organization with proactive usage insights and admin digest.
· Gaining more control and reducing risk by creating sharing limits on applications and proactively enforcing security and reliability with built-in solution checker integration.
· Significantly reducing the complexity of ALM (application lifecycle management) with automated application lifecycle management allowing admins to setup a pipeline in less than two minutes and citizen developers to initiate deployment.</p><p>With over 5,000 Power Platform environments activated, customers are experiencing the ease of managing low-code assets at scale while reducing risk and empowering their makers to innovate.  Read on to learn about current Managed Environments capabilities.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="more-visibility-into-the-apps-and-automations-in-your-organization"><strong>More visibility</strong> into the apps and automations in your organization<a class="hash-link" href="#more-visibility-into-the-apps-and-automations-in-your-organization" title="Direct link to heading">​</a></h3><p>With <a href="https://go.microsoft.com/fwlink/?linkid=2211177" target="_blank" rel="noopener noreferrer">Admin Insights</a>, admins have visibility into usage in their Managed Environments. Admins can enable a weekly email digest that includes top apps, flows, and makers, as well as stale apps and flows across their Managed Environments. High-usage assets may require extra security, and low-usage assets could be cleaned up. Influential makers can be tapped to build best practices and support more knowledgeable makers. With Admin Insights, there’s no need to set up a data lake; usage information is delivered straight to your inbox.</p><p>  <img loading="lazy" alt="Weekly Admin Digest" src="/Low-Code/assets/images/Weekly admin digest-f91bf0b73b7e983e1780a5bce04c97f3.png" width="149" height="673" class="img_ev3q"></p><p>Managed Environments also gives admins a new view that easily identifies all <a href="https://go.microsoft.com/fwlink/?linkid=2211178" target="_blank" rel="noopener noreferrer">Data Policies</a> applied to an environment. With this, admins can ensure their Managed Environments are compliant and secure. </p><p><img loading="lazy" alt="Data policies" src="/Low-Code/assets/images/Data policies-0bad8fd13f3d76fe27d4d9f9190fea80.png" width="624" height="254" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="more-control-over-which-apps-are-deployed-and-who-builds-them"><strong>More control</strong> over which apps are deployed and who builds them<a class="hash-link" href="#more-control-over-which-apps-are-deployed-and-who-builds-them" title="Direct link to heading">​</a></h3><p>With <a href="https://go.microsoft.com/fwlink/?linkid=2211538" target="_blank" rel="noopener noreferrer">Sharing Limits</a>, users can be prevented from broadly sharing canvas apps in order to control oversharing of information. Admins can prevent sharing to security groups and additionally limit the number of people an app can be shared with.
<img loading="lazy" alt="Sharing limits" src="/Low-Code/assets/images/Sharing limits-7d49b6efe2f73765d09c36fef7abb777.png" width="636" height="367" class="img_ev3q"></p><p><a href="https://learn.microsoft.com/power-platform/admin/managed-environment-solution-checker?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Solution checker</a> allows admins to enforce validation of their solutions against a set of best practice rules, ensuring solutions are secure and reliable. Admins can configure the level of validation they want to apply:
<img loading="lazy" alt="Solution Checker" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAACYCAMAAAClDKHPAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKIUExURf///ygoKDIxMDMyMTY2Njc3Nz8+PUA/PkVFRUxKSUxKSkxLSUxLSk1LSk1LS01MS1NTU1hXVlhXV1hYVlhYV1lYWFlZV1lZWGFhYWVkY2VkZGVlY2VlZGZlZWZmZHBwcHFxcXJxcHJxcXJycHJycXNycXQndHUodXUpdXw0fHw1fH00fX41fn42fn5+fn9+fX9+fn9/f4B/foB/f4KCgoODg4VChYZDhoZEhomJiYuKiouLiouLi4yLioyLi4yMi4yMjI1QjY2Mi42NjY5Pjo5Qjo5Rjo9Qj49Rj5GRkZWVlZZdlpZelpddl5del5dfl5eXl5hemJiXl5iYl5iYmJmYl5mYmJmZmJmZmZqZmJqZmZqampubm59rn6BqoKBroKSko6Wko6WkpKWlpKWlpaalpKampaampqempaenp6h3qKh4qKh5qKl5qampqa+vr7GEsbGFsbGGsbGxsLKGsrKxsbKysbKysrOysrW1tbiSuLi4uLmSubmTubqSurqTurqUur69vb6+vb++vb++vr+/vsDAv8GfwcHBwcKgwsKhwsOgw8Ohw8bGxsmtycquysqvysuty8uuy8uvy8vKysvLysvLy8yvzMzLyszLy8zMy9K60tO609O709O809PT09S61NS81NTU1NfX19jX19jY19jY2NnY2NnZ2NvI29zI3NzJ3NzK3Nzc3N/f3+Li4uPj4+TW5OTk5OXW5eXX5eXk5OXl5OXl5ebl5ebm5erq6u3i7e3j7e3t7e7j7u7k7u/v7/Dw8PHx8fLy8vPz8/T09PXw9fXx9fX19fbx9vb29vfy9/f39/j4+Pn5+fv7+/z8/P39/f79/f79/v7+/v/+/v/+/////wjpgv4AAAABdFJOU/4a4wd9AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAZgUlEQVR4Xu2djZ8bx1nH23VY24piX3Rnau/5ckhnh/ISSzjghErGR9u05aUp6epiwKEt2bsADbk20N0EXJM0SICh19C8wW5pAROyLgZs2jgrkRa3moTabZoXoub5d/g9MyOdZEnnt7vYuZ3f5yTNzjzzsvN852VX0uldZJRmvcsAkG4ZAFIuA0DKZQBIuQwAKZcBIOUyAKRcBoCUywCQcg0DoBlFQgelyk5Th5ZVrenAaHlDsik5BR24XM0HOmB0pRoEIMpZ0HP6iOVY/Z4EHZGV0wejVTwv27KsrA4MUzHbR99QWSOKXrBjHTK6SA0AkFjWnO8XQ33I6gcgsHn4+b0Gw3V5APjWhUsmf9QM4FyYS6M+DQDgWmUd6qofANe6yPn38gDITOrAZSm82MYZaQ0A4FklHUpKtpWtIsAAeA4WheOOS6WslXOeE04FCfOOZTsNGT9vWxySEtWMlQ0AQOjYsoCkqFNjx7ZyQgLwEJcwD0MYCM7vybwRezByAl2e54ROpkk1h+2E3DskyFhy2BS1o4wCRxYcrBsFHNmcYnTxGgBA2FYh4kCSscpuhnFgAOBN9k6JyjnLKcaJhYFatXJu0cKyG1l2zp2wdN+LjDXpFl1kyZbg+RAR9pyXsQXFNoqcaTIAsZVtoIBJv2h5WHYce9KXmV0LbvetDEqwsBnA0/hk05d2rpqKykBks0VUs3KIrMjI2EI1EUqioi2LMbpYDW4C4XirBC8UrQUc5bAd7ANALQEMQMIeogXERRwStu57X88h7B1Ye4hAjjoCE3p9t7JJBv4XGV4KNmd539GZPfJciC/XCAfZitY4QtLOsTE7ueqAAeASECk8FOzlkOLxztVjRowuXoMAoP8xMTfgLd6N83gbAUCd3UECzpLx0issR19CyCy+HLhl1y1bJdG5dLCyOQvbdVxKuC4mGSHnEyWHfc2Z1HPRqnfsclZTYIKPuS5UBfx0JCKckuN0sirGjC5SwwAg2o+doPInu3sEAMpNPJ/3A6DI0ZvASAIwPgl5XT9btm1j+EaY6VkAgPNLDQAgq7WVHeUtDHjgJQFQkTFN2MIKXVvYXIgB4BI1HIAIrnJ4kEoPKADkUOwFILTkngyhfgDy2gddAKQXIWHpRcLKhrxoxLIAqAcAuYb78kqkiIpkVmwRZBpv8r0JnkVQVXc64QbZSKnKWty+OxhGF9QAAIF3vBnl4AHfyjXgP4xIBsCDs7C7kwBgaWe349AjUYCb+gHACn6cRLgMQMgliXkuCJuLSF4FLLBTuQCKar0AyDXct+zjFPEsodhx2O44h+wdjJ+syrFw/dCsMRV2HilZSVdeN8LoIjUAgMv3AS1Mt1gHILnTglPgbcsqsKNCBEI5m8ccZ83pmaELAM1xNA98DQCXlOHRz/tLvonHVBWRBwXYNpzbAwDGOANQsGEIVysAOna8JZHbRa6KC8NVBY5stsxboABMyWeji9bgEhB6rse9ji72XJ+X85gPE98NRZhwyPWECHl9EDVlquJDlQtSGWU2neSqkkhl4MyCzVEoHysjJezmAICbeJ6qWmZLdEWUyHp1VZ1IaZTIMuQFh9ElaPge4CoqtGoMgD66VGX4qtHoEnTNAUBz4+KyAfDHO/cTjC5S1x4A0OXPAEaXqmsSAKO3TwaAlMsAkHIZAFIuA0DKZQBIuQwAKZcBIOUyAKRcBoCUywCQchkAUi4DQMo1DIDgkt5TLfRbl+v8d0Wq8md/Vlb+/E/+RSX+09KpNZfq5Z7oYco0Oyfg9dValh81GaktbR2Qqrl9h0N0oK9Lkqkh9kMjR+j5Ezpw5RoCgPwUV1fzK33I8u4mOk5+ZqerYsB/V6RaTMkFGHDO9080SUm3Wp2KCL8ko7mdw7WhSb4CwO2eNX/vUUeO0oY+Z8UXPOG9XQsx2yYxzF7cdyEAfq/rikfvv3hYLqAhABQ9/eFdqYGu7tXmwY5dBQAg+HNFDQNgWcupAIA1pJ1aAEBrGYCLaH8/ABfWMgDJ1sv23dRTOrC2AAhbcAdi8qTEIce2HbxenykJ8iqFTC7OZXKCarnxbI0yVqZETlOm16lwY6YgFAAxf947L/+FQGY+E/KUjBkW+a/nD5lC1cw4yq9cn+FPGHNuOVFnpHlQrkcoOUA15Euv1DLj2RhzeZkrpfnMeCEnXRyVSjYlaErIAHARKAolOvcirsGnAAAQze0swQU4HwxX/jh5pca1ViUA8gTGcwWXX+wq5XHKbTQZFuNOQ1X7LGbocfvPuVJue9Vqyxl76gXa/VDGrZfb9VKBrbhxFecFNkOGzAsUbxu3K20GYPe/EN3nJVuszKc4b23beKbaRvZtmUJL2aPMKgq5lQuKbq069m+0EYuub9Ff3OrkZLvYsgPAmbv27fuzNn3yjn2f+B597m8+dP+//eGDd+z7ylts8blHPrTvs098ZN9n29Ls09+jLz5y5wff/Ofb7tj3Iqd3NQgA+szjD2aiOxP+TDi6OrNAtN8lNyvI4UdAsaAQiTyy8OB0QTGM5fDHn41O5a94EPGnNLkMDDAXTtkvh2Qk55jqfpkkc8sRbClz5OfDPJaBCTnroTYvj6WpQSFoRCmx+qZBxF9dyGDBsCUAyINo+zn5Dyj2O3wKDACi0cYazkkNclQJyJMGPzMASNyyQCIHABooqsX101RIxTmiOacdbTiNzG239CP+xwjomPEWLWxoy5F8wws0VWijlrafO00HYby1ReEGCcAUr2LJFkAxFTAAPH4PujIfHsnW05Rse0pmnwrYnRy54QsUbvzj9n1c6xeQ+Sna8rtten+5/fC204MzwAOPtM/d8i16nujOL7/1wAfP0YmffJFOfPhNtnjgfqR9Fo8X6fa/bNMfPdJ+9M5v0ZnbX6Sv3SUNOhoEwKnLnukBIOIxg7CLQSsf6McoKHYBkOlwYt1DJyoAYMIFQPwx7g4AyCsdjQoCdOaEGwQFV8XIZwYAHtcAsLP1lz9Qm3IwXM2l0IQCADFRNggCu4kgH4nAywSyPmH3A8DnlJHTjycnBmoGLjCVAMhJgc/quIxTAAie5sWGVjQpPeZn/54zI4X3cz0AoC4GIC+tDrDXEQsdzP0r5lFEE9IGALivhAQ86VjYIzLZiDR+bG1H2xB3oPws14LDh3fj9XwA3vulxx//9S+/9YOvHr3t8+0HjrbpxF1tOvdeBcCX36KPYTL42Ne/yUScuf3NRz/Rpi9++EuPH/3ZlQFI7Ouvv95W/jsfAHSRflQmfX8ZAHQxDDJln78TLAGIszShJnv+skAHAAZH2lJSzD5Edtl13dCXMTKeAcCLBoA2C3YF5JR8VwNgEepQJapMPn9F0OUZBH+1nOdPKABQUh8A5HocgkRWOM/RQs6rIVoCIBPQuqqKUwCwJ+DpDgDkT2YxCjmFowcAgEMRJdd6BQD5WwotjqbopkEApNOR2g+ASuMH8iChLDlINv7fw1zOeQCcee+fHjly5Jtnbvv8479zpP3AE29JAKgHgK/zQ04JZ25589EjbXr0js8jC4yWNQBAkQdumCMfU2akAODBg/PvOB8PAT/BxxqAhNNlSr4DADme6m3p0Twi4LceAFBFVnsxlrm5NHi3C4Aak7wNQDzS6l0APMzvwu4CEKsdK4L4kzUDAP4aG06hD4DQ4VRWPkDpXHlnBuB5nxuIBSfB/M128OtGzN7sCg0AVhWsAtjP4SwSzA4bkGfj+QAcKONFLQHQbi/kncJvlxgAZmNvFwCfl/NlLGCMSJ3Gj4jx2x2IjagFMAwDgG75LxmGQz+5AgDnbvlfor+7SwLw5J19o581AEBGrrp2KGwvyKPn89g9zeUwuze08+UjUwlyTEepxp27H+mhnw2q2S4AvvxHMhB71M/WOWkZgOOVemWGapi9ixhwBeRGifXCMgConddotYpwU5wuAIItM10AsODXvQoH8efm6hVU7OSCIFPrAcCpYPPIXzmRCrlt+UK92AGAy6iggXgpIa5cqLNfF9A8lKIBCLw60OLcG4PAsbBycwHnA5BsdOsFxEIH6gE2AFOlehXbA7ja3/oYOqEtNn4qhqHYhgRMKSMB2Fp4rJJt029tfSzY9ixJAA6UamJKzkJyJH/vr2/7yuN3tp+87UsP/vSfjgbgrUfv+MrRj3xLgnLu9k//w9EnuLauzgdAqP/TEGJn5XoJui1xcdo1F/6gGFsu/ehJrPH04HrYNbghUkLs1NgWeEjJ8ny3hiTOK+SlgZAZKMYKIFNxgBIbsGVzzl9z8aRWeq6Ga+Os3LzEdRts0ilMZkeQj9AGbkCMVxg+w38cLU/CVThB/C0lNKGBpiOoToDbnngyTsCaKwhl82S1Na51uTWyGZ4bw5gNVUW6Jq+hloDek5NWqhMQH7NhTwLHyty6Kn5EN33joMdXB6rruXhKDgbtgxKA5x+HztHXjhw5QfTkkRMnnqcTZ4jOfRVXAH8rrwL+HYedx9eOHP0f5MFmkc48eeToOU7vanATuDqqdnv78tWFaHWktoBrK7hUjuErltwDjNIPzlyRfqCLkVobAI6XsWJcqVzMv6unmoOrujVXPOWWM1/QB1eiFQF48v4r0j/JOUJrbQAQ6qugV6aanBlXS8tfXV1Txf5qnDp6cFVPfgWt1RJg9A6RASDlMgCkXAaAlMsAkHIZAFIuA0DKZQBIuQwAKddoANpv6IDRetYIAF47+93WS63W2df1sdF61VAAXn/ppdf4vYj2q62zZh5Y3xoGwKviNR0i+qEwBKxrDQHg9Vavz183BKxrDQLwhvL/iQfvP3KGA6++xM9G61SDALzyCp7OfPRm1oMc8dLygmC07jQIgJwA9kn/33zz/Qi/ZqaAdawBAF57GU9Htf9vvpm/hvrdVfiMm9E1qgEAfsgrwC9r96sp4OVf/Il3sg7L8zIargEAXnkVT9r70EdxdPZXdFe+Q/V9eWJGQzUIwA/x9DPa/esCgJ+X52U0XAMAvMrj5de0+9V1wEt/8gfvYH3mG/K8jIZrAIA3eM9/Qrv/5p86Q9SWX183Wp8aAEBd9h/RADyB8KtnZfzq6zP6dc2U/JUOGI3UIADqsv8JvhPwUb4IbPfdGV5N/YJ+XTP9x6/qgNFIDQJAL/OFINGZ59V3yL6vDtdABoBrQEMAaLd6Xf79tVoADADXhIYAQG985zudD4K88m2+MWi0fjUMAGwE/zP59tmXxbdPJWs2/xtdGxoOANHZ/z55ChDoI6N1q1EAGKVEBoCUa/0CcEq/snrDRn0aAGBxlugYHmune5aIthMdXru3acfGpk/RmD5gjRkCRmkAgNlNS7Q0TdSSfdbi9wFOre6bAUBs6d1LNP2PamDKGjiwehqj2T0SgM45GABGahCAw5taAODQ9mm8bpq9bon27BnDmF09tcZozz2zcBAKPnZybPuxsT3TvcP1yjVGhxbxdGxsFp7fs2e6NXZq9gM6zahfgwAs3TMLADYhtIjXw3uWtp9awoy9ihprbW+NHcMsc2rP4km4Hl7atKqTzLvHNh0GACh3aZpnMxrbY/w/QkMAoLFD0+yXxdklTNbTS2Ozs4s6cXU0e2iaxu5ZbI3d83OLJ+EfxcAqaoxaP4an64hOji0e4ohNx1SK0fkaBsDJTXDQKZo+JgHA/Kn2A6umpesW6dB1pzAHTK8NAJtOLWH8055DWApOovk0dswQMEIDABxGTy0u0snp7YfpJP4W6fD26VXuPezRj+0h+sD04lILkwvG6KFVXQKmpz/Qollq7dmOmR/Nbx1qnVzTC5t3sAYAMEqXDAAplwEg5TIApFwGgJTLAJByGQBSLgNAymUASLkMACmXASDlMgCkXAaAlMsAkHIZAFIuA0DKZQBIuQwAKZcBIOUyAKRcAwA0WTo8TPMFkRQCfTBUK/968vv0q9bHKdG/EX5cFeoLBPxRvz1eC3XxCHQ1usKo9/fH+ef6R6q3Wfyb/v1Sv/B/Acleu9xfjk6Cq/T/eM8HQBSLdrGoD4YoGRfkrPzT8HMN8nVwiDbrV60dFC+oUFSSL3MCAQAw3KtuAAMdkBJwMSocId/VAVZ5Jefc0Ol/NN0f+Nn6wZgedU52L5rkz/1IH12K4pDE718jAEBZ/cpiqjvzgeAAu0n7sMkdKp/0s5QM9XlZ5RfKsJPEh5ywQx0hiJKVpSLBUQc94kq035uCA1xGMikjVON0Laoqfu0BQMdJs46Barc86gKgA73laSFGHepnbdHNmmxt09TpTnxXXIeO66TIw04ckg/q4d9XW094LTUCADzQeU55spktzeRkW+adohMnE3axbE/yjOgUZ5pUmJnwKCkUJ5twGJzhFsZDpwmLGkqQnhQ5ZENJxUxIcabo2FyWX3T8BAkNAIB63MkZhyKnMJNrABBkK4Z32+MLWaH862CA5KhYRFXwOwhyZmZyAVWKM1WatCcFqq5Ocl5VS3VmRmLCcS6bc4HOpEDJaLNDVJIJXDCfAo5Q0Q1thsVp5u3JEJXIk6ViqZjx2BAxN1RmspUZHO4tlWYqbboV2Vp0g8vdoZejvUE1oFnEnyaw4Lvs1XhbcVf74CRyRFOoXDr6Nydn/OX8zrO1LZnyN25qHyyUJqpthgFI3Toz8SkN1tpqZQDQkVaDXO6EhN2Rk06Vgxhh2FTY1HkGQQ0AkhFiJ4VwI+IBT73MR2GJJhqUWJzZh1/hfURJABKiiWaEOhGhAeBSynU14j2XjQSJrALARyV56eOsJMRpcquQF7XUSyQRU/i5XQCwzqBkaQwTKjIA6hSUWQcA7nw3SLa2kNqGlYArFQCnqVz6UZxv78U5T4V+CXbIdrpn8kimnHYd8bVyuwvAFhhwH7ynFd2ECeIFHLEJqm3TwXIb+f0yOz0BAKU2alMAPAzEZM1rrpUBwCylQno4S+9wn0L7gUfxxp07b2zKHtcAwC8KgLBM3L+UlHZOwDUylUuWmblEe+fOnQUFgF/I280oD+NJVYUCIHQI45UnEaaluquoAWCwEJh3MJ0oABhR4KFqmctKODgOZWsAkEU1vsgDXJ0S7cc8wimouh8AebI3tDmtCwDHE/y0V9bOScnuNju/CwDt9TCbI/6mLgAIIn6+4NgvRHA555UmdEDZIS/iNQDS9ep5L3cs07LmGg0Axh36owtAzL7I9gCAIVIvy662eYnINynuBYCyvkws1ziPcg2XrGYAlLhZLiwMgMDkglGMCuCJHgCowIMVKgd5HtrIj/I34xB+DBiYDgBoK9euaqFkPzeY4/AYBMADGZwIJY48haiMPuc2TWgAYp6rt44AoA5Ph2UUAtf1AwDXcuHxbgbAYwDkBCJ+nMd+F4D7PMTxUyQBGgLAxvYBPL89GgGA49Un+gFAVFSZk30oARBBVKjH2ah+Ly0UokC4lajYBcAJsHBk5Oa8XKl3Z4D91chTewCUiFz1UAMQVa1mZHv1TNwFoOjF5Nlqfx9m6hTmIk8DEKLWXBDnoopNwo6wBxC5oJ6r6VqCqMLoodS641K+Wt/ZD0CSi+oFPiV5CnyE7cMNbZRayTRpImqgkil5ssMB4Ia0k21P13OnpfOnosa8ukwEAGJbUN/2FPLX3yOXgPdXo3mx8enqxmUAkqmgHiZTj9W3yfyIv6/ybBeAcNvTlY3teOvT9XvfFgaGAMCXPInr4do3xCDFUaJOz3fRfIH1Xl4TCY8PYQcf1dR0G9coxhFyJW6DYjV6he8lz3AcX7D5bkNmliX6Lq7MQw4nbhgK8YysoMZV4Eo8cWMe1Eo+P3T5KCB2awjAHOGaK7hC2RpVi+/KOrhtKFt4sn5upWy8LDrggYqm9ZwCl4RW4LDBJyGTVC5IV9vg4vcG3O7lbJyjhqAy0y1R/cfi1sTq/FSBOmvi4gQ5P8c/HKBgzo3jh+VpJQe5+LdBQwBYJfHwuUL9klxEVl3wo5qdLktyFK8frRUAya45Hbp87VrhhtQVSIzvulHffLoclQ0ARutIBoCUywCQcl0WAJF+vSg1LrTfuqCB0RpqEAB5f2YFIZ3vFFy0+NbAirqggdEaagAAvlmykuquAWA96XwARCFbIlF2ynJe9sNS4+OAokZ3h4USRx3fmatQtlao4EqvzG8WVTlYlXfWZJQrOFdBT+tRoVQKlOXxoOrUZEa/UIgpeqjs1DhcUveTja6OBmYAP9+gTEgL8m2Y4kxD7OC7WeS8T8zJuWEBaNgLVPTYygmRFFNljuTtd347bs6lYkEs5PmQ30JMcoGyjHKNJDtHxTrVRJIlP4tDiiZFkjEAXEUNWwLkHVj5Xg28RRqA5+T7LDLMb7j6bpwNgqLr57AjtINAely+d5Ple4AiSzXX5bvqmOHjHCw9fvNmAtODSyIo27KciSbfVTEzwNXUUADYj/CVup2rAVBvtCkA5BtE8bjv+zElxQLZCPFdcb+MJwkAnkWjIRggALCDLXlzgWnFd5NcrbFZluM02cAAcDU1AAC8L7IN9WEJ6crNDf74xDIAcLIEgK2EwFq/mWd+4kVf5Br8AQsFgDRGYZlAWXYBiAr8sRAFgFdhAzourY2uggYAEOM7KR7fpXZxd/MbVs7OOZ8/UZnw+EY6PIxYHwm7CsLfsXMBaOzEtg5C1KSQufRt/P07CnOhsow9DHbOKPK77s1zAShUFHfBIB5X1kZvvwYAMEqXDAAplwEg5TIApFwGgJTLAJByGQBSLgNAymUASLkMACmXASDlMgCkXAaAlMsAkHIZAFIuA0DKZQBIt+hd/w8unKb+aRS+DwAAAABJRU5ErkJggg==" width="512" height="152" class="img_ev3q">
When the validation is set to Warn or Block, admins will receive a summary email when a solution is imported or blocked.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="less-effort-to-manage-and-govern-your-entire-application-estate"><strong>Less effort</strong> to manage and govern your entire application estate<a class="hash-link" href="#less-effort-to-manage-and-govern-your-entire-application-estate" title="Direct link to heading">​</a></h3><p><a href="https://learn.microsoft.com/power-platform/alm/set-up-pipelines?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Pipelines</a> make it easy to deploy solutions to environments (see tomorrow’s blog for a deep dive!). With automated ALM configured by admins, there’s no need for makers to know everything about deployments.</p><p><em>“Training a user or a maker on ALM was easily a couple of hours, and most of the time, people weren’t coming back because they didn’t understand most of what was there. Now, all I have to do is just add the users as Pipeline admins and then just say “Hey, you see that little rocket down there? Just press that!”</em></p><p>Andrew Gaskins: Global Power Platform Lead - Lumen Technologies</p><p>For all of the powerful features included in Managed Environments, <a href="https://go.microsoft.com/fwlink/?linkid=2211456" target="_blank" rel="noopener noreferrer">Activation</a> can be done a few simple clicks, saving time and effort for Power Platform admins.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="powerful-governance-made-easy-with-managed-environments-for-power-platform">Powerful governance made easy with Managed Environments for Power Platform<a class="hash-link" href="#powerful-governance-made-easy-with-managed-environments-for-power-platform" title="Direct link to heading">​</a></h2><p>Power Platform offers several options for organizations to implement governance and security of their low code assets including the Power Platform Admin Center, a single place admins can go to build and enforce their governance policies. There, admins can build guardrails around data, apps, and environments, and view analytics on low code assets by default. With Managed Environments, admins are able to proactively build and enforce best practices while gaining key insights and analytics, and enable governance-at-scale without additional IT resources.
Managed Environments allows organizations to streamline their governance at scale with features that provide more visibility, more control, all with less effort.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li><p><strong>Watch</strong>: <a href="https://learn.microsoft.com/shows/the-low-code-revolution/the-low-code-revolution-governance-and-alm?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">The Low Code Revolution Show - <strong>Governance and ALM</strong></a></p></li><li><p><strong>Watch</strong> all of the <a href="https://www.youtube.com/live/4VK1CJYR2W4" target="_blank" rel="noopener noreferrer"><strong>Powerful Devs Conference</strong></a>  sessions on demand to learn from experts how you, as a developer, can leverage the Power Platform to build applications faster and with far less effort.</p></li><li><p>Low Code February <a href="https://learn.microsoft.com/users/nityan/collections/xz6ehr2mx031y0?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Learn Collection</strong></a>: Collection of resources to go from learning Power Platform Fundamentals, to understanding the Dataverse and working in Fusion Development teams.</p></li><li><p>Sign up for the <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Free Power Apps Developer Plan</strong></a> so you have access to the Power Platform.</p></li><li><p>Enrolling in the <a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer"><strong>Cloud Skills Challenge</strong></a> to skill up on key cloud technologies with free, self-guided learning courses, and start climbing the leaderboard!</p></li></ul>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>power-platform</category>
            <category>managed environment</category>
        </item>
        <item>
            <title><![CDATA[22. Power Automate, ACS and OpenAI]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day22</link>
            <guid>2023-day22</guid>
            <pubDate>Wed, 22 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to build a SMS conversational bot with Power Automate, OpenAI and Azure Communication Services! - join us at #LowCodeFebruary https://aka.ms/lowcode-february. #30DaysOfLowCode]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 22</code> of #30DaysOfLowCode!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>Power Automate and Azure Communication Services</li><li>Build a SMS conversational bot</li><li>Configuring Event Grid Trigger</li><li>Configure Azure OpenAI</li><li>Configure Azure Communication Services SMS</li><li>Exercise: Sign up for your <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Developer Plan</strong></a></li><li>Resources: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Low Code February Collection</strong></a></li></ul><p><img loading="lazy" alt="Feb22" src="/Low-Code/assets/images/30-22-16fe03bc77bbb554ef6b40090fb6e3c4.png" width="1334" height="560" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="background">Background<a class="hash-link" href="#background" title="Direct link to heading">​</a></h2><p>In our <a href="https://techcommunity.microsoft.com/t5/azure-communication-services/build-a-conversational-sms-bot-with-azure-communication-services/ba-p/3739568" target="_blank" rel="noopener noreferrer">last blog</a>, we walked through the process of building a SMS conversational bot. Today we want to showcase a similar bot, but this time built completely on top of low code connectors for Power Automate. It is incredibly easy and exciting to leverage Azure Communication Services connectors in conjunction with Large Language Models (LLM) like ChatGPT to build a conversation bot. For this blog, we will be building Anton, a personal trainer bot for Contoso Gym. See the preview:</p><p><img loading="lazy" alt="Anton Preview" src="/Low-Code/assets/images/01-anton_demo-2d6f639be708a190f0ead0c4e1d25a97.gif" width="600" height="600" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="pre-requisites">Pre-requisites<a class="hash-link" href="#pre-requisites" title="Direct link to heading">​</a></h2><p>To follow along you will need:</p><ul><li>An Azure account with an active subscription. <a href="https://aka.ms/acs-sms-open-ai-create-azure" target="_blank" rel="noopener noreferrer">Create an account for free</a>.</li><li>Enable Event Grid resource provided on your subscription. See <a href="https://aka.ms/acs-sms-open-ai-event-sub" target="_blank" rel="noopener noreferrer">instructions</a>.</li><li>An active Communication Services resource and connection string. <a href="https://aka.ms/acs-sms-open-ai-create-resource" target="_blank" rel="noopener noreferrer">Create</a> a Communication Services resource.</li><li>An SMS-enabled telephone number. <a href="https://aka.ms/acs-sms-open-ai-get-number" target="_blank" rel="noopener noreferrer">Get a phone number</a>.</li><li>Azure OpenAI resource. See <a href="https://aka.ms/acs-sms-open-ai-create-open" target="_blank" rel="noopener noreferrer">instructions</a>.</li><li>Azure OpenAI deployed model. See <a href="https://aka.ms/acs-sms-open-ai-deploy-model" target="_blank" rel="noopener noreferrer">instructions</a>.</li><li>Power Automate account. Azure Communication Services connectors require a <a href="https://learn.microsoft.com/power-platform/admin/power-automate-licensing/types#standalone-plans" target="_blank" rel="noopener noreferrer">plan</a> that supports premium connectors.</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="configuring-event-grid-trigger">Configuring Event Grid Trigger<a class="hash-link" href="#configuring-event-grid-trigger" title="Direct link to heading">​</a></h2><p>This application will leverage <a href="https://learn.microsoft.com/azure/event-grid/" target="_blank" rel="noopener noreferrer">Azure Event Grid</a> to listen for incoming text messages to Azure Communication Services number, and an <a href="https://learn.microsoft.com/azure/azure-functions/" target="_blank" rel="noopener noreferrer">Azure Function</a> to process the event and respond with an Azure OpenAI generated response.</p><p>We will start by configuring an Event Grid trigger for your Power Automate flow. This trigger will automatically connect to your existing Azure subscription and to the Azure Communication Services resource to configure your event subscription.</p><p><img loading="lazy" alt="Event Grid Trigger" src="/Low-Code/assets/images/01-acs_sms_event_grid-95865cc5d811fe7ea1a588000c3172b6.png" width="1341" height="808" class="img_ev3q"></p><p>To keep the data organized, you will add a Parse JSON connector to help us parse the event. The event schema follows this structure:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&lt;details&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;summary&gt;&lt;b&gt;Schema (open to see)&lt;/b&gt;&lt;/summary&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "properties": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "data": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "properties": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "From": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "Message": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "MessageId": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "ReceivedTimestamp": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "To": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "type": "object"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "dataVersion": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "eventTime": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "eventType": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "id": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "metadataVersion": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "subject": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "topic": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "type": "object"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/details&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Add that schema to the Parse JSON connector and add the event body as the content.</p><p><img loading="lazy" alt="Parse JSON" src="/Low-Code/assets/images/01-acs_sms_parse_json-c1d64ee28e2e9ea348cc7ab4181cb0f6.png" width="1258" height="750" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="configure-azure-openai">Configure Azure OpenAI<a class="hash-link" href="#configure-azure-openai" title="Direct link to heading">​</a></h2><p>Next, we must add a call to Azure OpenAI to ask the model to generate a response. We will use REST APIs to POST a request with our prompt. For the prompt, we will use a combination of the message sent by the user and a pre-designed text. In this example, we want the GPT-3 model to act like Anton, a personal trainer at Contoso Gym. We added some sample quotes from which the model can draw inspiration. These quotes help guide the model’s response and provide a more intuitive and conversational flow for the users. See the completed prompt below:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">```text</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    You're Anton Stanescu and you are a personal trainer at Contoso Gym. You are having a conversation with one of your students. You are trying to motivate them to work out.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Examples of the types of things that Anton says:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    - The only bad workout is the one that didn't happen.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    - Strive for progress, not perfection.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    - You won't get the muscle without the dedication and the drive</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    - Train hard...so you can stop a train if you need to.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    - Push up, push down, push up, push down</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    - Exercise should be regarded as tribute to the heart.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Anton: Welcome to the Contoso Gym! Big things await for you.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Student:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>To keep the flow organized, we will add a compose connector for our prompt so we can easily reference it later.</p><p><img loading="lazy" alt="Compose Prompt" src="/Low-Code/assets/images/01-acs_sms_compose_prompt-1ae5fcf3a8575e67273ffec86e125a97.png" width="1240" height="864" class="img_ev3q"></p><p>To communicate with the Azure OpenAI service, we will use POST request inside of an HTTP connector. In return, we will receive a text generated by the Azure OpenAI model. To configure the HTTP connector, you will need the URI to your Azure OpenAI resource. You will also need the <code>api-key</code> for your Azure OpenAI resource.</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">```text</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;base_url&gt; + /openai/deployments/ + &lt;deployment_name&gt; + /completions?api-version=2022-12-01</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p><img loading="lazy" alt="HTTP Connector" src="/Low-Code/assets/images/01-acs_sms_sms_connector-5629130701109cac2b8add9e5807dde0.png" width="1030" height="1013" class="img_ev3q"></p><p>Using the compose output for our prompt, we will concatenate together the prompt, the message the user sent through SMS, and a stop trigger for the Open AI model to stop generating text:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">```text</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">concat(outputs('Compose'), body('Parse_JSON')?['data']?['Message'], '\nAnton:')</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Once we have the HTTP connector configured, we will use a Parse JSON connector to process the response from Azure Open AI. The expected schema from Azure Open AI takes the following format:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&lt;details&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;summary&gt;&lt;b&gt;Schema (open to see)&lt;/b&gt;&lt;/summary&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "properties": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "choices": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "items": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "properties": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    "finish_reason": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    "index": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        "type": "integer"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    "logprobs": {},</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    "text": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "required": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    "text",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    "index",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    "logprobs",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    "finish_reason"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                ],</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "type": "object"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "type": "array"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "created": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "type": "integer"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "id": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "model": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "object": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "type": "string"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "type": "object"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/details&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>We will configure it to use the body of the http request as the content the schema above.</p><p><img loading="lazy" alt="Parse JSON" src="/Low-Code/assets/images/01-acs_sms_parse_json-c1d64ee28e2e9ea348cc7ab4181cb0f6.png" width="1258" height="750" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="configure-azure-communication-services-sms">Configure Azure Communication Services SMS<a class="hash-link" href="#configure-azure-communication-services-sms" title="Direct link to heading">​</a></h2><p>Finally, we will configure our SMS connector for Azure Communication Services to respond with the new response generated by Azure OpenAI. You will need a connection string for your Azure Communication Services resource to initialize the SMS connector.</p><p><img loading="lazy" alt="SMS Connector" src="/Low-Code/assets/images/01-acs_sms_sms_connector-5629130701109cac2b8add9e5807dde0.png" width="1030" height="1013" class="img_ev3q"></p><p>Now that everything is connected, test the flow by sending an SMS from your phone to the phone number you acquired through the Azure Communication Services resource.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="next-steps-and-resources">Next Steps and Resources<a class="hash-link" href="#next-steps-and-resources" title="Direct link to heading">​</a></h2><p>Congratulations! You have created a conversational SMS bot using Power Automate. Azure Communication Services provides out of the box connectors for SMS, Email and Chat. Whether it is having Anton, the personal trainer bot talk to your customers or having a real person interact with them, Azure Communication Services can help. To learn more about other resources that Azure Communication Services offers see the links below:</p><ul><li><a href="https://aka.ms/acs-sms-open-ai-overview" target="_blank" rel="noopener noreferrer">Overview</a> of Azure Communication Services.</li><li><a href="https://aka.ms/acs-sms-connector" target="_blank" rel="noopener noreferrer">SMS Connector</a></li><li><a href="https://aka.ms/acs-email-connector" target="_blank" rel="noopener noreferrer">Email Connector</a></li><li><a href="https://aka.ms/acs-chat-connector" target="_blank" rel="noopener noreferrer">Chat Connector</a></li><li><a href="https://aka.ms/acs-identity-connector" target="_blank" rel="noopener noreferrer">Identity Connector</a></li><li>Want to learn how to do this in code, checkout out <a href="https://techcommunity.microsoft.com/t5/azure-communication-services/build-a-conversational-sms-bot-with-azure-communication-services/ba-p/3739568" target="_blank" rel="noopener noreferrer">last blog post</a>.</li></ul><p>Also consider -</p><ul><li>Signing up for the free <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer">Power Apps Developer Plan</a> so you have access to the Power Platform.</li><li>Enrolling in the <a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer">Cloud Skills Challenge</a> to skill up on key cloud technologies with free, self-guided learning courses, and start climbing the leaderboard!</li></ul><p><img loading="lazy" alt="Campaign Banner" src="/Low-Code/assets/images/30-banner-d9bab2b92d758942447a4cbc50aef715.png" width="1334" height="560" class="img_ev3q"></p>]]></content:encoded>
            <category>low code</category>
            <category>developer tools</category>
            <category>power platform</category>
            <category>power automate</category>
            <category>azure communication services</category>
            <category>30DaysOfLowCode</category>
        </item>
        <item>
            <title><![CDATA[21. GitHub Actions for Power]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day21</link>
            <guid>2023-day21</guid>
            <pubDate>Tue, 21 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Explore the topic of GitHub Actions and show you how can you connect to Power Platform environments with GitHub Actions]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 21</code> of #30DaysOfLowCode!</p><p>Yesterday we talked about foundamentals of App Lifecycle Managament with Power Platform. Today we'll explore the topic of GitHub Actions and show you how can you connect to Power Platform environments with GitHub Actions.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>Intro to GitHub Actions</li><li>GitHub Runners</li><li>Power Platform and GitHub Actions</li><li>Exercise: Sign up for your <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Developer Plan</strong></a></li><li>Resources: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Low Code February Collection</strong></a></li></ul><p><img loading="lazy" alt="Empty Banner Placeholder" src="/Low-Code/assets/images/30-21-52d8fb9432829ef77edba2b7c2281f39.png" width="1334" height="560" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="basic-github-actions-concepts">Basic GitHub Actions Concepts<a class="hash-link" href="#basic-github-actions-concepts" title="Direct link to heading">​</a></h2><p>Before we get into details on the Power Platform GitHub actions, we need to understand some key terms of GitHub, that enable GitHub to do Continuous Integration/Continuous Delivery (CI/CD).</p><p><img loading="lazy" alt="GitHub Workflow Concepts" src="/Low-Code/assets/images/Github-concept-45c97d26112a94a664de6e3b57278cdc.png" width="3173" height="1168" class="img_ev3q"></p><ul><li>GitHub actions are components to enable CI/CD of Power Platform Applications using GitHub Workflows.</li><li>GitHub Run      : GitHub run is a term used when the workflow runs </li><li>GitHub Workflow : This is the actual CI/CD script that is used by GitHub and it consists of Jobs</li><li>GitHub Job      : A Job is a composition of a GitHub Runner (container where the CI/CD script is run)</li><li>GitHub Steps    : Step has a set of actions that accomplish an the overall outcome of the workflow (such as deploying to Power Platform)</li></ul><p><a href="https://github.com/marketplace/actions/powerplatform-actions" target="_blank" rel="noopener noreferrer">The GitHub actions for Power Platform are available at the GitHub market place</a>. The GitHub actions, provide the ability to import export solutions, deploying to different environments, provisioning and decommissioning an environments, and validate the solution when it is being imported into a target environment.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="github-runners">GitHub Runners<a class="hash-link" href="#github-runners" title="Direct link to heading">​</a></h2><p>Runners in GitHub are a type of machine where you need to run your GitHub job on. Runners can GitHub hosted or self-hosted.
GitHub hosted runners are managed by GitHub and all you need to do is to use <em>runs-on</em> and GitHub will automatically allocate such a resource during the runtime of a CI/CD script. </p><p>Self-hosted Runners run on your identified resources such as VMs in the Azure Cloud or On-premises. This runners are configured and controlled based on your needs, as in you have more control on the kind of operating system version, pre-installed software tools that need to install for your CI/CD script to run.</p><p>Power Platform Actions on GitHub, support Windows and Linux images for both GitHub hosted and self-hosted runners. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-connect-to-power-platform-environments-using-github-actions">How to connect to Power Platform environments using GitHub Actions?<a class="hash-link" href="#how-to-connect-to-power-platform-environments-using-github-actions" title="Direct link to heading">​</a></h2><p>Power Platform Actions for GitHub have support for the following: </p><ul><li>UserName/Password : Generic connection which uses username and password to authenticate to the Power Platform environments. Please do not enable MFAs this account otherwise your GitHub workflows will break</li><li>Service Principal and Client secret (Recommended) - This allows your workflow to authenticate to the Power Platform using a service principal identity with a client secret. This is an approach we generally recommend when deploying Power Platform applications at scale.</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="use-environment-variables-within-github-workflow-scripts-when-deploying-power-platform-applications">Use Environment Variables within GitHub workflow scripts when deploying Power Platform applications<a class="hash-link" href="#use-environment-variables-within-github-workflow-scripts-when-deploying-power-platform-applications" title="Direct link to heading">​</a></h2><p>If you want to use the same workflow to deploy multiple Power Platform solution to either one environment or different environments.
GitHub Workflows support environment variables.
<img loading="lazy" alt="Example of GitHub environment variables" src="/Low-Code/assets/images/GitHub-env-variables-b9f027e2bd864e050b7589362cac1b39.png" width="1444" height="1788" class="img_ev3q"></p><p>Once you have the environments in place you can then call these environment variables from within the actions
<img loading="lazy" alt="Example of invoking environment variables from the action" src="/Low-Code/assets/images/Action-env-var-fb10f29682c2484ef95e5dab7b0dfb38.png" width="1609" height="517" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="exercise">Exercise<a class="hash-link" href="#exercise" title="Direct link to heading">​</a></h2><ul><li>Try out our Hands on lab for <a href="https://github.com/microsoft/powerplatform-actions-lab" target="_blank" rel="noopener noreferrer"><strong>GitHub actions</strong></a></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li><a href="https://github.com/marketplace/actions/powerplatform-actions" target="_blank" rel="noopener noreferrer"><strong>Get the GitHub actions from the GitHub marketplace</strong></a></li><li><a href="https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners" target="_blank" rel="noopener noreferrer"><strong>Self hosted runner information</strong></a></li><li><a href="https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners" target="_blank" rel="noopener noreferrer"><strong>About GitHub hosted runners</strong></a></li><li><a href="https://learn.microsoft.com/azure/active-directory/develop/howto-create-service-principal-portal?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Azure AD service principal</strong></a></li><li><a href="https://learn.microsoft.com/power-platform/alm/tutorials/github-actions-start?source=recommendations?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>GitHub Power Platform Actions tutorial</strong></a></li><li><a href="https://github.com/microsoft/powerplatform-actions-lab" target="_blank" rel="noopener noreferrer"><strong>GitHub Power Platform Actions: Hands on lab</strong></a></li></ul><p><img loading="lazy" alt="Campaign Banner" src="/Low-Code/assets/images/30-banner-d9bab2b92d758942447a4cbc50aef715.png" width="1334" height="560" class="img_ev3q"></p>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>power-platform</category>
            <category>developer experience</category>
            <category>github</category>
        </item>
        <item>
            <title><![CDATA[20. ALM For Power Platform]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day20</link>
            <guid>2023-day20</guid>
            <pubDate>Mon, 20 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Take a look into the foundamentals of App Lifecycle Management (ALM) and walk you through how can you implement ALM with Power Platform. - join us at #LowCodeFebruary https://aka.ms/lowcode-february. #30DaysOfLowCode]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 20</code> of #30DaysOfLowCode!</p><p>The theme for this week is Developer Experience. Today we will take a look into the foundamentals of App Lifecycle Management (ALM) and walk you through how can you implement ALM with Power Platform.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>Intro to Application Lifecycle Management (ALM)</li><li>Power Platform and Application Lifecycle Management</li><li>Solutions for Application Lifecycle Management</li><li>Deployment management</li><li>Exercise: Sign up for your <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Developer Plan</strong></a></li><li>Resources: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Low Code February Collection</strong></a></li></ul><p><img loading="lazy" alt="Feb20" src="/Low-Code/assets/images/30-20-9c923d220c0093fa7a7c1cbc4e4fe06a.png" width="1334" height="560" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-application-lifecycle-management-alm-">What is Application Lifecycle Management (ALM) ?<a class="hash-link" href="#what-is-application-lifecycle-management-alm-" title="Direct link to heading">​</a></h2><p>Application Lifecycle Management is an very large encompassing term. Which is absolutely true, because you are managing the life of an Application from its birth to finally retiring it.
Now, there is a perception that ALM is only valid traditional software development projects, and those perceptions maybe right. The applications being built by Power Platform are also applications, and applications by nature need to be managed especially when low code applications are now being built for organization's turn key products. Application Lifecycle management is culmination of a problem solving effort by combining people, process, and tools to address a purpose/outcome.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-falls-within-realm-of-alm">What falls within realm of ALM?<a class="hash-link" href="#what-falls-within-realm-of-alm" title="Direct link to heading">​</a></h2><p>ALM can be seen via various terms, such as:</p><ul><li>Digital transformation : where an organization adopts technology to help improve value, productivity,risk management, efficiency, and manage costs</li><li>DevOps (Development + Operations)               : It is the union of people, process, and tools to enable continuous delivery to your users of your service</li><li>DevSecOps (Development + Security + Operations) : It is an approach built on top of DevOps and incorporating a security mindset from the get go</li><li>Legacy Application development                  : Managing the Application lifecycle of a mature product line</li><li>New Application development                     : Managing the Application lifecycle of a nascent product line</li></ul><p>Now there is SDLC which stands for Software Development Lifecycle, it is also part of ALM but focuses mostly on the software development side of things.</p><p>In short, all these terms are part of application lifecycle management, as a matter of fact, any time a new application is developed, it will have to be managed eventually!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="power-platform-and-application-lifecycle-management">Power Platform and Application Lifecycle Management<a class="hash-link" href="#power-platform-and-application-lifecycle-management" title="Direct link to heading">​</a></h2><p>Power Platform helps you develop applications quicker and faster, so it has the capabilities to be part of Application Management initiatives of an organization. When implementing Application Lifecycle Management with Power Platform, three things need to be considered</p><ul><li><p>Environment Management                : This entails the strategy you want to implement when embarking on ALM. Typically most common ALM pattern from an environments perspective is to have environments that map to Development, Test, and Production.  </p></li><li><p>Organize the artifacts in Solutions   : PowerApps, PowerAutomate Flows, Power Virtual Agents, AI Builder, PowerBI, and Power Pages assets need to be within solutions</p></li><li><p>Managing Deployments                  : When solutions are deployed from Development, to Test, to Production what are the mechanism that need to be employed and managed (i.e. Azure DevOps pipelines, GitHub actions, and Pipelines for Power Platform)  </p></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="solutions-are-important-for-application-lifecycle-management">Solutions are important for Application Lifecycle Management<a class="hash-link" href="#solutions-are-important-for-application-lifecycle-management" title="Direct link to heading">​</a></h2><p>Beyond the components listed in the prior section, the additional components that are part of solution for enabling successful Application Lifecycle Management
<img loading="lazy" alt="What is in a solution" src="/Low-Code/assets/images/What-is-in-a-solution-129ca9442c0db83d5ad63979a363a5bd.png" width="4147" height="1390" class="img_ev3q"></p><p>In addition, there are two types of solution, which are managed and unmanaged solutions.</p><ul><li>Managed solutions  : Are immutable, as in once a solution becomes managed, it cannot be changed. Think of components that you use as a library for your application</li><li>Unmanaged solutions: These solutions can be changed, solutions when in your development environment are generally in the unmanaged state.</li></ul><p>When committing solutions from a Power Platform developer environment, you need to export them, the solution renders itself as a zip file that can be then committed to source code repository.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="deployment-management">Deployment management<a class="hash-link" href="#deployment-management" title="Direct link to heading">​</a></h2><p>As mentioned before, there are various ways and means to deploy power platform applications, there are integrations with Azure DevOps and GitHub Actions. In addition, Power Platform has an in-product deployment capability called <a href="https://learn.microsoft.com/power-platform/alm/pipelines/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Pipelines for Power Platform</a>. This is designed for developers who may not have sophisticated ALM deployment needs.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li><a href="https://learn.microsoft.com/power-platform/alm/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">ALM with Power Platform</a></li><li><a href="https://learn.microsoft.com/power-platform/alm/environment-strategy-alm/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Environment Strategy</a></li><li><a href="https://learn.microsoft.com/power-platform/alm/solution-concepts-alm/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Solution Concepts</a></li><li><a href="https://learn.microsoft.com/power-platform/alm/devops-build-tools?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">ALM Automation: Power Platform Build Tools for Azure DevOps</a></li><li><a href="https://learn.microsoft.com/power-platform/alm/devops-github-actions?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">ALM Automation: Power Platform actions with GitHub</a></li><li><a href="https://learn.microsoft.com/power-platform/alm/pipelines?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">ALM Automation:Pipelines in Power Platform</a></li></ul><p><img loading="lazy" alt="Campaign Banner" src="/Low-Code/assets/images/30-banner-d9bab2b92d758942447a4cbc50aef715.png" width="1334" height="560" class="img_ev3q"></p>]]></content:encoded>
            <category>low code</category>
            <category>developer tools</category>
            <category>power platform</category>
            <category>developer experience</category>
            <category>app lifecycle management</category>
            <category>alm</category>
            <category>30DaysOfLowCode</category>
        </item>
        <item>
            <title><![CDATA[19. Recap - Interface Week ✨]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day19</link>
            <guid>2023-day19</guid>
            <pubDate>Sun, 19 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Let's recap Week 3 of #30DaysOfLowCode focused on builing user interface quickly with power platform - join us at #LowCodeFebruary https://aka.ms/lowcode-february]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 19</code> of #30DaysOfLowCode!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li><strong>Look Back</strong>: Recap User Interface Week</li><li><strong>Recap events</strong>: Powerful Dev Conference, Learn Live and Webinar for Power Platform and GitHub</li><li><strong>Skill Up</strong>: Self-Study Resources &amp; Cloud-Skills Challenge</li><li><strong>Look Ahead</strong>: Are you ready for the Developer Experience Week?!</li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Low Code February Collection</strong></a></li></ul><p><img loading="lazy" alt="Speaker Card for Feb 19" src="/Low-Code/assets/images/30-19-176b303aca9c46e8920937e6564c47d7.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="look-back-week-3-recap"><strong>Look Back</strong>: Week 3 Recap<a class="hash-link" href="#look-back-week-3-recap" title="Direct link to heading">​</a></h2><p>Hey there! Week 3 is a wrap! We had a blast exploring the user interface of Power Apps together. First up, we took a deep dive into canvas apps 101 and got familiar with the low code programming language - Fx. We also got to play around with the PCF (Power Apps Component Framework) control and learned how to build stunning, eye-catching front-ends. To top it off, we even built a PCF control together! </p><p>In our ZeroToHero blog post, we provided a detailed step-by-step guide on how to create a highly flexible and interactive app using the powerful combination of OpenAI, API Management, and Power Apps. Last but not the least, we also discussed how professional developers can take advantage of Power Pages to quickly build enterprise-ready internal and external websites. </p><p><img loading="lazy" alt="Roadmap Image for Week 3" src="/Low-Code/assets/images/30-roadmap-week3-0f310472c079ce7507d860fd37c30b68.png" width="3840" height="2160" class="img_ev3q"></p><p>Here's what we've covered this week:</p><ul><li><p><a href="https://microsoft.github.io/Low-Code/blog/2023-day13" target="_blank" rel="noopener noreferrer"><strong>Build a Canvas App</strong></a> - Introduction to Canvas Apps, a powerful tool that allows developers to create highly tailored and personalized experiences for their users.</p></li><li><p><a href="https://microsoft.github.io/Low-Code/blog/2023-day14" target="_blank" rel="noopener noreferrer"><strong>Intro to Power Fx</strong></a> - Intoduction to Power Fx, a low-code programming language that enable you to add logic to your Power Apps. By delving into this language, you'll gain a deeper understanding of how Power Apps really work and be able to add more complex functionality to your apps. </p></li><li><p><a href="https://microsoft.github.io/Low-Code/blog/2023-day15" target="_blank" rel="noopener noreferrer"><strong>OpenAI &amp; Microsoft Power Platform 🚀</strong></a> - Over the past few weeks, there has been a lot of buzz around the topic of ChatGPT and OpenAI. In this blog, we're going to dive deeper into one of the many exciting scenarios where OpenAI and the Power Platform can be combined to create something truly amazing. </p></li><li><p><a href="https://microsoft.github.io/Low-Code/blog/2023-day16" target="_blank" rel="noopener noreferrer"><strong>Intro to PCF Control</strong></a> - Introduce to the Power Apps Component Framework (PCF), a powerful tool that allows developers to build custom components for their Power Apps, giving them complete control over the look and functionality of their apps. </p></li><li><p><a href="https://microsoft.github.io/Low-Code/blog/2023-day17" target="_blank" rel="noopener noreferrer"><strong>Build a PCF Control</strong></a> - Build a simple code component step-by-step, giving you the opportunity to follow along and see exactly how the process works.</p></li><li><p><a href="https://microsoft.github.io/Low-Code/blog/2023-day18" target="_blank" rel="noopener noreferrer"><strong>Power Pages for ProDevs</strong></a> - Intoduction to Power Pages, a powerful tool that provides developers with a wide range of features and tools to help them create professional websites quickly and easily. </p></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="recap-events"><strong>Recap events</strong><a class="hash-link" href="#recap-events" title="Direct link to heading">​</a></h2><ul><li><p><a href="http://localhost:3000/Low-Code/lowcode-february/Video-Live#ask-the-experts" target="_blank" rel="noopener noreferrer"><strong>Ask The Experts!</strong></a> During these sessions, you'll have the chance to have a face-to-face discussion with our leaders and experts, who will be able to provide you with valuable insights, guidance, and best practices:</p><ol><li><p>🎙 <a href="https://aka.ms/ATE0223/RSVP" target="_blank" rel="noopener noreferrer"><strong>Feb 23, 9AM PST</strong></a> - Join this session for Q&amp;A from the <strong>Powerful Devs Conference</strong> team. The Powerful Devs Conference is all about showing how code-first developers can integrate with the Power Platform to innovate faster. Our experts will be available to answer questions about full code and low code integration.
<img loading="lazy" alt="Week 3 Roadmap" src="/Low-Code/assets/images/ate_powerfuldev-c3d32cfe4d061ddb373ee0c54d81d569.png" width="3840" height="2160" class="img_ev3q"></p></li><li><p>🎙 <a href="https://aka.ms/ATE0309/RSVP" target="_blank" rel="noopener noreferrer"><strong>Mar 09, 9AM PST</strong></a> - Join this session for Q&amp;A from the <strong>Low Code February</strong> team, including authors of this #30DaysOfLowCode series. We will have experts in code-first integration with the Power Platform live to answer questions related to the content of the Low Code February events.
<img loading="lazy" alt="Week 3 Roadmap" src="/Low-Code/assets/images/ate_lowcodefeb-8df8963f7f93df7614a68b24974114fa.png" width="3840" height="2160" class="img_ev3q"></p></li></ol></li></ul><ul><li><p><a href="https://aka.ms/lowcode-february/LearnLive" target="_blank" rel="noopener noreferrer"><strong>Learn Live!</strong></a> If you have any questions or concerns about the Microsoft Learn modules or the Cloud Skills Challenge, be sure to tune in to our "Learn Live" sessions. During these sessions, you'll have the opportunity to hear directly from experts in the field and get tips and insights that can help you succeed in your learning journey: </p><ol><li>🎙 <a href="https://aka.ms/lowcode-february/LearnLive" target="_blank" rel="noopener noreferrer"><strong>Feb 27</strong></a> - Manage Microsoft Power Platform deployments
<img loading="lazy" alt="Week 3 Roadmap" src="/Low-Code/assets/images/LearnLive-fd1c85634a15c825a474e1deac2f0b8b.png" width="600" height="338" class="img_ev3q"></li></ol></li><li><p><a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Powerful Devs Conference: On-Demand</strong></a> The Powerful Devs Conference is a fantastic resource for developers who want to learn more about the Power Platform and how to build applications quickly and easily. The conference features a wide range of sessions and talks from industry experts, Microsoft Cloud Advocates, community leaders, and members of the Power Platform Team.
<img loading="lazy" alt="Week 3 Roadmap" src="/Low-Code/assets/images/Powerful Dev Social-Simple1-cd315420c042bcafdb87fd3e9379326f.png" width="1080" height="608" class="img_ev3q"></p></li><li><p><a href="https://mktoevents.com/Microsoft+Event/383091/157-GQE-382" target="_blank" rel="noopener noreferrer"><strong>Webinar: Power Platform &amp; Azure Deploys with GitHub: On-Demand</strong></a> Watch the on-demand webinar, where you'll get a chance to explore the powerful capabilities that the Power Platform opens up for GitHub. You'll learn about the inner and outer loop functions that are available with Power Platform and GitHub, and see firsthand how to author CI/CD pipelines that can help you streamline your development process.
<img loading="lazy" alt="Week 3 Roadmap" src="/Low-Code/assets/images/webinar-b5b3df88894e6916d9151f237dd0502f.png" width="1555" height="871" class="img_ev3q"></p></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="skill-up-for-self-study"><strong>Skill Up:</strong> For Self-Study<a class="hash-link" href="#skill-up-for-self-study" title="Direct link to heading">​</a></h2><p>Unable to keep up with the daily pace? No problem! Check out these our self-study materials designed to help you learn at your own convenience:</p><ol><li><a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Resource Collection</strong></a>: Bookmark the collection for a 1-stop resource containing all relevant links to documentation and training, as covered in the #30DaysOfLowCode blogs. </li><li><a href="https://aka.ms/lowcode-february/workshop" target="_blank" rel="noopener noreferrer"><strong>Hands-on Workshops</strong></a>: learn by doing! These labs help you gain hands-on experience from intro to advanced, whereever you're in the learning path. </li><li><a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer"><strong>Cloud skills Challenge</strong></a>: gives you a free curated set of learning modules to jumpstart your learning journey into Low Code and Fusion development. </li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="look-forward-week-4"><strong>Look Forward</strong>: Week 4<a class="hash-link" href="#look-forward-week-4" title="Direct link to heading">​</a></h2><p>During week 4 of the learning journey, you'll get a deep-dive in developer experience. You will get a chance to learn about Power Platform app lifecycle management, app governance as well as managing your apps with GitHub Actions, Power Platform pipelines and Azure DevOps. </p><p>Don't forget to bookmark the <a href="https://aka.ms/lowcode-february/blog" target="_blank" rel="noopener noreferrer"><strong>#30DaysOfLowCode</strong></a> page, then follow along to read the daily blog post, ask questions, and connect with other learners. <em>Get empowered</em> with low code development!</p><p><img loading="lazy" alt="Week 3 Roadmap" src="/Low-Code/assets/images/30-week4-731e63d9f0d486e8e4b8adf2c4fa0774.png" width="1001" height="420" class="img_ev3q"></p>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
            <category>recap</category>
        </item>
        <item>
            <title><![CDATA[18. Power Pages for ProDevs]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day18</link>
            <guid>2023-day18</guid>
            <pubDate>Sat, 18 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Power Pages for ProDevs]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 18</code> of #30DaysOfLowCode!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>Power Pages ❤️ Fusion Dev teams</li><li>No Code &amp; Configuration</li><li>Low Code &amp; Pro Code</li><li>Supporting the large teams</li><li><strong>Activity</strong>: Sign up for your <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer">Power Apps Developer Plan</a></li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Low Code February Collection</a></li></ul><p><img loading="lazy" alt="Speaker Card for Feb 18" src="/Low-Code/assets/images/30-18-2b3539de883f6200b064618d1d45c584.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="power-pages-loves-fusion-dev-teams">Power Pages loves Fusion Dev teams<a class="hash-link" href="#power-pages-loves-fusion-dev-teams" title="Direct link to heading">​</a></h2><p>Power Pages provides rich features and supports a variety of tools that enable fusion teams with technology and domain expertise to collaborate on developing professional websites. </p><p>Power Pages is unique in Power Platform as it address various audiences for your application that are <strong>external and internal to your organization</strong>. With Power Pages you can build websites that are completely public without users having to login or have users login via wider range of Identity Providers. </p><p><img loading="lazy" alt="Power Pages differentiation in Power Platform" src="/Low-Code/assets/images/01 - PowerPages-548d73c2c1d7d5c49abb8a2ac45aa5ce.png" width="2880" height="1616" class="img_ev3q"></p><p>Power Pages makes it easy for low code makers to get started and launch sites quickly. Power Pages also enables Pro-developers with Web Development &amp; Design background and help Fusion team shine by adding their skills to the project. For IT admins we alleviate worry about infrastructure without giving up trust with security and governance tools.</p><p>Thousands of customers across the global have been building and shipping solutions on Power Pages for years. PwC is one such customer who used their professional developer team skills, familiar tooling, and fusion team capabilities in Power Pages to deliver a compelling solution migrated from a full stack web application. Read more about it on <a href="https://customers.microsoft.com/story/1558972627174665363-pricewaterhousecoopers-banking-and-capital-markets-power-pages" target="_blank" rel="noopener noreferrer">Microsoft Customer Story : PwC builds multitenant enterprise decision support site with Power Pages</a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="supporting-fusion-teams">Supporting Fusion teams<a class="hash-link" href="#supporting-fusion-teams" title="Direct link to heading">​</a></h2><p>Fusion teams usually consist of members with varying skills –
1) There are <strong>domain experts</strong>, business users, subject matter experts who possess the functional knowledge and understanding of the uses cases of the websites they’d want to build for their business or organization and can usually contribute to the development via no-code / low-code configuration.
2) There are <strong>professional developers</strong> who can write code and use advanced tools for developing pixel-perfect user experiences and implement complex functional requirements required for the website. </p><p>Here is a diagram detailing features and capabilities from no code to pro code:</p><p><img loading="lazy" alt="Low Code to Pro Code Capabilities" src="/Low-Code/assets/images/01 - LowCode_to_ProCode_capabilities-ccb61e029ae825fffe022abdae29d106.png" width="2881" height="1619" class="img_ev3q"></p><p>We’ll get into more details of the ways in which Power Pages can support both ends of the Fusion team and their respective needs.   </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="no-code--configuration">No Code &amp; Configuration<a class="hash-link" href="#no-code--configuration" title="Direct link to heading">​</a></h2><p>Makers can jumpstart the design of a site with out-of-the box site templates and customize with Power Pages Studio to meet their requirements. </p><p>Power Pages studio is designed for low-code makers to rapidly build and style data centric business sites. It provides different workspaces for authoring, styling, data modelling and site configurations.</p><ul><li><strong>Pages</strong> workspace - enables maker to design and build Web Pages with component like Forms, Lists, Power BI, Power BI Embedded and Power Virtual Agents. </li><li><strong>Styling</strong> workspace - enables makers to create and apply global site styling. </li><li><strong>Data</strong> workspace - enables makers to model, visualize and mange Dataverse tables, columns and their respective views and forms without leaving the studio. </li><li><strong>Setup</strong> workspace - enables makers and admins to configure site settings/security. Security is an important consideration when building public facing websites and ensure that critical business information  is only accessible by the correct stakeholders.<ul><li>Configure <a href="https://learn.microsoft.com/en-us/power-pages/security/create-web-roles" target="_blank" rel="noopener noreferrer">Web roles</a>, <a href="https://learn.microsoft.com/en-us/power-pages/security/table-permissions" target="_blank" rel="noopener noreferrer">Table Permissions</a> and <a href="https://learn.microsoft.com/en-us/power-pages/security/page-security" target="_blank" rel="noopener noreferrer">Page Permissions</a> to provide and protect access to business information. </li><li>Administrators can use <a href="https://learn.microsoft.com/en-us/power-pages/admin/coe-portals" target="_blank" rel="noopener noreferrer">Power Apps portals admin center</a> to manage their sites and environments. Administrators can configure custom domains, Restrict IP addresses and enable application integrations. </li><li>Configure and enable <a href="https://learn.microsoft.com/en-us/power-pages/security/configure-portal-authentication" target="_blank" rel="noopener noreferrer">Identity Providers</a> like OpenID Connect, SAML 2.0, OAuth 2.0, Azure AD, LinkedIn, Facebook, Google, Twitter.  </li><li>Enable site performance managed with <a href="https://learn.microsoft.com/en-us/power-apps/maker/portals/configure/configure-cdn" target="_blank" rel="noopener noreferrer">CDN</a></li><li>Enable <a href="https://learn.microsoft.com/en-us/power-pages/security/web-application-firewall" target="_blank" rel="noopener noreferrer">Azure Web Application Firewall (WAF)</a> to safeguard against common threats or setup IP Range to bring your own WAF or limit the site access</li><li>Set <a href="https://learn.microsoft.com/en-us/power-pages/security/site-visibility" target="_blank" rel="noopener noreferrer">Site Visibility</a> while the project team is working on initial stages of the solution without potential of exposing it outside of the working team</li><li>Enable and setup <a href="https://learn.microsoft.com/en-us/power-pages/configure/progressive-web-apps" target="_blank" rel="noopener noreferrer">Progressive Web Application (PWA) configuration</a> </li><li>Integrate reporting using <a href="https://learn.microsoft.com/en-us/power-apps/maker/portals/admin/set-up-power-bi-integration" target="_blank" rel="noopener noreferrer">Power BI AAD and Power BI Embedded (with RLS)</a> features</li><li>Use <a href="https://learn.microsoft.com/en-us/power-pages/go-live/checklist#go-live-checklist-in-the-set-up-workspace" target="_blank" rel="noopener noreferrer">Go live checklist</a> to make sure your website is ready for production use.</li></ul></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="low-code--pro-code">Low Code &amp; Pro Code<a class="hash-link" href="#low-code--pro-code" title="Direct link to heading">​</a></h2><p>Power Pages also provides dedicated pro-developer tooling for fusion team members who are <strong>technology experts</strong> and want to customize the experience based on the specific business needs that are not supported via low code/no code experience.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="support-for-code-editor-visual-studio-code--visual-studio-code-for-web">Support for code editor: Visual Studio Code &amp; Visual Studio Code for web<a class="hash-link" href="#support-for-code-editor-visual-studio-code--visual-studio-code-for-web" title="Direct link to heading">​</a></h3><p>Right in the same Power Pages Studio makers can switch between Studio low code experience to <strong><a href="https://learn.microsoft.com/en-us/power-pages/configure/visual-studio-code-editor" target="_blank" rel="noopener noreferrer">Visual Studio Code for Web</a></strong> an Online code editor for web pro-developer experience in case they want to do advance customization. Alternatively, makers can go into advanced configuration via Portal Management Apps.</p><p><img loading="lazy" alt="Visual Studio Code for web animation" src="/Low-Code/assets/images/01 - VSCode for web blog demo 01-25b3d5eda8a89e3d3b85e21c67b64021.gif" width="1958" height="1056" class="img_ev3q"></p><p>Makers who prefer working with <strong>Visual Studio Code desktop</strong> can use <a href="https://learn.microsoft.com/en-us/power-apps/maker/portals/vs-code-extension" target="_blank" rel="noopener noreferrer">Power Platform Tools extension</a> to unlock many Power Pages specific features like Autocomplete support, <a href="https://learn.microsoft.com/en-us/power-apps/maker/portals/power-apps-cli" target="_blank" rel="noopener noreferrer">Power Apps CLI</a> support, Power Pages file icon theme and more. </p><p><img loading="lazy" alt="Visual Studio Code for desktop animation" src="/Low-Code/assets/images/01 - VSCode for desktop-610fd787e56fb5bfadf849cd292b10d2.gif" width="1822" height="1229" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="extend-power-pages-site-with-web-development-technologies">Extend power pages site with web development technologies<a class="hash-link" href="#extend-power-pages-site-with-web-development-technologies" title="Direct link to heading">​</a></h3><p>Familiar web development technologies like JavaScript, CSS and HTML to build custom design and interaction experience. Power Pages also provide extensibility points which pro-developers can leverage for their use case.</p><ul><li>Tailor to the branding needs the stylesheet via CSS </li><li>Add just the right custom business logic via JS Script </li><li>Write custom UI or use any UI framework (React, Angular, etc)</li><li>Add dynamic content using <a href="https://learn.microsoft.com/en-us/power-apps/maker/portals/liquid/liquid-overview" target="_blank" rel="noopener noreferrer">Liquid</a></li><li>Use <a href="https://learn.microsoft.com/en-us/power-apps/maker/portals/web-api-overview" target="_blank" rel="noopener noreferrer">Power Pages Web APIs</a> to bind data in custom UI or perform more complex data operations safely using Power Pages security model </li><li>Create re-usable Code Components or use existing <a href="https://learn.microsoft.com/en-us/power-apps/maker/portals/component-framework" target="_blank" rel="noopener noreferrer">Code Component (PCF)</a> allowing your team to use similar skills from other areas of Power Platform </li><li>Integrate with external data sources using Virtual tables</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="cli-support">CLI support<a class="hash-link" href="#cli-support" title="Direct link to heading">​</a></h3><p>Developers can also <strong>download the Website as local files</strong> via <a href="https://learn.microsoft.com/en-us/power-apps/maker/portals/power-apps-cli" target="_blank" rel="noopener noreferrer">Power Platform Command Line Interface (aka PAC CLI)</a> translated into physical files, so popular tools like desktop Visual Studio or Visual Studio Code can be used and it’s easy to work with files in source control. </p><p><img loading="lazy" alt="Use Power Platform CLI for Power Pages" src="/Low-Code/assets/images/01 - PowerPagesSupport_for_PAC_CLI-fbc193ec8d86ba66ac5b3f7e602f2d33.png" width="1107" height="669" class="img_ev3q"></p><p>PAC CLI downloads Power Pages website customization into files and makes website friendly for source control. So, teams can use GitHub actions, Azure DevOps to standardize their deployment workflow and improve productivity.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="supporting-the-large-teams">Supporting the large teams<a class="hash-link" href="#supporting-the-large-teams" title="Direct link to heading">​</a></h2><p>It is important to set up automated CI/CD (continuous integration and continuous delivery) pipelines when a large team is working on a project. So, teams can catch bugs in the initial stages. This improves the project quality and increases team productivity by reducing the manual steps to perform these activities. </p><p>Power pages supports tooling required for CI/CD setup. And this includes</p><ul><li>Native integration with <a href="https://learn.microsoft.com/en-us/power-pages/configure/portals-alm" target="_blank" rel="noopener noreferrer">GitHub Actions and Azure DevOps</a></li><li>Support for <a href="https://learn.microsoft.com/en-us/power-apps/maker/portals/power-apps-cli#use-deployment-profile" target="_blank" rel="noopener noreferrer">deployment profile</a> which can be used for custom deployment on Dev/Test/Production environments.</li><li>Easy to use any web test framework (Example: Selenium)</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What’s Next?<a class="hash-link" href="#whats-next" title="Direct link to heading">​</a></h2><ul><li><p>Signing up for the free <strong><a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer">Power Apps Developer Plan</a></strong> so you have access to the Power Platform and you can try <a href="https://powerpages.microsoft.com" target="_blank" rel="noopener noreferrer">Microsoft Power Pages</a></p></li><li><p>Watch the Power Pages session from <a href="https://learn.microsoft.com/events/learn-events/Powerful-Devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Powerful Devs 2023 Conference</a></p></li><li><p>Watch the Power Pages session from Microsoft Ignite 2022 from <a href="https://www.youtube.com/watch?v=eOV3aXolYWs" target="_blank" rel="noopener noreferrer">Power Pages: Low-Code Web Development | BRK40 - YouTube</a></p></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li><a href="https://learn.microsoft.com/power-pages/training-videos/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Video</strong>: Getting started videos</a></li><li><a href="https://learn.microsoft.com/training/paths/power-pages-get-started/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Training</strong>: Power Pages training</a></li><li><a href="https://learn.microsoft.com/power-pages/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Documentation</strong>: Microsoft Power Pages documentation</a></li><li><a href="https://powerpages.microsoft.com/blog/" target="_blank" rel="noopener noreferrer"><strong>Blog</strong>: Microsoft Power Pages Blog</a></li><li><a href="https://powerusers.microsoft.com/t5/Microsoft-Power-Pages-Community/ct-p/MPPCommunity" target="_blank" rel="noopener noreferrer"><strong>Community</strong>: Microsoft Power Pages Community</a></li></ul>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>power pages</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
        </item>
        <item>
            <title><![CDATA[17. Build a PCF Control]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day17</link>
            <guid>2023-day17</guid>
            <pubDate>Fri, 17 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Build a PCF code component step by step]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 17</code> of #30DaysOfLowCode!</p><p>The theme for this week is <strong>User Interface</strong> and we're ending it off with a quick tutorial on PCF Components! Yesterday, I wrote about the <a href="https://microsoft.github.io/Low-Code/blog/2023-day16" target="_blank" rel="noopener noreferrer">Power Apps Component Framework</a> and highlighted why you would want to use it, what the advantages are, as well as the composition of a PCF Component. Today, as promised, we'll be building a simple code component step-by-step.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>Power Apps Component Framework Recap</li><li>What are we building today?</li><li>Let's make a Code Component!</li><li>Test and Run your component </li><li>Where to from here?</li><li><strong>Exercise</strong>: Training - <a href="https://aka.ms/LCF/BuildMorePCF" target="_blank" rel="noopener noreferrer">Use advanced features with Power Apps component framework</a></li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Low Code February Collection</a></li></ul><p><img loading="lazy" alt="Feb 17" src="/Low-Code/assets/images/30-17-db06e4f5afaea5a9f6a2db7f321aea36.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="power-apps-component-framework-recap">Power Apps Component Framework Recap<a class="hash-link" href="#power-apps-component-framework-recap" title="Direct link to heading">​</a></h2><p>As mentioned in yesterday's blog, Power Apps Component Framework (PCF) empowers professional or traditional developers and app makers to create reusable code components for Canvas Apps and Model-Driven Apps. Sometimes, as app makers, we might reach certain limitations when it comes to building consistent, eye-catching but functional user experiences. The out-of-the-box controls within Power Apps might not fit all of our needs or maybe, we just want to stretch Power Apps' capabilities a little further. With PCF, you can build code components which are essentially visual controls that help you create a more customised user interface.</p><p><img loading="lazy" alt="A gif showing PCF Code Components in action" src="/Low-Code/assets/images/code-components-a964e847530867a5c8b9702ed8598045.gif" width="2540" height="1312" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-are-we-building-today">What are we building today?<a class="hash-link" href="#what-are-we-building-today" title="Direct link to heading">​</a></h2><p>So, with Power Apps, there is generally a large amount of data that end users input into the app via a Text Input control. However, as we can see in this <a href="https://aka.ms/LCF/TextInputControl" target="_blank" rel="noopener noreferrer">reference page</a>, there is no "auto height" property. What I mean is whenever you use a Text Input, and you have a lot of text, the text input does not inherently have the ability to increase its own height based on the amount of text that you have. The normal behaviour here is that the Text Input will have a scrollbar that you can use to navigate through the large amount of text.</p><p><img loading="lazy" alt="An image showing the scroll bar on a Power Apps text input control" src="/Low-Code/assets/images/Scrollbar-e8b31effbc57ecb55e1a4a54c03d846c.png" width="900" height="481" class="img_ev3q"></p><p>This is the perfect opportunity for a professional developer to use their skills to solve this "low code" problem. And just to make sure, I'm not saying that a low code developer does not have the ability to create some sort of walkaround for this problem - we are just looking at this from the perspective of a professional developer and how they can contribute to Power Platform Solutions. Also, by creating a code component, app makers will be able to use this throughout all of their Power Apps. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="lets-make-a-code-component">Let's Make a Code Component!<a class="hash-link" href="#lets-make-a-code-component" title="Direct link to heading">​</a></h2><p>Time to get started building with the Power Apps Component Framework, but first - </p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="pre-requisites">Pre-Requisites<a class="hash-link" href="#pre-requisites" title="Direct link to heading">​</a></h3><blockquote><p><strong>Note</strong>: This tutorial was completed using a Windows 11 Machine.</p></blockquote><p>Before we get started, we will need to install the following:</p><ol><li>Install <a href="https://aka.ms/LCF/VSCode" target="_blank" rel="noopener noreferrer"><strong>Visual Studio Code (VS Code)</strong></a> and ensure that the "Add to PATH" option is selected during installation.</li><li>Install <a href="https://nodejs.org/en/download/" target="_blank" rel="noopener noreferrer"><strong>Node.js</strong></a> (comes with npm). I recommend that you use a LTS (Long-Term Support) version.</li><li>Once VS Code is installed, go ahead and download and install the <a href="https://aka.ms/LCF/InstallPowerCLI" target="_blank" rel="noopener noreferrer"><strong>Power Platform Tools</strong></a> VS Code extension.</li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="configure-power-apps-environment">Configure Power Apps Environment<a class="hash-link" href="#configure-power-apps-environment" title="Direct link to heading">​</a></h3><p>Since we are building a code component for Power Apps, we need to make sure our Power Apps environment is prepared and configured. </p><ol><li><p>If you don't have a <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"> <strong>Power Apps Developer Plan</strong> </a>yet 👀, go ahead and sign up for one. It's FREE. </p></li><li><p>Once that's done, log into the <strong><a href="https://admin.powerplatform.microsoft.com" target="_blank" rel="noopener noreferrer">Power Platform Admin Center</a></strong> </p><ul><li>Select "<strong>Environments</strong>" on the left-hand side </li><li>Click on the development environment that you've just created above. This will usually have the name: <strong>*<!-- -->[Your Name]<!-- -->'s Environment</strong>.*</li></ul><p><img loading="lazy" alt="An image showing instructions to get to the Developer Environment" src="/Low-Code/assets/images/Image1-16b4b335bc23851e831fc776875f86d0.png" width="867" height="680" class="img_ev3q"></p></li><li><p>Select "<strong>Settings</strong>" from the top command bar and navigate to Product &gt; Features &gt; Power Apps component framework for canvas apps. </p></li><li><p>Activate the Toggle On setting for the <strong>Allow publishing of canvas apps with code components</strong> feature.</p></li></ol><p><img loading="lazy" alt="An image showing the toggle on setting for PCF Components in Power Apps" src="/Low-Code/assets/images/Image2-aad149f5ae1e7ab80d6c19538b11f075.png" width="807" height="220" class="img_ev3q"></p><ol start="5"><li>Scroll down and select <strong>Save</strong>. </li></ol><p>Now we're good to go! 😃</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-a-component-folder">Create a Component Folder<a class="hash-link" href="#create-a-component-folder" title="Direct link to heading">​</a></h3><p>We will need a working folder to store our Code Component solution. For ease of use, I usually create a folder in a place where I can easily access from a Command Prompt. On my computer, I've created a new folder called <strong>LowCodeFeb</strong> directly in the C:\ drive. So, I will be using <code>C:\LowCodeFeb</code>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-a-new-component-project">Create a New Component Project<a class="hash-link" href="#create-a-new-component-project" title="Direct link to heading">​</a></h3><ol><li>Start <strong>Visual Studio Code</strong></li><li>Select <strong>Terminal</strong> and select <strong>New Terminal</strong>.</li><li>Change directory to your working folder.</li></ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">cd</span><span class="token plain"> C:</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">LowCodeFeb</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ol start="4"><li>From your LowCodeFeb directory, create a directory named <strong>dynamicTextInput-pcf</strong>.</li></ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> dynamicTextInput-pcf</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ol start="5"><li>Change directory to <strong>dynamicTextInput-pcf</strong>.</li></ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">cd</span><span class="token plain"> dynamicTextInput-pcf</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ol start="6"><li>Initialize your component project by using Power Platform CLI with the following command:</li></ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pac pcf init --namespace SampleNamespace --name DynamicInputPCF --template field</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This image shows an example of the output you should see:</p><p><img loading="lazy" alt="An image showing the output of initializing your component with the Power Platform CLI" src="/Low-Code/assets/images/Image3-152d40b5487b4bdfb50cf36d4d4abe5d.png" width="880" height="124" class="img_ev3q"></p><ol start="7"><li>Install the project build tools by using the command <code>npm install</code>. Don't worry about any warnings you may see at this point. </li></ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ol start="8"><li>Once completed, run the command below to open the component project in Visual Studio Code.</li></ol><div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">code -a .</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Your opened project should look like this so far:</p><p><img loading="lazy" alt="An image showing the code component VS Code project structure" src="/Low-Code/assets/images/IMAGE4-b29cf3c5179a39f7b8700e805850221f.png" width="320" height="324" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="update-code-components-manifest">Update Code Component's Manifest<a class="hash-link" href="#update-code-components-manifest" title="Direct link to heading">​</a></h3><p>Remember, from yesterday's blog - we established that the manifest is an XML file that defines the metadata and configuration of a code component. The manifest is an important file for a PCF code component because it is used by the Power Apps authoring tools to register and manage the component. This also includes the kind of data which is to be configured (field or dataset) and any other properties that can be configured in the application when the component is added.</p><ol><li>Expand the <strong>DynamicInputPCF</strong> folder and open the <strong>ControlManifest.Input.xml</strong> file.</li><li>Near the top of the file, Change the version to <strong>1.0.0</strong> and description-key to <strong>Dynamic Input</strong>.</li></ol><p><img loading="lazy" alt="An image showing the edited control tag in the project manifest" src="/Low-Code/assets/images/Image5-d71a04df36b3043c044861153a5e5ecb.png" width="1315" height="281" class="img_ev3q"></p><ol start="3"><li>Locate the <strong>&lt;property ... /&gt;</strong> node and replace it with this:</li></ol><div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">property</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">TextValue</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">display-name-key</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">TextValue</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">description-key</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">TextValueDescription</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">of-type-group</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">strings</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">usage</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">bound</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">required</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">true</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">property</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">AutoHeightValue</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">display-name-key</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">AutoHeightValue</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">description-key</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">AutoHeightValueDescription</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">of-type</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Whole.None</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">usage</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">bound</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">required</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">true</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">type-group</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">strings</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">type</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">SingleLine.Text</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">type</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">type</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">SingleLine.TextArea</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">type</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">type</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Multiple</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">type</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">type-group</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ol start="4"><li>Locate the <strong>&lt;resources ... /&gt;</strong> node and include a reference to a CSS file named DynamicInputPCF.css that you'll soon create.</li></ol><div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">css</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">path</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">css/DynamicInputPCF.css</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">order</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">1</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ol start="5"><li>Save your changes by selecting <strong>File</strong> and then <strong>Save</strong>.</li></ol><p><img loading="lazy" alt="An image showing the process of saving your work." src="/Low-Code/assets/images/Image6-18838ad7dd72ec7d7bd9a5bcb0881885.png" width="378" height="417" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="add-styling-to-your-code-component">Add styling to your code component<a class="hash-link" href="#add-styling-to-your-code-component" title="Direct link to heading">​</a></h3><p>Now we're going to be adding some basic styling to our component. Just to get a feel of what the process is like and how you can further customise code components.</p><ol><li>Make sure you still have the <strong>ControlManifest.Input.xml</strong> file selected and then select <strong>New Folder</strong>.</li></ol><p><img loading="lazy" alt="An image showing the process of adding a new folder in VS Code." src="/Low-Code/assets/images/Image7-41f15e7cc587dfbedf9da014981457de.png" width="330" height="155" class="img_ev3q"></p><ol start="2"><li>Name the new folder <strong>css</strong> and then select the <strong>css</strong> folder you've created and select <strong>New File</strong>.</li></ol><p><img loading="lazy" alt="An image showing the process of adding a new file in VS Code." src="/Low-Code/assets/images/Image8-d37f1ca69947c4fc7524912cb9e8121c.png" width="298" height="164" class="img_ev3q"></p><ol start="3"><li>Name the new file <strong>DynamicInputPCF.css</strong></li><li>Open DynamicInputPCF.css and paste the following CSS:</li></ol><div class="language-css codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-css codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token selector class" style="color:#00009f">.DynamicInputPCF</span><span class="token selector" style="color:#00009f"> textarea</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">padding</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token unit">px</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">box-sizing</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> border-box</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">width</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token unit">%</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token selector class" style="color:#00009f">.DynamicInputPCF</span><span class="token selector" style="color:#00009f"> textarea</span><span class="token selector pseudo-class" style="color:#00009f">:focus</span><span class="token selector punctuation" style="color:#393A34">,</span><span class="token selector" style="color:#00009f"> </span><span class="token selector class" style="color:#00009f">.DynamicInputPCF</span><span class="token selector" style="color:#00009f"> textarea</span><span class="token selector pseudo-class" style="color:#00009f">:enabled</span><span class="token selector pseudo-class" style="color:#00009f">:hover</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">border</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token unit">px</span><span class="token plain"> solid </span><span class="token color">black</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ol start="5"><li>Select <strong>File</strong> and select <strong>Save</strong>.</li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="build-your-code-component">Build your code component<a class="hash-link" href="#build-your-code-component" title="Direct link to heading">​</a></h3><p>In order to ensure that the right TypeScript types are generated to match the properties in your ControlManifest.xml document, we need to run a build on our component. </p><p>Return to the terminal and perform a build b using the following command:</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> run build</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Once the build is successful, you'll notice in the project folder, that the component is compiled into the <strong>out/controls/DynamicInputPCF</strong> directory. The results of this compilation are:</p><ul><li><strong>css</strong> folder</li><li><strong>bundle.js</strong>  - Bundled component source code</li><li>and the <strong>ControlManifest.xml</strong> which is the actual component manifest file that is uploaded to the Microsoft Dataverse organization</li></ul><p>With those artifacts generated, we can now start implementing our component logic.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="implement-components-logic">Implement Component's Logic<a class="hash-link" href="#implement-components-logic" title="Direct link to heading">​</a></h3><p>Let's get straight into it. </p><ol><li>Open the <strong>index.ts</strong> file and insert the following variables above the constructor method.</li></ol><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// The PCF context object</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> context</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ComponentFramework</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Context</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">IInputs</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// The wrapper div element for the component</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> container</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> HTMLDivElement</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">/* The callback function to call whenever your code </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">has made a change to a bound or output property */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">notifyOutputChanged</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//Variable to track the height of the control</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">height</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">textarea</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> HTMLTextAreaElement</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">defaultLoaded </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ol start="2"><li>Find the <strong>init</strong> method and replace its contents with this:</li></ol><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">//Track all elements</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">container </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> container</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">context </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">notifyOutputChanged </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> notifyOutputChanged</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">textarea </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">createElement</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"textarea"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">textarea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rows </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">textarea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">style</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">resize </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'none'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">textarea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">style</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">overflowY </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'hidden'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">textarea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">oninput </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">onTextAreaInput</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">textarea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">onchange </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">onTextAreaChanged</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">container</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">appendChild</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">textarea</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>After pasting the code above, you may have a couple of errors. No need to worry - we'll be defining a few methods, in a moment, which will clear these errors.</p><ol start="3"><li>Underneath the <strong>init</strong> method, add the following: </li></ol><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/* These methods are responsible for telling the framework </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">that there is a new value in the text input and then it </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">starts calculating the new height */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">onTextAreaInput </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">autoSizeTextArea</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">onTextAreaChanged </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">notifyOutputChanged</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">autoSizeTextArea</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">textarea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">style</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">height </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'auto'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> newHeight </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">textarea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">scrollHeight</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'px'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> heightChanged </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> newHeight </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">textarea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">style</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">height</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">textarea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">style</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">height </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> newHeight</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">heightChanged</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">notifyOutputChanged</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ol start="4"><li>Look for the <strong>updateView</strong> method and add the following:</li></ol><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> value </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">parameters</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">TextValue</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> disabled </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">mode</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">isControlDisabled</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> masked </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">value </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> value</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">security</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        masked </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">value</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">security</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">readable</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        disabled </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> disabled </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> masked </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">value</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">security</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">editable</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Update text value if input value changes</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">defaultLoaded </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">updatedProperties</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">indexOf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"TextValue"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">defaultLoaded </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> newValue </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> masked </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"****"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> value</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">raw </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">textarea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">value </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> newValue</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">autoSizeTextArea</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ol start="5"><li>And one of the last major things we need to do is find and update the <strong>getOutputs</strong> method with the following code:</li></ol><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">/* This provides the output/bound properties back to </span><br></span><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">the PCF after notifyOutputChanged() has been called. */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain">  height </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Number</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">parseInt</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">textarea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">style</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">height</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    TextValue</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">  </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">textarea</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">value</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    AutoHeightValue</span><span class="token operator" style="color:#393A34">:</span><span class="token plain">  height</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ol start="6"><li>Go ahead and <strong>Save</strong> everything. </li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="test-and-run-your-component">Test and Run your Component<a class="hash-link" href="#test-and-run-your-component" title="Direct link to heading">​</a></h2><p>Now that we have configured and built out the component logic, let's give it a go! Now is a great time to test your component <em>before</em> you import it into Power Apps. </p><ol><li>Let's return to the <strong>Terminal</strong> and rebuild our component. </li></ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> run build</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>If you've followed everything correctly, the build should succeed. If not, feel free to take some time and check if you've copied all code correctly. </p><p>Now we get to run and test our component in a <em>test harness</em> that simulates the Power Apps runtime, so you get to see how your component behaves. </p><ol start="2"><li>In the <strong>Terminal</strong> once more, run the following command: </li></ol><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> start</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>A new browser window should automatically load the test harness. </p><p><img loading="lazy" alt="An image showing the Power Apps Test Harness" src="/Low-Code/assets/images/Image9-df3ec929ded1cb10e277054d09e45703.png" width="1920" height="929" class="img_ev3q"></p><p>Go ahead and write some text directly into the text input (1) on the right. Be sure to press the <strong>Enter</strong> key a couple of times to see the text input automatically resizing. You can also play with the pre-set width and height properties (2) to find how the text input behaves under various conditions. Also, you'll notice that the AutoHeightValue (3) dynamically changes as you're writing as well. </p><p><img loading="lazy" alt="An image showing the Power Apps Test Harness after changes" src="/Low-Code/assets/images/Image10-46df52739ad422ee5ec28d3150a2aad0.png" width="1919" height="923" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="where-to-from-here">Where to from here?<a class="hash-link" href="#where-to-from-here" title="Direct link to heading">​</a></h2><p>At face value, it doesnt seem like much however I wanted to give you a just a taste of what is possible when professional developers use their skills and their tools to contribute to Power Platform Solutions. Once a code component is built and you've verified that it works. The next step is to create a solution package and import that into the Power Apps Environment.</p><p>See <a href="https://learn.microsoft.com/power-apps/developer/component-framework/import-custom-controls?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">this article</a> for guidance on how to package a code component and then when you want to add your code component to a Power App, you can read the guidance for <a href="https://learn.microsoft.com/power-apps/developer/component-framework/component-framework-for-canvas-apps?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Canvas Apps</a> and/or <a href="https://learn.microsoft.com/power-apps/developer/component-framework/code-components-model-driven-apps?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Model-Driven Apps</a>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="exercise">Exercise<a class="hash-link" href="#exercise" title="Direct link to heading">​</a></h2><p>Try the exercise in this <a href="https://aka.ms/LCF/BuildMorePCF" target="_blank" rel="noopener noreferrer">learn module</a> where you will get to learn EVEN MORE about code components. You'll be able to get details on how to address more complex scenarios as it applies to the PCF. What makes this exciting is that it covers how to use client frameworks such as React and Angular within a component, along with how to address scenarios such as file upload, localization, and integration with the Microsoft Dataverse Web API.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li><strong>Exercise</strong>: Training - <a href="https://aka.ms/LCF/BuildMorePCF" target="_blank" rel="noopener noreferrer">Use advanced features with Power Apps component framework</a></li><li><strong>Documentation</strong>: <a href="https://aka.ms/LCF/PCFDocs" target="_blank" rel="noopener noreferrer">Power Apps Component Framework Overview</a></li><li><strong>Watch</strong>: <a href="https://learn.microsoft.com/shows/the-low-code-revolution/?wt.mc_id=82054_collection_webpage_ece&amp;ns-enrollment-type=Collection&amp;ns-enrollment-id=8q5jhr1y0jeqj6?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">The Low Code Revolution Show</a></li><li><strong>Watch</strong> all of the <a href="https://www.youtube.com/live/4VK1CJYR2W4" target="_blank" rel="noopener noreferrer">Powerful Devs Conference</a>  sessions on demand to learn from experts how you, as a developer, can leverage the Power Platform to build applications faster and with far less effort.</li><li>Low Code February <a href="https://learn.microsoft.com/users/nityan/collections/xz6ehr2mx031y0?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Learn Collection</a>: Collection of resources to go from learning Power Platform Fundamentals, to understanding the Dataverse and working in Fusion Development teams.</li></ul><p>Also consider -</p><ul><li>Signing up for the free <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer">Power Apps Developer Plan</a> so you have access to the Power Platform.</li><li>Enrolling in the <a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer">Cloud Skills Challenge</a> to skill up on key cloud technologies with free, self-guided learning courses, and start climbing the leaderboard!</li></ul><p><img loading="lazy" alt="Campaign Banner" src="/Low-Code/assets/images/30-banner-d9bab2b92d758942447a4cbc50aef715.png" width="1334" height="560" class="img_ev3q"></p>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>pcf</category>
            <category>power apps component frameworkpower-platform</category>
        </item>
        <item>
            <title><![CDATA[16. Intro to PCF Control]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day16</link>
            <guid>2023-day16</guid>
            <pubDate>Thu, 16 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Power Component Framework can be used to enhance the user experience for users working with data on forms, views, dashboards, and even canvas app screens. Learn more in #LowCodeFebruary.]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 16</code> of #30DaysOfLowCode!</p><p>The theme for this week is <strong>User Interface</strong>! Yesterday, <a href="https://github.com/juliajuju93" target="_blank" rel="noopener noreferrer">Julia</a> spoiled us with a blog that highlighted <a href="https://microsoft.github.io/Low-Code/blog/2023-day15" target="_blank" rel="noopener noreferrer">OpenAI and the Power Platform</a>. Today we'll explore the topic of the <em>Power Apps Component Framework</em>! </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>What is the <em>Power Apps Component Framework (PCF)</em>?</li><li>Why would you want to <em>use</em> PCF?</li><li>What are the <em>advantages</em>?</li><li>The <em>composition</em> of a PCF component</li><li><strong>Exercise</strong>: Training - <a href="https://aka.ms/LCF/BuildPCF" target="_blank" rel="noopener noreferrer">Build a Power Apps component</a></li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Low Code February Collection</a></li></ul><p><img loading="lazy" alt="Speaker Card Feb 15" src="/Low-Code/assets/images/30-16-acbb5ff319f79eedeb51af5c1dfb68a8.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-the-power-apps-component-framework">What is the Power Apps Component Framework?<a class="hash-link" href="#what-is-the-power-apps-component-framework" title="Direct link to heading">​</a></h2><p>Power Apps Component Framework (PCF) empowers professional or traditional developers and app makers to create reusable code components for Power Apps. What's great about these code components is that they work for both <a href="https://aka.ms/LCF/Components4Canvas" target="_blank" rel="noopener noreferrer">Canvas Apps</a> and <a href="https://aka.ms/LCF/Components4ModelDriven" target="_blank" rel="noopener noreferrer">Model-Driven Apps</a> and they can be used to enhance the user experience for users working with data on forms, views, dashboards, and even canvas app screens. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-would-you-want-to-use-pcf">Why would you want to use PCF?<a class="hash-link" href="#why-would-you-want-to-use-pcf" title="Direct link to heading">​</a></h2><p>Sometimes, as app makers, we might reach certain limitations when it comes to building consistent, eye-catching but functional user experiences. The out-of-the-box controls within Power Apps might not fit all of our needs or maybe, we just want to stretch Power Apps' capabilities a little further. With PCF, you can build code components which are essentially visual controls that help you create a more customised user interface.</p><p><img loading="lazy" alt="A gif showing PCF Code Components in action" src="/Low-Code/assets/images/code-components-a964e847530867a5c8b9702ed8598045.gif" width="2540" height="1312" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="types-of-pcf-components">Types of PCF Components<a class="hash-link" href="#types-of-pcf-components" title="Direct link to heading">​</a></h3><p>These code components also allow for the integration of business logic which complements the visualisation for unique scenarios. There are two main types of components that you can create:</p><ul><li><strong>Field</strong>: A custom control for a field on a form. If you have a numeric value, instead of a simple text box with a number, you can represent it as a slider code component.</li><li><strong>Dataset</strong>: A custom control to display rows of data. If you would like to go the more advanced route, you could take a boring dataset and represent that as a specialised interactive graph instead of a normal table. </li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-are-the-advantages-of-using-pcf">What are the advantages of using PCF?<a class="hash-link" href="#what-are-the-advantages-of-using-pcf" title="Direct link to heading">​</a></h2><p>With the PCF's ability to tailor-make your apps to fit your specific needs and requirements, there must be other advantages to take note of, right? Of course! These include;</p><ul><li>When it comes to <strong>integration</strong>, you have access to a rich set of framework APIs, 3rd-party libraries, and services that lets you incorporate external functionality and exposes capabilities like component lifecycle management, contextual data, and metadata.</li><li>Drastically improve and enhance the <strong>user experience</strong> with seamless server access via Web API, utility and data formatting methods; device features like camera, location, and microphone; and easy-to-invoke user experience elements like dialogs, lookups, and full-page rendering.</li><li>The <strong>reusability</strong> aspect because PCF components can be easily reused across multiple Power Apps reducing the development time and cost associated with creating custom functionality for each individual app.</li><li>Components built with PCF are optimised for <strong>performance</strong> due to the fact that they are designed to be lightweight ensuring that they do not slow down the overall application.</li><li>Use of <strong>responsive</strong> web design principles to provide an optimal viewing and interaction experience for any screen size, device, or orientation.</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="web-resources-vs-pcf">Web Resources vs PCF<a class="hash-link" href="#web-resources-vs-pcf" title="Direct link to heading">​</a></h3><p>Before the PCF existed, HTML web resources were used to provide any type of custom presentation to a Power Apps' form. However, with the introduction of PCF, code components can now be bundled into a single solution file and rendered as part of the same context at the same time as any other components, providing a seamless experience for the user.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-composition-of-a-pcf-component">The composition of a PCF component<a class="hash-link" href="#the-composition-of-a-pcf-component" title="Direct link to heading">​</a></h2><p>A <a href="https://aka.ms/LCF/SolutionConcepts" target="_blank" rel="noopener noreferrer">solution</a> can have code components, which can then be imported into a Dataverse environment. Professional / Traditional developers and app makers can then specify columns, subgrids, views, and dashboard subgrids to use in place of default components after importing the solution containing the code components. These coding elements can be added to Canvas Apps as well as Model-Driven Apps.</p><p>Code Components consists of 3 elements;</p><ul><li>Manifest</li><li>Component implementation</li><li>Resources</li></ul><p><img loading="lazy" alt="Image showing the 3 main key areas of a PCF Component" src="/Low-Code/assets/images/PCF-KeyAreas-43385e089e983b125376bb9f9a39515f.png" width="840" height="618" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="manifest">Manifest<a class="hash-link" href="#manifest" title="Direct link to heading">​</a></h3><p>The manifest (<code>ControlManifest.Input.xml</code>) is the file that defines the metadata and configuration of a code component. It is an XML document that describes:</p><ul><li><strong>name</strong>: The name of the component, which is used to identify it within the Power Apps authoring tools.</li><li><strong>description</strong>: A brief description of the component, which helps users understand what it does.</li><li><strong>version</strong>: The version number of the component, which is used to track changes and updates.</li><li><strong>resource files</strong>: A list of resource files that the component needs.</li></ul><p>The manifest is an important file for a PCF code component because it is used by the Power Apps authoring tools to register and manage the component. This also includes the kind of data which is to be configured (field or dataset) and any other properties that can be configured in the application when the component is added.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="component-implementation">Component implementation<a class="hash-link" href="#component-implementation" title="Direct link to heading">​</a></h3><p>The component implementation in (PCF) refers to the code that defines the behaviour and appearance of the component. The component implementation is typically written in TypeScript or JavaScript and is compiled into a single solution that is loaded into the Power Apps authoring and runtime environments.</p><p>The <a href="https://aka.ms/LCF/PowerCLI" target="_blank" rel="noopener noreferrer">Power Platform CLI</a> will auto-generate an <code>index.ts</code> file that includes stubbed implementations for methods described in the code component interface. These methods control the lifecycle of the code component and can include, but is not limited to;</p><ul><li><strong>init</strong>: This is the entry point for the component and is called when the component is first loaded. The initialization function is responsible for setting up the component and registering any event listeners or other functionality.</li><li><strong>updateView</strong>: This function is called whenever the component's properties or state changes. It is responsible for re-rendering the component's user interface to reflect the updated state.</li><li><strong>getOutputs</strong>: Called by the framework prior to a component receiving new data. </li><li><strong>destroy</strong>:  This method is invoked when the component is to be removed from the DOM tree. Use it for the cleanup and to release any memory that the component is using.</li></ul><p>Overall, the component implementation is responsible for defining the functionality and appearance of the component, and for integrating it into the Power Apps environment so that it can be used by app makers.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h3><p>With PCF components, resources refer to the files and assets that are used to support the component implementation to implement its visualization. Resources can include things like images, icons, stylesheets, and other files that are necessary for the component to function properly. These are typically organized into a separate folder within the component project and are referenced by the component implementation code as needed.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="exercise">Exercise<a class="hash-link" href="#exercise" title="Direct link to heading">​</a></h2><p>Try the exercise in this <a href="https://aka.ms/LCF/BuildPCF" target="_blank" rel="noopener noreferrer">learn module</a> where you will learn how to build your very first custom PCF component, create a code component solution package, and then test and debug the code component.</p><p>Also be sure to look out for tomorrow's blog where we will be building another PCF code component in a detailed step-by-step fashion. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources-1">Resources<a class="hash-link" href="#resources-1" title="Direct link to heading">​</a></h2><ul><li><strong>Exercise</strong>: Training - <a href="https://aka.ms/LCF/BuildPCF" target="_blank" rel="noopener noreferrer">Build a Power Apps component</a></li><li><strong>Documentation</strong>: <a href="https://aka.ms/LCF/PCFDocs" target="_blank" rel="noopener noreferrer">Power Apps Component Framework Overview</a></li><li><strong>Watch</strong>: <a href="https://learn.microsoft.com/shows/the-low-code-revolution/?wt.mc_id=82054_collection_webpage_ece&amp;ns-enrollment-type=Collection&amp;ns-enrollment-id=8q5jhr1y0jeqj6" target="_blank" rel="noopener noreferrer">The Low Code Revolution Show</a></li><li>Low Code February <a href="https://learn.microsoft.com/users/nityan/collections/xz6ehr2mx031y0?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Learn Collection</a>: Collection of resources to go from learning Power Platform Fundamentals, to understanding the Dataverse and working in Fusion Development teams.</li></ul><p>Also consider -</p><ul><li>Signing up for the free <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer">Power Apps Developer Plan</a> so you have access to the Power Platform.</li><li>Enrolling in the <a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer">Cloud Skills Challenge</a> to skill up on key cloud technologies with free, self-guided learning courses, and start climbing the leaderboard!</li></ul><p><img loading="lazy" alt="Campaign Banner" src="/Low-Code/assets/images/30-banner-d9bab2b92d758942447a4cbc50aef715.png" width="1334" height="560" class="img_ev3q"></p>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>pcf</category>
            <category>power-platform</category>
        </item>
        <item>
            <title><![CDATA[15. 🚀 OpenAI & Microsoft Power Platform]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day15</link>
            <guid>2023-day15</guid>
            <pubDate>Wed, 15 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Throughout this post, let's discuss how developers can leverage OpenAI's APIs to build next-gen application using Microsoft Power Apps. We will use DALL·E 2 (a new AI system model) to create realistic images and art from a description in natural language.]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 15</code> of #30DaysOfLowCode!</p><p>The theme for this week is <strong>OpenAI and Microsoft Power Platform</strong>. Over the past few weeks, social-media feeds and newsletters have been filled with stories and conversations about artificial intelligence (AI). ChatGPT and OpenAI were often center of these conversations and today we will take a look at an exciting OpenAI and Power Platform scenario. We will discuss how developers can leverage OpenAI's APIs to build next-gen application using Microsoft Power Apps. For our scenario, we will use DALL·E 2 (a new AI system model) to create realistic images and art from a text description in natural language.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li><a href="#what-is-openai">What is OpenAI</a></li><li><a href="#scenario---power-apps-integration-with-openai-and-azure-api-management">Scenario - Power Apps integration with GitHub and API Management Authorizations</a></li><li><a href="#scenario---power-apps-integration-with-openai-and-azure-api-management">Scenario Overview</a></li><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#step-1-add-openais-api-into-your-azure-api-management-instance">Step 1: Add OpenAI's API into your Azure API Management instance</a></li><li><a href="#step-2-configure-a-policy-in-azure-api-management">Step 2: Configure a policy in Azure API Management</a></li><li><a href="#step-3-create-a-custom-connector-via-azure-api-management">Step 3: Create a custom connector via Azure API Management</a></li><li><a href="#step-4-call-your-web-api-via-your-power-app">Step 4: Call your web API via your Power App</a></li><li><a href="#resources">Resources</a></li></ul><p><img loading="lazy" alt="Speaker Card" src="/Low-Code/assets/images/30-15-96338c53bc68ba61c71df358e72c9f5a.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-openai">What is OpenAI<a class="hash-link" href="#what-is-openai" title="Direct link to heading">​</a></h2><p>OpenAI is an AI research and deployment company. Developers can use OpenAI's APIs and build applications using their different trained <a href="https://platform.openai.com/docs/models/models" target="_blank" rel="noopener noreferrer">models</a>. OpenAI offers a spectrum of models with different levels of understanding or generating natural language or code. These models can be used for everything from content generation to semantic search and classification. Their current most popular model is <a href="https://platform.openai.com/docs/models/gpt-3" target="_blank" rel="noopener noreferrer">GPT-3</a> that can understand and generate natural language. For today's scenario, we will use <a href="https://openai.com/blog/dall-e/" target="_blank" rel="noopener noreferrer">DALL·E 2</a> (a new AI system model) to create realistic images and art from a text description in natural language.</p><blockquote><p><em>Note: Like GPT-3, DALL·E is a transformer language model. DALL·E is a 12-billion parameter version of GPT-3 trained to generate images from text descriptions, using a dataset of text–image pairs.</em></p></blockquote><h2 class="anchor anchorWithStickyNavbar_LWe7" id="scenario---power-apps-integration-with-openai-and-azure-api-management">Scenario - Power Apps integration with OpenAI and Azure API Management<a class="hash-link" href="#scenario---power-apps-integration-with-openai-and-azure-api-management" title="Direct link to heading">​</a></h2><h3 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-overview">Scenario Overview<a class="hash-link" href="#scenario-overview" title="Direct link to heading">​</a></h3><p>We want to build a Power App and leverage OpenAI's trained model DALL·E 2 to create a realistic image from only a text description. All of this can be done by just a simple API call for OpenAI's <a href="https://platform.openai.com/docs/api-reference/images/create" target="_blank" rel="noopener noreferrer">image creation</a>. We will use <a href="https://learn.microsoft.com/en-us/azure/api-management/api-management-key-concepts" target="_blank" rel="noopener noreferrer">Azure API Management</a> to help us securely expose OpenAI's API to the Microsoft Power Platform.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="azure-api-management">Azure API Management<a class="hash-link" href="#azure-api-management" title="Direct link to heading">​</a></h3><p>Web APIs have experienced an exponential increase in popularity and usage in the past few years.&nbsp;APIs exist at the intersection of business, products, and technologies and have transformed the way businesses interact with each other and the way they provide value to their customers. The need for organizations to securely manage, deploy, monitor and share APIs has increased as well. Azure API Management helps to create consistent and modern API gateways for existing back-end services hosted anywhere, secure and protect them from abuse and overuse, and get insights into usage and health.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="prerequisites">Prerequisites<a class="hash-link" href="#prerequisites" title="Direct link to heading">​</a></h3><ul><li>A running API Management instance. Complete the following&nbsp;<a href="https://learn.microsoft.com/en-us/azure/api-management/get-started-create-service-instance" target="_blank" rel="noopener noreferrer">Quickstart: Create a new Azure API Management service instance by using the Azure portal</a>.</li><li>Make sure you have a Power Apps or Power Automate <a href="https://learn.microsoft.com/en-us/power-apps/powerapps-overview#power-apps-for-developers" target="_blank" rel="noopener noreferrer">environment</a>.</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="step-1-add-openais-api-into-your-azure-api-management-instance">Step 1: Add OpenAI's API into your Azure API Management instance<a class="hash-link" href="#step-1-add-openais-api-into-your-azure-api-management-instance" title="Direct link to heading">​</a></h3><ol><li><p>Sign into Azure portal and go to your API Management instance.</p></li><li><p>In the left menu, select&nbsp;<strong>APIs &gt; + Add API</strong> and select <strong>HTTP</strong>.
<img loading="lazy" alt="Add API" src="/Low-Code/assets/images/addapi-5638e6105cd44f8b422bacd5c4381ea0.png" width="3652" height="2257" class="img_ev3q"></p></li><li><p>Enter the following settings. Then select&nbsp;<strong>Create</strong>.</p><table><thead><tr><th>Settings</th><th>Value</th></tr></thead><tbody><tr><td>Display name</td><td><em>openAIAPI</em></td></tr><tr><td>Name</td><td><em>openaiapi</em></td></tr><tr><td>Web service URL</td><td><em><a href="https://api.openai.com/v1" target="_blank" rel="noopener noreferrer">https://api.openai.com/v1</a></em></td></tr><tr><td>API URL suffix</td><td><em>openaiapi</em></td></tr></tbody></table></li><li><p>Navigate to the newly created API and select&nbsp;<strong>Add Operation</strong>. Enter the following settings and select&nbsp;<strong>Save</strong>.</p><table><thead><tr><th>Settings</th><th>Value</th></tr></thead><tbody><tr><td>Display name</td><td><em>createimage</em></td></tr><tr><td>URL for <strong>POST</strong></td><td><em>/images/generations</em></td></tr></tbody></table></li><li><p>Select your newly created operation and edit <strong>Frontend</strong>.</p></li></ol><p><img loading="lazy" alt="Edit Front End" src="/Low-Code/assets/images/editfrontend-4506c10b7026d9f808bcf2c1022a4058.png" width="3135" height="2118" class="img_ev3q"></p><ol start="6"><li><p>Next, we need to add a <strong>Request Body</strong> to our API. For this, within our Frontend section scroll down and select <strong>Request</strong>. Now <strong>Add representation</strong> and insert the following information:</p><table><thead><tr><th>Representations</th><th></th></tr></thead><tbody><tr><td>CONTENT TYPE</td><td>application/json</td></tr><tr><td>DEFINITION</td><td>{"prompt":"A cute baby sea otter","n":1,"size":"512x512"}</td></tr></tbody></table></li></ol><p><img loading="lazy" alt="Add Representation" src="/Low-Code/assets/images/addrepresentation-3fd55a00e778096ca33927bd1fb58731.png" width="3093" height="1699" class="img_ev3q"></p><ol start="7"><li><p>Next, we will add a Response to our API. Select <strong>Responses</strong> and insert the following information via <strong>+ Add response</strong> for <strong>200 OK</strong>:</p><table><thead><tr><th>Representations</th><th></th></tr></thead><tbody><tr><td>CONTENT TYPE</td><td>application/json</td></tr><tr><td>DEFINITION</td><td>{"created": 1589478378,"data": <!-- -->[{"url": "https://..."},{"url": "https://..."}]<!-- -->}</td></tr></tbody></table></li></ol><p><img loading="lazy" alt="Add Response" src="/Low-Code/assets/images/addresponse-0ee2490c4bba2be8bc90ac22d70b26e7.png" width="3128" height="1787" class="img_ev3q"></p><ol start="8"><li>Select <strong>Save</strong>.</li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="step-2-configure-a-policy-in-azure-api-management">Step 2: Configure a policy in Azure API Management<a class="hash-link" href="#step-2-configure-a-policy-in-azure-api-management" title="Direct link to heading">​</a></h3><ol><li>Next, we need to assign a policy to our API to make sure we are passing along an API key for authentication. </li></ol><blockquote><p><em>Note: OpenAI API uses API keys for authentication. Visit your <a href="https://platform.openai.com/account/api-keys" target="_blank" rel="noopener noreferrer">API Keys</a> page to retrieve the API key you'll use in your requests.</em></p></blockquote><ol start="2"><li>Select your operation and in the&nbsp;<strong>Inbound processing</strong>&nbsp;section, select the (<code>&lt;/&gt;</code>) (code editor) icon.</li></ol><p>Inbound policy:</p><div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">policies</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">inbound</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">base</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">set-header</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Authorization</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">exists-action</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">override</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">value</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">Bearer YOUR_API_KEY</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">value</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">set-header</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">inbound</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">backend</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">base</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">backend</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">outbound</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">base</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">outbound</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">on-error</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">base</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">on-error</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">policies</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ol start="3"><li>Select <strong>Save</strong> and we can now test our API in Azure API Management:</li></ol><ul><li>Select your operation.</li><li>Go to the <strong>Test</strong> tab.</li><li>Select <strong>Send</strong>.</li></ul><p><img loading="lazy" alt="Test " src="/Low-Code/assets/images/test-22f88641645aae35c2f4210b63e9b31b.png" width="3372" height="1702" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="step-3-create-a-custom-connector-via-azure-api-management">Step 3: Create a custom connector via Azure API Management<a class="hash-link" href="#step-3-create-a-custom-connector-via-azure-api-management" title="Direct link to heading">​</a></h3><p>As soon as your API was tested successfully, you are now able to export your web API to the Microsoft Power Platform. Please find a detailed guide here: <a href="https://learn.microsoft.com/en-us/azure/api-management/export-api-power-platform" target="_blank" rel="noopener noreferrer">Export APIs from Azure API Management to the Power Platform</a>.
If you want to add additional security to your API, check out our blog post on <a href="https://microsoft.github.io/Low-Code/blog/2023-day10" target="_blank" rel="noopener noreferrer">10. Secure Connectors with APIM</a>.</p><p><img loading="lazy" alt="Create Power" src="/Low-Code/assets/images/createpower-c06b51552a8aa8f48d939d4037c0953b.png" width="3025" height="2291" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="step-4-call-your-web-api-via-your-power-app">Step 4: Call your web API via your Power App<a class="hash-link" href="#step-4-call-your-web-api-via-your-power-app" title="Direct link to heading">​</a></h3><p>Next, we want to integrate our newly create custom connector in our Power App and make an API call.</p><ol><li>In your Power App, add your custom connector to your Power App via the tab <strong>data &gt; + Add data</strong>.</li></ol><p><img loading="lazy" alt="Custom Connector Power" src="/Low-Code/assets/images/customconnectorpower-8466e73e92842e80eee75ce8188949cf.png" width="1216" height="1864" class="img_ev3q"></p><ol start="2"><li>Next, we modify a <strong>Generate Picture</strong> Button with the following PowerFX formula:</li></ol><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ClearCollect(_datacollection, OpenAIAPI.createimage({prompt:TextInput1.Text,n:1,size:"512x512"}).data); </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Reset(TextInput1)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p><img loading="lazy" alt="Power Apps Input" src="/Low-Code/assets/images/powerappsinput1-bcbd09e92785497a8f11ec605ee7f21a.png" width="3423" height="1724" class="img_ev3q"></p><ol start="3"><li>Next, we modify an <strong>Image</strong> with the following PowerFX formula:</li></ol><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$"{First(_datacollection).url}"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p><img loading="lazy" alt="Power Apps Input" src="/Low-Code/assets/images/powerappsinput2-58795664d36d3fbdb92969d318795b2f.png" width="3536" height="1762" class="img_ev3q"></p><ol start="4"><li>Now, you are able to test your Power App and create a picture via your text input parameters. This picture will be generated using OpenAI's DALL·E model. Enjoy generating some fun pictures like me:</li></ol><blockquote><p>Let us know what you think! <a href="https://www.linkedin.com/in/jukasper/" target="_blank" rel="noopener noreferrer">@Julia Kasper</a></p></blockquote><blockquote><p>Don't forget to <a href="https://aka.ms/PowerfulDevsConf2023" target="_blank" rel="noopener noreferrer">Sign up for the Powerful Dev 2023</a>!</p></blockquote><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><p><a href="https://aka.ms/PowerfulDevsConf2023" target="_blank" rel="noopener noreferrer">Sign up for Powerful Dev 2023</a></p><p>Microsoft Power Platform:</p><ul><li><a href="https://learn.microsoft.com/en-us/power-apps/maker/" target="_blank" rel="noopener noreferrer">Overview of creating apps in Power Apps</a></li><li><a href="https://learn.microsoft.com/en-us/power-platform/developer/" target="_blank" rel="noopener noreferrer">Microsoft Power Platform developer documentation</a></li><li><a href="https://learn.microsoft.com/en-us/connectors/custom-connectors/" target="_blank" rel="noopener noreferrer">Custom connectors</a></li></ul><p>Azure API Management:</p><ul><li><a href="https://learn.microsoft.com/en-us/azure/api-management/api-management-key-concepts" target="_blank" rel="noopener noreferrer">What is Azure API Management?</a></li><li><a href="https://powerapps.microsoft.com/en-us/blog/azure-api-management-connector-on-the-power-platform/" target="_blank" rel="noopener noreferrer">Azure API Management connector on the Power Platform</a></li></ul>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
            <category>open-ai</category>
        </item>
        <item>
            <title><![CDATA[14. Intro to Power Fx]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day14</link>
            <guid>2023-day14</guid>
            <pubDate>Tue, 14 Feb 2023 12:00:00 GMT</pubDate>
            <description><![CDATA[Want to add logic to your low code apps in Power Apps? Join us on #30DaysOfLowCode to learn how - https://aka.ms/lowcode-february]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 14</code> of #30DaysOfLowCode!</p><p>It's <strong>Valentine's Day</strong>, a celebration of love in many regions of the world! Hopefully you're developing a love for the Power Platform as you make your way through Low Code February!</p><p>Yesterday, we explored how to get started building apps with Power Apps Canvas apps. Today, we're going to look at how we add logic to our Power Apps by exploring the low code programming language that it uses, Power Fx.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li><strong>What</strong> - What is Power Fx?</li><li><strong>Where</strong> - Where can we use it?</li><li><strong>How</strong> - How do we use it?</li><li><strong>Exercise</strong>: <a href="https://aka.ms/lowcode-february/PowerFxExercise" target="_blank" rel="noopener noreferrer">Training: Understand Power Fx</a></li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Low Code February Collection</a></li></ul><p><img loading="lazy" alt="Intro to Power Fx" src="/Low-Code/assets/images/30-14-3b1ac08c67d879b6161635399b3af76f.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-power-fx">What is Power Fx?<a class="hash-link" href="#what-is-power-fx" title="Direct link to heading">​</a></h2><p>What if you could build an app as easily as you build out a worksheet in Excel?</p><p>Power Apps and Power Fx makes this a reality.</p><p>While there's a lot we can do without having to write any code in the Power Platform, we need a programming language to enable the full spectrum of development and that's where Power Fx comes in.</p><p>Power Fx is the low-code language for the Power Platform. It's a strongly-typed, declarative and functional programming language that is based off of the Microsoft Excel formula language that is designed to be easy to use for everyone; from those who have never programmed before to seasoned professionals.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="where-can-we-use-power-fx">Where can we use Power Fx?<a class="hash-link" href="#where-can-we-use-power-fx" title="Direct link to heading">​</a></h2><p>Power Fx started as the low code language that we use to add logic to our Power Apps canvas applications, however, it is expanding to be used across the Power Platform.</p><p>Currently, we can use Power Fx with the following:</p><ul><li>Power Apps Canvas Apps</li><li><a href="https://aka.ms/lowcode-february/PowerFxDataverse" target="_blank" rel="noopener noreferrer">Dataverse Calculated Columns</a></li><li>Model Driven App Modern Commanding</li><li>Power Apps Ideas (AI assisted formulas)</li></ul><p>And more to come!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-does-power-fx-work">How does Power Fx work?<a class="hash-link" href="#how-does-power-fx-work" title="Direct link to heading">​</a></h2><p>All programming languages, including Power Fx have expressions which are a way to represent a calculation over numbers, string or other data types.</p><p>Power Fx, however, is inspired by Excel and in Excel we don't just write expressions, we write formulas or "recipes" for how to calculate a specific cell's value. </p><p>B1 = C2 * 5 is an example of a formula that defines the value of B1 and is recalculated automatically as C2 changes. Power Fx follows this same formula pattern except "cells" are replaced with properties of controls and objects.</p><p>Here's an example of a Power Fx formula in action:</p><p><img loading="lazy" alt="Power Fx Formula Gif" src="/Low-Code/assets/images/powerfx-last-word-96b7a82f3cc3bcb965eb3a329ebbabc8.gif" width="1204" height="452" class="img_ev3q"></p><p>Because Power Fx is a declarative formula language, it offers many things including:</p><ul><li><strong>Excel syntax translation</strong> : Because it's based on excel, most of the Excel syntax is used and available in Power Fx.</li><li><strong>Asynchronous</strong>: All data operations in Power Fx are asynchronous!</li><li><strong>Relational Data</strong>: With Power Fx we can use simple dot notation to access the entire graph of relationships from a record.</li><li><strong>Local and Remote</strong>: Power Fx automatically delegates what it can to the server to process filters and sorts more efficiently.</li><li><strong>Always Live</strong>: Power Fx formulas are always live and changes are reflected instantaneously.</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="pro-code-integration">Pro Code Integration<a class="hash-link" href="#pro-code-integration" title="Direct link to heading">​</a></h2><p>If you're a professional developer, you can work with Power Fx in your professional developer tooling like Visual Studio and Visual Studio code. Power Fx formulas can be stored in YAML source files which are easy to edit in any text editor.</p><p><img loading="lazy" alt="Pro Code Gif" src="/Low-Code/assets/images/pro-code-vscode-c9d378310354296a4f9c9de217673906.gif" width="1280" height="800" class="img_ev3q"></p><p>Power Fx has recently been made open source. You can see more and contribute here: <a href="https://github.com/microsoft/power-fx" target="_blank" rel="noopener noreferrer">Power Fx Github</a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="exercise">Exercise<a class="hash-link" href="#exercise" title="Direct link to heading">​</a></h2><p>Try the exercise in <a href="https://aka.ms/lowcode-february/PowerFxExercise" target="_blank" rel="noopener noreferrer">this Learn Module</a> on creating your first Power App as a traditional developer. It has some hands on Power Fx examples.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li><a href="https://aka.ms/lowcode-february/PowerFxExercise" target="_blank" rel="noopener noreferrer"><strong>Exercise</strong>: Training: Understand Power Fx</a></li><li><a href="https://aka.ms/lowcode-february/PowerFxOperators" target="_blank" rel="noopener noreferrer"><strong>Documentation: Power Fx Operations</strong></a> - on Microsoft Learn</li><li><a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>PowerfulDevs Conference</strong></a>: Learn More about Power Platform integration</li><li><a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Learn Collection</strong> </a> LowCode February</li></ul><p><img loading="lazy" alt="Campaign Banner" src="/Low-Code/assets/images/30-banner-d9bab2b92d758942447a4cbc50aef715.png" width="1334" height="560" class="img_ev3q"></p>]]></content:encoded>
            <category>powerfx</category>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
        </item>
        <item>
            <title><![CDATA[13. Build a Canvas App]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day13</link>
            <guid>2023-day13</guid>
            <pubDate>Mon, 13 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Today’s blog will begin your User Interface development journey with actionable insights and resources that will get you started building amazing UI with Canvas Apps.]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 13</code> of #30DaysOfLowCode!</p><p>More often than not, a well thought out, consistent, eye-catching but functional user experience can define the success of your app. This is why we’ve decided to dedicate this week to the <strong>User Interface (UI)</strong>. Today’s blog will begin that journey with actionable insights and resources that will get you started building amazing UI with Canvas Apps.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>What are Canvas Apps?</li><li>Ways to build Canvas Apps</li><li>Working with Express Design</li><li><strong>Activity</strong>: Sign up for your <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer">Power Apps Developer Plan</a></li><li><strong>Exercises</strong>: Try it Yourself! </li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Low Code February Collection</a></li></ul><p><img loading="lazy" alt="Speaker Card" src="/Low-Code/assets/images/30-13-01c7b65817f80db68d11795d0a1c637c.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-are-canvas-apps">What are Canvas Apps?<a class="hash-link" href="#what-are-canvas-apps" title="Direct link to heading">​</a></h2><p>As mentioned in an <a href="https://microsoft.github.io/Low-Code/blog/2023-day2/#what-does-the-power-platform-provide" target="_blank" rel="noopener noreferrer">earlier blog post</a>, Power Apps is a tool for “creating custom applications for web and mobile that can be integrated with a variety of systems and services”. There are two types of Power Apps, namely Model-Driven Apps and Canvas Apps.</p><p>Model-Driven apps require a Microsoft Dataverse database. They're built on top of the data that's modelled in that database environment. As a result of this, the views and screens are based on a specific data structure and offer a more consistent appearance and behaviour from one screen to the next.</p><p>But with Canvas Apps, you start with a blank screen – like an artist’s canvas. You have complete control over the placement of each image, textbox, form, icon, and other elements on that canvas. Power Apps offers you a graphical, intuitive interface with a pixel perfect visual app designer which enables you to build and deploy professional looking Canvas Apps faster with tailor-made UI.</p><p><img loading="lazy" alt="Canvas App UI being edited inside of the Power Apps Studio" src="/Low-Code/assets/images/Figure1-9cda1144098d58e6a2dd8fe8ff52a3f9.png" width="1920" height="961" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="ways-to-build-canvas-apps">Ways to build Canvas Apps<a class="hash-link" href="#ways-to-build-canvas-apps" title="Direct link to heading">​</a></h2><p>Now there are many starting points when building Canvas Apps. We’ve already established that you can start from a <em>blank canvas</em> and build out your app from there however we have other methods for getting you to where you want to be faster.</p><p>Whether it’s your first time and you want to start from a template just to get familiar with the building experience, or you already have data and you want to build your Canvas App on top of that data or even if you have an initial design and you want to start from that design and add data later on – we’ve got you covered. </p><p>Whatever method you choose, you’ll always end up in the Power Apps Studio. This is the space where you’ll design, build, and manage your Canvas App. If you want to understand the various parts of the Power Apps Studio before you get your hands dirty; I highly recommend reading <a href="https://aka.ms/LCF/PowerAppsStudio" target="_blank" rel="noopener noreferrer">this article</a> which gives a really good insight into the various parts of it.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="start-from-a-template">Start from a template<a class="hash-link" href="#start-from-a-template" title="Direct link to heading">​</a></h3><p>If it’s your first time, you might want to start from a template just so you can get familiar with Canvas Apps. Power Apps provides multiple templates for all types of scenarios. </p><p><img loading="lazy" alt="Image showing a few Canvas Apps templates" src="/Low-Code/assets/images/Figure2-c8c7b890580d7389beba8d5cbf5436f7.png" width="1920" height="961" class="img_ev3q"></p><p>You can simply select a template from our vast gallery and then run the app to understand its default behaviour. Feel free to add some additional functionality and make it your own. For a full breakdown of how to create an app from a template, check out <a href="https://aka.ms/LCF/CanvasFromTemplate" target="_blank" rel="noopener noreferrer">this article</a> to learn more. </p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="start-from-data">Start from data<a class="hash-link" href="#start-from-data" title="Direct link to heading">​</a></h3><p>Maybe you already have some business data to work with and you’d like to build an app that connects to this data directly.  It doesn’t matter where your data lives – you can create a working 3-screen app in just a few clicks and choose to customise it however you want. </p><p>The generated 3-screen app includes:</p><ol><li><strong>Browse Screen</strong>: Lets the user browse through data. It also includes search, sort, and data refresh all out of the box.</li><li><strong>Details Screen</strong>: This screen just shows the extended details of a single record. It also has the option of deleting that record as well. </li><li><strong>Edit Screen</strong>: This allows users to edit a single record to change any of its values. </li></ol><p><img loading="lazy" alt="Image showing generated 3-screen Canvas App" src="/Low-Code/assets/images/Figure3-c60e8cf9500886194774c51fcb1aac51.png" width="1253" height="712" class="img_ev3q"></p><p>This process takes care of the data connection for you so that you can focus on the functionality and UI straight away. Whether your data lives in <a href="https://aka.ms/LCF/CanvasFromSharepoint" target="_blank" rel="noopener noreferrer">SharePoint</a>, <a href="https://aka.ms/LCF/CanvasFromExcel" target="_blank" rel="noopener noreferrer">Excel</a>, <a href="https://aka.ms/LCF/CanvasFromSQL" target="_blank" rel="noopener noreferrer">Azure SQL</a> or even <a href="https://aka.ms/LCF/CanvasFromDataverse" target="_blank" rel="noopener noreferrer">Dataverse</a>, you can get started building Canvas Apps, from data, today. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="working-with-express-design">Working with Express Design<a class="hash-link" href="#working-with-express-design" title="Direct link to heading">​</a></h2><p>Express design is a new way to quickly get started with Canvas Apps by instantly transforming any visual design artifact into an app. Every app starts with a design phase where some form of initial sketch would have been made. You may have sketched some basic UI on a piece of paper or on a whiteboard or if you’re a professional – you may have designed some assets in Figma.</p><p>Whatever your method is, Power Apps is now applying advanced cognitive AI models to generate app UI using two methods.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="image-to-app">Image to App<a class="hash-link" href="#image-to-app" title="Direct link to heading">​</a></h3><p>All you have to do is take a picture or screenshot of whatever wireframe, sketch, or visual design that you have, upload it into Power Apps and then follow the steps in the guided interface to tag the relevant UI components and set up your data. This will then auto-magically generate an app for you to jumpstart your app development process. See <a href="https://aka.ms/LCF/AppFromImage" target="_blank" rel="noopener noreferrer">this article</a> for more information and step-by-step guidance on how to generate Canvas Apps from an image!</p><p>Also, check out this <a href="https://aka.ms/LCF/ExpressDesignTikTok" target="_blank" rel="noopener noreferrer">AMAZING TikTok</a> that shows you the whole Image to App process in under 60 seconds! Don’t forget to follow us while you’re there 😉 </p><p><img loading="lazy" alt="Image showing the Image to App fucntionality in Power Apps" src="/Low-Code/assets/images/Figure4-c0ce1b8cd102eb31f73115f55ba57f05.png" width="1920" height="961" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="figma-to-app">Figma to App<a class="hash-link" href="#figma-to-app" title="Direct link to heading">​</a></h3><p>Now the Image to App process will do it’s best to match your drawing or image however if you are looking for an exact, pixel-perfect match then you should consider creating your design in Figma using the <a href="https://aka.ms/LCF/FigmaKit" target="_blank" rel="noopener noreferrer">Create Apps from Figma UI Kit</a>. Afterwards, you will then convert your design file into a Canvas App and then add more functionality using the Power Apps Studio. More details on this process can be <a href="https://aka.ms/LCF/Figma" target="_blank" rel="noopener noreferrer">found here</a> so be sure to try it out for yourself and let us know how it went!</p><p><img loading="lazy" alt="Image showing the Figma to App fucntionality in Power Apps" src="/Low-Code/assets/images/Figure5-aab62715762c8044aa5ae906abc5be25.png" width="1920" height="961" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="exercises">Exercises<a class="hash-link" href="#exercises" title="Direct link to heading">​</a></h2><p>So now that you've taken the time to delve into this blog post, you're essentially a pro at finding whatever your starting point is! Go ahead, give yourself a pat on the back AND why don’t you try and build some Canvas Apps UI yourself? It’s easier than you think, and we’ve got some training materials to help you get started as well. </p><ul><li><strong>Training</strong>: <a href="https://aka.ms/LCF/CanvasUIPath" target="_blank" rel="noopener noreferrer">Use the UI and controls in a canvas app in Power Apps</a> is a Learning Path up on Microsoft Learn which takes you through the process of building a functional UI for your Canvas App. It highlights app navigation, themes, icons, images, personalization, different form factors, and so many more controls that you can take advantage of. </li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next?<a class="hash-link" href="#whats-next" title="Direct link to heading">​</a></h2><p>Be sure to keep yourself posted with this week’s blog posts and discover all that there is to know about working with User Interface in the Power Platform. From Power Fx to the Power Component Framework, we have so much planned for you. </p><p>Also consider -</p><ol><li>Signing up for the free <strong><a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer">Power Apps Developer Plan</a></strong> so you have access to the Power Platform.</li><li>Enrolling in the <strong><a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer">Cloud Skills Challenge</a></strong> to skill up on key cloud technologies with free, self-guided learning courses, and start climbing the leaderboard!</li><li>Registering for the <strong><a href="https://aka.ms/lowcode-february/PowerfulDevsConf2023" target="_blank" rel="noopener noreferrer">Powerful Devs Conference</a></strong> to learn from experts how you, as a developer, can leverage the Power Platform to build applications faster and with far less effort.</li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li>Low Code February <strong><a href="https://learn.microsoft.com/users/nityan/collections/xz6ehr2mx031y0?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Learn Collection</a></strong>: Collection of resources to go from learning Power Platform Fundamentals, to understanding the Dataverse and working in Fusion Development teams.</li><li>Power Apps <strong><a href="https://aka.ms/LCF/CanvasDocs" target="_blank" rel="noopener noreferrer">Canvas Apps Documentation</a></strong></li><li>On-Demand Viewing: <strong><a href="https://aka.ms/LCF/UILearnLive" target="_blank" rel="noopener noreferrer">Building the UI in Power Apps</a></strong></li></ul>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
            <category>canvas-apps</category>
        </item>
        <item>
            <title><![CDATA[12. Recap - Integrations Week ✨]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day12</link>
            <guid>2023-day12</guid>
            <pubDate>Sun, 12 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Let's recap Week 2 of #30DaysOfLowCode focused on Backend Integrations with emphasis on data, security, serverless, connectors and usage patterns - join us at #LowCodeFebruary https://aka.ms/lowcode-february]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 12</code> of #30DaysOfLowCode!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li><strong>Look Back</strong>: Recap Backend Integrations Week</li><li><strong>Save the Date</strong>: Powerful Dev Conference, Learn Live and Webinar for Power Platform and GitHub</li><li><strong>Skill Up</strong>: Self-Study Resources &amp; Cloud-Skills Challenge</li><li><strong>Look Ahead</strong>: Are you ready for the Interface Week?!</li><li><strong>Activity</strong> Sign up for the <a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Powerful Dev Conference</strong></a> on Feb 15!</li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Low Code February Collection</strong></a></li></ul><p><img loading="lazy" alt="Speaker Card for Feb 12" src="/Low-Code/assets/images/30-12-fbf3a869a4b409ebbdf29c2f6a45a33c.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="look-back-week-2-recap"><strong>Look Back</strong>: Week 2 Recap<a class="hash-link" href="#look-back-week-2-recap" title="Direct link to heading">​</a></h2><p>Wow, how quickly time flies! We can hardly believe that we're almost halfway through our journey. How have you been enjoying the experience so far? We truly hope that you have found value in the carefully selected blogs, videos, workshops, and events that have been put together just for you. Our goal is for you to feel empowered to apply the knowledge you've gained in various aspects of your life.</p><p>From the bottom of our hearts, we want to say THANK YOU for supporting us on this journey. If you have any thoughts or feedback, please don't hesitate to reach out to us through <a href="https://github.com/microsoft/Low-Code/discussions" target="_blank" rel="noopener noreferrer"><strong>GitHub Discussions</strong></a>. We value your input and look forward to hearing from you! ❤️</p><p><img loading="lazy" alt="Roadmap Image for Week 2" src="/Low-Code/assets/images/30-roadmap-week2-33261b66ae416e6e8364ce3a0ceae896.png" width="1000" height="563" class="img_ev3q"></p><p>Here are the highlights for week 2! If you're new to us, welcome to the party! You won't want to miss the amazing content we have in store for you in this week's <a href="https://aka.ms/lowcode-february/blog" target="_blank" rel="noopener noreferrer"><strong>#30DaysOfLowCode</strong></a>: </p><p>Welcome to our series of blogs on low code development! This series is designed to help you understand the full potential of Power Platform and how it can transform the way you work. This week, our discussions spanned from introducing connectors, dataverse and serverelss apps to testing and constructing your own connector, as well as exploring various integration patterns. So, hang tight and get ready to dive into the exciting world of low-code and integration!</p><ul><li><a href="https://microsoft.github.io/Low-Code/blog/2023-day6" target="_blank" rel="noopener noreferrer"><strong>Connectors 101: Let's Make Some Connections!</strong></a></li></ul><p>Are you new to connectors and curious about how they can enhance the functionalities of Power Platform? This blog provides a comprehensive overview of connectors and how they interact with data from various services. You'll get a 360 degree view of connectors and understand how they can be leveraged to streamline your work.</p><ul><li><a href="https://microsoft.github.io/Low-Code/blog/2023-day7" target="_blank" rel="noopener noreferrer"><strong>Do more with your Data for less - Dataverse!</strong></a></li></ul><p>Do you want to create and manage your data and insights with ease to support your applications and more? Our second blog this week provides a walkthrough of Dataverse, from introduction to managing low-code to pro-code integration as well as controlling advanced business logic in a compliant manner.</p><ul><li><a href="https://microsoft.github.io/Low-Code/blog/2023-day8" target="_blank" rel="noopener noreferrer"><strong>Serverless Low Code</strong></a></li></ul><p>Did you know that you can create serverless applications with low-code technology? Our third blog walks you through how Azure Logic Apps bring low-code technology to serverless computing. You'll learn how to build and deploy serverless applications with ease, leveraging the power of low-code.</p><ul><li><a href="https://microsoft.github.io/Low-Code/blog/2023-day9-build" target="_blank" rel="noopener noreferrer"><strong>Build and Use Custom Connectors</strong></a></li></ul><p>We also provide hands-on tutorials to help you put your knowledge into practice. Our fourth and fifth blogs <a href="https://microsoft.github.io/Low-Code/blog/2023-day9-build" target="_blank" rel="noopener noreferrer"><strong>Build a Custom Connector</strong></a> and <a href="https://microsoft.github.io/Low-Code/blog/2023-day9-use" target="_blank" rel="noopener noreferrer"><strong>Use the Custom Connector</strong></a> show you step-by-step how to build and consume custom connectors in the Power Platform environment - using a real-world OpenAPI specification and application scenario!</p><ul><li><a href="https://microsoft.github.io/Low-Code/blog/2023-day10" target="_blank" rel="noopener noreferrer"><strong>Secure Connectors with Azure API Management</strong></a></li></ul><p>Azure API Management is one of the most commonly used tools for custom connectors in the Power Platform. Our sixth blog covers how to add additional security and control to your custom connectors with Azure API Management. You'll learn about different authentication types for custom connectors and how to deploy different authentication scenarios with various sample applications.</p><ul><li><a href="https://microsoft.github.io/Low-Code/blog/2023-day11" target="_blank" rel="noopener noreferrer"><strong>Low-Code + Azure Integration Patterns</strong></a></li></ul><p>Last but not least, we end the week with a hands-on approach by showcasing key integration patterns that can elevate your work to the next level. It explores how low-code technology can be combined with Azure to tackle real-world challenges and provide practical solutions. We understand that people learn best from real-life examples, and this blog is designed to do just that.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="savethedate-events"><strong>#SaveTheDate</strong>: Events<a class="hash-link" href="#savethedate-events" title="Direct link to heading">​</a></h2><ul><li><p><a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Powerful Devs Conference: Feb 15</strong></a> Get ready to be amazed! In 3 days, the highly-anticipated Powerful Dev Conf is happening on February 15th. This signature event is packed with exciting content, where you'll hear from some of the top experts, including authors from this series, about the amazing features and practical usage of the Power Platform. With a fantastic speaker lineup, you won't want to miss this opportunity to take your knowledge and skills to the next level. So, check out the <a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">scheduled sessions</a> and visit the site to reserve your spot today!</p><p><img loading="lazy" alt="feb12" src="/Low-Code/assets/images/Powerful Dev Social-Simple1-cd315420c042bcafdb87fd3e9379326f.png" width="1080" height="608" class="img_ev3q"></p></li><li><p><a href="https://aka.ms/lowcode-february/LearnLive" target="_blank" rel="noopener noreferrer"><strong>Learn Live!</strong></a> Do you have questions about the Microsoft Learn modules or the Cloud Skills Challenge? Then don't miss out on our "Learn Live" sessions! These sessions are the perfect opportunity to hear tips and insights from experts in the field, so join in and ask your questions: </p><ol><li>🎙 <a href="https://aka.ms/lowcode-february/LearnLive" target="_blank" rel="noopener noreferrer"><strong>Feb 13</strong></a> - Integrate OpenAPI-enabled Web APIs with Azure API Management</li><li>🎙 <a href="https://aka.ms/lowcode-february/LearnLive" target="_blank" rel="noopener noreferrer"><strong>Feb 27</strong></a> - Manage Microsoft Power Platform deployments</li></ol><p><img loading="lazy" alt="feb12" src="/Low-Code/assets/images/LearnLive-fd1c85634a15c825a474e1deac2f0b8b.png" width="600" height="338" class="img_ev3q"></p></li><li><p><a href="https://mktoevents.com/Microsoft+Event/383091/157-GQE-382" target="_blank" rel="noopener noreferrer"><strong>Webinar: Power Platform &amp; Azure Deploys with GitHub: Feb 14</strong></a> In this webinar, you'll learn about the capabilities that Power Platform opens up for GitHub, and discover the inner and outer loop functions that are available with Power Platform and GitHub. You'll also see how to author CI/CD pipelines and hear customer success stories from the retail and manufacturing industries. </p><p><img loading="lazy" alt="feb12" src="/Low-Code/assets/images/webinar-b5b3df88894e6916d9151f237dd0502f.png" width="1555" height="871" class="img_ev3q"></p></li></ul><ul><li><p><a href="http://localhost:3000/Low-Code/lowcode-february/Video-Live#ask-the-experts" target="_blank" rel="noopener noreferrer"><strong>Ask The Experts!</strong></a> Have questions about Power Platform, low code development, or recent events and conferences? Then don't miss out on our "Ask the Experts" sessions! These are your chance to have a face-to-face discussion with our leaders and get all your questions answered.</p><ol><li><p>🎙 <a href="https://aka.ms/ATE0223/RSVP" target="_blank" rel="noopener noreferrer"><strong>Feb 23, 9AM PST</strong></a> - Join this session for Q&amp;A from the <strong>Powerful Devs Conference</strong> team. The Powerful Devs Conference is all about showing how code-first developers can integrate with the Power Platform to innovate faster. Our experts will be available to answer questions about full code and low code integration.</p><p><img loading="lazy" alt="feb12" src="/Low-Code/assets/images/ate_powerfuldev-c3d32cfe4d061ddb373ee0c54d81d569.png" width="3840" height="2160" class="img_ev3q"></p></li><li><p>🎙 <a href="https://aka.ms/ATE0309/RSVP" target="_blank" rel="noopener noreferrer"><strong>Mar 09, 9AM PST</strong></a> - Join this session for Q&amp;A from the <strong>Low Code February</strong> team, including authors of this #30DaysOfLowCode series. We will have experts in code-first integration with the Power Platform live to answer questions related to the content of the Low Code February events.</p><p><img loading="lazy" alt="feb12" src="/Low-Code/assets/images/ate_lowcodefeb-8df8963f7f93df7614a68b24974114fa.png" width="3840" height="2160" class="img_ev3q"></p></li></ol></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources-for-self-study"><strong>Resources:</strong> For Self-Study<a class="hash-link" href="#resources-for-self-study" title="Direct link to heading">​</a></h2><p>Unable to keep up with the daily pace? No problem! Check out these our self-study materials designed to help you learn at your own convenience:</p><ol><li><a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Resource Collection</strong></a>: Bookmark the collection for a 1-stop resource containing all relevant links to documentation and training, as covered in the #30DaysOfLowCode blogs. </li><li><a href="https://aka.ms/lowcode-february/workshop" target="_blank" rel="noopener noreferrer"><strong>Hands-on Workshops</strong></a>: learn by doing! These labs help you gain hands-on experience from intro to advanced, whereever you're in the learning path. </li><li><a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer"><strong>Cloud skills Challenge</strong></a>: gives you a free curated set of learning modules to jumpstart your learning journey into Low Code and Fusion development. </li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="look-forward-week-3"><strong>Look Forward</strong>: Week 3<a class="hash-link" href="#look-forward-week-3" title="Direct link to heading">​</a></h2><p>During week 3 of the learning journey, you'll get the chance to delve deep into the user interface and explore everything from building a canvas app, to understanding the basics of PowerFx, using the Power Component Framework controls, and even creating your own PCF control. And as a special treat, you'll be taken on a journey from #ZeroToHero with a blog that showcases the integration of the <strong>Power Platform and ChatGPT</strong>✨. This is an opportunity not to be missed!</p><p>Don't forget to bookmark the <a href="https://aka.ms/lowcode-february/blog" target="_blank" rel="noopener noreferrer"><strong>#30DaysOfLowCode</strong></a> page, then follow along to read the daily blog post, ask questions, and connect with other learners. <em>Get empowered</em> with low code development!</p><p><img loading="lazy" alt="Week 3 Roadmap" src="/Low-Code/assets/images/30-week3-bb6f12d3823d05ea7215cb700944b91a.png" width="1001" height="420" class="img_ev3q"></p>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
            <category>recap</category>
        </item>
        <item>
            <title><![CDATA[11. Azure Integration Patterns]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day11</link>
            <guid>2023-day11</guid>
            <pubDate>Sat, 11 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we'll explore some real world use cases that integrate Azure with Power Platform to help you resolve business challenges more efficiently.]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 11</code> of #30DaysOfLowCode!</p><p>The theme for this week is <strong>backend integration</strong>. Yesterday we talked about building secure connectors with Azure API Management. Today we'll explore some real world use cases that integrate Azure with Power Platform to help you resolve busienss challenges more efficiently. Let's talk about <strong>Low Code and Azure Integration Patterns!</strong>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>Why Power Platform and Azure together?</li><li>Access data beyond a low code platform</li><li>Use Azure API Management use low code development</li><li>Low Code + Azure Integration Patterns</li></ul><p><img loading="lazy" alt="Speaker Card for Feb 11" src="/Low-Code/assets/images/30-11-fc5862e9dc77b07431322a2ed297cda9.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-power-platform-and-azure-together">Why Power Platform and Azure together?<a class="hash-link" href="#why-power-platform-and-azure-together" title="Direct link to heading">​</a></h2><p>By using Microsoft Azure to extend the capabilities of Power Platform, you can help solve the App Gap challenge. </p><p>Simply put, the app gap is a condition where there is an increasing need for custom applications, but you don't have enough developers to build the applications in the business units’ backlog. </p><p>For many businesses today, the <em>app gap</em> is already very real and getting worse.  Current estimates are that the world is currently short some 4m developers … with an estimated 500 million new apps needing to be built by 2025. This challenge emphasizes the need to find creative and efficient ways to deliver more custom applications to meet the needs of the business with fewer developers.</p><p><strong>So how do we build more apps, faster?</strong></p><p>We can accelerate app development by letting pro developers do what they do best: traditional development and increasing the availability of organizational services &amp; data.</p><p>We then simultaneously empower low code developers to solve some of their business problems themselves by giving them a low code development platform and controlled access to the right data, APIs &amp; service endpoints.</p><p>This is at the heart of the fusion team development concept – joining professional &amp; low code developers together to:</p><ul><li>Close the app gap</li><li>Build applications faster to reduce the organizational app backlog</li><li>Create new developers from untraditional places</li><li>Incubate a culture of innovation</li></ul><p><strong>Resources:</strong></p><ul><li><a href="https://learn.microsoft.com/events/build-2022/odbrk45-expedite-application-delivery-with-low-code-fusion-teams/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Expedite application delivery with low-code and fusion teams</a></li><li><a href="https://learn.microsoft.com/power-apps/guidance/fusion-dev-ebook/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Fusion Development Ebook</a></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-do-i-access-data-from-microsoft-azure--beyond-from-a-low-code-platform">How do I access data from Microsoft Azure &amp; beyond from a low code platform?<a class="hash-link" href="#how-do-i-access-data-from-microsoft-azure--beyond-from-a-low-code-platform" title="Direct link to heading">​</a></h2><p>Power Platform uses the concept of connectors - wrappers around the OpenAPI specifications - the industry standard for documenting REST APIS. </p><p>Connectors abstract away the details of the underlying API while still offering a low code interface within Power Platform. Using connectors, low code developers can interact with APIs without having to have coding ability or extensive knowledge of the underlying API or backend systems. Connectors also give a consistent experience when authenticating to APIs without added custom code.</p><p>Power Platform provides &gt;1000 built-in connectors which enables easy integration with a wide variety of systems &amp; services.  Pre-built connectors include Dynamics 365, Salesforce, SAP and  Microsoft Teams among many others – in addition to seamless connection to Microsoft Azure services.  </p><p>To connect to internal organizational APIs or solutions where there isn’t an existing connector, Power Platform includes the ability to create custom connectors, which can be used as wrappers to APIs exposed through an API Gateway. </p><p><strong>Resources:</strong></p><ul><li><a href="https://learn.microsoft.com/connectors/connectors/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Connectors overview</a></li><li><a href="https://learn.microsoft.com/connectors/custom-connectors/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Custom Connectors overview</a></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-use-azure-api-management-apim-with-low-code-development">Why use Azure API Management (APIM) with low code development?<a class="hash-link" href="#why-use-azure-api-management-apim-with-low-code-development" title="Direct link to heading">​</a></h2><p>Azure API Management is a cloud-based platform for creating, managing &amp; publishing APIs.  It supports fusion development patterns through:</p><ul><li>Decoupling: Abstracting APIs from their backend implementation and hosting them under a single domain/IP address.  The API layer is decoupled from a specific user interface so the same API can be used in both traditional &amp; low code applications.</li><li>Governance: APIM adds an additional control plane for low code development by allowing access only to specified apps &amp; users and not exposing APIs directly.</li><li>Monitoring and debugging: Use Azure Application Insights to debug, monitor traffic &amp; configure analytics.</li><li>Change Management: Versioning &amp; revision control to manage breaking changes for traditional &amp; low code developers.</li><li>Internal Documentation: Creates a catalog of available APIs with downloadable Open API specifications via the Developer Portal.</li><li>Integration with Power Platform: Pushing custom connectors directly to Power Platform environments makes them available at once for use in apps &amp; automation flows.</li></ul><p><strong>Resources:</strong></p><ul><li><a href="https://learn.microsoft.com/azure/api-management/api-management-key-concepts/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">What is API Management?</a></li><li><a href="https://learn.microsoft.com/azure/api-management/export-api-power-platform/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Export custom connectors from API Management</a></li><li><a href="https://azure.github.io/apim-lab/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">APIM Hands-on Lab</a></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="low-code--azure-integration-patterns">Low Code + Azure Integration Patterns<a class="hash-link" href="#low-code--azure-integration-patterns" title="Direct link to heading">​</a></h2><p>The following technology patterns are generalized with regards to specific use cases but are drawn from real-world customer scenarios using Azure with Power Platform, aka “fusion development.” </p><p>A common part of many of these fusion architecture patterns is the use of custom connectors that are exported &amp; controlled from Azure API Management.</p><p><img loading="lazy" alt="Feb11" src="/Low-Code/assets/images/picture-1-bc658fa5035aa1e4a28ff99524457f82.png" width="688" height="230" class="img_ev3q"></p><p><strong>IT Democratization</strong></p><p>This is the most basic pattern for fusion development.  This pattern allows for low code developers, without a coding background, to build applications using their organization’s data. This architecture uses APIs written by pro developers to amplify existing data and expose it to low code developers using an API gateway. </p><p>The Azure API Management Developer Portal provides an enterprise catalog which aggregates the data &amp; APIs available to low code &amp; professional developers alike.</p><p><img loading="lazy" alt="Feb11" src="/Low-Code/assets/images/it-ed66733f95c8889ee6faf777874818d3.png" width="691" height="251" class="img_ev3q"></p><p><strong>Resources:</strong></p><ul><li><a href="https://learn.microsoft.com/power-apps/guidance/fusion-dev-ebook/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Fusion Development Ebook</a></li></ul><p><strong>AI/ML integrations</strong></p><p>Azure includes a rich suite of managed AI and machine learning services, including Azure Cognitive Services and Azure Machine Learning, to more easily build &amp; deploy AI models. </p><p>By combining Azure’s AI/ML capabilities with Power Platform, you can build intelligent solutions that bring together the best of both worlds.  For example:</p><ul><li>Building custom machine learning models in Azure AI services front-ended by a low code app that consumes the resulting models to deliver insights about images &amp; videos uploaded by end users.</li><li>After using AI/ML on the backend to process large amounts of data, Power Automate workflows can watch the resulting output, triggering custom actions &amp; notifications based on the content.</li><li>Creating a low code user interface for data labeling, making it easier for your business subject matter experts to label their datasets for use in training new custom Azure machine learning experiments.</li></ul><p><img loading="lazy" alt="Feb11" src="/Low-Code/assets/images/aiml-b0714a39ca7793150756d59d474be416.png" width="686" height="336" class="img_ev3q"></p><p><strong>Resources:</strong></p><ul><li><a href="https://azure.microsoft.com/products/cognitive-services/#overview/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Azure Cognitive Services overview</a></li><li><a href="https://azure.microsoft.com/products/machine-learning/#product-overview/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Azure Machine Learning</a></li><li><a href="https://azure.microsoft.com/products/cognitive-services/openai-service/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Azure Open AI</a></li><li><a href="https://github.com/appdevgbb/power-apps-custom-vision/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Custom Vision + Power Apps Demo</a></li><li><a href="https://www.youtube.com/watch?v=ka_yY77b-0M/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Power Apps and Azure Cognitive Services Demo</a></li></ul><p><strong>IoT/Event-driven Systems</strong> </p><p>IoT systems can generate large amounts of data from connected devices. By integrating Power Platform with Azure IoT, you can build custom low code apps &amp; workflows that act on the IoT device data. </p><p>For example:</p><ul><li><p>Azure IoT Hub can collect &amp; process data from IoT Devices, while Power Apps + Power BI can be used to build custom dashboards to supply insights &amp; visualizations of the data.</p></li><li><p>Designing Power Automate workflows that are only triggered based on specific events or conditions which then send notifications to other systems, like Microsoft Teams.</p></li><li><p>Building fast, low-code interfaces for remote command &amp; control of IoT edge devices.</p><p><img loading="lazy" alt="Feb11" src="/Low-Code/assets/images/iot-c5d8d06f2efc283f1edddeb36b63b986.png" width="677" height="214" class="img_ev3q"></p></li></ul><p><strong>Resources:</strong></p><ul><li><a href="https://azure.microsoft.com/products/iot-hub/#overview/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Azure IoT Hub overview</a></li><li><a href="https://azure.microsoft.com/solutions/messaging-services/#overview/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Messaging Services on Azure Overview</a></li><li><a href="https://github.com/appdevgbb/tornado-watchdog/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Tornado Warning System Demo</a></li></ul><p><strong>On-prem data with Azure and Power Platform</strong></p><p>Sometimes organizations have security requirements that require isolated communication between resources in the cloud and on-premises. By using Azure with on-premises systems, you can create a dedicated and private connection and bypass the public internet. </p><p>By using API Management in an Azure VNET (Virtual Network), you can also create secure connections between APIs and their backend services. Access to these APIs can be restricted to only allowing access to designated, trusted interfaces, such as Power Platform. This pattern has some of the same accessibility benefits of IT Democratization, but while respecting the security &amp; isolation requirements of the business.</p><p><img loading="lazy" alt="Feb11" src="/Low-Code/assets/images/onprem-005528f35c63af1e2297ff721b3189d0.png" width="678" height="282" class="img_ev3q"></p><p><strong>Resources:</strong></p><ul><li><a href="https://learn.microsoft.com/azure/api-management/api-management-using-with-vnet?tabs=stv2/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Connect to a VNET using APIM</a></li><li><a href="https://learn.microsoft.com/azure/api-management/export-api-power-platform/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Export a Custom connector from APIM</a></li><li><a href="https://learn.microsoft.com/connectors/custom-connectors/create-custom-connector-aad-protected-azure-functions/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Custom connector for Azure AD-protected Apps</a></li><li><a href="https://learn.microsoft.com/azure/api-management/api-management-howto-protect-backend-with-aad/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Protect APIM with Azure AD</a></li></ul><p><strong>Azure Communication Services + Power Platform</strong></p><p>Azure Communication Services allows you to add voice, video, and messaging capabilities to your applications. By integrating Power Platform with Azure Communication Services, you can build custom low code applications that easily incorporate these communication capabilities.</p><p>Common communication &amp; low code scenarios include:</p><ul><li><p>Create a flow using Power Automate to send out omnichannel notifications via email, SMS, and chat.</p></li><li><p>Using Power Automate to create Event Grid triggered flows to process inbound communication events such as incoming calls or SMS messages.</p></li><li><p>Using Azure Cognitive services, Azure Communication Services, and Power Automate together to do sentiment analysis that empowers support personnel to create contextual, personalized responses for end users.</p></li><li><p>Create a Power App low code UI to trigger communication workflows and manage communication related metadata, like chat/SMS history.</p><p><img loading="lazy" alt="Feb11" src="/Low-Code/assets/images/acs-727502e313b839227cecc38884495323.png" width="647" height="230" class="img_ev3q"></p></li></ul><p><strong>Resources:</strong></p><ul><li><a href="https://learn.microsoft.com/azure/communication-services/overview/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Azure Communication Services overview</a></li><li><a href="https://powerautomate.microsoft.com/connectors/details/shared_azurecommunicationservicessms/azure-communication-services-sms/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">SMS Connector</a></li><li><a href="https://powerautomate.microsoft.com/connectors/details/shared_acsemail/azure-communication-services-email/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Email Connector</a></li><li><a href="https://powerautomate.microsoft.com/connectors/details/shared_acschat/azure-communication-services-chat/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Chat Connector</a></li><li><a href="https://powerautomate.microsoft.com/connectors/details/shared_acsidentity/azure-communication-services-identity/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Identity Connector</a></li><li><a href="https://aka.ms/lowCode/sentimentanalysis" target="_blank" rel="noopener noreferrer">Integrate sentiment analysis with SMS</a></li></ul><p><strong>Mainframe Modernization and Extension</strong></p><p>Azure integration services unlocks the ability to access &amp; use Mainframe data.  Old green screen mainframe apps can be modernized to use modern technologies such as advanced data analytics &amp; AI/ML services. </p><p>By combining Power Platform with mainframe application data, you can unlock data and democratize development that was previously limited to only professional developers. You can build low code user-friendly interfaces for accessing and working with Mainframe data, making it easier for non-technical users to interact with data. For example:</p><p>•	Ingesting real-time data, like telemetry &amp; system alerts, that trigger Power Automate flows and send notifications to Microsoft Teams.
•	Using Power Apps to create user interfaces that allow users to view, manage, and create visualizations for Mainframe application data.</p><p><img loading="lazy" alt="Feb11" src="/Low-Code/assets/images/mainframe-70ca6efbea2faa014f882d59bc756391.png" width="691" height="265" class="img_ev3q"> </p><p><strong>Resources:</strong></p><ul><li><a href="https://ignite.microsoft.com/sessions/691884e3-273a-46eb-99ee-a0c761c86a1e?source=sessions/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Low-Code Meets Mainframe: Kyndryl data pipeline</a></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a class="hash-link" href="#conclusion" title="Direct link to heading">​</a></h2><p>These Azure low code patterns are just a few of the many integration patterns that bring together the best of both worlds. </p><p>The combination of Azure &amp; Power Platform supplies a comprehensive set of tools for building internal APIs to access your organization's data, designing AI experiments, and programming IoT devices.  </p><p>Our low code platform’s capabilities help you quickly solve complex business problems &amp; address the app gap problem with the fusion development process. </p><p><strong> Get Started Today?</strong> </p><ul><li><a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer"><strong>Cloud Skills Challenge</strong></a>: Sign up for a month-long challenge and clime up the leaderboard</li><li><a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>PowerfulDevs Session</strong></a>: Enable millions of low code devs by building custom connectors</li><li><a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Learn Collection</strong> </a>: #30DaysOfLowCode resources center</li></ul>]]></content:encoded>
            <category>low-code-february</category>
            <category>28-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
        </item>
        <item>
            <title><![CDATA[10. Secure Connectors with APIM]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day10</link>
            <guid>2023-day10</guid>
            <pubDate>Fri, 10 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Throughout this post, let's discuss how Azure API Management can offer extra security to Power Platform custom connectors.]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 10</code> of #30DaysOfLowCode!</p><p>The theme for this week is <strong>backend</strong>. Yesterday we talked about building custom connectors. Today we'll explore the topic of <em>providing Power Platform custom connectors with additional security via <a href="https://learn.microsoft.com/azure/api-management/api-management-key-concepts?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">Azure API Management</a></em>. Ready? Let's go!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li><a href="#power-platform-custom-connector-authentication-types"><strong>Authentication Types</strong></a> for Custom Connectors</li><li><a href="#prerequisites"><strong>Prerequisites</strong></a></li><li><a href="#deploying-sample-apps"><strong>Deploying</strong></a> Sample Apps<ol><li><a href="#1-api-key-auth">API Key Auth</a></li><li><a href="#2-basic-auth">Basic Auth</a></li><li><a href="#3-oauth2--authorisation-code-auth">OAuth2 – Authorisation Code Auth</a></li><li><a href="#4-bff-backends-for-frontends--combination-of-api-key-auth-and-basic-auth">BFF (Backends-for-Frontends) – Combine API Key Auth &amp; Basic Auth</a></li></ol></li><li><a href="#exercise--try-it-yourself"><strong>Exercise</strong></a> – Try it yourself!</li><li><a href="#resources--for-self-study"><strong>Resources</strong></a> – For self-study!</li></ul><p><img loading="lazy" alt="Empty Banner Placeholder" src="/Low-Code/assets/images/30-10-4efbd6976ad2e4a6b00af11b0146cd7a.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="custom-connector-authentication-types">Custom Connector Authentication Types<a class="hash-link" href="#custom-connector-authentication-types" title="Direct link to heading">​</a></h2><p>Power Platform custom connectors currently support <a href="https://learn.microsoft.com/connectors/custom-connectors/connection-parameters?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">four authentication flow options <!-- -->–<!-- --> No Auth flow, API Key Auth flow, Basic Auth flow and OAuth2 Authorisation Code Auth flow</a>. "No Auth flow" is definitely not an option this time, but let's focus on the other three options throughout this post. You also need to be aware that those authentication types are mutually exclusive. In other words, you CANNOT combine two or more authentication scenarios on one custom connector. Also, if you want to use the API Key auth flow, you CANNOT use the other two authentication types within the custom connector. I'll discuss that later in this post.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="prerequisites">Prerequisites<a class="hash-link" href="#prerequisites" title="Direct link to heading">​</a></h2><p>For this post, you need to have the following signed up:</p><ul><li><a href="https://learn.microsoft.com/office/developer-program/microsoft-365-developer-program?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">Microsoft 365 Developer Program</a></li><li><a href="https://learn.microsoft.com/power-apps/maker/developer-plan?WT.mc_id=dotnet-82212-juyoo?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">Power Platform Developer Program</a></li><li><a href="https://azure.microsoft.com/free/?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">Free Microsoft Azure subscription</a></li><li><a href="https://github.com/signup" target="_blank" rel="noopener noreferrer">Free GitHub account</a></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="deploying-sample-apps">Deploying Sample Apps<a class="hash-link" href="#deploying-sample-apps" title="Direct link to heading">​</a></h2><p>Let's deploy the sample apps for this post. Fork <a href="https://github.com/devkimchi/power-platform-connector-via-apim" target="_blank" rel="noopener noreferrer">this repository</a> and follow the detailed instruction on its README to provision and deploy the sample apps. Once everything is done, you will have one <a href="https://learn.microsoft.com/azure/api-management/api-management-key-concepts?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">API Management</a> instance and three <a href="https://learn.microsoft.com/azure/azure-functions/functions-overview?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">Azure Functions</a> app instances representing authentication scenarios like API Key Auth, Basic Auth and OAuth2 Auth, respectively.</p><p><img loading="lazy" alt="Azure resources provisioned" src="/Low-Code/assets/images/image-01-4893b350e625d25903f0f4cf27595691.png" width="3743" height="1896" class="img_ev3q"></p><p>Each function app has already been integrated with API Management. Let's take a look at each authentication type.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-api-key-auth">1. API Key Auth<a class="hash-link" href="#1-api-key-auth" title="Direct link to heading">​</a></h3><p>The first option is using an API key to provide extra security. Using Azure API Management, you can choose between:</p><ul><li>A concept called <a href="https://learn.microsoft.com/azure/api-management/api-management-subscriptions?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">subscription</a>, where you use the subscription key through a HTTP request header of <code>Ocp-Apim-Subscription-Key</code></li><li>Or you can use a HTTP request query string of <code>subscription-key</code>.</li></ul><p>Both options add another security layer to your API, in addition to your Azure Function app's <code>x-functions-key</code> in the request header or <code>code</code> in the request querystring.</p><ol><li><p>Let's take a look at the <a href="https://learn.microsoft.com/azure/api-management/api-management-howto-policies?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">API policy configurations</a> in API Management.</p><p> <img loading="lazy" alt="API Key Auth - API policy" src="/Low-Code/assets/images/image-02-519de908f5076d4850a46f206ad97020.png" width="3743" height="1896" class="img_ev3q"></p><p>Through this policy, the function app's API key is integrated. Therefore, you don't need to worry about the function app's API key.</p></li><li><p>Now, you want to add the API Management's API key. First, make sure your API settings have enabled the subscription. Also, ensure that no user authorization is enabled by selecting "None" against the "User authorization" option.</p><p><img loading="lazy" alt="API Key Auth - enable subscription" src="/Low-Code/assets/images/image-03-2b17d30198e3fe723b56b7df5f18d092.png" width="3742" height="1896" class="img_ev3q"></p></li><li><p>Export the OpenAPI document by selecting the "Export" menu and choosing the "OpenAPI v2 (JSON)" option. Then you will be able to download an OpenAPI document.</p><p> <img loading="lazy" alt="API Key Auth - export OpenAPI document" src="/Low-Code/assets/images/image-04-0f4bb496b949a6978fd6941e903f1506.png" width="3743" height="1896" class="img_ev3q"></p><p>You might have a question here.</p><blockquote><p>What does the "Create Power Connector" menu do? Isn't that for this API key auth?</p></blockquote><p>That's actually a valid question. The only difference between exporting the OpenAPI document and creating the connector directly through the menu is that which tenant you want to export the connector to. If you want to only use within your tenant, the "Create Power Connector" is a simple and easy way to generate a custom connector. However, if your connector is not only for your tenant, but also other tenant, you should export the OpenAPI document and use it in the other tenants.</p><p>Therefore, throughout this post, you're assuming to use this custom connector in general purpose, rather than tied with your tenant.</p></li><li><p>Let's take a look at the document. It might look like the following JSON document, saying that you MUST use the API key through <code>Ocp-Apim-Subscription-Key</code> in the request header or <code>subscription-key</code> in the request querystring.</p><div class="language-jsonc codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsonc codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "swagger": "2.0",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "securityDefinitions": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "apiKeyHeader": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "type": "apiKey",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "name": "Ocp-Apim-Subscription-Key",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "in": "header"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "apiKeyQuery": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "type": "apiKey",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "name": "subscription-key",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "in": "query"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "security": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "apiKeyHeader": []</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "apiKeyQuery": []</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ],</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "paths": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li><li><p>Alright. Let's import this OpenAPI document for a custom connector. Go to either <code>https://make.powerapps.com</code> for Power Apps or <code>https://make.powerautomate.com</code> for Power Automate, and create a custom connector by importing an OpenAPI file.</p><p><img loading="lazy" alt="API Key Auth - custom connector by OpenAPI file" src="/Low-Code/assets/images/image-05-c3f01493756a551b1b4d7a6dce549f99.png" width="3744" height="2018" class="img_ev3q"></p></li><li><p>It automatically identifies the authentication type to "API Key", the API key parameter name of <code>Ocp-Apim-Subscription-Key</code> and the parameter location of "Header".</p><p><img loading="lazy" alt="API Key Auth - custom connector authentication type" src="/Low-Code/assets/images/image-06-4fad725d45c7f0c6d3af0ef5a47c0b3f.png" width="3744" height="2018" class="img_ev3q"></p></li><li><p>After creating the connector, let's create a connection for the connector. Then, it requires the API key. Enter the API key generated from the API Management.</p><p><img loading="lazy" alt="API Key Auth - custom connector connection" src="/Low-Code/assets/images/image-07-98bf2138b5404b4f773ac2286f82ae33.png" width="3744" height="2018" class="img_ev3q"></p></li><li><p>Test the connector to see whether it works OK or not.</p><p><img loading="lazy" alt="API Key Auth - custom connector test" src="/Low-Code/assets/images/image-08-a7e96a8a482ae51c3040437bb42735a3.png" width="3744" height="2018" class="img_ev3q"></p></li></ol><p>We've added extra security to the custom connector with API Management's API key.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-basic-auth">2. Basic Auth<a class="hash-link" href="#2-basic-auth" title="Direct link to heading">​</a></h3><p>The second option is to use the basic auth flow. It's important to know that <strong>API Management doesn't support this basic auth flow out-of-the-box</strong>. Although it's a limitation, you can still apply this flow for the Power Platform custom connectors by slightly modifying the OpenAPI document.</p><ol><li><p>Let's take a look at the API policy, which is basically the same as the one in the previous section <!-- -->–<!-- --> integrate the function app's API key with API Management.</p><p><img loading="lazy" alt="Basic Auth - API policy" src="/Low-Code/assets/images/image-09-43ad66e234c3721883524bb9664ed757.png" width="3743" height="1896" class="img_ev3q"></p></li><li><p>Make sure that you're not going to use the subscription key at this time. Therefore, disable the subscription key. By doing so, you no longer need the API key for this API.</p><p> <img loading="lazy" alt="Basic Auth - disable subscription" src="/Low-Code/assets/images/image-10-d019fb9324e320f25e7e03908275d976.png" width="3743" height="1896" class="img_ev3q"></p><blockquote><p><strong>WARNING</strong>: If you disable the subscription key for this exercise, your API endpoint works as like a public API <!-- -->–<!-- --> not secure at all. Therefore, you MUST implement the logic in your function app that validates the basic authentication header sent through API Management. As mentioned above, it's required to disable the subscription key because API Management doesn't natively support the basic auth feature. Therefore, if you want to use this approach, please use it with extra care.</p></blockquote></li><li><p>Once you're ready, export the OpenAPI document by selecting the "Export" menu and choosing the "OpenAPI v2 (JSON)" option.</p><p><img loading="lazy" alt="Basic Auth - export OpenAPI document" src="/Low-Code/assets/images/image-11-d07246e17a1562a24a265db43537be65.png" width="3743" height="1896" class="img_ev3q"></p></li><li><p>Then, you will be able to download an OpenAPI document. Let's take a look at the document. It might look like the following JSON document, saying that you MUST use either <code>Ocp-Apim-Subscription-Key</code> in the request header or <code>subscription-key</code> in the request querystring.</p><p>However, you MUST replace both with the basic auth because you will not use the API key auth this time.</p><div class="language-jsonc codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsonc codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "swagger": "2.0",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "securityDefinitions": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬇️⬇️⬇️ Remove both 'apiKeyHeader' and 'apiKeyQuery' ⬇️⬇️⬇️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "apiKeyHeader": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "type": "apiKey",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "name": "Ocp-Apim-Subscription-Key",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "in": "header"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "apiKeyQuery": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "type": "apiKey",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "name": "subscription-key",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "in": "query"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬆️⬆️⬆️ Remove both 'apiKeyHeader' and 'apiKeyQuery' ⬆️⬆️⬆️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬇️⬇️⬇️ Add 'basicAuth' ⬇️⬇️⬇️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "basicAuth": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "type": "basic"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬆️⬆️⬆️ Add 'basicAuth' ⬆️⬆️⬆️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "security": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬇️⬇️⬇️ Remove both 'apiKeyHeader' and 'apiKeyQuery' ⬇️⬇️⬇️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "apiKeyHeader": []</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "apiKeyQuery": []</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬆️⬆️⬆️ Remove both 'apiKeyHeader' and 'apiKeyQuery' ⬆️⬆️⬆️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬇️⬇️⬇️ Add 'basicAuth' ⬇️⬇️⬇️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "basicAuth": []</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬆️⬆️⬆️ Add 'basicAuth' ⬆️⬆️⬆️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ],</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "paths": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li><li><p>Once you update the OpenAPI document, let's import this OpenAPI document for a custom connector. Go to either <code>https://make.powerapps.com</code> for Power Apps or <code>https://make.powerautomate.com</code> for Power Automate, and create a custom connector by importing an OpenAPI file.</p><p><img loading="lazy" alt="Basic Auth - custom connector by OpenAPI file" src="/Low-Code/assets/images/image-12-dd11d14ca6b43c5bdd8b6d24cda4e078.png" width="3744" height="2018" class="img_ev3q"></p></li><li><p>It automatically identifies the authentication type as "Basic authentication", "username", and "password".</p><p><img loading="lazy" alt="Basic Auth - custom connector authentication type" src="/Low-Code/assets/images/image-13-0adbbb234fe8c6c3844ad1b178ab56cf.png" width="3744" height="2018" class="img_ev3q"></p></li><li><p>After creating the connector, let's create a connection for the connector. Then, it requires the username and password. The username and password in this sample app are for <a href="https://www.atlassian.com/software/jira" target="_blank" rel="noopener noreferrer">Atlassian Jira</a>. Therefore, get your email address as the username and API token as the password from there.</p><p><img loading="lazy" alt="Basic Auth - custom connector connection" src="/Low-Code/assets/images/image-14-761992567a48eecc18e9fd2736ba88bd.png" width="3744" height="2018" class="img_ev3q"></p></li><li><p>Test the connector to see whether it works OK or not.</p><p><img loading="lazy" alt="Basic Auth - custom connector test" src="/Low-Code/assets/images/image-15-a020125636e08d1af38de3e0cbdc56da.png" width="3744" height="2015" class="img_ev3q"></p></li></ol><p>We've added extra security to the custom connector with basic auth.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-oauth2---auth-code">3. OAuth2 - Auth Code<a class="hash-link" href="#3-oauth2---auth-code" title="Direct link to heading">​</a></h3><p>The third option is to use <a href="https://oauth.net/2/" target="_blank" rel="noopener noreferrer">OAuth2</a>. There are many authentication flows in OAuth2, but Power Platform custom connector only supports the <a href="https://learn.microsoft.com/azure/active-directory/develop/v2-oauth2-auth-code-flow?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">Authorisation code auth flow</a> at this time of writing. Therefore, let's focus on that. The basic idea of using any OAuth2 auth flow is to get the access token and the resources you want. It's safe to assume that the function app is able to understand the access token and process it.</p><ol><li><p>To use OAuth2 auth flow, you need to first <a href="https://learn.microsoft.com/azure/active-directory/develop/quickstart-register-app?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">register an app</a> in <a href="https://learn.microsoft.com/azure/active-directory/fundamentals/active-directory-whatis?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">Azure Active Directory</a>. After registering a new app, it will give the ability to get the access codes. I'm not going into too many details here, but it's worth taking a look at <a href="https://github.com/devkimchi/power-platform-connector-via-apim/blob/main/src/AuthCodeAuthApp/README.md" target="_blank" rel="noopener noreferrer">this document</a>. Once you create the app, you will have the following information:</p><ul><li>Tenant ID</li><li>Client ID</li><li>Client secret</li><li>Endpoint URL for authorization</li><li>Endpoint URL for the access token</li><li>Endpoint URL for the refresh token</li></ul></li><li><p>With this information, you need to integrate it with API Management. Go to Azure Portal, open the API Management instance, and navigate to the "OAuth 2.0 + OpenID Connect" blade. Add a new OAuth2 service under the "OAuth 2.0" tab.</p><p><img loading="lazy" alt="Auth Code Auth - new OAuth2 service" src="/Low-Code/assets/images/image-16-02f47bdb5ba514b6c11537d9bfd3e12f.png" width="3743" height="1896" class="img_ev3q"></p></li><li><p>Enter the following details in the fields and create the service.</p><ul><li>Display name: <code>AuthCode Auth</code></li><li>Client registration page URL: <code>http://localhost</code></li><li>Authorization grant types: tick only on "Authorization code"</li><li>Authorization endpoint URL: endpoint URL for authorization noted from the above</li><li>Token endpoint URL: endpoint URL for access token noted from the above</li><li>Default scope: <code>https://graph.microsoft.com/.default</code></li><li>Client ID: client ID noted from the above</li><li>Client secret: client secret noted from the above</li></ul><p>After that, you will have both redirect URLs:</p><ul><li><code>null/signin-oauth/code/callback/authcode-auth</code></li><li><code>null/signin-oauth/implicit/callback</code></li></ul><p>Replace <code>null</code> with your API Management instance URL like <code>https://{{APIM_NAME}}.azure-api.net</code>, where <code>{{APIM_NAME}}</code> is your API Management instance name.</p></li><li><p>Add both redirect URLs to your registered app on Azure AD as redirect URLs.</p></li><li><p>Check out the API policy, which is basically the same as in the previous sections <!-- -->–<!-- --> integrate the function app's API key with API Management.</p><p><img loading="lazy" alt="Auth Code Auth - API policy" src="/Low-Code/assets/images/image-17-a7fbbcd2e213d59a43e25e96e8452d02.png" width="3743" height="1896" class="img_ev3q"></p></li><li><p>Make sure you will not use the subscription key this time. Therefore, disable the subscription key. By doing so, you no longer need the API key for this API. In addition to this, because you're using OAuth2 authorization, choose the "OAuth 2.0" option and select the OAuth 2.0 server of "AuthCode Auth" that you just created right before.</p><p><img loading="lazy" alt="Auth Code Auth - disable subscription" src="/Low-Code/assets/images/image-18-eef8b645ceb0f918478d8e211ec3d185.png" width="3743" height="1896" class="img_ev3q"></p><p>It's also worth noting that because the custom connector sends the OAuth2 access token to the function app through API Management, it's safe to assume that the function app is able to understand the token and process it.</p></li><li><p>Once you're ready, export the OpenAPI document by selecting the "Export" menu and choosing the "OpenAPI v2 (JSON)" option.</p><p><img loading="lazy" alt="Auth Code Auth - export OpenAPI document" src="/Low-Code/assets/images/image-19-cc234416e51aba7029234eca6760b5ff.png" width="3743" height="1896" class="img_ev3q"></p></li><li><p>Then, you will be able to download an OpenAPI document. Let's take a look at the document. It might look like the following JSON document, saying that you MUST use either <code>Ocp-Apim-Subscription-Key</code> in the request header or <code>subscription-key</code> in the request querystring.</p><p>However, you MUST remove both because you will not use the API key auth this time. Make sure you MUST replace <code>{{TENANT_ID}}</code> with your tenant ID.</p><div class="language-jsonc codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsonc codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "swagger": "2.0",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "securityDefinitions": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬇️⬇️⬇️ Remove both 'apiKeyHeader' and 'apiKeyQuery' ⬇️⬇️⬇️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "apiKeyHeader": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "type": "apiKey",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "name": "Ocp-Apim-Subscription-Key",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "in": "header"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "apiKeyQuery": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "type": "apiKey",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "name": "subscription-key",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "in": "query"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬆️⬆️⬆️ Remove both 'apiKeyHeader' and 'apiKeyQuery' ⬆️⬆️⬆️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬇️⬇️⬇️ Keep 'oauth2AuthCode Auth' ⬇️⬇️⬇️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "oauth2AuthCode Auth": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "type": "oauth2",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "scopes": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "https://graph.microsoft.com/.default": ""</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "flow": "accessCode",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "authorizationUrl": "https://login.microsoftonline.com/{{TENANT_ID}}/oauth2/v2.0/authorize",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "tokenUrl": "https://login.microsoftonline.com/{{TENANT_ID}}/oauth2/v2.0/token"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬆️⬆️⬆️ Keep 'oauth2AuthCode Auth' ⬆️⬆️⬆️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "security": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬇️⬇️⬇️ Remove both 'apiKeyHeader' and 'apiKeyQuery' ⬇️⬇️⬇️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "apiKeyHeader": [],</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "oauth2AuthCode Auth": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "https://graph.microsoft.com/.default"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "apiKeyQuery": [],</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "oauth2AuthCode Auth": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "https://graph.microsoft.com/.default"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬆️⬆️⬆️ Remove both 'apiKeyHeader' and 'apiKeyQuery' ⬆️⬆️⬆️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬇️⬇️⬇️ Add 'oauth2AuthCode Auth' ⬇️⬇️⬇️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "oauth2AuthCode Auth": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "https://graph.microsoft.com/.default"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ⬆️⬆️⬆️ Add 'oauth2AuthCode Auth' ⬆️⬆️⬆️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ],</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "paths": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li><li><p>Once you update the OpenAPI document, let's import this OpenAPI document for a custom connector. Go to either <code>https://make.powerapps.com</code> for Power Apps or <code>https://make.powerautomate.com</code> for Power Automate, and create a custom connector by importing an OpenAPI file.</p><p><img loading="lazy" alt="Auth Code Auth - custom connector by OpenAPI file" src="/Low-Code/assets/images/image-20-26ce20b7e6736e302d2b0562be2a9cb3.png" width="3744" height="2014" class="img_ev3q"></p></li><li><p>It automatically identifies the authentication type to "OAuth 2.0" and the Identity Provider of "Generic OAuth 2". Then, enter the Client ID, Client secret, and the Refresh URL noted above. Using a different registered app here is OK if it's under the same tenant.</p><p><img loading="lazy" alt="Auth Code Auth - custom connector authentication type" src="/Low-Code/assets/images/image-21-a0b8a0e725d79de4454c03de503d73a9.png" width="3744" height="2014" class="img_ev3q"></p></li><li><p>After creating the connector, let's create a connection for the connector. As you've already provided the client ID and secret, you will immediately create the connection.</p></li><li><p>Test the connector to see whether it works OK or not.</p><p><img loading="lazy" alt="Auth Code Auth - custom connector test" src="/Low-Code/assets/images/image-22-2904da0323b0123319f9cd9239fb5c6a.png" width="3744" height="2014" class="img_ev3q"></p></li></ol><p>We've added extra security to the custom connector with OAuth2 - authorization code auth.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-bff---combine-auth">4. BFF - Combine Auth<a class="hash-link" href="#4-bff---combine-auth" title="Direct link to heading">​</a></h3><p>Many organisations nowadays have requirements using the <a href="https://learn.microsoft.com/azure/architecture/patterns/backends-for-frontends?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">BFF (Backends-for-frontends) pattern</a> through API Management, mainly if your organisation adopts microservice architecture. It's not uncommon that APIs use different authentication approaches for different APIs <!-- -->–<!-- --> one uses the API key auth, another uses the basic key auth, and the other uses the OAuth2 auth.</p><p>If you are about to build a BFF with those APIs using different authentication methods, what would you do? What could you do if you're even about to create the BFF for the Power Platform custom connector? There are many different combinations of authentication methods, but let's focus on following two <!-- -->–<!-- --> API key auth and basic auth:</p><ol><li><p>First of all, you MUST choose which authentication type you will use for the main one for the Power Platform custom connector. If you want to use basic auth as the main one, the custom connector doesn't have to know the API key and vice versa. In other words, the other authentication method MUST be handled by the API Management policy of the BFF API.</p></li><li><p>Let's take a look at <a href="https://github.com/devkimchi/power-platform-connector-via-apim/blob/main/infra/apim-openapi-bff.yaml" target="_blank" rel="noopener noreferrer">this OpenAPI document</a> for BFF. It combines both apps using the API key auth and basic auth, respectively.</p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">openapi</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 3.0.1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">paths</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">/greeting</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">get</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> greeting</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">summary</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Greeting</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">operationId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Greeting</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">security</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">apiKeyHeader</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">apiKeyQuery</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">/profile</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">get</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">tags</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> profile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">summary</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Profile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">operationId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Profile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">security</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">apiKeyHeader</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">apiKeyQuery</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">basicAuth</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">components</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">securitySchemes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">apiKeyHeader</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apiKey</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Ocp</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">Apim</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">Subscription</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">Key</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">in</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> header</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">apiKeyQuery</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apiKey</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> subscription</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">key</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">in</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> query</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">basicAuth</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">scheme</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> basic</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>It defines API key auth and basic auth in the document and applies them to each endpoint.</p></li><li><p>Import this OpenAPI to API Management. Then check out the settings. Make sure you MUST activate the subscription.</p><p><img loading="lazy" alt="BFF - enable subscription" src="/Low-Code/assets/images/image-23-d0808a4b019b906710ea26e965d0a519.png" width="3744" height="1896" class="img_ev3q"></p></li><li><p>Add the <a href="https://learn.microsoft.com/azure/api-management/authentication-basic-policy?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer"><code>authentication-basic</code> as an inbound policy</a> that sets the basic auth token to the request header. After this, API Management automatically injects this basic auth token into every request header.</p><p><img loading="lazy" alt="BFF - basic authentication policy" src="/Low-Code/assets/images/image-24-602cab4fc554457920323ff98cf194bd.png" width="3744" height="1896" class="img_ev3q"></p></li><li><p>Export the OpenAPI document. As you use the API key auth, follow the <a href="#1-api-key-auth">1. API Key Auth</a> pattern.</p></li><li><p>In the Power Platform custom connector, you only need the API key provided by API Management to create the connection because API Management has already encapsulated the basic auth token.</p></li><li><p>Test the connector to see whether it works OK or not. As you can see, both endpoints work perfectly fine.</p><p><img loading="lazy" alt="BFF - custom connector test" src="/Low-Code/assets/images/image-25-8944dbc0af647b582cb0b0c618f8de42.png" width="3744" height="2014" class="img_ev3q"></p></li></ol><p>We've created a BFF by combining APIs that use API key auth and basic auth, and the BFF has been used for the Power Platform custom connector. However, as mentioned earlier in this post, we have to choose only one authentication type due to the restriction of authentication types in the Power Platform custom connector. Therefore, if you need more than one authentication type for your connector, you MUST choose one, and API Management MUST encapsulate all the others.</p><p>Theoretically, there are three possible combinations for BFF:</p><ul><li>API key auth and basic auth</li><li>API key auth and OAuth2 auth code auth</li><li>Basic auth and OAuth2 auth code auth</li></ul><p>Throughout this post, we've walked through the first combination. After that, you can try the other two combinations on your end!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="exercise--try-it-yourself">Exercise <!-- -->–<!-- --> Try it yourself!<a class="hash-link" href="#exercise--try-it-yourself" title="Direct link to heading">​</a></h2><p>If you haven't joined the following programs, it's time to do so for further learning!</p><ul><li><a href="https://learn.microsoft.com/office/developer-program/microsoft-365-developer-program?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">Microsoft 365 Developer Program</a></li><li><a href="https://learn.microsoft.com/power-apps/maker/developer-plan?WT.mc_id=dotnet-82212-juyoo?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">Power Platform Developer Program</a></li><li><a href="https://azure.microsoft.com/free/?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">Free Microsoft Azure subscription</a></li><li><a href="https://github.com/signup" target="_blank" rel="noopener noreferrer">Free GitHub account</a></li></ul><p>Then, follow the steps below. After that, you will be the one who knows better security on Power Platform custom connectors!</p><ul><li>Fork this <a href="https://github.com/devkimchi/power-platform-connector-via-apim" target="_blank" rel="noopener noreferrer">GitHub repository</a> to provision and deploy the sample apps.</li><li>Read and follow the instructions for each scenario:<ul><li><a href="https://github.com/devkimchi/power-platform-connector-via-apim/blob/main/src/ApiKeyAuthApp/README.md" target="_blank" rel="noopener noreferrer">API Key Auth</a></li><li><a href="https://github.com/devkimchi/power-platform-connector-via-apim/blob/main/src/BasicAuthApp/README.md" target="_blank" rel="noopener noreferrer">Basic Auth</a></li><li><a href="https://github.com/devkimchi/power-platform-connector-via-apim/blob/main/src/AuthCodeAuthApp/README.md" target="_blank" rel="noopener noreferrer">Authorisation Code Auth</a></li><li><a href="https://github.com/devkimchi/power-platform-connector-via-apim/blob/main/src/BffApp/README.md" target="_blank" rel="noopener noreferrer">BFF</a></li></ul></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources--self-study">Resources <!-- -->–<!-- --> Self-Study<a class="hash-link" href="#resources--self-study" title="Direct link to heading">​</a></h2><ul><li><a href="https://learn.microsoft.com/azure/architecture/patterns/backends-for-frontends?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">Cloud architecture pattern <!-- -->–<!-- --> BFF (Backends-for-frontends)</a></li><li><a href="https://learn.microsoft.com/azure/active-directory/develop/quickstart-register-app?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">Azure AD application model</a></li><li><a href="https://learn.microsoft.com/azure/api-management/authentication-authorization-overview?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">Azure API Management authentication and authorisation</a></li><li><a href="https://learn.microsoft.com/connectors/custom-connectors/connection-parameters?WT.mc_id=dotnet-82212-juyoo" target="_blank" rel="noopener noreferrer">Power Platform custom connector parameters</a></li><li><a href="https://learn.microsoft.com/power-platform/developer/create-developer-environment" target="_blank" rel="noopener noreferrer">Creating Microsoft 365 Developer Environment</a></li></ul>]]></content:encoded>
            <category>low-code-february</category>
            <category>28-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
        </item>
        <item>
            <title><![CDATA[9b. Use the Custom Connector]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day9-use</link>
            <guid>2023-day9-use</guid>
            <pubDate>Thu, 09 Feb 2023 13:00:00 GMT</pubDate>
            <description><![CDATA[Want to build a Power Platform connector for an API? Or extend an existing one to support new capabilities? Join us on #30DaysOfLowCode to learn how - https://aka.ms/lowcode-february]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 09</code> of #30DaysOfLowCode!</p><p>In the <a href="/Low-Code/blog/2023-day9-build"><strong>first part of the blog</strong></a>, Nitya showed you how to build a custom connector for the Forem v0 API. From now, I (Daniel) will take it over and show you what you can do with the custom connector in the Power Platform. </p><p>If you don't want to follow the whole tutorial, but you <strong>want to just see the solution</strong>, make sure to go the the bottom of the page for a <a href="#completed-solution"><strong>link to the resources</strong></a> that you can import and explore on your own!</p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>SEE US LIVE AT POWERFUL DEVS!</div><div class="admonitionContent_S0QG"><p>Join us Feb 15 at the #PowerfulDevs conference where Daniel and Nitya will walk through the steps of building the connector and application - and more!
<a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Register Here</strong></a></p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>Custom Connectors in the Power Platform</li><li>Build a front end with Power Apps</li><li>Speed up development with the Creator Kit</li><li>Add the Forem v0 connector to your app</li><li>Add the Creator Kit components to your app</li><li>Publish your app</li><li>Completed solution</li></ul><p><img loading="lazy" alt="Building a Custom Connector" src="/Low-Code/assets/images/30-09-02-db4914542d90e41a4d4f768751abf725.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="custom-connectors-in-the-power-platform">Custom connectors in the Power Platform<a class="hash-link" href="#custom-connectors-in-the-power-platform" title="Direct link to heading">​</a></h2><p>When custom connectors are deployed, you will find them in multiple places. And, because the Power Platform is not just a bunch of products together, but also really advocates the 'better together' story, it gives you the possibility to even use data from the custom connector in places where the connector doesn't appear.</p><p>Let me explain that: You can find custom connectors in Power Automate, where you can automate processes.</p><p><img loading="lazy" alt="Image of the forem connector in Power Automate" src="/Low-Code/assets/images/Part2-1-Forem-Power-Automate-357c08b7365bf196cc6c4215eb79771b.png" width="1200" height="1332" class="img_ev3q"></p><p>You can also find custom connectors in Power Apps. Power Apps is the product of the Power Platform where you build apps.</p><p><img loading="lazy" alt="Image of the forum connector in Power Apps" src="/Low-Code/assets/images/Part2-2-Forem-Power-Apps-609bc041c2f92a0a4cf213493b4160f4.png" width="982" height="834" class="img_ev3q"></p><p>But, because the products work very well together, it's also possible to for instance:</p><ul><li>Trigger a Power Automate workflow from a Power BI visual</li><li>Trigger a Power Automate workflow from a Power Virtual Agents chatbot</li><li>Embed a Power App inside of a Power BI report/dashboard</li></ul><p>Which gives you the possibility to use the connector in places even when they don't have a custom connector experience out of the box.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="build-a-front-end-with-power-apps">Build a front end with Power Apps<a class="hash-link" href="#build-a-front-end-with-power-apps" title="Direct link to heading">​</a></h2><p>Power Apps consists of multiple types of apps: canvas apps and model-driven apps. Canvas apps are the apps that give you the possibility to design them how you want. You have the possibility to change everything on the screen. You can even build Power Apps Component Framework components if you want to build your own components with custom code.</p><p>Model-driven apps are a different type of app. It's based on data. First, you start building your data model, and when you're done with that, you start building the forms and views in your app. Lastly, you create the app to pull it all together. It doesn't offer the design freedom canvas apps have, but it gives you a bunch of functionality out of the box in exchange for that. You have responsive design out of the box and you don't have to think much about the controls and formula's that canvas has, because it will do a lot of the heavy lifting for you.</p><p>In this blog, I will focus on building a canvas app, but I wanted to make sure everyone knew about both types of apps.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-a-canvas-app">Create a canvas app<a class="hash-link" href="#create-a-canvas-app" title="Direct link to heading">​</a></h3><p>In this blog, I'm not gonna talk about how to create a canvas app from scratch, because there is a <a href="https://learn.microsoft.com/power-apps/maker/canvas-apps/create-blank-app?WT.mc_id=power-82212-dlaskewitz" target="_blank" rel="noopener noreferrer">great Microsoft Learn article</a> about that. For this example, I created a canvas app in tablet mode.</p><p>When you have created your canvas app in tablet mode, you will see Power Apps Studio:</p><p><img loading="lazy" alt="An overview of the Power Apps maker studio with a purple bar at the top, a command bar below that with actions you can perform for this app and a canvas to create your app with" src="/Low-Code/assets/images/Part2-3-Power-Apps-Create-793ae7c8035f54fb88876788f0afac41.png" width="3840" height="1952" class="img_ev3q"></p><p>Power Apps Studio is the place where you can design, build and manage your canvas app. If you want to learn more about all that you see here, make sure to check out <a href="https://learn.microsoft.com/power-apps/maker/canvas-apps/power-apps-studio" target="_blank" rel="noopener noreferrer">this article</a> which gives you a great explanation about what all the parts of Power Apps Studio.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="speed-up-development-with-the-creator-kit">Speed up development with the Creator Kit<a class="hash-link" href="#speed-up-development-with-the-creator-kit" title="Direct link to heading">​</a></h2><p>There are tons of components available out of the box, like text inputs, date pickers, camera controls, etc. These controls offer you a lot of flexibility, but, if you want to make it yourself really easy, it's a good idea to use the <a href="https://learn.microsoft.com/power-platform/guidance/creator-kit/overview?WT.mc_id=power-82212-dlaskewitz" target="_blank" rel="noopener noreferrer">Creator Kit</a>. The Creator Kit is a solution which you can import into your environment. The solution contains a <a href="https://learn.microsoft.com/power-platform/guidance/creator-kit/components?WT.mc_id=power-82212-dlaskewitz" target="_blank" rel="noopener noreferrer">set of components</a> that are based on the <a href="https://developer.microsoft.com/fluentui?WT.mc_id=power-82212-dlaskewitz" target="_blank" rel="noopener noreferrer">Fluent UI framework</a>.</p><p>There is excellent guidance on how to <a href="https://learn.microsoft.com/power-platform/guidance/creator-kit/setup?WT.mc_id=power-82212-dlaskewitz" target="_blank" rel="noopener noreferrer">install the Creator Kit</a> and how to <a href="https://learn.microsoft.com/power-platform/guidance/creator-kit/creator-kit-explained?WT.mc_id=power-82212-dlaskewitz#learn-how-to-add-components-to-an-app" target="_blank" rel="noopener noreferrer">add the code components to a canvas app</a>.</p><p>In the app, I use the following code components:</p><ul><li>Details list (<a href="https://learn.microsoft.com/power-platform/guidance/creator-kit/detailslist" target="_blank" rel="noopener noreferrer">link</a>)</li><li>Pivot (<a href="https://learn.microsoft.com/power-platform/guidance/creator-kit/pivot" target="_blank" rel="noopener noreferrer">link</a>)</li><li>Search box (<a href="https://learn.microsoft.com/power-platform/guidance/creator-kit/searchbox" target="_blank" rel="noopener noreferrer">link</a>)</li></ul><p>The end result will look like this:</p><p><img loading="lazy" alt="Dev.to Power App which shows a menu at the top, a search box and a list of dev.to articles" src="/Low-Code/assets/images/Part2-4-Power-App-Finished-bd868dc13c7bdfbf3065d280b50eaa06.png" width="3266" height="1826" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="add-the-forem-v0-connector-to-your-app">Add the Forem v0 connector to your app<a class="hash-link" href="#add-the-forem-v0-connector-to-your-app" title="Direct link to heading">​</a></h2><p>To work with the forem connector, you first need to add that to your app. Go to Power Apps Studio and select the <code>Data</code> icon in the left menu. Next, add the connector to your app by selecting the <code>Add data</code> button. Search for <code>Forem</code> and click on your custom connector. If you already have a connection, feel free to select that. If not, add a connection here by adding the API key you need for the <a href="https://developers.forem.com/api/v1#getting-an-api-key" target="_blank" rel="noopener noreferrer">Forem API</a>.</p><p>After connecting the custom connector to your app, the data tab should look like this:</p><p><img loading="lazy" alt="Screenshot showing connector added to your app" src="/Low-Code/assets/images/Part2-5-Connector-Added-4875c3ede0869c912bea646a4ba98659.png" width="636" height="576" class="img_ev3q"></p><p>To test out if the connector works, we can easily create a collection (local data that's saved in the app) by going to the tree view (layers icon in the left menu), selecting <code>App</code> and changing the <code>OnStart</code> property to:</p><div class="language-powerappsfl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-powerappsfl codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ClearCollect(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Articles, </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Foremv0.GetArticles(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      { </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        page: 1, </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        per_page: 100</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This <code>ClearCollect</code> formula will create a collection with the name <em>Articles</em>. The collection will be filled with whatever comes next. In this case, it's a call to the custom connector <code>Foremv0</code> and specifically, a call to the <code>GetArticles</code> action in the connector. Inside of the call, the parameters <code>page</code> and <code>per page</code> are used to make sure we get 100 items returned.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="add-the-creator-kit-components-to-your-app">Add the Creator Kit components to your app<a class="hash-link" href="#add-the-creator-kit-components-to-your-app" title="Direct link to heading">​</a></h2><p>In the earlier chapter, I already wrote about installing and using the Creator Kit. To build this app, you should have the following code components added to your app:</p><p><img loading="lazy" alt="Screenshot of code components section with Fluent command bar, details list, pivot and search box" src="/Low-Code/assets/images/Part2-6-Components-Added-954abd569cbfbbd906295d9e1a3e1c92.png" width="300" height="156" class="img_ev3q"></p><p>If you don't have those code components available make sure to add them like described in <a href="https://learn.microsoft.com/power-platform/guidance/creator-kit/creator-kit-explained?WT.mc_id=power-82212-dlaskewitz#learn-how-to-add-components-to-an-app" target="_blank" rel="noopener noreferrer">the documentation</a>.</p><p>Let's start building the app!</p><p>First, let's make sure our app <code>OnStart</code> property has the right content. The <code>OnStart</code> property of the app should have a couple of formulas:</p><div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Set(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    AppTheme,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        palette: {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            themePrimary: "#000000",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            themeLighterAlt: "#898989",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            themeLighter: "#737373",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            themeLight: "#595959",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            themeTertiary: "#373737",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            themeSecondary: "#2f2f2f",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            themeDarkAlt: "#252525",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            themeDark: "#151515",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            themeDarker: "#0b0b0b",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            neutralLighterAlt: "#faf9f8",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            neutralLighter: "#f3f2f1",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            neutralLight: "#edebe9",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            neutralQuaternaryAlt: "#e1dfdd",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            neutralQuaternary: "#d0d0d0",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            neutralTertiaryAlt: "#c8c6c4",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            neutralTertiary: "#595959",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            neutralSecondary: "#373737",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            neutralPrimaryAlt: "#2f2f2f",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            neutralPrimary: "#000000",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            neutralDark: "#151515",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            black: "#0b0b0b",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            white: "#ffffff"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">);</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The above formula sets the <code>AppTheme</code> variable we are going to use in the Creator Kit components. The last part of the OnStart property should be as follows:</p><div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ClearCollect(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    colArticles,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    SortByColumns(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        AddColumns(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Foremv0.GetArticles(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    page: 1,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    per_page: 1000,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    tags:"powerplatform, powerapps, dotnet, azure"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "author_name",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            user.name,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "org_name",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            organization.name,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "formatted_date",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Text(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                DateTimeValue(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    Substitute(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        published_at,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        "Z",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        ""</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                ShortDateTime</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "created_at",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Descending</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The above <code>ClearCollect</code> formula creates a collection called <code>colArticles</code>. The <code>GetArticles</code> action of the custom connector will be used to grab the last 1000 articles with the tags <code>powerplatform, powerapps, dotnet, azure</code>. Wrapped around that call we have two other formulas: the <code>Addcolumns</code> formula to flatten the result of the API and add some columns, and the <code>SortByColumns</code> formula to sort the articles by created date.</p><p>That's it for our app <code>OnStart</code> formula. Next, let's create the header. The header consists of the following three parts:</p><ul><li>Logo (image)</li><li>Pivot (pivot from the Creator Kit)</li><li>SearchBox (search box from the Creator Kit)</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="logo">Logo<a class="hash-link" href="#logo" title="Direct link to heading">​</a></h3><p>For the logo, click on the <code>plus</code> icon on the left side, which opens up the <code>Insert</code> menu. Search for <em>image</em> in the search box. Click on <code>Image</code> that shows up in the insert menu. At the right side of your screen you can see the properties of your control. This is where you can find properties, like in this case the property <code>Image</code>, which enables you to upload an image or choose one that's already added to your app. Click on the dropdown next to <code>Image</code> where it shows <code>None</code> and add an image file. I added the dev.to logo here, since this app will connect to dev.to.</p><p>Drag your image to the top-left of the screen and make sure to add a padding of <code>10</code> to the top, bottom, left &amp; right of the image.</p><p>This should result in properties looking like this (changed properties in red):</p><p><img loading="lazy" alt="Screenshot of the image properties" src="/Low-Code/assets/images/Part2-7-Image-Properties-52ec58d246ff17ff80022cb34b56e0da.png" width="400" height="592" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="pivot">Pivot<a class="hash-link" href="#pivot" title="Direct link to heading">​</a></h3><p>Next, add the <code>Fluent Pivot</code> component via the <code>Insert</code> menu. Set the <code>X</code> property to <code>100</code>, the <code>Height</code> property to <code>50</code> and the <code>Width</code> property to <code>600</code>. For the <code>Y</code> property, we will use a different way of changing a property. For this we have to:</p><ol><li>Press the <code>Y</code> in the properties panel of the Pivot component</li><li>Change the value of the <code>Y</code> property to <code>Self.Height/2</code> in the formula bar.</li></ol><p><img loading="lazy" alt="Screenshot of Power Apps page showing properties panel" src="/Low-Code/assets/images/Part2-8-Pivot-Properties-1-58f1853cff569d2623a3e5a211297517.png" width="3840" height="1952" class="img_ev3q"></p><p>This will place the pivot on the right side of the dev.to logo you just added. Change the <code>Theme</code> property to <code>AppThemeJson</code> so that it will get the theme you have set in the app <code>OnStart</code>.</p><p>Now we have a pivot, but it doesn't do anything. To change this we need to change the following properties:</p><ul><li><strong>Items</strong>:</li></ul><p>Change this property to the following table:</p><div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Table(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemKey: "Home",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemDisplayName: "Home",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemIconName: "Home"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemKey: "Azure",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemDisplayName: "Azure",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemIconName: "AzureLogo"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemKey: "DotNet",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemDisplayName: ".NET",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemIconName: "Code"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemKey: "PowerPlatform",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemDisplayName: "Power Platform",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemIconName: "PowerApps"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemKey: "MyUnpublishedArticles",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemDisplayName: "My Unpublished Articles",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ItemIconName: "Contact"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This table contains a couple of items, which all have three properties:</p><ol><li><code>ItemKey</code> - this is the internal key of the item, we will use it later on in the OnSelect to find out which item has been selected.</li><li><code>ItemDisplayName</code> - this is the name that will be displayed in the pivot.</li><li><code>ItemIconName</code> - this is the icon name that will be displayed in the pivot.</li></ol><p>For more info on the workings of the pivot, go to <a href="https://learn.microsoft.com/power-platform/guidance/creator-kit/pivot?WT.mc_id=power-82212-dlaskewitz" target="_blank" rel="noopener noreferrer">the documentation</a>.</p><ul><li><strong>SelectedKey</strong></li></ul><p>Change this property in the formula bar to the following:</p><div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Self.Selected.ItemKey</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This setting will make sure the pivot component will show a line below the currently selected item.</p><ul><li><strong>OnSelect</strong></li></ul><div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Switch(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Self.SelectedKey,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "Azure",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ClearCollect(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        colArticles,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        SortByColumns(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            AddColumns(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Foremv0.GetArticles(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        page: 1,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        per_page: 1000,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        username: "azure"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "author_name",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                user.name,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "org_name",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                organization.name,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "formatted_date",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Text(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    DateTimeValue(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        Substitute(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            published_at,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            "Z",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            ""</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    ShortDateTime</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "created_at",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Descending</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "DotNet",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ClearCollect(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        colArticles,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        SortByColumns(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            AddColumns(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Foremv0.GetArticles(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        page: 1,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        per_page: 1000,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        tag: "dotnet"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "author_name",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                user.name,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "org_name",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                organization.name,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "formatted_date",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Text(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    DateTimeValue(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        Substitute(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            published_at,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            "Z",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            ""</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    ShortDateTime</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "created_at",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Descending</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "Home",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ClearCollect(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        colArticles,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        SortByColumns(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            AddColumns(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Foremv0.GetArticles(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        page: 1,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        per_page: 1000,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        tags: "powerplatform, powerapps, dotnet, azure"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "author_name",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                user.name,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "org_name",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                organization.name,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "formatted_date",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Text(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    DateTimeValue(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        Substitute(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            published_at,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            "Z",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            ""</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    ShortDateTime</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "created_at",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Descending</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "MyUnpublishedArticles",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ClearCollect(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        colArticles,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Foremv0.GetMyUnpublishedArticles()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "PowerPlatform",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ClearCollect(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        colArticles,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        SortByColumns(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            AddColumns(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Foremv0.GetArticles(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        page: 1,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        per_page: 1000,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        tag: "powerplatform"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "author_name",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                user.name,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "org_name",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                organization.name,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "formatted_date",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Text(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    DateTimeValue(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        Substitute(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            published_at,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            "Z",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            ""</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    ShortDateTime</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "created_at",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Descending</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The above formula is very long, this is because here I use a <code>Switch</code> formula to have different behavior per selected item. In this case, you can see that when the item with the <code>MyUnpublishedArticles</code> key is selected, it's doing a different call (GetMyUnpublishedArticles) than when the item with the <code>PowerPlatform</code> key is selected (GetArticles, with tag parameter with the value powerplatform). The rest of the item selections are pretty much the same.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="search-box">Search Box<a class="hash-link" href="#search-box" title="Direct link to heading">​</a></h3><p>Let's add the <code>Fluent SearchBox</code> component via the <code>Insert</code> menu. Set the following properties:</p><table><thead><tr><th>Property</th><th>Value</th></tr></thead><tbody><tr><td>Theme</td><td>AppThemeJson</td></tr><tr><td>X</td><td>700</td></tr><tr><td>Y</td><td>30</td></tr><tr><td>Width</td><td>600</td></tr><tr><td>Height</td><td>30</td></tr></tbody></table><p>Now, we are done with the header. Let's move on with the details list, which we'll use to show all the articles.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="details-list">Details List<a class="hash-link" href="#details-list" title="Direct link to heading">​</a></h3><p>The details list is where all the articles are shown. Add the <code>Fluent Details List</code>. Set the following properties:</p><table><thead><tr><th>Property</th><th>Value</th></tr></thead><tbody><tr><td>Theme</td><td>AppThemeJson</td></tr><tr><td>X</td><td>0</td></tr><tr><td>Y</td><td>140</td></tr><tr><td>Width</td><td>1366</td></tr><tr><td>Height</td><td>628</td></tr></tbody></table><p>Now the details list has the right dimensions and position, but it doesn't have the right content and settings, for that we need to change the following properties:</p><ul><li><strong>OnChange</strong>:</li></ul><p>The following formula is documented in the documentation of the <a href="https://learn.microsoft.com/power-platform/guidance/creator-kit/detailslist#manual-sorting" target="_blank" rel="noopener noreferrer">details list</a>. This is to make sure the local collection can be sorted the way we want to sort it.</p><div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">If(Self.EventName="Sort", </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">UpdateContext({</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                ctxSortCol:Self.SortEventColumn,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                ctxSortAsc:If(Self.SortEventDirection='PowerCAT.FluentDetailsList.SortEventDirection'.Ascending,true,false)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> })</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">);</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ul><li><strong>Items</strong>:</li></ul><p>In the <code>Items</code> property, use an <code>if</code> condition to make sure our search box works. In this case, the <code>if</code> condition checks if the length of the SearchText in the search box is greater than or equal than 3. If that's the case, a <code>Search()</code> formula will be kicked off, that will search within the <code>colArticles</code> collection for the title, tags and the author name. If a match is found, it will show it in the details list. If not, the details list will become empty.</p><p>If the condition is not met, it will show just the <code>colArticles</code>. In both cases it will perform sorting as well.</p><div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">If(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Len(SearchBox1.SearchText) &gt;= 3,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    SortByColumns(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Search(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            colArticles,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            SearchBox1.SearchText,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "title",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "tags",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "author_name"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ctxSortCol,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        If(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ctxSortAsc,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            SortOrder.Ascending,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            SortOrder.Descending</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    SortByColumns(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        colArticles,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ctxSortCol,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        If(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ctxSortAsc,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            SortOrder.Ascending,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            SortOrder.Descending</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ul><li><strong>Fields</strong>:</li></ul><p><img loading="lazy" alt="Image of the properties that need to be added" src="/Low-Code/assets/images/Part2-9-Details-List-Properties-1-823e471de1d58d476f967759c180dd79.png" width="600" height="440" class="img_ev3q"></p><p>Select the <code>edit</code> button next to the <code>Fields</code> property and click <code>Add field</code>. Make sure to add the following fields:</p><ul><li>title</li><li>author_name</li><li>org_name</li><li>formatted_date</li><li>comments_count</li><li>public_reactions_count</li><li>tags</li></ul><p>Now we have the fields available to us, but they don't show yet in the details list. For that, we need to change the <code>Columns</code> property.</p><ul><li><strong>Columns</strong>:</li></ul><p>Add the following formulas to the <code>Columns</code> property:</p><div class="language-c# codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-c# codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Switch(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Pivot1.Selected.ItemKey,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "MyUnpublishedArticles",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Table(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColDisplayName: "📰 Title",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColName: "title",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColBold: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColWidth: Parent.Width-100,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColRowHeader: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColResizable: true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Table(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColDisplayName: "📰 Title",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColName: "title",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColBold: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColWidth: 700,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColRowHeader: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColResizable: true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColDisplayName: "✍️ Author",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColName: "author_name",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColResizable: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColWidth: 200,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColRowHeader: true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColDisplayName: "🏢 Org",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColName: "org_name",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColResizable: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColWidth: 100,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColRowHeader: true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColDisplayName: "⏰ Published",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColName: "formatted_date",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColResizable: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColWidth: 150,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColRowHeader: true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColDisplayName: "💬",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColName: "comments_count",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColResizable: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColSortable: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColWidth: 50,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColRowHeader: true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColDisplayName: "❤️",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColName: "public_reactions_count",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColResizable: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColSortable: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColWidth: 50,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColRowHeader: true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColDisplayName: "🏷️",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColName: "tags",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColWidth: 250,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColFirstMultiValueBold: true,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            ColMultiValueDelimiter: " "</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The above formulas ensure that when the "MyUnpublishedArticles" item is selected in the pivot, it only shows the title column. If that item is not selected, it will show a lot more columns. All the columns are added to a table in both cases, and have properties like:</p><ul><li>ColDisplayName: the display name of the column</li><li>ColName: the name of the field</li><li>ColBold: if the column needs to be bold or not</li><li>ColWidth: the width of the column</li></ul><p>If you want to know all possible properties, make sure to check out the <a href="https://learn.microsoft.com/power-platform/guidance/creator-kit/detailslist#columns-properties?WT.mc_id=power-82212-dlaskewitz" target="_blank" rel="noopener noreferrer">docs</a>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="publish-your-app">Publish your app<a class="hash-link" href="#publish-your-app" title="Direct link to heading">​</a></h2><p>With that, our app is ready for publishing. Select the save icon on the top right corner of the screen or use the <code>ctrl + S</code> or <code>cmd + S</code> shortcut to save your app. Publish your app by selecting the icon in the top right corner of the screen or use the <code>ctrl + shift + P</code> or <code>cmd + shift + P</code> shortcut to save your app.</p><p>There's also a share icon in the same row as the save and publish icons. You can use that to share the app with your colleagues:</p><p><img loading="lazy" alt="Share app experience where you can share the app with a colleague, add an email message and an image" src="/Low-Code/assets/images/Part2-10-Share-1a5af30ba75b8023e3f298a823d967c0.png" width="800" height="832" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="completed-solution">Completed solution<a class="hash-link" href="#completed-solution" title="Direct link to heading">​</a></h2><p>The custom connector and the canvas app are available as a solution via <a target="_blank" href="/Low-Code/assets/files/Forem_1_0_0_0-ed27b1a590fa00c5886f25356208840d.zip">this link</a>. You can import the solution via the import solution functionality that is described <a href="https://learn.microsoft.com/power-apps/maker/data-platform/import-update-export-solutions" target="_blank" rel="noopener noreferrer">here</a>.</p><p>And that also concludes this blog, hopefully this helps you when you start developing with Power Apps. Don't forget to check out the resources below!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li><a href="https://learn.microsoft.com/power-apps/maker/canvas-apps/create-blank-app?WT.mc_id=power-82212-dlaskewitz" target="_blank" rel="noopener noreferrer"><strong>Create a canvas app from scratch</strong></a></li><li><a href="https://learn.microsoft.com/power-platform/guidance/creator-kit/overview?WT.mc_id=power-82212-dlaskewitz" target="_blank" rel="noopener noreferrer"><strong>Creator Kit</strong></a></li><li><a href="https://learn.microsoft.com/power-platform/guidance/creator-kit/components/?WT.mc_id=power-82212-dlaskewitz" target="_blank" rel="noopener noreferrer"><strong>Creator Kit components</strong></a></li><li><a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=power-82212-dlaskewitz" target="_blank" rel="noopener noreferrer"><strong>PowerfulDevs Session</strong></a>: Enable millions of low code devs by building custom connectors</li><li><a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Learn Collection</strong></a> LowCode February</li></ul><p><img loading="lazy" alt="Campaign Banner" src="/Low-Code/assets/images/30-banner-d9bab2b92d758942447a4cbc50aef715.png" width="1334" height="560" class="img_ev3q"></p>]]></content:encoded>
            <category>connectors</category>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
        </item>
        <item>
            <title><![CDATA[9a. Build a Custom Connector]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day9-build</link>
            <guid>2023-day9-build</guid>
            <pubDate>Thu, 09 Feb 2023 12:00:00 GMT</pubDate>
            <description><![CDATA[Want to build a Power Platform connector for an API? Or extend an existing one to support new capabilities? Join us on #30DaysOfLowCode to learn how - https://aka.ms/lowcode-february]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 09</code> of #30DaysOfLowCode!</p><p>It's <strong>Integrations Week</strong>! So far, we've talked about Power Platform Connectors - from <a href="/Low-Code/blog/2023-day6">built-in options</a> to <a href="/Low-Code/blog/2023-day8">serverless computing solutions</a> with automated workflows triggered by connectors. But what if prebuilt connectors don't support <em>your</em> requirements? That's where <strong>custom connectors</strong> come in. Join us today for a 2-part tutorial as we take you step-by-step through the process of <em>building, testing, and using</em> a custom connector! </p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>SEE US LIVE AT POWERFUL DEVS!</div><div class="admonitionContent_S0QG"><p>Join us Feb 15 at the #PowerfulDevs conference where Daniel and Nitya will walk through the steps of building the connector and application - and more!
<a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Register Here</strong></a></p></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li><strong>Motivation</strong> - Why are custom connectors needed?</li><li><strong>Scenario</strong> - Let's build a dev.to Connector!</li><li><strong>Process</strong> - Building from an OpenAPI specification</li><li><strong>Testing</strong> - Validate it works!</li><li><strong>Exercise</strong>: <a href="https://learn.microsoft.com/training/paths/build-custom-connectors/?WT.mc_id=javascript-82212-ninarasi&amp;ns-enrollment-type=Collection&amp;ns-enrollment-id=xz6ehr2mx031y0" target="_blank" rel="noopener noreferrer">Training: Build custom connectors for Power Automate</a></li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Low Code February Collection</a></li></ul><p><img loading="lazy" alt="Building a Custom Connector" src="/Low-Code/assets/images/30-09-01-55d2e4e7e20b8c53e2eb2a9a4b875a18.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-custom-connectors">Why Custom Connectors?<a class="hash-link" href="#why-custom-connectors" title="Direct link to heading">​</a></h2><p>From <a href="/Low-Code/blog/2023-day6">the earlier post</a> we know Connectors are wrappers around APIs that make it easier for low-code developers to take actions and trigger workflows based on API-supported operations. And we know there are <a href="https://learn.microsoft.com/connectors/connector-reference/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">900+ pre-built connectors</a>  for Power Platform.</p><p><em>So why would I want to build a custom connector?</em> We can think of three reasons:</p><ol><li><strong>The API exists, but connector does not</strong> - and you need to work with the API!</li><li><strong>The connector exists, but it's not perfect</strong> - you need a more customized or complete version.</li><li><strong>The API is being built by you</strong> - and you want to build a connector in parallel, to drive usage.</li></ol><p>As a JavaScript Cloud Advocate, this was exactly the situation I faced when I wanted to explore the low-code ecosystem from a pro-developer perspective. I had a specific scenario I wanted to implement and the API existed <strong>but the connector did not</strong>! </p><p>So I reached out to my colleague Daniel (Power Platform Cloud Advocate) and his response was immediate: <em>Let's build a custom connector!!</em>. Alright then!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="our-target-scenario">Our Target Scenario<a class="hash-link" href="#our-target-scenario" title="Direct link to heading">​</a></h2><p>You might know that there is an <a href="https://dev.to/azure" target="_blank" rel="noopener noreferrer">Azure publication on dev.to</a>, a community-driven content portal where cloud advocates publish tutorials, tips and best practices for developers. We have 100+ contributors on that publication, and each post can have up to 4 tags. We wanted to view the content in different ways, but the default dev.to dashboard only shows us a chronological view. So here's our scenario:</p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>USER SCENARIO</div><div class="admonitionContent_S0QG"><p>As a user, I want to see a list of articles from dev.to</p><ul><li>for the Azure organization</li><li>for a specific user</li><li>for a specific tag</li></ul><p>where each item should provide {publication date, author, tags, description, link}.</p></div></div><p>The good news? The dev.to site is built on a platform called Forem - <a href="https://developers.forem.com/" target="_blank" rel="noopener noreferrer">which has an API</a> that provides <em>exactly</em> the kinds of operations (e.g., <code>/articles</code>) that can help us build this dashboard scenario. But there is no <em>prebuilt connector</em> for this API, so it was time to build one!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-build-lifecycle">The Build Lifecycle<a class="hash-link" href="#the-build-lifecycle" title="Direct link to heading">​</a></h2><p>The Power Platform <a href="https://learn.microsoft.com/connectors/custom-connectors/#lifecycle?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">documentation</a> describes this 5-step process for building a custom connector:</p><p><img loading="lazy" src="https://learn.microsoft.com/connectors/custom-connectors/media/index/authoring-steps.png" alt="The 5-step process for building a custom connector" class="img_ev3q"></p><ol><li><strong>Build &amp; Secure it</strong> - applicable only if you are building the API itself. We are not, so we can skip it.</li><li><strong>Define it</strong> - this is where you describe the methods and metadata in the API. You can hand-craft this <em>or</em> use standardized options (OpenAPI file or Postman collection) to build from.</li><li><strong>Use it</strong> - create a connection to your Connector from a client, and validate it works!</li><li><strong>Share it</strong> - make the connector available to people within your organization to use.</li><li><strong>Certify it</strong> - submit it for Microsoft certification if you want this available to all users.</li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="lets-build-the-connector">Let's Build the Connector!<a class="hash-link" href="#lets-build-the-connector" title="Direct link to heading">​</a></h2><p>We'll follow the guidelines in <a href="https://learn.microsoft.com/connectors/custom-connectors/#tutorial?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">this tutorial</a>. </p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-pre-requisites">1. Pre-Requisites<a class="hash-link" href="#1-pre-requisites" title="Direct link to heading">​</a></h3><p>To get started, you will need the following:</p><ul><li><strong>Subscription</strong> - to Azure (if using Azure Logic Apps), Power Automate, or Power Apps.</li><li><strong>Familiarity</strong> - with core concepts of Logic Apps, Power Automate flows, or Power Apps.</li><li><strong>API Key</strong> - to the Forem API, if using authenticated endpoints</li></ul><p>Note that currently Power Plaform supports only <a href="https://learn.microsoft.com/connectors/custom-connectors/define-openapi-definition#prerequisites?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">OpenAPI v2.0</a> - and the dev.to API uses OpenAPI 3.x.  We can work around this in two ways:</p><ol><li>Use a converter that downgrades API to v2.0 (knowing you may lose some functionality)</li><li>Manually re-create API in Custom Connector wizard (using OpenAPI spec as reference)</li></ol><p>We'll talk briefly about the first option in this post, and encourage you to join us for our <a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>PowerfulDevs Session</strong></a> where Daniel will walk through the steps for the second option!</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-get-the-devplan">2. Get The DevPlan<a class="hash-link" href="#2-get-the-devplan" title="Direct link to heading">​</a></h3><p>Don't have a Power Apps or Power Automate subscription (see pre-requisites)? Just sign up for the <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer">Power Apps Developer Plan</a> and get a free development environment that will work for this purpose. Anyone with a work or school email address (backed by Azure AD) can sign up. Read our earlier post on <a href="/Low-Code/blog/2023-day3"><strong>DevTools and Onboarding</strong></a> options to get yourself set up with a sandbox subscription and test tenant.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-connector-wizard">3. Connector Wizard<a class="hash-link" href="#3-connector-wizard" title="Direct link to heading">​</a></h3><p>Visit the <a href="https://make.powerapps.com/" target="_blank" rel="noopener noreferrer">Power Apps</a> portal and sign in. You should see something like this:</p><p><img loading="lazy" alt="Screenshot of the sign-in page on Power Apps portal" src="/Low-Code/assets/images/1-signin-434385ea4a173bef75ac3f80cc116ca0.png" width="1317" height="553" class="img_ev3q"></p><p>Select <code>Data &gt; Custom Connectors</code> to enter the Custom Connector Wizard. Click the <code>New custom connector</code> drop-down to see the different starting options as shown below. Use the <strong>Create from blank</strong> option to build the custom connector manually. We walk through this approach in our <a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>PowerfulDevs Session</strong></a> on Feb 15 so don't miss it!</p><p><img loading="lazy" alt="Screenshot of new connector options" src="/Low-Code/assets/images/2-options-d43f83ceb93dafc5e71c4cabf840fda1.png" width="1394" height="470" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-openapi-converter">4. OpenAPI Converter<a class="hash-link" href="#4-openapi-converter" title="Direct link to heading">​</a></h3><p>For completeness, let's also see what happens if we were to try using the <em>Import an OpenAPI file</em> option. First <strong><a href="https://developers.forem.com/api/v1" target="_blank" rel="noopener noreferrer">download the dev.to OpenAPI file</a></strong> to your local drive. Then use the <em>Import</em> option in the wizard to upload this file to the portal. (Note: in my case I used a converter tool to convert the OpenAPI YAML to a JSON file before this step).</p><p><img loading="lazy" alt="Screenshot of OpenAPI error" src="/Low-Code/assets/images/3-openapi-17bf4443eec4c1112be69ecb74b16c89.png" width="478" height="335" class="img_ev3q"></p><p>Not surprisingly, we get this error message indicating that the dev.to OpenAPI file uses the v3 specification which is not <em>yet</em> supported. What do we do now?</p><p>If you're a JavaScript developer, you'll likely check npm for a handy converter. And guess what? <a href="https://www.npmjs.com/package/api-spec-converter" target="_blank" rel="noopener noreferrer"><strong>You'd find one!</strong></a> that does exactly what you need. You can even use this directly on the YAML file downloaded from the dev.to API site!</p><p><img loading="lazy" alt="Screenshot of converter README page" src="/Low-Code/assets/images/4-converter-f41cb70161e8b6942cf6786fd33431ae.png" width="1002" height="943" class="img_ev3q"></p><p>Now use the <em>Import</em> option again but with the converted file and - SUCCESS! 🎉 You should be taken into the first step of the Custom Connector creation workflow.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="5-creation-workflow">5. Creation Workflow<a class="hash-link" href="#5-creation-workflow" title="Direct link to heading">​</a></h3><p>The wizard walks you through the 5 key steps of the workflow (see tabs):</p><ol><li><strong>General</strong> - defines the metadata for the Connector. Pay attention to the <code>Host</code> and <code>Base URL</code> fields. These will need to be corrected to align with the API definition. However, importing the file should have filled in details like the <code>Description</code>. Customize this by adding your own icon and background color preferences. <em>Then move to next tab</em>.</li><li><strong>Security</strong> - is the panel where you enter credentials (e.g., API key) required to access the API</li><li><strong>Definition</strong> - is the main tab defining the API. We'll look at this in the next section.</li><li><strong>Code</strong> - The connector can act as a proxy between API and low-code clients. This section allows you to define code that <em>transforms</em> requests or responses in custom ways.</li><li><strong>Test</strong> - This pane helps validate your definition with simple in-wizard tests as we see later.</li></ol><p>For our current purpose, let's dive into the <em>Definition</em> tab for more detail.</p><p><img loading="lazy" alt="Screenshot of Custom Connector Wizard" src="/Low-Code/assets/images/5-wizard-c9bc562518c81c9fd003dd2db7f80e6f.png" width="1440" height="936" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="6-edit-definition">6. Edit Definition<a class="hash-link" href="#6-edit-definition" title="Direct link to heading">​</a></h3><p>The good news is that importing an OpenAPI file will fill in most of the definition details for you. Here, <strong>Actions</strong> are the requests you can make on API (endpoints) - we can see that the default dev.to API endpoints are already defined. Because we downgraded to OpenAPI v2, you may find certain actions throwing <em>error</em> flags.</p><p><img loading="lazy" alt="Screenshot of Definition tab" src="/Low-Code/assets/images/6-definition-55ba531e5f1a3c4d9b9b473b8f5c678a.png" width="1399" height="1035" class="img_ev3q"></p><p>You can use your judgement to delete or edit them manually, till the complete definition is error-free. As a pro-developer, I was particularly happy to see the option to switch to a <em>Swagger editor</em> as shown below. Changes in this editor are kept in sync with the definition, so you can easily move between the wizard UI or this editor, without losing context. The editor view lets you see the raw details of the OpenAPI spec, and the <em>swagger-ui</em> rendered version (at right) for easy debugging.</p><p><img loading="lazy" alt="Screenshot of Swagger Editor" src="/Low-Code/assets/images/6-swagger-8acbdf4003463672a8160f865f16c217.png" width="1663" height="950" class="img_ev3q"></p><p>Once you've completed the definition to your satisfaction, take a minute to click <em>Update connector</em> to make sure the changes are saved to the environment. We aren't doing any code transformations, so let's skip that step and go directly to testing!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="lets-test-the-connector">Let's Test the Connector!<a class="hash-link" href="#lets-test-the-connector" title="Direct link to heading">​</a></h2><p>At this point, we've come to the <a href="https://learn.microsoft.com/connectors/custom-connectors/define-blank#step-5-test-the-connector?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Step 5: Test the connector</a> step of the tutorial. <strong>Testing is currently available only in Power Automate and Power Apps</strong>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-create-connection">1. Create Connection<a class="hash-link" href="#1-create-connection" title="Direct link to heading">​</a></h3><p>The connector is just the wrapper around the API. Before we can use it, we need to associate this with a <em>Connection</em> that provides the required <strong>credentials</strong> (e.g., API key) required to actually use the deployed API endpoint.</p><p>You can create a new connection either from the <em>Connections</em> page (see sidebar) or from the Test tab of the wizard itself. Once the Connection is created, you should be taken to the Connections page to verify that it was created correctly. Now we're ready to test!</p><p><img loading="lazy" alt="Screenshot of Connections UI" src="/Low-Code/assets/images/7-connection-ef478c29bbb7f8143fb965dd1d44bc4a.png" width="1405" height="520" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-test-connector">2. Test Connector<a class="hash-link" href="#2-test-connector" title="Direct link to heading">​</a></h3><p>Switch back to the Custom Connectors page, select the connector you were working on, and move to the <em>Test</em> tab. You should see something like this - where you can now select the newly created connector as the default Connection for the test.</p><p><img loading="lazy" alt="Screenshot of Testing UI" src="/Low-Code/assets/images/7-test-ca4dee6ce31f42e2e5305ca3a749aaad.png" width="1397" height="990" class="img_ev3q"></p><p>At this point, you can simply select the <em>Action</em> (request), provide any necessary parameters, and click <code>Test operation</code> to see if you get the correct response. For example, in the screenshot below, you can see the default response for <code>getUserArticles</code> returns the last article I published on dev.to! </p><p><img loading="lazy" alt="Screenshot of Test Run response" src="/Low-Code/assets/images/7-response-fa0e646f676d2cc87d904ea3a4807646.png" width="1401" height="1057" class="img_ev3q"></p><p>This test tab also provides helpful feedback - for instance <em>schema validation</em> - that can help you further debug and fix any issues in the definition, before you share the connector with others.</p><p><img loading="lazy" alt="Screenshot of Schema Validation output" src="/Low-Code/assets/images/7-schema-fedf024fb55c41d93f7bd017cd75d54f.png" width="733" height="439" class="img_ev3q"></p><div class="theme-admonition theme-admonition-success alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>CONGRATULATIONS 🥳</div><div class="admonitionContent_S0QG"><p>You just built and tested your first custom connector using the dev.to API!</p></div></div><p>Note that testing within the wizard helps with improving the <em>definition</em> but it can be laborious to test everything that your intended application will use. Instead, you might be able to test the connector <em>from an application</em> by <strong>using the connector in a Power Apps or Power Automate</strong> implementation.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="next-use-the-connector">Next: Use The Connector!<a class="hash-link" href="#next-use-the-connector" title="Direct link to heading">​</a></h2><p>Wow - we covered a lot today! Here's a helpful visual recap for your convenience. We defined our scenario, built our connector, tested it within the Custom Connector wizard, and learned about options for sharing it widely. What's next? <strong>Using the connector</strong> in a real-world context, to deliver the rich interactive experience we described in our scenario. <strong>Read Part-2 to see how we used the connector within Power Apps!</strong>.</p><p><img loading="lazy" alt="Building a custom connector" src="/Low-Code/assets/images/Build-Custom-Connector-5bbfca8662cd767bf9cdf8a2d0f2ae8e.png" width="960" height="540" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="exercise">Exercise<a class="hash-link" href="#exercise" title="Direct link to heading">​</a></h2><p>Try building a custom connector yourself, either for the same dev.to API, or for any other OpenAPI-compliant API that you might want to use. And don't forget to <a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>join us Feb 15 for the PowerfulDevs Conference</strong></a> where we walk through the process and demo in under 30 mins!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li><a href="https://learn.microsoft.com/training/paths/build-custom-connectors/?WT.mc_id=javascript-82212-ninarasi&amp;ns-enrollment-type=Collection&amp;ns-enrollment-id=xz6ehr2mx031y0" target="_blank" rel="noopener noreferrer"><strong>Training: Build custom connectors for Power Automate</strong></a> - also in our <a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer">Cloud Skills Challenge</a></li><li><a href="https://learn.microsoft.com/connectors/custom-connectors/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Documentation: Custom Connectors</strong></a> - on Microsoft Learn</li><li><a href="https://github.com/Microsoft/PowerPlatformConnectors/tree/master/custom-connectors" target="_blank" rel="noopener noreferrer"><strong>Examples: Custom Connectors</strong></a> - GitHub Repository</li><li><a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>PowerfulDevs Session</strong></a>: Enable millions of low code devs by building custom connectors</li><li><a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Learn Collection</strong> </a> LowCode February</li></ul><p><img loading="lazy" alt="Campaign Banner" src="/Low-Code/assets/images/30-banner-d9bab2b92d758942447a4cbc50aef715.png" width="1334" height="560" class="img_ev3q"></p>]]></content:encoded>
            <category>connectors</category>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
        </item>
        <item>
            <title><![CDATA[8. Serverless Low Code]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day8</link>
            <guid>2023-day8</guid>
            <pubDate>Wed, 08 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Let's explore the topic of serverless low code and piecing together a workflow with Azure Logic Apps.]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 8</code> of #30DaysOfLowCode!</p><p>The theme for this week is Integrations. Yesterday we talked about Low Code + Dataverse. Today we'll explore the topic of serverless low code and piecing together a workflow with Azure Logic Apps.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>Serverless and Low Code?</li><li>Azure Logic Apps overview</li><li>Let's build a Logic App</li><li>Logic Apps compared to Power Automate</li><li>Resources</li></ul><p><img loading="lazy" alt="Low Code and Serverless" src="/Low-Code/assets/images/30-08-64a7d9f8b3fbde070e36f4f86222aa36.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="serverless-and-low-code">Serverless and Low Code?<a class="hash-link" href="#serverless-and-low-code" title="Direct link to heading">​</a></h2><p>Are you sitting down? Because I'm about to tell you that there's something out there that combines the best of serverless computing with low code development. And that's ... Azure Logic Apps.</p><p>Serverless computing lets you worry less about the underlying infrastructure your code is running on and concentrate more on the code itself.</p><p>A benefit of serverless computing is that you don't write huge applications, instead you write small functions that do one specific task. For example, respond to an HTTP request. Or process a message from a queue.</p><p>Then within that function, you write code that deals with the task. Any logic, or connections to other services - that's pretty much on you to write code for.</p><p>Azure Logic Apps brings the Low Code world to serverless computing. You still solve a problem in a concise of a manner as possible with a Logic App - and the Logic App is started by some sort of event. But instead of writing code, you use a visual designer to piece together a workflow.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="azure-logic-apps-overview">Azure Logic Apps overview<a class="hash-link" href="#azure-logic-apps-overview" title="Direct link to heading">​</a></h2><p>At its heart, Azure Logic Apps automates the execution of business processes by using a visual designer to create workflows.</p><p>But what sets Logic Apps apart, are its pre-made components.</p><p>When you're creating a Logic App, you arrange pre-made components into a sequence - or a workflow. These components are designed to communicate with external services. So you can specify - all in a visual designer - what event should trigger a workflow to start and then what actions should occur.</p><p><img loading="lazy" alt="A diagram showing the step you&amp;#39;ll take when building a logic app." src="/Low-Code/assets/images/1-app-design-process-daffd04c3d64d44da004944e1f2d6187.png" width="550" height="125" class="img_ev3q"></p><p>As I mentioned, there are literally hundreds of external services (or components) you can connect your Logic App to. And the beauty of it is, the Logic Apps runtime takes care of managing the connections to the services. You don't have to worry about writing code to establish connections or check connectivity - Logic Apps has your back.</p><p><img loading="lazy" alt="A graphic showing various 3rd party services a logic app can connect to." src="/Low-Code/assets/images/2-external-services-3518a433503d4dac0f573862a24790ae.png" width="348" height="374" class="img_ev3q"></p><p>Building a Logic App is the process of building a workflow using the components to solve your business problem. Each component will have different triggers that will start a workflow, and different actions that it can take when a workflow is running. How you use them is up to you.</p><p><img loading="lazy" alt="A diagram showing an example Logic App workflow that detects the sentiment of a tweet." src="/Low-Code/assets/images/3-service-use-fed0a45f8b260eed0c10644e310711e5.png" width="460" height="258" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="building-a-logic-app">Building a Logic App<a class="hash-link" href="#building-a-logic-app" title="Direct link to heading">​</a></h2><p>We're not going to create a Logic App from front to back, step-by-step, in this article. That's really worth it's own article and we have some <a href="https://learn.microsoft.com/azure/logic-apps/quickstart-create-first-logic-app-workflow?WT.mc_id=dotnet-82212-masoucou&amp;WT.mc_id=dotnet-82522-masoucou" target="_blank" rel="noopener noreferrer">documentation</a> that will take you through that process.</p><p>Rather I want to concentrate on the major pieces and decision points that you'll make when creating a Logic App.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="connecting-to-other-services">Connecting to other services<a class="hash-link" href="#connecting-to-other-services" title="Direct link to heading">​</a></h3><p>Now let's pause for a second to talk about all of these services that you can connect your Logic Apps workflow to. A <em>connector</em> is a component that provides an interface to an external service. For example, the Twitter connector allows you to send and retrieve tweets, while the Office 365 Outlook connector lets you manage your email, calendar, and contacts.</p><p>There are literally hundreds of connectors from Microsoft and 3rd party vendors that you can use to build your workflows with.</p><p>A connector uses the external service's REST API to do its work. When you use the connector in your Logic App workflow, the connector calls the service's underlying API for you.</p><p><img loading="lazy" alt="A diagram of how a connector works" src="/Low-Code/assets/images/6-connector-b8f6a75f1348446f2a386e749fa599eb.png" width="302" height="151" class="img_ev3q"></p><p>If you can't find a connector that suits your needs? You can build one yourself! It's called a custom connector, and this <a href="https://learn.microsoft.com/connectors/custom-connectors/?WT.mc_id=dotnet-82212-masoucou&amp;WT.mc_id=dotnet-82522-masoucou" target="_blank" rel="noopener noreferrer">series</a> of <a href="https://learn.microsoft.com/connectors/custom-connectors/create-logic-apps-connector?WT.mc_id=dotnet-82212-masoucou&amp;WT.mc_id=dotnet-82522-masoucou" target="_blank" rel="noopener noreferrer">articles</a> will show you how to make your REST API into a connector!</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="kicking-off-the-logic">Kicking off the logic<a class="hash-link" href="#kicking-off-the-logic" title="Direct link to heading">​</a></h3><p>The very first decision you'll need to make when creating a Logic App is to decide what type of event, or <em>trigger</em> will start the workflow running. The trigger specifies the condition to meet before any actions defined in the Logic App execute. Each time the trigger fires, the Logic Apps runtime creates and runs the workflow instance.</p><p>There are a ton of different triggers you can choose from. A workflow can be started with events as varied as a new email arriving to a new message arriving in an Azure Storage queue.</p><p><img loading="lazy" alt="A screenshot showing the 2 different triggers for an Azure Storage Queue" src="/Low-Code/assets/images/5-queue-triggers-c095c63d4c20c23d5c29c9fea5e8d43e.png" width="975" height="348" class="img_ev3q"></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="performing-actions">Performing actions<a class="hash-link" href="#performing-actions" title="Direct link to heading">​</a></h3><p>If a trigger kicks off a workflow, then an action performs a specific task while the workflow is running.</p><p>A connector can be composed of many actions and triggers. For example, the Dropbox connector has triggers to monitor for when a file is created or modified. And it has actions to create a file, list files in a folder, and so on.</p><p><img loading="lazy" alt="Diagram showing the Dropbox connector triggers and actions" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARsAAACWCAIAAABhFrvEAAAACXBIWXMAAAsSAAALEgHS3X78AAAcWUlEQVR4nO2df2wbx5XHR4fDJXGk0lIKuPUfS1cColwAMk5oIIWzhGmc5AYg3dhFpcJLJHETlOoKV5ybONXyn5r+S2Qrp86lEEOiadXkxOBEwI7PJHCWeTgJWrsNIOZsLdCzDYgwt60TA4GltVQnuX90GD1lvN6lKP5YSqT0PjAMcnZ2uKT36zfz9s17TUtLSwRBKuXGp2ThC/z17vN3phYEQVBRCFIfoKIQxEr+vtF/zZGRkZs3b5qaVyUUCq12CEGqp+FtVLmKQpCa0vA2ihBy9OhRj8djai4Vp9OZSqU4joP+Pp+P47jh4WF4G41GE4kEt8zg4GDtvoUsy/39/ZqmDQ4ORqPRqampRCIBL0x9H8DtdouiKAiC6QiyAeA6igiCkE6n4bWmaYqiyLLMjsqyvD43azQa9Xq9+XxeEIQ1VaRnamoK5VQ/oKIIz/OJRAJey7Jss9lAV4QQVVXXTVGqqjI7iTQuqCiqKNASIURRFJ7nbTYbvE2n016v12azwR3vdrvtdrvP51NVFTpDi9PpBE36l2HdNE3Tf5CqqvaviEaj+kNut1tV1XA47Ha7o9Go3+/XH9U0zefzwZnhcNhw/Xa7XZZlTdOCwSD0MQxez8xeV763z87+iEfcZxPVXvzigva9ffaXfE7TkfUAFUXxer0w8ZNl2eFw8DwPmkmn08xAKYoyPDw8NTWlqmo6ndY0ze/3i6KYz+cHBwfD4TDoR9+NmT6A47j8MqOjo6w/MDU1xXGcJEkF53v9/f0OhyOfz8PiSj8pZSQSCUVRYHxRFE3H65rmFtuZyfyZyfyOb3Lvx8LvDAUb6/r1oKIIU5SqqoqiOJZRltE0DSwY9HE4HBzHgd7gKJgF8CiAQgzd9J+iqmowGHQ6nWCCDBasCLIsJxIJu93udrs1TTMMC4iiyPN8MBgseLRRCL05umMnN34+cftWo36LzeDrqx7QANzoDocD1lHBYLDgCgomgfBiZmbGdNzYjREOh1VVTaVSMM0znVGMVCrlcDiKdCCESJIEvkqv19twZorR8bjj9i31ala+fV49m4h2dDpmrysv9kndB4V3hoKXJ+hUoqPTcVgQ93q878fCZxNRp4ufyVK77XTxx08Os6FCr/mh/cfHBw8cpP+UZxPR92NhsIqHBfGwIL4R8M1eV46fHHa6+P4j7kdbbKFTVNWm6yoVtFEreL1eVVUdDofNZgO7pChKQUUBcH+XtWJRVZXneY7jmGuxRHieNy+fVoPneXCrNChwN/9t4b4BPzOZPyyIJ1/3X55Ih94cPTOZJ4S8MxRkduxvi9qZyfyLfdJMVmbLsMUFbe9+73upmR07uX+LhRcXtPdj4fdj4Rf7pDOTeVDj+PnEj18fBKWdTUQXF7TDgliNnFBR9/F6vcxLYbPZHA4H80kUxGazSZIUjUZXcxiYkSRJlmVwJJgOFkOSJE3T4IN8Pl/BnuxKVFVtXANFCAGdPNqy8svv9Xihcfa6smMn53TxYIsWFzSwV6wPHAKjBFbowEGhucXW8bhjcUGbycrQf6XznuXO0zKYu9nrytlEdK/HC6asGnDWtwK4DdhbmJsxRkdH2Wv2nFdYZs1uDJ7nDcPqYT4JcRn9+A6Ho8iJcNk8zze0kBgzWbm5xbbX4y3X6fe3RWrWHm02/ie4uGzumltW/c+RcfsTCxZvaKO2EDc/I8c+IJ4IOfQ2GblUd997cUELveaHqZdBADt2ch2ddH0FJghU1/2VPbk6TRsv/zc1QU/t4dloM1n59i01d2PFuIF1Aks1s3zK3v1emCh2dDr2erxgqUzXVR5oo7YKI5fID98l9sfIoWeotH74LhmRyYc/Idu3bfwPAE+QmGsBbn0DJ06NDp3oD73mB8/Ej48PMtXd/kSF0w8cFA4LIjNK0eW11o6d3PEQdVe82Ec9N7Caam6xvdgnOV38GwEfHHq02XZ5Ig1zv2qWUg2/h9fj8YRCoWri+rYCNz8j3/oZefk5MvLqyre9olJjdZQnp49U9f03dg8v+Ppe7JMOC/Uy48VZ32ajoOdj5BK1TkxOhJDdHDktUDOFWAvO+hoATdPcbrc+QL5cJq7RyZ6BXY8R7XNqqarheQfpfnKr/wPpQUU1ACwgo2J2c3SaZ2D+Hn0feqGqH2BjFw0v9kmwOqofUFHrQTgcZs+C8/m83W4XRTEajUqSxPN8f3+/qqrwgEsQBAjJhc6SJHm9XnjrdrsFQRgcHAwGgxAxyPP88PCwzWaLRqPwQIzFTBk49DR56yK1VJ4n7h8InSP7Oh9oqQDMhWQA11E1B/YsplIpCGOFj5NlGbZCmcNtDQG1NpsNHlVNTU3BZkRFUWZmZvL5vKZpEDgbDodHR0fz+fxqivI8Qd0Sh96mKpq4Rj78mOw+Qd0VVbolEDNoo2qOLMuiKBqi8uDRLQu3DQZXoq1hgheNRiG83RxQK8uyoihO58pWBRjW6/WClkRRXC16Y+RVEvo6OT1OTp6jb194mrbs3mIbsi5PpMf/I3Hgu0JBB70loKJqTvElkDncFiaBRQJqJUnSh0foYwuLf1bohWpXTY3O7HVlJisf+G4Nt5DirK/meL1e2Lxk/qCC4barBdSCWmDHsX7LBvSUZVlV1f7+ftOH1COz15XQa37YaDh0ot/QEnrND9F9bwR88BbaIaDh/VhY3wjPfAkh4+cTL/mcsNdw/HwCHhwPneiHbi/5nPDwihAydKIfPvRsIsqOwiG2W/GNgK+yPYsPKKqtra3pQdra2vQdMplMU1NTb2+vaRxkVWDKB5twDTanYLitOaCW4zhBEHw+H2ww4TiO7R1WVdXr9cJ6zO12N8S+enqjh/pzN5RfxlNnJvPHTw4vLmgnX/ff/kR9LzUT/WAqd0MZCt3/r+GpPfx7qZnmFpshROjMZL6j0zGTleHPO0PB7oMC3ba4k4PI9KET/Zcn0hBs/l5qhj0IPn5y+PjJ4YKh6OwKuw8K76VW3apThAdmfXfu3IF/0UgkMjAwsNqMHCkXllkJ0IfkmsNtCwbUDi4Dr/XxuOaj5gjdeuPyRPr2LfXAQaGjc2VteXkiTTdfeLzNLbbmFtuOndzsdWX2+opVd7p4cyPE7zldPDSCTYNNGdDh6rLMduzkVgunMISij59PzEzL8Bbi1k1nlER566iuri6sPIDULWxnIdsVsv6ssY6am5uDud+ePXva2tqSySSb9eVyue7ubpgjwnQxm80SQnp7e/WNkQh9Jp/NZvfs2QPtsNVUkqSmpiZojEQiyWSyo6MDOsApyGYFbBFYKviK0HI1Ky8uaLdvqbdvqR2dDmbBSgH2O0H4+eKCdjYRZeHqbC7H9nTA5xYMRa/+J19DUUxXgUAA5oSM3t7eTCZz8eLF2dlZ1ihJUjKZDIfDS0tL7e3t7HQQ4dLS0sDAQCQSicfj7BRolCQpl8vNzs7CW9MlIJuH5hbbieWd5+IRN3gmoKW5xfaSzykecbc/7oBo8dLZ6/HCHl59FqQTp0adLv6doSBrhLjy92PhoRP9sKwCPwcstyxxqZc062ttbQ0EAvqWXC6XzWbb29u7uroIIS6XK5PJEEKSySQhpKenB/4Gq5VMJnO5HA10b2qC0+fm5uAF9ISPAJX29PQYFHXlypVjx46ZLmqFq1evmtqQeqej0/HL+ANrRXMLIUTfwl53dDpY5JE+CgnyRuhPb26xhd58YM25YycX/eB+tilzEBNkZarm11u/51GBQCAWi7G3MPdjTE9PS5KUyWQkScpms2NjY+zQrl27iqT/LyI2BFl/KlRU+zK5XC6TybS3t4MtAtdFPB5PJpMDAwNgr8AQgVpyuVx7e3tfX59eWoxwOJzJZLq7u5kFA7Zv315k+9P27dtNbQiyYVT+hHdsbKy9vb17GZizgSq6urrA68B6tra2goTA92AQDABujO7u7q6uroJ6Q5CGwJo9vHv27Mlms7Ozs8wbwZ5rxWIxwxrMWnAP78aCsecGLIhCisfj2Wy2p6dHL6dsNptMJtvb22sqJ0uAyAM2ks/n08fyRKNRt9vt9/tZMGuNkGXZ6XTa7fZEIgGhFexFcdxutyEdNLKBVK4omNo1NTX19fUNDAyALwEeWMGDJpfLdfHiRdN5dQdWu0EspHJFwUMngMUr9fT0sEZYaJnOqzuw2g1iIRh7jtVuECtBRRGsdoNYCO44JKAokIeiKPDoOZ1OF6x2AzZNX+1Gv/3W3E3/KaqqGjbnFsmrrgckxPRZsJ6NKIpwPaIo4uxxA0FFkS1V7Wb+Hk2KtH3bltsPv27grG+FTV/tZv4eOfouaf1nsv8X5OkQ2fUGTeGCWA4qaoVNX+3GE6EpkH73Kpn7NfmfELVR+3+BorIezHu+JYAyAiAkxqG3aYKxKyer+gEwZsIArqO2BBPXaDoxw9rpWLcFZmppiXztEVPrFgYVtSWYv7dqVZvQOVNTOWDecwOoqC2B5wma+9Kgq4nrxPYImahuwzTO+gygZ6KO8Pv94Dxkwa+qqkK0RCKRAK/Dmldb0PNx9Dkqp2MfrFQPIIR6KU6eI8cOmM6vD+KT1JXy+r9bL9fajQygjapHWOQEPA6GbGRFXPlrsn0btUXg7tvNUV1d/TPNhF6HKWZvfEonojdu09eT18nBt0jAQ4RnTf3qaWQ9qKi6xsLw2d0cuflL6vQDM1WHSc8XvqAG5IOPHmhc/JK8eYG6T0IvkJ2Vbteu3chmcNZnGdFo1Ol0wiQNwmT7+/vtdjsLe1UUhQW8skZZlg0BuGzmBlVt4BEWzPrgKIuI9fv9ENDEHkYZQmwNbN9G/XuQ/bze5JS9SYSY8aZnfJwn3/1Xqoq6GrkgqCgr0TRNkqSZmRkIVBdFMZVKybLMImtZwCvE+IHqBEHI5/OSJBmWSYODg4Ig8Dyfz+eZpaqs2k09s/AFXdX0vUc+KVYFgcASSIhRhZRI7UYuAs76rITjOLinYUsIRCpxHKdpGngLIIUy5DFPp9PQAUIc+GXWvJiKq93UJ+evklP/SSdgJXLjNlXIkWdJYB9pebjYObUbuTioqJpQJHypCMVr1TAqrnZTV9yap36CjyvKjffBR3T98/p3ChdorN3IpYCzvnUCbAhs/YCtU7DvA+qvwaGCEa4GNke1m8RHdJZV2U0PfKKR42MFnOC1G7lEUFHrhM1mGx4eBjeD2+12OByiKNpsNtitaLfbFUVZc78G+NAbutrNjU/pHf/mhTLmY0UAJ3jio9qOXBabIVJ2crIMTw3WFrGWsmImsjfpWqUW/NM/kv/635qMfORZOgksnYZXFLKxlBuFlL1JFzlrOt/KIrCP/qndyGWBikKqooK4voLPWyvjGTs5/h3y+DdqPnLpoKKQqqg4UlYfE1QBzQ+tGkNUu5FLARWFVEWVsefxyUriFfZ10rVN8dCh2o1cnIZX1JUrV+bn503Nq4K7fa2l+t0cZT0+an6IhlCV+LCodiMXYTP4+ubn50uveTMxMWFqQyrHqv1RiY9IfGINx3dlAQ21G7kgmGcCqQoLdxwufEFNyuR10wFCvmmjBsS1y3Rgo0c2g1FISL3Q8jA59QMaBHTqwgNO8Apc2AZqN7IZVBRSX3ieoBYDnOAVu7ALUruR9WAUElJ3tDxMXHay7R9I5zfINy0tClu7kRmoqKqA4FQI1VuHsmgVV21rIG7Nk8Dvaazqvf+jxsSqbUs1HVkPKqpyIK0KIWRmZmZqaopFkZcLbOMt5aSKq7YBNz+jyVs8EZr7cuSS6XAdYI4c/0SjoYDVJ1qp3cgGUFGVE41GeZ4fHh6G3VDiMhWMVkqGI9az4ujykUvkWz9bydxCCE0x64ncT4204RSPHIdI8PNXTQdKoHYjFwQVVTlQr81wOtTthakgzMpYvnLY/sSyREAVtkQiEQwGoVhbIpEoUnytmqptNz+jEnr5OZq85fQR8uFPaMbmK2q16S8tAYLxhPgacUOLX9J0aIHf08lbidRu5CKgoipH07SCO5pgz1I+n5dlORqNplIpyAABN/rg4CDUTeM4LpFICIIwODgIxdoEQShSfK2aqm0jl4j9MZr/iLGbI6cFMlJeSQPrgbQqpYcLfZwvtX/tRi4Oes+rouA0jOM4sF2KorC1FrSDEZOXYS16Sim+VpDiJ05cI4eeMZ626zGifU7nftVQcZbmhS/o06FU+dOtxS/pfQ9ZwQq6v2s3cimgoiqH5/l0Ol083YrX6x0eHmZvFUUJh8OSJI2OjrLiiAZKKb5WkCIn7uboHM8ALKKqTIJZWcgNvWvPFV7YlMiN23Q6Z44eqt3IJYKKqhxJksD+QIYjs6PP4XCEw2FZlpnqVFW12WxQ/U3fzjKuwORwdHS03KsqfuKhp8lbF+ndpo8EDZ2jodZVxoaWG4V0a54akIIBQRUAiVYgjKh2I5cFrqMqx+FwjI6OKooC/gBZlg2JlHmeF0XR7/dDB/BkCILgdrv9fj/Ll+T1ejmOA89EKcXXClL8RM8T1C1x6G2qoolryx6/E9RdcfpIobFqBqxtrLrpAXCCDyRrNfKpC6YDRcFI2S1E6Byt0KF9Tr/xC09bk1m2XBtVSiR4ufieopuazl+t1chlzf1QUUhVVLYrfrVI8HIxRI7XbuTSwVkfst5AJPhQL71rqyGwjyT6Vm76G5+SGo1cLuiZQDYGfSR4uTy+476Dm2VrYY1WjVwZqChkw2h5eDkfcidd/RcPa2AY0qrofeUGr3eVI1cMzvqQDca1i06xStn594yd9oSb/tY8DXI9PmZ0ReiDyisbuUrQRiF1QWAfNSlDFwonWjGkVSnuMASvN3PTlTVy9aCNQuqFx79B4i+T175D73I9vqfI+X9ZuelvfEpDWlcLJNeTukqDyieukRJHtgq0UUh9ITy7sv6ZvG50YZebgm/xSzotfMa+Uhe0yMgWgopC6o6d26kT/MandOM6PF2tJqc5BJWD18E8suWgopA6xeAcrwYoYp26suIZr0XCFgauoyrB7/fr42Jhv2BZW3FhdyDsR1SXKWsEILiMqXnzMHGNroUsqQzA3OvxSYu3wRtAG2UBsF+w4Dh+vx+iY/WNUOgaToFD5WoJgJj3zUr2Jl0FWQ4oqqySUGWBNqq2FJRKwX2KiAH6NClA/QoW0vwQjVGqnZxQUdYAtUBhQyHbuwEZjlRVDQaD+lRHwWAQdq2zWZ/hGlgiCr/fry3DWgxbsNjk0263sz6baR64mte7MmrhKzeDsz4rCYfDsGkKxpyamnK73aIo6md9MFVTVXV0dNSQDQK2LSqKMjMzY7PZfD4f7HJXFGW1WSUDzpJlub+/XxCE1TbzNiJ6r3dl1M5XbgZtlJUMDw9DuqKKx5RlWVEUSHMJaSpEUeR5HvIlmbrfRxAE2B1ss9lKqTnfWIDXe6i3EmNVTSB5BayhqHg83rRMPB43HSxMJBJpamqKRKpLCNKYQEF4QRCcTmfFt7UkSfmvAIMmSdLg4GB/f795470ZtjV48+F5gk7bjpQcfff4DroSs6qMTYmsoahkMtna2koIyWQypoP3iUQiHR0dc3NzpiNbEW4ZNqNjOSRKgef5RCJR0BzxPL/5jE+5QFB57KU1dkA1P0RXX4m+2j56KkgxRc3NzWWzWZfL1d7eXlxRyWQyl8vB64GBgaWlpYGBAVOvTUU4HGaJLNn3Ym4Jh8MBaydRFCFnZYnfXRAEjuPcbrfdbnc6naqqRqNRGBNmgKYzymP+Hn3IY86L1Fi4dlFjtVpQuYWB5BVQbFd8JBKRJCkcDudyuXg8HovFAoEAfVCQzUqSBBrr6enJ5XLZbBZOCYfDc3NzkUgkHA4PDAzE4/FIJAJiCwQCsVhsbm6ura2ttbXV5XJlMpnW1tZYLNbT05NMJiVJgp5wrulyCoO74ktk/h5Nev77r9KdQ0LM6h1fFlZkq+zT9UHlzQ+R158nB58y9VtHitkoppmuri72dm5urre3N5vNTk9PLy0tjY2NTU9Pu1wuQsidO3f0Skgmk319fe3t7UtLS7FYLB6P9/X1waG5ubmBgYGxsbG5uTlYoYGcZmdnt4J92xA8EZoC6Xevkrlf0xTNuzmy/xcrodmNi969vq+TGq6NlVMxReVyOZBQR0dHb28vUxRM8Hp6ekBFRWCCZH8nk0no3tra2rUMWDxoIYT09vZuTZdGrRm5RK7+mUwMkKPPke3bqJw+/AlNh3Tsg83w7YRn6Vc79YN19UCsxqrPo+Duh6kaIaS7uzuTyZTu8SuX6elpmElKkpTNZsfG7sefTExM7N+/v0afu0WYuEb1Y8gldqzbAjO1tES+9oipdQuzhqLAjMCLTCaTTCbHxsYkSUomkwMDA+3t7XAULEw2m2X94ZR4PJ5MJgOBANOn6XPuEw6HM5lMd3e3wWfo8XiKLPYaegUFD2RZjJ+BRCIRjUYNdQNkWfb7/QX7F2H+HjVNBamyPEfFec83K4UVBc6G1tZWmK3BtA2sByHk4sWLfX19HR0d0D42NhYIBEAM+oebPT09sVhMkqSmpiaQE/gtTJ9GaWtrg0NdXV1gFbcCUGFtHQJePU/Q3JcGXU1cJ7ZH6HypGjbWM1GHFFYUuBNWa3G5XNPT0/qjPT09+v5MV4Fl9D1bW1tZT/3rO3fumK5i86OqavFCBFZx9DkS+pCumk4fWRHVhx/TokknqisjgJhZ1TOB1Bp9hTX9Ay6n02mO94MSb4ZgWUNMLUTfwjiGEbZvo7bow4/Jrjeo02/3CXL41zQTepWFORAzqKgNQ19hLRqNptNpqN0miiIsrtiFQfjs1NSUfvnEYmrz+bymafq62lAAzvC9dnO0wGHoEJ0BHnqGOtD1BdoQqyg860PWmXQ6zQLGRVGEqm3sEqDqB2ypEkURDrGYWujjWIZtYSzI9m3Uv4fUFFRUg6G3XZIk6eOSzHNFZP3BWV9d4PV6E4kEBMLCSkk/bXM4HBA+C4V9obFITC2ygaCNqgtEUVQUBSqpcRw3PDys35QBMz1wYAiCAMITBIE12my2VCq1pX/BuqFYpGxDgJGyGws+jzKAsz4EsRJUFIJYCSoKQawEFYUgVoKKQhArQUUhiJWgohDESlBRCGIlqCgEsRJUFIJYCSoKQawEFYUgVoKKQhArwd0cW4ibn5HTF2nS8+3b6Mb4o89t9R+kFqCN2iqMXCLf+hlN3gJ5MH/4Lk3hMn9vq/8sloM2aktw8zMqoZefu5+t5YpKFRU6R/ONIRaCNmpLMHJppRgHYzdHTgtkBDNTWA3aqA3m7t27zz///N27d3/zm998+9vfJoT86Ec/Gh8f//nPf/7qq1QBJ0+e/O1vf/v973//1KlTFV/qxDW6cDKw6zGifU4tVTVglmYDqKgN5i9/+ctf//pXQsgf/vAHUNT4+Dgh5I9//CMo6k9/+hMh5MKFC9UoajdXoAobLKKqTILZ4EkVrAcVtcE8+eSTr7zyyt27d1mK+aGhofHxcZATIeSnP/3pr371q1deeaWa6zz0NHnrIrVU+hJsoXO05lKVRdkwz4QBzNyyVTj6LnX0HTtAPJ3UOoXOUXfFxICxBE65oKIMoI3aKoy8SkJfpxU6Ti6Xt3nhadpSpZwQM6ioLUToBSwdUHPQe44gVoKKQhArQUUhiJVshnVUWXWvG923idQ5De89RzYW9J4bwFkfglgJKgpBrAQVhSBWgopCECtBRSGIlaCiEMRKUFEIYiWoKASxElQUglgGIeT/AcWSFEqMm4OeAAAAAElFTkSuQmCC" width="283" height="150" class="img_ev3q"></p><p>You string together actions, after the triggering event, to perform the business logic of your Logic App. But what if your logic had branches or conditions in it?</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="controlling-actions">Controlling actions<a class="hash-link" href="#controlling-actions" title="Direct link to heading">​</a></h3><p>A control action routes the execution within a workflow based on conditions.</p><p>Consider the Azure DevOps connector's Build Complete trigger kicking off a workflow. If the build status is <em>failed</em>, then a text message could be sent using the Azure Communication Service's connector. Otherwise if the build status is successful, a message could be posted to a chat in Microsoft Teams using its connector.</p><p>The <em>if</em> statement is a conditional action. There are others controlling actions such as <em>switch</em> statements, <em>for each</em> and <em>until</em> loops.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="logic-apps-compared-to-power-automate">Logic Apps compared to Power Automate<a class="hash-link" href="#logic-apps-compared-to-power-automate" title="Direct link to heading">​</a></h2><p>Now, you may be thinking to yourself - Logic Apps sound a lot like Power Automate. And you're not wrong, they're both workflow-based services that work with connectors to other services.</p><p>In fact, Power Automate is built upon Azure Logic Apps!</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="ui">UI<a class="hash-link" href="#ui" title="Direct link to heading">​</a></h3><p>They both have a user-friendly design surface to create your workflow on quickly. The difference is that Logic Apps allows you to build a bit more complex integration solutions and utilize advanced development tooling like Visual Studio or VS Code. Logic Apps has a recently refreshed designer, whereas Power Automate still uses the previous designer and is only accessible via the Power Automate portal.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="connectors">Connectors<a class="hash-link" href="#connectors" title="Direct link to heading">​</a></h3><p>On the connectors level, there are some differences. To make it a bit more clear for you, I have split the connectors section up in two parts:</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="logic-apps-only-connectors">Logic Apps only connectors<a class="hash-link" href="#logic-apps-only-connectors" title="Direct link to heading">​</a></h4><p>Logic Apps has the following connectors that are only available for Logic Apps:</p><ul><li>Azure Functions</li><li>IBM 3270/MQ Series</li><li>SAP</li><li>Data Transformation</li><li>Inline Code</li></ul><p>Logic Apps offers a bunch of rich integrations with enterprise systems like IBM 3270 &amp; MQ. Logic Apps also has a fairly advanced SAP connector which supports RFC, BAPI &amp; IDOC actions. It also receives messages from SAP, which the SAP ERP connector from Power Automate can't. Next to the enterprise system connectors, it also offers extra features like Azure Functions integration, Data Transformation &amp; Inline Code.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="power-automate-only-connectors">Power Automate only connectors<a class="hash-link" href="#power-automate-only-connectors" title="Direct link to heading">​</a></h4><p>Power Automate also has connectors that are only available for Power Automate:</p><ul><li>AI Builder</li><li>Approvals</li><li>Desktop flows</li><li>Power Apps</li><li>Power Virtual Agents</li><li>SAP ERP</li></ul><p>Power Automate offers rich integration with Power Platform products like AI Builder, Approvals, Desktop flows (Robotic Process Automation aka RPA), Power Apps &amp; Power Virtual Agents. It also has a SAP ERP connector which supports RFCs and BAPIs. It also has  <a href="https://powerautomate.microsoft.com/blog/announcing-deeper-sap-integration-for-the-power-platform/?WT.mc_id=dotnet-82212-masoucou" target="_blank" rel="noopener noreferrer">nice templates</a> available that they have built since the <a href="https://cloudblogs.microsoft.com/powerplatform/2021/10/22/microsoft-acquires-clear-software-to-enhance-connectivity-to-systems-of-record/?WT.mc_id=dotnet-82212-masoucou" target="_blank" rel="noopener noreferrer">Clear Software acquisition</a>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="licensing">Licensing<a class="hash-link" href="#licensing" title="Direct link to heading">​</a></h3><p>The licensing model is also different, I've listed the characteristics below:</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="power-automate">Power Automate<a class="hash-link" href="#power-automate" title="Direct link to heading">​</a></h4><p>Power Automate is licensed on a per-user, per-flow or Pay-as-you-Go basis.</p><ul><li>The per user model is the all you can eat model for Power Automate. You can create &amp; use as much flows as you want, as long as your Dataverse storage is big enough &amp; you haven't reached your <a href="https://learn.microsoft.com/power-platform/admin/api-request-limits-allocations#licensed-user-request-limits?WT.mc_id=dotnet-82212-masoucou&amp;WT.mc_id=dotnet-82522-masoucou" target="_blank" rel="noopener noreferrer">service limits</a>. It has a version with and without attended Robotic Process Automation (RPA).</li><li>The per flow model is a model that gives you the possibility to let an unlimited number of people within your organization run a flow.</li><li>The pay-as-you-go model has been introduced not too long ago, and this is where you pay per flow run.</li></ul><h4 class="anchor anchorWithStickyNavbar_LWe7" id="logic-apps-consumption--logic-apps-standard">Logic Apps Consumption &amp; Logic Apps Standard<a class="hash-link" href="#logic-apps-consumption--logic-apps-standard" title="Direct link to heading">​</a></h4><p>There are two types of Logic Apps:</p><ul><li>Logic Apps Consumption</li><li>Logic Apps Standard</li></ul><p>Logic Apps Consumption is the type of Logic App that has been around for a while and it's the type of Logic App that Power Automate is based on. You pay per execution. And on top of that, you can pay a fixed fee for an Integration Services Environment. A Logic App can contain only one workflow.</p><p>Logic Apps Standard is a different type of Logic App. You pay a static monthly charge instead of per execution. With Logic Apps Standard, you can have multiple stateful and stateless workflows. You can also host Logic Apps Standard yourself, for instance in a Docker container.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="built-in-vnet">Built-In VNET<a class="hash-link" href="#built-in-vnet" title="Direct link to heading">​</a></h3><p>Logic Apps also has built-in Virtual Network (VNET) configuration included. This is something that Power Automate doesn't offer.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li>Take a <a href="https://learn.microsoft.com/training/modules/intro-to-logic-apps/?WT.mc_id=dotnet-82212-masoucou&amp;WT.mc_id=dotnet-82522-masoucou" target="_blank" rel="noopener noreferrer">self-paced training course</a> on Azure Logic Apps!</li><li><a href="https://learn.microsoft.com/azure/logic-apps/?WT.mc_id=dotnet-82212-masoucou&amp;WT.mc_id=dotnet-82522-masoucou" target="_blank" rel="noopener noreferrer">Azure Logic Apps documentation</a></li><li><a href="https://learn.microsoft.com/power-automate/getting-started?WT.mc_id=dotnet-82212-masoucou&amp;WT.mc_id=dotnet-82522-masoucou" target="_blank" rel="noopener noreferrer">Power Automate documentation</a></li></ul>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
            <category>logic-apps</category>
            <category>azure-logic-apps</category>
            <category>azure-functions</category>
            <category>power-automate</category>
        </item>
        <item>
            <title><![CDATA[7. Dataverse - Do more with Data, for less!]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day7</link>
            <guid>2023-day7</guid>
            <pubDate>Tue, 07 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how to do more with your data for less using Microsoft Dataverse!]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 07</code> of #30DaysOfLowCode!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>What is Dataverse?</li><li>Under The Hood: Features</li><li>Built-in Integrations: Azure</li><li>Enterprise-ready: Hyperscale</li><li>Resource: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Low Code February Collection</a></li><li>Activity: Learn more about <a href="https://aka.ms/Dataverse" target="_blank" rel="noopener noreferrer">Dataverse!</a> </li></ul><p><img loading="lazy" alt="Low Code and Dataverse" src="/Low-Code/assets/images/30-07-618af88183b0d7afa75a84a31fdbc589.png" width="1001" height="420" class="img_ev3q"></p><p>Microsoft Dataverse is a SaaS data platform that helps you <strong><em>easily create and manage your data, events, logic, and generate analytics, and insights to support interconnected apps and processes in a secure and compliant manner</em></strong>. Dataverse, being a hyperscale polyglot storage, can store any type of data (relational, file, observational etc.) for all your transactional or analytical applications. Dataverse is the data platform for all Power Platform products and Dynamics 365 applications, supporting both low-code and pro-code development. It is a critical element of Microsoft Power Platform, supporting all the data, events, analytics, and related processing, besides generating insights for citizen app makers and professional developers to build, store and manage data for their applications. </p><p><img loading="lazy" alt="Figure 1: Microsoft Dataverse and Power Platform" src="/Low-Code/assets/images/DataverseRunsOnAzure-366be95c064bb9ac313730ae468c2b0a.png" width="1909" height="1078" class="img_ev3q">
<em>Figure 1: Microsoft Dataverse and Power Platform</em></p><p>All these diverse types of data, in Dataverse, are represented externally as tables, which not only makes it easy for citizen developers to use it as excel but also accelerates design and development time and cost, for professional developers .Dataverse includes a base set of standard tables that cover typical scenarios, also known as <a href="https://learn.microsoft.com/common-data-model/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Common Data Model (CDM)</a>, but you can also customize or create new custom tables specific to your needs.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="dataverse--under-the-hood">Dataverse -Under the hood<a class="hash-link" href="#dataverse--under-the-hood" title="Direct link to heading">​</a></h2><p>Dataverse enables integrated, intelligent systems of action of the data that is stored. Dataverse achieves this by leveraging Azure services, so it is built on Azure and extends with Azure. </p><p> <img loading="lazy" alt="Figure 2: Microsoft Dataverse and Power Platform" src="/Low-Code/assets/images/DataverseRunsOnAzure-366be95c064bb9ac313730ae468c2b0a.png" width="1909" height="1078" class="img_ev3q"></p><p><em>Figure 2: Microsoft Dataverse Runs on Azure &amp; Extends with Azure</em></p><p>All the building blocks of Dataverse i.e., storage, compute and insights are built on Azure. Similarly, if you need to extend the functionality, you can leverage your existing investments in Azure to augment your customer requirements. </p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-dataverse">Why Dataverse?<a class="hash-link" href="#why-dataverse" title="Direct link to heading">​</a></h2><p>Microsoft Dataverse is much more than a database because it provides a managed SaaS data platform experience for citizen developers and professional developers to build, store, and manage data for their applications. It also provides a rich and intelligent computing layer to integrate and act on these diverse types of data through <a href="https://learn.microsoft.com/power-apps/developer/data-platform/webapi/overview/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">a rich API layer</a>, besides providing analytics and generating insights. </p><p>Let’s look at some of these salient features of Dataverse. </p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="enables-low-code-and-pro-code-integration-of-external-data">Enables low-code and pro-code integration of external data<a class="hash-link" href="#enables-low-code-and-pro-code-integration-of-external-data" title="Direct link to heading">​</a></h3><p>Dataverse provides an ability to use out of the box power of Power Query via <a href="https://learn.microsoft.com/power-query/dataflows/create-use/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Power Platform Data Flows</a>, <a href="https://learn.microsoft.com/azure/data-factory/connector-dynamics-crm-office-365?tabs=data-factory/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Azure Data Factory</a>(ADF) and <a href="https://learn.microsoft.com/power-apps/developer/data-platform/webapi/perform-operations-web-api/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Web API</a> to enable low-code and pro-code developers to integrate external data with Dataverse. With few clicks, users can have a quick start experience to get the data from multitude of data sources specifically from Azure resources into Dataverse with rich, intuitive user experience. Pro dev deeply familiar with data transformations can extend queries and author complex transformations for both ADF and Power Query. A splendid example of using Dataverse data to create reports can be found <a href="https://learn.microsoft.com/power-apps/maker/data-platform/data-platform-powerbi-connector?tabs=Dataverse/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">here</a>. Another powerful feature about data integration with Dataverse is the introduction of Virtual Tables in Dataverse which allows you to integrate external data without moving it physically into Dataverse. With this new experience, you can create virtual tables from SharePoint and SQL without any code, and without leaving the maker portal. In minutes, you can set up your connection, pick your SharePoint Site or SQL Database, select your SharePoint List or SQL Table, and your virtual table will appear in table hub within <a href="https://make.powerapps.com" target="_blank" rel="noopener noreferrer">Maker experience</a> ready to use.</p><p>  <img loading="lazy" alt="Figure 3: Creating a Virtual Table in Microsoft Dataverse" src="/Low-Code/assets/images/VT_SQL_short_221215_small-61b6cd14e7119a8d12312e94f155aad1.gif" width="961" height="467" class="img_ev3q">
<em>Figure 3 : Creating a Virtual Table in Microsoft Dataverse</em> </p><p>You can try it out for yourself using this detailed <a href="https://powerapps.microsoft.com/blog/virtual-tables-creation-wizard-now-in-public-preview/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">information</a>
Additional Info: <a href="https://www.youtube.com/watch?v=viRTtGEZXNE&amp;list=PL8b8RgcLYAyqDb3hgrVOs-xICPtorzSiK&amp;index=2&amp;ab_channel=MicrosoftPowerPlatform" target="_blank" rel="noopener noreferrer">Virtual tables in Dataverse</a></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="advanced-business-logic-eventing-analytics-and-insights-at-no-additional-cost">Advanced business logic, eventing, analytics, and insights at no additional cost<a class="hash-link" href="#advanced-business-logic-eventing-analytics-and-insights-at-no-additional-cost" title="Direct link to heading">​</a></h3><p>Besides Web API, Dataverse also provides several advanced business logic and eventing features like <a href="https://learn.microsoft.com/power-apps/developer/data-platform/calculated-rollup-attributes/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">calculated fields and rollups</a>, and automatic <a href="https://learn.microsoft.com/power-platform/admin/detect-duplicate-records/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">duplicate detection</a> along with powerful built-in AI, Analytics through Power BI, Azure Cognitive Services and <a href="https://learn.microsoft.com/power-apps/use-ai-builder/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">AI Builder</a>. Dataverse allows pro-code extensibility via <a href="https://learn.microsoft.com/power-apps/developer/data-platform/plug-ins/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">plug-ins</a> and low code extensibility using Power FX, like <a href="https://learn.microsoft.com/power-apps/maker/data-platform/formula-columns/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">formula columns</a>.</p><p>Additionally, there is built-in integration with Azure - With a few clicks, you can use <a href="https://learn.microsoft.com/power-apps/maker/data-platform/export-to-data-lake/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Azure Synapse Link for Dataverse</a> to bring your Dataverse data to Azure Synapse, visualize data in your Azure Synapse workspace, and rapidly start processing the data to discover insights using advanced analytics capabilities for serverless data lake exploration, code-free data integration, data flows for extract, transform, load (ETL) pipelines, and optimized Apache Spark for big data analytics. <a href="https://cloudblogs.microsoft.com/powerplatform/2021/05/26/accelerate-time-to-insight-with-azure-synapse-link-for-dataverse/" target="_blank" rel="noopener noreferrer">Here</a> is how you can accelerate time to insight with Azure Synapse Link for Dataverse. </p><p>Here is another glimpse into doing more with <a href="https://www.youtube.com/watch?v=UNMYSEN3VeI&amp;list=PL8b8RgcLYAyqDb3hgrVOs-xICPtorzSiK&amp;index=50&amp;ab_channel=MicrosoftPowerPlatform" target="_blank" rel="noopener noreferrer">analytics using Dataverse</a></p><p>All these features are built-in into Dataverse and hence you do not have to spend any additional time or money managing additional compute services outside Dataverse platform which helps in bringing down the total cost of ownership for an end-to-end business solution.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="providing-data-residency-and-compliance-while-scaling-globally">Providing data residency and compliance while scaling globally.<a class="hash-link" href="#providing-data-residency-and-compliance-while-scaling-globally" title="Direct link to heading">​</a></h3><p>Dataverse serves customers in 18 distinct geographic locations like Asia Pacific, Canada, Switzerland, France, Germany, UK, India, Japan, China, Korea, Norway, Australia, South America, Singapore, UAE, South Africa, North America, Europe and expanding to more regions. To help your organization comply with national, regional, and industry-specific requirements governing the collection and use of individuals’ data, Dataverse provides a comprehensive set of compliance offerings which you can find <a href="https://learn.microsoft.com/power-platform/admin/wp-compliance-data-privacy/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">here</a>.The latest availability information can be found in <a href="https://powerplatform.microsoft.com/availability-reports/georeport/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Product Availability by Geography</a> under Power Apps product, since Dataverse is the data platform for Power Platform products.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="availability-and-reliability-that-you-can-depend-on">Availability and Reliability that you can depend on<a class="hash-link" href="#availability-and-reliability-that-you-can-depend-on" title="Direct link to heading">​</a></h3><p>Dataverse also provides high availability (99.9+ %), reliability features like disaster recovery and business continuity capabilities for your production instance, by leveraging <a href="https://learn.microsoft.com/azure/reliability/availability-zones-overview/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Azure availability zones</a> and asynchronous cross-region replications using <a href="https://learn.microsoft.com/azure/reliability/cross-region-replication-azure/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Azure paired regions</a>. You can read more about these scenarios and solutions in <a href="https://learn.microsoft.com/power-platform/admin/business-continuity-disaster-recovery/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">this article</a> which explains <em>Business Continuity(BC)</em> and <em>Disaster Recovery (DR)</em>. You can watch <a href="https://www.youtube.com/watch?v=QlQmBPYAK8I&amp;list=PL8b8RgcLYAyqDb3hgrVOs-xICPtorzSiK&amp;index=39&amp;t=100s&amp;ab_channel=MicrosoftPowerPlatform" target="_blank" rel="noopener noreferrer">Planet-scale Dataverse</a> to learn more about how Dataverse operates at planet-scale.</p><p>With Dataverse you can store terabytes of data – all types of data like relational, non-relational, image, file etc. and process millions of transactions in a day. You can take a look at the different types of data supported by Dataverse <a href="https://learn.microsoft.com/power-apps/maker/data-platform/types-of-fields/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">here</a>.You can also learn more about <a href="https://www.youtube.com/watch?v=bSscrGddctI&amp;list=PL8b8RgcLYAyqDb3hgrVOs-xICPtorzSiK&amp;index=35&amp;ab_channel=MicrosoftPowerPlatform" target="_blank" rel="noopener noreferrer">Polyglot and Hyperscale Dataverse</a>. Dataverse also delivers fast and <a href="https://learn.microsoft.com/power-platform/admin/configure-relevance-search-organization#what-is-dataverse-search/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">comprehensive search results experience</a> in a single list, sorted by relevance, powered by Microsoft Azure Cognitive Search. Besides all Dataverse instances are backed up automatically every few minutes and these backups can be retained for 7 to 28 days, in case of production environments running Power Platform and Dynamics applications respectively. </p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="enterprise-grade-security-along-with-advanced-risk-and-compliance-features">Enterprise grade Security, along with advanced risk and compliance features<a class="hash-link" href="#enterprise-grade-security-along-with-advanced-risk-and-compliance-features" title="Direct link to heading">​</a></h3><p>Dataverse provides built-in enterprise-grade security that is based on <a href="https://www.microsoft.com/security/business/zero-trust/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Zero Trust</a> principles. The security layer spans across data and compute layer with robust authentication mechanisms and authorization mechanisms like role-based access model. Dataverse also supports advanced risk and compliance features like <a href="https://learn.microsoft.com/power-platform/admin/about-lockbox/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Customer Lockbox</a> and <a href="https://learn.microsoft.com/power-platform/admin/manage-encryption-key/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Customer Managed Key</a>. Learn more about Dataverse Security features and capabilities covered in the <a href="https://download.microsoft.com/download/9/e/d/9edefa88-50a0-4900-97f4-815bca5a7cb8/Dataverse-security-and-scenarios.pdf" target="_blank" rel="noopener noreferrer">Microsoft Dataverse Security white paper</a>.</p><p>You can see by using Microsoft Dataverse with Azure, there is so much you can do with your data for so less - effort, cost and time! </p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next?<a class="hash-link" href="#whats-next" title="Direct link to heading">​</a></h3><p>Stay tuned for the rest of this week's blog posts to dive deeper into the world of connectors and backend integrations.  </p><ul><li>1️⃣ <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Sign up</strong></a> for the free Power Apps Developer Plan.</li><li>2️⃣ <a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer"><strong>Enroll</strong></a> in the Cloud Skills Challenge to learn more about low code and fusion team fundamentals and start climbing that leaderboard!</li><li>3️⃣ Connectors will also be highlighted at the Powerful Devs Conference so be sure to <a href="https://aka.ms/lowcode-february/PowerfulDevsConf2023" target="_blank" rel="noopener noreferrer"><strong>Sign up</strong></a> for the free virtual event!</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li>Resource: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Low Code February Collection</a></li><li><a href="https://learn.microsoft.com/power-apps/maker/data-platform/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Microsoft Dataverse documentation</a></li><li><a href="https://www.youtube.com/watch?v=fbKZlF1WMBk&amp;list=PL8b8RgcLYAyqDb3hgrVOs-xICPtorzSiK&amp;index=5&amp;ab_channel=MicrosoftPowerPlatform" target="_blank" rel="noopener noreferrer">Why to choose Dataverse</a></li><li>Learn more about <a href="https://aka.ms/Dataverse" target="_blank" rel="noopener noreferrer">Dataverse!</a></li></ul>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
        </item>
        <item>
            <title><![CDATA[6. Let's Make Some Connections!]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day6</link>
            <guid>2023-day6</guid>
            <pubDate>Mon, 06 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn about Power Platform's ability to seamlessly pull in and interact with data from a variety of 1st and 3rd party services!]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day #06</code> of #30DaysOfLowCode!</p><p>One of the things that makes the Power Platform so powerful (pun intended) is its ability to seamlessly pull in and interact with data from a variety of 1st and 3rd party services. This integration with other services is done through Connectors - the building blocks of the Power Platform.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>What is a Connector?</li><li>Connectors Components</li><li>Custom Components</li><li>Certifying a Connector</li><li><strong>Activity</strong>: Sign up for your <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer">Developer Plan</a></li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Low Code February Collection</a></li></ul><p><img loading="lazy" alt="Developer Tools and Onboarding" src="/Low-Code/assets/images/30-06-9f6107f37fa6eeb66d72a4c090480ef9.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-a-connector">What is a Connector?<a class="hash-link" href="#what-is-a-connector" title="Direct link to heading">​</a></h2><p> A connector is a wrapper around an API that allows the underlying service to talk to the Power Platform. It's essentially a proxy that provides a way for users to connect their accounts and leverage a set of prebuilt actions and trigger to integrate the services with their apps and workflows.</p><p>The Power Platform offers a large ecosystem of software as a service connectors that enable you to connect apps, data and devices in the cloud. Some examples of popular connectors are Office 365, Outlook, Dropbox, Salesforce, Google Services and many many more.</p><p><img loading="lazy" alt="Connector Architecture" src="/Low-Code/assets/images/06_ConnectorsList-2bbb07ac1ac5ec5f0842f955fb7f145a.png" width="1227" height="905" class="img_ev3q"></p><p>There are hundreds of prebuilt connectors available to use in Power Apps, Power Automate and Logic Apps. You can see a list of all of the connectors available here: <a href="https://learn.microsoft.com/connectors/connector-reference/" target="_blank" rel="noopener noreferrer">https://learn.microsoft.com/connectors/connector-reference/</a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="connectors-components">Connectors Components<a class="hash-link" href="#connectors-components" title="Direct link to heading">​</a></h2><p>Every connector offers action and trigger operations. Let's explore each of those further.</p><p><strong>Actions</strong> are changes that are directed by a user. An action can be used to perform standard CRUD (create, read, update and delete) operations in a data source like a SQL database. Each of these actions directly map to operations defined in the OpenAPI definition for the connector.</p><p><strong>Triggers</strong> allow you to kick off interaction with your connector when specific events occur. For example, the SharePoint connector has a trigger for when a new file is added and the Outlook connector has a trigger for when an email is received. You can build a Logic App or flow in Power Automate that listens to this trigger and performs an action whenever the trigger fires. Triggers are unique to Power Automate and Logic Apps and can't be used inside of Power Apps.</p><p>There are two types of triggers:</p><ul><li><strong>Polling Triggers</strong> which call your service at specified intervals to check for new data. When that new data is available, it causes a new run of your workflow instance with the data as an input.</li><li><strong>Push Triggers</strong> which wait for an event to occur that then causes a new run of your workflow instance.</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="custom-connectors">Custom Connectors<a class="hash-link" href="#custom-connectors" title="Direct link to heading">​</a></h2><p>The amount of out-of-the-box connectors for the Power Platform is growing every day, but sometimes you might want to call API's, services and systems that aren't available as prebuilt connectors. To support this need, you can build custom connectors that have their own triggers and actions.</p><p>A connector is simply a wrapper around an API which means you can take any RESTful API that is defined in OpenAPI (Swagger) and make that accessible to the Power Platform with a custom connector.</p><p><img loading="lazy" alt="Connector Architecture" src="/Low-Code/assets/images/06_ConnectorArchitecture-480c1113e29414a6fb3731823616963b.png" width="1374" height="572" class="img_ev3q"></p><p>You can build custom connectors to connect to both public and private API's.</p><p>Connections to private API's are possible with the <a href="https://learn.microsoft.com/flow/gateway-reference" target="_blank" rel="noopener noreferrer">on-premises data gateway</a>.</p><p>For public API's that you want to create and manage, you might considering leveraging Azure products like <a href="https://azure.microsoft.com/services/functions/" target="_blank" rel="noopener noreferrer">Azure Functions</a>, <a href="https://azure.microsoft.com/services/app-service/web/" target="_blank" rel="noopener noreferrer">Azure Web Apps</a> or <a href="https://azure.microsoft.com/services/app-service/api/" target="_blank" rel="noopener noreferrer">Azure API Apps</a>.</p><p>Custom connectors can either be used internally within your organization or you can get your connector certified so that it's publicly accessible for anyone in the world using the Power Platform and Logic Apps.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="certifying-a-connector">Certifying a Connector<a class="hash-link" href="#certifying-a-connector" title="Direct link to heading">​</a></h2><p>If you want to make your custom connector publicly available you have to go through a certification process where Microsoft reviews the connector to see if it meets certification criteria and approves it for publishing.</p><p>There are two options when it comes to getting a connector certified:</p><ul><li><strong>Verified Publisher</strong> - To be eligible to get certified as a verified publisher, you must own the underlying service behind the connector.</li><li><strong>Independent Publisher</strong> - This gives you a chance to get your connector certified if you do not own the underlying service behind it.</li></ul><p>The processes for certification vary depending on which option you qualify for. You can learn more about the process for getting your connector certified here:</p><ul><li><a href="https://learn.microsoft.com/connectors/custom-connectors/certification-submission-ip" target="_blank" rel="noopener noreferrer">Independent publisher certification process</a></li><li><a href="https://learn.microsoft.com/connectors/custom-connectors/certification-submission" target="_blank" rel="noopener noreferrer">Verified publisher certification process</a></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next?<a class="hash-link" href="#whats-next" title="Direct link to heading">​</a></h2><p>Stay tuned for the rest of this week's blog posts to dive deeper into the world of connectors and backend integrations.  </p><ul><li>1️⃣ <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Sign up</strong></a> for the free Power Apps Developer Plan.</li><li>2️⃣ <a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer"><strong>Enroll</strong></a> in the Cloud Skills Challenge to learn more about low code and fusion team fundamentals and start climbing that leaderboard!</li><li>3️⃣ Connectors will also be highlighted at the Powerful Devs Conference so be sure to <a href="https://aka.ms/lowcode-february/PowerfulDevsConf2023" target="_blank" rel="noopener noreferrer"><strong>Sign up</strong></a> for the free virtual event!</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li><a href="https://aka.ms/LowCodePowerPlatformIntro" target="_blank" rel="noopener noreferrer">Introduction to the Power Platform</a></li><li><a href="https://aka.ms/FusionDevEbook" target="_blank" rel="noopener noreferrer">Fusion Development with Power Platform EBook</a></li><li><a href="https://aka.ms/learn-fusiondev" target="_blank" rel="noopener noreferrer">Fusion Development with Power Platform Learning Path</a></li></ul>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
        </item>
        <item>
            <title><![CDATA[5. Recap - Fundamentals Week ✨]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day5</link>
            <guid>2023-day5</guid>
            <pubDate>Sun, 05 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Let's recap Week 1 of #30DaysOfLowCode focused on #PowerPlatform Fundamentals - join us at #LowCodeFebruary https://aka.ms/lowcode-february]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 05</code> of #30DaysOfLowCode!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li><strong>Look Back</strong>: Recap Fundamentals Week</li><li><strong>Self-Study</strong>: Resources to dive deeper</li><li><strong>Look Ahead</strong>: It's Integrations Week!</li><li><strong>Activity</strong>: Sign up for your <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer">Developer Plan</a></li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Low Code February Collection</a></li></ul><p><img loading="lazy" alt="#30DaysOfLowCode Week 1 Recap" src="/Low-Code/assets/images/30-05-b4d5650de8cc8f3f01300e825742e55c.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="look-back-week-1-recap">Look Back: Week 1 Recap<a class="hash-link" href="#look-back-week-1-recap" title="Direct link to heading">​</a></h2><p>Wow, Low Code February is a hit! We've had <strong>40k+ visits</strong> to our website campaign and <strong>1400+ of you</strong> signed up to take the Cloud Skills Challenge and <em>skill yourself on all things low code</em>! This is incredible and we're super honored to have built something that you, the community, have found valuable! We know that we couldn't have gone so far without the support from everyone of you who's reading this blog right now. THANK YOU! ❤️</p><p><img loading="lazy" alt="Week 1 Roadmap" src="/Low-Code/assets/images/30-roadmap-week1-b013972e42fa22f38dcb1a566c344cba.png" width="1000" height="563" class="img_ev3q"></p><p>Here are the highlights for week 1. If you're just joining us, welcome!! It's not too late to get started learning and skilling up, with two core activities:</p><ol><li><p><a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer"><strong>Cloud skills Challenge</strong></a> - gives you a free curated set of learning modules to jumpstart your learning journey into Low Code and Fusion development. Get building amazing Power Platform solutions using pro-code tools and frameworks. Register now and get on the leaderboard!</p></li><li><p><a href="https://aka.ms/lowcode-february/blog" target="_blank" rel="noopener noreferrer"><strong>#30DaysOfLowCode</strong></a> - gives you daily blog posts from experts. We started this week with a look at <strong>Power Platform fundamentals</strong> (core concepts) and ended it with a look at <strong>Developer Stories</strong> celebrating our low-code and code-first developer communities with real-world case studies.</p><ul><li>🥇 First time hearing the term <em>low-code</em> and want to learn how it helps in your day-to-day work? Read <a href="https://microsoft.github.io/Low-Code/blog/2023-day2" target="_blank" rel="noopener noreferrer"><strong>You say Low, I say Code!</strong></a> for a quick introduction. </li><li>🆕 Never used <em>Power Platform before</em>? Read <a href="http://localhost:3000/Low-Code/blog/2023-day3" target="_blank" rel="noopener noreferrer"><strong>DevTools &amp; Onboarding</strong></a> to get full onboarding guidance, and setup your development environment for success!</li><li>🚀 Want to hear stories from your peers, and understand why more and more code-first developers have turned to low-code and embrace the technology in their daily work? Read <a href="https://aka.ms/lowcode-february/blog/PowerForPros" target="_blank" rel="noopener noreferrer"><strong>Developer Stories</strong></a> posted by our amazing Power Platforms PM team at <a href="https://aka.ms/lowcode-february/0ToHero" target="_blank" rel="noopener noreferrer"><strong>ZeroToHero</strong>🚀</a>.</li></ul></li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="self-study-resources">Self-Study: Resources<a class="hash-link" href="#self-study-resources" title="Direct link to heading">​</a></h2><p>Don't have the time to follow day by day? Here're 3 self-study materials that you should know about to help you learn at your own pace: </p><ol><li><a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer"><strong>Resource Collection</strong></a>: Bookmark the collection for a 1-stop resource containing all relevant links to documentation and training, as covered in the #30DaysOfLowCode blogs. </li><li><a href="https://aka.ms/lowcode-february/workshop" target="_blank" rel="noopener noreferrer"><strong>Hands-on Workshops</strong></a>: learn by doing! These labs help you gain hands-on experience from intro to advanced, whereever you're in the learning path. </li><li><a href="http://localhost:3000/Low-Code/lowcode-february/Video-Live#ask-the-experts" target="_blank" rel="noopener noreferrer"><strong>Ask The Experts!</strong></a>: get your questions answered! Pick a time that works best for you and enjoy a face to face discussion with our leaderships:<ol><li>🎙 <a href="https://aka.ms/ATE0223/RSVP" target="_blank" rel="noopener noreferrer"><strong>Feb 23, 9AM PST</strong></a> - Join this session for Q&amp;A from the <strong>Powerful Devs Conference</strong> team. The Powerful Devs Conference focuses on showcasing how code first developers can integrate with the Power Platform to innovate faster. We will have experts on hand to answer questions about full code and low code integration.</li><li>🎙 <a href="https://aka.ms/ATE0309/RSVP" target="_blank" rel="noopener noreferrer"><strong>Mar 09, 9AM PST</strong></a> - Join this session for Q&amp;A from the <strong>Low Code February</strong> team, including authors of this #30DaysOfLowCode series. We will have experts in code-first integration with the Power Platform live to answer questions related to the content and cloud skills challenge of the Low Code February event.</li></ol></li><li><a href="https://aka.ms/lowcode-february/LearnLive" target="_blank" rel="noopener noreferrer"><strong>Learn Live!</strong>:</a> Have questions for Microsoft Learn modules or the cloud skills challenge? Join our <strong>Learn Live</strong> sessions to hear tips and commentary from experts:</li></ol><ul><li>1️⃣ <a href="https://aka.ms/lowcode-february/LearnLive" target="_blank" rel="noopener noreferrer"><strong>Feb 06</strong></a> - Low code as a traditional developer</li><li>2️⃣ <a href="https://aka.ms/lowcode-february/LearnLive" target="_blank" rel="noopener noreferrer"><strong>Feb 13</strong></a> - Integrate OpenAPI-enabled Web APIs with Azure API Management</li><li>3️⃣ <a href="https://aka.ms/lowcode-february/LearnLive" target="_blank" rel="noopener noreferrer"><strong>Feb 27</strong></a> - Manage Microsoft Power Platform deployments
<img loading="lazy" alt="Feb5 Banner" src="/Low-Code/assets/images/LearnLive-fd1c85634a15c825a474e1deac2f0b8b.png" width="600" height="338" class="img_ev3q"></li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="feb-15-powerfuldevs-conf">Feb 15: PowerfulDevs Conf<a class="hash-link" href="#feb-15-powerfuldevs-conf" title="Direct link to heading">​</a></h2><p>Do you know the <a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Powerful Dev Conf</strong></a> happens in just 10 days, on <strong>Feb 15</strong>? It's a signature 2-hour event where you can hear from many of the experts, including authors from this series, on the features and usage of the Power Platform! Check out the great speaker lineup below and visit <a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">the site</a> to see the scheduled sessions.</p><p><img loading="lazy" alt="Feb5 Banner" src="/Low-Code/assets/images/PowerFulDev-2cbc6093b3f9cd83260b5ab0bd29eeae.png" width="1456" height="1636" class="img_ev3q"></p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>REGISTER NOW - IT'S FREE &amp; ONLINE!</div><div class="admonitionContent_S0QG"><ul><li><a href="https://learn.microsoft.com/events/learn-events/powerful-devs-2023/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Sign up</strong></a> for a reminder and link to the livestream.</li><li>Then #SaveTheDate and join us <strong>Feb 15</strong></li></ul></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="look-forward-week-2-plan">Look Forward: Week 2 Plan<a class="hash-link" href="#look-forward-week-2-plan" title="Direct link to heading">​</a></h2><p>Don't forget to bookmark the <a href="https://aka.ms/lowcode-february/blog" target="_blank" rel="noopener noreferrer"><strong>#30DaysOfLowCode</strong></a> page and come back tomorrow, where we will cover everything you need to know about Power Platform Backend Integrations in week 2. </p><p>From utilizing built-in connectors to building custom connectors, integrating with backend data source, and creating serverless apps. We will showcase the latest functionalities we have, help you learn with tutorials, demos, and real world best practices that you can apply to your business immediately. </p><p><img loading="lazy" alt="Week 2 Roadmap" src="/Low-Code/assets/images/30-week2-aaa08e0c38c9d2d8a57e392161f4e308.png" width="1001" height="420" class="img_ev3q"></p>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
            <category>recap</category>
        </item>
        <item>
            <title><![CDATA[4. 🚀 Developer Stories]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day4</link>
            <guid>2023-day4</guid>
            <pubDate>Sat, 04 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Software developers around the world are embracing low-code as a powerful part of their toolkit — let's meet some of the developers and organizations and hear their stories..]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 04</code> of #30DaysOfLowCode!</p><p>Today we celebrate all the developers and organizations who make the low code ecosystem successful.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>About Zero To Hero</li><li>Meet The Developers</li><li>Meet The Organizations</li><li>Solution Architecture Examples</li><li><strong>Activity</strong>: Sign up for your <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer">Developer Plan</a></li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Low Code February Collection</a></li></ul><p><img loading="lazy" alt="#30DaysOfLowCode Developer Stories" src="/Low-Code/assets/images/30-04-93f04c7b4f0b04a14177b19755855814.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="about-zero-to-hero">About Zero To Hero<a class="hash-link" href="#about-zero-to-hero" title="Direct link to heading">​</a></h2><p>Did you know we had a <a href="/Low-Code/lowcode-february/ZeroToHero">dedicated Zero To Hero page</a> on this site? It's our page for amplifying news, articles and updates on technologies and products for low code development - directly from product teams! Here's what that page look like. Click on any article to visit the <em>original</em> content on the Product Group blog. Or click the <strong>tag</strong> under a post (e.g., <code>Announcements</code>) to view <em>all</em> posts for that category.</p><p><img loading="lazy" alt="Zero to Hero page screenshot" src="/Low-Code/assets/images/zero-to-hero-c5f816967e873a1d7bdb3e4d0d1d4b4a.png" width="1315" height="742" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="meet-the-developers">Meet The Developers<a class="hash-link" href="#meet-the-developers" title="Direct link to heading">​</a></h2><p>Meet featured developer <strong>Gini Brandon</strong> and watch her as she shares her journey of adopting low-code as a professional developer! In the video, Gini talks about her journey graduating with a computer science degree, how she’s been able to increase efficiency using Power Platform, why she believes low code is the future of development, and how you can get started.</p><p>✨ Read It Now: <a href="https://powerapps.microsoft.com/blog/meet-the-developers-combining-power-platform-and-azure-to-go-faster/" target="_blank" rel="noopener noreferrer"><strong>Meet developers combining Power Platform and Azure to go faster</strong></a></p><p><a href="https://www.youtube.com/watch?v=OrWDTi8GVfM" target="_blank" rel="noopener noreferrer"><img loading="lazy" src="https://powerappsblogscdn.azureedge.net/wp-content/uploads/2023/02/ginibrandon_cover-1024x576.png" alt="Thumbnail Image from Meet the Developers Video" class="img_ev3q"></a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="meet-the-organizations">Meet The Organizations<a class="hash-link" href="#meet-the-organizations" title="Direct link to heading">​</a></h2><p>Organizations around the globe have adopted Microsoft Power Platform along with Azure and Dynamics 365 to build flagship applications and establish centers of excellence to scale adoption and impact of low-code solutions.</p><p>✨ Read It Now: <a href="https://powerapps.microsoft.com/blog/meet-the-developers-combining-power-platform-and-azure-to-go-faster/#meet-organizations" target="_blank" rel="noopener noreferrer"><strong>Meet The Organizations</strong></a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="solution-architecture-examples">Solution Architecture Examples<a class="hash-link" href="#solution-architecture-examples" title="Direct link to heading">​</a></h2><p>Explore a few real-world solution architecture examples that show how low-code capabilities in Power Platform are used in conjunction with code-first programming patterns and capabilities in Microsoft Azure. Here are just a subset of those stories:</p><ul><li>Rabobank – Scaling adoption across the organization </li><li>EY – Loan forgiveness portal</li><li>Blackmores Group – Enabling rapid development of new products</li><li>IKEA Sweden – Reimagining the customer experience</li><li>Western States Caterpillar: Mobile apps for the field</li></ul><p>✨ Read It Now: <a href="https://powerapps.microsoft.com/blog/meet-the-developers-combining-power-platform-and-azure-to-go-faster/#architecture-examples" target="_blank" rel="noopener noreferrer"><strong>Solution Architecture Examples</strong></a></p>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
        </item>
        <item>
            <title><![CDATA[3. DevTools & Onboarding]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day3</link>
            <guid>2023-day3</guid>
            <pubDate>Fri, 03 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Learn how you can get onboard with Power Platform by signing up forthe Power Apps Developer Plan!]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day #03</code> of #30DaysOfLowCode!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>Get onboard with Power Platform</li><li>Sign up for the Power Apps Developer Plan</li><li>Get familiar with the tools</li><li><strong>Activity</strong>: Sign up for your <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer">Developer Plan</a></li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Low Code February Collection</a></li></ul><p><img loading="lazy" alt="Developer Tools and Onboarding" src="/Low-Code/assets/images/30-03-a560ed2fce05a72e7049f4d0d3be8b0b.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="get-onboard-with-power-platform">Get onboard with Power Platform!<a class="hash-link" href="#get-onboard-with-power-platform" title="Direct link to heading">​</a></h2><p>I'm excited to announce that now you can create up to 3 developer environments with the Power Apps Developer Plan! Let's take this opportunity to review how to get a free environment to get started.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="sign-up-for-the-power-apps-developer-plan">Sign up for the Power Apps Developer Plan<a class="hash-link" href="#sign-up-for-the-power-apps-developer-plan" title="Direct link to heading">​</a></h2><p>The Power Apps Developer Plan gives you a free development environment to build and test with Power Apps, Power Automate, and Microsoft Dataverse.
It just takes a few minutes to get a developer environment for Power Platform:</p><ol><li>Ensure that you have a work account. If you don't,&nbsp;you can <a href="#do-i-need-a-test-tenant">create a test tenant first.</a></li><li>Sign up on the&nbsp;<a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer">Power Apps Developer Plan website</a>.</li><li>Once the sign up is complete, you will be redirected to your new developer environment.</li></ol><p><img loading="lazy" alt="Power Apps Developer Plan - sign up process" src="/Low-Code/assets/images/01 - devplan signup-3afa66fd4f7c0edb8e766ff2cc60b9c0.gif" width="1920" height="1080" class="img_ev3q">
<em>Power Apps Developer Plan - sign up process</em></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="do-i-need-a-test-tenant">Do I need a test tenant?<a class="hash-link" href="#do-i-need-a-test-tenant" title="Direct link to heading">​</a></h3><p>In an ideal world you would use your existing work account to sign up for the Power Apps Developer Plan. If you already have an Azure account, you likely can use the same account to sign up. If this is not possible for any reason, you can create a free test tenant using the <a href="https://learn.microsoft.com/power-platform/developer/create-developer-environment#how-to-create-a-test-tenant" target="_blank" rel="noopener noreferrer">Microsoft 365 Developer Program</a>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="get-familiar-with-the-tools">Get familiar with the tools<a class="hash-link" href="#get-familiar-with-the-tools" title="Direct link to heading">​</a></h2><p>After the sign up you will be in the <a href="https://make.powerapps.com" target="_blank" rel="noopener noreferrer">https://make.powerapps.com</a> and your environment will be ready to use. You can start creating your first Power App.</p><p>If you would like to create more environments or manage your environment, visit the <a href="https://aka.ms/ppac" target="_blank" rel="noopener noreferrer">Power Platform Administrator Center.</a></p><p><img loading="lazy" alt="Create new environments in the Power Platform Admin Center" src="/Low-Code/assets/images/01 - devplan PPAC-86758d335b4009972e36e1e37ae737ff.gif" width="1920" height="1080" class="img_ev3q">
<em>Create new environments in the Power Platform Admin Center</em></p><p>If you are a code first developer, you can use the Power Platform CLI to manage your environments, create code first components and much more. The best way to get our CLI is to download the <a href="https://learn.microsoft.com/power-platform/developer/cli/introduction" target="_blank" rel="noopener noreferrer">Visual Studio Code extension.</a></p><p><img loading="lazy" alt="Power Platform Tools for Visual Studio Code" src="/Low-Code/assets/images/01 - devplan CLI-5d47902f150aef319a6100d7362b1481.gif" width="1920" height="1080" class="img_ev3q">
<em>Power Platform Tools for Visual Studio Code</em></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next?<a class="hash-link" href="#whats-next" title="Direct link to heading">​</a></h2><p>Are you a code first developer? To understand how Power Platform can make you more productive and how you can use code to extend the platform, check the <a href="https://learn.microsoft.com/power-platform/developer/get-started" target="_blank" rel="noopener noreferrer">Introduction to Microsoft Power Platform for developers</a>.</p><ul><li><p>For detailed information on the Power Apps Developer plan: <a href="https://learn.microsoft.com/power-apps/maker/developer-plan" target="_blank" rel="noopener noreferrer">Sign up for Power Apps Developer Plan</a></p></li><li><p>For detailed information on licensing: <a href="https://learn.microsoft.com/power-platform/admin/pricing-billing-skus" target="_blank" rel="noopener noreferrer">Licensing overview for Microsoft Power Platform</a></p></li></ul><p>Happy coding 🎉.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li><a href="https://learn.microsoft.com/training/modules/introduction-power-platform//?WT.mc_id=power-82212-apdunnam" target="_blank" rel="noopener noreferrer">Introduction to the Power Platform</a></li><li><a href="https://learn.microsoft.com/power-apps/guidance/fusion-dev-ebook/?WT.mc_id=power-82212-apdunnam" target="_blank" rel="noopener noreferrer">Fusion Development with Power Platform EBook</a></li><li><a href="https://learn.microsoft.com/training/paths/transform-business-applications-with-fusion-development/?WT.mc_id=power-82212-apdunnam" target="_blank" rel="noopener noreferrer">Fusion Development with Power Platform Learning Path</a></li><li><a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Learn Collection: LowCode February</a></li></ul><p><img loading="lazy" alt="Campaign Banner" src="/Low-Code/assets/images/30-banner-d9bab2b92d758942447a4cbc50aef715.png" width="1334" height="560" class="img_ev3q"></p>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
        </item>
        <item>
            <title><![CDATA[2. You say Low, I say Code!]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day2</link>
            <guid>2023-day2</guid>
            <pubDate>Thu, 02 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Welcome to #LowCodeFebruary! Join us for #30DaysOfLowCode learning, skilling and discussions at https://aka.ms/lowcode-february. Today we talk about what Low Code means, and how Power Platform can help!]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 02</code> of #30DaysOfLowCode!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>What is Low Code?</li><li>How are the Benefits? </li><li>What does Power Platform Provide?</li><li>How can we extend Power Platform?</li><li><strong>Activity</strong>: Join the <a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer">Cloud Skills Challenge</a></li><li><strong>Resources</strong>: Explore the <a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Low Code February Collection</a></li></ul><p><img loading="lazy" alt="You say Low, I say Code!" src="/Low-Code/assets/images/30-02-ab81170656cc54b7b96147d661b72ae8.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="you-say-low-i-say-code">You say Low, I say Code!<a class="hash-link" href="#you-say-low-i-say-code" title="Direct link to heading">​</a></h2><p>There is a low code revolution underway. We have a surging digital demand with an estimated 500 million more apps that will need to be created in the next 5 years. More and more companies are leveraging low code and no code platforms to bridge this app gap and address workflow and automation needs. In fact, Gartner estimates that 65% of application development will be low code by 2024.</p><p>With low code tools like the Power Platform making it easier for business technologists to develop solutions, you might wonder if there's any room for a code first developer in this low code revolution. Well, the answer is, absolutely there is! In fact, code first developers are a critical piece to the puzzle.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-low-code">What is "low code"?<a class="hash-link" href="#what-is-low-code" title="Direct link to heading">​</a></h2><p>The term "low code" can mean different things to different people when they first hear it. What we mean when we talk about low code is that with tools like Power Apps, you only need to write a small amount of code to get results that would normally take several more lines of code in a traditional programming language.</p><p><img loading="lazy" alt="What is Low Code" src="/Low-Code/assets/images/02_WhatIsLowCode-4f9966b58f106fe0bb5d6d4da968dd5a.png" width="1937" height="1070" class="img_ev3q"></p><p>In canvas-based Power Apps, the low code scripting language used is called <a href="https://aka.ms/LearnPowerFx" target="_blank" rel="noopener noreferrer">Power Fx</a>. This language is based on the Microsoft Excel formula language which meets many business technologists where they are by leveraging the knowledge they already have.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="low-code--full-code--no-cliffs">Low Code + Full Code = No Cliffs<a class="hash-link" href="#low-code--full-code--no-cliffs" title="Direct link to heading">​</a></h2><p>Using low-code tools is key to helping to resolve the existing and impending app gap challenge but that doesn't mean that low code alone can solve every business problem. Low code tools like the Power Platform's full potential is unlocked when you combine the low code capabilities with code first development.</p><p>The combination of low code + full code creates what we call a "no cliffs" experience that allows business technologists to easily build solutions with low code while professional developers can leverage full code to augment and extend the platform capabilities. The process of low code developers, IT pros and full code developers working together like this is often referred to as "fusion development".</p><p><img loading="lazy" alt="Fusion Development Process" src="/Low-Code/assets/images/02_FusionDevProcess-1d75a4cfd7019909a56ca5ca3499316d.png" width="1937" height="1070" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-does-the-power-platform-provide">What does the Power Platform Provide?<a class="hash-link" href="#what-does-the-power-platform-provide" title="Direct link to heading">​</a></h2><p>The Power Platform gives us a holistic suite of low code tools that work together to help us solve business problems. The key products and components of the Power Platform include:</p><ul><li><strong>Power Apps</strong> for creating custom applications for web and mobile that can be integrated with a variety of systems and services.</li><li><strong>Power Automate</strong> for automation tasks and orchestrating activities across various services</li><li><strong>Power BI</strong> for business analytics and interactive data visualization</li><li><strong>Power Virtual Agents</strong> for creating AI-powered chatbots that can answer questions from your customers and employees</li><li><strong>Power Pages</strong> for secure, enterprise-grade external-facing business websites</li><li><strong>Dataverse</strong> which provides a cloud scale data store with robust security that abstracts away data management complexity from the app maker</li></ul><p><img loading="lazy" alt="Power Platform Overview" src="/Low-Code/assets/images/02_PowerPlatformOverview-78e3e950cd1ecb102d264eca0db14efa.png" width="1254" height="581" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-can-we-extend-power-platform-solutions">How can we extend Power Platform solutions?<a class="hash-link" href="#how-can-we-extend-power-platform-solutions" title="Direct link to heading">​</a></h2><p>You might wondering how you can leverage your code first skills with the Power Platform. Let's take a look at some ways that we can extend our Power Platform solutions with code (many of these concepts will be covered in more detail in later blog posts).</p><ul><li><strong>UI Components</strong> - Leverage the <a href="https://aka.ms/LowCodePCF" target="_blank" rel="noopener noreferrer">Power Apps Component Framework</a> to extend the UI of our applications with custom code.</li><li><strong>Custom Connectors</strong> - Create <a href="https://aka.ms/LowCodeCustomConnectors" target="_blank" rel="noopener noreferrer">custom connectors</a>, which are essentially a wrapper around an API to communicate to our external data sources and services.</li><li><strong>Custom Visuals in Power BI</strong> - Use the open-source SDK to create <a href="https://aka.ms/LowCodeCustomVisuals" target="_blank" rel="noopener noreferrer">custom visuals</a> for your reports and dashboards</li><li><strong>Custom Business Logic</strong> - Extend the <a href="https://aka.ms/LowCodeDataverseAPI" target="_blank" rel="noopener noreferrer">Dataverse API</a> with your own custom API that implements your business logic</li><li><strong>Add CI/CD</strong> - Setup continuous integration and continuous deployment (<a href="https://aka.ms/LowCodeALM" target="_blank" rel="noopener noreferrer">CI/CD</a>) with your Power Platform solutions</li></ul><p><img loading="lazy" alt="Power Platform Pro Dev extensions" src="/Low-Code/assets/images/02_Extend-c65dc3a6bde0fa96c118ff6caffce29b.png" width="1266" height="537" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-next">What's next?<a class="hash-link" href="#whats-next" title="Direct link to heading">​</a></h2><p>In the next series of posts you'll learn more about some of these core concepts and extension points. </p><p>If all of this sounds intriguing and you want to get started on your low code development journey, here are some actions you can take:</p><ul><li>1️⃣ <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Sign up</strong></a> for the free Power Apps Developer Plan.</li><li>2️⃣ <a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer"><strong>Enroll</strong></a> in the Cloud Skills Challenge to learn more about low code and fusion team fundamentals and start climbing that leaderboard!</li><li>3️⃣ <a href="http://aka.ms/lowcode-february" target="_blank" rel="noopener noreferrer"><strong>Save</strong></a> the page to start your learning on Feb 1, and <a href="https://microsoft.github.io/Low-Code/blog/rss.xml" target="_blank" rel="noopener noreferrer"><strong>Subscribe</strong></a> to the blog in your favorite feed reader for updates.</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="resources">Resources<a class="hash-link" href="#resources" title="Direct link to heading">​</a></h2><ul><li><a href="https://learn.microsoft.com/training/modules/introduction-power-platform//?WT.mc_id=power-82212-apdunnam" target="_blank" rel="noopener noreferrer">Introduction to the Power Platform</a></li><li><a href="https://learn.microsoft.com/power-apps/guidance/fusion-dev-ebook/?WT.mc_id=power-82212-apdunnam" target="_blank" rel="noopener noreferrer">Fusion Development with Power Platform EBook</a></li><li><a href="https://learn.microsoft.com/training/paths/transform-business-applications-with-fusion-development/?WT.mc_id=power-82212-apdunnam" target="_blank" rel="noopener noreferrer">Fusion Development with Power Platform Learning Path</a></li><li><a href="https://aka.ms/lowcode-february/collection" target="_blank" rel="noopener noreferrer">Learn Collection: LowCode February</a></li></ul><p><img loading="lazy" alt="Campaign Banner" src="/Low-Code/assets/images/30-banner-d9bab2b92d758942447a4cbc50aef715.png" width="1334" height="560" class="img_ev3q"></p>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
        </item>
        <item>
            <title><![CDATA[1. Hello, 30DaysOfLowCode!]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-day1</link>
            <guid>2023-day1</guid>
            <pubDate>Wed, 01 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Welcome to #LowCodeFebruary! Join us for #30DaysOfLowCode learning, skilling and discussions at https://aka.ms/lowcode-february]]></description>
            <content:encoded><![CDATA[<p>Welcome to <code>Day 01</code> of #30DaysOfLowCode!</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-well-cover">What We'll Cover<a class="hash-link" href="#what-well-cover" title="Direct link to heading">​</a></h2><ul><li>Why Low-Code?</li><li>Start low coding with Microsoft!</li><li>The full Low-Code February lineup  </li><li><strong>Exercise:</strong> Take the <a href="https://learn.microsoft.com/training/challenges?id=464c05e3-f1ae-400f-b5df-2dcd5299d347&amp;%3FWT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Cloud Skills Challenge!</strong></a></li><li><strong> Resources:</strong> Sign up for the free <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Power Apps Developer Plan!</strong></a></li></ul><p><img loading="lazy" alt="Post Banner" src="/Low-Code/assets/images/30-01-f393b344eaa640f02bc39a709257ccbf.png" width="1001" height="420" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-low-code">Why Low Code?<a class="hash-link" href="#why-low-code" title="Direct link to heading">​</a></h2><p>As the market for low-code platform continues to flourish (with projected growth this year of nearly 20% over 2022), now is the time to explore what it can mean for you. </p><p><a href="https://powerapps.microsoft.com/what-is-low-code/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Low-code development</strong></a> are becoming more popular as businesses look for ways to modernize their IT infrastructure and generate more output in less time. </p><p>Developers can focus on the creative aspects of app building while still taking advantage of powerful cloud computing technologies such as scalability, security, and reliability.</p><p>Starting today, we invite you to spend a month getting the low-down on low-code development with an exciting series of tutorials, workshops, and interactive resources during <a href="https://aka.ms/lowcode-february" target="_blank" rel="noopener noreferrer"><strong>#LowCodeFebruary</strong></a>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="start-low-coding-with-microsoft">Start low coding with Microsoft<a class="hash-link" href="#start-low-coding-with-microsoft" title="Direct link to heading">​</a></h2><p>With <a href="https://powerapps.microsoft.com/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Microsoft Power Apps</strong></a> you can quickly build custom apps with drag-and-drop tools and pre-built templates, making it easier to create powerful apps that are tailored for your needs.  Low-code development with Azure helps businesses accelerate their innovation cycle and make the most out of their data resources. </p><p>Low-code app development through Microsoft Power Platform and Azure can be used to automate workflows, reduce manual efforts, and speed up the development process for building line-of-business apps at a lower cost.</p><p>According to <a href="https://aka.ms/2022ForresterTEI" target="_blank" rel="noopener noreferrer"><strong>Forrester</strong></a>, composite organizations experience benefits of <strong>140% ROI</strong> and <strong>45% cost reduction</strong> in app development when using Power Platform premium capabilities. The majority of users say Power Platform’s premium capabilities increase revenue and offers faster solution quoting through better data integration. </p><p>In other words, with Power Platform you’ll produce more and better code than before, with increased cost savings. That means developing more projects and delivering increased value to your clients. With low code, everyone wins!</p><p><img loading="lazy" alt="Kickoff Banner for Low Code February" src="/Low-Code/assets/images/01 - Kickoff-b6ff5da871188894bc9935af9614742c.png" width="1600" height="900" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-full-low-code-february-lineup">The full Low-Code February lineup<a class="hash-link" href="#the-full-low-code-february-lineup" title="Direct link to heading">​</a></h2><p>We want to give developers the resources you need to enhance your knowledge and skill in low code. <a href="https://aka.ms/lowcode-february" target="_blank" rel="noopener noreferrer"><strong>Low Code February</strong></a> is a month-long celebration during which we’ll help participants learn the nuts and bolts of low-code development. </p><p>You will have access to a series of hands-on workshops, self-guided learning courses, skill challengies, conversations with experts, and a community of fellow learners that will give you the necessary tools to start building in 30 days. </p><p>All throughout Low Code February we’ll be running <strong>6 hero initiatives</strong> to help you get the most of your newfound knowledge:</p><ol><li><a href="https://microsoft.github.io/Low-Code/lowcode-february/30Days/" target="_blank" rel="noopener noreferrer"><strong>#30DaysOfLowCode</strong></a> blog series, during which developers can engage with a daily lesson and skill up on <a href="https://learn.microsoft.com/power-platform/power-fx/overview?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Power Fx</a>, <a href="https://learn.microsoft.com/power-apps/developer/component-framework/overview?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">PCF</a> (Power Component Framework), <a href="https://learn.microsoft.com/power-platform/alm/overview-alm" target="_blank" rel="noopener noreferrer">ALM</a> (App Lifecycle Management?WT.mc_id=javascript-82212-ninarasi), <a href="https://azure.microsoft.com/products/devops/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">Azure DevOps</a>, <a href="https://learn.microsoft.com/power-platform/alm/devops-github-actions?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer">GitHub Actions</a>, and more. </li></ol><ul><li><p><a href="https://microsoft.github.io/Low-Code/lowcode-february/30Days/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>#30DaysOfLowCode</strong></a> 📅 roadmap:</p></li><li><p><strong>Week 1️⃣: Fundamentals</strong> Kick off with a comprehensive introduction to low code with onboarding experience, tooling, developer stories and more.</p></li><li><p><strong>Week 2️⃣: Backend Integrations</strong> Dive into the nitty-gritty of low-code development with topics like built-in connectors, dataverse, custom connectors, API management, and Azure integration. </p></li><li><p><strong>Week 3️⃣: User Interface</strong>
Put your knowledge to the test by building a Canvas app, plus get an introduction to PowerFX, power component framework controls, and advanced use cases.</p></li><li><p><strong>Week 4️⃣: Dev Experience</strong>
Take your skills to the next level with tutorials on ALM, GitHub Actions, app governance, Power Platform pipelines, and automated testing. </p></li><li><p><strong>Week 5️⃣: Wrap-up</strong></p></li></ul><ol start="2"><li><a href="/Low-Code/lowcode-february/ZeroToHero/"><strong>#ZeroToHero</strong></a> 🦸‍♀️ Get the latest updates on technologies and products for low code development directly from product teams.</li><li><a href="/Low-Code/lowcode-february/Video-Live/"><strong>Video + Livestream</strong></a> 📻 Join online conversations with product teams and ask questions.  </li><li><a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer"><strong>Cloud Skills Challenge</strong></a> ☁️ Skill up on key cloud technologies with free, self-guided learning courses, and compete to make the leaderboard!</li><li><a href="/Low-Code/docs/intro/"><strong>Dev Workshops</strong></a> ⚒️ Explore workshops in your own time as you work through various
features or solutions in self-guided mode.</li><li><a href="https://pnp.github.io/powerplatform-samples/?WT.mc_id=javascript-82212-ninarasi" target="_blank" rel="noopener noreferrer"><strong>Community Buzz</strong></a> 💡 Connect with the community and contribute your expertise by building interesting demos or writing articles.</li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="get-started-today">Get started today!<a class="hash-link" href="#get-started-today" title="Direct link to heading">​</a></h2><p>Want to get started on your low code development journey with us? Here are some actions you can take today:</p><ol><li><a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Sign up</strong></a> for the free Power Apps Developer Plan. 🙌 </li><li><a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer"><strong>Enroll</strong></a> in the Cloud Skills Challenge and start climbing that leaderboard! ☁️</li><li><a href="http://aka.ms/lowcode-february" target="_blank" rel="noopener noreferrer"><strong>Save</strong></a> the page and <a href="https://microsoft.github.io/Low-Code/blog/rss.xml" target="_blank" rel="noopener noreferrer"><strong>Subscribe</strong></a> to the blog in your favorite feed reader for updates. 🔖</li></ol><p><img loading="lazy" alt="Low Code February Banner" src="/Low-Code/assets/images/Feb01 - Banner-d9bab2b92d758942447a4cbc50aef715.png" width="1334" height="560" class="img_ev3q"></p>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
        </item>
        <item>
            <title><![CDATA[It's a Low Code February!]]></title>
            <link>https://microsoft.github.io/Low-Code/blog/2023-kickoff</link>
            <guid>2023-kickoff</guid>
            <pubDate>Wed, 25 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[We are excited to announce the launch of #LowCodeFebruary https://aka.ms/lowcode-february - a month-long developer journey that will take you from app development tips, to fusion teams insights, and hands-on tutorials to skill you up on Power Platform, Microsoft Azure!]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorWithStickyNavbar_LWe7" id="welcome-to-low-code-february">Welcome to Low Code February!<a class="hash-link" href="#welcome-to-low-code-february" title="Direct link to heading">​</a></h2><p>February is traditionally a month where we celebrate family, friends and loved ones - from Valentine's Day to Lunar New Year! We hope you also make this the month you fall in love with a new technology space - <em>low-code app development</em> - and join us for a month of learning, making, and sharing!</p><p><img loading="lazy" alt="#30DaysOfLowCode Kickoff Banner" src="/Low-Code/assets/images/30days-title-2e73761c0d60b3ea511215a44a8360a8.png" width="1001" height="420" class="img_ev3q"></p><p>We are excited to announce the <strong>launch of #LowCodeFebruary</strong>, a month-long developer journey that will take you from app development tips, to fusion teams insights, and hands-on tutorials to skill you up on Power Platform, Microsoft Azure, and popular developer tools to enhance your productivity.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-will-we-cover">What will we cover?<a class="hash-link" href="#what-will-we-cover" title="Direct link to heading">​</a></h2><p>Let's talk about what you will learn in our developer journey this month. We have multiple initiatives in mind that can help you <em>learn</em>, <em>skill up</em>, <em>engage with experts</em>, <em>contribute to community</em> and <em>watch videos</em> at your own pace. </p><p><img loading="lazy" alt="Low Code February Banner" src="/Low-Code/assets/images/lcf-banner-afd117c7604fa9f2ace6a32a14d7cf15.png" width="1600" height="672" class="img_ev3q"></p><ol><li>The <a href="/Low-Code/blog"><strong>#30DaysOfLowCode</strong></a> blog series helps you <em>learn</em> by reading posts from experts, taking you on a 4-week journey from fundamentals, to application lifecycle managment - and cover developer tools and best practices along the way!</li><li>The <a href="/Low-Code/lowcode-february/ZeroToHero/"><strong>#ZeroToHero</strong></a> series captures blog posts directly from our product teams, sharing the latest features and tips for low code development.</li><li>The <a href="/Low-Code/docs/intro/"><strong>Dev Workshops</strong></a> page will learning tutorials and resources for all levels, from beginner to advanced.Learn how to build scalable apps, manage app lifecycle management with the Azure services and use popular Developer tools for enhanced productivity.  </li><li>The <a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer"><strong>Cloud Skills Challenge</strong></a> is a set of curated free, self-guided learning modules <em>focused on fusion teams and low-code development</em>. Complete them in #30Days and make the leaderboard!</li><li>The <a href="/Low-Code/lowcode-february/Video-Live/"><strong>Video + Livestream</strong></a> page showcases live events (e.g., AskTheExpert, LearnLive) and on-demand video shows (e.g., LowCode Revolution) and replays, to help you learn at your own pace. </li><li>The <a href="https://pnp.github.io/powerplatform-samples/" target="_blank" rel="noopener noreferrer"><strong>Community Buzz</strong></a> section connects you to peer community members. Share your samples and learn from 90+ real-world Power Platform examples shared by the community. And share your contributions with us via GitHub issues or with a <a href="https://dev.to/t/powerfuldevs" target="_blank" rel="noopener noreferrer">post on dev.to usingthe #powerfuldevs tag</a>.</li></ol><h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-can-you-participate">How can you participate?<a class="hash-link" href="#how-can-you-participate" title="Direct link to heading">​</a></h2><p>Want to get started on your low code development journey with us? Here are some actions you can take today:</p><ul><li>1️⃣ <a href="https://aka.ms/lowcode-february/devplan" target="_blank" rel="noopener noreferrer"><strong>Sign up</strong></a> for the free Power Apps Developer Plan.</li><li>2️⃣ <a href="https://aka.ms/lowcode-february/challenge" target="_blank" rel="noopener noreferrer"><strong>Enroll</strong></a> in the Cloud Skills Challenge and start climbing that leaderboard!</li><li>3️⃣ <a href="http://aka.ms/lowcode-february" target="_blank" rel="noopener noreferrer"><strong>Save</strong></a> the page to start your learning on Feb 1, and <a href="https://microsoft.github.io/Low-Code/blog/rss.xml" target="_blank" rel="noopener noreferrer"><strong>Subscribe</strong></a> to the blog in your favorite feed reader for updates. </li></ul><p>Ready to get started being a low-code developer, or a pro-dev supporting fusion teams and low code app development?</p><p>🏁 <strong>#Lets Go!</strong></p><p><img loading="lazy" alt="Technologies used for fusion development" src="/Low-Code/assets/images/01 - Kickoff-b6ff5da871188894bc9935af9614742c.png" width="1600" height="900" class="img_ev3q"></p>]]></content:encoded>
            <category>low-code-february</category>
            <category>30-days-of-lowcode</category>
            <category>learn-live</category>
            <category>zero-to-hero</category>
            <category>ask-the-expert</category>
            <category>fusion-teams</category>
            <category>power-platform</category>
            <category>kickoff</category>
        </item>
    </channel>
</rss>