{
    "version": "https://jsonfeed.org/version/1",
    "title": "Homol Works",
    "home_page_url": "https://mhomol.github.io/blog",
    "description": "Homol Works Blog",
    "items": [
        {
            "id": "https://mhomol.github.io/blog/2026/07/05/transmission-resumed-cursor-year-one",
            "content_html": "<blockquote>\n<p><strong>STATUS:</strong> SIGNAL REACQUIRED · HOMOL WORKS ONLINE · OPERATOR: MIKE HOMOL</p>\n</blockquote>\n<p><img decoding=\"async\" loading=\"lazy\" alt=\"Transmission resumed — AI-generated hero image, human reviewed\" src=\"https://mhomol.github.io/assets/images/transmission-resumed-cursor-year-one-52992285ce4f0c20916d3ef6ff20db17.png\" width=\"1536\" height=\"1024\" class=\"img_ev3q\"></p>\n<p>If you have been here before, the gap is obvious.</p>\n<p>My last post on this site was <a class=\"\" href=\"https://mhomol.github.io/blog/consult-the-oracle\">Consult the Oracle</a> in early 2023 — me staring at ChatGPT like it was the promised evolution of artificial intelligence, already wondering what it would do to coding, writing, and the shape of \"thinking jobs.\" Then life got loud, client work stayed loud, and Homol Works went quiet.</p>\n<p>The builder did not stop. The blog just did.</p>\n<p>This is the transmission coming back online — and the honest recap of what the past year has looked like once <strong>Cursor</strong> became less of a novelty and more of how I actually work.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-gap-was-not-idle-time\">The gap was not idle time<a href=\"https://mhomol.github.io/blog/2026/07/05/transmission-resumed-cursor-year-one#the-gap-was-not-idle-time\" class=\"hash-link\" aria-label=\"Direct link to The gap was not idle time\" title=\"Direct link to The gap was not idle time\" translate=\"no\">​</a></h2>\n<p>Back in 2020 I wrote <a class=\"\" href=\"https://mhomol.github.io/blog/newspace\">New Space, Who Dis?</a> about finally making a site that felt like <em>me</em> — JAMStack, Markdown, React, room for automations, a place to combine work posts and nerd-family posts without pretending they were separate lives.</p>\n<p>That vision still holds. What changed is <strong>how</strong> I build and <strong>how fast curiosity can turn into something shippable</strong>.</p>\n<p>After the ChatGPT post, I kept experimenting in the browser: scaffold this, explain that, draft a script, sanity-check an approach. Useful — but always one tab away from the repo, the client tenant, the SPFx build, the Power Platform solution, the thing that actually needed to ship.</p>\n<p>Cursor closed that gap.</p>\n<p>Not because it replaced judgment. Because it <strong>sat inside the work</strong> — files open, diffs visible, terminal right there, context already loaded — and turned \"let me go ask the oracle\" into \"let me pair with something that can read the codebase and help me move.\"</p>\n<p>That shift is the story of my past year with AI. ChatGPT opened the door. Cursor walked through it with me.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-the-past-year-in-cursor-actually-looked-like\">What the past year in Cursor actually looked like<a href=\"https://mhomol.github.io/blog/2026/07/05/transmission-resumed-cursor-year-one#what-the-past-year-in-cursor-actually-looked-like\" class=\"hash-link\" aria-label=\"Direct link to What the past year in Cursor actually looked like\" title=\"Direct link to What the past year in Cursor actually looked like\" translate=\"no\">​</a></h2>\n<p>I am not going to pretend I have perfect telemetry on every session. What I <em>do</em> have is the trail: repos, plans, agent transcripts, and the muscle memory of showing up daily as a Principal Consultant at <a href=\"https://threewill.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">ThreeWill</a> while also building personal experiments on the side.</p>\n<p>When I recently ran a cross-workspace scan of my local Cursor history, the numbers were humbling in the best way:</p>\n<ul>\n<li class=\"\"><strong>25 workspaces</strong> — client delivery, internal products, team tooling, personal projects</li>\n<li class=\"\"><strong>85 agent conversations</strong> — not counting the sub-agents and the threads that spun up mid-fix</li>\n<li class=\"\">Plans and work traces stretching back to <strong>late 2025</strong>, with the heaviest concentration in the first half of 2026</li>\n</ul>\n<p>That matches how it <em>felt</em>: once the IDE became the cockpit, the work accelerated and diversified at the same time.</p>\n<p>Here is the arc, by theme rather than chronology.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"1-client-delivery--still-microsoft-365-at-the-core\">1. Client delivery — still Microsoft 365 at the core<a href=\"https://mhomol.github.io/blog/2026/07/05/transmission-resumed-cursor-year-one#1-client-delivery--still-microsoft-365-at-the-core\" class=\"hash-link\" aria-label=\"Direct link to 1. Client delivery — still Microsoft 365 at the core\" title=\"Direct link to 1. Client delivery — still Microsoft 365 at the core\" translate=\"no\">​</a></h3>\n<p>Most of my professional time still lives in the world I have always loved: <strong>SharePoint, Teams, Power Platform, Azure, Copilot extensibility</strong>.</p>\n<p>In Cursor that showed up as:</p>\n<ul>\n<li class=\"\"><strong>SharePoint Framework</strong> work on reusable internal shelf solutions — compliance dashboards, referrals tooling, personnel evaluation flows, advanced page properties, and more</li>\n<li class=\"\"><strong>Power Platform / Dataverse</strong> delivery — plugins, lead processing, recruitment workflows, prompt-to-JSON parsing fixes, the unglamorous glue that makes business apps trustworthy</li>\n<li class=\"\"><strong>Knowledge base and Copilot enablement</strong> — search relevance, RAG architecture diagrams, client-facing \"how do we manage modern SharePoint content?\" enablement</li>\n<li class=\"\"><strong>Integration spelunking</strong> — when a connection to an external system misbehaves, having an agent that can read the web part, trace the API, and propose a fix beats bouncing between five browser tabs</li>\n</ul>\n<p>The pattern across client work is consistent: <strong>curiosity first, then a tight loop of inspect → hypothesize → change → verify</strong>. Cursor did not invent that loop for me. It just removed enough friction that I stay in the loop longer. Customer names and tenant specifics stay off this blog; the patterns are what travel.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"2-managed-services--the-system-ai-did-not-build-at-first\">2. Managed Services — the system AI did not build (at first)<a href=\"https://mhomol.github.io/blog/2026/07/05/transmission-resumed-cursor-year-one#2-managed-services--the-system-ai-did-not-build-at-first\" class=\"hash-link\" aria-label=\"Direct link to 2. Managed Services — the system AI did not build (at first)\" title=\"Direct link to 2. Managed Services — the system AI did not build (at first)\" translate=\"no\">​</a></h3>\n<p>Not everything in this story started inside Cursor. Some of the most important work predates the agent cockpit — and still anchors everything that came after.</p>\n<p>Over the past few years, <a href=\"https://threewill.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">ThreeWill</a> pivoted significantly <strong>down-market</strong>: more customers, served through a <strong>monthly managed services engagement</strong> rather than large one-off projects alone. Consultants — we now call them <strong>CSMs (Client Success Managers)</strong> — carry more accounts and less time per week per client. Spread thinner, with more \"things\" in motion, the firm needed a system that made that workload <strong>visible</strong>, <strong>manageable</strong>, and <strong>honest about whether we were winning or losing</strong>.</p>\n<p>I architected and built that system: the <strong>Managed Services Dashboard</strong> — a full <strong>Power Platform and Dataverse</strong> solution delivered as a <strong>model-driven app with custom pages</strong>. Engagement tracking, work visualization, reporting you can stand behind. This was classic problem-solving and platform engineering; AI was not the lead actor early on. It did not need to be. The problem was structural.</p>\n<p>Around the same pivot, we chose to <strong>specialize by vertical</strong>, starting with <strong>Human Services</strong> (often called Home and Community-based Services). That changed what \"managed services\" had to mean operationally. We were not only tracking hours and tasks — we were tracking <strong>reusable services and software</strong> we could carry client-to-client within a vertical, the pieces that save time or pain when the next customer has the same class of problem.</p>\n<p>We call that reuse layer <strong>The Shelf</strong>.</p>\n<p>The Shelf became a critical feature inside the Managed Services Dashboard: what we have already built, what is ready to adapt, what belongs to which vertical, and how it compounds delivery instead of reinventing it every engagement. Human Services shelf items have flourished especially in the past year — accelerated, honestly, once AI entered the build loop for documentation, SPFx work, and demo tooling.</p>\n<p>That led to another spearheaded effort: a <strong>demo SharePoint intranet dedicated to the Human Services vertical</strong> — a showcase for the many ways we can assist organizations in that space, with real shelf artifacts behind the glass instead of slide-deck promises.</p>\n<p>When I talk about Cursor and agents today at ThreeWill, <strong>ThreeWilly</strong> and <strong>ThreeSight</strong> sit on top of this foundation. The dashboard and The Shelf are the operational truth; the agents help CSMs and builders navigate it faster. AI amplified the last mile. The architecture came from years of watching how services firms actually break when they scale.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"3-threewill-internal--turning-agents-into-team-infrastructure\">3. ThreeWill internal — turning agents into team infrastructure<a href=\"https://mhomol.github.io/blog/2026/07/05/transmission-resumed-cursor-year-one#3-threewill-internal--turning-agents-into-team-infrastructure\" class=\"hash-link\" aria-label=\"Direct link to 3. ThreeWill internal — turning agents into team infrastructure\" title=\"Direct link to 3. ThreeWill internal — turning agents into team infrastructure\" translate=\"no\">​</a></h3>\n<p>Some of the most interesting recent work happened <em>inside</em> the firm — not only shipping features, but asking: <strong>how should our team work when AI is always available?</strong></p>\n<p>That led to threads like:</p>\n<ul>\n<li class=\"\"><strong>ThreeWilly</strong> — an ops workspace where Cursor helps with Managed Services context, scorecards, CSM drafts, Ruddr time, and the weekly \"what actually happened?\" questions that are easy to defer and expensive to forget</li>\n<li class=\"\"><strong>ThreeSight</strong> — revisiting a Copilot Studio agent I built long ago and revitalizing it with layered instructions, Dataverse business skills, and MCP-discoverable capabilities so it behaves like a read-only intelligence assistant instead of a dusty demo</li>\n<li class=\"\"><strong>Engineering standards and \"non-negotiables\"</strong> — a living taxonomy of things we expect on every solution, encoded so agents can help enforce them instead of leaving quality entirely to memory and luck</li>\n<li class=\"\"><strong>Ruddr MCP</strong> — pushing our PSA integration further so capacity, projects, and time are queryable from the same environment where we already write code and docs</li>\n</ul>\n<p>This is where my relationship with AI stopped feeling like \"cool pair programmer\" and started feeling <strong>intertwined with how a consulting team operates</strong>.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"4-mcp--the-wiring-diagram-behind-the-magic\">4. MCP — the wiring diagram behind the magic<a href=\"https://mhomol.github.io/blog/2026/07/05/transmission-resumed-cursor-year-one#4-mcp--the-wiring-diagram-behind-the-magic\" class=\"hash-link\" aria-label=\"Direct link to 4. MCP — the wiring diagram behind the magic\" title=\"Direct link to 4. MCP — the wiring diagram behind the magic\" translate=\"no\">​</a></h3>\n<p>If Cursor is the cockpit, <strong>MCP servers</strong> are the instruments on the panel.</p>\n<p>Over this stretch I leaned heavily into connecting agents to real systems:</p>\n<ul>\n<li class=\"\"><strong>Microsoft 365</strong> — mail, calendar, Teams, SharePoint, OneDrive, Word (with the usual enterprise consent realities)</li>\n<li class=\"\"><strong>Dataverse</strong> — especially Managed Services operational data</li>\n<li class=\"\"><strong>Ruddr</strong> — project/time context for consulting workflows</li>\n<li class=\"\"><strong>Microsoft Learn docs</strong> — grounding answers in current official guidance instead of vibes</li>\n</ul>\n<p>The lesson was not \"connect everything.\" The lesson was <strong>connect the right things with guardrails</strong> — read-only where possible, explicit skills for dangerous operations, and enough documentation that future-me (or future-teammate) knows why a tool exists.</p>\n<p>Yes, I also had the universal MCP experience of everything catching fire until a full Cursor restart cleared it. File-&gt;Quit remains undefeated.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"5-personal-builds--curiosity-on-my-own-terms\">5. Personal builds — curiosity on my own terms<a href=\"https://mhomol.github.io/blog/2026/07/05/transmission-resumed-cursor-year-one#5-personal-builds--curiosity-on-my-own-terms\" class=\"hash-link\" aria-label=\"Direct link to 5. Personal builds — curiosity on my own terms\" title=\"Direct link to 5. Personal builds — curiosity on my own terms\" translate=\"no\">​</a></h3>\n<p>Not everything was billable. Some of the most energizing Cursor time went to <strong>Homol-Works</strong> side quests:</p>\n<ul>\n<li class=\"\"><strong>90-Day / Memento Mori</strong> — a long-running personal app thread where I chased iOS widgets, Expo SDK upgrades, TestFlight failures, and the eternal question: \"are we close enough to keep going or should we park this?\"</li>\n<li class=\"\"><strong>Homol-Rides / Backseat Games</strong> — a family road-trip game idea that became <a href=\"https://apps.apple.com/us/app/backseat-games-road-trip-fun/id6778523720\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Backseat Games on the App Store</a> — built with Cursor to turn phones into shared play instead of solo scrolling</li>\n<li class=\"\"><strong>Homol-Invests</strong> — early exploration of an AI-assisted investing experiment (more curiosity lab than product — for now)</li>\n<li class=\"\"><strong>Workspace activity reporting</strong> — meta, but on-brand: a skill that scans agent transcripts across projects and renders a report card so I can see what is in flight, what needs a commit, and what conversation I should return to</li>\n</ul>\n<p>These projects matter to the story because they are <strong>pure problem-solving energy</strong> — the same trait that pulled me toward Microsoft 365 a decade ago, now pulling me toward agents, mobile widgets, and weird little games for my kids in the back seat.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"6-homol-works-itself--the-site-as-proof-of-the-workflow\">6. Homol Works itself — the site as proof of the workflow<a href=\"https://mhomol.github.io/blog/2026/07/05/transmission-resumed-cursor-year-one#6-homol-works-itself--the-site-as-proof-of-the-workflow\" class=\"hash-link\" aria-label=\"Direct link to 6. Homol Works itself — the site as proof of the workflow\" title=\"Direct link to 6. Homol Works itself — the site as proof of the workflow\" translate=\"no\">​</a></h3>\n<p>Which brings us to why you are reading this on a terminal-green page with a surprised gopher in the navbar.</p>\n<p>Homol Works was a <strong>five-year-old Docusaurus experiment</strong> — alpha-era dependencies, homepage widgets calling old Azure Functions, last meaningful blog activity years ago. Classic \"personal brand hostage to busy season\" stuff.</p>\n<p>This week, with Cursor as the primary builder, the site got:</p>\n<ul>\n<li class=\"\">A <strong>Docusaurus 3</strong> upgrade path and a modern React baseline</li>\n<li class=\"\">A <strong>WarGames-inspired terminal hero</strong> — blinking cursor, <code>help</code>, easter eggs, randomized taglines</li>\n<li class=\"\">A <strong>surprised gopher logo</strong> — extracted from the hero art, because some brand decisions are non-negotiable</li>\n<li class=\"\"><strong>Static Microsoft Learn achievements</strong> instead of fragile live API calls (130 badges and 39 trophies at last refresh — because Microsoft does not hand you a simple personal badges API and I am not pretending otherwise)</li>\n<li class=\"\">A <strong>weekly accomplishments draft pipeline</strong> — automation that writes reviewable raw material under <code>blog-unpublished/</code> instead of auto-publishing my half-formed thoughts to the open internet</li>\n<li class=\"\">An honest <strong><a class=\"\" href=\"https://mhomol.github.io/docs/ai-disclosure\">AI disclosure</a></strong> — this site is maintained as a collaboration between Mike Homol and Cursor; I think that is a feature, not a footnote to hide</li>\n</ul>\n<p>In other words: the comeback post and the comeback site are the same thesis. <strong>Use AI to reduce friction on the work you already care about. Keep judgment. Publish deliberately.</strong></p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-i-believe-now-that-i-only-suspected-in-2023\">What I believe now (that I only suspected in 2023)<a href=\"https://mhomol.github.io/blog/2026/07/05/transmission-resumed-cursor-year-one#what-i-believe-now-that-i-only-suspected-in-2023\" class=\"hash-link\" aria-label=\"Direct link to What I believe now (that I only suspected in 2023)\" title=\"Direct link to What I believe now (that I only suspected in 2023)\" translate=\"no\">​</a></h2>\n<p>When I wrote about ChatGPT as the Oracle, I was excited and a little unnerved — productivity upside on one hand, \"what happens to thinking jobs?\" on the other. I still hold both truths.</p>\n<p>What a year inside Cursor taught me is narrower and more useful:</p>\n<ol>\n<li class=\"\"><strong>Curiosity scales when the ask-build-learn loop gets shorter.</strong> I always loved solving problems. AI did not replace that love. It fed it.</li>\n<li class=\"\"><strong>The highest leverage is not codegen.</strong> It is context: skills, rules, MCP, repo structure, and workflows that teach the agent how <em>we</em> work.</li>\n<li class=\"\"><strong>Client-safe delivery and personal experimentation are not opposites.</strong> The same habits — small diffs, verify claims, describe client work generically on the blog — apply everywhere.</li>\n<li class=\"\"><strong>Learning in public requires a review gate.</strong> Weekly drafts, unpublished folders, and human approval on AI-generated media beat hot takes every time.</li>\n<li class=\"\"><strong>The blog matters again.</strong> Not because the industry needs another AI post. Because <strong>writing is still how I compress experience into something future-me can reuse.</strong></li>\n</ol>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"this-is-a-series-not-a-single-dump\">This is a series, not a single dump<a href=\"https://mhomol.github.io/blog/2026/07/05/transmission-resumed-cursor-year-one#this-is-a-series-not-a-single-dump\" class=\"hash-link\" aria-label=\"Direct link to This is a series, not a single dump\" title=\"Direct link to This is a series, not a single dump\" translate=\"no\">​</a></h2>\n<p>This post is intentionally broad — the \"transmission resumed\" beacon. Deeper installments are planned so each one stays useful instead of turning into a memoir nobody finishes.</p>\n<p>Planned follow-ups (links will appear here as each post publishes):</p>\n<ol>\n<li class=\"\"><strong><a class=\"\" href=\"https://mhomol.github.io/blog/transmission-resumed-cursor-year-one\">Transmission Resumed</a></strong> <em>(this post)</em> — the gap, the shift from browser AI to IDE pairing, the thematic recap</li>\n<li class=\"\"><strong>Bringing Homol Works Back With Cursor</strong> — Docusaurus upgrade, terminal theme, Learn badges, weekly draft automation</li>\n<li class=\"\"><strong>MCP and the Consulting Cockpit</strong> — wiring agents to M365, Dataverse, Ruddr, and docs without losing your mind</li>\n<li class=\"\"><strong>Shelf Life</strong> — SPFx reuse, internal products, demo tooling, and what \"build once, adapt often\" looks like with agents in the loop</li>\n<li class=\"\"><strong>Backseat Games Shipped</strong> — road-trip games, App Store launch, building for family play with Cursor</li>\n<li class=\"\"><strong>Side Quests</strong> — Memento Mori and other personal projects as curiosity labs</li>\n</ol>\n<p>The working outline stays in the repo under <code>blog-unpublished/</code> for my own planning.</p>\n<p>If there is a thread you want higher in the queue, tell me. The gopher listens.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-comes-next-on-homol-works\">What comes next on Homol Works<a href=\"https://mhomol.github.io/blog/2026/07/05/transmission-resumed-cursor-year-one#what-comes-next-on-homol-works\" class=\"hash-link\" aria-label=\"Direct link to What comes next on Homol Works\" title=\"Direct link to What comes next on Homol Works\" translate=\"no\">​</a></h2>\n<p>Short term:</p>\n<ul>\n<li class=\"\">Keep running <strong>weekly AI build drafts</strong> and promote the good parts into posts</li>\n<li class=\"\">Refresh Learn achievements on a sane cadence</li>\n<li class=\"\">Fix the boring broken links and author metadata the build already warned about (because agents love warnings and I love quiet builds)</li>\n</ul>\n<p>Long term:</p>\n<ul>\n<li class=\"\">More <strong>nerdy transmissions</strong> — practical Microsoft 365 and Power Platform notes, agent workflow patterns, things I wish I had found in one place</li>\n<li class=\"\">Less guilt about gaps between posts — the goal is <strong>signal</strong>, not schedule for schedule's sake</li>\n<li class=\"\">A site that stays fresh because the maintenance workflow is designed for how I actually work now</li>\n</ul>\n<hr>\n<p><em>Homol Works is maintained as an <a class=\"\" href=\"https://mhomol.github.io/docs/ai-disclosure\">AI-assisted collaboration</a> between Mike Homol and <a href=\"https://cursor.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Cursor</a>. This post was drafted the same way — reviewed and edited by a human who still owns the opinions. Hero image AI-generated, human reviewed.</em></p>",
            "url": "https://mhomol.github.io/blog/2026/07/05/transmission-resumed-cursor-year-one",
            "title": "Transmission Resumed — A Year Inside Cursor",
            "summary": "STATUS MIKE HOMOL",
            "date_modified": "2026-07-05T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "ai",
                "cursor",
                "homol-works",
                "personal-brand",
                "comeback"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2023/01/05/consult-the-oracle",
            "content_html": "<blockquote>\n<p>The future has arrived in the form of <a href=\"https://chat.openai.com/chat\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">ChatGPT</a>.</p>\n</blockquote>\n<a href=\"https://chat.openai.com/chat\" target=\"_blank\"><img height=\"250px\" src=\"https://media1.giphy.com/media/3I05kogbcajmzchPdl/giphy.gif?cid=de9bf95ehoa1f9mn0zctknjceija65l0ziqbhfprh368o67o&amp;rid=giphy.gif&amp;ct=g\" width=\"314px\" itemtype=\"http://schema.skype.com/Giphy\" alt=\"Consult the Oracle\"></a>\n<p>So I'm late to the party on <a href=\"https://chat.openai.com/chat\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">ChatGPT</a>. Doesn't matter. I have to write about it, as it's just too groundbreaking to not.</p>\n<p>I returned from break to find my coworker talking up ChatGPT. I had heard a few things already but folks had just referred to it as a chat bot. Umm, it's so much more. Once my buddy showed me the blog post it rendered when he gave it a simple topic suggestion and then the PowerShell script it created based on the idea he fed it, I realized I was looking at something far more than a chat bot.  This was the promised evolution of Artificial Intelligence.</p>\n<p>Like any other good coder, I started tinkering around and haven't stopped thinking about what I could or should be doing with this technology.</p>\n<p>Here are my initial predictions and thoughts on how this will impact us and the world.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"always-start-with-it\">Always start with it<a href=\"https://mhomol.github.io/blog/2023/01/05/consult-the-oracle#always-start-with-it\" class=\"hash-link\" aria-label=\"Direct link to Always start with it\" title=\"Direct link to Always start with it\" translate=\"no\">​</a></h3>\n<p>Basically, anytime you have something to do: research, guidance, recommendations, starting a coding solution, planning, scripting, you name it.  Check ChatGPT first.  Use it as something to do a baseline against, if nothing else.  You should see your productivity go up and I won't be surprised if companies start to expect that as well.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"scaffold-your-code-with-it\">Scaffold your code with it<a href=\"https://mhomol.github.io/blog/2023/01/05/consult-the-oracle#scaffold-your-code-with-it\" class=\"hash-link\" aria-label=\"Direct link to Scaffold your code with it\" title=\"Direct link to Scaffold your code with it\" translate=\"no\">​</a></h3>\n<p>If you have a product or idea for a program or app or coded solution, use this to get it scaffolded.  It's not yet at a place where it can make complex solutions based on a multitude of feature inputs, but you could definitely ge there just by communicating with ChatGPT in chunks.  The code may not be functional or perfect, but I can guarantee you will have something to start with much faster than anything else you've ever used.  Plus, starting out something can feel tedious and repetitive and this just expedites it even more.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"thinking-jobs-are-going-to-shrink-eventually\">\"Thinking\" jobs are going to shrink, eventually<a href=\"https://mhomol.github.io/blog/2023/01/05/consult-the-oracle#thinking-jobs-are-going-to-shrink-eventually\" class=\"hash-link\" aria-label=\"Direct link to &quot;Thinking&quot; jobs are going to shrink, eventually\" title=\"Direct link to &quot;Thinking&quot; jobs are going to shrink, eventually\" translate=\"no\">​</a></h3>\n<p>Is this a future that scares me a bit?  Yes. We always associated robots with replacing manual labor but this is the moment I'm understanding that even the thinking jobs, like coding, writing, imagining, engineering could also be replaced.  If nothing else, you'll need fewer and fewer people with the idea and the means and the code monkeys and designers can be replaced entirely.  Andrew Yang's UBI is sounding more and more appealing. In all seriousness, as a father of 4, I worry about a world in which fewer and fewer people are needed to get things done, as it could allow for an even further divide in our already divided class system. In a world where people may be needed to \"do\" things less and less, I may be encouraging my children to get back to the basics and be sure that they are self-sufficient and capable of doing the jobs no one wants to do.  It may be all that's left at the end - or get a job with SpaceX and hop of this rock lol.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"neuralink-makes-sense-now\">Neuralink makes sense now<a href=\"https://mhomol.github.io/blog/2023/01/05/consult-the-oracle#neuralink-makes-sense-now\" class=\"hash-link\" aria-label=\"Direct link to Neuralink makes sense now\" title=\"Direct link to Neuralink makes sense now\" translate=\"no\">​</a></h3>\n<p>I knew that <a href=\"https://neuralink.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Neuralink</a> would be something special, but now I feel like I can conceptualize it even for myself.  I find myself wanting to treat ChatGPT as an extension of my own consciousness, even though it's working independently.  Once I have fed it something and received information back, I can't unlearn it, so it becomes a part of me.  I feel like this will be the outcome of a Neuralink that is paired with this type of underlying technology, at instantaneous speeds and interfacing directly with the brain.  Kind of mind-boggling really.</p>\n<p>That's my first impression of this groundbreaking technology.  It is truly game-changing.  It's our modern Oracle.</p>",
            "url": "https://mhomol.github.io/blog/2023/01/05/consult-the-oracle",
            "title": "Consult the Oracle - the seismic shift of ChatGPT",
            "summary": "The future has arrived in the form of ChatGPT.",
            "date_modified": "2023-01-05T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "chatgpt",
                "innovation",
                "future",
                "predictions",
                "habits"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why",
            "content_html": "<p><img decoding=\"async\" loading=\"lazy\" src=\"https://techgave.com/wp-content/uploads/2021/05/Hybrid-work-model.jpg\" alt=\"\" class=\"img_ev3q\"></p>\n<blockquote>\n<p>On your digital employee experience journey with Microsoft and the 365 ecosystem, you're going to encounter an opportunity to adopt the Power Platform and grow its use within your organization.  Should you jump at this chance?</p>\n</blockquote>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"part-of-the-journey\">Part of the Journey<a href=\"https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why#part-of-the-journey\" class=\"hash-link\" aria-label=\"Direct link to Part of the Journey\" title=\"Direct link to Part of the Journey\" translate=\"no\">​</a></h2>\n<p>In our world of hybrid work, it is a necessity for your organization to embark on a digital employee experience journey. You want your physical workplace to have all of the necessities and process in place so your people can both \"get their work done\" but also thrive within your organization. Your digital workplace needs to do the same.</p>\n<p>As your organization and your people mature, hopefully they will find new and exciting ways to contribute and innovate. If you've chosen Microsoft 365 as the basis for your digital workplace and employee experience, then you will inevitably encounter the <a href=\"https://powerplatform.microsoft.com/en-us/?ef_id=1e6827fc60d116b180b645c00b2e4b33:G:s&amp;OCID=AID2200053_SEM_1e6827fc60d116b180b645c00b2e4b33:G:s&amp;msclkid=1e6827fc60d116b180b645c00b2e4b33\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Power Platform</a>. When this moment comes, you will be faced with a choice: to <strong>embrace</strong> or <em>ignore</em>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"who-does-this-benefit-and-how\">Who does this benefit and how?<a href=\"https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why#who-does-this-benefit-and-how\" class=\"hash-link\" aria-label=\"Direct link to Who does this benefit and how?\" title=\"Direct link to Who does this benefit and how?\" translate=\"no\">​</a></h2>\n<p>This decision to adopt Power Platform can be seen through many different lenses, but I want to focus on these 3 key beneficiaries:</p>\n<ul>\n<li class=\"\">Me</li>\n<li class=\"\">My Team</li>\n<li class=\"\">The Organization</li>\n</ul>\n<p>As we look at these beneficiaries, I will break it down into 2 ways we can measure the success of adoption:</p>\n<ul>\n<li class=\"\">The innovation or improvement it can provide</li>\n<li class=\"\">The ROI it might provide</li>\n</ul>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"how-will-it-benefit-me\">How will it benefit <strong><em>me</em></strong>?<a href=\"https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why#how-will-it-benefit-me\" class=\"hash-link\" aria-label=\"Direct link to how-will-it-benefit-me\" title=\"Direct link to how-will-it-benefit-me\" translate=\"no\">​</a></h3>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://mhomol.github.io/assets/images/i-have-the-power-8f9d9e8338649ec499419ce1f0d0ea10.png\" width=\"400\" height=\"400\" class=\"img_ev3q\"></p>\n<p>In this case, we are talking about the individual or citizen developer: your people.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"innovationimprovement\"><strong>Innovation/Improvement</strong><a href=\"https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why#innovationimprovement\" class=\"hash-link\" aria-label=\"Direct link to innovationimprovement\" title=\"Direct link to innovationimprovement\" translate=\"no\">​</a></h4>\n<p>Replace repetitive tasks with flows or apps to improve my focus on what really matters</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"quantitative-roi\"><strong>Quantitative ROI</strong><a href=\"https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why#quantitative-roi\" class=\"hash-link\" aria-label=\"Direct link to quantitative-roi\" title=\"Direct link to quantitative-roi\" translate=\"no\">​</a></h4>\n<p>Time saved per day vs Time spent to make a flow or app</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"how-will-it-benefit-my-team\">How will it benefit <strong><em>my team</em></strong>?<a href=\"https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why#how-will-it-benefit-my-team\" class=\"hash-link\" aria-label=\"Direct link to how-will-it-benefit-my-team\" title=\"Direct link to how-will-it-benefit-my-team\" translate=\"no\">​</a></h3>\n<p>Here we are looking at the leader or decision maker of a team or group or department/division.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"innovationimprovement-1\"><strong>Innovation/Improvement</strong><a href=\"https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why#innovationimprovement-1\" class=\"hash-link\" aria-label=\"Direct link to innovationimprovement-1\" title=\"Direct link to innovationimprovement-1\" translate=\"no\">​</a></h4>\n<p>Replace regular, and potentially involved, manual business operations with a flow or app to create new efficiencies and potential to focus on brand new opportunities and ideas</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"quantitative-roi-1\"><strong>Quantitative ROI</strong><a href=\"https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why#quantitative-roi-1\" class=\"hash-link\" aria-label=\"Direct link to quantitative-roi-1\" title=\"Direct link to quantitative-roi-1\" translate=\"no\">​</a></h4>\n<p>Time saved in a year vs Time spent to make solution</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"how-does-this-benefit-the-organization\">How does this benefit <strong><em>the organization</em></strong>?<a href=\"https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why#how-does-this-benefit-the-organization\" class=\"hash-link\" aria-label=\"Direct link to how-does-this-benefit-the-organization\" title=\"Direct link to how-does-this-benefit-the-organization\" translate=\"no\">​</a></h3>\n<p>Here we want to look at the benefits as perceived from the \"C suite\" perspective, assuming the previous 2 barriers have been surpassed.</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"innovationimprovement-2\"><strong>Innovation/Improvement</strong><a href=\"https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why#innovationimprovement-2\" class=\"hash-link\" aria-label=\"Direct link to innovationimprovement-2\" title=\"Direct link to innovationimprovement-2\" translate=\"no\">​</a></h4>\n<p>Replacing all of these various manual and/or outdated tasks creates space for new innovations and new ideas</p>\n<h4 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"quantitative-roi-2\"><strong>Quantitative ROI</strong><a href=\"https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why#quantitative-roi-2\" class=\"hash-link\" aria-label=\"Direct link to quantitative-roi-2\" title=\"Direct link to quantitative-roi-2\" translate=\"no\">​</a></h4>\n<p>Either cutting costs or improving efficiencies and creating new opportunities for growth</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"are-these-benefits-real\">Are these benefits real?<a href=\"https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why#are-these-benefits-real\" class=\"hash-link\" aria-label=\"Direct link to Are these benefits real?\" title=\"Direct link to Are these benefits real?\" translate=\"no\">​</a></h2>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://mhomol.github.io/assets/images/mr-krabbs-320e5b080ce1b0fcdc89b464953dd8e4.gif\" width=\"500\" height=\"374\" class=\"img_ev3q\"></p>\n<p>So there can be benefits seen all the way up through the organization. But are these benefits real? I certainly think so and here at ThreeWill we have seen this evidence at all stages. But what does Microsoft have to say about it? They have studied it enough to be able to put their learnings into a <a href=\"https://info.microsoft.com/ww-Landing-ROI-calculator-for-Forrester-TI-for-Power-Platform.html?LCID=EN-US_\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Power Platform ROI Calculator</a>. According to them, the return-on-investment calculator is an interactive model based on The Total Economic Impact™ of Microsoft Power Platform, a commissioned study conducted by Forrester Consulting. As you dig in, you'll see that this is something that has been analyzed deeply and these benefits aren't just \"pie in the sky\". These have real dollars associated to them and we know that innovation can sometime be priceless.</p>\n<p>You should take the time to review the entirety of the study and what was found, but I want to point out just the quantified benefits:</p>\n<ul>\n<li class=\"\">Citizen developer projects completed using low-code/no-code tools cost less.</li>\n<li class=\"\">The organizations replaced third-party business applications and business intelligence tools with Power Platform.</li>\n<li class=\"\">Solutions built with Power Platform made users of all types more efficient.</li>\n<li class=\"\">Power Platform delivered improved business outcomes across many dimensions.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"where-to-start\">Where to start?<a href=\"https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why#where-to-start\" class=\"hash-link\" aria-label=\"Direct link to Where to start?\" title=\"Direct link to Where to start?\" translate=\"no\">​</a></h2>\n<p>When getting started with Power Platform, you may be inclined to just \"turn it off\" for now. Here's what I would say on the matter: your instinct is not wrong, but perhaps it doesn't need to be that drastic. Here's the reality: Microsoft has made the citizen developer their #1 priority and if that creates more hassle for IT, so be it. Thankfully, there are some things that can be done early and quickly so that you don't have to throw out the baby with the bathwater.</p>\n<p>Now there is more than just one thing you can do to get started and I have plenty to say on the matter. Additionally, I'd be remiss if I didn't recommend talking to <a href=\"https://threewill.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">ThreeWill</a> first to make sure you get started in the right way. But here's my first clue for you, if you truly are just getting started with the Power Platform and feel like adoption is something you want: <strong>Visibility</strong>.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"governance-without-analytics-is-just-your-opinion\">Governance without Analytics is just your opinion<a href=\"https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why#governance-without-analytics-is-just-your-opinion\" class=\"hash-link\" aria-label=\"Direct link to Governance without Analytics is just your opinion\" title=\"Direct link to Governance without Analytics is just your opinion\" translate=\"no\">​</a></h3>\n<p>Remember that you can't govern what you can't see. And if you can't govern or monitor it, how will you help people grow with it? So your first order of business will be to set yourself up for success with better visibility and a process that can respond and work with this new level of insight. This will allow you to feel empowered to open the flood gates. This is a <a href=\"https://threewill.com/jcdecaux-improves-power-platform-governance/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">service offering at ThreeWill</a>: a Power Platform governance workshop, where we will work with you to help setup a <a href=\"https://docs.microsoft.com/en-us/power-platform/guidance/coe/starter-kit\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Microsoft Center of Excellence</a> and the implied necessary process, along with a step-by-step road map of next steps for success.</p>\n<blockquote>\n<p>The following was a cross-post from <a href=\"https://threewill.com/should-my-organization-care-about-power-platform-adoption/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">ThreeWill</a></p>\n</blockquote>",
            "url": "https://mhomol.github.io/blog/2022/03/23/power-platform-adoption-why",
            "title": "Why should my organization care about power platform adoption?",
            "summary": "On your digital employee experience journey with Microsoft and the 365 ecosystem, you're going to encounter an opportunity to adopt the Power Platform and grow its use within your organization.  Should you jump at this chance?",
            "date_modified": "2022-03-23T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "powerplatform",
                "employeeexperience",
                "lowcode",
                "m365",
                "philosophy",
                "roi",
                "adoption"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2021/04/13/improving-page-properties",
            "content_html": "<blockquote>\n<p>Recently, I had the privilege of making <a href=\"https://techcommunity.microsoft.com/t5/microsoft-365-pnp-blog/improving-the-page-properties-web-part/ba-p/2256651\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">my first post</a> on the <a href=\"https://techcommunity.microsoft.com/t5/microsoft-365-pnp-blog/bg-p/Microsoft365PnPBlog\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">PnP Tech Community Blog</a>.  This is just a cross-post of that <a href=\"https://techcommunity.microsoft.com/t5/microsoft-365-pnp-blog/improving-the-page-properties-web-part/ba-p/2256651\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">same article</a>.  Enjoy!</p>\n</blockquote>\n<blockquote>\n<p>P.S. It's been a year since I started up this new blog and, while my regular posting has been down, this is definitely better than I've ever been about communicating what I know and do.  The fact that a year in I'm now a contributor to now 2 different PnP repositories and an author in the tech community blog feels good.  Now, on to the post.</p>\n</blockquote>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"improving-the-page-properties-web-part\">Improving the Page Properties web part<a href=\"https://mhomol.github.io/blog/2021/04/13/improving-page-properties#improving-the-page-properties-web-part\" class=\"hash-link\" aria-label=\"Direct link to Improving the Page Properties web part\" title=\"Direct link to Improving the Page Properties web part\" translate=\"no\">​</a></h2>\n<p>Ever get annoyed with the page properties web part put out by Microsoft? If you've got some OCD issues (like me) then it may not take very long. At <a href=\"https://threewill.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">ThreeWill</a>, we help clients with their digital workplaces and improving the way their users can obtain information and makes sense of it all. Oftentimes, the Page Properties web part can be useful here, as we very often add valuable metadata to pages in a digital workplace, which we often tie to page templates as well. News might roll up based on these page properties, which can assist in finding information in many ways. But its often handy to display this metadata in a clean way on a page as well. The standard Page Properties web part seeks to do just that. And, for the most part, it does a fine job with it. But it has a few deficiencies. The most annoying thing to me, when setting up digital workplaces was that it only supports a white background. But there are other small things, like the limitations with pretty standard field types. I like the idea of taking advantage of metadata columns for pages, but being able to use it visually is equally important. I finally decided to do something about it and build a new version of this web part. So with this in mind, let's lay out our goals with this new web part. We will call it the Advanced Page Properties web part.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"feature-goals\">Feature Goals<a href=\"https://mhomol.github.io/blog/2021/04/13/improving-page-properties#feature-goals\" class=\"hash-link\" aria-label=\"Direct link to Feature Goals\" title=\"Direct link to Feature Goals\" translate=\"no\">​</a></h2>\n<p>Attempt to replicate the functionality of Page Properties with the following improvements:</p>\n<ul>\n<li class=\"\">Support for theme variants</li>\n<li class=\"\">Updated to standard capsule look for list options</li>\n<li class=\"\">Support for image fields</li>\n<li class=\"\">Support for hyperlink fields</li>\n<li class=\"\">Support for currency</li>\n<li class=\"\">Improved support for dates</li>\n</ul>\n<p>In other words, we're shooting for this:\n<img decoding=\"async\" loading=\"lazy\" src=\"https://github.com/pnp/sp-dev-fx-webparts/raw/main/samples/react-advanced-page-properties/assets/props.gif\" alt=\"Desired End State\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"property-pane\">Property Pane<a href=\"https://mhomol.github.io/blog/2021/04/13/improving-page-properties#property-pane\" class=\"hash-link\" aria-label=\"Direct link to Property Pane\" title=\"Direct link to Property Pane\" translate=\"no\">​</a></h2>\n<p>For a part like this, it's all about getting the property page figured out first. We want this to feel familiar too and not stray too much from the original design, unless it helps.</p>\n<p>Let's start by recognizing our chief property that the web part needs: selectedProperties. This array will hold the internal names of the fields that a user has selected for display in our web part. We intend on passing this property down to our React component. Here's a look at our property object:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">interface</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">IAdvancedPagePropertiesWebPartProps</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token literal-property property\">title</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> string</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token literal-property property\">selectedProperties</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> string</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<p>In our AdvancedPagePropertiesWebPart, we want to hold all possible properties for drop downs in a single array.</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">private</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">availableProperties</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">IPropertyPaneDropdownOption</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>Next, we need the following method to obtain the right types of properties for display:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">private</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">getPageProperties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token known-class-name class-name\" style=\"color:rgb(255, 203, 107)\">Promise</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token keyword\" style=\"font-style:italic\">void</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token maybe-class-name\">Log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access maybe-class-name\" style=\"color:rgb(130, 170, 255)\">Write</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Getting Site Page fields...\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> list </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> sp</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">web</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">lists</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">getByTitle</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Site Pages\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> fi </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> list</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">fields</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">availableProperties</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token maybe-class-name\">Log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access maybe-class-name\" style=\"color:rgb(130, 170, 255)\">Write</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">${</span><span class=\"token template-string interpolation\">fi</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token template-string interpolation property-access\">length</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token template-string interpolation method function property-access\" style=\"color:rgb(130, 170, 255)\">toString</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\"> fields retrieved!</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    fi</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">forEach</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">f</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token plain\">f</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">FromBaseType</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&amp;&amp;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token plain\">f</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">Hidden</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&amp;&amp;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!</span><span class=\"token plain\">f</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">Sealed</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&amp;&amp;</span><span class=\"token plain\"> f</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">SchemaXml</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">indexOf</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"ShowInListSettings=\\\"FALSE\\\"\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">===</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">1</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&amp;&amp;</span><span class=\"token plain\"> f</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">TypeAsString</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!==</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Boolean\"</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&amp;&amp;</span><span class=\"token plain\"> f</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">TypeAsString</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!==</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Note\"</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&amp;&amp;</span><span class=\"token plain\"> f</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">TypeAsString</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!==</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"User\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">availableProperties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">push</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">key</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> f</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">InternalName</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">text</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> f</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">Title</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token maybe-class-name\">Log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access maybe-class-name\" style=\"color:rgb(130, 170, 255)\">Write</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">f</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">TypeAsString</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<p>We are using the PnP JS library for gathering the fields in the Site Pages library. Figuring out the right types of filters to gather was a bit of trial-and-error. We are excluding anything that's inherited from a base type or is hidden in any way. We are also excluding 3 standard types so far: boolean, note and user. Note doesn't make sense to display. Boolean can definitely work, but needs a good display convention. User was the only tricky object, which is the reason it isn't done yet.</p>\n<p>We call the above method prior to loading up the property pane.</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">protected</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">onPropertyPaneConfigurationStart</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token known-class-name class-name\" style=\"color:rgb(255, 203, 107)\">Promise</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token keyword\" style=\"font-style:italic\">void</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token maybe-class-name\">Log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access maybe-class-name\" style=\"color:rgb(130, 170, 255)\">Write</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\">onPropertyPaneConfigurationStart</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">getPageProperties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">context</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">propertyPane</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">refresh</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<p>We need handlers for adding and deleting a property and selecting a property from a dropdown. These methods make necessary changes to the selectedProperties array.</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">protected</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">onAddButtonClick</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter literal-property property\">value</span><span class=\"token parameter operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token parameter\"> any</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">properties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">selectedProperties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">push</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">availableProperties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">key</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">toString</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">protected</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">onDeleteButtonClick</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter literal-property property\">value</span><span class=\"token parameter operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token parameter\"> any</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token maybe-class-name\">Log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access maybe-class-name\" style=\"color:rgb(130, 170, 255)\">Write</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">value</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">toString</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">var</span><span class=\"token plain\"> removed </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">properties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">selectedProperties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">splice</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">value</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">1</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token maybe-class-name\">Log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access maybe-class-name\" style=\"color:rgb(130, 170, 255)\">Write</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">${</span><span class=\"token template-string interpolation\">removed</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token template-string interpolation number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\"> removed.</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">protected</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">onPropertyPaneFieldChanged</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">propertyPath</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> string</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">oldValue</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> any</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">newValue</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> any</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">void</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">propertyPath</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">indexOf</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"selectedProperty\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token maybe-class-name\">Log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access maybe-class-name\" style=\"color:rgb(130, 170, 255)\">Write</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'Selected Property identified'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"font-style:italic\">let</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">index</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> number </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> _</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">toInteger</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">propertyPath</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">replace</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"selectedProperty\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">properties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">selectedProperties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">index</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> newValue</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<p>Finally, with all of our pieces in place, we can render our property pane with all it's needed functionality.</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">protected</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">getPropertyPaneConfiguration</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">IPropertyPaneConfiguration</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token maybe-class-name\">Log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access maybe-class-name\" style=\"color:rgb(130, 170, 255)\">Write</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\">getPropertyPaneConfiguration</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Initialize with the Title entry</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">var</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">propDrops</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">IPropertyPaneField</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">any</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    propDrops</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">push</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">PropertyPaneTextField</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'title'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">label</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> strings</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">TitleFieldLabel</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    propDrops</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">push</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">PropertyPaneHorizontalRule</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Determine how many page property dropdowns we currently have</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">properties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">selectedProperties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">forEach</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">prop</span><span class=\"token parameter punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token parameter\"> index</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      propDrops</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">push</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">PropertyPaneDropdown</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\">selectedProperty</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">${</span><span class=\"token template-string interpolation\">index</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token template-string interpolation method function property-access\" style=\"color:rgb(130, 170, 255)\">toString</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token literal-property property\">label</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> strings</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">SelectedPropertiesFieldLabel</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token literal-property property\">options</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">availableProperties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token literal-property property\">selectedKey</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Every drop down gets its own delete button</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      propDrops</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">push</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">PropertyPaneButton</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\">deleteButton</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">${</span><span class=\"token template-string interpolation\">index</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token template-string interpolation method function property-access\" style=\"color:rgb(130, 170, 255)\">toString</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">text</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> strings</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">PropPaneDeleteButtonText</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">buttonType</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">PropertyPaneButtonType</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">Command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">icon</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"RecycleBin\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token literal-property property\">onClick</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">onDeleteButtonClick</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">bind</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> index</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      propDrops</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">push</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">PropertyPaneHorizontalRule</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Always have the Add button</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    propDrops</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">push</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">PropertyPaneButton</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'addButton'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">text</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> strings</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">PropPaneAddButtonText</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">buttonType</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">PropertyPaneButtonType</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">Command</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">icon</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"CirclePlus\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">onClick</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">onAddButtonClick</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">bind</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token keyword\" style=\"font-style:italic\">this</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token literal-property property\">pages</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token literal-property property\">header</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token literal-property property\">description</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> strings</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">PropertyPaneDescription</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token literal-property property\">groups</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token literal-property property\">groupName</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> strings</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">SelectionGroupName</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token literal-property property\">groupFields</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> propDrops</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"our-component-and-displaying-our-fieldsvalues\">Our Component and Displaying our fields/values<a href=\"https://mhomol.github.io/blog/2021/04/13/improving-page-properties#our-component-and-displaying-our-fieldsvalues\" class=\"hash-link\" aria-label=\"Direct link to Our Component and Displaying our fields/values\" title=\"Direct link to Our Component and Displaying our fields/values\" translate=\"no\">​</a></h2>\n<p>Our React component needs to properly react to the list of selected properties changing. It also needs to react to our theme changing. I leveraged <a href=\"https://tahoeninjas.blog/2020/07/28/adding-support-for-theme-variants-in-spfx-web-parts/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">this awesome post from Hugo Bernier</a> for the theming, so I will not cover that in-depth, although you will see how it's being leveraged in the code snippets below. Here are the properties we plan to start with and respond to:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">IReadonlyTheme</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'@microsoft/sp-component-base'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">WebPartContext</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"@microsoft/sp-webpart-base\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">interface</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">IAdvancedPagePropertiesProps</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">context</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">WebPartContext</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">title</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> string</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">selectedProperties</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> string</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">themeVariant</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">IReadonlyTheme</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">|</span><span class=\"token plain\"> </span><span class=\"token keyword nil\" style=\"font-style:italic\">undefined</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<p>We will track the state of our selected properties and their values with hooks. We want to trigger off of changes to our properties, so we will setup a reference to their current state. We will also establish our themeVariant and context at the start of our component.</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Main state object for the life of this component - pagePropValues</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">pagePropValues</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> setPagePropValues</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> useState</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token maybe-class-name\">PageProperty</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> propsRef </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useRef</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> semanticColors </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">IReadonlyTheme</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">themeVariant</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  propsRef</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">current</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  sp</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">setup</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">spfxContext</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">context</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>So we are tracking the state of pagePropValues, which is an array of type PageProperty. What is PageProperty?</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword module\" style=\"font-style:italic\">import</span><span class=\"token plain\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token imports\"> </span><span class=\"token imports maybe-class-name\">IFieldInfo</span><span class=\"token imports\"> </span><span class=\"token imports punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword module\" style=\"font-style:italic\">from</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"@pnp/sp/fields\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword module\" style=\"font-style:italic\">export</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">interface</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">PageProperty</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">info</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">IFieldInfo</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">values</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> any</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<p>Our effect is looking to see when changes are made to the properties, then is peforming our core logic to refresh properties and values.</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">/**</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   * </span><span class=\"token doc-comment comment keyword\" style=\"color:rgb(105, 112, 152);font-style:italic\">@description</span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"> Effects to fire whenever the properties change</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   */</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">useEffect</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">refreshProperties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// No cleanup at this moment</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">propsRef</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">current</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>The core method is refreshProperties. It has 2 main calls it needs to make, whenever selected properties has changed: Establish any known metadata for each property that will assist in display and obtain all actual values for this property and the specific page id that we are viewing.</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">/**</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   * refreshProperties</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   * </span><span class=\"token doc-comment comment keyword\" style=\"color:rgb(105, 112, 152);font-style:italic\">@description</span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"> Gets the actual values for any selected properties, along with critical field metadata and ultimately re-sets the pagePropValues state</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   */</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">async</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">function</span><span class=\"token plain\"> </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">refreshProperties</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">var</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">newSetOfValues</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token maybe-class-name\">PageProperty</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">selectedProperties</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!==</span><span class=\"token plain\"> </span><span class=\"token keyword nil\" style=\"font-style:italic\">undefined</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&amp;&amp;</span><span class=\"token plain\"> props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">selectedProperties</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!==</span><span class=\"token plain\"> </span><span class=\"token keyword null nil\" style=\"font-style:italic\">null</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token maybe-class-name\">Log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access maybe-class-name\" style=\"color:rgb(130, 170, 255)\">Write</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">${</span><span class=\"token template-string interpolation\">props</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token template-string interpolation property-access\">selectedProperties</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token template-string interpolation property-access\">length</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token template-string interpolation method function property-access\" style=\"color:rgb(130, 170, 255)\">toString</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\"> properties used.</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Get the value(s) for the field from the list item itself</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"font-style:italic\">var</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">allValues</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> any </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">context</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">pageContext</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">listItem</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!==</span><span class=\"token plain\"> </span><span class=\"token keyword nil\" style=\"font-style:italic\">undefined</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&amp;&amp;</span><span class=\"token plain\"> props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">context</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">pageContext</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">listItem</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!==</span><span class=\"token plain\"> </span><span class=\"token keyword null nil\" style=\"font-style:italic\">null</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        allValues </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> sp</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">web</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">lists</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">getByTitle</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Site Pages\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">items</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">getById</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">context</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">pageContext</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">listItem</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">id</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">select</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token spread operator\" style=\"color:rgb(137, 221, 255)\">...</span><span class=\"token plain\">props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">selectedProperties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">get</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token console class-name\" style=\"color:rgb(255, 203, 107)\">console</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">allValues</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">for</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token keyword\" style=\"font-style:italic\">let</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"> i </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\"> props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">selectedProperties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">length</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"> i</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">++</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> prop </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">selectedProperties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">i</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token maybe-class-name\">Log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access maybe-class-name\" style=\"color:rgb(130, 170, 255)\">Write</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\">Selected Property: </span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">${</span><span class=\"token template-string interpolation\">prop</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Get field information, in case anything is needed in conjunction with value types</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> field </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">await</span><span class=\"token plain\"> sp</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">web</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">lists</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">getByTitle</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Site Pages\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">fields</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">getByInternalNameOrTitle</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Establish the values array</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token keyword\" style=\"font-style:italic\">var</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">values</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> any</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">allValues</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">hasOwnProperty</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">switch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">field</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">TypeAsString</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"font-style:italic\">case</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"TaxonomyFieldTypeMulti\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"font-style:italic\">case</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"MultiChoice\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              values </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> _</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">clone</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">allValues</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">break</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token keyword\" style=\"font-style:italic\">case</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Thumbnail\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              values</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">push</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token known-class-name class-name\" style=\"color:rgb(255, 203, 107)\">JSON</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">parse</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">allValues</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">break</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token keyword module\" style=\"font-style:italic\">default</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Default behavior is to treat it like a string</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              values</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">push</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">allValues</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">break</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">// Push the final setup of a PageProperty object</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        newSetOfValues</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">push</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">info</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> field</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">values</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token spread operator\" style=\"color:rgb(137, 221, 255)\">...</span><span class=\"token plain\">values</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token function\" style=\"color:rgb(130, 170, 255)\">setPagePropValues</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token spread operator\" style=\"color:rgb(137, 221, 255)\">...</span><span class=\"token plain\">newSetOfValues</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<p>As we loop through all of the properties that have been selected, we make calls with PnP JS to get all of the metadata per field and all of the values per field. The call to get all of the values can return with any number of data types, so we need to be prepared for that. This is why it is of type <code>any[]</code> to start. But this is also why we have a switch statement for certain outlier situations, where the line to set the array of any need to be done a little differently than the default. Our 3 known cases of needing to do something different are <code>TaxonomyFieldTypeMulti</code>, <code>MultiChoice</code> and <code>Thumbnail</code>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"react-and-display\">React and Display<a href=\"https://mhomol.github.io/blog/2021/04/13/improving-page-properties#react-and-display\" class=\"hash-link\" aria-label=\"Direct link to React and Display\" title=\"Direct link to React and Display\" translate=\"no\">​</a></h2>\n<p>Our function component returns the following:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">${</span><span class=\"token template-string interpolation\">styles</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token template-string interpolation property-access\">advancedPageProperties</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\"> </span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">${</span><span class=\"token template-string interpolation\">styles</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token template-string interpolation property-access\">container</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> style</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token literal-property property\">backgroundColor</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> semanticColors</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">bodyBackground</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">color</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> semanticColors</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">bodyText</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">RenderTitle</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">RenderPageProperties</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p><code>RenderTitle</code> is pretty straightforward.</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">/**</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   * RenderTitle</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   * </span><span class=\"token doc-comment comment keyword\" style=\"color:rgb(105, 112, 152);font-style:italic\">@description</span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"> Focuses on the 1 row layer, being the Title that has been chosen for the page</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   * </span><span class=\"token doc-comment comment keyword\" style=\"color:rgb(105, 112, 152);font-style:italic\">@returns</span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   */</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">RenderTitle</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">title</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!==</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">''</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">title</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">props</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">title</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">else</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token keyword null nil\" style=\"font-style:italic\">null</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p><code>RenderPageProperties</code> is the first of a 2-dimensional loop, where we want to display a section for each page property that was select, just like the original.</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">/**</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   * RenderPageProperties</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   * </span><span class=\"token doc-comment comment keyword\" style=\"color:rgb(105, 112, 152);font-style:italic\">@description</span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"> Focuses on the 2nd row layer, which is the property names that have been chosen to be displayed (uses Title as the display name)</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   * </span><span class=\"token doc-comment comment keyword\" style=\"color:rgb(105, 112, 152);font-style:italic\">@returns</span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   */</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">RenderPageProperties</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">pagePropValues </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!==</span><span class=\"token plain\"> </span><span class=\"token keyword nil\" style=\"font-style:italic\">undefined</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&amp;&amp;</span><span class=\"token plain\"> pagePropValues </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!==</span><span class=\"token plain\"> </span><span class=\"token keyword null nil\" style=\"font-style:italic\">null</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword\" style=\"font-style:italic\">var</span><span class=\"token plain\"> retVal </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> _</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">map</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">pagePropValues</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">propNameRow</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">info</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">Title</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">span style</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token literal-property property\">display</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'none'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">-</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">info</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">TypeAsString</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">div className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">propValsRow</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">RenderPagePropValue</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">div</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> retVal</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">else</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">i</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token maybe-class-name\">Nothing</span><span class=\"token plain\"> to display</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">i</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div></code></pre></div></div>\n<p>This method then calls our final display method, RenderPagePropValue, which performs our 2nd layer of array display, mapping all of the values and providing the correct display, based on the field type of the selected property. This is the heart of the display, where various type conversions and logic are done real-time as we display the values, including trying to achieve a slightly more modern SharePoint look using capsules for array labels.</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">/**</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   * RenderPagePropValue</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   * </span><span class=\"token doc-comment comment keyword\" style=\"color:rgb(105, 112, 152);font-style:italic\">@description</span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"> Focuses on the 3rd and final row layer, which is the actual values tied to any property displayed for the page</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   * </span><span class=\"token doc-comment comment keyword\" style=\"color:rgb(105, 112, 152);font-style:italic\">@param</span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"> </span><span class=\"token doc-comment comment parameter\" style=\"color:rgb(105, 112, 152);font-style:italic\">prop</span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   * </span><span class=\"token doc-comment comment keyword\" style=\"color:rgb(105, 112, 152);font-style:italic\">@returns</span><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token doc-comment comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">   */</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">   </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> </span><span class=\"token function-variable function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">RenderPagePropValue</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter literal-property property\">prop</span><span class=\"token parameter operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token parameter\"> </span><span class=\"token parameter maybe-class-name\">PageProperty</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token console class-name\" style=\"color:rgb(255, 203, 107)\">console</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">log</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">var</span><span class=\"token plain\"> retVal </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> _</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">map</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">values</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token parameter\">val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token arrow operator\" style=\"color:rgb(137, 221, 255)\">=&gt;</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">if</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">val </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">!==</span><span class=\"token plain\"> </span><span class=\"token keyword null nil\" style=\"font-style:italic\">null</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">switch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">info</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">TypeAsString</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token keyword\" style=\"font-style:italic\">case</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"URL\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">span className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">urlValue</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">a href</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">Url</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> target</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"_blank\"</span><span class=\"token plain\"> style</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token literal-property property\">color</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> semanticColors</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">link</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">Description</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">a</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token keyword\" style=\"font-style:italic\">case</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Thumbnail\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">img className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">imgValue</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> src</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">serverRelativeUrl</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token keyword\" style=\"font-style:italic\">case</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Number\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">span className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">plainValue</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">info</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"ShowAsPercentage\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">===</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">true</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">?</span><span class=\"token plain\"> </span><span class=\"token known-class-name class-name\" style=\"color:rgb(255, 203, 107)\">Number</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">toLocaleString</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token keyword nil\" style=\"font-style:italic\">undefined</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token literal-property property\">style</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'percent'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">minimumFractionDigits</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">0</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">info</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"CommaSeparator\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">===</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">true</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">?</span><span class=\"token plain\"> val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">toLocaleString</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'en'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">toString</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token keyword\" style=\"font-style:italic\">case</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Currency\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">span className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">plainValue</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">info</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"CommaSeparator\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">===</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">true</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">?</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">Intl</span><span class=\"token class-name punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">NumberFormat</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'en-US'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">style</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'currency'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">currency</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'USD'</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">format</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token known-class-name class-name\" style=\"color:rgb(255, 203, 107)\">Intl</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access maybe-class-name\" style=\"color:rgb(130, 170, 255)\">NumberFormat</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'en-US'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">style</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'currency'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">currency</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'USD'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">useGrouping</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">false</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">format</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token keyword\" style=\"font-style:italic\">case</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"DateTime\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token comment\" style=\"color:rgb(105, 112, 152);font-style:italic\">//,\"\",,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">switch</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">prop</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">info</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"DateFormat\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token keyword\" style=\"font-style:italic\">case</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"StandardUS\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                  </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">span className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">plainValue</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">Date</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">toLocaleDateString</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token keyword\" style=\"font-style:italic\">case</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"ISO8601\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token keyword\" style=\"font-style:italic\">const</span><span class=\"token plain\"> d </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">Date</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                  </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">span className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">plainValue</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">${</span><span class=\"token template-string interpolation\">d</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token template-string interpolation method function property-access\" style=\"color:rgb(130, 170, 255)\">getFullYear</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token template-string interpolation method function property-access\" style=\"color:rgb(130, 170, 255)\">toString</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\">-</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">${</span><span class=\"token template-string interpolation\">d</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token template-string interpolation method function property-access\" style=\"color:rgb(130, 170, 255)\">getMonth</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token template-string string\" style=\"color:rgb(195, 232, 141)\">-</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">${</span><span class=\"token template-string interpolation\">d</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token template-string interpolation method function property-access\" style=\"color:rgb(130, 170, 255)\">getDate</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token template-string interpolation punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token template-string interpolation interpolation-punctuation punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token template-string template-punctuation string\" style=\"color:rgb(195, 232, 141)\">`</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token keyword\" style=\"font-style:italic\">case</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"DayOfWeek\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                  </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">span className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">plainValue</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">Date</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">toLocaleDateString</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"en-US\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">weekday</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'long'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">month</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'long'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">day</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'numeric'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">year</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'numeric'</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token keyword\" style=\"font-style:italic\">case</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"MonthSpelled\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                  </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">span className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">plainValue</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">Date</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">toLocaleDateString</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"en-US\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">month</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'long'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">day</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'numeric'</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">year</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">'numeric'</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token keyword module\" style=\"font-style:italic\">default</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                  </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">span className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">plainValue</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token keyword\" style=\"font-style:italic\">new</span><span class=\"token plain\"> </span><span class=\"token class-name\" style=\"color:rgb(255, 203, 107)\">Date</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token method function property-access\" style=\"color:rgb(130, 170, 255)\">toLocaleDateString</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token keyword\" style=\"font-style:italic\">case</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"TaxonomyFieldTypeMulti\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token keyword\" style=\"font-style:italic\">case</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"TaxonomyFieldType\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">span className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">standardCapsule</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> style</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token literal-property property\">backgroundColor</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> semanticColors</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">accentButtonBackground</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">color</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> semanticColors</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">accentButtonText</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access maybe-class-name\">Label</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token keyword module\" style=\"font-style:italic\">default</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">span className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">standardCapsule</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> style</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token literal-property property\">backgroundColor</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> semanticColors</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">accentButtonBackground</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">color</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> semanticColors</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">accentButtonText</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">val</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"> </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">else</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token plain\">span className</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\">styles</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token property-access\">plainValue</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">N</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token constant\" style=\"color:rgb(130, 170, 255)\">A</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&lt;</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">/</span><span class=\"token plain\">span</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword control-flow\" style=\"font-style:italic\">return</span><span class=\"token plain\"> retVal</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>So that's all of the necessary code. Here's what the finished product looks like, compared to the original page properties web part.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://github.com/pnp/sp-dev-fx-webparts/raw/main/samples/react-advanced-page-properties/assets/diff-screencap.png\" alt=\"Old vs New\" class=\"img_ev3q\"></p>\n<p>This web part is now officially apart of the PnP Web Parts repository and can be found <a href=\"https://github.com/pnp/sp-dev-fx-webparts/tree/master/samples/react-advanced-page-properties\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">here</a>. I would love to hear about improvements you'd like to see and obviously you are more than welcome to contribute. I already have a bit of a list of things I'd love to see it do.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"other-ideas-for-improvements\">Other ideas for improvements<a href=\"https://mhomol.github.io/blog/2021/04/13/improving-page-properties#other-ideas-for-improvements\" class=\"hash-link\" aria-label=\"Direct link to Other ideas for improvements\" title=\"Direct link to Other ideas for improvements\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\">Capsules to be linkable to either a search result page or a filtered view of site pages (we always get client requests for this)</li>\n<li class=\"\">Support for People fields (this is the only thing lacking from the original)</li>\n<li class=\"\">Support for Boolean fields (just need the right idea for proper display, really)</li>\n<li class=\"\">Styling per property (ie. colorizing per property or something to that effect)</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"conclusion\">Conclusion<a href=\"https://mhomol.github.io/blog/2021/04/13/improving-page-properties#conclusion\" class=\"hash-link\" aria-label=\"Direct link to Conclusion\" title=\"Direct link to Conclusion\" translate=\"no\">​</a></h2>\n<p>Hopefully, I've gotten you excited about Page Properties again and you've learned a little along the way around how the current Page Properties part might be doing what it does under the hood. Please consider contributing and feel free to reach out to me anytime. Thanks for your time!</p>",
            "url": "https://mhomol.github.io/blog/2021/04/13/improving-page-properties",
            "title": "Improving Page Properties in SharePoint",
            "summary": "Recently, I had the privilege of making my first post on the PnP Tech Community Blog.  This is just a cross-post of that same article.  Enjoy!",
            "date_modified": "2021-04-13T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "sharepoint",
                "spfx",
                "react",
                "hooks",
                "innovation"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2021/03/12/sharepoint-theme-cheat-sheet",
            "content_html": "<p>Starting up this little cheat sheet and will be posting the link to it on the top page. As I start to catalog various findings in the minutia of Fluent styles, as applied to SharePoint sites and parts, I'm starting to jot them down in this Markdown.</p>\n<p><a class=\"\" href=\"https://mhomol.github.io/blog/2021/03/12/docs/sp-theming-cheat-sheet\">Cheat Sheet</a></p>",
            "url": "https://mhomol.github.io/blog/2021/03/12/sharepoint-theme-cheat-sheet",
            "title": "SharePoint Theming Cheat Sheet",
            "summary": "Starting up this little cheat sheet and will be posting the link to it on the top page. As I start to catalog various findings in the minutia of Fluent styles, as applied to SharePoint sites and parts, I'm starting to jot them down in this Markdown.",
            "date_modified": "2021-03-12T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "sharepoint",
                "themes",
                "elements",
                "m365"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2020/12/23/Power-App-Modal",
            "content_html": "<blockquote>\n<p>Modal windows and pop-ups are a staple of applications. Ever just needed to quickly make one in your PowerApp?</p>\n</blockquote>\n<p>Here is a quick and easy step-by-step for making a pop-up modal window on a screen in your PowerApp.</p>\n<p>Let's assume we have an app screen that's collecting some survey data. Like so:\n<img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/modal/start-screen.png\" alt=\"Start Screen\" class=\"img_ev3q\"></p>\n<p>It would be nice if we could provide a little more information to explain the Account Number that is needed.</p>\n<p>Insert a new Icon onto the screen and give it the Information image.\n<img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/modal/info-icon.gif\" alt=\"Information Icon\" class=\"img_ev3q\"></p>\n<p>Select your screen and add the following to the OnVisible event:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">UpdateContext</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">ShowModal</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">false</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">UpdateContext</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">ModalText</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"\"</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>Next, select your new information icon and add the following to the OnSelect event:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">UpdateContext</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token literal-property property\">ModalText</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Your account number is located at the top right of your most recent bill.\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">UpdateContext</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">ShowModal</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">true</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>Insert a label onto the screen and adjust it's width and height to cover the entire screen. Name this label <code>ModalBackground</code> and remove it's Text.<br>\n<img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/modal/modal-background.gif\" alt=\"Modal Background Label\" class=\"img_ev3q\"></p>\n<p>Next, set the Fill property of this background label to <code>RGBA(169,169,169,.5)</code>. It should look like this:\n<img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/modal/modal-bg-gray.png\" alt=\"Gray Modal Background\" class=\"img_ev3q\"></p>\n<p>Add a second label and name it <code>ModalBox</code>. Center it's horizontal alignment and make the vertical alignment in the middle. Additionally, give it a Fill of White, center align its text and give it some extra padding. It should look something like this when you're done.\n<img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/modal/modal-box-1.png\" alt=\"Modal Textbox\" class=\"img_ev3q\"></p>\n<p>Set the Text property of the 'ModalBox' label to <code>ModalText</code>.</p>\n<p>Add a Cancel Icon to the screen and place it in the top right corner of the <code>ModalBox</code> label. Name it <code>ModalClose</code>. Now you should have something like this:\n<img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/modal/modal-box-2.png\" alt=\"Modal Textbox with Close\" class=\"img_ev3q\"></p>\n<p>Put the following code in the OnSelect event of <code>ModalClose</code>:</p>\n<div class=\"language-javascript codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-javascript codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">UpdateContext</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">ShowModal</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">false</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token function maybe-class-name\" style=\"color:rgb(130, 170, 255)\">UpdateContext</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"> </span><span class=\"token literal-property property\">ModalText</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"\"</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">;</span><br></div></code></pre></div></div>\n<p>Group the 3 new controls you have added and name the group <code>Modal</code>.\n<img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/modal/modal-group.png\" alt=\"Modal Group\" class=\"img_ev3q\"></p>\n<p>Set the Visible property of the <code>Modal</code> group to <code>ShowModal</code>.</p>\n<p>If you've done everything, you're modal should look and work like so:\n<img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/modal/modal-in-action.gif\" alt=\"Modal in Action\" class=\"img_ev3q\"></p>\n<p>This is a quick and painless process to have modals at your disposal in your next PowerApp. Happy low-coding!</p>",
            "url": "https://mhomol.github.io/blog/2020/12/23/Power-App-Modal",
            "title": "How to make a modal window on a PowerApp screen",
            "summary": "Modal windows and pop-ups are a staple of applications. Ever just needed to quickly make one in your PowerApp?",
            "date_modified": "2020-12-23T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "M365",
                "PowerPlatform",
                "PowerApps",
                "TipsAndTricks"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2020/09/24/Disconnect-PnPOnline",
            "content_html": "<p>I learned a valuable lesson in the use of <code>Disconnect-PnPOnline</code> : ALWAYS use it!</p>\n<p>I had a provisioning script that first connected to the tenant admin to create a new site, then switched contexts to provision files, including a newly laid out home page, onto the newly created site.</p>\n<p>I had a connection issue midway through one particular run, where it successfully connected to the tenant admin but didn't successfully connect to the new site, but the script kept running successfully because, hey, it still had a context - to the tenant admin site.</p>\n<p>Essentially, I was able to change the Home page of the Sharepoint Admin Center. Thankfully, I was also able to use <code>Set-PnPHomePage</code> to set it back to _layouts/15/online/AdminHome.aspx#/home. But my heart was skipping a few beats there for a bit.</p>\n<p>If I had just used Disconnect-PnPOnline in between switching contexts then everything would have just stopped. So you've now been warned.</p>",
            "url": "https://mhomol.github.io/blog/2020/09/24/Disconnect-PnPOnline",
            "title": "ALWAYS use Disconnect-PnPOnline",
            "summary": "I learned a valuable lesson in the use of Disconnect-PnPOnline : ALWAYS use it!",
            "date_modified": "2020-09-24T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "Sharepoint",
                "M365",
                "PowerShell",
                "PnP"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB",
            "content_html": "<blockquote>\n<p><a href=\"https://docs.microsoft.com/en-us/microsoftsearch/connectors-overview\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Microsoft Graph Connectors</a> are now in preview mode and appear to be showing up for most folks who have turned on targeted releases in their Dev tenants. So, naturally, I had to see what we could break... er, do.</p>\n</blockquote>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"just-how-much-can-we-throw-in-here\">Just how much can we throw in here?<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#just-how-much-can-we-throw-in-here\" class=\"hash-link\" aria-label=\"Direct link to Just how much can we throw in here?\" title=\"Direct link to Just how much can we throw in here?\" translate=\"no\">​</a></h2>\n<p>Just to spice things up for this blog post, let's see if we can pull in as many different and new-ish things into this bad boy.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://i.imgflip.com/4754vw.jpg\" alt=\"Throw it all in!\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"sql-or-bust\">SQL or bust<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#sql-or-bust\" class=\"hash-link\" aria-label=\"Direct link to SQL or bust\" title=\"Direct link to SQL or bust\" translate=\"no\">​</a></h2>\n<p>One of the first things I wanted to try out was the <a href=\"https://docs.microsoft.com/en-us/microsoftsearch/mssql-connector\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">SQL Server connector</a>. This is big win for SharePoint and 365 to be able to include 3rd-party structured data without any custom development. So it felt like a great candidate to try out first. So here was problem 1: I had no \"on-prem\" SQL database anymore. And SQL is expensive. Or is it? <a href=\"https://peteskelly.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Pete Skelly</a> turned my eyes towards <a href=\"https://docs.microsoft.com/en-us/azure/azure-sql/database/serverless-tier-overview#:~:text=Azure%20SQL%20Database%20serverless%201%20Serverless%20compute%20tier.,...%2010%20Resource%20limits.%20...%20More%20items...%20\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">serverless Azure SQL</a> - a consumption-based model for SQL. Seems pretty new and cool to me. Let's throw it in!</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"gotta-have-a-vm\">Gotta have a VM<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#gotta-have-a-vm\" class=\"hash-link\" aria-label=\"Direct link to Gotta have a VM\" title=\"Direct link to Gotta have a VM\" translate=\"no\">​</a></h2>\n<p>We want to mimic an \"on-prem\" experience, so that means trying to use the <a href=\"https://powerbi.microsoft.com/en-us/gateway/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Power BI gateway</a> to connect to our SQL database. So let's make sure we have a VM to install the gateway onto that will sign in with a dev tenant login and can then connect to the SQL server. Things are looking good. Anything else?</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://i.imgflip.com/475j8q.jpg\" alt=\"Bump up those numbers\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"some-automation-perhaps\">Some automation, perhaps?<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#some-automation-perhaps\" class=\"hash-link\" aria-label=\"Direct link to Some automation, perhaps?\" title=\"Direct link to Some automation, perhaps?\" translate=\"no\">​</a></h2>\n<p>What if we see how much of this we can build with ARM templates? Yeah, that sounds good. <a href=\"https://marketplace.visualstudio.com/items?itemName=msazurermtools.azurerm-vscode-tools\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">The ARM Tools extension</a> for VSCode is pretty solid. Channel 9's DevOpsLab just started a video series on <a href=\"https://channel9.msdn.com/Shows/DevOps-Lab/Demystifying-ARM-Templates-Creating-Your-First-Template\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Demystifying ARM Templates</a>, which shows the power of the MS team's JSON schema they've built. So yeah, why not throw that in. Plus, I've been wanting an opportunity to use the <a href=\"https://marketplace.visualstudio.com/items?itemName=bencoleman.armview\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">ARM Template Viewer</a> extension in VSCode too, so now I have a reason and a way to visually represent almost everything we're creating for this little Graph Connector.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"wait-what-are-we-doing-again\">Wait, what are we doing again?<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#wait-what-are-we-doing-again\" class=\"hash-link\" aria-label=\"Direct link to Wait, what are we doing again?\" title=\"Direct link to Wait, what are we doing again?\" translate=\"no\">​</a></h2>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://i.imgflip.com/475ioo.jpg\" alt=\"All part of the plan\" class=\"img_ev3q\"></p>\n<p>So here's the plan:</p>\n<ul>\n<li class=\"\">Serverless Azure SQL database as a backend</li>\n<li class=\"\">The AdventureWorks database loaded up with Product data</li>\n<li class=\"\">Windows VM with a Power BI gateway to connect to the Azure SQL db</li>\n<li class=\"\">A new graph connector, which uses the gateway to crawl Products, to display in a new vertical in MS Search results</li>\n<li class=\"\">A custom adaptive card display (<em>we gotta see if we can pipe in product pictures, right?</em>)</li>\n</ul>\n<p>Here's a high-level overview of the data flow, from SQL-to-VM-to-365:\n<img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/High-Level-Data-Flow.png\" alt=\"High-Level Data Flow\" class=\"img_ev3q\"></p>\n<p>The VM's gateway will be controlled by the 365 Search service and graph connector API. Every 15 minutes, 365 will attempt an incremental crawl, by reaching out to the gateway on the VM, which will receive a query to execute agains the SQL DB on Azure. So let's get this party started.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"arming-ourselves-get-it\">ARMing ourselves (get it?)<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#arming-ourselves-get-it\" class=\"hash-link\" aria-label=\"Direct link to ARMing ourselves (get it?)\" title=\"Direct link to ARMing ourselves (get it?)\" translate=\"no\">​</a></h2>\n<p>Based on the above, here's what our ARM template needs to look like:</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/full_simple.png\" alt=\"ARM Design\" class=\"img_ev3q\"></p>\n<p>This diagram made possible by <a href=\"https://marketplace.visualstudio.com/items?itemName=bencoleman.armview\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">ARM Template Viewer</a>.</p>\n<p>Don't feel like making all of this? No problem! I've already set it all up and exported it to an ARM Template for you! I even went ahead and took the time to set it up a little better for automation. I've provided 2 files for you to use to get all of this provisioned automagically in your own tenant/subscription:</p>\n<ul>\n<li class=\"\"><a href=\"https://github.com/mhomol/Experiments/blob/master/On-Prem%20SQL%20Graph%20Connector/ARM%20Templates/full_simple.json\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">full_simple.json</a> - this is the ARM template that represents the above design</li>\n<li class=\"\"><a href=\"https://github.com/mhomol/Experiments/blob/master/On-Prem%20SQL%20Graph%20Connector/ARM%20Templates/runit.azcli\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">runit.azcli</a> - this is an Azure CLI script that is built for Bash.</li>\n</ul>\n<p>Simply put the 2 files next to each other from wherever you plan on running them. If you want to run it from the cloud shell, like I did, you'll just have to upload them first, like so.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/step-upload-arm.png\" alt=\"Optional: upload the files to Cloud Shell\" class=\"img_ev3q\"></p>\n<p>The ARM Template JSON has a number of preset variables you should know about. If you want it to run successfully, you'll need to set them to be something unique for you. These variables are:</p>\n<ul>\n<li class=\"\"><code>rg</code> - A reprint of the resource group you plan on putting everything in. That will also get set in the <em>runit.azcli</em>. This name just gets used in some of the more generic naming of things like the NICs and NSGs that I'm hoping you don't have to even think about.</li>\n<li class=\"\"><code>vmname</code> - The name of the VM that will get made for you</li>\n<li class=\"\"><code>location</code> - This also gets set in <em>runit.azcli</em> so you don't necessarily have to set it here.</li>\n<li class=\"\"><code>servers_serverlessserverpoc_name</code> - The name of the database server that will be created</li>\n<li class=\"\"><code>adventureworks_dbname</code> - The name of the database (defaults to HomolWorks)</li>\n<li class=\"\"><code>uniquedomainprefix</code> - Should probably be the same as the name you pick for the VM - using this will make RDP'ing easier</li>\n<li class=\"\"><code>my_ip</code> - if you set this, then your IP will be automatically added to the firewall rules for the Database server</li>\n<li class=\"\"><code>sqladmin_account</code> - the SQL admin user name. Defaults to POCAdmin</li>\n<li class=\"\"><code>vmadmin_name</code> - the VM admin user name. Defaults to captainawesome</li>\n</ul>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"run-it\">Run it!<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#run-it\" class=\"hash-link\" aria-label=\"Direct link to Run it!\" title=\"Direct link to Run it!\" translate=\"no\">​</a></h3>\n<p>The script only has 3 variables it tries to preset before deploying the ARM template. Naturally you could edit this all you want and feed in more parameters rather than setting them up in the .json file. Only 2 variables really need to be set: <code>rg</code> and <code>location</code>. This ARM template is scoped to a resource group, so the script creates that Resource Group first, then deploys the ARM template to the group. Note that you can optionally set the IP you're developing from in the <code>my_ip</code> variable.</p>\n<p>Once you've set <code>rg</code> and <code>location</code>, run the <em>runit.azcli</em> script from a terminal using Bash or Zsh. I ran mine from Azure Cloud Shell.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/step-run-azcli.png\" alt=\"Running the Script\" class=\"img_ev3q\"></p>\n<p>Not so bad so far, right? If you're feeling really adventurous, be sure to look over the ARM Template in full to see everything we've got going on. Lots of small stuff has been squirreled away so you don't have to care.</p>\n<blockquote>\n<p><em>NOTE that I did actually get an error running the template, which was during the setup of one of the advisors for the SQL database, where I was told the resources were busy. But everything had actually executed fine, at least for the purposes of this Proof-of-Concept. So if you get that error, just make sure that the AdventureWorks database was provisioned in the new resource group and you should be good to go.</em></p>\n</blockquote>\n<p>So, we're ARMed. What do we have to show for it?</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://i.imgflip.com/475mr2.jpg\" alt=\"Tis but a scratch\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"review-and-connect\">Review and Connect<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#review-and-connect\" class=\"hash-link\" aria-label=\"Direct link to Review and Connect\" title=\"Direct link to Review and Connect\" translate=\"no\">​</a></h2>\n<p>Let's review everything we have now that the script and ARM template have finished. First let's just take a look at the finished Resource Group. Quite a few resources have been generated and most of them will cost next to nothing. And here's the best part: you can just delete the resource group whenever and be done with this.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/step-rg.png\" alt=\"Our new resource group\" class=\"img_ev3q\"></p>\n<p>Click on the VM and notice the top right portion of the Overview tab. We have a static IP and a DNS. This will make for easy RDP, plus it has been beneficial to setting up our DB firewall.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/step-vm-ip-dns.png\" alt=\"VM IP and DNS\" class=\"img_ev3q\"></p>\n<p>Let's see where that IP is used by SQL. Go back to the resource group and click on the SQL server. Then select the Firewalls and Virtual Networks option. Note in the IP Address rules that we already have an item added - the same IP as our VM. If you hadn't setup your IP, now could be a good time to add that a Save.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/step-db-firewall.png\" alt=\"SQL server firewall\" class=\"img_ev3q\"></p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"gateway-time\">Gateway Time<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#gateway-time\" class=\"hash-link\" aria-label=\"Direct link to Gateway Time\" title=\"Direct link to Gateway Time\" translate=\"no\">​</a></h3>\n<p>Remember that DNS? Well now's our chance to use it. Connect with your favorite RDP client, using the domain that was created and the VM admin account/password that you setup in the ARM template parameters.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/step-rdp.png\" alt=\"RDP\" class=\"img_ev3q\"></p>\n<p>Time to install the gateway. To start go to <a href=\"https://powerbi.microsoft.com/en-us/gateway/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://powerbi.microsoft.com/en-us/gateway/</a> and select <em>Download Standard Mode</em>.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/step-gw-standard-install.png\" alt=\"Gateway Install\" class=\"img_ev3q\"></p>\n<p>Once it's installed, sign in using your dev tenant admin account.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/step-gw-dev-tenant-login.png\" alt=\"Gateway Signin\" class=\"img_ev3q\"></p>\n<p>Choose <em>Register a new gateway on this computer</em>.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/step-gw-new.png\" alt=\"New Gateway\" class=\"img_ev3q\"></p>\n<p>Finally, setup a name for the gateway and a recovery key (which is a passphrase of your choosing).</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/step-gw-name-key.png\" alt=\"Gateway name and key\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"graph-connector-setup\">Graph connector setup<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#graph-connector-setup\" class=\"hash-link\" aria-label=\"Direct link to Graph connector setup\" title=\"Direct link to Graph connector setup\" translate=\"no\">​</a></h2>\n<p>Okay, we're almost there. Time to setup our <a href=\"https://docs.microsoft.com/en-us/microsoftsearch/mssql-connector\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">sql graph connector</a>. First, let's confirm that you can even do this. As we mentioned earlier, this is still in preview mode at the time of this writing, so if you want to have a shot at seeing the connectors, you need to set you organization settings to getting targeted releases. See the animation below for accessing that setting from the 365 admin center:</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/TargetedReleaseSetting.gif\" alt=\"Targeted Release Setting\" class=\"img_ev3q\"></p>\n<p>Here's where you go to access connectors. In the 365 admin center, select Settings-&gt;Microsoft Search and confirm that you have the Connectors tab.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/SQLServerConnectorStart.gif\" alt=\"Connectors tab\" class=\"img_ev3q\"></p>\n<p>To connect to our SQL Server, click Add, then Microsoft SQL Server. Then supply a Name, a Connection ID (just a unique identifier of your choosing) and a description. Finally accept the terms to proceed.</p>\n<p>After we click Next, it's time for us to setup our database connection. <em>Finally!</em> To get your connection string, head back over to Azure and select your database. Then select the Connection Strings option along the left. The first tab holds the information you'll need over in your 365 dev tenant.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/step-connstring.png\" alt=\"DB Connection String\" class=\"img_ev3q\"></p>\n<p>Note that in the Database Settings step for the graph connector, the On-premises gateway is selectable. You should see the name you provided for your gateway in there. Select it. Fill out the parts need for the connection and click Test Connection.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/ConnectToHomolWorks.gif\" alt=\"Test the connection\" class=\"img_ev3q\"></p>\n<p>What's happening under the hood is that 365 is reaching out to the gateway agent running on your VM and <em>then</em> making the connection to the database, which has allowed your VM to connect through it's Firewall rules. Pretty neat, huh?</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fmedia.tenor.com%2Fimages%2F31245191ed807ecd9be31aeaeae6a626%2Ftenor.gif&amp;f=1&amp;nofb=1\" alt=\"Aw yeah\" class=\"img_ev3q\"></p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-exactly-is-in-this-adventureworks-anyway\">What exactly is in this AdventureWorks, anyway?<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#what-exactly-is-in-this-adventureworks-anyway\" class=\"hash-link\" aria-label=\"Direct link to What exactly is in this AdventureWorks, anyway?\" title=\"Direct link to What exactly is in this AdventureWorks, anyway?\" translate=\"no\">​</a></h3>\n<p>Okay, so the last few steps of the Graph Connector are about setting up the data to be crawled. So what exactly do we have here? We're going to focus on Products. Here's a quick snapshot of the tables though from the <a href=\"https://docs.microsoft.com/en-us/sql/azure-data-studio/download-azure-data-studio?view=sql-server-ver15\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Azure Data Studio</a>:</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/AdventureWorks.png\" alt=\"AdventureWorks Product data\" class=\"img_ev3q\"></p>\n<p>We intend to target Product and we will also include the Product Model through a join.</p>\n<p>The next step in the Graph Connector setup is to provide our full crawl query. <em>Note</em> that we are expected to provide a date field that we will base the query off of, so that only items added after the previous crawl will be pulled to make things more efficient. This is the watermark field (<code>@watermark</code>). We have chosen <code>CreateDate</code> as that field.</p>\n<p>Hold up. There is no <code>CreateDate</code> field. Well done, young padawan. Oddly enough, the MS folks didn't think to have one. So we will need to do it for them. Go back to Azure and select your AdventureWorks database. Click the Query Editor (preview) on the left hand side and log in with the database admin account you provisioned. Run this query:</p>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">ALTER</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">TABLE</span><span class=\"token plain\"> SalesLT</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">Product</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">ADD</span><span class=\"token plain\"> CreateDate </span><span class=\"token keyword\" style=\"font-style:italic\">datetime</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">not</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">null</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">CONSTRAINT</span><span class=\"token plain\"> Product_CreateDateInit </span><span class=\"token keyword\" style=\"font-style:italic\">DEFAULT</span><span class=\"token plain\"> GETDATE</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><br></div></code></pre></div></div>\n<p>This gets us the <code>CreateDate</code> field we need along with a default date in it. The first crawl is a <em>NULL</em> watermark anyway so everything is coming in.</p>\n<p>With that little bonus step out of the way, here's our query for the full crawl:</p>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">SELECT</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ProductID</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">Name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ProductNumber</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">Color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">Size</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ProductCategoryID</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ProductModelID</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">SellStartDate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">SellEndDate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">DiscontinuedDate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ThumbnailPhotoFileName</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">rowguid</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> ProductGuid</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> CAST</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">CreateDate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> smalldatetime</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ProductCreated</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> CAST</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ModifiedDate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> smalldatetime</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ProductModified</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> pm</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">Name </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">Model</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> pm</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">rowguid </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> ModelGuid</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">FROM</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">SalesLT</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">Product</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> p</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">INNER</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">JOIN</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">SalesLT</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ProductModel</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> pm </span><span class=\"token keyword\" style=\"font-style:italic\">on</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">ProductModelID </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> pm</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">ProductModelID</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">WHERE</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">CreateDate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">@watermark</span><br></div></code></pre></div></div>\n<p>Choose <code>DateTime</code> as the watermark data type and press the Validate Query button. Select the watermark field, which we aliased as <code>ProductCreated</code>, then select the unique identifier field, which is <code>ProductId</code>. Notice we have a print out of the first 10 rows of data as well. Interesting side note here: currently <code>money</code> and <code>float</code> fields appear to not be supported by the graph connector. That's why <code>ListPrice</code> was left out of the query.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/FullCrawlStep.gif\" alt=\"Full Crawl Step\" class=\"img_ev3q\"></p>\n<p>Next we set the incremental crawl. This will append anything that has been modified since the last incremental crawl run. This step is optional but I recommend it. The crawl looks <em>very</em> similar to the full crawl, but instead our <code>@watermark</code> is based on <code>ModifiedDate</code> instead. Here's the query:</p>\n<div class=\"language-sql codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-sql codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token keyword\" style=\"font-style:italic\">SELECT</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ProductID</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">Name</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ProductNumber</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">Color</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">Size</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ProductCategoryID</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ProductModelID</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">SellStartDate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">SellEndDate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">DiscontinuedDate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ThumbnailPhotoFileName</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">rowguid</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> ProductGuid</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> CAST</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">CreateDate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> smalldatetime</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ProductCreated</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> CAST</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">(</span><span class=\"token plain\">p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ModifiedDate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> smalldatetime</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">)</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ProductModified</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> pm</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">Name </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">Model</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> pm</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">rowguid </span><span class=\"token keyword\" style=\"font-style:italic\">as</span><span class=\"token plain\"> ModelGuid</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">FROM</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">SalesLT</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">Product</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> p</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token keyword\" style=\"font-style:italic\">INNER</span><span class=\"token plain\"> </span><span class=\"token keyword\" style=\"font-style:italic\">JOIN</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">SalesLT</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ProductModel</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> pm </span><span class=\"token keyword\" style=\"font-style:italic\">on</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">ProductModelID </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">=</span><span class=\"token plain\"> pm</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token plain\">ProductModelID</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token keyword\" style=\"font-style:italic\">WHERE</span><span class=\"token plain\"> p</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">.</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\">ModifiedDate</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"> </span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">&gt;</span><span class=\"token plain\"> </span><span class=\"token variable\" style=\"color:rgb(191, 199, 213)\">@watermark</span><br></div></code></pre></div></div>\n<p>Similar to the full crawl, choose <code>DateTime</code> as the watermark data type and press the Validate Query button. Select the watermark field, which we aliased as <code>ProductModified</code>, then select the unique identifier field, which is <code>ProductId</code>. I skipped the soft delete section for now. I also skipped leveraging any type of row-level security, which is actually supported and documented in <a href=\"https://docs.microsoft.com/en-us/microsoftsearch/mssql-connector\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Microsoft writeup on the SQL Graph Connectors</a>. Essentially, you would need to include ACL columnsin the full and incremental crawls, named <code>AllowedUsers</code>, <code>AllowedGroups</code>, <code>DeniedUsers</code>, and <code>DeniedGroups</code>. Each column is expected to be comma or semicolon delimited and can include UPNs, AAD IDs or Security IDs. I just wanted to see if we could get this data coming back and looking good!</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/IncrementalCrawlStep.gif\" alt=\"Incremental Crawl Step\" class=\"img_ev3q\"></p>\n<p>The last big step is our Manage Schema step. We define what can be queried, searched and retrieved. If an item is found in search, you can only show it in the adaptive card layout if it's been marked as Retrievable, thus added to the schema. So select what you want. I went with anything text-based to be searchable and pulled almost all fields into the schema by marking them as Retrievable.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/ManageSchemaStep.gif\" alt=\"Manage Schema Step\" class=\"img_ev3q\"></p>\n<p>The last few steps are a bit of a breeze, especially since I chose not to do ACL columns and row level security.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/FinalSteps.gif\" alt=\"Final Steps\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"results-design-and-vertical\">Results design and vertical<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#results-design-and-vertical\" class=\"hash-link\" aria-label=\"Direct link to Results design and vertical\" title=\"Direct link to Results design and vertical\" translate=\"no\">​</a></h2>\n<p>Our final step is to create our vertical and design the result set. After creating the connector, you'll see some callouts on your new connector in the Required Actions column. You can either click there to set things up or you can access Results Types and Verticals in the Customizations tab. As of the time of this writing, the best order of events is to setup the Result Type first then the Vertical. If you do it the other way, you will have 1 extra step to Enable the Vertical <em>after</em> you finish setting up your result type.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/RequiredActions.png\" alt=\"Required Actions\" class=\"img_ev3q\"></p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"time-to-adapt\">Time to Adapt<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#time-to-adapt\" class=\"hash-link\" aria-label=\"Direct link to Time to Adapt\" title=\"Direct link to Time to Adapt\" translate=\"no\">​</a></h3>\n<p>Let's start with the Result Type. Here are the basic steps, which the below GIF flies through:</p>\n<ul>\n<li class=\"\">Set a name for the result type</li>\n<li class=\"\">Tie it to a Content Source, which will be the new Graph Connector you made</li>\n<li class=\"\">Apply any display rules (I skipped this)</li>\n<li class=\"\">Design the layout</li>\n<li class=\"\">Review and Finish</li>\n</ul>\n<p>The big thing here is our layout design. We are provided a link on this step to the <a href=\"https://searchlayoutdesigner.azurewebsites.net/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Search Layout Designer</a>. Select a design to start with and Click the Get Started button. This takes you to the designer where you can layer in the fields you want to replace the template with. We want to make some substantial changes, so let's click the Edit Layout button. This layout designer leverages the Adaptive Card schema to do it's magic. Also, any field we set as retrievable and is in the schema is now a field we can display in the layout. Here's what I built:</p>\n<div class=\"language-json codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-json codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"type\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"AdaptiveCard\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"version\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"1.0\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"body\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token property\">\"type\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"ColumnSet\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token property\">\"columns\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token property\">\"type\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Column\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token property\">\"width\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"auto\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token property\">\"items\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"type\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Image\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"url\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"https://github.com/mhomol/AdventureWorksThumbs/blob/master/thumbnails/{ThumbnailPhotoFileName}?raw=true\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"size\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Medium\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"horizontalAlignment\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Center\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"altText\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Not available\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token property\">\"height\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"stretch\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token property\">\"type\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Column\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token property\">\"width\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">8</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token property\">\"items\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"type\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"TextBlock\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"text\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"[{Name}](https://somemadeupurl.net/{ProductID})\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"color\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Accent\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"size\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Medium\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"weight\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Bolder\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"type\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"TextBlock\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"text\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"{Model} ({ProductNumber})\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"weight\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Bolder\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"color\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Warning\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"type\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"TextBlock\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"text\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"First sold on {{DATE({SellStartDate}, LONG)}}\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"spacing\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Small\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token property\">\"horizontalAlignment\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Center\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token property\">\"spacing\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Medium\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token property\">\"type\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Column\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token property\">\"width\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">3</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token property\">\"items\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"type\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"FactSet\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token property\">\"facts\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                  </span><span class=\"token property\">\"title\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Color\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                  </span><span class=\"token property\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"{Color}\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                  </span><span class=\"token property\">\"title\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Size\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                  </span><span class=\"token property\">\"value\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"{Size}\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">                </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">              </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">            </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">          </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">        </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"$schema\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"http://adaptivecards.io/schemas/adaptive-card.json\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<p>Feel free to paste this into the Layout Payload Editor to see what it will look like. If you want to see a preview of it you'll need sample data to paste into the Sample Data Editor tab. Try this:</p>\n<div class=\"language-json codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-json codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Name\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Classic Vest, L\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Model\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Classic Vest\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"ProductNumber\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"VE-C304-L\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"ProductModified\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"2008-03-11T10:01:36Z\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"SellStartDate\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"2007-07-01T00:00:00Z\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"ProductId\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"866\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Color\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Red\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Size\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"M\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"ThumbnailPhotoFileName\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"awc_jersey_male_small.gif\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"whats-the-deal-with-the-thumbnail\">What's the deal with the thumbnail?<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#whats-the-deal-with-the-thumbnail\" class=\"hash-link\" aria-label=\"Direct link to What's the deal with the thumbnail?\" title=\"Direct link to What's the deal with the thumbnail?\" translate=\"no\">​</a></h3>\n<p>Here's the last \"special\" thing we wanted to add to the heap of \"All the Things\". In the AdventureWorks Products table, there are Thumbnail binaries and Thumbnail names. Well, of course, I wanted to see these thumbnails come through in the results. <code>Varbinary</code> fields aren't supported by the crawler, so I had 1 of 2 options: either make an endpoint that would pull the item from the database for the Product ID on any call and return the byte array as the response or pull all of the binaries out of the database once and save them to files elsewhere. I chose the latter. Here's the <a href=\"https://github.com/mhomol/AdventureWorksThumbs\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">source</a> for it if you want to do something similar yourself. So now I had the files I needed in github, named by the <code>ThumbnailPhotoFileName</code> field value. So that's how I'm able to include that in my layout.</p>\n<p>Here's a quick rundown of setting up the Result Type:</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/ResultTypeSetup.gif\" alt=\"Result Type Setup\" class=\"img_ev3q\"></p>\n<p>Last, but not least, we make our Vertical. It's even simpler.</p>\n<ul>\n<li class=\"\">Provide a name</li>\n<li class=\"\">Select the Content Source</li>\n<li class=\"\">Provide a KQL query (<em>optional</em> I skipped it)</li>\n<li class=\"\">Review and Finish</li>\n<li class=\"\">Click the button to Enable Vertical</li>\n</ul>\n<p>Here's a quick rundown of setting up the Vertical:</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/VerticalSetup.gif\" alt=\"Vertical Setup\" class=\"img_ev3q\"></p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"out-of-the-oven\">Out of the oven<a href=\"https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB#out-of-the-oven\" class=\"hash-link\" aria-label=\"Direct link to Out of the oven\" title=\"Direct link to Out of the oven\" translate=\"no\">​</a></h2>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fmedia.tenor.com%2Fimages%2F01fe77ed86bdde9e09ea98626c75ba3a%2Ftenor.gif&amp;f=1&amp;nofb=1\" alt=\"Finished Product\" class=\"img_ev3q\"></p>\n<p>So what exactly have we cooked up here? Let's head over to a search box somewhere and type something in that we know is a word in the Products or Models. How about <em>mountain</em>?</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://homol.work/img/blog/gc/MountainSearch.png\" alt=\"Search up mountain\" class=\"img_ev3q\"></p>\n<p>So there we have it! It was a lot to toss into the pot, but I think we brought it all together nicely. Hope you've learned a little something and that it gets you thinking about what you want to do next with the new Graph Connectors and what other structured data you may want to start piping into Microsoft Search for your customers and employees. Don't forget to delete this resource group when you're done messing around. Enjoy!</p>",
            "url": "https://mhomol.github.io/blog/2020/07/03/CustomVerticalForServerlessSQLDB",
            "title": "All of the Things!  Custom MS Search Vertical of Serverless Azure DB and the new SQL Graph Connector!",
            "summary": "Microsoft Graph Connectors are now in preview mode and appear to be showing up for most folks who have turned on targeted releases in their Dev tenants. So, naturally, I had to see what we could break... er, do.",
            "date_modified": "2020-07-03T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "M365",
                "MSSearch",
                "SQL",
                "Azure",
                "Graph",
                "Connectors",
                "ARM",
                "Automation"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2020/06/20/mikerosoft-learn-highlights",
            "content_html": "<blockquote>\n<p>Like a good nerd, I'm a sucker for gamification and achievements in all of their forms. So I've taken to <a href=\"https://docs.microsoft.com/en-us/learn/browse/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">MS Learn</a> badges and trophies like a duck to water. On the plus side, it's already single-handedly gotten me an Azure Developer Associate certification. So I'm giving back by doing a monthly series where I highlight some Learn badges that I felt were exceptional and deserve to be viewed.</p>\n</blockquote>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"this-months-highlights\">This Month's Highlights<a href=\"https://mhomol.github.io/blog/2020/06/20/mikerosoft-learn-highlights#this-months-highlights\" class=\"hash-link\" aria-label=\"Direct link to This Month's Highlights\" title=\"Direct link to This Month's Highlights\" translate=\"no\">​</a></h2>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://docs.microsoft.com/en-us/learn/achievements/publish-static-web-app-and-api.svg\" alt=\"\" class=\"img_ev3q\"></p>\n<p><strong><a href=\"https://docs.microsoft.com/en-us/learn/modules/publish-app-service-static-web-app-api/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Publish an Angular, React, Svelte, or Vue JavaScript app and API with Azure Static Web Apps</a></strong></p>\n<p><a href=\"https://www.microsoft.com/en-us/ignite\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Microsoft Ignite</a> was all digital this year but was still pretty fun. It was like a giant <a href=\"https://channel9.msdn.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Channel 9</a> event. In that event, John Papa did a great session unveiling Azure Static Web Apps. True to form, almost immediately after that unveiling, this little number showed up on MS Learn. It's great first look at a preview product, where Azure is throwing their hat into the ring with other JAMstack hosting services, like Render, GitHub pages, or GitLabs. I definitely recommend this walkthrough - it's quick, easy and free to try and you get a good glimpse of everything that's supported.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://docs.microsoft.com/en-us/learn/achievements/advocates/enable-automatic-updates-in-a-web-app-using-azure-functions-and-signalr.svg\" alt=\"\" class=\"img_ev3q\"></p>\n<p><strong><a href=\"https://docs.microsoft.com/en-us/learn/modules/automatic-update-of-a-webapp-using-azure-functions-and-signalr/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Enable automatic updates in a web application using Azure Functions and SignalR Service</a></strong></p>\n<p>SignalR is such a fun piece of technology. I had a blast building this one and watching things work. This is a methodology any developer should keep in their back pocket.</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://docs.microsoft.com/en-us/learn/achievements/build-serverless-api-with-functions-api-management.svg\" alt=\"\" class=\"img_ev3q\"></p>\n<p><strong><a href=\"https://docs.microsoft.com/en-us/learn/modules/build-serverless-api-with-functions-api-management/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Expose multiple Azure Function apps as a consistent API by using Azure API Management</a></strong></p>\n<p>I have to imaging the Azure API Management can get pretty pricey so I haven't actually done any of this in a production sense, but the lessons surrounding Azure API Management are pretty neat and put a great bow on your API structure. But this particular lesson, which shows you how to pull disparate Azure functions into a single cohesive API, both structurally for you or your organization but also for consumers of said API, is really strong and shows you the true power of Azure API Management</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://docs.microsoft.com/en-us/learn/achievements/build-a-web-app-with-blazor-webassembly-and-vs-code.svg\" alt=\"\" class=\"img_ev3q\"></p>\n<p><strong><a href=\"https://docs.microsoft.com/en-us/learn/modules/build-blazor-webassembly-visual-studio-code/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Build a web app with Blazor WebAssembly and Visual Studio Code</a></strong></p>\n<p>I have high hopes for Blazor in the long run. The route of building WebAssembly is some pretty interesting stuff and this is a great introduction to the technology and nicely self-contained. Hopefully it will leave you wanting more.</p>",
            "url": "https://mhomol.github.io/blog/2020/06/20/mikerosoft-learn-highlights",
            "title": "Mike-rosoft Learn Highlights for July",
            "summary": "Like a good nerd, I'm a sucker for gamification and achievements in all of their forms. So I've taken to MS Learn badges and trophies like a duck to water. On the plus side, it's already single-handedly gotten me an Azure Developer Associate certification. So I'm giving back by doing a monthly series where I highlight some Learn badges that I felt were exceptional and deserve to be viewed.",
            "date_modified": "2020-06-20T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "mslearn",
                "bestof",
                "certifications",
                "coding",
                "blazor",
                "jamstack",
                "azure",
                "api",
                "signalr"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2020/05/22/Better-Sharing",
            "content_html": "<blockquote>\n<p>As the PnP Weekly adage goes, \"Sharing is Caring\". So I posit the following: does this imply that \"Better Sharing is Better Caring?\" You be the judge. 😜</p>\n</blockquote>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"current-state-of-knowledge-sharing---its-great\">Current state of knowledge sharing - it's great!<a href=\"https://mhomol.github.io/blog/2020/05/22/Better-Sharing#current-state-of-knowledge-sharing---its-great\" class=\"hash-link\" aria-label=\"Direct link to Current state of knowledge sharing - it's great!\" title=\"Direct link to Current state of knowledge sharing - it's great!\" translate=\"no\">​</a></h2>\n<p>The state of sharing in the development world, particularly thanks to the gains of open source over the years, has never been stronger. We can push code to GitHub almost instantaneously. We have lots of ways of describing our code to others using markdown files, typically at the root of our solution. Maybe we've even gone the distance and built out a set of GitHub pages. In it we have real writeups on specific features with example snippets of code or showing how to use our product.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"but-can-it-be-better\">But can it be <em>better</em>?<a href=\"https://mhomol.github.io/blog/2020/05/22/Better-Sharing#but-can-it-be-better\" class=\"hash-link\" aria-label=\"Direct link to but-can-it-be-better\" title=\"Direct link to but-can-it-be-better\" translate=\"no\">​</a></h2>\n<p>Have you ever felt like there's almost <em>too</em> much to learn and to unpack? Developers are expected to move faster than ever and know more than ever. How do you move quickly when you're jumping into a new technology or project without feeling overwhelmed? Is there more that we can add to our tool belt to assist with knowledge sharing, documentation or investigation? Allow me to throw at you 2 new technologies to assist in this endeavor: Jupyter Labs and CodeTour.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"jupyter-labs\">Jupyter Labs<a href=\"https://mhomol.github.io/blog/2020/05/22/Better-Sharing#jupyter-labs\" class=\"hash-link\" aria-label=\"Direct link to Jupyter Labs\" title=\"Direct link to Jupyter Labs\" translate=\"no\">​</a></h3>\n<p><a href=\"https://jupyter.org/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Jupyter Labs</a> comes from the Python world of data science. But it has moved far beyond just that. Essentially, it leverages Python to allow for different languages to have a runnable kernel against a jupyter notebook. What this gives you is something quite powerful and cool. It's a web application that allows you to create and share documents that contain live code, equations, visualizations and narrative text.</p>\n<p>I once described it to my team as this: imagine having a wiki with runnable code snippets directly in the wiki. One of my teammates, upon seeing a demo for the first time, described it in a somewhat opposite way: it's like code with way better commenting. Either way you look at it, it's certainly more powerful that just code or just documentation.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"getting-jupyter-labs-set-up\">Getting Jupyter Labs set up<a href=\"https://mhomol.github.io/blog/2020/05/22/Better-Sharing#getting-jupyter-labs-set-up\" class=\"hash-link\" aria-label=\"Direct link to Getting Jupyter Labs set up\" title=\"Direct link to Getting Jupyter Labs set up\" translate=\"no\">​</a></h3>\n<p>Jupyter's site has instructions to install <a href=\"https://jupyter.org/install.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">here</a>. But just doing that isn't going to be as powerful, especially if you're a Microsoft developer. Jupyter's base install is a Python notebook that can run in the Kernel, We want to deal in things like C# and PowerShell. So lets add that to kernel using <a href=\"https://github.com/dotnet/interactive?WT.mc_id=-blog-scottha\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">.Net Interactive</a>. Personally, I think Scott Hanselman's <a href=\"https://www.hanselman.com/blog/AnnouncingNETInteractiveTryNETIncludesNETNotebooksAndMore.aspx\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">instructions</a> here may be your best bet, especially if you're on Windows. This means you'll need <a href=\"https://docs.anaconda.com/anaconda/install/windows/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Anaconda</a> installed first (remember all this is based on Python).</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"powershell-core\">PowerShell Core<a href=\"https://mhomol.github.io/blog/2020/05/22/Better-Sharing#powershell-core\" class=\"hash-link\" aria-label=\"Direct link to PowerShell Core\" title=\"Direct link to PowerShell Core\" translate=\"no\">​</a></h3>\n<p>As you've probably already caught on, this is Python and cross-platform. This means we Microsoft folks need to stick with all things Core. <a href=\"https://github.com/dotnet/interactive?WT.mc_id=-blog-scottha\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">.Net interactive's notebooks</a> give us C#, F# and PowerShell Core though, so we have some fun things we can do. This does mean that the PnP PoSH folks are on the outside looking in, until it supports PowerShell Core. But hopefully that's coming very soon. So check out what we can do using PowerShell Core, in the examples below, and hopefully that will get your mind spinning about other things you could do, including when PnP gets added to PS Core.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"azure-cli-example\">Azure CLI example<a href=\"https://mhomol.github.io/blog/2020/05/22/Better-Sharing#azure-cli-example\" class=\"hash-link\" aria-label=\"Direct link to Azure CLI example\" title=\"Direct link to Azure CLI example\" translate=\"no\">​</a></h3>\n<p>So keeping in mind that we are sticking to PowerShell Core, I whipped up a few examples of utilizing other CLI's with PowerShell to do some computing. Let's start with Azure CLI. Below is something simple. I just copied the <a href=\"https://docs.microsoft.com/en-us/learn/modules/control-azure-services-with-cli/4-work-with-the-cli\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">MS documentation</a> for getting started with the CLI into a notebook.</p>\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/W1tBBYYRs2k\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"></iframe>\n<p>It's a totally different way to imagine documentation. Allow readers to instantly see the results, in the context of their own data!</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"office-365-cli-example\">Office 365 CLI example<a href=\"https://mhomol.github.io/blog/2020/05/22/Better-Sharing#office-365-cli-example\" class=\"hash-link\" aria-label=\"Direct link to Office 365 CLI example\" title=\"Direct link to Office 365 CLI example\" translate=\"no\">​</a></h3>\n<p>Let's look at another aspect of using these notebooks: helping your team get something done. In this example, I've crafted some instructions to give to someone to create a site with the same theme that I made inside my tenant. Check it out.</p>\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/WIxU0EtDgec\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"></iframe>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"code-tour\">Code Tour<a href=\"https://mhomol.github.io/blog/2020/05/22/Better-Sharing#code-tour\" class=\"hash-link\" aria-label=\"Direct link to Code Tour\" title=\"Direct link to Code Tour\" translate=\"no\">​</a></h2>\n<p>Let's end with a bang. I have absolutely fallen in love with this next one: CodeTour. It's pretty new extension for VS Code and allows for providing a tour of your solution. As someone who has a passion for learning and teaching, I can't think of a better way to handle the onboarding experience for coders than a guided tour. And there are many other applications too. Recently, the PnP team used Code Tour to assist with the <a href=\"https://github.com/pnp/office365-cli/discussions/1523#discussioncomment-14991\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">SPFx Project Upgrade</a>. I'm sure once you play around with it, you will also think of new applications for it.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"install-the-codetour-vs-code-extension\">Install the CodeTour VS Code extension<a href=\"https://mhomol.github.io/blog/2020/05/22/Better-Sharing#install-the-codetour-vs-code-extension\" class=\"hash-link\" aria-label=\"Direct link to Install the CodeTour VS Code extension\" title=\"Direct link to Install the CodeTour VS Code extension\" translate=\"no\">​</a></h3>\n<p>Get the extension <a href=\"https://marketplace.visualstudio.com/items?itemName=vsls-contrib.codetour\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">here</a>. I'm assuming that you already have VS Code. 😜 Also, a shout out to <a href=\"https://twitter.com/LostInTangent\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Jonathan Carter</a>, the brains behind this. He's very receptive to feedback too so hit him up.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"codetour-example\">CodeTour example<a href=\"https://mhomol.github.io/blog/2020/05/22/Better-Sharing#codetour-example\" class=\"hash-link\" aria-label=\"Direct link to CodeTour example\" title=\"Direct link to CodeTour example\" translate=\"no\">​</a></h3>\n<p>I'll stay on point here and keep within the realm of PowerShell. Here's something I did recently for a PnP Provisioning Script for a client.</p>\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/F71oC_0Un8I\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"></iframe>\n<p>As you can see, it's a wonderful and powerful way to onboard or to simply amp up your documentation for a piece of code or for a script like this one.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"conclusion\">Conclusion<a href=\"https://mhomol.github.io/blog/2020/05/22/Better-Sharing#conclusion\" class=\"hash-link\" aria-label=\"Direct link to Conclusion\" title=\"Direct link to Conclusion\" translate=\"no\">​</a></h2>\n<p>Hopefully I've provided you some new thought-starters for better ways to share information. These technologies and others should become part of our best practices tool bag. They allow for easier explanation of code, faster results in collaboration, simpler paths to onboarding and so much more. Please take the time to consider how you might use these solutions on your next project.</p>",
            "url": "https://mhomol.github.io/blog/2020/05/22/Better-Sharing",
            "title": "Better Sharing is Better Caring",
            "summary": "As the PnP Weekly adage goes, \"Sharing is Caring\". So I posit the following: does this imply that \"Better Sharing is Better Caring?\" You be the judge. 😜",
            "date_modified": "2020-05-22T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "threewill",
                "sharepoint",
                "az-cli",
                "o365-cli",
                "o365",
                "azure",
                "pnpweekly",
                "sample",
                "sharingiscaring",
                "notebooks",
                "jupyter",
                "powershell-core",
                "vscode",
                "codetour",
                "extensions"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2020/05/08/PnPProvisioninTemplate-CustomListAndView-Trick",
            "content_html": "<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"adventures-in-pnp-powershell-provisioning-templates\">Adventures in PnP PowerShell provisioning templates<a href=\"https://mhomol.github.io/blog/2020/05/08/PnPProvisioninTemplate-CustomListAndView-Trick#adventures-in-pnp-powershell-provisioning-templates\" class=\"hash-link\" aria-label=\"Direct link to Adventures in PnP PowerShell provisioning templates\" title=\"Direct link to Adventures in PnP PowerShell provisioning templates\" translate=\"no\">​</a></h2>\n<p>Has this ever happened to you? I had built a custom list with a custom view. To be more precise, I had basically lifted Chris Kent's sample <a href=\"https://github.com/pnp/sp-dev-list-formatting/tree/master/view-samples/faq-format\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">here</a> for a custom FAQ and dropped this on the page and the client was thrilled with it just as it is. Thanks <a href=\"https://thechriskent.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Chris</a>! Here's what the FAQ page looked like on the template site:</p>\n<table><thead><tr><th style=\"text-align:center\"><img src=\"https://mhomol.github.io/img/blog/pnp-trick-faq-good.png\" alt=\"The way an FAQ should look\" width=\"650\"></th></tr></thead><tbody><tr><td style=\"text-align:center\"><em>Not a bad looking FAQ list, right?</em></td></tr></tbody></table>\n<p>But this is just the beginning! This was my template. I need lots of sites to have this same FAQ page as a starting point, and it needs to look this good too.</p>\n<p>So, onto provisioning with Powershell and PnP! At first I was running this:</p>\n<div class=\"language-Powershell language-powershell codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-powershell codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">Get-PnPProvisioningTemplate -Out $templateFull -Verbose -PersistBrandingFiles `</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">-PersistPublishingFiles -IncludeAllClientSidePages -Force</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">Apply-PnPProvisioningTemplate -Path $templateFull</span><br></div></code></pre></div></div>\n<p>Looks familiar right? Well pretty much everything was working great except for this:</p>\n<table><thead><tr><th style=\"text-align:center\"><img src=\"https://mhomol.github.io/img/blog/pnp-trick-faq-bad.png\" alt=\"No bueno FAQ\" width=\"650\"></th></tr></thead><tbody><tr><td style=\"text-align:center\"><em>Not so good. Also don't focus on the color difference lol</em></td></tr></tbody></table>\n<p>What the heck was going on here? The view and the list were migrating just fine, but that view was not getting applied! Or, <em>was it?</em> I noticed this in the List part properties:</p>\n<table><thead><tr><th style=\"text-align:center\"><img src=\"https://mhomol.github.io/img/blog/pnp-trick-faq-props.png\" alt=\"FAQ Properties\" width=\"300\"></th></tr></thead><tbody><tr><td style=\"text-align:center\"><em>Something is amiss</em></td></tr></tbody></table>\n<p>See anything off? Nothing is selected in the view drop down, even though it <em>is</em> selected in the my template site.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"acting-on-a-hunch\">Acting on a Hunch<a href=\"https://mhomol.github.io/blog/2020/05/08/PnPProvisioninTemplate-CustomListAndView-Trick#acting-on-a-hunch\" class=\"hash-link\" aria-label=\"Direct link to Acting on a Hunch\" title=\"Direct link to Acting on a Hunch\" translate=\"no\">​</a></h2>\n<p>So here was my hunch. Perhaps, the pages are getting deployed <em>before</em> the custom list and custom view, sooo when the page gets made, there's no view to select, which is why it looks like the above. I acted on this hunch, by doing the following:</p>\n<p>I split out just the FAQ list portion from the full <code>Get-PnPProvisioningTemplate</code> - essentially doing 2 Gets: one for the list only and one for everything else. Here's what that looked like:</p>\n<div class=\"language-Powershell language-powershell codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-powershell codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">Get-PnPProvisioningTemplate -Out $templateFull -Verbose -PersistBrandingFiles `</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">-PersistPublishingFiles -IncludeAllClientSidePages -Force</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">Get-PnPProvisioningTemplate -Out $templateListOnly -Verbose -Handlers Lists `</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"> -ListsToExtract \"FAQ\" -Force</span><br></div></code></pre></div></div>\n<p>Now you have 2 files. But there's 1 trick to this, if you want it to work in your favor. You need to open up the XML file for everything, and delete <em>just</em> the <code>ListInstance</code> node for the list (in my case, FAQ) from the XML file. So you can't easily do this all in one full script. You'd have to keep your pulls separate from your applies because of this manual intervention.</p>\n<p>Then I applied my 2 files separately as well, starting with the lists <em>first</em>:</p>\n<div class=\"language-Powershell language-powershell codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-powershell codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">Apply-PnPProvisioningTemplate -Path $templateListOnly</span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\" style=\"display:inline-block\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">Apply-PnPProvisioningTemplate -Path $templateFull</span><br></div></code></pre></div></div>\n<p>And, <strong>viola!</strong> My FAQ list was displaying as expected on the page, because the view was already found for the web part property because it already existed.</p>",
            "url": "https://mhomol.github.io/blog/2020/05/08/PnPProvisioninTemplate-CustomListAndView-Trick",
            "title": "The trick to migrating list parts on a page with custom views with PnP",
            "summary": "Adventures in PnP PowerShell provisioning templates",
            "date_modified": "2020-05-08T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "threewill",
                "sharepoint",
                "pnp",
                "o365",
                "pnpweekly",
                "trick",
                "sharingiscaring",
                "provisioning",
                "powershell"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2020/05/04/Coding-w-Nate-01",
            "content_html": "<p>This is cross-posted <a href=\"https://dev.to/mhomol/coding-with-nate-pt-1-95e\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">here</a>.</p>\n<h3 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"adventures-in-getting-your-kids-interested-in-coding\">Adventures in getting your kids interested in coding<a href=\"https://mhomol.github.io/blog/2020/05/04/Coding-w-Nate-01#adventures-in-getting-your-kids-interested-in-coding\" class=\"hash-link\" aria-label=\"Direct link to Adventures in getting your kids interested in coding\" title=\"Direct link to Adventures in getting your kids interested in coding\" translate=\"no\">​</a></h3>\n<blockquote>\n<p>This is a series of posts I hope to do cataloging some of my progress with spreading the gospel of code to my kids. Recently I made some progress with my son, Nate, and hope to share what we build together in this series. 😊</p>\n</blockquote>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"part-one-idea-and-schema\">Part One: Idea and Schema<a href=\"https://mhomol.github.io/blog/2020/05/04/Coding-w-Nate-01#part-one-idea-and-schema\" class=\"hash-link\" aria-label=\"Direct link to Part One: Idea and Schema\" title=\"Direct link to Part One: Idea and Schema\" translate=\"no\">​</a></h2>\n<p>For many years, I've struggling in fits and spurts to get my kids to embrace coding. I took to it like a duck to water and was coding on this when I was 9 years old:</p>\n<table><thead><tr><th style=\"text-align:center\"><img src=\"https://mhomol.github.io/img/blog/trs-80.jpg\" alt=\"Behold the Radioshack TRS-80\" width=\"300\"></th></tr></thead><tbody><tr><td style=\"text-align:center\"><em>Behold the Radioshack TRS-80</em></td></tr></tbody></table>\n<p>I've had a few glimmers of hope, like when they were in robotics and were helping to write the programs, but eventually that died out. Then I had a brief period where my sons were doing lessons on freecodecamp.org. That site is fantastic, by the way. But so far, nothing lasting. But I press on.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"something-we-both-like\">Something we both like<a href=\"https://mhomol.github.io/blog/2020/05/04/Coding-w-Nate-01#something-we-both-like\" class=\"hash-link\" aria-label=\"Direct link to Something we both like\" title=\"Direct link to Something we both like\" translate=\"no\">​</a></h2>\n<p>About a month ago, I challenged my sons to come up with an app idea. My thinking was that they might be more inclined to learn something if it would result in something that originated from their imagination. My son Nate started doing the <a href=\"https://apps.apple.com/app/id908519492?app=itunes\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Swift Playground</a> lessons and things were looking up. But as usual, things sputtered out.</p>\n<p>2 weekends ago, we were playing our favorite collector card game, <a href=\"http://www.upperdeck.com/products/entertainment/marvel/marvel-legendary.aspx#\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Marvel Legendary</a>. I have amassed pretty much the entire collection and we spent a fair bit of the weekend battling supervillains. There have been some apps made by the community already - namely one called <a href=\"https://apps.apple.com/us/app/assemble-legendary-randomizer/id698951667\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Assemble</a>. It randomizing matchups, which is really nice for a game that keeps growing with 3 or 4 expansions a year. But this app was starting to slow down in its updating. Additionally my son voiced his frustration with not being able to search up cards by the text on them or by their features. Suddenly, I saw the light go on and he turned to me and said, \"Maybe this is the app we can build.\"</p>\n<p><strong>Eureka</strong>! We had a problem that we wanted to solve and it was surrounding a topic that we both enjoyed. It was the perfect storm.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"early-plan\">Early Plan<a href=\"https://mhomol.github.io/blog/2020/05/04/Coding-w-Nate-01#early-plan\" class=\"hash-link\" aria-label=\"Direct link to Early Plan\" title=\"Direct link to Early Plan\" translate=\"no\">​</a></h2>\n<p>So the basics for the idea are now there. We want a mobile app that will allow for in-depth searching of thousands of cards and that will also randomize setups of games.</p>\n<p>Technically, here's the early plan: a database of cards built in Azure Data Storage, accessible from Azure Functions, via a mobile app built in React Native. We will open source the whole thing, so feel free to contribute or give feedback, especially if you happen to also play the game.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"homework\">Homework<a href=\"https://mhomol.github.io/blog/2020/05/04/Coding-w-Nate-01#homework\" class=\"hash-link\" aria-label=\"Direct link to Homework\" title=\"Direct link to Homework\" translate=\"no\">​</a></h2>\n<p>My homework for Nate so far is to start going through the JavaScript lessons on freecodecamp.org. Send me thoughts if you have some better ideas. My thinking is for him to try and pick up some basics of JavaScript while we're building out the backend. While he's learning, he's volunteered to help with data entry. We'll see how long that lasts.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"looking-at-cards\">Looking at Cards<a href=\"https://mhomol.github.io/blog/2020/05/04/Coding-w-Nate-01#looking-at-cards\" class=\"hash-link\" aria-label=\"Direct link to Looking at Cards\" title=\"Direct link to Looking at Cards\" translate=\"no\">​</a></h2>\n<img src=\"https://mhomol.github.io/img/blog/legendary-cards.jpg\" alt=\"Sooo many cards!\" width=\"600\">\n<p>Our first order of business was getting the data figured out. My first real teachable moment. We examined various cards and started making notes, first in bullet lists of the various types of cards and the properties we were seeing on them. Here are some examples.</p>\n<table><thead><tr><th>Mastermind</th><th>Hero</th><th>Villian</th></tr></thead><tbody><tr><td><img src=\"https://mhomol.github.io/img/blog/darak-phoenix-01.png\" alt=\"Dark Phoenix Mastermind\" width=\"200\"></td><td><img src=\"https://mhomol.github.io/img/blog/deadpool-03-1.jpg\" alt=\"Deadpool\" width=\"200\"></td><td><img src=\"https://mhomol.github.io/img/blog/superhuman-registration-act-04.jpg\" alt=\"She-Hulk Villain\" width=\"200\"></td></tr></tbody></table>\n<p>As you can see, there are many various qualities and this is just a small sample. In fact, just at the top-most level, there are 10 types of cards: <em>Wound, Token, Officer, Sidekick, Bystander, Scheme, Enemy Leader, Enemy Support, Enemy Group, Playable</em>. Pretty quickly in, we switched to a JSON document and started going over samples of each card type, appending properties to the same single JSON as we discovered new things on a card. This actually sunk in with him. Seeing the JSON get updated live as we were reviewing information on a card was like seeing the objects and properties come to life real-time on the screen. Here's what we ended up with:</p>\n<div class=\"language-json codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-json codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Name\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"StartingDeck\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Hero | Villain | Officer | Sidekick | Wound | Bystander | Mastermind | Token\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Type\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Wound | Token | Officer | Sidekick | Bystander | Scheme | Enemy Leader | Enemy Support | Enemy Group | Playable\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Classification\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Wound | Grievous Wound | Bindings | Villain | Officer | Madame Hydra | Hero | Special Sidekick | Bystander | Recruitable Bystander | Scheme | Plot | Mastermind | Commander | Henchmen | Backup Adversaries | Villain | Adversary\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Team\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Shield | Avengers | X-Men | Champions | Fantastic Four | Heroes of Asgard | Sinister 6 | Hydra | Foes of Asgard | Crime Syndicate | Brotherhood | Cabal | Guardians of the Galaxy | Illuminati | Marvel Knights | Mercs for Money | New Warriors | Spider Friends | Venomverse | Warbound | X-Force\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Class\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Instinct | Ranged | Strength | Covert | Tech | Basic\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Color\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Yellow | Blue | Green | Red | Silver | Grey\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Ability\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Keywords\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Healing\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Betrayal\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Ambush\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Human Shield\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Phasing\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Fight\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Escape\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Overrun\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Fight or Fail\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"X Uru-Enchanted Weapon\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"CombinationSymbols\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"CombinationEffect\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Expansion\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Core | Villains | Civil War | X-Men | S.H.I.E.L.D.\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"AlwaysLeads\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"CommandMasterStrike\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"VictoryPoints\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">6</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Attack\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">4</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Recruit\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">2</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"RecruitCost\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">3</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"IsRecruitable\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token boolean\" style=\"color:rgb(255, 88, 116)\">true</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Setup\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"Twist\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"NumTwists\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"1\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">9</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"2\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">9</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"3\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">9</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"4\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">6</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"5\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">6</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"NumHeros\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"1\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">4</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"2\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">5</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"3\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">5</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"4\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">5</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"5\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">6</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"NumVillains\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">{</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"1\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">1</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"2\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">2</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"3\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">3</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"4\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">3</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">    </span><span class=\"token property\">\"5\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:rgb(247, 140, 108)\">4</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"SchemeWins\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\">  </span><span class=\"token property\">\"SpecialRules\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"\"</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token plain\"></span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">}</span><br></div></code></pre></div></div>\n<p>Seeing as we will have to start simple, we will begin by manually creating JSON docs for cards, until we get a UI going. So to try and make it easier on us, especially Nate, I set out to make a schema for this sample doc. This route would give us intellisense and document validation in a good editor, like VS Code.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"json-schema\">JSON Schema<a href=\"https://mhomol.github.io/blog/2020/05/04/Coding-w-Nate-01#json-schema\" class=\"hash-link\" aria-label=\"Direct link to JSON Schema\" title=\"Direct link to JSON Schema\" translate=\"no\">​</a></h2>\n<p>This was my first foray into JSON Schema. I started at the source and read through this walkthrough: <a href=\"https://json-schema.org/learn/getting-started-step-by-step.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Getting Started Step-by-step</a>. That gave me most of the tools I needed to understand what was going on. Essentially, you're setting up type definitions and other rules as you identify them.</p>\n<p>That said, it was still a pretty big doc for me to try and render out the schema manually, so I started with a schema generator - found <a href=\"https://www.jsonschema.net/home\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">here</a> - and applied changes from there, namely titles and descriptions, as well as identifying things we missed as I was validating fields. The generator helps a lot with following along, as you can compare your node to the schema generated. The only big thing I had to learn how to add was the <code>enum</code> property. This is a great option for string properties. It allows you to provide an array of options for editors to leverage. Here's an example:</p>\n<div class=\"language-json codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#bfc7d5;--prism-background-color:#292d3e\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-json codeBlock_bY9V thin-scrollbar\" style=\"color:#bfc7d5;background-color:#292d3e\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#bfc7d5\"><span class=\"token property\">\"enum\"</span><span class=\"token operator\" style=\"color:rgb(137, 221, 255)\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">[</span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Yellow\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Blue\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Green\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Red\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Silver\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">,</span><span class=\"token plain\"> </span><span class=\"token string\" style=\"color:rgb(195, 232, 141)\">\"Grey\"</span><span class=\"token punctuation\" style=\"color:rgb(199, 146, 234)\">]</span><br></div></code></pre></div></div>\n<p>And here's what happens in VS Code when you reference the schema and attempt to add a color field to the document:</p>\n<img src=\"https://mhomol.github.io/img/blog/color-enum-results.png\" alt=\"End result in VS Code\" width=\"500\">\n<p>Pretty cool, huh? Well I thought so at least lol.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"til-next-time\">'Til next time<a href=\"https://mhomol.github.io/blog/2020/05/04/Coding-w-Nate-01#til-next-time\" class=\"hash-link\" aria-label=\"Direct link to 'Til next time\" title=\"Direct link to 'Til next time\" translate=\"no\">​</a></h2>\n<p>So far, the schema is all we have and we're starting to create the data for Azure Storage. I'll share more as we make progress. Hopefully he stays interested and we actually produce a working product in the App Store. We shall see.</p>\n<p>The full schema is published here: <a href=\"https://homol.work/json/legendarydb/card-schema.json\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://homol.work/json/legendarydb/card-schema.json</a></p>",
            "url": "https://mhomol.github.io/blog/2020/05/04/Coding-w-Nate-01",
            "title": "Coding with Nate",
            "summary": "This is cross-posted here.",
            "date_modified": "2020-05-04T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "teaching",
                "fun",
                "parenting",
                "education",
                "javascript",
                "react",
                "json",
                "azure-functions",
                "codewithnate"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2020/05/01/Tee of the Week",
            "content_html": "<p>Behold my newest edition! Took forever to arrive, thanks to good 'ole 'Rona, but still worth it. Seriously, where the hell is Don, Carole?!</p>\n<img src=\"https://mhomol.github.io/img/blog/wheresdon-photo.png\" alt=\"Where's Don, Carole?\" width=\"300\">",
            "url": "https://mhomol.github.io/blog/2020/05/01/Tee of the Week",
            "title": "Tee of the Week",
            "summary": "Behold my newest edition! Took forever to arrive, thanks to good 'ole 'Rona, but still worth it. Seriously, where the hell is Don, Carole?!",
            "date_modified": "2020-05-01T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "tees",
                "fun"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2020/04/23/Tee of the Week",
            "content_html": "<img src=\"https://mhomol.github.io/img/blog/redundancy-photo.jpg\" alt=\"Dept of Redundancy Department\" width=\"300\">\n<p>I've gotten lots of mileage with this one and it's still one of my all-time favorites.</p>",
            "url": "https://mhomol.github.io/blog/2020/04/23/Tee of the Week",
            "title": "Tee of the Week",
            "summary": "I've gotten lots of mileage with this one and it's still one of my all-time favorites.",
            "date_modified": "2020-04-23T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "tees",
                "fun"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2020/04/21/customer-centric-nav",
            "content_html": "<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"discovery\">Discovery<a href=\"https://mhomol.github.io/blog/2020/04/21/customer-centric-nav#discovery\" class=\"hash-link\" aria-label=\"Direct link to Discovery\" title=\"Direct link to Discovery\" translate=\"no\">​</a></h2>\n<p>Recently, I was tasked with discovering the needs of a customer in order to assess their current state in SharePoint Online and needs for the future. This was for a collection of technology groups that performed a wide array of services for other employees within the company. Early on, we knew that much of what we were evaluating was a lack of access to these services via SharePoint, so much would be created for the first time. Additionally, for the content that did exist, there was a lack of understanding in where the items could be found. Another interesting issue was the lack of understanding of the functions of these groups. Basically, a number of interesting problems, but largely centering around the employees being serviced, or their customers, if you will.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"to-the-hub\">To the Hub!<a href=\"https://mhomol.github.io/blog/2020/04/21/customer-centric-nav#to-the-hub\" class=\"hash-link\" aria-label=\"Direct link to To the Hub!\" title=\"Direct link to To the Hub!\" translate=\"no\">​</a></h2>\n<p>Based on the feedback, particularly around wanting consistency and knowing that there would be a hurdle with getting folks to know where to go, we decided early on to use a Hub for the job. It solves so many issues out of the box: consistent look-and-feel, consistent navigation, the ability to roll up content from spoke sites and search scoped at the hub level, among other benefits. But just because we now have a spot for folks to come and a place where maybe things look better and more consistent, it doesn't mean that they will suddenly know what to do. Part of the art of helping folks with SharePoint intranets or portals has very little to do with the tooling that is or isn't available in the 365 platform. Much of it is a User Experience and an Information Architecture problem. This may be my heavy marketing background at play, but it felt critical to me to deal with the hub needing to be customer-centric from the get-go, particularly the navigation.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"ways-to-solve-navigation\">Ways to Solve Navigation<a href=\"https://mhomol.github.io/blog/2020/04/21/customer-centric-nav#ways-to-solve-navigation\" class=\"hash-link\" aria-label=\"Direct link to Ways to Solve Navigation\" title=\"Direct link to Ways to Solve Navigation\" translate=\"no\">​</a></h2>\n<p>There were many thoughts on the navigation, both from stakeholders and discovery. The default thinking around the Hub navigation was to break it up by the various domains or spheres of teams that were solving problems or serving customers. One of my first thoughts on navigation was to look into taking it towards a task-based navigation, as it seemed like customers may only know what thing they may need to do. In my UX research, I encounter the following 2 articles that I wanted to highlight:</p>\n<p><a href=\"https://uxmastery.com/object-focused-vs-task-focused/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Object-focused vs Task-focused Design</a></p>\n<p><a href=\"https://www.nngroup.com/articles/audience-based-navigation/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Audience-Based Navigation: 5 Reasons to Avoid It</a></p>\n<p>These are great resources for gaining insights into user habits and trends. So what is actually the best way to have a navigation that keeps the customer at the forefront?</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"topic-based--customer-centric\">Topic-based = Customer-centric<a href=\"https://mhomol.github.io/blog/2020/04/21/customer-centric-nav#topic-based--customer-centric\" class=\"hash-link\" aria-label=\"Direct link to Topic-based = Customer-centric\" title=\"Direct link to Topic-based = Customer-centric\" translate=\"no\">​</a></h2>\n<p>The bottom-line is that typically task-based navigation can be very confusing to most users. So that was a wash. What becomes clear from UX research is that there isn't always a silver bullet. But UX is an iterative process. So let's find a solid starting point. Based on those articles and knowing that we still needed information to be somewhat grouped by communications site spokes - we still need to be thinking about the authoring challenges too - it seemed like our best starting point would be to go with topic-based navigation. This would allow the sub-options to still be domain or sphere-based, but should provide a customer with the terminology that they can relate to. The customer needs to see words that represent the things that have brought them out to the hub.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"example\">Example<a href=\"https://mhomol.github.io/blog/2020/04/21/customer-centric-nav#example\" class=\"hash-link\" aria-label=\"Direct link to Example\" title=\"Direct link to Example\" translate=\"no\">​</a></h2>\n<p>Let's look at a quick example of one of these domains: a group that we will call PMG. They were responsible for presenting resources pertinent to PMs and the PMI certifications including in-house governance resources. Originally, we had a top-level navigation called \"PMG\" with sub-options. But instead we landed here:</p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https://mhomol.github.io/assets/images/PMG-to-ProjectSupport-9b45a714adcb9916cfc50b0b70addb30.png\" width=\"460\" height=\"324\" class=\"img_ev3q\"></p>\n<p>As you can see, the topic of \"Project Support\" aims to be a topic that should gravitate these PM users' eyes to the item that matters most to them. Is it fool-proof? No. But it's a solid start.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"final-thoughts\">Final thoughts<a href=\"https://mhomol.github.io/blog/2020/04/21/customer-centric-nav#final-thoughts\" class=\"hash-link\" aria-label=\"Direct link to Final thoughts\" title=\"Direct link to Final thoughts\" translate=\"no\">​</a></h2>\n<p>IA and UX is 2 parts science and 1 part art, in my humble opinion. I have worked on countless websites (namely at Brown Bag Marketing) over the past 10 years with Creative and UX resources. I've seen the sheer amount of different opinions mixed with a bevy of different facts, which also tend to change. But some things have remained true: the customer needs to be at the forefront and the calls to action need to be clear and take precedence. These are just some random thoughts in that arena. Hope you found it useful.</p>",
            "url": "https://mhomol.github.io/blog/2020/04/21/customer-centric-nav",
            "title": "Thoughts on Customer-Centric Nav",
            "summary": "Discovery",
            "date_modified": "2020-04-21T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "random",
                "thoughts",
                "sharepoint",
                "o365",
                "navigation",
                "hubs",
                "topic",
                "marketing",
                "branding"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2020/04/16/Tee of the Week",
            "content_html": "<img src=\"https://mhomol.github.io/img/blog/colorblind-photo.jpg\" alt=\"I love the colorblind?\" width=\"300\">\n<p>This week’s tee is off to a great start today. Got some compliments and laughs at the doctors office. 🤪</p>",
            "url": "https://mhomol.github.io/blog/2020/04/16/Tee of the Week",
            "title": "Tee of the Week",
            "summary": "This week’s tee is off to a great start today. Got some compliments and laughs at the doctors office. 🤪",
            "date_modified": "2020-04-16T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "tees",
                "fun"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2020/04/11/hello",
            "content_html": "<p>My journey with blogging has been a complete mess so far. But I keep trying, so I guess that's something. Like so many people, the busier I get, the less I think about doing this. But I want to make this a better habit because it helps me reenforce the types of creativity I espouse.</p>\n<p>For a long time, I've used Tumblr, but that just seemed like I was taking it too easy. My alternative has also been to piggy-back on my company's blog - again, also too easy, and just doesn't feel like \"me.\"</p>\n<p>So I set out to finally make my own site, which could start to be a little more \"me\" and start to allow me to combine having my own presence and be built on the things that give me joy.</p>\n<p>From the get-go, I new I wanted to do this with the JAMStack. I like the idea of emphasizing simplicity and speed. Additionally, I knew I wanted to try and author via Markdown, as far as posts go. I originally started looking into trying to build this blog in Blazor. I found <a href=\"https://github.com/mhomol/BlazeDown\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Blazedown</a> and forked it - so perhaps there will be a day that I roll this site that way. But I didn't want to have reinvent everything.</p>\n<a href=\"https://imgflip.com/i/3wd9bm\"><img src=\"https://i.imgflip.com/3wd9bm.jpg\" title=\"made at imgflip.com\"></a>\n<p>I settled on <a href=\"https://v2.docusaurus.io/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Docusaurus 2</a>, which has taken it's learnings and expanded beyond documentation. Since I am currently in the throws of Microsoft 365 and Azure Development, it seemed like doing further React development would be a good thing. My hope is to become a contributor for this project as well. I've really enjoyed working with React recently. I also feel that a platform like Docusaurus will actually afford me a number of opportunities to build in automations and integrations (another thing I'm passionate about) using parts of Azure and the 365 platform.</p>\n<p>While I may still do more proper blog posts on the ThreeWill site, my hope is to post a little more often here - not necessarily always tutorials or walkthroughs, but sometimes thoughts and updates on what I'm working through, even if it's not groundbreaking or cutting edge.</p>\n<p>I'm going to re-post a few of my previous Tumblr posts as I make the move to the new.</p>\n<p>One last thing: I previously have tried doing 2 separate Tumblrs (<a href=\"https://homolworks.tumblr.com/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://homolworks.tumblr.com/</a>) and (<a href=\"https://www.tumblr.com/blog/mhomol/blog/mhomol\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://www.tumblr.com/blog/mhomol/blog/mhomol</a>): one to track work posts and one to track my progress trying to train my kids in coding. I've decided to combine the two here and just tag the posts differently. We shall see how that goes. Besides, it's pretty much just me reading these anyway lol.</p>",
            "url": "https://mhomol.github.io/blog/2020/04/11/hello",
            "title": "New Space, Who Dis?",
            "summary": "My journey with blogging has been a complete mess so far. But I keep trying, so I guess that's something. Like so many people, the busier I get, the less I think about doing this. But I want to make this a better habit because it helps me reenforce the types of creativity I espouse.",
            "date_modified": "2020-04-11T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "jamstack",
                "hello",
                "docusaurus",
                "blogging"
            ]
        },
        {
            "id": "https://mhomol.github.io/blog/2020/03/21/office365hooks",
            "content_html": "<p><em>Throwback post from Tumblr</em></p>\n<p>Yesterday I posted a hopefully proper walkthrough for Office developers wanting to dive into React hooks. Check it...</p>\n<p><a href=\"https://threewill.com/function-components-and-hooks-architecture-tutorial/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">https://threewill.com/function-components-and-hooks-architecture-tutorial/</a></p>",
            "url": "https://mhomol.github.io/blog/2020/03/21/office365hooks",
            "title": "React, Hooks and Office Dev - Bringing it all Together",
            "summary": "Throwback post from Tumblr",
            "date_modified": "2020-03-21T00:00:00.000Z",
            "author": {
                "name": "Mike Homol",
                "url": "https://github.com/mhomol"
            },
            "tags": [
                "threewill",
                "throwback",
                "sharepoint",
                "react",
                "hooks",
                "o365",
                "pnpweekly",
                "typescript",
                "tutorial"
            ]
        }
    ]
}